ZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvTWFrZWZpbGUuaW4gYi9kbGxzL2RkcmF3L01ha2VmaWxlLmluCmluZGV4IDg4YTdmZjQuLjNlNDM0OTEgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvTWFrZWZpbGUuaW4KKysrIGIvZGxscy9kZHJhdy9NYWtlZmlsZS5pbgpAQCAtNCw0NSArNCwzMSBAQAogVlBBVEggICAgID0gQHNyY2RpckAKIE1PRFVMRSAgICA9IGRkcmF3LmRsbAogSU1QT1JUTElCID0gbGliZGRyYXcuJChJTVBMSUJFWFQpCi1JTVBPUlRTICAgPSBvbGUzMiB1c2VyMzIgZ2RpMzIgYWR2YXBpMzIga2VybmVsMzIgbnRkbGwKK0lNUE9SVFMgICA9IHdpbmVkM2Qgb2xlMzIgdXNlcjMyIGdkaTMyIGFkdmFwaTMyIGtlcm5lbDMyIG50ZGxsCiBFWFRSQUlOQ0wgPSBAWF9DRkxBR1NACiBFWFRSQUxJQlMgPSAtbGR4Z3VpZCAtbHV1aWQgQFhfTElCU0AgQFhfUFJFX0xJQlNAIEBYTElCQCBAWF9FWFRSQV9MSUJTQCAKIAotT1BFTkdMRklMRVMgPSBcCi0JZDNkX3V0aWxzLmMgXAotCWRldmljZV9tYWluLmMgXAotCWRldmljZV9vcGVuZ2wuYyBcCi0JZGlyZWN0M2RfbWFpbi5jIFwKLQlkaXJlY3QzZF9vcGVuZ2wuYyBcCitDX1NSQ1MgPSBcCisJY2xpcHBlci5jIFwKKwlkZHJhdy5jIFwKKwlkZHJhd190aHVua3MuYyBcCisJZGV2aWNlLmMgXAorCWRpcmVjdDNkLmMgXAogCWV4ZWN1dGVidWZmZXIuYyBcCisJZ2FtbWEuYyBcCiAJbGlnaHQuYyBcCisJbWFpbi5jIFwKIAltYXRlcmlhbC5jIFwKLQlvcGVuZ2xfdXRpbHMuYyBcCisJcGFsZXR0ZS5jIFwKKwlwYXJlbnQuYyBcCisJcmVnc3ZyLmMgXAorCXN1cmZhY2UuYyBcCisJc3VyZmFjZV90aHVua3MuYyBcCiAJdGV4dHVyZS5jIFwKKwl1dGlscy5jIFwKIAl2ZXJ0ZXhidWZmZXIuYyBcCiAJdmlld3BvcnQuYwogCi1DX1NSQ1MgPSBcCi0JQE9QRU5HTEZJTEVTQCBcCi0JY2xpcHBlci5jIFwKLQlkZHJhd19oYWwuYyBcCi0JZGRyYXdfbWFpbi5jIFwKLQlkZHJhd190aHVua3MuYyBcCi0JZGRyYXdfdXNlci5jIFwKLQlkZHJhd191dGlscy5jIFwKLQltYWluLmMgXAotCXBhbGV0dGVfaGFsLmMgXAotCXBhbGV0dGVfbWFpbi5jIFwKLQlyZWdzdnIuYyBcCi0Jc3VyZmFjZV9kaWIuYyBcCi0Jc3VyZmFjZV9mYWtlemJ1ZmZlci5jIFwKLQlzdXJmYWNlX2dhbW1hLmMgXAotCXN1cmZhY2VfaGFsLmMgXAotCXN1cmZhY2VfbWFpbi5jIFwKLQlzdXJmYWNlX3RodW5rcy5jIFwKLQlzdXJmYWNlX3VzZXIuYyBcCi0Jc3VyZmFjZV93bmRwcm9jLmMKLQogUkNfU1JDUyA9IHZlcnNpb24ucmMKIAogU1VCRElSUyA9IHRlc3RzCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2NsaXBwZXIuYyBiL2RsbHMvZGRyYXcvY2xpcHBlci5jCmluZGV4IDRmMGY2YjQuLjlmNjQzYjQgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvY2xpcHBlci5jCisrKyBiL2RsbHMvZGRyYXcvY2xpcHBlci5jCkBAIC0xLDcgKzEsOCBAQAotLyoJCURpcmVjdERyYXdDbGlwcGVyIGltcGxlbWVudGF0aW9uCisvKiBEaXJlY3REcmF3Q2xpcHBlciBpbXBsZW1lbnRhdGlvbgogICoKLSAqIENvcHlyaWdodCAyMDAwIE1hcmN1cyBNZWlzc25lcgotICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KKyAqIENvcHlyaWdodCAyMDAwIChjKSBNYXJjdXMgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAyMDAwIChjKSBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDYgKGMpIFN0ZWZhbiBE9nNpbmdlcgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTM2LDUyICszNyw5NyBAQAogCiBXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJRGlyZWN0RHJhd0NyZWF0ZUNsaXBwZXIgKEREUkFXLkApCi0gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVVua25vd24gbWV0aG9kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdDbGlwcGVyVnRibCBERFJBV19DbGlwcGVyX1ZUYWJsZTsKLQotSFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd0NyZWF0ZUNsaXBwZXIoCi0gICAgRFdPUkQgZHdGbGFncywgTFBESVJFQ1REUkFXQ0xJUFBFUiAqbHBscEREQ2xpcHBlciwgTFBVTktOT1dOIHBVbmtPdXRlcgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0NsaXBwZXI6OlF1ZXJ5SW50ZXJmYWNlCisgKgorICogQ2FuIHF1ZXJ5IHRoZSBJVW5rbm93biBhbmQgSURpcmVjdERyYXdDbGlwcGVyIGludGVyZmFjZSBmcm9tIGEKKyAqIENsaXBwZXIgb2JqZWN0LiBUaGUgSVVua25vd24gSW50ZXJmYWNlIGlzIGVxdWFsIHRvIHRoZSBJRGlyZWN0RHJhd0NsaXBwZXIKKyAqIGludGVyZmFjZS4gQ2FuJ3QgY3JlYXRlIG90aGVyIGludGVyZmFjZXMuCisgKgorICogQXJndW1lbnRzOgorICogIHJpaWQ6IEludGVyZmFjZSBpZCBhc2tlZCBmb3IKKyAqICBwcHZPYmo6IFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1F1ZXJ5SW50ZXJmYWNlKAorICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIFJFRklJRCByaWlkLCBMUFZPSUQqIHBwdk9iagogKSB7Ci0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogVGhpczsKLSAgICBUUkFDRSgiKCUwOGx4LCVwLCVwKVxuIiwgZHdGbGFncywgbHBscEREQ2xpcHBlciwgcFVua091dGVyKTsKKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKIAotICAgIGlmIChwVW5rT3V0ZXIgIT0gTlVMTCkgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKLQotICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJICAgICBzaXplb2YoSURpcmVjdERyYXdDbGlwcGVySW1wbCkpOwotICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwotCi0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd0NsaXBwZXIsIEREUkFXX0NsaXBwZXJfVlRhYmxlKTsKLSAgICBUaGlzLT5yZWYgPSAxOwotICAgIFRoaXMtPmhXbmQgPSAwOwotICAgIFRoaXMtPmRkcmF3X293bmVyID0gTlVMTDsKLQotICAgICpscGxwRERDbGlwcGVyID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdDbGlwcGVyKTsKLSAgICByZXR1cm4gRERfT0s7CisgICAgaWYgKElzRXF1YWxHVUlEKCZJSURfSVVua25vd24sIHJpaWQpCisJfHwgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0RHJhd0NsaXBwZXIsIHJpaWQpKQorICAgIHsKKwkqcHB2T2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdDbGlwcGVyKTsKKwlJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKKwlyZXR1cm4gU19PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlyZXR1cm4gRV9OT0lOVEVSRkFDRTsKKyAgICB9CiB9CiAKLS8qIFRoaXMgaXMgdGhlIGNsYXNzZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4gKi8KLUhSRVNVTFQgRERSQVdfQ3JlYXRlRGlyZWN0RHJhd0NsaXBwZXIoSVVua25vd24qIHBVbmtPdXRlciwgUkVGSUlEIHJpaWQsCi0JCQkJICAgICAgTFBWT0lEKiBwcE9iaikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdDbGlwcGVyOjpBZGRSZWYKKyAqCisgKiBJbmNyZWFzZXMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgaW50ZXJmYWNlLCByZXR1cm5zIHRoZSBuZXcgY291bnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfQWRkUmVmKCBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlICkKIHsKLSAgICBIUkVTVUxUIGhyOwotICAgIExQRElSRUNURFJBV0NMSVBQRVIgcENsaXA7CisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CisgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CiAKLSAgICBociA9IERpcmVjdERyYXdDcmVhdGVDbGlwcGVyKDAsICZwQ2xpcCwgcFVua091dGVyKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworICAgIFRSQUNFKCIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCByZWYgLSAxKTsKIAotICAgIGhyID0gSURpcmVjdERyYXdDbGlwcGVyX1F1ZXJ5SW50ZXJmYWNlKHBDbGlwLCByaWlkLCBwcE9iaik7Ci0gICAgSURpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UocENsaXApOwotICAgIHJldHVybiBocjsKKyAgICByZXR1cm4gcmVmOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUlEaXJlY3REcmF3Q2xpcHBlcgotICovCi1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX1NldEh3bmQoCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Q2xpcHBlcjo6UmVsZWFzZQorICoKKyAqIERlY3JlYXNlcyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBpbnRlcmZhY2UsIHJldHVybnMgdGhlIG5ldyBjb3VudAorICogSWYgdGhlIHJlZmNvdW50IGlzIGRlY3JlYXNlZCB0byAwLCB0aGUgaW50ZXJmYWNlIGlzIGRlc3Ryb3llZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfUmVsZWFzZShJRGlyZWN0RHJhd0NsaXBwZXIgKmlmYWNlKSB7CisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CisgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CisKKyAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmICsgMSk7CisKKyAgICBpZiAocmVmID09IDApCisgICAgeworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHJldHVybiByZWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdDbGlwcGVyOjpTZXRId25kCisgKgorICogQXNzaWducyBhIGhXbmQgdG8gdGhlIGNsaXBwZXIgaW50ZXJmYWNlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICBGbGFnczogVW5zdXBwb3J0ZWQgc28gZmFyCisgKiAgaFduZDogVGhlIGhXbmQgdG8gc2V0CisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBGbGFncyB3YXMgIT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfU2V0SHduZCgKICAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBEV09SRCBkd0ZsYWdzLCBIV05EIGhXbmQKICkgewogICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCAqKWlmYWNlOwpAQCAtOTYsNTIgKzE0MiwyNSBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotc3RhdGljIHZvaWQgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9EZXN0cm95KElEaXJlY3REcmF3Q2xpcHBlckltcGwqIFRoaXMpCi17Ci0gICAgaWYgKFRoaXMtPmRkcmF3X293bmVyICE9IE5VTEwpCi0JTWFpbl9EaXJlY3REcmF3X1JlbW92ZUNsaXBwZXIoVGhpcy0+ZGRyYXdfb3duZXIsIFRoaXMpOwotCi0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCAsVGhpcyk7Ci19Ci0KLXZvaWQgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9Gb3JjZURlc3Ryb3koSURpcmVjdERyYXdDbGlwcGVySW1wbCogVGhpcykKLXsKLSAgICBXQVJOKCJkZWxldGluZyBjbGlwcGVyICVwIHdpdGggcmVmY250ICVsdVxuIiwgVGhpcywgVGhpcy0+cmVmKTsKLSAgICBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0Rlc3Ryb3koVGhpcyk7Ci19Ci0KLVVMT05HIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UoTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSkgewotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCAqKWlmYWNlOwotICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwotCi0gICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiArIDEpOwotCi0gICAgaWYgKHJlZiA9PSAwKQotICAgIHsKLQlNYWluX0RpcmVjdERyYXdDbGlwcGVyX0Rlc3Ryb3koVGhpcyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgcmV0dXJuIHJlZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICBJRGlyZWN0RHJhd0NsaXBwZXI6OkdldENsaXBMaXN0Ci0qCi0qIFJldHJpZXZlIGEgY29weSBvZiB0aGUgY2xpcCBsaXN0Ci0qCi0qIFBBUkFNUwotKiAgbHBSZWN0ICBSZWN0YW5nbGUgdG8gYmUgdXNlZCB0byBjbGlwIHRoZSBjbGlwIGxpc3Qgb3IgTlVMTCBmb3IgdGhlCi0qICAgICAgICAgIGVudGlyZSBjbGlwIGxpc3QKLSogIGxwQ2xpcExpc3Qgc3RydWN0dXJlIGZvciB0aGUgcmVzdWx0aW5nIGNvcHkgb2YgdGhlIGNsaXAgbGlzdC4KLSAgICAgICAgICAgSWYgTlVMTCwgZmlsbHMgbHBkd1NpemUgdXAgdG8gdGhlIG51bWJlciBvZiBieXRlcyBuZWNlc3NhcnkgdG8gaG9sZAotICAgICAgICAgICB0aGUgZW50aXJlIGNsaXAuCi0qICBscGR3U2l6ZSBTaXplIG9mIHJlc3VsdGluZyBjbGlwIGxpc3Q7IHNpemUgb2YgdGhlIGJ1ZmZlciBhdCBscENsaXBMaXN0Ci0gICAgICAgICAgIG9yLCBpZiBscENsaXBMaXN0IGlzIE5VTEwsIHJlY2VpdmVzIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgaW4gYnl0ZXMKLSogUkVUVVJOUwotKiAgRWl0aGVyIEREX09LIG9yIERERVJSXyoKLSovCi1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0dldENsaXBMaXN0KAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0NsaXBwZXI6OkdldENsaXBMaXN0CisgKgorICogUmV0cmlldmUgYSBjb3B5IG9mIHRoZSBjbGlwIGxpc3QKKyAqCisgKiBBcmd1bWVudHM6CisgKiAgUmVjdDogUmVjdGFuZ2xlIHRvIGJlIHVzZWQgdG8gY2xpcCB0aGUgY2xpcCBsaXN0IG9yIE5VTEwgZm9yIHRoZQorICogICAgICAgIGVudGlyZSBjbGlwIGxpc3QKKyAqICBDbGlwTGlzdDogc3RydWN0dXJlIGZvciB0aGUgcmVzdWx0aW5nIGNvcHkgb2YgdGhlIGNsaXAgbGlzdC4KKyAqICAgICAgICAgICAgSWYgTlVMTCwgZmlsbHMgU2l6ZSB1cCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lY2Vzc2FyeSB0byBob2xkCisgKiAgICAgICAgICAgIHRoZSBlbnRpcmUgY2xpcC4KKyAqICBTaXplOiBTaXplIG9mIHJlc3VsdGluZyBjbGlwIGxpc3Q7IHNpemUgb2YgdGhlIGJ1ZmZlciBhdCBDbGlwTGlzdAorICogICAgICAgIG9yLCBpZiBDbGlwTGlzdCBpcyBOVUxMLCByZWNlaXZlcyB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiAgICAgICAgaW4gYnl0ZXMKKyAqCisgKiBSRVRVUk5TCisgKiAgRWl0aGVyIEREX09LIG9yIERERVJSXyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9HZXRDbGlwTGlzdCgKICAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBMUFJFQ1QgbHBSZWN0LCBMUFJHTkRBVEEgbHBDbGlwTGlzdCwKICAgICBMUERXT1JEIGxwZHdTaXplKQogewpAQCAtMTg4LDE4ICsyMDcsMjEgQEAKICAgICB9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgSURpcmVjdERyYXdDbGlwcGVyOjpTZXRDbGlwTGlzdAotKgotKiBTZXRzIG9yIGRlbGV0ZXMgKGlmIGxwcmduIGlzIE5VTEwpIHRoZSBjbGlwIGxpc3QKLSoKLSogUEFSQU1TCi0qICBscHJnbiAgIFBvaW50ZXIgdG8gYSBMUkdOREFUQSBzdHJ1Y3R1cmUgb3IgTlVMTAotKiAgZHdGbGFncyBub3QgdXNlZCwgbXVzdCBiZSAwCi0qIFJFVFVSTlMKLSogIEVpdGhlciBERF9PSyBvciBEREVSUl8qCi0qLwotSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9TZXRDbGlwTGlzdCgKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdDbGlwcGVyOjpTZXRDbGlwTGlzdAorICoKKyAqIFNldHMgb3IgZGVsZXRlcyAoaWYgbHByZ24gaXMgTlVMTCkgdGhlIGNsaXAgbGlzdAorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBzdHVwIGFuZCByZXR1cm5zIEREX09LIGFsd2F5cyB0byBtYWtlIHRoZSBhcHAKKyAqIGhhcHB5LgorICoKKyAqIFBBUkFNUworICogIGxwcmduICAgUG9pbnRlciB0byBhIExSR05EQVRBIHN0cnVjdHVyZSBvciBOVUxMCisgKiAgZHdGbGFncyBub3QgdXNlZCwgbXVzdCBiZSAwCisgKiBSRVRVUk5TCisgKiAgRWl0aGVyIEREX09LIG9yIERERVJSXyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1NldENsaXBMaXN0KAogICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsTFBSR05EQVRBIGxwcmduLERXT1JEIGR3RmxhZwogKSB7CiAgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7CkBAIC0yMDksMzUgKzIzMSwxOCBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9RdWVyeUludGVyZmFjZSgKLSAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmoKLSkgewotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCAqKWlmYWNlOwotCi0gICAgaWYgKElzRXF1YWxHVUlEKCZJSURfSVVua25vd24sIHJpaWQpCi0JfHwgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0RHJhd0NsaXBwZXIsIHJpaWQpKQotICAgIHsKLQkqcHB2T2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdDbGlwcGVyKTsKLQlJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlyZXR1cm4gRV9OT0lOVEVSRkFDRTsKLSAgICB9Ci19Ci0KLVVMT05HIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0FkZFJlZiggTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSApCi17Ci0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopaWZhY2U7Ci0gICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmIC0gMSk7Ci0KLSAgICByZXR1cm4gcmVmOwotfQotCi1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0dldEhXbmQoCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Q2xpcHBlcjo6R2V0SHduZAorICoKKyAqIFJldHVybnMgdGhlIGh3bmQgYXNzaWduZWQgd2l0aCBTZXRId25kCisgKgorICogQXJndW1lbnRzOgorICogIGhXbmRQdHI6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIEhXTkQgYXQKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogIEFsd2F5cyByZXR1cm5zIEREX09LOworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfR2V0SFduZCgKICAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBIV05EKiBoV25kUHRyCiApIHsKICAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKQEAgLTI0OCw3ICsyNTMsMjEgQEAKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfSW5pdGlhbGl6ZSgKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdDbGlwcGVyOjpJbml0aWFsaXplCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIGludGVyZmFjZS4gV2VsbCwgdGhlcmUgaXNuJ3QgbXVjaCB0byBkbyBmb3IgdGhpcworICogaW1wbGVtZW50YXRpb24sIGJ1dCBpdCBzdG9yZXMgdGhlIERpcmVjdERyYXcgSW50ZXJmYWNlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICBERDogUG9pbnRlciB0byBhIElEaXJlY3REcmF3IGludGVyZmFjZQorICogIEZsYWdzOiBVbnN1cHBvcnRlZCBieSBub3cKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9BTFJFQURZSU5JVElBTElaRUQgaWYgdGhpcyBpbnRlcmZhY2UgaXNuJ3QgaW5pdGlhbGl6ZWQgYWxscmVhZHkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0luaXRpYWxpemUoCiAgICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIExQRElSRUNURFJBVyBscERELCBEV09SRCBkd0ZsYWdzCiApIHsKICAgICBJRGlyZWN0RHJhd0ltcGwqIHBPd25lcjsKQEAgLTI1OSwxMiArMjc4LDIyIEBACiAKICAgICBwT3duZXIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3LCBscEREKTsKICAgICBUaGlzLT5kZHJhd19vd25lciA9IHBPd25lcjsKLSAgICBNYWluX0RpcmVjdERyYXdfQWRkQ2xpcHBlcihwT3duZXIsIFRoaXMpOwogCiAgICAgcmV0dXJuIEREX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0lzQ2xpcExpc3RDaGFuZ2VkKAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0NsaXBwZXI6OklzQ2xpcExpc3RDaGFuZ2VkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBhIHN0dWIKKyAqCisgKiBBcmd1bWVudHM6CisgKiAgQ2hhbmdlZDoKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogIEREX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9Jc0NsaXBMaXN0Q2hhbmdlZCgKICAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBCT09MKiBscGJDaGFuZ2VkCiApIHsKICAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICpUaGlzID0gKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKilpZmFjZTsKQEAgLTI3NiwxNSArMzA1LDE4IEBACiAgICAgcmV0dXJuIEREX09LOwogfQogCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdDbGlwcGVyVnRibCBERFJBV19DbGlwcGVyX1ZUYWJsZSA9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBWVGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IElEaXJlY3REcmF3Q2xpcHBlclZ0YmwgSURpcmVjdERyYXdDbGlwcGVyX1Z0YmwgPQogewotICAgIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfUXVlcnlJbnRlcmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9BZGRSZWYsCi0gICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9SZWxlYXNlLAotICAgIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfR2V0Q2xpcExpc3QsCi0gICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9HZXRIV25kLAotICAgIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfSW5pdGlhbGl6ZSwKLSAgICBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0lzQ2xpcExpc3RDaGFuZ2VkLAotICAgIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfU2V0Q2xpcExpc3QsCi0gICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9TZXRId25kCisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1JlbGVhc2UsCisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9HZXRDbGlwTGlzdCwKKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0dldEhXbmQsCisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9Jbml0aWFsaXplLAorICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfSXNDbGlwTGlzdENoYW5nZWQsCisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9TZXRDbGlwTGlzdCwKKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1NldEh3bmQKIH07CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2QzZF9wcml2YXRlLmggYi9kbGxzL2RkcmF3L2QzZF9wcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyN2MzZjUuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9kM2RfcHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNCArMCwwIEBACi0vKgotICogRGlyZWN0M0QgcHJpdmF0ZSBpbmNsdWRlIGZpbGUKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCBMaW9uZWwgVWxtZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IENocmlzdGlhbiBDb3N0YQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIHN0cnVjdHVyZSB0aGF0IGFyZSBub3QgZXhwb3J0ZWQKLSAqIHRocm91Z2ggZDNkLmggYW5kIGFsbCBjb21tb24gbWFjcm9zLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLSNpZm5kZWYgX19HUkFQSElDU19XSU5FX0QzRF9QUklWQVRFX0gKLSNkZWZpbmUgX19HUkFQSElDU19XSU5FX0QzRF9QUklWQVRFX0gKLQotLyogVEhJUyBGSUxFIE1VU1QgTk9UIENPTlRBSU4gWDExIG9yIE1FU0EgREVGSU5FUyAqLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpbmNsdWRlICJ3aW5kZWYuaCIKLSNpbmNsdWRlICJ3aW5iYXNlLmgiCi0jaW5jbHVkZSAid2luZ2RpLmgiCi0jaW5jbHVkZSAiZDNkLmgiCi0KLSNkZWZpbmUgTUFYX1RFWFRVUkVTIDgKLSNkZWZpbmUgTUFYX0xJR0hUUyAgMTYKLQotI2RlZmluZSBISUdIRVNUX1JFTkRFUl9TVEFURSAgICAgICAgIDE1MgotI2RlZmluZSBISUdIRVNUX1RFWFRVUkVfU1RBR0VfU1RBVEUgICAyNAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFByZWRlY2xhcmUgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmVzCi0gKi8KLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzRExpZ2h0SW1wbCBJRGlyZWN0M0RMaWdodEltcGw7Ci10eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwgSURpcmVjdDNETWF0ZXJpYWxJbXBsOwotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsIElEaXJlY3QzRFZpZXdwb3J0SW1wbDsKLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsOwotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsOwotCi0jaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgotCi10eXBlZGVmIHN0cnVjdCBTVEFURUJMT0NLRkxBR1MgewotICAgQk9PTCByZW5kZXJfc3RhdGVbSElHSEVTVF9SRU5ERVJfU1RBVEVdOwotICAgQk9PTCB0ZXh0dXJlX3N0YWdlX3N0YXRlW01BWF9URVhUVVJFU11bSElHSEVTVF9URVhUVVJFX1NUQUdFX1NUQVRFXTsKLX0gU1RBVEVCTE9DS0ZMQUdTOwotCi10eXBlZGVmIHN0cnVjdCBTVEFURUJMT0NLIHsKLSAgIFNUQVRFQkxPQ0tGTEFHUyBzZXRfZmxhZ3M7IAotICAgRFdPUkQgcmVuZGVyX3N0YXRlW0hJR0hFU1RfUkVOREVSX1NUQVRFXTsKLSAgIERXT1JEIHRleHR1cmVfc3RhZ2Vfc3RhdGVbTUFYX1RFWFRVUkVTXVtISUdIRVNUX1RFWFRVUkVfU1RBR0VfU1RBVEVdOwotfSBTVEFURUJMT0NLOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdDNETGlnaHQgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCi0gKi8KLXN0cnVjdCBJRGlyZWN0M0RMaWdodEltcGwKLXsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RMaWdodCk7Ci0gICAgTE9ORyByZWY7Ci0gICAgLyogSURpcmVjdDNETGlnaHQgZmllbGRzICovCi0gICAgSURpcmVjdERyYXdJbXBsICpkM2Q7Ci0gICAgLyogSWYgdGhpcyBsaWdodCBpcyBhY3RpdmUgZm9yIG9uZSB2aWV3cG9ydCwgcHV0IHRoZSB2aWV3cG9ydCBoZXJlICovCi0gICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICphY3RpdmVfdmlld3BvcnQ7Ci0KLSAgICBEM0RMSUdIVDIgbGlnaHQ7Ci0gICAgRDNETElHSFQ3IGxpZ2h0NzsKLQotICAgIERXT1JEIGR3TGlnaHRJbmRleDsKLQotICAgIC8qIENoYWluZWQgbGlzdCB1c2VkIGZvciBhZGRpbmcgLyByZW1vdmluZyBmcm9tIHZpZXdwb3J0cyAqLwotICAgIElEaXJlY3QzRExpZ2h0SW1wbCAqbmV4dDsKLQotICAgIC8qIEFjdGl2YXRpb24gZnVuY3Rpb24gKi8KLSAgICB2b2lkICgqYWN0aXZhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOwotICAgIHZvaWQgKCpkZXNhY3RpdmF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7Ci0gICAgdm9pZCAoKnVwZGF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3QzRE1hdGVyaWFsIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQotICovCi1zdHJ1Y3QgSURpcmVjdDNETWF0ZXJpYWxJbXBsCi17Ci0gICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwzKTsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbDIpOwotICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsKTsKLSAgICBMT05HICByZWY7Ci0gICAgLyogSURpcmVjdDNETWF0ZXJpYWwyIGZpZWxkcyAqLwotICAgIElEaXJlY3REcmF3SW1wbCAqZDNkOwotICAgIElEaXJlY3QzRERldmljZUltcGwgKmFjdGl2ZV9kZXZpY2U7Ci0KLSAgICBEM0RNQVRFUklBTCBtYXQ7Ci0KLSAgICB2b2lkICgqYWN0aXZhdGUpKElEaXJlY3QzRE1hdGVyaWFsSW1wbCogdGhpcyk7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3QzRFZpZXdwb3J0IGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQotICovCi1zdHJ1Y3QgSURpcmVjdDNEVmlld3BvcnRJbXBsCi17Ci0gICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmlld3BvcnQzKTsKLSAgICBMT05HIHJlZjsKLSAgICAvKiBJRGlyZWN0M0RWaWV3cG9ydCBmaWVsZHMgKi8KLSAgICBJRGlyZWN0RHJhd0ltcGwgKmQzZDsKLSAgICAvKiBJZiB0aGlzIHZpZXdwb3J0IGlzIGFjdGl2ZSBmb3Igb25lIGRldmljZSwgcHV0IHRoZSBkZXZpY2UgaGVyZSAqLwotICAgIElEaXJlY3QzRERldmljZUltcGwgKmFjdGl2ZV9kZXZpY2U7Ci0KLSAgICBEV09SRCBudW1fbGlnaHRzOwotICAgIERXT1JEIG1hcF9saWdodHM7Ci0KLSAgICBpbnQgdXNlX3ZwMjsKLSAgICB1bmlvbiB7Ci0gICAgICAgIEQzRFZJRVdQT1JUIHZwMTsKLQlEM0RWSUVXUE9SVDIgdnAyOwotICAgIH0gdmlld3BvcnRzOwotCi0gICAgLyogQWN0aXZhdGlvbiBmdW5jdGlvbiAqLwotICAgIHZvaWQgKCphY3RpdmF0ZSkoSURpcmVjdDNEVmlld3BvcnRJbXBsKik7Ci0KLSAgICAvKiBGaWVsZCB1c2VkIHRvIGNoYWluIHZpZXdwb3J0cyB0b2dldGhlciAqLwotICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqbmV4dDsKLQotICAgIC8qIExpZ2h0cyBsaXN0ICovCi0gICAgSURpcmVjdDNETGlnaHRJbXBsICpsaWdodHM7Ci0KLSAgICAvKiBCYWNrZ3JvdW5kIG1hdGVyaWFsICovCi0gICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsICpiYWNrZ3JvdW5kOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQotICovCi1zdHJ1Y3QgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwKLXsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKTsKLSAgICBMT05HIHJlZjsKLSAgICAvKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGZpZWxkcyAqLwotICAgIElEaXJlY3REcmF3SW1wbCAqZDNkOwotICAgIElEaXJlY3QzRERldmljZUltcGwqIGQzZGRldjsKLQotICAgIEQzREVYRUNVVEVCVUZGRVJERVNDIGRlc2M7Ci0gICAgRDNERVhFQ1VURURBVEEgZGF0YTsKLQotICAgIC8qIFRoaXMgYnVmZmVyIHdpbGwgc3RvcmUgdGhlIHRyYW5zZm9ybWVkIHZlcnRpY2VzICovCi0gICAgdm9pZCogdmVydGV4X2RhdGE7Ci0gICAgV09SRCogaW5kaWNlczsKLSAgICBpbnQgbmJfaW5kaWNlczsKLQotICAgIC8qIFRoaXMgZmxhZ3MgaXMgc2V0IHRvIFRSVUUgaWYgd2UgYWxsb2NhdGVkIG91cnNlbHZlcyB0aGUKLSAgICAgICBkYXRhIGJ1ZmZlciAqLwotICAgIEJPT0wgbmVlZF9mcmVlOwotCi0gICAgdm9pZCAoKmV4ZWN1dGUpKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsKiB0aGlzLAotICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2VJbXBsKiBkZXYsCi0gICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCogdnApOwotfTsKLQotLyogSW50ZXJuYWwgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgY2xpcHBpbmcgcGxhbmVzICovCi10eXBlZGVmIHN0cnVjdCBkM2Q3Y2xpcHBpbmdwbGFuZSAKLXsKLSAgICBEM0RWQUxVRSBwbGFuZVs0XTsKLX0gZDNkN2NsaXBwaW5ncGxhbmU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdDNERGV2aWNlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQotICovCi0KLSNkZWZpbmUgV09STERNQVRfQ0hBTkdFRCAoMHgwMDAwMDAwMSA8PCAgMCkKLSNkZWZpbmUgVklFV01BVF9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgMSkKLSNkZWZpbmUgUFJPSk1BVF9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgMikKLSNkZWZpbmUgVEVYTUFUMF9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgMykKLSNkZWZpbmUgVEVYTUFUMV9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgNCkKLSNkZWZpbmUgVEVYTUFUMl9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgNSkKLSNkZWZpbmUgVEVYTUFUM19DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgNikKLSNkZWZpbmUgVEVYTUFUNF9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgNykKLSNkZWZpbmUgVEVYTUFUNV9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgOCkKLSNkZWZpbmUgVEVYTUFUNl9DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAgOSkKLSNkZWZpbmUgVEVYTUFUN19DSEFOR0VEICAoMHgwMDAwMDAwMSA8PCAxMCkKLQotc3RydWN0IElEaXJlY3QzRERldmljZUltcGwKLXsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2U3KTsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UzKTsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UyKTsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0REZXZpY2UpOwotICAgIExPTkcgIHJlZjsKLQotICAgIC8qIFZlcnNpb24gb2YgdGhlIERpcmVjdDNEIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBkZXZpY2UgaGFzIGJlZW4gY3JlYXRlZCAqLwotICAgIERXT1JEIHZlcnNpb247Ci0KLSAgICAvKiBJRGlyZWN0M0REZXZpY2UgZmllbGRzICovCi0gICAgSURpcmVjdERyYXdJbXBsICpkM2Q7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZmFjZTsKLQotICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdmlld3BvcnRfbGlzdDsKLSAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cnJlbnRfdmlld3BvcnQ7Ci0gICAgRDNEVklFV1BPUlQ3IGFjdGl2ZV92aWV3cG9ydDsKLQotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmN1cnJlbnRfdGV4dHVyZVtNQVhfVEVYVFVSRVNdOwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmN1cnJlbnRfemJ1ZmZlcjsKLSAgICAKLSAgICAvKiBDdXJyZW50IHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzICovCi0gICAgRDNETUFUUklYICp3b3JsZF9tYXQ7Ci0gICAgRDNETUFUUklYICp2aWV3X21hdDsKLSAgICBEM0RNQVRSSVggKnByb2pfbWF0OwotICAgIEQzRE1BVFJJWCAqdGV4X21hdFtNQVhfVEVYVFVSRVNdOwotICAgIEJPT0xFQU4gdGV4X21hdF9pc19pZGVudGl0eVtNQVhfVEVYVFVSRVNdOwotICAgIAotICAgIC8qIEN1cnJlbnQgbWF0ZXJpYWwgdXNlZCBpbiBEM0Q3IG1vZGUgKi8KLSAgICBEM0RNQVRFUklBTDcgY3VycmVudF9tYXRlcmlhbDsKLQotICAgIC8qIExpZ2h0IHN0YXRlICovCi0gICAgRFdPUkQgbWF0ZXJpYWw7Ci0KLSAgICAvKiBMaWdodCBwYXJhbWV0ZXJzICovCi0gICAgRFdPUkQgbnVtX3NldF9saWdodHM7Ci0gICAgRFdPUkQgbWF4X2FjdGl2ZV9saWdodHM7Ci0gICAgTFBEM0RMSUdIVDcgbGlnaHRfcGFyYW1ldGVyczsKLSAgICBEV09SRCAqYWN0aXZlX2xpZ2h0czsKLQotICAgIC8qIENsaXBwaW5nIHBsYW5lcyAqLwotICAgIERXT1JEIG1heF9jbGlwcGluZ19wbGFuZXM7Ci0gICAgZDNkN2NsaXBwaW5ncGxhbmUgKmNsaXBwaW5nX3BsYW5lczsKLSAgICAKLSAgICB2b2lkICgqc2V0X2NvbnRleHQpKElEaXJlY3QzRERldmljZUltcGwqKTsKLSAgICBIUkVTVUxUICgqY2xlYXIpKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsCi0JCSAgICAgRFdPUkQgZHdDb3VudCwKLQkJICAgICBMUEQzRFJFQ1QgbHBSZWN0cywKLQkJICAgICBEV09SRCBkd0ZsYWdzLAotCQkgICAgIERXT1JEIGR3Q29sb3IsCi0JCSAgICAgRDNEVkFMVUUgZHZaLAotCQkgICAgIERXT1JEIGR3U3RlbmNpbCk7Ci0gICAgdm9pZCAoKm1hdHJpY2VzX3VwZGF0ZWQpKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsIERXT1JEIG1hdHJpY2VzKTsKLSAgICB2b2lkICgqc2V0X21hdHJpY2VzKShJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLCBEV09SRCBtYXRyaWNlcywKLQkJCSBEM0RNQVRSSVggKndvcmxkX21hdCwgRDNETUFUUklYICp2aWV3X21hdCwgRDNETUFUUklYICpwcm9qX21hdCk7Ci0gICAgdm9pZCAoKmZsdXNoX3RvX2ZyYW1lYnVmZmVyKShJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLCBMUENSRUNUIHBSZWN0LCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmKTsKLQotICAgIFNUQVRFQkxPQ0sgc3RhdGVfYmxvY2s7Ci0KLSAgICAvKiBVc2VkIHRvIHByZXZlbnQgbG9ja3MgYW5kIHJlbmRlcmluZyB0byBvdmVybGFwICovCi0gICAgQ1JJVElDQUxfU0VDVElPTiBjcml0OwotCi0gICAgLyogUmVuZGVyaW5nIGZ1bmN0aW9ucyAqLwotICAgIEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlX3R5cGU7Ci0gICAgRFdPUkQgdmVydGV4X3R5cGU7Ci0gICAgRFdPUkQgcmVuZGVyX2ZsYWdzOwotICAgIERXT1JEIG5iX3ZlcnRpY2VzOwotICAgIExQQllURSB2ZXJ0ZXhfYnVmZmVyOwotICAgIERXT1JEIHZlcnRleF9zaXplOwotICAgIERXT1JEIGJ1ZmZlcl9zaXplOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCi0gKi8KLXN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsCi17Ci0gICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmVydGV4QnVmZmVyNyk7Ci0gICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVmVydGV4QnVmZmVyKTsKLSAgICBMT05HIHJlZjsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKmQzZDsKLSAgICBEM0RWRVJURVhCVUZGRVJERVNDIGRlc2M7Ci0gICAgTFBWT0lEICp2ZXJ0aWNlczsKLSAgICBEV09SRCB2ZXJ0ZXhfYnVmZmVyX3NpemU7Ci0KLSAgICBCT09MRUFOIHByb2Nlc3NlZDsKLX07Ci0KLS8qIFZhcmlvdXMgZHVtcCBhbmQgaGVscGVyIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlKSBcCi0gICAgKCgoZDNkdnRWZXJ0ZXhUeXBlKSAmIEQzREZWRl9URVhDT1VOVF9NQVNLKSA+PiBEM0RGVkZfVEVYQ09VTlRfU0hJRlQpCi0KLSNkZWZpbmUgR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCB0ZXhfbnVtKSBcCi0gICAgKCgoKChkM2R2dFZlcnRleFR5cGUpID4+ICgxNiArICgyICogKHRleF9udW0pKSkpICsgMSkgJiAweDAzKSArIDEpCi0KLWV4dGVybiBjb25zdCBjaGFyICpfZ2V0X3JlbmRlcnN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSB0eXBlKTsKLWV4dGVybiB2b2lkIGR1bXBfRDNETUFURVJJQUw3KExQRDNETUFURVJJQUw3IGxwTWF0KTsKLWV4dGVybiB2b2lkIGR1bXBfRDNEQ09MT1JWQUxVRShEM0RDT0xPUlZBTFVFICpscENvbCk7Ci1leHRlcm4gdm9pZCBkdW1wX0QzRExJR0hUNyhMUEQzRExJR0hUNyBscExpZ2h0KTsKLWV4dGVybiB2b2lkIGR1bXBfRFBGTEFHUyhEV09SRCBkd0ZsYWdzKTsKLWV4dGVybiB2b2lkIGR1bXBfRDNETUFUUklYKEQzRE1BVFJJWCAqbWF0KTsKLWV4dGVybiB2b2lkIGR1bXBfRDNEVkVDVE9SKEQzRFZFQ1RPUiAqbHBWZWMpOwotZXh0ZXJuIHZvaWQgZHVtcF9mbGV4aWJsZV92ZXJ0ZXgoRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlKTsKLWV4dGVybiBEV09SRCBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlKTsKLWV4dGVybiB2b2lkIGNvbnZlcnRfRlZGX3RvX3N0cmlkZWRfZGF0YShEV09SRCBkM2R2dFZlcnRleFR5cGUsIExQVk9JRCBscHZWZXJ0aWNlcywgRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBICpzdHJpZGVkLCBEV09SRCBkd1N0YXJ0VmVydGV4KTsKLWV4dGVybiB2b2lkIGR1bXBfRDNEVk9QKERXT1JEIGR3VmVydGV4T3ApOwotZXh0ZXJuIHZvaWQgZHVtcF9EM0RQVihEV09SRCBkd0ZsYWdzKTsKLWV4dGVybiB2b2lkIG11bHRpcGx5X21hdHJpeChMUEQzRE1BVFJJWCxMUEQzRE1BVFJJWCxMUEQzRE1BVFJJWCk7Ci1leHRlcm4gdm9pZCBJbml0RGVmYXVsdFN0YXRlQmxvY2soU1RBVEVCTE9DSyogbHBTdGF0ZUJsb2NrLCBpbnQgdmVyc2lvbik7Ci0KLWV4dGVybiBjb25zdCBmbG9hdCBpZF9tYXRbMTZdOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3QzRCBvYmplY3QgbWV0aG9kcwotICovCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzdfRW51bURldmljZXMoTFBESVJFQ1QzRDcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0s3IGxwRW51bURldmljZXNDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFVzZXJBcmcpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzdfQ3JlYXRlRGV2aWNlKExQRElSRUNUM0Q3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJjbHNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBscEREUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEREVWSUNFNyogbHBscEQzRERldmljZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfN18zVF9DcmVhdGVWZXJ0ZXhCdWZmZXIoTFBESVJFQ1QzRDcgaWZhY2UsCi0JCQkJCSAgIExQRDNEVkVSVEVYQlVGRkVSREVTQyBscEQzRFZlcnRCdWZEZXNjLAotCQkJCQkgICBMUERJUkVDVDNEVkVSVEVYQlVGRkVSNyogbHBscEQzRFZlcnRCdWYsCi0JCQkJCSAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzdfM1RfRW51bVpCdWZmZXJGb3JtYXRzKExQRElSRUNUM0Q3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJpaWREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgbHBFbnVtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQ29udGV4dCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfN18zVF9FdmljdE1hbmFnZWRUZXh0dXJlcyhMUERJUkVDVDNENyBpZmFjZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfM18yVF8xVF9FbnVtRGV2aWNlcyhMUERJUkVDVDNEMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBscEVudW1EZXZpY2VzQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBVc2VyQXJnKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNESW1wbF8zXzJUXzFUX0NyZWF0ZUxpZ2h0KExQRElSRUNUM0QzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRExJR0hUKiBscGxwRGlyZWN0M0RMaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzNfMlRfMVRfQ3JlYXRlTWF0ZXJpYWwoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJCSAgTFBESVJFQ1QzRE1BVEVSSUFMMyogbHBscERpcmVjdDNETWF0ZXJpYWwzLAotCQkJCQkgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzNfMlRfMVRfQ3JlYXRlVmlld3BvcnQoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJCSAgTFBESVJFQ1QzRFZJRVdQT1JUMyogbHBscEQzRFZpZXdwb3J0MywKLQkJCQkJICBJVW5rbm93biogcFVua091dGVyKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNESW1wbF8zXzJUXzFUX0ZpbmREZXZpY2UoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJICAgICAgTFBEM0RGSU5EREVWSUNFU0VBUkNIIGxwRDNEREZTLAotCQkJCSAgICAgIExQRDNERklORERFVklDRVJFU1VMVCBscEQzREZEUik7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfM19DcmVhdGVEZXZpY2UoTFBESVJFQ1QzRDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmNsc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGxwRERTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RERVZJQ0UzKiBscGxwRDNERGV2aWNlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFVOS05PV04gbHBVbmspOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8zX0NyZWF0ZVZlcnRleEJ1ZmZlcihMUERJUkVDVDNEMyBpZmFjZSwKLQkJCQkJIExQRDNEVkVSVEVYQlVGRkVSREVTQyBscEQzRFZlcnRCdWZEZXNjLAotCQkJCQkgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUiogbHBscEQzRFZlcnRCdWYsCi0JCQkJCSBEV09SRCBkd0ZsYWdzLAotCQkJCQkgTFBVTktOT1dOIGxwVW5rKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVNYXRlcmlhbChMUERJUkVDVDNEMiBpZmFjZSwKLQkJCQkgICAgIExQRElSRUNUM0RNQVRFUklBTDIqIGxwbHBEaXJlY3QzRE1hdGVyaWFsMiwKLQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZVZpZXdwb3J0KExQRElSRUNUM0QyIGlmYWNlLAotCQkJCSAgICAgTFBESVJFQ1QzRFZJRVdQT1JUMiogbHBscEQzRFZpZXdwb3J0MiwKLQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlRGV2aWNlKExQRElSRUNUM0QyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJjbHNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFIGxwRERTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RERVZJQ0UyKiBscGxwRDNERGV2aWNlMik7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfMV9Jbml0aWFsaXplKExQRElSRUNUM0QgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVNYXRlcmlhbChMUERJUkVDVDNEIGlmYWNlLAotCQkJCSAgICAgTFBESVJFQ1QzRE1BVEVSSUFMKiBscGxwRGlyZWN0M0RNYXRlcmlhbCwKLQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZVZpZXdwb3J0KExQRElSRUNUM0QgaWZhY2UsCi0JCQkJICAgICBMUERJUkVDVDNEVklFV1BPUlQqIGxwbHBEM0RWaWV3cG9ydCwKLQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzFfRmluZERldmljZShMUERJUkVDVDNEIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREZJTkRERVZJQ0VTRUFSQ0ggbHBEM0RERlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERklORERFVklDRVJFU1VMVCBscGxwRDNERGV2aWNlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfN19RdWVyeUludGVyZmFjZShMUERJUkVDVDNENyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0QyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMV9RdWVyeUludGVyZmFjZShMUERJUkVDVDNEIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKTsKLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzdfQWRkUmVmKExQRElSRUNUM0Q3IGlmYWNlKTsKLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzNfQWRkUmVmKExQRElSRUNUM0QzIGlmYWNlKTsKLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzJfQWRkUmVmKExQRElSRUNUM0QyIGlmYWNlKTsKLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzFfQWRkUmVmKExQRElSRUNUM0QgaWZhY2UpOwotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfN19SZWxlYXNlKExQRElSRUNUM0Q3IGlmYWNlKTsKLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzNfUmVsZWFzZShMUERJUkVDVDNEMyBpZmFjZSk7Ci0KLVVMT05HIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX1JlbGVhc2UoTFBESVJFQ1QzRDIgaWZhY2UpOwotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMV9SZWxlYXNlKExQRElSRUNUM0QgaWZhY2UpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8zX0VudW1aQnVmZmVyRm9ybWF0cyhMUERJUkVDVDNEMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmlpZERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgbHBFbnVtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscENvbnRleHQpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8zX0V2aWN0TWFuYWdlZFRleHR1cmVzKExQRElSRUNUM0QzIGlmYWNlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMl9FbnVtRGV2aWNlcyhMUERJUkVDVDNEMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgbHBFbnVtRGV2aWNlc0NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFVzZXJBcmcpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8xX0VudW1EZXZpY2VzKExQRElSRUNUM0QgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIGxwRW51bURldmljZXNDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBVc2VyQXJnKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVMaWdodChMUERJUkVDVDNEMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNETElHSFQqIGxwbHBEaXJlY3QzRExpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZUxpZ2h0KExQRElSRUNUM0QgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRExJR0hUKiBscGxwRGlyZWN0M0RMaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biogcFVua091dGVyKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMV9GaW5kRGV2aWNlKExQRElSRUNUM0QgaWZhY2UsCi0JCQkJIExQRDNERklORERFVklDRVNFQVJDSCBscEQzRERGUywKLQkJCQkgTFBEM0RGSU5EREVWSUNFUkVTVUxUIGxwbHBEM0REZXZpY2UpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX0ZpbmREZXZpY2UoTFBESVJFQ1QzRDIgaWZhY2UsCi0JCQkJIExQRDNERklORERFVklDRVNFQVJDSCBscEQzRERGUywKLQkJCQkgTFBEM0RGSU5EREVWSUNFUkVTVUxUIGxwRDNERkRSKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0M0REZXZpY2Ugb2JqZWN0IG1ldGhvZHMKLSAqLwotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCk7Ci0KLVVMT05HIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfMVRfQWRkUmVmKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlKTsKLQotVUxPTkcgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF8xVF9SZWxlYXNlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENhcHMoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEREVWSUNFREVTQzcgbHBEM0RIRUxEZXZEZXNjKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0VudW1UZXh0dXJlRm9ybWF0cyhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBscEQzREVudW1QaXhlbFByb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQXJnKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX0JlZ2luU2NlbmUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfMVRfRW5kU2NlbmUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfMVRfR2V0RGlyZWN0M0QoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJCQlMUERJUkVDVDNENyogbHBscERpcmVjdDNEMyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9TZXRSZW5kZXJUYXJnZXQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJCQkgTFBESVJFQ1REUkFXU1VSRkFDRTcgbHBOZXdSZW5kZXJUYXJnZXQsCi0JCQkJCQkgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9HZXRSZW5kZXJUYXJnZXQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJCQkgTFBESVJFQ1REUkFXU1VSRkFDRTcqIGxwbHBSZW5kZXJUYXJnZXQpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfQ2xlYXIoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RSRUNUIGxwUmVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ09MT1IgZHdDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZBTFVFIGR2WiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3U3RlbmNpbCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9TZXRUcmFuc2Zvcm0oTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfR2V0VHJhbnNmb3JtKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYIGxwRDNETWF0cml4KTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RWSUVXUE9SVDcgbHBEYXRhKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX011bHRpcGx5VHJhbnNmb3JtKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19HZXRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVklFV1BPUlQ3IGxwRGF0YSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19TZXRNYXRlcmlhbChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUw3IGxwTWF0KTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0dldE1hdGVyaWFsKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTDcgbHBNYXQpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0TGlnaHQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0xpZ2h0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRExJR0hUNyBscExpZ2h0KTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0dldExpZ2h0KExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdMaWdodEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RMSUdIVDcgbHBMaWdodCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9TZXRSZW5kZXJTdGF0ZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3UmVuZGVyU3RhdGUpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfR2V0UmVuZGVyU3RhdGUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgZHdSZW5kZXJTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdSZW5kZXJTdGF0ZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19CZWdpblN0YXRlQmxvY2soTFBESVJFQ1QzRERFVklDRTcgaWZhY2UpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfRW5kU3RhdGVCbG9jayhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3QmxvY2tIYW5kbGUpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfUHJlTG9hZChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgbHBkZHNUZXh0dXJlKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdQcmltaXRpdmUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkM2R2dFZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscHZWZXJ0aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3SW5kZXhlZFByaW1pdGl2ZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBkd0luZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luZGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX1NldENsaXBTdGF0dXMoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEQ0xJUFNUQVRVUyBscEQzRENsaXBTdGF0dXMpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfR2V0Q2xpcFN0YXR1cyhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RDTElQU1RBVFVTIGxwRDNEQ2xpcFN0YXR1cyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3UHJpbWl0aXZlU3RyaWRlZChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3SW5kZXhlZFByaW1pdGl2ZVN0cmlkZWQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXT1JEIGxwSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfRHJhd1ByaW1pdGl2ZVZCKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkJICAgICAgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcgbHBEM0RWZXJ0ZXhCdWYsCi0JCQkJCSAgICAgIERXT1JEIGR3U3RhcnRWZXJ0ZXgsCi0JCQkJCSAgICAgIERXT1JEIGR3TnVtVmVydGljZXMsCi0JCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfRHJhd0luZGV4ZWRQcmltaXRpdmVWQihMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkJCSAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0JCQkJCQkgICAgIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwRDNEVmVydGV4QnVmLAotCQkJCQkJICAgICBEV09SRCBkd1N0YXJ0VmVydGV4LAotCQkJCQkJICAgICBEV09SRCBkd051bVZlcnRpY2VzLAotCQkJCQkJICAgICBMUFdPUkQgbHB3SW5kaWNlcywKLQkJCQkJCSAgICAgRFdPUkQgZHdJbmRleENvdW50LAotCQkJCQkJICAgICBEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5KExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RWRUNUT1IgbHBDZW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RWQUxVRSBscFJhZGlpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdOdW1TcGhlcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd1JldHVyblZhbHVlcyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9HZXRUZXh0dXJlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkgRFdPUkQgZHdTdGFnZSwKLQkJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBscFRleHR1cmUpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfU2V0VGV4dHVyZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkJIERXT1JEIGR3U3RhZ2UsCi0JCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyBscFRleHR1cmUpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfR2V0VGV4dHVyZVN0YWdlU3RhdGUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIGQzZFRleFN0YWdlU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3U3RhdGUpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfU2V0VGV4dHVyZVN0YWdlU3RhdGUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIGQzZFRleFN0YWdlU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTdGF0ZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9WYWxpZGF0ZURldmljZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd1Bhc3Nlcyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19BcHBseVN0YXRlQmxvY2soTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdCbG9ja0hhbmRsZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19DYXB0dXJlU3RhdGVCbG9jayhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3QmxvY2tIYW5kbGUpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfRGVsZXRlU3RhdGVCbG9jayhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdCbG9ja0hhbmRsZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19DcmVhdGVTdGF0ZUJsb2NrKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RTVEFURUJMT0NLVFlQRSBkM2RzYlR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd0Jsb2NrSGFuZGxlKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0xvYWQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IGxwRGVzdFRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQT0lOVCBscERlc3RQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgbHBTcmNUZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUkVDVCBscHJjU3JjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19MaWdodEVuYWJsZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TGlnaHRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgYkVuYWJsZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19HZXRMaWdodEVuYWJsZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TGlnaHRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wqIHBiRW5hYmxlKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X1NldENsaXBQbGFuZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZBTFVFKiBwUGxhbmVFcXVhdGlvbik7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19HZXRDbGlwUGxhbmUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSogcFBsYW5lRXF1YXRpb24pOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0SW5mbyhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEZXZJbmZvSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBwRGV2SW5mb1N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTaXplKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUXzFUX0dldENhcHMoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEREVWSUNFREVTQyBscEQzREhXRGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RERVZJQ0VERVNDIGxwRDNESEVMRGV2RGVzYyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF8xVF9HZXRTdGF0cyhMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEU1RBVFMgbHBEM0RTdGF0cyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF8xVF9BZGRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLQkJCQkJICAgICBMUERJUkVDVDNEVklFV1BPUlQzIGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfMVRfRGVsZXRlVmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJCQlMUERJUkVDVDNEVklFV1BPUlQzIGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfMVRfTmV4dFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotCQkJCQkgICAgICBMUERJUkVDVDNEVklFV1BPUlQzIGxwRGlyZWN0M0RWaWV3cG9ydDMsCi0JCQkJCSAgICAgIExQRElSRUNUM0RWSUVXUE9SVDMqIGxwbHBEaXJlY3QzRFZpZXdwb3J0MywKLQkJCQkJICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9TZXRDdXJyZW50Vmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJCQkgTFBESVJFQ1QzRFZJRVdQT1JUMyBscERpcmVjdDNEVmlld3BvcnQzKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX0dldEN1cnJlbnRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLQkJCQkJCSBMUERJUkVDVDNEVklFV1BPUlQzKiBscGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW4oTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4VHlwZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zX0JlZ2luSW5kZXhlZChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkM2R2dFZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TnVtVmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9WZXJ0ZXgoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwVmVydGV4VHlwZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9JbmRleChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd1ZlcnRleEluZGV4KTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX0VuZChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX0dldExpZ2h0U3RhdGUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUU1RBVEVUWVBFIGR3TGlnaHRTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd0xpZ2h0U3RhdGUpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfU2V0TGlnaHRTdGF0ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETElHSFRTVEFURVRZUEUgZHdMaWdodFN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdMaWdodFN0YXRlKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8yXzFUX1N3YXBUZXh0dXJlSGFuZGxlcyhMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEVEVYVFVSRTIgbHBEM0RUZXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RURVhUVVJFMiBscEQzRFRleDIpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfMVRfRW51bVRleHR1cmVGb3JtYXRzKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVRFWFRVUkVGT1JNQVRTQ0FMTEJBQ0sgbHBEM0RFbnVtVGV4dHVyZVByb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQXJnKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8yX0JlZ2luKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZHdWZXJ0ZXhUeXBlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfQmVnaW5JbmRleGVkKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscHZWZXJ0aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd051bVZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfRHJhd1ByaW1pdGl2ZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHB2VmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfRHJhd0luZGV4ZWRQcmltaXRpdmUoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBkd0luZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luZGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0luaXRpYWxpemUoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRCBscERpcmVjdDNELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEdVSUQgbHBHVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0REVkRlc2MpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzFfQ3JlYXRlRXhlY3V0ZUJ1ZmZlcihMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVYRUNVVEVCVUZGRVJERVNDIGxwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIqIGxwbHBEaXJlY3QzREV4ZWN1dGVCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzFfRXhlY3V0ZShMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNERVhFQ1VURUJVRkZFUiBscERpcmVjdDNERXhlY3V0ZUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRFZJRVdQT1JUIGxwRGlyZWN0M0RWaWV3cG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfMV9QaWNrKExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RFWEVDVVRFQlVGRkVSIGxwRGlyZWN0M0RFeGVjdXRlQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEVklFV1BPUlQgbHBEaXJlY3QzRFZpZXdwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFJFQ1QgbHBSZWN0KTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldFBpY2tSZWNvcmRzKExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFBJQ0tSRUNPUkQgbHBEM0RQaWNrUmVjKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0NyZWF0ZU1hdHJpeChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYSEFORExFIGxwRDNETWF0SGFuZGxlKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX1NldE1hdHJpeChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWEhBTkRMRSBEM0RNYXRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0TWF0cml4KExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYSEFORExFIEQzRE1hdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfMV9EZWxldGVNYXRyaXgoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVhIQU5ETEUgRDNETWF0SGFuZGxlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19RdWVyeUludGVyZmFjZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApOwotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19BZGRSZWYoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UpOwotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9BZGRSZWYoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UpOwotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9BZGRSZWYoTFBESVJFQ1QzRERFVklDRSBpZmFjZSk7Ci0KLVVMT05HIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1JlbGVhc2UoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UpOwotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9SZWxlYXNlKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlKTsKLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfUmVsZWFzZShMUERJUkVDVDNEREVWSUNFIGlmYWNlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9BZGRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLQkJCQkJTFBESVJFQ1QzRFZJRVdQT1JUMiBscERpcmVjdDNEVmlld3BvcnQyKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9BZGRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotCQkJCQlMUERJUkVDVDNEVklFV1BPUlQgbHBEaXJlY3QzRFZpZXdwb3J0KTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EZWxldGVWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLQkJCQkJICAgTFBESVJFQ1QzRFZJRVdQT1JUMiBscERpcmVjdDNEVmlld3BvcnQyKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9EZWxldGVWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotCQkJCQkgICBMUERJUkVDVDNEVklFV1BPUlQgbHBEaXJlY3QzRFZpZXdwb3J0KTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9OZXh0Vmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0JCQkJCSBMUERJUkVDVDNEVklFV1BPUlQyIGxwRGlyZWN0M0RWaWV3cG9ydDIsCi0JCQkJCSBMUERJUkVDVDNEVklFV1BPUlQyKiBscGxwRGlyZWN0M0RWaWV3cG9ydDIsCi0JCQkJCSBEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9OZXh0Vmlld3BvcnQoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLQkJCQkJIExQRElSRUNUM0RWSUVXUE9SVCBscERpcmVjdDNEVmlld3BvcnQsCi0JCQkJCSBMUERJUkVDVDNEVklFV1BPUlQqIGxwbHBEaXJlY3QzRFZpZXdwb3J0LAotCQkJCQkgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0RGlyZWN0M0QoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJCUxQRElSRUNUM0QzKiBscGxwRGlyZWN0M0QzKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXREaXJlY3QzRChMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLQkJCQkJTFBESVJFQ1QzRDIqIGxwbHBEaXJlY3QzRDIpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldERpcmVjdDNEKExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0JCQkJCUxQRElSRUNUM0QqIGxwbHBEaXJlY3QzRCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0Q3VycmVudFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotCQkJCQkgICAgICAgTFBESVJFQ1QzRFZJRVdQT1JUMiBscERpcmVjdDNEVmlld3BvcnQyKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRDdXJyZW50Vmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0JCQkJCSAgICAgICBMUERJUkVDVDNEVklFV1BPUlQyKiBscERpcmVjdDNEVmlld3BvcnQyKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19FbnVtVGV4dHVyZUZvcm1hdHMoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGxwRDNERW51bVBpeGVsUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQXJnKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19CZWdpblNjZW5lKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpblNjZW5lKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9CZWdpblNjZW5lKExQRElSRUNUM0RERVZJQ0UgaWZhY2UpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0VuZFNjZW5lKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9FbmRTY2VuZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfRW5kU2NlbmUoTFBESVJFQ1QzRERFVklDRSBpZmFjZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0VHJhbnNmb3JtKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFRyYW5zZm9ybShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYIGxwRDNETWF0cml4KTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRUcmFuc2Zvcm0oTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0VHJhbnNmb3JtKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX011bHRpcGx5VHJhbnNmb3JtKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYIGxwRDNETWF0cml4KTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9NdWx0aXBseVRyYW5zZm9ybShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0UmVuZGVyU3RhdGUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIGR3UmVuZGVyU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3UmVuZGVyU3RhdGUpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFJlbmRlclN0YXRlKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1JlbmRlclN0YXRlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRSZW5kZXJTdGF0ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgZHdSZW5kZXJTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3UmVuZGVyU3RhdGUpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclN0YXRlKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdSZW5kZXJTdGF0ZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGQzZHZ0VmVydGV4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHB2VmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgZHdJbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3SW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRDbGlwU3RhdHVzKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RDTElQU1RBVFVTIGxwRDNEQ2xpcFN0YXR1cyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0Q2xpcFN0YXR1cyhMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEQ0xJUFNUQVRVUyBscEQzRENsaXBTdGF0dXMpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldENsaXBTdGF0dXMoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRENMSVBTVEFUVVMgbHBEM0RDbGlwU3RhdHVzKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRDbGlwU3RhdHVzKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RDTElQU1RBVFVTIGxwRDNEQ2xpcFN0YXR1cyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZVN0cmlkZWQoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSBscEQzRERyYXdQcmltU3RyaWRlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXT1JEIGxwSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3SW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQ29tcHV0ZVNwaGVyZVZpc2liaWxpdHkoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RWRUNUT1IgbHBDZW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVkFMVUUgbHBSYWRpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd051bVNwaGVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdSZXR1cm5WYWx1ZXMpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFRleHR1cmVTdGFnZVN0YXRlKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3U3RhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIGQzZFRleFN0YWdlU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd1N0YXRlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUZXh0dXJlU3RhZ2VTdGF0ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBkM2RUZXhTdGFnZVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0YXRlKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19WYWxpZGF0ZURldmljZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdQYXNzZXMpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldENhcHMoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0RIV0RldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0RIRUxEZXZEZXNjKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9HZXRDYXBzKExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0RIV0RldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0RIRUxEZXZEZXNjKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9Td2FwVGV4dHVyZUhhbmRsZXMoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRFRFWFRVUkUgbHBEM0R0ZXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEVEVYVFVSRSBscEQzRFRleDIpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFN0YXRzKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEU1RBVFMgbHBEM0RTdGF0cyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0U3RhdHMoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFNUQVRTIGxwRDNEU3RhdHMpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFJlbmRlclRhcmdldChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBOZXdSZW5kZXJUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFJlbmRlclRhcmdldChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTQqIGxwbHBSZW5kZXJUYXJnZXQpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFJlbmRlclRhcmdldChMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscE5ld1JlbmRlclRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0UmVuZGVyVGFyZ2V0KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFKiBscGxwUmVuZGVyVGFyZ2V0KTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9WZXJ0ZXgoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFZlcnRleFR5cGUpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0luZGV4KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd1ZlcnRleEluZGV4KTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9FbmQoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldExpZ2h0U3RhdGUoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVFNUQVRFVFlQRSBkd0xpZ2h0U3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3TGlnaHRTdGF0ZSk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0TGlnaHRTdGF0ZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUU1RBVEVUWVBFIGR3TGlnaHRTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0xpZ2h0U3RhdGUpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0VudW1UZXh0dXJlRm9ybWF0cyhMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1URVhUVVJFRk9STUFUU0NBTExCQUNLIGxwRDNERW51bVRleHR1cmVQcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBBcmcpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFRleHR1cmUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJICAgICAgIERXT1JEIGR3U3RhZ2UsCi0JCQkJICAgICAgIExQRElSRUNUM0RURVhUVVJFMiBscFRleHR1cmUyKTsKLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3UHJpbWl0aXZlVkIoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJCSAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkJICAgIExQRElSRUNUM0RWRVJURVhCVUZGRVIgbHBEM0RWZXJ0ZXhCdWYsCi0JCQkJCSAgICBEV09SRCBkd1N0YXJ0VmVydGV4LAotCQkJCQkgICAgRFdPUkQgZHdOdW1WZXJ0aWNlcywKLQkJCQkJICAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlVkIoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJCQkgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkJCSAgIExQRElSRUNUM0RWRVJURVhCVUZGRVIgbHBEM0RWZXJ0ZXhCdWYsCi0JCQkJCQkgICBMUFdPUkQgbHB3SW5kaWNlcywKLQkJCQkJCSAgIERXT1JEIGR3SW5kZXhDb3VudCwKLQkJCQkJCSAgIERXT1JEIGR3RmxhZ3MpOwotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFRleHR1cmUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJICAgICAgIERXT1JEIGR3U3RhZ2UsCi0JCQkJICAgICAgIExQRElSRUNUM0RURVhUVVJFMiogbHBscFRleHR1cmUyKTsKLQotI2VuZGlmIC8qIF9fR1JBUEhJQ1NfV0lORV9EM0RfUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2QzZF91dGlscy5jIGIvZGxscy9kZHJhdy9kM2RfdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmMmRmMy4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L2QzZF91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qIERpcmVjdDNEIENvbW1vbiBmdW5jdGlvbnMKLSAqIENvcHlyaWdodCAoYykgMTk5OCBMaW9uZWwgVUxNRVIKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGNvbW1vbiBtaXNjZWxsYW5lb3VzIGNvZGUgdGhhdCBzcGFucwotICogZGlmZmVyZW50ICdvYmplY3RzJwotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAotI2luY2x1ZGUgIndpbmRlZi5oIgotI2luY2x1ZGUgIndpbmJhc2UuaCIKLSNpbmNsdWRlICJvYmpiYXNlLmgiCi0jaW5jbHVkZSAid2luZ2RpLmgiCi0jaW5jbHVkZSAiZGRyYXcuaCIKLSNpbmNsdWRlICJkM2QuaCIKLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0KLSNpbmNsdWRlICJkM2RfcHJpdmF0ZS5oIgotCi1XSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLWNvbnN0IGNoYXIgKl9nZXRfcmVuZGVyc3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHR5cGUpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0YXRlc1tdID0gewotICAgICAgICAiRVJSIiwKLQkiRDNEUkVOREVSU1RBVEVfVEVYVFVSRUhBTkRMRSIsCi0JIkQzRFJFTkRFUlNUQVRFX0FOVElBTElBUyIsCi0JIkQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTIiwKLQkiRDNEUkVOREVSU1RBVEVfVEVYVFVSRVBFUlNQRUNUSVZFIiwKLQkiRDNEUkVOREVSU1RBVEVfV1JBUFUiLAotCSJEM0RSRU5ERVJTVEFURV9XUkFQViIsCi0JIkQzRFJFTkRFUlNUQVRFX1pFTkFCTEUiLAotCSJEM0RSRU5ERVJTVEFURV9GSUxMTU9ERSIsCi0JIkQzRFJFTkRFUlNUQVRFX1NIQURFTU9ERSIsCi0JIkQzRFJFTkRFUlNUQVRFX0xJTkVQQVRURVJOIiwKLQkiRDNEUkVOREVSU1RBVEVfTU9OT0VOQUJMRSIsCi0JIkQzRFJFTkRFUlNUQVRFX1JPUDIiLAotCSJEM0RSRU5ERVJTVEFURV9QTEFORU1BU0siLAotCSJEM0RSRU5ERVJTVEFURV9aV1JJVEVFTkFCTEUiLAotCSJEM0RSRU5ERVJTVEFURV9BTFBIQVRFU1RFTkFCTEUiLAotCSJEM0RSRU5ERVJTVEFURV9MQVNUUElYRUwiLAotCSJEM0RSRU5ERVJTVEFURV9URVhUVVJFTUFHIiwKLQkiRDNEUkVOREVSU1RBVEVfVEVYVFVSRU1JTiIsCi0JIkQzRFJFTkRFUlNUQVRFX1NSQ0JMRU5EIiwKLQkiRDNEUkVOREVSU1RBVEVfREVTVEJMRU5EIiwKLQkiRDNEUkVOREVSU1RBVEVfVEVYVFVSRU1BUEJMRU5EIiwKLQkiRDNEUkVOREVSU1RBVEVfQ1VMTE1PREUiLAotCSJEM0RSRU5ERVJTVEFURV9aRlVOQyIsCi0JIkQzRFJFTkRFUlNUQVRFX0FMUEhBUkVGIiwKLQkiRDNEUkVOREVSU1RBVEVfQUxQSEFGVU5DIiwKLQkiRDNEUkVOREVSU1RBVEVfRElUSEVSRU5BQkxFIiwKLQkiRDNEUkVOREVSU1RBVEVfQUxQSEFCTEVOREVOQUJMRSIsCi0JIkQzRFJFTkRFUlNUQVRFX0ZPR0VOQUJMRSIsCi0JIkQzRFJFTkRFUlNUQVRFX1NQRUNVTEFSRU5BQkxFIiwKLQkiRDNEUkVOREVSU1RBVEVfWlZJU0lCTEUiLAotCSJEM0RSRU5ERVJTVEFURV9TVUJQSVhFTCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NVQlBJWEVMWCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVEQUxQSEEiLAotCSJEM0RSRU5ERVJTVEFURV9GT0dDT0xPUiIsCi0JIkQzRFJFTkRFUlNUQVRFX0ZPR1RBQkxFTU9ERSIsCi0JIkQzRFJFTkRFUlNUQVRFX0ZPR1RBQkxFU1RBUlQiLAotCSJEM0RSRU5ERVJTVEFURV9GT0dUQUJMRUVORCIsCi0JIkQzRFJFTkRFUlNUQVRFX0ZPR1RBQkxFREVOU0lUWSIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVFTkFCTEUiLAotCSJEM0RSRU5ERVJTVEFURV9FREdFQU5USUFMSUFTIiwKLQkiRDNEUkVOREVSU1RBVEVfQ09MT1JLRVlFTkFCTEUiLAotCSJFUlIiLAotCSJEM0RSRU5ERVJTVEFURV9CT1JERVJDT0xPUiIsCi0JIkQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTVSIsCi0JIkQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTViIsCi0JIkQzRFJFTkRFUlNUQVRFX01JUE1BUExPREJJQVMiLAotCSJEM0RSRU5ERVJTVEFURV9aQklBUyIsCi0JIkQzRFJFTkRFUlNUQVRFX1JBTkdFRk9HRU5BQkxFIiwKLQkiRDNEUkVOREVSU1RBVEVfQU5JU09UUk9QWSIsCi0JIkQzRFJFTkRFUlNUQVRFX0ZMVVNIQkFUQ0giLAotCSJEM0RSRU5ERVJTVEFURV9UUkFOU0xVQ0VOVFNPUlRJTkRFUEVOREVOVCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NURU5DSUxFTkFCTEUiLAotCSJEM0RSRU5ERVJTVEFURV9TVEVOQ0lMRkFJTCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NURU5DSUxaRkFJTCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NURU5DSUxQQVNTIiwKLQkiRDNEUkVOREVSU1RBVEVfU1RFTkNJTEZVTkMiLAotCSJEM0RSRU5ERVJTVEFURV9TVEVOQ0lMUkVGIiwKLQkiRDNEUkVOREVSU1RBVEVfU1RFTkNJTE1BU0siLAotCSJEM0RSRU5ERVJTVEFURV9TVEVOQ0lMV1JJVEVNQVNLIiwKLQkiRDNEUkVOREVSU1RBVEVfVEVYVFVSRUZBQ1RPUiIsCi0JIkVSUiIsCi0JIkVSUiIsCi0JIkVSUiIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMDAiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjAxIiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4wMiIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMDMiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjA0IiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4wNSIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMDYiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjA3IiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4wOCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMDkiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjEwIiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4xMSIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMTIiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjEzIiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4xNCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMTUiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjE2IiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4xNyIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMTgiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjE5IiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4yMCIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMjEiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjIyIiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4yMyIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMjQiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjI1IiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4yNiIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMjciLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjI4IiwKLQkiRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4yOSIsCi0JIkQzRFJFTkRFUlNUQVRFX1NUSVBQTEVQQVRURVJOMzAiLAotCSJEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjMxIgotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdGF0ZXNfMltdID0gewotICAgICAgICAiRDNEUkVOREVSU1RBVEVfV1JBUDAiLAotCSJEM0RSRU5ERVJTVEFURV9XUkFQMSIsCi0JIkQzRFJFTkRFUlNUQVRFX1dSQVAyIiwKLQkiRDNEUkVOREVSU1RBVEVfV1JBUDMiLAotCSJEM0RSRU5ERVJTVEFURV9XUkFQNCIsCi0JIkQzRFJFTkRFUlNUQVRFX1dSQVA1IiwKLQkiRDNEUkVOREVSU1RBVEVfV1JBUDYiLAotCSJEM0RSRU5ERVJTVEFURV9XUkFQNyIsCi0JIkQzRFJFTkRFUlNUQVRFX0NMSVBQSU5HIiwKLQkiRDNEUkVOREVSU1RBVEVfTElHSFRJTkciLAotCSJEM0RSRU5ERVJTVEFURV9FWFRFTlRTIiwKLQkiRDNEUkVOREVSU1RBVEVfQU1CSUVOVCIsCi0JIkQzRFJFTkRFUlNUQVRFX0ZPR1ZFUlRFWE1PREUiLAotCSJEM0RSRU5ERVJTVEFURV9DT0xPUlZFUlRFWCIsCi0JIkQzRFJFTkRFUlNUQVRFX0xPQ0FMVklFV0VSIiwKLQkiRDNEUkVOREVSU1RBVEVfTk9STUFMSVpFTk9STUFMUyIsCi0JIkQzRFJFTkRFUlNUQVRFX0NPTE9SS0VZQkxFTkRFTkFCTEUiLAotCSJEM0RSRU5ERVJTVEFURV9ESUZGVVNFTUFURVJJQUxTT1VSQ0UiLAotCSJEM0RSRU5ERVJTVEFURV9TUEVDVUxBUk1BVEVSSUFMU09VUkNFIiwKLQkiRDNEUkVOREVSU1RBVEVfQU1CSUVOVE1BVEVSSUFMU09VUkNFIiwKLQkiRDNEUkVOREVSU1RBVEVfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSIsCi0JIkVSUiIsCi0JIkVSUiIsCi0JIkQzRFJFTkRFUlNUQVRFX1ZFUlRFWEJMRU5EIiwKLQkiRDNEUkVOREVSU1RBVEVfQ0xJUFBMQU5FRU5BQkxFIiwKLSAgICB9OwotICAgIGlmICh0eXBlID49IEQzRFJFTkRFUlNUQVRFX1dSQVAwKSB7Ci0gICAgICAgIHR5cGUgLT0gRDNEUkVOREVSU1RBVEVfV1JBUDA7Ci0JaWYgKHR5cGUgPj0gKHNpemVvZihzdGF0ZXNfMikgLyBzaXplb2Yoc3RhdGVzXzJbMF0pKSkgcmV0dXJuICJFUlIiOwotCXJldHVybiBzdGF0ZXNfMlt0eXBlXTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPj0gKHNpemVvZihzdGF0ZXMpIC8gc2l6ZW9mKHN0YXRlc1swXSkpKSByZXR1cm4gIkVSUiI7Ci0gICAgcmV0dXJuIHN0YXRlc1t0eXBlXTsKLX0KLQotdm9pZAotZHVtcF9EM0RDT0xPUlZBTFVFKEQzRENPTE9SVkFMVUUgKmxwQ29sKQotewotICAgIERQUklOVEYoIiVmICVmICVmICVmIiwgbHBDb2wtPnUxLnIsIGxwQ29sLT51Mi5nLCBscENvbC0+dTMuYiwgbHBDb2wtPnU0LmEpOwotfQotCi12b2lkCi1kdW1wX0QzRFZFQ1RPUihEM0RWRUNUT1IgKmxwVmVjKQotewotICAgIERQUklOVEYoIiVmICVmICVmIiwgbHBWZWMtPnUxLngsIGxwVmVjLT51Mi55LCBscFZlYy0+dTMueik7Ci19Ci0KLXZvaWQKLWR1bXBfRDNETUFURVJJQUw3KExQRDNETUFURVJJQUw3IGxwTWF0KQotewotICAgIERQUklOVEYoIiAtIGRpZmZ1c2UgIDogIik7IGR1bXBfRDNEQ09MT1JWQUxVRSgmKGxwTWF0LT51LmRpZmZ1c2UpKTsgRFBSSU5URigiXG4iKTsKLSAgICBEUFJJTlRGKCIgLSBhbWJpZW50ICA6ICIpOyBkdW1wX0QzRENPTE9SVkFMVUUoJihscE1hdC0+dTEuYW1iaWVudCkpOyBEUFJJTlRGKCJcbiIpOwotICAgIERQUklOVEYoIiAtIHNwZWN1bGFyIDogIik7IGR1bXBfRDNEQ09MT1JWQUxVRSgmKGxwTWF0LT51Mi5zcGVjdWxhcikpOyBEUFJJTlRGKCJcbiIpOwotICAgIERQUklOVEYoIiAtIGVtaXNzaXZlIDogIik7IGR1bXBfRDNEQ09MT1JWQUxVRSgmKGxwTWF0LT51My5lbWlzc2l2ZSkpOyBEUFJJTlRGKCJcbiIpOwotICAgIERQUklOVEYoIiAtIHBvd2VyICAgIDogJWZcbiIsIGxwTWF0LT51NC5wb3dlcik7Ci19Ci0KLXZvaWQKLWR1bXBfRDNETElHSFQ3KExQRDNETElHSFQ3IGxwTGlnaHQpCi17Ci0gICAgRFBSSU5URigiIC0gbGlnaHQgdHlwZSA6ICVzXG4iLCAobHBMaWdodC0+ZGx0VHlwZSA9PSBEM0RMSUdIVF9QT0lOVCA/ICJEM0RMSUdIVF9QT0lOVCIgOiAKLQkJCQkgICAgIChscExpZ2h0LT5kbHRUeXBlID09IEQzRExJR0hUX1NQT1QgPyAiRDNETElHSFRfU1BPVCIgOiAKLQkJCQkgICAgICAobHBMaWdodC0+ZGx0VHlwZSA9PSBEM0RMSUdIVF9ESVJFQ1RJT05BTCA/ICJEM0RMSUdIVF9ESVJFQ1RJT05BTCIgOiAKLQkJCQkgICAgICAgIlVOU1VQUE9SVEVEIikpKSk7Ci0gICAgRFBSSU5URigiIC0gZGlmZnVzZSAgICAgICA6ICIpOyBkdW1wX0QzRENPTE9SVkFMVUUoJihscExpZ2h0LT5kY3ZEaWZmdXNlKSk7IERQUklOVEYoIlxuIik7Ci0gICAgRFBSSU5URigiIC0gc3BlY3VsYXIgICAgICA6ICIpOyBkdW1wX0QzRENPTE9SVkFMVUUoJihscExpZ2h0LT5kY3ZTcGVjdWxhcikpOyBEUFJJTlRGKCJcbiIpOwotICAgIERQUklOVEYoIiAtIGFtYmllbnQgICAgICAgOiAiKTsgZHVtcF9EM0RDT0xPUlZBTFVFKCYobHBMaWdodC0+ZGN2QW1iaWVudCkpOyBEUFJJTlRGKCJcbiIpOwotICAgIERQUklOVEYoIiAtIHBvc2l0aW9uICAgICAgOiAiKTsgZHVtcF9EM0RWRUNUT1IoJihscExpZ2h0LT5kdlBvc2l0aW9uKSk7IERQUklOVEYoIlxuIik7Ci0gICAgRFBSSU5URigiIC0gZGlyZWN0aW9uICAgICA6ICIpOyBkdW1wX0QzRFZFQ1RPUigmKGxwTGlnaHQtPmR2RGlyZWN0aW9uKSk7IERQUklOVEYoIlxuIik7Ci0gICAgRFBSSU5URigiIC0gZHZSYW5nZSAgICAgICA6ICVmXG4iLCBscExpZ2h0LT5kdlJhbmdlKTsKLSAgICBEUFJJTlRGKCIgLSBkdkZhbGxvZmYgICAgIDogJWZcbiIsIGxwTGlnaHQtPmR2RmFsbG9mZik7Ci0gICAgRFBSSU5URigiIC0gZHZBdHRlbnVhdGlvbiA6ICVmICVmICVmXG4iLCBscExpZ2h0LT5kdkF0dGVudWF0aW9uMCwgbHBMaWdodC0+ZHZBdHRlbnVhdGlvbjEsIGxwTGlnaHQtPmR2QXR0ZW51YXRpb24yKTsKLSAgICBEUFJJTlRGKCIgLSBkdlRoZXRhICAgICAgIDogJWZcbiIsIGxwTGlnaHQtPmR2VGhldGEpOwotICAgIERQUklOVEYoIiAtIGR2UGhpICAgICAgICAgOiAlZlxuIiwgbHBMaWdodC0+ZHZQaGkpOwotfQotCi12b2lkCi1kdW1wX0RQRkxBR1MoRFdPUkQgZHdGbGFncykKLXsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQotICAgIHsKLSAgICAgICAgRkUoRDNERFBfV0FJVCksCi0JRkUoRDNERFBfT1VUT0ZPUkRFUiksCi0JRkUoRDNERFBfRE9OT1RDTElQKSwKLQlGRShEM0REUF9ET05PVFVQREFURUVYVEVOVFMpLAotCUZFKEQzRERQX0RPTk9UTElHSFQpCi0gICAgfTsKLQotICAgIEREUkFXX2R1bXBfZmxhZ3MoZHdGbGFncywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSk7Ci19Ci0KLXZvaWQKLWR1bXBfRDNETUFUUklYKEQzRE1BVFJJWCAqbWF0KQotewotICAgIERQUklOVEYoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzExLCBtYXQtPl8xMiwgbWF0LT5fMTMsIG1hdC0+XzE0KTsKLSAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8yMSwgbWF0LT5fMjIsIG1hdC0+XzIzLCBtYXQtPl8yNCk7Ci0gICAgRFBSSU5URigiICAlZiAlZiAlZiAlZlxuIiwgbWF0LT5fMzEsIG1hdC0+XzMyLCBtYXQtPl8zMywgbWF0LT5fMzQpOwotICAgIERQUklOVEYoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzQxLCBtYXQtPl80MiwgbWF0LT5fNDMsIG1hdC0+XzQ0KTsKLX0KLQotRFdPUkQgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERXT1JEIGQzZHZ0VmVydGV4VHlwZSkKLXsKLSAgICBEV09SRCBzaXplID0gMDsKLSAgICBpbnQgaTsKLSAgICAKLSAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX05PUk1BTCkgc2l6ZSArPSAzICogc2l6ZW9mKEQzRFZBTFVFKTsKLSAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX0RJRkZVU0UpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKLSAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1NQRUNVTEFSKSBzaXplICs9IHNpemVvZihEV09SRCk7Ci0gICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9SRVNFUlZFRDEpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKLSAgICBzd2l0Y2ggKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSB7Ci0gICAgICAgIGNhc2UgRDNERlZGX1hZWjogc2l6ZSArPSAzICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRDNERlZGX1hZWlJIVzogc2l6ZSArPSA0ICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7Ci0JZGVmYXVsdDogVFJBQ0UoIiBtYXRyaXggd2VpZ2h0aW5nIG5vdCBoYW5kbGVkIHlldC4uLlxuIik7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlKTsgaSsrKSB7Ci0Jc2l6ZSArPSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIGkpICogc2l6ZW9mKEQzRFZBTFVFKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXZvaWQgZHVtcF9mbGV4aWJsZV92ZXJ0ZXgoRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlKQotewotICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9IHsKLSAgICAgICAgRkUoRDNERlZGX05PUk1BTCksCi0JRkUoRDNERlZGX1JFU0VSVkVEMSksCi0JRkUoRDNERlZGX0RJRkZVU0UpLAotCUZFKEQzREZWRl9TUEVDVUxBUikKLSAgICB9OwotICAgIHVuc2lnbmVkIGludCBpOwotICAgIAotICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUkVTRVJWRUQwKSBEUFJJTlRGKCJEM0RGVkZfUkVTRVJWRUQwICIpOwotICAgIHN3aXRjaCAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1BPU0lUSU9OX01BU0spIHsKLSNkZWZpbmUgR0VOX0NBU0UoYSkgY2FzZSBhOiBEUFJJTlRGKCNhICIgIik7IGJyZWFrCi0gICAgICAgIEdFTl9DQVNFKEQzREZWRl9YWVopOwotCUdFTl9DQVNFKEQzREZWRl9YWVpSSFcpOwotCUdFTl9DQVNFKEQzREZWRl9YWVpCMSk7Ci0JR0VOX0NBU0UoRDNERlZGX1hZWkIyKTsKLQlHRU5fQ0FTRShEM0RGVkZfWFlaQjMpOwotCUdFTl9DQVNFKEQzREZWRl9YWVpCNCk7Ci0JR0VOX0NBU0UoRDNERlZGX1hZWkI1KTsKLSAgICB9Ci0gICAgRERSQVdfZHVtcF9mbGFnc18oZDNkdnRWZXJ0ZXhUeXBlLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pLCBGQUxTRSk7Ci0gICAgc3dpdGNoIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgewotICAgICAgICBHRU5fQ0FTRShEM0RGVkZfVEVYMCk7Ci0JR0VOX0NBU0UoRDNERlZGX1RFWDEpOwotCUdFTl9DQVNFKEQzREZWRl9URVgyKTsKLQlHRU5fQ0FTRShEM0RGVkZfVEVYMyk7Ci0JR0VOX0NBU0UoRDNERlZGX1RFWDQpOwotCUdFTl9DQVNFKEQzREZWRl9URVg1KTsKLQlHRU5fQ0FTRShEM0RGVkZfVEVYNik7Ci0JR0VOX0NBU0UoRDNERlZGX1RFWDcpOwotCUdFTl9DQVNFKEQzREZWRl9URVg4KTsKLSAgICB9Ci0jdW5kZWYgR0VOX0NBU0UKLSAgICBmb3IgKGkgPSAwOyBpIDwgR0VUX1RFWENPVU5UX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSk7IGkrKykgewotICAgICAgICBEUFJJTlRGKCIgVCVkLXMlbGQiLCBpICsgMSwgR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCBpKSk7Ci0gICAgfQotICAgIERQUklOVEYoIlxuIik7Ci19Ci0KLXZvaWQKLWNvbnZlcnRfRlZGX3RvX3N0cmlkZWRfZGF0YShEV09SRCBkM2R2dFZlcnRleFR5cGUsIExQVk9JRCBscHZWZXJ0aWNlcywgRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBICpzdHJpZGVkLCBEV09SRCBkd1N0YXJ0VmVydGV4KQotewotICAgIGludCBjdXJyZW50X29mZnNldCA9IDA7Ci0gICAgdW5zaWduZWQgaW50IHRleF9pbmRleDsKLSAgICBpbnQgc2l6ZSA9IGdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShkM2R2dFZlcnRleFR5cGUpOwotCi0gICAgbHB2VmVydGljZXMgPSAoKEJZVEUgKikgbHB2VmVydGljZXMpICsgKHNpemUgKiBkd1N0YXJ0VmVydGV4KTsKLSAgICAKLSAgICBpZiAoKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSA9PSBEM0RGVkZfWFlaKSB7Ci0gICAgICAgIHN0cmlkZWQtPnBvc2l0aW9uLmxwdkRhdGEgPSBscHZWZXJ0aWNlczsKLSAgICAgICAgY3VycmVudF9vZmZzZXQgKz0gMyAqIHNpemVvZihEM0RWQUxVRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RyaWRlZC0+cG9zaXRpb24ubHB2RGF0YSAgPSBscHZWZXJ0aWNlczsKLSAgICAgICAgY3VycmVudF9vZmZzZXQgKz0gNCAqIHNpemVvZihEM0RWQUxVRSk7Ci0gICAgfQotICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUkVTRVJWRUQxKSB7Ci0gICAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHNpemVvZihEV09SRCk7Ci0gICAgfQotICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfTk9STUFMKSB7IAotICAgICAgICBzdHJpZGVkLT5ub3JtYWwubHB2RGF0YSAgPSAoKGNoYXIgKikgbHB2VmVydGljZXMpICsgY3VycmVudF9vZmZzZXQ7Ci0gICAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IDMgKiBzaXplb2YoRDNEVkFMVUUpOwotICAgIH0KLSAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX0RJRkZVU0UpIHsgCi0gICAgICAgIHN0cmlkZWQtPmRpZmZ1c2UubHB2RGF0YSAgPSAoKGNoYXIgKikgbHB2VmVydGljZXMpICsgY3VycmVudF9vZmZzZXQ7Ci0gICAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHNpemVvZihEV09SRCk7Ci0gICAgfQotICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfU1BFQ1VMQVIpIHsKLSAgICAgICAgc3RyaWRlZC0+c3BlY3VsYXIubHB2RGF0YSAgPSAoKGNoYXIgKikgbHB2VmVydGljZXMpICsgY3VycmVudF9vZmZzZXQ7Ci0gICAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHNpemVvZihEV09SRCk7Ci0gICAgfQotICAgIGZvciAodGV4X2luZGV4ID0gMDsgdGV4X2luZGV4IDwgR0VUX1RFWENPVU5UX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSk7IHRleF9pbmRleCsrKSB7Ci0gICAgICAgIHN0cmlkZWQtPnRleHR1cmVDb29yZHNbdGV4X2luZGV4XS5scHZEYXRhICA9ICgoY2hhciAqKSBscHZWZXJ0aWNlcykgKyBjdXJyZW50X29mZnNldDsKLSAgICAgICAgY3VycmVudF9vZmZzZXQgKz0gR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCB0ZXhfaW5kZXgpICogc2l6ZW9mKEQzRFZBTFVFKTsKLSAgICB9Ci0gICAgc3RyaWRlZC0+cG9zaXRpb24uZHdTdHJpZGUgPSBjdXJyZW50X29mZnNldDsKLSAgICBzdHJpZGVkLT5ub3JtYWwuZHdTdHJpZGUgICA9IGN1cnJlbnRfb2Zmc2V0OwotICAgIHN0cmlkZWQtPmRpZmZ1c2UuZHdTdHJpZGUgID0gY3VycmVudF9vZmZzZXQ7Ci0gICAgc3RyaWRlZC0+c3BlY3VsYXIuZHdTdHJpZGUgPSBjdXJyZW50X29mZnNldDsKLSAgICBmb3IgKHRleF9pbmRleCA9IDA7IHRleF9pbmRleCA8ICgoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1RFWENPVU5UX01BU0spID4+IEQzREZWRl9URVhDT1VOVF9TSElGVCk7IHRleF9pbmRleCsrKQotICAgICAgICBzdHJpZGVkLT50ZXh0dXJlQ29vcmRzW3RleF9pbmRleF0uZHdTdHJpZGUgID0gY3VycmVudF9vZmZzZXQ7ICAgCi19Ci0KLXZvaWQKLWR1bXBfRDNEVk9QKERXT1JEIGR3VmVydGV4T3ApCi17Ci0gICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KLSAgICB7Ci0gICAgICAgIEZFKEQzRFZPUF9MSUdIVCksCi0JRkUoRDNEVk9QX0NMSVApLAotCUZFKEQzRFZPUF9FWFRFTlRTKSwKLQlGRShEM0RWT1BfVFJBTlNGT1JNKQotICAgIH07Ci0gICAgRERSQVdfZHVtcF9mbGFncyhkd1ZlcnRleE9wLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pKTsKLX0KLQotdm9pZAotZHVtcF9EM0RQVihEV09SRCBkd0ZsYWdzKQotewotICAgIGlmIChkd0ZsYWdzID09IEQzRFBWX0RPTk9UQ09QWURBVEEpIERQUklOVEYoIkQzRFBWX0RPTk9UQ09QWURBVEFcbiIpOwotICAgIGVsc2UgaWYgKGR3RmxhZ3MgIT0gMCkgRFBSSU5URigiVW5rbm93biAhISFcbiIpOwotICAgIGVsc2UgRFBSSU5URigiXG4iKTsKLX0KLQotdm9pZCBtdWx0aXBseV9tYXRyaXgoTFBEM0RNQVRSSVggZGVzdCwgTFBEM0RNQVRSSVggc3JjMSwgTFBEM0RNQVRSSVggc3JjMikKLXsKLSAgICBEM0RNQVRSSVggdGVtcDsKLQotICAgIC8qIE5vdyBkbyB0aGUgbXVsdGlwbGljYXRpb24gJ2J5IGhhbmQnLgotICAgICAgIEkga25vdyB0aGF0IGFsbCB0aGlzIGNvdWxkIGJlIG9wdGltaXNlZCwgYnV0IHRoaXMgd2lsbCBiZSBkb25lIGxhdGVyIDotKSAqLwotICAgIHRlbXAuXzExID0gKHNyYzEtPl8xMSAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80MSAqIHNyYzItPl8xNCk7Ci0gICAgdGVtcC5fMjEgPSAoc3JjMS0+XzExICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzI0KTsKLSAgICB0ZW1wLl8zMSA9IChzcmMxLT5fMTEgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yMSAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzMxICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDEgKiBzcmMyLT5fMzQpOwotICAgIHRlbXAuXzQxID0gKHNyYzEtPl8xMSAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80MSAqIHNyYzItPl80NCk7Ci0KLSAgICB0ZW1wLl8xMiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fMTEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl8xMikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzEzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fMTQpOwotICAgIHRlbXAuXzIyID0gKHNyYzEtPl8xMiAqIHNyYzItPl8yMSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzIyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fMjMpICsgKHNyYzEtPl80MiAqIHNyYzItPl8yNCk7Ci0gICAgdGVtcC5fMzIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzM0KTsKLSAgICB0ZW1wLl80MiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fNDEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl80MikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzQzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fNDQpOwotCi0gICAgdGVtcC5fMTMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzExKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzE0KTsKLSAgICB0ZW1wLl8yMyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fMjQpOwotICAgIHRlbXAuXzMzID0gKHNyYzEtPl8xMyAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzIzICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzMgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80MyAqIHNyYzItPl8zNCk7Ci0gICAgdGVtcC5fNDMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzQ0KTsKLQotICAgIHRlbXAuXzE0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80NCAqIHNyYzItPl8xNCk7Ci0gICAgdGVtcC5fMjQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzI0KTsKLSAgICB0ZW1wLl8zNCA9IChzcmMxLT5fMTQgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yNCAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzM0ICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDQgKiBzcmMyLT5fMzQpOwotICAgIHRlbXAuXzQ0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80NCAqIHNyYzItPl80NCk7Ci0KLSAgICAvKiBBbmQgY29weSB0aGUgbmV3IG1hdHJpeCBpbiB0aGUgZ29vZCBzdG9yYWdlLi4gKi8KLSAgICBtZW1jcHkoZGVzdCwgJnRlbXAsIDE2ICogc2l6ZW9mKEQzRFZBTFVFKSk7ICAgIAotfQpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kZHJhdy5jIGIvZGxscy9kZHJhdy9kZHJhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjMyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RkcmF3LmMKQEAgLTAsMCArMSwzMDQ2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTctMjAwMCBNYXJjdXMgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAxOTk4LTIwMDAgTGlvbmVsIFVsbWVyCisgKiBDb3B5cmlnaHQgMjAwMC0yMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNiBTdGVmYW4gRPZzaW5nZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAid2luZS9wb3J0LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDT0JKTUFDUk9TCisjZGVmaW5lIE5PTkFNRUxFU1NVTklPTgorCisjaW5jbHVkZSAid2luZGVmLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2luZ2RpLmgiCisjaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJleGNwdC5oIgorCisjaW5jbHVkZSAiZGRyYXcuaCIKKyNpbmNsdWRlICJkM2QuaCIKKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCisKK1dJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKworc3RhdGljIEJPT0wgSURpcmVjdERyYXdJbXBsX0REU0RfTWF0Y2goY29uc3QgRERTVVJGQUNFREVTQzIqIHJlcXVlc3RlZCwgY29uc3QgRERTVVJGQUNFREVTQzIqIHByb3ZpZGVkKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0ltcGxfQXR0YWNoRDNERGV2aWNlKElEaXJlY3REcmF3SW1wbCAqVGhpcywgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqcHJpbWFyeSk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdJbXBsX0NyZWF0ZU5ld1N1cmZhY2UoSURpcmVjdERyYXdJbXBsICpUaGlzLCBERFNVUkZBQ0VERVNDMiAqcEREU0QsIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKipwcFN1cmYsIFVJTlQgbGV2ZWwpOworCisvKiBEZXZpY2UgaWRlbnRpZmllci4gRG9uJ3QgcmVsYXkgaXQgdG8gV2luZUQzRCAqLworc3RhdGljIGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIgZGV2aWNlaWRlbnRpZmllciA9Cit7CisgICAgImRpc3BsYXkiLAorICAgICJEaXJlY3REcmF3IEhBTCIsCisgICAgeyB7IDB4MDAwMTAwMDEsIDB4MDAwMTAwMDEgfSB9LAorICAgIDAsIDAsIDAsIDAsCisgICAgLyogYTgzNzNjMTAtN2FjNC00ZGViLTg0OWEtMDA5ODQ0ZDA4YjJkICovCisgICAgezB4YTgzNzNjMTAsMHg3YWM0LDB4NGRlYiwgezB4ODQsMHg5YSwweDAwLDB4OTgsMHg0NCwweGQwLDB4OGIsMHgyZH19LAorICAgIDAKK307CisKKy8qIFRoaXMgaXMgZm9yIGNsZWFudXAgaWYgYSBicm9rZW4gYXBwIGRvZXNuJ3QgUmVsZWFzZSBpdHMgb2JqZWN0cyAqLworSURpcmVjdERyYXdJbXBsICpkZHJhd19saXN0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElVbmtvd24gTWV0aG9kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6UXVlcnlJbnRlcmZhY2UKKyAqCisgKiBRdWVyaWVzIGRpZmZlcmVudCBpbnRlcmZhY2VzIG9mIHRoZSBEaXJlY3REcmF3IG9iamVjdC4gSXQgY2FuIHJldHVybgorICogSURpcmVjdERyYXcgaW50ZXJmYWNlcyBpbiB2ZXJzaW9uIDEsIDIsIDQgYW5kIDcsIGFuZCBJRGlyZWN0M0QgaW50ZXJmYWNlcworICogaW4gdmVyc2lvbiAxLCAyLCAzIGFuZCA3LiBBbiBJRGlyZWN0M0REZXZpY2UgY2FuIGJlIGNyZWF0ZWQgd2l0aCB0aGlzCisgKiBtZXRob2QuCisgKiBUaGUgcmV0dXJuZWQgaW50ZXJmYWNlIGlzIEFkZFJlZigpIGJlZm9yZSBpdCdzIHJldHVybmVkCisgKgorICogUnVsZXMgZm9yIFF1ZXJ5SW50ZXJmYWNlOgorICogIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD8gXAorICogICAgdXJsPS9saWJyYXJ5L2VuLXVzL2NvbS9odG1sLzZkYjE3ZWQ4LTA2ZTQtNGJhZS1iYzI2LTExMzE3NmNjN2UwZS5hc3AKKyAqCisgKiBVc2VkIGZvciB2ZXJzaW9uIDEsIDIsIDQgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgcmVmaWlkOiBJbnRlcmZhY2UgSUQgYXNrZWQgZm9yCisgKiAgb2JqOiBVc2VkIHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKKyAqCisgKiBSZXR1cm5zOgorICogIFNfT0sgaWYgYW4gaW50ZXJmYWNlIHdhcyBmb3VuZAorICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdERyYXc3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIG9iaik7CisKKyAgICAvKiBBY2NvcmRpbmcgdG8gQ09NIGRvY3MsIGlmIHRoZSBRdWVyeUludGVyZmFjZSBmYWlscywgb2JqIHNob3VsZCBiZSBzZXQgdG8gTlVMTCAqLworICAgICpvYmogPSBOVUxMOworCisgICAgaWYoIXJlZmlpZCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAvKiBDaGVjayBEaXJlY3REcmF3IEludGVyZmFjZXMgKi8KKyAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByZWZpaWQgKSB8fAorICAgICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc3LCByZWZpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3REcmF3NyBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOworICAgIH0KKyAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc0LCByZWZpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc0KTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3REcmF3NCBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOworICAgIH0KKyAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcyLCByZWZpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXcyKTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3REcmF3MiBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOworICAgIH0KKyAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcsIHJlZmlpZCApICkKKyAgICB7CisgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdyk7CisgICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0RHJhdyBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOworICAgIH0KKworICAgIC8qIERpcmVjdDNEICovCisgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRCAgLCByZWZpaWQgKSB8fAorICAgICAgICAgICAgICBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QyICwgcmVmaWlkICkgfHwKKyAgICAgICAgICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEMyAsIHJlZmlpZCApIHx8CisgICAgICAgICAgICAgIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRDcgLCByZWZpaWQgKSApCisgICAgeworICAgICAgICAvKiBDaGVjayB0aGUgc3VyZmFjZSBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICBpZihUaGlzLT5JbXBsVHlwZSA9PSBTVVJGQUNFX1VOS05PV04pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFwcHMgbWF5IGNyZWF0ZSB0aGUgSURpcmVjdDNEIEludGVyZmFjZSBiZWZvcmUgdGhlIHByaW1hcnkgc3VyZmFjZS4KKyAgICAgICAgICAgICAqIHNldCB0aGUgc3VyZmFjZSBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICAgICAgVGhpcy0+SW1wbFR5cGUgPSBTVVJGQUNFX09QRU5HTDsKKyAgICAgICAgICAgIFRSQUNFKCIoJXApIENob29zaW5nIE9wZW5HTCBzdXJmYWNlcyBiZWNhdXNlIGEgRGlyZWN0M0QgaW50ZXJmYWNlIHdhcyByZXF1ZXN0ZWRcbiIsIFRoaXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoVGhpcy0+SW1wbFR5cGUgIT0gU1VSRkFDRV9PUEVOR0wgJiYgRGVmYXVsdFN1cmZhY2VUeXBlID09IFNVUkZBQ0VfVU5LTk9XTikKKyAgICAgICAgeworICAgICAgICAgICAgRVJSKCIoJXApIFRoZSBBcHAgaXMgcmVxdWVzdGluZyBhIEQzRCBkZXZpY2UsIGJ1dCBhIG5vbi1PcGVuR0wgc3VyZmFjZSB0eXBlIHdhcyBjaG9vc2VuLiBQcmVwYXJlIGZvciB0cm91YmxlIVxuIiwgVGhpcyk7CisgICAgICAgICAgICBFUlIoIiAoJXApIFlvdSBtYXkgd2FudCB0byBjb250YWN0IHdpbmUtZGV2ZWwgZm9yIGhlbHBcbiIsIFRoaXMpOworICAgICAgICAgICAgLyogU2hvdWxkIEkgYXNzZXJ0KDApIGhlcmU/Pz8gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKFRoaXMtPkltcGxUeXBlICE9IFNVUkZBQ0VfT1BFTkdMKQorICAgICAgICB7CisgICAgICAgICAgICBXQVJOKCJUaGUgYXBwIHJlcXVlc3RzIGEgRGlyZWN0M0QgaW50ZXJmYWNlLCBidXQgbm9uLW9wZW5nbCBzdXJmYWNlcyB3aGVyZSBzZXQgaW4gd2luZWNmZ1xuIik7CisgICAgICAgICAgICAvKiBEbyBub3QgYWJvcnQgaGVyZSwgb25seSByZWplY3QgM0QgRGV2aWNlIGNyZWF0aW9uICovCisgICAgICAgIH0KKworICAgICAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRCAgLCByZWZpaWQgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QpOworICAgICAgICAgICAgVFJBQ0UoIiByZXR1cm5pbmcgRGlyZWN0M0QgaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRDIgICwgcmVmaWlkICkgKQorICAgICAgICB7CisgICAgICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMik7CisgICAgICAgICAgICBUUkFDRSgiIHJldHVybmluZyBEaXJlY3QzRDIgaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRDMgICwgcmVmaWlkICkgKQorICAgICAgICB7CisgICAgICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyk7CisgICAgICAgICAgICBUUkFDRSgiIHJldHVybmluZyBEaXJlY3QzRDMgaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0Q3ICAsIHJlZmlpZCApKQorICAgICAgICB7CisgICAgICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNENyk7CisgICAgICAgICAgICBUUkFDRSgiIHJldHVybmluZyBEaXJlY3QzRDcgaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVbmtub3duIGludGVyZmFjZSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVSUigiKCVwKS0+KCVzLCAlcCk6IE5vIGludGVyZmFjZSBmb3VuZCIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgb2JqKTsKKyAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisgICAgfQorCisgICAgSVVua25vd25fQWRkUmVmKCAoSVVua25vd24gKikgKm9iaiApOworICAgIHJldHVybiBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6QWRkUmVmCisgKgorICogSW5jcmVzZXMgdGhlIGludGVyZmFjZXMgcmVmY291bnQuIFVzZWQgZm9yIHZlcnNpb24gMSwgMiwgNCBhbmQgNworICoKKyAqIFJldHVybnM6IFRoZSBuZXcgcmVmY291bnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9BZGRSZWYoSURpcmVjdERyYXc3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOworCisgICAgVFJBQ0UoIiglcCkgOiBpbmNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCByZWYgLTEpOworCisgICAgcmV0dXJuIHJlZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0ltcGxfRGVzdHJveQorICoKKyAqIERlc3Ryb3lzIGEgZGRyYXcgb2JqZWN0LiBUaGlzIGlzIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiBub3JtYWwgUmVsZWFzZQorICogYW5kIHRoZSBkbGwgdW5sb2FkIGNsZWFudXAgY29kZQorICoKKyAqIFBhcmFtczoKKyAqICBUaGlzOiBEaXJlY3REcmF3IG9iamVjdCB0byBkZXN0cm95CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorSURpcmVjdERyYXdJbXBsX0Rlc3Ryb3koSURpcmVjdERyYXdJbXBsICpUaGlzKQoreworICAgICAgICBJRGlyZWN0RHJhd0ltcGwgKnByZXY7CisKKyAgICAgICAgVFJBQ0UoIiglcClcbiIsIFRoaXMpOworCisgICAgICAgIC8qIERlc3Ryb3kgdGhlIGRldmljZSB3aW5kb3cgaWYgd2UgY3JlYXRlZCBvbmUgKi8KKyAgICAgICAgaWYoVGhpcy0+ZGV2aWNld2luZG93ICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFKCIgKCVwKSBEZXN0cm95aW5nIHRoZSBkZXZpY2Ugd2luZG93ICVwXG4iLCBUaGlzLCBUaGlzLT5kZXZpY2V3aW5kb3cpOworICAgICAgICAgICAgRGVzdHJveVdpbmRvdyhUaGlzLT5kZXZpY2V3aW5kb3cpOworICAgICAgICAgICAgVGhpcy0+ZGV2aWNld2luZG93ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVucmVnaXN0ZXIgdGhlIHdpbmRvdyBjbGFzcyAqLworICAgICAgICBVbnJlZ2lzdGVyQ2xhc3NBKFRoaXMtPmNsYXNzbmFtZSwgMCk7CisKKyAgICAgICAgLyogVW5jaGFpbiBpdCBmcm9tIHRoZSBkZHJhdyBsaXN0ICovCisgICAgICAgIGlmKGRkcmF3X2xpc3QgPT0gVGhpcykKKyAgICAgICAgeworICAgICAgICAgICAgZGRyYXdfbGlzdCA9IFRoaXMtPm5leHQ7CisgICAgICAgICAgICAvKiBObyBuZWVkIHRvIHNlYXJjaCBmb3IgYSBwcmVkZWNlc3NvciBoZXJlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IocHJldiA9IGRkcmF3X2xpc3Q7IHByZXY7IHByZXYgPSBwcmV2LT5uZXh0KQorICAgICAgICAgICAgICAgIGlmKHByZXYtPm5leHQgPT0gVGhpcykgYnJlYWs7CisKKyAgICAgICAgICAgIGlmKHByZXYpCisgICAgICAgICAgICAgICAgcHJldi0+bmV4dCA9IFRoaXMtPm5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgRVJSKCJEaWRuJ3QgZmluZCB0aGUgcHJldmlvdXMgZGRyYXcgZWxlbWVudCBpbiB0aGUgbGlzdFxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWxlYXNlIHRoZSBhdHRhY2hlZCBXaW5lRDNEIHN0dWZmICovCisgICAgICAgIElXaW5lRDNERGV2aWNlX1JlbGVhc2UoVGhpcy0+d2luZUQzRERldmljZSk7CisgICAgICAgIElXaW5lRDNEX1JlbGVhc2UoVGhpcy0+d2luZUQzRCk7CisKKyAgICAgICAgLyogTm93IGZyZWUgdGhlIG9iamVjdCAqLworICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3OjpSZWxlYXNlCisgKgorICogRGVjcmVzZXMgdGhlIHJlZmNvdW50LiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQKKyAqCisgKiBSZXR1cm5zOiBUaGUgbmV3IHJlZmNvdW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfUmVsZWFzZShJRGlyZWN0RHJhdzcgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CisKKyAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmICsxKTsKKworICAgIGlmIChyZWYgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIE5vIG5lZWQgdG8gcmVzdG9yZSB0aGUgZGlzcGxheSBtb2RlIC0gaXQncyBkb25lIGJ5IFNldENvb3BlcmF0aXZlTGV2ZWwgKi8KKworICAgICAgICBJRGlyZWN0RHJhdzdfU2V0Q29vcGVyYXRpdmVMZXZlbChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDTF9OT1JNQUwpOworCisgICAgICAgIC8qIFRoaXMgaXMgZm9yIHRoZSBkbGwgY2xlYW51cCBjb2RlIGluIERsbE1haW4oKSAqLworICAgICAgICBpZighVGhpcy0+RG9Ob3REZXN0cm95KQorICAgICAgICAgICAgSURpcmVjdERyYXdJbXBsX0Rlc3Ryb3koVGhpcyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdyBtZXRob2RzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdJbXBsX1NldHVwRXhjbHVzaXZlV2luZG93CisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgbW9kaWZpZXMgYSBIV05EJ3MgU3R5bGUgYW5kIEV4U3R5bGUgZm9yIHByb3BlcgorICogZnVsbHNjcmVlbiB1c2UuCisgKgorICogUGFyYW1zOgorICogIFRoaXM6IFBvaW50ZXIgdG8gdGhlIERpcmVjdERyYXcgaW1wbGVtZW50YXRpb24KKyAqICBIV05EOiBXaW5kb3cgdG8gc2V0dXAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorSURpcmVjdERyYXdJbXBsX1NldHVwRnVsbHNjcmVlbldpbmRvdyhJRGlyZWN0RHJhd0ltcGwgKlRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQgd2luZG93KQoreworICAgIExPTkcgc3R5bGUsIGV4U3R5bGU7CisgICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgYW4gb3JpZ2luYWwgc3R5bGUgaXMgc3RvcmVkLgorICAgICAqIFRoYXQgc2hvdWxkbid0IGhhcHBlbgorICAgICAqLworICAgIFRSQUNFKCIoJXApOiBTZXR0aW5nIHVwIHdpbmRvdyAlcCBmb3IgZXhjbHVzaXZlIG1vZGVcbiIsIFRoaXMsIHdpbmRvdyk7CisgICAgaWYoIChUaGlzLT5zdHlsZSAhPSAwKSAmJiAoVGhpcy0+ZXhTdHlsZSAhPSAwKSApCisgICAgeworICAgICAgICBFUlIoIiglcCkgV2FudCB0byBjaGFuZ2UgdGhlIHdpbmRvdyBwYXJhbWV0ZXJzIG9mIEhXTkQgJXAsIGJ1dCBcCisgICAgICAgICAgICAgYW5vdGhlciBzdHlsZSBpcyBzdG9yZWQgZm9yIHJlc3RhdXJhdGlvbiBhZnRlcndhcmRzXG4iLCBUaGlzLCB3aW5kb3cpOworICAgIH0KKworICAgIC8qIEdldCB0aGUgcGFyYW1ldGVycyBhbmQgc2F2ZSB0aGVtICovCisgICAgc3R5bGUgPSBHZXRXaW5kb3dMb25nVyh3aW5kb3csIEdXTF9TVFlMRSk7CisgICAgZXhTdHlsZSA9IEdldFdpbmRvd0xvbmdXKHdpbmRvdywgR1dMX0VYU1RZTEUpOworICAgIFRoaXMtPnN0eWxlID0gc3R5bGU7CisgICAgVGhpcy0+ZXhTdHlsZSA9IGV4U3R5bGU7CisKKyAgICAvKiBGaWx0ZXIgb3V0IHdpbmRvdyBkZWNvcmF0aW9ucyAqLworICAgIHN0eWxlICY9IH5XU19DQVBUSU9OOworICAgIHN0eWxlICY9IH5XU19USElDS0ZSQU1FOworICAgIGV4U3R5bGUgJj0gfldTX0VYX1dJTkRPV0VER0U7CisgICAgZXhTdHlsZSAmPSB+V1NfRVhfQ0xJRU5URURHRTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgd2luZG93IGlzIG1hbmFnZWQsIG90aGVyd2lzZSB3ZSB3b24ndCBnZXQga2V5Ym9hcmQgaW5wdXQgKi8KKyAgICBzdHlsZSB8PSBXU19QT1BVUCB8IFdTX1NZU01FTlU7CisKKyAgICBUUkFDRSgiT2xkIHN0eWxlIHdhcyAlMDhseCwlMDhseCwgc2V0dGluZyB0byAlMDhseCwlMDhseFxuIiwKKyAgICAgICAgICBUaGlzLT5zdHlsZSwgVGhpcy0+ZXhTdHlsZSwgc3R5bGUsIGV4U3R5bGUpOworCisgICAgU2V0V2luZG93TG9uZ1cod2luZG93LCBHV0xfU1RZTEUsIHN0eWxlKTsKKyAgICBTZXRXaW5kb3dMb25nVyh3aW5kb3csIEdXTF9FWFNUWUxFLCBleFN0eWxlKTsKKworICAgIC8qIEluZm9ybSB0aGUgd2luZG93IGFib3V0IHRoZSB1cGRhdGUuCisgICAgICogVE9ETzogU2hvdWxkIEkgbW92ZSBpdCB0byAwLzAgdG9vPworICAgICAqLworICAgIFNldFdpbmRvd1Bvcyh3aW5kb3csIDAgLyogSW5zZXJ0QWZ0ZXIsIGlnbm9yZWQgKi8sCisgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIC8qIFBvcywgU2l6ZSwgaWdvcmVkICovCisgICAgICAgICAgICAgICAgIFNXUF9GUkFNRUNIQU5HRUQgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdJbXBsX1Jlc3RvcmVXaW5kb3cKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXN0b3JlcyBhIHdpbmRvd3MnIHByb3BlcnRpZXMgd2hlbiB0YWtpbmcgaXQgb3V0CisgKiBvZiBmdWxsc2NyZWVuIG1vZGUKKyAqCisgKiBQYXJhbXM6CisgKiAgVGhpczogUG9pbnRlciB0byB0aGUgRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbgorICogIEhXTkQ6IFdpbmRvdyB0byBzZXR1cAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitJRGlyZWN0RHJhd0ltcGxfUmVzdG9yZVdpbmRvdyhJRGlyZWN0RHJhd0ltcGwgKlRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EIHdpbmRvdykKK3sKKyAgICBpZiggKFRoaXMtPnN0eWxlID09IDApICYmIChUaGlzLT5leFN0eWxlID09IDApICkKKyAgICB7CisgICAgICAgIC8qIFRoaXMgY291bGQgYmUgYSBERFNDTF9OT1JNQUwgLT4gRERTQ0xfTk9STUFMCisgICAgICAgICAqIHN3aXRjaCwgZG8gbm90aGluZworICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUUkFDRSgiKCVwKTogUmVzdG9yaW5nIHdpbmRvdyBzZXR0aW5ncyBvZiB3aW5kb3cgJXAgdG8gJTA4bHgsICUwOGx4XG4iLAorICAgICAgICAgIFRoaXMsIHdpbmRvdywgVGhpcy0+c3R5bGUsIFRoaXMtPmV4U3R5bGUpOworCisgICAgU2V0V2luZG93TG9uZ1cod2luZG93LCBHV0xfU1RZTEUsIFRoaXMtPnN0eWxlKTsKKyAgICBTZXRXaW5kb3dMb25nVyh3aW5kb3csIEdXTF9FWFNUWUxFLCBUaGlzLT5leFN0eWxlKTsKKworICAgIC8qIERlbGV0ZSB0aGUgb2xkIHZhbHVlcyAqLworICAgIFRoaXMtPnN0eWxlID0gMDsKKyAgICBUaGlzLT5leFN0eWxlID0gMDsKKworICAgIC8qIEluZm9ybSB0aGUgd2luZG93IGFib3V0IHRoZSB1cGRhdGUgKi8KKyAgICBTZXRXaW5kb3dQb3Mod2luZG93LCAwIC8qIEluc2VydEFmdGVyLCBpZ25vcmVkICovLAorICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAvKiBQb3MsIFNpemUsIGlnb3JlZCAqLworICAgICAgICAgICAgICAgICBTV1BfRlJBTUVDSEFOR0VEIHwgU1dQX05PTU9WRSB8IFNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6U2V0Q29vcGVyYXRpdmVMZXZlbAorICoKKyAqIFNldHMgdGhlIGNvb2VyYXRpdmUgbGV2ZWwgZm9yIHRoZSBEaXJlY3REcmF3IG9iamVjdCwgYW5kIHRoZSB3aW5kb3cKKyAqIGFzc2lnbmVkIHRvIGl0LiBUaGUgY29vcGVyYXRpdmUgbGV2ZWwgZGV0ZXJtaW5lcyB0aGUgZ2VuZXJhbCBiZWhhdmlvcgorICogb2YgdGhlIERpcmVjdERyYXcgYXBwbGljYXRpb24KKyAqCisgKiBXYXJuaW5nOiBUaGlzIGlzIHF1aXRlIHRyaWNreSwgYXMgaXQncyBub3QgcmVhbGx5IGRvY3VtZW50ZWQgd2hpY2gKKyAqIGNvb3BlcmF0aXZlIGxldmVscyBjYW4gYmUgY29tYmluZWQgd2l0aCBlYWNoIG90aGVyLiBJZiBhIGdhbWUgZmFpbHMKKyAqIGFmdGVyIHRoaXMgZnVuY3Rpb24sIHRyeSB0byBjaGVjayB0aGUgY29vcGVyYXRpdmUgbGV2ZWxzIHBhc3NlZCBvbgorICogV2luZG93cywgYW5kIGlmIGl0IHJldHVybnMgc29tZXRoaW5nIGRpZmZlcmVudC4KKyAqCisgKiBJZiB5b3UgdGhpbmsgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhdXNlZCB0aGUgZmFpbHVyZSBiZWNhdXNlIGl0IHdyaXRlcyBhCisgKiBmaXhtZSwgYmUgc3VyZSB0byBydW4gYWdhaW4gd2l0aCBhICtkZHJhdyB0cmFjZS4KKyAqCisgKiBXaGF0IGlzIGtub3duIGFib3V0IGNvb3BlcmF0aXZlIGxldmVscyhTZWUgdGhlIGRkcmF3IG1vZGVzIHRlc3QpOgorICogRERTQ0xfRVhDTFVTSVZFIGFuZCBERFNDTF9GVUxMU0NSRUVOIG11c3QgYmUgdXNlZCB3aXRoIGVhY2ggb3RoZXIKKyAqIEREU0NMX05PUk1BTCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEREU0NMX0VYQ0xVU0lWRSBvciBERFNDTF9GVUxMU0NSRUVOCisgKiBERFNDTF9TRVRGT0NVU1dJTkRPVyBjYW4gYmUgcGFzc2VkIG9ubHkgaW4gRERTQ0xfTk9STUFMIG1vZGUsIGJ1dCBhZnRlciB0aGF0CisgKiBERFNDTF9GVUxMU0NSRUVOIGNhbiBiZSBhY3RpdmF0ZWQKKyAqIEREU0NMX1NFVEZPQ1VTV0lORE9XIG1heSBvbmx5IGJlIHVzZWQgd2l0aCBERFNDTF9OT1dJTkRPV0NIQU5HRVMKKyAqCisgKiBIYW5kbGVkIGZsYWdzOiBERFNDTF9OT1JNQUwsIEREU0NMX0ZVTExTQ1JFRU4sIEREU0NMX0VYQ0xVU0lWRSwKKyAqICAgICAgICAgICAgICAgIEREU0NMX1NFVEZPQ1VTV0lORE9XKHBhcnRpYWxseSkKKyAqCisgKiBVbmhhbmRsZWQgZmxhZ3MsIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZAorICogIEREU0NMX1NFVERFVklDRVdJTkRPVzogU2V0cyBhIHdpbmRvdyBzcGVjaWFsbHkgdXNlZCBmb3IgcmVuZGVyaW5nKEkgZG9uJ3QKKyAqICBleHBlY3QgYW55IGRpZmZlcmVuY2UgdG8gYSBub3JtYWwgd2luZG93IGZvciB3aW5lKQorICogIEREU0NMX0NSRUFURURFVklDRVdJTkRPVzogVGVsbHMgZGRyYXcgdG8gY3JlYXRlIGl0J3Mgb3duIHdpbmRvdyBmb3IKKyAqICByZW5kZXJpbmcoUG9zc2libGUgdGVzdCBjYXNlOiBIYWxmLWxpZmUpCisgKgorICogVW5zdXJlIGFib3V0IHRoZXNlOiBERFNDTF9GUFVTRVRVUCBERFNDTF9GUFVSRVNFUlZFCisgKgorICogVGhlc2Ugc2VlbSBub3QgcmVhbGx5IGltcG9yYW50IGZvciB3aW5lCisgKiAgRERTQ0xfQUxMT1dSRUJPT1QsIEREU0NMX05PV0lORE9XQ0hBTkdFUywgRERTQ0xfQUxMT1dNT0RFWCwKKyAqICBERFNDTF9NVUxUSVRIUkVERUQKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIGlmIHRoZSBjb29wZXJhdGl2ZSBsZXZlbCB3YXMgc2V0IHN1Y2Nlc3NmdWxseQorICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgdGhlIHBhc3NlZCBjb29wZXJhdGl2ZSBsZXZlbCBjb21iaW5hdGlvbiBpcyBpbnZhbGlkCisgKiAgRERFUlJfSFdOREFMTFJFQURZU0VUIGlmIEREU0NMX1NFVEZPQ1VTV0lORE9XIGlzIHBhc3NlZCBpbiBleGNsdXNpdmUgbW9kZQorICogICAoUHJvcGFibHkgb3RoZXJzIHRvbywgaGF2ZSB0byBpbnZlc3RpZ2F0ZSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9TZXRDb29wZXJhdGl2ZUxldmVsKElEaXJlY3REcmF3NyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EIGh3bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjb29wbGV2ZWwpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKyAgICBIV05EIHdpbmRvdzsKKyAgICBIUkVTVUxUIGhyOworCisgICAgRklYTUUoIiglcCktPiglcCwlMDhseClcbiIsVGhpcyxod25kLGNvb3BsZXZlbCk7CisgICAgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKGNvb3BsZXZlbCk7CisKKyAgICAvKiBHZXQgdGhlIG9sZCB3aW5kb3cgKi8KKyAgICBociA9IElXaW5lRDNERGV2aWNlX0dldEhXTkQoVGhpcy0+d2luZUQzRERldmljZSwgJndpbmRvdyk7CisgICAgaWYoaHIgIT0gRDNEX09LKQorICAgIHsKKyAgICAgICAgRVJSKCJJV2luZUQzRERldmljZTo6R2V0SFdORCBmYWlsZWQsIGhyID0gJTA4bHhcbiIsIGhyKTsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKworICAgIC8qIFRlc3RzIHN1Z2dlc3QgdGhhdCB3ZSBuZWVkIG9uZSBvZiB0aGVtOiAqLworICAgIGlmKCEoY29vcGxldmVsICYgKEREU0NMX1NFVEZPQ1VTV0lORE9XIHwKKyAgICAgICAgICAgICAgICAgICAgICBERFNDTF9OT1JNQUwgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgRERTQ0xfRVhDTFVTSVZFICAgICAgKSkpCisgICAgeworICAgICAgICBUUkFDRSgiSW5jb3JyZWN0IGNvb3BsZXZlbCBmbGFncywgcmV0dXJuaW5nIERERVJSX0lOVkFMSURQQVJBTVNcbiIpOworICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgdGhvc2UgbGV2ZWxzIGZpcnN0IHdoaWNoIHNldCB2YXJpb3MgaHduZHMgKi8KKyAgICBpZihjb29wbGV2ZWwgJiBERFNDTF9TRVRGT0NVU1dJTkRPVykKKyAgICB7CisgICAgICAgIC8qIFRoaXMgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIGEgbG90IG9mIGZsYWdzICovCisgICAgICAgIGlmKGNvb3BsZXZlbCAmICggRERTQ0xfTVVMVElUSFJFQURFRCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERFNDTF9GUFVTRVRVUCAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NMX0ZQVVBSRVNFUlZFICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0xfQUxMT1dSRUJPT1QgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERFNDTF9BTExPV01PREVYICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NMX1NFVERFVklDRVdJTkRPVyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0xfTk9STUFMICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERFNDTF9FWENMVVNJVkUgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NMX0ZVTExTQ1JFRU4gICAgICApICkKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoIkNhbGxlZCB3aXRoIGluY29tcGF0aWJsZSBmbGFncywgcmV0dXJuaW5nIERERVJSX0lOVkFMSURQQVJBTVNcbiIpOworICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggKFRoaXMtPmNvb3BlcmF0aXZlX2xldmVsICYgRERTQ0xfRlVMTFNDUkVFTikgJiYgd2luZG93KQorICAgICAgICB7CisgICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBERFNDTF9TRVRGT0NVU1dJTkRPVyB3aXRoIGFuIGFscmVhZHkgc2V0IHdpbmRvdywgcmV0dXJuaW5nIERERVJSX0hXTkRBTFJFQURZU0VUXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBEREVSUl9IV05EQUxSRUFEWVNFVDsKKyAgICAgICAgfQorCisgICAgICAgIFRoaXMtPmZvY3Vzd2luZG93ID0gaHduZDsKKyAgICAgICAgLyogV29uJ3QgdXNlIHRoZSBod25kIHBhcmFtIGZvciBhbnl0aGluZyBlbHNlICovCisgICAgICAgIGh3bmQgPSBOVUxMOworCisgICAgICAgIC8qIFVzZSB0aGUgZm9jdXMgd2luZG93IGZvciBkcmF3aW5nIHRvbyAqLworICAgICAgICBJV2luZUQzRERldmljZV9TZXRIV05EKFRoaXMtPndpbmVEM0REZXZpY2UsIFRoaXMtPmZvY3Vzd2luZG93KTsKKworICAgICAgICAvKiBEZXN0cm95IHRoZSBkZXZpY2Ugd2luZG93LCBpZiB3ZSBoYXZlIG9uZSAqLworICAgICAgICBpZihUaGlzLT5kZXZpY2V3aW5kb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlc3Ryb3lXaW5kb3coVGhpcy0+ZGV2aWNld2luZG93KTsKKyAgICAgICAgICAgIFRoaXMtPmRldmljZXdpbmRvdyA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogRERTQ0xfTk9STUFMIG9yIEREU0NMX0ZVTExTQ1JFRU4gfCBERFNDTF9FWENMVVNJVkUgKi8KKyAgICBpZihjb29wbGV2ZWwgJiBERFNDTF9OT1JNQUwpCisgICAgeworICAgICAgICAvKiBDYW4ndCBjb2V4aXN0IHdpdGggZnVsbHNjcmVlbiBvciBleGNsdXNpdmUgKi8KKyAgICAgICAgaWYoY29vcGxldmVsICYgKEREU0NMX0ZVTExTQ1JFRU4gfCBERFNDTF9FWENMVVNJVkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoIiglcCkgRERTQ0xfTk9STUFMIGlzIG5vdCBjb21wYXRpdmUgd2l0aCBERFNDTF9GVUxMU0NSRUVOIG9yIEREU0NMX0VYQ0xVU0lWRVxuIiwgVGhpcyk7CisgICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFN3aXRjaGluZyBmcm9tIGZ1bGxzY3JlZW4/ICovCisgICAgICAgIGlmKFRoaXMtPmNvb3BlcmF0aXZlX2xldmVsICYgRERTQ0xfRlVMTFNDUkVFTikKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVzdG9yZSB0aGUgZGlzcGxheSBtb2RlICovCisgICAgICAgICAgICBJRGlyZWN0RHJhdzdfUmVzdG9yZURpc3BsYXlNb2RlKGlmYWNlKTsKKworICAgICAgICAgICAgaWYod2luZG93KQorICAgICAgICAgICAgICAgIElEaXJlY3REcmF3SW1wbF9SZXN0b3JlV2luZG93KFRoaXMsIHdpbmRvdyk7CisKKyAgICAgICAgICAgIFRoaXMtPmNvb3BlcmF0aXZlX2xldmVsICY9IH5ERFNDTF9GVUxMU0NSRUVOOworICAgICAgICAgICAgVGhpcy0+Y29vcGVyYXRpdmVfbGV2ZWwgJj0gfkREU0NMX0VYQ0xVU0lWRTsKKyAgICAgICAgICAgIFRoaXMtPmNvb3BlcmF0aXZlX2xldmVsICY9IH5ERFNDTF9BTExPV01PREVYOworICAgICAgICB9CisKKyAgICAgICAgLyogRG9uJ3Qgb3ZlcnJpZGUgZm9jdXMgd2luZG93cyBvciBwcml2YXRlIGRldmljZSB3aW5kb3dzICovCisgICAgICAgIGlmKCBod25kICYmCisgICAgICAgICAgICAhKFRoaXMtPmZvY3Vzd2luZG93KSAmJgorICAgICAgICAgICAgIShUaGlzLT5kZXZpY2V3aW5kb3cpICYmCisgICAgICAgICAgICAoaHduZCAhPSB3aW5kb3cpICkKKyAgICAgICAgeworICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0SFdORChUaGlzLT53aW5lRDNERGV2aWNlLCBod25kKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKGNvb3BsZXZlbCAmIEREU0NMX0ZVTExTQ1JFRU4pCisgICAgeworICAgICAgICAvKiBOZWVkcyBERFNDTF9FWENMVVNJVkUgKi8KKyAgICAgICAgaWYoIShjb29wbGV2ZWwgJiBERFNDTF9FWENMVVNJVkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoIiglcCkgRERTQ0xfRlVMTFNDUkVFTiBuZWVkcyBERFNDTF9FWENMVVNJVkVcbiIsIFRoaXMpOworICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgICAgIH0KKyAgICAgICAgLyogTmVlZCBhIEhXTkQKKyAgICAgICAgaWYoaHduZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBUUkFDRSgiKCVwKSBERFNDTF9GVUxMU0NSRUVOIG5lZWRzIGEgSFdORFxuIiwgVGhpcyk7CisgICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIC8qIFN3aXRjaCBmcm9tIG5vcm1hbCB0byBmdWxsIHNjcmVlbiBtb2RlPyAqLworICAgICAgICBpZihUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX05PUk1BTCkKKyAgICAgICAgeworICAgICAgICAgICAgVGhpcy0+Y29vcGVyYXRpdmVfbGV2ZWwgJj0gfkREU0NMX05PUk1BTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERvbid0IG92ZXJyaWRlIGZvY3VzIHdpbmRvd3Mgb3IgcHJpdmF0ZSBkZXZpY2Ugd2luZG93cyAqLworICAgICAgICBpZiggaHduZCAmJgorICAgICAgICAgICAgIShUaGlzLT5mb2N1c3dpbmRvdykgJiYKKyAgICAgICAgICAgICEoVGhpcy0+ZGV2aWNld2luZG93KSAmJgorICAgICAgICAgICAgKGh3bmQgIT0gd2luZG93KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9uIGEgd2luZG93IGNoYW5nZSwgcmVzdG9yZSB0aGUgb2xkIHdpbmRvdyBhbmQgc2V0IHRoZSBuZXcgb25lICovCisgICAgICAgICAgICBpZih3aW5kb3cgIT0gaHduZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih3aW5kb3cpCisgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3SW1wbF9SZXN0b3JlV2luZG93KFRoaXMsIHdpbmRvdyk7CisgICAgICAgICAgICAgICAgSURpcmVjdERyYXdJbXBsX1NldHVwRnVsbHNjcmVlbldpbmRvdyhUaGlzLCBod25kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldEhXTkQoVGhpcy0+d2luZUQzRERldmljZSwgaHduZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihjb29wbGV2ZWwgJiBERFNDTF9FWENMVVNJVkUpCisgICAgeworICAgICAgICBUUkFDRSgiKCVwKSBERFNDTF9FWENMVVNJVkUgbmVlZHMgRERTQ0xfRlVMTFNDUkVFTlxuIiwgVGhpcyk7CisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIGlmKGNvb3BsZXZlbCAmIEREU0NMX0NSRUFURURFVklDRVdJTkRPVykKKyAgICB7CisgICAgICAgIC8qIERvbid0IGNyZWF0ZSBhIGRldmljZSB3aW5kb3cgaWYgYSBmb2N1cyB3aW5kb3cgaXMgc2V0ICovCisgICAgICAgIGlmKCAhKFRoaXMtPmZvY3Vzd2luZG93KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEhXTkQgZGV2aWNld2luZG93ID0gQ3JlYXRlV2luZG93RXhBKDAsIFRoaXMtPmNsYXNzbmFtZSwgIkREcmF3IGRldmljZSB3aW5kb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfUE9QVVAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgR2V0TW9kdWxlSGFuZGxlQSgwKSwgTlVMTCk7CisKKyAgICAgICAgICAgIFNob3dXaW5kb3coZGV2aWNld2luZG93LCBTV19TSE9XKTsgICAvKiBKdXN0IHRvIGJlIHN1cmUgKi8KKyAgICAgICAgICAgIFRSQUNFKCIoJXApIENyZWF0ZWQgYSBERHJhdyBkZXZpY2Ugd2luZG93LiBIV05EPSVwXG4iLCBUaGlzLCBkZXZpY2V3aW5kb3cpOworCisgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRIV05EKFRoaXMtPndpbmVEM0REZXZpY2UsIGRldmljZXdpbmRvdyk7CisgICAgICAgICAgICBUaGlzLT5kZXZpY2V3aW5kb3cgPSBkZXZpY2V3aW5kb3c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVbmhhbmRsZWQgZmxhZ3MgKi8KKyAgICBpZihjb29wbGV2ZWwgJiBERFNDTF9BTExPV1JFQk9PVCkKKyAgICAgICAgV0FSTigiKCVwKSBVbmhhbmRsZWQgZmxhZyBERFNDTF9BTExPV1JFQk9PVCwgaGFybWxlc3NcbiIsIFRoaXMpOworICAgIGlmKGNvb3BsZXZlbCAmIEREU0NMX0FMTE9XTU9ERVgpCisgICAgICAgIFdBUk4oIiglcCkgVW5oYW5kbGVkIGZsYWcgRERTQ0xfQUxMT1dNT0RFWCwgaGFybWxlc3NcbiIsIFRoaXMpOworICAgIGlmKGNvb3BsZXZlbCAmIEREU0NMX01VTFRJVEhSRUFERUQpCisgICAgICAgIEZJWE1FKCIoJXApIFVuaGFuZGxlZCBmbGFnIEREU0NMX01VTFRJVEhSRUFERUQsIFVoIE9oLi4uXG4iLCBUaGlzKTsKKyAgICBpZihjb29wbGV2ZWwgJiBERFNDTF9GUFVTRVRVUCkKKyAgICAgICAgV0FSTigiKCVwKSBVbmhhbmRsZWQgZmxhZyBERFNDTF9GUFVTRVRVUCwgaGFybWxlc3NcbiIsIFRoaXMpOworICAgIGlmKGNvb3BsZXZlbCAmIEREU0NMX0ZQVVBSRVNFUlZFKQorICAgICAgICBXQVJOKCIoJXApIFVuaGFuZGxlZCBmbGFnIEREU0NMX0ZQVVBSRVNFUlZFLCBoYXJtbGVzc1xuIiwgVGhpcyk7CisKKyAgICAvKiBTdG9yZSB0aGUgY29vcGVyYXRpdmVfbGV2ZWwgKi8KKyAgICBUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCB8PSBjb29wbGV2ZWw7CisgICAgVFJBQ0UoIlNldENvb3BlcmF0aXZlTGV2ZWwgcmV0dW5pbmcgRERfT0tcbiIpOworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OlNldERpc3BsYXlNb2RlCisgKgorICogU2V0cyB0aGUgZGlzcGxheSBzY3JlZW4gcmVzb2x1dGlvbiwgY29sb3IgZGVwdGggYW5kIHJlZnJlc2ggZnJlcXVlbmN5CisgKiB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZShpbiB0aGVvcnkpLgorICogUG9zc2libGUgcmV0dXJuIHZhbHVlcyBsaXN0ZWQgaW4gdGhlIFNESyBzdWdnZXN0IHRoYXQgdGhpcyBtZXRob2QgZmFpbHMKKyAqIHdoZW4gbm90IGluIGZ1bGxzY3JlZW4gbW9kZSwgYnV0IHRoaXMgaXMgd3JvbmcuIFdpbmRvd3MgMjAwMCBoYXBwaWx5IHNldHMKKyAqIHRoZSBkaXNwbGF5IG1vZGUgaW4gRERTQ0xfTk9STUFMIG1vZGUgd2l0aG91dCBhbiBod25kIHNwZWNpZmllZC4KKyAqIEl0IHNlZW1zIHRvIGJlIHZhbGlkIHRvIHBhc3MgMCBmb3IgV2l0aCBhbmQgSGVpZ2h0LCB0aGlzIGhhcyB0byBiZSB0ZXN0ZWQKKyAqIEl0IGNvdWxkIG1lYW4gdGhhdCB0aGUgY3VycmVudCB2aWRlbyBtb2RlIHNob3VsZCBiZSBsZWZ0IGFzLWlzLiAoQnV0IHdoeQorICogY2FsbCBpdCB0aGVuPykKKyAqCisgKiBQYXJhbXM6CisgKiAgSGVpZ2h0LCBXaWR0aDogU2NyZWVuIGRpbWVuc2lvbgorICogIEJQUDogQ29sb3IgZGVwdGggaW4gQml0cyBwZXIgcGl4ZWwKKyAqICBSZWZyZXNocmF0ZTogU2NyZWVuIHJlZnJlc2ggcmF0ZQorICogIEZsYWdzOiBPdGhlciBzdHVmZgorICoKKyAqIFJldHVybnMKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUoSURpcmVjdERyYXc3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFJlZnJlc2hSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgV0lORUQzRERJU1BMQVlNT0RFIE1vZGU7CisgICAgVFJBQ0UoIiglcCktPiglbGQsJWxkLCVsZCwlbGQsJWx4OiBSZWxheSFcbiIsIFRoaXMsIFdpZHRoLCBIZWlnaHQsIEJQUCwgUmVmcmVzaFJhdGUsIEZsYWdzKTsKKworICAgIGlmKCAhV2lkdGggfHwgIUhlaWdodCApCisgICAgeworICAgICAgICBFUlIoIldpZHRoPSVsZCwgSGVpZ2h0PSVsZCwgd2hhdCB0byBkbz9cbiIsIFdpZHRoLCBIZWlnaHQpOworICAgICAgICAvKiBJdCBsb29rcyBsaWtlIE5lZWQgZm9yIHNwZWVkIFBvc2NoZSBVbmxlYXNoZWQgZXhwZWN0cyBERF9PSyBoZXJlICovCisgICAgICAgIHJldHVybiBERF9PSzsKKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGUgZXhjbHVzaXZlIG1vZGUKKyAgICBpZighKFRoaXMtPmNvb3BlcmF0aXZlX2xldmVsICYgRERTQ0xfRVhDTFVTSVZFKSkKKyAgICAgICAgcmV0dXJuIERERVJSX05PRVhDTFVTSVZFTU9ERTsKKyAgICAgKiBUaGlzIGlzIFdST05HLiBEb24ndCBrbm93IGlmIHRoZSBTREsgaXMgY29tcGxldGVseQorICAgICAqIHdyb25nIGFuZCBpZiB0aGVyZSBhcmUgYW55IGNvZGl0aW9ucyB3aGVuIERERVJSX05PRVhDTFVTSVZFCisgICAgICogaXMgcmV0dXJuZWQsIGJ1dCBIYWxmLUxpZmUgMS4xLjEuMShTdGVhbSB2ZXJzaW9uKQorICAgICAqIGRlcGVuZHMgb24gdGhpcworICAgICAqLworCisgICAgTW9kZS5XaWR0aCA9IFdpZHRoOworICAgIE1vZGUuSGVpZ2h0ID0gSGVpZ2h0OworICAgIE1vZGUuUmVmcmVzaFJhdGUgPSBSZWZyZXNoUmF0ZTsKKyAgICBzd2l0Y2goQlBQKQorICAgIHsKKyAgICAgICAgY2FzZSA4OiAgTW9kZS5Gb3JtYXQgPSBXSU5FRDNERk1UX1A4OyAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNTogTW9kZS5Gb3JtYXQgPSBXSU5FRDNERk1UX1gxUjVHNUI1OyBicmVhazsKKyAgICAgICAgY2FzZSAxNjogTW9kZS5Gb3JtYXQgPSBXSU5FRDNERk1UX1I1RzZCNTsgICBicmVhazsKKyAgICAgICAgY2FzZSAyNDogTW9kZS5Gb3JtYXQgPSBXSU5FRDNERk1UX1I4RzhCODsgICBicmVhazsKKyAgICAgICAgY2FzZSAzMjogTW9kZS5Gb3JtYXQgPSBXSU5FRDNERk1UX0E4UjhHOEI4OyBicmVhazsKKyAgICB9CisKKyAgICAvKiBUT0RPOiBUaGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIG1zZG4gc3VnZ2VzdCB0aGF0CisgICAgICogdGhlIHNjcmVlbiBtb2RlIGNhbid0IGJlIGNoYW5nZWQgaWYgYSBzdXJmYWNlIGlzIGxvY2tlZAorICAgICAqIG9yIHNvbWUgZHJhd2luZyBpcyBpbiBwcm9ncmVzcworICAgICAqLworCisgICAgLyogVE9ETzogTG9zZSB0aGUgcHJpbWFyeSBzdXJmYWNlICovCisgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldERpc3BsYXlNb2RlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIEZpcnN0IHN3YXBjaGFpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTW9kZSk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OlJlc3RvcmVEaXNwbGF5TW9kZQorICoKKyAqIFJlc3RvcmVzIHRoZSBkaXNwbGF5IG1vZGUgdG8gd2hhdCBpdCB3YXMgYXQgY3JlYXRpb24gdGltZS4gQmFzaWNhbGx5LgorICoKKyAqIEEgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGVyZSBhcmUgMiBEaXJlY3REcmF3IG9iamVjdHMgdXNpbmcgdGhlIHNhbWUgaHduZDoKKyAqICAtPiBERF8xIGZpbmRzIHRoZSBzY3JlZW4gYXQgMTQwMHgxMDUweDMyIHdoZW4gY3JlYXRlZCwgc2V0cyBpdCB0byA2NDB4NDgweDE2CisgKiAgLT4gRERfMiBpcyBjcmVhdGVkLCBmaW5kcyB0aGUgc2NyZWVuIGF0IDY0MHg0ODB4MTYsIHNldHMgaXQgdG8gMTAyNHg3Njh4MzIKKyAqICAtPiBERF8xIGlzIHJlbGVhc2VkLiBUaGUgc2NyZWVuIHNob3VsZCBiZSBsZWZ0IGF0IDEwMjR4NzY4eDMyLgorICogIC0+IEREXzIgaXMgcmVsZWFzZWQuIFRoZSBzY3JlZW4gc2hvdWxkIGJlIHNldCB0byAxNDAweDEwNTB4MzIKKyAqIFRoaXMgY2FzZSBpcyB1bmhhbmRsZWQgcmlnaHQgbm93LCBidXQgRW1waXJlIEVhcnRoIGRvZXMgaXQgdGhpcyB3YXkuCisgKiAoQnV0IHBlcmhhcHMgdGhlcmUgaXMgc29tZXRoaW5nIGluIFNldENvb3BlcmF0aXZlTGV2ZWwgdG8gcHJldmVudCB0aGlzKQorICoKKyAqIFRoZSBtc2RuIHNheXMgdGhhdCB0aGlzIG1ldGhvZCByZXNldHMgdGhlIGRpc3BsYXkgbW9kZSB0byB3aGF0IGl0IHdhcyBiZWZvcmUKKyAqIFNldERpc3BsYXlNb2RlIHdhcyBjYWxsZWQuIFdoYXQgaWYgU2V0RGlzcGxheU1vZGVzIGlzIGNhbGxlZCAyIHRpbWVzPz8KKyAqCisgKiBSZXR1cm5zCisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX05PRVhDTFVTSVZFIG1vZGUgaWYgdGhlIGRldmljZSBpc24ndCBpbiBmdWxsc2NyZWVuIG1vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9SZXN0b3JlRGlzcGxheU1vZGUoSURpcmVjdERyYXc3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfU2V0RGlzcGxheU1vZGUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPm9yaWdfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5vcmlnX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPm9yaWdfYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6R2V0Q2FwcworICoKKyAqIFJldHVybnMgdGhlIGRyaXZlcyBjYXBhdGlibGl0aWVzCisgKgorICogVXNlZCBmb3IgdmVyc2lvbiAxLCAyLCA0IGFuZCA3CisgKgorICogUGFyYW1zOgorICogIERyaXZlckNhcHM6IFN0cnVjdHVyZSB0byB3cml0ZSB0aGUgSGFyZHdhcmUgYWNjZWxsZXJhdGVkIGNhcHMgdG8KKyAqICBIZWxDYXBzOiBTdHJ1Y3R1cmUgdG8gd3JpdGUgdGhlIGVtdWxhdGlvbiBjYXBzIHRvCisgKgorICogUmV0dXJucworICogIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJuZCBERF9PSyBvbmx5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfR2V0Q2FwcyhJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRERDQVBTICpEcml2ZXJDYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgRERDQVBTICpIRUxDYXBzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIERyaXZlckNhcHMsIEhFTENhcHMpOworCisgICAgLyogT25lIHN0cnVjdHVyZSBtdXN0IGJlICE9IE5VTEwgKi8KKyAgICBpZiggKCFEcml2ZXJDYXBzKSAmJiAoIUhFTENhcHMpICkKKyAgICB7CisgICAgICAgIEVSUigiKCVwKSBJbnZhbGlkIHBhcmFtcyB0byBJRGlyZWN0RHJhd0ltcGxfR2V0Q2Fwc1xuIiwgVGhpcyk7CisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIGlmKERyaXZlckNhcHMpCisgICAgeworICAgICAgICBERF9TVFJVQ1RfQ09QWV9CWVNJWkUoRHJpdmVyQ2FwcywgJlRoaXMtPmNhcHMpOworICAgICAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQorICAgICAgICB7CisgICAgICAgICAgICBUUkFDRSgiRHJpdmVyIENhcHMgOlxuIik7CisgICAgICAgICAgICBERFJBV19kdW1wX0REQ0FQUyhEcml2ZXJDYXBzKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGlmKEhFTENhcHMpCisgICAgeworICAgICAgICBERF9TVFJVQ1RfQ09QWV9CWVNJWkUoSEVMQ2FwcywgJlRoaXMtPmNhcHMpOworICAgICAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQorICAgICAgICB7CisgICAgICAgICAgICBUUkFDRSgiSEVMIENhcHMgOlxuIik7CisgICAgICAgICAgICBERFJBV19kdW1wX0REQ0FQUyhIRUxDYXBzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkNvbXBhY3QKKyAqCisgKiBObyBpZGVhIHdoYXQgaXQgZG9lcywgTVNETiBzYXlzIGl0J3Mgbm90IGltcGxlbWVudGVkLgorICoKKyAqIFJldHVybnMKKyAqICBERF9PSywgYnV0IHRoaXMgaXMgdW5jaGVja2VkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfQ29tcGFjdChJRGlyZWN0RHJhdzcgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcClcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6R2V0RGlzcGxheU1vZGUKKyAqCisgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGRpc3BsYXkgbW9kZQorICoKKyAqIEV4aXN0cyBpbiBWZXJzaW9uIDEsIDIsIDQgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgRERTRDogQWRkcmVzcyBvZiBhIHN1cmZhY2UgZGVzY3JpcHRpb24gc3RydWN0dXJlIHRvIHdyaXRlIHRoZSBpbmZvIHRvCisgKgorICogUmV0dXJucworICogIEREX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfR2V0RGlzcGxheU1vZGUoSURpcmVjdERyYXc3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqRERTRCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIEhSRVNVTFQgaHI7CisgICAgV0lORUQzRERJU1BMQVlNT0RFIE1vZGU7CisgICAgRFdPUkQgU2l6ZTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXlcbiIsIFRoaXMsIEREU0QpOworCisgICAgLyogVGhpcyBzZWVtcyBzYW5lICovCisgICAgaWYoIUREU0QpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgfQorCisgICAgLyogVGhlIG5lY2Vzc2FyeSBtZW1iZXJzIG9mIExQRERTVVJGQUNFREVTQyBhbmQgTFBERFNVUkZBQ0VERVNDMiBhcmUgZXF1YWwsCisgICAgICogc28gb25lIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgYWxsIHZlcnNpb25zIChIb3BlZnVsbHkpCisgICAgICovCisgICAgaHIgPSBJV2luZUQzRERldmljZV9HZXREaXNwbGF5TW9kZShUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHN3YXBjaGFpbiAwICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTW9kZSk7CisgICAgaWYoIGhyICE9IEQzRF9PSyApCisgICAgeworICAgICAgICBFUlIoIiAoJXApIElXaW5lRDNERGV2aWNlOjpHZXREaXNwbGF5TW9kZSByZXR1cm5lZCAlMDhseFxuIiwgVGhpcywgaHIpOworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorCisgICAgU2l6ZSA9IEREU0QtPmR3U2l6ZTsKKyAgICBtZW1zZXQoRERTRCwgMCwgU2l6ZSk7CisKKyAgICBERFNELT5kd1NpemUgPSBTaXplOworICAgIEREU0QtPmR3RmxhZ3MgfD0gRERTRF9IRUlHSFQgfCBERFNEX1dJRFRIIHwgRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfUElUQ0ggfCBERFNEX1JFRlJFU0hSQVRFOworICAgIEREU0QtPmR3V2lkdGggPSBNb2RlLldpZHRoOworICAgIEREU0QtPmR3SGVpZ2h0ID0gTW9kZS5IZWlnaHQ7IAorICAgIEREU0QtPnUyLmR3UmVmcmVzaFJhdGUgPSA2MDsKKyAgICBERFNELT5kZHNDYXBzLmR3Q2FwcyA9IDA7CisgICAgRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihERFNELT51NC5kZHBmUGl4ZWxGb3JtYXQpOworICAgIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKCZERFNELT51NC5kZHBmUGl4ZWxGb3JtYXQsIE1vZGUuRm9ybWF0KTsKKyAgICBERFNELT51MS5sUGl0Y2ggPSBNb2RlLldpZHRoICogRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgLyA4OworCisgICAgaWYoVFJBQ0VfT04oZGRyYXcpKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIlJldHVybmluZyBzdXJmYWNlIGRlc2MgOlxuIik7CisgICAgICAgIEREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKEREU0QpOworICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkdldEZvdXJDQ0NvZGVzCisgKgorICogUmV0dXJucyBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgRm91ckNDIGNvZGVzLgorICoKKyAqIEV4aXN0cyBpbiBWZXJzaW9uIDEsIDIsIDQgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgTnVtQ29kZXM6IENvbnRhaW5zIHRoZSBudW1iZXIgb2YgQ29kZXMgdGhhdCBDb2RlcyBjYW4gY2FycnkuIFJldHVybnMgdGhlIG51bWJlcgorICogICAgICAgICAgICBvZiBlbnVtZXJhdGVkIGNvZGVzCisgKiAgQ29kZXM6IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgRFdPUkRzIHdoZXJlIHRoZSBzdXBwb3J0ZWQgY29kZXMgYXJlIHdyaWl0ZW4KKyAqICAgICAgICAgdG8KKyAqCisgKiBSZXR1cm5zCisgKiAgQWx3YXlzIHJldHVybnMgRERfT0ssIGFzIGl0J3MgYSBzdHViIGZvciBub3cKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9HZXRGb3VyQ0NDb2RlcyhJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpOdW1Db2RlcywgRFdPUkQgKkNvZGVzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglcCwgJXApOiBTdHViIVxuIiwgVGhpcywgTnVtQ29kZXMsIENvZGVzKTsKKworICAgIGlmKE51bUNvZGVzKSAqTnVtQ29kZXMgPSAwOworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6R2V0TW9uaXRvckZyZXF1ZW5jeQorICoKKyAqIFJldHVybnMgdGhlIG1vbml0b3IncyBmcmVxdWVuY3kKKyAqCisgKiBFeGlzdHMgaW4gVmVyc2lvbiAxLCAyLCA0IGFuZCA3CisgKgorICogUGFyYW1zOgorICogIEZyZXE6IFBvaW50ZXIgdG8gYSBEV09SRCB0byB3cml0ZSB0aGUgZnJlcXVlbmN5IHRvCisgKgorICogUmV0dXJucworICogIEFsd2F5cyByZXR1cm5zIEREX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeShJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKkZyZXEpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgRnJlcSk7CisKKyAgICAvKiBJZGVhbGx5IHRoaXMgc2hvdWxkIGJlIGluIFdpbmVEM0QsIGFzIGl0IGNvbmNlcm5lcyB0aGUgc2NyZWVuIHNldHVwLAorICAgICAqIGJ1dCBmb3Igbm93IHRoaXMgc2hvdWxkIG1ha2UgdGhlIGdhbWVzIGhhcHB5CisgICAgICovCisgICAgKkZyZXEgPSA2MDsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3OjpHZXRWZXJ0aWNhbEJsYW5rU3RhdHVzCisgKgorICogUmV0dXJucyB0aGUgVmVydGljYWwgYmxhbmsgc3RhdHVzIG9mIHRoZSBtb25pdG9yLiBUaGlzIHNob3VsZCBiZSBpbiBXaW5lRDNECisgKiB0b28gYmFzaWNhbGx5LCBidXQgYXMgaXQncyBhIHNlbWkgc3R1YiwgSSBkaWRuJ3QgY3JlYXRlIGEgZnVuY3Rpb24gdGhlcmUKKyAqCisgKiBQYXJhbXM6CisgKiAgc3RhdHVzOiBQb2ludGVyIHRvIGEgQk9PTCB0byBiZSBmaWxsZWQgd2l0aCB0aGUgdmVydGljYWwgYmxhbmsgc3RhdHVzCisgKgorICogUmV0dXJucworICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHN0YXR1cyBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfR2V0VmVydGljYWxCbGFua1N0YXR1cyhJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RhdHVzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIHN0YXR1cyk7CisKKyAgICAvKiBUaGlzIGxvb2tzIHNhbmUsIHRoZSBNU0ROIHN1Z2dlc3RzIGl0IHRvbyAqLworICAgIGlmKCFzdGF0dXMpIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgKnN0YXR1cyA9IFRoaXMtPmZha2VfdmJsYW5rOworICAgIFRoaXMtPmZha2VfdmJsYW5rID0gIVRoaXMtPmZha2VfdmJsYW5rOworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkdldEF2YWlsYWJsZVZpZE1lbQorICoKKyAqIFJldHVybnMgdGhlIHRvdGFsIGFuZCBmcmVlIHZpZGVvIG1lbW9yeQorICoKKyAqIFBhcmFtczoKKyAqICBDYXBzOiBTcGVjaWZpZXMgdGhlIG1lbW9yeSB0eXBlIGFza2VkIGZvcgorICogIHRvdGFsOiBQb2ludGVyIHRvIGEgRFdPUkQgdG8gYmUgZmlsbGVkIHdpdGggdGhlIHRvdGFsIG1lbW9yeQorICogIGZyZWU6IFBvaW50ZXIgdG8gYSBEV09SRCB0byBiZSBmaWxsZWQgd2l0aCB0aGUgZnJlZSBtZW1vcnkKKyAqCisgKiBSZXR1cm5zCisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgb2YgZnJlZSBhbmQgdG90YWwgYXJlIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9HZXRBdmFpbGFibGVWaWRNZW0oSURpcmVjdERyYXc3ICppZmFjZSwgRERTQ0FQUzIgKkNhcHMsIERXT1JEICp0b3RhbCwgRFdPUkQgKmZyZWUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCAlcCwgJXApXG4iLCBUaGlzLCBDYXBzLCB0b3RhbCwgZnJlZSk7CisKKyAgICBpZihUUkFDRV9PTihkZHJhdykpCisgICAgeworICAgICAgICBUUkFDRSgiKCVwKSBBc2tlZCBmb3IgbWVtb3J5IHdpdGggZGVzY3JpcHRpb246ICIsIFRoaXMpOworICAgICAgICBERFJBV19kdW1wX0REU0NBUFMyKENhcHMpOworICAgICAgICBUUkFDRSgiXG4iKTsKKyAgICB9CisKKyAgICAvKiBUb2RvOiBTeXN0ZW0gbWVtb3J5IHZzIGxvY2FsIHZpZGVvIG1lbW9yeSB2cyBub24tbG9jYWwgdmlkZW8gbWVtb3J5CisgICAgICogVGhlIE1TRE4gYWxzbyBtZW50aW9uZXMgZGlmZmVyZW5jZXMgYmV0d2VlbiB0ZXh0dXJlIG1lbW9yeSBhbmQgb3RoZXIKKyAgICAgKiByZXNvdXJjZXMsIGJ1dCB0aGF0J3Mgbm90IGltcG9ydGFudAorICAgICAqLworCisgICAgaWYoICghdG90YWwpICYmICghZnJlZSkgKSByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIGlmKHRvdGFsKSAqdG90YWwgPSBUaGlzLT50b3RhbF92aWRtZW07CisgICAgaWYoZnJlZSkgKmZyZWUgPSBJV2luZUQzRERldmljZV9HZXRBdmFpbGFibGVUZXh0dXJlTWVtKFRoaXMtPndpbmVEM0REZXZpY2UpOworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6SW5pdGlhbGl6ZQorICoKKyAqIEluaXRpYWxpemVzIGEgRGlyZWN0RHJhdyBpbnRlcmZhY2UuCisgKgorICogUGFyYW1zOgorICogIEdVSUQ6IEludGVyZmFjZSBpZGVudGlmaWVyLiBXZWxsLCBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyByZWFsbHkgZ29vZAorICogICBmb3IKKyAqCisgKiBSZXR1cm5zCisgKiAgUmV0dXJucyBERF9PSyBvbiB0aGUgZmlyc3QgY2FsbCwKKyAqICBEREVSUl9BTFJFQURZSU5JVElBTElaRUQgb24gcmVwZWF0ZWQgY2FsbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9Jbml0aWFsaXplKElEaXJlY3REcmF3NyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHVUlEICpHdWlkKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcyk6IE5vLW9wXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKEd1aWQpKTsKKworICAgIGlmKFRoaXMtPmluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEREX09LOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkZsaXBUb0dESVN1cmZhY2UKKyAqCisgKiAiTWFrZXMgdGhlIHN1cmZhY2UgdGhhdCB0aGUgR0RJIHdyaXRlcyB0byB0aGUgcHJpbWFyeSBzdXJmYWNlIgorICogTG9va3MgbGlrZSBzb21lIHdpbmRvd3Mgc3BlY2lmaWMgdGhpbmcgd2UgZG9uJ3QgaGF2ZSB0byBjYXJlIGFib3V0LgorICogQWNjb3JkaW5nIHRvIE1TRE4gaXQgcGVybWl0cyBHREkgZGlhbG9nIGJveGVzIGluIEZVTExTQ1JFRU4gbW9kZS4gR29vZCB0bworICogc2hvdyBlcnJvciBib3hlcyA7KQorICogV2VsbCwganVzdCByZXR1cm4gRERfT0suCisgKgorICogUmV0dXJuczoKKyAqICBBbHdheXMgcmV0dXJucyBERF9PSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0ZsaXBUb0dESVN1cmZhY2UoSURpcmVjdERyYXc3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OldhaXRGb3JWZXJ0aWNhbEJsYW5rCisgKgorICogVGhpcyBtZXRob2QgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBnZXQgaW4gc3luYyB3aXRoIHRoZSB2ZXJ0aWNhbCBibGFuaworICogaW50ZXJ2YWwuCisgKiBUaGUgd29ybWhvbGUgZGVtbyBpbiB0aGUgRGlyZWN0WCA3IHNkayB1c2VzIHRoaXMgY2FsbCwgYW5kIGl0IGRvZXNuJ3QKKyAqIHJlZHJhdyB0aGUgc2NyZWVuLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIHRoaXMgc3R1YgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgRmxhZ3M6IG9uZSBvZiBERFdBSVRWQl9CTE9DS0JFR0lOLCBERFdBSVRWQl9CTE9DS0JFR0lORVZFTlQKKyAqICAgICAgICAgb3IgRERXQUlUVkJfQkxPQ0tFTkQKKyAqICBoOiBOb3QgdXNlZCwgYWNjb3JkaW5nIHRvIE1TRE4KKyAqCisgKiBSZXR1cm5zOgorICogIEFsd2F5cyByZXR1cm5zIEREX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX1dhaXRGb3JWZXJ0aWNhbEJsYW5rKElEaXJlY3REcmF3NyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFIGgpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKS0+KCVseCwlcCk6IFN0dWJcbiIsIFRoaXMsIEZsYWdzLCBoKTsKKworICAgIC8qIE1TRE4gc2F5cyBERFdBSVRWQl9CTE9DS0JFR0lORVZFTlQgaXMgbm90IHN1cHBvcnRlZCAqLworICAgIGlmKEZsYWdzICYgRERXQUlUVkJfQkxPQ0tCRUdJTkVWRU5UKQorICAgICAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIHVuY2hlY2tlZCAqLworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6R2V0U2NhbkxpbmUKKyAqCisgKiBSZXR1cm5zIHRoZSBzY2FuIGxpbmUgdGhhdCBpcyBiZWVpbmcgZHJhd24gb24gdGhlIG1vbml0b3IKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIFNjYW5saW5lOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBzY2FuIGxpbmUgdmFsdWUgdG8KKyAqCisgKiBSZXR1cm5zOgorICogIEFsd2F5cyByZXR1cm5zIEREX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0ltcGxfR2V0U2NhbkxpbmUoSURpcmVjdERyYXc3ICppZmFjZSwgRFdPUkQgKlNjYW5saW5lKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgc3RhdGljIEJPT0wgaGlkZSA9IEZBTFNFOworICAgIFdJTkVEM0RESVNQTEFZTU9ERSBNb2RlOworCisgICAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb2Z0ZW4sIHNvIHByaW50IHRoZSBmaXhtZSBvbmx5IG9uY2UgKi8KKyAgICBpZighaGlkZSkKKyAgICB7CisgICAgICAgIEZJWE1FKCIoJXApLT4oJXApOiBTZW1pLVN0dWJcbiIsIFRoaXMsIFNjYW5saW5lKTsKKyAgICAgICAgaGlkZSA9IFRSVUU7CisgICAgfQorCisgICAgSVdpbmVEM0REZXZpY2VfR2V0RGlzcGxheU1vZGUoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNb2RlKTsKKworICAgIC8qIEZha2UgdGhlIGxpbmUgc3dlZXBpbmcgb2YgdGhlIG1vbml0b3IgKi8KKyAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHN5bmNocm9uaXplIHdpdGggYSBzb3VyY2UgdG8ga2VlcCB0aGUgcmVmcmVzaCByYXRlICovIAorICAgICpTY2FubGluZSA9IFRoaXMtPmN1cl9zY2FubGluZSsrOworICAgIC8qIEFzc3VtZSAyMCBzY2FuIGxpbmVzIGluIHRoZSB2ZXJ0aWNhbCBibGFuayAqLworICAgIGlmIChUaGlzLT5jdXJfc2NhbmxpbmUgPj0gTW9kZS5IZWlnaHQgKyAyMCkKKyAgICAgICAgVGhpcy0+Y3VyX3NjYW5saW5lID0gMDsKKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OlRlc3RDb29wZXJhdGl2ZUxldmVsCisgKgorICogSW5mb3JtcyB0aGUgYXBwbGljYXRpb24gYWJvdXQgdGhlIHN0YXRlIG9mIHRoZSB2aWRlbyBhZGFwdGVyLCBkZXBlbmRpbmcKKyAqIG9uIHRoZSBjb29wZXJhdGl2ZSBsZXZlbAorICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgaWYgdGhlIGRldmljZSBpcyBpbiBhIHNhbmUgc3RhdGUKKyAqICBEREVSUl9OT0VYQ0xVU0lWRU1PREUgb3IgRERFUlJfRVhDTFVTSVZFTU9ERUFMUkVBRFlTRVQKKyAqICBpZiB0aGUgc3RhdGUgaXMgbm90IGNvcnJlY3QoU2VlIGJlbG93KQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9UZXN0Q29vcGVyYXRpdmVMZXZlbChJRGlyZWN0RHJhdzcgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKVxuIiwgVGhpcyk7CisKKyAgICAvKiBEZXNjcmlwdGlvbiBmcm9tIE1TRE46CisgICAgICogRm9yIGZ1bGxzY3JlZW4gYXBwcyByZXR1cm4gRERFUlJfTk9FWENMVVNJVkVNT0RFIGlmIHRoZSB1c2VyIHN3aXRjaGVkCisgICAgICogYXdheSBmcm9tIHRoZSBhcHAgd2l0aCBlLmcuIGFsdC10YWIuIFdpbmRvd2VkIGFwcHMgcmVjZWl2ZSAKKyAgICAgKiBEREVSUl9FWENMVVNJVkVNT0RFQUxSRUFEWVNFVCBpZiBhbm90aGVyIGFwcGxpY2F0aW9uIGNyZWF0ZWQgYW4gCisgICAgICogRGlyZWN0RHJhdyBvYmplY3QgaW4gZXhjbHVzaXZlIG1vZGUuIERERVJSX1dST05HTU9ERSBpcyByZXR1cm5lZCwKKyAgICAgKiB3aGVuIHRoZSB2aWRlbyBtb2RlIGhhcyBjaGFuZ2VkCisgICAgICovCisKKyAgICBociA9ICBJV2luZUQzRERldmljZV9UZXN0Q29vcGVyYXRpdmVMZXZlbChUaGlzLT53aW5lRDNERGV2aWNlKTsKKworICAgIC8qIEZpeCB0aGUgcmVzdWx0IHZhbHVlLiBUaGVzZSB2YWx1ZXMgYXJlIG1hcHBlZCBmcm9tIHRoZWlyCisgICAgICogZDNkOSBjb3VudGVycGFydC4KKyAgICAgKi8KKyAgICBzd2l0Y2goaHIpCisgICAgeworICAgICAgICBjYXNlIFdJTkVEM0RFUlJfREVWSUNFTE9TVDoKKyAgICAgICAgICAgIGlmKFRoaXMtPmNvb3BlcmF0aXZlX2xldmVsICYgRERTQ0xfRVhDTFVTSVZFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBEREVSUl9OT0VYQ0xVU0lWRU1PREU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERERVJSX0VYQ0xVU0lWRU1PREVBTFJFQURZU0VUOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgV0lORUQzREVSUl9ERVZJQ0VOT1RSRVNFVDoKKyAgICAgICAgICAgIHJldHVybiBERF9PSzsKKworICAgICAgICBjYXNlIFdJTkVEM0RfT0s6CisgICAgICAgICAgICByZXR1cm4gRERfT0s7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERVJSX0RSSVZFUklOVEVSTkFMRVJST1I6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFUlIoIiglcCkgVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgJTA4bHggZnJvbSB3aW5lRDNELCAiIFwKKyAgICAgICAgICAgICAgICAiIHJldHVybmluZyBERF9PS1xuIiwgVGhpcywgaHIpOworICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkdldEdESVN1cmZhY2UKKyAqCisgKiBSZXR1cm5zIHRoZSBzdXJmYWNlIHRoYXQgR0RJIGlzIHRyZWF0aW5nIGFzIHRoZSBwcmltYXJ5IHN1cmZhY2UuCisgKiBGb3IgV2luZSB0aGlzIGlzIHRoZSBmcm9udCBidWZmZXIKKyAqCisgKiBQYXJhbXM6CisgKiAgR0RJU3VyZmFjZTogQWRkcmVzcyB0byB3cml0ZSB0aGUgc3VyZmFjZSBwb2ludGVyIHRvCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBpZiB0aGUgc3VyZmFjZSB3YXMgZm91bmQKKyAqICBEREVSUl9OT1RGT1VORCBpZiB0aGUgR0RJIHN1cmZhY2Ugd2Fzbid0IGZvdW5kCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0dldEdESVN1cmZhY2UoSURpcmVjdERyYXc3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKipHRElTdXJmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgSVdpbmVEM0RTdXJmYWNlICpTdXJmOworICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKmRkc3VyZjsKKyAgICBIUkVTVUxUIGhyOworICAgIEREU0NBUFMyIGRkc0NhcHM7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIEdESVN1cmZhY2UpOworCisgICAgLyogR2V0IHRoZSBiYWNrIGJ1ZmZlciBmcm9tIHRoZSB3aW5lRDNERGV2aWNlIGFuZCBzZWFyY2ggaXQncworICAgICAqIGF0dGFjaGVkIHN1cmZhY2VzIGZvciB0aGUgZnJvbnQgYnVmZmVyCisgICAgICovCisgICAgaHIgPSBJV2luZUQzRERldmljZV9HZXRCYWNrQnVmZmVyKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIFN3YXBDaGFpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBmaXJzdCBiYWNrIGJ1ZmZlciovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cmYpOworCisgICAgaWYoIChociAhPSBEM0RfT0spIHx8CisgICAgICAgICghU3VyZikgKQorICAgIHsKKyAgICAgICAgRVJSKCJJV2luZUQzRERldmljZTo6R2V0QmFja0J1ZmZlciBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gRERFUlJfTk9URk9VTkQ7CisgICAgfQorCisgICAgLyogR2V0QmFja0J1ZmZlciBBZGRSZWYoKWVkIHRoZSBzdXJmYWNlLCByZWxlYXNlIGl0ICovCisgICAgSVdpbmVEM0RTdXJmYWNlX1JlbGVhc2UoU3VyZik7CisKKyAgICBJV2luZUQzRFN1cmZhY2VfR2V0UGFyZW50KFN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVVua25vd24gKiopICZkZHN1cmYpOworICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShkZHN1cmYpOyAgLyogRm9yIHRoZSBHZXRQYXJlbnQgKi8KKworICAgIC8qIEZpbmQgdGhlIGZyb250IGJ1ZmZlciAqLworICAgIGRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19GUk9OVEJVRkZFUjsKKyAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0QXR0YWNoZWRTdXJmYWNlKGRkc3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZHNDYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RJU3VyZmFjZSk7CisgICAgaWYoaHIgIT0gRERfT0spCisgICAgeworICAgICAgICBFUlIoIklEaXJlY3REcmF3U3VyZmFjZTc6OkdldEF0dGFjaGVkU3VyZmFjZSBmYWlsZWQsIGhyID0gJWx4XG4iLCBocik7CisgICAgfQorCisgICAgLyogVGhlIEFkZFJlZiBpcyBPSyB0aGlzIHRpbWUgKi8KKyAgICByZXR1cm4gaHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdJbXBsX0VudW1EaXNwbGF5TW9kZXNDQgorICoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBJRGlyZWN0RHJhdzc6OkVudW1EaXNwbGF5TW9kZXMuIFRyYW5zbGF0ZXMKKyAqIHRoZSB3aW5lRDNEIHZhbHVlcyB0byBkZHJhdyB2YWx1ZXMgYW5kIGNhbGxzIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjaworICoKKyAqIFBhcmFtczoKKyAqICBkZXZpY2U6IFRoZSBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlIHRvIHRoZSBjdXJyZW50IGRldmljZQorICogIFdpdGgsIEhlaWdodCwgUGl4ZWxmb3JtYXQsIFJlZnJlc2g6IEVudW1lcmF0ZWQgZGlzcGxheSBtb2RlCisgKiAgY29udGV4dDogdGhlIGNvbnRleHQgcG9pbnRlciBwYXNzZWQgdG8gSVdpbmVEM0REZXZpY2U6OkVudW1EaXNwbGF5TW9kZXMKKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfRW51bURpc3BsYXlNb2Rlc0NCKElVbmtub3duICpwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBQaXhlbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVQgUmVmcmVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkKK3sKKyAgICBERFNVUkZBQ0VERVNDMiBjYWxsYmFja19zZDsKKyAgICBFbnVtRGlzcGxheU1vZGVzQ0JTICpjYnMgPSAoRW51bURpc3BsYXlNb2Rlc0NCUyAqKSBjb250ZXh0OworCisgICAgbWVtc2V0KCZjYWxsYmFja19zZCwgMCwgc2l6ZW9mKGNhbGxiYWNrX3NkKSk7CisgICAgY2FsbGJhY2tfc2QuZHdTaXplID0gc2l6ZW9mKGNhbGxiYWNrX3NkKTsKKyAgICBjYWxsYmFja19zZC51NC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKEREUElYRUxGT1JNQVQpOworCisgICAgY2FsbGJhY2tfc2QuZHdGbGFncyA9IEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9QSVhFTEZPUk1BVHxERFNEX1BJVENIOworICAgIGlmKFJlZnJlc2ggPiAwLjApCisgICAgeworICAgICAgICBjYWxsYmFja19zZC5kd0ZsYWdzIHw9IEREU0RfUkVGUkVTSFJBVEU7CisgICAgICAgIGNhbGxiYWNrX3NkLnUyLmR3UmVmcmVzaFJhdGUgPSA2MC4wOworICAgIH0KKworICAgIGNhbGxiYWNrX3NkLmR3SGVpZ2h0ID0gSGVpZ2h0OworICAgIGNhbGxiYWNrX3NkLmR3V2lkdGggPSBXaWR0aDsKKworICAgIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKCZjYWxsYmFja19zZC51NC5kZHBmUGl4ZWxGb3JtYXQsIFBpeGVsZm9ybWF0KTsKKyAgICByZXR1cm4gY2JzLT5jYWxsYmFjaygmY2FsbGJhY2tfc2QsIGNicy0+Y29udGV4dCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3OjpFbnVtRGlzcGxheU1vZGVzCisgKgorICogRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIERpc3BsYXkgbW9kZXMuIFRoZSBtb2RlcyBjYW4gYmUgZmlsdGVyZWQgd2l0aAorICogdGhlIEREU0QgcGFyYW10ZXIuCisgKgorICogUGFyYW1zOgorICogIEZsYWdzOiBjYW4gYmUgRERFRE1fUkVGUkVTSFJBVEVTIGFuZCBEREVETV9TVEFOREFSRFZHQU1PREVTCisgKiAgRERTRDogU3VyZmFjZSBkZXNjcmlwdGlvbiB0byBmaWx0ZXIgdGhlIG1vZGVzCisgKiAgQ29udGV4dDogUG9pbnRlciBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqICBjYjogQXBwbGljYXRpb24tcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSBjYWxsYmFjayB3YXNuJ3Qgc2V0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0VudW1EaXNwbGF5TW9kZXMoSURpcmVjdERyYXc3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKkREU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEREVOVU1NT0RFU0NBTExCQUNLMiBjYikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIFVJTlQgV2lkdGggPSAwLCBIZWlnaHQgPSAwOworICAgIFdJTkVEM0RGT1JNQVQgcGl4ZWxmb3JtYXQgPSBXSU5FRDNERk1UX1VOS05PV047CisgICAgRW51bURpc3BsYXlNb2Rlc0NCUyBjYnM7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwKTogUmVsYXlcbiIsIFRoaXMsIEREU0QsIENvbnRleHQsIGNiKTsKKworICAgIC8qIFRoaXMgbG9va3Mgc2FuZSAqLworICAgIGlmKCFjYikgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAvKiBUaGUgcHJpdmF0ZSBjYWxsYmFjayBzdHJ1Y3R1cmUgKi8KKyAgICBjYnMuY2FsbGJhY2sgPSBjYjsKKyAgICBjYnMuY29udGV4dCA9IENvbnRleHQ7CisKKyAgICBpZihERFNEKQorICAgIHsKKyAgICAgICAgaWYgKEREU0QtPmR3RmxhZ3MgJiBERFNEX1dJRFRIKQorICAgICAgICAgICAgV2lkdGggPSBERFNELT5kd1dpZHRoOworICAgICAgICBpZiAoRERTRC0+ZHdGbGFncyAmIEREU0RfSEVJR0hUKQorICAgICAgICAgICAgV2lkdGggPSBERFNELT5kd0hlaWdodDsKKyAgICAgICAgaWYgKChERFNELT5kd0ZsYWdzICYgRERTRF9QSVhFTEZPUk1BVCkgJiYgKEREU0QtPnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9SR0IpICkKKyAgICAgICAgICAgIHBpeGVsZm9ybWF0ID0gUGl4ZWxGb3JtYXRfREQyV2luZUQzRCgmRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0KTsKKyAgICB9CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfRW51bURpc3BsYXlNb2RlcyhUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZHRoLCBIZWlnaHQsIHBpeGVsZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdJbXBsX0VudW1EaXNwbGF5TW9kZXNDQik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3OjpFdmFsdWF0ZU1vZGUKKyAqCisgKiBVc2VkIHdpdGggSURpcmVjdERyYXc3OjpTdGFydE1vZGVUZXN0IHRvIHRlc3QgdmlkZW8gbW9kZXMuCisgKiBFdmFsdWF0ZU1vZGUgaXMgdXNlZCB0byBwYXNzIG9yIGZhaWwgYSBtb2RlLCBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dAorICogbW9kZQorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogRERFTV9NT0RFUEFTU0VEIG9yIERERU1fTU9ERUZBSUxFRAorICogIFRpbWVvdXQ6IFJldHVybnMgdGhlIGFtb3VudCBvZiBzZWNvdW5kcyBsZWZ0IGJlZm9yZSB0aGUgbW9kZSB3b3VsZCBoYXZlCisgKiAgICAgICAgICAgYmVlbiBmYWlsZWQgYXV0b21hdGljYWxseQorICoKKyAqIFJldHVybnM6CisgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgRERfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9FdmFsdWF0ZU1vZGUoSURpcmVjdERyYXc3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpUaW1lb3V0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglbGQsJXApOiBTdHViIVxuIiwgVGhpcywgRmxhZ3MsIFRpbWVvdXQpOworCisgICAgLyogV2hlbiBpbXBsZW1lbnRpbmcgdGhpcywgaW1wbGVtZW50IGl0IGluIFdpbmVEM0QgKi8KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkdldERldmljZUlkZW50aWZpZXIKKyAqCisgKiBSZXR1cm5zIHRoZSBkZXZpY2UgaWRlbnRpZmllciwgd2hpY2ggZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlcgorICogT3VyIGRldmljZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUuCisgKgorICogUGFyYW1zOgorICogIEREREk6IEFkZHJlc3MgZm9yIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUKKyAqICBGbGFnczogQ2FuIGJlIERER0RJX0dFVEhPU1RJREVOVElGSUVSCisgKgorICogUmV0dXJuczoKKyAqICBPbiBzdWNjZXNzIGl0IHJldHVybnMgRERfT0sKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEREREkgaXMgTlVMTDsKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9HZXREZXZpY2VJZGVudGlmaWVyKElEaXJlY3REcmF3NyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERERFVklDRUlERU5USUZJRVIyICpERERJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCUwOGx4KSBcbiIsIFRoaXMsIEREREksIEZsYWdzKTsKKworICAgIGlmKCFERERJKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIC8qIFRoZSBEREdESV9HRVRIT1NUSURFTlRJRklFUiByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgMkQKKyAgICAgKiBob3N0IGFkYXB0ZXIsIGlmIHRoZXJlJ3MgYSBzZWNvbmRhcnkgM0QgYWRhcHRlci4gVGhpcyBkb2Vzbid0IGFwcGx5CisgICAgICogdG8gYW55IG1vZGVybiBoYXJkd2FyZSwgbm9yIGlzIGl0IGludGVyZXN0aW5nIGZvciBXaW5lLCBzbyBpZ25vcmUgaXQKKyAgICAgKi8KKworICAgICpERERJID0gZGV2aWNlaWRlbnRpZmllcjsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3OjpHZXRTdXJmYWNlRnJvbURDCisgKgorICogUmV0dXJucyB0aGUgU3VyZmFjZSBmb3IgYSBHREkgZGV2aWNlIGNvbnRleHQgaGFuZGxlLgorICogSXMgdGhpcyByZWxhdGVkIHRvIElEaXJlY3REcmF3U3VyZmFjZTo6R2V0REMgPz8/CisgKgorICogUGFyYW1zOgorICogIGhkYzogaGRjIHRvIHJldHVybiB0aGUgc3VyZmFjZSBmb3IKKyAqICBTdXJmYWNlOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBzdXJmYWNlIHBvaW50ZXIgdG8KKyAqCisgKiBSZXR1cm5zOgorICogIEFsd2F5cyByZXR1cm5zIEREX09LIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9HZXRTdXJmYWNlRnJvbURDKElEaXJlY3REcmF3NyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIREMgaGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqKlN1cmZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKS0+KCVwLCVwKTogU3R1YiFcbiIsIFRoaXMsIGhkYywgU3VyZmFjZSk7CisKKyAgICAvKiBJbXBsZW1lbnRhdGlvbiBpZGVhIGlmIG5lZWRlZDogTG9vcCB0aHJvdWdoIGFsbCBzdXJmYWNlcyBhbmQgY29tcGFyZQorICAgICAqIHRoZWlyIGhkYyB3aXRoIGhkYy4gSW1wbGVtZW50IGl0IGluIFdpbmVEM0QhICovCisgICAgcmV0dXJuIERERVJSX05PVEZPVU5EOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6UmVzdG9yZUFsbFN1cmZhY2VzCisgKgorICogQ2FsbHMgdGhlIHJlc3RvcmUgbWV0aG9kIG9mIGFsbCBzdXJmYWNlcworICoKKyAqIFBhcmFtczoKKyAqCisgKiBSZXR1cm5zOgorICogIEFsd2F5cyByZXR1cm5zIEREX09LIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9SZXN0b3JlQWxsU3VyZmFjZXMoSURpcmVjdERyYXc3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIEZJWE1FKCIoJXApOiBTdHViXG4iLCBUaGlzKTsKKworICAgIC8qIFRoaXMgaXNuJ3QgaGFyZCB0byBpbXBsZW1lbnQ6IEVudW1lcmF0ZSBhbGwgV2luZUQzRCBzdXJmYWNlcywKKyAgICAgKiBnZXQgdGhlaXIgcGFyZW50IGFuZCBjYWxsIHRoZWlyIHJlc3RvcmUgbWV0aG9kLiBEbyBub3QgaW1wbGVtZW50CisgICAgICogaXQgaW4gV2luZUQzRCwgYXMgcmVzdG9yaW5nIGEgc3VyZmFjZSBtZWFucyByZS1jcmVhdGluZyB0aGUKKyAgICAgKiBXaW5lRDNERFN1cmZhY2UKKyAgICAgKi8KKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3OjpTdGFydE1vZGVUZXN0CisgKgorICogVGVzdHMgdGhlIHNwZWNpZmllZCB2aWRlbyBtb2RlcyB0byB1cGRhdGUgdGhlIHN5c3RlbSByZWdpc3RyeSB3aXRoCisgKiByZWZyZXNoIHJhdGUgaW5mb3JtYXRpb24uIFN0YXJ0TW9kZVRlc3Qgc3RhcnRzIHRoZSBtb2RlIHRlc3QsCisgKiBFdmFsdWF0ZU1vZGUgaXMgdXNlZCB0byBmYWlsIG9yIHBhc3MgYSBtb2RlLiBJZiBFdmFsdWF0ZU1vZGUKKyAqIGlzbid0IGNhbGxlZCB3aXRoaGluIDE1IHNlY291bmRzLCB0aGUgbW9kZSBpcyBmYWlsZWQgYXV0b21hdGljYWxseQorICoKKyAqIEFzIHJlZnJlc2ggcmF0ZXMgYXJlIGhhbmRsZWQgYnkgdGhlIFggc2VydmVyLCBJIGRvbid0IHRoaW5rIHRoaXMKKyAqIE1ldGhvcyBpcyBpbXBvcnRhbnQKKyAqCisgKiBQYXJhbXM6CisgKiAgTW9kZXM6IEFuIGFycmF5IG9mIG1vZGUgc3BlY2lmaWNhdGlvbnMKKyAqICBOdW1Nb2RlczogVGhlIG51bWJlciBvZiBtb2RlcyBpbiBNb2RlcworICogIEZsYWdzOiBTb21lIGZsYWdzLi4uCisgKgorICogUmV0dXJuczoKKyAqICBSZXR1cm5zIERERVJSX1RFU1RGSU5JU0hFRCBpZiBmbGFncyBjb250YWlucyBERFNNVF9JU1RFU1RSRVFVSVJFRCwKKyAqICBpZiBubyBtb2RlcyBhcmUgcGFzc2VkLCBEREVSUl9JTlZBTElEUEFSQU1TIGlzIHJldHVybmVkLAorICogIG90aGVyd2lzZSBERF9PSzsKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9TdGFydE1vZGVUZXN0KElEaXJlY3REcmF3NyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFICpNb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIE51bU1vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGlmYWNlKTsKKyAgICBXQVJOKCIoJXApLT4oJXAsICVsZCwgJWx4KTogU2VtaS1TdHViLCBtb3N0IGxpa2VseSBoYXJtbGVzc1xuIiwgVGhpcywgTW9kZXMsIE51bU1vZGVzLCBGbGFncyk7CisKKyAgICAvKiBUaGlzIGxvb2tzIHNhbmUgKi8KKyAgICBpZiggKCFNb2RlcykgfHwgKE51bU1vZGVzID09IDApICkgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAvKiBERFNNVF9JU1RFU1RSRVFVSVJFRCBhc2tzIGlmIGEgbW9kZSB0ZXN0IGlzIG5lY2Vzc2FyeS4KKyAgICAgKiBBcyBpdCBpcyBub3QsIERERVJSX1RFU1RGSU5JU0hFRCBpcyByZXR1cm5lZAorICAgICAqIChob3BlZnVsbHkgdGhhdCdzIGNvcnJlY3QKKyAgICAgKgorICAgIGlmKEZsYWdzICYgRERTTVRfSVNURVNUUkVRVUlSRUQpIHJldHVybiBEREVSUl9URVNURklOSVNIRUQ7CisgICAgICogd2VsbCwgdGhhdCB2YWx1ZSBkb2Vzbid0ICh5ZXQpIGV4aXN0IGluIHRoZSB3aW5lIGhlYWRlcnMsIHNvIGlnbm9yZSBpdAorICAgICAqLworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3SW1wbF9SZWNyZWF0ZVN1cmZhY2VzQ2FsbGJhY2sKKyAqCisgKiBFbnVtZXJhdGlvbiBjYWxsYmFjayBmb3IgSURpcmVjdERyYXdJbXBsX1JlY3JlYXRlQWxsU3VyZmFjZXMuCisgKiBJdCByZS1yZWNyZWF0ZXMgdGhlIFdpbmVEM0RTdXJmYWNlLiBJdCdzIHByZXR0eSBzdGVpZ2h0Zm9yd2FyZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfUmVjcmVhdGVTdXJmYWNlc0NhbGxiYWNrKElEaXJlY3REcmF3U3VyZmFjZTcgKnN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU1VSRkFDRURFU0MyICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQoreworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZJbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmKTsKKyAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSBzdXJmSW1wbC0+ZGRyYXc7CisgICAgSVVua25vd24gKlBhcmVudDsKKyAgICBJUGFyZW50SW1wbCAqcGFySW1wbCA9IE5VTEw7CisgICAgSVdpbmVEM0RTdXJmYWNlICp3aW5lRDNEU3VyZmFjZTsKKyAgICBIUkVTVUxUIGhyOworICAgIHZvaWQgKnRtcDsKKworICAgIFdJTkVEM0RTVVJGQUNFX0RFU0MgICAgIERlc2M7CisgICAgV0lORUQzREZPUk1BVCAgICAgICAgICAgRm9ybWF0OworICAgIFdJTkVEM0RSRVNPVVJDRVRZUEUgICAgIFR5cGU7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgVXNhZ2U7CisgICAgV0lORUQzRFBPT0wgICAgICAgICAgICAgUG9vbDsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICBTaXplOworCisgICAgV0lORUQzRE1VTFRJU0FNUExFX1RZUEUgTXVsdGlTYW1wbGVUeXBlOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgIE11bHRpU2FtcGxlUXVhbGl0eTsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICBXaWR0aDsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICBIZWlnaHQ7CisKKyAgICBUUkFDRSgiKCVwKTogRW51bWVyYXRlZCBTdXJmYWNlICVwXG4iLCBUaGlzLCBzdXJmSW1wbCk7CisKKyAgICAvKiBGb3IgdGhlIGVudW1lcmF0aW9uICovCisgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHN1cmYpOworCisgICAgaWYoc3VyZkltcGwtPkltcGxUeXBlID09IFRoaXMtPkltcGxUeXBlKSByZXR1cm4gRERFTlVNUkVUX09LOyAvKiBDb250aW51ZSAqLworCisgICAgLyogR2V0IHRoZSBvYmplY3RzICovCisgICAgd2luZUQzRFN1cmZhY2UgPSBzdXJmSW1wbC0+V2luZUQzRFN1cmZhY2U7CisgICAgSVdpbmVEM0RTdXJmYWNlX0dldFBhcmVudCh3aW5lRDNEU3VyZmFjZSwgJlBhcmVudCk7CisgICAgSVVua25vd25fUmVsZWFzZShQYXJlbnQpOyAvKiBGb3IgdGhlIGdldFBhcmVudCAqLworCisgICAgLyogSXMgdGhlIHBhcmVudCBhbiBJUGFyZW50IGludGVyZmFjZT8gKi8KKyAgICBpZihJVW5rbm93bl9RdWVyeUludGVyZmFjZShQYXJlbnQsICZJSURfSVBhcmVudCwgJnRtcCkgPT0gU19PSykKKyAgICB7CisgICAgICAgIC8qIEl0IGlzIGEgSVBhcmVudCBpbnRlcmZhY2UhICovCisgICAgICAgIElVbmtub3duX1JlbGVhc2UoUGFyZW50KTsgLyogRm9yIHRoZSBRdWVyeUludGVyZmFjZSAqLworICAgICAgICBwYXJJbXBsID0gSUNPTV9PQkpFQ1QoSVBhcmVudEltcGwsIElQYXJlbnQsIFBhcmVudCk7CisgICAgICAgIC8qIFJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0aGUgcGFyZW50IGludGVyZmFjZSBpcyBob2xkaW5nICovCisgICAgICAgIElXaW5lRDNEU3VyZmFjZV9SZWxlYXNlKHdpbmVEM0RTdXJmYWNlKTsKKyAgICB9CisKKworICAgIC8qIEdldCB0aGUgc3VyZmFjZSBwcm9wZXJ0aWVzICovCisgICAgRGVzYy5Gb3JtYXQgPSAmRm9ybWF0OworICAgIERlc2MuVHlwZSA9ICZUeXBlOworICAgIERlc2MuVXNhZ2UgPSAmVXNhZ2U7CisgICAgRGVzYy5Qb29sID0gJlBvb2w7CisgICAgRGVzYy5TaXplID0gJlNpemU7CisgICAgRGVzYy5NdWx0aVNhbXBsZVR5cGUgPSAmTXVsdGlTYW1wbGVUeXBlOworICAgIERlc2MuTXVsdGlTYW1wbGVRdWFsaXR5ID0gJk11bHRpU2FtcGxlUXVhbGl0eTsKKyAgICBEZXNjLldpZHRoID0gJldpZHRoOworICAgIERlc2MuSGVpZ2h0ID0gJkhlaWdodDsKKworICAgIGhyID0gSVdpbmVEM0RTdXJmYWNlX0dldERlc2Mod2luZUQzRFN1cmZhY2UsICZEZXNjKTsKKyAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKKworICAgIC8qIENyZWF0ZSB0aGUgbmV3IHN1cmZhY2UgKi8KKyAgICBociA9IElXaW5lRDNERGV2aWNlX0NyZWF0ZVN1cmZhY2UoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGgsIEhlaWdodCwgRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIC8qIExvY2thYmxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSAvKiBEaXNjYXJkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmSW1wbC0+bWlwbWFwX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VyZkltcGwtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlTYW1wbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVNhbXBsZVF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogU2hhcmVkSGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5JbXBsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50KTsKKworICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICAgICAgcmV0dXJuIGhyOworCisgICAgLyogVXBkYXRlIHRoZSBJUGFyZW50IGlmIGl0IGV4aXN0cyAqLworICAgIGlmKHBhckltcGwpCisgICAgeworICAgICAgICBwYXJJbXBsLT5jaGlsZCA9IChJVW5rbm93biAqKSBzdXJmSW1wbC0+V2luZUQzRFN1cmZhY2U7CisgICAgICAgIC8qIEFkZCBhIHJlZmVyZW5jZSBmb3IgdGhlIElQYXJlbnQgKi8KKyAgICAgICAgSVdpbmVEM0RTdXJmYWNlX0FkZFJlZihzdXJmSW1wbC0+V2luZUQzRFN1cmZhY2UpOworICAgIH0KKyAgICAvKiBUT0RPOiBDb3B5IHRoZSBzdXJmYWNlIGNvbnRlbnQsIGV4Y2VwdCBmb3IgcmVuZGVyIHRhcmdldHMgKi8KKworICAgIGlmKElXaW5lRDNEU3VyZmFjZV9SZWxlYXNlKHdpbmVEM0RTdXJmYWNlKSA9PSAwKQorICAgICAgICBUUkFDRSgiU3VyZmFjZSByZWxlYXNlZCBzdWNjZXNzZnVsbCwgbmV4dCBzdXJmYWNlXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEVSUigiU29tZXRoaW5nJ3Mgc3RpbGwgaG9sZGluZyB0aGUgb2xkIFdpbmVEM0RTdXJmYWNlXG4iKTsKKworICAgIHN1cmZJbXBsLT5JbXBsVHlwZSA9IFRoaXMtPkltcGxUeXBlOworCisgICAgcmV0dXJuIERERU5VTVJFVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0ltcGxfUmVjcmVhdGVBbGxTdXJmYWNlcworICoKKyAqIEEgZnVuY3Rpb24sIHRoYXQgY29udmVydHMgYWxsIHdpbmVEM0RTdXJmYWNlcyB0byB0aGUgbmV3IGltcGxlbWVudGF0aW9uIHR5cGUKKyAqIEl0IGVudW1lcmF0ZXMgYWxsIHN1cmZhY2VzIHdpdGggSVdpbmVEM0REZXZpY2U6OkVudW1TdXJmYWNlcywgY3JlYXRlcyBhCisgKiBuZXcgV2luZUQzRFN1cmZhY2UsIGNvcHlzIHRoZSBjb250ZW50IGFuZCByZWxlYXNlcyB0aGUgb2xkIHN1cmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVAorSURpcmVjdERyYXdJbXBsX1JlY3JlYXRlQWxsU3VyZmFjZXMoSURpcmVjdERyYXdJbXBsICpUaGlzKQoreworICAgIEREU1VSRkFDRURFU0MyIGRlc2M7CisgICAgVFJBQ0UoIiglcCk6IFN3aXRjaCB0byBpbXBsZW1lbnRhdGlvbiAlZFxuIiwgVGhpcywgVGhpcy0+SW1wbFR5cGUpOworCisgICAgaWYoVGhpcy0+SW1wbFR5cGUgIT0gU1VSRkFDRV9PUEVOR0wgJiYgVGhpcy0+ZDNkX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgLyogU2hvdWxkIGhhcHBlbiBhbG1vc3QgbmV2ZXIgKi8KKyAgICAgICAgRklYTUUoIiglcCkgU3dpdGNoaW5nIHRvIG5vbi1vcGVuZ2wgc3VyZmFjZXMgd2l0aCBkM2Qgc3RhcnRlZC4gSXMgdGhpcyBhIGJ1Zz9cbiIsIFRoaXMpOworICAgICAgICAvKiBTaHV0ZG93biBkM2QgKi8KKyAgICAgICAgSVdpbmVEM0REZXZpY2VfVW5pbml0M0QoVGhpcy0+d2luZUQzRERldmljZSk7CisgICAgfQorICAgIC8qIENvbnRyYXJ5OiBEM0Qgc3RhcnRpbmcgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGVyLCBiZWNhdXNlIGl0IGtub3dzIHRoZSByZW5kZXIgdGFyZ2V0ICovCisKKyAgICBtZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisgICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0VudW1TdXJmYWNlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd0ltcGxfUmVjcmVhdGVTdXJmYWNlc0NhbGxiYWNrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEM0Q3Q0JfQ3JlYXRlU3VyZmFjZQorICoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBJRGlyZWN0M0REZXZpY2VfQ3JlYXRlVGV4dHVyZS4gSXQgc2VhcmNoZXMgZm9yIHRoZQorICogY29ycmVjdCBtaXBtYXAgc3VibGV2ZWwsIGFuZCByZXR1cm5zIGl0IHRvIFdpbmVEM0QuCisgKiBUaGUgc3VyZmFjZXMgYXJlIGNyZWF0ZWQgYWxyZWFkeSBieSBJRGlyZWN0RHJhdzc6OkNyZWF0ZVN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgV2l0aCwgSGVpZ2h0OiBXaXRoIGFuZCBoZWlnaHQgb2YgdGhlIHN1cmZhY2UKKyAqICBGb3JtYXQ6IFRoZSByZXF1ZXN0ZWQgZm9ybWF0CisgKiAgVXNhZ2UsIFBvb2w6IEQzRFVTQUdFIGFuZCBEM0RQT09MIG9mIHRoZSBzdXJmYWNlCisgKiAgbGV2ZWw6IFRoZSBtaXBtYXAgbGV2ZWwKKyAqICBTdXJmYWNlOiBQb2ludGVyIHRvIHBhc3MgdGhlIGNyZWF0ZWQgc3VyZmFjZSBiYWNrIGF0CisgKiAgU2hhcmVkSGFuZGxlOiBOVUxMCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0QzRDdDQl9DcmVhdGVTdXJmYWNlKElVbmtub3duICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBVSU5UIFdpZHRoLCBVSU5UIEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RGT1JNQVQgRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVXNhZ2UsIFdJTkVEM0RQT09MIFBvb2wsIFVJTlQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2UgKipTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgSEFORExFICpTaGFyZWRIYW5kbGUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGRldmljZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IFRoaXMtPnRleF9yb290OworICAgIGludCBpOworICAgIFRSQUNFKCIoJXApIGNhbGwgYmFjay4gc3VyZj0lcFxuIiwgZGV2aWNlLCBzdXJmKTsKKworICAgIC8qIEZpbmQgdGhlIHdhbnRlZCBtaXBtYXAuIFRoZXJlIGFyZSBlbm91Z2h0IG1pcG1hcHMgaW4gdGhlIGNoYWluICovCisgICAgZm9yKGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykKKyAgICAgICAgc3VyZiA9IHN1cmYtPm5leHRfY29tcGxleDsKKworICAgIC8qIFJldHVybiB0aGUgc3VyZmFjZSAqLworICAgICpTdXJmYWNlID0gc3VyZi0+V2luZUQzRFN1cmZhY2U7CisKKyAgICBUUkFDRSgiUmV0dXJuaW5nIHdpbmVEM0RTdXJmYWNlICVwLCBpdCBiZWxvbmdzIHRvIHN1cmZhY2UgJXBcbiIsICpTdXJmYWNlLCBzdXJmKTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3SW1wbF9DcmVhdGVOZXdTdXJmYWNlCisgKgorICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIElEaXJlY3REcmF3Nzo6Q3JlYXRlU3VyZmFjZS4gSXQgY3JlYXRlcyBhIG5ldyBzdXJmYWNlCisgKiB3aXRoIHRoZSBwYXNzZWQgcGFyYW1ldGVycy4KKyAqCisgKiBQYXJhbXM6CisgKiAgRERTRDogRGVzY3JpcHRpb24gb2YgdGhlIHN1cmZhY2UgdG8gY3JlYXRlCisgKiAgU3VyZjogQWRkcmVzcyB0byBzdG9yZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9DcmVhdGVOZXdTdXJmYWNlKElEaXJlY3REcmF3SW1wbCAqVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU1VSRkFDRURFU0MyICpwRERTRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKipwcFN1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGxldmVsKQoreworICAgIEhSRVNVTFQgaHI7CisgICAgVUlOVCBXaWR0aCA9IDAsIEhlaWdodCA9IDA7CisgICAgV0lORUQzREZPUk1BVCBGb3JtYXQgPSBXSU5FRDNERk1UX1VOS05PV047CisgICAgV0lORUQzRFJFU09VUkNFVFlQRSBSZXNUeXBlID0gV0lORUQzRFJUWVBFX1NVUkZBQ0U7CisgICAgRFdPUkQgVXNhZ2UgPSAwOworICAgIFdJTkVEM0RTVVJGVFlQRSBJbXBsVHlwZSA9IFRoaXMtPkltcGxUeXBlOworICAgIFdJTkVEM0RTVVJGQUNFX0RFU0MgRGVzYzsKKyAgICBJVW5rbm93biAqUGFyZW50OworICAgIElQYXJlbnRJbXBsICpwYXJJbXBsID0gTlVMTDsKKyAgICBXSU5FRDNEUE9PTCBQb29sID0gV0lORUQzRFBPT0xfREVGQVVMVDsKKworICAgIC8qIER1bW1pZXMgZm9yIEdldERlc2MgKi8KKyAgICBXSU5FRDNEUE9PTCBkdW1teV9kM2Rwb29sOworICAgIFdJTkVEM0RNVUxUSVNBTVBMRV9UWVBFIGR1bW15X21zdDsKKyAgICBVSU5UIGR1bW15X3VpbnQ7CisgICAgRFdPUkQgZHVtbXlfZHdvcmQ7CisKKyAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIiAoJXApIFJlcXVlc3Rpbmcgc3VyZmFjZSBkZXNjIDpcbiIsIFRoaXMpOworICAgICAgICBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhwRERTRCk7CisgICAgfQorCisgICAgLyogU2VsZWN0IHRoZSBzdXJmYWNlIHR5cGUsIGlmIGl0IHdhc24ndCBjaG9vc2VuIHlldCAqLworICAgIGlmKEltcGxUeXBlID09IFNVUkZBQ0VfVU5LTk9XTikKKyAgICB7CisgICAgICAgIC8qIFVzZSBHTCBTdXJmYWNlcyBpZiBhIEQzRERFVklDRSBTdXJmYWNlIGlzIHJlcXVlc3RlZCAqLworICAgICAgICBpZihwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTXzNEREVWSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBUUkFDRSgiKCVwKSBDaG9vc2luZyBHTCBzdXJmYWNlcyBiZWNhdXNlIGEgM0RERVZJQ0UgU3VyZmFjZSB3YXMgcmVxdWVzdGVkXG4iLCBUaGlzKTsKKyAgICAgICAgICAgIEltcGxUeXBlID0gU1VSRkFDRV9PUEVOR0w7CisgICAgICAgIH0KKworICAgICAgICAvKiBPdGhlcndpc2UgdXNlIEdESSBzdXJmYWNlcyBmb3Igbm93ICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoIiglcCkgQ2hvb3NpbmcgR0RJIHN1cmZhY2VzIGZvciAyRCByZW5kZXJpbmdcbiIsIFRoaXMpOworICAgICAgICAgICAgSW1wbFR5cGUgPSBTVVJGQUNFX0dESTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFBvbGljeSBpZiBhbGwgc3VyZmFjZSBpbXBsZW1lbnRhdGlvbnMgYXJlIGF2YWlsYWJsZToKKyAgICAgICAgICogRmlyc3QsIGNoZWNrIGlmIGEgZGVmYXVsdCB0eXBlIHdhcyBzZXQgd2l0aCB3aW5lY2ZnLiBJZiBub3QsCisgICAgICAgICAqIHRyeSBYcmVuZGVyIHN1cmZhY2VzLCBhbmQgdXNlIHRoZW0gaWYgdGhleSB3b3JrLiBOZXh0LCBjaGVjayBpZgorICAgICAgICAgKiBhY2NlbGxlcmF0ZWQgT3BlbkdMIGlzIGF2YWlsYWJsZSwgYW5kIHVzZSBHTCBzdXJmYWNlcyBpbiB0aGlzCisgICAgICAgICAqIGNhc2UuIElmIGFsbCBmYWlscywgdXNlIEdESSBzdXJmYWNlcy4gSWYgYSAzRERFVklDRSBzdXJmYWNlCisgICAgICAgICAqIHdhcyBjcmVhdGVkLCBhbHdheXMgdXNlIE9wZW5HTCBzdXJmYWNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogKE5vdGU6IFhyZW5kZXIgc3VyZmFjZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCBieSBub3csIHRoZQorICAgICAgICAgKiB1bmFjY2VsbGVyYXRlZCBpbXBsZW1lbnRhdGlvbiB1c2VzIEdESSB0byByZW5kZXIgaW4gU29mdHdhcmUpCisgICAgICAgICAqLworCisgICAgICAgIC8qIFN0b3JlIHRoZSB0eXBlLiBJZiBpdCBuZWVkcyB0byBiZSBjaGFuZ2VkLCBhbGwgV2luZUQzRFN1cmZhY2VzIGhhdmUgdG8KKyAgICAgICAgICogYmUgcmUtY3JlYXRlZC4gVGhpcyBjb3VsZCBiZSBkb25lIHdpdGggSURpcmVjdERyYXdTdXJmYWNlNzo6UmVzdG9yZQorICAgICAgICAgKi8KKyAgICAgICAgVGhpcy0+SW1wbFR5cGUgPSBJbXBsVHlwZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgIGlmKChwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTXzNEREVWSUNFICkgJiYgCisgICAgICAgICAgICAoVGhpcy0+SW1wbFR5cGUgIT0gU1VSRkFDRV9PUEVOR0wgKSAmJiBEZWZhdWx0U3VyZmFjZVR5cGUgPT0gU1VSRkFDRV9VTktOT1dOKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSBoYXZlIHRvIGNoYW5nZSB0byBPcGVuR0wsCisgICAgICAgICAgICAgKiBhbmQgcmUtY3JlYXRlIGFsbCBXaW5lRDNEU3VyZmFjZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgSW1wbFR5cGUgPSBTVVJGQUNFX09QRU5HTDsKKyAgICAgICAgICAgIFRoaXMtPkltcGxUeXBlID0gSW1wbFR5cGU7CisgICAgICAgICAgICBUUkFDRSgiKCVwKSBSZS1jcmVhdGluZyBhbGwgc3VyZmFjZXNcbiIsIFRoaXMpOworICAgICAgICAgICAgSURpcmVjdERyYXdJbXBsX1JlY3JlYXRlQWxsU3VyZmFjZXMoVGhpcyk7CisgICAgICAgICAgICBUUkFDRSgiKCVwKSBEb25lIHJlY3JlYXRpbmcgYWxsIHN1cmZhY2VzXG4iLCBUaGlzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKFRoaXMtPkltcGxUeXBlICE9IFNVUkZBQ0VfT1BFTkdMKQorICAgICAgICB7CisgICAgICAgICAgICBXQVJOKCJUaGUgYXBwbGljYXRpb24gcmVxdWVzdHMgYSAzRCBjYXBhYmxlIHN1cmZhY2UsIGJ1dCBhIG5vbi1vcGVuZ2wgc3VyZmFjZSB3YXMgc2V0IGluIHRoZSByZWdpc3RyeVxuIik7CisgICAgICAgICAgICAvKiBEbyBub3QgZmFpbCBzdXJmYWNlIGNyZWF0aW9uLCBvbmx5IGZhaWwgM0QgZGV2aWNlIGNyZWF0aW9uICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIHN1cmZhY2UgcGFyYW1ldGVycyAqLworICAgIGlmICggcEREU0QtPmR3RmxhZ3MgJiBERFNEX0xQU1VSRkFDRSkKKyAgICB7CisgICAgICAgIEVSUigiKCVwKSBVc2luZyBhIHBhc3NlZCBzdXJmYWNlIHBvaW50ZXIgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIsIFRoaXMpOworCWFzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIGNvcnJlY3Qgd2luZWQzZCB1c2FnZSAqLworICAgIGlmIChwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiAoRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTX0JBQ0tCVUZGRVIgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NBUFNfM0RERVZJQ0UgICAgICAgKSApCisgICAgeworICAgICAgICBVc2FnZSB8PSBXSU5FRDNEVVNBR0VfUkVOREVSVEFSR0VUOworICAgIH0KKyAgICBpZihUaGlzLT5kZXB0aHN0ZW5jaWwpCisgICAgeworICAgICAgICAvKiBUaGUgZGVwdGggc3RlbmNpbCBjcmVhdGlvbiBjYWxsYmFjayBzZXRzIHRoaXMgZmxhZy4KKyAgICAgICAgICogU2V0IHRoZSBXaW5lRDNEIHVzYWdlIHRvIGxldCBpdCBrbm93IHRoYXQgaXQncyBhIGRlcHRoCisgICAgICAgICAqIFN0ZW5jaWwgc3VyZmFjZS4KKyAgICAgICAgICovCisgICAgICAgIFVzYWdlIHw9IFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUw7CisgICAgfQorICAgIGlmKHBERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfU1lTVEVNTUVNT1JZKQorICAgIHsKKyAgICAgICAgUG9vbCA9IFdJTkVEM0RQT09MX1NZU1RFTU1FTTsKKyAgICB9CisKKyAgICBGb3JtYXQgPSBQaXhlbEZvcm1hdF9ERDJXaW5lRDNEKCZwRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0KTsKKyAgICBpZihGb3JtYXQgPT0gV0lORUQzREZNVF9VTktOT1dOKQorICAgIHsKKyAgICAgICAgRVJSKCJVbnN1cHBvcnRlZCAvIFVua25vd24gcGl4ZWxmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBJWEVMRk9STUFUOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0aGUgU3VyZmFjZSBvYmplY3QgKi8KKyAgICAqcHBTdXJmID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKSk7CisgICAgaWYoISpwcFN1cmYpCisgICAgeworICAgICAgICBFUlIoIiglcCkgRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGEgc3VyZmFjZVxuIiwgVGhpcyk7CisgICAgICAgIHJldHVybiBEREVSUl9PVVRPRlZJREVPTUVNT1JZOworICAgIH0KKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKCpwcFN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcsIElEaXJlY3REcmF3U3VyZmFjZTdfVnRibCk7CisgICAgSUNPTV9JTklUX0lOVEVSRkFDRSgqcHBTdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2UzLCBJRGlyZWN0RHJhd1N1cmZhY2UzX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoKnBwU3VyZiwgSURpcmVjdERyYXdHYW1tYUNvbnRyb2wsIElEaXJlY3REcmF3R2FtbWFDb250cm9sX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoKnBwU3VyZiwgSURpcmVjdDNEVGV4dHVyZTIsIElEaXJlY3QzRFRleHR1cmUyX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoKnBwU3VyZiwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTFfVnRibCk7CisgICAgKCpwcFN1cmYpLT5yZWYgPSAxOworICAgICgqcHBTdXJmKS0+dmVyc2lvbiA9IDc7CisgICAgKCpwcFN1cmYpLT5kZHJhdyA9IFRoaXM7CisgICAgKCpwcFN1cmYpLT5zdXJmYWNlX2Rlc2MuZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKTsKKyAgICAoKnBwU3VyZiktPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKEREUElYRUxGT1JNQVQpOworICAgIEREX1NUUlVDVF9DT1BZX0JZU0laRSgmKCpwcFN1cmYpLT5zdXJmYWNlX2Rlc2MsIHBERFNEKTsKKworICAgIC8qIFN1cmZhY2UgYXR0YWNobWVudHMgKi8KKyAgICAoKnBwU3VyZiktPm5leHRfYXR0YWNoZWQgPSBOVUxMOworICAgICgqcHBTdXJmKS0+Zmlyc3RfYXR0YWNoZWQgPSAqcHBTdXJmOworCisgICAgKCpwcFN1cmYpLT5uZXh0X2NvbXBsZXggPSBOVUxMOworICAgICgqcHBTdXJmKS0+Zmlyc3RfY29tcGxleCA9ICpwcFN1cmY7CisKKyAgICAvKiBOZWVkZWQgdG8gcmUtY3JlYXRlIHRoZSBzdXJmYWNlIG9uIGFuIGltcGxlbWVudGF0aW9uIGNoYW5nZSAqLworICAgICgqcHBTdXJmKS0+SW1wbFR5cGUgPSBJbXBsVHlwZTsKKworICAgIC8qIEZvciBEM0REZXZpY2UgY3JlYXRpb24gKi8KKyAgICAoKnBwU3VyZiktPmlzUmVuZGVyVGFyZ2V0ID0gRkFMU0U7CisKKyAgICAvKiBBIHRyYWNlIG1lc3NhZ2UgZm9yIGRlYnVnZ2luZyAqLworICAgIFRSQUNFKCIoJXApIENyZWF0ZWQgSURpcmVjdERyYXdTdXJmYWNlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZSBhdCAlcFxuIiwgVGhpcywgKnBwU3VyZik7CisKKyAgICBpZihwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiAoIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfCBERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTXzNEREVWSUNFKSApCisgICAgeworICAgICAgICAvKiBSZW5kZXIgdGFyZ2V0cyBhbmQgdGV4dHVyZXMgbmVlZCBhIElQYXJlbnQgaW50ZXJmYWNlLAorICAgICAgICAgKiBiZWNhdXNlIFdpbmVEM0Qgd2lsbCBkZXN0cm95IHRoZW0gd2hlbiB0aGUgc3dhcGNoYWluCisgICAgICAgICAqIGlzIHJlbGVhc2VkCisgICAgICAgICAqLworICAgICAgICBwYXJJbXBsID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihJUGFyZW50SW1wbCkpOworICAgICAgICBpZighcGFySW1wbCkKKyAgICAgICAgeworICAgICAgICAgICAgRVJSKCJPdXQgb2YgbWVtb3J5IHdoZW4gYWxsb2NhdGluZyBtZW1vcnkgZm9yIGEgSVBhcmVudCBpbXBsZW1lbnRhdGlvblxuIik7CisgICAgICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcGFySW1wbC0+cmVmID0gMTsKKyAgICAgICAgSUNPTV9JTklUX0lOVEVSRkFDRShwYXJJbXBsLCBJUGFyZW50LCBJUGFyZW50X1Z0YmwpOworICAgICAgICBQYXJlbnQgPSAoSVVua25vd24gKikgSUNPTV9JTlRFUkZBQ0UocGFySW1wbCwgSVBhcmVudCk7CisgICAgICAgIFRSQUNFKCJVc2luZyBJUGFyZW50IGludGVyZmFjZSAlcCBhcyBwYXJlbnRcbiIsIHBhckltcGwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBVc2UgdGhlIHN1cmZhY2UgYXMgcGFyZW50ICovCisgICAgICAgIFBhcmVudCA9IChJVW5rbm93biAqKSBJQ09NX0lOVEVSRkFDRSgqcHBTdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKyAgICAgICAgVFJBQ0UoIlVzaW5nIFN1cmZhY2UgaW50ZXJmYWNlICVwIGFzIHBhcmVudFxuIiwgKnBwU3VyZik7CisgICAgfQorCisgICAgLyogTm93IGNyZWF0ZSB0aGUgV2luZUQzRCBTdXJmYWNlICovCisgICAgaHIgPSBJV2luZUQzRERldmljZV9DcmVhdGVTdXJmYWNlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBERFNELT5kd1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRERTRC0+ZHdIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSAvKiBMb2NrYWJsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgLyogRGlzY2FyZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoKnBwU3VyZiktPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNUeXBlLCBVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRE1VTFRJU0FNUExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogTXVsdGlTYW1wbGVRdWFsaXR5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFNoYXJlZEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudCk7CisKKyAgICBpZihociAhPSBEM0RfT0spCisgICAgeworICAgICAgICBFUlIoIklXaW5lRDNERGV2aWNlOjpDcmVhdGVTdXJmYWNlIGZhaWxlZC4gaHIgPSAlMDhseFxuIiwgaHIpOworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBjaGlsZCBvZiB0aGUgcGFyZW50IGltcGxlbWVudGF0aW9uIGlmIGl0IGV4aXN0cyAqLworICAgIGlmKHBhckltcGwpCisgICAgeworICAgICAgICBwYXJJbXBsLT5jaGlsZCA9IChJVW5rbm93biAqKSAoKnBwU3VyZiktPldpbmVEM0RTdXJmYWNlOworICAgICAgICAvKiBUaGUgSVBhcmVudCByZWxlYXNlcyB0aGUgV2luZUQzRFN1cmZhY2UsIGFuZAorICAgICAgICAgKiB0aGUgZGRyYXcgc3VyZmFjZSBkb2VzIHRoYXQgdG9vLiBIb2xkIGFuIHJlZmVyZW5jZQorICAgICAgICAgKi8KKyAgICAgICAgSVdpbmVEM0RTdXJmYWNlX0FkZFJlZigoKnBwU3VyZiktPldpbmVEM0RTdXJmYWNlKTsKKyAgICB9CisKKyAgICAvKiBJbmNyZWFzZSB0aGUgc3VyZmFjZSBjb3VudGVyLCBhbmQgYXR0YWNoIHRoZSBzdXJmYWNlICovCisgICAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnN1cmZhY2VzKTsKKyAgICBpZihUaGlzLT5zdXJmYWNlX2xpc3QpCisgICAgeworICAgICAgICBUaGlzLT5zdXJmYWNlX2xpc3QtPnByZXYgPSAqcHBTdXJmOworICAgIH0KKyAgICAoKnBwU3VyZiktPm5leHQgPSBUaGlzLT5zdXJmYWNlX2xpc3Q7CisgICAgVGhpcy0+c3VyZmFjZV9saXN0ID0gKnBwU3VyZjsKKworICAgIC8qIEhlcmUgd2UgY291bGQgc3RvcmUgYWxsIGNyZWF0ZWQgc3VyZmFjZXMgaW4gdGhlIERpcmVjdERyYXdJbXBsIHN0cnVjdHVyZSwKKyAgICAgKiBCdXQgdGhpcyBjb3VsZCBhbHNvIGJlIGRlbGVnYXRlZCB0byBXaW5lRERyYXcsIGFzIGl0IGtlZXBzIHRyYWNrIG9mIGFsbCBpdCdzCisgICAgICogcmVzb3VyY2VzLiBOb3QgaW1wbGVtZW50ZWQgZm9yIG5vdywgYXMgdGhlcmUgYXJlIG1vcmUgaW1wb3J0YW50IHRoaW5ncyA7KQorICAgICAqLworCisgICAgLyogR2V0IHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIFdpbmVEM0RTdXJmYWNlIGFuZCBzdG9yZSBpdC4KKyAgICAgKiBEb24ndCB1c2UgdGhlIEZvcm1hdCBjaG9vc2VuIGFib3ZlLCBXaW5lRDNEIG1pZ2h0IGhhdmUKKyAgICAgKiBjaGFuZ2VkIGl0CisgICAgICovCisgICAgRGVzYy5Gb3JtYXQgPSAmRm9ybWF0OworICAgIERlc2MuVHlwZSA9ICZSZXNUeXBlOworICAgIERlc2MuVXNhZ2UgPSAmVXNhZ2U7CisgICAgRGVzYy5Qb29sID0gJmR1bW15X2QzZHBvb2w7CisgICAgRGVzYy5TaXplID0gJmR1bW15X3VpbnQ7CisgICAgRGVzYy5NdWx0aVNhbXBsZVR5cGUgPSAmZHVtbXlfbXN0OworICAgIERlc2MuTXVsdGlTYW1wbGVRdWFsaXR5ID0gJmR1bW15X2R3b3JkOworICAgIERlc2MuV2lkdGggPSAmV2lkdGg7CisgICAgRGVzYy5IZWlnaHQgPSAmSGVpZ2h0OworCisgICAgKCpwcFN1cmYpLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1BJWEVMRk9STUFUOworICAgIGhyID0gSVdpbmVEM0RTdXJmYWNlX0dldERlc2MoKCpwcFN1cmYpLT5XaW5lRDNEU3VyZmFjZSwgJkRlc2MpOworICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICB7CisgICAgICAgIEVSUigiSVdpbmVEM0RTdXJmYWNlOjpHZXREZXNjIGZhaWxlZFxuIik7CisgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZSggKElEaXJlY3REcmF3U3VyZmFjZTcgKikgKnBwU3VyZik7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisKKyAgICBpZihGb3JtYXQgPT0gV0lORUQzREZNVF9VTktOT1dOKQorICAgIHsKKyAgICAgICAgRklYTUUoIklXaW5lRDNEU3VyZmFjZTo6R2V0RGVzYyByZXR1cm5lZCBXSU5FRDNERk1UX1VOS05PV05cbiIpOworICAgIH0KKyAgICBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERCggJigqcHBTdXJmKS0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdCwgRm9ybWF0KTsKKworICAgIC8qIEFubm8gMTYwMiBzdG9yZXMgdGhlIHBpdGNoIHJpZ2h0IGFmdGVyIHN1cmZhY2UgY3JlYXRpb24sIHNvIG1ha2Ugc3VyZSBpdCdzIHRoZXJlLgorICAgICAqIEkgY2FuJ3QgTG9ja1JlY3QoKSB0aGUgc3VyZmFjZSBoZXJlIGJlY2F1c2UgaWYgT3BlbkdMIHN1cmZhY2VzIGFyZSBpbiB1c2UsIHRoZQorICAgICAqIFdpbmVEM0REZXZpY2UgbWlnaHQgbm90IGJlIHVzZWFibGUgZm9yIDNEIHlldCwgc28gYW4gZXh0cmEgbWV0aG9kIHdhcyBjcmVhdGVkCisgICAgICovCisgICAgKCpwcFN1cmYpLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1BJVENIOworICAgICgqcHBTdXJmKS0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCA9IElXaW5lRDNEU3VyZmFjZV9HZXRQaXRjaCgoKnBwU3VyZiktPldpbmVEM0RTdXJmYWNlKTsKKworICAgIC8qIEFwcGxpY2F0aW9uIHBhc3NlZCBhIGNvbG9yIGtleT8gU2V0IGl0ISAqLworICAgIGlmKHBERFNELT5kd0ZsYWdzICYgRERTRF9DS0RFU1RPVkVSTEFZKQorICAgIHsKKyAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1NldENvbG9yS2V5KCgqcHBTdXJmKS0+V2luZUQzRFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERENLRVlfREVTVE9WRVJMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEREU0QtPnUzLmRkY2tDS0Rlc3RPdmVybGF5KTsKKyAgICB9CisgICAgaWYocEREU0QtPmR3RmxhZ3MgJiBERFNEX0NLREVTVEJMVCkKKyAgICB7CisgICAgICAgIElXaW5lRDNEU3VyZmFjZV9TZXRDb2xvcktleSgoKnBwU3VyZiktPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERDS0VZX0RFU1RCTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEREU0QtPmRkY2tDS0Rlc3RCbHQpOworICAgIH0KKyAgICBpZihwRERTRC0+ZHdGbGFncyAmIEREU0RfQ0tTUkNPVkVSTEFZKQorICAgIHsKKyAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1NldENvbG9yS2V5KCgqcHBTdXJmKS0+V2luZUQzRFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERENLRVlfU1JDT1ZFUkxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRERTRC0+ZGRja0NLU3JjT3ZlcmxheSk7CisgICAgfQorICAgIGlmKHBERFNELT5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCkKKyAgICB7CisgICAgICAgIElXaW5lRDNEU3VyZmFjZV9TZXRDb2xvcktleSgoKnBwU3VyZiktPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERDS0VZX1NSQ0JMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRERTRC0+ZGRja0NLU3JjQmx0KTsKKyAgICB9CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3OjpDcmVhdGVTdXJmYWNlCisgKgorICogQ3JlYXRlcyBhIG5ldyBJRGlyZWN0RHJhd1N1cmZhY2Ugb2JqZWN0IGFuZCByZXR1cm5zIGl0J3MgaW50ZXJmYWNlLgorICoKKyAqIFRoZSBzdXJmYWNlIGNvbm5lY3Rpb25zIHdpdGggd2luZWQzZCBhcmUgYSBiaXQgdHJpY2t5LiBCYXNpY2FsbHkgaXQgd29ya3MKKyAqIGxpa2UgdGhpczoKKyAqCisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgRERyYXcgc3VyZmFjZSAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBXaW5lRDNEU3VyZmFjZSAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICBXaW5lRDNEU3VyZmFjZSAgfC0tLS0tLS0tLS0tLS0tPnwgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgIENoaWxkICAgICAgICAgICB8PC0tLS0tLS0tLS0tLS0+fCBQYXJlbnQgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS18CisgKgorICogVGhlIEREcmF3IHN1cmZhY2UgaXMgdGhlIHBhcmVudCBvZiB0aGUgd2luZWQzZCBzdXJmYWNlLCBhbmQgaXQgcmVsZWFzZXMKKyAqIHRoZSBXaW5lRDNEU3VyZmFjZSB3aGVuIHRoZSBkZHJhdyBzdXJmYWNlIGlzIGRlc3Ryb3llZC4KKyAqCisgKiBIb3dldmVyLCBmb3IgYWxsIHN1cmZhY2VzIHdoaWNoIGNhbiBiZSBpbiBhIGNvbnRhaW5lciBpbiBXaW5lRDNELAorICogd2UgaGF2ZSB0byBkbyB0aGlzLiBUaGVzZSBzdXJmYWNlcyBhcmUgdXN1c2FsbHkgY29tcGxleSBzdXJmYWNlcywKKyAqIHNvIHRoaXMgY29uY2VybmVzIHByaW1hcnkgc3VyZmFjZXMgd2l0aCBhIGZyb250IGFuZCBhIGJhY2sgYnVmZmVyLAorICogYW5kIHRleHR1cmVzIHRleHR1cmVzLgorICoKKyAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBERHJhdyBzdXJmYWNlICAgICAgICAgIHwgICAgICAgICAgICAgICB8IENvbnRhaW50ZXIgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICBDaGlsZCB8PC0tLS0tLS0tLS0tLS0+fCBQYXJlbnQgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICBUZXh0dXJlIHw8LS0tLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgV2luZUQzRFN1cmZhY2UgfDwtLS0tfCAgICAgICAgIHwgICAgICAgICAgTGV2ZWxzIHw8LS18CisgKiB8IENvbXBsZXggY29ubmVjdGlvbiAgICAgfCAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwgICB8CisgKiAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgICB8LS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwgICB8CisgKiAgfCAgICB8IElQYXJlbnQgICAgICAgICAgfCAgICAgfC0tLS0tLS0tPnwgV2luZUQzRFN1cmZhY2UgIHwgICB8CisgKiAgfCAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgfCAgICB8ICAgICAgICAgICAgQ2hpbGQgfDwtLS0tLS0tLS0tLS0tPnwgUGFyZW50ICAgICAgICAgIHwgICB8CisgKiAgfCAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgQ29udGFpbmVyIHw8LS18CisgKiAgfCAgICB8LS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwgICB8CisgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgIHwgRERyYXcgc3VyZmFjZSAyICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfDwtPnwgQ29tcGxleCByb290ICAgQ2hpbGQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgIHwgICAgICAgICAgICAgIFRleHR1cmUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgIHwgICAgICAgV2luZUQzRFN1cmZhY2UgfDwtLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgfCAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwgICB8CisgKiAgfCAgICB8IElQYXJlbnQgICAgICAgICAgICAgfCAgICAgfC0tLS0tPnwgV2luZUQzRFN1cmZhY2UgIHwgICB8CisgKiAgfCAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgfCAgICB8ICAgICAgICAgICAgICAgQ2hpbGQgfDwtLS0tLS0tLS0tPnwgUGFyZW50ICAgICAgICAgIHwgICB8CisgKiAgfCAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgIHwgICAgICAgQ29udGFpbmVyIHw8LS18CisgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwgICB8CisgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgfCAgICAgICAgICAgICAtLS1Nb3JlIHN1cmZhY2VzIGNhbiBmb2xsb3ctLS0gICAgICAgICAgICAgICAgICB8CisgKgorICogVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSBJV2luZUQzRFN3YXBjaGFpbihyZW5kZXIgdGFyZ2V0IGNvbnRhaW5lcikKKyAqIGFuZCB0aGUgSVdpbmVEM0RUZXh1cmUoVGV4dHVyZSBjb250YWluZXIpIHJlbGVhc2UgdGhlIHBhcmVudHMKKyAqIG9mIHRoZWlyIHN1cmZhY2UncyBjaGlsZHJlbiwgYnV0IGJ5IHJlbGVhc2luZyB0aGUgY29tcGxleCByb290CisgKiB0aGUgc3VyZmFjZXMgd2hpY2ggYXJlIGNvbXBsZXhseSBhdHRhY2hlZCB0byBpdCBhcmUgZGVzdHJveWVkCisgKiB0b28uIFNlZSBJRGlyZWN0RHJhd1N1cmZhY2U6OlJlbGVhc2UgZm9yIGEgbW9yZSBkZXRhaWxlZAorICogZXhwbGFuYXRpb24uCisgKgorICogUGFyYW1zOgorICogIEREU0Q6IERlc2NyaXB0aW9uIG9mIHRoZSBzdXJmYWNlIHRvIGNyZWF0ZQorICogIFN1cmY6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CisgKiAgVW5rT3V0ZXI6IEJhc2ljYWxseSBmb3IgYWdncmVnYXRpb24gc3VwcG9ydCwgYnV0IGRkcmF3IGRvZXNuJ3Qgc3VwcG9ydAorICogICAgICAgICAgICBhZ2dyZWdhdGlvbiwgc28gaXQgaGFzIHRvIGJlIE5VTEwKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBDTEFTU19FX05PQUdHUkVHQVRJT04gaWYgVW5rT3V0ZXIgIT0gTlVMTAorICogIERERVJSXyogaWYgYW4gZXJyb3Igb2NjdXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfQ3JlYXRlU3VyZmFjZShJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKkREU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICoqU3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKm9iamVjdCA9IE5VTEw7CisgICAgSFJFU1VMVCBocjsKKyAgICBMT05HIGV4dHJhX3N1cmZhY2VzID0gMCwgaTsKKyAgICBERFNVUkZBQ0VERVNDMiBkZXNjMjsKKyAgICBVSU5UIGxldmVsID0gMDsKKyAgICBXSU5FRDNERElTUExBWU1PREUgTW9kZTsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJXApXG4iLCBUaGlzLCBERFNELCBTdXJmLCBVbmtPdXRlcik7CisKKyAgICAvKiBTb21lIGNoZWNrcyBiZWZvcmUgd2Ugc3RhcnQgKi8KKyAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIiAoJXApIFJlcXVlc3Rpbmcgc3VyZmFjZSBkZXNjIDpcbiIsIFRoaXMpOworICAgICAgICBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhERFNEKTsKKyAgICB9CisKKyAgICBpZiAoVW5rT3V0ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIEZJWE1FKCIoJXApIDogb3V0ZXIgIT0gTlVMTD9cbiIsIFRoaXMpOworICAgICAgICByZXR1cm4gQ0xBU1NfRV9OT0FHR1JFR0FUSU9OOyAvKiB1bmNoZWNrZWQgKi8KKyAgICB9CisKKyAgICBpZiAoIShERFNELT5kd0ZsYWdzICYgRERTRF9DQVBTKSkKKyAgICB7CisgICAgICAgIC8qIERWSURFTy5ETEwgZG9lcyBmb3JnZXQgdGhlIEREU0RfQ0FQUyBmbGFnIC4uLiAqc2lnaCogKi8KKyAgICAgICAgRERTRC0+ZHdGbGFncyB8PSBERFNEX0NBUFM7CisgICAgfQorICAgIGlmIChERFNELT5kZHNDYXBzLmR3Q2FwcyA9PSAwKQorICAgIHsKKyAgICAgICAgLyogVGhpcyBoYXMgYmVlbiBjaGVja2VkIG9uIHJlYWwgV2luZG93cyAqLworICAgICAgICBERFNELT5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfTE9DQUxWSURNRU0gfCBERFNDQVBTX1ZJREVPTUVNT1JZOworICAgIH0KKworICAgIGlmIChERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfQUxMT0NPTkxPQUQpCisgICAgeworICAgICAgICAvKiBJZiB0aGUgc3VyZmFjZSBpcyBvZiB0aGUgJ2FsbG9jb25sb2FkJyB0eXBlLCBpZ25vcmUgdGhlIExQU1VSRkFDRSBmaWVsZCAqLworICAgICAgICBERFNELT5kd0ZsYWdzICY9IH5ERFNEX0xQU1VSRkFDRTsKKyAgICB9CisKKyAgICBpZiAoKEREU0QtPmR3RmxhZ3MgJiBERFNEX0xQU1VSRkFDRSkgJiYgKEREU0QtPmxwU3VyZmFjZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIC8qIEZyYW5rIEhlcmJlcnQncyBEdW5lIHNwZWNpZmllcyBhIG51bGwgcG9pbnRlciBmb3IgdGhlIHN1cmZhY2UsIGlnbm9yZSB0aGUgTFBTVVJGQUNFIGZpZWxkICovCisgICAgICAgIFdBUk4oIiglcCkgTnVsbCBzdXJmYWNlIHBvaW50ZXIgc3BlY2lmaWVkLCBpZ25vcmUgaXQhXG4iLCBUaGlzKTsKKyAgICAgICAgRERTRC0+ZHdGbGFncyAmPSB+RERTRF9MUFNVUkZBQ0U7CisgICAgfQorCisgICAgaWYgKFN1cmYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEZJWE1FKCIoJXApIFlvdSB3YW50IHRvIGdldCBiYWNrIGEgc3VyZmFjZT8gRG9uJ3QgZ2l2ZSBOVUxMIHB0cnMhXG4iLCBUaGlzKTsKKyAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsgLyogdW5jaGVja2VkICovCisgICAgfQorCisgICAgLyogTW9kaWZ5IHNvbWUgZmxhZ3MgKi8KKyAgICBtZW1zZXQoJmRlc2MyLCAwLCBzaXplb2YoZGVzYzIpKTsKKyAgICBkZXNjMi5kd1NpemUgPSBzaXplb2YoZGVzYzIpOyAgIC8qRm9yIHRoZSBzdHJ1Y3QgY29weSAqLworICAgIEREX1NUUlVDVF9DT1BZX0JZU0laRSgmZGVzYzIsIEREU0QpOworICAgIGRlc2MyLmR3U2l6ZSA9IHNpemVvZihkZXNjMik7ICAgLyogVG8gb3ZlcnJpZGUgYSBwb3NzaWJseSBzbWFsbGVyIHNpemUgKi8KKyAgICBkZXNjMi51NC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplPXNpemVvZihERFBJWEVMRk9STUFUKTsgLyogSnVzdCB0byBiZSBzdXJlICovCisKKyAgICAvKiBHZXQgdGhlIHZpZGVvIG1vZGUgZnJvbSBXaW5lRDNEIC0gd2Ugd2lsbCBuZWVkIGl0ICovCisgICAgaHIgPSBJV2luZUQzRERldmljZV9HZXREaXNwbGF5TW9kZShUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogU3dhcGNoYWluIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNb2RlKTsKKyAgICBpZihGQUlMRUQoaHIpKQorICAgIHsKKyAgICAgICAgRVJSKCJGYWlsZWQgdG8gcmVhZCBkaXNwbGF5IG1vZGUgZnJvbSB3aW5lZDNkXG4iKTsKKyAgICAgICAgc3dpdGNoKFRoaXMtPm9yaWdfYnBwKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgTW9kZS5Gb3JtYXQgPSBXSU5FRDNERk1UX1A4OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIE1vZGUuRm9ybWF0ID0gV0lORUQzREZNVF9YMVI1RzVCNTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBNb2RlLkZvcm1hdCA9IFdJTkVEM0RGTVRfUjVHNkI1OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgIE1vZGUuRm9ybWF0ID0gV0lORUQzREZNVF9SOEc4Qjg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgTW9kZS5Gb3JtYXQgPSBXSU5FRDNERk1UX1g4UjhHOEI4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE1vZGUuV2lkdGggPSBUaGlzLT5vcmlnX3dpZHRoOworICAgICAgICBNb2RlLkhlaWdodCA9IFRoaXMtPm9yaWdfaGVpZ2h0OworICAgIH0KKworICAgIC8qIE5vIHBpeGVsZm9ybWF0IGdpdmVuPyBVc2UgdGhlIGN1cnJlbnQgc2NyZWVuIGZvcm1hdCAqLworICAgIGlmKCEoZGVzYzIuZHdGbGFncyAmIEREU0RfUElYRUxGT1JNQVQpKQorICAgIHsKKyAgICAgICAgZGVzYzIuZHdGbGFncyB8PSBERFNEX1BJWEVMRk9STUFUOworICAgICAgICBkZXNjMi51NC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplPXNpemVvZihERFBJWEVMRk9STUFUKTsKKworICAgICAgICAvKiBXYWl0OiBJdCBjb3VsZCBiZSBhIFogYnVmZmVyICovCisgICAgICAgIGlmKGRlc2MyLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19aQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goZGVzYzIudTIuZHdNaXBNYXBDb3VudCkgLyogV2hvIGhhZCB0aGlzIGdsb3VyaW91cyBpZGVhPyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKCZkZXNjMi51NC5kZHBmUGl4ZWxGb3JtYXQsIFdJTkVEM0RGTVRfRDE1UzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERCgmZGVzYzIudTQuZGRwZlBpeGVsRm9ybWF0LCBXSU5FRDNERk1UX0QxNik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0REKCZkZXNjMi51NC5kZHBmUGl4ZWxGb3JtYXQsIFdJTkVEM0RGTVRfRDI0WDgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERCgmZGVzYzIudTQuZGRwZlBpeGVsRm9ybWF0LCBXSU5FRDNERk1UX0QzMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBaIGJ1ZmZlciBiaXQgZGVwdGhcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoJmRlc2MyLnU0LmRkcGZQaXhlbEZvcm1hdCwgTW9kZS5Gb3JtYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm8gV2lkdGggb3Igbm8gSGVpZ2h0PyBVc2UgdGhlIGN1cnJlbnQgd2luZG93IHNpemUgb3IKKyAgICAgKiB0aGUgb3JpZ2luYWwgc2NyZWVuIHNpemUKKyAgICAgKi8KKyAgICBpZighKGRlc2MyLmR3RmxhZ3MgJiBERFNEX1dJRFRIKSB8fAorICAgICAgICEoZGVzYzIuZHdGbGFncyAmIEREU0RfSEVJR0hUKSApCisgICAgeworICAgICAgICBIV05EIHdpbmRvdzsKKworICAgICAgICAvKiBGYWxsYmFjazogRnJvbSBXaW5lRDNEIC8gb3JpZ2luYWwgbW9kZSAqLworICAgICAgICBkZXNjMi5kd0ZsYWdzIHw9IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKKyAgICAgICAgZGVzYzIuZHdXaWR0aCA9IE1vZGUuV2lkdGg7CisgICAgICAgIGRlc2MyLmR3SGVpZ2h0ID0gTW9kZS5IZWlnaHQ7CisKKyAgICAgICAgaHIgPSBJV2luZUQzRERldmljZV9HZXRIV05EKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93KTsKKyAgICAgICAgaWYoIChociA9PSBEM0RfT0spICYmICh3aW5kb3cgIT0gMCkgKQorICAgICAgICB7CisgICAgICAgICAgICBSRUNUIHJlY3Q7CisgICAgICAgICAgICBpZihHZXRXaW5kb3dSZWN0KHdpbmRvdywgJnJlY3QpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGEgaGFjayB1bnRpbCBJIGZpbmQgYSBiZXR0ZXIgc29sdXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiggKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpIDw9IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApIDw9IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRklYTUUoIldhbnRlZCB0byBnZXQgc3VyZmFjZSBkaW1lbnNpb25zIGZyb20gd2luZG93ICVwLCBidXQgaXQgaGFzIG9ubHkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaXplIG9mICVsZHglbGQuIFVzaW5nIGZ1bGwgc2NyZWVuIGRpbWVuc2lvbnNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3csIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3ApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVzYzIuZHdXaWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CisgICAgICAgICAgICAgICAgICAgIGRlc2MyLmR3SGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIlVzaW5nIHdpbmRvdyAlcCdzIGRpbWVuc2lvbnM6ICVsZHglbGRcbiIsIHdpbmRvdywgZGVzYzIuZHdXaWR0aCwgZGVzYzIuZHdIZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE1pcG1hcCBjb3VudCBmaXhlcyAqLworICAgIGlmKGRlc2MyLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCisgICAgeworICAgICAgICBpZihkZXNjMi5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfQ09NUExFWCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoZGVzYzIuZHdGbGFncyAmIEREU0RfTUlQTUFQQ09VTlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTWlwbWFwIGNvdW50IGlzIGdpdmVuLCBub3RoaW5nIHRvIGRvICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVW5kb2N1bWVudGVkIGZlYXR1cmU6IENyZWF0ZSBzdWJsZXZlbHMgdW50aWwKKyAgICAgICAgICAgICAgICAgKiBlaWdodGVyIHRoZSB3aWR0aCBvciB0aGUgaGVpZ2h0IGlzIDEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBEV09SRCBtaW4gPSBkZXNjMi5kd1dpZHRoIDwgZGVzYzIuZHdIZWlnaHQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MyLmR3V2lkdGggOiBkZXNjMi5kd0hlaWdodDsKKyAgICAgICAgICAgICAgICBkZXNjMi51Mi5kd01pcE1hcENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSggbWluICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MyLnUyLmR3TWlwTWFwQ291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgbWluID4+PSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vdC1jb21wbGV4IG1pcG1hcCAtPiBNaXBtYXBjb3VudCA9IDEgKi8KKyAgICAgICAgICAgIGRlc2MyLnUyLmR3TWlwTWFwQ291bnQgPSAxOworICAgICAgICB9CisgICAgICAgIGV4dHJhX3N1cmZhY2VzID0gZGVzYzIudTIuZHdNaXBNYXBDb3VudCAtIDE7CisKKyAgICAgICAgLyogVGhlcmUncyBhIG1pcG1hcCBjb3VudCBpbiB0aGUgY3JlYXRlZCBzdXJmYWNlIGluIGFueSBjYXNlICovCisgICAgICAgIGRlc2MyLmR3RmxhZ3MgfD0gRERTRF9NSVBNQVBDT1VOVDsKKyAgICB9CisgICAgLyogSWYgbm8gbWlwbWFwIGlzIGdpdmVuLCB0aGUgdGV4dHVyZSBoYXMgb25seSBvbmUgbGV2ZWwgKi8KKworICAgIC8qIFRoZSBmaXJzdCBzdXJmYWNlIGlzIGEgZnJvbnQgYnVmZmVyLCB0aGUgYmFjayBidWZmZXIgaXMgY3JlYXRlZCBhZnRlcndhcmRzICovCisgICAgaWYoIChkZXNjMi5kd0ZsYWdzICYgRERTRF9DQVBTKSAmJiAoZGVzYzIuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKSApCisgICAgeworICAgICAgICBkZXNjMi5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX0ZST05UQlVGRkVSOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0aGUgZmlyc3Qgc3VyZmFjZSAqLworICAgIGhyID0gSURpcmVjdERyYXdJbXBsX0NyZWF0ZU5ld1N1cmZhY2UoVGhpcywgJmRlc2MyLCAmb2JqZWN0LCAwKTsKKyAgICBpZiggaHIgIT0gRERfT0spCisgICAgeworICAgICAgICBFUlIoIklEaXJlY3REcmF3SW1wbF9DcmVhdGVOZXdTdXJmYWNlIGZhaWxlZCB3aXRoICUwOGx4XG4iLCBocik7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisKKyAgICAqU3VyZiA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdERyYXdTdXJmYWNlNyk7CisKKyAgICAvKiBDcmVhdGUgQWRkaXRpb25hbCBzdXJmYWNlcyBpZiBuZWNlc3NhcnkKKyAgICAgKiBUaGlzIGFwcGxpZXMgdG8gUHJpbWFyeSBzdXJmYWNlcyB3aGljaCBoYXZlIGEgYmFjayBidWZmZXIgY291bnQKKyAgICAgKiBzZXQsIGJ1dCBub3QgdG8gbWlwbWFwIHRleHR1cmVzLiBJbiBjYXNlIG9mIE1pcG1hcCB0ZXh0dXJlcywKKyAgICAgKiB3aW5lRDNEIHRha2VzIGNhcmUgb2YgdGhlIGNyZWF0aW9uIG9mIGFkZGl0aW9uYWwgc3VyZmFjZXMKKyAgICAgKi8KKyAgICBpZihERFNELT5kd0ZsYWdzICYgRERTRF9CQUNLQlVGRkVSQ09VTlQpCisgICAgeworICAgICAgICBleHRyYV9zdXJmYWNlcyA9IEREU0QtPmR3QmFja0J1ZmZlckNvdW50OworICAgICAgICBkZXNjMi5kZHNDYXBzLmR3Q2FwcyAmPSB+RERTQ0FQU19GUk9OVEJVRkZFUjsgLyogSXQncyBub3QgYSBmcm9udCBidWZmZXIgKi8KKyAgICAgICAgZGVzYzIuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19CQUNLQlVGRkVSOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IGV4dHJhX3N1cmZhY2VzOyBpKyspCisgICAgeworICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpvYmplY3QyID0gTlVMTDsKKyAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqaXRlcmF0b3I7CisKKyAgICAgICAgLyogaW5jcmVhc2UgdGhlIG1pcG1hcCBsZXZlbCwgYnV0IG9ubHkgaWYgYSBtaXBtYXAgaXMgY3JlYXRlZAorICAgICAgICAgKiBJbiB0aGlzIGNhc2UsIGFsc28gaGFsZiB0aGUgc2l6ZQorICAgICAgICAgKi8KKyAgICAgICAgaWYoRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgIGRlc2MyLmR3V2lkdGggLz0gMjsKKyAgICAgICAgICAgIGRlc2MyLmR3SGVpZ2h0IC89IDI7CisgICAgICAgIH0KKworICAgICAgICBociA9IElEaXJlY3REcmF3SW1wbF9DcmVhdGVOZXdTdXJmYWNlKFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKKyAgICAgICAgaWYoaHIgIT0gRERfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMgZGVzdHJveXMgYW5kIHBvc3NpYmx5IGNyZWF0ZWQgc3VyZmFjZXMgdG9vICovCisgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZSggSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0RHJhd1N1cmZhY2U3KSApOworICAgICAgICAgICAgcmV0dXJuIGhyOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkIHRoZSBuZXcgc3VyZmFjZSB0byB0aGUgY29tcGxleCBhdHRhY2htZW50IGxpc3QgKi8KKyAgICAgICAgb2JqZWN0Mi0+Zmlyc3RfY29tcGxleCA9IG9iamVjdDsKKyAgICAgICAgb2JqZWN0Mi0+bmV4dF9jb21wbGV4ID0gTlVMTDsKKyAgICAgICAgaXRlcmF0b3IgPSBvYmplY3Q7CisgICAgICAgIHdoaWxlKGl0ZXJhdG9yLT5uZXh0X2NvbXBsZXgpIGl0ZXJhdG9yID0gaXRlcmF0b3ItPm5leHRfY29tcGxleDsKKyAgICAgICAgaXRlcmF0b3ItPm5leHRfY29tcGxleCA9IG9iamVjdDI7CisKKyAgICAgICAgLyogUmVtb3ZlIHRoZSAocG9zc2libGUpIGJhY2sgYnVmZmVyIGNhcCBmcm9tIHRoZSBuZXcgc3VyZmFjZSBkZXNjcmlwdGlvbiwKKyAgICAgICAgICogYmVjYXVzZSBvbmx5IG9uZSBzdXJmYWNlIGluIHRoZSBmbGlwcGluZyBjaGFpbiBpcyBhIGJhY2sgYnVmZmVyLCBvbmUKKyAgICAgICAgICogaXMgYSBmcm9udCBidWZmZXIsIHRoZSBvdGhlcnMgYXJlIGp1c3QgcHJpbWFyeSBzdXJmYWNlcy4KKyAgICAgICAgICovCisgICAgICAgIGRlc2MyLmRkc0NhcHMuZHdDYXBzICY9IH5ERFNDQVBTX0JBQ0tCVUZGRVI7CisgICAgfQorCisgICAgLyogQWRkcmVmIHRoZSBkZHJhdyBpbnRlcmZhY2UgdG8ga2VlcCBhbiByZWZlcmVuY2UgZm9yIGVhY2ggc3VyZmFjZSAqLworICAgIElEaXJlY3REcmF3N19BZGRSZWYoaWZhY2UpOworCisgICAgLyogSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIE9wZW5HTCBhbmQgdGhlcmUncyBubyBkM2RkZXZpY2UsIGF0dGFjaCBhIGQzZGRldmljZQorICAgICAqIEJ1dCBhdHRhY2ggdGhlIGQzZGRldmljZSBvbmx5IGlmIHRoZSBjdXJyZW50bHkgY3JlYXRlZCBzdXJmYWNlIHdhcworICAgICAqIGEgcHJpbWFyeSBzdXJmYWNlKDJEIGFwcCBpbiAzRCBtb2RlKSBvciBhIDNEREVWSUNFIHN1cmZhY2UoM0QgYXBwKQorICAgICAqIFRoZSBvbmx5IGNhc2UgSSBjYW4gdGhpbmsgb2Ygd2hlcmUgdGhpcyBkb2Vzbid0IGFwcGx5IGlzIHdoZW4gYQorICAgICAqIDJEIGFwcCB3YXMgY29uZmlndXJlZCBieSB0aGUgdXNlciB0byBydW4gd2l0aCBPcGVuR0wgYW5kIGl0IGRpZG4ndCBjcmVhdGUKKyAgICAgKiB0aGUgcmVuZGVyIHRhcmdldCBhcyBmaXJzdCBzdXJmYWNlLiBJbiB0aGlzIGNhc2UgdGhlIHJlbmRlciB0YXJnZXQgY3JlYXRpb24KKyAgICAgKiB3aWxsIGNhdXNlIHRoZSAzRCBpbml0LgorICAgICAqLworICAgIGlmKCAoVGhpcy0+SW1wbFR5cGUgPT0gU1VSRkFDRV9PUEVOR0wpICYmICEoVGhpcy0+ZDNkX2luaXRpYWxpemVkKSAmJgorICAgICAgICBkZXNjMi5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX1BSSU1BUllTVVJGQUNFIHwgRERTQ0FQU18zRERFVklDRSkgKQorICAgIHsKKyAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdGFyZ2V0ID0gVGhpcy0+c3VyZmFjZV9saXN0OworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgdGhlIHByaW1hcnkgdG8gdXNlIGFzIHJlbmRlciB0YXJnZXQgKi8KKyAgICAgICAgd2hpbGUodGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICBpZih0YXJnZXQtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZm91bmQgKi8KKyAgICAgICAgICAgICAgICBUUkFDRSgiVXNpbmcgcHJpbWFyeSAlcCBhcyByZW5kZXIgdGFyZ2V0XG4iLCB0YXJnZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LT5uZXh0OworICAgICAgICB9CisgICAgICAgIC8qIElmIGl0J3Mgbm90IGZvdW5kLCB1c2UgdGhlIGp1c3QgY3JlYXRlZCBERFNDQVBTXzNEREVWSUNFIHN1cmZhY2UgKi8KKyAgICAgICAgaWYoIXRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgdGFyZ2V0ID0gb2JqZWN0OworICAgICAgICB9CisKKyAgICAgICAgVFJBQ0UoIiglcCkgQXR0YWNoaW5nIGEgRDNERGV2aWNlLCByZW5kZXJ0YXJnZXQgPSAlcFxuIiwgVGhpcywgdGFyZ2V0KTsKKyAgICAgICAgaHIgPSBJRGlyZWN0RHJhd0ltcGxfQXR0YWNoRDNERGV2aWNlKFRoaXMsIHRhcmdldC0+Zmlyc3RfY29tcGxleCk7CisgICAgICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgRVJSKCJJRGlyZWN0RHJhd0ltcGxfQXR0YWNoRDNERGV2aWNlIGZhaWxlZCwgaHIgPSAlbHhcbiIsIGhyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENyZWF0ZSBhIFdpbmVEM0RUZXh0dXJlIGlmIGEgdGV4dHVyZSB3YXMgcmVxdWVzdGVkICovCisgICAgaWYoRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1RFWFRVUkUpCisgICAgeworICAgICAgICBVSU5UIGxldmVsczsKKyAgICAgICAgV0lORUQzREZPUk1BVCBGb3JtYXQ7CisgICAgICAgIFdJTkVEM0RQT09MIFBvb2wgPSBXSU5FRDNEUE9PTF9ERUZBVUxUOworCisgICAgICAgIFRoaXMtPnRleF9yb290ID0gb2JqZWN0OworCisgICAgICAgIGlmKGRlc2MyLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGEgbWlwbWFwIGlzIGNyZWF0ZWQsIGNyZWF0ZSBlbm91Z2h0IGxldmVscyAqLworICAgICAgICAgICAgbGV2ZWxzID0gZGVzYzIudTIuZHdNaXBNYXBDb3VudDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vIG1pcG1hcCBpcyBjcmVhdGVkLCBjcmVhdGUgb25lIGxldmVsICovCisgICAgICAgICAgICBsZXZlbHMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogRERTQ0FQU19TWVNURU1NRU1PUlkgdGV4dHVyZXMgYXJlIGluIFdJTkVEM0RQT09MX1NZU1RFTU1FTSAqLworICAgICAgICBpZihERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfU1lTVEVNTUVNT1JZKQorICAgICAgICB7CisgICAgICAgICAgICBQb29sID0gV0lORUQzRFBPT0xfU1lTVEVNTUVNOworICAgICAgICB9CisgICAgICAgIC8qIFNob3VsZCBJIGZvcndhcmQgdGhlIE1BTkVHRUQgY2FwIHRvIHRoZSBtYW5hZ2VkIHBvb2wgPyAqLworCisgICAgICAgIC8qIEdldCB0aGUgZm9ybWF0LiBJdCdzIHNldCBhbHJlYWR5IGJ5IENyZWF0ZU5ld1N1cmZhY2UgKi8KKyAgICAgICAgRm9ybWF0ID0gUGl4ZWxGb3JtYXRfREQyV2luZUQzRCgmb2JqZWN0LT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0KTsKKworICAgICAgICAvKiBUaGUgc3VyZmFjZXMgYXJlIGFscmVhZHkgY3JlYXRlZCwgdGhlIGNhbGxiYWNrIG9ubHkKKyAgICAgICAgICogcGFzc2VzIHRoZSBJV2luZUQzRFN1cmZhY2UgdG8gV2luZUQzRAorICAgICAgICAgKi8KKyAgICAgICAgaHIgPSBJV2luZUQzRERldmljZV9DcmVhdGVUZXh0dXJlKCBUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0QtPmR3V2lkdGgsIEREU0QtPmR3SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscywgLyogTWlwTWFwQ291bnQgPSBMZXZlbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiB1c2FnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3QtPndpbmVEM0RUZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIFNoYXJlZEhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVW5rbm93biAqKSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3REcmF3U3VyZmFjZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRDdDQl9DcmVhdGVTdXJmYWNlICk7CisgICAgICAgIFRoaXMtPnRleF9yb290ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gaHI7Cit9CisKKyNkZWZpbmUgRERFTlVNU1VSRkFDRVNfU0VBUkNIVFlQRSAoRERFTlVNU1VSRkFDRVNfQ0FOQkVDUkVBVEVEfERERU5VTVNVUkZBQ0VTX0RPRVNFWElTVCkKKyNkZWZpbmUgRERFTlVNU1VSRkFDRVNfTUFUQ0hUWVBFIChEREVOVU1TVVJGQUNFU19BTEx8RERFTlVNU1VSRkFDRVNfTUFUQ0h8RERFTlVNU1VSRkFDRVNfTk9NQVRDSCkKKworc3RhdGljIEJPT0wKK01haW5fRGlyZWN0RHJhd19ERFBJWEVMRk9STUFUX01hdGNoKGNvbnN0IEREUElYRUxGT1JNQVQgKnJlcXVlc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEREUElYRUxGT1JNQVQgKnByb3ZpZGVkKQoreworICAgIC8qIFNvbWUgZmxhZ3MgbXVzdCBiZSBwcmVzZW50IGluIGJvdGggb3IgbmVpdGhlciBmb3IgYSBtYXRjaC4gKi8KKyAgICBzdGF0aWMgY29uc3QgRFdPUkQgbXVzdF9tYXRjaCA9IEREUEZfUEFMRVRURUlOREVYRUQxIHwgRERQRl9QQUxFVFRFSU5ERVhFRDIKKyAgICAgICAgfCBERFBGX1BBTEVUVEVJTkRFWEVENCB8IEREUEZfUEFMRVRURUlOREVYRUQ4IHwgRERQRl9GT1VSQ0MKKyAgICAgICAgfCBERFBGX1pCVUZGRVIgfCBERFBGX1NURU5DSUxCVUZGRVI7CisKKyAgICBpZiAoKHJlcXVlc3RlZC0+ZHdGbGFncyAmIHByb3ZpZGVkLT5kd0ZsYWdzKSAhPSByZXF1ZXN0ZWQtPmR3RmxhZ3MpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmICgocmVxdWVzdGVkLT5kd0ZsYWdzICYgbXVzdF9tYXRjaCkgIT0gKHByb3ZpZGVkLT5kd0ZsYWdzICYgbXVzdF9tYXRjaCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykKKyAgICAgICAgaWYgKHJlcXVlc3RlZC0+ZHdGb3VyQ0MgIT0gcHJvdmlkZWQtPmR3Rm91ckNDKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIChERFBGX1JHQnxERFBGX1lVVnxERFBGX1pCVUZGRVJ8RERQRl9BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfEREUEZfTFVNSU5BTkNFfEREUEZfQlVNUERVRFYpKQorICAgICAgICBpZiAocmVxdWVzdGVkLT51MS5kd1JHQkJpdENvdW50ICE9IHByb3ZpZGVkLT51MS5kd1JHQkJpdENvdW50KQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIChERFBGX1JHQnxERFBGX1lVVnxERFBGX1NURU5DSUxCVUZGRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxERFBGX0xVTUlOQU5DRXxERFBGX0JVTVBEVURWKSkKKyAgICAgICAgaWYgKHJlcXVlc3RlZC0+dTIuZHdSQml0TWFzayAhPSBwcm92aWRlZC0+dTIuZHdSQml0TWFzaykKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiAoRERQRl9SR0J8RERQRl9ZVVZ8RERQRl9aQlVGRkVSfEREUEZfQlVNUERVRFYpKQorICAgICAgICBpZiAocmVxdWVzdGVkLT51My5kd0dCaXRNYXNrICE9IHByb3ZpZGVkLT51My5kd0dCaXRNYXNrKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgLyogSSBjb3VsZCBiZSB3cm9uZyBhYm91dCB0aGUgYnVtcG1hcHBpbmcuIE1TRE4gZG9jcyBhcmUgdmFndWUuICovCisgICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIChERFBGX1JHQnxERFBGX1lVVnxERFBGX1NURU5DSUxCVUZGRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxERFBGX0JVTVBEVURWKSkKKyAgICAgICAgaWYgKHJlcXVlc3RlZC0+dTQuZHdCQml0TWFzayAhPSBwcm92aWRlZC0+dTQuZHdCQml0TWFzaykKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiAoRERQRl9BTFBIQVBJWEVMU3xERFBGX1pQSVhFTFMpKQorICAgICAgICBpZiAocmVxdWVzdGVkLT51NS5kd1JHQkFscGhhQml0TWFzayAhPSBwcm92aWRlZC0+dTUuZHdSR0JBbHBoYUJpdE1hc2spCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wKK0lEaXJlY3REcmF3SW1wbF9ERFNEX01hdGNoKGNvbnN0IEREU1VSRkFDRURFU0MyKiByZXF1ZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcHJvdmlkZWQpCit7CisgICAgc3RydWN0IGNvbXBhcmVfaW5mbworICAgIHsKKyAgICAgICAgRFdPUkQgZmxhZzsKKyAgICAgICAgcHRyZGlmZl90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgfTsKKworI2RlZmluZSBDTVAoRkxBRywgRklFTEQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgRERTRF8jI0ZMQUcsIG9mZnNldG9mKEREU1VSRkFDRURFU0MyLCBGSUVMRCksIFwKKyAgICAgICAgICBzaXplb2YoKChERFNVUkZBQ0VERVNDMiAqKShOVUxMKSktPkZJRUxEKSB9CisKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBhcmVfaW5mbyBjb21wYXJlW10gPQorICAgIHsKKyAgICAgICAgQ01QKEFMUEhBQklUREVQVEgsIGR3QWxwaGFCaXREZXB0aCksCisgICAgICAgIENNUChCQUNLQlVGRkVSQ09VTlQsIGR3QmFja0J1ZmZlckNvdW50KSwKKyAgICAgICAgQ01QKENBUFMsIGRkc0NhcHMpLAorICAgICAgICBDTVAoQ0tERVNUQkxULCBkZGNrQ0tEZXN0Qmx0KSwKKyAgICAgICAgQ01QKENLREVTVE9WRVJMQVksIHUzIC8qIGRkY2tDS0Rlc3RPdmVybGF5ICovKSwKKyAgICAgICAgQ01QKENLU1JDQkxULCBkZGNrQ0tTcmNCbHQpLAorICAgICAgICBDTVAoQ0tTUkNPVkVSTEFZLCBkZGNrQ0tTcmNPdmVybGF5KSwKKyAgICAgICAgQ01QKEhFSUdIVCwgZHdIZWlnaHQpLAorICAgICAgICBDTVAoTElORUFSU0laRSwgdTEgLyogZHdMaW5lYXJTaXplICovKSwKKyAgICAgICAgQ01QKExQU1VSRkFDRSwgbHBTdXJmYWNlKSwKKyAgICAgICAgQ01QKE1JUE1BUENPVU5ULCB1MiAvKiBkd01pcE1hcENvdW50ICovKSwKKyAgICAgICAgQ01QKFBJVENILCB1MSAvKiBsUGl0Y2ggKi8pLAorICAgICAgICAvKiBQSVhFTEZPUk1BVDogbWFudWFsICovCisgICAgICAgIENNUChSRUZSRVNIUkFURSwgdTIgLyogZHdSZWZyZXNoUmF0ZSAqLyksCisgICAgICAgIENNUChURVhUVVJFU1RBR0UsIGR3VGV4dHVyZVN0YWdlKSwKKyAgICAgICAgQ01QKFdJRFRILCBkd1dpZHRoKSwKKyAgICAgICAgLyogWkJVRkZFUkJJVERFUFRIOiAib2Jzb2xldGUiICovCisgICAgfTsKKworI3VuZGVmIENNUAorCisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBpZiAoKHJlcXVlc3RlZC0+ZHdGbGFncyAmIHByb3ZpZGVkLT5kd0ZsYWdzKSAhPSByZXF1ZXN0ZWQtPmR3RmxhZ3MpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKGNvbXBhcmUpL3NpemVvZihjb21wYXJlWzBdKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIGNvbXBhcmVbaV0uZmxhZworICAgICAgICAgICAgJiYgbWVtY21wKChjb25zdCBjaGFyICopcHJvdmlkZWQgKyBjb21wYXJlW2ldLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXJlcXVlc3RlZCArIGNvbXBhcmVbaV0ub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVbaV0uc2l6ZSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAocmVxdWVzdGVkLT5kd0ZsYWdzICYgRERTRF9QSVhFTEZPUk1BVCkKKyAgICB7CisgICAgICAgIGlmICghTWFpbl9EaXJlY3REcmF3X0REUElYRUxGT1JNQVRfTWF0Y2goJnJlcXVlc3RlZC0+dTQuZGRwZlBpeGVsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3ZpZGVkLT51NC5kZHBmUGl4ZWxGb3JtYXQpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisjdW5kZWYgRERFTlVNU1VSRkFDRVNfU0VBUkNIVFlQRQorI3VuZGVmIERERU5VTVNVUkZBQ0VTX01BVENIVFlQRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6RW51bVN1cmZhY2VzCisgKgorICogTG9vcHMgdGhyb3VnaCBhbGwgc3VyZmFjZXMgYXR0YWNoZWQgdG8gdGhpcyBkZXZpY2UgYW5kIGNhbGxzIHRoZQorICogYXBwbGljYXRpb24gY2FsbGJhY2suIFRoaXMgY2FuJ3QgYmUgcmVsYXllZCB0byBXaW5lRDNERGV2aWNlLAorICogYmVjYXVzZSBzb21lIFdpbmVEM0RTdXJmYWNlcycgcGFyZW50cyBhcmUgSVBhcmVudCBvYmplY3RzCisgKgorICogUGFyYW1zOgorICogIEZsYWdzOiBTb21lIGZpbHRlcmluZyBmbGFncy4gU2VlIElEaXJlY3REcmF3SW1wbF9FbnVtU3VyZmFjZXNDYWxsYmFjaworICogIEREU0Q6IERlc2NyaXB0aW9uIHRvIGZpbHRlciBmb3IKKyAqICBDb250ZXh0OiBBcHBsaWNhdGlvbi1wcm92aWRlZCBwb2ludGVyLCBpdCdzIHBhc3NlZCB1bm1vZGlmaWVkIHRvIHRoZQorICogICAgICAgICAgIENhbGxiYWNrIGZ1bmN0aW9uCisgKiAgQ2FsbGJhY2s6IEFkZHJlc3MgdG8gY2FsbCBmb3IgZWFjaCBzdXJmYWNlCisgKgorICogUmV0dXJuczoKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgKiAgRERfT0sgb24gc3VjY2VzcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0VudW1TdXJmYWNlcyhJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKkREU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgQ2FsbGJhY2spCit7CisgICAgLyogVGhlIHN1cmZhY2UgZW51bWVyYXRpb24gaXMgaGFuZGxlZCBieSBXaW5lRERyYXcsCisgICAgICogYmVjYXVzZSBpdCBrZWVwcyB0cmFjayBvZiBhbGwgc3VyZmFjZXMgYXR0YWNoZWQgdG8KKyAgICAgKiBpdC4gVGhlIGZpbHRlcmluZyBpcyBkb25lIGJ5IG91ciBjYWxsYmFjayBmdW5jdGlvbiwKKyAgICAgKiBiZWNhdXNlIFdpbmVERHJhdyBkb2Vzbid0IGhhbmRsZSBkZHJhdy1saWtlIHN1cmZhY2UKKyAgICAgKiBjYXBzIHN0cnVjdHVyZXMKKyAgICAgKi8KKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmY7CisgICAgQk9PTCBhbGwsIG5vbWF0Y2g7CisgICAgRERTVVJGQUNFREVTQzIgZGVzYzsKKworICAgIGFsbCA9IEZsYWdzICYgRERFTlVNU1VSRkFDRVNfQUxMOworICAgIG5vbWF0Y2ggPSBGbGFncyAmIERERU5VTVNVUkZBQ0VTX05PTUFUQ0g7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVseCwlcCwlcCwlcClcbiIsIFRoaXMsIEZsYWdzLCBERFNELCBDb250ZXh0LCBDYWxsYmFjayk7CisKKyAgICBpZighQ2FsbGJhY2spCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgZm9yKHN1cmYgPSBUaGlzLT5zdXJmYWNlX2xpc3Q7IHN1cmY7IHN1cmYgPSBzdXJmLT5uZXh0KQorICAgIHsKKyAgICAgICAgaWYgKGFsbCB8fCAobm9tYXRjaCAhPSBJRGlyZWN0RHJhd0ltcGxfRERTRF9NYXRjaChERFNELCAmc3VyZi0+c3VyZmFjZV9kZXNjKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc2MgPSBzdXJmLT5zdXJmYWNlX2Rlc2M7CisgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShzdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7CisgICAgICAgICAgICBpZihDYWxsYmFjayggSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNyksICZkZXNjLCBDb250ZXh0KSAhPSBEREVOVU1SRVRfT0spCisgICAgICAgICAgICAgICAgcmV0dXJuIEREX09LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEM0Q3Q0JfQ3JlYXRlUmVuZGVyVGFyZ2V0CisgKgorICogQ2FsbGJhY2sgY2FsbGVkIGJ5IFdpbmVEM0QgdG8gY3JlYXRlIFN1cmZhY2VzIGZvciByZW5kZXIgdGFyZ2V0IHVzYWdlCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBEM0QgdGFyZ2V0IGZyb20gdGhlIElEaXJlY3REcmF3SW1wbCBzdHJ1Y3R1cmUsCisgKiBhbmQgcmV0dXJucyB0aGUgV2luZUQzRFN1cmZhY2UuIFRvIGF2b2lkIGRvdWJsZSB1c2FnZSwgdGhlIHN1cmZhY2UKKyAqIGlzIG1hcmtlZCBhcyByZW5kZXIgdGFyZ2V0IGFmdGVyd2FyZHMKKyAqCisgKiBQYXJhbXMKKyAqICBkZXZpY2U6IFRoZSBXaW5lRDNERGV2aWNlJ3MgcGFyZW50CisgKiAgV2lkdGgsIEhlaWdodCwgRm9ybWF0OiBEaW1lc2lvbnMgYW5kIHBpeGVsZm9ybWF0IG9mIHRoZSByZW5kZXIgdGFyZ2V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkLCBiZWNhdXNlIHRoZSBzdXJmYWNlIGFscmVhZHkgZXhpc3RzCisgKiAgTXVsdGlTYW1wbGUsIE11bHRpc2FtcGxlUXVhbGl0eSwgTG9ja2FibGU6IElnbm9yZWQgZm9yIHRoZSBzYW1lIHJlYXNvbgorICogIExvY2thYmxlOiBpZ25vcmVkCisgKiAgcHBTdXJmYWNlOiBBZGRyZXNzIHRvIHBhc3MgdGhlIHN1cmZhY2UgcG9pbnRlciBiYWNrIGF0CisgKiAgcFNoYXJlZEhhbmRsZTogSWdub3JlZAorICoKKyAqIFJldHVybnM6CisgKiAgQWx3YXlzIHJldHVybnMgRDNEX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitEM0Q3Q0JfQ3JlYXRlUmVuZGVyVGFyZ2V0KElVbmtub3duICpkZXZpY2UsIFVJTlQgV2lkdGgsIFVJTlQgSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRE1VTFRJU0FNUExFX1RZUEUgTXVsdGlTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIE11bHRpc2FtcGxlUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBMb2NrYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlKiogcHBTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEUqIHBTaGFyZWRIYW5kbGUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdzcsIGRldmljZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqZDNkU3VyZmFjZSA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopIFRoaXMtPmQzZF90YXJnZXQtPmZpcnN0X2NvbXBsZXg7CisgICAgVFJBQ0UoIiglcCkgY2FsbCBiYWNrXG4iLCBkZXZpY2UpOworCisgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBjb21wbGV4IGNoYWluIGFuZCB0cnkgdG8gZmluZCB1bnVzZWQgcHJpbWFyeSBzdXJmYWNlcyAqLworICAgIHdoaWxlKGQzZFN1cmZhY2UtPmlzUmVuZGVyVGFyZ2V0KQorICAgIHsKKyAgICAgICAgZDNkU3VyZmFjZSA9IGQzZFN1cmZhY2UtPm5leHRfY29tcGxleDsKKyAgICAgICAgaWYoIWQzZFN1cmZhY2UpIGJyZWFrOworICAgIH0KKyAgICBpZighZDNkU3VyZmFjZSkKKyAgICB7CisgICAgICAgIGQzZFN1cmZhY2UgPSBUaGlzLT5kM2RfdGFyZ2V0OworICAgICAgICBFUlIoIiAoJXApIDogTm8gRGlyZWN0RHJhd1N1cmZhY2UgZm91bmQgdG8gY3JlYXRlIHRoZSBiYWNrIGJ1ZmZlci4gVXNpbmcgdGhlIGZyb250IGJ1ZmZlciBhcyBiYWNrIGJ1ZmZlci4gVW5jZXJ0YWluIGNvbnNlcXVlbmNlc1xuIiwgVGhpcyk7CisgICAgfQorCisgICAgLyogVE9ETzogUmV0dXJuIGZhaWx1cmUgaWYgdGhlIGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLCBidXQgdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisKKyAgICAqcHBTdXJmYWNlID0gZDNkU3VyZmFjZS0+V2luZUQzRFN1cmZhY2U7CisgICAgZDNkU3VyZmFjZS0+aXNSZW5kZXJUYXJnZXQgPSBUUlVFOworICAgIFRSQUNFKCJSZXR1cm5pbmcgd2luZUQzRFN1cmZhY2UgJXAsIGl0IGJlbG9uZ3MgdG8gc3VyZmFjZSAlcFxuIiwgKnBwU3VyZmFjZSwgZDNkU3VyZmFjZSk7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitEM0Q3Q0JfQ3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZShJVW5rbm93biAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNETVVMVElTQU1QTEVfVFlQRSBNdWx0aVNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIE11bHRpc2FtcGxlUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgRGlzY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZSoqIHBwU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSogcFNoYXJlZEhhbmRsZSkKK3sKKyAgICAvKiBDcmVhdGUgYSBEZXB0aCBTdGVuY2lsIHN1cmZhY2UgdG8gbWFrZSBXaW5lRDNEIGhhcHB5ICovCisgICAgSFJFU1VMVCBociA9IEQzRF9PSzsKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgZGV2aWNlKTsKKyAgICBERFNVUkZBQ0VERVNDMiBkZHNkOworCisgICAgVFJBQ0UoIiglcCkgY2FsbCBiYWNrXG4iLCBkZXZpY2UpOworCisgICAgKnBwU3VyZmFjZSA9IE5VTEw7CisKKyAgICAvKiBDcmVhdGUgYSBEaXJlY3REcmF3IHN1cmZhY2UgKi8KKyAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CisgICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CisgICAgZGRzZC51NC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKEREUElYRUxGT1JNQVQpOworICAgIGRkc2QuZHdGbGFncyA9IEREU0RfUElYRUxGT1JNQVQgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQgfCBERFNEX0NBUFM7CisgICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfT0ZGU0NSRUVOUExBSU47CisgICAgZGRzZC5kd0hlaWdodCA9IEhlaWdodDsKKyAgICBkZHNkLmR3V2lkdGggPSBXaWR0aDsKKyAgICBpZihGb3JtYXQgIT0gMCkKKyAgICB7CisgICAgICBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERCgmZGRzZC51NC5kZHBmUGl4ZWxGb3JtYXQsIEZvcm1hdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBkZHNkLmR3RmxhZ3MgXj0gRERTRF9QSVhFTEZPUk1BVDsKKyAgICB9CisKKyAgICBUaGlzLT5kZXB0aHN0ZW5jaWwgPSBUUlVFOworICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoKElEaXJlY3REcmF3NyAqKSBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdERyYXdTdXJmYWNlNyAqKikgJlRoaXMtPkRlcHRoU3RlbmNpbEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIFRoaXMtPmRlcHRoc3RlbmNpbCA9IEZBTFNFOworICAgIGlmKEZBSUxFRChocikpCisgICAgeworICAgICAgICBFUlIoIiAoJXApIENyZWF0aW5nIGEgRGVwdGhTdGVuY2lsIFN1cmZhY2UgZmFpbGVkLCByZXN1bHQgPSAlbHhcbiIsIFRoaXMsIGhyKTsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKyAgICAqcHBTdXJmYWNlID0gVGhpcy0+RGVwdGhTdGVuY2lsQnVmZmVyLT5XaW5lRDNEU3VyZmFjZTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEQzRDdDQl9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluCisgKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFdpbmVEM0Qgd2hpY2ggY3JlYXRlcyBhIG5ldyBXaW5lRDNEU3dhcGNoYWluCisgKiBpbnRlcmZhY2UuIEl0IGFsc28gY3JlYXRlcyBhIElQYXJlbnQgaW50ZXJmYWNlIHRvIHN0b3JlIHRoYXQgcG9pbnRlciwKKyAqIHNvIHRoZSBXaW5lRDNEU3dhcGNoYWluIGhhcyBhIHBhcmVudCBhbmQgY2FuIGJlIHJlbGVhc2VkIHdoZW4gdGhlIEQzRAorICogZGV2aWNlIGlzIGRlc3Ryb3llZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSFJFU1VMVCBXSU5BUEkKK0QzRDdDQl9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKElVbmtub3duICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJFU0VOVF9QQVJBTUVURVJTKiBwUHJlc2VudGF0aW9uUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXaW5lRDNEU3dhcENoYWluICoqIHBwU3dhcENoYWluKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBkZXZpY2UpOworICAgIElQYXJlbnRJbXBsICpvYmplY3QgPSBOVUxMOworICAgIEhSRVNVTFQgcmVzID0gRDNEX09LOworICAgIElXaW5lRDNEU3dhcENoYWluICpzd2FwY2hhaW47CisgICAgVFJBQ0UoIiglcCkgY2FsbCBiYWNrXG4iLCBkZXZpY2UpOworCisgICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksICBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoSVBhcmVudEltcGwpKTsKKyAgICBpZiAoTlVMTCA9PSBvYmplY3QpCisgICAgeworICAgICAgICBGSVhNRSgiQWxsb2NhdGlvbiBvZiBtZW1vcnkgZmFpbGVkXG4iKTsKKyAgICAgICAgKnBwU3dhcENoYWluID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERERVJSX09VVE9GVklERU9NRU1PUlk7CisgICAgfQorCisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElQYXJlbnQsIElQYXJlbnRfVnRibCk7CisgICAgb2JqZWN0LT5yZWYgPSAxOworCisgICAgcmVzID0gSVdpbmVEM0REZXZpY2VfQ3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbihUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXNlbnRhdGlvblBhcmFtZXRlcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN3YXBjaGFpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVVua25vd24qKSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElQYXJlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEN0NCX0NyZWF0ZVJlbmRlclRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRDdDQl9DcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKTsKKyAgICBpZiAocmVzICE9IEQzRF9PSykKKyAgICB7CisgICAgICAgIEZJWE1FKCIoJXApIGNhbGwgdG8gSVdpbmVEM0REZXZpY2VfQ3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbiBmYWlsZWRcbiIsIFRoaXMpOworICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwICwgb2JqZWN0KTsKKyAgICAgICAgKnBwU3dhcENoYWluID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBwU3dhcENoYWluID0gc3dhcGNoYWluOworICAgICAgICBvYmplY3QtPmNoaWxkID0gKElVbmtub3duICopIHN3YXBjaGFpbjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3SW1wbF9BdHRhY2hEM0REZXZpY2UKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgRDNEIGNhcGF0aWJsaXRpZXMgb2YgV2luZUQzRAorICoKKyAqIFBhcmFtczoKKyAqICBwcmltYXJ5OiBUaGUgcHJpbWFyeSBzdXJmYWNlIGZvciBEM0QKKyAqCisgKiBSZXR1cm5zCisgKiAgRERfT0sgb24gc3VjY2VzcywKKyAqICBEREVSUl8qIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0F0dGFjaEQzRERldmljZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnByaW1hcnkpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgQmFja0J1ZmZlckNvdW50ID0gMDsKKyAgICBIV05EICAgICAgICAgICAgICAgICAgd2luZG93OworCisgICAgV0lORUQzRFBSRVNFTlRfUEFSQU1FVEVSUyBsb2NhbFBhcmFtZXRlcnM7CisgICAgQk9PTCBpc1dpbmRvd2VkLCBFbmFibGVBdXRvRGVwdGhTdGVuY2lsOworICAgIFdJTkVEM0RGT1JNQVQgQXV0b0RlcHRoU3RlbmNpbEZvcm1hdDsKKyAgICBXSU5FRDNETVVMVElTQU1QTEVfVFlQRSBNdWx0aVNhbXBsZVR5cGU7CisgICAgV0lORUQzRFNXQVBFRkZFQ1QgIFN3YXBFZmZlY3Q7CisgICAgRFdPUkQgRmxhZ3MsIE11bHRpU2FtcGxlUXVhbGl0eTsKKyAgICBVSU5UIEZ1bGxTY3JlZW5fUmVmcmVzaFJhdGVJbkh6LCBQcmVzZW50YXRpb25JbnRlcnZhbDsKKyAgICBXSU5FRDNERElTUExBWU1PREUgTW9kZTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBwcmltYXJ5KTsKKworICAgIC8qIEdldCB0aGUgd2luZG93ICovCisgICAgaHIgPSBJV2luZUQzRERldmljZV9HZXRIV05EKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3cpOworICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICB7CisgICAgICAgIEVSUigiSVdpbmVEM0REZXZpY2U6OkdldEhXTkQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKworICAgIC8qIElmIHRoZXJlJ3Mgbm8gd2luZG93LCBjcmVhdGUgYSBoaWRkZW4gd2luZG93LiBXaW5lRDNEIG5lZWRzIGl0ICovCisgICAgaWYod2luZG93ID09IDApCisgICAgeworICAgICAgICB3aW5kb3cgPSBDcmVhdGVXaW5kb3dFeEEoMCwgVGhpcy0+Y2xhc3NuYW1lLCAiSGlkZGVuIEQzRCBXaW5kb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfRElTQUJMRUQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgR2V0TW9kdWxlSGFuZGxlQSgwKSwgTlVMTCk7CisKKyAgICAgICAgU2hvd1dpbmRvdyh3aW5kb3csIFNXX0hJREUpOyAgIC8qIEp1c3QgdG8gYmUgc3VyZSAqLworICAgICAgICBXQVJOKCIoJXApIE5vIHdpbmRvdyBmb3IgdGhlIERpcmVjdDNERGV2aWNlLCBjcmVhdGVkIGEgaGlkZGVuIHdpbmRvdy4gSFdORD0lcFxuIiwgVGhpcywgd2luZG93KTsKKyAgICAgICAgVGhpcy0+ZDNkX3dpbmRvdyA9IHdpbmRvdzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVFJBQ0UoIiglcCkgVXNpbmcgZXhpc3Rpbmcgd2luZG93ICVwIGZvciBEaXJlY3QzRCByZW5kZXJpbmdcbiIsIFRoaXMsIHdpbmRvdyk7CisgICAgfQorCisgICAgLyogdXNlIHRoZSBzdXJmYWNlIGRlc2NyaXB0aW9uIGZvciB0aGUgZGV2aWNlIHBhcmFtZXRlcnMsIG5vdCB0aGUKKyAgICAgKiBEZXZpY2Ugc2V0dGluZ3MuIFRoZSBhcHAgbWlnaHQgcmVuZGVyIHRvIGFuIG9mZnNjcmVlbiBzdXJmYWNlCisgICAgICovCisgICAgTW9kZS5XaWR0aCA9IHByaW1hcnktPnN1cmZhY2VfZGVzYy5kd1dpZHRoOworICAgIE1vZGUuSGVpZ2h0ID0gcHJpbWFyeS0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OworICAgIE1vZGUuRm9ybWF0ID0gUGl4ZWxGb3JtYXRfREQyV2luZUQzRCgmcHJpbWFyeS0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdCk7CisKKyAgICBpZihwcmltYXJ5LT5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmIEREU0RfQkFDS0JVRkZFUkNPVU5UKQorICAgIHsKKyAgICAgICAgQmFja0J1ZmZlckNvdW50ID0gcHJpbWFyeS0+c3VyZmFjZV9kZXNjLmR3QmFja0J1ZmZlckNvdW50OworICAgIH0KKworICAgIC8qIFN0b3JlIHRoZSBmdXR1cmUgUmVuZGVyIFRhcmdldCBzdXJmYWNlICovCisgICAgVGhpcy0+ZDNkX3RhcmdldCA9IHByaW1hcnk7CisKKyAgICBpc1dpbmRvd2VkID0gIShUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0ZVTExTQ1JFRU4pOworICAgIEVuYWJsZUF1dG9EZXB0aFN0ZW5jaWwgPSBGQUxTRTsKKyAgICBBdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gV0lORUQzREZNVF9EMTY7CisgICAgTXVsdGlTYW1wbGVUeXBlID0gV0lORUQzRE1VTFRJU0FNUExFX05PTkU7CisgICAgU3dhcEVmZmVjdCA9IFdJTkVEM0RTV0FQRUZGRUNUX0NPUFk7CisgICAgRmxhZ3MgPSAwOworICAgIE11bHRpU2FtcGxlUXVhbGl0eSA9IDA7CisgICAgRnVsbFNjcmVlbl9SZWZyZXNoUmF0ZUluSHogPSBXSU5FRDNEUFJFU0VOVF9SQVRFX0RFRkFVTFQ7IC8qIERlZmF1bHQgcmF0ZTogSXQncyBhbGxyZWFkeSBzZXQgKi8KKyAgICBQcmVzZW50YXRpb25JbnRlcnZhbCA9IFdJTkVEM0RQUkVTRU5UX0lOVEVSVkFMX0RFRkFVTFQ7CisKKyAgICBUUkFDRSgiUGFzc2luZyBtb2RlICVkXG4iLCBNb2RlLkZvcm1hdCk7CisKKyAgICBsb2NhbFBhcmFtZXRlcnMuQmFja0J1ZmZlcldpZHRoICAgICAgICAgICAgICAgID0gJk1vZGUuV2lkdGg7CisgICAgbG9jYWxQYXJhbWV0ZXJzLkJhY2tCdWZmZXJIZWlnaHQgICAgICAgICAgICAgICA9ICZNb2RlLkhlaWdodDsKKyAgICBsb2NhbFBhcmFtZXRlcnMuQmFja0J1ZmZlckZvcm1hdCAgICAgICAgICAgICAgID0gKFdJTkVEM0RGT1JNQVQgKikgJk1vZGUuRm9ybWF0OworICAgIGxvY2FsUGFyYW1ldGVycy5CYWNrQnVmZmVyQ291bnQgICAgICAgICAgICAgICAgPSAoVUlOVCAqKSAmQmFja0J1ZmZlckNvdW50OworICAgIGxvY2FsUGFyYW1ldGVycy5NdWx0aVNhbXBsZVR5cGUgICAgICAgICAgICAgICAgPSAmTXVsdGlTYW1wbGVUeXBlOworICAgIGxvY2FsUGFyYW1ldGVycy5NdWx0aVNhbXBsZVF1YWxpdHkgICAgICAgICAgICAgPSAmTXVsdGlTYW1wbGVRdWFsaXR5OworICAgIGxvY2FsUGFyYW1ldGVycy5Td2FwRWZmZWN0ICAgICAgICAgICAgICAgICAgICAgPSAmU3dhcEVmZmVjdDsKKyAgICBsb2NhbFBhcmFtZXRlcnMuaERldmljZVdpbmRvdyAgICAgICAgICAgICAgICAgID0gJndpbmRvdzsKKyAgICBsb2NhbFBhcmFtZXRlcnMuV2luZG93ZWQgICAgICAgICAgICAgICAgICAgICAgID0gJmlzV2luZG93ZWQ7CisgICAgbG9jYWxQYXJhbWV0ZXJzLkVuYWJsZUF1dG9EZXB0aFN0ZW5jaWwgICAgICAgICA9ICZFbmFibGVBdXRvRGVwdGhTdGVuY2lsOworICAgIGxvY2FsUGFyYW1ldGVycy5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ICAgICAgICAgPSAmQXV0b0RlcHRoU3RlbmNpbEZvcm1hdDsKKyAgICBsb2NhbFBhcmFtZXRlcnMuRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgID0gJkZsYWdzOworICAgIGxvY2FsUGFyYW1ldGVycy5GdWxsU2NyZWVuX1JlZnJlc2hSYXRlSW5IeiAgICAgPSAmRnVsbFNjcmVlbl9SZWZyZXNoUmF0ZUluSHo7CisgICAgbG9jYWxQYXJhbWV0ZXJzLlByZXNlbnRhdGlvbkludGVydmFsICAgICAgICAgICA9ICZQcmVzZW50YXRpb25JbnRlcnZhbDsKKworICAgIC8qIFNldCB0aGlzIE5PVywgb3RoZXJ3aXNlIGNyZWF0aW5nIHRoZSBkZXB0aCBzdGVuY2lsIHN1cmZhY2Ugd2lsbCBjYXVzZSBhbgorICAgICAqIHJlY3Vyc2l2ZSBsb29wIHVudGlsIHJhbSBvciBlbXVsYXRlZCB2aWRlbyBtZW1vcnkgaXMgZnVsbAorICAgICAqLworICAgIFRoaXMtPmQzZF9pbml0aWFsaXplZCA9IFRSVUU7CisKKyAgICBociA9IElXaW5lRDNERGV2aWNlX0luaXQzRChUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEN0NCX0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4pOworICAgIGlmKEZBSUxFRChocikpCisgICAgeworICAgICAgICBUaGlzLT53aW5lRDNERGV2aWNlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhbiBJbmRleCBCdWZmZXIgcGFyZW50ICovCisgICAgVFJBQ0UoIiglcCkgU3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIDNEXG4iLCBUaGlzKTsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGlyZWN0RHJhd0NyZWF0ZUNsaXBwZXIgKEREUkFXLkApCisgKgorICogQ3JlYXRlcyBhIG5ldyBJRGlyZWN0RHJhd0NsaXBwZXIgb2JqZWN0LgorICoKKyAqIFBhcmFtczoKKyAqICBDbGlwcGVyOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciB0bworICogIFVua091dGVyOiBGb3IgYWdncmVnYXRpb24gc3VwcG9ydCwgd2hpY2ggZGRyYXcgZG9lc24ndCBoYXZlLiBIYXMgdG8gYmUKKyAqICAgICAgICAgICAgTlVMTAorICoKKyAqIFJldHVybnM6CisgKiAgQ0xBU1NfRV9OT0FHR1JFR0FUSU9OIGlmIFVua091dGVyICE9IE5VTEwKKyAqICBFX09VVE9GTUVNT1JZIGlmIGFsbG9jYXRpbmcgdGhlIG9iamVjdCBmYWlsZWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIUkVTVUxUIFdJTkFQSQorRGlyZWN0RHJhd0NyZWF0ZUNsaXBwZXIoRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd0NsaXBwZXIgKipDbGlwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQoreworICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwqIG9iamVjdDsKKyAgICBUUkFDRSgiKCUwOGx4LCVwLCVwKVxuIiwgRmxhZ3MsIENsaXBwZXIsIFVua091dGVyKTsKKworICAgIGlmIChVbmtPdXRlciAhPSBOVUxMKSByZXR1cm4gQ0xBU1NfRV9OT0FHR1JFR0FUSU9OOworCisgICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSURpcmVjdERyYXdDbGlwcGVySW1wbCkpOworICAgIGlmIChvYmplY3QgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdERyYXdDbGlwcGVyLCBJRGlyZWN0RHJhd0NsaXBwZXJfVnRibCk7CisgICAgb2JqZWN0LT5yZWYgPSAxOworICAgIG9iamVjdC0+aFduZCA9IDA7CisgICAgb2JqZWN0LT5kZHJhd19vd25lciA9IE5VTEw7CisKKyAgICAqQ2xpcHBlciA9IChJRGlyZWN0RHJhd0NsaXBwZXIgKikgb2JqZWN0OworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkNyZWF0ZUNsaXBwZXIKKyAqCisgKiBDcmVhdGVzIGEgRERyYXcgY2xpcHBlci4gU2VlIERpcmVjdERyYXdDcmVhdGVDbGlwcGVyIGZvciBkZXRhaWxzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfQ3JlYXRlQ2xpcHBlcihJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd0NsaXBwZXIgKipDbGlwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXc3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglbHgsJXAsJXApXG4iLCBUaGlzLCBGbGFncywgQ2xpcHBlciwgVW5rT3V0ZXIpOworICAgIHJldHVybiBEaXJlY3REcmF3Q3JlYXRlQ2xpcHBlcihGbGFncywgQ2xpcHBlciwgVW5rT3V0ZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Nzo6Q3JlYXRlUGFsZXR0ZQorICoKKyAqIENyZWF0ZXMgYSBuZXcgSURpcmVjdERyYXdQYWxldHRlIG9iamVjdAorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogVGhlIGZsYWdzIGZvciB0aGUgbmV3IGNsaXBwZXIKKyAqICBDb2xvclRhYmxlOiBDb2xvciB0YWJsZSB0byBhc3NpZ24gdG8gdGhlIG5ldyBjbGlwcGVyCisgKiAgUGFsZXR0ZTogQWRkcmVzcyB0byB3cml0ZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgdG8KKyAqICBVbmtPdXRlcjogRm9yIGFnZ3JlZ2F0aW9uIHN1cHBvcnQsIHdoaWNoIGRkcmF3IGRvZXNuJ3QgaGF2ZS4gSGFzIHRvIGJlCisgKiAgICAgICAgICAgIE5VTEwKKyAqCisgKiBSZXR1cm5zOgorICogIENMQVNTX0VfTk9BR0dSRUdBVElPTiBpZiBVbmtPdXRlciAhPSBOVUxMCisgKiAgRV9PVVRPRk1FTU9SWSBpZiBhbGxvY2F0aW5nIHRoZSBvYmplY3QgZmFpbGVkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfQ3JlYXRlUGFsZXR0ZShJRGlyZWN0RHJhdzcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgKkNvbG9yVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGUgKipQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKm9iamVjdDsKKyAgICBIUkVTVUxUIGhyID0gRERFUlJfR0VORVJJQzsKKyAgICBUUkFDRSgiKCVwKS0+KCVseCwlcCwlcCwlcClcbiIsIFRoaXMsIEZsYWdzLCBDb2xvclRhYmxlLCBQYWxldHRlLCBwVW5rT3V0ZXIpOworCisgICAgaWYocFVua091dGVyICE9IE5VTEwpIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047IC8qIHVuY2hlY2tlZCAqLworCisgICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKSk7CisgICAgaWYoIW9iamVjdCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdERyYXdQYWxldHRlLCBJRGlyZWN0RHJhd1BhbGV0dGVfVnRibCk7CisgICAgb2JqZWN0LT5yZWYgPSAxOworCisgICAgaHIgPSBJV2luZUQzRERldmljZV9DcmVhdGVQYWxldHRlKFRoaXMtPndpbmVEM0REZXZpY2UsIEZsYWdzLCBDb2xvclRhYmxlLCAmb2JqZWN0LT53aW5lRDNEUGFsZXR0ZSwgKElVbmtub3duICopIElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdERyYXdQYWxldHRlKSApOworICAgIGlmKGhyICE9IEREX09LKQorICAgIHsKKyAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKworICAgICpQYWxldHRlID0gSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0RHJhd1BhbGV0dGUpOworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhdzc6OkR1cGxpY2F0ZVN1cmZhY2UKKyAqCisgKiBEdXBsaWNhdGVzIGEgc3VyZmFjZS4gVGhlIHN1cmZhY2UgbWVtb3J5IHBvaW50cyB0byB0aGUgc2FtZSBtZW1vcnkgYXMKKyAqIHRoZSBvcmlnaW5hbCBzdXJmYWNlLCBhbmQgaXQncyByZWxlYXNlZCB3aGVuIHRoZSBsYXN0IHN1cmZhY2UgcmVmZXJyaW5nCisgKiBpdCBpcyByZWxlYXNlZC4gSSBndWVzcyB0aGF0J3MgYmV5b25kIFdpbmVzIHN1cmZhY2UgbWFuYWdlbWVudCByaWdodCBub3cKKyAqIChJZGVhOiBjcmVhdGUgYSBuZXcgRERyYXcgc3VyZmFjZSB3aXRoIHRoZSBzYW1lIFdpbmVEM0RTdXJmYWNlLiBJIG5lZWQgYQorICogdGVzdCBhcHBsaWNhdGlvbiB0byBpbXBsZW1lbnQgdGhpcykKKyAqCisgKiBQYXJhbXM6CisgKiAgU3JjOiBBZGRyZXNzIG9mIHRoZSBzb3VyY2Ugc3VyZmFjZQorICogIERlc3Q6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIG5ldyBzdXJmYWNlIHBvaW50ZXIgdG8KKyAqCisgKiBSZXR1cm5zOgorICogIFNlZSBJRGlyZWN0RHJhdzc6OkNyZWF0ZVN1cmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9EdXBsaWNhdGVTdXJmYWNlKElEaXJlY3REcmF3NyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICoqRGVzdCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlN1cmYgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBTcmMpOworCisgICAgRklYTUUoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIFN1cmYsIERlc3QpOworCisgICAgLyogRm9yIG5vdywgc2ltcGx5IGNyZWF0ZSBhIG5ldywgaW5kZXBlbmRlbnQgc3VyZmFjZSAqLworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cmYtPnN1cmZhY2VfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXc3IFZUYWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgSURpcmVjdERyYXc3VnRibCBJRGlyZWN0RHJhdzdfVnRibCA9Cit7CisgICAgLyoqKiBJVW5rb3duICoqKi8KKyAgICBJRGlyZWN0RHJhd0ltcGxfUXVlcnlJbnRlcmZhY2UsCisgICAgSURpcmVjdERyYXdJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0RHJhd0ltcGxfUmVsZWFzZSwKKyAgICAvKioqIElEaXJlY3REcmF3ICoqKi8KKyAgICBJRGlyZWN0RHJhd0ltcGxfQ29tcGFjdCwKKyAgICBJRGlyZWN0RHJhd0ltcGxfQ3JlYXRlQ2xpcHBlciwKKyAgICBJRGlyZWN0RHJhd0ltcGxfQ3JlYXRlUGFsZXR0ZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfQ3JlYXRlU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfRHVwbGljYXRlU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfRW51bURpc3BsYXlNb2RlcywKKyAgICBJRGlyZWN0RHJhd0ltcGxfRW51bVN1cmZhY2VzLAorICAgIElEaXJlY3REcmF3SW1wbF9GbGlwVG9HRElTdXJmYWNlLAorICAgIElEaXJlY3REcmF3SW1wbF9HZXRDYXBzLAorICAgIElEaXJlY3REcmF3SW1wbF9HZXREaXNwbGF5TW9kZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfR2V0Rm91ckNDQ29kZXMsCisgICAgSURpcmVjdERyYXdJbXBsX0dldEdESVN1cmZhY2UsCisgICAgSURpcmVjdERyYXdJbXBsX0dldE1vbml0b3JGcmVxdWVuY3ksCisgICAgSURpcmVjdERyYXdJbXBsX0dldFNjYW5MaW5lLAorICAgIElEaXJlY3REcmF3SW1wbF9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAorICAgIElEaXJlY3REcmF3SW1wbF9Jbml0aWFsaXplLAorICAgIElEaXJlY3REcmF3SW1wbF9SZXN0b3JlRGlzcGxheU1vZGUsCisgICAgSURpcmVjdERyYXdJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwsCisgICAgSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlLAorICAgIElEaXJlY3REcmF3SW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuaywKKyAgICAvKioqIElEaXJlY3REcmF3MiAqKiovCisgICAgSURpcmVjdERyYXdJbXBsX0dldEF2YWlsYWJsZVZpZE1lbSwKKyAgICAvKioqIElEaXJlY3REcmF3NyAqKiovCisgICAgSURpcmVjdERyYXdJbXBsX0dldFN1cmZhY2VGcm9tREMsCisgICAgSURpcmVjdERyYXdJbXBsX1Jlc3RvcmVBbGxTdXJmYWNlcywKKyAgICBJRGlyZWN0RHJhd0ltcGxfVGVzdENvb3BlcmF0aXZlTGV2ZWwsCisgICAgSURpcmVjdERyYXdJbXBsX0dldERldmljZUlkZW50aWZpZXIsCisgICAgLyoqKiBJRGlyZWN0RHJhdzcgKioqLworICAgIElEaXJlY3REcmF3SW1wbF9TdGFydE1vZGVUZXN0LAorICAgIElEaXJlY3REcmF3SW1wbF9FdmFsdWF0ZU1vZGUKK307CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RkcmF3LnNwZWMgYi9kbGxzL2RkcmF3L2RkcmF3LnNwZWMKaW5kZXggNzU3NTA5MS4uMGNkMWQwZiAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9kZHJhdy5zcGVjCisrKyBiL2RsbHMvZGRyYXcvZGRyYXcuc3BlYwpAQCAtOCw4ICs4LDggQEAKIEAgc3RkY2FsbCBEaXJlY3REcmF3Q3JlYXRlRXgocHRyIHB0ciBwdHIgcHRyKQogQCBzdGRjYWxsIERpcmVjdERyYXdFbnVtZXJhdGVBKHB0ciBwdHIpCiBAIHN0ZGNhbGwgRGlyZWN0RHJhd0VudW1lcmF0ZUV4QShwdHIgcHRyIGxvbmcpCi1AIHN0ZGNhbGwgRGlyZWN0RHJhd0VudW1lcmF0ZUV4VyhwdHIgcHRyIGxvbmcpCi1AIHN0ZGNhbGwgRGlyZWN0RHJhd0VudW1lcmF0ZVcocHRyIHB0cikKK0Agc3R1YiBEaXJlY3REcmF3RW51bWVyYXRlRXhXCitAIHN0dWIgRGlyZWN0RHJhd0VudW1lcmF0ZVcKIEAgc3RkY2FsbCAtcHJpdmF0ZSBEbGxDYW5VbmxvYWROb3coKQogQCBzdGRjYWxsIC1wcml2YXRlIERsbEdldENsYXNzT2JqZWN0KHB0ciBwdHIgcHRyKQogQCBzdGRjYWxsIC1wcml2YXRlIERsbFJlZ2lzdGVyU2VydmVyKCkKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXdfaGFsLmMgYi9kbGxzL2RkcmF3L2RkcmF3X2hhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTkwOGEwLi4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZGRyYXdfaGFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyoJRGlyZWN0RHJhdyBIQUwgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDEgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKLSNpbmNsdWRlICJ3aW5kZWYuaCIKLSNpbmNsdWRlICJ3aW5iYXNlLmgiCi0jaW5jbHVkZSAid2luZ2RpLmgiCi0jaW5jbHVkZSAiZGRyYXcuaCIKLSNpbmNsdWRlICJkZHJhd2kuaCIKLSNpbmNsdWRlICJkM2RoYWwuaCIKLQotI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKLQotV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXc3VnRibCBIQUxfRGlyZWN0RHJhd19WVGFibGU7Ci0KLXN0YXRpYyBERFZFUlNJT05EQVRBIGhhbF92ZXJzaW9uOwotc3RhdGljIEREMzJCSVREUklWRVJEQVRBIGhhbF9kcml2ZXJkYXRhOwotc3RhdGljIEhJTlNUQU5DRSBoYWxfaW5zdGFuY2U7Ci0KLXN0YXRpYyBjb25zdCBERERFVklDRUlERU5USUZJRVIyIGhhbF9kZXZpY2UgPQotewotICAgICJkaXNwbGF5IiwKLSAgICAiRGlyZWN0RHJhdyBIQUwiLAotICAgIHsgeyAweDAwMDEwMDAxLCAweDAwMDEwMDAxIH0gfSwKLSAgICAwLCAwLCAwLCAwLAotICAgIC8qIDQwYzFiMjQ4LTlkN2QtNGEyOS1iN2Q3LTRjZDgxMDlmM2Q1ZCAqLwotICAgIHsweDQwYzFiMjQ4LDB4OWQ3ZCwweDRhMjksezB4ZDcsMHhiNywweDRjLDB4ZDgsMHgxMCwweDlmLDB4M2QsMHg1ZH19LAotICAgIDAKLX07Ci0KLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdfQ3JlYXRlKGNvbnN0IEdVSUQqIHBHVUlELCBMUERJUkVDVERSQVc3KiBwSWZhY2UsCi0JCQkgICAgICBJVW5rbm93biogcFVua091dGVyLCBCT09MIGV4KTsKLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdfSW5pdGlhbGl6ZShJRGlyZWN0RHJhd0ltcGwqLCBjb25zdCBHVUlEKik7Ci0KLXN0YXRpYyBjb25zdCBkZHJhd19kcml2ZXIgaGFsX2RyaXZlciA9Ci17Ci0gICAgJmhhbF9kZXZpY2UsCi0gICAgMTAwLCAvKiB3ZSBwcmVmZXIgdGhlIEhBTCAqLwotICAgIEhBTF9EaXJlY3REcmF3X0NyZWF0ZSwKLSAgICBIQUxfRGlyZWN0RHJhd19Jbml0aWFsaXplCi19OwotCi1zdGF0aWMgRERIQUxfQ0FMTEJBQ0tTIGRkX2NiczsKLXN0YXRpYyBERFJBV0lfRElSRUNURFJBV19HQkwgZGRfZ2JsOwotCi1zdGF0aWMgRDNESEFMX0dMT0JBTERSSVZFUkRBVEEgZDNkX2hhbF9kYXRhOwotc3RhdGljIEQzREhBTF9EM0RFWFRFTkRFRENBUFMgZDNkX2hhbF9leHRjYXBzOwotc3RhdGljIEQzREhBTF9DQUxMQkFDS1MgZDNkX2hhbF9jYnMxOwotc3RhdGljIEQzREhBTF9DQUxMQkFDS1MyIGQzZF9oYWxfY2JzMjsKLQotLyogaW4gcmVhbCB3aW5kb3plLCB0aGVzZSBlbnRyeSBwb2ludHMgYXJlIDE2LWJpdCwgYnV0IHdlIGNhbiB3b3JrIGluIDMyLWJpdCAqLwotc3RhdGljIEJPT0wgV0lOQVBJIHNldF9oYWxfaW5mbyhMUERESEFMSU5GTyBscERESGFsSW5mbywgQk9PTCByZXNldCkKLXsKLSAgICBkZF9jYnMuSEFMREQJPSAqbHBEREhhbEluZm8tPmxwRERDYWxsYmFja3M7Ci0gICAgZGRfY2JzLkhBTEREU3VyZmFjZQk9ICpscERESGFsSW5mby0+bHBERFN1cmZhY2VDYWxsYmFja3M7Ci0gICAgZGRfY2JzLkhBTEREUGFsZXR0ZQk9ICpscERESGFsSW5mby0+bHBERFBhbGV0dGVDYWxsYmFja3M7Ci0gICAgaWYgKGxwRERIYWxJbmZvLT5scERERXhlQnVmQ2FsbGJhY2tzKQotCWRkX2Nicy5IQUxEREV4ZUJ1Zgk9ICpscERESGFsSW5mby0+bHBEREV4ZUJ1ZkNhbGxiYWNrczsKLQotICAgIGRkX2dibC5scEREQ0J0bXAgPSAmZGRfY2JzOwotCi0gICAgZGRfZ2JsLmRkQ2FwcwkJID0gbHBEREhhbEluZm8tPmRkQ2FwczsKLSAgICBkZF9nYmwuZHdNb25pdG9yRnJlcXVlbmN5CSA9IGxwRERIYWxJbmZvLT5kd01vbml0b3JGcmVxdWVuY3k7Ci0gICAgZGRfZ2JsLnZtaURhdGEJCSA9IGxwRERIYWxJbmZvLT52bWlEYXRhOwotICAgIGRkX2dibC5kd01vZGVJbmRleAkJID0gbHBEREhhbEluZm8tPmR3TW9kZUluZGV4OwotICAgIGRkX2dibC5kd051bUZvdXJDQwkgICAgICAgICA9IGxwRERIYWxJbmZvLT5kZENhcHMuZHdOdW1Gb3VyQ0NDb2RlczsKLSAgICBkZF9nYmwubHBkd0ZvdXJDQwkJID0gbHBEREhhbEluZm8tPmxwZHdGb3VyQ0M7Ci0gICAgZGRfZ2JsLmR3TnVtTW9kZXMJCSA9IGxwRERIYWxJbmZvLT5kd051bU1vZGVzOwotICAgIGRkX2dibC5scE1vZGVJbmZvCQkgPSBscERESGFsSW5mby0+bHBNb2RlSW5mbzsKLSAgICAvKiBGSVhNRTogZHdGbGFncyAqLwotICAgIGRkX2dibC5kd1BEZXZpY2UJCSA9IChEV09SRClscERESGFsSW5mby0+bHBQRGV2aWNlOwotICAgIGRkX2dibC5oSW5zdGFuY2UJCSA9IGxwRERIYWxJbmZvLT5oSW5zdGFuY2U7Ci0gICAgLyogRGlyZWN0WCAyICovCi0gICAgaWYgKGxwRERIYWxJbmZvLT5scEQzREdsb2JhbERyaXZlckRhdGEpCi0JbWVtY3B5KCZkM2RfaGFsX2RhdGEsIChMUFZPSUQpbHBEREhhbEluZm8tPmxwRDNER2xvYmFsRHJpdmVyRGF0YSwgc2l6ZW9mKEQzRERFVklDRURFU0NfVjEpKTsKLSAgICBlbHNlCi0JbWVtc2V0KCZkM2RfaGFsX2RhdGEsIDAsIHNpemVvZihEM0RERVZJQ0VERVNDX1YxKSk7Ci0gICAgZGRfZ2JsLmxwRDNER2xvYmFsRHJpdmVyRGF0YSA9IChVTE9OR19QVFIpJmQzZF9oYWxfZGF0YTsKLQotICAgIGlmIChscERESGFsSW5mby0+bHBEM0RIQUxDYWxsYmFja3MpCi0JbWVtY3B5KCZkM2RfaGFsX2NiczEsIChMUFZPSUQpbHBEREhhbEluZm8tPmxwRDNESEFMQ2FsbGJhY2tzLCBzaXplb2YoRDNESEFMX0NBTExCQUNLUykpOwotICAgIGVsc2UKLQltZW1zZXQoJmQzZF9oYWxfY2JzMSwgMCwgc2l6ZW9mKEQzREhBTF9DQUxMQkFDS1MpKTsKLSAgICBkZF9nYmwubHBEM0RIQUxDYWxsYmFja3MJID0gKFVMT05HX1BUUikmZDNkX2hhbF9jYnMxOwotCi0gICAgaWYgKGxwRERIYWxJbmZvLT5kd0ZsYWdzICYgRERIQUxJTkZPX0dFVERSSVZFUklORk9TRVQpIHsKLQlEREhBTF9HRVREUklWRVJJTkZPREFUQSBkYXRhOwotCWRhdGEuZHdTaXplID0gc2l6ZW9mKERESEFMX0dFVERSSVZFUklORk9EQVRBKTsKLQlkYXRhLmR3RmxhZ3MgPSAwOyAvKiA/ICovCi0JZGF0YS5kd0NvbnRleHQgPSBoYWxfZHJpdmVyZGF0YS5kd0NvbnRleHQ7IC8qID8gKi8KLQotCWRhdGEuZ3VpZEluZm8gPSBHVUlEX0QzREV4dGVuZGVkQ2FwczsKLQlkYXRhLmR3RXhwZWN0ZWRTaXplID0gc2l6ZW9mKEQzREhBTF9EM0RFWFRFTkRFRENBUFMpOwotCWRhdGEubHB2RGF0YSA9ICZkM2RfaGFsX2V4dGNhcHM7Ci0JZGF0YS5kd0FjdHVhbFNpemUgPSAwOwotCWRhdGEuZGRSVmFsID0gMDsKLQlscERESGFsSW5mby0+R2V0RHJpdmVySW5mbygmZGF0YSk7Ci0JZDNkX2hhbF9leHRjYXBzLmR3U2l6ZSA9IGRhdGEuZHdBY3R1YWxTaXplOwotCWRkX2dibC5scEQzREV4dGVuZGVkQ2FwcyA9IChVTE9OR19QVFIpJmQzZF9oYWxfZXh0Y2FwczsKLQotCWRhdGEuZ3VpZEluZm8gPSBHVUlEX0QzRENhbGxiYWNrczI7Ci0JZGF0YS5kd0V4cGVjdGVkU2l6ZSA9IHNpemVvZihEM0RIQUxfQ0FMTEJBQ0tTMik7Ci0JZGF0YS5scHZEYXRhID0gJmQzZF9oYWxfY2JzMjsKLQlkYXRhLmR3QWN0dWFsU2l6ZSA9IDA7Ci0JZGF0YS5kZFJWYWwgPSAwOwotCWxwRERIYWxJbmZvLT5HZXREcml2ZXJJbmZvKCZkYXRhKTsKLQlkM2RfaGFsX2NiczIuZHdTaXplID0gZGF0YS5kd0FjdHVhbFNpemU7Ci0JZGRfZ2JsLmxwRDNESEFMQ2FsbGJhY2tzMiA9IChVTE9OR19QVFIpJmQzZF9oYWxfY2JzMjsKLSAgICB9Ci0KLSAgICBpZiggb3BlbmdsX2luaXRpYWxpemVkICYmIAotICAgICAgICAgICAoZDNkX2hhbF9kYXRhLmh3Q2Fwcy5kd0ZsYWdzICYgRDNERERfV0lORV9PUEVOR0xfREVWSUNFKSApIHsKLSAgICAgICAgLypHTF9EaXJlY3REcmF3X0luaXQoJmRkX2dibCk7Ki8KLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYyBEREhBTEREUkFXRk5TIGhhbF9mdW5jcyA9IHsKLSAgICBzaXplb2YoRERIQUxERFJBV0ZOUyksCi0gICAgc2V0X2hhbF9pbmZvLAotICAgIE5VTEwsIC8qIFZpZE1lbUFsbG9jICovCi0gICAgTlVMTCAgLyogVmlkTWVtRnJlZSAqLwotfTsKLQotLyogQ2FsbGVkIGZyb20gRGxsSW5pdCwgd2hpY2ggaXMgc3luY2hyb25pc2VkIHNvIHRoZXJlIGFyZSBubyB0aHJlYWRpbmcKLSAqIGNvbmNlcm5zLiAqLwotc3RhdGljIEJPT0wgaW5pdGlhbGl6ZSh2b2lkKQotewotICAgIERDSUNNRCBjbWQ7Ci0gICAgSU5UIG5jbWQgPSBEQ0lDT01NQU5EOwotICAgIEJPT0wgcmV0OwotICAgIEhEQyBkYyA9IENyZWF0ZURDQSgiRElTUExBWSIsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIElOVCB2ZXIgPSBFc2NhcGUoZGMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mKG5jbWQpLCAoTFBWT0lEKSZuY21kLCBOVUxMKTsKLSAgICBpZiAodmVyICE9IEREX0hBTF9WRVJTSU9OKSB7Ci0JRGVsZXRlREMoZGMpOwotCVRSQUNFKCJEaXJlY3REcmF3IEhBTCBub3QgYXZhaWxhYmxlXG4iKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGNtZC5kd1ZlcnNpb24gPSBERF9WRVJTSU9OOwotICAgIGNtZC5kd1Jlc2VydmVkID0gMDsKLQotICAgIC8qIHRoZSBERE5FV0NBTExCQUNLRk5TIGlzIHN1cHBvc2VkIHRvIGdpdmUgdGhlIDE2LWJpdCBkcml2ZXIgZW50cnkgcG9pbnRzCi0gICAgICogaW4gZGRyYXcxNi5kbGwsIGJ1dCBzaW5jZSBXaW5lIGRvZXNuJ3QgaGF2ZSBvciB1c2UgMTYtYml0IGRpc3BsYXkgZHJpdmVycywKLSAgICAgKiB3ZSdsbCBqdXN0IHdvcmsgaW4gMzItYml0LCB3aG8nbGwgbm90aWNlLi4uICovCi0gICAgY21kLmR3Q29tbWFuZCA9IERETkVXQ0FMTEJBQ0tGTlM7Ci0gICAgY21kLmR3UGFyYW0xID0gKERXT1JEKSZoYWxfZnVuY3M7Ci0gICAgRXh0RXNjYXBlKGRjLCBEQ0lDT01NQU5ELCBzaXplb2YoY21kKSwgKExQVk9JRCkmY21kLCAwLCBOVUxMKTsKLQotICAgIC8qIG5leHQsIGV4Y2hhbmdlIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBjbWQuZHdDb21tYW5kID0gRERWRVJTSU9OSU5GTzsKLSAgICBjbWQuZHdQYXJhbTEgPSBERF9SVU5USU1FX1ZFUlNJT047IC8qIG5vdCBzdXJlIHdoYXQgc2hvdWxkICpyZWFsbHkqIGdvIGhlcmUgKi8KLSAgICBFeHRFc2NhcGUoZGMsIERDSUNPTU1BTkQsIHNpemVvZihjbWQpLCAoTFBWT0lEKSZjbWQsIHNpemVvZihoYWxfdmVyc2lvbiksIChMUFZPSUQpJmhhbF92ZXJzaW9uKTsKLQotICAgIC8qIGdldCAzMi1iaXQgZHJpdmVyIGRhdGEgKGRsbCBuYW1lIGFuZCBlbnRyeSBwb2ludCkgKi8KLSAgICBjbWQuZHdDb21tYW5kID0gRERHRVQzMkJJVERSSVZFUk5BTUU7Ci0gICAgRXh0RXNjYXBlKGRjLCBEQ0lDT01NQU5ELCBzaXplb2YoY21kKSwgKExQVk9JRCkmY21kLCBzaXplb2YoaGFsX2RyaXZlcmRhdGEpLCAoTFBWT0lEKSZoYWxfZHJpdmVyZGF0YSk7Ci0gICAgLyogd2UncmUgc3VwcG9zZWQgdG8gbG9hZCB0aGUgRExMIGluIGhhbF9kcml2ZXJkYXRhLnN6TmFtZSwgdGhlbiBHZXRQcm9jQWRkcmVzcwotICAgICAqIHRoZSBoYWxfZHJpdmVyZGF0YS5zekVudHJ5UG9pbnQsIGFuZCBjYWxsIGl0IHdpdGggaGFsX2RyaXZlcmRhdGEuZHdDb250ZXh0Ci0gICAgICogYXMgYSBwYXJhbWV0ZXIuLi4gYnV0IHNpbmNlIHRoaXMgaXMgb25seSBtb3JlIHJlbWFpbnMgZnJvbSB0aGUgMTYtYml0IHdvcmxkLAotICAgICAqIHdlJ2xsIGlnbm9yZSBpdCAqLwotCi0gICAgLyogZmluYWxseSwgaW5pdGlhbGl6ZSB0aGUgZHJpdmVyIG9iamVjdCAqLwotICAgIGNtZC5kd0NvbW1hbmQgPSBERENSRUFURURSSVZFUk9CSkVDVDsKLSAgICByZXQgPSBFeHRFc2NhcGUoZGMsIERDSUNPTU1BTkQsIHNpemVvZihjbWQpLCAoTFBWT0lEKSZjbWQsIHNpemVvZihoYWxfaW5zdGFuY2UpLCAoTFBWT0lEKSZoYWxfaW5zdGFuY2UpOwotICAgIGlmIChyZXQpIHsKLQkvKiB0aGUgZHJpdmVyIHNob3VsZCBoYXZlIGNhbGxlZCBvdXIgc2V0X2hhbF9pbmZvIG5vdyAqLwotCWlmICghZGRfZ2JsLmxwRERDQnRtcCkgcmV0ID0gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogaW5pdCBkb25lICovCi0gICAgRGVsZXRlREMoZGMpOwotCi0gICAgVFJBQ0UoIiVzIERpcmVjdERyYXcgSEFMXG4iLCByZXQgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cCh2b2lkKQotewotICAgIERESEFMX0RFU1RST1lEUklWRVJEQVRBIGRhdGE7Ci0KLSAgICBpZiAoIWRkX2Nicy5IQUxERC5EZXN0cm95RHJpdmVyKSByZXR1cm47Ci0KLSAgICBkYXRhLmxwREQgPSBOVUxMOwotICAgIGRhdGEuZGRSVmFsID0gMDsKLSAgICBkYXRhLkRlc3Ryb3lEcml2ZXIgPSBkZF9jYnMuSEFMREQuRGVzdHJveURyaXZlcjsKLSAgICBkYXRhLkRlc3Ryb3lEcml2ZXIoJmRhdGEpOwotfQotCi1zdGF0aWMgRFdPUkQgY2hvb3NlX21vZGUoRFdPUkQgZHdXaWR0aCwgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAotCQkJIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgaW50IGJlc3QgPSAtMTsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIGlmICghZGRfZ2JsLmR3TnVtTW9kZXMpIHJldHVybiAwOwotCi0vKiBsZXQncyBzdXBwb3J0IEhBTHMgdGhhdCBjYW5ub3Qgc3dpdGNoIGRlcHRocyAoWFZpZE1vZGUpLAotICogdGhlc2Ugc2hvdWxkIHJldHVybiBkd0JQUCA9PSAwIGZvciBhbGwgdGhlaXIgcmVzb2x1dGlvbnMgKi8KLSNkZWZpbmUgQlBQX01BVENIKGRkLCBicHApICgoIShkZCkpIHx8ICgoZGQpID09IGJwcCkpCi0KLS8qIEZJWE1FOiB3ZSBzaG91bGQgdHJ5IHRvIG1hdGNoIHRoZSByZWZyZXNoIHJhdGUgdG9vICovCi0KLSAgICAvKiBDaG9vc2UgdGhlIHNtYWxsZXN0IG1vZGUgdGhhdCBpcyBsYXJnZSBlbm91Z2guICovCi0gICAgZm9yIChpPTA7IGkgPCBkZF9nYmwuZHdOdW1Nb2RlczsgaSsrKQotICAgIHsKLQlpZiAoZGRfZ2JsLmxwTW9kZUluZm9baV0uZHdXaWR0aCA+PSBkd1dpZHRoICYmCi0JICAgIGRkX2dibC5scE1vZGVJbmZvW2ldLmR3SGVpZ2h0ID49IGR3SGVpZ2h0ICYmCi0JICAgIEJQUF9NQVRDSChkZF9nYmwubHBNb2RlSW5mb1tpXS5kd0JQUCwgZHdCUFApKQotCXsKLQkgICAgaWYgKGJlc3QgPT0gLTEpIGJlc3QgPSBpOwotCSAgICBlbHNlCi0JICAgIHsKLQkJaWYgKGRkX2dibC5scE1vZGVJbmZvW2ldLmR3V2lkdGggPCBkZF9nYmwubHBNb2RlSW5mb1tiZXN0XS5kd1dpZHRoIHx8Ci0JCSAgICBkZF9nYmwubHBNb2RlSW5mb1tpXS5kd0hlaWdodCA8IGRkX2dibC5scE1vZGVJbmZvW2Jlc3RdLmR3SGVpZ2h0KQotCQkgICAgYmVzdCA9IGk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgaWYgKGJlc3QgPT0gLTEpCi0gICAgewotCVRSQUNFKCJhbGwgbW9kZXMgdG9vIHNtYWxsXG4iKTsKLQkvKiBvaywgbGV0J3MgdXNlIHRoZSBsYXJnZXN0ICovCi0KLQlmb3IgKGk9MDsgaSA8IGRkX2dibC5kd051bU1vZGVzOyBpKyspCi0JewotCSAgICBpZiAoQlBQX01BVENIKGRkX2dibC5scE1vZGVJbmZvW2ldLmR3QlBQLCBkd0JQUCkpCi0JICAgIHsKLQkJaWYgKGJlc3QgPT0gLTEpIGJlc3QgPSBpOwotCQllbHNlCi0JCXsKLQkJICAgIGlmIChkZF9nYmwubHBNb2RlSW5mb1tpXS5kd1dpZHRoID4gZGRfZ2JsLmxwTW9kZUluZm9bYmVzdF0uZHdXaWR0aCB8fAotCQkJZGRfZ2JsLmxwTW9kZUluZm9baV0uZHdIZWlnaHQgPiBkZF9nYmwubHBNb2RlSW5mb1tiZXN0XS5kd0hlaWdodCkKLQkJCWJlc3QgPSBpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotI3VuZGVmIEJQUF9NQVRDSAotCi0gICAgaWYgKGJlc3QgPT0gLTEpCi0gICAgewotCUVSUigicmVxdWVzdGVkIGNvbG9yIGRlcHRoICglbGQpIG5vdCBhdmFpbGFibGUsIHRyeSByZWNvbmZpZ3VyaW5nIFggc2VydmVyXG4iLCBkd0JQUCk7Ci0JcmV0dXJuIGRkX2dibC5kd01vZGVJbmRleDsKLSAgICB9Ci0KLSAgICBUUkFDRSgidXNpbmcgbW9kZSAlZFxuIiwgYmVzdCk7Ci0KLSAgICByZXR1cm4gYmVzdDsKLX0KLQotc3RhdGljIEhSRVNVTFQgc2V0X21vZGUoSURpcmVjdERyYXdJbXBsICpUaGlzLCBEV09SRCBkd01vZGUpCi17Ci0gICAgSFJFU1VMVCBociA9IEREX09LOwotCi0gICAgaWYgKGR3TW9kZSAhPSBkZF9nYmwuZHdNb2RlSW5kZXgpCi0gICAgewotCURESEFMX1NFVE1PREVEQVRBIGRhdGE7Ci0JZGF0YS5scEREID0gJmRkX2dibDsKLQlkYXRhLmR3TW9kZUluZGV4ID0gZHdNb2RlOwotCWRhdGEuZGRSVmFsID0gMDsKLQlkYXRhLlNldE1vZGUgPSBkZF9jYnMuSEFMREQuU2V0TW9kZTsKLQlkYXRhLmluZXhjbCA9IDA7Ci0JZGF0YS51c2VSZWZyZXNoUmF0ZSA9IEZBTFNFOwotCWlmIChkYXRhLlNldE1vZGUpCi0JICAgIGRhdGEuU2V0TW9kZSgmZGF0YSk7Ci0JaHIgPSBkYXRhLmRkUlZhbDsKLQlpZiAoU1VDQ0VFREVEKGhyKSkKLQkgICAgZGRfZ2JsLmR3TW9kZUluZGV4ID0gZHdNb2RlOwotICAgIH0KLSAgICByZXR1cm4gaHI7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIHNldF9leGNsdXNpdmVfbW9kZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIERXT1JEIGR3RW50ZXJFeGNsKQotewotICAgIERESEFMX1NFVEVYQ0xVU0lWRU1PREVEQVRBIGRhdGE7Ci0KLSAgICBkYXRhLmxwREQgPSAmZGRfZ2JsOwotICAgIGRhdGEuZHdFbnRlckV4Y2wgPSBkd0VudGVyRXhjbDsKLSAgICBkYXRhLmR3UmVzZXJ2ZWQgPSAwOwotICAgIGRhdGEuZGRSVmFsID0gMDsKLSAgICBkYXRhLlNldEV4Y2x1c2l2ZU1vZGUgPSBkZF9jYnMuSEFMREQuU2V0RXhjbHVzaXZlTW9kZTsKLSAgICBpZiAoZGF0YS5TZXRFeGNsdXNpdmVNb2RlKQotCWRhdGEuU2V0RXhjbHVzaXZlTW9kZSgmZGF0YSk7Ci0gICAgcmV0dXJuIGRhdGEuZGRSVmFsOwotfQotCi1CT09MIEREUkFXX0hBTF9Jbml0KEhJTlNUQU5DRSBoSW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2KQotewotICAgIGlmIChmZHdSZWFzb24gPT0gRExMX1BST0NFU1NfQVRUQUNIKQotICAgIHsKLQlpZiAoaW5pdGlhbGl6ZSgpKQotCSAgICBERFJBV19yZWdpc3Rlcl9kcml2ZXIoJmhhbF9kcml2ZXIpOwotICAgIH0KLSAgICBlbHNlIGlmIChmZHdSZWFzb24gPT0gRExMX1BST0NFU1NfREVUQUNIKQotICAgIHsKLQljbGVhbnVwKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIE5vdCBjYWxsZWQgZnJvbSB0aGUgdnRhYmxlLiAqLwotSFJFU1VMVCBIQUxfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KQotewotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBUUkFDRSgiKCVwLCVkKVxuIiwgVGhpcywgZXgpOwotCi0gICAgaHIgPSBVc2VyX0RpcmVjdERyYXdfQ29uc3RydWN0KFRoaXMsIGV4KTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCi0gICAgVGhpcy0+bG9jYWwubHBHYmwgPSAmZGRfZ2JsOwotCi0gICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IEhBTF9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2U7Ci0gICAgVGhpcy0+c2V0X2V4Y2x1c2l2ZV9tb2RlID0gc2V0X2V4Y2x1c2l2ZV9tb2RlOwotCi0gICAgVGhpcy0+Y3JlYXRlX3BhbGV0dGUgPSBIQUxfRGlyZWN0RHJhd1BhbGV0dGVfQ3JlYXRlOwotCi0gICAgVGhpcy0+Y3JlYXRlX3ByaW1hcnkgICAgPSBIQUxfRGlyZWN0RHJhd19jcmVhdGVfcHJpbWFyeTsKLSAgICBUaGlzLT5jcmVhdGVfYmFja2J1ZmZlciA9IEhBTF9EaXJlY3REcmF3X2NyZWF0ZV9iYWNrYnVmZmVyOwotICAgIFRoaXMtPmNyZWF0ZV90ZXh0dXJlICAgID0gSEFMX0RpcmVjdERyYXdfY3JlYXRlX3RleHR1cmU7Ci0KLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NywgSEFMX0RpcmVjdERyYXdfVlRhYmxlKTsKLQotICAgIC8qIG1lcmdlIEhBTCBjYXBzICovCi0gICAgVGhpcy0+Y2Fwcy5kd0NhcHMgfD0gZGRfZ2JsLmRkQ2Fwcy5kd0NhcHM7Ci0gICAgVGhpcy0+Y2Fwcy5kd0NhcHMyIHw9IGRkX2dibC5kZENhcHMuZHdDYXBzMjsKLSAgICBUaGlzLT5jYXBzLmR3Q0tleUNhcHMgfD0gZGRfZ2JsLmRkQ2Fwcy5kd0NLZXlDYXBzOwotICAgIFRoaXMtPmNhcHMuZHdGWENhcHMgfD0gZGRfZ2JsLmRkQ2Fwcy5kd0ZYQ2FwczsKLSAgICBUaGlzLT5jYXBzLmR3UGFsQ2FwcyB8PSBkZF9nYmwuZGRDYXBzLmR3UGFsQ2FwczsKLSAgICAvKiBGSVhNRTogbWVyZ2UgbW9yZSBjYXBzICovCi0gICAgVGhpcy0+Y2Fwcy5kZHNDYXBzLmR3Q2FwcyB8PSBkZF9nYmwuZGRDYXBzLmRkc0NhcHMuZHdDYXBzOwotICAgIFRoaXMtPmNhcHMuZGRzQ2Fwcy5kd0NhcHMyIHw9IGRkX2dibC5kZHNDYXBzTW9yZS5kd0NhcHMyOwotICAgIFRoaXMtPmNhcHMuZGRzQ2Fwcy5kd0NhcHMzIHw9IGRkX2dibC5kZHNDYXBzTW9yZS5kd0NhcHMzOwotICAgIFRoaXMtPmNhcHMuZGRzQ2Fwcy5kd0NhcHM0IHw9IGRkX2dibC5kZHNDYXBzTW9yZS5kd0NhcHM0OwotICAgIFRoaXMtPmNhcHMuZGRzT2xkQ2Fwcy5kd0NhcHMgPSBUaGlzLT5jYXBzLmRkc0NhcHMuZHdDYXBzOwotCi0gICAgcmV0dXJuIFNfT0s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gRGlyZWN0RHJhd0NyZWF0ZShFeCkgb24gdGhlIG1vc3QtZGVyaXZlZAotICogY2xhc3MgdG8gc3RhcnQgY29uc3RydWN0aW9uLgotICogTm90IGNhbGxlZCBmcm9tIHRoZSB2dGFibGUuICovCi1IUkVTVUxUIEhBTF9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiBwR1VJRCwgTFBESVJFQ1REUkFXNyogcElmYWNlLAotCQkJICAgICAgSVVua25vd24qIHBVbmtPdXRlciwgQk9PTCBleCkKLXsKLSAgICBIUkVTVUxUIGhyOwotICAgIElEaXJlY3REcmF3SW1wbCogVGhpczsKLQotICAgIFRSQUNFKCJcbiIpOwotCi0gICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsKLQotICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJICAgICBzaXplb2YoSURpcmVjdERyYXdJbXBsKQotCQkgICAgICsgc2l6ZW9mKEhBTF9EaXJlY3REcmF3SW1wbCkpOwotICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwotCi0gICAgLyogTm90ZSB0aGF0IHRoaXMgcmVsYXRpb24gZG9lcyAqbm90KiBob2xkIHRydWUgaWYgdGhlIEREIG9iamVjdCB3YXMKLSAgICAgKiBDb0NyZWF0ZUluc3RhbmNlZCB0aGVuIEluaXRpYWxpemVkLiAqLwotICAgIFRoaXMtPnByaXZhdGUgPSAoSEFMX0RpcmVjdERyYXdJbXBsICopKFRoaXMrMSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBERENBUFMgc3RydWN0dXJlICovCi0gICAgVGhpcy0+Y2Fwcy5kd1NpemUgPSBzaXplb2YoVGhpcy0+Y2Fwcyk7Ci0KLSAgICBociA9IEhBTF9EaXJlY3REcmF3X0NvbnN0cnVjdChUaGlzLCBleCk7Ci0gICAgaWYgKEZBSUxFRChocikpCi0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7Ci0gICAgZWxzZQotCSpwSWZhY2UgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpOwotCi0gICAgcmV0dXJuIGhyOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIFVuaW5pdF9EaXJlY3REcmF3X0luaXRpYWxpemUgb24gdGhlCi0gKiBtb3N0LWRlcml2ZWQtY2xhc3MgdG8gc3RhcnQgaW5pdGlhbGl6YXRpb24uCi0gKiBOb3QgY2FsbGVkIGZyb20gdGhlIHZ0YWJsZS4gKi8KLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdfSW5pdGlhbGl6ZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIGNvbnN0IEdVSUQqIGd1aWQpCi17Ci0gICAgSFJFU1VMVCBocjsKLQotICAgIFRSQUNFKCJcbiIpOwotCi0gICAgVGhpcy0+cHJpdmF0ZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJICAgICAgc2l6ZW9mKEhBTF9EaXJlY3REcmF3SW1wbCkpOwotICAgIGlmIChUaGlzLT5wcml2YXRlID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgRERDQVBTIHN0cnVjdHVyZSAqLwotICAgIFRoaXMtPmNhcHMuZHdTaXplID0gc2l6ZW9mKFRoaXMtPmNhcHMpOwotCi0gICAgaHIgPSBIQUxfRGlyZWN0RHJhd19Db25zdHJ1Y3QoVGhpcywgVFJVRSk7IC8qIFhYWCBleD8gKi8KLSAgICBpZiAoRkFJTEVEKGhyKSkKLSAgICB7Ci0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+cHJpdmF0ZSk7Ci0JcmV0dXJuIGhyOwotICAgIH0KLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotLyogQ2FsbGVkIGZyb20gYW4gaW50ZXJuYWwgZnVuY3Rpb24gcG9pbnRlci4gKi8KLXZvaWQgSEFMX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMpCi17Ci0gICAgaWYgKGRkX2dibC5kd0ZsYWdzICYgRERSQVdJX01PREVDSEFOR0VEKSBzZXRfbW9kZShUaGlzLCBkZF9nYmwuZHdNb2RlSW5kZXhPcmlnKTsKLSAgICBVc2VyX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShUaGlzKTsKLX0KLQotSFJFU1VMVCBIQUxfRGlyZWN0RHJhd19jcmVhdGVfcHJpbWFyeShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkJICAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCi0JCQkJICAgICAgSVVua25vd24qIHBVbmtPdXRlcikKLXsKLSAgICBpZiAoVGhpcy0+Y29vcGVyYXRpdmVfbGV2ZWwgJiBERFNDTF9FWENMVVNJVkUpCi0JcmV0dXJuIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKLSAgICBlbHNlCi0JcmV0dXJuIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlKFRoaXMsIHBERFNELCBwcFN1cmYsIHBVbmtPdXRlcik7Ci19Ci0KLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdfY3JlYXRlX2JhY2tidWZmZXIoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCQkgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkJCQkgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKLQkJCQkJIElVbmtub3duKiBwVW5rT3V0ZXIsCi0JCQkJCSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcmltYXJ5KQotewotICAgIGlmIChUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkKLQlyZXR1cm4gSEFMX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOwotICAgIGVsc2UKLQlyZXR1cm4gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKLX0KLQotSFJFU1VMVCBIQUxfRGlyZWN0RHJhd19jcmVhdGVfdGV4dHVyZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkJICAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCi0JCQkJICAgICAgTFBVTktOT1dOIHBPdXRlciwKLQkJCQkgICAgICBEV09SRCBkd01pcE1hcExldmVsKQotewotICAgIHJldHVybiBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlKFRoaXMsIHBERFNELCBwcFN1cmYsIHBPdXRlcik7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1IQUxfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyKExQRElSRUNURFJBVzcgaWZhY2UsCi0JCQkJICAgTFBERERFVklDRUlERU5USUZJRVIyIHBERERJLAotCQkJCSAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgKnBERERJID0gaGFsX2RldmljZTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1IQUxfRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSkKLXsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0gICAgSFJFU1VMVCBocjsKLQotICAgIFRSQUNFKCIoJXApXG4iLCBpZmFjZSk7Ci0KLSAgICBpZiAoIShkZF9nYmwuZHdGbGFncyAmIEREUkFXSV9NT0RFQ0hBTkdFRCkpIHJldHVybiBERF9PSzsKLQotICAgIGhyID0gTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShpZmFjZSk7Ci0gICAgaWYgKFNVQ0NFRURFRChocikpIHsKLQlociA9IHNldF9tb2RlKFRoaXMsIGRkX2dibC5kd01vZGVJbmRleE9yaWcpOwotCWlmIChTVUNDRUVERUQoaHIpKSBkZF9nYmwuZHdGbGFncyAmPSB+RERSQVdJX01PREVDSEFOR0VEOwotICAgIH0KLQotICAgIHJldHVybiBocjsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUhBTF9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCi0JCQkgICAgICBEV09SRCBkd0hlaWdodCwgRFdPUkQgZHdCUFAsCi0JCQkgICAgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLQotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVsZHglbGR4JWxkLCVsZCBIeiwlMDhseClcbiIsVGhpcyxkd1dpZHRoLGR3SGVpZ2h0LGR3QlBQLGR3UmVmcmVzaFJhdGUsZHdGbGFncyk7Ci0gICAgaHIgPSBVc2VyX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoaWZhY2UsIGR3V2lkdGgsIGR3SGVpZ2h0LCBkd0JQUCwKLQkJCQkJZHdSZWZyZXNoUmF0ZSwgZHdGbGFncyk7Ci0KLSAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewotCWlmICghKGRkX2dibC5kd0ZsYWdzICYgRERSQVdJX01PREVDSEFOR0VEKSkgZGRfZ2JsLmR3TW9kZUluZGV4T3JpZyA9IGRkX2dibC5kd01vZGVJbmRleDsKLQlociA9IHNldF9tb2RlKFRoaXMsIGNob29zZV9tb2RlKGR3V2lkdGgsIGR3SGVpZ2h0LCBkd0JQUCwgZHdSZWZyZXNoUmF0ZSwgZHdGbGFncykpOwotCWlmIChTVUNDRUVERUQoaHIpKSBkZF9nYmwuZHdGbGFncyB8PSBERFJBV0lfTU9ERUNIQU5HRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIFdJTkFQSQotSEFMX0RpcmVjdERyYXdfR2V0Rm91ckNDQ29kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBEV09SRCBwTnVtQ29kZXMsCi0JCQkgICAgICAgTFBEV09SRCBwQ29kZXMpCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIGlmICgqcE51bUNvZGVzKQotCSpwTnVtQ29kZXM9ZGRfZ2JsLmR3TnVtRm91ckNDOwotICAgIGlmIChwQ29kZXMgJiYgZGRfZ2JsLmR3TnVtRm91ckNDKQotCW1lbWNweShwQ29kZXMsZGRfZ2JsLmxwZHdGb3VyQ0Msc2l6ZW9mKHBDb2Rlc1swXSkqZGRfZ2JsLmR3TnVtRm91ckNDKTsKLSAgICBGSVhNRSgiKCVwLCVwLCVwKVxuIixUaGlzLHBOdW1Db2RlcyxwQ29kZXMpOwotICAgIGlmIChkZF9nYmwuZHdOdW1Gb3VyQ0MpIHsKLQlpZiAocENvZGVzICYmIEZJWE1FX09OKGRkcmF3KSkgewotCSAgICBGSVhNRSgicmV0dXJuaW5nOiAiKTsKLQkgICAgZm9yIChpPTA7aTxkZF9nYmwuZHdOdW1Gb3VyQ0M7aSsrKSB7Ci0JCU1FU1NBR0UoIiVjJWMlYyVjLCIsCi0JCQkoKExQQllURSkocENvZGVzK2kpKVswXSwKLQkJCSgoTFBCWVRFKShwQ29kZXMraSkpWzFdLAotCQkJKChMUEJZVEUpKHBDb2RlcytpKSlbMl0sCi0JCQkoKExQQllURSkocENvZGVzK2kpKVszXQotCQkpOwotCSAgICB9Ci0JICAgIE1FU1NBR0UoIlxuIik7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLQotc3RhdGljIGNvbnN0IElEaXJlY3REcmF3N1Z0YmwgSEFMX0RpcmVjdERyYXdfVlRhYmxlID0KLXsKLSAgICBNYWluX0RpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3X0FkZFJlZiwKLSAgICBNYWluX0RpcmVjdERyYXdfUmVsZWFzZSwKLSAgICBNYWluX0RpcmVjdERyYXdfQ29tcGFjdCwKLSAgICBNYWluX0RpcmVjdERyYXdfQ3JlYXRlQ2xpcHBlciwKLSAgICBNYWluX0RpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSwKLSAgICBNYWluX0RpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSwKLSAgICBNYWluX0RpcmVjdERyYXdfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBVc2VyX0RpcmVjdERyYXdfRW51bURpc3BsYXlNb2RlcywKLSAgICBNYWluX0RpcmVjdERyYXdfRW51bVN1cmZhY2VzLAotICAgIE1haW5fRGlyZWN0RHJhd19GbGlwVG9HRElTdXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd19HZXRDYXBzLAotICAgIE1haW5fRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSwKLSAgICBIQUxfRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKLSAgICBNYWluX0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZSwKLSAgICBNYWluX0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKLSAgICBNYWluX0RpcmVjdERyYXdfR2V0U2NhbkxpbmUsCi0gICAgTWFpbl9EaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgTWFpbl9EaXJlY3REcmF3X0luaXRpYWxpemUsCi0gICAgSEFMX0RpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlLAotICAgIE1haW5fRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsLAotICAgIEhBTF9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlLAotICAgIE1haW5fRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuaywKLSAgICBNYWluX0RpcmVjdERyYXdfR2V0QXZhaWxhYmxlVmlkTWVtLAotICAgIE1haW5fRGlyZWN0RHJhd19HZXRTdXJmYWNlRnJvbURDLAotICAgIE1haW5fRGlyZWN0RHJhd19SZXN0b3JlQWxsU3VyZmFjZXMsCi0gICAgTWFpbl9EaXJlY3REcmF3X1Rlc3RDb29wZXJhdGl2ZUxldmVsLAotICAgIEhBTF9EaXJlY3REcmF3X0dldERldmljZUlkZW50aWZpZXIsCi0gICAgTWFpbl9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QsCi0gICAgTWFpbl9EaXJlY3REcmF3X0V2YWx1YXRlTW9kZQotfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXdfbWFpbi5jIGIvZGxscy9kZHJhdy9kZHJhd19tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzhiZTMuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9kZHJhd19tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg3ICswLDAgQEAKLS8qCQlEaXJlY3REcmF3IElEaXJlY3REcmF3IGludGVyZmFjZSAoZ2VuZXJpYykKLSAqCi0gKiBDb3B5cmlnaHQgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgotICogQ29weXJpZ2h0IDE5OTgtMjAwMCBMaW9uZWwgVWxtZXIgKG1vc3Qgb2YgRGlyZWN0M0Qgc3R1ZmYpCi0gKiBDb3B5cmlnaHQgMjAwMC0yMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKgotICogTk9URVMKLSAqCi0gKiBXSU5FIGN1cnJlbnRseSBpbXBsZW1lbnRzIGEgdmVyeSBiYXNpYyBzZXQgb2YgdGhlIERpcmVjdERyYXcgZnVuY3Rpb25hbGl0eQotICogaW4gZ3JhcGhpY3MvZGRyYXcuYy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGVpdGhlciB0aGUgWEZyZWU4Ni1ER0EgZXh0ZW5zaW9uIAotICogdG8gZ2V0IHZlcnkgZmFzdCBhY2Nlc3MgdG8gdGhlIGdyYXBoaWNzIGNhcmQgZnJhbWVidWZmZXIgYW5kIGRvdWJsZWJ1ZmZlcmluZwotICogZmVhdHVyZXMgb3IgWGxpYiwgd2hpY2ggaXMgc2xvd2VyLgotICogVGhlIGltcGxlbWVudGF0aW9uIHVzaW5nIFhGcmVlODYtREdBIGlzIGFzIGZhc3QgYXMgdGhlIE1TIGVxdWl2YWxlbnQgZm9yIHRoZQotICogc3R1ZmYgdGhhdCBpcyBpbXBsZW1lbnRlZC4KLSAqCi0gKiBTZXZlcmFsIGFwcGxpY2F0aW9ucyBhbHJlYWR5IHdvcmssIHNlZSBiZWxvdy4KLSAqIFByb2JsZW1zIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2luZyBYRnJlZTg2LURHQToKLSAqCi0gKgktIFhGcmVlODYgY2Fubm90IHN3aXRjaCBkZXB0aCBvbiB0aGUgZmx5LgotICoJICBUaGlzIGlzIGEgcHJvYmxlbSB3aXRoIFggYW5kIHVuYXZvaWRhYmxlLgotICoJICBDdXJyZW50IHNvbHV0aW9uIGlzIHRvIHBvcCB1cCBhIE1lc3NhZ2VCb3ggd2l0aCBhbiBlcnJvciBmb3IgCi0gKgkgIG1pc21hdGNoZWQgcGFyYW1ldGVycyBhbmQgYWR2aWNlIHRoZSB1c2VyIHRvIHJlc3RhcnQgdGhlIFggc2VydmVyCi0gKgkgIHdpdGggdGhlIHNwZWNpZmllZCBkZXB0aC4KLSAqCS0gVGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCBoYXMgdG8gYmUgaW1wbGVtZW50ZWQgd2lsbCBoYXZlCi0gKgkgIHRvIGJlIGRvbmUgaW4gc29mdHdhcmUgYW5kIHdpbGwgYmUgdmVyeSBzbG93LgotICoJLSBUaGlzIHJlcXVpcmVzIFdJTkUgdG8gYmUgcnVuIGFzIHJvb3QgdXNlciBzbyBYRjg2REdBIGNhbiBtbWFwIHRoZQotICoJICBmcmFtZWJ1ZmZlciBpbnRvIHRoZSBhZGRyZXNzc3BhY2Ugb2YgdGhlIHByb2Nlc3MuCi0gKgktIEJsb2NrcyBhbGwgb3RoZXIgWCB3aW5kb3dlZCBhcHBsaWNhdGlvbnMuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbgotICogYWxsIGludGVyZmFjZXMuIE9yIGJldHRlciwgaXQgaXMgYSAiY29tbW9uIHN0dWIiIGxpYnJhcnkgZm9yIHRoZQotICogSURpcmVjdERyYXcqIG9iamVjdHMKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAid2luZS9wb3J0LmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAotCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJ3aW5kZWYuaCIKLSNpbmNsdWRlICJ3aW5iYXNlLmgiCi0jaW5jbHVkZSAid2luZ2RpLmgiCi0jaW5jbHVkZSAiZGRyYXcuaCIKLSNpbmNsdWRlICJkM2QuaCIKLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0KLSNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCi0jaW5jbHVkZSAib3BlbmdsX3ByaXZhdGUuaCIgLyogVG8gaGF2ZSB0aGUgRDNEIGNyZWF0aW9uIGZ1bmN0aW9uICovCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotZXh0ZXJuIGNvbnN0IElEaXJlY3REcmF3VnRibCBERFJBV19JRGlyZWN0RHJhd19WVGFibGU7Ci1leHRlcm4gY29uc3QgSURpcmVjdERyYXcyVnRibCBERFJBV19JRGlyZWN0RHJhdzJfVlRhYmxlOwotZXh0ZXJuIGNvbnN0IElEaXJlY3REcmF3NFZ0YmwgRERSQVdfSURpcmVjdERyYXc0X1ZUYWJsZTsKLQotc3RhdGljIHZvaWQgRERSQVdfVW5zdWJjbGFzc1dpbmRvdyhJRGlyZWN0RHJhd0ltcGwqIFRoaXMpOwotCi1zdGF0aWMgdm9pZCBNYWluX0RpcmVjdERyYXdfRGVsZXRlU3VyZmFjZXMoSURpcmVjdERyYXdJbXBsKiBUaGlzKTsKLXN0YXRpYyB2b2lkIE1haW5fRGlyZWN0RHJhd19EZWxldGVDbGlwcGVycyhJRGlyZWN0RHJhd0ltcGwqIFRoaXMpOwotc3RhdGljIHZvaWQgTWFpbl9EaXJlY3REcmF3X0RlbGV0ZVBhbGV0dGVzKElEaXJlY3REcmF3SW1wbCogVGhpcyk7Ci1zdGF0aWMgdm9pZCBMb3NlUHJpbWFyeVN1cmZhY2UoSURpcmVjdERyYXdJbXBsKiBUaGlzKTsKLQotc3RhdGljIElOVDMyIGFsbG9jYXRlX21lbW9yeShJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIERXT1JEIG1lbSkgOwotc3RhdGljIHZvaWQgZnJlZV9tZW1vcnkoSURpcmVjdERyYXdJbXBsICpUaGlzLCBEV09SRCBtZW0pIDsKLQotCi1zdGF0aWMgY29uc3QgY2hhciBkZFByb3BbXSA9ICJXSU5FX0REUkFXX1Byb3BlcnR5IjsKLQotLyogTm90IGNhbGxlZCBmcm9tIHRoZSB2dGFibGUuICovCi1IUkVTVUxUIE1haW5fRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KQotewotICAgIC8qIE5PVEU6IFRoZSBjcmVhdG9yIG11c3QgdXNlIEhFQVBfWkVST19NRU1PUlkgb3IgZXF1aXZhbGVudC4gKi8KLSAgICBUaGlzLT5yZWYgPSAxOwotICAgIFRoaXMtPmV4ID0gZXg7Ci0KLSAgICBpZiAoZXgpIFRoaXMtPmxvY2FsLmR3TG9jYWxGbGFncyB8PSBERFJBV0lMQ0xfRElSRUNURFJBVzc7Ci0gICAgVGhpcy0+bG9jYWwuZHdQcm9jZXNzSWQgPSBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7Ci0KLSAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gTWFpbl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2U7Ci0KLSAgICBUaGlzLT5jcmVhdGVfcGFsZXR0ZSA9IE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQ3JlYXRlOwotCi0gICAgVGhpcy0+Y3JlYXRlX29mZnNjcmVlbiA9IE1haW5fY3JlYXRlX29mZnNjcmVlbjsKLSAgICBUaGlzLT5jcmVhdGVfdGV4dHVyZSAgID0gTWFpbl9jcmVhdGVfdGV4dHVyZTsKLSAgICBUaGlzLT5jcmVhdGVfemJ1ZmZlciAgID0gTWFpbl9jcmVhdGVfemJ1ZmZlcjsKLSAgICAvKiBUaGVyZSBhcmUgbm8gZ2VuZXJpYyB2ZXJzaW9ucyBvZiBjcmVhdGVfe3ByaW1hcnksYmFja2J1ZmZlcn0uICovCi0KLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3LCAgRERSQVdfSURpcmVjdERyYXdfVlRhYmxlKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3MiwgRERSQVdfSURpcmVjdERyYXcyX1ZUYWJsZSk7Ci0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzQsIEREUkFXX0lEaXJlY3REcmF3NF9WVGFibGUpOwotICAgIC8qIFRoZXJlIGlzIG5vIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgSURENyAqLwotCi0gICAgLyogVGhpcyBpcyBmb3IgdGhlIG1vbWVudCBoZXJlLi4uICovCi0gICAgVGhpcy0+ZnJlZV9tZW1vcnkgPSBmcmVlX21lbW9yeTsKLSAgICBUaGlzLT5hbGxvY2F0ZV9tZW1vcnkgPSBhbGxvY2F0ZV9tZW1vcnk7Ci0gICAgVGhpcy0+dG90YWxfdmlkbWVtID0gNjQgKiAxMDI0ICogMTAyNDsKLSAgICBUaGlzLT5hdmFpbGFibGVfdmlkbWVtID0gVGhpcy0+dG90YWxfdmlkbWVtOwotICAgICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi12b2lkIE1haW5fRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3SW1wbCogVGhpcykKLXsKLSAgICBpZiAoSXNXaW5kb3coVGhpcy0+d2luZG93KSkKLSAgICB7Ci0JaWYgKEdldFByb3BBKFRoaXMtPndpbmRvdywgZGRQcm9wKSkKLQkgICAgRERSQVdfVW5zdWJjbGFzc1dpbmRvdyhUaGlzKTsKLQllbHNlCi0JICAgIEZJWE1FKCJ0aGlzIHNob3VsZG4ndCBoYXBwZW4sIHJpZ2h0P1xuIik7Ci0gICAgfQotCi0gICAgTWFpbl9EaXJlY3REcmF3X0RlbGV0ZVN1cmZhY2VzKFRoaXMpOwotICAgIE1haW5fRGlyZWN0RHJhd19EZWxldGVDbGlwcGVycyhUaGlzKTsKLSAgICBNYWluX0RpcmVjdERyYXdfRGVsZXRlUGFsZXR0ZXMoVGhpcyk7Ci0gICAgaWYgKFRoaXMtPmxvY2FsLmxwR2JsICYmIFRoaXMtPmxvY2FsLmxwR2JsLT5scEV4Y2x1c2l2ZU93bmVyID09ICZUaGlzLT5sb2NhbCkKLSAgICB7Ci0JVGhpcy0+bG9jYWwubHBHYmwtPmxwRXhjbHVzaXZlT3duZXIgPSBOVUxMOwotCWlmIChUaGlzLT5zZXRfZXhjbHVzaXZlX21vZGUpCi0JICAgIFRoaXMtPnNldF9leGNsdXNpdmVfbW9kZShUaGlzLCBGQUxTRSk7Ci0gICAgfQotfQotCi0vKiBUaGVyZSBpcyBubyBNYWluX0RpcmVjdERyYXdfQ3JlYXRlLiAqLwotCi1VTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X0FkZFJlZihMUERJUkVDVERSQVc3IGlmYWNlKSB7Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwotCi0gICAgVFJBQ0UoIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiAtMSk7Ci0KLSAgICByZXR1cm4gcmVmOwotfQotCi1VTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1JlbGVhc2UoTFBESVJFQ1REUkFXNyBpZmFjZSkgewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKLQotICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCByZWYgKzEpOwotCi0gICAgaWYgKHJlZiA9PSAwKQotICAgIHsKLQlpZiAoVGhpcy0+ZmluYWxfcmVsZWFzZSAhPSBOVUxMKQotCSAgICBUaGlzLT5maW5hbF9yZWxlYXNlKFRoaXMpOwotCi0JLyogV2UgZnJlZSB0aGUgcHJpdmF0ZS4gVGhpcyBpcyBhbiBhcnRpZmFjdCBvZiB0aGUgZmFjdCB0aGF0IEkgZG9uJ3QKLQkgKiBoYXZlIHRoZSBkZXN0cnVjdG9ycyBzZXQgdXAgY29ycmVjdGx5LiAqLwotCWlmIChUaGlzLT5wcml2YXRlICE9IChUaGlzKzEpKQotCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5wcml2YXRlKTsKLQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiByZWY7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSgKLSAgICBMUERJUkVDVERSQVc3IGlmYWNlLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmoKLSkgewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwotCi0gICAgLyogQWNjb3JkaW5nIHRvIENPTSBkb2NzLCBpZiB0aGUgUXVlcnlJbnRlcmZhY2UgZmFpbHMsIG9iaiBzaG91bGQgYmUgc2V0IHRvIE5VTEwgKi8KLSAgICAqb2JqID0gTlVMTDsKLSAgICAKLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByZWZpaWQgKQotCSB8fCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzcsIHJlZmlpZCApICkKLSAgICB7Ci0JKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3Nyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdywgcmVmaWlkICkgKQotICAgIHsKLQkqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXcpOwotICAgIH0KLSAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcyLCByZWZpaWQgKSApCi0gICAgewotCSpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzIpOwotICAgIH0KLSAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc0LCByZWZpaWQgKSApCi0gICAgewotCSpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzQpOwotICAgIH0KLSNpZmRlZiBIQVZFX09QRU5HTAotICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QgICwgcmVmaWlkICkgfHwKLQkgICAgICBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QyICwgcmVmaWlkICkgfHwKLQkgICAgICBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QzICwgcmVmaWlkICkgfHwKLQkgICAgICBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0Q3ICwgcmVmaWlkICkgKQotICAgIHsKLSAgICAgICAgaWYgKG9wZW5nbF9pbml0aWFsaXplZCkgewotCSAgICBIUkVTVUxUIHJldF92YWx1ZTsKLQotCSAgICByZXRfdmFsdWUgPSBkaXJlY3QzZF9jcmVhdGUoVGhpcyk7Ci0JICAgIGlmIChGQUlMRUQocmV0X3ZhbHVlKSkgcmV0dXJuIHJldF92YWx1ZTsKLQkgICAgCi0JICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEICAsIHJlZmlpZCApICkgewotCSAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRCk7Ci0JCVRSQUNFKCIgcmV0dXJuaW5nIERpcmVjdDNEIGludGVyZmFjZSBhdCAlcC5cbiIsICpvYmopOwkgICAgCi0JICAgIH0gZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRDIgICwgcmVmaWlkICkgKSB7Ci0JICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMik7Ci0JCVRSQUNFKCIgcmV0dXJuaW5nIERpcmVjdDNEMiBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JqKTsJICAgIAotCSAgICB9IGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QzICAsIHJlZmlpZCApICkgewotCSAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpOwotCQlUUkFDRSgiIHJldHVybmluZyBEaXJlY3QzRDMgaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CSAgICAKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KTsKLQkJVFJBQ0UoIiByZXR1cm5pbmcgRGlyZWN0M0Q3IGludGVyZmFjZSBhdCAlcC5cbiIsICpvYmopOwkgICAgCi0JICAgIH0KLQl9IGVsc2UgewotCSAgICBFUlIoIkFwcGxpY2F0aW9uIHJlcXVlc3RzIGEgRGlyZWN0M0QgaW50ZXJmYWNlIGJ1dCBkeW5hbWljIE9wZW5HTCBzdXBwb3J0IGxvYWRpbmcgZmFpbGVkICFcbiIpOwotCSAgICBFUlIoIiglcCktPiglcywlcCk6IG5vIGludGVyZmFjZVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSxvYmopOwotCSAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLQl9Ci0gICAgfQotI2Vsc2UKLSAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEICAsIHJlZmlpZCApIHx8Ci0JICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEMiAsIHJlZmlpZCApIHx8Ci0JICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEMyAsIHJlZmlpZCApIHx8Ci0JICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNENyAsIHJlZmlpZCApICkKLSAgICB7Ci0gICAgICAgIEVSUigiQXBwbGljYXRpb24gcmVxdWVzdHMgYSBEaXJlY3QzRCBpbnRlcmZhY2UgYnV0IE9wZW5HTCBzdXBwb3J0IG5vdCBidWlsdC1pbiAhXG4iKTsKLQlFUlIoIiglcCktPiglcywlcCk6IG5vIGludGVyZmFjZVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSxvYmopOwotCXJldHVybiBFX05PSU5URVJGQUNFOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UKLSAgICB7Ci0JRklYTUUoIiglcCktPiglcywlcCk6IG5vIGludGVyZmFjZVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSxvYmopOwotCXJldHVybiBFX05PSU5URVJGQUNFOwotICAgIH0KLQotICAgIElEaXJlY3REcmF3N19BZGRSZWYoaWZhY2UpOwotICAgIHJldHVybiBTX09LOwotfQotCi0vKiBNU0ROOiAibm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCIuICovCi1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfQ29tcGFjdChMUERJUkVDVERSQVc3IGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApXG4iLCBpZmFjZSk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyKExQRElSRUNURFJBVzcgaWZhY2UsCi0JCQkJCSAgICAgRFdPUkQgZHdGbGFncywKLQkJCQkJICAgICBMUERJUkVDVERSQVdDTElQUEVSICpwcENsaXBwZXIsCi0JCQkJCSAgICAgSVVua25vd24gKnBVbmtPdXRlcikKLXsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0gICAgSFJFU1VMVCBocjsKLQotICAgIFRSQUNFKCIoJXApLT4oMHglbHgsICVwLCAlcClcbiIsIGlmYWNlLCBkd0ZsYWdzLCBwcENsaXBwZXIsIHBVbmtPdXRlcik7Ci0KLSAgICBociA9IERpcmVjdERyYXdDcmVhdGVDbGlwcGVyKGR3RmxhZ3MsIHBwQ2xpcHBlciwgcFVua091dGVyKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCi0gICAgLyogZHdGbGFncyBpcyBwYXNzZWQgdHdpY2UsIGFwcGFyZW50bHkgYW4gQVBJIHdhcnQuICovCi0gICAgaHIgPSBJRGlyZWN0RHJhd0NsaXBwZXJfSW5pdGlhbGl6ZSgqcHBDbGlwcGVyLAotCQkJCSAgICAgICBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdyksCi0JCQkJICAgICAgIGR3RmxhZ3MpOwotICAgIGlmIChGQUlMRUQoaHIpKQotICAgIHsKLQlJRGlyZWN0RHJhd0NsaXBwZXJfUmVsZWFzZSgqcHBDbGlwcGVyKTsKLQlyZXR1cm4gaHI7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKLQkJCSAgICAgIExQUEFMRVRURUVOVFJZIHBhbGVudCwKLQkJCSAgICAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSwKLQkJCSAgICAgIExQVU5LTk9XTiBwVW5rbm93bikKLXsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0gICAgTFBESVJFQ1REUkFXUEFMRVRURSBwUGFsZXR0ZTsKLSAgICBIUkVTVUxUIGhyOwotCi0gICAgVFJBQ0UoIiglcCktPiglMDhseCwlcCwlcCwlcClcbiIsVGhpcyxkd0ZsYWdzLHBhbGVudCxwcFBhbGV0dGUscFVua25vd24pOwotCi0gICAgaWYgKHBwUGFsZXR0ZSA9PSBOVUxMKSByZXR1cm4gRV9QT0lOVEVSOyAvKiB1bmNoZWNrZWQgKi8KLSAgICBpZiAocFVua25vd24gIT0gTlVMTCkgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsgLyogdW5jaGVja2VkICovCi0KLSAgICBociA9IFRoaXMtPmNyZWF0ZV9wYWxldHRlKFRoaXMsIGR3RmxhZ3MsICZwUGFsZXR0ZSwgcFVua25vd24pOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLSAgICBociA9IElEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKHBQYWxldHRlLCAwLCAwLAotCQkJCSAgICAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX1NpemUoZHdGbGFncyksCi0JCQkJICAgICAgIHBhbGVudCk7Ci0gICAgaWYgKEZBSUxFRChocikpCi0gICAgewotCUlEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKHBQYWxldHRlKTsKLQlyZXR1cm4gaHI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JKnBwUGFsZXR0ZSA9IHBQYWxldHRlOwotCXJldHVybiBERF9PSzsKLSAgICB9Ci19Ci0KLUhSRVNVTFQKLU1haW5fY3JlYXRlX29mZnNjcmVlbihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlcikKLXsKLSAgICBhc3NlcnQocE91dGVyID09IE5VTEwpOwotCi0gICAgcmV0dXJuIERJQl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcywgcEREU0QsIHBwU3VyZiwgcE91dGVyKTsKLX0KLQotSFJFU1VMVAotTWFpbl9jcmVhdGVfdGV4dHVyZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsIExQVU5LTk9XTiBwT3V0ZXIsCi0JCSAgICBEV09SRCBkd01pcE1hcExldmVsKQotewotICAgIGFzc2VydChwT3V0ZXIgPT0gTlVMTCk7Ci0KLSAgICByZXR1cm4gRElCX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwT3V0ZXIpOwotfQotCi1IUkVTVUxUCi1NYWluX2NyZWF0ZV96YnVmZmVyKElEaXJlY3REcmF3SW1wbCogVGhpcywgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlcikKLXsKLSAgICBhc3NlcnQocE91dGVyID09IE5VTEwpOwotCi0gICAgcmV0dXJuIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwT3V0ZXIpOwotfQotCi0vKiBEb2VzIHRoZSB0ZXh0dXJlIHN1cmZhY2UgZGVzY3JpYmVkIGluIHBERFNEIGhhdmUgYW55IHNtYWxsZXIgbWlwbWFwcz8gKi8KLXN0YXRpYyBCT09MIG1vcmVfbWlwbWFwcyhjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QpCi17Ci0gICAgcmV0dXJuICgocEREU0QtPmR3RmxhZ3MgJiBERFNEX01JUE1BUENPVU5UKSAmJiBwRERTRC0+dTIuZHdNaXBNYXBDb3VudCA+IDEKLQkgICAgJiYgKHBERFNELT5kd1dpZHRoID4gMSB8fCBwRERTRC0+ZHdIZWlnaHQgPiAxKSk7Ci19Ci0KLS8qIENyZWF0ZSBhIHRleHR1cmUgc3VyZmFjZSBhbG9uZyB3aXRoIGFueSBvZiBpdHMgbWlwbWFwcy4gKi8KLXN0YXRpYyBIUkVTVUxUCi1jcmVhdGVfdGV4dHVyZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKLQkgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBVbmtPdXRlcikKLXsKLSAgICBERFNVUkZBQ0VERVNDMiBkZHNkOwotICAgIERXT1JEIG1pcG1hcF9sZXZlbCA9IDA7Ci0gICAgSFJFU1VMVCBocjsKLQotICAgIGFzc2VydChwVW5rT3V0ZXIgPT0gTlVMTCk7Ci0KLSAgICAvKiBpcyB0aGlzIGNoZWNrIHJpZ2h0PyAocGl4ZWxmb3JtYXQgY2FuIGJlIGNvcGllZCBmcm9tIHByaW1hcnkpICovCi0gICAgaWYgKChwRERTRC0+ZHdGbGFncyYoRERTRF9IRUlHSFR8RERTRF9XSURUSCkpICE9IChERFNEX0hFSUdIVHxERFNEX1dJRFRIKSkKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQotICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwotICAgIEREX1NUUlVDVF9DT1BZX0JZU0laRSgoJmRkc2QpLHBERFNEKTsKLQotICAgIGlmICghKGRkc2QuZHdGbGFncyAmIEREU0RfUElYRUxGT1JNQVQpKQotICAgIHsKLQlkZHNkLnU0LmRkcGZQaXhlbEZvcm1hdCA9IFRoaXMtPnBpeGVsZm9ybWF0OwotICAgIH0KLQotI2lmZGVmIEhBVkVfT1BFTkdMCi0gICAgLyogV2Ugc3VwcG9ydCBmb3Igbm93IG9ubHkgRFhUMSwgRFhUMyAmIERYVDUgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMuLi4gKi8KLSAgICBpZiAoKGRkc2QudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykgJiYKLSAgICAgICAgKGRkc2QudTQuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDICE9IE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCcxJykpICYmCi0gICAgICAgIChkZHNkLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyAhPSBNQUtFX0ZPVVJDQygnRCcsJ1gnLCdUJywnMycpKSAmJgotICAgICAgICAoZGRzZC51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MgIT0gTUFLRV9GT1VSQ0MoJ0QnLCdYJywnVCcsJzUnKSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQSVhFTEZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBjYW4gcmVhbGx5IHN1cHBvcnQgRFhUMSwgRFhUMyAmIERYVDUgKi8KLSAgICBpZiAoKGRkc2QudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykgJiYKLQkhR0xfZXh0ZW5zaW9ucy5zM3RjX2NvbXByZXNzZWRfdGV4dHVyZSAmJiAhczN0Y19pbml0aWFsaXplZCkgewotCXN0YXRpYyBCT09MRUFOIHVzZXJfd2FybmVkID0gMDsKLQlpZiAodXNlcl93YXJuZWQgPT0gMCkgewotCSAgICBFUlIoIlRyeWluZyB0byBjcmVhdGUgRFhUMSwgRFhUMyBvciBEWFQ1IHRleHR1cmUgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdmlkZW8gY2FyZCEhIVxuIik7Ci0JICAgIEVSUigiSG93ZXZlciB0aGVyZSBpcyBhIGxpYnJhcnkgbGlidHhjX2R4dG4uc28gdGhhdCBjYW4gYmUgdXNlZCB0byBkbyB0aGUgc29mdHdhcmUgZGVjb21wcmVzc2lvbi4uLlxuIik7Ci0JICAgIHVzZXJfd2FybmVkID0gMTsKLQl9Ci0gICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUElYRUxGT1JNQVQ7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoZGRzZC51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfRk9VUkNDKQotICAgIHsKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBJWEVMRk9STUFUOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKChkZHNkLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpICYmICEoZGRzZC5kd0ZsYWdzICYgRERTRF9MSU5FQVJTSVpFKSkKLSAgICB7Ci0JaW50IHNpemUgPSAwOwotCWludCB3aWR0aCA9IGRkc2QuZHdXaWR0aDsKLQlpbnQgaGVpZ2h0ID0gZGRzZC5kd0hlaWdodDsKLQlzd2l0Y2goZGRzZC51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MpIHsKLQkgICAgY2FzZSBNQUtFX0ZPVVJDQygnRCcsJ1gnLCdUJywnMScpOiBzaXplID0gKCh3aWR0aCszKSZ+MykgKiAoKGhlaWdodCszKSZ+MykgLyAxNiAqIDg7IGJyZWFrOwotCSAgICBjYXNlIE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCczJyk6IHNpemUgPSAoKHdpZHRoKzMpJn4zKSAqICgoaGVpZ2h0KzMpJn4zKSAvIDE2ICogMTY7IGJyZWFrOwotCSAgICBjYXNlIE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCc1Jyk6IHNpemUgPSAoKHdpZHRoKzMpJn4zKSAqICgoaGVpZ2h0KzMpJn4zKSAvIDE2ICogMTY7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBGSVhNRSgiRk9VUkNDIG5vdCBzdXBwb3J0ZWRcbiIpOyBicmVhazsKLQl9Ci0JZGRzZC51MS5kd0xpbmVhclNpemUgPSBzaXplOwotCWRkc2QuZHdGbGFncyB8PSBERFNEX0xJTkVBUlNJWkU7Ci0gICAgfSBlbHNlIGlmICghKGRkc2QudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykgJiYgIShkZHNkLmR3RmxhZ3MgJiBERFNEX1BJVENIKSkgewotCWRkc2QudTEubFBpdGNoID0gRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKGRkc2QuZHdXaWR0aCwgR0VUX0JQUChkZHNkKSo4KTsKLQlkZHNkLmR3RmxhZ3MgfD0gRERTRF9QSVRDSDsKLSAgICB9Ci0KLSAgICBpZigoZGRzZC5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKSAmJgotICAgICAgICAhKGRkc2QuZHdGbGFncyAmIEREU0RfTUlQTUFQQ09VTlQpKQotICAgIHsKLSAgICAgICAgaWYoZGRzZC5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfQ09NUExFWCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVW5kb2N1bWVudGVkIGZlYXR1cmU6IGlmIEREU0NBUFNfTUlQTUFQIGFuZCBERFNDQVBTX0NPTVBMRVggYXJlCi0gICAgICAgICAgICAgKiBib3RoIHNldCwgYnV0IG1pcG1hcCBjb3VudCBpc24ndCBnaXZlbiwgYXMgbWFueSBtaXBtYXAgbGV2ZWxzCi0gICAgICAgICAgICAgKiBhcyBuZWNlc3NhcnkgYXJlIGNyZWF0ZWQgdG8gZ2V0IGRvd24gdG8gYSBzaXplIHdoZXJlIGVpdGhlcgotICAgICAgICAgICAgICogdGhlIHdpZHRoIG9yIHRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUgaXMgMS4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBUaGlzIGlzIG5lZWRlZCBieSBBbmFyY2h5IE9ubGluZS4gKi8KLSAgICAgICAgICAgIERXT1JEIG1pbiA9IGRkc2QuZHdXaWR0aCA8IGRkc2QuZHdIZWlnaHQgPwotICAgICAgICAgICAgICAgICAgICAgICAgZGRzZC5kd1dpZHRoIDogZGRzZC5kd0hlaWdodDsKLSAgICAgICAgICAgIGRkc2QudTIuZHdNaXBNYXBDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSggbWluICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZHNkLnUyLmR3TWlwTWFwQ291bnQrKzsKLSAgICAgICAgICAgICAgICBtaW4gPj49IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgLyogQ3JlYXRlIGEgc2luZ2xlIG1pcG1hcC4gKi8KLSAgICAgICAgICAgIGRkc2QudTIuZHdNaXBNYXBDb3VudCA9IDE7Ci0gCi0gICAgICAgIGRkc2QuZHdGbGFncyB8PSBERFNEX01JUE1BUENPVU5UOwotICAgIH0KLSAgICAKLSAgICBkZHNkLmR3RmxhZ3MgfD0gRERTRF9QSVhFTEZPUk1BVDsKLQotICAgIGhyID0gVGhpcy0+Y3JlYXRlX3RleHR1cmUoVGhpcywgJmRkc2QsIHBwU3VyZiwgcFVua091dGVyLCBtaXBtYXBfbGV2ZWwpOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLSAgICBpZiAoVGhpcy0+ZDNkX3ByaXZhdGUpIFRoaXMtPmQzZF9jcmVhdGVfdGV4dHVyZShUaGlzLCBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCAqcHBTdXJmKSwgVFJVRSwgCi0JCQkJCQkgICAgSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgKnBwU3VyZikpOwotCi0gICAgLyogQ3JlYXRlIGF0dGFjaGVkIG1pcG1hcHMgaWYgcmVxdWlyZWQuICovCi0gICAgaWYgKG1vcmVfbWlwbWFwcygmZGRzZCkpCi0gICAgewotCUxQRElSRUNURFJBV1NVUkZBQ0U3IG1pcG1hcDsKLQlMUERJUkVDVERSQVdTVVJGQUNFNyBwcmV2X21pcG1hcDsKLQlERFNVUkZBQ0VERVNDMiBtaXBtYXBfc3VyZmFjZV9kZXNjOwotCi0JcHJldl9taXBtYXAgPSAqcHBTdXJmOwotCUlEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKHByZXZfbWlwbWFwKTsKLQltaXBtYXBfc3VyZmFjZV9kZXNjID0gZGRzZDsKLQltaXBtYXBfc3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiB8PSBERFNDQVBTMl9NSVBNQVBTVUJMRVZFTDsKLQotCXdoaWxlIChtb3JlX21pcG1hcHMoJm1pcG1hcF9zdXJmYWNlX2Rlc2MpKQotCXsKLQkgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqbWlwbWFwX2ltcGw7Ci0JICAgIAotCSAgICBtaXBtYXBfbGV2ZWwrKzsKLQkgICAgbWlwbWFwX3N1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50LS07Ci0KLQkgICAgaWYgKG1pcG1hcF9zdXJmYWNlX2Rlc2MuZHdXaWR0aCA+IDEpCi0JCW1pcG1hcF9zdXJmYWNlX2Rlc2MuZHdXaWR0aCAvPSAyOwotCi0JICAgIGlmIChtaXBtYXBfc3VyZmFjZV9kZXNjLmR3SGVpZ2h0ID4gMSkKLQkJbWlwbWFwX3N1cmZhY2VfZGVzYy5kd0hlaWdodCAvPSAyOwotCi0JICAgIGlmIChtaXBtYXBfc3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpIHsKLQkJaW50IHNpemUgPSAwOwotCQlpbnQgd2lkdGggPSBtaXBtYXBfc3VyZmFjZV9kZXNjLmR3V2lkdGg7Ci0JCWludCBoZWlnaHQgPSBtaXBtYXBfc3VyZmFjZV9kZXNjLmR3SGVpZ2h0OwotCQlzd2l0Y2gobWlwbWFwX3N1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MpIHsKLQkJICAgIGNhc2UgTUFLRV9GT1VSQ0MoJ0QnLCdYJywnVCcsJzEnKTogc2l6ZSA9ICgod2lkdGgrMykmfjMpICogKChoZWlnaHQrMykmfjMpIC8gMTYgKiA4OyBicmVhazsKLQkJICAgIGNhc2UgTUFLRV9GT1VSQ0MoJ0QnLCdYJywnVCcsJzMnKTogc2l6ZSA9ICgod2lkdGgrMykmfjMpICogKChoZWlnaHQrMykmfjMpIC8gMTYgKiAxNjsgYnJlYWs7Ci0JCSAgICBjYXNlIE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCc1Jyk6IHNpemUgPSAoKHdpZHRoKzMpJn4zKSAqICgoaGVpZ2h0KzMpJn4zKSAvIDE2ICogMTY7IGJyZWFrOwotCQkgICAgZGVmYXVsdDogRklYTUUoIkZPVVJDQyBub3Qgc3VwcG9ydGVkXG4iKTsgYnJlYWs7Ci0JCX0KLQkJbWlwbWFwX3N1cmZhY2VfZGVzYy51MS5kd0xpbmVhclNpemUgPSBzaXplOwotCSAgICB9IGVsc2UgewotCQlkZHNkLnUxLmxQaXRjaCA9IEREUkFXX3dpZHRoX2JwcF90b19waXRjaChkZHNkLmR3V2lkdGgsIEdFVF9CUFAoZGRzZCkqOCk7Ci0JCW1pcG1hcF9zdXJmYWNlX2Rlc2MudTEubFBpdGNoCi0JCSAgICA9IEREUkFXX3dpZHRoX2JwcF90b19waXRjaChtaXBtYXBfc3VyZmFjZV9kZXNjLmR3V2lkdGgsCi0JCQkJCSAgICAgICBHRVRfQlBQKGRkc2QpKjgpOwotCSAgICB9Ci0KLQkgICAgaHIgPSBUaGlzLT5jcmVhdGVfdGV4dHVyZShUaGlzLCAmbWlwbWFwX3N1cmZhY2VfZGVzYywgJm1pcG1hcCwKLQkJCQkgICAgICBwVW5rT3V0ZXIsIG1pcG1hcF9sZXZlbCk7Ci0JICAgIGlmIChGQUlMRUQoaHIpKQotCSAgICB7Ci0JCUlEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShwcmV2X21pcG1hcCk7Ci0JCUlEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZSgqcHBTdXJmKTsKLQkJcmV0dXJuIGhyOwotCSAgICB9Ci0JICAgIAotCSAgICAvKiBUaGlzIGlzIG5lZWRlZCBmb3IgZGVsYXllZCBtaXBtYXAgY3JlYXRpb24gKi8KLQkgICAgbWlwbWFwX2ltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBtaXBtYXApOwotCSAgICBtaXBtYXBfaW1wbC0+bWlwX21haW4gPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCAqcHBTdXJmKTsKLQkgICAgbWlwbWFwX2ltcGwtPm1pcG1hcF9sZXZlbCA9IG1pcG1hcF9sZXZlbDsKLQotCSAgICBpZiAoVGhpcy0+ZDNkX3ByaXZhdGUpIFRoaXMtPmQzZF9jcmVhdGVfdGV4dHVyZShUaGlzLCBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBtaXBtYXApLCBUUlVFLAotCQkJCQkJCSAgICBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCAqcHBTdXJmKSk7Ci0KLQkgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2UocHJldl9taXBtYXAsIG1pcG1hcCk7Ci0JICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShwcmV2X21pcG1hcCk7Ci0JICAgIHByZXZfbWlwbWFwID0gbWlwbWFwOwotCX0KLQotCUlEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShwcmV2X21pcG1hcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKiBDcmVhdGVzIGEgcHJpbWFyeSBzdXJmYWNlIGFuZCBhbnkgaW5kaWNhdGVkIGJhY2tidWZmZXJzLiAqLwotc3RhdGljIEhSRVNVTFQKLWNyZWF0ZV9wcmltYXJ5KElEaXJlY3REcmF3SW1wbCogVGhpcywgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwKLQkgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBVbmtPdXRlcikKLXsKLSAgICBERFNVUkZBQ0VERVNDMiBkZHNkOwotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBhc3NlcnQocFVua091dGVyID09IE5VTEwpOwotCi0gICAgaWYgKFRoaXMtPnByaW1hcnlfc3VyZmFjZSAhPSBOVUxMKQotCXJldHVybiBEREVSUl9QUklNQVJZU1VSRkFDRUFMUkVBRFlFWElTVFM7Ci0KLSAgICAvKiBhcyBkb2N1bWVudGVkICh3aGF0IGFib3V0IHBpdGNoPykgKi8KLSAgICBpZiAocEREU0QtPmR3RmxhZ3MgJiAoRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX1BJWEVMRk9STUFUKSkKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQotICAgIGRkc2QuZHdTaXplID0gc2l6ZW9mKGRkc2QpOwotICAgIEREX1NUUlVDVF9DT1BZX0JZU0laRSgoJmRkc2QpLHBERFNEKTsKLSAgICBkZHNkLmR3RmxhZ3MgfD0gRERTRF9IRUlHSFQgfCBERFNEX1dJRFRIIHwgRERTRF9QSVRDSCB8IEREU0RfUElYRUxGT1JNQVQ7Ci0gICAgZGRzZC5kd0hlaWdodCA9IFRoaXMtPmhlaWdodDsKLSAgICBkZHNkLmR3V2lkdGggPSBUaGlzLT53aWR0aDsKLSAgICBkZHNkLnUxLmxQaXRjaCA9IFRoaXMtPnBpdGNoOwotICAgIGRkc2QudTQuZGRwZlBpeGVsRm9ybWF0ID0gVGhpcy0+cGl4ZWxmb3JtYXQ7Ci0gICAgZGRzZC5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX0xPQ0FMVklETUVNIHwgRERTQ0FQU19WSURFT01FTU9SWQotCXwgRERTQ0FQU19WSVNJQkxFIHwgRERTQ0FQU19GUk9OVEJVRkZFUjsKLQotICAgIGlmICgoZGRzZC5kd0ZsYWdzICYgRERTRF9CQUNLQlVGRkVSQ09VTlQpICYmIGRkc2QuZHdCYWNrQnVmZmVyQ291bnQgPiAwKQotCWRkc2QuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19GTElQOwotCi0gICAgaHIgPSBUaGlzLT5jcmVhdGVfcHJpbWFyeShUaGlzLCAmZGRzZCwgcHBTdXJmLCBwVW5rT3V0ZXIpOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLSAgICBpZiAoZGRzZC5kd0ZsYWdzICYgRERTRF9CQUNLQlVGRkVSQ09VTlQpCi0gICAgewotCUlEaXJlY3REcmF3U3VyZmFjZUltcGwqIHByaW1hcnk7Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTcgcFByZXY7Ci0JRFdPUkQgaTsKLQotCWRkc2QuZHdGbGFncyAmPSB+RERTRF9CQUNLQlVGRkVSQ09VTlQ7Ci0JZGRzZC5kZHNDYXBzLmR3Q2FwcyAmPSB+KEREU0NBUFNfVklTSUJMRSB8IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UKLQkJCQkgfCBERFNDQVBTX0JBQ0tCVUZGRVIgfCBERFNDQVBTX0ZST05UQlVGRkVSKTsKLQotCXByaW1hcnkgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLElEaXJlY3REcmF3U3VyZmFjZTcsCi0JCQkgICAgICAqcHBTdXJmKTsKLQlwUHJldiA9ICpwcFN1cmY7Ci0JSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYocFByZXYpOwotCi0JZm9yIChpPTA7IGkgPCBkZHNkLmR3QmFja0J1ZmZlckNvdW50OyBpKyspCi0JewotCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBwQmFjazsKLQotCSAgICBpZiAoaSA9PSAwKQotCQlkZHNkLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfQkFDS0JVRkZFUjsKLQkgICAgZWxzZQotCQlkZHNkLmRkc0NhcHMuZHdDYXBzICY9IH5ERFNDQVBTX0JBQ0tCVUZGRVI7Ci0KLQkgICAgaHIgPSBUaGlzLT5jcmVhdGVfYmFja2J1ZmZlcihUaGlzLCAmZGRzZCwgJnBCYWNrLCBwVW5rT3V0ZXIsCi0JCQkJCSBwcmltYXJ5KTsKLQotCSAgICBpZiAoRkFJTEVEKGhyKSkKLQkgICAgewotCQlJRGlyZWN0RHJhdzdfUmVsZWFzZShwUHJldik7Ci0JCUlEaXJlY3REcmF3N19SZWxlYXNlKCpwcFN1cmYpOwotCQlyZXR1cm4gaHI7Ci0JICAgIH0KLQotCSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShwUHJldiwgcEJhY2spOwotCSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocFByZXYpOwotCSAgICBwUHJldiA9IHBCYWNrOwotCX0KLQotCUlEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShwUHJldik7Ci0gICAgfQotCi0gICAgVGhpcy0+cHJpbWFyeV9zdXJmYWNlID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKikqcHBTdXJmOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgSFJFU1VMVAotY3JlYXRlX29mZnNjcmVlbihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIExQRERTVVJGQUNFREVTQzIgcEREU0QsCi0JCSBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLCBMUFVOS05PV04gcFVua091dGVyKQotewotICAgIEREU1VSRkFDRURFU0MyIGRkc2Q7Ci0gICAgSFJFU1VMVCBocjsKLQotICAgIC8qIGlzIHRoaXMgY2hlY2sgcmlnaHQ/IChwaXhlbGZvcm1hdCBjYW4gYmUgY29waWVkIGZyb20gcHJpbWFyeSkgKi8KLSAgICBpZiAoKHBERFNELT5kd0ZsYWdzJihERFNEX0hFSUdIVHxERFNEX1dJRFRIKSkgIT0gKEREU0RfSEVJR0hUfEREU0RfV0lEVEgpKQotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCi0gICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7Ci0gICAgRERfU1RSVUNUX0NPUFlfQllTSVpFKCgmZGRzZCkscEREU0QpOwotCi0gICAgaWYgKCEoZGRzZC5kd0ZsYWdzICYgRERTRF9QSVhFTEZPUk1BVCkpCi0gICAgewotCWRkc2QudTQuZGRwZlBpeGVsRm9ybWF0ID0gVGhpcy0+cGl4ZWxmb3JtYXQ7Ci0gICAgfQotCi0gICAgaWYgKCEoZGRzZC5kd0ZsYWdzICYgRERTRF9QSVRDSCkpCi0gICAgewotCWRkc2QudTEubFBpdGNoID0gRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKGRkc2QuZHdXaWR0aCwKLQkJCQkJCSAgR0VUX0JQUChkZHNkKSo4KTsKLSAgICB9Ci0KLSAgICBkZHNkLmR3RmxhZ3MgfD0gRERTRF9QSVRDSCB8IEREU0RfUElYRUxGT1JNQVQ7Ci0KLSAgICBociA9IFRoaXMtPmNyZWF0ZV9vZmZzY3JlZW4oVGhpcywgJmRkc2QsIHBwU3VyZiwgcFVua091dGVyKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCi0gICAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwKLQkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3ICpwcFN1cmYsCi0JCQkgICAgICBJVW5rbm93biAqcFVua091dGVyKQotewotICAgIEhSRVNVTFQgaHI7Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcClcbiIsVGhpcyxwRERTRCxwcFN1cmYscFVua091dGVyKTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCJSZXF1ZXN0aW5nIHN1cmZhY2UgZGVzYyA6XG4iKTsKLSAgICAgICAgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MocEREU0QpOwotICAgIH0KLQotICAgIGlmIChwVW5rT3V0ZXIgIT0gTlVMTCkgewotCUZJWE1FKCJvdXRlciAhPSBOVUxMP1xuIik7Ci0JcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsgLyogdW5jaGVja2VkICovCi0gICAgfQotCi0gICAgaWYgKCEocEREU0QtPmR3RmxhZ3MgJiBERFNEX0NBUFMpKSB7Ci0JLyogRFZJREVPLkRMTCBkb2VzIGZvcmdldCB0aGUgRERTRF9DQVBTIGZsYWcgLi4uICpzaWdoKiAqLwotICAgIAlwRERTRC0+ZHdGbGFncyB8PSBERFNEX0NBUFM7Ci0gICAgfQotICAgIGlmIChwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgPT0gMCkgewotCS8qIFRoaXMgaGFzIGJlZW4gY2hlY2tlZCBvbiByZWFsIFdpbmRvd3MgKi8KLQlwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX0xPQ0FMVklETUVNIHwgRERTQ0FQU19WSURFT01FTU9SWTsKLSAgICB9Ci0KLSAgICBpZiAocEREU0QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19BTExPQ09OTE9BRCkgewotICAgICAgICAvKiBJZiB0aGUgc3VyZmFjZSBpcyBvZiB0aGUgJ2FsbG9jb25sb2FkJyB0eXBlLCBpZ25vcmUgdGhlIExQU1VSRkFDRSBmaWVsZCAqLwotICAgICAgICBwRERTRC0+ZHdGbGFncyAmPSB+RERTRF9MUFNVUkZBQ0U7Ci0gICAgfQotCi0gICAgaWYgKChwRERTRC0+ZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSAmJiAocEREU0QtPmxwU3VyZmFjZSA9PSBOVUxMKSkgewotICAgICAgICAvKiBGcmFuayBIZXJiZXJ0J3MgRHVuZSBzcGVjaWZpZXMgYSBudWxsIHBvaW50ZXIgZm9yIHRoZSBzdXJmYWNlLCBpZ25vcmUgdGhlIExQU1VSRkFDRSBmaWVsZCAqLwotICAgICAgICBXQVJOKCJOdWxsIHN1cmZhY2UgcG9pbnRlciBzcGVjaWZpZWQsIGlnbm9yZSBpdCFcbiIpOwotICAgICAgICBwRERTRC0+ZHdGbGFncyAmPSB+RERTRF9MUFNVUkZBQ0U7Ci0gICAgfQotCi0gICAgaWYgKHBwU3VyZiA9PSBOVUxMKSB7Ci0JRklYTUUoIllvdSB3YW50IHRvIGdldCBiYWNrIGEgc3VyZmFjZT8gRG9uJ3QgZ2l2ZSBOVUxMIHB0cnMhXG4iKTsKLQlyZXR1cm4gRV9QT0lOVEVSOyAvKiB1bmNoZWNrZWQgKi8KLSAgICB9Ci0KLSAgICBpZiAocEREU0QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKLSAgICB7Ci0JLyogY3JlYXRlIHByaW1hcnkgc3VyZmFjZSAmIGJhY2tidWZmZXJzICovCi0JaHIgPSBjcmVhdGVfcHJpbWFyeShUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOwotICAgIH0KLSAgICBlbHNlIGlmIChwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0JBQ0tCVUZGRVIpCi0gICAgewotICAgICAgIC8qIGNyZWF0ZSBiYWNrYnVmZmVyIHN1cmZhY2UgKi8KLSAgICAgICBociA9IFRoaXMtPmNyZWF0ZV9iYWNrYnVmZmVyKFRoaXMsIHBERFNELCBwcFN1cmYsIHBVbmtPdXRlciwgTlVMTCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfVEVYVFVSRSkKLSAgICB7Ci0JLyogY3JlYXRlIHRleHR1cmUgKi8KLQlociA9IGNyZWF0ZV90ZXh0dXJlKFRoaXMsIHBERFNELCBwcFN1cmYsIHBVbmtPdXRlcik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAocEREU0QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19aQlVGRkVSKSAmJgotCSAgICAgIShwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX09GRlNDUkVFTlBMQUlOKSkgLyogU3VwcG9ydCBERFNDQVBTX1NZU1RFTU1FTU9SWSAqLwotICAgIHsKLQkvKiBjcmVhdGUgei1idWZmZXIgKi8KLQlociA9IFRoaXMtPmNyZWF0ZV96YnVmZmVyKFRoaXMsIHBERFNELCBwcFN1cmYsIHBVbmtPdXRlcik7Ci0gICAgfQotICAgIGVsc2UgaWYgKChwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX09GRlNDUkVFTlBMQUlOKSB8fAotCSAgICAgKHBERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfU1lTVEVNTUVNT1JZKSkgLyogTm8gZGlmZmVyZW5jZSBpbiBXaW5lIHJpZ2h0IG5vdyAqLwotICAgIHsKLQkvKiBjcmVhdGUgb2Zmc2NyZWVucGxhaW4gc3VyZmFjZSAqLwotCWhyID0gY3JlYXRlX29mZnNjcmVlbihUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCS8qIE90aGVyd2lzZSwgYXNzdW1lIG9mZnNjcmVlbnBsYWluIHN1cmZhY2UgKi8KLQlUUkFDRSgiQXBwIGRpZG4ndCByZXF1ZXN0IGEgdmFsaWQgc3VyZmFjZSB0eXBlIC0gYXNzdW1pbmcgb2Zmc2NyZWVucGxhaW5cbiIpOwotCWhyID0gY3JlYXRlX29mZnNjcmVlbihUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOwotICAgIH0KLQotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0JRklYTUUoImZhaWxlZCBzdXJmYWNlIGNyZWF0aW9uIHdpdGggY29kZSAweCUwOGx4XG4iLGhyKTsKLQlyZXR1cm4gaHI7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0R1cGxpY2F0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLAotCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyogZHN0KQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLQotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnBTcmMgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLAotCQkJCQkgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNywgc3JjKTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLFRoaXMsc3JjLGRzdCk7Ci0KLSAgICByZXR1cm4gcFNyYy0+ZHVwbGljYXRlX3N1cmZhY2UocFNyYywgZHN0KTsKLX0KLQotLyogRW51bURpc3BsYXlNb2RlcyAqLwotCi1CT09MIE1haW5fRGlyZWN0RHJhd19ERFBJWEVMRk9STUFUX01hdGNoKGNvbnN0IEREUElYRUxGT1JNQVQgKnJlcXVlc3RlZCwKLQkJCQkJIGNvbnN0IEREUElYRUxGT1JNQVQgKnByb3ZpZGVkKQotewotICAgIC8qIFNvbWUgZmxhZ3MgbXVzdCBiZSBwcmVzZW50IGluIGJvdGggb3IgbmVpdGhlciBmb3IgYSBtYXRjaC4gKi8KLSAgICBzdGF0aWMgY29uc3QgRFdPUkQgbXVzdF9tYXRjaCA9IEREUEZfUEFMRVRURUlOREVYRUQxIHwgRERQRl9QQUxFVFRFSU5ERVhFRDIKLQl8IEREUEZfUEFMRVRURUlOREVYRUQ0IHwgRERQRl9QQUxFVFRFSU5ERVhFRDggfCBERFBGX0ZPVVJDQwotCXwgRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOwotCi0gICAgaWYgKChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiBwcm92aWRlZC0+ZHdGbGFncykgIT0gcmVxdWVzdGVkLT5kd0ZsYWdzKQotCXJldHVybiBGQUxTRTsKLQotICAgIGlmICgocmVxdWVzdGVkLT5kd0ZsYWdzICYgbXVzdF9tYXRjaCkgIT0gKHByb3ZpZGVkLT5kd0ZsYWdzICYgbXVzdF9tYXRjaCkpCi0JcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIEREUEZfRk9VUkNDKQotCWlmIChyZXF1ZXN0ZWQtPmR3Rm91ckNDICE9IHByb3ZpZGVkLT5kd0ZvdXJDQykKLQkgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIChERFBGX1JHQnxERFBGX1lVVnxERFBGX1pCVUZGRVJ8RERQRl9BTFBIQQotCQkJICAgICAgfEREUEZfTFVNSU5BTkNFfEREUEZfQlVNUERVRFYpKQotCWlmIChyZXF1ZXN0ZWQtPnUxLmR3UkdCQml0Q291bnQgIT0gcHJvdmlkZWQtPnUxLmR3UkdCQml0Q291bnQpCi0JICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiAoRERQRl9SR0J8RERQRl9ZVVZ8RERQRl9TVEVOQ0lMQlVGRkVSCi0JCQkgICAgICB8RERQRl9MVU1JTkFOQ0V8RERQRl9CVU1QRFVEVikpCi0JaWYgKHJlcXVlc3RlZC0+dTIuZHdSQml0TWFzayAhPSBwcm92aWRlZC0+dTIuZHdSQml0TWFzaykKLQkgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIChERFBGX1JHQnxERFBGX1lVVnxERFBGX1pCVUZGRVJ8RERQRl9CVU1QRFVEVikpCi0JaWYgKHJlcXVlc3RlZC0+dTMuZHdHQml0TWFzayAhPSBwcm92aWRlZC0+dTMuZHdHQml0TWFzaykKLQkgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLyogSSBjb3VsZCBiZSB3cm9uZyBhYm91dCB0aGUgYnVtcG1hcHBpbmcuIE1TRE4gZG9jcyBhcmUgdmFndWUuICovCi0gICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIChERFBGX1JHQnxERFBGX1lVVnxERFBGX1NURU5DSUxCVUZGRVIKLQkJCSAgICAgIHxERFBGX0JVTVBEVURWKSkKLQlpZiAocmVxdWVzdGVkLT51NC5kd0JCaXRNYXNrICE9IHByb3ZpZGVkLT51NC5kd0JCaXRNYXNrKQotCSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAocmVxdWVzdGVkLT5kd0ZsYWdzICYgKEREUEZfQUxQSEFQSVhFTFN8RERQRl9aUElYRUxTKSkKLQlpZiAocmVxdWVzdGVkLT51NS5kd1JHQkFscGhhQml0TWFzayAhPSBwcm92aWRlZC0+dTUuZHdSR0JBbHBoYUJpdE1hc2spCi0JICAgIHJldHVybiBGQUxTRTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MIE1haW5fRGlyZWN0RHJhd19ERFNEX01hdGNoKGNvbnN0IEREU1VSRkFDRURFU0MyKiByZXF1ZXN0ZWQsCi0JCQkJY29uc3QgRERTVVJGQUNFREVTQzIqIHByb3ZpZGVkKQotewotICAgIHN0cnVjdCBjb21wYXJlX2luZm8KLSAgICB7Ci0JRFdPUkQgZmxhZzsKLQlwdHJkaWZmX3Qgb2Zmc2V0OwotCXNpemVfdCBzaXplOwotICAgIH07Ci0KLSNkZWZpbmUgQ01QKEZMQUcsIEZJRUxEKQkJCQlcCi0JeyBERFNEXyMjRkxBRywgb2Zmc2V0b2YoRERTVVJGQUNFREVTQzIsIEZJRUxEKSwJXAotCSAgc2l6ZW9mKCgoRERTVVJGQUNFREVTQzIgKikoTlVMTCkpLT5GSUVMRCkgfQotCi0gICAgc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wYXJlX2luZm8gY29tcGFyZVtdID0gewotCUNNUChBTFBIQUJJVERFUFRILCBkd0FscGhhQml0RGVwdGgpLAotCUNNUChCQUNLQlVGRkVSQ09VTlQsIGR3QmFja0J1ZmZlckNvdW50KSwKLQlDTVAoQ0FQUywgZGRzQ2FwcyksCi0JQ01QKENLREVTVEJMVCwgZGRja0NLRGVzdEJsdCksCi0JQ01QKENLREVTVE9WRVJMQVksIHUzLmRkY2tDS0Rlc3RPdmVybGF5KSwKLQlDTVAoQ0tTUkNCTFQsIGRkY2tDS1NyY0JsdCksCi0JQ01QKENLU1JDT1ZFUkxBWSwgZGRja0NLU3JjT3ZlcmxheSksCi0JQ01QKEhFSUdIVCwgZHdIZWlnaHQpLAotCUNNUChMSU5FQVJTSVpFLCB1MS5kd0xpbmVhclNpemUpLAotCUNNUChMUFNVUkZBQ0UsIGxwU3VyZmFjZSksCi0JQ01QKE1JUE1BUENPVU5ULCB1Mi5kd01pcE1hcENvdW50KSwKLQlDTVAoUElUQ0gsIHUxLmxQaXRjaCksCi0JLyogUElYRUxGT1JNQVQ6IG1hbnVhbCAqLwotCUNNUChSRUZSRVNIUkFURSwgdTIuZHdSZWZyZXNoUmF0ZSksCi0JQ01QKFRFWFRVUkVTVEFHRSwgZHdUZXh0dXJlU3RhZ2UpLAotCUNNUChXSURUSCwgZHdXaWR0aCksCi0JLyogWkJVRkZFUkJJVERFUFRIOiAib2Jzb2xldGUiICovCi0gICAgfTsKLQotI3VuZGVmIENNUAotCi0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBpZiAoKHJlcXVlc3RlZC0+ZHdGbGFncyAmIHByb3ZpZGVkLT5kd0ZsYWdzKSAhPSByZXF1ZXN0ZWQtPmR3RmxhZ3MpCi0JcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTA7IGkgPCBzaXplb2YoY29tcGFyZSkvc2l6ZW9mKGNvbXBhcmVbMF0pOyBpKyspCi0gICAgewotCWlmIChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiBjb21wYXJlW2ldLmZsYWcKLQkgICAgJiYgbWVtY21wKChjb25zdCBjaGFyICopcHJvdmlkZWQgKyBjb21wYXJlW2ldLm9mZnNldCwKLQkJICAgICAgKGNvbnN0IGNoYXIgKilyZXF1ZXN0ZWQgKyBjb21wYXJlW2ldLm9mZnNldCwKLQkJICAgICAgY29tcGFyZVtpXS5zaXplKSAhPSAwKQotCSAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIEREU0RfUElYRUxGT1JNQVQpCi0gICAgewotCWlmICghTWFpbl9EaXJlY3REcmF3X0REUElYRUxGT1JNQVRfTWF0Y2goJnJlcXVlc3RlZC0+dTQuZGRwZlBpeGVsRm9ybWF0LAotCQkJCQkJICZwcm92aWRlZC0+dTQuZGRwZlBpeGVsRm9ybWF0KSkKLQkgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0jZGVmaW5lIERERU5VTVNVUkZBQ0VTX1NFQVJDSFRZUEUgKERERU5VTVNVUkZBQ0VTX0NBTkJFQ1JFQVRFRHxEREVOVU1TVVJGQUNFU19ET0VTRVhJU1QpCi0jZGVmaW5lIERERU5VTVNVUkZBQ0VTX01BVENIVFlQRSAoRERFTlVNU1VSRkFDRVNfQUxMfERERU5VTVNVUkZBQ0VTX01BVENIfERERU5VTVNVUkZBQ0VTX05PTUFUQ0gpCi0KLS8qIFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkKLSAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkVudW1BdHRhY2hlZFN1cmZhY2VzLiAqLwotSFJFU1VMVAotTWFpbl9EaXJlY3REcmF3X0VudW1FeGlzdGluZ1N1cmZhY2VzKElEaXJlY3REcmF3SW1wbCAqVGhpcywgRFdPUkQgZHdGbGFncywKLQkJCQkgICAgIExQRERTVVJGQUNFREVTQzIgbHBERFNEMiwgTFBWT0lEIGNvbnRleHQsCi0JCQkJICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNhbGxiYWNrKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmY7Ci0gICAgQk9PTCBhbGwsIG5vbWF0Y2g7Ci0KLSAgICAvKiBBIE5VTEwgbHBERFNEMiBpcyBwZXJtaXR0ZWQgaWYgd2UgYXJlIGVudW1lcmF0aW5nIGFsbCBzdXJmYWNlcyBhbnl3YXkgKi8KLSAgICBpZiAobHBERFNEMiA9PSBOVUxMICYmICEoZHdGbGFncyAmIERERU5VTVNVUkZBQ0VTX0FMTCkpCi0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICBhbGwgPSBkd0ZsYWdzICYgRERFTlVNU1VSRkFDRVNfQUxMOwotICAgIG5vbWF0Y2ggPSBkd0ZsYWdzICYgRERFTlVNU1VSRkFDRVNfTk9NQVRDSDsKLQotICAgIGZvciAoc3VyZiA9IFRoaXMtPnN1cmZhY2VzOyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5uZXh0X2RkcmF3KQotICAgIHsKLQlpZiAoYWxsCi0JICAgIHx8IChub21hdGNoICE9IE1haW5fRGlyZWN0RHJhd19ERFNEX01hdGNoKGxwRERTRDIsCi0JCQkJCQkgICAgICAmc3VyZi0+c3VyZmFjZV9kZXNjKSkpCi0JewotCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBpc3VyZiA9IElDT01fSU5URVJGQUNFKHN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcpOwotCSAgICBERFNVUkZBQ0VERVNDMiBkZXNjOwotCi0JICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkJVFJBQ0UoIiAgPT4gZW51bWVyYXRpbmcgc3VyZmFjZSAlcCAocHJpdi4gJXApIHdpdGggZGVzY3JpcHRpb246XG4iLCBpc3VyZiwgc3VyZik7Ci0JCUREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKCZzdXJmLT5zdXJmYWNlX2Rlc2MpOwotCSAgICB9Ci0KLQkgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoaXN1cmYpOwotCi0JICAgIGRlc2MgPSBzdXJmLT5zdXJmYWNlX2Rlc2M7Ci0JICAgIGlmIChjYWxsYmFjayhpc3VyZiwgJmRlc2MsIGNvbnRleHQpCT09IERERU5VTVJFVF9DQU5DRUwpCi0JCWJyZWFrOwotCX0KLSAgICB9Ci0gICAgVFJBQ0UoIiBlbmQgb2YgZW51bWVyYXRpb24uXG4iKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qIEkgcmVhbGx5IGRvbid0IHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgc3VwcG9zZWQgdG8gd29yay4KLSAqIFdlIG9ubHkgY29uc2lkZXIgZHdIZWlnaHQsIGR3V2lkdGggYW5kIGRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzLiAqLwotSFJFU1VMVAotTWFpbl9EaXJlY3REcmF3X0VudW1DcmVhdGVhYmxlU3VyZmFjZXMoSURpcmVjdERyYXdJbXBsICpUaGlzLCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgICAgICBMUEREU1VSRkFDRURFU0MyIGxwRERTRDIsCi0JCQkJICAgICAgIExQVk9JRCBjb250ZXh0LAotCQkJCSAgICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNhbGxiYWNrKQotewotICAgIEZJWE1FKCJUaGlzIGlzbid0IGdvaW5nIHRvIHdvcmsuXG4iKTsKLQotICAgIGlmICgoZHdGbGFncyAmIERERU5VTVNVUkZBQ0VTX01BVENIVFlQRSkgIT0gRERFTlVNU1VSRkFDRVNfTUFUQ0gpCi0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICAvKiBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgKiBEb2VzIHRoaXMgd29yayBiZWZvcmUgU0NMIGlzIGNhbGxlZD8KLSAgICAgKiBEb2VzIGl0IG9ubHkgY29uc2lkZXIgb2ZmLXNjcmVlbiBzdXJmYWNlcz8KLSAgICAgKi8KLQotICAgIHJldHVybiBFX0ZBSUw7Ci19Ci0KLS8qIEZvciB1bnNpZ25lZCB4LiAwIGlzIG5vdCBhIHBvd2VyIG9mIDIuICovCi0jZGVmaW5lIElTX1BPV18yKHgpICgoKHgpICYgKCh4KSAtIDEpKSA9PSAwKQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0VudW1TdXJmYWNlcyhMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJICAgICBMUEREU1VSRkFDRURFU0MyIGxwRERTRDIsIExQVk9JRCBjb250ZXh0LAotCQkJICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNhbGxiYWNrKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBUUkFDRSgiKCVwKS0+KDB4JWx4LCAlcCwgJXAsICVwKVxuIiwgaWZhY2UsIGR3RmxhZ3MsIGxwRERTRDIsIGNvbnRleHQsCi0JICBjYWxsYmFjayk7Ci0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCVRSQUNFKCIgZmxhZ3M6ICIpOyBERFJBV19kdW1wX0RERU5VTVNVUkZBQ0VTKGR3RmxhZ3MpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2FsbGJhY2sgPT0gTlVMTCkKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQotICAgIGlmIChkd0ZsYWdzICYgfihEREVOVU1TVVJGQUNFU19TRUFSQ0hUWVBFfERERU5VTVNVUkZBQ0VTX01BVENIVFlQRSkpCi0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICBpZiAoIUlTX1BPV18yKGR3RmxhZ3MgJiBEREVOVU1TVVJGQUNFU19TRUFSQ0hUWVBFKQotCXx8ICFJU19QT1dfMihkd0ZsYWdzICYgRERFTlVNU1VSRkFDRVNfTUFUQ0hUWVBFKSkKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQotICAgIGlmIChkd0ZsYWdzICYgRERFTlVNU1VSRkFDRVNfRE9FU0VYSVNUKQotICAgIHsKLQlyZXR1cm4gTWFpbl9EaXJlY3REcmF3X0VudW1FeGlzdGluZ1N1cmZhY2VzKFRoaXMsIGR3RmxhZ3MsIGxwRERTRDIsCi0JCQkJCQkgICAgY29udGV4dCwgY2FsbGJhY2spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXJldHVybiBNYWluX0RpcmVjdERyYXdfRW51bUNyZWF0ZWFibGVTdXJmYWNlcyhUaGlzLCBkd0ZsYWdzLCBscEREU0QyLAotCQkJCQkJICAgICAgY29udGV4dCwgY2FsbGJhY2spOwotICAgIH0KLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19FdmFsdWF0ZU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSxEV09SRCBhLERXT1JEKiBiKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBGSVhNRSgiKCVwKS0+KCkgc3R1YlxuIiwgVGhpcyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfRmxpcFRvR0RJU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBUUkFDRSgiKCVwKS0+KClcbiIsVGhpcyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0dldENhcHMoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERENBUFMgcERyaXZlckNhcHMsCi0JCQlMUEREQ0FQUyBwSEVMQ2FwcykKLXsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0gICAgVFJBQ0UoIiglcCwlcCwlcClcbiIsVGhpcyxwRHJpdmVyQ2FwcyxwSEVMQ2Fwcyk7Ci0gICAgaWYgKHBEcml2ZXJDYXBzICE9IE5VTEwpIHsKLQlERF9TVFJVQ1RfQ09QWV9CWVNJWkUocERyaXZlckNhcHMsJlRoaXMtPmNhcHMpOwotCWlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkgIFRSQUNFKCJEcml2ZXIgQ2FwcyA6XG4iKTsKLQkgIEREUkFXX2R1bXBfRERDQVBTKHBEcml2ZXJDYXBzKTsKLQl9Ci0gICAgfQotICAgIGlmIChwSEVMQ2FwcyAhPSBOVUxMKSB7Ci0JRERfU1RSVUNUX0NPUFlfQllTSVpFKHBIRUxDYXBzLCZUaGlzLT5jYXBzKTsKLQlpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICBUUkFDRSgiSEVMIENhcHMgOlxuIik7Ci0JICBERFJBV19kdW1wX0REQ0FQUyhwSEVMQ2Fwcyk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qIEdldENhcHMgKi8KLS8qIEdldERldmljZUlkZW50aWZpZXIgKi8KLS8qIEdldERJc3BsYXlNb2RlICovCi0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0Rm91ckNDQ29kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBEV09SRCBwTnVtQ29kZXMsCi0JCQkgICAgICAgTFBEV09SRCBwQ29kZXMpCi17Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIGlmICgqcE51bUNvZGVzKSB7Ci0JICAgICpwTnVtQ29kZXM9MDsKLSAgICB9Ci0gICAgRklYTUUoIiglcCwlcCwlcCksIHN0dWJcbiIsVGhpcyxwTnVtQ29kZXMscENvZGVzKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlLAotCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgKmxwbHBHRElERFNTdXJmYWNlKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBscEdESUREU1N1cmZhY2UpOwotICAgIFRSQUNFKCJyZXR1cm5pbmcgcHJpbWFyeSAoJXApXG4iLCBUaGlzLT5wcmltYXJ5X3N1cmZhY2UpOwotICAgICpscGxwR0RJRERTU3VyZmFjZSA9IElDT01fSU5URVJGQUNFKFRoaXMtPnByaW1hcnlfc3VyZmFjZSwgSURpcmVjdERyYXdTdXJmYWNlNyk7Ci0gICAgaWYgKCpscGxwR0RJRERTU3VyZmFjZSkKLQlJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZigqbHBscEdESUREU1N1cmZhY2UpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19HZXRNb25pdG9yRnJlcXVlbmN5KExQRElSRUNURFJBVzcgaWZhY2UsTFBEV09SRCBmcmVxKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBGSVhNRSgiKCVwKS0+KCVwKSByZXR1cm5zIDYwIEh6IGFsd2F5c1xuIixUaGlzLGZyZXEpOwotICAgICpmcmVxID0gNjAqMTAwOyAvKiA2MCBIeiAqLwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19HZXRTY2FuTGluZShMUERJUkVDVERSQVc3IGlmYWNlLCBMUERXT1JEIGxwZHdTY2FuTGluZSkKLXsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0gICAgc3RhdGljIEJPT0wgaGlkZTsKLQotICAgIC8qIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvZnRlbiwgc2hvdyB0aGUgZml4bWUgb25seSBvbmNlICovCi0gICAgaWYgKCFoaWRlKSB7Ci0JRklYTUUoIiglcCktPiglcCkgc2VtaS1zdHViXG4iLCBUaGlzLCBscGR3U2NhbkxpbmUpOwotCWhpZGUgPSBUUlVFOwotICAgIH0KLQotICAgIC8qIEZha2UgdGhlIGxpbmUgc3dlZXBpbmcgb2YgdGhlIG1vbml0b3IgKi8KLSAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHN5bmNocm9uaXplIHdpdGggYSBzb3VyY2UgdG8ga2VlcCB0aGUgcmVmcmVzaCByYXRlICovIAotICAgICpscGR3U2NhbkxpbmUgPSBUaGlzLT5jdXJfc2NhbmxpbmUrKzsKLSAgICAvKiBBc3N1bWUgMjAgc2NhbiBsaW5lcyBpbiB0aGUgdmVydGljYWwgYmxhbmsgKi8KLSAgICBpZiAoVGhpcy0+Y3VyX3NjYW5saW5lID49IFRoaXMtPmhlaWdodCArIDIwKQotCVRoaXMtPmN1cl9zY2FubGluZSA9IDA7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0U3VyZmFjZUZyb21EQyhMUERJUkVDVERSQVc3IGlmYWNlLCBIREMgaGRjLAotCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyAqbHBERFMpCi17Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIEZJWE1FKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBoZGMsIGxwRERTKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKExQRElSRUNURFJBVzcgaWZhY2UsIExQQk9PTCBzdGF0dXMpCi17Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMsc3RhdHVzKTsKLSAgICAqc3RhdHVzID0gVGhpcy0+ZmFrZV92Ymxhbms7Ci0gICAgVGhpcy0+ZmFrZV92YmxhbmsgPSAhVGhpcy0+ZmFrZV92Ymxhbms7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKiBJZiB3ZSB3ZXJlIG5vdCBpbml0aWFsaXNlZCB0aGVuIFVuaW5pdF9NYWluX0lEaXJlY3REcmF3N19Jbml0aWFsaXplIHdvdWxkCi0gKiBoYXZlIGJlZW4gY2FsbGVkIGluc3RlYWQuICovCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0luaXRpYWxpemUoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBHVUlEIGxwR3VpZCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVzKVxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQobHBHdWlkKSk7Ci0KLSAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVBbGxTdXJmYWNlcyhMUERJUkVDVERSQVc3IGlmYWNlKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmOwotCi0gICAgVFJBQ0UoIiglcCktPigpXG4iLCBUaGlzKTsKLQotICAgIGZvciAoc3VyZiA9IFRoaXMtPnN1cmZhY2VzOyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5uZXh0X2RkcmF3KQotCUlEaXJlY3REcmF3U3VyZmFjZTdfUmVzdG9yZShJQ09NX0lOVEVSRkFDRShzdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIEREUkFXX1N1YmNsYXNzV2luZG93KElEaXJlY3REcmF3SW1wbCogVGhpcykKLXsKLSAgICAvKiBXZWxsIHdlIGRvbid0IGFjdHVhbGx5IHN1YmNsYXNzIHRoZSB3aW5kb3cgeWV0LiAqLwotICAgIFNldFByb3BBKFRoaXMtPndpbmRvdywgZGRQcm9wLCBUaGlzKTsKLX0KLQotc3RhdGljIHZvaWQgRERSQVdfVW5zdWJjbGFzc1dpbmRvdyhJRGlyZWN0RHJhd0ltcGwqIFRoaXMpCi17Ci0gICAgUmVtb3ZlUHJvcEEoVGhpcy0+d2luZG93LCBkZFByb3ApOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwoTFBESVJFQ1REUkFXNyBpZmFjZSwgSFdORCBod25kLAotCQkJCSAgICBEV09SRCBjb29wbGV2ZWwpCi17Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotCi0gICAgRklYTUUoIiglcCktPiglcCwlMDhseClcbiIsVGhpcyxod25kLGNvb3BsZXZlbCk7Ci0gICAgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKGNvb3BsZXZlbCk7Ci0KLSAgICAvKiBNYWtlcyByZWFsTVlTVCB0ZXN0IGhhcHB5LiAqLwotICAgIGlmIChUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCA9PSBjb29wbGV2ZWwKLQkmJiBUaGlzLT53aW5kb3cgPT0gaHduZCkKLQlyZXR1cm4gRERfT0s7Ci0KLSAgICAvKiBYWFggIkl0IGNhbm5vdCBiZSByZXNldCB3aGlsZSB0aGUgcHJvY2VzcyBoYXMgc3VyZmFjZXMgb3IgcGFsZXR0ZXMKLSAgICAgKiBjcmVhdGVkLiIgT3RoZXJ3aXNlIHRoZSB3aW5kb3cgY2FuIGJlIGNoYW5nZWQ/Pz8KLSAgICAgKgotICAgICAqIFRoaXMgYXBwZWFycyB0byBiZSB3cm9uZyAtIGNvbW1lbnQgaXQgb3V0IGZvciBub3cuCi0gICAgICogVGhpcyBzZWVtcyB0byBiZSB0cnVlIGF0IGxlYXN0IGZvciBERFNDTF9TRVRGT0NVU1dJTkRPVwotICAgICAqIEl0IGxvb2tzIGxpa2UgV2luZG93cyBkb2Vzbid0IHN0b3JlIHRoZSBIV05EIGluIGFsbCBjYXNlcywKLSAgICAgKiBwcm9iYWJseSBpZiBERFNDTF9OT1JNQUwgaXMgc3BlY2lmaWVkLCBidXQgdGhhdCdzIG5vdCBzdXJlCi0gICAgaWYgKFRoaXMtPndpbmRvdykKLQlyZXR1cm4gRERFUlJfSFdOREFMUkVBRFlTRVQ7Ci0gICAgKi8KLQotICAgIC8qIEREU0NMX0VYQ0xVU0lWRSBvciBERFNDTF9OT1JNQUwgb3IgRERTQ0xfU0VURk9DVVNXSU5ET1cgbXVzdCBiZSBnaXZlbiAqLwotICAgIGlmICghKGNvb3BsZXZlbCAmIChERFNDTF9FWENMVVNJVkV8RERTQ0xfTk9STUFMfEREU0NMX1NFVEZPQ1VTV0lORE9XKSkpCi0gICAgewotICAgICAgICBFUlIoIiglcCkgOiBDYWxsIHRvIFNldENvb3BlcmF0aXZlTGV2ZWwgZmFpbGVkOiBjb29wbGV2ZWwgICE9IEREU0NMX0VYQ0xVU0lWRXxERFNDTF9OT1JNQUx8RERTQ0xfU0VURk9DVVNXSU5ET1csIHJldHVybmluZyBEREVSUl9JTlZBTElEUEFSQU1TXG4iLCBUaGlzKTsKLSAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotICAgIC8qIERldmljZSB3aW5kb3cgYW5kIGZvY3VzIFdpbmRvdy4gVGhleSBvbmx5IHJlYWxseSBtYXR0ZXIgaW4gYQotICAgICAqIE11bHRpLU1vbml0b3IgYXBwbGljYXRpb24sIGJ1dCBzb21lIGdhbWVzIHNwZWNpZnkgdGhlbSBhbmQgd2UKLSAgICAgKiBoYXZlIHRvIHJlYWN0IGNvcnJlY3RseS4gKi8KLSAgICBpZihjb29wbGV2ZWwgJiBERFNDTF9TRVRGT0NVU1dJTkRPVykKLSAgICB7Ci0gICAgICAgIC8qIFRoaXMgZmxhZyBpcyBhIGJpZXN0OiBJdCBpcyBvbmx5IHZhbGlkIHdoZW4gRERTQ0xfTk9STUFMIGhhcyBiZWVuIHNldAotICAgICAgICAgKiBvciBubyBod25kIGlzIHNldCBhbmQgbm8gb3RoZXIgZmxhZ3MgYXJlIGFsbG93ZWQsIGV4Y2VwdCBERFNDTF9OT1dJTkRPV0NIQU5HRVMKLSAgICAgICAgICovCi0gICAgICAgIGlmKFRoaXMtPndpbmRvdykKLSAgICAgICAgICAgIGlmKCEoVGhpcy0+Y29vcGVyYXRpdmVfbGV2ZWwgJiBERFNDTF9OT1JNQUwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVSUigiKCVwKSA6IENhbGwgdG8gU2V0Q29vcGVyYXRpdmVMZXZlbCBmYWlsZWQ6IEREU0NMX1NFVEZPQ1VTV0lORE9XIG1heSBub3QgYmUgdXNlZCBpbiBDb29wbGV2ZWwgJTA4bHgsIHJldHVybmluZyBEREVSUl9IV05EQUxSRUFEWVNFVFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLCBUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERERVJSX0hXTkRBTFJFQURZU0VUOwotICAgICAgICAgICAgfQotICAgICAgICBpZigoY29vcGxldmVsICE9IEREU0NMX1NFVEZPQ1VTV0lORE9XKSkKLSAgICAgICAgICAgIGlmKGNvb3BsZXZlbCAhPSAoRERTQ0xfU0VURk9DVVNXSU5ET1cgfCBERFNDTF9OT1dJTkRPV0NIQU5HRVMpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUlIoIiglcCkgOiBDYWxsIHRvIFNldENvb3BlcmF0aXZlTGV2ZWwgZmFpbGVkOiBJbnZhbGlkIHVzZSBvZiBERFNDTF9TRVRGT0NVU1dJTkRPVywgcmV0dXJuaW5nIERERVJSX0lOVkFMSURQQVJBTVNcbiIsIFRoaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgICAgICAgICAgfQotCi0gICAgICAgIC8qIERvbid0IGtub3cgd2hhdCBleGFjdGx5IHRvIGRvLCBidXQgaXQncyBwZXJmZWN0bHkgdmFsaWQKLSAgICAgICAgICogdG8gcGFzcyBERFNDTF9TRVRGT0NVU1dJTkRPVyBvbmx5ICovCi0gICAgICAgIEZJWE1FKCIoJXApIDogUG9vcmx5IGhhbmRsZWQgZmxhZyBERFNDTF9TRVRGT0NVU1dJTkRPV1xuIiwgVGhpcyk7Ci0KLSAgICAgICAgLyogU3RvcmUgdGhlIGZsYWcgaW4gdGhlIGNvb3BlcmF0aXZlIGxldmVsLiBJIGRvbid0IHRoaW5rIHRoYXQgYWxsIG90aGVyCi0gICAgICAgICAqIGZsYWdzIHNob3VsZCBiZSBvdmVyd3JpdHRlbiwgc28ganVzdCBhZGQgaXQgCi0gICAgICAgICAqIChJbiB0aGUgbW9zdCBjYXNlcyB0aGlzIHdpbGwgYmUgRERTQ0xfU0VURk9DVVNXSU5ET1cgfCBERFNDTF9OT1JNQUwpICovCi0gICAgICAgIGNvb3BsZXZlbCB8PSBERFNDTF9TRVRGT0NVU1dJTkRPVzsKLQotICAgICAgICByZXR1cm4gRERfT0s7Ci0gICAgfQotCi0gICAgLyogRERTQ0xfRVhDTFVTRSBtb2RlIHJlcXVpcmVzICBERFNDTF9GVUxMU0NSRUVOIGFuZCB2aWNlIHZlcnNhICovCi0gICAgaWYoKGNvb3BsZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkgJiYgIShjb29wbGV2ZWwgJiBERFNDTF9GVUxMU0NSRUVOKSkKLSAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgLyogVGhlIG90aGVyIGNhc2UgaXMgY2hlY2tlZCBhYm92ZSAqLwotCi0gICAgLyogVW5oYW5kbGVkIGZsYWdzLiBHaXZlIGEgd2FybmluZyAqLwotICAgIGlmKGNvb3BsZXZlbCAmIEREU0NMX1NFVERFVklDRVdJTkRPVykKLSAgICAgICAgRklYTUUoIiglcCkgOiBVbmhhbmRsZWQgZmxhZyBERFNDTF9TRVRERVZJQ0VXSU5ET1cuXG4iLCBUaGlzKTsKLSAgICBpZihjb29wbGV2ZWwgJiBERFNDTF9DUkVBVEVERVZJQ0VXSU5ET1cpCi0gICAgICAgIEZJWE1FKCIoJXApIDogVW5oYW5kbGVkIGZsYWcgRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XLlxuIiwgVGhpcyk7Ci0KLSAgICAvKiBQZXJoYXBzIHRoZSBod25kIGlzIG9ubHkgc2V0IGluIEREU0NMX0VYTFVTSVZFIGFuZCBERFNDTF9GVUxMU0NSRUVOIG1vZGUuIE5vdCBzdXJlICovCi0gICAgVGhpcy0+d2luZG93ID0gaHduZDsKLSAgICBUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCA9IGNvb3BsZXZlbDsKLQotICAgIFRoaXMtPmxvY2FsLmhXbmQgPSAoVUxPTkdfUFRSKWh3bmQ7Ci0gICAgVGhpcy0+bG9jYWwuZHdMb2NhbEZsYWdzIHw9IEREUkFXSUxDTF9TRVRDT09QQ0FMTEVEOwotICAgIC8qIG5vdCBlbnRpcmVseSBzdXJlIGFib3V0IHRoZXNlICovCi0gICAgaWYgKGNvb3BsZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkgICAgIFRoaXMtPmxvY2FsLmR3TG9jYWxGbGFncyB8PSBERFJBV0lMQ0xfSEFTRVhDTFVTSVZFTU9ERTsKLSAgICBpZiAoY29vcGxldmVsICYgRERTQ0xfRlVMTFNDUkVFTikgICAgVGhpcy0+bG9jYWwuZHdMb2NhbEZsYWdzIHw9IEREUkFXSUxDTF9JU0ZVTExTQ1JFRU47Ci0gICAgaWYgKGNvb3BsZXZlbCAmIEREU0NMX0FMTE9XTU9ERVgpICAgIFRoaXMtPmxvY2FsLmR3TG9jYWxGbGFncyB8PSBERFJBV0lMQ0xfQUxMT1dNT0RFWDsKLSAgICBpZiAoY29vcGxldmVsICYgRERTQ0xfTVVMVElUSFJFQURFRCkgVGhpcy0+bG9jYWwuZHdMb2NhbEZsYWdzIHw9IEREUkFXSUxDTF9NVUxUSVRIUkVBREVEOwotICAgIGlmIChjb29wbGV2ZWwgJiBERFNDTF9GUFVTRVRVUCkgICAgICBUaGlzLT5sb2NhbC5kd0xvY2FsRmxhZ3MgfD0gRERSQVdJTENMX0ZQVVNFVFVQOwotICAgIGlmIChjb29wbGV2ZWwgJiBERFNDTF9GUFVQUkVTRVJWRSkgICBUaGlzLT5sb2NhbC5kd0xvY2FsRmxhZ3MgfD0gRERSQVdJTENMX0ZQVVBSRVNFUlZFOwotCi0gICAgaWYgKFRoaXMtPmxvY2FsLmxwR2JsKSB7Ci0JLyogYXNzdW1lIHRoYXQgdGhpcyBhcHAgaXMgdGhlIGFjdGl2ZSBhcHAgKGluIHdpbmUsIHRoZXJlJ3MKLQkgKiBwcm9iYWJseSBvbmx5IG9uZSBhcHAgcGVyIGdsb2JhbCBkZHJhdyBvYmplY3QgYW55d2F5KSAqLwotCWlmIChjb29wbGV2ZWwgJiBERFNDTF9FWENMVVNJVkUpIFRoaXMtPmxvY2FsLmxwR2JsLT5scEV4Y2x1c2l2ZU93bmVyID0gJlRoaXMtPmxvY2FsOwotCWVsc2UgaWYgKFRoaXMtPmxvY2FsLmxwR2JsLT5scEV4Y2x1c2l2ZU93bmVyID09ICZUaGlzLT5sb2NhbCkKLQkgICAgVGhpcy0+bG9jYWwubHBHYmwtPmxwRXhjbHVzaXZlT3duZXIgPSBOVUxMOwotCWlmIChUaGlzLT5zZXRfZXhjbHVzaXZlX21vZGUpCi0JICAgIFRoaXMtPnNldF9leGNsdXNpdmVfbW9kZShUaGlzLCAoY29vcGxldmVsICYgRERTQ0xfRVhDTFVTSVZFKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBTaG93V2luZG93KGh3bmQsIFNXX1NIT1cpOwotCi0gICAgRERSQVdfU3ViY2xhc3NXaW5kb3coVGhpcyk7Ci0KLSAgICAvKiBUT0RPIERvZXMgaXQgYWxzbyBnZXQgcmVzaXplZCB0byB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZT8gKi8KLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd1dpZHRoLAotCQkJICAgICAgIERXT1JEIGR3SGVpZ2h0LCBMT05HIGxQaXRjaCwKLQkJCSAgICAgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzLAotCQkJICAgICAgIGNvbnN0IEREUElYRUxGT1JNQVQqIHBpeGVsZm9ybWF0KQotewotICAgIHNob3J0IHNjcmVlblg7Ci0gICAgc2hvcnQgc2NyZWVuWTsKLQotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLQotICAgIFRSQUNFKCIoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkKVxuIixUaGlzLGR3V2lkdGgsZHdIZWlnaHQpOwotCi0gICAgaWYgKCEoVGhpcy0+Y29vcGVyYXRpdmVfbGV2ZWwgJiBERFNDTF9FWENMVVNJVkUpKQotCXJldHVybiBEREVSUl9OT0VYQ0xVU0lWRU1PREU7Ci0KLSAgICBpZiAoIUlzV2luZG93KFRoaXMtPndpbmRvdykpCi0JcmV0dXJuIERERVJSX0dFTkVSSUM7IC8qIHVuY2hlY2tlZCAqLwotCi0gICAgTG9zZVByaW1hcnlTdXJmYWNlKFRoaXMpOwotCi0gICAgc2NyZWVuWCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwotICAgIHNjcmVlblkgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKLQotICAgIFRoaXMtPndpZHRoID0gZHdXaWR0aDsKLSAgICBUaGlzLT5oZWlnaHQgPSBkd0hlaWdodDsKLSAgICBUaGlzLT5waXRjaCA9IGxQaXRjaDsKLSAgICBUaGlzLT5waXhlbGZvcm1hdCA9ICpwaXhlbGZvcm1hdDsKLQotICAgIC8qIFBvc2l0aW9uIHRoZSB3aW5kb3cgaW4gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuIC0gZG9uJ3QgY2VudGVyIGZvciBub3cgKi8KLSAgICAvKiBNb3ZlV2luZG93KFRoaXMtPndpbmRvdywgKHNjcmVlblgtZHdXaWR0aCkvMiwgKHNjcmVlblktZHdIZWlnaHQpLzIsCi0gICAgICAgICAgICAgICAgICBkd1dpZHRoLCBkd0hlaWdodCwgVFJVRSk7Ki8KLSAgICBNb3ZlV2luZG93KFRoaXMtPndpbmRvdywgMCwgMCwgZHdXaWR0aCwgZHdIZWlnaHQsIFRSVUUpOwotCi0gICAgU2V0Rm9jdXMoVGhpcy0+d2luZG93KTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSkKLXsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKVxuIixUaGlzKTsKLSAgICBpZiAoIShUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkpCi0JcmV0dXJuIERERVJSX05PRVhDTFVTSVZFTU9ERTsKLQotICAgIC8qIExvc2UgdGhlIHByaW1hcnkgc3VyZmFjZSBpZiB0aGUgcmVzb2x1dGlvbiBjaGFuZ2VzLiAqLwotICAgIGlmIChUaGlzLT5vcmlnX3dpZHRoICE9IFRoaXMtPndpZHRoIHx8IFRoaXMtPm9yaWdfaGVpZ2h0ICE9IFRoaXMtPmhlaWdodAotCXx8IFRoaXMtPm9yaWdfcGl0Y2ggIT0gVGhpcy0+cGl0Y2gKLQl8fCBUaGlzLT5vcmlnX3BpeGVsZm9ybWF0LmR3RmxhZ3MgIT0gVGhpcy0+cGl4ZWxmb3JtYXQuZHdGbGFncwotCXx8ICFNYWluX0RpcmVjdERyYXdfRERQSVhFTEZPUk1BVF9NYXRjaCgmVGhpcy0+cGl4ZWxmb3JtYXQsCi0JCQkJCQkmVGhpcy0+b3JpZ19waXhlbGZvcm1hdCkpCi0gICAgewotCUxvc2VQcmltYXJ5U3VyZmFjZShUaGlzKTsKLSAgICB9Ci0KLSAgICAvKiBUT0RPIE1vdmUgdGhlIHdpbmRvdyBiYWNrIHdoZXJlIGl0IGJlbG9uZ3MuICovCi0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmsoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKLQkJCQkgICAgIEhBTkRMRSBoKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLSAgICBGSVhNRSgiKCVwKS0+KGZsYWdzPTB4JTA4bHgsaGFuZGxlPSVwKVxuIixUaGlzLGR3RmxhZ3MsaCk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0dldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIExQRERTVVJGQUNFREVTQzIgcEREU0QpCi17Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIFRSQUNFKCIoJXApLT5HZXREaXNwbGF5TW9kZSglcClcbiIsVGhpcyxwRERTRCk7Ci0KLSAgICBwRERTRC0+ZHdGbGFncyA9IEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9QSVRDSHxERFNEX1BJWEVMRk9STUFUfEREU0RfUkVGUkVTSFJBVEU7Ci0gICAgcEREU0QtPmR3SGVpZ2h0ID0gVGhpcy0+aGVpZ2h0OwotICAgIHBERFNELT5kd1dpZHRoID0gVGhpcy0+d2lkdGg7Ci0gICAgcEREU0QtPnUxLmxQaXRjaCA9IFRoaXMtPnBpdGNoOwotICAgIHBERFNELT51Mi5kd1JlZnJlc2hSYXRlID0gNjA7Ci0gICAgcEREU0QtPnU0LmRkcGZQaXhlbEZvcm1hdCA9IFRoaXMtPnBpeGVsZm9ybWF0OwotICAgIHBERFNELT5kZHNDYXBzLmR3Q2FwcyA9IDA7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyBJTlQzMiBhbGxvY2F0ZV9tZW1vcnkoSURpcmVjdERyYXdJbXBsICpUaGlzLCBEV09SRCBtZW0pCi17Ci0gICAgaWYgKG1lbSA+IFRoaXMtPmF2YWlsYWJsZV92aWRtZW0pIHJldHVybiAtMTsKLSAgICBUaGlzLT5hdmFpbGFibGVfdmlkbWVtIC09IG1lbTsKLSAgICByZXR1cm4gVGhpcy0+YXZhaWxhYmxlX3ZpZG1lbTsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9tZW1vcnkoSURpcmVjdERyYXdJbXBsICpUaGlzLCBEV09SRCBtZW0pCi17Ci0gICAgVGhpcy0+YXZhaWxhYmxlX3ZpZG1lbSArPSBtZW07Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0QXZhaWxhYmxlVmlkTWVtKExQRElSRUNURFJBVzcgaWZhY2UsIExQRERTQ0FQUzIgZGRzY2FwcywKLQkJCQkgICBMUERXT1JEIHRvdGFsLCBMUERXT1JEIGZyZWUpCi17Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJXApXG4iLCBUaGlzLGRkc2NhcHMsdG90YWwsZnJlZSk7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCIgQXNraW5nIGZvciBtZW1vcnkgb2YgdHlwZSA6ICIpOwotICAgICAgICBERFJBV19kdW1wX0REU0NBUFMyKGRkc2NhcHMpOyBUUkFDRSgiXG4iKTsKLSAgICB9Ci0KLSAgICAvKiBXZSBoYXZlIDE2IE1CIHZpZGVvbWVtb3J5ICovCi0gICAgaWYgKHRvdGFsKQkqdG90YWw9IFRoaXMtPnRvdGFsX3ZpZG1lbTsKLSAgICBpZiAoZnJlZSkJKmZyZWUgPSBUaGlzLT5hdmFpbGFibGVfdmlkbWVtOwotCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgKHRvdGFsKSAlbGQgLyAoZnJlZSkgJWxkXG4iLCAKLQkgIHRvdGFsICE9IE5VTEwgPyAqdG90YWwgOiAwLCAKLQkgIGZyZWUgICE9IE5VTEwgPyAqZnJlZSAgOiAwKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19UZXN0Q29vcGVyYXRpdmVMZXZlbChMUERJUkVDVERSQVc3IGlmYWNlKSB7Ci0gICAgSURpcmVjdERyYXdJbXBsICpUaGlzID0gKElEaXJlY3REcmF3SW1wbCAqKWlmYWNlOwotICAgIFRSQUNFKCIoJXApLT4oKTogc3R1YlxuIiwgVGhpcyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfU3RhcnRNb2RlVGVzdChMUERJUkVDVERSQVc3IGlmYWNlLCBMUFNJWkUgcE1vZGVzLAotCQkJICAgICAgRFdPUkQgZHdOdW1Nb2RlcywgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0gICAgRklYTUUoIiglcCktPigpIHN0dWJcbiIsIFRoaXMpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKioqIE93bmVkIG9iamVjdCBtYW5hZ2VtZW50LiAqLwotCi12b2lkIE1haW5fRGlyZWN0RHJhd19BZGRTdXJmYWNlKElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCQlJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmYWNlKQotewotICAgIGFzc2VydChzdXJmYWNlLT5kZHJhd19vd25lciA9PSBOVUxMIHx8IHN1cmZhY2UtPmRkcmF3X293bmVyID09IFRoaXMpOwotCi0gICAgc3VyZmFjZS0+ZGRyYXdfb3duZXIgPSBUaGlzOwotCi0gICAgLyogd2hlcmUgc2hvdWxkIGl0IGdvPyAqLwotICAgIHN1cmZhY2UtPm5leHRfZGRyYXcgPSBUaGlzLT5zdXJmYWNlczsKLSAgICBzdXJmYWNlLT5wcmV2X2RkcmF3ID0gTlVMTDsKLSAgICBpZiAoVGhpcy0+c3VyZmFjZXMpCi0JVGhpcy0+c3VyZmFjZXMtPnByZXZfZGRyYXcgPSBzdXJmYWNlOwotICAgIFRoaXMtPnN1cmZhY2VzID0gc3VyZmFjZTsKLX0KLQotdm9pZCBNYWluX0RpcmVjdERyYXdfUmVtb3ZlU3VyZmFjZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkJICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZmFjZSkKLXsKLSAgICBhc3NlcnQoc3VyZmFjZS0+ZGRyYXdfb3duZXIgPT0gVGhpcyk7Ci0KLSAgICBpZiAoVGhpcy0+c3VyZmFjZXMgPT0gc3VyZmFjZSkKLQlUaGlzLT5zdXJmYWNlcyA9IHN1cmZhY2UtPm5leHRfZGRyYXc7Ci0KLSAgICBpZiAoVGhpcy0+cHJpbWFyeV9zdXJmYWNlID09IHN1cmZhY2UpCi0JVGhpcy0+cHJpbWFyeV9zdXJmYWNlID0gTlVMTDsKLQotICAgIGlmIChzdXJmYWNlLT5uZXh0X2RkcmF3KQotCXN1cmZhY2UtPm5leHRfZGRyYXctPnByZXZfZGRyYXcgPSBzdXJmYWNlLT5wcmV2X2RkcmF3OwotICAgIGlmIChzdXJmYWNlLT5wcmV2X2RkcmF3KQotCXN1cmZhY2UtPnByZXZfZGRyYXctPm5leHRfZGRyYXcgPSBzdXJmYWNlLT5uZXh0X2RkcmF3OwotfQotCi1zdGF0aWMgdm9pZCBNYWluX0RpcmVjdERyYXdfRGVsZXRlU3VyZmFjZXMoSURpcmVjdERyYXdJbXBsKiBUaGlzKQotewotICAgIHdoaWxlIChUaGlzLT5zdXJmYWNlcyAhPSBOVUxMKQotCU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRm9yY2VEZXN0cm95KFRoaXMtPnN1cmZhY2VzKTsKLX0KLQotdm9pZCBNYWluX0RpcmVjdERyYXdfQWRkQ2xpcHBlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkJSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcikKLXsKLSAgICBhc3NlcnQoY2xpcHBlci0+ZGRyYXdfb3duZXIgPT0gTlVMTCB8fCBjbGlwcGVyLT5kZHJhd19vd25lciA9PSBUaGlzKTsKLQotICAgIGNsaXBwZXItPmRkcmF3X293bmVyID0gVGhpczsKLQotICAgIGNsaXBwZXItPm5leHRfZGRyYXcgPSBUaGlzLT5jbGlwcGVyczsKLSAgICBjbGlwcGVyLT5wcmV2X2RkcmF3ID0gTlVMTDsKLSAgICBpZiAoVGhpcy0+Y2xpcHBlcnMpCi0JVGhpcy0+Y2xpcHBlcnMtPnByZXZfZGRyYXcgPSBjbGlwcGVyOwotICAgIFRoaXMtPmNsaXBwZXJzID0gY2xpcHBlcjsKLX0KLQotdm9pZCBNYWluX0RpcmVjdERyYXdfUmVtb3ZlQ2xpcHBlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkJICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcikKLXsKLSAgICBhc3NlcnQoY2xpcHBlci0+ZGRyYXdfb3duZXIgPT0gVGhpcyk7Ci0KLSAgICBpZiAoVGhpcy0+Y2xpcHBlcnMgPT0gY2xpcHBlcikKLQlUaGlzLT5jbGlwcGVycyA9IGNsaXBwZXItPm5leHRfZGRyYXc7Ci0KLSAgICBpZiAoY2xpcHBlci0+bmV4dF9kZHJhdykKLQljbGlwcGVyLT5uZXh0X2RkcmF3LT5wcmV2X2RkcmF3ID0gY2xpcHBlci0+cHJldl9kZHJhdzsKLSAgICBpZiAoY2xpcHBlci0+cHJldl9kZHJhdykKLQljbGlwcGVyLT5wcmV2X2RkcmF3LT5uZXh0X2RkcmF3ID0gY2xpcHBlci0+bmV4dF9kZHJhdzsKLX0KLQotc3RhdGljIHZvaWQgTWFpbl9EaXJlY3REcmF3X0RlbGV0ZUNsaXBwZXJzKElEaXJlY3REcmF3SW1wbCogVGhpcykKLXsKLSAgICB3aGlsZSAoVGhpcy0+Y2xpcHBlcnMgIT0gTlVMTCkKLQlNYWluX0RpcmVjdERyYXdDbGlwcGVyX0ZvcmNlRGVzdHJveShUaGlzLT5jbGlwcGVycyk7Ci19Ci0KLXZvaWQgTWFpbl9EaXJlY3REcmF3X0FkZFBhbGV0dGUoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCUlEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGUpCi17Ci0gICAgYXNzZXJ0KHBhbGV0dGUtPmRkcmF3X293bmVyID09IE5VTEwgfHwgcGFsZXR0ZS0+ZGRyYXdfb3duZXIgPT0gVGhpcyk7Ci0KLSAgICBwYWxldHRlLT5kZHJhd19vd25lciA9IFRoaXM7Ci0KLSAgICAvKiB3aGVyZSBzaG91bGQgaXQgZ28/ICovCi0gICAgcGFsZXR0ZS0+bmV4dF9kZHJhdyA9IFRoaXMtPnBhbGV0dGVzOwotICAgIHBhbGV0dGUtPnByZXZfZGRyYXcgPSBOVUxMOwotICAgIGlmIChUaGlzLT5wYWxldHRlcykKLQlUaGlzLT5wYWxldHRlcy0+cHJldl9kZHJhdyA9IHBhbGV0dGU7Ci0gICAgVGhpcy0+cGFsZXR0ZXMgPSBwYWxldHRlOwotfQotCi12b2lkIE1haW5fRGlyZWN0RHJhd19SZW1vdmVQYWxldHRlKElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCQkgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmY7Ci0KLSAgICBhc3NlcnQocGFsZXR0ZS0+ZGRyYXdfb3duZXIgPT0gVGhpcyk7Ci0KLSAgICBpZiAoVGhpcy0+cGFsZXR0ZXMgPT0gcGFsZXR0ZSkKLQlUaGlzLT5wYWxldHRlcyA9IHBhbGV0dGUtPm5leHRfZGRyYXc7Ci0KLSAgICBpZiAocGFsZXR0ZS0+bmV4dF9kZHJhdykKLQlwYWxldHRlLT5uZXh0X2RkcmF3LT5wcmV2X2RkcmF3ID0gcGFsZXR0ZS0+cHJldl9kZHJhdzsKLSAgICBpZiAocGFsZXR0ZS0+cHJldl9kZHJhdykKLQlwYWxldHRlLT5wcmV2X2RkcmF3LT5uZXh0X2RkcmF3ID0gcGFsZXR0ZS0+bmV4dF9kZHJhdzsKLQotICAgIC8qIEhlcmUgd2UgbmVlZCBhbHNvIHRvIHJlbW92ZSB0aGEgcGFsZXR0ZSBmcm9tIGFueSBzdXJmYWNlIHdoaWNoIGhhcyBpdCBhcyB0aGUKLSAgICAgKiBjdXJyZW50IHBhbGV0dGUgKGNoZWNrZWQgb24gV2luZG93cykKLSAgICAgKi8KLSAgICBmb3IgKHN1cmYgPSBUaGlzLT5zdXJmYWNlczsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9kZHJhdykgewotCWlmIChzdXJmLT5wYWxldHRlID09IHBhbGV0dGUpIHsKLQkgICAgVFJBQ0UoIlBhbGV0dGUgJXAgYXR0YWNoZWQgdG8gc3VyZmFjZSAlcC5cbiIsIHBhbGV0dGUsIHN1cmYpOwotCSAgICBzdXJmLT5wYWxldHRlID0gTlVMTDsKLQkgICAgc3VyZi0+c2V0X3BhbGV0dGUoc3VyZiwgTlVMTCk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgTWFpbl9EaXJlY3REcmF3X0RlbGV0ZVBhbGV0dGVzKElEaXJlY3REcmF3SW1wbCogVGhpcykKLXsKLSAgICB3aGlsZSAoVGhpcy0+cGFsZXR0ZXMgIT0gTlVMTCkKLQlNYWluX0RpcmVjdERyYXdQYWxldHRlX0ZvcmNlRGVzdHJveShUaGlzLT5wYWxldHRlcyk7Ci19Ci0KLS8qKiogPz8/ICovCi0KLXN0YXRpYyB2b2lkCi1Mb3NlU3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmYWNlKQotewotICAgIGlmIChzdXJmYWNlICE9IE5VTEwpIHN1cmZhY2UtPmxvc2Vfc3VyZmFjZShzdXJmYWNlKTsKLX0KLQotc3RhdGljIHZvaWQKLUxvc2VQcmltYXJ5U3VyZmFjZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMpCi17Ci0gICAgLyogTVNETjogIklmIGFub3RoZXIgYXBwbGljYXRpb24gY2hhbmdlcyB0aGUgZGlzcGxheSBtb2RlLCB0aGUgcHJpbWFyeQotICAgICAqIHN1cmZhY2UgaXMgbG9zdCwgYW5kIHRoZSBtZXRob2QgcmV0dXJucyBEREVSUl9TVVJGQUNFTE9TVCB1bnRpbCB0aGUKLSAgICAgKiBwcmltYXJ5IHN1cmZhY2UgaXMgcmVjcmVhdGVkIHRvIG1hdGNoIHRoZSBuZXcgZGlzcGxheSBtb2RlLiIKLSAgICAgKgotICAgICAqIFdlIG1hcmsgYWxsIHRoZSBwcmltYXJ5IHN1cmZhY2VzIGFzIGxvc3QgYXMgc29vbiBhcyB0aGUgZGlzcGxheQotICAgICAqIG1vZGUgaXMgY2hhbmdlZCAoYnkgYW55IGFwcGxpY2F0aW9uKS4gKi8KLQotICAgIExvc2VTdXJmYWNlKFRoaXMtPnByaW1hcnlfc3VyZmFjZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVuaW5pdGlhbGlzZWQgRGlyZWN0RHJhdyBmdW5jdGlvbnMKLSAqCi0gKiBUaGlzIHZ0YWJsZSBpcyB1c2VkIHdoZW4gYSBEaXJlY3REcmF3IG9iamVjdCBpcyBjcmVhdGVkIHdpdGgKLSAqIENvQ3JlYXRlSW5zdGFuY2UuIFRoZSBvbmx5IHVzYWJsZSBtZXRob2QgaXMgSW5pdGlhbGl6ZS4KLSAqLwotCi12b2lkIFVuaW5pdF9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdJbXBsICpUaGlzKQotewotICAgIE1haW5fRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlKFRoaXMpOwotfQotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXc3VnRibCBVbmluaXRfRGlyZWN0RHJhd19WVGFibGU7Ci0KLS8qIE5vdCBjYWxsZWQgZnJvbSB0aGUgdnRhYmxlLiAqLwotSFJFU1VMVCBVbmluaXRfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KQotewotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBociA9IE1haW5fRGlyZWN0RHJhd19Db25zdHJ1Y3QoVGhpcywgZXgpOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLSAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gVW5pbml0X0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NywgVW5pbml0X0RpcmVjdERyYXdfVlRhYmxlKTsKLQotICAgIHJldHVybiBTX09LOwotfQotCi1IUkVTVUxUIFVuaW5pdF9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiBwR1VJRCwKLQkJCQkgICAgICAgTFBESVJFQ1REUkFXNyogcElmYWNlLAotCQkJCSAgICAgICBJVW5rbm93biogcFVua091dGVyLCBCT09MIGV4KQotewotICAgIEhSRVNVTFQgaHI7Ci0gICAgSURpcmVjdERyYXdJbXBsKiBUaGlzOwotCi0gICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsgLyogWFhYIG5vOiB3ZSBtdXN0IGNoZWNrIHRoaXMgKi8KLQotICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJICAgICBzaXplb2YoSURpcmVjdERyYXdJbXBsKSk7Ci0gICAgaWYgKFRoaXMgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0KLSAgICBociA9IFVuaW5pdF9EaXJlY3REcmF3X0NvbnN0cnVjdChUaGlzLCBleCk7Ci0gICAgaWYgKEZBSUxFRChocikpCi0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgVGhpcyk7Ci0gICAgZWxzZQotCSpwSWZhY2UgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpOwotCi0gICAgcmV0dXJuIGhyOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0luaXRpYWxpemUoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBHVUlEIHBEZXZpY2VHdWlkKQotewotICAgIGNvbnN0IGRkcmF3X2RyaXZlciogZHJpdmVyOwotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBpZmFjZSwgcERldmljZUd1aWQpOwotCi0gICAgZHJpdmVyID0gRERSQVdfRmluZERyaXZlcihwRGV2aWNlR3VpZCk7Ci0gICAgLyogWFhYIFRoaXMgcmV0dXJuIHZhbHVlIGlzIG5vdCBkb2N1bWVudGVkLiAoTm90IGNoZWNrZWQuKSAqLwotICAgIGlmIChkcml2ZXIgPT0gTlVMTCkgcmV0dXJuIERERVJSX0lOVkFMSURESVJFQ1REUkFXR1VJRDsKLQotICAgIHJldHVybiBkcml2ZXItPmluaXQoVGhpcywgcERldmljZUd1aWQpOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0NvbXBhY3QoTFBESVJFQ1REUkFXNyBpZmFjZSkKLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlQ2xpcHBlcihMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJCUxQRElSRUNURFJBV0NMSVBQRVIgKmxwbHBERENsaXBwZXIsCi0JCQkJSVVua25vd24gKnBVbmtPdXRlcikKLQotewotICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1VbmluaXRfRGlyZWN0RHJhd19DcmVhdGVQYWxldHRlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCi0JCQkJTFBQQUxFVFRFRU5UUlkgbHBDb2xvclRhYmxlLAotCQkJCUxQRElSRUNURFJBV1BBTEVUVEUgKmxwbHBERFBhbGV0dGUsCi0JCQkJSVVua25vd24gKnBVbmtPdXRlcikKLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlLAotCQkJCUxQRERTVVJGQUNFREVTQzIgbHBERFN1cmZhY2VEZXNjLAotCQkJCUxQRElSRUNURFJBV1NVUkZBQ0U3ICpscGxwRERTdXJmYWNlLAotCQkJCUlVbmtub3duICpwVW5rT3V0ZXIpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0R1cGxpY2F0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwKLQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFNyBwU3VyZiwKLQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcER1cFN1cmYpCi0KLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotVW5pbml0X0RpcmVjdERyYXdfRW51bURpc3BsYXlNb2RlcyhMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgIExQRERTVVJGQUNFREVTQzIgbHBERFNELAotCQkJCSAgIExQVk9JRCBjb250ZXh0LAotCQkJCSAgIExQRERFTlVNTU9ERVNDQUxMQkFDSzIgY2IpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0VudW1TdXJmYWNlcyhMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJICAgICAgIExQRERTVVJGQUNFREVTQzIgcEREU0QsIExQVk9JRCBjb250ZXh0LAotCQkJICAgICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgY2IpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSkKLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotVW5pbml0X0RpcmVjdERyYXdfR2V0Q2FwcyhMUERJUkVDVERSQVc3IGlmYWNlLCBMUEREQ0FQUyBwRHJpdmVyQ2FwcywKLQkJCSAgTFBERENBUFMgcEhFTENhcHMpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0dldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsCi0JCQkJIExQRERTVVJGQUNFREVTQzIgcEREU0QpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0dldEZvdXJDQ0NvZGVzKExQRElSRUNURFJBVzcgaWZhY2UsIExQRFdPUkQgcE51bUNvZGVzLAotCQkJCSBMUERXT1JEIHBDb2RlcykKLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotVW5pbml0X0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlLAotCQkJCUxQRElSRUNURFJBV1NVUkZBQ0U3ICpwR0RJU3VyZikKLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotVW5pbml0X0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeShMUERJUkVDVERSQVc3IGlmYWNlLCBMUERXT1JEIHBkd0ZyZXEpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0dldFNjYW5MaW5lKExQRElSRUNURFJBVzcgaWZhY2UsIExQRFdPUkQgcGR3U2NhbkxpbmUpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgUEJPT0wgcGJJc0luVkIpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlKQotewotICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1VbmluaXRfRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzcgaWZhY2UsIEhXTkQgaFduZCwKLQkJCQkgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1VbmluaXRfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd1dpZHRoLAotCQkJCSBEV09SRCBkd0hlaWdodCwgRFdPUkQgZHdCUFAsCi0JCQkJIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCi0JCQkJICAgICAgIEhBTkRMRSBoRXZlbnQpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0dldEF2YWlsYWJsZVZpZE1lbShMUERJUkVDVERSQVc3IGlmYWNlLCBMUEREU0NBUFMyIHBERENhcHMsCi0JCQkJICAgICBMUERXT1JEIHBkd1RvdGFsLCBMUERXT1JEIHBkd0ZyZWUpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X0dldFN1cmZhY2VGcm9tREMoTFBESVJFQ1REUkFXNyBpZmFjZSwgSERDIGhEQywKLQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcFN1cmYpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X1Jlc3RvcmVBbGxTdXJmYWNlcyhMUERJUkVDVERSQVc3IGlmYWNlKQotewotICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1VbmluaXRfRGlyZWN0RHJhd19UZXN0Q29vcGVyYXRpdmVMZXZlbChMUERJUkVDVERSQVc3IGlmYWNlKQotewotICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1VbmluaXRfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyKExQRElSRUNURFJBVzcgaWZhY2UsCi0JCQkJICAgICAgTFBERERFVklDRUlERU5USUZJRVIyIHBERERJLAotCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLVVuaW5pdF9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBTSVpFIHBzek1vZGVzLAotCQkJCURXT1JEIGNNb2RlcywgRFdPUkQgZHdGbGFncykKLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotVW5pbml0X0RpcmVjdERyYXdfRXZhbHVhdGVNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCi0JCQkgICAgICAgTFBEV09SRCBwVGltZW91dCkKLXsKLSAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBJRGlyZWN0RHJhdzdWdGJsIFVuaW5pdF9EaXJlY3REcmF3X1ZUYWJsZSA9Ci17Ci0gICAgTWFpbl9EaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd19BZGRSZWYsCi0gICAgTWFpbl9EaXJlY3REcmF3X1JlbGVhc2UsCi0gICAgVW5pbml0X0RpcmVjdERyYXdfQ29tcGFjdCwKLSAgICBVbmluaXRfRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUsCi0gICAgVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSwKLSAgICBVbmluaXRfRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMsCi0gICAgVW5pbml0X0RpcmVjdERyYXdfRW51bVN1cmZhY2VzLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UsCi0gICAgVW5pbml0X0RpcmVjdERyYXdfR2V0Q2FwcywKLSAgICBVbmluaXRfRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSwKLSAgICBVbmluaXRfRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKLSAgICBVbmluaXRfRGlyZWN0RHJhd19HZXRHRElTdXJmYWNlLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X0dldE1vbml0b3JGcmVxdWVuY3ksCi0gICAgVW5pbml0X0RpcmVjdERyYXdfR2V0U2NhbkxpbmUsCi0gICAgVW5pbml0X0RpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cywKLSAgICBVbmluaXRfRGlyZWN0RHJhd19Jbml0aWFsaXplLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZSwKLSAgICBVbmluaXRfRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X0dldEF2YWlsYWJsZVZpZE1lbSwKLSAgICBVbmluaXRfRGlyZWN0RHJhd19HZXRTdXJmYWNlRnJvbURDLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X1Jlc3RvcmVBbGxTdXJmYWNlcywKLSAgICBVbmluaXRfRGlyZWN0RHJhd19UZXN0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBVbmluaXRfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyLAotICAgIFVuaW5pdF9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QsCi0gICAgVW5pbml0X0RpcmVjdERyYXdfRXZhbHVhdGVNb2RlCi19OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kZHJhd19wcml2YXRlLmggYi9kbGxzL2RkcmF3L2RkcmF3X3ByaXZhdGUuaAppbmRleCBhMzViYTZiLi42NmNlMTY2IDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L2RkcmF3X3ByaXZhdGUuaAorKysgYi9kbGxzL2RkcmF3L2RkcmF3X3ByaXZhdGUuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwMC0yMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNiBTdGVmYW4gRPZzaW5nZXIKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0zMCw1NCArMzAsNTcgQEAKICNpbmNsdWRlICJ3aW5nZGkuaCIKICNpbmNsdWRlICJ3aW51c2VyLmgiCiAjaW5jbHVkZSAiZGRyYXcuaCIKLSNpbmNsdWRlICJkM2QuaCIKLSNpbmNsdWRlICJkZGNvbWltcGwuaCIKICNpbmNsdWRlICJkZHJhd2kuaCIKKyNpbmNsdWRlICJkM2QuaCIKIAotLyogWFhYIFB1dCB0aGlzIHNvbWV3aGVyZSBwcm9wZXIuICovCi0jZGVmaW5lIEREX1NUUlVDVF9JTklUKHgpCQkJXAotCWRvIHsJCQkJCVwKLQkJbWVtc2V0KCh4KSwgMCwgc2l6ZW9mKCooeCkpKTsJXAotCQkoeCktPmR3U2l6ZSA9IHNpemVvZigqeCk7CVwKLQl9IHdoaWxlICgwKQorI2luY2x1ZGUgImRkY29taW1wbC5oIgogCi0jZGVmaW5lIEREX1NUUlVDVF9DT1BZX0JZU0laRSh0byxmcm9tKQkJCVwKLQlkbyB7CQkJCQkJXAotCSAgICAJRFdPUkQgX19zaXplID0gKHRvKS0+ZHdTaXplOwkJXAotCSAgICAJRFdPUkQgX19jb3B5c2l6ZSA9IF9fc2l6ZTsJCVwKLQkgICAgCURXT1JEIF9fcmVzZXRzaXplID0gX19zaXplOwkJXAotCQlhc3NlcnQodG8gIT0gZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgICAgaWYgKF9fcmVzZXRzaXplID4gc2l6ZW9mKCp0bykpCQlcCi0JCSAgICBfX3Jlc2V0c2l6ZSA9IHNpemVvZigqdG8pOwkJXAotCSAgICAJbWVtc2V0KHRvLDAsX19yZXNldHNpemUpOyAgICAgICAgICAgICAgIFwKLQkgICAgICAgIGlmICgoZnJvbSktPmR3U2l6ZSA8IF9fc2l6ZSkgCQlcCi0JCSAgICBfX2NvcHlzaXplID0gKGZyb20pLT5kd1NpemU7CVwKLQkJbWVtY3B5KHRvLGZyb20sX19jb3B5c2l6ZSk7CQlcCi0JCSh0byktPmR3U2l6ZSA9IF9fc2l6ZTsvKnJlc3RvcmUgc2l6ZSovCVwKLQl9IHdoaWxlICgwKQorI2luY2x1ZGUgIndpbmUvd2luZWQzZF9pbnRlcmZhY2UuaCIKIAotI2RlZmluZSBNQUtFX0ZPVVJDQyhhLGIsYyxkKSAoKGEgPDwgMCkgfCAoYiA8PCA4KSB8IChjIDw8IDE2KSB8IChkIDw8IDI0KSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVBhcmVudCAtIGEgaGVscGVyIGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworREVGSU5FX0dVSUQoSUlEX0lQYXJlbnQsIDB4YzIwZTRjODgsIDB4NzRlNywgMHg0OTQwLCAweGJhLCAweDlmLCAweDJlLCAweDMyLCAweDNmLCAweDlkLCAweGM5LCAweDgxKTsKK3R5cGVkZWYgc3RydWN0IElQYXJlbnQgKkxQUEFSRU5ULCAqUFBBUkVOVDsKKworI2RlZmluZSBJTlRFUkZBQ0UgSVBhcmVudAorREVDTEFSRV9JTlRFUkZBQ0VfKElQYXJlbnQsSVVua25vd24pCit7CisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0RfKEhSRVNVTFQsUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqZWN0KSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsKK307CisjdW5kZWYgSU5URVJGQUNFCisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQorLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyNkZWZpbmUgSVBhcmVudF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQorI2RlZmluZSBJUGFyZW50X0FkZFJlZihwKSAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkUmVmKHApCisjZGVmaW5lIElQYXJlbnRfUmVsZWFzZShwKSAgICAgICAgICAgIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApCisjZW5kaWYKKworCisvKiBUeXBkZWYgdGhlIGludGVyZmFjZXMgKi8KK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgIElEaXJlY3REcmF3SW1wbDsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGw7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsOwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlSW1wbCAgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbDsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzRERldmljZUltcGwgICAgICAgIElEaXJlY3QzRERldmljZUltcGw7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RMaWdodEltcGwgICAgICAgICBJRGlyZWN0M0RMaWdodEltcGw7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWaWV3cG9ydEltcGwgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGw7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RNYXRlcmlhbEltcGwgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGw7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbDsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGw7Cit0eXBlZGVmIHN0cnVjdCBJUGFyZW50SW1wbCAgICAgICAgICAgICAgICBJUGFyZW50SW1wbDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd0ltcGwgSURpcmVjdERyYXdJbXBsOwotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlSW1wbCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsOwotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVySW1wbCBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsOwotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsOwotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNERGV2aWNlSW1wbCBJRGlyZWN0M0REZXZpY2VJbXBsOwotCi10eXBlZGVmIHZvaWQgKCpwaXhlbF9jb252ZXJ0X2Z1bmMpKHZvaWQgKnNyYywgdm9pZCAqZHN0LCBEV09SRCB3aWR0aCwKLQkJCQkgICBEV09SRCBoZWlnaHQsIExPTkcgcGl0Y2gsCi0JCQkJICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqcGFsZXR0ZSk7Ci0KLXR5cGVkZWYgdm9pZCAoKnBhbGV0dGVfY29udmVydF9mdW5jKShMUFBBTEVUVEVFTlRSWSBwYWxlbnQsCi0JCQkJICAgICB2b2lkICpzY3JlZW5fcGFsZXR0ZSwgRFdPUkQgc3RhcnQsCi0JCQkJICAgICBEV09SRCBjb3VudCk7CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0cnVjdCBJRGlyZWN0RHJhd0ltcGwKIHsKKyAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzcpOwogICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3NCk7CiAgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXcyKTsKQEAgLTg3LDE0NCArOTAsMjU2IEBACiAgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEMik7CiAgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEKTsKIAotICAgIExPTkcgcmVmOworICAgIExPTkcgICAgICAgICAgICAgIHJlZjsKIAotICAgIC8qIFRSVUUgaWYgY3JlYXRlZCB2aWEgRGlyZWN0RHJhd0NyZWF0ZUV4IG9yIENvQ3JlYXRlSW5zdGFuY2UsCi0gICAgICogRkFMU0UgaWYgY3JlYXRlZCB2aWEgRGlyZWN0RHJhd0NyZWF0ZS4gKi8KLSAgICBCT09MIGV4OworICAgIC8qIFdpbmVEM0QgbGlua2FnZSAqLworICAgIElXaW5lRDNEICAgICAgICAgICAgICAgICp3aW5lRDNEOworICAgIElXaW5lRDNERGV2aWNlICAgICAgICAgICp3aW5lRDNERGV2aWNlOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpEZXB0aFN0ZW5jaWxCdWZmZXI7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgZDNkX2luaXRpYWxpemVkOwogCi0gICAgLyogTGlua2VkIGxpc3Qgb2Ygc3VyZmFjZXMsIGpvaW5lZCBieSBuZXh0X2RkcmF3IGluIElEaXJlY3RTdXJmYWNlSW1wbC4gKi8KLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmYWNlczsKLSAgICAvKiBMaW5rZWQgbGlzdCBvZiBwYWxldHRlcywgam9pbmVkIGJ5IG5leHRfZGRyYXcuICovCi0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsZXR0ZXM7Ci0gICAgLyogTGlua2VkIGxpc3Qgb2YgY2xpcHBlcnMsIGpvaW5lZCBieSBuZXh0X2RkcmF3LiAqLwotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwqIGNsaXBwZXJzOworICAgIC8qIG1pc2MgZGRyYXcgZmllbGRzICovCisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgdG90YWxfdmlkbWVtOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGN1cl9zY2FubGluZTsKKyAgICBCT09MICAgICAgICAgICAgICAgICAgICBmYWtlX3ZibGFuazsKKyAgICBCT09MICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZDsKIAotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIHByaW1hcnlfc3VyZmFjZTsKKyAgICAvKiBEaXJlY3REcmF3IHRoaW5ncywgd2hpY2ggYXJlIG5vdCBoYW5kbGVkIGJ5IFdpbmVEM0QgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZV9sZXZlbDsKIAotICAgIEREUkFXSV9ESVJFQ1REUkFXX0xDTCBsb2NhbDsKLSAgICBERENBUFMgY2FwczsKKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodDsKKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICBvcmlnX2JwcDsKIAotICAgIEhXTkQgd2luZG93OwotICAgIERXT1JEIGNvb3BlcmF0aXZlX2xldmVsOwotICAgIFdORFBST0Mgb3JpZ2luYWxfd25kcHJvYzsKKyAgICBERENBUFMgICAgICAgICAgICAgICAgICBjYXBzOwogCi0gICAgRFdPUkQgd2lkdGgsIGhlaWdodDsKLSAgICBMT05HIHBpdGNoOwotICAgIEREUElYRUxGT1JNQVQgcGl4ZWxmb3JtYXQ7Ci0gICAgRFdPUkQgY3VyX3NjYW5saW5lOworICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHN0eWxlOworICAgIExPTkcgICAgICAgICAgICAgICAgICAgIGV4U3R5bGU7CiAKLSAgICBCT09MIGZha2VfdmJsYW5rOwotICAgIAotICAgIC8qIFNob3VsZCBlYWNoIG9mIHRoZXNlIGdvIGludG8gc29tZSBzdHJ1Y3R1cmU/ICovCi0gICAgRFdPUkQgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQ7Ci0gICAgTE9ORyBvcmlnX3BpdGNoOwotICAgIEREUElYRUxGT1JNQVQgb3JpZ19waXhlbGZvcm1hdDsKKyAgICAvKiBEM0QgdGhpbmdzICovCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAgKmQzZF90YXJnZXQ7CisgICAgSFdORCAgICAgICAgICAgICAgICAgICAgZDNkX3dpbmRvdzsKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAqZDNkZGV2aWNlOwogCi0gICAgLyogQ2FsbGVkIHdoZW4gdGhlIHJlZmNvdW50IGdvZXMgdG8gMC4gKi8KLSAgICB2b2lkICgqZmluYWxfcmVsZWFzZSkoSURpcmVjdERyYXdJbXBsICpUaGlzKTsKKyAgICAvKiBWYXJpb3MgSFdORHMgKi8KKyAgICBIV05EICAgICAgICAgICAgICAgICAgICBmb2N1c3dpbmRvdzsKKyAgICBIV05EICAgICAgICAgICAgICAgICAgICBkZXZpY2V3aW5kb3c7CiAKLSAgICBIUkVTVUxUICgqc2V0X2V4Y2x1c2l2ZV9tb2RlKShJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIERXT1JEIGR3RXhjbCk7CisgICAgLyogVGhlIHN1cmZhY2UgdHlwZSB0byByZXF1ZXN0ICovCisgICAgV0lORUQzRFNVUkZUWVBFIEltcGxUeXBlOwogCi0gICAgSFJFU1VMVCAoKmNyZWF0ZV9wYWxldHRlKShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIERXT1JEIGR3RmxhZ3MsCi0JCQkgICAgICBMUERJUkVDVERSQVdQQUxFVFRFKiBwcFBhbGV0dGUsCi0JCQkgICAgICBMUFVOS05PV04gcFVua091dGVyKTsKKyAgICAvKiBUaGUgc3VyZmFjZSBsaXN0IC0gY2FuJ3QgcmVsYXkgdGhpcyB0byBXaW5lRDNECisgICAgICogYmVjYXVzZSBvZiBJUGFyZW50CisgICAgICovCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZmFjZV9saXN0OwogCi0gICAgLyogU3VyZmFjZSBjcmVhdGlvbiBmdW5jdGlvbnMuIEZvciBhbGwgb2YgdGhlc2UsIHBPdXRlciA9PSBOVUxMLiAqLworICAgIC8qIE91ciBwcml2YXRlIHdpbmRvdyBjbGFzcyAqLworICAgIGNoYXIgY2xhc3NuYW1lWzMyXTsKKyAgICBXTkRDTEFTU0Egd25kX2NsYXNzOwogCi0gICAgLyogRG8gbm90IGNyZWF0ZSBhbnkgYmFja2J1ZmZlcnMgb3IgdGhlIGZsaXBwaW5nIGNoYWluLiAqLwotICAgIEhSRVNVTFQgKCpjcmVhdGVfcHJpbWFyeSkoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJICAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlcik7CisgICAgLyogSGVscGVycyBmb3Igc3VyZmFjZSBjcmVhdGlvbiAqLworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleF9yb290OworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgIGRlcHRoc3RlbmNpbDsKIAotICAgIC8qIFByaW1hcnkgbWF5IGJlIE5VTEwgaWYgd2UgYXJlIGNyZWF0aW5nIGFuIHVuYXR0YWNoZWQgYmFja2J1ZmZlci4gKi8KLSAgICBIUkVTVUxUICgqY3JlYXRlX2JhY2tidWZmZXIpKElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCQkgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAotCQkJCSBMUFVOS05PV04gcE91dGVyLAotCQkJCSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcmltYXJ5KTsKKyAgICAvKiBGb3IgdGhlIGRsbCB1bmxvYWQgY2xlYW51cCBjb2RlICovCisgICAgSURpcmVjdERyYXdJbXBsICpuZXh0OworICAgIEJPT0wgRG9Ob3REZXN0cm95OworICAgIExPTkcgc3VyZmFjZXM7Cit9OwogCi0gICAgLyogc2hpbnkgaGFwcHkgb2Zmc2NyZWVucGxhaW4gc3VyZmFjZXMgKi8KLSAgICBIUkVTVUxUICgqY3JlYXRlX29mZnNjcmVlbikoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCWNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAotCQkJCUxQVU5LTk9XTiBwT3V0ZXIpOworLyogRGVjbGFyZSB0aGUgVlRhYmxlcy4gVGhleSBjYW4gYmUgZm91bmQgZGRyYXcuYyAqLworY29uc3QgSURpcmVjdERyYXc3VnRibCBJRGlyZWN0RHJhdzdfVnRibDsKK2NvbnN0IElEaXJlY3REcmF3NFZ0YmwgSURpcmVjdERyYXc0X1Z0Ymw7Citjb25zdCBJRGlyZWN0RHJhdzJWdGJsIElEaXJlY3REcmF3Ml9WdGJsOworY29uc3QgSURpcmVjdERyYXdWdGJsICBJRGlyZWN0RHJhdzFfVnRibDsKIAotICAgIC8qIGR3TWlwTWFwTGV2ZWwgaXMgc3BlY2lmaWVkIGFzIHBlciBPcGVuR0wuIChpLmUuIDAgaXMgYmFzZSkgKi8KLSAgICBIUkVTVUxUICgqY3JlYXRlX3RleHR1cmUpKElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCSAgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsIExQVU5LTk9XTiBwT3V0ZXIsCi0JCQkgICAgICBEV09SRCBkd01pcE1hcExldmVsKTsKKy8qIEhlbHBlciBzdHJ1Y3R1cmVzICovCit0eXBlZGVmIHN0cnVjdCBFbnVtRGlzcGxheU1vZGVzQ0JTCit7CisgICAgdm9pZCAqY29udGV4dDsKKyAgICBMUERERU5VTU1PREVTQ0FMTEJBQ0syIGNhbGxiYWNrOworfSBFbnVtRGlzcGxheU1vZGVzQ0JTOwogCi0gICAgSFJFU1VMVCAoKmNyZWF0ZV96YnVmZmVyKShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCi0JCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLCBMUFVOS05PV04gcE91dGVyKTsKK3R5cGVkZWYgc3RydWN0IEVudW1TdXJmYWNlc0NCUworeworICAgIHZvaWQgKmNvbnRleHQ7CisgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYWxsYmFjazsKKyAgICBMUEREU1VSRkFDRURFU0MyIHBERFNEOworICAgIERXT1JEIEZsYWdzOworfSBFbnVtU3VyZmFjZXNDQlM7CiAKLSAgICBMUFZPSUQJcHJpdmF0ZTsKKy8qIFV0aWxpdHkgZnVuY3Rpb25zICovCit2b2lkCitERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0FQUzIqIHBPdXQpOwordm9pZAorRERSQVdfQ29udmVydF9ERERFVklDRUlERU5USUZJRVJfMl9Ub18xKGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIqIHBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERERFVklDRUlERU5USUZJRVIqIHBPdXQpOwordm9pZAorSURpcmVjdERyYXdJbXBsX0Rlc3Ryb3koSURpcmVjdERyYXdJbXBsICpUaGlzKTsKIAotICAgIC8qIEV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBzdGlsbCBxdWVzdGlvbmFibGUuICovCitIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX1JlY3JlYXRlU3VyZmFjZXNDYWxsYmFjayhJRGlyZWN0RHJhd1N1cmZhY2U3ICpzdXJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29udGV4dCk7CisvKiBUaGUgY2xlYW51cCBsaXN0ICovCitleHRlcm4gSURpcmVjdERyYXdJbXBsICpkZHJhd19saXN0OwogCi0gICAgRERQSVhFTEZPUk1BVCBzY3JlZW5fcGl4ZWxmb3JtYXQ7CisvKiBUaGUgZGVmYXVsdCBzdXJmYWNlIHR5cGUgKi8KK2V4dGVybiBXSU5FRDNEU1VSRlRZUEUgRGVmYXVsdFN1cmZhY2VUeXBlOwogCi0gICAgaW50ICAgICAgICAgICBwaXhtYXBfZGVwdGg7Ci0gICAgcGl4ZWxfY29udmVydF9mdW5jIHBpeGVsX2NvbnZlcnQ7Ci0gICAgcGFsZXR0ZV9jb252ZXJ0X2Z1bmMgcGFsZXR0ZV9jb252ZXJ0OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2UgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICAvKiBVc2UgdG8gZm9vbCBzb21lIHRvbyBzdHJpY3QgZ2FtZXMgKi8KLSAgICBJTlQzMiAoKmFsbG9jYXRlX21lbW9yeSkoSURpcmVjdERyYXdJbXBsICpUaGlzLCBEV09SRCBtZW0pOwotICAgIHZvaWQgKCpmcmVlX21lbW9yeSkoSURpcmVjdERyYXdJbXBsICpUaGlzLCBEV09SRCBtZW0pOwotICAgIERXT1JEIHRvdGFsX3ZpZG1lbSwgYXZhaWxhYmxlX3ZpZG1lbTsKLSAgICAKLSAgICAvKiBJRGlyZWN0M0QgZmllbGRzICovCi0gICAgTFBWT0lEIGQzZF9wcml2YXRlOworc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwKK3sKKyAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KKyAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKyAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2UzKTsKKyAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCk7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZTIpOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFRleHR1cmUpOwogCi0gICAgLyogVXNlZCBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHRleHR1cmUgKi8KLSAgICBIUkVTVUxUICgqZDNkX2NyZWF0ZV90ZXh0dXJlKShJRGlyZWN0RHJhd0ltcGwgKmQzZCwgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdGV4LCBCT09MRUFOIGF0X2NyZWF0aW9uLCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICptYWluKTsKKyAgICBMT05HICAgICAgICAgICAgICAgICAgICAgcmVmOwogCi0gICAgLyogVXNlZCBhcyBhIGNhbGxiYWNrIGZvciBEZXZpY2VzIHRvIHRlbGwgdG8gdGhlIEQzRCBvYmplY3QgaXQncyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBIUkVTVUxUICgqZDNkX2FkZGVkX2RldmljZSkoSURpcmVjdERyYXdJbXBsICpkM2QsIElEaXJlY3QzRERldmljZUltcGwgKmRldmljZSk7Ci0gICAgSFJFU1VMVCAoKmQzZF9yZW1vdmVkX2RldmljZSkoSURpcmVjdERyYXdJbXBsICpkM2QsIElEaXJlY3QzRERldmljZUltcGwgKmRldmljZSk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjsKIAotICAgIC8qIFRoaXMgaXMgbmVlZGVkIGZvciBkZWxheWVkIHRleHR1cmUgY3JlYXRpb24gYW5kIFogYnVmZmVyIGJsaXRzICovCi0gICAgSURpcmVjdDNERGV2aWNlSW1wbCAqY3VycmVudF9kZXZpY2U7CisgICAgLyogQ29ubmVjdGlvbnMgdG8gb3RoZXIgT2JqZWN0cyAqLworICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICpkZHJhdzsKKyAgICBJV2luZUQzRFN1cmZhY2UgICAgICAgICAqV2luZUQzRFN1cmZhY2U7CisgICAgSVdpbmVEM0RUZXh0dXJlICAgICAgICAgKndpbmVEM0RUZXh0dXJlOwogCi0gICAgLyogVGhpcyBpcyBmb3IgdGhlIGZha2UgbWFpbldpbmRvdyAqLwotICAgIEFUT00Jd2luY2xhc3M7Ci0gICAgUEFJTlRTVFJVQ1QJcHM7Ci0gICAgQk9PTAlwYWludGFibGU7CisgICAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIGF0dGFjaGluZyBzdXJmYWNlcyB0byBvdGhlciBzdXJmYWNlcyAqLworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpuZXh0X2F0dGFjaGVkOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpmaXJzdF9hdHRhY2hlZDsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICAqbmV4dF9jb21wbGV4OworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICpmaXJzdF9jb21wbGV4OworCisgICAgLyogU3VyZmFjZSBkZXNjcmlwdGlvbiwgZm9yIEdldEF0dGFjaGVkU3VyZmFjZSAqLworICAgIEREU1VSRkFDRURFU0MyICAgICAgICAgIHN1cmZhY2VfZGVzYzsKKworICAgIC8qIE1pc2MgdGhpbmdzICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgdW5pcXVlbmVzc192YWx1ZTsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICBtaXBtYXBfbGV2ZWw7CisgICAgV0lORUQzRFNVUkZUWVBFICAgICAgICAgSW1wbFR5cGU7CisKKyAgICAvKiBGb3IgRDNERGV2aWNlIGNyZWF0aW9uICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgaXNSZW5kZXJUYXJnZXQ7CisKKyAgICAvKiBDbGlwcGVyIG9iamVjdHMgKi8KKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICAqY2xpcHBlcjsKKworICAgIC8qIEZvciB0aGUgZGRyYXcgc3VyZmFjZSBsaXN0ICovCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqbmV4dDsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpwcmV2OworfTsKKworLyogVlRhYmxlIGRlY2xhcmF0aW9uLiBJdCdzIGxvY2F0ZWQgaW4gc3VyZmFjZS5jIC8gc3VyZmFjZV90aHVua3MuYyAqLworY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgSURpcmVjdERyYXdTdXJmYWNlN19WdGJsOworY29uc3QgSURpcmVjdERyYXdTdXJmYWNlM1Z0YmwgSURpcmVjdERyYXdTdXJmYWNlM19WdGJsOworY29uc3QgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xWdGJsIElEaXJlY3REcmF3R2FtbWFDb250cm9sX1Z0Ymw7Citjb25zdCBJRGlyZWN0M0RUZXh0dXJlMlZ0YmwgSURpcmVjdDNEVGV4dHVyZTJfVnRibDsKK2NvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIElEaXJlY3QzRFRleHR1cmUxX1Z0Ymw7CisKKy8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgYSBnaXZlbiBzdXJmYWNlICovCisjZGVmaW5lIFBGR0VUX0JQUChwZikgKHBmLmR3RmxhZ3MmRERQRl9QQUxFVFRFSU5ERVhFRDg/MTooKHBmLmR3UkdCQml0Q291bnQrNykvOCkpCisjZGVmaW5lIEdFVF9CUFAoZGVzYykgUEZHRVRfQlBQKGRlc2MuZGRwZlBpeGVsRm9ybWF0KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElQYXJlbnQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBJUGFyZW50SW1wbAoreworICAgIC8qIElVbmtub3duIGZpZWxkcyAqLworICAgIElDT01fVkZJRUxEX01VTFRJKElQYXJlbnQpOworICAgIExPTkcgICAgICAgICAgICAgICAgICAgIHJlZjsKKworICAgIC8qIElQYXJlbnRJbXBsIGZpZWxkcyAqLworICAgIElVbmtub3duICAgICAgKmNoaWxkOworCit9OworCitjb25zdCBJUGFyZW50VnRibCBJUGFyZW50X1Z0Ymw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgSURpcmVjdDNERGV2aWNlSW1wbAoreworICAgIC8qIElVbmtub3duICovCisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlNyk7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlMyk7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlMik7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERGV2aWNlKTsKKyAgICBMT05HICAgICAgICAgICAgICAgICAgICByZWY7CisKKyAgICAvKiBPdGhlciBvYmplY3QgY29ubmVjdGlvbnMgKi8KKyAgICBJV2luZUQzRERldmljZSAgICAgICAgICAqd2luZUQzRERldmljZTsKKyAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAqZGRyYXc7CisgICAgSVdpbmVEM0RJbmRleEJ1ZmZlciAgICAgKmluZGV4YnVmZmVyOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgICp0YXJnZXQ7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgT2ZmU2NyZWVuVGFyZ2V0OworCisgICAgLyogVmlld3BvcnQgbWFuYWdlbWVudCAqLworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdmlld3BvcnRfbGlzdDsKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cnJlbnRfdmlld3BvcnQ7CisgICAgRDNEVklFV1BPUlQ3IGFjdGl2ZV92aWV3cG9ydDsKKworICAgIC8qIExpZ2h0IHN0YXRlICovCisgICAgRFdPUkQgbWF0ZXJpYWw7CisKKyAgICAvKiBSZW5kZXJpbmcgZnVuY3Rpb25zIHRvIHdyYXAgRDNEKDEtMykgdG8gRDNENyAqLworICAgIEQzRFBSSU1JVElWRVRZUEUgcHJpbWl0aXZlX3R5cGU7CisgICAgRFdPUkQgdmVydGV4X3R5cGU7CisgICAgRFdPUkQgcmVuZGVyX2ZsYWdzOworICAgIERXT1JEIG5iX3ZlcnRpY2VzOworICAgIExQQllURSB2ZXJ0ZXhfYnVmZmVyOworICAgIERXT1JEIHZlcnRleF9zaXplOworICAgIERXT1JEIGJ1ZmZlcl9zaXplOworfTsKKworLyogVnRhYmxlcyBpbiB2YXJpb3VzIHZlcnNpb25zICovCitjb25zdCBJRGlyZWN0M0REZXZpY2U3VnRibCBJRGlyZWN0M0REZXZpY2U3X1Z0Ymw7Citjb25zdCBJRGlyZWN0M0REZXZpY2UzVnRibCBJRGlyZWN0M0REZXZpY2UzX1Z0Ymw7Citjb25zdCBJRGlyZWN0M0REZXZpY2UyVnRibCBJRGlyZWN0M0REZXZpY2UyX1Z0Ymw7Citjb25zdCBJRGlyZWN0M0REZXZpY2VWdGJsICBJRGlyZWN0M0REZXZpY2UxX1Z0Ymw7CisKKy8qIFRoZSBJSUQgKi8KK2NvbnN0IEdVSUQgSUlEX0QzRERFVklDRV9XaW5lRDNEOworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCitIUkVTVUxUIElEaXJlY3QzREltcGxfR2V0Q2FwcyhJV2luZUQzRCAqV2luZUQzRCwgRDNEREVWSUNFREVTQyAqRGVzYzEyMywgRDNEREVWSUNFREVTQzcgKkRlc2M3KTsKKworLyogU3RydWN0dXJlcyAqLworc3RydWN0IEVudW1UZXh0dXJlRm9ybWF0c0NCUworeworICAgIExQRDNERU5VTVRFWFRVUkVGT1JNQVRTQ0FMTEJBQ0sgY2J2MjsKKyAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBjYnY3OworICAgIHZvaWQgKkNvbnRleHQ7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3REcmF3UGFsZXR0ZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKLSAqLwotc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwKKyAqIElEaXJlY3QzRCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBObyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgYXMgdGhpcyBpcyBvbmx5IGFub3RoZXIgaW50ZXJmYWNlIHRvIERpcmVjdERyYXcgKi8KKworLyogdGhlIFZ0YWJsZXMgKi8KK2NvbnN0IElEaXJlY3QzRFZ0YmwgIElEaXJlY3QzRDFfVnRibDsKK2NvbnN0IElEaXJlY3QzRDJWdGJsIElEaXJlY3QzRDJfVnRibDsKK2NvbnN0IElEaXJlY3QzRDNWdGJsIElEaXJlY3QzRDNfVnRibDsKK2NvbnN0IElEaXJlY3QzRDdWdGJsIElEaXJlY3QzRDdfVnRibDsKKworLyogU3RydWN0dXJlIGZvciBFbnVtWkJ1ZmZlckZvcm1hdHMgKi8KK3N0cnVjdCBFbnVtWkJ1ZmZlckZvcm1hdHNEYXRhCiB7Ci0gICAgLyogSVVua25vd24gZmllbGRzICovCi0gICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXdQYWxldHRlKTsKLSAgICBMT05HIHJlZjsKLQotICAgIEREUkFXSV9ERFJBV1BBTEVUVEVfTENMIGxvY2FsOwotICAgIEREUkFXSV9ERFJBV1BBTEVUVEVfR0JMIGdsb2JhbDsKLQotICAgIC8qIElEaXJlY3REcmF3UGFsZXR0ZSBmaWVsZHMgKi8KLSAgICBIUEFMRVRURQkJaHBhbDsKLSAgICBXT1JECQlwYWxWZXJzaW9uLCBwYWxOdW1FbnRyaWVzOyAvKiBMT0dQQUxFVFRFICovCi0gICAgUEFMRVRURUVOVFJZCXBhbGVudHNbMjU2XTsKLSAgICAvKiBUaGlzIGlzIHRvIHN0b3JlIHRoZSBwYWxldHRlIGluICdzY3JlZW4gZm9ybWF0JyAqLwotICAgIGludAkJCXNjcmVlbl9wYWxlbnRzWzI1Nl07Ci0KLSAgICBWT0lEICgqZmluYWxfcmVsZWFzZSkoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcyk7Ci0KLSAgICBJRGlyZWN0RHJhd0ltcGwqIGRkcmF3X293bmVyOwotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHByZXZfZGRyYXc7Ci0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogbmV4dF9kZHJhdzsKLQotICAgIExQVk9JRAkJcHJpdmF0ZTsKKyAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBDYWxsYmFjazsKKyAgICB2b2lkICpDb250ZXh0OwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCi0gKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsCiB7CiAgICAgLyogSVVua25vd24gZmllbGRzICovCkBAIC0yMzUsMTkxICszNTAsMjM1IEBACiAgICAgSFdORCBoV25kOwogCiAgICAgSURpcmVjdERyYXdJbXBsKiBkZHJhd19vd25lcjsKLSAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiBwcmV2X2RkcmF3OwotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGwqIG5leHRfZGRyYXc7CisgICAgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwqIHByZXZfZGRyYXc7CisgICAgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwqIG5leHRfZGRyYXc7CiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3REcmF3U3VyZmFjZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKLSAqLworY29uc3QgSURpcmVjdERyYXdDbGlwcGVyVnRibCBJRGlyZWN0RHJhd0NsaXBwZXJfVnRibDsKIAotc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdQYWxldHRlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwKIHsKICAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2U3KTsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd1N1cmZhY2UzKTsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCk7Ci0gICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNEVGV4dHVyZTIpOwotICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFRleHR1cmUpOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3UGFsZXR0ZSk7CiAgICAgTE9ORyByZWY7CiAKLSAgICBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogYXR0YWNoZWQ7IC8qIGF0dGFjaGVkIHN1cmZhY2VzICovCisgICAgLyogV2luZUQzRCB1cGxpbmsgKi8KKyAgICBJV2luZUQzRFBhbGV0dGUgICAgICAgICAgICp3aW5lRDNEUGFsZXR0ZTsKIAotICAgIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBuZXh0X2RkcmF3OyAvKiBkZHJhdyBzdXJmYWNlIGNoYWluICovCi0gICAgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwqIHByZXZfZGRyYXc7Ci0gICAgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwqIG5leHRfYXR0YWNoZWQ7IC8qIGF0dGFjaGVkIHN1cmZhY2UgY2hhaW4gKi8KLSAgICBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJldl9hdHRhY2hlZDsKKyAgICAvKiBJRGlyZWN0RHJhd1BhbGV0dGUgZmllbGRzICovCisgICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXdfb3duZXI7Cit9OworY29uc3QgSURpcmVjdERyYXdQYWxldHRlVnRibCBJRGlyZWN0RHJhd1BhbGV0dGVfVnRibDsKIAotICAgIElEaXJlY3REcmF3SW1wbCogZGRyYXdfb3duZXI7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZmFjZV9vd25lcjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERpcmVjdERyYXcgQ2xhc3NGYWN0b3J5IEltcGxlbWVudGF0aW9uIC0gaW5jb21wbGV0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSUNsYXNzRmFjdG9yeSk7CiAKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlOyAvKiBzdHJvbmcgcmVmICovCi0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcjsgLyogc3Ryb25nIHJlZiAqLworICAgIExPTkcgcmVmOworICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcE9iaik7Cit9IElDbGFzc0ZhY3RvcnlJbXBsOwogCi0gICAgRERSQVdJX0REUkFXU1VSRkFDRV9MQ0wgbG9jYWw7Ci0gICAgRERSQVdJX0REUkFXU1VSRkFDRV9NT1JFIG1vcmU7Ci0gICAgLyogRklYTUU6IHNpbmNlIEZsaXAgc2hvdWxkIHN3YXAgdGhlIEdCTCBzdHJ1Y3R1cmVzLCB0aGV5IHNob3VsZAotICAgICAqIHByb2JhYmx5IG5vdCBiZSBlbWJlZGRlZCBpbnRvIHRoZSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsIHN0cnVjdHVyZS4uLiAqLwotICAgIExQRERSQVdJX0REUkFXU1VSRkFDRV9HQkxfTU9SRSBnbW9yZTsKLSAgICBERFJBV0lfRERSQVdTVVJGQUNFX0dCTCBnbG9iYWw7Ci0gICAgRERSQVdJX0REUkFXU1VSRkFDRV9HQkxfTU9SRSBnbG9iYWxfbW9yZTsKLQotICAgIEREU1VSRkFDRURFU0MyIHN1cmZhY2VfZGVzYzsKLQotICAgIEhEQyBoREM7Ci0gICAgUkVDVCBsYXN0bG9ja3JlY3Q7Ci0gICAgRFdPUkQgbGFzdGxvY2t0eXBlOwotICAgIEJPT0wgZGNfaW5fdXNlOwotICAgIEJPT0wgbG9ja2VkOwotCi0gICAgSFJFU1VMVCAoKmR1cGxpY2F0ZV9zdXJmYWNlKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzcmMsCi0JCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBkc3QpOwotICAgIHZvaWQgKCpmaW5hbF9yZWxlYXNlKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzKTsKLSAgICBIUkVTVUxUICgqbGF0ZV9hbGxvY2F0ZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyk7Ci0gICAgQk9PTCAoKmF0dGFjaCkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdG8pOwotICAgIEJPT0wgKCpkZXRhY2gpKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMpOwotICAgIHZvaWQgKCpsb2NrX3VwZGF0ZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgTFBDUkVDVCBwUmVjdCwgRFdPUkQgZHdGbGFncyk7Ci0gICAgdm9pZCAoKnVubG9ja191cGRhdGUpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcFJlY3QpOwotICAgIHZvaWQgKCpsb3NlX3N1cmZhY2UpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpOwotICAgIEJPT0wgKCpmbGlwX2RhdGEpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZyb250LAotCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrLAotCQkgICAgICBEV09SRCBkd0ZsYWdzKTsKLSAgICB2b2lkICgqZmxpcF91cGRhdGUpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZyb250LCBEV09SRCBkd0ZsYWdzKTsKLSAgICBIUkVTVUxUICgqZ2V0X2RjKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBIREMqIHBoREMpOwotICAgIEhSRVNVTFQgKCpyZWxlYXNlX2RjKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBIREMgaERDKTsKLSAgICB2b2lkICgqc2V0X3BhbGV0dGUpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCk7Ci0gICAgdm9pZCAoKnVwZGF0ZV9wYWxldHRlKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwsCi0JCQkgICBEV09SRCBkd1N0YXJ0LCBEV09SRCBkd0NvdW50LCBMUFBBTEVUVEVFTlRSWSBwYWxlbnQpOwotICAgIEhXTkQgKCpnZXRfZGlzcGxheV93aW5kb3cpKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMpOwotICAgIEhSRVNVTFQgKCpnZXRfZ2FtbWFfcmFtcCkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywgRFdPUkQgZHdGbGFncywgTFBEREdBTU1BUkFNUCBscEdhbW1hUmFtcCk7Ci0gICAgSFJFU1VMVCAoKnNldF9nYW1tYV9yYW1wKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLCBEV09SRCBkd0ZsYWdzLCBMUERER0FNTUFSQU1QIGxwR2FtbWFSYW1wKTsKLQotICAgIHN0cnVjdCBQcml2YXRlRGF0YSogcHJpdmF0ZV9kYXRhOwotCi0gICAgRFdPUkQgbWF4X2xvZDsKLSAgICBEV09SRCBwcmlvcml0eTsKLQotICAgIEJPT0wgbG9zdDsKLQotICAgIERXT1JEIHVuaXF1ZW5lc3NfdmFsdWU7Ci0KLSAgICBMUFZPSUQgcHJpdmF0ZTsKLQotICAgIC8qIEV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBkb2RneS4gKi8KLSAgICAvKiBGb3IgRGlyZWN0M0QgdXNlICovCi0gICAgTFBWT0lEIGF1eF9jdHgsIGF1eF9kYXRhOwotICAgIHZvaWQgKCphdXhfcmVsZWFzZSkoTFBWT0lEIGN0eCwgTFBWT0lEIGRhdGEpOwotICAgIEJPT0wgKCphdXhfZmxpcCkoTFBWT0lEIGN0eCwgTFBWT0lEIGRhdGEpOwotICAgIHZvaWQgKCphdXhfdW5sb2NrKShMUFZPSUQgY3R4LCBMUFZPSUQgZGF0YSwgTFBSRUNUIGxwUmVjdCk7Ci0gICAgSFJFU1VMVCAoKmF1eF9ibHQpKHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLCBMUFJFQ1QgcmRzdCwgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLCBMUFJFQ1QgcnNyYywgRFdPUkQgZHdGbGFncywgTFBEREJMVEZYIGxwYmx0ZngpOwotICAgIEhSRVNVTFQgKCphdXhfYmx0ZmFzdCkoc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsIERXT1JEIGRzdHgsIERXT1JEIGRzdHksIExQRElSRUNURFJBV1NVUkZBQ0U3IHNyYywgTFBSRUNUIHJzcmMsIERXT1JEIHRyYW5zKTsKLSAgICBIUkVTVUxUICgqYXV4X3NldGNvbG9ya2V5X2NiKShzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdGV4dHVyZSwgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIGNrZXkgKTsKLSAgICAvKiBUaGlzIGlzIHRvIGdldCB0aGUgRDNERGV2aWNlIG9iamVjdCBhc3NvY2lhdGVkIHRvIHRoaXMgc3VyZmFjZSAqLwotICAgIHN0cnVjdCBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2RkZXZpY2U7Ci0gICAgLyogVGhpcyBpcyBmb3IgdGV4dHVyZSAqLwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKm1pcF9tYWluOwotICAgIGludCBtaXBtYXBfbGV2ZWw7Ci0gICAgTFBWT0lEIHRleF9wcml2YXRlOwotICAgIHZvaWQgKCpsb2NrX3VwZGF0ZV9wcmV2KShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHBSZWN0LCBEV09SRCBkd0ZsYWdzKTsKLSAgICB2b2lkICgqdW5sb2NrX3VwZGF0ZV9wcmV2KShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHBSZWN0KTsKLSAgICBCT09MRUFOICgqZ2V0X2RpcnR5X3N0YXR1cykoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgTFBDUkVDVCBwUmVjdCk7CisvKiBIZWxwZXIgc3RydWN0dXJlcyAqLworc3RydWN0IG9iamVjdF9jcmVhdGlvbl9pbmZvCit7CisgICAgY29uc3QgQ0xTSUQgKmNsc2lkOworICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqcHBPYmopOwogfTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNETGlnaHQgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlIC0gV3JhcHMgdG8gRDNENworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBJRGlyZWN0M0RMaWdodEltcGwKK3sKKyAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RMaWdodCk7CisgICAgTE9ORyByZWY7CisKKyAgICAvKiBJRGlyZWN0M0RMaWdodCBmaWVsZHMgKi8KKyAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAgICAgICpkZHJhdzsKKworICAgIC8qIElmIHRoaXMgbGlnaHQgaXMgYWN0aXZlIGZvciBvbmUgdmlld3BvcnQsIHB1dCB0aGUgdmlld3BvcnQgaGVyZSAqLworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAgICAgKmFjdGl2ZV92aWV3cG9ydDsKKworICAgIEQzRExJR0hUMiBsaWdodDsKKyAgICBEM0RMSUdIVDcgbGlnaHQ3OworCisgICAgRFdPUkQgZHdMaWdodEluZGV4OworCisgICAgLyogQ2hhaW5lZCBsaXN0IHVzZWQgZm9yIGFkZGluZyAvIHJlbW92aW5nIGZyb20gdmlld3BvcnRzICovCisgICAgSURpcmVjdDNETGlnaHRJbXBsICAgICAgICAqbmV4dDsKKworICAgIC8qIEFjdGl2YXRpb24gZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICgqYWN0aXZhdGUpKElEaXJlY3QzRExpZ2h0SW1wbCopOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCpkZXNhY3RpdmF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKnVwZGF0ZSkoSURpcmVjdDNETGlnaHRJbXBsKik7Cit9OworCisvKiBWdGFibGUgKi8KK2NvbnN0IElEaXJlY3QzRExpZ2h0VnRibCBJRGlyZWN0M0RMaWdodF9WdGJsOworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCit2b2lkIGxpZ2h0X3VwZGF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwordm9pZCBsaWdodF9hY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOwordm9pZCBsaWdodF9kZXNhY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RNYXRlcmlhbCBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUgLSBXcmFwcyB0byBEM0Q3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IElEaXJlY3QzRE1hdGVyaWFsSW1wbAoreworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRE1hdGVyaWFsMyk7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNETWF0ZXJpYWwyKTsKKyAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0M0RNYXRlcmlhbCk7CisgICAgTE9ORyAgcmVmOworCisgICAgLyogSURpcmVjdDNETWF0ZXJpYWwyIGZpZWxkcyAqLworICAgIElEaXJlY3REcmF3SW1wbCAgICAgICAgICAgICAgICpkZHJhdzsKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAgICAgICAqYWN0aXZlX2RldmljZTsKKworICAgIEQzRE1BVEVSSUFMIG1hdDsKKworICAgIHZvaWQgKCphY3RpdmF0ZSkoSURpcmVjdDNETWF0ZXJpYWxJbXBsKiB0aGlzKTsKK307CisKKy8qIFZUYWJsZXMgaW4gdmFyaW9zIHZlcnNpb25zICovCitjb25zdCBJRGlyZWN0M0RNYXRlcmlhbFZ0YmwgSURpcmVjdDNETWF0ZXJpYWxfVnRibDsKK2NvbnN0IElEaXJlY3QzRE1hdGVyaWFsMlZ0YmwgSURpcmVjdDNETWF0ZXJpYWwyX1Z0Ymw7Citjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDNWdGJsIElEaXJlY3QzRE1hdGVyaWFsM19WdGJsOworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCit2b2lkIG1hdGVyaWFsX2FjdGl2YXRlKElEaXJlY3QzRE1hdGVyaWFsSW1wbCogVGhpcyk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRHJpdmVyIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucy4KLSAqLwotQk9PTCBERFJBV19IQUxfSW5pdChISU5TVEFOQ0UsIERXT1JELCBMUFZPSUQpOwotQk9PTCBERFJBV19Vc2VyX0luaXQoSElOU1RBTkNFLCBEV09SRCwgTFBWT0lEKTsKKyAqIElEaXJlY3QzRFZpZXdwb3J0IC0gV3JhcHMgdG8gRDNENworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IElEaXJlY3QzRFZpZXdwb3J0SW1wbAoreworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZpZXdwb3J0Myk7CisgICAgTE9ORyByZWY7CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjb25zdCBERERFVklDRUlERU5USUZJRVIyKiBpbmZvOwotICAgIGludAlwcmVmZXJlbmNlOwkvKiBob3cgZ29vZCB3ZSBhcmUuIGRnYSBtaWdodCBnZXQgMTAwLCB4bGliIDUwKi8KLSAgICBIUkVTVUxUICgqY3JlYXRlKShjb25zdCBHVUlEKiwgTFBESVJFQ1REUkFXNyosIExQVU5LTk9XTiwgQk9PTCBleCk7CisgICAgLyogSURpcmVjdDNEVmlld3BvcnQgZmllbGRzICovCisgICAgSURpcmVjdERyYXdJbXBsICAgICAgICAgICAqZGRyYXc7CiAKLSAgICAvKiBGb3IgSURpcmVjdERyYXc3OjpJbml0aWFsaXplLiAqLwotICAgIEhSRVNVTFQgKCppbml0KShJRGlyZWN0RHJhd0ltcGwgKiwgY29uc3QgR1VJRCopOwotfSBkZHJhd19kcml2ZXI7CisgICAgLyogSWYgdGhpcyB2aWV3cG9ydCBpcyBhY3RpdmUgZm9yIG9uZSBkZXZpY2UsIHB1dCB0aGUgZGV2aWNlIGhlcmUgKi8KKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsICAgICAgICphY3RpdmVfZGV2aWNlOwogCi12b2lkIEREUkFXX3JlZ2lzdGVyX2RyaXZlcihjb25zdCBkZHJhd19kcml2ZXIqKTsKKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgIG51bV9saWdodHM7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICBtYXBfbGlnaHRzOwogCi1jb25zdCBkZHJhd19kcml2ZXIqIEREUkFXX0ZpbmREcml2ZXIoY29uc3QgR1VJRCogZ3VpZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICB1c2VfdnAyOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYW5kb20gdXRpbGl0aWVzCi0gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgRDNEVklFV1BPUlQgdnAxOworICAgICAgICBEM0RWSUVXUE9SVDIgdnAyOworICAgIH0gdmlld3BvcnRzOwogCi0vKiBHZXQgRERTQ0FQUyBvZiBzdXJmYWNlIChzaG9ydGN1dG1hY3JvKSAqLwotI2RlZmluZSBTRERTQ0FQUyhpZmFjZSkgKChpZmFjZSktPnMuc3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzKQotLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsIGZvciBhIGdpdmVuIHN1cmZhY2UgKi8KLSNkZWZpbmUgUEZHRVRfQlBQKHBmKSAocGYuZHdGbGFncyZERFBGX1BBTEVUVEVJTkRFWEVEOD8xOigocGYudTEuZHdSR0JCaXRDb3VudCs3KS84KSkKLSNkZWZpbmUgR0VUX0JQUChkZXNjKSBQRkdFVF9CUFAoZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQpCisgICAgLyogQWN0aXZhdGlvbiBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKCphY3RpdmF0ZSkoSURpcmVjdDNEVmlld3BvcnRJbXBsKik7CiAKLUxPTkcgRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKERXT1JEIHdpZHRoLCBEV09SRCBicHApOworICAgIC8qIEZpZWxkIHVzZWQgdG8gY2hhaW4gdmlld3BvcnRzIHRvZ2V0aGVyICovCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICAgICAqbmV4dDsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIHNob3J0CWJwcCxkZXB0aDsKLSAgICB1bnNpZ25lZCBpbnQJcm1hc2ssZ21hc2ssYm1hc2s7Ci19IENvbnZlcnRNb2RlOworICAgIC8qIExpZ2h0cyBsaXN0ICovCisgICAgSURpcmVjdDNETGlnaHRJbXBsICAgICAgICAqbGlnaHRzOwogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAoKnBpeGVsX2NvbnZlcnQpKHZvaWQgKnNyYywgdm9pZCAqZHN0LCBEV09SRCB3aWR0aCwgRFdPUkQgaGVpZ2h0LCBMT05HIHBpdGNoLCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlKTsKLSAgICB2b2lkICgqcGFsZXR0ZV9jb252ZXJ0KShMUFBBTEVUVEVFTlRSWSBwYWxlbnQsIHZvaWQgKnNjcmVlbl9wYWxldHRlLCBEV09SRCBzdGFydCwgRFdPUkQgY291bnQpOwotfSBDb252ZXJ0RnVuY3M7CisgICAgLyogQmFja2dyb3VuZCBtYXRlcmlhbCAqLworICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAgICAgKmJhY2tncm91bmQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQ29udmVydE1vZGUgc2NyZWVuLCBkZXN0OwotICAgIENvbnZlcnRGdW5jcyBmdW5jczsKLX0gQ29udmVydDsKKy8qIFZ0YWJsZSAqLworY29uc3QgSURpcmVjdDNEVmlld3BvcnQzVnRibCBJRGlyZWN0M0RWaWV3cG9ydDNfVnRibDsKIAotZXh0ZXJuIENvbnZlcnQgTW9kZUVtdWxhdGlvbnNbOF07Ci1leHRlcm4gaW50IF9jb21tb25fZGVwdGhfdG9fcGl4ZWxmb3JtYXQoRFdPUkQgZGVwdGgsTFBESVJFQ1REUkFXIGRkcmF3KTsKLWV4dGVybiBCT09MIG9wZW5nbF9pbml0aWFsaXplZDsKLWV4dGVybiBCT09MIHMzdGNfaW5pdGlhbGl6ZWQ7CisvKiBIZWxwZXIgZnVuY3Rpb25zICovCit2b2lkIHZpZXdwb3J0X2FjdGl2YXRlKElEaXJlY3QzRFZpZXdwb3J0SW1wbCogVGhpcyk7CiAKLXR5cGVkZWYgdm9pZCAoKkZVTkNfRkVUQ0hfMkRfVEVYRUxfUkdCQV9EWFQxKShpbnQgc3JjUm93U3RyaWRlLCBjb25zdCBCWVRFICpwaXhkYXRhLCBpbnQgaSwgaW50IGosIHZvaWQgKnRleGVsKTsKLXR5cGVkZWYgdm9pZCAoKkZVTkNfRkVUQ0hfMkRfVEVYRUxfUkdCQV9EWFQzKShpbnQgc3JjUm93U3RyaWRlLCBjb25zdCBCWVRFICpwaXhkYXRhLCBpbnQgaSwgaW50IGosIHZvaWQgKnRleGVsKTsKLXR5cGVkZWYgdm9pZCAoKkZVTkNfRkVUQ0hfMkRfVEVYRUxfUkdCQV9EWFQ1KShpbnQgc3JjUm93U3RyaWRlLCBjb25zdCBCWVRFICpwaXhkYXRhLCBpbnQgaSwgaW50IGosIHZvaWQgKnRleGVsKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAtIFdyYXBzIHRvIEQzRDcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbAoreworICAgIC8qIElVbmtub3duICovCisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcik7CisgICAgTE9ORyAgICAgICAgICAgICAgICAgcmVmOwogCi1leHRlcm4gRlVOQ19GRVRDSF8yRF9URVhFTF9SR0JBX0RYVDEgZmV0Y2hfMmRfdGV4ZWxfcmdiYV9keHQxOwotZXh0ZXJuIEZVTkNfRkVUQ0hfMkRfVEVYRUxfUkdCQV9EWFQzIGZldGNoXzJkX3RleGVsX3JnYmFfZHh0MzsKLWV4dGVybiBGVU5DX0ZFVENIXzJEX1RFWEVMX1JHQkFfRFhUNSBmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDU7CisgICAgLyogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBmaWVsZHMgKi8KKyAgICBJRGlyZWN0RHJhd0ltcGwgICAgICAqZGRyYXc7CisgICAgSURpcmVjdDNERGV2aWNlSW1wbCAgKmQzZGRldjsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RydWN0dXJlIGNvbnZlcnNpb24gKGZvciB0aHVua3MpCi0gKi8KLXZvaWQgRERSQVdfQ29udmVydF9ERFNDQVBTXzFfVG9fMihjb25zdCBERFNDQVBTKiBwSW4sIEREU0NBUFMyKiBwT3V0KTsKLXZvaWQgRERSQVdfQ29udmVydF9ERERFVklDRUlERU5USUZJRVJfMl9Ub18xKGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIqIHBJbiwKLQkJCQkJICAgICBERERFVklDRUlERU5USUZJRVIqIHBPdXQpOworICAgIEQzREVYRUNVVEVCVUZGRVJERVNDIGRlc2M7CisgICAgRDNERVhFQ1VURURBVEEgICAgICAgZGF0YTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVidWdnaW5nIC8gRmxhZ3Mgb3V0cHV0IGZ1bmN0aW9ucwotICovCi1leHRlcm4gdm9pZCBERFJBV19kdW1wX0REQkxURlgoRFdPUkQgZmxhZ21hc2spOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9EREJMVEZBU1QoRFdPUkQgZmxhZ21hc2spOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9EREJMVChEV09SRCBmbGFnbWFzayk7Ci1leHRlcm4gdm9pZCBERFJBV19kdW1wX0REU0NBUFMoY29uc3QgRERTQ0FQUyAqaW4pOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9ERFNDQVBTMihjb25zdCBERFNDQVBTMiAqaW4pOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9waXhlbGZvcm1hdF9mbGFnKERXT1JEIGZsYWdtYXNrKTsKLWV4dGVybiB2b2lkIEREUkFXX2R1bXBfcGFsZXR0ZWZvcm1hdChEV09SRCBkd0ZsYWdzKTsKLWV4dGVybiB2b2lkIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQoY29uc3QgRERQSVhFTEZPUk1BVCAqaW4pOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9jb2xvcmtleWZsYWcoRFdPUkQgY2spOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoY29uc3QgRERTVVJGQUNFREVTQzIgKmxwZGRzZCk7Ci1leHRlcm4gdm9pZCBERFJBV19kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoRFdPUkQgY29vcGxldmVsKTsKLWV4dGVybiB2b2lkIEREUkFXX2R1bXBfbG9ja2ZsYWcoRFdPUkQgbG9ja2ZsYWcpOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9ERENPTE9SS0VZKGNvbnN0IEREQ09MT1JLRVkgKmluKTsKLWV4dGVybiB2b2lkIEREUkFXX2R1bXBfRERDQVBTKGNvbnN0IEREQ0FQUyAqbHBjYXBzKTsKLWV4dGVybiB2b2lkIEREUkFXX2R1bXBfRERFTlVNU1VSRkFDRVMoRFdPUkQgZmxhZ21hc2spOwotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX3RvX2Rpc2soSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZmFjZSwgRklMRSAqZiwgaW50IHNjYWxlKSA7CisgICAgLyogVGhpcyBidWZmZXIgd2lsbCBzdG9yZSB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAqdmVydGV4X2RhdGE7CisgICAgV09SRCAgICAgICAgICAgICAgICAgKmluZGljZXM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgbmJfaW5kaWNlczsKKworICAgIC8qIFRoaXMgZmxhZ3MgaXMgc2V0IHRvIFRSVUUgaWYgd2UgYWxsb2NhdGVkIG91cnNlbHZlcyB0aGUKKyAgICAgKiBkYXRhIGJ1ZmZlcgorICAgICAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgIG5lZWRfZnJlZTsKK307CisKKy8qIFRoZSBWVGFibGUgKi8KK2NvbnN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJWdGJsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJfVnRibDsKKworLyogVGhlIGV4ZWN1dGUgZnVuY3Rpb24gKi8KK3ZvaWQKK0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0V4ZWN1dGUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKlRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZUltcGwgKkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpWaWV3cG9ydEltcGwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwKK3sKKyAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3QzRFZlcnRleEJ1ZmZlcik7CisgICAgTE9ORyAgICAgICAgICAgICAgICAgcmVmOworCisgICAgLyoqKiBXaW5lRDNEIGxpbmsgKioqLworICAgIElXaW5lRDNEVmVydGV4QnVmZmVyICp3aW5lRDNEVmVydGV4QnVmZmVyOworCisgICAgLyoqKiBTdG9yYWdlIGZvciBEM0Q3IHNwZWNpZmljIHRoaW5ncyAqKiovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgQ2FwczsKK307CisKKy8qIFRoZSBWdGFibGVzICovCitjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3VnRibCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Z0Ymw7Citjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJWdGJsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjFfVnRibDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZyb20gdXRpbHMuYworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUpIFwKKyAgICAoKChkM2R2dFZlcnRleFR5cGUpICYgRDNERlZGX1RFWENPVU5UX01BU0spID4+IEQzREZWRl9URVhDT1VOVF9TSElGVCkKKworI2RlZmluZSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIHRleF9udW0pIFwKKyAgICAoKCgoKGQzZHZ0VmVydGV4VHlwZSkgPj4gKDE2ICsgKDIgKiAodGV4X251bSkpKSkgKyAxKSAmIDB4MDMpICsgMSkKKwordm9pZCBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERChERFBJWEVMRk9STUFUICpERFBpeGVsRm9ybWF0LCBXSU5FRDNERk9STUFUIFdpbmVEM0RGb3JtYXQpOworV0lORUQzREZPUk1BVCBQaXhlbEZvcm1hdF9ERDJXaW5lRDNEKEREUElYRUxGT1JNQVQgKkREUGl4ZWxGb3JtYXQpOwordm9pZCBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhjb25zdCBERFNVUkZBQ0VERVNDMiAqbHBkZHNkKTsKK3ZvaWQgRERSQVdfZHVtcF9waXhlbGZvcm1hdChjb25zdCBERFBJWEVMRk9STUFUICpQaXhlbEZvcm1hdCk7Cit2b2lkIGR1bXBfRDNETUFUUklYKEQzRE1BVFJJWCAqbWF0KTsKK3ZvaWQgRERSQVdfZHVtcF9ERENBUFMoY29uc3QgRERDQVBTICpscGNhcHMpOworRFdPUkQgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERXT1JEIGQzZHZ0VmVydGV4VHlwZSk7Cit2b2lkIEREUkFXX2R1bXBfRERTQ0FQUzIoY29uc3QgRERTQ0FQUzIgKmluKTsKK3ZvaWQgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKERXT1JEIGNvb3BsZXZlbCk7CisKKy8qIFRoaXMgb25seSBuZWVkcyB0byBiZSBoZXJlIGFzIGxvbmcgdGhlIHByb2Nlc3N2ZXJ0aWNlcyBmdW5jdGlvbmFsaXR5IG9mCisgKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGlzbid0IGluIFdpbmVEM0QgKi8KK3ZvaWQgbXVsdGlwbHlfbWF0cml4KExQRDNETUFUUklYIGRlc3QsIExQRDNETUFUUklYIHNyYzEsIExQRDNETUFUUklYIHNyYzIpOwogCiAvKiBVc2VkIGZvciBnZW5lcmljIGR1bXBpbmcgKi8KIHR5cGVkZWYgc3RydWN0CkBAIC00MzgsNzAxICs1OTcsMjYgQEAKICAgICBwdHJkaWZmX3Qgb2Zmc2V0OwogfSBtZW1iZXJfaW5mbzsKIAorLyogU3RydWN0dXJlIGNvcHkgKi8KICNkZWZpbmUgRERSQVdfZHVtcF9mbGFncyhmbGFncyxuYW1lcyxudW1fbmFtZXMpIEREUkFXX2R1bXBfZmxhZ3NfKGZsYWdzLCBuYW1lcywgbnVtX25hbWVzLCAxKQogI2RlZmluZSBNRSh4LGYsZSkgeyB4LCAjeCwgKHZvaWQgKCopKGNvbnN0IHZvaWQgKikpKGYpLCBvZmZzZXRvZihTVFJVQ1QsIGUpIH0KIAotZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9mbGFnc18oRFdPUkQgZmxhZ3MsIGNvbnN0IGZsYWdfaW5mbyogbmFtZXMsIHNpemVfdCBudW1fbmFtZXMsIGludCBuZXdsaW5lKTsKLWV4dGVybiB2b2lkIEREUkFXX2R1bXBfbWVtYmVycyhEV09SRCBmbGFncywgY29uc3Qgdm9pZCogZGF0YSwgY29uc3QgbWVtYmVyX2luZm8qIG1lbXMsIHNpemVfdCBudW1fbWVtcyk7CisjZGVmaW5lIEREX1NUUlVDVF9DT1BZX0JZU0laRSh0byxmcm9tKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIERXT1JEIF9fc2l6ZSA9ICh0byktPmR3U2l6ZTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRFdPUkQgX19jb3B5c2l6ZSA9IF9fc2l6ZTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBEV09SRCBfX3Jlc2V0c2l6ZSA9IF9fc2l6ZTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFzc2VydCh0byAhPSBmcm9tKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKF9fcmVzZXRzaXplID4gc2l6ZW9mKCp0bykpICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX19yZXNldHNpemUgPSBzaXplb2YoKnRvKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1lbXNldCh0bywwLF9fcmVzZXRzaXplKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKChmcm9tKS0+ZHdTaXplIDwgX19zaXplKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX19jb3B5c2l6ZSA9IChmcm9tKS0+ZHdTaXplOyAgICAgICAgXAorICAgICAgICAgICAgICAgIG1lbWNweSh0byxmcm9tLF9fY29weXNpemUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHRvKS0+ZHdTaXplID0gX19zaXplOy8qcmVzdG9yZSBzaXplKi8gIFwKKyAgICAgICAgfSB3aGlsZSAoMCkKIAotdm9pZCBEaXJlY3REcmF3U3VyZmFjZV9SZWdpc3RlckNsYXNzKHZvaWQpOwotdm9pZCBEaXJlY3REcmF3U3VyZmFjZV9VbnJlZ2lzdGVyQ2xhc3Modm9pZCk7CiAKLWV4dGVybiBjb25zdCBJRGlyZWN0RHJhd1N1cmZhY2UzVnRibCBERFJBV19JRERTM19UaHVua19WVGFibGU7CisjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0RHJhd0NsaXBwZXIgZGVjbGFyYXRpb25zCi0gKi8KLUhSRVNVTFQgRERSQVdfQ3JlYXRlQ2xpcHBlcihJVW5rbm93biogcFVua091dGVyLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcE9iaik7Ci12b2lkIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfRm9yY2VEZXN0cm95KElEaXJlY3REcmF3Q2xpcHBlckltcGwqIFRoaXMpOwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9TZXRId25kKExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCi0JCQkgICAgICAgSFdORCBoV25kKTsKLVVMT05HIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UoTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9HZXRDbGlwTGlzdChMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBMUFJFQ1QgbHBSZWN0LAotCQkJCSAgIExQUkdOREFUQSBscENsaXBMaXN0LCBMUERXT1JEIGxwZHdTaXplKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdDbGlwcGVyX1NldENsaXBMaXN0KExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsTFBSR05EQVRBIGxwcmduLAotCQkJCSAgIERXT1JEIGR3RmxhZyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBSRUZJSUQgcmlpZCwKLQkJCQkgICAgICBMUFZPSUQqIHBwdk9iaik7Ci1VTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9BZGRSZWYoIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UgKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdDbGlwcGVyX0dldEhXbmQoTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgSFdORCogaFduZFB0cik7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9Jbml0aWFsaXplKExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIExQRElSRUNURFJBVyBscERELAotCQkJCSAgRFdPUkQgZHdGbGFncyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9Jc0NsaXBMaXN0Q2hhbmdlZChMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLAotCQkJCQkgQk9PTCogbHBiQ2hhbmdlZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdERyYXdQYWxldHRlIE1BSU4gZGVjbGFyYXRpb25zCi0gKi8KLUhSRVNVTFQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcywKLQkJCQkJIElEaXJlY3REcmF3SW1wbCogcERELCBEV09SRCBkd0ZsYWdzKTsKLXZvaWQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIFRoaXMpOwotCi1IUkVTVUxUIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQ3JlYXRlKElEaXJlY3REcmF3SW1wbCogcERELCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgICAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSwKLQkJCQkgICAgICBMUFVOS05PV04gcFVua091dGVyKTsKLXZvaWQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Gb3JjZURlc3Ryb3koSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcyk7Ci0KLURXT1JEIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfU2l6ZShEV09SRCBkd0ZsYWdzKTsKLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcyhMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkgIExQUEFMRVRURUVOVFJZIHBhbGVudCk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCi0JCQkJICBEV09SRCBkd1N0YXJ0LCBEV09SRCBkd0NvdW50LAotCQkJCSAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KTsKLVVMT05HIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UpOwotVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLAotCQkJCSAgTFBESVJFQ1REUkFXIGRkcmF3LCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdQYWxldHRlX0dldENhcHMoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSwgTFBEV09SRCBscGR3Q2Fwcyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLAotCQkJCSAgICAgIFJFRklJRCByZWZpaWQsIExQVk9JRCAqb2JqKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0RHJhd1BhbGV0dGUgSEFMIGRlY2xhcmF0aW9ucwotICovCi1IUkVTVUxUIEhBTF9EaXJlY3REcmF3UGFsZXR0ZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcywKLQkJCQkJIElEaXJlY3REcmF3SW1wbCogcERELCBEV09SRCBkd0ZsYWdzKTsKLXZvaWQgSEFMX0RpcmVjdERyYXdQYWxldHRlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcyk7Ci0KLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdQYWxldHRlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwqIHBERCwgRFdPUkQgZHdGbGFncywKLQkJCQkgICAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSwKLQkJCQkgICAgIExQVU5LTk9XTiBwVW5rT3V0ZXIpOwotCi1IUkVTVUxUIFdJTkFQSQotSEFMX0RpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSwgRFdPUkQgZHdGbGFncywKLQkJCQkgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkgTFBQQUxFVFRFRU5UUlkgcGFsZW50KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0RHJhdyBNQUlOIGRlY2xhcmF0aW9ucwotICovCi0vKiBpbnRlcm5hbCB2aXJ0dWFsIGZ1bmN0aW9ucyAqLwotdm9pZCBNYWluX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMpOwotSFJFU1VMVCBNYWluX2NyZWF0ZV9vZmZzY3JlZW4oSURpcmVjdERyYXdJbXBsKiBUaGlzLCBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QsCi0JCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLCBMUFVOS05PV04gcE91dGVyKTsKLUhSRVNVTFQgTWFpbl9jcmVhdGVfdGV4dHVyZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKLQkJCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLCBMUFVOS05PV04gcE91dGVyLAotCQkJICAgIERXT1JEIGR3TWlwTWFwTGV2ZWwpOwotSFJFU1VMVCBNYWluX2NyZWF0ZV96YnVmZmVyKElEaXJlY3REcmF3SW1wbCogVGhpcywgY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNELAotCQkJICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsIExQVU5LTk9XTiBwT3V0ZXIpOwotCi0vKiBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KLUhSRVNVTFQgTWFpbl9EaXJlY3REcmF3X0NvbnN0cnVjdChJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIEJPT0wgZXgpOwotdm9pZCBNYWluX0RpcmVjdERyYXdfQWRkU3VyZmFjZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkJSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZmFjZSk7Ci12b2lkIE1haW5fRGlyZWN0RHJhd19SZW1vdmVTdXJmYWNlKElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCQkgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmYWNlKTsKLXZvaWQgTWFpbl9EaXJlY3REcmF3X0FkZENsaXBwZXIoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCUlEaXJlY3REcmF3Q2xpcHBlckltcGwqIGNsaXBwZXIpOwotdm9pZCBNYWluX0RpcmVjdERyYXdfUmVtb3ZlQ2xpcHBlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkJICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcik7Ci12b2lkIE1haW5fRGlyZWN0RHJhd19BZGRQYWxldHRlKElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCQlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlKTsKLXZvaWQgTWFpbl9EaXJlY3REcmF3X1JlbW92ZVBhbGV0dGUoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGUpOwotCi0vKiBpbnRlcmZhY2UgZnVuY3Rpb25zICovCi1VTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X0FkZFJlZihMUERJUkVDVERSQVc3IGlmYWNlKTsKLVVMT05HIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfUmVsZWFzZShMUERJUkVDVERSQVc3IGlmYWNlKTsKLUhSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlLAotCQkJCQkgICAgICBSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqKTsKLUhSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19Db21wYWN0KExQRElSRUNURFJBVzcgaWZhY2UpOwotSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X0NyZWF0ZUNsaXBwZXIoTFBESVJFQ1REUkFXNyBpZmFjZSwKLQkJCQkJICAgICBEV09SRCBkd0ZsYWdzLAotCQkJCQkgICAgIExQRElSRUNURFJBV0NMSVBQRVIgKnBwQ2xpcHBlciwKLQkJCQkJICAgICBJVW5rbm93biAqcFVua091dGVyKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJICAgICAgTFBQQUxFVFRFRU5UUlkgcGFsZW50LAotCQkJICAgICAgTFBESVJFQ1REUkFXUEFMRVRURSogcHBQYWxldHRlLAotCQkJICAgICAgTFBVTktOT1dOIHBVbmtub3duKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlLCBMUEREU1VSRkFDRURFU0MyIHBERFNELAotCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgKnBwU3VyZiwKLQkJCSAgICAgIElVbmtub3duICpwVW5rT3V0ZXIpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlKExQRElSRUNURFJBVzcgaWZhY2UsIExQRElSRUNURFJBV1NVUkZBQ0U3IHNyYywKLQkJCQkgTFBESVJFQ1REUkFXU1VSRkFDRTcqIGRzdCk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0VudW1TdXJmYWNlcyhMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJICAgICBMUEREU1VSRkFDRURFU0MyIGxwRERTRDIsIExQVk9JRCBjb250ZXh0LAotCQkJICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNhbGxiYWNrKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfRXZhbHVhdGVNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsRFdPUkQgYSxEV09SRCogYik7Ci1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfRmxpcFRvR0RJU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0Q2FwcyhMUERJUkVDVERSQVc3IGlmYWNlLCBMUEREQ0FQUyBwRHJpdmVyQ2FwcywKLQkJCUxQRERDQVBTIHBIRUxDYXBzKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0Rm91ckNDQ29kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBEV09SRCBwTnVtQ29kZXMsCi0JCQkgICAgICAgTFBEV09SRCBwQ29kZXMpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19HZXRHRElTdXJmYWNlKExQRElSRUNURFJBVzcgaWZhY2UsCi0JCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqbHBscEdESUREU1N1cmZhY2UpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19HZXRNb25pdG9yRnJlcXVlbmN5KExQRElSRUNURFJBVzcgaWZhY2UsTFBEV09SRCBmcmVxKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0U2NhbkxpbmUoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBEV09SRCBscGR3U2NhbkxpbmUpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19HZXRTdXJmYWNlRnJvbURDKExQRElSRUNURFJBVzcgaWZhY2UsIEhEQyBoZGMsCi0JCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3ICpscEREUyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBCT09MIHN0YXR1cyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X0luaXRpYWxpemUoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBHVUlEIGxwR3VpZCk7Ci1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfUmVzdG9yZUFsbFN1cmZhY2VzKExQRElSRUNURFJBVzcgaWZhY2UpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzcgaWZhY2UsIEhXTkQgaHduZCwKLQkJCQkgICAgRFdPUkQgY29vcGxldmVsKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdXaWR0aCwKLQkJCSAgICAgICBEV09SRCBkd0hlaWdodCwgTE9ORyBsUGl0Y2gsCi0JCQkgICAgICAgRFdPUkQgZHdSZWZyZXNoUmF0ZSwgRFdPUkQgZHdGbGFncywKLQkJCSAgICAgICBjb25zdCBERFBJWEVMRk9STUFUKiBwaXhlbGZvcm1hdCk7Ci1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuayhMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgICAgSEFORExFIGgpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBMUEREU1VSRkFDRURFU0MyIHBERFNEKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdfR2V0QXZhaWxhYmxlVmlkTWVtKExQRElSRUNURFJBVzcgaWZhY2UsTFBERFNDQVBTMiBkZHNjYXBzLAotCQkJCSAgIExQRFdPUkQgdG90YWwsIExQRFdPUkQgZnJlZSk7Ci1IUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfVGVzdENvb3BlcmF0aXZlTGV2ZWwoTFBESVJFQ1REUkFXNyBpZmFjZSk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBTSVpFIHBNb2RlcywKLQkJCSAgICAgIERXT1JEIGR3TnVtTW9kZXMsIERXT1JEIGR3RmxhZ3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3REcmF3IFVTRVIgb2JqZWN0IGRlY2xhcmF0aW9ucwotICovCi0jZGVmaW5lIFVTRVJfRERSQVdfUFJJVihkZHJhdykgKChVc2VyX0RpcmVjdERyYXdJbXBsKikoKGRkcmF3KS0+cHJpdmF0ZSkpCi0jZGVmaW5lIFVTRVJfRERSQVdfUFJJVl9WQVIobmFtZSxkZHJhdykgXAotCVVzZXJfRGlyZWN0RHJhd0ltcGwqIG5hbWUgPSBVU0VSX0REUkFXX1BSSVYoZGRyYXcpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IGVtcHR5OwotICAgIC8qIGVtcHR5ICovCi19IFVzZXJfRGlyZWN0RHJhd0ltcGxfUGFydDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBVc2VyX0RpcmVjdERyYXdJbXBsX1BhcnQgdXNlcjsKLX0gVXNlcl9EaXJlY3REcmF3SW1wbDsKLQotdm9pZCBVc2VyX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMpOwotSFJFU1VMVCBVc2VyX0RpcmVjdERyYXdfY3JlYXRlX3ByaW1hcnkoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCSAgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCi0JCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCi0JCQkJICAgICAgIExQVU5LTk9XTiBwT3V0ZXIpOwotSFJFU1VMVCBVc2VyX0RpcmVjdERyYXdfY3JlYXRlX2JhY2tidWZmZXIoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCQkgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJCQkJICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAotCQkJCQkgIExQVU5LTk9XTiBwT3V0ZXIsCi0JCQkJCSAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpbWFyeSk7Ci1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KTsKLUhSRVNVTFQgVXNlcl9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiBwR1VJRCwgTFBESVJFQ1REUkFXNyogcElmYWNlLAotCQkJICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpOwotCi1IUkVTVUxUIFdJTkFQSQotVXNlcl9EaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKLQkJCQkgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgTFBWT0lEIGNvbnRleHQsCi0JCQkJIExQRERFTlVNTU9ERVNDQUxMQkFDSzIgY2FsbGJhY2spOwotSFJFU1VMVCBXSU5BUEkKLVVzZXJfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyKExQRElSRUNURFJBVzcgaWZhY2UsCi0JCQkJICAgIExQRERERVZJQ0VJREVOVElGSUVSMiBwRERESSwKLQkJCQkgICAgRFdPUkQgZHdGbGFncyk7Ci1IUkVTVUxUIFdJTkFQSQotVXNlcl9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCi0JCQkgICAgICAgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAotCQkJICAgICAgIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3REcmF3IEhBTCBkZWNsYXJhdGlvbnMKLSAqLwotI2RlZmluZSBIQUxfRERSQVdfUFJJVihkZHJhdykgXAotCSgoSEFMX0RpcmVjdERyYXdJbXBsKikoKGRkcmF3KS0+cHJpdmF0ZSkpCi0jZGVmaW5lIEhBTF9ERFJBV19QUklWX1ZBUihuYW1lLGRkcmF3KSBcCi0JSEFMX0RpcmVjdERyYXdJbXBsKiBuYW1lID0gSEFMX0REUkFXX1BSSVYoZGRyYXcpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgRFdPUkQgbmV4dF92b2ZzOwotfSBIQUxfRGlyZWN0RHJhd0ltcGxfUGFydDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBVc2VyX0RpcmVjdERyYXdJbXBsX1BhcnQgdXNlcjsKLSAgICBIQUxfRGlyZWN0RHJhd0ltcGxfUGFydCBoYWw7Ci19IEhBTF9EaXJlY3REcmF3SW1wbDsKLQotdm9pZCBIQUxfRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3SW1wbCogVGhpcyk7Ci1IUkVTVUxUIEhBTF9EaXJlY3REcmF3X2NyZWF0ZV9wcmltYXJ5KElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCQkgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCi0JCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKLQkJCQkgICAgICBMUFVOS05PV04gcE91dGVyKTsKLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdfY3JlYXRlX2JhY2tidWZmZXIoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCQkgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkJCQkgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKLQkJCQkJIExQVU5LTk9XTiBwT3V0ZXIsCi0JCQkJCSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcmltYXJ5KTsKLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdfY3JlYXRlX3RleHR1cmUoSURpcmVjdERyYXdJbXBsKiBUaGlzLAotCQkJCSAgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAotCQkJCSAgICAgIExQVU5LTk9XTiBwT3V0ZXIsCi0JCQkJICAgICAgRFdPUkQgZHdNaXBNYXBMZXZlbCk7Ci0KLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdfQ29uc3RydWN0KElEaXJlY3REcmF3SW1wbCAqVGhpcywgQk9PTCBleCk7Ci1IUkVTVUxUIEhBTF9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiBwR1VJRCwgTFBESVJFQ1REUkFXNyogcElmYWNlLAotCQkJCSAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpOwotCi1IUkVTVUxUIFdJTkFQSQotSEFMX0RpcmVjdERyYXdfR2V0RGV2aWNlSWRlbnRpZmllcihMUERJUkVDVERSQVc3IGlmYWNlLAotCQkJCQlMUEREREVWSUNFSURFTlRJRklFUjIgcEREREksCi0JCQkJCURXT1JEIGR3RmxhZ3MpOwotSFJFU1VMVCBXSU5BUEkKLUhBTF9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCi0JCQkJICAgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAotCQkJCSAgIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MpOwotSFJFU1VMVCBXSU5BUEkgSEFMX0RpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElEaXJlY3REcmF3U3VyZmFjZSBNQUlOIGRlY2xhcmF0aW9ucwotICovCi0vKiBTdXBwb3J0IGZvciBJRGlyZWN0RHJhd1N1cmZhY2U3OjpTZXQvR2V0L0ZyZWVQcml2YXRlRGF0YS4gSSBkb24ndCB0aGluawotICogYW55Ym9keSB1c2VzIGl0IGZvciBtdWNoIHNvIGEgZ29vZCBpbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC4gKi8KLXR5cGVkZWYgc3RydWN0IFByaXZhdGVEYXRhCi17Ci0gICAgc3RydWN0IFByaXZhdGVEYXRhKiBuZXh0OwotICAgIHN0cnVjdCBQcml2YXRlRGF0YSogcHJldjsKLQotICAgIEdVSUQgdGFnOwotICAgIERXT1JEIGZsYWdzOyAvKiBERFNQRF8qICovCi0gICAgRFdPUkQgdW5pcXVlbmVzc192YWx1ZTsKLQotICAgIHVuaW9uCi0gICAgewotCUxQVk9JRCBkYXRhOwotCUxQVU5LTk9XTiBvYmplY3Q7Ci0gICAgfSBwdHI7Ci0KLSAgICBEV09SRCBzaXplOwotfSBQcml2YXRlRGF0YTsKLQotZXh0ZXJuIGNvbnN0IElEaXJlY3REcmF3R2FtbWFDb250cm9sVnRibCBERFJBV19JRERHQ19WVGFibGU7Ci0KLS8qIE5vbi1pbnRlcmZhY2UgZnVuY3Rpb25zICovCi1IUkVTVUxUIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSBJRGlyZWN0RHJhd0ltcGwqIHBERCwKLQkJCQkJIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCk7Ci12b2lkIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRm9yY2VEZXN0cm95KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpOwotCi12b2lkIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKLUhSRVNVTFQgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9sYXRlX2FsbG9jYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpOwotQk9PTCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2F0dGFjaChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLAotCQkJCSAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRvKTsKLUJPT0wgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9kZXRhY2goSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyk7Ci12b2lkIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfbG9ja191cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJTFBDUkVDVCBwUmVjdCwgRFdPUkQgZHdGbGFncyk7Ci12b2lkIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfdW5sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkgIExQQ1JFQ1QgcFJlY3QpOwotdm9pZCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2xvc2Vfc3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKLXZvaWQgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwpOwotdm9pZCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKLQkJCQkJICAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCSAgICAgICAgICAgICAgICAgICBMUFBBTEVUVEVFTlRSWSBwYWxlbnQpOwotSFdORCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKLQotSFJFU1VMVCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2dldF9nYW1tYV9yYW1wKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MsCi0JCQkJCSAgICAgIExQRERHQU1NQVJBTVAgbHBHYW1tYVJhbXApOwotSFJFU1VMVCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX3NldF9nYW1tYV9yYW1wKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MsCi0JCQkJCSAgICAgIExQRERHQU1NQVJBTVAgbHBHYW1tYVJhbXApOwotCi1CT09MIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF9kYXRhKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZyb250LAotCQkJCSAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2ssCi0JCQkJICAgICAgRFdPUkQgZHdGbGFncyk7Ci0KLSNkZWZpbmUgQ0hFQ0tfTE9TVChUaGlzKQkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQlpZiAoVGhpcy0+bG9zdCkgcmV0dXJuIERERVJSX1NVUkZBQ0VMT1NUOwlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDSEVDS19URVhUVVJFKFRoaXMpCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCWlmICghKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIJXAotCQkgICAgICAmIEREU0NBUFMyX1RFWFRVUkVNQU5BR0UpKQkJXAotCQkJcmV0dXJuIERERVJSX0lOVkFMSURPQkpFQ1Q7CQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBMT0NLX09CSkVDVChUaGlzKSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFVOTE9DS19PQkpFQ1QoVGhpcykgZG8geyB9IHdoaWxlICgwKQotCi0vKiBJRGlyZWN0RHJhd1N1cmZhY2U3IChwYXJ0aWFsKSBpbXBsZW1lbnRhdGlvbiAqLwotVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKTsKLVVMT05HIFdJTkFQSSBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIFJFRklJRCByaWlkLAotCQkJCSAgICAgIExQVk9JRCogcHBPYmopOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBBdHRhY2gpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgTFBSRUNUIHBSZWN0KTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0JsdEJhdGNoKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCUxQRERCTFRCQVRDSCBwQmF0Y2gsIERXT1JEIGR3Q291bnQsCi0JCQkJRFdPUkQgZHdGbGFncyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9DaGFuZ2VVbmlxdWVuZXNzVmFsdWUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCQkgICAgIERXT1JEIGR3RmxhZ3MsCi0JCQkJCSAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcEF0dGFjaCk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtQXR0YWNoZWRTdXJmYWNlcyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgIExQVk9JRCBjb250ZXh0LAotCQkJCQkgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYik7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtT3ZlcmxheVpPcmRlcnMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJCSAgRFdPUkQgZHdGbGFncywgTFBWT0lEIGNvbnRleHQsCi0JCQkJCSAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYik7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GbGlwKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IG92ZXJyaWRlLCBEV09SRCBkd0ZsYWdzKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZyZWVQcml2YXRlRGF0YShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICAgICAgUkVGR1VJRCB0YWcpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCQkgIExQRERTQ0FQUzIgcENhcHMsCi0JCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZmFjZSk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRCbHRTdGF0dXMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgIERXT1JEIGR3RmxhZ3MpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCSAgICAgICBMUEREU0NBUFMyIHBDYXBzKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENsaXBwZXIoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICBMUERJUkVDVERSQVdDTElQUEVSKiBwcENsaXBwZXIpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q29sb3JLZXkoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIHBDS2V5KTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBIREMgKnBoREMpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RERJbnRlcmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgICAgTFBWT0lEKiBwREQpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RmxpcFN0YXR1cyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICAgIERXT1JEIGR3RmxhZ3MpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0TE9EKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJICAgICAgTFBEV09SRCBwZHdNYXhMT0QpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0T3ZlcmxheVBvc2l0aW9uKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCQkgIExQTE9ORyBwWCwgTFBMT05HIHBZKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBhbGV0dGUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICBMUERJUkVDVERSQVdQQUxFVFRFKiBwcFBhbGV0dGUpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGl4ZWxGb3JtYXQoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgICAgTFBERFBJWEVMRk9STUFUIHBERFBpeGVsRm9ybWF0KTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaW9yaXR5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCSAgIExQRFdPUkQgcGR3UHJpb3JpdHkpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpdmF0ZURhdGEoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIFJFRkdVSUQgdGFnLAotCQkJCSAgICAgIExQVk9JRCBwQnVmZmVyLCBMUERXT1JEIHBjYkJ1ZmZlclNpemUpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgICAgTFBERFNVUkZBQ0VERVNDMiBwRERTRCk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRVbmlxdWVuZXNzVmFsdWUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJCSAgTFBEV09SRCBwVmFsdWUpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgIExQRElSRUNURFJBVyBwREQsIExQRERTVVJGQUNFREVTQzIgcEREU0QpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSXNMb3N0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKTsKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0xvY2soTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQUkVDVCBwcmVjdCwKLQkJCSAgICBMUEREU1VSRkFDRURFU0MyIHBERFNELCBEV09SRCBmbGFncywgSEFORExFIGgpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZUxvY2soTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIERXT1JEIGR3RmxhZ3MpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZVVubG9jayhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdGbGFncyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlREMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIEhEQyBoREMpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q2xpcHBlcihMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgIExQRElSRUNURFJBV0NMSVBQRVIgcEREQ2xpcHBlcik7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDb2xvcktleShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICBEV09SRCBkd0ZsYWdzLCBMUEREQ09MT1JLRVkgcENLZXkpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0TE9EKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkd01heExPRCk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRPdmVybGF5UG9zaXRpb24oTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJCSAgTE9ORyBYLCBMT05HIFkpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgIExQRElSRUNURFJBV1BBTEVUVEUgcFBhbGV0dGUpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpb3JpdHkoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgRFdPUkQgZHdQcmlvcml0eSk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQcml2YXRlRGF0YShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICAgICBSRUZHVUlEIHRhZywgTFBWT0lEIHBEYXRhLAotCQkJCSAgICAgIERXT1JEIGNiU2l6ZSwgRFdPUkQgZHdGbGFncyk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VbmxvY2soTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQUkVDVCBwUmVjdCk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCSAgICAgTFBSRUNUIHBTcmNSZWN0LAotCQkJCSAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcERzdFN1cmZhY2UsCi0JCQkJICAgICBMUFJFQ1QgcERzdFJlY3QsIERXT1JEIGR3RmxhZ3MsCi0JCQkJICAgICBMUERET1ZFUkxBWUZYIHBGWCk7Ci1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5RGlzcGxheShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgIERXT1JEIGR3RmxhZ3MpOwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheVpPcmRlcihMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgRFdPUkQgZHdGbGFncywKLQkJCQkJICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcEREU1JlZik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdERyYXdTdXJmYWNlIERJQiBkZWNsYXJhdGlvbnMKLSAqLwotI2RlZmluZSBESUJfUFJJVihzdXJmKSAoKERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGwqKSgoc3VyZiktPnByaXZhdGUpKQotCi0jZGVmaW5lIERJQl9QUklWX1ZBUihuYW1lLCBzdXJmKSBcCi0JRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogbmFtZSA9IERJQl9QUklWKHN1cmYpCi0KLXN0cnVjdCBESUJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQKLXsKLSAgICBIQklUTUFQIERJQnNlY3Rpb247Ci0gICAgdm9pZCogYml0bWFwX2RhdGE7Ci0gICAgSEdESU9CSiBob2xkYml0bWFwOwotICAgIEJPT0wgY2xpZW50X21lbW9yeTsKLSAgICBEV09SRCBkM2RfZGF0YVs0XTsgLyogcm9vbSBmb3IgRGlyZWN0M0QgZHJpdmVyIGRhdGEgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgc3RydWN0IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWI7Ci19IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGw7Ci0KLUhSRVNVTFQKLURJQl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywKLQkJCQlJRGlyZWN0RHJhd0ltcGwgKnBERCwKLQkJCQljb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QpOwotSFJFU1VMVAotRElCX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKnBERCwKLQkJCSAgICAgY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNELAotCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAotCQkJICAgICBJVW5rbm93biAqcFVua091dGVyKTsKLQotdm9pZCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKLUJPT0wgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKLQkJCQkgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2ssCi0JCQkJICAgICBEV09SRCBkd0ZsYWdzKTsKLQotdm9pZCBESUJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkgICAgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKTsKLXZvaWQgRElCX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsLAotCQkJCQkgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsCi0JCQkJCSAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KTsKLQotSFJFU1VMVCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyogcGhEQyk7Ci1IUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9yZWxlYXNlX2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsSERDIGhEQyk7Ci0KLUhSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2FsbG9jX2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsSERDKiBwaERDKTsKLUhSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZyZWVfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDIGhEQyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1ESUJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBMUFJFQ1QgcHJjRGVzdCwKLQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcFNyY1N1cmYsIExQUkVDVCBwcmNTcmMsCi0JCQkgIERXT1JEIGR3RmxhZ3MsIExQRERCTFRGWCBwQmx0RngpOwotSFJFU1VMVCBXSU5BUEkKLURJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkd1gsCi0JCQkgICAgICBEV09SRCBkd1ksIExQRElSRUNURFJBV1NVUkZBQ0U3IHBTcmNTdXJmLAotCQkJICAgICAgTFBSRUNUIHByY1NyYywgRFdPUkQgZHdUcmFucyk7Ci1IUkVTVUxUIFdJTkFQSSBESUJfRGlyZWN0RHJhd1N1cmZhY2VfUmVzdG9yZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSk7Ci1IUkVTVUxUIFdJTkFQSQotRElCX0RpcmVjdERyYXdTdXJmYWNlX1NldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCSAgICAgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgRFdPUkQgZHdGbGFncyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdERyYXdTdXJmYWNlIFVTRVIgZGVjbGFyYXRpb25zCi0gKi8KLSNkZWZpbmUgVVNFUl9QUklWKHN1cmYpICgoVXNlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwqKSgoc3VyZiktPnByaXZhdGUpKQotCi0jZGVmaW5lIFVTRVJfUFJJVl9WQVIobmFtZSxzdXJmKSBcCi0JVXNlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwqIG5hbWUgPSBVU0VSX1BSSVYoc3VyZikKLQotc3RydWN0IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQKLXsKLSAgICBIV05EIHdpbmRvdzsKLSAgICBIREMgY2FjaGVkX2RjOwotICAgIEhBTkRMRSB1cGRhdGVfdGhyZWFkLCB1cGRhdGVfZXZlbnQsIHJlZnJlc2hfZXZlbnQ7Ci0gICAgdm9sYXRpbGUgaW50IHdhaXRfY291bnQsIGluX3JlZnJlc2g7Ci0gICAgQ1JJVElDQUxfU0VDVElPTiBjcml0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBzdHJ1Y3QgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbF9QYXJ0IGRpYjsKLSAgICBzdHJ1Y3QgVXNlcl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCB1c2VyOwotfSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlSW1wbDsKLQotSFJFU1VMVCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkgSURpcmVjdERyYXdJbXBsKiBwREQsCi0JCQkJCSBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QpOwotCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlKElEaXJlY3REcmF3SW1wbCAqcERELAotCQkJCSAgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKLQkJCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAotCQkJCSAgICAgIElVbmtub3duICpwVW5rT3V0ZXIpOwotCi12b2lkIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKLQotdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2xvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCUxQQ1JFQ1QgcFJlY3QsIERXT1JEIGR3RmxhZ3MpOwotdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3VubG9ja191cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJICBMUENSRUNUIHBSZWN0KTsKLXZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwpOwotdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKLQkJCQkJICAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkJICAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KTsKLUhSRVNVTFQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9kdXBsaWNhdGVfc3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcER1cCk7Ci1CT09MIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF9kYXRhKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZyb250LAotCQkJCSAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2ssCi0JCQkJICAgICAgRFdPUkQgZHdGbGFncyk7Ci12b2lkIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF91cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJRFdPUkQgZHdGbGFncyk7Ci1IV05EIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2Rpc3BsYXlfd2luZG93KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpOwotCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyogcGhEQyk7Ci1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfcmVsZWFzZV9kYyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkgIEhEQyBoREMpOwotCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2dhbW1hX3JhbXAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJICAgICAgRFdPUkQgZHdGbGFncywKLQkJCQkJICAgICAgTFBEREdBTU1BUkFNUCBscEdhbW1hUmFtcCk7Ci1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X2dhbW1hX3JhbXAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJICAgICAgRFdPUkQgZHdGbGFncywKLQkJCQkJICAgICAgTFBEREdBTU1BUkFNUCBscEdhbW1hUmFtcCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdERyYXdTdXJmYWNlIEhBTCBkZWNsYXJhdGlvbnMKLSAqLwotI2RlZmluZSBIQUxfUFJJVihzdXJmKSAoKEhBTF9EaXJlY3REcmF3U3VyZmFjZUltcGwqKSgoc3VyZiktPnByaXZhdGUpKQotCi0jZGVmaW5lIEhBTF9QUklWX1ZBUihuYW1lLHN1cmYpIFwKLQlIQUxfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBuYW1lID0gSEFMX1BSSVYoc3VyZikKLQotc3RydWN0IEhBTF9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydAotewotICAgIERXT1JEIG5lZWRfbGF0ZTsKLSAgICBMUFZPSUQgZmJfYWRkcjsKLSAgICBEV09SRCBmYl9waXRjaCwgZmJfdm9mczsKLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgc3RydWN0IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWI7Ci0gICAgc3RydWN0IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQgdXNlcjsKLSAgICBzdHJ1Y3QgSEFMX0RpcmVjdERyYXdTdXJmYWNlSW1wbF9QYXJ0IGhhbDsKLX0gSEFMX0RpcmVjdERyYXdTdXJmYWNlSW1wbDsKLQotSFJFU1VMVCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCUlEaXJlY3REcmF3SW1wbCogcERELAotCQkJCQljb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QpOwotCi1IUkVTVUxUIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsICpwREQsCi0JCQkJICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QsCi0JCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAotCQkJCSAgICAgSVVua25vd24gKnBVbmtPdXRlcik7Ci0KLXZvaWQgSEFMX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7Ci1IUkVTVUxUIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9sYXRlX2FsbG9jYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpOwotCi12b2lkIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCSAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwpOwotdm9pZCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfdXBkYXRlX3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwsCi0JCQkJCSAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkJICBMUFBBTEVUVEVFTlRSWSBwYWxlbnQpOwotSFJFU1VMVCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJCUxQRElSRUNURFJBV1NVUkZBQ0U3KiBwcER1cCk7Ci12b2lkIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCSAgICAgICBMUENSRUNUIHBSZWN0LCBEV09SRCBkd0ZsYWdzKTsKLXZvaWQgSEFMX0RpcmVjdERyYXdTdXJmYWNlX3VubG9ja191cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJIExQQ1JFQ1QgcFJlY3QpOwotQk9PTCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF9kYXRhKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZyb250LAotCQkJCSAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogYmFjaywKLQkJCQkgICAgIERXT1JEIGR3RmxhZ3MpOwotdm9pZCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF91cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkgICAgICAgRFdPUkQgZHdGbGFncyk7Ci1IV05EIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGlzcGxheV93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdERyYXdTdXJmYWNlIEZBS0VaQlVGRkVSIGRlY2xhcmF0aW9ucwotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIEJPT0xFQU4gaW5fbWVtb3J5OwotfSBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZUltcGw7Ci0KLUhSRVNVTFQgRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCQlJRGlyZWN0RHJhd0ltcGwqIHBERCwKLQkJCQkJCWNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCk7Ci0KLUhSRVNVTFQgRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlKElEaXJlY3REcmF3SW1wbCogcERELAotCQkJCQkgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAotCQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpOwotCi12b2lkIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7Ci0KLUhSRVNVTFQgRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApOwotCi0jZW5kaWYgLyogX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9IICovCitIUkVTVUxUIGhyX2RkcmF3X2Zyb21fd2luZWQzZChIUkVTVUxUIGhyKTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXdfdGh1bmtzLmMgYi9kbGxzL2RkcmF3L2RkcmF3X3RodW5rcy5jCmluZGV4IGFjOTNmNzIuLjg4MzQxMTMgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvZGRyYXdfdGh1bmtzLmMKKysrIGIvZGxscy9kZHJhdy9kZHJhd190aHVua3MuYwpAQCAtMTUsNiArMTUsOSBAQAogICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgPHN0ZGFyZy5oPgogCiAjaW5jbHVkZSAid2luZGVmLmgiCkBAIC0yMDUsNiArMjA4LDcgQEAKIAkJCSAgICAgIElVbmtub3duICpwVW5rT3V0ZXIpCiB7CiAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcFN1cmZhY2U3OworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmltcGw7CiAgICAgSFJFU1VMVCBocjsKIAogICAgIC8qIHRoZSBMUEREU1VSRkFDRURFU0MgLT4gTFBERFNVUkZBQ0VERVNDMiBjb252ZXJzaW9uIHNob3VsZCBiZSBvaywKQEAgLTIyMSw2ICsyMjUsMTIgQEAKIAkJCQkgICAgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdERyYXdTdXJmYWNlMywKIAkJCQkgICAgcFN1cmZhY2U3KTsKIAorICAgIGltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBwU3VyZmFjZTcpOworICAgIGlmKGltcGwpCisgICAgeworICAgICAgICBpbXBsLT52ZXJzaW9uID0gMTsKKyAgICB9CisKICAgICByZXR1cm4gaHI7CiB9CiAKQEAgLTIzMCw2ICsyNDAsNyBAQAogCQkJICAgICAgIElVbmtub3duICpwVW5rT3V0ZXIpCiB7CiAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcFN1cmZhY2U3OworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmltcGw7CiAgICAgSFJFU1VMVCBocjsKIAogICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKQEAgLTI0NCw2ICsyNTUsMTIgQEAKIAkJCQkgICAgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdERyYXdTdXJmYWNlMywKIAkJCQkgICAgcFN1cmZhY2U3KTsKIAorICAgIGltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBwU3VyZmFjZTcpOworICAgIGlmKGltcGwpCisgICAgeworICAgICAgICBpbXBsLT52ZXJzaW9uID0gMjsKKyAgICB9CisKICAgICByZXR1cm4gaHI7CiB9CiAKQEAgLTI1MiwxMyArMjY5LDIyIEBACiAJCQkgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgKnBwU3VyZmFjZSwKIAkJCSAgICAgICBJVW5rbm93biAqcFVua091dGVyKQogewotICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAotCQkJCQkJCSBJRGlyZWN0RHJhdzQsCi0JCQkJCQkJIElEaXJlY3REcmF3NywKLQkJCQkJCQkgVGhpcyksCi0JCQkJICAgICAgcFNEZXNjLAotCQkJCSAgICAgIChMUERJUkVDVERSQVdTVVJGQUNFNyAqKXBwU3VyZmFjZSwKLQkJCQkgICAgICBwVW5rT3V0ZXIpOworICAgIEhSRVNVTFQgaHI7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqaW1wbDsKKworICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCSAgICAgICBJRGlyZWN0RHJhdzQsCisJCQkJCQkgICAgICAgSURpcmVjdERyYXc3LAorCQkJCQkJICAgICAgICBUaGlzKSwKKwkJCQkgICAgcFNEZXNjLAorCQkJCSAgICAoTFBESVJFQ1REUkFXU1VSRkFDRTcgKilwcFN1cmZhY2UsCisJCQkJICAgIHBVbmtPdXRlcik7CisgICAgaW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsICpwcFN1cmZhY2UpOworICAgIGlmKGltcGwpCisgICAgeworICAgICAgICBpbXBsLT52ZXJzaW9uID0gNDsKKyAgICB9CisgICAgcmV0dXJuIGhyOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkKQEAgLTcwOSwxMCArNzM1LDcgQEAKICAgICBIUkVTVUxUIHJldF92YWx1ZTsKIAogICAgIHJldF92YWx1ZSA9IElEaXJlY3REcmF3N19Jbml0aWFsaXplKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NyksIHBHVUlEKTsKLSAgICAKLSAgICAvKiBPdmVyd3JpdGUgdGhlIGZhbHNlbHkgc2V0ICdESVJFQ1REUkFXNycgZmxhZyAqLwotICAgIFRoaXMtPmxvY2FsLmR3TG9jYWxGbGFncyAmPSB+RERSQVdJTENMX0RJUkVDVERSQVc3OwotICAgIAorCiAgICAgcmV0dXJuIHJldF92YWx1ZTsKIH0KIApAQCAtNzIxLDEyICs3NDQsOSBAQAogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdERyYXcyLCBpZmFjZSk7CiAgICAgSFJFU1VMVCByZXRfdmFsdWU7Ci0gICAgCisKICAgICByZXRfdmFsdWUgPSBJRGlyZWN0RHJhdzdfSW5pdGlhbGl6ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpLCBwR1VJRCk7CiAKLSAgICAvKiBPdmVyd3JpdGUgdGhlIGZhbHNlbHkgc2V0ICdESVJFQ1REUkFXNycgZmxhZyAqLwotICAgIFRoaXMtPmxvY2FsLmR3TG9jYWxGbGFncyAmPSB+RERSQVdJTENMX0RJUkVDVERSQVc3OwotICAgIAogICAgIHJldHVybiByZXRfdmFsdWU7CiB9CiAKQEAgLTczNSwxMiArNzU1LDkgQEAKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3NCwgaWZhY2UpOwogICAgIEhSRVNVTFQgcmV0X3ZhbHVlOwotICAgIAorCiAgICAgcmV0X3ZhbHVlID0gSURpcmVjdERyYXc3X0luaXRpYWxpemUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwgcEdVSUQpOwotICAgIAotICAgIC8qIE92ZXJ3cml0ZSB0aGUgZmFsc2VseSBzZXQgJ0RJUkVDVERSQVc3JyBmbGFnICovCi0gICAgVGhpcy0+bG9jYWwuZHdMb2NhbEZsYWdzICY9IH5ERFJBV0lMQ0xfRElSRUNURFJBVzc7Ci0gICAgCisKICAgICByZXR1cm4gcmV0X3ZhbHVlOwogfQogCkBAIC05NDIsNyArOTU5LDcgQEAKICAgICByZXR1cm4gaHI7CiB9CiAKLWNvbnN0IElEaXJlY3REcmF3VnRibCBERFJBV19JRGlyZWN0RHJhd19WVGFibGUgPQorY29uc3QgSURpcmVjdERyYXdWdGJsIElEaXJlY3REcmF3MV9WdGJsID0KIHsKICAgICBJRGlyZWN0RHJhd0ltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICAgSURpcmVjdERyYXdJbXBsX0FkZFJlZiwKQEAgLTk2OSw3ICs5ODYsNyBAQAogICAgIElEaXJlY3REcmF3SW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuaywKIH07CiAKLWNvbnN0IElEaXJlY3REcmF3MlZ0YmwgRERSQVdfSURpcmVjdERyYXcyX1ZUYWJsZSA9Citjb25zdCBJRGlyZWN0RHJhdzJWdGJsIElEaXJlY3REcmF3Ml9WdGJsID0KIHsKICAgICBJRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgIElEaXJlY3REcmF3MkltcGxfQWRkUmVmLApAQCAtOTk3LDcgKzEwMTQsNyBAQAogICAgIElEaXJlY3REcmF3MkltcGxfR2V0QXZhaWxhYmxlVmlkTWVtCiB9OwogCi1jb25zdCBJRGlyZWN0RHJhdzRWdGJsIEREUkFXX0lEaXJlY3REcmF3NF9WVGFibGUgPQorY29uc3QgSURpcmVjdERyYXc0VnRibCBJRGlyZWN0RHJhdzRfVnRibCA9CiB7CiAgICAgSURpcmVjdERyYXc0SW1wbF9RdWVyeUludGVyZmFjZSwKICAgICBJRGlyZWN0RHJhdzRJbXBsX0FkZFJlZiwKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXdfdXNlci5jIGIvZGxscy9kZHJhdy9kZHJhd191c2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjNkNmMuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9kZHJhd191c2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoJRGlyZWN0RHJhdyBkcml2ZXIgZm9yIFVzZXItYmFzZWQgcHJpbWFyeSBzdXJmYWNlcwotICoKLSAqIENvcHlyaWdodCAyMDAwLTIwMDEgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAotCi0jaW5jbHVkZSAid2luZGVmLmgiCi0jaW5jbHVkZSAid2luYmFzZS5oIgotI2luY2x1ZGUgIndpbmdkaS5oIgotI2luY2x1ZGUgIndpbnVzZXIuaCIKLSNpbmNsdWRlICJkZHJhdy5oIgotI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotc3RhdGljIGNvbnN0IElEaXJlY3REcmF3N1Z0YmwgVXNlcl9EaXJlY3REcmF3X1ZUYWJsZTsKLQotc3RhdGljIGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIgdXNlcl9kZXZpY2UgPQotewotICAgICJkaXNwbGF5IiwKLSAgICAiVXNlciAoYW5kIEdESSkiLAotICAgIHsgeyAweDAwMDEwMDAxLCAweDAwMDEwMDAxIH0gfSwKLSAgICAwLCAwLCAwLCAwLAotICAgIC8qIGZlMzg0NDBjLTg5NjktNDI4My1iYzczLTc0OWU3YmMzYzJlYiAqLwotICAgIHsweGZlMzg0NDBjLDB4ODk2OSwweDQyOGUsIHsweDczLDB4YmMsMHg3NCwweDllLDB4N2IsMHhjMywweGMyLDB4ZWJ9fSwKLSAgICAwCi19OwotCi1zdGF0aWMgY29uc3QgRERQSVhFTEZPUk1BVCBwaXhlbGZvcm1hdHNbXSA9Ci17Ci0gICAgLyogOGJwcCBwYWxldHRlZCAqLwotICAgIHsgc2l6ZW9mKEREUElYRUxGT1JNQVQpLCBERFBGX1JHQnxERFBGX1BBTEVUVEVJTkRFWEVEOCwgMCwgeyA4IH0gfSwKLSAgICAvKiAxNWJwcCA1LzUvNSAqLwotICAgIHsgc2l6ZW9mKEREUElYRUxGT1JNQVQpLCBERFBGX1JHQiwgMCwgeyAxNiB9LCB7IDB4N0MwMCB9LCB7IDB4M0UwIH0sCi0gICAgICB7IDB4MUYgfSB9LAotICAgIC8qIDE2YnBwIDUvNi81ICovCi0gICAgeyBzaXplb2YoRERQSVhFTEZPUk1BVCksIEREUEZfUkdCLCAwLCB7IDE2IH0sIHsgMHhGODAwIH0sIHsgMHg3RTAgfSwKLSAgICAgIHsgMHgxRiB9IH0sCi0gICAgLyogMjRicHAgOC84LzggKi8KLSAgICB7IHNpemVvZihERFBJWEVMRk9STUFUKSwgRERQRl9SR0IsIDAsIHsgMjQgfSwgeyAweEZGMDAwMCB9LAotICAgICAgeyAweDAwRkYwMCB9LCB7IDB4MDAwMEZGIH0gfSwKLSAgICAvKiAzMmJwcCA4LzgvOCAqLwotICAgIHsgc2l6ZW9mKEREUElYRUxGT1JNQVQpLCBERFBGX1JHQiwgMCwgeyAzMiB9LCB7IDB4RkYwMDAwIH0sCi0gICAgICB7IDB4MDBGRjAwIH0sIHsgMHgwMDAwRkYgfSB9Ci19OwotCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd19DcmVhdGUoY29uc3QgR1VJRCogcEdVSUQsIExQRElSRUNURFJBVzcqIHBJZmFjZSwKLQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpOwotSFJFU1VMVCBVc2VyX0RpcmVjdERyYXdfSW5pdGlhbGl6ZShJRGlyZWN0RHJhd0ltcGwqLCBjb25zdCBHVUlEKik7Ci0KLXN0YXRpYyBjb25zdCBkZHJhd19kcml2ZXIgdXNlcl9kcml2ZXIgPQotewotICAgICZ1c2VyX2RldmljZSwKLSAgICAxMCwKLSAgICBVc2VyX0RpcmVjdERyYXdfQ3JlYXRlLAotICAgIFVzZXJfRGlyZWN0RHJhd19Jbml0aWFsaXplCi19OwotCi1CT09MIEREUkFXX1VzZXJfSW5pdChISU5TVEFOQ0UgaEluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdikKLXsKLSAgICBpZiAoZmR3UmVhc29uID09IERMTF9QUk9DRVNTX0FUVEFDSCkKLQlERFJBV19yZWdpc3Rlcl9kcml2ZXIoJnVzZXJfZHJpdmVyKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgY29uc3QgRERQSVhFTEZPUk1BVCogcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKERXT1JEIGRlcHRoKQotewotICAgIHN3aXRjaCAoZGVwdGgpCi0gICAgewotICAgIGNhc2UgIDg6IHJldHVybiBwaXhlbGZvcm1hdHMgKyAwOwotICAgIGNhc2UgMTU6IHJldHVybiBwaXhlbGZvcm1hdHMgKyAxOwotICAgIGNhc2UgMTY6IHJldHVybiBwaXhlbGZvcm1hdHMgKyAyOwotICAgIGNhc2UgMjQ6IHJldHVybiBwaXhlbGZvcm1hdHMgKyAzOwotICAgIGNhc2UgMzI6IHJldHVybiBwaXhlbGZvcm1hdHMgKyA0OwotICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLyogTm90IGNhbGxlZCBmcm9tIHRoZSB2dGFibGUuICovCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KQotewotICAgIEhSRVNVTFQgaHI7Ci0gICAgRFdPUkQgZGVwdGg7Ci0gICAgSERDIGhEQzsKLQotICAgIFRSQUNFKCIoJXAsJWQpXG4iLFRoaXMsZXgpOwotCi0gICAgaHIgPSBNYWluX0RpcmVjdERyYXdfQ29uc3RydWN0KFRoaXMsIGV4KTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCi0gICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IFVzZXJfRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlOwotCi0gICAgVGhpcy0+Y3JlYXRlX3ByaW1hcnkgICAgPSBVc2VyX0RpcmVjdERyYXdfY3JlYXRlX3ByaW1hcnk7Ci0gICAgVGhpcy0+Y3JlYXRlX2JhY2tidWZmZXIgPSBVc2VyX0RpcmVjdERyYXdfY3JlYXRlX2JhY2tidWZmZXI7Ci0KLSAgICBoREMgPSBDcmVhdGVEQ0EoIkRJU1BMQVkiLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICBkZXB0aCA9IEdldERldmljZUNhcHMoaERDLCBCSVRTUElYRUwpICogR2V0RGV2aWNlQ2FwcyhoREMsIFBMQU5FUyk7Ci0gICAgRGVsZXRlREMoaERDKTsKLQotICAgIFRoaXMtPndpZHRoICAgICAgID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7Ci0gICAgVGhpcy0+aGVpZ2h0ICAgICAgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKLSAgICBUaGlzLT5waXRjaCAgICAgICA9IEREUkFXX3dpZHRoX2JwcF90b19waXRjaChUaGlzLT53aWR0aCwgZGVwdGgpOwotICAgIFRoaXMtPnBpeGVsZm9ybWF0ID0gKnBpeGVsZm9ybWF0X2Zvcl9kZXB0aChkZXB0aCk7Ci0KLSAgICBUaGlzLT5vcmlnX3dpZHRoICAgICAgID0gVGhpcy0+d2lkdGg7Ci0gICAgVGhpcy0+b3JpZ19oZWlnaHQgICAgICA9IFRoaXMtPmhlaWdodDsKLSAgICBUaGlzLT5vcmlnX3BpdGNoICAgICAgID0gVGhpcy0+cGl0Y2g7Ci0gICAgVGhpcy0+b3JpZ19waXhlbGZvcm1hdCA9IFRoaXMtPnBpeGVsZm9ybWF0OwotCi0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcsIFVzZXJfRGlyZWN0RHJhd19WVGFibGUpOwotCi0gICAgLyogY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEJMSVRfQ0FQUyAoRERDQVBTX0JMVCB8IEREQ0FQU19CTFRDT0xPUkZJTEwgfCBERENBUFNfQkxUREVQVEhGSUxMIFwKLQkgIHwgRERDQVBTX0JMVFNUUkVUQ0ggfCBERENBUFNfQ0FOQkxUU1lTTUVNIHwgRERDQVBTX0NBTkNMSVAJICBcCi0JICB8IEREQ0FQU19DQU5DTElQU1RSRVRDSEVEIHwgRERDQVBTX0NPTE9SS0VZCQkJICBcCi0JICB8IEREQ0FQU19DT0xPUktFWUhXQVNTSVNUIHwgRERDQVBTX09WRVJMQVkgfCBERENBUFNfT1ZFUkxBWVNUUkVUQ0gpCi0jZGVmaW5lIENLRVlfQ0FQUyAoRERDS0VZQ0FQU19ERVNUQkxUIHwgRERDS0VZQ0FQU19TUkNCTFQpCi0jZGVmaW5lIEZYX0NBUFMgKERERlhDQVBTX0JMVEFMUEhBIHwgRERGWENBUFNfQkxUTUlSUk9STEVGVFJJR0hUCVwKLQkJfCBEREZYQ0FQU19CTFRNSVJST1JVUERPV04gfCBEREZYQ0FQU19CTFRST1RBVElPTjkwCVwKLQkJfCBEREZYQ0FQU19CTFRTSFJJTktYIHwgRERGWENBUFNfQkxUU0hSSU5LWE4JCVwKLQkJfCBEREZYQ0FQU19CTFRTSFJJTktZIHwgRERGWENBUFNfQkxUU0hSSU5LWE4JCVwKLQkJfCBEREZYQ0FQU19CTFRTVFJFVENIWCB8IERERlhDQVBTX0JMVFNUUkVUQ0hYTgkJXAotCQl8IERERlhDQVBTX0JMVFNUUkVUQ0hZIHwgRERGWENBUFNfQkxUU1RSRVRDSFlOKQotICAgIFRoaXMtPmNhcHMuZHdDYXBzIHw9IEREQ0FQU19HREkgfCBERENBUFNfUEFMRVRURSB8IEJMSVRfQ0FQUzsKLSAgICBpZiggb3BlbmdsX2luaXRpYWxpemVkICkKLSAgICB7Ci0gICAgICAgIC8qIEhhY2sgZm9yIEQzRCBjb2RlICovCi0gICAgICAgIFRoaXMtPmNhcHMuZHdDYXBzIHw9IEREQ0FQU18zRDsKLSAgICB9Ci0gICAgVGhpcy0+Y2Fwcy5kd0NhcHMyIHw9IEREQ0FQUzJfQ0VSVElGSUVEIHwgRERDQVBTMl9OT1BBR0VMT0NLUkVRVUlSRUQgfAotCQkJICBERENBUFMyX1BSSU1BUllHQU1NQSB8IEREQ0FQUzJfV0lERVNVUkZBQ0VTOwotICAgIFRoaXMtPmNhcHMuZHdDS2V5Q2FwcyB8PSBDS0VZX0NBUFM7Ci0gICAgVGhpcy0+Y2Fwcy5kd0ZYQ2FwcyB8PSBGWF9DQVBTOwotICAgIFRoaXMtPmNhcHMuZHdQYWxDYXBzIHw9IEREUENBUFNfOEJJVCB8IEREUENBUFNfUFJJTUFSWVNVUkZBQ0U7Ci0gICAgVGhpcy0+Y2Fwcy5kd1ZpZE1lbVRvdGFsID0gMTYqMTAyNCoxMDI0OwotICAgIFRoaXMtPmNhcHMuZHdWaWRNZW1GcmVlID0gMTYqMTAyNCoxMDI0OwotICAgIFRoaXMtPmNhcHMuZHdTVkJDYXBzIHw9IEJMSVRfQ0FQUzsKLSAgICBUaGlzLT5jYXBzLmR3U1ZCQ0tleUNhcHMgfD0gQ0tFWV9DQVBTOwotICAgIFRoaXMtPmNhcHMuZHdTVkJGWENhcHMgfD0gRlhfQ0FQUzsKLSAgICBUaGlzLT5jYXBzLmR3VlNCQ2FwcyB8PSBCTElUX0NBUFM7Ci0gICAgVGhpcy0+Y2Fwcy5kd1ZTQkNLZXlDYXBzIHw9IENLRVlfQ0FQUzsKLSAgICBUaGlzLT5jYXBzLmR3VlNCRlhDYXBzIHw9IEZYX0NBUFM7Ci0gICAgVGhpcy0+Y2Fwcy5kd1NTQkNhcHMgfD0gQkxJVF9DQVBTOwotICAgIFRoaXMtPmNhcHMuZHdTU0JDS2V5Q2FwcyB8PSBDS0VZX0NBUFM7Ci0gICAgVGhpcy0+Y2Fwcy5kd1NTQkZYQ2FwcyB8PSBGWF9DQVBTOwotICAgIFRoaXMtPmNhcHMuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19BTFBIQSB8IEREU0NBUFNfQkFDS0JVRkZFUiB8Ci0JCQkJIEREU0NBUFNfRkxJUCB8IEREU0NBUFNfRlJPTlRCVUZGRVIgfAotCQkJCSBERFNDQVBTX09GRlNDUkVFTlBMQUlOIHwgRERTQ0FQU19QQUxFVFRFIHwKLQkJCQkgRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwKLQkJCQkgRERTQ0FQU19WSURFT01FTU9SWSB8IEREU0NBUFNfVklTSUJMRTsKLSAgICBpZiggb3BlbmdsX2luaXRpYWxpemVkICkKLSAgICB7Ci0gICAgICAgIC8qIEhhY2tzIGZvciBEM0QgY29kZSAqLwotICAgICAgICBUaGlzLT5jYXBzLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfM0RERVZJQ0UgfCBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfWkJVRkZFUjsKLSAgICB9Ci0gICAgCi0gICAgVGhpcy0+Y2Fwcy5kZHNPbGRDYXBzLmR3Q2FwcyA9IFRoaXMtPmNhcHMuZGRzQ2Fwcy5kd0NhcHM7Ci0jdW5kZWYgQkxJVF9DQVBTCi0jdW5kZWYgQ0tFWV9DQVBTCi0jdW5kZWYgRlhfQ0FQUwotCi0gICAgcmV0dXJuIFNfT0s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gRGlyZWN0RHJhd0NyZWF0ZShFeCkgb24gdGhlIG1vc3QtZGVyaXZlZAotICogY2xhc3MgdG8gc3RhcnQgY29uc3RydWN0aW9uLgotICogTm90IGNhbGxlZCBmcm9tIHRoZSB2dGFibGUuICovCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd19DcmVhdGUoY29uc3QgR1VJRCogcEdVSUQsIExQRElSRUNURFJBVzcqIHBJZmFjZSwKLQkJCSAgICAgICBJVW5rbm93biogcFVua091dGVyLCBCT09MIGV4KQotewotICAgIEhSRVNVTFQgaHI7Ci0gICAgSURpcmVjdERyYXdJbXBsKiBUaGlzOwotCi0gICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsKLQotICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJICAgICBzaXplb2YoSURpcmVjdERyYXdJbXBsKSArIHNpemVvZihVc2VyX0RpcmVjdERyYXdJbXBsKSk7Ci0gICAgaWYgKFRoaXMgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0KLSAgICAvKiBOb3RlIHRoYXQgdGhpcyByZWxhdGlvbiBkb2VzICpub3QqIGhvbGQgdHJ1ZSBpZiB0aGUgREQgb2JqZWN0IHdhcwotICAgICAqIENvQ3JlYXRlSW5zdGFuY2VkIHRoZW4gSW5pdGlhbGl6ZWQuICovCi0gICAgVGhpcy0+cHJpdmF0ZSA9IChVc2VyX0RpcmVjdERyYXdJbXBsICopKFRoaXMrMSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBERENBUFMgc3RydWN0dXJlICovCi0gICAgVGhpcy0+Y2Fwcy5kd1NpemUgPSBzaXplb2YoVGhpcy0+Y2Fwcyk7Ci0KLSAgICBociA9IFVzZXJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoVGhpcywgZXgpOwotICAgIGlmIChGQUlMRUQoaHIpKQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwotICAgIGVsc2UKLQkqcElmYWNlID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KTsKLQotICAgIHJldHVybiBocjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBVbmluaXRfRGlyZWN0RHJhd19Jbml0aWFsaXplIG9uIHRoZQotICogbW9zdC1kZXJpdmVkLWNsYXNzIHRvIHN0YXJ0IGluaXRpYWxpemF0aW9uLgotICogTm90IGNhbGxlZCBmcm9tIHRoZSB2dGFibGUuICovCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd19Jbml0aWFsaXplKElEaXJlY3REcmF3SW1wbCAqVGhpcywgY29uc3QgR1VJRCogZ3VpZCkKLXsKLSAgICBIUkVTVUxUIGhyOwotICAgIFRoaXMtPnByaXZhdGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCSAgICAgIHNpemVvZihVc2VyX0RpcmVjdERyYXdJbXBsKSk7Ci0gICAgaWYgKFRoaXMtPnByaXZhdGUgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBERENBUFMgc3RydWN0dXJlICovCi0gICAgVGhpcy0+Y2Fwcy5kd1NpemUgPSBzaXplb2YoVGhpcy0+Y2Fwcyk7Ci0KLSAgICBociA9IFVzZXJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoVGhpcywgVFJVRSk7IC8qIFhYWCBleD8gKi8KLSAgICBpZiAoRkFJTEVEKGhyKSkKLSAgICB7Ci0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+cHJpdmF0ZSk7Ci0JcmV0dXJuIGhyOwotICAgIH0KLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotLyogQ2FsbGVkIGZyb20gYW4gaW50ZXJuYWwgZnVuY3Rpb24gcG9pbnRlci4gKi8KLXZvaWQgVXNlcl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdJbXBsICpUaGlzKQotewotICAgIE1haW5fRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlKFRoaXMpOwotfQotCi0vKiBDb21wYWN0OiBnZW5lcmljICovCi0vKiBDcmVhdGVDbGlwcGVyOiBnZW5lcmljICovCi0vKiBDcmVhdGVQYWxldHRlOiBnZW5lcmljICh3aXRoIGNhbGxiYWNrKSAqLwotLyogQ3JlYXRlU3VyZmFjZTogZ2VuZXJpYyAod2l0aCBjYWxsYmFja3MpICovCi0KLUhSRVNVTFQKLVVzZXJfRGlyZWN0RHJhd19jcmVhdGVfcHJpbWFyeShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCi0JCQkgICAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAotCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCi0JCQkgICAgICAgSVVua25vd24qIHBVbmtPdXRlcikKLXsKLSAgICByZXR1cm4gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKLX0KLQotSFJFU1VMVAotVXNlcl9EaXJlY3REcmF3X2NyZWF0ZV9iYWNrYnVmZmVyKElEaXJlY3REcmF3SW1wbCogVGhpcywKLQkJCQkgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKLQkJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCi0JCQkJICBJVW5rbm93biogcFVua091dGVyLAotCQkJCSAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpbWFyeSkKLXsKLSAgICByZXR1cm4gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKLX0KLQotLyogRHVwbGljYXRlU3VyZmFjZTogZ2VuZXJpYyAqLwotCi0vKiBPcmlnaW5hbGx5IGRlcml2ZWQgZnJvbSBYbGliX0lEaXJlY3REcmF3MkltcGxfRW51bURpc3BsYXlNb2Rlcy4KLSAqCi0gKiBUaGUgZGVwdGhzIGFyZSB3aGF0ZXZlciBESUJzZWN0aW9ucyBzdXBwb3J0IG9uIHRoZSBjbGllbnQgc2lkZS4KLSAqIFNob3VsZCB0aGV5IGJlIGxpbWl0ZWQgYnkgc2NyZWVuIGRlcHRoPwotICovCi1IUkVTVUxUIFdJTkFQSQotVXNlcl9EaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKLQkJCQkgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgTFBWT0lEIGNvbnRleHQsCi0JCQkJIExQRERFTlVNTU9ERVNDQUxMQkFDSzIgY2FsbGJhY2spCi17Ci0gICAgRERTVVJGQUNFREVTQzIgY2FsbGJhY2tfc2Q7Ci0gICAgREVWTU9ERVcgRGV2TW9kZVc7Ci0gICAgY29uc3QgRERQSVhFTEZPUk1BVCogcGl4ZWxmb3JtYXQ7Ci0KLSAgICBpbnQgaTsKLQotICAgIFRSQUNFKCIoJXApLT4oMHglMDhseCwlcCwlcCwlcClcbiIsaWZhY2UsZHdGbGFncyxwRERTRCxjb250ZXh0LGNhbGxiYWNrKTsKLQotICAgIGlmIChwRERTRCAmJiBUUkFDRV9PTihkZHJhdykpCi0gICAgewotCVRSQUNFKCJFbnVtZXJhdGUgbW9kZXMgbWF0Y2hpbmc6XG4iKTsKLQlERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhwRERTRCk7Ci0gICAgfQotCi0gICAgWmVyb01lbW9yeSgmY2FsbGJhY2tfc2QsIHNpemVvZihjYWxsYmFja19zZCkpOwotICAgIGNhbGxiYWNrX3NkLmR3U2l6ZSA9IHNpemVvZihjYWxsYmFja19zZCk7Ci0KLSAgICBjYWxsYmFja19zZC5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX1BJWEVMRk9STUFUfEREU0RfQ0FQUwotCXwgRERTRF9QSVRDSDsKLQotICAgIGlmIChkd0ZsYWdzICYgRERFRE1fUkVGUkVTSFJBVEVTKQotCWNhbGxiYWNrX3NkLmR3RmxhZ3MgfD0gRERTRF9SRUZSRVNIUkFURTsKLQotICAgIGNhbGxiYWNrX3NkLnUyLmR3UmVmcmVzaFJhdGUgPSA2MC4wOwotCi0gICAgZm9yIChpID0gMDsgRW51bURpc3BsYXlTZXR0aW5nc0V4VyhOVUxMLCBpLCAmRGV2TW9kZVcsIDApOyBpKyspCi0gICAgewotCWlmIChwRERTRCkKLQl7Ci0JICAgIGlmICgocEREU0QtPmR3RmxhZ3MgJiBERFNEX1dJRFRIKSAmJiAocEREU0QtPmR3V2lkdGggIT0gRGV2TW9kZVcuZG1QZWxzV2lkdGgpKQotCQljb250aW51ZTsgCi0JICAgIGlmICgocEREU0QtPmR3RmxhZ3MgJiBERFNEX0hFSUdIVCkgJiYgKHBERFNELT5kd0hlaWdodCAhPSBEZXZNb2RlVy5kbVBlbHNIZWlnaHQpKQotCQljb250aW51ZTsgCi0JICAgIGlmICgocEREU0QtPmR3RmxhZ3MgJiBERFNEX1BJWEVMRk9STUFUKSAmJiAocEREU0QtPnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9SR0IpICYmCi0JCShwRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgIT0gRGV2TW9kZVcuZG1CaXRzUGVyUGVsKSkKLQkJICAgIGNvbnRpbnVlOyAKLQl9Ci0KLQljYWxsYmFja19zZC5kd0hlaWdodCA9IERldk1vZGVXLmRtUGVsc0hlaWdodDsKLQljYWxsYmFja19zZC5kd1dpZHRoID0gRGV2TW9kZVcuZG1QZWxzV2lkdGg7Ci0gICAgICAgIGlmIChEZXZNb2RlVy5kbUZpZWxkcyAmIERNX0RJU1BMQVlGUkVRVUVOQ1kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhbGxiYWNrX3NkLnUyLmR3UmVmcmVzaFJhdGUgPSBEZXZNb2RlVy5kbURpc3BsYXlGcmVxdWVuY3k7Ci0gICAgICAgIH0KLQotCVRSQUNFKCItIG1vZGU6ICVsZHglbGRcbiIsIGNhbGxiYWNrX3NkLmR3V2lkdGgsIGNhbGxiYWNrX3NkLmR3SGVpZ2h0KTsKLSAgICAgICAgCi0gICAgICAgIHBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKERldk1vZGVXLmRtQml0c1BlclBlbCk7Ci0gICAgICAgIGNhbGxiYWNrX3NkLnUxLmxQaXRjaAotICAgICAgICAgICAgPSBERFJBV193aWR0aF9icHBfdG9fcGl0Y2goRGV2TW9kZVcuZG1QZWxzV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCk7Ci0KLSAgICAgICAgY2FsbGJhY2tfc2QudTQuZGRwZlBpeGVsRm9ybWF0ID0gKnBpeGVsZm9ybWF0OwotCi0gICAgICAgIGNhbGxiYWNrX3NkLmRkc0NhcHMuZHdDYXBzID0gMDsKLSAgICAgICAgaWYgKHBpeGVsZm9ybWF0LT5kd0ZsYWdzICYgRERQRl9QQUxFVFRFSU5ERVhFRDgpIC8qIGljayAqLwotICAgICAgICAgICAgY2FsbGJhY2tfc2QuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19QQUxFVFRFOwotCi0gICAgICAgIFRSQUNFKCIgLSAlMmxkIGJwcCwgUj0lMDhseCBHPSUwOGx4IEI9JTA4bHhcbiIsCi0gICAgICAgICAgICBjYWxsYmFja19zZC51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCwKLSAgICAgICAgICAgIGNhbGxiYWNrX3NkLnU0LmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrLAotICAgICAgICAgICAgY2FsbGJhY2tfc2QudTQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3R0JpdE1hc2ssCi0gICAgICAgICAgICBjYWxsYmFja19zZC51NC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzayk7Ci0gICAgICAgIGlmIChjYWxsYmFjaygmY2FsbGJhY2tfc2QsIGNvbnRleHQpID09IERERU5VTVJFVF9DQU5DRUwpCi0gICAgICAgICAgICByZXR1cm4gRERfT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKiBFbnVtU3VyZmFjZXM6IGdlbmVyaWMgKi8KLS8qIEZsaXBUb0dESVN1cmZhY2U6ID8/PyAqLwotCi0jaWYgMAotSFJFU1VMVCBXSU5BUEkKLVVzZXJfRGlyZWN0RHJhd19HZXRDYXBzKExQRElSRUNURFJBVzcgaWZhY2UsIExQRERDQVBTIHBEcml2ZXJDYXBzLAotCQkJTFBERENBUFMgcEhFTENhcHMpCi17Ci0vKiBCYXNlZCBvbiBteSBndWVzc2VzIGZvciB3aGF0IGlzIGFwcHJvcHJpYXRlIHdpdGggc29tZSBjbHVlcyBmcm9tIHRoZQotICogTlZpZGlhIGRyaXZlci4gTm90IGV2ZXJ5dGhpbmcgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQgeWV0LgotICogTlYgaGFzIGJ1dCB3ZSBkb24ndDogT3ZlcmxheXMsIFZpZGVvIFBvcnRzLCBERENBUFNfUkVBRFNDQU5MSU5FLAotICogRERDQVBTMl9DRVJUSUZJRUQgKGhlaCksIEREU0NBUFMyX05PTkxPQ0FMVklETUVNLCBERFNDQVBTMl9DT1BZRk9VUkNDLgotICogSXQgYWN0dWFsbHkgaGFzIG5vIEZYIGFscGhhIGNhcHMuCi0gKiBPZGRseSwgaXQgZG9lc24ndCBsaXN0IEREUENBUFNfUFJJTUFSWVNVUkZBQ0UuCi0gKiBBbmQgdGhlIEhFTCBjYXBzIG1ha2UgbGl0dGxlIHNlbnNlLgotICovCi0jZGVmaW5lIEJMSVRfQ0FQUyAoRERDQVBTX0JMVCB8IEREQ0FQU19CTFRDT0xPUkZJTEwgfCBERENBUFNfQkxUREVQVEhGSUxMIFwKLQkgIHwgRERDQVBTX0JMVFNUUkVUQ0ggfCBERENBUFNfQ0FOQkxUU1lTTUVNIHwgRERDQVBTX0NBTkNMSVAJICBcCi0JICB8IEREQ0FQU19DQU5DTElQU1RSRVRDSEVEIHwgRERDQVBTX0NPTE9SS0VZCQkJICBcCi0JICB8IEREQ0FQU19DT0xPUktFWUhXQVNTSVNUIHwgRERDQVBTX09WRVJMQVkgfCBERENBUFNfT1ZFUkxBWVNUUkVUQ0gpCi0KLSNkZWZpbmUgQ0tFWV9DQVBTIChERENLRVlDQVBTX0RFU1RCTFQgfCBERENLRVlDQVBTX1NSQ0JMVCkKLQotI2RlZmluZSBGWF9DQVBTIChEREZYQ0FQU19CTFRBTFBIQSB8IERERlhDQVBTX0JMVE1JUlJPUkxFRlRSSUdIVAlcCi0JCXwgRERGWENBUFNfQkxUTUlSUk9SVVBET1dOIHwgRERGWENBUFNfQkxUUk9UQVRJT045MAlcCi0JCXwgRERGWENBUFNfQkxUU0hSSU5LWCB8IERERlhDQVBTX0JMVFNIUklOS1hOCQlcCi0JCXwgRERGWENBUFNfQkxUU0hSSU5LWSB8IERERlhDQVBTX0JMVFNIUklOS1hOCQlcCi0JCXwgRERGWENBUFNfQkxUU1RSRVRDSFggfCBEREZYQ0FQU19CTFRTVFJFVENIWE4JCVwKLQkJfCBEREZYQ0FQU19CTFRTVFJFVENIWSB8IERERlhDQVBTX0JMVFNUUkVUQ0hZTikKLQotI2lmIDAKLSNkZWZpbmUgUk9QUyB7IFNSQ0NPUFksIFNSQ1BBSU5ULCBTUkNBTkQsIFNSQ0lOVkVSVCwgU1JDRVJBU0UsIE5PVFNSQ0NPUFksIFwKLQlOT1RTUkNFUkFTRSwgTUVSR0VQQUlOVCwgQkxBQ0tORVNTLCBXSElURU5FU1MsIH0KLSNlbHNlCi0jZGVmaW5lIFJPUFMgeyAwLCB9Ci0jZW5kaWYKLQotICAgIHN0YXRpYyBjb25zdCBERENBUFMgY2FwcyA9Ci0gICAgeyBzaXplb2YoRERDQVBTKSwKLSAgICAgIEREQ0FQU18zRCB8IEREQ0FQU19HREkgfCBERENBUFNfUEFMRVRURSB8IEJMSVRfQ0FQUywKLSAgICAgIEREQ0FQUzJfQ0FOTUFOQUdFVEVYVFVSRSB8IEREQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQgfCBERENBUFMyX0NFUlRJRklFRAotICAgICAgfCBERENBUFMyX05PUEFHRUxPQ0tSRVFVSVJFRCB8IEREQ0FQUzJfUFJJTUFSWUdBTU1BCi0gICAgICB8IEREQ0FQUzJfV0lERVNVUkZBQ0VTLAotICAgICAgQ0tFWV9DQVBTLAotICAgICAgRlhfQ0FQUywKLSAgICAgIDAsIC8qIGR3RlhBbHBoYUNhcHMgKi8KLSAgICAgIEREUENBUFNfOEJJVCB8IEREUENBUFNfUFJJTUFSWVNVUkZBQ0UsCi0gICAgICAwLCAvKiBkd1NWQ2FwcyAqLwotICAgICAgMCwgLyogPyBkd0FscGhhQml0Q29uc3RCaXREZXB0aHMgKi8KLSAgICAgIDAsIC8qID8gZHdBbHBoYUJpdFBpeGVsUGl0RGVwdGhzICovCi0gICAgICAwLCAvKiA/IGR3QWxwaGFCbHRTdXJmYWNlQml0RGVwdGhzICovCi0gICAgICAwLCAvKiA/IGR3QWxwaGFPdmVybGF5Q29uc3RCaXREZXB0aHMgKi8KLSAgICAgIDAsIC8qID8gZHdBbHBoYU92ZXJsYXlQaXhlbEJpdERlcHRocyAqLwotICAgICAgMCwgLyogPyBkd0FscGhhT3ZlcmxheVN1cmZhY2VCaXREZXB0aHMgKi8KLSAgICAgIEREQkRfMTYsIC8qID8gZHdaQnVmZmVyQml0RGVwdGhzICovCi0gICAgICAxNioxMDI0KjEwMjQsIC8qIGR3VmlkTWVtVG90YWwgKi8KLSAgICAgIDE2KjEwMjQqMTAyNCwgLyogZHdWaWRNZW1GcmVlICovCi0gICAgICAwLCAvKiBkd01heFZpc2libGVPdmVybGF5cyAqLwotICAgICAgMCwgLyogZHdDdXJyVmlzaWJsZU92ZXJsYXlzICovCi0gICAgICAwLCAvKiBkd051bUZvdXJDQ0NvZGVzICovCi0gICAgICAwLCAvKiBkd0FsaWduQm91bmRhcnlTcmMgKi8KLSAgICAgIDAsIC8qIGR3QWxpZ25TaXplU3JjICovCi0gICAgICAwLCAvKiBkd0FsaWduQm91bmRhcnlEZXN0ICovCi0gICAgICAwLCAvKiBkd0FsaWduU2l6ZURlc3QgKi8KLSAgICAgIDAsIC8qIGR3QWxpZ25TdHJpZGVBbGlnbiAqLwotICAgICAgUk9QUywgLyogWFhYIGR3Um9wc1tERF9ST1BfU1BBQ0VdICovCi0gICAgICB7IDAsIH0sIC8qIFhYWCBkZHNPbGRDYXBzICovCi0gICAgICAxMDAwLCAvKiBkd01pbk92ZXJsYXlTdHJldGNoICovCi0gICAgICAxMDAwLCAvKiBkd01heE92ZXJsYXlTdHJldGNoICovCi0gICAgICAxMDAwLCAvKiBkd01pbkxpdmVWaWRlb1N0cmV0Y2ggKi8KLSAgICAgIDEwMDAsIC8qIGR3TWF4TGl2ZVZpZGVvU3RyZXRjaCAqLwotICAgICAgMTAwMCwgLyogZHdNaW5Id0NvZGVjU3RyZXRjaCAqLwotICAgICAgMTAwMCwgLyogZHdNYXhId0NvZGVjU3RyZXRjaCAqLwotICAgICAgMCwgMCwgMCwgLyogZHdSZXNlcnZlZDEsIDIsIDMgKi8KLSAgICAgIEJMSVRfQ0FQUywgLyogZHdTVkJDYXBzICovCi0gICAgICBDS0VZX0NBUFMsIC8qIGR3U1ZCQ0tleUNhcHMgKi8KLSAgICAgIEZYX0NBUFMsIC8qIGR3U1ZCRlhDYXBzICovCi0gICAgICBST1BTLCAvKiBkd1NWQlJvcHMgKi8KLSAgICAgIEJMSVRfQ0FQUywgLyogZHdWU0JDYXBzICovCi0gICAgICBDS0VZX0NBUFMsIC8qIGR3VlNCQ0tleUNhcHMgKi8KLSAgICAgIEZYX0NBUFMsIC8qIGR3VlNCRlhDYXBzICovCi0gICAgICBST1BTLCAvKiBkd1ZTQlJvcHMgKi8KLSAgICAgIEJMSVRfQ0FQUywgLyogZHdTU0JDYXBzICovCi0gICAgICBDS0VZX0NBUFMsIC8qIGR3U1NCQ0tleUNhcHMgKi8KLSAgICAgIEZYX0NBUFMsIC8qIGR3U1NCRlhDYXBzICovCi0gICAgICBST1BTLCAvKiBkd1NTQlJvcHMgKi8KLSAgICAgIDAsIC8qIGR3TWF4VmlkZW9Qb3J0cyAqLwotICAgICAgMCwgLyogZHdDdXJyVmlkZW9Qb3J0cyAqLwotICAgICAgMCwgLyogPyBkd1NWQkNhcHMyICovCi0gICAgICBCTElUX0NBUFMsIC8qID8gZHdOTFZCQ2FwcyAqLwotICAgICAgMCwgLyogPyBkd05MVkJDYXBzMiAqLwotICAgICAgQ0tFWV9DQVBTLCAvKiBkd05MVkJDS2V5Q2FwcyAqLwotICAgICAgRlhfQ0FQUywgLyogZHdOTFZCRlhDYXBzICovCi0gICAgICBST1BTLCAvKiBkd05MVkJSb3BzICovCi0gICAgICB7IC8qIGRkc0NhcHMgKi8KLQkgIEREU0NBUFNfM0RERVZJQ0UgfCBERFNDQVBTX0FMUEhBIHwgRERTQ0FQU19CQUNLQlVGRkVSIHwgRERTQ0FQU19GTElQCi0JICB8IEREU0NBUFNfRlJPTlRCVUZGRVIgfCBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfT0ZGU0NSRUVOUExBSU4KLQkgIHwgRERTQ0FQU19QQUxFVFRFIHwgRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZCi0JICB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfVklERU9NRU1PUlkgfCBERFNDQVBTX1ZJU0lCTEUKLQkgIHwgRERTQ0FQU19aQlVGRkVSLAotCSAgRERTQ0FQUzJfQ1VCRU1BUCwKLQkgIDAsCi0JICAwCi0gICAgICB9Ci0gICAgfTsKLQotI3VuZGVmIEJMSVRfQ0FQUwotI3VuZGVmIENLRVlfQ0FQUwotI3VuZGVmIEZYX0NBUFMKLSN1bmRlZiBST1BTCi0KLSAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIixUaGlzLHBEcml2ZXJDYXBzLHBIRUxDYXBzKTsKLQotICAgIGlmIChwRHJpdmVyQ2FwcyAhPSBOVUxMKQotCUREX1NUUlVDVF9DT1BZX0JZU0laRShwRHJpdmVyQ2FwcywmY2Fwcyk7Ci0KLSAgICBpZiAocEhFTENhcHMgIT0gTlVMTCkKLQlERF9TVFJVQ1RfQ09QWV9CWVNJWkUocEhFTENhcHMsJmNhcHMpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotI2VuZGlmCi0KLUhSRVNVTFQgV0lOQVBJCi1Vc2VyX0RpcmVjdERyYXdfR2V0RGV2aWNlSWRlbnRpZmllcihMUERJUkVDVERSQVc3IGlmYWNlLAotCQkJCSAgICBMUEREREVWSUNFSURFTlRJRklFUjIgcEREREksCi0JCQkJICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlMDhseClcbiIsaWZhY2UscEREREksZHdGbGFncyk7Ci0gICAgKnBERERJID0gdXNlcl9kZXZpY2U7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKiBHZXREaXNwbGF5TW9kZTogZ2VuZXJpYyAqLwotLyogR2V0Rm91ckNDQ29kZXM6IGdlbmVyaWMgKi8KLS8qIEdldEdESVN1cmZhY2U6ID8/PyAqLwotLyogR2V0TW9uaXRvckZyZXF1ZW5jeTogZ2VuZXJpYyAqLwotLyogR2V0U2NhbkxpbmU6IGdlbmVyaWMgKi8KLS8qIEdldFN1cmZhY2VGcm9tREM6IGdlbmVyaWMgKi8KLS8qIEdldFZlcnRpY2FsQmxhbmtTdGF0dXM6IGdlbmVyaWMgKi8KLS8qIEluaXRpYWxpemU6IGdlbmVyaWMgKi8KLS8qIFJlc3RvcmVBbGxTdXJmYWNlczogZ2VuZXJpYyAqLwotLyogUmVzdG9yZURpc3BsYXlNb2RlOiBnZW5lcmljICovCi0vKiBTZXRDb29wZXJhdGl2ZUxldmVsOiA/Pz8gKi8KLQotSFJFU1VMVCBXSU5BUEkKLVVzZXJfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd1dpZHRoLAotCQkJICAgICAgIERXT1JEIGR3SGVpZ2h0LCBEV09SRCBkd0JQUCwKLQkJCSAgICAgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKQotewotICAgIElEaXJlY3REcmF3SW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd0ltcGwgKilpZmFjZTsKLQotICAgIGNvbnN0IEREUElYRUxGT1JNQVQqIHBpeGVsZm9ybWF0OwotICAgIERFVk1PREVXIGRldm1vZGU7Ci0gICAgTE9ORyBwaXRjaDsKLQotICAgIFRSQUNFKCIoJXApLT4oJWxkeCVsZHglbGQsJWxkIEh6LCUwOGx4KVxuIixUaGlzLGR3V2lkdGgsZHdIZWlnaHQsZHdCUFAsZHdSZWZyZXNoUmF0ZSxkd0ZsYWdzKTsKLSAgICBkZXZtb2RlLmRtRmllbGRzID0gRE1fQklUU1BFUlBFTCB8IERNX1BFTFNXSURUSCB8IERNX1BFTFNIRUlHSFQ7Ci0gICAgZGV2bW9kZS5kbUJpdHNQZXJQZWwgPSBkd0JQUDsKLSAgICBkZXZtb2RlLmRtUGVsc1dpZHRoICA9IGR3V2lkdGg7Ci0gICAgZGV2bW9kZS5kbVBlbHNIZWlnaHQgPSBkd0hlaWdodDsKLSAgICAvKiAnMCcgbWVhbnMgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBpZiAoZHdSZWZyZXNoUmF0ZSAhPSAwKSAKLSAgICB7Ci0JZGV2bW9kZS5kbUZpZWxkcyB8PSBETV9ESVNQTEFZRlJFUVVFTkNZOwotCWRldm1vZGUuZG1EaXNwbGF5RnJlcXVlbmN5ID0gZHdSZWZyZXNoUmF0ZTsKLSAgICB9Ci0gICAgaWYgKENoYW5nZURpc3BsYXlTZXR0aW5nc0V4VyhOVUxMLCAmZGV2bW9kZSwgTlVMTCwgQ0RTX0ZVTExTQ1JFRU4sIE5VTEwpICE9IERJU1BfQ0hBTkdFX1NVQ0NFU1NGVUwpCi0JcmV0dXJuIERERVJSX0lOVkFMSURNT0RFOwotCi0gICAgcGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdF9mb3JfZGVwdGgoZHdCUFApOwotICAgIGlmIChwaXhlbGZvcm1hdCA9PSBOVUxMKQotICAgIHsKLQlhc3NlcnQoMCk7Ci0JcmV0dXJuIERERVJSX0dFTkVSSUM7Ci0gICAgfQotCi0gICAgcGl0Y2ggPSBERFJBV193aWR0aF9icHBfdG9fcGl0Y2goZHdXaWR0aCwgZHdCUFApOwotICAgIHJldHVybiBNYWluX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoaWZhY2UsIGR3V2lkdGgsIGR3SGVpZ2h0LCBwaXRjaCwKLQkJCQkJICBkd1JlZnJlc2hSYXRlLCBkd0ZsYWdzLCBwaXhlbGZvcm1hdCk7Ci19Ci0KLS8qIFN0YXJ0TW9kZVRlc3Q6ID8/PyAqLwotLyogVGVzdENvb3BlcmF0aXZlTGV2ZWw6IGdlbmVyaWM/ICovCi0vKiBXYWl0Rm9yVmVydGljYWxCbGFuazogPz8/ICovCi0KLXN0YXRpYyBjb25zdCBJRGlyZWN0RHJhdzdWdGJsIFVzZXJfRGlyZWN0RHJhd19WVGFibGUgPQotewotICAgIE1haW5fRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSwKLSAgICBNYWluX0RpcmVjdERyYXdfQWRkUmVmLAotICAgIE1haW5fRGlyZWN0RHJhd19SZWxlYXNlLAotICAgIE1haW5fRGlyZWN0RHJhd19Db21wYWN0LAotICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAotICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVQYWxldHRlLAotICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlLAotICAgIFVzZXJfRGlyZWN0RHJhd19FbnVtRGlzcGxheU1vZGVzLAotICAgIE1haW5fRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMsCi0gICAgTWFpbl9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3X0dldENhcHMsCi0gICAgTWFpbl9EaXJlY3REcmF3X0dldERpc3BsYXlNb2RlLAotICAgIE1haW5fRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKLSAgICBNYWluX0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZSwKLSAgICBNYWluX0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKLSAgICBNYWluX0RpcmVjdERyYXdfR2V0U2NhbkxpbmUsCi0gICAgTWFpbl9EaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgTWFpbl9EaXJlY3REcmF3X0luaXRpYWxpemUsCi0gICAgTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZSwKLSAgICBNYWluX0RpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBVc2VyX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUsCi0gICAgTWFpbl9EaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotICAgIE1haW5fRGlyZWN0RHJhd19HZXRBdmFpbGFibGVWaWRNZW0sCi0gICAgTWFpbl9EaXJlY3REcmF3X0dldFN1cmZhY2VGcm9tREMsCi0gICAgTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVBbGxTdXJmYWNlcywKLSAgICBNYWluX0RpcmVjdERyYXdfVGVzdENvb3BlcmF0aXZlTGV2ZWwsCi0gICAgVXNlcl9EaXJlY3REcmF3X0dldERldmljZUlkZW50aWZpZXIsCi0gICAgTWFpbl9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QsCi0gICAgTWFpbl9EaXJlY3REcmF3X0V2YWx1YXRlTW9kZQotfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXdfdXRpbHMuYyBiL2RsbHMvZGRyYXcvZGRyYXdfdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3ZGQyZi4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L2RkcmF3X3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NTEgKzAsMCBAQAotLyoKLSAqIERpcmVjdERyYXcgaGVscGVyIGZ1bmN0aW9ucwotICoKLSAqIENvcHlyaWdodCAxOTk3LTIwMDAgTWFyY3VzIE1laXNzbmVyCi0gKiBDb3B5cmlnaHQgMTk5OCBMaW9uZWwgVWxtZXIgKG1vc3Qgb2YgRGlyZWN0M0Qgc3R1ZmYpCi0gKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLSNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCi0jZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKLQotI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ3aW5kZWYuaCIKLSNpbmNsdWRlICJ3aW5iYXNlLmgiCi0jaW5jbHVkZSAid2luZ2RpLmgiCi0jaW5jbHVkZSAiZGRyYXcuaCIKLQotI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKLQotV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAxNiAvIDE1IGJwcCB0byBwYWxldHRpemVkIDggYnBwCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZCBwaXhlbF9jb252ZXJ0XzE2X3RvXzgodm9pZCAqc3JjLCB2b2lkICpkc3QsIERXT1JEIHdpZHRoLCBEV09SRCBoZWlnaHQsIExPTkcgcGl0Y2gsIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGUpIHsKLSAgICB1bnNpZ25lZCBjaGFyICAqY19zcmMgPSAodW5zaWduZWQgY2hhciAgKikgc3JjOwotICAgIHVuc2lnbmVkIHNob3J0ICpjX2RzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBkc3Q7Ci0gICAgaW50IHk7Ci0KLSAgICBpZiAocGFsZXR0ZSAhPSBOVUxMKSB7Ci0JY29uc3QgdW5zaWduZWQgaW50ICogcGFsID0gKHVuc2lnbmVkIGludCAqKSBwYWxldHRlLT5zY3JlZW5fcGFsZW50czsKLQotCWZvciAoeSA9IGhlaWdodDsgeS0tOyApIHsKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotCSAgICAvKiBnY2MgZ2VuZXJhdGVzIHNsaWdodGx5IGluZWZmaWNpZW50IGNvZGUgZm9yIHRoZSB0aGUgY29weS9sb29rdXAsCi0JICAgICAqIGl0IGdlbmVyYXRlcyBvbmUgZXhjZXNzIG1lbW9yeSBhY2Nlc3MgKHRvIHBhbCkgcGVyIHBpeGVsLiBTaW5jZQotCSAgICAgKiB3ZSBrbm93IHRoYXQgcGFsIGlzIG5vdCBtb2RpZmllZCBieSB0aGUgbWVtb3J5IHdyaXRlIHdlIGNhbgotCSAgICAgKiBwdXQgaXQgaW50byBhIHJlZ2lzdGVyIGFuZCByZWR1Y2UgdGhlIG51bWJlciBvZiBtZW1vcnkgYWNjZXNzZXMKLQkgICAgICogZnJvbSA0IHRvIDMgcHAuIFRoZXJlIGFyZSB0d28geG9yIGVheCxlYXggdG8gYXZvaWQgcGlwZWxpbmUKLQkgICAgICogc3RhbGxzLiAoVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgZmFzdGVzdCBtZXRob2QuKQotCSAgICAgKi8KLQkgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JICAgICJ4b3IgJSVlYXgsJSVlYXhcbiIKLQkgICAgIjE6XG4iCi0JICAgICIgICAgbG9kc2JcbiIKLQkgICAgIiAgICBtb3Z3ICglJWVkeCwlJWVheCw0KSwlJWF4XG4iCi0JICAgICIgICAgc3Rvc3dcbiIKLQkgICAgIgkgICB4b3IgJSVlYXgsJSVlYXhcbiIKLQkgICAgIiAgICBsb29wIDFiXG4iCi0JICAgIDogIj1TIiAoY19zcmMpLCAiPUQiIChjX2RzdCkKLQkgICAgOiAiUyIgKGNfc3JjKSwgIkQiIChjX2RzdCkgLCAiYyIgKHdpZHRoKSwgImQiIChwYWwpCi0JICAgIDogImVheCIsICJjYyIsICJtZW1vcnkiCi0JICAgICk7Ci0JICAgIGNfc3JjKz0ocGl0Y2gtd2lkdGgpOwotI2Vsc2UKLQkgICAgdW5zaWduZWQgY2hhciAqIHNyY2xpbmVlbmQgPSBjX3NyYyt3aWR0aDsKLQkgICAgd2hpbGUgKGNfc3JjIDwgc3JjbGluZWVuZCkKLQkJKmNfZHN0KysgPSBwYWxbKmNfc3JjKytdOwotCSAgICBjX3NyYys9KHBpdGNoLXdpZHRoKTsKLSNlbmRpZgotCX0KLSAgICB9IGVsc2UgewotCUZJWE1FKCJObyBwYWxldHRlIHNldC4uLlxuIik7Ci0JbWVtc2V0KGRzdCwgMCwgd2lkdGggKiBoZWlnaHQgKiAyKTsKLSAgICB9Ci19Ci1zdGF0aWMgdm9pZCBwYWxldHRlX2NvbnZlcnRfMTZfdG9fOCgKLQlMUFBBTEVUVEVFTlRSWSBwYWxlbnQsIHZvaWQgKnNjcmVlbl9wYWxldHRlLCBEV09SRCBzdGFydCwgRFdPUkQgY291bnQKLSkgewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGludCAqcGFsID0gKHVuc2lnbmVkIGludCAqKSBzY3JlZW5fcGFsZXR0ZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCXBhbFtzdGFydCArIGldID0gKCgoKCh1bnNpZ25lZCBzaG9ydCkgcGFsZW50W2ldLnBlUmVkKSAmIDB4RjgpIDw8IDgpIHwKLQkJCSAgKCgoKHVuc2lnbmVkIHNob3J0KSBwYWxlbnRbaV0ucGVCbHVlKSAmIDB4RjgpID4+IDMpIHwKLQkJCSAgKCgoKHVuc2lnbmVkIHNob3J0KSBwYWxlbnRbaV0ucGVHcmVlbikgJiAweEZDKSA8PCAzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbGV0dGVfY29udmVydF8xNV90b184KAotCUxQUEFMRVRURUVOVFJZIHBhbGVudCwgdm9pZCAqc2NyZWVuX3BhbGV0dGUsIERXT1JEIHN0YXJ0LCBEV09SRCBjb3VudAotKSB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdW5zaWduZWQgaW50ICpwYWwgPSAodW5zaWduZWQgaW50ICopIHNjcmVlbl9wYWxldHRlOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JcGFsW3N0YXJ0ICsgaV0gPSAoKCgoKHVuc2lnbmVkIHNob3J0KSBwYWxlbnRbaV0ucGVSZWQpICYgMHhGOCkgPDwgNykgfAotCQkJICAoKCgodW5zaWduZWQgc2hvcnQpIHBhbGVudFtpXS5wZUJsdWUpICYgMHhGOCkgPj4gMykgfAotCQkJICAoKCgodW5zaWduZWQgc2hvcnQpIHBhbGVudFtpXS5wZUdyZWVuKSAmIDB4RjgpIDw8IDIpKTsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgMjQgdG8gcGFsZXR0aXplZCA4IGJwcAotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQgcGl4ZWxfY29udmVydF8yNF90b184KAotCXZvaWQgKnNyYywgdm9pZCAqZHN0LCBEV09SRCB3aWR0aCwgRFdPUkQgaGVpZ2h0LCBMT05HIHBpdGNoLAotCUlEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGUKLSkgewotICAgIHVuc2lnbmVkIGNoYXIgICpjX3NyYyA9ICh1bnNpZ25lZCBjaGFyICAqKSBzcmM7Ci0gICAgdW5zaWduZWQgY2hhciAqY19kc3QgPSAodW5zaWduZWQgY2hhciAqKSBkc3Q7Ci0gICAgaW50IHk7Ci0KLSAgICBpZiAocGFsZXR0ZSAhPSBOVUxMKSB7Ci0JY29uc3QgdW5zaWduZWQgaW50ICpwYWwgPSAodW5zaWduZWQgaW50ICopIHBhbGV0dGUtPnNjcmVlbl9wYWxlbnRzOwotCi0JZm9yICh5ID0gaGVpZ2h0OyB5LS07ICkgewotCSAgICB1bnNpZ25lZCBjaGFyICogc3JjbGluZWVuZCA9IGNfc3JjK3dpZHRoOwotCSAgICB3aGlsZSAoY19zcmMgPCBzcmNsaW5lZW5kICkgewotCQlyZWdpc3RlciBsb25nIHBpeGVsID0gcGFsWypjX3NyYysrXTsKLQkJKmNfZHN0KysgPSBwaXhlbDsKLQkJKmNfZHN0KysgPSBwaXhlbD4+ODsKLQkJKmNfZHN0KysgPSBwaXhlbD4+MTY7Ci0JICAgIH0KLQkgICAgY19zcmMrPShwaXRjaC13aWR0aCk7Ci0JfQotICAgIH0gZWxzZSB7Ci0JRklYTUUoIk5vIHBhbGV0dGUgc2V0Li4uXG4iKTsKLQltZW1zZXQoZHN0LCAwLCB3aWR0aCAqIGhlaWdodCAqIDMpOwotICAgIH0KLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgMzIgYnBwIHRvIHBhbGV0dGl6ZWQgOCBicHAKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkIHBpeGVsX2NvbnZlcnRfMzJfdG9fOCgKLQl2b2lkICpzcmMsIHZvaWQgKmRzdCwgRFdPUkQgd2lkdGgsIERXT1JEIGhlaWdodCwgTE9ORyBwaXRjaCwKLQlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlCi0pIHsKLSAgICB1bnNpZ25lZCBjaGFyICAqY19zcmMgPSAodW5zaWduZWQgY2hhciAgKikgc3JjOwotICAgIHVuc2lnbmVkIGludCAqY19kc3QgPSAodW5zaWduZWQgaW50ICopIGRzdDsKLSAgICBpbnQgeTsKLQotICAgIGlmIChwYWxldHRlICE9IE5VTEwpIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnBhbCA9ICh1bnNpZ25lZCBpbnQgKikgcGFsZXR0ZS0+c2NyZWVuX3BhbGVudHM7Ci0KLQlmb3IgKHkgPSBoZWlnaHQ7IHktLTsgKSB7Ci0jaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLQkgICAgLyogU2VlIGNvbW1lbnQgaW4gcGl4ZWxfY29udmVydF8xNl90b184ICovCi0JICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAotCSAgICAieG9yICUlZWF4LCUlZWF4XG4iCi0JICAgICIxOlxuIgotCSAgICAiICAgIGxvZHNiXG4iCi0JICAgICIgICAgbW92bCAoJSVlZHgsJSVlYXgsNCksJSVlYXhcbiIKLQkgICAgIiAgICBzdG9zbFxuIgotCSAgICAiCSAgIHhvciAlJWVheCwlJWVheFxuIgotCSAgICAiICAgIGxvb3AgMWJcbiIKLQkgICAgOiAiPVMiIChjX3NyYyksICI9RCIgKGNfZHN0KQotCSAgICA6ICJTIiAoY19zcmMpLCAiRCIgKGNfZHN0KSAsICJjIiAod2lkdGgpLCAiZCIgKHBhbCkKLQkgICAgOiAiZWF4IiwgImNjIiwgIm1lbW9yeSIKLQkgICAgKTsKLQkgICAgY19zcmMrPShwaXRjaC13aWR0aCk7Ci0jZWxzZQotCSAgICB1bnNpZ25lZCBjaGFyICogc3JjbGluZWVuZCA9IGNfc3JjK3dpZHRoOwotCSAgICB3aGlsZSAoY19zcmMgPCBzcmNsaW5lZW5kICkKLQkJKmNfZHN0KysgPSBwYWxbKmNfc3JjKytdOwotCSAgICBjX3NyYys9KHBpdGNoLXdpZHRoKTsKLSNlbmRpZgotCX0KLSAgICB9IGVsc2UgewotCUZJWE1FKCJObyBwYWxldHRlIHNldC4uLlxuIik7Ci0JbWVtc2V0KGRzdCwgMCwgd2lkdGggKiBoZWlnaHQgKiA0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbGV0dGVfY29udmVydF8yNF90b184KAotCUxQUEFMRVRURUVOVFJZIHBhbGVudCwgdm9pZCAqc2NyZWVuX3BhbGV0dGUsIERXT1JEIHN0YXJ0LCBEV09SRCBjb3VudAotKSB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdW5zaWduZWQgaW50ICpwYWwgPSAodW5zaWduZWQgaW50ICopIHNjcmVlbl9wYWxldHRlOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JcGFsW3N0YXJ0ICsgaV0gPSAoKCgodW5zaWduZWQgaW50KSBwYWxlbnRbaV0ucGVSZWQpIDw8IDE2KSB8Ci0JCQkgICgoKHVuc2lnbmVkIGludCkgcGFsZW50W2ldLnBlR3JlZW4pIDw8IDgpIHwKLQkJCSAgICgodW5zaWduZWQgaW50KSBwYWxlbnRbaV0ucGVCbHVlKSk7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgIDE2IGJwcCB0byAxNSBicHAKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkIHBpeGVsX2NvbnZlcnRfMTVfdG9fMTYoCi0Jdm9pZCAqc3JjLCB2b2lkICpkc3QsIERXT1JEIHdpZHRoLCBEV09SRCBoZWlnaHQsIExPTkcgcGl0Y2gsCi0JSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsZXR0ZQotKSB7Ci0gICAgdW5zaWduZWQgc2hvcnQgKmNfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopIHNyYzsKLSAgICB1bnNpZ25lZCBzaG9ydCAqY19kc3QgPSAodW5zaWduZWQgc2hvcnQgKikgZHN0OwotICAgIGludCB5OwotCi0gICAgZm9yICh5ID0gaGVpZ2h0OyB5LS07ICkgewotCXVuc2lnbmVkIHNob3J0ICogc3JjbGluZWVuZCA9IGNfc3JjK3dpZHRoOwotCXdoaWxlIChjX3NyYyA8IHNyY2xpbmVlbmQgKSB7Ci0JICAgIHVuc2lnbmVkIHNob3J0IHZhbCA9ICpjX3NyYysrOwotCSAgICAqY19kc3QrKz0oKHZhbCYweEZGQzApPj4xKXwodmFsJjB4MDAxZik7Ci0JfQotCWNfc3JjKz0oKHBpdGNoLzIpLXdpZHRoKTsKLSAgICB9Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgIDMyIGJwcCB0byAxNiBicHAKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkIHBpeGVsX2NvbnZlcnRfMzJfdG9fMTYoCi0Jdm9pZCAqc3JjLCB2b2lkICpkc3QsIERXT1JEIHdpZHRoLCBEV09SRCBoZWlnaHQsIExPTkcgcGl0Y2gsCi0JSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsZXR0ZQotKSB7Ci0gICAgdW5zaWduZWQgc2hvcnQgKmNfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopIHNyYzsKLSAgICB1bnNpZ25lZCBpbnQgKmNfZHN0ID0gKHVuc2lnbmVkIGludCAqKSBkc3Q7Ci0gICAgaW50IHk7Ci0KLSAgICBmb3IgKHkgPSBoZWlnaHQ7IHktLTsgKSB7Ci0JdW5zaWduZWQgc2hvcnQgKiBzcmNsaW5lZW5kID0gY19zcmMrd2lkdGg7Ci0Jd2hpbGUgKGNfc3JjIDwgc3JjbGluZWVuZCApIHsKLQkgICAgKmNfZHN0KysgPSAoKCgqY19zcmMgJiAweEY4MDApIDw8IDgpIHwKLQkJCSgoKmNfc3JjICYgMHgwN0UwKSA8PCA1KSB8Ci0JCQkoKCpjX3NyYyAmIDB4MDAxRikgPDwgMykpOwotCSAgICBjX3NyYysrOwotCX0KLQljX3NyYys9KChwaXRjaC8yKS13aWR0aCk7Ci0gICAgfQotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAzMiBicHAgdG8gMjQgYnBwCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZCBwaXhlbF9jb252ZXJ0XzMyX3RvXzI0KAotCXZvaWQgKnNyYywgdm9pZCAqZHN0LCBEV09SRCB3aWR0aCwgRFdPUkQgaGVpZ2h0LCBMT05HIHBpdGNoLAotCUlEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGUKLSkgewotICAgIHVuc2lnbmVkIGNoYXIgKmNfc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgc3JjOwotICAgIHVuc2lnbmVkIGludCAqY19kc3QgPSAodW5zaWduZWQgaW50ICopIGRzdDsKLSAgICBpbnQgeTsKLQotICAgIGZvciAoeSA9IGhlaWdodDsgeS0tOyApIHsKLQl1bnNpZ25lZCBjaGFyICogc3JjbGluZWVuZCA9IGNfc3JjK3dpZHRoKjM7Ci0Jd2hpbGUgKGNfc3JjIDwgc3JjbGluZWVuZCApIHsKLQkgICAgLyogRklYTUU6IHdyb25nIGZvciBiaWcgZW5kaWFuICovCi0JICAgIG1lbWNweShjX2RzdCxjX3NyYywzKTsKLQkgICAgY19zcmMrPTM7Ci0JICAgIGNfZHN0Kys7Ci0JfQotCWNfc3JjKz1waXRjaC13aWR0aCozOwotICAgIH0KLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgMTYgYnBwIHRvIDMyIGJwcAotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQgcGl4ZWxfY29udmVydF8xNl90b18zMigKLQl2b2lkICpzcmMsIHZvaWQgKmRzdCwgRFdPUkQgd2lkdGgsIERXT1JEIGhlaWdodCwgTE9ORyBwaXRjaCwKLQlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlCi0pIHsKLSAgICB1bnNpZ25lZCBpbnQgKmNfc3JjID0gKHVuc2lnbmVkIGludCAqKSBzcmM7Ci0gICAgdW5zaWduZWQgc2hvcnQgKmNfZHN0ID0gKHVuc2lnbmVkIHNob3J0ICopIGRzdDsKLSAgICBpbnQgeTsKLQotICAgIGZvciAoeSA9IGhlaWdodDsgeS0tOyApIHsKLQl1bnNpZ25lZCBpbnQgKiBzcmNsaW5lZW5kID0gY19zcmMrd2lkdGg7Ci0Jd2hpbGUgKGNfc3JjIDwgc3JjbGluZWVuZCApIHsKLQkgICAgKmNfZHN0KysgPSAoKCgqY19zcmMgJiAweEY4MDAwMCkgPj4gOCkgfAotCQkJKCgqY19zcmMgJiAweDAwRkMwMCkgPj4gNSkgfAotCQkJKCgqY19zcmMgJiAweDAwMDBGOCkgPj4gMykpOwotCSAgICBjX3NyYysrOwotCX0KLQljX3NyYys9KChwaXRjaC80KS13aWR0aCk7Ci0gICAgfQotfQotCi1Db252ZXJ0IE1vZGVFbXVsYXRpb25zWzhdID0gewotICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDI0LCAyNCwgMHhGRjAwMDAsIDB4MDBGRjAwLCAweDAwMDBGRiB9LCB7IHBpeGVsX2NvbnZlcnRfMzJfdG9fMjQsIE5VTEwgfSB9LAotICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDE2LCAxNiwgMHhGODAwLCAweDA3RTAsIDB4MDAxRiB9LCB7IHBpeGVsX2NvbnZlcnRfMzJfdG9fMTYsIE5VTEwgfSB9LAotICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8zMl90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzI0X3RvXzggfSB9LAotICB7IHsgMjQsIDI0LCAgIDB4RkYwMDAwLCAgIDB4MDBGRjAwLCAgIDB4MDAwMEZGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8yNF90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzI0X3RvXzggfSB9LAotICB7IHsgMTYsIDE1LCAgICAgMHg3QzAwLCAgICAgMHgwM0UwLCAgICAgMHgwMDFGIH0sIHsgIDE2LDE2LCAweGY4MDAsIDB4MDdlMCwgMHgwMDFmIH0sIHsgcGl4ZWxfY29udmVydF8xNV90b18xNiwgIE5VTEwgfSB9LAotICB7IHsgMTYsIDE2LCAgICAgMHhGODAwLCAgICAgMHgwN0UwLCAgICAgMHgwMDFGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8xNl90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzE2X3RvXzggfSB9LAotICB7IHsgMTYsIDE1LCAgICAgMHg3QzAwLCAgICAgMHgwM0UwLCAgICAgMHgwMDFGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8xNl90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzE1X3RvXzggfSB9LAotICB7IHsgMTYsIDE2LCAgICAgMHhGODAwLCAgICAgMHgwN0UwLCAgICAgMHgwMDFGIH0sIHsgIDMyLCAyNCwgMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDBGRiB9LCB7IHBpeGVsX2NvbnZlcnRfMTZfdG9fMzIsIE5VTEwgfSB9Ci19OwotCi12b2lkIEREUkFXX0NvbnZlcnRfRERTQ0FQU18xX1RvXzIoY29uc3QgRERTQ0FQUyogcEluLCBERFNDQVBTMiogcE91dCkKLXsKLSAgICAvKiAyIGFkZHMgdGhyZWUgYWRkaXRpb25hbCBjYXBzIGZpZWxkcyB0byB0aGUgZW5kLiBCb3RoIHZlcnNpb25zCi0gICAgICogYXJlIHVudmVyc2lvbmVkLiAqLwotICAgIHBPdXQtPmR3Q2FwcyA9IHBJbi0+ZHdDYXBzOwotICAgIHBPdXQtPmR3Q2FwczIgPSAwOwotICAgIHBPdXQtPmR3Q2FwczMgPSAwOwotICAgIHBPdXQtPmR3Q2FwczQgPSAwOwotfQotCi12b2lkIEREUkFXX0NvbnZlcnRfRERERVZJQ0VJREVOVElGSUVSXzJfVG9fMShjb25zdCBERERFVklDRUlERU5USUZJRVIyKiBwSW4sCi0JCQkJCSAgICAgRERERVZJQ0VJREVOVElGSUVSKiBwT3V0KQotewotICAgIC8qIDIgYWRkcyBhIGR3V0hRTExldmVsIGZpZWxkIHRvIHRoZSBlbmQuIEJvdGggc3RydWN0dXJlcyBhcmUKLSAgICAgKiB1bnZlcnNpb25lZC4gKi8KLSAgICBtZW1jcHkocE91dCwgcEluLCBzaXplb2YoKnBPdXQpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCWRlYnVnIG91dHB1dCBmdW5jdGlvbnMKLSAqLwotdm9pZCBERFJBV19kdW1wX2ZsYWdzXyhEV09SRCBmbGFncywgY29uc3QgZmxhZ19pbmZvKiBuYW1lcywKLQkJICAgICAgIHNpemVfdCBudW1fbmFtZXMsIGludCBuZXdsaW5lKQotewotICAgIHVuc2lnbmVkIGludAlpOwotCi0gICAgZm9yIChpPTA7IGkgPCBudW1fbmFtZXM7IGkrKykKLSAgICAgICAgaWYgKChmbGFncyAmIG5hbWVzW2ldLnZhbCkgfHwgICAgICAvKiBzdGFuZGFyZCBmbGFnIHZhbHVlICovCi0JICAgICgoIWZsYWdzKSAmJiAoIW5hbWVzW2ldLnZhbCkpKSAvKiB6ZXJvIHZhbHVlIG9ubHkgKi8KLQkgICAgRFBSSU5URigiJXMgIiwgbmFtZXNbaV0ubmFtZSk7Ci0KLSAgICBpZiAobmV3bGluZSkKLSAgICAgICAgRFBSSU5URigiXG4iKTsKLX0KLQotdm9pZCBERFJBV19kdW1wX21lbWJlcnMoRFdPUkQgZmxhZ3MsIGNvbnN0IHZvaWQqIGRhdGEsCi0JCQljb25zdCBtZW1iZXJfaW5mbyogbWVtcywgc2l6ZV90IG51bV9tZW1zKQotewotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgZm9yIChpPTA7IGkgPCBudW1fbWVtczsgaSsrKQotICAgIHsKLQlpZiAobWVtc1tpXS52YWwgJiBmbGFncykKLQl7Ci0JICAgIERQUklOVEYoIiAtICVzIDogIiwgbWVtc1tpXS5uYW1lKTsKLQkgICAgbWVtc1tpXS5mdW5jKChjb25zdCBjaGFyICopZGF0YSArIG1lbXNbaV0ub2Zmc2V0KTsKLQkgICAgRFBSSU5URigiXG4iKTsKLQl9Ci0gICAgfQotfQotCi12b2lkIEREUkFXX2R1bXBfRERCTFRGWChEV09SRCBmbGFnbWFzaykKLXsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQotCXsKLQkgICAgRkUoRERCTFRGWF9BUklUSFNUUkVUQ0hZKSwKLQkgICAgRkUoRERCTFRGWF9NSVJST1JMRUZUUklHSFQpLAotCSAgICBGRShEREJMVEZYX01JUlJPUlVQRE9XTiksCi0JICAgIEZFKEREQkxURlhfTk9URUFSSU5HKSwKLQkgICAgRkUoRERCTFRGWF9ST1RBVEUxODApLAotCSAgICBGRShEREJMVEZYX1JPVEFURTI3MCksCi0JICAgIEZFKEREQkxURlhfUk9UQVRFOTApLAotCSAgICBGRShEREJMVEZYX1pCVUZGRVJSQU5HRSksCi0JICAgIEZFKEREQkxURlhfWkJVRkZFUkJBU0VERVNUKQotCX07Ci0KLSAgICBERFJBV19kdW1wX2ZsYWdzKGZsYWdtYXNrLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pKTsKLX0KLQotdm9pZCBERFJBV19kdW1wX0REQkxURkFTVChEV09SRCBmbGFnbWFzaykKLXsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQotCXsKLQkgICAgRkUoRERCTFRGQVNUX05PQ09MT1JLRVkpLAotCSAgICBGRShEREJMVEZBU1RfU1JDQ09MT1JLRVkpLAotCSAgICBGRShEREJMVEZBU1RfREVTVENPTE9SS0VZKSwKLQkgICAgRkUoRERCTFRGQVNUX1dBSVQpCi0JfTsKLQotICAgIEREUkFXX2R1bXBfZmxhZ3MoZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwotfQotCi12b2lkIEREUkFXX2R1bXBfRERCTFQoRFdPUkQgZmxhZ21hc2spCi17Ci0gICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KLQl7Ci0JICAgIEZFKEREQkxUX0FMUEhBREVTVCksCi0JICAgIEZFKEREQkxUX0FMUEhBREVTVENPTlNUT1ZFUlJJREUpLAotCSAgICBGRShEREJMVF9BTFBIQURFU1RORUcpLAotCSAgICBGRShEREJMVF9BTFBIQURFU1RTVVJGQUNFT1ZFUlJJREUpLAotCSAgICBGRShEREJMVF9BTFBIQUVER0VCTEVORCksCi0JICAgIEZFKEREQkxUX0FMUEhBU1JDKSwKLQkgICAgRkUoRERCTFRfQUxQSEFTUkNDT05TVE9WRVJSSURFKSwKLQkgICAgRkUoRERCTFRfQUxQSEFTUkNORUcpLAotCSAgICBGRShEREJMVF9BTFBIQVNSQ1NVUkZBQ0VPVkVSUklERSksCi0JICAgIEZFKEREQkxUX0FTWU5DKSwKLQkgICAgRkUoRERCTFRfQ09MT1JGSUxMKSwKLQkgICAgRkUoRERCTFRfRERGWCksCi0JICAgIEZFKEREQkxUX0REUk9QUyksCi0JICAgIEZFKEREQkxUX0tFWURFU1QpLAotCSAgICBGRShEREJMVF9LRVlERVNUT1ZFUlJJREUpLAotCSAgICBGRShEREJMVF9LRVlTUkMpLAotCSAgICBGRShEREJMVF9LRVlTUkNPVkVSUklERSksCi0JICAgIEZFKEREQkxUX1JPUCksCi0JICAgIEZFKEREQkxUX1JPVEFUSU9OQU5HTEUpLAotCSAgICBGRShEREJMVF9aQlVGRkVSKSwKLQkgICAgRkUoRERCTFRfWkJVRkZFUkRFU1RDT05TVE9WRVJSSURFKSwKLQkgICAgRkUoRERCTFRfWkJVRkZFUkRFU1RPVkVSUklERSksCi0JICAgIEZFKEREQkxUX1pCVUZGRVJTUkNDT05TVE9WRVJSSURFKSwKLQkgICAgRkUoRERCTFRfWkJVRkZFUlNSQ09WRVJSSURFKSwKLQkgICAgRkUoRERCTFRfV0FJVCksCi0JICAgIEZFKEREQkxUX0RFUFRIRklMTCksCi0JICAgIEZFKEREQkxUX0RPTk9UV0FJVCkKLSAgICB9OwotCi0gICAgRERSQVdfZHVtcF9mbGFncyhmbGFnbWFzaywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSk7Ci19Ci0KLXZvaWQgRERSQVdfZHVtcF9ERFNDQVBTMihjb25zdCBERFNDQVBTMiAqaW4pCi17Ci0gICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0gewotICAgICAgICBGRShERFNDQVBTX1JFU0VSVkVEMSksCi0gICAgICAgIEZFKEREU0NBUFNfQUxQSEEpLAotICAgICAgICBGRShERFNDQVBTX0JBQ0tCVUZGRVIpLAotICAgICAgICBGRShERFNDQVBTX0NPTVBMRVgpLAotICAgICAgICBGRShERFNDQVBTX0ZMSVApLAotICAgICAgICBGRShERFNDQVBTX0ZST05UQlVGRkVSKSwKLSAgICAgICAgRkUoRERTQ0FQU19PRkZTQ1JFRU5QTEFJTiksCi0gICAgICAgIEZFKEREU0NBUFNfT1ZFUkxBWSksCi0gICAgICAgIEZFKEREU0NBUFNfUEFMRVRURSksCi0gICAgICAgIEZFKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpLAotICAgICAgICBGRShERFNDQVBTX1BSSU1BUllTVVJGQUNFTEVGVCksCi0gICAgICAgIEZFKEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKLSAgICAgICAgRkUoRERTQ0FQU19URVhUVVJFKSwKLSAgICAgICAgRkUoRERTQ0FQU18zRERFVklDRSksCi0gICAgICAgIEZFKEREU0NBUFNfVklERU9NRU1PUlkpLAotICAgICAgICBGRShERFNDQVBTX1ZJU0lCTEUpLAotICAgICAgICBGRShERFNDQVBTX1dSSVRFT05MWSksCi0gICAgICAgIEZFKEREU0NBUFNfWkJVRkZFUiksCi0gICAgICAgIEZFKEREU0NBUFNfT1dOREMpLAotICAgICAgICBGRShERFNDQVBTX0xJVkVWSURFTyksCi0gICAgICAgIEZFKEREU0NBUFNfSFdDT0RFQyksCi0gICAgICAgIEZFKEREU0NBUFNfTU9ERVgpLAotICAgICAgICBGRShERFNDQVBTX01JUE1BUCksCi0gICAgICAgIEZFKEREU0NBUFNfUkVTRVJWRUQyKSwKLSAgICAgICAgRkUoRERTQ0FQU19BTExPQ09OTE9BRCksCi0gICAgICAgIEZFKEREU0NBUFNfVklERU9QT1JUKSwKLSAgICAgICAgRkUoRERTQ0FQU19MT0NBTFZJRE1FTSksCi0gICAgICAgIEZFKEREU0NBUFNfTk9OTE9DQUxWSURNRU0pLAotICAgICAgICBGRShERFNDQVBTX1NUQU5EQVJEVkdBTU9ERSksCi0gICAgICAgIEZFKEREU0NBUFNfT1BUSU1JWkVEKQotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczJbXSA9IHsKLSAgICAgICAgRkUoRERTQ0FQUzJfSEFSRFdBUkVERUlOVEVSTEFDRSksCi0gICAgICAgIEZFKEREU0NBUFMyX0hJTlREWU5BTUlDKSwKLSAgICAgICAgRkUoRERTQ0FQUzJfSElOVFNUQVRJQyksCi0gICAgICAgIEZFKEREU0NBUFMyX1RFWFRVUkVNQU5BR0UpLAotICAgICAgICBGRShERFNDQVBTMl9SRVNFUlZFRDEpLAotICAgICAgICBGRShERFNDQVBTMl9SRVNFUlZFRDIpLAotICAgICAgICBGRShERFNDQVBTMl9PUEFRVUUpLAotICAgICAgICBGRShERFNDQVBTMl9ISU5UQU5USUFMSUFTSU5HKSwKLSAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUCksCi0gICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVYKSwKLSAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVgpLAotICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWSksCi0gICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVZKSwKLSAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVopLAotICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWiksCi0gICAgICAgIEZFKEREU0NBUFMyX01JUE1BUFNVQkxFVkVMKSwKLSAgICAgICAgRkUoRERTQ0FQUzJfRDNEVEVYVFVSRU1BTkFHRSksCi0gICAgICAgIEZFKEREU0NBUFMyX0RPTk9UUEVSU0lTVCksCi0gICAgICAgIEZFKEREU0NBUFMyX1NURVJFT1NVUkZBQ0VMRUZUKQotICAgIH07Ci0gCi0gICAgRERSQVdfZHVtcF9mbGFnc18oaW4tPmR3Q2FwcywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSwgMCk7Ci0gICAgRERSQVdfZHVtcF9mbGFnc18oaW4tPmR3Q2FwczIsIGZsYWdzMiwgc2l6ZW9mKGZsYWdzMikvc2l6ZW9mKGZsYWdzMlswXSksIDApOwotfQotCi12b2lkIEREUkFXX2R1bXBfRERTQ0FQUyhjb25zdCBERFNDQVBTICppbikgewotICAgIEREU0NBUFMyIGluX2JpczsKLQotICAgIGluX2Jpcy5kd0NhcHMgPSBpbi0+ZHdDYXBzOwotICAgIGluX2Jpcy5kd0NhcHMyID0gMDsKLSAgICBpbl9iaXMuZHdDYXBzMyA9IDA7Ci0gICAgaW5fYmlzLmR3Q2FwczQgPSAwOwotCi0gICAgRERSQVdfZHVtcF9ERFNDQVBTMigmaW5fYmlzKTsKLX0KLQotdm9pZCBERFJBV19kdW1wX3BpeGVsZm9ybWF0X2ZsYWcoRFdPUkQgZmxhZ21hc2spCi17Ci0gICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KLQl7Ci0JICAgIEZFKEREUEZfQUxQSEFQSVhFTFMpLAotCSAgICBGRShERFBGX0FMUEhBKSwKLQkgICAgRkUoRERQRl9GT1VSQ0MpLAotCSAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVENCksCi0JICAgIEZFKEREUEZfUEFMRVRURUlOREVYRURUTzgpLAotCSAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEOCksCi0JICAgIEZFKEREUEZfUkdCKSwKLQkgICAgRkUoRERQRl9DT01QUkVTU0VEKSwKLQkgICAgRkUoRERQRl9SR0JUT1lVViksCi0JICAgIEZFKEREUEZfWVVWKSwKLQkgICAgRkUoRERQRl9aQlVGRkVSKSwKLQkgICAgRkUoRERQRl9QQUxFVFRFSU5ERVhFRDEpLAotCSAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEMiksCi0JICAgIEZFKEREUEZfWlBJWEVMUykKLSAgICB9OwotCi0gICAgRERSQVdfZHVtcF9mbGFnc18oZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSksIDApOwotfQotCi12b2lkIEREUkFXX2R1bXBfcGFsZXR0ZWZvcm1hdChEV09SRCBkd0ZsYWdzKQotewotICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9Ci0JewotCSAgICBGRShERFBDQVBTXzRCSVQpLAotCSAgICBGRShERFBDQVBTXzhCSVRFTlRSSUVTKSwKLQkgICAgRkUoRERQQ0FQU184QklUKSwKLQkgICAgRkUoRERQQ0FQU19JTklUSUFMSVpFKSwKLQkgICAgRkUoRERQQ0FQU19QUklNQVJZU1VSRkFDRSksCi0JICAgIEZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0VMRUZUKSwKLQkgICAgRkUoRERQQ0FQU19BTExPVzI1NiksCi0JICAgIEZFKEREUENBUFNfVlNZTkMpLAotCSAgICBGRShERFBDQVBTXzFCSVQpLAotCSAgICBGRShERFBDQVBTXzJCSVQpLAotCSAgICBGRShERFBDQVBTX0FMUEhBKQotICAgIH07Ci0KLSAgICBERFJBV19kdW1wX2ZsYWdzKGR3RmxhZ3MsIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwotfQotCi12b2lkIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQoY29uc3QgRERQSVhFTEZPUk1BVCAqcGYpIHsKLSAgICBEUFJJTlRGKCIoICIpOwotICAgIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXRfZmxhZyhwZi0+ZHdGbGFncyk7Ci0gICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpIHsKLQlEUFJJTlRGKCIsIGR3Rm91ckNDIGNvZGUgJyVjJWMlYyVjJyAoMHglMDhseCkgLSAlbGQgYml0cyBwZXIgcGl4ZWwiLAotCQkodW5zaWduZWQgY2hhcikoIHBmLT5kd0ZvdXJDQyAgICAgJjB4ZmYpLAotCQkodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+IDgpJjB4ZmYpLAotCQkodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MTYpJjB4ZmYpLAotCQkodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MjQpJjB4ZmYpLAotCQlwZi0+ZHdGb3VyQ0MsCi0JCXBmLT51MS5kd1lVVkJpdENvdW50Ci0JKTsKLSAgICB9Ci0gICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9SR0IpIHsKLQljb25zdCBjaGFyICpjbWQ7Ci0JRFBSSU5URigiLCBSR0IgYml0czogJWxkLCAiLCBwZi0+dTEuZHdSR0JCaXRDb3VudCk7Ci0Jc3dpdGNoIChwZi0+dTEuZHdSR0JCaXRDb3VudCkgewotCWNhc2UgNDogY21kID0gIiUxbHgiOyBicmVhazsKLQljYXNlIDg6IGNtZCA9ICIlMDJseCI7IGJyZWFrOwotCWNhc2UgMTY6IGNtZCA9ICIlMDRseCI7IGJyZWFrOwotCWNhc2UgMjQ6IGNtZCA9ICIlMDZseCI7IGJyZWFrOwotCWNhc2UgMzI6IGNtZCA9ICIlMDhseCI7IGJyZWFrOwotCWRlZmF1bHQ6IEVSUigiVW5leHBlY3RlZCBiaXQgZGVwdGggIVxuIik7IGNtZCA9ICIlZCI7IGJyZWFrOwotCX0KLQlEUFJJTlRGKCIgUiAiKTsgRFBSSU5URihjbWQsIHBmLT51Mi5kd1JCaXRNYXNrKTsKLQlEUFJJTlRGKCIgRyAiKTsgRFBSSU5URihjbWQsIHBmLT51My5kd0dCaXRNYXNrKTsKLQlEUFJJTlRGKCIgQiAiKTsgRFBSSU5URihjbWQsIHBmLT51NC5kd0JCaXRNYXNrKTsKLQlpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSB7Ci0JICAgIERQUklOVEYoIiBBICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU1LmR3UkdCQWxwaGFCaXRNYXNrKTsKLQl9Ci0JaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9aUElYRUxTKSB7Ci0JICAgIERQUklOVEYoIiBaICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU1LmR3UkdCWkJpdE1hc2spOwotCX0KLSAgICB9Ci0gICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9aQlVGRkVSKSB7Ci0JRFBSSU5URigiLCBaIGJpdHMgOiAlbGQiLCBwZi0+dTEuZHdaQnVmZmVyQml0RGVwdGgpOwotICAgIH0KLSAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBKSB7Ci0JRFBSSU5URigiLCBBbHBoYSBiaXRzIDogJWxkIiwgcGYtPnUxLmR3QWxwaGFCaXREZXB0aCk7Ci0gICAgfQotICAgIERQUklOVEYoIikiKTsKLX0KLQotdm9pZCBERFJBV19kdW1wX2NvbG9ya2V5ZmxhZyhEV09SRCBjaykKLXsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQotCXsKLQkgICAgRkUoRERDS0VZX0NPTE9SU1BBQ0UpLAotCSAgICBGRShERENLRVlfREVTVEJMVCksCi0JICAgIEZFKEREQ0tFWV9ERVNUT1ZFUkxBWSksCi0JICAgIEZFKEREQ0tFWV9TUkNCTFQpLAotCSAgICBGRShERENLRVlfU1JDT1ZFUkxBWSkKLSAgICB9OwotCi0gICAgRERSQVdfZHVtcF9mbGFncyhjaywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSk7Ci19Ci0KLXZvaWQgRERSQVdfZHVtcF9sb2NrZmxhZyhEV09SRCBsb2NrZmxhZykKLXsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQotCXsKLQkgICAgRkUoRERMT0NLX1NVUkZBQ0VNRU1PUllQVFIpLAotCSAgICBGRShERExPQ0tfV0FJVCksCi0JICAgIEZFKERETE9DS19FVkVOVCksCi0JICAgIEZFKERETE9DS19SRUFET05MWSksCi0JICAgIEZFKERETE9DS19XUklURU9OTFkpLAotCSAgICBGRShERExPQ0tfTk9TWVNMT0NLKSwKLQkgICAgRkUoRERMT0NLX0RJU0NBUkRDT05URU5UUyksCi0JICAgIEZFKERETE9DS19OT09WRVJXUklURSkKLQl9OwotCi0gICAgRERSQVdfZHVtcF9mbGFncyhsb2NrZmxhZywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEREUkFXX2R1bXBfRFdPUkQoY29uc3Qgdm9pZCAqaW4pIHsKLSAgICBEUFJJTlRGKCIlbGQiLCAqKChjb25zdCBEV09SRCAqKSBpbikpOwotfQotc3RhdGljIHZvaWQgRERSQVdfZHVtcF9QVFIoY29uc3Qgdm9pZCAqaW4pIHsKLSAgICBEUFJJTlRGKCIlcCIsICooKGNvbnN0IHZvaWQgKiBjb25zdCopIGluKSk7Ci19Ci12b2lkIEREUkFXX2R1bXBfRERDT0xPUktFWShjb25zdCBERENPTE9SS0VZICpkZGNrKSB7Ci0gICAgRFBSSU5URigiIExvdyA6ICVsZCAgLSBIaWdoIDogJWxkIiwgZGRjay0+ZHdDb2xvclNwYWNlTG93VmFsdWUsIGRkY2stPmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSk7Ci19Ci0KLXZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoY29uc3QgRERTVVJGQUNFREVTQzIgKmxwZGRzZCkKLXsKLSNkZWZpbmUgU1RSVUNUIEREU1VSRkFDRURFU0MyCi0gICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNbXSA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE1FKEREU0RfSEVJR0hULCBERFJBV19kdW1wX0RXT1JELCBkd0hlaWdodCksCi0gICAgICAgICAgICBNRShERFNEX1dJRFRILCBERFJBV19kdW1wX0RXT1JELCBkd1dpZHRoKSwKLSAgICAgICAgICAgIE1FKEREU0RfUElUQ0gsIEREUkFXX2R1bXBfRFdPUkQsIHUxLmxQaXRjaCksCi0gICAgICAgICAgICBNRShERFNEX0xJTkVBUlNJWkUsIEREUkFXX2R1bXBfRFdPUkQsIHUxLmR3TGluZWFyU2l6ZSksCi0gICAgICAgICAgICBNRShERFNEX0JBQ0tCVUZGRVJDT1VOVCwgRERSQVdfZHVtcF9EV09SRCwgZHdCYWNrQnVmZmVyQ291bnQpLAotICAgICAgICAgICAgTUUoRERTRF9NSVBNQVBDT1VOVCwgRERSQVdfZHVtcF9EV09SRCwgdTIuZHdNaXBNYXBDb3VudCksCi0JICAgIE1FKEREU0RfWkJVRkZFUkJJVERFUFRILCBERFJBV19kdW1wX0RXT1JELCB1Mi5kd01pcE1hcENvdW50KSwgLyogVGhpcyBpcyBmb3IgJ29sZC1zdHlsZScgRDNEICovCi0gICAgICAgICAgICBNRShERFNEX1JFRlJFU0hSQVRFLCBERFJBV19kdW1wX0RXT1JELCB1Mi5kd1JlZnJlc2hSYXRlKSwKLSAgICAgICAgICAgIE1FKEREU0RfQUxQSEFCSVRERVBUSCwgRERSQVdfZHVtcF9EV09SRCwgZHdBbHBoYUJpdERlcHRoKSwKLSAgICAgICAgICAgIE1FKEREU0RfTFBTVVJGQUNFLCBERFJBV19kdW1wX1BUUiwgbHBTdXJmYWNlKSwKLSAgICAgICAgICAgIE1FKEREU0RfQ0tERVNUT1ZFUkxBWSwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCB1My5kZGNrQ0tEZXN0T3ZlcmxheSksCi0gICAgICAgICAgICBNRShERFNEX0NLREVTVEJMVCwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tEZXN0Qmx0KSwKLSAgICAgICAgICAgIE1FKEREU0RfQ0tTUkNPVkVSTEFZLCBERFJBV19kdW1wX0REQ09MT1JLRVksIGRkY2tDS1NyY092ZXJsYXkpLAotICAgICAgICAgICAgTUUoRERTRF9DS1NSQ0JMVCwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tTcmNCbHQpLAotICAgICAgICAgICAgTUUoRERTRF9QSVhFTEZPUk1BVCwgRERSQVdfZHVtcF9waXhlbGZvcm1hdCwgdTQuZGRwZlBpeGVsRm9ybWF0KQotICAgICAgICB9OwotICAgIHN0YXRpYyBjb25zdCBtZW1iZXJfaW5mbyBtZW1iZXJzX2NhcHNbXSA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE1FKEREU0RfQ0FQUywgRERSQVdfZHVtcF9ERFNDQVBTLCBkZHNDYXBzKQotICAgICAgICB9OwotICAgIHN0YXRpYyBjb25zdCBtZW1iZXJfaW5mbyBtZW1iZXJzX2NhcHMyW10gPQotICAgICAgICB7Ci0gICAgICAgICAgICBNRShERFNEX0NBUFMsIEREUkFXX2R1bXBfRERTQ0FQUzIsIGRkc0NhcHMpCi0gICAgICAgIH07Ci0jdW5kZWYgU1RSVUNUCi0KLSAgICBpZiAoTlVMTCA9PSBscGRkc2QpIHsKLSAgICAgICAgRFBSSU5URigiKG51bGwpXG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGxwZGRzZC0+ZHdTaXplID49IHNpemVvZihERFNVUkZBQ0VERVNDMikpIHsKLSAgICAgICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnNfY2FwczIsIDEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnNfY2FwcywgMSk7Ci0gICAgICB9Ci0gICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnMsCi0JCQkgc2l6ZW9mKG1lbWJlcnMpL3NpemVvZihtZW1iZXJzWzBdKSk7Ci0gICAgfQotfQotCi12b2lkIEREUkFXX2R1bXBfY29vcGVyYXRpdmVsZXZlbChEV09SRCBjb29wbGV2ZWwpCi17Ci0gICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KLQl7Ci0JICAgIEZFKEREU0NMX0ZVTExTQ1JFRU4pLAotCSAgICBGRShERFNDTF9BTExPV1JFQk9PVCksCi0JICAgIEZFKEREU0NMX05PV0lORE9XQ0hBTkdFUyksCi0JICAgIEZFKEREU0NMX05PUk1BTCksCi0JICAgIEZFKEREU0NMX0FMTE9XTU9ERVgpLAotCSAgICBGRShERFNDTF9FWENMVVNJVkUpLAotCSAgICBGRShERFNDTF9TRVRGT0NVU1dJTkRPVyksCi0JICAgIEZFKEREU0NMX1NFVERFVklDRVdJTkRPVyksCi0JICAgIEZFKEREU0NMX0NSRUFURURFVklDRVdJTkRPVykKLSAgICB9OwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKLSAgICB7Ci0JRFBSSU5URigiIC0gIik7Ci0JRERSQVdfZHVtcF9mbGFncyhjb29wbGV2ZWwsIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwotICAgIH0KLX0KLQotdm9pZCBERFJBV19kdW1wX0REQ0FQUyhjb25zdCBERENBUFMgKmxwY2FwcykgewotICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3MxW10gPSB7Ci0gICAgICBGRShERENBUFNfM0QpLAotICAgICAgRkUoRERDQVBTX0FMSUdOQk9VTkRBUllERVNUKSwKLSAgICAgIEZFKEREQ0FQU19BTElHTlNJWkVERVNUKSwKLSAgICAgIEZFKEREQ0FQU19BTElHTkJPVU5EQVJZU1JDKSwKLSAgICAgIEZFKEREQ0FQU19BTElHTlNJWkVTUkMpLAotICAgICAgRkUoRERDQVBTX0FMSUdOU1RSSURFKSwKLSAgICAgIEZFKEREQ0FQU19CTFQpLAotICAgICAgRkUoRERDQVBTX0JMVFFVRVVFKSwKLSAgICAgIEZFKEREQ0FQU19CTFRGT1VSQ0MpLAotICAgICAgRkUoRERDQVBTX0JMVFNUUkVUQ0gpLAotICAgICAgRkUoRERDQVBTX0dESSksCi0gICAgICBGRShERENBUFNfT1ZFUkxBWSksCi0gICAgICBGRShERENBUFNfT1ZFUkxBWUNBTlRDTElQKSwKLSAgICAgIEZFKEREQ0FQU19PVkVSTEFZRk9VUkNDKSwKLSAgICAgIEZFKEREQ0FQU19PVkVSTEFZU1RSRVRDSCksCi0gICAgICBGRShERENBUFNfUEFMRVRURSksCi0gICAgICBGRShERENBUFNfUEFMRVRURVZTWU5DKSwKLSAgICAgIEZFKEREQ0FQU19SRUFEU0NBTkxJTkUpLAotICAgICAgRkUoRERDQVBTX1NURVJFT1ZJRVcpLAotICAgICAgRkUoRERDQVBTX1ZCSSksCi0gICAgICBGRShERENBUFNfWkJMVFMpLAotICAgICAgRkUoRERDQVBTX1pPVkVSTEFZUyksCi0gICAgICBGRShERENBUFNfQ09MT1JLRVkpLAotICAgICAgRkUoRERDQVBTX0FMUEhBKSwKLSAgICAgIEZFKEREQ0FQU19DT0xPUktFWUhXQVNTSVNUKSwKLSAgICAgIEZFKEREQ0FQU19OT0hBUkRXQVJFKSwKLSAgICAgIEZFKEREQ0FQU19CTFRDT0xPUkZJTEwpLAotICAgICAgRkUoRERDQVBTX0JBTktTV0lUQ0hFRCksCi0gICAgICBGRShERENBUFNfQkxUREVQVEhGSUxMKSwKLSAgICAgIEZFKEREQ0FQU19DQU5DTElQKSwKLSAgICAgIEZFKEREQ0FQU19DQU5DTElQU1RSRVRDSEVEKSwKLSAgICAgIEZFKEREQ0FQU19DQU5CTFRTWVNNRU0pCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzMltdID0gewotICAgICAgRkUoRERDQVBTMl9DRVJUSUZJRUQpLAotICAgICAgRkUoRERDQVBTMl9OTzJERFVSSU5HM0RTQ0VORSksCi0gICAgICBGRShERENBUFMyX1ZJREVPUE9SVCksCi0gICAgICBGRShERENBUFMyX0FVVE9GTElQT1ZFUkxBWSksCi0gICAgICBGRShERENBUFMyX0NBTkJPQklOVEVSTEVBVkVEKSwKLSAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CTk9OSU5URVJMRUFWRUQpLAotICAgICAgRkUoRERDQVBTMl9DT0xPUkNPTlRST0xPVkVSTEFZKSwKLSAgICAgIEZFKEREQ0FQUzJfQ09MT1JDT05UUk9MUFJJTUFSWSksCi0gICAgICBGRShERENBUFMyX0NBTkRST1BaMTZCSVQpLAotICAgICAgRkUoRERDQVBTMl9OT05MT0NBTFZJRE1FTSksCi0gICAgICBGRShERENBUFMyX05PTkxPQ0FMVklETUVNQ0FQUyksCi0gICAgICBGRShERENBUFMyX05PUEFHRUxPQ0tSRVFVSVJFRCksCi0gICAgICBGRShERENBUFMyX1dJREVTVVJGQUNFUyksCi0gICAgICBGRShERENBUFMyX0NBTkZMSVBPRERFVkVOKSwKLSAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CSEFSRFdBUkUpLAotICAgICAgRkUoRERDQVBTMl9DT1BZRk9VUkNDKSwKLSAgICAgIEZFKEREQ0FQUzJfUFJJTUFSWUdBTU1BKSwKLSAgICAgIEZFKEREQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQpLAotICAgICAgRkUoRERDQVBTMl9DQU5DQUxJQlJBVEVHQU1NQSksCi0gICAgICBGRShERENBUFMyX0ZMSVBJTlRFUlZBTCksCi0gICAgICBGRShERENBUFMyX0ZMSVBOT1ZTWU5DKSwKLSAgICAgIEZFKEREQ0FQUzJfQ0FOTUFOQUdFVEVYVFVSRSksCi0gICAgICBGRShERENBUFMyX1RFWE1BTklOTk9OTE9DQUxWSURNRU0pLAotICAgICAgRkUoRERDQVBTMl9TVEVSRU8pLAotICAgICAgRkUoRERDQVBTMl9TWVNUT05PTkxPQ0FMX0FTX1NZU1RPTE9DQUwpCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzM1tdID0gewotICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUKSwKLSAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVENMUlNQQUNFKSwKLSAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVENMUlNQQUNFWVVWKSwKLSAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVFlVViksCi0gICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZKSwKLSAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVlDTFJTUEFDRSksCi0gICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZQ0xSU1BBQ0VZVVYpLAotICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWU9ORUFDVElWRSksCi0gICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZWVVWKSwKLSAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUKSwKLSAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUQ0xSU1BBQ0UpLAotICAgICAgRkUoRERDS0VZQ0FQU19TUkNCTFRDTFJTUEFDRVlVViksCi0gICAgICBGRShERENLRVlDQVBTX1NSQ0JMVFlVViksCi0gICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVkpLAotICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZQ0xSU1BBQ0UpLAotICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZQ0xSU1BBQ0VZVVYpLAotICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZT05FQUNUSVZFKSwKLSAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWVlVViksCi0gICAgICBGRShERENLRVlDQVBTX05PQ09TVE9WRVJMQVkpCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzNFtdID0gewotICAgICAgRkUoRERGWENBUFNfQkxUQUxQSEEpLAotICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWUFMUEhBKSwKLSAgICAgIEZFKERERlhDQVBTX0JMVEFSSVRIU1RSRVRDSFlOKSwKLSAgICAgIEZFKERERlhDQVBTX0JMVEFSSVRIU1RSRVRDSFkpLAotICAgICAgRkUoRERGWENBUFNfQkxUTUlSUk9STEVGVFJJR0hUKSwKLSAgICAgIEZFKERERlhDQVBTX0JMVE1JUlJPUlVQRE9XTiksCi0gICAgICBGRShEREZYQ0FQU19CTFRST1RBVElPTiksCi0gICAgICBGRShEREZYQ0FQU19CTFRST1RBVElPTjkwKSwKLSAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1gpLAotICAgICAgRkUoRERGWENBUFNfQkxUU0hSSU5LWE4pLAotICAgICAgRkUoRERGWENBUFNfQkxUU0hSSU5LWSksCi0gICAgICBGRShEREZYQ0FQU19CTFRTSFJJTktZTiksCi0gICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWCksCi0gICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWE4pLAotICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFkpLAotICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFlOKSwKLSAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBUklUSFNUUkVUQ0hZKSwKLSAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBUklUSFNUUkVUQ0hZTiksCi0gICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWCksCi0gICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWE4pLAotICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1kpLAotICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1lOKSwKLSAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTVFJFVENIWCksCi0gICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFhOKSwKLSAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTVFJFVENIWSksCi0gICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFlOKSwKLSAgICAgIEZFKERERlhDQVBTX09WRVJMQVlNSVJST1JMRUZUUklHSFQpLAotICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWU1JUlJPUlVQRE9XTikKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M1W10gPSB7Ci0gICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBRURHRUJMRU5EKSwKLSAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFQSVhFTFMpLAotICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVBJWEVMU05FRyksCi0gICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBU1VSRkFDRVMpLAotICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVNVUkZBQ0VTTkVHKSwKLSAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBRURHRUJMRU5EKSwKLSAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBUElYRUxTKSwKLSAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBUElYRUxTTkVHKSwKLSAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBU1VSRkFDRVMpLAotICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFTVVJGQUNFU05FRykKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M2W10gPSB7Ci0gICAgICBGRShERFBDQVBTXzRCSVQpLAotICAgICAgRkUoRERQQ0FQU184QklURU5UUklFUyksCi0gICAgICBGRShERFBDQVBTXzhCSVQpLAotICAgICAgRkUoRERQQ0FQU19JTklUSUFMSVpFKSwKLSAgICAgIEZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0UpLAotICAgICAgRkUoRERQQ0FQU19QUklNQVJZU1VSRkFDRUxFRlQpLAotICAgICAgRkUoRERQQ0FQU19BTExPVzI1NiksCi0gICAgICBGRShERFBDQVBTX1ZTWU5DKSwKLSAgICAgIEZFKEREUENBUFNfMUJJVCksCi0gICAgICBGRShERFBDQVBTXzJCSVQpLAotICAgICAgRkUoRERQQ0FQU19BTFBIQSksCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzN1tdID0gewotICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQxKSwKLSAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMiksCi0gICAgICBGRShERFNWQ0FQU19SRVNFUlZFRDMpLAotICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQ0KSwKLSAgICAgIEZFKEREU1ZDQVBTX1NURVJFT1NFUVVFTlRJQUwpLAotICAgIH07Ci0KLSAgICBEUFJJTlRGKCIgLSBkd1NpemUgOiAlbGRcbiIsIGxwY2Fwcy0+ZHdTaXplKTsKLSAgICBEUFJJTlRGKCIgLSBkd0NhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3Q2FwcywgZmxhZ3MxLCBzaXplb2YoZmxhZ3MxKS9zaXplb2YoZmxhZ3MxWzBdKSk7Ci0gICAgRFBSSU5URigiIC0gZHdDYXBzMiA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdDYXBzMiwgZmxhZ3MyLCBzaXplb2YoZmxhZ3MyKS9zaXplb2YoZmxhZ3MyWzBdKSk7Ci0gICAgRFBSSU5URigiIC0gZHdDS2V5Q2FwcyA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdDS2V5Q2FwcywgZmxhZ3MzLCBzaXplb2YoZmxhZ3MzKS9zaXplb2YoZmxhZ3MzWzBdKSk7Ci0gICAgRFBSSU5URigiIC0gZHdGWENhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3RlhDYXBzLCBmbGFnczQsIHNpemVvZihmbGFnczQpL3NpemVvZihmbGFnczRbMF0pKTsKLSAgICBEUFJJTlRGKCIgLSBkd0ZYQWxwaGFDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0ZYQWxwaGFDYXBzLCBmbGFnczUsIHNpemVvZihmbGFnczUpL3NpemVvZihmbGFnczVbMF0pKTsKLSAgICBEUFJJTlRGKCIgLSBkd1BhbENhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3UGFsQ2FwcywgZmxhZ3M2LCBzaXplb2YoZmxhZ3M2KS9zaXplb2YoZmxhZ3M2WzBdKSk7Ci0gICAgRFBSSU5URigiIC0gZHdTVkNhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3U1ZDYXBzLCBmbGFnczcsIHNpemVvZihmbGFnczcpL3NpemVvZihmbGFnczdbMF0pKTsKLSAgICBEUFJJTlRGKCIuLi5cbiIpOwotICAgIERQUklOVEYoIiAtIGR3TnVtRm91ckNDQ29kZXMgOiAlbGRcbiIsIGxwY2Fwcy0+ZHdOdW1Gb3VyQ0NDb2Rlcyk7Ci0gICAgRFBSSU5URigiIC0gZHdDdXJyVmlzaWJsZU92ZXJsYXlzIDogJWxkXG4iLCBscGNhcHMtPmR3Q3VyclZpc2libGVPdmVybGF5cyk7Ci0gICAgRFBSSU5URigiIC0gZHdNaW5PdmVybGF5U3RyZXRjaCA6ICVsZFxuIiwgbHBjYXBzLT5kd01pbk92ZXJsYXlTdHJldGNoKTsKLSAgICBEUFJJTlRGKCIgLSBkd01heE92ZXJsYXlTdHJldGNoIDogJWxkXG4iLCBscGNhcHMtPmR3TWF4T3ZlcmxheVN0cmV0Y2gpOwotICAgIERQUklOVEYoIi4uLlxuIik7Ci0gICAgRFBSSU5URigiIC0gZGRzQ2FwcyA6ICIpOyBERFJBV19kdW1wX0REU0NBUFMyKCZscGNhcHMtPmRkc0NhcHMpOyBEUFJJTlRGKCJcbiIpOwotfQotCi12b2lkIEREUkFXX2R1bXBfRERFTlVNU1VSRkFDRVMoRFdPUkQgZmxhZ21hc2spCi17Ci0gICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KLQl7Ci0JICAgIEZFKERERU5VTVNVUkZBQ0VTX0FMTCksCi0JICAgIEZFKERERU5VTVNVUkZBQ0VTX01BVENIKSwKLQkgICAgRkUoRERFTlVNU1VSRkFDRVNfTk9NQVRDSCksCi0JICAgIEZFKERERU5VTVNVUkZBQ0VTX0NBTkJFQ1JFQVRFRCksCi0JICAgIEZFKERERU5VTVNVUkZBQ0VTX0RPRVNFWElTVCkKLQl9OwotICAgIEREUkFXX2R1bXBfZmxhZ3MoZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwotfQotCi0vKiBEZWJ1ZyBmdW5jdGlvbiB0aGF0IGNhbiBiZSBoZWxwZnVsIHRvIGRlYnVnIHZhcmlvdXMgc3VyZmFjZS1yZWxhdGVkIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGdldF9zaGlmdChEV09SRCBjb2xvcl9tYXNrKSB7Ci0gICAgaW50IHNoaWZ0ID0gMDsKLSAgICB3aGlsZSAoY29sb3JfbWFzayA+IDB4RkYpIHsKLSAgICAgICAgY29sb3JfbWFzayA+Pj0gMTsKLQlzaGlmdCArPSAxOwotICAgIH0KLSAgICB3aGlsZSAoKGNvbG9yX21hc2sgJiAweDgwKSA9PSAwKSB7Ci0gICAgICAgIGNvbG9yX21hc2sgPDw9IDE7Ci0Jc2hpZnQgLT0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHNoaWZ0OwotfQotCi12b2lkIEREUkFXX2R1bXBfc3VyZmFjZV90b19kaXNrKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZhY2UsIEZJTEUgKmYsIGludCBzY2FsZSkKLXsKLSAgICBpbnQgcndpZHRoLCByaGVpZ2h0LCB4LCB5OwotICAgIHN0YXRpYyBjaGFyICpvdXRwdXQgPSBOVUxMOwotICAgIHN0YXRpYyBpbnQgc2l6ZSA9IDA7Ci0KLSAgICByd2lkdGggID0gKHN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd1dpZHRoICArIHNjYWxlIC0gMSkgLyBzY2FsZTsKLSAgICByaGVpZ2h0ID0gKHN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCArIHNjYWxlIC0gMSkgLyBzY2FsZTsKLQotICAgIGlmIChyd2lkdGggPiBzaXplKSB7Ci0Jb3V0cHV0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHJ3aWR0aCAqIDMpOwotCXNpemUgPSByd2lkdGg7Ci0gICAgfQotICAgIAotICAgIGZwcmludGYoZiwgIlA2XG4lZCAlZFxuMjU1XG4iLCByd2lkdGgsIHJoZWlnaHQpOwotCi0gICAgaWYgKHN1cmZhY2UtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfUEFMRVRURUlOREVYRUQ4KSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdGFibGVbMjU2XVszXTsKLQlpbnQgaTsKLQkKLQlpZiAoc3VyZmFjZS0+cGFsZXR0ZSA9PSBOVUxMKSB7Ci0JICAgIGZjbG9zZShmKTsKLQkgICAgcmV0dXJuOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkgICAgdGFibGVbaV1bMF0gPSBzdXJmYWNlLT5wYWxldHRlLT5wYWxlbnRzW2ldLnBlUmVkOwotCSAgICB0YWJsZVtpXVsxXSA9IHN1cmZhY2UtPnBhbGV0dGUtPnBhbGVudHNbaV0ucGVHcmVlbjsKLQkgICAgdGFibGVbaV1bMl0gPSBzdXJmYWNlLT5wYWxldHRlLT5wYWxlbnRzW2ldLnBlQmx1ZTsKLQl9Ci0JZm9yICh5ID0gMDsgeSA8IHJoZWlnaHQ7IHkrKykgewotCSAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBzdXJmYWNlLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlICsgKHkgKiBzY2FsZSAqIHN1cmZhY2UtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2gpOwotCSAgICBmb3IgKHggPSAwOyB4IDwgcndpZHRoOyB4KyspIHsKLQkJdW5zaWduZWQgY2hhciBjb2xvciA9ICpzcmM7Ci0JCXNyYyArPSBzY2FsZTsKLQotCQlvdXRwdXRbMyAqIHggKyAwXSA9IHRhYmxlW2NvbG9yXVswXTsKLQkJb3V0cHV0WzMgKiB4ICsgMV0gPSB0YWJsZVtjb2xvcl1bMV07Ci0JCW91dHB1dFszICogeCArIDJdID0gdGFibGVbY29sb3JdWzJdOwotCSAgICB9Ci0JICAgIGZ3cml0ZShvdXRwdXQsIDMgKiByd2lkdGgsIDEsIGYpOwotCX0KLSAgICB9IGVsc2UgaWYgKHN1cmZhY2UtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfUkdCKSB7Ci0gICAgICAgIGludCByZWRfc2hpZnQsIGdyZWVuX3NoaWZ0LCBibHVlX3NoaWZ0LCBwaXhfd2lkdGg7Ci0JCi0JaWYgKHN1cmZhY2UtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSA4KSB7Ci0JICAgIHBpeF93aWR0aCA9IDE7Ci0JfSBlbHNlIGlmIChzdXJmYWNlLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgPT0gMTYpIHsKLQkgICAgcGl4X3dpZHRoID0gMjsKLQl9IGVsc2UgaWYgKHN1cmZhY2UtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAzMikgewotCSAgICBwaXhfd2lkdGggPSA0OwotCX0gZWxzZSB7Ci0JICAgIHBpeF93aWR0aCA9IDM7Ci0JfQotCQotCXJlZF9zaGlmdCA9IGdldF9zaGlmdChzdXJmYWNlLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3UkJpdE1hc2spOwotCWdyZWVuX3NoaWZ0ID0gZ2V0X3NoaWZ0KHN1cmZhY2UtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdHQml0TWFzayk7Ci0JYmx1ZV9zaGlmdCA9IGdldF9zaGlmdChzdXJmYWNlLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnU0LmR3QkJpdE1hc2spOwotCi0JZm9yICh5ID0gMDsgeSA8IHJoZWlnaHQ7IHkrKykgewotCSAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBzdXJmYWNlLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlICsgKHkgKiBzY2FsZSAqIHN1cmZhY2UtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2gpOwotCSAgICBmb3IgKHggPSAwOyB4IDwgcndpZHRoOyB4KyspIHsJICAgIAotCQl1bnNpZ25lZCBpbnQgY29sb3I7Ci0JCXVuc2lnbmVkIGludCBjb21wOwotCQlpbnQgaTsKLQotCQljb2xvciA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBwaXhfd2lkdGg7IGkrKykgewotCQkgICAgY29sb3IgfD0gc3JjW2ldIDw8ICg4ICogaSk7Ci0JCX0KLQkJc3JjICs9IHNjYWxlICogcGl4X3dpZHRoOwotCQkKLQkJY29tcCA9IGNvbG9yICYgc3VyZmFjZS0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrOwotCQlvdXRwdXRbMyAqIHggKyAwXSA9IHJlZF9zaGlmdCA+IDAgPyBjb21wID4+IHJlZF9zaGlmdCA6IGNvbXAgPDwgLXJlZF9zaGlmdDsKLQkJY29tcCA9IGNvbG9yICYgc3VyZmFjZS0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrOwotCQlvdXRwdXRbMyAqIHggKyAxXSA9IGdyZWVuX3NoaWZ0ID4gMCA/IGNvbXAgPj4gZ3JlZW5fc2hpZnQgOiBjb21wIDw8IC1ncmVlbl9zaGlmdDsKLQkJY29tcCA9IGNvbG9yICYgc3VyZmFjZS0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51NC5kd0JCaXRNYXNrOwotCQlvdXRwdXRbMyAqIHggKyAyXSA9IGJsdWVfc2hpZnQgPiAwID8gY29tcCA+PiBibHVlX3NoaWZ0IDogY29tcCA8PCAtYmx1ZV9zaGlmdDsKLQkgICAgfQotCSAgICBmd3JpdGUob3V0cHV0LCAzICogcndpZHRoLCAxLCBmKTsKLQl9Ci0gICAgfQotICAgIGZjbG9zZShmKTsKLX0KZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGV2aWNlLmMgYi9kbGxzL2RkcmF3L2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZWI4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RldmljZS5jCkBAIC0wLDAgKzEsNDU3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA0IExpb25lbCBVbG1lcgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgQ2hyaXN0aWFuIENvc3RhCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCisgKgorICogSURpcmVjdDNERGV2aWNlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEsIDIsIDMgYW5kIDcuIFJlbmRlcmluZyBpcyByZWxheWVkCisgKiB0byBXaW5lRDNELCBzb21lIG1pbmltYWwgRGlyZWN0RHJhdyBzcGVjaWZpYyBtYW5hZ2VtZW50IGlzIGhhbmRsZWQgaGVyZS4KKyAqIFRoZSBEaXJlY3QzRERldmljZSBpcyBOT1QgdGhlIHBhcmVudCBvZiB0aGUgV2luZUQzRERldmljZSwgYmVjYXVzZSBkM2QKKyAqIGlzIGluaXRpYWxpemVkIHdoZW4gRGlyZWN0RHJhdyBjcmVhdGVzIHRoZSBwcmltYXJ5IHN1cmZhY2UuCisgKiBTb21lIHR5cGUgbWFuYWdlbWVudCBpcyBuZWNlc3NhcnksIGJlY2F1c2Ugc29tZSBEM0QgdHlwZXMgY2hhbmdlZCBiZXR3ZWVuCisgKiBEM0Q3IGFuZCBEM0Q5LgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAid2luZS9wb3J0LmgiCisjaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQ09CSk1BQ1JPUworCisjaW5jbHVkZSAid2luZGVmLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2luZ2RpLmgiCisjaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJleGNwdC5oIgorCisjaW5jbHVkZSAiZGRyYXcuaCIKKyNpbmNsdWRlICJkM2QuaCIKKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKworV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CitXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CisKKy8qIFRoZSBkZXZpY2UgSUQgKi8KK2NvbnN0IEdVSUQgSUlEX0QzRERFVklDRV9XaW5lRDNEID0geworICAweGFlZjcyZDQzLAorICAweGIwOWEsCisgIDB4NGI3YiwKKyAgeyAweGI3LDB4OTgsMHhjNiwweDhhLDB4NzcsMHgyZCwweDcyLDB4MmEgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJVW5rbm93biBNZXRob2RzLiBDb21tb24gZm9yIFZlcnNpb24gMSwgMiwgMyBhbmQgNyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpRdWVyeUludGVyZmFjZQorICoKKyAqIFVzZWQgdG8gcXVlcnkgb3RoZXIgaW50ZXJmYWNlcyBmcm9tIGEgRGlyZWN0M0REZXZpY2UgaW50ZXJmYWNlLgorICogSXQgY2FuIHJldHVybiBpbnRlcmZhY2UgcG9pbnRlcnMgdG8gYWxsIERpcmVjdDNERGV2aWNlIHZlcnNpb25zIGFzIHdlbGwKKyAqIGFzIElEaXJlY3REcmF3IGFuZCBJRGlyZWN0M0QuIEZvciBhIGxpbmsgZm9yIFF1ZXJ5SW50ZXJmYWNlCisgKiBydWxlcyBzZWUgZGRyYXcuYywgSURpcmVjdERyYXc3OjpRdWVyeUludGVyZmFjZQorICoKKyAqIEV4aXN0cyBpbiBWZXJzaW9uIDEsIDIsIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgcmVmaWlkOiBJbnRlcmZhY2UgSUQgcXVlcmllZCBmb3IKKyAqICBvYmo6IFVzZWQgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgcG9pbnRlcgorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9yIEVfTk9JTlRFUkZBQ0UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19RdWVyeUludGVyZmFjZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIG9iaik7CisKKyAgICAvKiBBY2NvcmRpbmcgdG8gQ09NIGRvY3MsIGlmIHRoZSBRdWVyeUludGVyZmFjZSBmYWlscywgb2JqIHNob3VsZCBiZSBzZXQgdG8gTlVMTCAqLworICAgICpvYmogPSBOVUxMOworCisgICAgaWYoIXJlZmlpZCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByZWZpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyk7CisgICAgfQorCisgICAgLyogQ2hlY2sgRGlyZWN0RHJhdyBJbnRlcmZhYwFzICovCisgICAgZWxzZSBpZiggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc3LCByZWZpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3REcmF3Nyk7CisgICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3NCwgcmVmaWlkICkgKQorICAgIHsKKyAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3LCBJRGlyZWN0RHJhdzQpOworICAgICAgICBUUkFDRSgiKCVwKSBSZXR1cm5pbmcgSURpcmVjdERyYXc0IGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CisgICAgfQorICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzIsIHJlZmlpZCApICkKKyAgICB7CisgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5kZHJhdywgSURpcmVjdERyYXcyKTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3REcmF3MiBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOworICAgIH0KKyAgICBlbHNlIGlmKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdywgcmVmaWlkICkgKQorICAgIHsKKyAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3LCBJRGlyZWN0RHJhdyk7CisgICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0RHJhdyBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOworICAgIH0KKworICAgIC8qIERpcmVjdDNEICovCisgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRCAgLCByZWZpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRCk7CisgICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0QgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRDIgLCByZWZpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRDIpOworICAgICAgICBUUkFDRSgiKCVwKSBSZXR1cm5pbmcgSURpcmVjdDNEMiBpbnRlcmZhY2UgYXQgJXBcbiIsIFRoaXMsICpvYmopOworICAgIH0KKyAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEMyAsIHJlZmlpZCApICkKKyAgICB7CisgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5kZHJhdywgSURpcmVjdDNEMyk7CisgICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0QzIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CisgICAgfQorICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0Q3ICwgcmVmaWlkICkgKQorICAgIHsKKyAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3LCBJRGlyZWN0M0Q3KTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3QzRDcgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICB9CisKKyAgICAvKiBEaXJlY3QzRERldmljZSAqLworICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0REZXZpY2UgICwgcmVmaWlkICkgKQorICAgIHsKKyAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZSk7CisgICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0REZXZpY2UgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRERldmljZTIgICwgcmVmaWlkICkgKSB7CisgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UyKTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3QzRERldmljZTIgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRERldmljZTMgICwgcmVmaWlkICkgKSB7CisgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRERldmljZTcgICwgcmVmaWlkICkgKSB7CisgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KTsKKyAgICAgICAgVFJBQ0UoIiglcCkgUmV0dXJuaW5nIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICB9CisKKyAgICAvKiBVbmtub3duIGludGVyZmFjZSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEVSUigiKCVwKS0+KCVzLCAlcCk6IE5vIGludGVyZmFjZSBmb3VuZCIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgb2JqKTsKKyAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisgICAgfQorCisgICAgLyogQWRkUmVmIHRoZSByZXR1cm5lZCBpbnRlcmZhY2UgKi8KKyAgICBJVW5rbm93bl9BZGRSZWYoIChJVW5rbm93biAqKSAqb2JqKTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19RdWVyeUludGVyZmFjZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYmopOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNERGV2aWNlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JwKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpBZGRSZWYKKyAqCisgKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50Li4uLgorICogVGhlIG1vc3QgZXhjaXRpbmcgTWV0aG9kLCBkZWZpbml0bHkKKyAqCisgKiBFeGlzdHMgaW4gVmVyc2lvbiAxLCAyLCAzIGFuZCA3CisgKgorICogUmV0dXJuczoKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0FkZFJlZihJRGlyZWN0M0REZXZpY2U3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CisKKyAgICBUUkFDRSgiKCVwKSA6IGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiAtMSk7CisKKyAgICByZXR1cm4gcmVmOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQWRkUmVmKElEaXJlY3QzRERldmljZTMgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9BZGRSZWYoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0FkZFJlZihJRGlyZWN0M0REZXZpY2UgKmlmYWNlKQoreworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OlJlbGVhc2UKKyAqCisgKiBEZWNyZWFzZXMgdGhlIHJlZmNvdW50IG9mIHRoZSBpbnRlcmZhY2UKKyAqIFdoZW4gdGhlIHJlZmNvdW50IGlzIHJlZHVjZWQgdG8gMCwgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuCisgKgorICogRXhpc3RzIGluIFZlcnNpb24gMSwgMiwgMyBhbmQgNworICoKKyAqIFJldHVybnM6ZAorICogIFRoZSBuZXcgcmVmY291bnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfUmVsZWFzZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CisKKyAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmICsxKTsKKworICAgIC8qIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZGVzdHJveSB0aGUgV2luZUQzRERldmljZSwgYmVjYXVzZSBpdCdzIHN0aWxsIGluIHVzZSBmb3IKKyAgICAgKiAyRCByZW5kZXJpbmcuIElEaXJlY3REcmF3U3VyZmFjZTc6OlJlbGVhc2Ugd2lsbCBkZXN0cm95IHRoZSBXaW5lRDNERGV2aWNlCisgICAgICogd2hlbiB0aGUgcmVuZGVyIHRhcmdldCBpcyByZWxlYXNlZAorICAgICAqLworICAgIGlmIChyZWYgPT0gMCkKKyAgICB7CisgICAgICAgIElQYXJlbnQgKkluZGV4QnVmZmVyUGFyZW50OworICAgICAgICAvKiBGcmVlIHRoZSBpbmRleCBidWZmZXIgKi8KKyAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0SW5kaWNlcyhUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIElXaW5lRDNESW5kZXhCdWZmZXJfR2V0UGFyZW50KFRoaXMtPmluZGV4YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVVua25vd24gKiopICZJbmRleEJ1ZmZlclBhcmVudCk7CisgICAgICAgIElQYXJlbnRfUmVsZWFzZShJbmRleEJ1ZmZlclBhcmVudCk7IC8qIE9uY2UgZm9yIHRoZSBnZXRQYXJlbnQgKi8KKyAgICAgICAgaWYoIElQYXJlbnRfUmVsZWFzZShJbmRleEJ1ZmZlclBhcmVudCkgIT0gMCkgIC8qIEFuZCBub3cgdG8gZGVzdHJveSBpdCAqLworICAgICAgICB7CisgICAgICAgICAgICBFUlIoIiAoJXApIFNvbWV0aGluZyBpcyBzdGlsbCBob2xkaW5nIHRoZSBpbmRleCBidWZmZXIgcGFyZW50ICVwXG4iLCBUaGlzLCBJbmRleEJ1ZmZlclBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXN0b3JlIHRoZSByZW5kZXIgdGFyZ2V0cyAqLworICAgICAgICBpZihUaGlzLT5PZmZTY3JlZW5UYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoaXMtPnRhcmdldCBpcyB0aGUgb2Zmc2NyZWVuIHRhcmdldC4KKyAgICAgICAgICAgICAqIFRoaXMtPmRkcmF3LT5kM2RfdGFyZ2V0IGlzIHRoZSB0YXJnZXQgdXNlZCBieSBERHJhdworICAgICAgICAgICAgICovCisgICAgICAgICAgICBUUkFDRSgiKCVwKSBSZWxlYXNlOiBVc2luZyAlcCBhcyBmcm9udCBidWZmZXIsICVwIGFzIGJhY2sgYnVmZmVyXG4iLCBUaGlzLCBUaGlzLT5kZHJhdy0+ZDNkX3RhcmdldCwgTlVMTCk7CisgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRGcm9udEJhY2tCdWZmZXJzKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPmRkcmF3LT5kM2RfdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWxlYXNlIHRoZSBXaW5lRDNERGV2aWNlLiBUaGlzIHdvbid0IGRlc3Ryb3kgaXQgKi8KKyAgICAgICAgaWYoSVdpbmVEM0REZXZpY2VfUmVsZWFzZShUaGlzLT53aW5lRDNERGV2aWNlKSA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIoIiAoJXApIFRoZSB3aW5lRDNEIGRldmljZSAlcCB3YXMgZGVzdHJveWVkIHVuZXhwZWN0YWRlbHkuIFByZXBhcmUgZm9yIHRyb3VibGVcbiIsIFRoaXMsIFRoaXMtPndpbmVEM0REZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVsZWFzZSB0aGUgcmVuZGVyIHRhcmdldCBhbmQgdGhlIFdpbmVEM0QgcmVuZGVyIHRhcmdldAorICAgICAgICAgKiAoU2VlIElEaXJlY3QzRDc6OkNyZWF0ZURldmljZSBmb3IgbW9yZSBjb21tZW50cyBvbiB0aGlzKQorICAgICAgICAgKi8KKyAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMtPnRhcmdldCwgSURpcmVjdERyYXdTdXJmYWNlNykpOworICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXctPmQzZF90YXJnZXQsSURpcmVjdERyYXdTdXJmYWNlNykpOworCisgICAgICAgIFRoaXMtPmRkcmF3LT5kM2RkZXZpY2UgPSBOVUxMOworCisgICAgICAgIC8qIE5vdyBmcmVlIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlZjsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1JlbGVhc2UoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9SZWxlYXNlKElEaXJlY3QzRERldmljZTIgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0REZXZpY2UgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlIE1ldGhvZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U6OkluaXRpYWxpemUKKyAqCisgKiBJbml0aWFsaXplcyBhIERpcmVjdDNERGV2aWNlLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AsIGFzIGFsbAorICogaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBhdCBjcmVhdGUgdGltZS4KKyAqCisgKiBFeGlzdHMgaW4gVmVyc2lvbiAxCisgKgorICogUGFyYW1ldGVyczoKKyAqICBObyBpZGVhIHdoYXQgdGhleSBtZWFuLCBhcyB0aGUgTVNETiBwYWdlIGlzIGdvbmUKKyAqCisgKiBSZXR1cm5zOiBERF9PSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8xX0luaXRpYWxpemUoSURpcmVjdDNERGV2aWNlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqRGlyZWN0M0QsIEdVSUQgKmd1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDICpEZXNjKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOworCisgICAgLyogSXQgc2hvdWxkbid0IGJlIGNydWNpYWwsIGJ1dCBwcmludCBhIEZJWE1FLCBJJ20gaW50ZXJlc3RlZCBpZgorICAgICAqIGFueSBnYW1lIGNhbGxzIGl0IGFuZCB3aGVuCisgICAgICovCisgICAgRklYTUUoIiglcCktPiglcCwlcCwlcCk6IE5vLW9wIVxuIiwgVGhpcywgRGlyZWN0M0QsIGd1aWQsIERlc2MpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpHZXRDYXBzCisgKgorICogUmV0cmlldmVzIHRoZSBkZXZpY2UncyBjYXBhdGlibGl0aWVzCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGZvciBWZXJzaW9uIDcgb25seSwgdGhlIG9sZGVyIHZlcnNpb25zIGhhdmUKKyAqIHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIERlc2M6IFBvaW50ZXIgdG8gYSBEM0RERVZJQ0VERVNDNyBzdHJ1Y3R1cmUgdG8gZmlsbAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEM0RFUlJfKiBpZiBhIHByb2JsZW0gb2NjdXJzLiBTZWUgV2luZUQzRAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENhcHMoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDNyAqRGVzYykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgRDNEREVWSUNFREVTQyBPbGREZXNjOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBEZXNjKTsKKworICAgIC8qIENhbGwgdGhlIHNhbWUgZnVuY3Rpb24gdXNlZCBieSBJRGlyZWN0M0QsIHRoaXMgc2F2ZXMgY29kZSAqLworICAgIHJldHVybiBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+ZGRyYXctPndpbmVEM0QsICZPbGREZXNjLCBEZXNjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2UzOjpHZXRDYXBzCisgKgorICogUmV0cmlldmVzIHRoZSBjYXBhdGlibGl0aWVzIG9mIHRoZSBoYXJkd2FyZSBkZXZpY2UgYW5kIHRoZSBlbXVsYXRpb24KKyAqIGRldmljZS4gRm9yIFdpbmUsIGhhcmR3YXJlIGFuZCBlbXVsYXRpb24gYXJlIHRoZSBzYW1lKGl0J3MgYWxsIEhXKS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgZm9yIFZlcnNpb24gMSwgMiwgYW5kIDMuIFZlcnNpb24gNyBoYXMgaXRzIG93bgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgSFdEZXNjOiBTdHJ1Y3R1cmUgdG8gZmlsbCB3aXRoIHRoZSBIVyBjYXBzCisgKiAgSGVsRGVzYzogU3RydWN0dXJlIHRvIGZpbGwgd2l0aCB0aGUgaGFyZGFyZSBlbXVsYXRpb24gY2FwcworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEM0RFUlJfKiBpZiBhIHByb2JsZW0gb2NjdXJzLiBTZWUgV2luZUQzRAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldENhcHMoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDICpIV0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDICpIZWxEZXNjKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBEM0RERVZJQ0VERVNDNyBuZXdEZXNjOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIGlmYWNlLCBIV0Rlc2MsIEhlbERlc2MpOworCisgICAgaHIgPSBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+ZGRyYXctPndpbmVEM0QsIEhXRGVzYywgJm5ld0Rlc2MpOworICAgIGlmKGhyICE9IEQzRF9PSykgcmV0dXJuIGhyOworCisgICAgKkhlbERlc2MgPSAqSFdEZXNjOworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldENhcHMoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDICpEM0RIV0RldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDICpEM0RIRUxEZXZEZXNjKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNESFdEZXZEZXNjLCBEM0RIRUxEZXZEZXNjKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19HZXRDYXBzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNESFdEZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNESEVMRGV2RGVzYyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldENhcHMoSURpcmVjdDNERGV2aWNlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0MgKkQzREhXRGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0MgKkQzREhFTERldkRlc2MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIEQzREhXRGV2RGVzYywgRDNESEVMRGV2RGVzYyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfR2V0Q2FwcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREhXRGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREhFTERldkRlc2MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTI6OlN3YXBUZXh0dXJlSGFuZGxlcworICoKKyAqIFN3YXBzIHRoZSB0ZXh0dXJlIGhhbmRsZXMgb2YgMiBUZXh0dXJlIGludGVyZmFjZXMuIFZlcnNpb24gMSBhbmQgMgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgVGV4MSwgVGV4MjogVGhlIDIgVGV4dHVyZXMgdG8gc3dhcAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzJfU3dhcFRleHR1cmVIYW5kbGVzKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RUZXh0dXJlMiAqVGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZTIgKlRleDIpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIElXaW5lRDNEVGV4dHVyZSAqdG1wOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYxID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIFRleDEpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYyID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIFRleDIpOworICAgIEZJWE1FKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBzdXJmMSwgc3VyZjIpOworCisKKyAgICAvKiBUaGUgdGV4dHVyZSBoYW5kbGUgaXMgc2ltcGx5IHRoZSBpbnRlcmZhY2UgYWRkcmVzcyBvZiB0aGUgV2luZUQzRFRleHR1cmUKKyAgICAgKiBpbnRlcmZhY2UuIFN3YXAgdGhlIGludGVyZmFjZSBwb2ludGVycy4KKyAgICAgKi8KKyAgICB0bXAgPSBzdXJmMS0+d2luZUQzRFRleHR1cmU7CisgICAgc3VyZjEtPndpbmVEM0RUZXh0dXJlID0gc3VyZjItPndpbmVEM0RUZXh0dXJlOworICAgIHN1cmYyLT53aW5lRDNEVGV4dHVyZSA9IHRtcDsKKworICAgIC8qIFdoYXQgYWJvdXQgdGhlIHBhcmVudD8gRG9lcyBpdCBoYXZlIHRvIGNoYW5nZSB0b28/IFRoaXMgY291bGQgY2F1c2UgYQorICAgICAqIHByb2JsZW0gd2hlbiBSZWxlYXNpbmcgdGhlIHN1cmZhY2VzLCBUaGVyZWZvcmUgdGhlIGZpeG1lCisgICAgICovCisKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9Td2FwVGV4dHVyZUhhbmRsZXMoSURpcmVjdDNERGV2aWNlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZSAqRDNEVGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZSAqRDNEVGV4MikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZjEgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBEM0RUZXgxKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmMiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIEQzRFRleDIpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMiBpbnRlcmZhY2UuXG4iLCBUaGlzLCBzdXJmMSwgc3VyZjIpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UyX1N3YXBUZXh0dXJlSGFuZGxlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0Uoc3VyZjEsIElEaXJlY3QzRFRleHR1cmUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0Uoc3VyZjIsIElEaXJlY3QzRFRleHR1cmUyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlMzo6R2V0U3RhdHMKKyAqCisgKiBUaGlzIG1ldGhvZCBzZWVtcyB0byByZXRyaWV2ZSBzb21lIHN0YXRzIGZyb20gdGhlIGRldmljZS4KKyAqIFRoZSBNU0ROIGRvY3VtZW50YXRpb24gZG9lc24ndCBleGlzdCBhbnkgbW9yZSwgYnV0IHRoZSBEM0RTVEFUUworICogc3RydWN0dXJlIHN1Z2dlc3RzIHRoYXQgdGhlIGFtb3V0IG9mIGRyYXduIHByaW1pdGl2ZXMgYW5kIHByb2Nlc3NlZAorICogdmVydGljZXMgaXMgcmV0dXJuZWQuCisgKgorICogRXhpc3RzIGluIFZlcnNpb24gMSwgMiBhbmQgMworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgU3RhdHM6IFBvaW50ZXIgdG8gYSBEM0RTVEFUUyBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgU3RhdHMgPT0gTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFN0YXRzKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFNUQVRTICpTdGF0cykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglcCk6IFN0dWIhXG4iLCBUaGlzLCBTdGF0cyk7CisKKyAgICBpZighU3RhdHMpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgLyogRmlsbCB0aGUgU3RhdHMgd2l0aCAwICovCisgICAgU3RhdHMtPmR3VHJpYW5nbGVzRHJhd24gPSAwOworICAgIFN0YXRzLT5kd0xpbmVzRHJhd24gPSAwOworICAgIFN0YXRzLT5kd1BvaW50c0RyYXduID0gMDsKKyAgICBTdGF0cy0+ZHdTcGFuc0RyYXduID0gMDsKKyAgICBTdGF0cy0+ZHdWZXJ0aWNlc1Byb2Nlc3NlZCA9IDA7CisKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRTdGF0cyhJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RTVEFUUyAqU3RhdHMpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGF0cyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfR2V0U3RhdHMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHMpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9HZXRTdGF0cyhJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFNUQVRTICpTdGF0cykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgU3RhdHMpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0dldFN0YXRzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U6OkNyZWF0ZUV4ZWN1dGVCdWZmZXIKKyAqCisgKiBDcmVhdGVzIGFuIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIHVzZWQgZm9yIHJlbmRlcmluZyB3aXRoIGEKKyAqIERpcmVjdDNERGV2aWNlLgorICoKKyAqIFZlcnNpb24gMSBvbmx5LgorICoKKyAqIFBhcmFtczoKKyAqICBEZXNjOiBCdWZmZXIgZGVzY3JpcHRpb24KKyAqICBFeGVjdXRlQnVmZmVyOiBBZGRyZXNzIHRvIHJldHVybiB0aGUgSW50ZXJmYWNlIHBvaW50ZXIgYXQKKyAqICBVbmtPdXRlcjogTXVzdCBiZSBOVUxMLiBCYXNpY2FsbHkgZm9yIGFnZ3JlYXRpb24sIHdoaWNoIGRkcmF3IGRvZXNuJ3QKKyAqICAgICAgICAgICAgc3VwcG9ydAorICoKKyAqIFJldHVybnM6CisgKiAgQ0xBU1NfRV9OT0FHR1JFR0FUSU9OIGlmIFVua091dGVyICE9IE5VTEwKKyAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiB3ZSByYW4gb3V0IG9mIG1lbW9yeQorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzFfQ3JlYXRlRXhlY3V0ZUJ1ZmZlcihJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgKkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICoqRXhlY3V0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCogb2JqZWN0OworICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJXApIVxuIiwgVGhpcywgRGVzYywgRXhlY3V0ZUJ1ZmZlciwgVW5rT3V0ZXIpOworCisgICAgaWYoVW5rT3V0ZXIpCisgICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgbmV3IEV4ZWN1dGUgQnVmZmVyICovCisgICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCkpOworICAgIGlmKCFvYmplY3QpCisgICAgeworICAgICAgICBFUlIoIk91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGEgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgc3RydWN0dXJlXG4iKTsKKyAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOworICAgIH0KKworICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX1Z0YmwpOworCisgICAgb2JqZWN0LT5yZWYgPSAxOworICAgIG9iamVjdC0+ZDNkZGV2ID0gVGhpczsKKworICAgIC8qIEluaXRpYWxpemVzIG1lbW9yeSAqLworICAgIG1lbWNweSgmb2JqZWN0LT5kZXNjLCBEZXNjLCBEZXNjLT5kd1NpemUpOworCisgICAgLyogTm8gYnVmZmVyIGdpdmVuICovCisgICAgaWYgKChvYmplY3QtPmRlc2MuZHdGbGFncyAmIEQzRERFQl9MUERBVEEpID09IDApCisgICAgICAgIG9iamVjdC0+ZGVzYy5scERhdGEgPSBOVUxMOworCisgICAgLyogTm8gYnVmZmVyIHNpemUgZ2l2ZW4gKi8KKyAgICBpZiAoKG9iamVjdC0+ZGVzYy5kd0ZsYWdzICYgRDNEREVCX0JVRlNJWkUpID09IDApCisgICAgICAgIG9iamVjdC0+ZGVzYy5kd0J1ZmZlclNpemUgPSAwOworCisgICAgLyogQ3JlYXRlIGJ1ZmZlciBpZiBhc2tlZCAqLworICAgIGlmICgob2JqZWN0LT5kZXNjLmxwRGF0YSA9PSBOVUxMKSAmJiAob2JqZWN0LT5kZXNjLmR3QnVmZmVyU2l6ZSA+IDApKQorICAgIHsKKyAgICAgICAgb2JqZWN0LT5uZWVkX2ZyZWUgPSBUUlVFOworICAgICAgICBvYmplY3QtPmRlc2MubHBEYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxvYmplY3QtPmRlc2MuZHdCdWZmZXJTaXplKTsKKyAgICAgICAgaWYoIW9iamVjdC0+ZGVzYy5scERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgdGhlIGV4ZWN1dGUgYnVmZmVyIGRhdGFcbiIpOworICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqZWN0KTsKKyAgICAgICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvYmplY3QtPm5lZWRfZnJlZSA9IEZBTFNFOworICAgIH0KKworICAgIC8qIE5vIHZlcnRpY2VzIGZvciB0aGUgbW9tZW50ICovCisgICAgb2JqZWN0LT52ZXJ0ZXhfZGF0YSA9IE5VTEw7CisKKyAgICBvYmplY3QtPmRlc2MuZHdGbGFncyB8PSBEM0RERUJfTFBEQVRBOworCisgICAgb2JqZWN0LT5pbmRpY2VzID0gTlVMTDsKKyAgICBvYmplY3QtPm5iX2luZGljZXMgPSAwOworCisgICAgKkV4ZWN1dGVCdWZmZXIgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIpOworCisgICAgVFJBQ0UoIiBSZXR1cm5pbmcgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBhdCAlcCwgaW1wbGVtZW50YXRpb24gaXMgYXQgJXBcbiIsICpFeGVjdXRlQnVmZmVyLCBvYmplY3QpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U6OkV4ZWN1dGUKKyAqCisgKiBFeGVjdXRlcyBhbGwgdGhlIHN0dWZmIGluIGFuIGV4ZWN1dGUgYnVmZmVyLgorICoKKyAqIFBhcmFtczoKKyAqICBFeGVjdXRlQnVmZmVyOiBUaGUgYnVmZmVyIHRvIGV4ZWN1dGUKKyAqICBWaWV3cG9ydDogVGhlIHZpZXdwb3J0IHVzZWQgZm9yIHJlbmRlcmluZworICogIEZsYWdzOiBTb21lIGZsYWdzCisgKgorICogUmV0dXJuczoKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEV4ZWN1dGVCdWZmZXIgPT0gTlVMTAorICogIEQzRF9PSyBvbiBzdWNlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfMV9FeGVjdXRlKElEaXJlY3QzRERldmljZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICpFeGVjdXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQgKlZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKkRpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgRXhlY3V0ZUJ1ZmZlcik7CisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpEaXJlY3QzRFZpZXdwb3J0SW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBWaWV3cG9ydCk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCUwOGx4KVxuIiwgVGhpcywgRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgRGlyZWN0M0RWaWV3cG9ydEltcGwsIEZsYWdzKTsKKworICAgIGlmKCFEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIC8qIEV4ZWN1dGUuLi4gKi8KKyAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9FeGVjdXRlKERpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIFRoaXMsIERpcmVjdDNEVmlld3BvcnRJbXBsKTsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlMzo6QWRkVmlld3BvcnQKKyAqCisgKiBBZGQgYSBEaXJlY3QzRFZpZXdwb3J0IHRvIHRoZSBkZXZpY2UncyB2aWV3cG9ydCBsaXN0LiBUaGVzZSB2aWV3cG9ydHMKKyAqIGFyZSB3cmFwcGVkIHRvIElEaXJlY3QzRERldmljZTcgdmlld3BvcnRzIGluIHZpZXdwb3J0LmMKKyAqCisgKiBFeGlzdHMgaW4gVmVyc2lvbiAxLCAyIGFuZCAzLiBOb3RlIHRoYXQgSURpcmVjdDNEVmlld3BvcnQgMSwgMiBhbmQgMworICogYXJlIHRoZSBzYW1lIGludGVyZmFjZXMuCisgKgorICogUGFyYW1zOgorICogIFZpZXdwb3J0OiBUaGUgdmlld3BvcnQgdG8gYWRkCisgKgorICogUmV0dXJuczoKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFZpZXdwb3J0ID09IE5VTEwKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX0FkZFZpZXdwb3J0KElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqVmlld3BvcnQpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgVmlld3BvcnQpOworCisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIHZwKTsKKworICAgIC8qIFNhbml0eSBjaGVjayAqLworICAgIGlmKCF2cCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICB2cC0+bmV4dCA9IFRoaXMtPnZpZXdwb3J0X2xpc3Q7CisgICAgVGhpcy0+dmlld3BvcnRfbGlzdCA9IHZwOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQWRkVmlld3BvcnQoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQyICpEaXJlY3QzRFZpZXdwb3J0MikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBEaXJlY3QzRFZpZXdwb3J0Mik7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIHZwKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19BZGRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRSh2cCwgSURpcmVjdDNEVmlld3BvcnQzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0FkZFZpZXdwb3J0KElEaXJlY3QzRERldmljZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQgKkRpcmVjdDNEVmlld3BvcnQpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgRGlyZWN0M0RWaWV3cG9ydCk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIHZwKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19BZGRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRSh2cCwgSURpcmVjdDNEVmlld3BvcnQzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlMzo6RGVsZXRlVmlld3BvcnQKKyAqCisgKiBEZWxldGVzIGEgRGlyZWN0M0RWaWV3cG9ydCBmcm9tIHRoZSBkZXZpY2UncyB2aWV3cG9ydCBsaXN0LgorICoKKyAqIEV4aXN0cyBpbiBWZXJzaW9uIDEsIDIgYW5kIDMuIE5vdGUgdGhhdCBhbGwgVmlld3BvcnQgaW50ZXJmYWNlIHZlcnNpb25zCisgKiBhcmUgZXF1YWwuCisgKgorICogUGFyYW1zOgorICogIFZpZXdwb3J0OiBUaGUgdmlld3BvcnQgdG8gZGVsZXRlCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgdGhlIHZpZXdwb3J0IHdhc24ndCBmb3VuZCBpbiB0aGUgbGlzdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX0RlbGV0ZVZpZXdwb3J0KElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqVmlld3BvcnQpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSAoSURpcmVjdDNEVmlld3BvcnRJbXBsICopIFZpZXdwb3J0OworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqY3VyX3ZpZXdwb3J0LCAqcHJldl92aWV3cG9ydCA9IE5VTEw7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgdnApOworCisgICAgY3VyX3ZpZXdwb3J0ID0gVGhpcy0+dmlld3BvcnRfbGlzdDsKKyAgICB3aGlsZSAoY3VyX3ZpZXdwb3J0ICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY3VyX3ZpZXdwb3J0ID09IHZwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHJldl92aWV3cG9ydCA9PSBOVUxMKSBUaGlzLT52aWV3cG9ydF9saXN0ID0gY3VyX3ZpZXdwb3J0LT5uZXh0OworICAgICAgICAgICAgZWxzZSBwcmV2X3ZpZXdwb3J0LT5uZXh0ID0gY3VyX3ZpZXdwb3J0LT5uZXh0OworICAgICAgICAgICAgLyogVE9ETyA6IGFkZCBkZXNhY3RpdmF0ZSBvZiB0aGUgdmlld3BvcnQgYW5kIGFsbCBhc3NvY2lhdGVkIGxpZ2h0cy4uLiAqLworICAgICAgICAgICAgcmV0dXJuIEQzRF9PSzsKKyAgICAgICAgfQorICAgICAgICBwcmV2X3ZpZXdwb3J0ID0gY3VyX3ZpZXdwb3J0OworICAgICAgICBjdXJfdmlld3BvcnQgPSBjdXJfdmlld3BvcnQtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0RlbGV0ZVZpZXdwb3J0KElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MiAqRGlyZWN0M0RWaWV3cG9ydDIpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgRGlyZWN0M0RWaWV3cG9ydDIpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCB2cCk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfRGVsZXRlVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UodnAsIElEaXJlY3QzRFZpZXdwb3J0MykpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9EZWxldGVWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0ICpEaXJlY3QzRFZpZXdwb3J0MikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZwID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIERpcmVjdDNEVmlld3BvcnQyKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgdnApOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0RlbGV0ZVZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKHZwLCBJRGlyZWN0M0RWaWV3cG9ydDMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2UzOjpOZXh0Vmlld3BvcnQKKyAqCisgKiBSZXR1cm5zIGFuIHZpZXdwb3J0IGZyb20gdGhlIHZpZXdwb3J0IGxpc3QsIGRlcGVuZGluZyBvbiB0aGUKKyAqIHBhc3NlZCB2aWV3cG9ydCBhbmQgdGhlIGZsYWdzLgorICoKKyAqIEV4aXN0cyBpbiBWZXJzaW9uIDEsIDIgYW5kIDMuIE5vdGUgdGhhdCBhbGwgVmlld3BvcnQgaW50ZXJmYWNlIHZlcnNpb25zCisgKiBhcmUgZXF1YWwuCisgKgorICogUGFyYW1zOgorICogIFZpZXdwb3J0OiBWaWV3cG9ydCB0byB1c2UgZm9yIGJlZ2lubmluZyB0aGUgc2VhcmNoCisgKiAgRmxhZ3M6IEQzRE5FWFRfTkVYVCwgRDNETkVYVF9IRUFEIG9yIEQzRE5FWFRfVEFJTAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSBmbGFncyB3ZXJlIHdyb25nLCBpciBWaWV3cG9ydCB3YXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX05leHRWaWV3cG9ydChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQzICpWaWV3cG9ydDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqKmxwbHBEaXJlY3QzRFZpZXdwb3J0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgVmlld3BvcnQzKTsKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnJlcyA9IE5VTEw7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCUwOGx4KVxuIiwgVGhpcywgdnAsIGxwbHBEaXJlY3QzRFZpZXdwb3J0MywgRmxhZ3MpOworCisgICAgaWYoIXZwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgICAgICpscGxwRGlyZWN0M0RWaWV3cG9ydDMgPSBOVUxMOworICAgIH0KKworCisgICAgc3dpdGNoIChGbGFncykKKyAgICB7CisgICAgICAgIGNhc2UgRDNETkVYVF9ORVhUOgorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSB2cC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEM0RORVhUX0hFQUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IFRoaXMtPnZpZXdwb3J0X2xpc3Q7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRDNETkVYVF9UQUlMOgorICAgICAgICB7CisgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cl92aWV3cG9ydCA9IFRoaXMtPnZpZXdwb3J0X2xpc3Q7CisgICAgICAgICAgICBpZiAoY3VyX3ZpZXdwb3J0ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cl92aWV3cG9ydC0+bmV4dCAhPSBOVUxMKSBjdXJfdmlld3BvcnQgPSBjdXJfdmlld3BvcnQtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBjdXJfdmlld3BvcnQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqbHBscERpcmVjdDNEVmlld3BvcnQzID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgICpscGxwRGlyZWN0M0RWaWV3cG9ydDMgPSBJQ09NX0lOVEVSRkFDRShyZXMsIElEaXJlY3QzRFZpZXdwb3J0Myk7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfTmV4dFZpZXdwb3J0KElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDIgKlZpZXdwb3J0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQyICoqbHBscERpcmVjdDNEVmlld3BvcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBWaWV3cG9ydDIpOworICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqcmVzOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwLCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIFRoaXMsIHZwLCBscGxwRGlyZWN0M0RWaWV3cG9ydDIsIEZsYWdzKTsKKyAgICBociA9IElEaXJlY3QzRERldmljZTNfTmV4dFZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UodnAsIElEaXJlY3QzRFZpZXdwb3J0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworICAgICpscGxwRGlyZWN0M0RWaWV3cG9ydDIgPSAoSURpcmVjdDNEVmlld3BvcnQyICopIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgSURpcmVjdDNEVmlld3BvcnQzLCByZXMpOworICAgIHJldHVybiBocjsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfTmV4dFZpZXdwb3J0KElEaXJlY3QzRERldmljZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0ICpWaWV3cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQgKipscGxwRGlyZWN0M0RWaWV3cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBWaWV3cG9ydCk7CisgICAgSURpcmVjdDNEVmlld3BvcnQzICpyZXM7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXAsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgdnAsIGxwbHBEaXJlY3QzRFZpZXdwb3J0LCBGbGFncyk7CisgICAgaHIgPSBJRGlyZWN0M0REZXZpY2UzX05leHRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKHZwLCBJRGlyZWN0M0RWaWV3cG9ydDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKKyAgICAqbHBscERpcmVjdDNEVmlld3BvcnQgPSAoSURpcmVjdDNEVmlld3BvcnQgKikgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBJRGlyZWN0M0RWaWV3cG9ydDMsIHJlcyk7CisgICAgcmV0dXJuIGhyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTo6UGljaworICoKKyAqIEV4ZWN1dGVzIGFuIGV4ZWN1dGUgYnVmZmVyIHdpdGhvdXQgcGVyZm9ybWluZyByZW5kZXJpbmcuIEluc3RlYWQsIGEKKyAqIGxpc3Qgb2YgcHJpbWl0aXZlcyB0aGF0IGludGVyc2VjdCB3aXRoICh4MSx5MSkgb2YgdGhlIHBhc3NlZCByZWN0YW5nbGUKKyAqIGlzIGNyZWF0ZWQuIElEaXJlY3QzRERldmljZTo6R2V0UGlja1JlY29yZHMgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUKKyAqIHRoaXMgbGlzdC4KKyAqCisgKiBWZXJzaW9uIDEgb25seQorICoKKyAqIFBhcmFtczoKKyAqICBFeGVjdXRlQnVmZmVyOiBCdWZmZXIgdG8gZXhlY3V0ZQorICogIFZpZXdwb3J0OiBWaWV3cG9ydCB0byB1c2UgZm9yIGV4ZWN1dGlvbgorICogIEZsYWdzOiBOb25lIGFyZSBkZWZpbmVkLCBhY2NvcmRpbmcgdG8gdGhlIFNESworICogIFJlY3Q6IFNwZWNpZmllcyB0aGUgY29vcmRpbmF0ZXMgdG8gYmUgcGlja2VkLiBPbmx5IHgxIGFuZCB5MiBhcmUgdXNlZCwKKyAqICAgICAgICB4MiBhbmQgeTIgYXJlIGlnbm9yZWQuCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8xX1BpY2soSURpcmVjdDNERGV2aWNlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKkV4ZWN1dGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydCAqVmlld3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFQ1QgKlJlY3QpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKmV4ZWNidWYgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgRXhlY3V0ZUJ1ZmZlcik7CisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICp2cCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBWaWV3cG9ydCk7CisgICAgRklYTUUoIiglcCktPiglcCwlcCwlMDhseCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBleGVjYnVmLCB2cCwgRmxhZ3MsIFJlY3QpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U6OkdldFBpY2tSZWNvcmRzCisgKgorICogUmV0cmlldmVzIHRoZSBwaWNrIHJlY29yZHMgZ2VuZXJhdGVkIGJ5IElEaXJlY3QzRERldmljZTo6R2V0UGlja1JlY29yZHMKKyAqCisgKiBWZXJzaW9uIDEgb25seQorICoKKyAqIFBhcmFtczoKKyAqICBDb3VudDogUG9pbnRlciB0byBhIERXT1JEIGNvbnRhaW5pbmcgdGhlIG51bWJlcnMgb2YgcGljayByZWNvcmRzIHRvCisgKiAgICAgICAgIHJldHJpZXZlCisgKiAgRDNEUGlja1JlYzogQWRkcmVzcyB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIEQzRFBJQ0tSRUNPUkQgYXJyeS4KKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldFBpY2tSZWNvcmRzKElEaXJlY3QzRERldmljZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBJQ0tSRUNPUkQgKkQzRFBpY2tSZWMpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBDb3VudCwgRDNEUGlja1JlYyk7CisKKyAgICByZXR1cm4gRDNEX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVudW1UZXh0dXJlRm9ybWF0c0NCCisgKgorICogQ2FsbGJhY2sgY2FsbGVkIGJ5IFdpbmVEM0QgZm9yIGVhY2ggZW51bWVyYXRlZCBUZXh0dXJlIGZvcm1hdC4gSXQKKyAqIHRyYW5zbGF0ZXMgdGhlIFdpbmVEM0RGb3JtYXQgaW50byBhIGRkcmF3IHBpeGVsIGZvcm1hdCBhbmQgY2FsbHMKKyAqIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjaworICoKKyAqIFBhcmFtczoKKyAqICBEZXZpY2U6IFRoZSBXaW5lRDNERGV2aWNlJ3MgcGFyZW50cyA9IFRoZSBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZQorICogICAgICAgICAgb2Ygb3VyIGRldmljZQorICogIGZtdDogQW4gZW51bWVyYXRlZCBwaXhlbCBmb3JtYXQKKyAqICBDb250ZXh0OiBEYXRhIHBvaW50ZXIgcGFzc2VkIHRvIFdpbmVEM0QgYnkKKyAqICAgICAgICAgICBJRGlyZWN0M0REZXZpY2U3OjpFbnVtVGV4dXJlZm9ybWF0cworICoKKyAqIFJldHVybnM6CisgKiAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24tcHJvdmlkZWQgY2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0VudW1UZXh0dXJlRm9ybWF0c0NCKElVbmtub3duICpEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCit7CisgICAgc3RydWN0IEVudW1UZXh0dXJlRm9ybWF0c0NCUyAqY2JzID0gKHN0cnVjdCBFbnVtVGV4dHVyZUZvcm1hdHNDQlMgKikgQ29udGV4dDsKKworICAgIEREU1VSRkFDRURFU0Mgc2Rlc2M7CisgICAgRERQSVhFTEZPUk1BVCAqcGZvcm1hdDsKKworICAgIG1lbXNldCgmc2Rlc2MsIDAsIHNpemVvZihERFNVUkZBQ0VERVNDKSk7CisgICAgc2Rlc2MuZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MpOworICAgIHNkZXNjLmR3RmxhZ3MgPSBERFNEX1BJWEVMRk9STUFUIHwgRERTRF9DQVBTOworICAgIHNkZXNjLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19URVhUVVJFOworICAgIHBmb3JtYXQgPSAmKHNkZXNjLmRkcGZQaXhlbEZvcm1hdCk7CisgICAgcGZvcm1hdC0+ZHdTaXplID0gc2l6ZW9mKEREUElYRUxGT1JNQVQpOworCisgICAgUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQocGZvcm1hdCwgZm10KTsKKworICAgIGlmKCAoIGZtdCA9PSBXSU5FRDNERk1UX1VZVlkpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX1lVWTIpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0RYVDEpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0RYVDIpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0RYVDMpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0RYVDQpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0RYVDUpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX01VTFRJMl9BUkdCKSB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0c4UjhfRzhCOCkgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX1I4RzhfQjhHOCkgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0w4KSAgICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0E4TDgpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0E0TDQpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX1Y4VTgpICAgICAgICB8fAorICAgICAgICAoIGZtdCA9PSBXSU5FRDNERk1UX0w2VjVVNSkgICAgICApCisgICAgeworICAgICAgICAvKiBUaGVzZSBmb3JtYXRzIGV4aXN0IGV4aXN0IGluIEQzRDMgYW5kIEQzRDcgb25seSwKKyAgICAgICAgICogc28gZG8gbm90IGNhbGwgdGhlIG9sZGVyIGNhbGxiYWNrCisgICAgICAgICAqLworICAgICAgICBpZihjYnMtPmNidjcpIHJldHVybiBjYnMtPmNidjcocGZvcm1hdCwgY2JzLT5Db250ZXh0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogT25seSBvbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCAqLworICAgICAgICBpZihjYnMtPmNidjIpIHJldHVybiBjYnMtPmNidjIoJnNkZXNjLCBjYnMtPkNvbnRleHQpOworICAgICAgICBpZihjYnMtPmNidjcpIHJldHVybiBjYnMtPmNidjcocGZvcm1hdCwgY2JzLT5Db250ZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gRERFTlVNUkVUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkVudW1UZXh0dXJlZm9ybWF0cworICoKKyAqIEVudW1lcmF0ZXMgdGhlIHN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdHMuIFRoaXMgaXMgcmVsYXllZCB0byBXaW5lRDNELAorICogYW5kIGEgRW51bVRleHR1cmVGb3JtYXRzQ0IgdHJhbnNsYXRlZCB0aGUgV2luZUQzREZvcm1hdHMgdG8gRERyYXcKKyAqIGZvcm1hdHMgYW5kIGNhbGxzIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjay4KKyAqCisgKiBUaGlzIGlzIGZvciBWZXJzaW9uIDcgYW5kIDMsIHRoZSBvbGRlciB2ZXJzaW9ucyBoYXZlIGEgZGlmZmVyZW50CisgKiBjYWxsYmFjayBmdW5jdGlvbiBhbmQgdGhlaXIgb3duIGltcGxlbWVudGF0aW9uCisgKgorICogUGFyYW1zOgorICogIENhbGxiYWNrOiBDYWxsYmFjayB0byBjYWxsIGZvciBlYWNoIGVudW1lcmF0ZWQgZm9ybWF0CisgKiAgQXJnOiBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBjYWxsYmFjaworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIENhbGxiYWNrID09IE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19FbnVtVGV4dHVyZUZvcm1hdHMoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpBcmcpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIEhSRVNVTFQgaHI7CisgICAgc3RydWN0IEVudW1UZXh0dXJlRm9ybWF0c0NCUyBjYnMgPSB7IE5VTEwsIENhbGxiYWNrLCBBcmcgfTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKTogUmVsYXlcbiIsIFRoaXMsIENhbGxiYWNrLCBBcmcpOworCisgICAgaWYoIUNhbGxiYWNrKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfRW51bVRleHR1cmVGb3JtYXRzKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVRleHR1cmVGb3JtYXRzQ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNicyk7CisgICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChocik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0VudW1UZXh0dXJlRm9ybWF0cyhJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkFyZykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIENhbGxiYWNrLCBBcmcpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0VudW1UZXh0dXJlRm9ybWF0cyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlMjo6RW51bVRleHR1cmVmb3JtYXRzCisgKgorICogRW51bVRleHR1cmVGb3JtYXRzIGZvciBWZXJzaW9uIDEgYW5kIDIsIHNlZQorICogSURpcmVjdDNERGV2aWNlNzo6RW51bVRleHVyZUZvcm1hdHMgZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8yX0VudW1UZXh0dXJlRm9ybWF0cyhJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNVEVYVFVSRUZPUk1BVFNDQUxMQkFDSyBDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQXJnKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBIUkVTVUxUIGhyOworICAgIHN0cnVjdCBFbnVtVGV4dHVyZUZvcm1hdHNDQlMgY2JzID0geyBDYWxsYmFjaywgTlVMTCwgQXJnIH07CisgICAgVFJBQ0UoIiglcCktPiglcCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBDYWxsYmFjaywgQXJnKTsKKworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfRW51bVRleHR1cmVGb3JtYXRzKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVRleHR1cmVGb3JtYXRzQ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNicyk7CisgICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChocik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0VudW1UZXh0dXJlRm9ybWF0cyhJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1URVhUVVJFRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpBcmcpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UyIGludGVyZmFjZS5cbiIsIFRoaXMsIENhbGxiYWNrLCBBcmcpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UyX0VudW1UZXh0dXJlRm9ybWF0cyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlOjpDcmVhdGVNYXRyaXgKKyAqCisgKiBDcmVhdGVzIGEgbWF0cml4IGhhbmRsZS4gSW4gV2luZSwgTWF0cml4IGhhbmRsZXMgYXJlIHNpbXBseSBwb2ludGVycworICogdG8gYSBEM0RNQVRSSVggc3RydWN0dXJlCisgKgorICogVmVyc2lvbiAxIG9ubHkKKyAqCisgKiBQYXJhbXMKKyAqICBEM0RNYXRIYW5kbGU6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBoYW5kbGUgYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEM0RNYXRIYW5kbGUgPSBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzFfQ3JlYXRlTWF0cml4KElEaXJlY3QzRERldmljZSAqaWZhY2UsIEQzRE1BVFJJWEhBTkRMRSAqRDNETWF0SGFuZGxlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBEM0RNYXRIYW5kbGUpOworCisgICAgaWYoIUQzRE1hdEhhbmRsZSkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAqRDNETWF0SGFuZGxlID0gKEQzRE1BVFJJWEhBTkRMRSkgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihEM0RNQVRSSVgpKTsKKyAgICBUUkFDRSgiIHJldHVybmluZyBtYXRyaXggaGFuZGxlICVwXG4iLCAodm9pZCAqKSAqRDNETWF0SGFuZGxlKTsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlOjpTZXRNYXRyaXgKKyAqCisgKiBTZXRzIGEgbWF0cml4IGZvciBhIG1hdHJpeCBoYW5kbGUuIEFzIG1hdHJpeCBoYW5kbGVzIGFyZSBwb2ludGVycyB0bworICogYSBEM0RNQVRSSVggc3RydWN0dXJlLCB0aGUgbWF0cml4IGlzIHNpbXBseSBjb3BpZWQgaW50byB0aGUgYWxsb2NhdGVkCisgKiBtZW1vcnkuCisgKgorICogVmVyc2lvbiAxIG9ubHkKKyAqCisgKiBQYXJhbXM6CisgKiAgRDNETWF0SGFuZGxlOiBIYW5kbGUgdG8gc2V0IHRoZSBtYXRyaXggdG8KKyAqICBEM0RNYXRyaXg6IE1hdHJpeCB0byBzZXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiB0aGUgaGFuZGxlIG9mIHRoZSBtYXRyaXggaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8xX1NldE1hdHJpeChJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVhIQU5ETEUgRDNETWF0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVggKkQzRE1hdHJpeCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwKVxuIiwgVGhpcywgKERXT1JEKSBEM0RNYXRIYW5kbGUsIEQzRE1hdHJpeCk7CisKKyAgICBpZiggKCFEM0RNYXRIYW5kbGUpIHx8ICghRDNETWF0cml4KSApCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaWYgKFRSQUNFX09OKGQzZDcpKQorICAgICAgICBkdW1wX0QzRE1BVFJJWChEM0RNYXRyaXgpOworCisgICAgKigoRDNETUFUUklYICopIEQzRE1hdEhhbmRsZSkgPSAqRDNETWF0cml4OworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U6OlNldE1hdHJpeAorICoKKyAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgYSBEM0RNQVRSSVggaGFuZGxlCisgKgorICogVmVyc2lvbiAxIG9ubHkKKyAqCisgKiBQYXJhbXM6CisgKiAgRDNETWF0SGFuZGxlOiBNYXRyaXggaGFuZGxlIHRvIHJlYWQgdGhlIGNvbnRlbnQgZnJvbQorICogIEQzRE1hdHJpeDogQWRkcmVzcyB0byBzdG9yZSB0aGUgY29udGVudCBhdAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEQzRE1hdEhhbmRsZSBvciBEM0RNYXRyaXggYXJlIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfMV9HZXRNYXRyaXgoSURpcmVjdDNERGV2aWNlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYSEFORExFIEQzRE1hdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYICpEM0RNYXRyaXgpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglMDhseCwlcClcbiIsIFRoaXMsIChEV09SRCkgRDNETWF0SGFuZGxlLCBEM0RNYXRyaXgpOworCisgICAgaWYoIUQzRE1hdHJpeCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgaWYoIShEM0RNQVRSSVggKikgRDNETWF0SGFuZGxlKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIC8qIFRoZSBoYW5kbGUgaXMgc2ltcGx5IGEgcG9pbnRlciB0byBhIEQzRE1BVFJJWCBzdHJ1Y3R1cmUgKi8KKyAgICAqRDNETWF0cml4ID0gKigoRDNETUFUUklYICopIEQzRE1hdEhhbmRsZSk7CisKKyAgICByZXR1cm4gRDNEX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTo6RGVsZXRlTWF0cml4CisgKgorICogRGVzdHJveXMgYSBNYXRyaXggaGFuZGxlLgorICoKKyAqIFZlcnNpb24gMSBvbmx5CisgKgorICogUGFyYW1zOgorICogIEQzRE1hdEhhbmRsZTogSGFuZGxlIHRvIGRlc3Ryb3kKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEM0RNYXRIYW5kbGUgaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8xX0RlbGV0ZU1hdHJpeChJRGlyZWN0M0REZXZpY2UgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVhIQU5ETEUgRDNETWF0SGFuZGxlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgpXG4iLCBUaGlzLCAoRFdPUkQpIEQzRE1hdEhhbmRsZSk7CisKKyAgICBpZighKEQzRE1BVFJJWCAqKSBEM0RNYXRIYW5kbGUpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKHZvaWQgKikgRDNETWF0SGFuZGxlKTsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6QmVnaW5TY2VuZQorICoKKyAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcmVuZGVyaW5nIGlzIHBlcmZvcm1lZC4KKyAqIElEaXJlY3QzRERldmljZTo6RW5kU2NlbmUgaGFzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgc2NlbmUgaXMgY29tcGxldGUKKyAqCisgKiBWZXJzaW9uIDEsIDIsIDMgYW5kIDcKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNlc3MsIGZvciBkZXRhaWxzIHNlZSBJV2luZUQzRERldmljZTo6QmVnaW5TY2VuZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0JlZ2luU2NlbmUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApOiBSZWxheVxuIiwgVGhpcyk7CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfQmVnaW5TY2VuZShUaGlzLT53aW5lRDNERGV2aWNlKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW5TY2VuZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19CZWdpblNjZW5lKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQmVnaW5TY2VuZShJRGlyZWN0M0REZXZpY2UyICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19CZWdpblNjZW5lKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfQmVnaW5TY2VuZShJRGlyZWN0M0REZXZpY2UgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfQmVnaW5TY2VuZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6RW5kU2NlbmUKKyAqCisgKiBFbmRzIGEgc2NlbmUgdGhhdCBoYXMgYmVlbiBiZWd1biB3aXRoIElEaXJlY3QzRERldmljZTc6OkJlZ2luU2NlbmUuCisgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciByZW5kZXJpbmcgaXMgZmluaXNoZWQuCisgKgorICogVmVyc2lvbiAxLCAyLCAzIGFuZCA3CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcywgZm9yIGRldGFpbHMgc2VlIElXaW5lRDNERGV2aWNlOjpFbmRTY2VuZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0VuZFNjZW5lKElEaXJlY3QzRERldmljZTcgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKTogUmVsYXlcbiIsIFRoaXMpOworCisgICAgSVdpbmVEM0REZXZpY2VfRW5kU2NlbmUoVGhpcy0+d2luZUQzRERldmljZSk7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRW5kU2NlbmUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRW5kU2NlbmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNykpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9FbmRTY2VuZShJRGlyZWN0M0REZXZpY2UyICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19FbmRTY2VuZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0VuZFNjZW5lKElEaXJlY3QzRERldmljZSAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19FbmRTY2VuZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6R2V0RGlyZWN0M0QKKyAqCisgKiBSZXR1cm5zIHRoZSBJRGlyZWN0M0QoPSBpbnRlcmZhY2UgdG8gdGhlIERpcmVjdERyYXcgb2JqZWN0KSB1c2VkIHRvIGNyZWF0ZQorICogdGhpcyBkZXZpY2UuCisgKgorICogUGFyYW1zOgorICogIERpcmVjdDNENzogQWRkcmVzcyB0byBzdG9yZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEaXJlY3QzRDcgPT0gTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0dldERpcmVjdDNEKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRDcgKipEaXJlY3QzRDcpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBEaXJlY3QzRDcpOworCisgICAgaWYoIURpcmVjdDNENykKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAqRGlyZWN0M0Q3ID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRDcpOworICAgIElEaXJlY3QzRDdfQWRkUmVmKCpEaXJlY3QzRDcpOworCisgICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwXG4iLCAqRGlyZWN0M0Q3KTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXREaXJlY3QzRChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0QzICoqRGlyZWN0M0QzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBIUkVTVUxUIHJldDsKKyAgICBJRGlyZWN0M0Q3ICpyZXRfcHRyOworCisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNEMyk7CisgICAgcmV0ID0gSURpcmVjdDNERGV2aWNlN19HZXREaXJlY3QzRChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfcHRyKTsKKyAgICBpZihyZXQgIT0gRDNEX09LKQorICAgICAgICByZXR1cm4gcmV0OworICAgICpEaXJlY3QzRDMgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBJRGlyZWN0M0QzLCByZXRfcHRyKTsKKyAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXBcbiIsICpEaXJlY3QzRDMpOworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldERpcmVjdDNEKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRDIgKipEaXJlY3QzRDIpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIEhSRVNVTFQgcmV0OworICAgIElEaXJlY3QzRDcgKnJldF9wdHI7CisKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0QyKTsKKyAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldERpcmVjdDNEKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldF9wdHIpOworICAgIGlmKHJldCAhPSBEM0RfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKkRpcmVjdDNEMiA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIElEaXJlY3QzRDIsIHJldF9wdHIpOworICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcFxuIiwgKkRpcmVjdDNEMik7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0RGlyZWN0M0QoSURpcmVjdDNERGV2aWNlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0QgKipEaXJlY3QzRCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKKyAgICBIUkVTVUxUIHJldDsKKyAgICBJRGlyZWN0M0Q3ICpyZXRfcHRyOworCisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNEKTsKKyAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldERpcmVjdDNEKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldF9wdHIpOworICAgIGlmKHJldCAhPSBEM0RfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgKkRpcmVjdDNEID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgSURpcmVjdDNELCByZXRfcHRyKTsKKyAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXBcbiIsICpEaXJlY3QzRCk7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2UzOjpTZXRDdXJyZW50Vmlld3BvcnQKKyAqCisgKiBTZXRzIGEgRGlyZWN0M0RWaWV3cG9ydCBhcyB0aGUgY3VycmVudCB2aWV3cG9ydC4KKyAqIEZvciB0aGUgdGh1bmtzIG5vdGUgdGhhdCBhbGwgdmlld3BvcnQgaW50ZXJmYWNlIHZlcnNpb25zIGFyZSBlcXVhbAorICoKKyAqIFBhcmFtczoKKyAqICBEaXJlY3QzRFZpZXdwb3J0MzogVGhlIHZpZXdwb3J0IHRvIHNldAorICoKKyAqIFZlcnNpb24gMiBhbmQgMworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICAoSXMgYSBOVUxMIHZpZXdwb3J0IHZhbGlkPykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfM19TZXRDdXJyZW50Vmlld3BvcnQoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqRGlyZWN0M0RWaWV3cG9ydDMpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqdnAgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgRGlyZWN0M0RWaWV3cG9ydDMpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBEaXJlY3QzRFZpZXdwb3J0Myk7CisKKyAgICAvKiBEbyBub3RoaW5nIGlmIHRoZSBzcGVjaWZpZWQgdmlld3BvcnQgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgb25lICovCisgICAgaWYgKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQgPT0gdnAgKQorICAgICAgcmV0dXJuIEQzRF9PSzsKKworICAgIC8qIFNob3VsZCBjaGVjayBpZiB0aGUgdmlld3BvcnQgd2FzIGFkZGVkIG9yIG5vdCAqLworCisgICAgLyogUmVsZWFzZSBwcmV2aW91cyB2aWV3cG9ydCBhbmQgQWRkUmVmIHRoZSBuZXcgb25lICovCisgICAgaWYgKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQpCisgICAgeworICAgICAgICBUUkFDRSgiVmlld3BvcnRJbXBsIGlzIGF0ICVwLCBpbnRlcmZhY2UgaXMgYXQgJXBcbiIsIFRoaXMtPmN1cnJlbnRfdmlld3BvcnQsIElDT01fSU5URVJGQUNFKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQsIElEaXJlY3QzRFZpZXdwb3J0MykpOworICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDNfUmVsZWFzZSggSUNPTV9JTlRFUkZBQ0UoVGhpcy0+Y3VycmVudF92aWV3cG9ydCwgSURpcmVjdDNEVmlld3BvcnQzKSApOworICAgIH0KKyAgICBJRGlyZWN0M0RWaWV3cG9ydDNfQWRkUmVmKERpcmVjdDNEVmlld3BvcnQzKTsKKworICAgIC8qIFNldCB0aGlzIHZpZXdwb3J0IGFzIHRoZSBjdXJyZW50IHZpZXdwb3J0ICovCisgICAgVGhpcy0+Y3VycmVudF92aWV3cG9ydCA9IHZwOworCisgICAgLyogQWN0aXZhdGUgdGhpcyB2aWV3cG9ydCAqLworICAgIFRoaXMtPmN1cnJlbnRfdmlld3BvcnQtPmFjdGl2ZV9kZXZpY2UgPSBUaGlzOworICAgIFRoaXMtPmN1cnJlbnRfdmlld3BvcnQtPmFjdGl2YXRlKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0Q3VycmVudFZpZXdwb3J0KElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDIgKkRpcmVjdDNEVmlld3BvcnQyKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKnZwID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIERpcmVjdDNEVmlld3BvcnQyKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgdnApOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX1NldEN1cnJlbnRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UodnAsIElEaXJlY3QzRFZpZXdwb3J0MykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTM6OkdldEN1cnJlbnRWaWV3cG9ydAorICoKKyAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgdmlld3BvcnQuCisgKgorICogVmVyc2lvbiAyIGFuZCAzCisgKgorICogUGFyYW1zOgorICogIERpcmVjdDNEVmlld3BvcnQzOiBBZGRyZXNzIHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEaXJlY3QzRFZpZXdwb3J0ID09IE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfM19HZXRDdXJyZW50Vmlld3BvcnQoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqKkRpcmVjdDNEVmlld3BvcnQzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgRGlyZWN0M0RWaWV3cG9ydDMpOworCisgICAgaWYoIURpcmVjdDNEVmlld3BvcnQzKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgICpEaXJlY3QzRFZpZXdwb3J0MyA9IElDT01fSU5URVJGQUNFKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQsIElEaXJlY3QzRFZpZXdwb3J0Myk7CisKKyAgICAvKiBBZGRSZWYgdGhlIHJldHVybmVkIHZpZXdwb3J0ICovCisgICAgSURpcmVjdDNEVmlld3BvcnQzX0FkZFJlZigqRGlyZWN0M0RWaWV3cG9ydDMpOworCisgICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwXG4iLCAqRGlyZWN0M0RWaWV3cG9ydDMpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0Q3VycmVudFZpZXdwb3J0KElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDIgKipEaXJlY3QzRFZpZXdwb3J0MikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0RWaWV3cG9ydDIpOworICAgIGhyID0gSURpcmVjdDNERGV2aWNlM19HZXRDdXJyZW50Vmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0RWaWV3cG9ydDMgKiopIERpcmVjdDNEVmlld3BvcnQyKTsKKyAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKKyAgICAqRGlyZWN0M0RWaWV3cG9ydDIgPSAoSURpcmVjdDNEVmlld3BvcnQyICopIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgSURpcmVjdDNEVmlld3BvcnQzLCBEaXJlY3QzRFZpZXdwb3J0Mik7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRSZW5kZXJUYXJnZXQKKyAqCisgKiBTZXRzIHRoZSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgRGlyZWN0M0REZXZpY2UuCisgKiBGb3IgdGhlIHRodW5rcyBub3RlIHRoYXQgSURpcmVjdERyYXdTdXJmYWNlNyA9PSBJRGlyZWN0RHJhd1N1cmZhY2U0IGFuZAorICogSURpcmVjdERyYXdTdXJmYWNlMyA9PSBJRGlyZWN0RHJhd1N1cmZhY2UKKyAqCisgKiBWZXJzaW9uIDIsIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgTmV3VGFyZ2V0OiBQb2ludGVyIHRvIGFuIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlIHRvIHNldCBhcyB0aGUgbmV3CisgKiAgICAgICAgICAgICByZW5kZXIgdGFyZ2V0CisgKiAgRmxhZ3M6IFNvbWUgZmxhZ3MKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzLCBmb3IgZGV0YWlscyBzZWUgSVdpbmVEM0REZXZpY2U6OlNldFJlbmRlclRhcmdldAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFJlbmRlclRhcmdldChJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqTmV3VGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGFyZ2V0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgTmV3VGFyZ2V0KTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCUwOGx4KTogUmVsYXlcbiIsIFRoaXMsIE5ld1RhcmdldCwgRmxhZ3MpOworCisgICAgLyogRmxhZ3M6IE5vdCB1c2VkICovCisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyVGFyZ2V0KFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ID8gVGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSA6IE5VTEwpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTQgKk5ld1JlbmRlclRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRhcmdldCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIE5ld1JlbmRlclRhcmdldCk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFRhcmdldCwgRmxhZ3MpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclRhcmdldChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNPTV9JTlRFUkZBQ0UoVGFyZ2V0LCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqTmV3UmVuZGVyVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGFyZ2V0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlMywgTmV3UmVuZGVyVGFyZ2V0KTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgVGFyZ2V0LCBGbGFncyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyVGFyZ2V0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShUYXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6R2V0UmVuZGVyVGFyZ2V0CisgKgorICogUmV0dXJucyB0aGUgY3VycmVudCByZW5kZXIgdGFyZ2V0LgorICogVGhpcyBpcyBoYW5kbGVkIGxvY2FsbHksIGJlY2F1c2UgdGhlIFdpbmVEM0QgcmVuZGVyIHRhcmdldCdzIHBhcmVudAorICogaXMgYW4gSVBhcmVudAorICoKKyAqIFZlcnNpb24gMiwgMyBhbmQgNworICoKKyAqIFBhcmFtczoKKyAqICBSZW5kZXJUYXJnZXQ6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIHN1cmZhY2UgaW50ZXJmYWNlIHBvaW50ZXIKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBSZW5kZXJUYXJnZXQgPT0gTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFJlbmRlclRhcmdldChJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqKlJlbmRlclRhcmdldCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCk6IFJlbGF5XG4iLCBUaGlzLCBSZW5kZXJUYXJnZXQpOworCisgICAgaWYoIVJlbmRlclRhcmdldCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAqUmVuZGVyVGFyZ2V0ID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+dGFyZ2V0LCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZigqUmVuZGVyVGFyZ2V0KTsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFJlbmRlclRhcmdldChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNCAqKlJlbmRlclRhcmdldCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgUmVuZGVyVGFyZ2V0KTsKKyAgICBociA9IElEaXJlY3QzRERldmljZTdfR2V0UmVuZGVyVGFyZ2V0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3REcmF3U3VyZmFjZTcgKiopIFJlbmRlclRhcmdldCk7CisgICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CisgICAgKlJlbmRlclRhcmdldCA9IChJRGlyZWN0RHJhd1N1cmZhY2U0ICopIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBSZW5kZXJUYXJnZXQpOworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclRhcmdldChJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlICoqUmVuZGVyVGFyZ2V0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBSZW5kZXJUYXJnZXQpOworICAgIGhyID0gSURpcmVjdDNERGV2aWNlN19HZXRSZW5kZXJUYXJnZXQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdERyYXdTdXJmYWNlNyAqKikgUmVuZGVyVGFyZ2V0KTsKKyAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKKyAgICAqUmVuZGVyVGFyZ2V0ID0gKElEaXJlY3REcmF3U3VyZmFjZSAqKSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdERyYXdTdXJmYWNlMywgUmVuZGVyVGFyZ2V0KTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTM6OkJlZ2luCisgKgorICogQmVnaW5zIGEgZGVzY3JpcHRpb24gYmxvY2sgb2YgdmVydGljZXMuIFRoaXMgaXMgc2ltbWlsYXIgdG8gZ2xCZWdpbigpCisgKiBhbmQgZ2xFbmQoKS4gQWZ0ZXIgYSBjYWxsIHRvIElEaXJlY3QzRERldmljZTM6OkVuZCwgdGhlIHZlcnRpY2VzCisgKiBkZXNjcmliZWQgd2l0aCBJRGlyZWN0M0REZXZpY2U6OlZlcnRleCBhcmUgZHJhd24uCisgKgorICogVmVyc2lvbiAyIGFuZCAzCisgKgorICogUGFyYW1zOgorICogIFByaW1pdGl2ZVR5cGU6IFRoZSB0eXBlIG9mIHByaW1pdGl2ZXMgdG8gZHJhdworICogIFZlcnRleFR5cGVEZXNjOiBBIGZsZXhpYmxlIHZlcnRleCBmb3JtYXQgZGVzY3JpcHRpb24gb2YgdGhlIHZlcnRpY2VzCisgKiAgRmxhZ3M6IFNvbWUgZmxhZ3MuLgorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfM19CZWdpbihJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4VHlwZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJWQsJWxkLCUwOGx4KVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZURlc2MsIEZsYWdzKTsKKworICAgIFRoaXMtPnByaW1pdGl2ZV90eXBlID0gUHJpbWl0aXZlVHlwZTsKKyAgICBUaGlzLT52ZXJ0ZXhfdHlwZSA9IFZlcnRleFR5cGVEZXNjOworICAgIFRoaXMtPnJlbmRlcl9mbGFncyA9IEZsYWdzOworICAgIFRoaXMtPnZlcnRleF9zaXplID0gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKFRoaXMtPnZlcnRleF90eXBlKTsKKyAgICBUaGlzLT5uYl92ZXJ0aWNlcyA9IDA7CisKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpbihJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZHdWZXJ0ZXhUeXBlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQoreworICAgIERXT1JEIEZWRjsKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwLyVwKS0+KCUwOHgsJTA4eCwlMDhseCk6IFRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTNcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdCwgZHdWZXJ0ZXhUeXBlRGVzYywgZHdGbGFncyk7CisKKyAgICBzd2l0Y2goZHdWZXJ0ZXhUeXBlRGVzYykKKyAgICB7CisgICAgICAgIGNhc2UgRDNEVlRfVkVSVEVYOiBGVkYgPSBEM0RGVkZfVkVSVEVYOyBicmVhazsKKyAgICAgICAgY2FzZSBEM0RWVF9MVkVSVEVYOiBGVkYgPSBEM0RGVkZfTFZFUlRFWDsgYnJlYWs7CisgICAgICAgIGNhc2UgRDNEVlRfVExWRVJURVg6IEZWRiA9IEQzREZWRl9UTFZFUlRFWDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgfTsKKworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0JlZ2luKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQzZHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZWRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2UzOjpCZWdpbkluZGV4ZWQKKyAqCisgKiBEcmF3cyBwcmltaXRpdmVzIGJhc2VkIG9uIHZlcnRpY2VzIGluIGEgdmVydGV4IGFycmF5IHdoaWNoIGFyZSBzcGVjaWZpZWQKKyAqIGJ5IGluZGljZXMuCisgKgorICogVmVyc2lvbiAyIGFuZCAzCisgKgorICogUGFyYW1zOgorICogIFByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZSB0eXBlIHRvIGRyYXcKKyAqICBWZXJ0ZXhUeXBlOiBBIEZWRiBkZXNjcmlwdGlvbiBvZiB0aGUgdmVydGV4IGZvcm1hdAorICogIFZlcnRpY2VzOiBwb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5nIHRoZSB2ZXJ0aWNlcworICogIE51bVZlcnRpY2VzOiBUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIGluIHRoZSB2ZXJ0ZXggYXJyYXkKKyAqICBGbGFnczogU29tZSBmbGFncyAuLi4KKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX0JlZ2luSW5kZXhlZChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTnVtVmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKS0+KCUwOHgsJTA4bHgsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZSwgVmVydGljZXMsIE51bVZlcnRpY2VzLCBGbGFncyk7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpbkluZGV4ZWQoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRVJURVhUWVBFIGQzZHZ0VmVydGV4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbHB2VmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TnVtVmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCit7CisgICAgRFdPUkQgRlZGOworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXAvJXApLT4oJTA4eCwlMDh4LCVwLCUwOGx4LCUwOGx4KTogVGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlM1xuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgZHdOdW1WZXJ0aWNlcywgZHdGbGFncyk7CisKKyAgICBzd2l0Y2goZDNkdnRWZXJ0ZXhUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBEM0RWVF9WRVJURVg6IEZWRiA9IEQzREZWRl9WRVJURVg7IGJyZWFrOworICAgICAgICBjYXNlIEQzRFZUX0xWRVJURVg6IEZWRiA9IEQzREZWRl9MVkVSVEVYOyBicmVhazsKKyAgICAgICAgY2FzZSBEM0RWVF9UTFZFUlRFWDogRlZGID0gRDNERlZGX1RMVkVSVEVYOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICB9OworCisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfQmVnaW5JbmRleGVkKElDT01fSU5URVJGQUNFKFRoaXMsSURpcmVjdDNERGV2aWNlMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQzZHB0UHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHZWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdOdW1WZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlMzo6VmVydGV4CisgKgorICogRHJhd3MgYSB2ZXJ0ZXggYXMgZGVzY3JpYmVkIGJ5IElEaXJlY3QzRERldmljZTM6OkJlZ2luLiBJdCBwbGFjZXMgYWxsCisgKiBkcmF3biB2ZXJ0aWNlcyBpbiBhbiB2ZXJ0ZXggYnVmZmVyLiBJZiB0aGUgYnVmZmVyIGlzIHRvIHNtYWxsLCBpdHMKKyAqIHNpemUgaXMgaW5jcmVhc2VkLgorICoKKyAqIFZlcnNpb24gMiBhbmQgMworICoKKyAqIFBhcmFtczoKKyAqICBWZXJ0ZXg6IFBvaW50ZXIgdG8gdGhlIHZlcnRleAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LLCBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBWZXJ0ZXggaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX1ZlcnRleChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVmVydGV4KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgVmVydGV4KTsKKworICAgIGlmKCFWZXJ0ZXgpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaWYgKChUaGlzLT5uYl92ZXJ0aWNlcysxKSpUaGlzLT52ZXJ0ZXhfc2l6ZSA+IFRoaXMtPmJ1ZmZlcl9zaXplKQorICAgIHsKKyAgICAgICAgQllURSAqb2xkX2J1ZmZlcjsKKyAgICAgICAgVGhpcy0+YnVmZmVyX3NpemUgPSBUaGlzLT5idWZmZXJfc2l6ZSA/IFRoaXMtPmJ1ZmZlcl9zaXplICogMiA6IFRoaXMtPnZlcnRleF9zaXplICogMzsKKyAgICAgICAgb2xkX2J1ZmZlciA9IFRoaXMtPnZlcnRleF9idWZmZXI7CisgICAgICAgIFRoaXMtPnZlcnRleF9idWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+YnVmZmVyX3NpemUpOworICAgICAgICBpZiAob2xkX2J1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgQ29weU1lbW9yeShUaGlzLT52ZXJ0ZXhfYnVmZmVyLCBvbGRfYnVmZmVyLCBUaGlzLT5uYl92ZXJ0aWNlcyAqIFRoaXMtPnZlcnRleF9zaXplKTsKKyAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9sZF9idWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQ29weU1lbW9yeShUaGlzLT52ZXJ0ZXhfYnVmZmVyICsgVGhpcy0+bmJfdmVydGljZXMrKyAqIFRoaXMtPnZlcnRleF9zaXplLCBWZXJ0ZXgsIFRoaXMtPnZlcnRleF9zaXplKTsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1ZlcnRleChJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbHBWZXJ0ZXhUeXBlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgbHBWZXJ0ZXhUeXBlKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19WZXJ0ZXgoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwVmVydGV4VHlwZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlMzo6SW5kZXgKKyAqCisgKiBTcGVjaWZpZXMgYW4gaW5kZXggdG8gYW4gdmVydGV4IHRvIGJlIGRyYXduLiBUaGUgdmVydGV4IGFycmF5IGhhcyB0bworICogYmUgc3BlY2lmaWVkIHdpdGggQmVnaW5JbmRleGVkIGZpcnN0LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgVmVydGV4SW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgdmVydGV4IHRvIGRyYXcKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBiZWNhdXNlIGl0J3MgYSBzdHViCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzNfSW5kZXgoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBWZXJ0ZXhJbmRleCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglMDR4KTogc3R1YiFcbiIsIFRoaXMsIFZlcnRleEluZGV4KTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9JbmRleChJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHdWZXJ0ZXhJbmRleCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwNHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgd1ZlcnRleEluZGV4KTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19JbmRleChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2UzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VmVydGV4SW5kZXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTM6OkVuZAorICoKKyAqIEVuZHMgYSBkcmF3IGJlZ3VuIHdpdGggSURpcmVjdDNERGV2aWNlMzo6QmVnaW4gb3IKKyAqIElEaXJlY3QzRERldmljZTo6QmVnaW5JbmRleGVkLiBUaGUgdmVydGljZXMgc3BlY2lmaWVkIHdpdGgKKyAqIElEaXJlY3QzRERldmljZTo6VmVydGV4IG9yIElEaXJlY3QzRERldmljZTo6SW5kZXggYXJlIGRyYXduIHVzaW5nCisgKiB0aGUgSURpcmVjdDNERGV2aWNlNzo6RHJhd1ByaW1pdGl2ZSBtZXRob2QuIFNvIGZhciBvbmx5CisgKiBub24taW5kZXhlZCBtb2RlIGlzIHN1cHBvcnRlZAorICoKKyAqIFZlcnNpb24gMiBhbmQgMworICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogU29tZSBmbGFncywgYXMgdXN1YWwuIERvbid0IGtub3cgd2hpY2ggYXJlIGRlZmluZWQKKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSByZXR1cm4gdmFsdWUgb2YgSURpcmVjdDNERGV2aWNlNzo6RHJhd1ByaW1pdGl2ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX0VuZChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgpXG4iLCBUaGlzLCBGbGFncyk7CisKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3UHJpbWl0aXZlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+cHJpbWl0aXZlX3R5cGUsIFRoaXMtPnZlcnRleF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+dmVydGV4X2J1ZmZlciwgVGhpcy0+bmJfdmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5yZW5kZXJfZmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9FbmQoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkd0ZsYWdzKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19FbmQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkdldFJlbmRlclN0YXRlCisgKgorICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSByZW5kZXIgc3RhdGUuIFRoZSBwb3NzaWJsZSByZW5kZXIgc3RhdGVzIGFyZQorICogZGVmaW5lZCBpbiBpbmNsdWRlL2QzZHR5cGVzLmgKKyAqCisgKiBWZXJzaW9uIDIsIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgUmVuZGVyU3RhdGVUeXBlOiBSZW5kZXIgc3RhdGUgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmcgb2YKKyAqICBWYWx1ZTogQWRkcmVzcyB0byBzdG9yZSB0aGUgdmFsdWUgYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzLCBmb3IgZGV0YWlscyBzZWUgSVdpbmVEM0REZXZpY2U6OkdldFJlbmRlclN0YXRlCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBWYWx1ZSA9PSBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0UmVuZGVyU3RhdGUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIFJlbmRlclN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqVmFsdWUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBSZW5kZXJTdGF0ZVR5cGUsIFZhbHVlKTsKKworICAgIGlmKCFWYWx1ZSkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfR2V0UmVuZGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFJlbmRlclN0YXRlKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqbHBkd1JlbmRlclN0YXRlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBkd1JlbmRlclN0YXRlVHlwZSwgbHBkd1JlbmRlclN0YXRlKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19HZXRSZW5kZXJTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlbmRlclN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3UmVuZGVyU3RhdGUpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRSZW5kZXJTdGF0ZShJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgZHdSZW5kZXJTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKmxwZHdSZW5kZXJTdGF0ZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZHdSZW5kZXJTdGF0ZVR5cGUsIGxwZHdSZW5kZXJTdGF0ZSk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0UmVuZGVyU3RhdGUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZW5kZXJTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd1JlbmRlclN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRSZW5kZXJTdGF0ZQorICoKKyAqIFNldHMgYSByZW5kZXIgc3RhdGUuIFRoZSBwb3NzaWJsZSByZW5kZXIgc3RhdGVzIGFyZSBkZWZpbmVkIGluCisgKiBpbmNsdWRlL2QzZHR5cGVzLmgKKyAqCisgKiBWZXJzaW9uIDIsIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgUmVuZGVyU3RhdGVUeXBlOiBTdGF0ZSB0byBzZXQKKyAqICBWYWx1ZTogVmFsdWUgdG8gYXNzaWduIHRvIHRoYXQgc3RhdGUKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzLAorICogIGZvciBkZXRhaWxzIHNlZSBJV2luZUQzRERldmljZTo6U2V0UmVuZGVyU3RhdGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19TZXRSZW5kZXJTdGF0ZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgUmVuZGVyU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZhbHVlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJWxkKTogUmVsYXlcbiIsIFRoaXMsIFJlbmRlclN0YXRlVHlwZSwgVmFsdWUpOworCisgICAgLyogU29tZSByZW5kZXIgc3RhdGVzIG5lZWQgc3BlY2lhbCBjYXJlICovCisgICAgc3dpdGNoKFJlbmRlclN0YXRlVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUhBTkRMRToKKyAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElXaW5lRDNEQmFzZVRleHR1cmUgKikgVmFsdWUpOworCisgICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRU1BRzoKKyAgICAgICAgeworICAgICAgICAgICAgV0lORUQzRFRFWFRVUkVGSUxURVJUWVBFIHRleF9tYWcgPSBXSU5FRDNEVEVYRl9OT05FOworCisgICAgICAgICAgICBzd2l0Y2ggKChEM0RURVhUVVJFRklMVEVSKSBWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9ORUFSRVNUOgorICAgICAgICAgICAgICAgICAgICB0ZXhfbWFnID0gV0lORUQzRFRFWEZfUE9JTlQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRDNERklMVEVSX0xJTkVBUjoKKyAgICAgICAgICAgICAgICAgICAgdGV4X21hZyA9IFdJTkVEM0RURVhGX0xJTkVBUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmhhbmRsZWQgdGV4dHVyZSBtYWcgJWxkICFcbiIsVmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0U2FtcGxlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFdJTkVEM0RTQU1QX01BR0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4X21hZyk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVNSU46CisgICAgICAgIHsKKyAgICAgICAgICAgIFdJTkVEM0RURVhUVVJFRklMVEVSVFlQRSB0ZXhfbWluID0gV0lORUQzRFRFWEZfTk9ORTsKKworICAgICAgICAgICAgc3dpdGNoICgoRDNEVEVYVFVSRUZJTFRFUikgVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBEM0RGSUxURVJfTkVBUkVTVDoKKyAgICAgICAgICAgICAgICAgICAgdGV4X21pbiA9IFdJTkVEM0RURVhGX1BPSU5UOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEQzREZJTFRFUl9MSU5FQVI6CisgICAgICAgICAgICAgICAgICAgIHRleF9taW4gPSBXSU5FRDNEVEVYRl9MSU5FQVI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEVSUigiVW5oYW5kbGVkIHRleHR1cmUgbWFnICVsZCAhXG4iLFZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBXSU5FRDNEU0FNUF9NSU5GSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleF9taW4pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9URVhUVVJFQUREUkVTU1U6CisgICAgICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1NWOgorICAgICAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTOgorICAgICAgICB7CisgICAgICAgICAgICBXSU5FRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIFRleFN0YWdlU3RhdGVUeXBlOworCisgICAgICAgICAgICBpZiAoUmVuZGVyU3RhdGVUeXBlID09IEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRleFN0YWdlU3RhdGVUeXBlID0gV0lORUQzRFRTU19BRERSRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUmVuZGVyU3RhdGVUeXBlID09IEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTVSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZXhTdGFnZVN0YXRlVHlwZSA9IFdJTkVEM0RUU1NfQUREUkVTU1U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGV4U3RhZ2VTdGF0ZVR5cGUgPSBXSU5FRDNEVFNTX0FERFJFU1NWOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBUZXhTdGFnZVN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFJlbmRlclN0YXRlKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBSZW5kZXJTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmFsdWUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFJlbmRlclN0YXRlVHlwZSwgVmFsdWUpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlclN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFJlbmRlclN0YXRlKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBSZW5kZXJTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmFsdWUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFJlbmRlclN0YXRlVHlwZSwgVmFsdWUpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlclN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGlyZWN0M0REZXZpY2UzOjpTZXRMaWdodFN0YXRlCisgKgorICogU2V0cyBhIGxpZ2h0IHN0YXRlIGZvciBEaXJlY3QzRERldmljZTMgYW5kIERpcmVjdDNERGV2aWNlMi4gVGhlCisgKiBsaWdodCBzdGF0ZXMgYXJlIGZvcndhcmRlZCB0byBEaXJlY3QzRERldmljZTcgcmVuZGVyIHN0YXRlcworICoKKyAqIFZlcnNpb24gMiBhbmQgMworICoKKyAqIFBhcmFtczoKKyAqICBMaWdodFN0YXRlVHlwZTogVGhlIGxpZ2h0IHN0YXRlIHRvIGNoYW5nZQorICogIFZhbHVlOiBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIHRoYXQgbGlnaHQgc3RhdGUKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiB0aGUgcGFyYW10ZXJzIHdlcmUgaW5jb3JyZWN0CisgKiAgQWxzbyBjaGVjayBJRGlyZWN0M0REZXZpY2U3OjpTZXRSZW5kZXJTdGF0ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldExpZ2h0U3RhdGUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVFNUQVRFVFlQRSBMaWdodFN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZhbHVlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlMDhseClcbiIsIFRoaXMsIExpZ2h0U3RhdGVUeXBlLCBWYWx1ZSk7CisKKyAgICBpZiAoIUxpZ2h0U3RhdGVUeXBlICYmIChMaWdodFN0YXRlVHlwZSA+IEQzRExJR0hUU1RBVEVfQ09MT1JWRVJURVgpKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIlVuZXhwZWN0ZWQgTGlnaHQgU3RhdGUgVHlwZVxuIik7CisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIGlmIChMaWdodFN0YXRlVHlwZSA9PSBEM0RMSUdIVFNUQVRFX01BVEVSSUFMIC8qIDEgKi8pCisgICAgeworICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGwgKm1hdCA9IChJRGlyZWN0M0RNYXRlcmlhbEltcGwgKikgVmFsdWU7CisKKyAgICAgICAgaWYgKG1hdCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBUUkFDRSgiIGFjdGl2YXRpbmcgbWF0ZXJpYWwgJXAuXG4iLCBtYXQpOworICAgICAgICAgICAgbWF0LT5hY3RpdmF0ZShtYXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRklYTUUoIiBEM0RMSUdIVFNUQVRFX01BVEVSSUFMIGNhbGxlZCB3aXRoIE5VTEwgbWF0ZXJpYWwgISEhXG4iKTsKKyAgICAgICAgfQorICAgICAgICBUaGlzLT5tYXRlcmlhbCA9IFZhbHVlOworICAgIH0KKyAgICBlbHNlIGlmIChMaWdodFN0YXRlVHlwZSA9PSBEM0RMSUdIVFNUQVRFX0NPTE9STU9ERUwgLyogMyAqLykKKyAgICB7CisgICAgICAgIHN3aXRjaCAoVmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRDNEQ09MT1JfTU9OTzoKKyAgICAgICAgICAgICAgICBFUlIoIkREQ09MT1JfTU9OTyBzaG91bGQgbm90IGhhcHBlbiFcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEM0RDT0xPUl9SR0I6CisgICAgICAgICAgICAgICAgLyogV2UgYXJlIGFscmVhZHkgaW4gdGhpcyBtb2RlICovCisgICAgICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgY29sb3IgbW9kZWwgdG8gUkdCIChuby1vcCkuXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRVJSKCJVbmtub3duIGNvbG9yIG1vZGVsIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIHJzOworICAgICAgICBzd2l0Y2ggKExpZ2h0U3RhdGVUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfQU1CSUVOVDogICAgICAgLyogMiAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfQU1CSUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsJCQorICAgICAgICAgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR01PREU6ICAgICAgIC8qIDQgKi8KKyAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR1ZFUlRFWE1PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HU1RBUlQ6ICAgICAgLyogNSAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfRk9HU1RBUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HRU5EOiAgICAgICAgLyogNiAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfRk9HRU5EOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR0RFTlNJVFk6ICAgIC8qIDcgKi8KKyAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0RFTlNJVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfQ09MT1JWRVJURVg6ICAgLyogOCAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfQ09MT1JWRVJURVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBEM0RMSUdIVFNUQVRFVFlQRSAlZC5cbiIsIExpZ2h0U3RhdGVUeXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRMaWdodFN0YXRlKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETElHSFRTVEFURVRZUEUgTGlnaHRTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWYWx1ZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgTGlnaHRTdGF0ZVR5cGUsIFZhbHVlKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19TZXRMaWdodFN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlnaHRTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlMzo6R2V0TGlnaHRTdGF0ZQorICoKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBvZiBhIGxpZ2h0IHN0YXRlLiBUaGUgc3RhdGUgaXMgcmVhZCBmcm9tCisgKiB0aGUgRGlyZWN0M0REZXZpY2U3IHJlbmRlciBzdGF0ZS4KKyAqCisgKiBWZXJzaW9uIDIgYW5kIDMKKyAqCisgKiBQYXJhbXM6CisgKiAgTGlnaHRTdGF0ZVR5cGU6IFRoZSBsaWdodCBzdGF0ZSB0byByZXR1cm4KKyAqICBWYWx1ZTogVGhlIGFkZHJlc3MgdG8gc3RvcmUgdGhlIGxpZ2h0IHN0YXRlIHNldHRpbmcgYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERERVJSX0lOVkFMSURQQVJBTVMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZSBpbmNvcnJlY3QKKyAqICBBbHNvIHNlZSBJRGlyZWN0M0REZXZpY2U3OjpHZXRSZW5kZXJTdGF0ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldExpZ2h0U3RhdGUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVFNUQVRFVFlQRSBMaWdodFN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpWYWx1ZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApXG4iLCBUaGlzLCBMaWdodFN0YXRlVHlwZSwgVmFsdWUpOworCisgICAgaWYgKCFMaWdodFN0YXRlVHlwZSAmJiAoTGlnaHRTdGF0ZVR5cGUgPiBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYKSkKKyAgICB7CisgICAgICAgIFRSQUNFKCJVbmV4cGVjdGVkIExpZ2h0IFN0YXRlIFR5cGVcbiIpOworICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICBpZighVmFsdWUpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaWYgKExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfTUFURVJJQUwgLyogMSAqLykKKyAgICB7CisgICAgICAgICpWYWx1ZSA9IFRoaXMtPm1hdGVyaWFsOworICAgIH0KKyAgICBlbHNlIGlmIChMaWdodFN0YXRlVHlwZSA9PSBEM0RMSUdIVFNUQVRFX0NPTE9STU9ERUwgLyogMyAqLykKKyAgICB7CisgICAgICAgICpWYWx1ZSA9IEQzRENPTE9SX1JHQjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIHJzOworICAgICAgICBzd2l0Y2ggKExpZ2h0U3RhdGVUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfQU1CSUVOVDogICAgICAgLyogMiAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfQU1CSUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsJCQorICAgICAgICAgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR01PREU6ICAgICAgIC8qIDQgKi8KKyAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR1ZFUlRFWE1PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HU1RBUlQ6ICAgICAgLyogNSAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfRk9HU1RBUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HRU5EOiAgICAgICAgLyogNiAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfRk9HRU5EOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR0RFTlNJVFk6ICAgIC8qIDcgKi8KKyAgICAgICAgICAgICAgICBycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0RFTlNJVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEQzRExJR0hUU1RBVEVfQ09MT1JWRVJURVg6ICAgLyogOCAqLworICAgICAgICAgICAgICAgIHJzID0gRDNEUkVOREVSU1RBVEVfQ09MT1JWRVJURVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBEM0RMSUdIVFNUQVRFVFlQRSAlZC5cbiIsIExpZ2h0U3RhdGVUeXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldFJlbmRlclN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldExpZ2h0U3RhdGUoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVFNUQVRFVFlQRSBMaWdodFN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpWYWx1ZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgVGhpcywgTGlnaHRTdGF0ZVR5cGUsIFZhbHVlKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19HZXRMaWdodFN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlnaHRTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6U2V0VHJhbnNmb3JtCisgKgorICogQXNzaWduZXMgYSBEM0RNQVRSSVggdG8gYSB0cmFuc2Zvcm0gdHlwZS4gVGhlIHRyYW5zZm9ybSB0eXBlcyBhcmUgZGVmaW5lZAorICogaW4gaW5jbHVkZS9kM2R0eXBlcy5oLgorICogVGhlIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEICg9MSkgaXMgdHJhbnNsYXRlZCB0byBEM0RUU19XT1JMRE1BVFJJWCgwKQorICogKD0yNTUpIGZvciB3aW5lZDNkLCBiZWNhdXNlIHRoZSAxIHRyYW5zZm9ybSBzdGF0ZSB3YXMgcmVtb3ZlZCBpbiBkM2Q4CisgKiBhbmQgV2luZUQzRCBhbGxyZWFkeSB1bmRlcnN0YW5kcyB0aGUgcmVwbGFjZW1lbnQgRDNEVFNfV09STERNQVRSSVgoMCkKKyAqCisgKiBWZXJzaW9uIDIsIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgVHJhbnNmb3JtU3RhdGVUeXBlOiB0cmFuc2Zvcm0gc3RhdGUgdG8gc2V0CisgKiAgTWF0cml4OiBNYXRyaXggdG8gYXNzaWduIHRvIHRoZSBzdGF0ZQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIE1hdHJpeCA9PSBOVUxMCisgKiAgRm9yIGRldGFpbHMgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRUcmFuc2Zvcm0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19TZXRUcmFuc2Zvcm0oSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqTWF0cml4KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgdHlwZSA9IFRyYW5zZm9ybVN0YXRlVHlwZTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApOiBSZWxheVxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBNYXRyaXgpOworCisgICAgaWYoIU1hdHJpeCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAvKiBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCBkb2Vzbid0IGV4aXN0IGluIFdpbmVEM0QsCisgICAgICogdXNlIEQzRFRTX1dPUkxETUFUUklYKDApIGluc3RlYWQKKyAgICAgKiBEM0RUU19XT1JMRE1BVFJJWChpbmRleCkgaXMgKEQzRFRSQU5TRk9STVNUQVRFVFlQRSkoaW5kZXggKyAyNTYpCisgICAgICovCisgICAgaWYoVHJhbnNmb3JtU3RhdGVUeXBlID09IEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEKQorICAgICAgICB0eXBlID0gKEQzRFRSQU5TRk9STVNUQVRFVFlQRSkoMCArIDI1Nik7CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0VHJhbnNmb3JtKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4KTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0VHJhbnNmb3JtKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVggKkQzRE1hdHJpeCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBEM0RNYXRyaXgpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNYXRyaXgpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRUcmFuc2Zvcm0oSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqRDNETWF0cml4KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUcmFuc2Zvcm1TdGF0ZVR5cGUsIEQzRE1hdHJpeCk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfU2V0VHJhbnNmb3JtKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1TdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1hdHJpeCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6R2V0VHJhbnNmb3JtCisgKgorICogUmV0dXJucyB0aGUgbWF0cml4IGFzc2lnbmVkIHRvIGEgdHJhbnNmb3JtIHN0YXRlCisgKiBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCBpcyB0cmFuc2xhdGVkIHRvIEQzRFRTX1dPUkxETUFUUklYKDApLCBzZWUKKyAqIFNldFRyYW5zZm9ybQorICoKKyAqIFBhcmFtczoKKyAqICBUcmFuc2Zvcm1TdGF0ZVR5cGU6IFN0YXRlIHRvIHJlYWQgdGhlIG1hdHJpeCBmcm9tCisgKiAgTWF0cml4OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBtYXRyaXggYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXRyaXggPT0gTlVMTAorICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OkdldFRyYW5zZm9ybQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFRyYW5zZm9ybShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIFRyYW5zZm9ybVN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYICpNYXRyaXgpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSB0eXBlID0gVHJhbnNmb3JtU3RhdGVUeXBlOworICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBUcmFuc2Zvcm1TdGF0ZVR5cGUsIE1hdHJpeCk7CisKKyAgICBpZighTWF0cml4KQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIC8qIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEIGRvZXNuJ3QgZXhpc3QgaW4gV2luZUQzRCwKKyAgICAgKiB1c2UgRDNEVFNfV09STERNQVRSSVgoMCkgaW5zdGVhZAorICAgICAqIEQzRFRTX1dPUkxETUFUUklYKGluZGV4KSBpcyAoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKShpbmRleCArIDI1NikKKyAgICAgKi8KKyAgICBpZihUcmFuc2Zvcm1TdGF0ZVR5cGUgPT0gRDNEVFJBTlNGT1JNU1RBVEVfV09STEQpCisgICAgICAgIHR5cGUgPSAoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKSgwICsgMjU2KTsKKworICAgIHJldHVybiBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0oVGhpcy0+d2luZUQzRERldmljZSwgdHlwZSwgTWF0cml4KTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VHJhbnNmb3JtKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVggKkQzRE1hdHJpeCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBEM0RNYXRyaXgpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldFRyYW5zZm9ybShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNYXRyaXgpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRUcmFuc2Zvcm0oSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqRDNETWF0cml4KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUcmFuc2Zvcm1TdGF0ZVR5cGUsIEQzRE1hdHJpeCk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0VHJhbnNmb3JtKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1TdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1hdHJpeCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6TXVsdGlwbHlUcmFuc2Zvcm0KKyAqCisgKiBNdWx0aXBsaWVzIHRoZSBhbHJlYWR5LXNldCB0cmFuc2Zvcm0gbWF0cml4IG9mIGEgdHJhbnNmb3JtIHN0YXRlCisgKiB3aXRoIGFub3RoZXIgbWF0cml4LiBGb3IgdGhlIHdvcmxkIG1hdHJpeCwgc2VlIFNldFRyYW5zZm9ybQorICoKKyAqIFZlcnNpb24gMiwgMyBhbmQgNworICoKKyAqIFBhcmFtczoKKyAqICBUcmFuc2Zvcm1TdGF0ZVR5cGU6IFRyYW5zZm9ybSBzdGF0ZSB0byBtdWx0aXBseQorICogIEQzRE1hdHJpeCBNYXRyaXggdG8gbXVsdGlwbHkgd2l0aC4KKyAqCisgKiBSZXR1cm5zCisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEQzRE1hdHJpeCBpcyBOVUxMCisgKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6TXVsdGlwbHlUcmFuc2Zvcm0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19NdWx0aXBseVRyYW5zZm9ybShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqRDNETWF0cml4KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApOiBSZWxheVxuIiwgVGhpcywgVHJhbnNmb3JtU3RhdGVUeXBlLCBEM0RNYXRyaXgpOworCisgICAgLyogRDNEVFJBTlNGT1JNU1RBVEVfV09STEQgZG9lc24ndCBleGlzdCBpbiBXaW5lRDNELAorICAgICAqIHVzZSBEM0RUU19XT1JMRE1BVFJJWCgwKSBpbnN0ZWFkCisgICAgICogRDNEVFNfV09STERNQVRSSVgoaW5kZXgpIGlzIChEM0RUUkFOU0ZPUk1TVEFURVRZUEUpKGluZGV4ICsgMjU2KQorICAgICAqLworICAgIGlmKFRyYW5zZm9ybVN0YXRlVHlwZSA9PSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCkKKyAgICAgICAgVHJhbnNmb3JtU3RhdGVUeXBlID0gKEQzRFRSQU5TRk9STVNUQVRFVFlQRSkoMCArIDI1Nik7CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfTXVsdGlwbHlUcmFuc2Zvcm0oVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNYXRyaXgpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19NdWx0aXBseVRyYW5zZm9ybShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqRDNETWF0cml4KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBUcmFuc2Zvcm1TdGF0ZVR5cGUsIEQzRE1hdHJpeCk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfTXVsdGlwbHlUcmFuc2Zvcm0oSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1hdHJpeCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX011bHRpcGx5VHJhbnNmb3JtKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBUcmFuc2Zvcm1TdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYICpEM0RNYXRyaXgpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFRyYW5zZm9ybVN0YXRlVHlwZSwgRDNETWF0cml4KTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19NdWx0aXBseVRyYW5zZm9ybShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1TdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETWF0cml4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpEcmF3UHJpbWl0aXZlCisgKgorICogRHJhd3MgcHJpbWl0dmVzIGJhc2VkIG9uIHZlcnRpY2VzIGluIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHBvaW50ZXIKKyAqCisgKiBWZXJzaW9uIDIsIDMgYW5kIDcuIFRoZSBJRGlyZWN0M0REZXZpY2UyIHRodW5rIGNvbnZlcnRzIHRoZSBmaXhlZCB2ZXJ0ZXggdHlwZSBpbnRvCisgKiBhbiBGVkYgZm9ybWF0IGZvciBEM0Q3CisgKgorICogUGFyYW1zOgorICogIFByaW1pdGl2ZVR5cGU6IFRoZSB0eXBlIG9mIHRoZSBwcmltaXRpdmVzIHRvIGRyYXcKKyAqICBWZXJ0ZXggdHlwZTogRmxleGlibGUgdmVydGV4IGZvcm1hdCB2ZXJ0ZXggZGVzY3JpcHRpb24KKyAqICBWZXJ0aWNlczogUG9pbnRlciB0byB0aGUgdmVydGV4IGFycmF5CisgKiAgVmVydGV4Q291bnQ6IFRoZSBudW1iZXIgb2YgdmVydGljZXMgdG8gZHJhdworICogIEZsYWdzOiBBcyB1c3VhbCBhIGZldyBmbGFncworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFZlcnRpY2VzIGlzIE5VTEwKKyAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpEcmF3UHJpbWl0aXZlVVAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19EcmF3UHJpbWl0aXZlKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgVUlOVCBQcmltaXRpdmVDb3VudCwgc3RyaWRlOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCUwOGx4KTogUmVsYXkhXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEZsYWdzKTsKKworICAgIGlmKCFWZXJ0aWNlcykKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAvKiBHZXQgdGhlIHZlcnRleCBjb3VudCAqLworICAgIHN3aXRjaChQcmltaXRpdmVUeXBlKQorICAgIHsKKyAgICAgIGNhc2UgRDNEUFRfUE9JTlRMSVNUOiAKKyAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDNEUFRfTElORUxJU1Q6IAorICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC8gMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDNEUFRfTElORVNUUklQOgorICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOgorICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC8gMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoKKyAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudCAtIDI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgorICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC0gMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6IHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIC8qIEdldCB0aGUgc3RyaWRlICovCisgICAgc3RyaWRlID0gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKFZlcnRleFR5cGUpOworCisgICAgLyogU2V0IHRoZSBGVkYgKi8KKyAgICBociA9IElXaW5lRDNERGV2aWNlX1NldEZWRihUaGlzLT53aW5lRDNERGV2aWNlLCBWZXJ0ZXhUeXBlKTsKKyAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKKworICAgIC8qIFRoaXMgbWV0aG9kIHRyYW5zbGF0ZXMgdG8gdGhlIHVzZXIgcG9pbnRlciBkcmF3IG9mIFdpbmVEM0QgKi8KKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfRHJhd1ByaW1pdGl2ZVVQKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdQcmltaXRpdmUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEZsYWdzKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3UHJpbWl0aXZlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EcmF3UHJpbWl0aXZlKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYVFlQRSBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBEV09SRCBGVkY7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOHgsJTA4eCwlcCwlMDhseCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEZsYWdzKTsKKworICAgIHN3aXRjaChWZXJ0ZXhUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBEM0RWVF9WRVJURVg6IEZWRiA9IEQzREZWRl9WRVJURVg7IGJyZWFrOworICAgICAgICBjYXNlIEQzRFZUX0xWRVJURVg6IEZWRiA9IEQzREZWRl9MVkVSVEVYOyBicmVhazsKKyAgICAgICAgY2FzZSBEM0RWVF9UTFZFUlRFWDogRlZGID0gRDNERlZGX1RMVkVSVEVYOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICB9CisKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3UHJpbWl0aXZlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZWRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6RHJhd0luZGV4ZWRQcmltaXRpdmUKKyAqCisgKiBEcmF3cyB2ZXJ0aWNlcyBmcm9tIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHBvaW50ZXIsIGJhc2VkIG9uIHRoZSBpbmRleAorICogbnVtYmVycyBpbiBhIFdPUkQgYXJyYXkuCisgKgorICogVmVyc2lvbiAyLCAzIGFuZCA3LiBUaGUgdmVyc2lvbiA3IHRodW5rIHRyYW5zbGF0ZXMgdGhlIHZlcnRleCB0eXBlIGludG8KKyAqIGFuIEZWRiBmb3JtYXQgZm9yIEQzRDcKKyAqCisgKiBQYXJhbXM6CisgKiAgUHJpbWl0aXZlVHlwZTogVGhlIHByaW1pdGl2ZSB0eXBlIHRvIGRyYXcKKyAqICBWZXJ0ZXhUeXBlOiBUaGUgRlZGIHZlcnRleCBkZXNjcmlwdGlvbgorICogIFZlcnRpY2VzOiBQb2ludGVyIHRvIHRoZSB2ZXJ0ZXggYXJyYXkKKyAqICBWZXJ0ZXhDb3VudDogPworICogIEluZGljZXM6IFBvaW50ZXIgdG8gdGhlIGluZGV4IGFycmF5CisgKiAgSW5kZXhDb3VudDogTnVtYmVyIG9mIGluZGljZXMgPSBOdW1iZXIgb2YgdmVydGljZXMgdG8gZHJhdworICogIEZsYWdzOiBBcyB1c3VhbCwgc29tZSBmbGFncworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFZlcnRpY2VzIG9yIEluZGljZXMgaXMgTlVMTAorICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OkRyYXdJbmRleGVkUHJpbWl0aXZlVVAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19EcmF3SW5kZXhlZFByaW1pdGl2ZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICpJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFVJTlQgUHJpbWl0aXZlQ291bnQgPSAwOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCVwLCUwOGx4LCUwOGx4KTogUmVsYXkhXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBWZXJ0aWNlcywgVmVydGV4Q291bnQsIEluZGljZXMsIEluZGV4Q291bnQsIEZsYWdzKTsKKyAgICAvKiBHZXQgdGhlIHByaW1pdGl2ZSBudW1iZXIgKi8KKyAgICBzd2l0Y2goUHJpbWl0aXZlVHlwZSkKKyAgICB7CisgICAgICBjYXNlIEQzRFBUX1BPSU5UTElTVDogCisgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDNEUFRfTElORUxJU1Q6IAorICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLyAyOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBEM0RQVF9MSU5FU1RSSVA6CisgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudCAtIDE7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoKKyAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBJbmRleENvdW50IC8gMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoKKyAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBJbmRleENvdW50IC0gMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CisgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudCAtIDI7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OiByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIEQzRERldmljZSdzIEZWRiAqLworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0RlZGKFRoaXMtPndpbmVEM0REZXZpY2UsIFZlcnRleFR5cGUpOworICAgIGlmKEZBSUxFRChocikpCisgICAgeworICAgICAgICBFUlIoIiAoJXApIFNldHRpbmcgdGhlIEZWRiBmYWlsZWQsIGhyID0gJWx4IVxuIiwgVGhpcywgaHIpOworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorCisgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX0RyYXdJbmRleGVkUHJpbWl0aXZlVVAoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogTWluVmVydGV4SW5kZXggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4Q291bnQgLyogVUlOVCBOdW1WZXJ0ZXhJbmRleCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RGTVRfSU5ERVgxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoVmVydGV4VHlwZSkpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3SW5kZXhlZFByaW1pdGl2ZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICpJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCVwLCUwOGx4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIFZlcnRleFR5cGUsIFZlcnRpY2VzLCBWZXJ0ZXhDb3VudCwgSW5kaWNlcywgSW5kZXhDb3VudCwgRmxhZ3MpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdJbmRleGVkUHJpbWl0aXZlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EcmF3SW5kZXhlZFByaW1pdGl2ZShJRGlyZWN0M0REZXZpY2UyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYVFlQRSBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKkluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBEV09SRCBGVkY7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCUwOHgsJXAsJTA4bHgsJXAsJTA4bHgsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZSwgVmVydGljZXMsIFZlcnRleENvdW50LCBJbmRpY2VzLCBJbmRleENvdW50LCBGbGFncyk7CisKKyAgICBzd2l0Y2goVmVydGV4VHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgRDNEVlRfVkVSVEVYOiBGVkYgPSBEM0RGVkZfVkVSVEVYOyBicmVhazsKKyAgICAgICAgY2FzZSBEM0RWVF9MVkVSVEVYOiBGVkYgPSBEM0RGVkZfTFZFUlRFWDsgYnJlYWs7CisgICAgICAgIGNhc2UgRDNEVlRfVExWRVJURVg6IEZWRiA9IEQzREZWRl9UTFZFUlRFWDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgfQorCisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRHJhd0luZGV4ZWRQcmltaXRpdmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRDbGlwU3RhdHVzCisgKgorICogU2V0cyB0aGUgY2xpcCBzdGF0dXMuIFRoaXMgZGVmaW5lcyB0aGluZ3MgYXMgY2xpcHBpbmcgY29uZGl0aW9ucyBhbmQKKyAqIHRoZSBleHRlbnRzIG9mIHRoZSBjbGlwcGluZyByZWdpb24uCisgKgorICogVmVyc2lvbiAyLCAzIGFuZCA3CisgKgorICogUGFyYW1zOgorICogIENsaXBTdGF0dXM6CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgYmVjYXVzZSBpdCdzIGEgc3R1YgorICogIChEREVSUl9JTlZBTElEUEFSQU1TIGlmIENsaXBTdGF0dXMgPT0gTlVMTCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19TZXRDbGlwU3RhdHVzKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ0xJUFNUQVRVUyAqQ2xpcFN0YXR1cykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglcCk6IFN0dWIhXG4iLCBUaGlzLCBDbGlwU3RhdHVzKTsKKworICAgIC8qIEQzRENMSVBTVEFUVVMgYW5kIFdJTkVEM0RDTElQU1RBVFVTIGFyZSBkaWZmZXJlbnQuIEkgZG9uJ3Qga25vdyBob3cgdG8gY29udmVydCB0aGVtCisgICAgICogUGVyaGFwcyB0aGlzIG5lZWRzIGEgbmV3IGRhdGEgdHlwZSBhbmQgYW4gYWRkaXRpb25hbCBJV2luZUQzRERldmljZSBtZXRob2QKKyAgICAgKi8KKyAgICAvKiByZXR1cm4gSVdpbmVEM0REZXZpY2VfU2V0Q2xpcFN0YXR1cyhUaGlzLT53aW5lRDNERGV2aWNlLCBDbGlwU3RhdHVzKTsqLworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDTElQU1RBVFVTICpDbGlwU3RhdHVzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgQ2xpcFN0YXR1cyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfU2V0Q2xpcFN0YXR1cyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBTdGF0dXMpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRDbGlwU3RhdHVzKElEaXJlY3QzRERldmljZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ0xJUFNUQVRVUyAqQ2xpcFN0YXR1cykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIENsaXBTdGF0dXMpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldENsaXBTdGF0dXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwU3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpHZXRDbGlwU3RhdHVzCisgKgorICogUmV0dXJucyB0aGUgY2xpcCBzdGF0dXMKKyAqCisgKiBQYXJhbXM6CisgKiAgQ2xpcFN0YXR1czogQWRkcmVzcyB0byB3cml0ZSB0aGUgY2xpcCBzdGF0dXMgdG8KKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBiZWNhdXNlIGl0J3MgYSBzdHViCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Q2xpcFN0YXR1cyhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIEZJWE1FKCIoJXApLT4oJXApOiBTdHViIVxuIiwgVGhpcywgQ2xpcFN0YXR1cyk7CisKKyAgICAvKiBEM0RDTElQU1RBVFVTIGFuZCBXSU5FRDNEQ0xJUFNUQVRVUyBhcmUgZGlmZmVyZW50LiBJIGRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgdGhlbSAqLworICAgIC8qIHJldHVybiBJV2luZUQzRERldmljZV9HZXRDbGlwU3RhdHVzKFRoaXMtPndpbmVEM0REZXZpY2UsIENsaXBTdGF0dXMpOyovCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0Q2xpcFN0YXR1cyhJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENMSVBTVEFUVVMgKkNsaXBTdGF0dXMpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDbGlwU3RhdHVzKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19HZXRDbGlwU3RhdHVzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFN0YXR1cyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldENsaXBTdGF0dXMoSURpcmVjdDNERGV2aWNlMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDTElQU1RBVFVTICpDbGlwU3RhdHVzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgQ2xpcFN0YXR1cyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0Q2xpcFN0YXR1cyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBTdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTo6RHJhd1ByaW1pdGl2ZVN0cmlkZWQKKyAqCisgKiBEcmF3cyB2ZXJ0aWNlcyBkZXNjcmliZWQgYnkgYSBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgc3RydWN0dXJlLgorICoKKyAqIFZlcnNpb24gMyBhbmQgNworICoKKyAqIFBhcmFtczoKKyAqICBQcmltaXRpdmVUeXBlOiBUaGUgcHJpbWl0aXZlIHR5cGUgdG8gZHJhdworICogIFZlcnRleFR5cGU6IFRoZSBGVkYgZGVzY3JpcHRpb24gb2YgdGhlIHZlcnRpY2VzIHRvIGRyYXcoZm9yIHRoZSBzdHJpZGU/PykKKyAqICBEM0REcmF3UHJpbVN0cmlkZURhdGE6IEEgRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBIHN0cnVjdHVyZSBkZXNjcmliaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmVydGV4IGRhdGEgbG9jYXRpb25zCisgKiAgVmVydGV4Q291bnQ6IFRoZSBudW1iZXIgb2YgdmVydGljZXMgdG8gZHJhdworICogIEZsYWdzOiBTb21lIGZsYWdzCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqICAoRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEM0REcmF3UHJpbVN0cmlkZURhdGEgaXMgTlVMTCkKKyAqICAoRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6RHJhd1ByaW1pdGl2ZVN0cmlkZWQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd1ByaW1pdGl2ZVN0cmlkZWQoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBICpEM0REcmF3UHJpbVN0cmlkZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFdpbmVEaXJlY3QzRFZlcnRleFN0cmlkZWREYXRhIFdpbmVEM0RTdHJpZGVkOworICAgIGludCBpOworICAgIFVJTlQgUHJpbWl0aXZlQ291bnQ7CisKKyAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJTA4bHgsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZSwgRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBWZXJ0ZXhDb3VudCwgRmxhZ3MpOworCisgICAgLyogR2V0IHRoZSBzdHJpZGVkIGRhdGEgcmlnaHQuIHRoZSB3aW5lZDNkIHN0cnVjdHVyZSBpcyBhIGJpdCBiaWdnZXIKKyAgICAgKiBXYXRjaCBvdXQ6IFRoZSBjb250ZW50cyBvZiB0aGUgc3RyaWRlZCBkYXRhIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmdmYsCisgICAgICogbm90IGJ5IHRoZSBtZW1iZXJzIHNldCBpbiBEM0REcmF3UHJpbVN0cmlkZURhdGEuIFNvIGl0J3MgdmFsaWQKKyAgICAgKiB0byBoYXZlIGRpZmZ1c2UubHB2RGF0YSBzZXQgdG8gMHhkZWFkYmVlZiBhbmQgbm90IHNldHRpbmcgdGhlIGRpZmZ1c2UKKyAgICAgKiBmbGFnIGluIHRoZSBmdmYuCisgICAgICovCisgICAgaWYoVmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZXaW5lRDNEU3RyaWRlZCwgMCwgc2l6ZW9mKFdpbmVEM0RTdHJpZGVkKSk7CisgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5wb3NpdGlvbi5scERhdGEgPSBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnBvc2l0aW9uLmxwdkRhdGE7CisgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5wb3NpdGlvbi5kd1N0cmlkZSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+cG9zaXRpb24uZHdTdHJpZGU7CisgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5wb3NpdGlvbi5kd1R5cGUgPSBXSU5FRDNEREVDTFRZUEVfRkxPQVQzOworICAgICAgICBpZiAoVmVydGV4VHlwZSAmIEQzREZWRl9YWVpSSFcpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5wb3NpdGlvbi5kd1R5cGUgPSBXSU5FRDNEREVDTFRZUEVfRkxPQVQ0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYoVmVydGV4VHlwZSAmIEQzREZWRl9OT1JNQUwpCisgICAgeworICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMubm9ybWFsLmxwRGF0YSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+bm9ybWFsLmxwdkRhdGE7CisgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5ub3JtYWwuZHdTdHJpZGUgPSBEM0REcmF3UHJpbVN0cmlkZURhdGEtPm5vcm1hbC5kd1N0cmlkZTsKKyAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLm5vcm1hbC5kd1R5cGUgPSBXSU5FRDNEREVDTFRZUEVfRkxPQVQzOworICAgIH0KKworICAgIGlmKFZlcnRleFR5cGUgJiBEM0RGVkZfRElGRlVTRSkKKyAgICB7CisgICAgICAgIFdpbmVEM0RTdHJpZGVkLnUucy5kaWZmdXNlLmxwRGF0YSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5scHZEYXRhOworICAgICAgICBXaW5lRDNEU3RyaWRlZC51LnMuZGlmZnVzZS5kd1N0cmlkZSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5kd1N0cmlkZTsKKyAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLmRpZmZ1c2UuZHdUeXBlID0gV0lORUQzRERFQ0xUWVBFX1NIT1JUNDsKKyAgICB9CisKKyAgICBpZihWZXJ0ZXhUeXBlICYgRDNERlZGX1NQRUNVTEFSKQorICAgIHsKKyAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnNwZWN1bGFyLmxwRGF0YSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+c3BlY3VsYXIubHB2RGF0YTsKKyAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnNwZWN1bGFyLmR3U3RyaWRlID0gRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5zcGVjdWxhci5kd1N0cmlkZTsKKyAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnNwZWN1bGFyLmR3VHlwZSA9IFdJTkVEM0RERUNMVFlQRV9TSE9SVDQ7CisgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IEdFVF9URVhDT1VOVF9GUk9NX0ZWRihWZXJ0ZXhUeXBlKTsgaSsrKQorICAgIHsKKyAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnRleENvb3Jkc1tpXS5scERhdGEgPSBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnRleHR1cmVDb29yZHNbaV0ubHB2RGF0YTsKKyAgICAgICAgV2luZUQzRFN0cmlkZWQudS5zLnRleENvb3Jkc1tpXS5kd1N0cmlkZSA9IEQzRERyYXdQcmltU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1tpXS5kd1N0cmlkZTsKKyAgICAgICAgc3dpdGNoKEdFVF9URVhDT09SRF9TSVpFX0ZST01fRlZGKFZlcnRleFR5cGUsIGkpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6IFdpbmVEM0RTdHJpZGVkLnUucy50ZXhDb29yZHNbaV0uZHdUeXBlID0gV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IFdpbmVEM0RTdHJpZGVkLnUucy50ZXhDb29yZHNbaV0uZHdUeXBlID0gV0lORUQzRERFQ0xUWVBFX0ZMT0FUMjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IFdpbmVEM0RTdHJpZGVkLnUucy50ZXhDb29yZHNbaV0uZHdUeXBlID0gV0lORUQzRERFQ0xUWVBFX0ZMT0FUMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IFdpbmVEM0RTdHJpZGVkLnUucy50ZXhDb29yZHNbaV0uZHdUeXBlID0gV0lORUQzRERFQ0xUWVBFX0ZMT0FUNDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBFUlIoIlVuZXhwZWN0ZWQgdGV4dHVyZSBjb29yZGluYXRlIHNpemUgJWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URVhDT09SRF9TSVpFX0ZST01fRlZGKFZlcnRleFR5cGUsIGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCB0aGUgcHJpbWl0aXZlIGNvdW50ICovCisgICAgc3dpdGNoKFByaW1pdGl2ZVR5cGUpCisgICAgeworICAgICAgICBjYXNlIEQzRFBUX1BPSU5UTElTVDogCisgICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEQzRFBUX0xJTkVMSVNUOiAKKyAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC8gMjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEQzRFBUX0xJTkVTVFJJUDoKKyAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoKKyAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC8gMzsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CisgICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBWZXJ0ZXhDb3VudCAtIDI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoKKyAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IFZlcnRleENvdW50IC0gMjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICBJV2luZUQzRERldmljZV9TZXRGVkYoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4VHlwZSk7CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfRHJhd1ByaW1pdGl2ZVN0cmlkZWQoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXaW5lRDNEU3RyaWRlZCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdQcmltaXRpdmVTdHJpZGVkKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSAqRDNERHJhd1ByaW1TdHJpZGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBQcmltaXRpdmVUeXBlLCBWZXJ0ZXhUeXBlLCBEM0REcmF3UHJpbVN0cmlkZURhdGEsIFZlcnRleENvdW50LCBGbGFncyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRHJhd1ByaW1pdGl2ZVN0cmlkZWQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERyYXdQcmltU3RyaWRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6RHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkCisgKgorICogRHJhd3MgcHJpbWl0aXZlcyBzcGVjaWZpZWQgYnkgc3RyaWRlZCBkYXRhIGxvY2F0aW9ucyBiYXNlZCBvbiBpbmRpY2VzCisgKgorICogVmVyc2lvbiAzIGFuZCA3CisgKgorICogUGFyYW1zOgorICogIFByaW1pdGl2ZVR5cGU6CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqICAoRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEM0REcmF3UHJpbVN0cmlkZURhdGEgaXMgTlVMTCkKKyAqICAoRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBJbmRpY2VzIGlzIE5VTEwpCisgKiAgKEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6RHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgKkQzRERyYXdQcmltU3RyaWRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKkluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKS0+KCUwOHgsJTA4bHgsJXAsJTA4bHgsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZSwgRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBWZXJ0ZXhDb3VudCwgSW5kaWNlcywgSW5kZXhDb3VudCwgRmxhZ3MpOworCisgICAgLyogSSdsbCBpbXBsZW1lbnQgaXQgYXMgc29vbiBhcyBJIGZpbmQgYSBhcHAgdG8gdGVzdCBpdC4KKyAgICAgKiBUaGlzIG5lZWRzIGFuIGFkZGl0aW9uYWwgbWV0aG9kIGluIElXaW5lRDNERGV2aWNlLgorICAgICAqLworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgKkQzRERyYXdQcmltU3RyaWRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKkluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlcCwlMDhseCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgUHJpbWl0aXZlVHlwZSwgVmVydGV4VHlwZSwgRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBWZXJ0ZXhDb3VudCwgSW5kaWNlcywgSW5kZXhDb3VudCwgRmxhZ3MpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERHJhd1ByaW1TdHJpZGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkRyYXdQcmltaXRpdmVWQgorICoKKyAqIERyYXdzIHByaW1pdGl2ZXMgZnJvbSBhIHZlcnRleCBidWZmZXIgdG8gdGhlIHNjcmVlbi4KKyAqCisgKiBWZXJzaW9uIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgUHJpbWl0aXZlVHlwZTogVHlwZSBvZiBwcmltaXRpdmUgdG8gYmUgcmVuZGVyZWQuCisgKiAgRDNEVmVydGV4QnVmOiBTb3VyY2UgVmVydGV4IEJ1ZmZlcgorICogIFN0YXJ0VmVydGV4OiBJbmRleCBvZiB0aGUgZmlyc3QgdmVydGV4IGZyb20gdGhlIGJ1ZmZlciB0byBiZSByZW5kZXJlZAorICogIE51bVZlcnRpY2VzOiBOdW1iZXIgb2YgdmVydGljZXMgdG8gYmUgcmVuZGVyZWQKKyAqICBGbGFnczogQ2FuIGJlIEQzRERQX1dBSVQgdG8gd2FpdCB1bnRpbCByZW5kZXJpbmcgaGFzIGZpbmlzaGVkCisgKgorICogUmV0dXJuIHZhbHVlcworICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEM0RWZXJ0ZXhCdWYgaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdQcmltaXRpdmVWQihJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICpEM0RWZXJ0ZXhCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXJ0VmVydGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBOdW1WZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKnZiID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgRDNEVmVydGV4QnVmKTsKKyAgICBVSU5UIFByaW1pdGl2ZUNvdW50OworICAgIEhSRVNVTFQgaHI7CisgICAgRFdPUkQgc3RyaWRlOworICAgIFdJTkVEM0RWRVJURVhCVUZGRVJfREVTQyBEZXNjOworCisgICAgVFJBQ0UoIiglcCktPiglMDh4LCVwLCUwOGx4LCUwOGx4LCUwOGx4KVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgRDNEVmVydGV4QnVmLCBTdGFydFZlcnRleCwgTnVtVmVydGljZXMsIEZsYWdzKTsKKworICAgIC8qIFNhbml0eSBjaGVja3MgKi8KKyAgICBpZighdmIpCisgICAgeworICAgICAgICBFUlIoIiglcCkgTm8gVmVydGV4IGJ1ZmZlciBzcGVjaWZpZWRcbiIsIFRoaXMpOworICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIHByaW1pdGl2ZSBjb3VudCAqLworICAgIHN3aXRjaChQcmltaXRpdmVUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBEM0RQVF9QT0lOVExJU1Q6IAorICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gTnVtVmVydGljZXM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9MSU5FTElTVDogCisgICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBOdW1WZXJ0aWNlcyAvIDI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9MSU5FU1RSSVA6CisgICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBOdW1WZXJ0aWNlcyAtIDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CisgICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBOdW1WZXJ0aWNlcyAvIDM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOgorICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gTnVtVmVydGljZXMgLSAyOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CisgICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBOdW1WZXJ0aWNlcyAtIDI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBGVkYgb2YgdGhlIHZlcnRleCBidWZmZXIsIGFuZCBpdHMgc3RyaWRlICovCisgICAgaHIgPSBJV2luZUQzRFZlcnRleEJ1ZmZlcl9HZXREZXNjKHZiLT53aW5lRDNEVmVydGV4QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVzYyk7CisgICAgaWYoaHIgIT0gRDNEX09LKQorICAgIHsKKyAgICAgICAgRVJSKCIoJXApIElXaW5lRDNEVmVydGV4QnVmZmVyOjpHZXREZXNjIGZhaWxlZCB3aXRoIGhyID0gJTA4bHhcbiIsIFRoaXMsIGhyKTsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKyAgICBzdHJpZGUgPSBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoRGVzYy5GVkYpOworCisgICAgaHIgPSBJV2luZUQzRERldmljZV9TZXRGVkYoVGhpcy0+d2luZUQzRERldmljZSwgRGVzYy5GVkYpOworICAgIGlmKEZBSUxFRChocikpCisgICAgeworICAgICAgICBFUlIoIiAoJXApIFNldHRpbmcgdGhlIEZWRiBmYWlsZWQsIGhyID0gJWx4IVxuIiwgVGhpcywgaHIpOworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorCisgICAgLyogU2V0IHRoZSB2ZXJ0ZXggc3RyZWFtIHNvdWNlICovCisgICAgaHIgPSBJV2luZUQzRERldmljZV9TZXRTdHJlYW1Tb3VyY2UoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFN0cmVhbU51bWJlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Yi0+d2luZUQzRFZlcnRleEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFN0YXJ0VmVydGV4IC0gd2UgcGFzcyB0aGlzIHRvIERyYXdQcmltaXRpdmUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKyAgICBpZihociAhPSBEM0RfT0spCisgICAgeworICAgICAgICBFUlIoIiglcCkgSURpcmVjdDNERGV2aWNlOjpTZXRTdHJlYW1Tb3VyY2UgZmFpbGVkIHdpdGggaHIgPSAlMDhseFxuIiwgVGhpcywgaHIpOworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorCisgICAgLyogTm93IGRyYXcgdGhlIHByaW1pdGl2ZXMgKi8KKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfRHJhd1ByaW1pdGl2ZShUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRWZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlQ291bnQpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3UHJpbWl0aXZlVkIoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyICpEM0RWZXJ0ZXhCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXJ0VmVydGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBOdW1WZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKnZiID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBEM0RWZXJ0ZXhCdWYpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCVwLCUwOGx4LCUwOGx4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsICBQcmltaXRpdmVUeXBlLCB2YiwgU3RhcnRWZXJ0ZXgsIE51bVZlcnRpY2VzLCBGbGFncyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRHJhd1ByaW1pdGl2ZVZCKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRSh2YiwgSURpcmVjdDNEVmVydGV4QnVmZmVyNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VmVydGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6RHJhd0luZGV4ZWRQcmltaXRpdmVWQgorICoKKyAqIERyYXdzIHByaW1pdGl2ZXMgZnJvbSBhIHZlcnRleCBidWZmZXIgdG8gdGhlIHNjcmVlbgorICoKKyAqIFBhcmFtczoKKyAqICBQcmltaXRpdmVUeXBlOiBUeXBlIG9mIHByaW1pdGl2ZSB0byBiZSByZW5kZXJlZC4KKyAqICBEM0RWZXJ0ZXhCdWY6IFNvdXJjZSBWZXJ0ZXggQnVmZmVyCisgKiAgU3RhcnRWZXJ0ZXg6IEluZGV4IG9mIHRoZSBmaXJzdCB2ZXJ0ZXggZnJvbSB0aGUgYnVmZmVyIHRvIGJlIHJlbmRlcmVkCisgKiAgTnVtVmVydGljZXM6IE51bWJlciBvZiB2ZXJ0aWNlcyB0byBiZSByZW5kZXJlZAorICogIEluZGljZXM6IEFycmF5IG9mIERXT1JEcyB1c2VkIHRvIGluZGV4IGludG8gdGhlIFZlcnRpY2VzCisgKiAgSW5kZXhDb3VudDogTnVtYmVyIG9mIGluZGljZXMgaW4gSW5kaWNlcworICogIEZsYWdzOiBDYW4gYmUgRDNERFBfV0FJVCB0byB3YWl0IHVudGlsIHJlbmRlcmluZyBoYXMgZmluaXNoZWQKKyAqCisgKiBSZXR1cm4gdmFsdWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd0luZGV4ZWRQcmltaXRpdmVWQihJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKkQzRFZlcnRleEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXJ0VmVydGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTnVtVmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICpJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICp2YiA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIEQzRFZlcnRleEJ1Zik7CisgICAgRFdPUkQgc3RyaWRlOworICAgIFVJTlQgUHJpbWl0aXZlQ291bnQ7CisgICAgV09SRCAqTG9ja2VkSW5kaWNlczsKKyAgICBIUkVTVUxUIGhyOworICAgIFdJTkVEM0RWRVJURVhCVUZGRVJfREVTQyBEZXNjOworCisgICAgVFJBQ0UoIiglcCktPiglMDh4LCVwLCVsZCwlbGQsJXAsJWxkLCUwOGx4KVxuIiwgVGhpcywgUHJpbWl0aXZlVHlwZSwgdmIsIFN0YXJ0VmVydGV4LCBOdW1WZXJ0aWNlcywgSW5kaWNlcywgSW5kZXhDb3VudCwgRmxhZ3MpOworCisgICAgLyogU3RlcHM6CisgICAgICogMSkgQ2FsY3VsYXRlIHNvbWUgdGhpbmdzOiBWZXJ0ZXggY291bnQgLT4gUHJpbWl0aXZlIGNvdW50LCBzdHJpZGUsIC4uLgorICAgICAqIDIpIFVwbG9hZCB0aGUgSW5kaWNlcyB0byB0aGUgaW5kZXggYnVmZmVyCisgICAgICogMykgU2V0IHRoZSBpbmRleCBzb3VyY2UKKyAgICAgKiA0KSBTZXQgdGhlIFZlcnRleCBCdWZmZXIgYXMgdGhlIFN0cmVhbSBzb3VyY2UKKyAgICAgKiA1KSBDYWxsIElXaW5lRDNERGV2aWNlOjpEcmF3SW5kZXhlZFByaW1pdGl2ZQorICAgICAqLworCisgICAgLyogR2V0IHRoZSBwcmltaXRpdmUgY291bnQgKi8KKyAgICBzd2l0Y2goUHJpbWl0aXZlVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgRDNEUFRfUE9JTlRMSVNUOiAKKyAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9MSU5FTElTVDogCisgICAgICAgICAgUHJpbWl0aXZlQ291bnQgPSBJbmRleENvdW50IC8gMjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEQzRFBUX0xJTkVTVFJJUDoKKyAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOgorICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudCAvIDM7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOgorICAgICAgICAgIFByaW1pdGl2ZUNvdW50ID0gSW5kZXhDb3VudCAtIDI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoKKyAgICAgICAgICBQcmltaXRpdmVDb3VudCA9IEluZGV4Q291bnQgLSAyOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIC8qIEdldCB0aGUgRlZGIG9mIHRoZSB2ZXJ0ZXggYnVmZmVyLCBhbmQgaXRzIHN0cmlkZSAqLworICAgIGhyID0gSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfR2V0RGVzYyh2Yi0+d2luZUQzRFZlcnRleEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlc2MpOworICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICB7CisgICAgICAgIEVSUigiKCVwKSBJV2luZUQzRFZlcnRleEJ1ZmZlcjo6R2V0RGVzYyBmYWlsZWQgd2l0aCBociA9ICUwOGx4XG4iLCBUaGlzLCBocik7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisgICAgc3RyaWRlID0gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERlc2MuRlZGKTsKKyAgICBUUkFDRSgiVmVydGV4IGJ1ZmZlciBGVkYgPSAlMDhseCwgc3RyaWRlPSVsZFxuIiwgRGVzYy5GVkYsIHN0cmlkZSk7CisKKyAgICBociA9IElXaW5lRDNERGV2aWNlX1NldEZWRihUaGlzLT53aW5lRDNERGV2aWNlLCBEZXNjLkZWRik7CisgICAgaWYoRkFJTEVEKGhyKSkKKyAgICB7CisgICAgICAgIEVSUigiICglcCkgU2V0dGluZyB0aGUgRlZGIGZhaWxlZCwgaHIgPSAlbHghXG4iLCBUaGlzLCBocik7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisKKyAgICAvKiBjb3B5IHRoZSBpbmRleCBzdHJlYW0gaW50byB0aGUgaW5kZXggYnVmZmVyLgorICAgICAqIEEgbmV3IElXaW5lRDNERGV2aWNlIG1ldGhvZCBjb3VsZCBiZSBjcmVhdGVkCisgICAgICogd2hpY2ggdGFrZXMgYW4gdXNlciBwb2ludGVyIGNvbnRhaW5pbmcgdGhlIGluZGljZXMKKyAgICAgKiBvciBhIFNldERhdGEtTWV0aG9kIGZvciB0aGUgaW5kZXggYnVmZmVyLCB3aGljaAorICAgICAqIG92ZXJyaWRlcyB0aGUgaW5kZXggYnVmZmVyIGRhdGEgd2l0aCBvdXIgcG9pbnRlci4KKyAgICAgKi8KKyAgICBociA9IElXaW5lRDNESW5kZXhCdWZmZXJfTG9jayhUaGlzLT5pbmRleGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIE9mZlNldFRvTG9jayAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIFNpemVUb0xvY2sgLSBkb2Vzbid0IG1hdHRlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSAqKikgJkxvY2tlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBGbGFncyAqLyk7CisgICAgYXNzZXJ0KEluZGV4Q291bnQgPCAweDEwMDAwMCk7CisgICAgaWYoaHIgIT0gRDNEX09LKQorICAgIHsKKyAgICAgICAgRVJSKCIoJXApIElXaW5lRDNESW5kZXhCdWZmZXI6OkxvY2sgZmFpbGVkIHdpdGggaHIgPSAlMDhseFxuIiwgVGhpcywgaHIpOworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorICAgIG1lbWNweShMb2NrZWRJbmRpY2VzLCBJbmRpY2VzLCBJbmRleENvdW50ICogc2l6ZW9mKFdPUkQpKTsKKyAgICBociA9IElXaW5lRDNESW5kZXhCdWZmZXJfVW5sb2NrKFRoaXMtPmluZGV4YnVmZmVyKTsKKyAgICBpZihociAhPSBEM0RfT0spCisgICAgeworICAgICAgICBFUlIoIiglcCkgSVdpbmVEM0RJbmRleEJ1ZmZlcjo6VW5sb2NrIGZhaWxlZCB3aXRoIGhyID0gJTA4bHhcbiIsIFRoaXMsIGhyKTsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKworICAgIC8qIFNldCB0aGUgaW5kZXggc3RyZWFtICovCisgICAgaHIgPSBJV2luZUQzRERldmljZV9TZXRJbmRpY2VzKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPmluZGV4YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgIC8qIFNldCB0aGUgdmVydGV4IHN0cmVhbSBzb3VjZSAqLworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0U3RyZWFtU291cmNlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBTdHJlYW1OdW1iZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmItPndpbmVEM0RWZXJ0ZXhCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBvZmZzZXQsIHdlIHBhc3MgdGhpcyB0byBEcmF3SW5kZXhlZFByaW1pdGl2ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUpOworICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICB7CisgICAgICAgIEVSUigiKCVwKSBJRGlyZWN0M0REZXZpY2U6OlNldFN0cmVhbVNvdXJjZSBmYWlsZWQgd2l0aCBociA9ICUwOGx4XG4iLCBUaGlzLCBocik7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisKKworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfRHJhd0luZGV4ZWRQcmltaXRpdmUoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydFZlcnRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogbWluSW5kZXggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogU3RhcnRJbmRleCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZUNvdW50KTsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlVkIoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKkQzRFZlcnRleEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKkluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBJbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKlZCID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBEM0RWZXJ0ZXhCdWYpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDh4LCVwLCVwLCUwOGx4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFByaW1pdGl2ZVR5cGUsIFZCLCBJbmRpY2VzLCBJbmRleENvdW50LCBGbGFncyk7CisKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3SW5kZXhlZFByaW1pdGl2ZVZCKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKFZCLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6Q29tcHV0ZVNwaGVyZVZpc2liaWxpdHkKKyAqCisgKiBDYWxjdWxhdGVzIHRoZSB2aXNpYmlsaXR5IG9mIHNwaGVyZXMgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQuIFRoZSBzcGhlcmVzCisgKiBhcmUgcGFzc2VkIGluIHRoZSBDZW50ZXJzIGFuZCBSYWRpaSBhcnJheXMsIHRoZSByZXN1bHRzIGFyZSBwYXNzZWQgYmFjaworICogaW4gdGhlIFJldHVyblZhbHVlcyBhcnJheS4gUmV0dXJuIHZhbHVlcyBhcmUgZWlnaHRlciBjb21wbGV0ZWx5IHZpc2libGUsCisgKiBwYXJ0aWFsbHkgdmlzaWJsZSBvciBjb21wbGV0ZWx5IGludmlzaWJsZS4KKyAqIFRoZSByZXR1cm4gdmFsdWUgY29uc2lzdCBvZiBhIGNvbWJpbmF0aW9uIG9mIEQzRENMSVBfKiBmbGFncywgb3IgaXQncworICogMCBpZiB0aGUgc3BoZXJlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZShhY2NvcmRpbmcgdG8gdGhlIFNESywgbm90IGNoZWNrZWQpCisgKgorICogU291bmRzIGxpa2UgYW4gb3ZlcmRvc2UgbWF0aCA7KQorICoKKyAqIFZlcnNpb24gMyBhbmQgNworICoKKyAqIFBhcmFtczoKKyAqICBDZW50ZXJzOiBBcnJheSBjb250YWluaW5nIHRoZSBzcGhlcmUgY2VudGVycworICogIFJhZGlpOiBBcnJheSBjb250YWluaW5nIHRoZSBzcGhlcmUgcmFkaXMKKyAqICBOdW1TcGhlcmVzOiBUaGUgbnVtYmVyIG9mIGNlbnRlcnMgYW5kIHJhZGlpcyBpbiB0aGUgYXJyYXlzCisgKiAgRmxhZ3M6IFNvbWUgZmxhZ3MKKyAqICBSZXR1cm5WYWx1ZXM6IEFycmF5IHRvIHdyaXRlIHRoZSByZXN1bHRzIHRvCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgYmVjYXVzZSBpdCdzIGEgc3R1YgorICogIChEREVSUl9JTlZBTElEUEFSQU1TIGlmIENlbnRlcnMsIFJhZGlpIG9yIFJldHVyblZhbHVlcyBhcmUgTlVMTCkKKyAqICAoRDNERVJSX0lOVkFMSURNQVRSSVggaWYgdGhlIGNvbWJpbmVkIHdvcmxkLCB2aWV3IGFuZCBwcm9qIG1hdHJpeAorICogIGlzIHNpbmd1bGFyKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5KElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFQ1RPUiAqQ2VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSAqUmFkaWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTnVtU3BoZXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqUmV0dXJuVmFsdWVzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKS0+KCVwLCVwLCUwOGx4LCUwOGx4LCVwKTogc3R1YiFcbiIsIFRoaXMsIENlbnRlcnMsIFJhZGlpLCBOdW1TcGhlcmVzLCBGbGFncywgUmV0dXJuVmFsdWVzKTsKKworICAgIC8qIHRoZSBEaXJlY3RYIDcgc2RrIHNheXMgdGhhdCB0aGUgdmlzaWJpbGl0eSBpcyBjb21wdXRlZCBieQorICAgICAqIGJhY2stdHJhbnNmb3JtaW5nIHRoZSB2aWV3aW5nIGZydXN0dW0gdG8gbW9kZWwgc3BhY2UKKyAgICAgKiB1c2luZyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tYmluZWQgd29ybGQsIHZpZXcgYW5kIHByb2plY3Rpb24KKyAgICAgKiBtYXRyaXguIElmIHRoZSBtYXRyaXggY2FuJ3QgYmUgcmV2ZXJzZWQsIEQzREVSUl9JTlZBTElETUFUUklYCisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBpZGVhOgorICAgICAqIDEpIENoZWNrIGlmIHRoZSBjZW50ZXIgaXMgaW4gdGhlIHZpZXdpbmcgZnJ1c3R1bQorICAgICAqIDIpIEN1dCB0aGUgc3BoZXJlIHdpdGggdGhlIHBsYW5lcyBvZiB0aGUgdmlld2luZworICAgICAqICAgIGZydXN0dW0KKyAgICAgKgorICAgICAqIC0+Q2VudGVyIGluc2lkZSB0aGUgZnJ1c3R1bSwgbm8gaW50ZXJzZWN0aW9uczoKKyAgICAgKiAgICBGdWxseSB2aXNpYmxlCisgICAgICogLT5DZW50ZXIgb3V0c2lkZSB0aGUgZnJ1c3R1bSwgbm8gaW50ZXJzZWN0aW9uczoKKyAgICAgKiAgICBOb3QgdmlzaWJsZQorICAgICAqIC0+U29tZSBpbnRlcnNlY3Rpb25zOiBQYXJ0aWFsbHkgdmlzaWJsZQorICAgICAqCisgICAgICogSW1wbGVtZW50IHRoaXMgY2FsbCBpbiBXaW5lRDNELiBFaWdodGVyIGltcGxlbWVudCB0aGUKKyAgICAgKiBtYXRyaXggYW5kIHZlY3RvciBzdHVmZiBpbiBXaW5lRDNELCBvciB1c2Ugc29tZSBleHRlcm5hbAorICAgICAqIG1hdGggbGlicmFyeS4KKyAgICAgKi8KKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5KElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFQ1RPUiAqQ2VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSAqUmFkaWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTnVtU3BoZXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqUmV0dXJuVmFsdWVzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXAsJTA4bHgsJTA4bHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgQ2VudGVycywgUmFkaWksIE51bVNwaGVyZXMsIEZsYWdzLCBSZXR1cm5WYWx1ZXMpOworICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU3BoZXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkdldFRleHR1cmUKKyAqCisgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGludGVyZmFjZSBoYW5kbGUgYXNzaWduZWQgdG8gYSB0ZXh0dXJlIHN0YWdlLgorICogVGhlIHJldHVybmVkIHRleHR1cmUgaXMgQWRkUmVmZWQuIFRoaXMgaXMgdGFrZW4gZnJvbSBvbGQgZGRyYXcsCisgKiBub3QgY2hlY2tlZCBpbiBXaW5kb3dzLgorICoKKyAqIFZlcnNpb24gMyBhbmQgNworICoKKyAqIFBhcmFtczoKKyAqICBTdGFnZTogVGV4dHVyZSBzdGFnZSB0byByZWFkIHRoZSB0ZXh0dXJlIGZyb20KKyAqICBUZXh0dXJlOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFRleHR1cmUgaXMgTlVMTAorICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OkdldFRleHR1cmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19HZXRUZXh0dXJlKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICoqVGV4dHVyZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgSVdpbmVEM0RCYXNlVGV4dHVyZSAqU3VyZjsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJWxkLCVwKTogUmVsYXlcbiIsIFRoaXMsIFN0YWdlLCBUZXh0dXJlKTsKKworICAgIGlmKCFUZXh0dXJlKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIlRleHR1cmUgPT0gTlVMTCwgZmFpbGluZyB3aXRoIERERVJSX0lOVkFMSURQQVJBTVNcbiIpOworICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICBociA9IElXaW5lRDNERGV2aWNlX0dldFRleHR1cmUoVGhpcy0+d2luZUQzRERldmljZSwgU3RhZ2UsIChJV2luZUQzREJhc2VUZXh0dXJlICoqKSAmU3VyZik7CisgICAgaWYoIChociAhPSBEM0RfT0spIHx8ICghU3VyZikgKSAKKyAgICB7CisgICAgICAgICpUZXh0dXJlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGhyOworICAgIH0KKworICAgIC8qIEdldFBhcmVudCBBZGRSZWYoKXMsIHdoaWNoIGlzIHBlcmZlY3RseSBPSy4KKyAgICAgKiBXZSBoYXZlIHBhc3NlZCB0aGUgSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UgdG8gV2luZUQzRCwgc28gdGhhdCdzIE9LIHRvby4KKyAgICAgKi8KKyAgICByZXR1cm4gSVdpbmVEM0RCYXNlVGV4dHVyZV9HZXRQYXJlbnQoU3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElVbmtub3duICoqKSBUZXh0dXJlKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VGV4dHVyZShJRGlyZWN0M0REZXZpY2UzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZTIgKipUZXh0dXJlMikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgSFJFU1VMVCByZXQ7CisgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqcmV0X3ZhbDsKKworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglbGQsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgU3RhZ2UsIFRleHR1cmUyKTsKKyAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldFRleHR1cmUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0X3ZhbCk7CisKKyAgICAqVGV4dHVyZTIgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdDNEVGV4dHVyZTIsIHJldF92YWwpOworCisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXAuXG4iLCAqVGV4dHVyZTIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpTZXRUZXh0dXJlCisgKgorICogQXNzaWduZXMgYSB0ZXh0dXJlIHRvIGEgdGV4dHVyZSBzdGFnZS4gSXMgdGhlIHRleHR1cmUgQWRkUmVmZWQ/CisgKgorICogVmVyc2lvbiAzIGFuZCA3CisgKgorICogUGFyYW1zOgorICogIFN0YWdlOiBUaGUgc3RhZ2UgdG8gYXNzaWduIHRoZSB0ZXh0dXJlIHRvCisgKiAgVGV4dHVyZTogSW50ZXJmYWNlIHBvaW50ZXIgdG8gdGhlIHRleHR1cmUgc3VyZmFjZQorICoKKyAqIFJldHVybnMKKyAqIEQzRF9PSyBvbiBzdWNjZXNzCisgKiBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRUZXh0dXJlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0VGV4dHVyZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqVGV4dHVyZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIFRleHR1cmUpOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIFN0YWdlLCBzdXJmKTsKKworICAgIC8qIFRleHR1cmUgbWF5IGJlIE5VTEwgaGVyZSAqLworICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZiA/IChJV2luZUQzREJhc2VUZXh0dXJlICogKSBzdXJmLT53aW5lRDNEVGV4dHVyZSA6IE5VTEwpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUZXh0dXJlKElEaXJlY3QzRERldmljZTMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RUZXh0dXJlMiAqVGV4dHVyZTIpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBUZXh0dXJlMik7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVsZCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGFnZSwgdGV4KTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRUZXh0dXJlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRSh0ZXgsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpHZXRUZXh0dXJlU3RhZ2VTdGF0ZQorICoKKyAqIFJldHJpZXZlcyBhIHN0YXRlIGZyb20gYSB0ZXh0dXJlIHN0YWdlLgorICoKKyAqIFZlcnNpb24gMyBhbmQgNworICoKKyAqIFBhcmFtczoKKyAqICBTdGFnZTogVGhlIHN0YWdlIHRvIHJldHJpZXZlIHRoZSBzdGF0ZSBmcm9tCisgKiAgVGV4U3RhZ2VTdGF0ZVR5cGU6IFRoZSBzdGF0ZSB0eXBlIHRvIHJldHJpZXZlCisgKiAgU3RhdGU6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIHN0YXRlJ3MgdmFsdWUgYXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBTdGF0ZSBpcyBOVUxMCisgKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6R2V0VGV4dHVyZVN0YWdlU3RhdGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19HZXRUZXh0dXJlU3RhZ2VTdGF0ZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgVGV4U3RhZ2VTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKlN0YXRlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCUwOHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIFN0YWdlLCBUZXhTdGFnZVN0YXRlVHlwZSwgU3RhdGUpOworCisgICAgaWYoIVN0YXRlKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIHJldHVybiBJV2luZUQzRERldmljZV9HZXRUZXh0dXJlU3RhZ2VTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4U3RhZ2VTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VGV4dHVyZVN0YWdlU3RhdGUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIFRleFN0YWdlU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpTdGF0ZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOGx4LCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgU3RhZ2UsIFRleFN0YWdlU3RhdGVUeXBlLCBTdGF0ZSk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0VGV4dHVyZVN0YWdlU3RhdGUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4U3RhZ2VTdGF0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OlNldFRleHR1cmVTdGFnZVN0YXRlCisgKgorICogU2V0cyBhIHRleHR1cmUgc3RhZ2Ugc3RhdGUuIFNvbWUgc3RhZ2UgdHlwZXMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseSwKKyAqIGJlY2F1c2UgdGhleSBkbyBub3QgZXhpc3QgaW4gV2luZUQzRCBhbmQgd2VyZSBtb3ZlZCB0byBhbm90aGVyIHBsYWNlCisgKgorICogVmVyc2lvbiAzIGFuZCA3CisgKgorICogUGFyYW1zOgorICogIFN0YWdlOiBUaGUgc3RhZ2UgdG8gbW9kaWZ5CisgKiAgVGV4U3RhZ2VTdGF0ZVR5cGU6IFRoZSBzdGF0ZSB0byBjaGFuZ2UKKyAqICBTdGF0ZTogVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHN0YXRlCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OlNldFRleHR1cmVTdGFnZVN0YXRlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0VGV4dHVyZVN0YWdlU3RhdGUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIFRleFN0YWdlU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXRlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCUwOHgsJTA4bHgpOiBSZWxheSFcbiIsIFRoaXMsIFN0YWdlLCBUZXhTdGFnZVN0YXRlVHlwZSwgU3RhdGUpOworICAgIHN3aXRjaChUZXhTdGFnZVN0YXRlVHlwZSkKKyAgICB7CisgICAgICAgIC8qIE1pcGZpbHRlciBpcyBhIHNhbXBsZXIgc3RhdGUgd2l0aCBkaWZmZXJlbnQgdmFsdWVzICovCisgICAgICAgIGNhc2UgRDNEVFNTX01JUEZJTFRFUjoKKyAgICAgICAgeworICAgICAgICAgICAgV0lORUQzRFRFWFRVUkVGSUxURVJUWVBFIHZhbHVlOworICAgICAgICAgICAgc3dpdGNoKFN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRDNEVEZQX05PTkU6IHZhbHVlID0gV0lORUQzRFRFWEZfTk9ORTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEM0RURlBfUE9JTlQ6IHZhbHVlID0gV0lORUQzRFRFWEZfUE9JTlQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMDogLyogVW5jaGVja2VkICovCisgICAgICAgICAgICAgICAgY2FzZSBEM0RURlBfTElORUFSOiB2YWx1ZSA9IFdJTkVEM0RURVhGX0xJTkVBUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmV4cGVjdGVkIG1pcGZpbHRlciB2YWx1ZSAlbGRcbiIsIFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBXSU5FRDNEVEVYRl9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNBTVBfTUlQRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBNaW5maWx0ZXIgaXMgYSBzYW1wbGVyIHN0YXRlIHRvbywgZXF1YWwgdmFsdWVzICovCisgICAgICAgIGNhc2UgRDNEVFNTX01JTkZJTFRFUjoKKyAgICAgICAgICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRTYW1wbGVyU3RhdGUoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RTQU1QX01JTkZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOworICAgICAgICAvKiBTYW1lIGZvciBNQUdGSUxURVIgKi8KKyAgICAgICAgY2FzZSBEM0RUU1NfTUFHRklMVEVSOgorICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNBTVBfTUFHRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7CisKKyAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgcmV0dXJuIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleFN0YWdlU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUpOworICAgIH0KK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0VGV4dHVyZVN0YWdlU3RhdGUoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIFRleFN0YWdlU3RhdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXRlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJTA4bHgsJTA4eCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGFnZSwgVGV4U3RhZ2VTdGF0ZVR5cGUsIFN0YXRlKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRUZXh0dXJlU3RhZ2VTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXhTdGFnZVN0YXRlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6VmFsaWRhdGVEZXZpY2UKKyAqCisgKiBTREs6ICJSZXBvcnRzIHRoZSBkZXZpY2UncyBhYmlsaXR5IHRvIHJlbmRlciB0aGUgY3VycmVudGx5IHNldAorICogdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb25zIGluIGEgc2luZ2xlIHBhc3MiLiBXaGF0ZXZlciB0aGF0IG1lYW5zCisgKiBleGFjdGx5Li4uCisgKgorICogVmVyc2lvbiAzIGFuZCA3CisgKgorICogUGFyYW1zOgorICogIE51bVBhc3NlczogQWRkcmVzcyB0byB3cml0ZSB0aGUgbnVtYmVyIG9mIG5lY2Nlc3NhcnkgcGFzc2VzIGZvciB0aGUKKyAqICAgICAgICAgICAgIGRlc2lyZWQgZWZmZWN0IHRvLgorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBTZWUgSVdpbmVEM0REZXZpY2U6OlZhbGlkYXRlRGV2aWNlIGZvciBtb3JlIGRldGFpbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19WYWxpZGF0ZURldmljZShJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqTnVtUGFzc2VzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXlcbiIsIFRoaXMsIE51bVBhc3Nlcyk7CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfVmFsaWRhdGVEZXZpY2UoVGhpcy0+d2luZUQzRERldmljZSwgTnVtUGFzc2VzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfVmFsaWRhdGVEZXZpY2UoSURpcmVjdDNERGV2aWNlMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKlBhc3NlcykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIFBhc3Nlcyk7CisgICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfVmFsaWRhdGVEZXZpY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc2VzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpDbGVhcgorICoKKyAqIEZpbGxzIHRoZSByZW5kZXIgdGFyZ2V0LCB0aGUgeiBidWZmZXIgYW5kIHRoZSBzdGVuY2lsIGJ1ZmZlciB3aXRoIGEKKyAqIGNsZWFyIGNvbG9yIC8gdmFsdWUKKyAqCisgKiBWZXJzaW9uIDcgb25seQorICoKKyAqIFBhcmFtczoKKyAqICBDb3VudDogTnVtYmVyIG9mIHJlY3RhbmdsZXMgaW4gUmVjdHMgbXVzdCBiZSAwIGlmIFJlY3RzIGlzIE5VTEwKKyAqICBSZWN0czogUmVjdGFuZ2xlcyB0byBjbGVhci4gSWYgTlVMTCwgdGhlIHdob2xlIHN1cmZhY2UgaXMgY2xlYXJlZAorICogIEZsYWdzOiBTb21lIGZsYWdzLCBhcyB1c3VhbAorICogIENvbG9yOiBDbGVhciBjb2xvciBmb3IgdGhlIHJlbmRlciB0YXJnZXQKKyAqICBaOiBDbGVhciB2YWx1ZSBmb3IgdGhlIFogYnVmZmVyCisgKiAgU3RlbmNpbDogQ2xlYXIgdmFsdWUgdG8gc3RvcmUgaW4gZWFjaCBzdGVuY2lsIGJ1ZmZlciBlbnRyeQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpDbGVhcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0NsZWFyKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFQ1QgKlJlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENPTE9SIENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZBTFVFIFosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RlbmNpbCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglMDhseCwlcCwlMDhseCwlMDhseCwlZiwlMDhseCk6IFJlbGF5XG4iLCBUaGlzLCBDb3VudCwgUmVjdHMsIEZsYWdzLCAoRFdPUkQpIENvbG9yLCBaLCBTdGVuY2lsKTsKKworICAgIHJldHVybiBJV2luZUQzRERldmljZV9DbGVhcihUaGlzLT53aW5lRDNERGV2aWNlLCBDb3VudCwgUmVjdHMsIEZsYWdzLCBDb2xvciwgWiwgU3RlbmNpbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6U2V0Vmlld3BvcnQKKyAqCisgKiBTZXRzIHRoZSBjdXJyZW50IHZpZXdwb3J0LgorICoKKyAqIFZlcnNpb24gNyBvbmx5LCBidXQgSURpcmVjdDNEVmlld3BvcnQgdXNlcyB0aGlzIGNhbGwgZm9yIG9sZGVyCisgKiB2ZXJzaW9ucworICoKKyAqIFBhcmFtczoKKyAqICBEYXRhOiBUaGUgbmV3IHZpZXdwb3J0IHRvIHNldAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERhdGEgaXMgTlVMTAorICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZURERGV2aWNlOjpTZXRWaWV3cG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFZpZXdwb3J0KElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZJRVdQT1JUNyAqRGF0YSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCkgUmVsYXkhXG4iLCBUaGlzLCBEYXRhKTsKKworICAgIGlmKCFEYXRhKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRWaWV3cG9ydChUaGlzLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U6OkdldFZpZXdwb3J0CisgKgorICogUmV0dXJucyB0aGUgY3VycmVudCB2aWV3cG9ydAorICoKKyAqIFZlcnNpb24gNworICoKKyAqIFBhcmFtczoKKyAqICBEYXRhOiBEM0Q3Vmlld3BvcnQgc3RydWN0dXJlIHRvIHdyaXRlIHRoZSB2aWV3cG9ydCBpbmZvcm1hdGlvbiB0bworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERhdGEgaXMgTlVMTAorICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6R2V0Vmlld3BvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19HZXRWaWV3cG9ydChJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWSUVXUE9SVDcgKkRhdGEpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglcCkgUmVsYXkhXG4iLCBUaGlzLCBEYXRhKTsKKworICAgIGlmKCFEYXRhKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfR2V0Vmlld3BvcnQoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEpOworICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OlNldE1hdGVyaWFsCisgKgorICogU2V0cyB0aGUgTWF0ZXJpYWwKKyAqCisgKiBWZXJzaW9uIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgTWF0OiBUaGUgbWF0ZXJpYWwgdG8gc2V0CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgTWF0IGlzIE5VTEwuCisgKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRNYXRlcmlhbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X1NldE1hdGVyaWFsKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMNyAqTWF0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheSFcbiIsIFRoaXMsIE1hdCk7CisKKyAgICBociA9IElXaW5lRDNERGV2aWNlX1NldE1hdGVyaWFsKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXQpOworICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkdldE1hdGVyaWFsCisgKgorICogUmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbAorICoKKyAqIFZlcnNpb24gNworICoKKyAqIFBhcmFtczoKKyAqICBNYXQ6IEQzRE1BVEVSSUFMNyBzdHJ1Y3R1cmUgdG8gd3JpdGUgdGhlIG1hdGVyaWFsIHBhcmFtdGVycyB0bworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIE1hdCBpcyBOVUxMCisgKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpHZXRNYXRlcmlhbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0dldE1hdGVyaWFsKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMNyAqTWF0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheSFcbiIsIFRoaXMsIE1hdCk7CisKKyAgICBociA9IElXaW5lRDNERGV2aWNlX0dldE1hdGVyaWFsKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXQpOworICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OlNldExpZ2h0CisgKgorICogQXNzaWducyBhIGxpZ2h0IHRvIGEgbGlnaHQgaW5kZXgsIGJ1dCBkb2Vzbid0IGFjdGl2YXRlIGl0IHlldC4KKyAqCisgKiBWZXJzaW9uIDcsIElEaXJlY3QzRExpZ2h0IHVzZXMgdGhpcyBtZXRob2QgZm9yIG9sZGVyIHZlcnNpb25zCisgKgorICogUGFyYW1zOgorICogIExpZ2h0SW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgbmV3IGxpZ2h0CisgKiAgTGlnaHQ6IEEgRDNETElHSFQ3IHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBsaWdodAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OlNldExpZ2h0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0TGlnaHQoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTGlnaHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVDcgKkxpZ2h0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIExpZ2h0SW5kZXgsIExpZ2h0KTsKKworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0TGlnaHQoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZ2h0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWdodCk7CisgICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChocik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6R2V0TGlnaHQKKyAqCisgKiBSZXR1cm5zIHRoZSBsaWdodCBhc3NpZ25lZCB0byBhIGxpZ2h0IGluZGV4CisgKgorICogUGFyYW1zOgorICogIExpZ2h0OiBTdHJ1Y3R1cmUgdG8gd3JpdGUgdGhlIGxpZ2h0IGluZm9ybWF0aW9uIHRvCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgTGlnaHQgaXMgTlVMTAorICogIEZvciBkZXRhaWxzLCBzZWUgSVdpbmVEM0REZXZpY2U6OkdldExpZ2h0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TGlnaHQoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTGlnaHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVDcgKkxpZ2h0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBIUkVTVUxUIHJjOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIExpZ2h0SW5kZXgsIExpZ2h0KTsKKworICAgIHJjID0gIElXaW5lRDNERGV2aWNlX0dldExpZ2h0KFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlnaHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWdodCk7CisKKyAgICAvKiBUcmFuc2xhdGUgdGhlIHJlc3VsdC4gV2luZUQzRCByZXR1cm5zIG90aGVyIHZhbHVlcyB0aGFuIEQzRDcgKi8KKyAgICByZXR1cm4gaHJfZGRyYXdfZnJvbV93aW5lZDNkKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpCZWdpblN0YXRlQmxvY2sKKyAqCisgKiBCZWdpbnMgcmVjb3JkaW5nIHRvIGEgc3RhdGVibG9jaworICoKKyAqIFZlcnNpb24gNworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBGb3IgZGV0YWlscyBzZWUgSVdpbmVEM0REZXZpY2U6OkJlZ2luU3RhdGVCbG9jaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0JlZ2luU3RhdGVCbG9jayhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCk6IFJlbGF5IVxuIiwgVGhpcyk7CisKKyAgICBociA9IElXaW5lRDNERGV2aWNlX0JlZ2luU3RhdGVCbG9jayhUaGlzLT53aW5lRDNERGV2aWNlKTsKKyAgICByZXR1cm4gaHJfZGRyYXdfZnJvbV93aW5lZDNkKGhyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpFbmRTdGF0ZUJsb2NrCisgKgorICogU3RvcHMgcmVjb3JkaW5nIHRvIGEgc3RhdGUgYmxvY2sgYW5kIHJldHVybnMgdGhlIGNyZWF0ZWQgc3RhdGVibG9jaworICogaGFuZGxlLiBUaGUgZDNkNyBzdGF0ZWJsb2NrIGhhbmRsZXMgYXJlIHRoZSBpbnRlcmZhY2UgcG9pbnRlcnMgb2YgdGhlCisgKiBJV2luZUQzRFN0YXRlQmxvY2sgaW50ZXJmYWNlCisgKgorICogVmVyc2lvbiA3CisgKgorICogUGFyYW1zOgorICogIEJsb2NrSGFuZGxlOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBzdGF0ZWJsb2NrJ3MgaGFuZGxlIHRvCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQmxvY2tIYW5kbGUgaXMgTlVMTAorICogIFNlZSBJV2luZUQzRERldmljZTo6RW5kU3RhdGVCbG9jayBmb3IgbW9yZSBkZXRhaWxzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfRW5kU3RhdGVCbG9jayhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpCbG9ja0hhbmRsZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXkhXG4iLCBUaGlzLCBCbG9ja0hhbmRsZSk7CisKKyAgICBpZighQmxvY2tIYW5kbGUpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaHIgPSBJV2luZUQzRERldmljZV9FbmRTdGF0ZUJsb2NrKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJV2luZUQzRFN0YXRlQmxvY2sgKiopIEJsb2NrSGFuZGxlKTsKKyAgICByZXR1cm4gaHJfZGRyYXdfZnJvbV93aW5lZDNkKGhyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpQcmVMb2FkCisgKgorICogQWxsb3dzIHRoZSBhcHAgdG8gc2lnbmFsIHRoYXQgYSB0ZXh0dXJlIHdpbGwgYmUgdXNlZCBzb29uLCB0byBhbGxvdworICogdGhlIERpcmVjdDNERGV2aWNlIHRvIGxvYWQgaXQgdG8gdGhlIHZpZGVvIGNhcmQgaW4gdGhlIG1lYW50aW1lLgorICoKKyAqIFZlcnNpb24gNworICoKKyAqIFBhcmFtczoKKyAqICBUZXh0dXJlOiBUaGUgdGV4dHVyZSB0byBwcmVsb2FkCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgVGV4dHVyZSBpcyBOVUxMCisgKiAgU2VlIElXaW5lRDNEU3VyZmFjZTo6UHJlTG9hZCBmb3IgZGV0YWlscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X1ByZUxvYWQoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpUZXh0dXJlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgVGV4dHVyZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXkhXG4iLCBUaGlzLCBzdXJmKTsKKworICAgIGlmKCFUZXh0dXJlKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIElXaW5lRDNEU3VyZmFjZV9QcmVMb2FkKHN1cmYtPldpbmVEM0RTdXJmYWNlKTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkFwcGx5U3RhdGVCbG9jaworICoKKyAqIEFjdGl2YXRlcyB0aGUgc3RhdGUgc3RvcmVkIGluIGEgc3RhdGUgYmxvY2sgaGFuZGxlLgorICoKKyAqIFBhcmFtczoKKyAqICBCbG9ja0hhbmRsZTogVGhlIHN0YXRlYmxvY2sgaGFuZGxlIHRvIGFjdGl2YXRlCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIEQzREVSUl9JTlZBTElEU1RBVEVCTE9DSyBpZiBCbG9ja0hhbmRsZSBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfQXBwbHlTdGF0ZUJsb2NrKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBCbG9ja0hhbmRsZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4KTogUmVsYXkhXG4iLCBUaGlzLCBCbG9ja0hhbmRsZSk7CisKKyAgICBpZighQmxvY2tIYW5kbGUpCisgICAgICAgIHJldHVybiBEM0RFUlJfSU5WQUxJRFNUQVRFQkxPQ0s7CisKKyAgICBociA9IElXaW5lRDNEU3RhdGVCbG9ja19BcHBseSgoSVdpbmVEM0RTdGF0ZUJsb2NrICopIEJsb2NrSGFuZGxlKTsKKyAgICByZXR1cm4gaHJfZGRyYXdfZnJvbV93aW5lZDNkKGhyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpDYXB0dXJlU3RhdGVCbG9jaworICoKKyAqIFVwZGF0ZXMgYSBzdGF0ZWJsb2NrJ3MgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgY3VycmVudGx5IHNldCBmb3IgdGhlIGRldmljZQorICoKKyAqIFZlcnNpb24gNworICoKKyAqIFBhcmFtczoKKyAqICBCbG9ja0hhbmRsZTogU3RhdGVibG9jayB0byB1cGRhdGUKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRDNERVJSX0lOVkFMSURTVEFURUJMT0NLIGlmIEJsb2NrSGFuZGxlIGlzIE5VTEwKKyAqICBTZWUgSVdpbmVEM0REZXZpY2U6OkNhcHR1cmVTdGF0ZUJsb2NrIGZvciBtb3JlIGRldGFpbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19DYXB0dXJlU3RhdGVCbG9jayhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBCbG9ja0hhbmRsZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4KTogUmVsYXkhXG4iLCBUaGlzLCBCbG9ja0hhbmRsZSk7CisKKyAgICBpZihCbG9ja0hhbmRsZSA9PSAwKQorICAgICAgICByZXR1cm4gRDNERVJSX0lOVkFMSURTVEFURUJMT0NLOworCisgICAgaHIgPSBJV2luZUQzRFN0YXRlQmxvY2tfQ2FwdHVyZSgoSVdpbmVEM0RTdGF0ZUJsb2NrICopIEJsb2NrSGFuZGxlKTsKKyAgICByZXR1cm4gaHJfZGRyYXdfZnJvbV93aW5lZDNkKGhyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpEZWxldGVTdGF0ZUJsb2NrCisgKgorICogRGVsZXRlcyBhIHN0YXRlYmxvY2sgaGFuZGxlLiBUaGlzIG1lYW5zIHJlbGVhc2luZyB0aGUgV2luZUQzRFN0YXRlQmxvY2sKKyAqCisgKiBWZXJzaW9uIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgQmxvY2tIYW5kbGU6IFN0YXRlYmxvY2sgaGFuZGxlIHRvIGRlbGV0ZQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEM0RFUlJfSU5WQUxJRFNUQVRFQkxPQ0sgaWYgQmxvY2tIYW5kbGUgaXMgMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0RlbGV0ZVN0YXRlQmxvY2soSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBCbG9ja0hhbmRsZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglMDhseCk6IFJlbGF5IVxuIiwgVGhpcywgQmxvY2tIYW5kbGUpOworCisgICAgaWYoQmxvY2tIYW5kbGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIEQzREVSUl9JTlZBTElEU1RBVEVCTE9DSzsKKworICAgIElXaW5lRDNEU3RhdGVCbG9ja19SZWxlYXNlKChJV2luZUQzRFN0YXRlQmxvY2sgKikgQmxvY2tIYW5kbGUpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpDcmVhdGVTdGF0ZUJsb2NrCisgKgorICogQ3JlYXRlcyBhIG5ldyBzdGF0ZSBibG9jayBoYW5kbGUuCisgKgorICogVmVyc2lvbiA3CisgKgorICogUGFyYW1zOgorICogIFR5cGU6IFRoZSBzdGF0ZSBibG9jayB0eXBlCisgKiAgQmxvY2tIYW5kbGU6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGNyZWF0ZWQgaGFuZGxlIHRvCisgKgorICogUmV0dXJuczoKKyAqICAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBCbG9ja0hhbmRsZSBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfQ3JlYXRlU3RhdGVCbG9jayhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFNUQVRFQkxPQ0tUWVBFIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqQmxvY2tIYW5kbGUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKSFcbiIsIFRoaXMsIFR5cGUsIEJsb2NrSGFuZGxlKTsKKworICAgIGlmKCFCbG9ja0hhbmRsZSkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAvKiBUaGUgRDNEU1RBVEVCTE9DS1RZUEUgZW51bSBpcyBmaW5lIGhlcmUgKi8KKyAgICBociA9IElXaW5lRDNERGV2aWNlX0NyZWF0ZVN0YXRlQmxvY2soVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElXaW5lRDNEU3RhdGVCbG9jayAqKikgQmxvY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogUGFyZW50LCBob3BlIHRoYXQgd29ya3MgKi8pOworICAgIHJldHVybiBocl9kZHJhd19mcm9tX3dpbmVkM2QoaHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkxvYWQKKyAqCisgKiBMb2FkcyBhbiByZWN0YW5ndWxhciBhcmVhIGZyb20gdGhlIHNvdXJjZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLgorICogSXQgY2FuIGFsc28gY29weSB0aGUgc291cmNlIHRvIHRoZSBmYWNlcyBvZiBhIGN1YmljIGVudmlyb25tZW50IG1hcAorICoKKyAqIFZlcnNpb24gNworICoKKyAqIFBhcmFtczoKKyAqICBEZXN0VGV4OiBEZXN0aW5hdGlvbiB0ZXh0dXJlCisgKiAgRGVzdFBvaW50OiBQb2ludCBpbiB0aGUgZGVzdGluYXRpb24gd2hlcmUgdGhlIHNvdXJjZSBpbWFnZSBzaG91bGQgYmUKKyAqICAgICAgICAgICAgIHdyaXR0ZW4gdG8KKyAqICBTcmNUZXg6IFNvdXJjZSB0ZXh0dXJlCisgKiAgU3JjUmVjdDogU291cmNlIHJlY3RhbmdsZQorICogIEZsYWdzOiBTb21lIGZsYWdzCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGVzdFRleCBvciBTcmNUZXggYXJlIE5VTEwKKyAqICBTZWUgSURpcmVjdDNEVGV4dHVyZTI6OkxvYWQgZm9yIGRldGFpbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRERldmljZUltcGxfN19Mb2FkKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqRGVzdFRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSU5UICpEZXN0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpTcmNUZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmRlc3QgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBEZXN0VGV4KTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzcmMgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBTcmNUZXgpOworICAgIEZJWE1FKCIoJXApLT4oJXAsJXAsJXAsJXAsJTA4bHgpOiBQYXJ0aWFsbHkgSW1wbGVtZW50ZWQhXG4iLCBUaGlzLCBkZXN0LCBEZXN0UG9pbnQsIHNyYywgU3JjUmVjdCwgRmxhZ3MpOworCisgICAgaWYoICghc3JjKSB8fCAoIWRlc3QpICkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBJRGlyZWN0M0RUZXh0dXJlMl9Mb2FkKElDT01fSU5URVJGQUNFKGRlc3QsIElEaXJlY3QzRFRleHR1cmUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKHNyYywgSURpcmVjdDNEVGV4dHVyZTIpKTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkxpZ2h0RW5hYmxlCisgKgorICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIGxpZ2h0CisgKgorICogVmVyc2lvbiA3LCBJRGlyZWN0M0RMaWdodCB1c2VzIHRoaXMgbWV0aG9kIHRvby4KKyAqCisgKiBQYXJhbXM6CisgKiAgTGlnaHRJbmRleDogVGhlIGluZGV4IG9mIHRoZSBsaWdodCB0byBlbmFibGUgLyBkaXNhYmxlCisgKiAgRW5hYmxlOiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgbGlnaHQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRMaWdodEVuYWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERGV2aWNlSW1wbF83X0xpZ2h0RW5hYmxlKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIExpZ2h0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBFbmFibGUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglMDhseCwlZCk6IFJlbGF5IVxuIiwgVGhpcywgTGlnaHRJbmRleCwgRW5hYmxlKTsKKworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfU2V0TGlnaHRFbmFibGUoVGhpcy0+d2luZUQzRERldmljZSwgTGlnaHRJbmRleCwgRW5hYmxlKTsKKyAgICByZXR1cm4gaHJfZGRyYXdfZnJvbV93aW5lZDNkKGhyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpHZXRMaWdodEVuYWJsZQorICoKKyAqIFJldHJpZXZlcyBpZiB0aGUgbGlnaHQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggaXMgZW5hYmxlcyBvciBub3QKKyAqCisgKiBWZXJzaW9uIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgTGlnaHRJbmRleDogSW5kZXggb2YgZGVzaXJlZCBsaWdodAorICogIEVuYWJsZTogUG9pbnRlciB0byBhIEJPT0wgd2hpY2ggY29udGFpbnMgdGhlIHJlc3VsdAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEVuYWJsZSBpcyBOVUxMCisgKiAgU2VlIElXaW5lRDNERGV2aWNlOjpHZXRMaWdodEVuYWJsZSBmb3IgbW9yZSBkZXRhaWxzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TGlnaHRFbmFibGUoSURpcmVjdDNERGV2aWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgTGlnaHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MKiBFbmFibGUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglMDhseCwlcCk6IFJlbGF5XG4iLCBUaGlzLCBMaWdodEluZGV4LCBFbmFibGUpOworCisgICAgaWYoIUVuYWJsZSkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBociA9IElXaW5lRDNERGV2aWNlX0dldExpZ2h0RW5hYmxlKFRoaXMtPndpbmVEM0REZXZpY2UsIExpZ2h0SW5kZXgsIEVuYWJsZSk7CisgICAgcmV0dXJuIGhyX2RkcmF3X2Zyb21fd2luZWQzZChocik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERGV2aWNlNzo6U2V0Q2xpcFBsYW5lCisgKgorICogU2V0cyBjdXN0b20gY2xpcHBpbmcgcGxhbmUKKyAqCisgKiBWZXJzaW9uIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgSW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgY2xpcHBpbmcgcGxhbmUKKyAqICBQbGFuZUVxdWF0aW9uOiBBbiBlcXVhdGlvbiBkZWZpbmluZyB0aGUgY2xpcHBpbmcgcGxhbmUKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBQbGFuZUVxdWF0aW9uIGlzIE5VTEwKKyAqICBTZWUgSVdpbmVEM0REZXZpY2U6OlNldENsaXBQbGFuZSBmb3IgbW9yZSBkZXRhaWxzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0Q2xpcFBsYW5lKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkFMVUUqIFBsYW5lRXF1YXRpb24pCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXApOiBSZWxheSFcbiIsIFRoaXMsIEluZGV4LCBQbGFuZUVxdWF0aW9uKTsKKworICAgIGlmKCFQbGFuZUVxdWF0aW9uKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIHJldHVybiBJV2luZUQzRERldmljZV9TZXRDbGlwUGxhbmUoVGhpcy0+d2luZUQzRERldmljZSwgSW5kZXgsIFBsYW5lRXF1YXRpb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRERldmljZTc6OkdldENsaXBQbGFuZQorICoKKyAqIFJldHVybnMgdGhlIGNsaXBwaW5nIHBsYW5lIHdpdGggYSBzcGVjaWZpYyBpbmRleAorICoKKyAqIFBhcmFtczoKKyAqICBJbmRleDogVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIHBsYW5lCisgKiAgUGxhbmVFcXVhdGlvbjogQWRkcmVzcyB0byBzdG9yZSB0aGUgcGxhbmUgZXF1YXRpb24gdG8KKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBQbGFuZUVxdWF0aW9uIGlzIE5VTEwKKyAqICBTZWUgSVdpbmVEM0REZXZpY2U6OkdldENsaXBQbGFuZSBmb3IgbW9yZSBkZXRhaWxzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Q2xpcFBsYW5lKElEaXJlY3QzRERldmljZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkFMVUUqIFBsYW5lRXF1YXRpb24pCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJWxkLCVwKTogUmVsYXkhXG4iLCBUaGlzLCBJbmRleCwgUGxhbmVFcXVhdGlvbik7CisKKyAgICBpZighUGxhbmVFcXVhdGlvbikKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICByZXR1cm4gSVdpbmVEM0REZXZpY2VfR2V0Q2xpcFBsYW5lKFRoaXMtPndpbmVEM0REZXZpY2UsIEluZGV4LCBQbGFuZUVxdWF0aW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0REZXZpY2U3OjpHZXRJbmZvCisgKgorICogUmV0cmlldmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZS4gVGhlIERpcmVjdFggc2RrIHNheXMgdGhhdAorICogdGhpcyB2ZXJzaW9uIHJldHVybmVzIFNfRkFMU0UgZm9yIGFsbCByZXRhaWwgYnVpbGQgb2YgRGlyZWN0WCwgdGhhdCdzCisgKiB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMuCisgKgorICogUGFyYW1zOgorICogIERldkluZm9JRDogSW5mb3JtYXRpb24gdHlwZSByZXF1ZXN0ZWQKKyAqICBEZXZJbmZvU3RydWN0OiBQb2ludGVyIHRvIGEgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBpbmZvIHRvCisgKiAgU2l6ZTogU2l6ZSBvZiB0aGUgc3RydWN0dXJlCisgKgorICogUmV0dXJuczoKKyAqICBTX0ZBTFNFLCBiZWNhdXNlIGl0J3MgYSBub24tZGVidWcgZHJpdmVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0SW5mbyhJRGlyZWN0M0REZXZpY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIERldkluZm9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRldkluZm9TdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTaXplKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwLCUwOGx4KVxuIiwgVGhpcywgRGV2SW5mb0lELCBEZXZJbmZvU3RydWN0LCBTaXplKTsKKworICAgIGlmIChUUkFDRV9PTihkM2Q3KSkKKyAgICB7CisgICAgICAgIFRSQUNFKCIgaW5mbyByZXF1ZXN0ZWQgOiAiKTsKKyAgICAgICAgc3dpdGNoIChEZXZJbmZvSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRDNEREVWSU5GT0lEX1RFWFRVUkVNQU5BR0VSOiBUUkFDRSgiRDNEREVWSU5GT0lEX1RFWFRVUkVNQU5BR0VSXG4iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEQzRERFVklORk9JRF9EM0RURVhUVVJFTUFOQUdFUjogVFJBQ0UoIkQzRERFVklORk9JRF9EM0RURVhUVVJFTUFOQUdFUlxuIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBEM0RERVZJTkZPSURfVEVYVFVSSU5HOiBUUkFDRSgiRDNEREVWSU5GT0lEX1RFWFRVUklOR1xuIik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogRVJSKCIgaW52YWxpZCBmbGFnICEhIVxuIik7IHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFNfRkFMU0U7IC8qIEFjY29yZGluZyB0byBNU0ROLCB0aGlzIGlzIHZhbGlkIGZvciBhIG5vbi1kZWJ1ZyBkcml2ZXIgKi8KK30KKworY29uc3QgSURpcmVjdDNERGV2aWNlN1Z0YmwgSURpcmVjdDNERGV2aWNlN19WdGJsID0KK3sKKyAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLworICAgIElEaXJlY3QzRERldmljZUltcGxfN19RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfQWRkUmVmLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19SZWxlYXNlLAorICAgIC8qKiogSURpcmVjdDNERGV2aWNlNyAqKiovCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENhcHMsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0VudW1UZXh0dXJlRm9ybWF0cywKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfQmVnaW5TY2VuZSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRW5kU2NlbmUsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldERpcmVjdDNELAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRSZW5kZXJUYXJnZXQsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFJlbmRlclRhcmdldCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfQ2xlYXIsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFRyYW5zZm9ybSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0VHJhbnNmb3JtLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRWaWV3cG9ydCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfTXVsdGlwbHlUcmFuc2Zvcm0sCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFZpZXdwb3J0LAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRNYXRlcmlhbCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TWF0ZXJpYWwsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1NldExpZ2h0LAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19HZXRMaWdodCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0UmVuZGVyU3RhdGUsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0dldFJlbmRlclN0YXRlLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19CZWdpblN0YXRlQmxvY2ssCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0VuZFN0YXRlQmxvY2ssCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1ByZUxvYWQsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdQcmltaXRpdmUsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdJbmRleGVkUHJpbWl0aXZlLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRDbGlwU3RhdHVzLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19HZXRDbGlwU3RhdHVzLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19EcmF3UHJpbWl0aXZlU3RyaWRlZCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfRHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19EcmF3UHJpbWl0aXZlVkIsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0RyYXdJbmRleGVkUHJpbWl0aXZlVkIsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5LAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19HZXRUZXh0dXJlLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19TZXRUZXh0dXJlLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19HZXRUZXh0dXJlU3RhZ2VTdGF0ZSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0VGV4dHVyZVN0YWdlU3RhdGUsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1ZhbGlkYXRlRGV2aWNlLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19BcHBseVN0YXRlQmxvY2ssCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X0NhcHR1cmVTdGF0ZUJsb2NrLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19EZWxldGVTdGF0ZUJsb2NrLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19DcmVhdGVTdGF0ZUJsb2NrLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19Mb2FkLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19MaWdodEVuYWJsZSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TGlnaHRFbmFibGUsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF83X1NldENsaXBQbGFuZSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Q2xpcFBsYW5lLAorICAgIElEaXJlY3QzRERldmljZUltcGxfN19HZXRJbmZvCit9OworCitjb25zdCBJRGlyZWN0M0REZXZpY2UzVnRibCBJRGlyZWN0M0REZXZpY2UzX1Z0YmwgPQoreworICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1F1ZXJ5SW50ZXJmYWNlLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19BZGRSZWYsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0M0REZXZpY2UzICoqKi8KKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0Q2FwcywKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0U3RhdHMsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF8zX0FkZFZpZXdwb3J0LAorICAgIElEaXJlY3QzRERldmljZUltcGxfM19EZWxldGVWaWV3cG9ydCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfTmV4dFZpZXdwb3J0LAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19FbnVtVGV4dHVyZUZvcm1hdHMsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0JlZ2luU2NlbmUsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0VuZFNjZW5lLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXREaXJlY3QzRCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0Q3VycmVudFZpZXdwb3J0LAorICAgIElEaXJlY3QzRERldmljZUltcGxfM19HZXRDdXJyZW50Vmlld3BvcnQsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFJlbmRlclRhcmdldCwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0UmVuZGVyVGFyZ2V0LAorICAgIElEaXJlY3QzRERldmljZUltcGxfM19CZWdpbiwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW5JbmRleGVkLAorICAgIElEaXJlY3QzRERldmljZUltcGxfM19WZXJ0ZXgsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF8zX0luZGV4LAorICAgIElEaXJlY3QzRERldmljZUltcGxfM19FbmQsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFJlbmRlclN0YXRlLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRSZW5kZXJTdGF0ZSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0TGlnaHRTdGF0ZSwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0TGlnaHRTdGF0ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0VHJhbnNmb3JtLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRUcmFuc2Zvcm0sCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX011bHRpcGx5VHJhbnNmb3JtLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3UHJpbWl0aXZlLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3SW5kZXhlZFByaW1pdGl2ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0Q2xpcFN0YXR1cywKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0Q2xpcFN0YXR1cywKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZVN0cmlkZWQsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZCwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZVZCLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3SW5kZXhlZFByaW1pdGl2ZVZCLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19Db21wdXRlU3BoZXJlVmlzaWJpbGl0eSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VGV4dHVyZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfU2V0VGV4dHVyZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VGV4dHVyZVN0YWdlU3RhdGUsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFRleHR1cmVTdGFnZVN0YXRlLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19WYWxpZGF0ZURldmljZQorfTsKKworY29uc3QgSURpcmVjdDNERGV2aWNlMlZ0YmwgSURpcmVjdDNERGV2aWNlMl9WdGJsID0KK3sKKyAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLworICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9RdWVyeUludGVyZmFjZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQWRkUmVmLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9SZWxlYXNlLAorICAgIC8qKiogSURpcmVjdDNERGV2aWNlMiAqKiovCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldENhcHMsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF8yX1N3YXBUZXh0dXJlSGFuZGxlcywKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0U3RhdHMsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0FkZFZpZXdwb3J0LAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EZWxldGVWaWV3cG9ydCwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfTmV4dFZpZXdwb3J0LAorICAgIElEaXJlY3QzRERldmljZUltcGxfMl9FbnVtVGV4dHVyZUZvcm1hdHMsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0JlZ2luU2NlbmUsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0VuZFNjZW5lLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXREaXJlY3QzRCwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0Q3VycmVudFZpZXdwb3J0LAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRDdXJyZW50Vmlld3BvcnQsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFJlbmRlclRhcmdldCwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0UmVuZGVyVGFyZ2V0LAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpbiwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQmVnaW5JbmRleGVkLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9WZXJ0ZXgsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0luZGV4LAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9FbmQsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclN0YXRlLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRSZW5kZXJTdGF0ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0TGlnaHRTdGF0ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0TGlnaHRTdGF0ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0VHJhbnNmb3JtLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRUcmFuc2Zvcm0sCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX011bHRpcGx5VHJhbnNmb3JtLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EcmF3UHJpbWl0aXZlLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EcmF3SW5kZXhlZFByaW1pdGl2ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0Q2xpcFN0YXR1cywKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0Q2xpcFN0YXR1cworfTsKKworY29uc3QgSURpcmVjdDNERGV2aWNlVnRibCBJRGlyZWN0M0REZXZpY2UxX1Z0YmwgPQoreworICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9BZGRSZWYsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0M0REZXZpY2UxICoqKi8KKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzFfSW5pdGlhbGl6ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0Q2FwcywKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfU3dhcFRleHR1cmVIYW5kbGVzLAorICAgIElEaXJlY3QzRERldmljZUltcGxfMV9DcmVhdGVFeGVjdXRlQnVmZmVyLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9HZXRTdGF0cywKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzFfRXhlY3V0ZSwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfQWRkVmlld3BvcnQsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0RlbGV0ZVZpZXdwb3J0LAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9OZXh0Vmlld3BvcnQsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF8xX1BpY2ssCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldFBpY2tSZWNvcmRzLAorICAgIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9FbnVtVGV4dHVyZUZvcm1hdHMsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF8xX0NyZWF0ZU1hdHJpeCwKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsXzFfU2V0TWF0cml4LAorICAgIElEaXJlY3QzRERldmljZUltcGxfMV9HZXRNYXRyaXgsCisgICAgSURpcmVjdDNERGV2aWNlSW1wbF8xX0RlbGV0ZU1hdHJpeCwKKyAgICBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfRW5kU2NlbmUsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0JlZ2luU2NlbmUsCisgICAgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldERpcmVjdDNECit9OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kZXZpY2VfbWFpbi5jIGIvZGxscy9kZHJhdy9kZXZpY2VfbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWVlNTFmLi4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZGV2aWNlX21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDIyNDEgKzAsMCBAQAotLyoKLSAqIERpcmVjdDNEIERldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA0IExpb25lbCBVbG1lcgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgQ2hyaXN0aWFuIENvc3RhCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgY29tbW9uIHN0dWZmIGZvciBEM0QgZGV2aWNlcy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIndpbmRlZi5oIgotI2luY2x1ZGUgIndpbmJhc2UuaCIKLSNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgIm9iamJhc2UuaCIKLSNpbmNsdWRlICJ3aW5nZGkuaCIKLSNpbmNsdWRlICJkZHJhdy5oIgotI2luY2x1ZGUgImQzZC5oIgotI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKLQotI2luY2x1ZGUgImQzZF9wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotRFdPUkQgSW5pdFJlbmRlclN0YXRlVGFiW10gPSB7Ci0gICAgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUhBTkRMRSwgICAgICAgICAgIChEV09SRClOVUxMLAotICAgIEQzRFJFTkRFUlNUQVRFX0FOVElBTElBUywgICAgICAgICAgICAgICBEM0RBTlRJQUxJQVNfTk9ORSwKLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1MgKi8KLSAgICBEM0RSRU5ERVJTVEFURV9URVhUVVJFUEVSU1BFQ1RJVkUsICAgICAgVFJVRSwKLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfV1JBUFUgKi8KLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfV1JBUFYgKi8KLSAgICBEM0RSRU5ERVJTVEFURV9aRU5BQkxFLCAgICAgICAgICAgICAgICAgRDNEWkJfVFJVRSwgLyogVGhpcyBuZWVkcyB0byBiZSBzZXQgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSBaIGJ1ZmZlciBzdGF0dXMgKi8KLSAgICBEM0RSRU5ERVJTVEFURV9GSUxMTU9ERSwgICAgICAgICAgICAgICAgRDNERklMTF9TT0xJRCwKLSAgICBEM0RSRU5ERVJTVEFURV9TSEFERU1PREUsICAgICAgICAgICAgICAgRDNEU0hBREVfR09VUkFVRCwKLSAgICBEM0RSRU5ERVJTVEFURV9MSU5FUEFUVEVSTiwgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9NT05PRU5BQkxFLCAgICAgICAgICAgICAgRkFMU0UsCi0gICAgRDNEUkVOREVSU1RBVEVfUk9QMiwgICAgICAgICAgICAgICAgICAgIFIyX0NPUFlQRU4sCi0gICAgRDNEUkVOREVSU1RBVEVfUExBTkVNQVNLLCAgICAgICAgICAgICAgIDB4RkZGRkZGRkYsCi0gICAgRDNEUkVOREVSU1RBVEVfWldSSVRFRU5BQkxFLCAgICAgICAgICAgIFRSVUUsCi0gICAgRDNEUkVOREVSU1RBVEVfQUxQSEFURVNURU5BQkxFLCAgICAgICAgIEZBTFNFLAotICAgIEQzRFJFTkRFUlNUQVRFX0xBU1RQSVhFTCwgICAgICAgICAgICAgICBUUlVFLAotICAgIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVNQUcsICAgICAgICAgICAgICBEM0RGSUxURVJfTkVBUkVTVCwKLSAgICBEM0RSRU5ERVJTVEFURV9URVhUVVJFTUlOLCAgICAgICAgICAgICAgRDNERklMVEVSX05FQVJFU1QsCi0gICAgRDNEUkVOREVSU1RBVEVfU1JDQkxFTkQsICAgICAgICAgICAgICAgIEQzREJMRU5EX09ORSwKLSAgICBEM0RSRU5ERVJTVEFURV9ERVNUQkxFTkQsICAgICAgICAgICAgICAgRDNEQkxFTkRfWkVSTywKLSAgICBEM0RSRU5ERVJTVEFURV9URVhUVVJFTUFQQkxFTkQsICAgICAgICAgRDNEVEJMRU5EX01PRFVMQVRFLAotICAgIEQzRFJFTkRFUlNUQVRFX0NVTExNT0RFLCAgICAgICAgICAgICAgICBEM0RDVUxMX0NDVywKLSAgICBEM0RSRU5ERVJTVEFURV9aRlVOQywgICAgICAgICAgICAgICAgICAgRDNEQ01QX0xFU1NFUVVBTCwKLSAgICBEM0RSRU5ERVJTVEFURV9BTFBIQVJFRiwgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9BTFBIQUZVTkMsICAgICAgICAgICAgICAgRDNEQ01QX0FMV0FZUywKLSAgICBEM0RSRU5ERVJTVEFURV9ESVRIRVJFTkFCTEUsICAgICAgICAgICAgRkFMU0UsCi0gICAgRDNEUkVOREVSU1RBVEVfQUxQSEFCTEVOREVOQUJMRSwgICAgICAgIEZBTFNFLAotICAgIEQzRFJFTkRFUlNUQVRFX0ZPR0VOQUJMRSwgICAgICAgICAgICAgICBGQUxTRSwKLSAgICBEM0RSRU5ERVJTVEFURV9TUEVDVUxBUkVOQUJMRSwgICAgICAgICAgRkFMU0UsCi0gICAgRDNEUkVOREVSU1RBVEVfWlZJU0lCTEUsICAgICAgICAgICAgICAgIEZBTFNFLAotICAgIEQzRFJFTkRFUlNUQVRFX1NVQlBJWEVMLCAgICAgICAgICAgICAgICBGQUxTRSwKLSAgICBEM0RSRU5ERVJTVEFURV9TVUJQSVhFTFgsICAgICAgICAgICAgICAgRkFMU0UsCi0gICAgRDNEUkVOREVSU1RBVEVfU1RJUFBMRURBTFBIQSwgICAgICAgICAgIEZBTFNFLAotICAgIEQzRFJFTkRFUlNUQVRFX0ZPR0NPTE9SLCAgICAgICAgICAgICAgICBEM0RSR0JBKDAsMCwwLDApLAotICAgIEQzRFJFTkRFUlNUQVRFX0ZPR1RBQkxFTU9ERSwgICAgICAgICAgICBEM0RGT0dfTk9ORSwKLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfRk9HVEFCTEVTVEFSVCAoc2FtZSBhcyBEM0RSRU5ERVJTVEFURV9GT0dTVEFSVCkgKi8KLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfRk9HVEFCTEVFTkQgKHNhbWUgYXMgRDNEUkVOREVSU1RBVEVfRk9HRU5EKSAqLwotICAgIEQzRFJFTkRFUlNUQVRFX0ZPR1RBQkxFREVOU0lUWSwgICAgICAgICAweDNGODAwMDAsIC8qIDEuMGYgKHNhbWUgYXMgRDNEUkVOREVSU1RBVEVfRk9HREVOU0lUWSkgKi8KLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfU1RJUFBMRUVOQUJMRSAqLwotICAgIEQzRFJFTkRFUlNUQVRFX0VER0VBTlRJQUxJQVMsICAgICAgICAgICBGQUxTRSwKLSAgICBEM0RSRU5ERVJTVEFURV9DT0xPUktFWUVOQUJMRSwgICAgICAgICAgRkFMU0UsCi0gICAgLyogRklYTUU6IEQzRFJFTkRFUlNUQVRFX0JPUkRFUkNPTE9SICovCi0gICAgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1NVLCAgICAgICAgIEQzRFRBRERSRVNTX1dSQVAsCi0gICAgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1NWLCAgICAgICAgIEQzRFRBRERSRVNTX1dSQVAsCi0gICAgRDNEUkVOREVSU1RBVEVfTUlQTUFQTE9EQklBUywgICAgICAgICAgIDB4MDAwMDAwMDAsIC8qIDAuMGYgKi8KLSAgICBEM0RSRU5ERVJTVEFURV9aQklBUywgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9SQU5HRUZPR0VOQUJMRSwgICAgICAgICAgRkFMU0UsICAgIAotICAgIC8qIEZJWE1FOiBEM0RSRU5ERVJTVEFURV9BTklTT1RST1BZICovCi0gICAgLyogRklYTUU6IEQzRFJFTkRFUlNUQVRFX0ZMVVNIQkFUQ0ggKi8KLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfVFJBTlNMVUNFTlRTT1JUSU5ERVBFTkRFTlQgKi8KLSAgICBEM0RSRU5ERVJTVEFURV9TVEVOQ0lMRU5BQkxFLCAgICAgICAgICAgRkFMU0UsCi0gICAgRDNEUkVOREVSU1RBVEVfU1RFTkNJTEZBSUwsICAgICAgICAgICAgIEQzRFNURU5DSUxPUF9LRUVQLAotICAgIEQzRFJFTkRFUlNUQVRFX1NURU5DSUxaRkFJTCwgICAgICAgICAgICBEM0RTVEVOQ0lMT1BfS0VFUCwKLSAgICBEM0RSRU5ERVJTVEFURV9TVEVOQ0lMUEFTUywgICAgICAgICAgICAgRDNEU1RFTkNJTE9QX0tFRVAsCi0gICAgRDNEUkVOREVSU1RBVEVfU1RFTkNJTEZVTkMsICAgICAgICAgICAgIEQzRENNUF9BTFdBWVMsCi0gICAgRDNEUkVOREVSU1RBVEVfU1RFTkNJTFJFRiwgICAgICAgICAgICAgIDAsCi0gICAgRDNEUkVOREVSU1RBVEVfU1RFTkNJTE1BU0ssICAgICAgICAgICAgIDB4RkZGRkZGRkYsCi0gICAgRDNEUkVOREVSU1RBVEVfU1RFTkNJTFdSSVRFTUFTSywgICAgICAgIDB4RkZGRkZGRkYsCi0gICAgLyogRklYTUU6IEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVGQUNUT1IgKi8KLSAgICAvKiBGSVhNRTogRDNEUkVOREVSU1RBVEVfU1RJUFBMRVBBVFRFUk4wMC4uMzEgKi8KLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQMCwgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQMSwgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQMiwgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQMywgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQNCwgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQNSwgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQNiwgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9XUkFQNywgICAgICAgICAgICAgICAgICAgMCwKLSAgICBEM0RSRU5ERVJTVEFURV9DTElQUElORywgICAgICAgICAgICAgICAgRkFMU0UsCi0gICAgRDNEUkVOREVSU1RBVEVfTElHSFRJTkcsICAgICAgICAgICAgICAgIFRSVUUsCi0gICAgRDNEUkVOREVSU1RBVEVfRVhURU5UUywgICAgICAgICAgICAgICAgIEZBTFNFLAotICAgIEQzRFJFTkRFUlNUQVRFX0FNQklFTlQsICAgICAgICAgICAgICAgICBEM0RSR0JBKDAsMCwwLDApLAotICAgIEQzRFJFTkRFUlNUQVRFX0ZPR1ZFUlRFWE1PREUsICAgICAgICAgICBEM0RGT0dfTk9ORSwKLSAgICBEM0RSRU5ERVJTVEFURV9DT0xPUlZFUlRFWCwgICAgICAgICAgICAgVFJVRSwKLSAgICBEM0RSRU5ERVJTVEFURV9MT0NBTFZJRVdFUiwgICAgICAgICAgICAgVFJVRSwKLSAgICBEM0RSRU5ERVJTVEFURV9OT1JNQUxJWkVOT1JNQUxTLCAgICAgICAgRkFMU0UsCi0gICAgLyogRklYTUU6IEQzRFJFTkRFUl9TVEFURV9DT0xPUktFWUJMRU5ERU5BQkxFICovCi0gICAgRDNEUkVOREVSU1RBVEVfRElGRlVTRU1BVEVSSUFMU09VUkNFLCAgIEQzRE1DU19DT0xPUjEsCi0gICAgRDNEUkVOREVSU1RBVEVfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSwgIEQzRE1DU19DT0xPUjIsCi0gICAgRDNEUkVOREVSU1RBVEVfQU1CSUVOVE1BVEVSSUFMU09VUkNFLCAgIEQzRE1DU19DT0xPUjIsCi0gICAgRDNEUkVOREVSU1RBVEVfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSwgIEQzRE1DU19NQVRFUklBTCwKLSAgICBEM0RSRU5ERVJTVEFURV9WRVJURVhCTEVORCwgICAgICAgICAgICAgRDNEVkJMRU5EX0RJU0FCTEUsCi0gICAgRDNEUkVOREVSU1RBVEVfQ0xJUFBMQU5FRU5BQkxFLCAgICAgICAgIDAKLX07Ci0KLURXT1JEIEluaXRMaWdodFN0YXRlVGFiW10gPSB7Ci0gICAgRDNETElHSFRTVEFURV9NQVRFUklBTCwgICAgICAgICAgIChEV09SRClOVUxMLAotICAgIEQzRExJR0hUU1RBVEVfQU1CSUVOVCwgICAgICAgICAgICBEM0RSR0JBKDAsMCwwLDApLAotICAgIEQzRExJR0hUU1RBVEVfQ09MT1JNT0RFTCwgICAgICAgICBEM0RDT0xPUl9SR0IsCi0gICAgRDNETElHSFRTVEFURV9GT0dNT0RFLCAgICAgICAgICAgIEQzREZPR19OT05FLAotICAgIEQzRExJR0hUU1RBVEVfRk9HU1RBUlQsICAgICAgICAgICAweDNGODAwMDAsIC8qIDEuMGYgKi8KLSAgICBEM0RMSUdIVFNUQVRFX0ZPR0VORCwgICAgICAgICAgICAgMHg0MkM4MDAwLCAvKiAxMDAuMGYgKi8KLSAgICBEM0RMSUdIVFNUQVRFX0ZPR0RFTlNJVFksICAgICAgICAgMHgzRjgwMDAwICAvKiAxLjBmICovCi0gICAgLyogRklYTUU6IEQzRExJR0hUU1RBVEVfQ09MT1JWRVJURVggKi8KLX07Ci0KLURXT1JEIEluaXRUZXh0dXJlU3RhZ2VTdGF0ZVRhYltdID0gewotICAgIEQzRFRTU19DT0xPUk9QLCAgICAgICAgICBEM0RUT1BfRElTQUJMRSwgLyogTm90ZSwgaXQncyBtYW51YWxseSBzZXQgZm9yIHN0YWdlIDAgKi8KLSAgICBEM0RUU1NfQ09MT1JBUkcxLCAgICAgICAgRDNEVEFfVEVYVFVSRSwKLSAgICBEM0RUU1NfQ09MT1JBUkcyLCAgICAgICAgRDNEVEFfQ1VSUkVOVCwKLSAgICBEM0RUU1NfQUxQSEFPUCwgICAgICAgICAgRDNEVE9QX0RJU0FCTEUsIC8qIE5vdGUsIGl0J3MgbWFudWFsbHkgc2V0IGZvciBzdGFnZSAwICovCi0gICAgRDNEVFNTX0FMUEhBQVJHMSwgICAgICAgIEQzRFRBX1RFWFRVUkUsCi0gICAgRDNEVFNTX0FMUEhBQVJHMiwgICAgICAgIEQzRFRBX0NVUlJFTlQsCi0gICAgLyogRklYTUU6IEQzRFRTU19CVU1QRU5WTUFUMDAsMDEsMTAsMTEgKi8KLSAgICAvKiBEM0RUU1NfVEVYQ09PUkRJTkRFWCBpcyBzZXQgbWFudWFsbHkgKi8KLSAgICBEM0RUU1NfQUREUkVTUywgICAgICAgICAgRDNEVEFERFJFU1NfV1JBUCwKLSAgICBEM0RUU1NfQUREUkVTU1UsICAgICAgICAgRDNEVEFERFJFU1NfV1JBUCwKLSAgICBEM0RUU1NfQUREUkVTU1YsICAgICAgICAgRDNEVEFERFJFU1NfV1JBUCwKLSAgICBEM0RUU1NfQk9SREVSQ09MT1IsICAgICAgMHgwMDAwMDAwMCwKLSAgICBEM0RUU1NfTUFHRklMVEVSLCAgICAgICAgRDNEVEZHX1BPSU5ULAotICAgIEQzRFRTU19NSU5GSUxURVIsICAgICAgICBEM0RURk5fUE9JTlQsCi0gICAgRDNEVFNTX01JUEZJTFRFUiwgICAgICAgIEQzRFRGUF9OT05FLAotICAgIEQzRFRTU19NSVBNQVBMT0RCSUFTLCAgICAweDAwMDAwMDAwLCAvKiAwLjBmICovCi0gICAgRDNEVFNTX01BWE1JUExFVkVMLCAgICAgIDAsCi0gICAgLyogRDNEVFNTX01BWEFOSVNPVFJPUFksICAgIDEsICovIC8qIFRoaXMgaXMgdG8gcHJldmVudCB3YXJuaW5ncyA6LSkgKi8KLSAgICAvKiBGSVhNRTogRDNEVFNTX0JVTVBFTlZMU0NBTEUgKi8KLSAgICAvKiBGSVhNRTogRDNEVFNTX05VTVBFTlZMT0ZGU0VUICovCi0gICAgLyogRklYTUU6IEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgKi8KLX07Ci0KLQkKLXZvaWQgSW5pdERlZmF1bHRTdGF0ZUJsb2NrKFNUQVRFQkxPQ0sqIGxwU3RhdGVCbG9jaywgaW50IHZlcnNpb24pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIGo7ICAKLSAgICBUUkFDRSgiKCVwLCVkKVxuIiwgbHBTdGF0ZUJsb2NrLCB2ZXJzaW9uKTsgICAgCi0gICAgbWVtc2V0KGxwU3RhdGVCbG9jaywgMCwgc2l6ZW9mKFNUQVRFQkxPQ0spKTsKLSAgICAKLSAgICAvKiBJbml0aWFsaXplIHJlbmRlciBzdGF0ZXMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKEluaXRSZW5kZXJTdGF0ZVRhYikgLyBzaXplb2YoSW5pdFJlbmRlclN0YXRlVGFiWzBdKTsgaSArPSAyKQotICAgIHsKLSAgICAgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbSW5pdFJlbmRlclN0YXRlVGFiW2ldIC0gMV0gPSBJbml0UmVuZGVyU3RhdGVUYWJbaSArIDFdOwotCWxwU3RhdGVCbG9jay0+c2V0X2ZsYWdzLnJlbmRlcl9zdGF0ZVtJbml0UmVuZGVyU3RhdGVUYWJbaV0gLSAxXSA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0ZXh0dXJlIHN0YWdlcyBzdGF0ZXMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RFWFRVUkVTOyBpKyspCi0gICAgewotICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YoSW5pdFRleHR1cmVTdGFnZVN0YXRlVGFiKSAvIHNpemVvZihJbml0VGV4dHVyZVN0YWdlU3RhdGVUYWJbMF0pOyBqICs9IDIpCi0gICAgICAgewotICAgICAgICAgICBscFN0YXRlQmxvY2stPnRleHR1cmVfc3RhZ2Vfc3RhdGVbaV1bSW5pdFRleHR1cmVTdGFnZVN0YXRlVGFiW2pdIC0gMV0gPSBJbml0VGV4dHVyZVN0YWdlU3RhdGVUYWJbaiArIDFdOwotICAgICAgICAgICBscFN0YXRlQmxvY2stPnNldF9mbGFncy50ZXh0dXJlX3N0YWdlX3N0YXRlW2ldW0luaXRUZXh0dXJlU3RhZ2VTdGF0ZVRhYltqXSAtIDFdID0gVFJVRTsKLSAgICAgICB9Ci0gICAgICAgLyogTWFwIHRleHR1cmUgY29vcmRzIDAgdG8gc3RhZ2UgMCwgMSB0byBzdGFnZSAxLCBldGMuLi4gKi8KLSAgICAgICBscFN0YXRlQmxvY2stPnRleHR1cmVfc3RhZ2Vfc3RhdGVbaV1bRDNEVFNTX1RFWENPT1JESU5ERVggLSAxXSA9IGk7Ci0gICAgICAgbHBTdGF0ZUJsb2NrLT5zZXRfZmxhZ3MudGV4dHVyZV9zdGFnZV9zdGF0ZVtpXVtEM0RUU1NfVEVYQ09PUkRJTkRFWCAtIDFdID0gVFJVRTsKLSAgICB9Ci0gICAgCi0gICAgLyogVGhlIGZpcnN0IHRleHR1cmUgaXMgcGFydGljdWxhciwgdXBkYXRlIGl0IGNvbnNlcXVlbnRseSAqLwotICAgIGxwU3RhdGVCbG9jay0+dGV4dHVyZV9zdGFnZV9zdGF0ZVswXVtEM0RUU1NfQ09MT1JPUCAtIDFdID0gRDNEVE9QX01PRFVMQVRFOwotICAgIGxwU3RhdGVCbG9jay0+dGV4dHVyZV9zdGFnZV9zdGF0ZVswXVtEM0RUU1NfQUxQSEFPUCAtIDFdID0gRDNEVE9QX1NFTEVDVEFSRzE7Ci0gICAgbHBTdGF0ZUJsb2NrLT50ZXh0dXJlX3N0YWdlX3N0YXRlWzBdW0QzRFRTU19DT0xPUkFSRzIgLSAxXSA9IEQzRFRBX0RJRkZVU0U7Ci0gICAgbHBTdGF0ZUJsb2NrLT50ZXh0dXJlX3N0YWdlX3N0YXRlWzBdW0QzRFRTU19BTFBIQUFSRzIgLSAxXSA9IEQzRFRBX0RJRkZVU0U7Ci0gICAgCi0gICAgLyogVXBkYXRlcyBmb3IgcGFydGljdWxhciB2ZXJzaW9ucyAqLwotICAgIGlmICgodmVyc2lvbiA9PSAxKSB8fCAodmVyc2lvbj09MikpCi0gICAgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1BFQ1VMQVJFTkFCTEUgLSAxXSA9IFRSVUU7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF8xVF9RdWVyeUludGVyZmFjZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXMsJXApXG4iLCBUaGlzLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKLQotICAgICpvYnAgPSBOVUxMOwotCi0gICAgLyogTm90ZTogV2UgY2Fubm90IGdldCBhbiBpbnRlcmZhY2Ugd2hvc2UgdmVyc2lvbiBpcyBoaWdoZXIgdGhhbiB0aGUKLSAgICAgKiAgICAgICBEaXJlY3QzRCBvYmplY3QgdGhhdCBjcmVhdGVkIHRoZSBkZXZpY2UgKi8KLQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sICByaWlkICkgKSB7Ci0gICAgICAgIElEaXJlY3QzRERldmljZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKLQkqb2JwID0gaWZhY2U7Ci0JVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9icCk7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNERGV2aWNlLCByaWlkICkgKSB7Ci0gICAgICAgIElEaXJlY3QzRERldmljZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKLSAgICAgICAgKm9icCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZSk7Ci0JVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNERGV2aWNlIGludGVyZmFjZSAlcFxuIiwgKm9icCk7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNERGV2aWNlMiwgcmlpZCApICYmIChUaGlzLT52ZXJzaW9uID49IDIpKSB7Ci0gICAgICAgIElEaXJlY3QzRERldmljZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpKTsKLSAgICAgICAgKm9icCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTIpOwotCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRERldmljZTIgaW50ZXJmYWNlICVwXG4iLCAqb2JwKTsKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0REZXZpY2UzLCByaWlkICkgJiYgKFRoaXMtPnZlcnNpb24gPj0gMykpIHsKLSAgICAgICAgSURpcmVjdDNERGV2aWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNykpOwotICAgICAgICAqb2JwID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlMyk7Ci0JVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRERldmljZTcsIHJpaWQgKSAmJiAoVGhpcy0+dmVyc2lvbiA+PSA3KSkgewotICAgICAgICBJRGlyZWN0M0REZXZpY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSk7Ci0gICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KTsKLQlUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZSAlcFxuIiwgKm9icCk7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXdTdXJmYWNlLCByaWlkICkgfHwKLSAgICAgICAgIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTIsIHJpaWQgKSB8fAotICAgICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXdTdXJmYWNlMywgcmlpZCApICkgewotICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLT5zdXJmYWNlLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Ci0gICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5zdXJmYWNlLCBJRGlyZWN0RHJhd1N1cmZhY2UzKTsKLQlUUkFDRSgiICBSZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlMyBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTQsIHJpaWQgKSB8fAotICAgICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXdTdXJmYWNlNywgcmlpZCApICkgewotICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLT5zdXJmYWNlLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Ci0gICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5zdXJmYWNlLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKLQlUUkFDRSgiICBSZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBGSVhNRSgiKCVwKTogaW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSk7Ci0gICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwotfQotCi1VTE9ORyBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX0FkZFJlZihMUERJUkVDVDNEREVWSUNFNyBpZmFjZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7Ci0KLSAgICBUUkFDRSgiKCVwLyVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgaWZhY2UsIHJlZiAtIDEpOwotCi0gICAgcmV0dXJuIHJlZjsKLX0KLQotVUxPTkcgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF8xVF9SZWxlYXNlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKLQotICAgIFRSQUNFKCIoJXAvJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBpZmFjZSwgcmVmICsgMSk7Ci0KLSAgICBpZiAoIXJlZikgewotICAgICAgICBpbnQgaTsKLQkvKiBSZWxlYXNlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RFWFRVUkVTOyBpKyspIHsKLQkgICAgaWYgKFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtpXSAhPSBOVUxMKQotCSAgICAgICAgSURpcmVjdDNEVGV4dHVyZTJfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLT5jdXJyZW50X3RleHR1cmVbaV0sIElEaXJlY3QzRFRleHR1cmUyKSk7Ci0JfQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnZlcnRleF9idWZmZXIpOwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcmVmOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Q2FwcyhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RERVZJQ0VERVNDNyBscEQzREhFTERldkRlc2MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwRDNESEVMRGV2RGVzYyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfRW51bVRleHR1cmVGb3JtYXRzKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGxwRDNERW51bVBpeGVsUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBBcmcpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwRDNERW51bVBpeGVsUHJvYywgbHBBcmcpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX0JlZ2luU2NlbmUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oKVxuIiwgVGhpcywgaWZhY2UpOwotICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF8xVF9FbmRTY2VuZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPigpXG4iLCBUaGlzLCBpZmFjZSk7Ci0gICAgLyogTm90aGluZyB0byBkbyAqLwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX0dldERpcmVjdDNEKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkJTFBESVJFQ1QzRDcqIGxwbHBEaXJlY3QzRDcpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBscERpcmVjdDNENyk7Ci0KLSAgICAqbHBscERpcmVjdDNENyA9IElDT01fSU5URVJGQUNFKFRoaXMtPmQzZCwgSURpcmVjdDNENyk7Ci0gICAgSURpcmVjdDNEN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZDNkLCBJRGlyZWN0M0Q3KSk7Ci0gICAgCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwXG4iLCAqbHBscERpcmVjdDNENyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfU2V0UmVuZGVyVGFyZ2V0KExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3IGxwTmV3UmVuZGVyVGFyZ2V0LAotCQkJCQkJIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRhcmdldF9pbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgbHBOZXdSZW5kZXJUYXJnZXQpOwotCi0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBscE5ld1JlbmRlclRhcmdldCwgZHdGbGFncyk7Ci0gICAgaWYgKHRhcmdldF9pbXBsICE9IFRoaXMtPnN1cmZhY2UpIHsKLSAgICAgICAgV0FSTigiIENoYW5nZSBvZiByZW5kZXJpbmcgdGFyZ2V0IG5vdCBoYW5kbGVkIHlldCAhXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfR2V0UmVuZGVyVGFyZ2V0KExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBscGxwUmVuZGVyVGFyZ2V0KQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwbHBSZW5kZXJUYXJnZXQpOwotCi0gICAgKmxwbHBSZW5kZXJUYXJnZXQgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5zdXJmYWNlLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLT5zdXJmYWNlLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Ci0gICAgCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgc3VyZmFjZSBhdCAlcC5cbiIsICpscGxwUmVuZGVyVGFyZ2V0KTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19DbGVhcihMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFJFQ1QgbHBSZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDT0xPUiBkd0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkFMVUUgZHZaLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTdGVuY2lsKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVwLCUwOGx4LCUwOGx4LCVmLCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGR3Q291bnQsIGxwUmVjdHMsIGR3RmxhZ3MsIChEV09SRCkgZHdDb2xvciwgZHZaLCBkd1N0ZW5jaWwpOwotICAgIHJldHVybiBUaGlzLT5jbGVhcihUaGlzLCBkd0NvdW50LCBscFJlY3RzLCBkd0ZsYWdzLCBkd0NvbG9yLCBkdlosIGR3U3RlbmNpbCk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9TZXRUcmFuc2Zvcm0oTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIERXT1JEIG1hdHJpeF9jaGFuZ2VkID0gMHgwMDAwMDAwMDsKLQotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4eCwlcClcbiIsIFRoaXMsIGlmYWNlLCBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLCBscEQzRE1hdHJpeCk7Ci0KLSAgICBzd2l0Y2ggKGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUpIHsKLSAgICAgICAgY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRDogewotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBUUkFDRSgiIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEIDpcbiIpOyBkdW1wX0QzRE1BVFJJWChscEQzRE1hdHJpeCk7Ci0JICAgIH0KLQkgICAgbWVtY3B5KFRoaXMtPndvcmxkX21hdCwgbHBEM0RNYXRyaXgsIDE2ICogc2l6ZW9mKGZsb2F0KSk7Ci0JICAgIG1hdHJpeF9jaGFuZ2VkID0gV09STERNQVRfQ0hBTkdFRDsKLQl9IGJyZWFrOwotCi0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9WSUVXOiB7Ci0JICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkgICAgICAgIFRSQUNFKCIgRDNEVFJBTlNGT1JNU1RBVEVfVklFVyA6XG4iKTsgIGR1bXBfRDNETUFUUklYKGxwRDNETWF0cml4KTsKLQkgICAgfQotCSAgICBtZW1jcHkoVGhpcy0+dmlld19tYXQsIGxwRDNETWF0cml4LCAxNiAqIHNpemVvZihmbG9hdCkpOwotCSAgICBtYXRyaXhfY2hhbmdlZCA9IFZJRVdNQVRfQ0hBTkdFRDsKLQl9IGJyZWFrOwotCi0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9QUk9KRUNUSU9OOiB7Ci0JICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkgICAgICAgIFRSQUNFKCIgRDNEVFJBTlNGT1JNU1RBVEVfUFJPSkVDVElPTiA6XG4iKTsgIGR1bXBfRDNETUFUUklYKGxwRDNETWF0cml4KTsKLQkgICAgfQotCSAgICBtZW1jcHkoVGhpcy0+cHJval9tYXQsIGxwRDNETWF0cml4LCAxNiAqIHNpemVvZihmbG9hdCkpOwotCSAgICBtYXRyaXhfY2hhbmdlZCA9IFBST0pNQVRfQ0hBTkdFRDsKLQl9IGJyZWFrOwotCi0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFMDoKLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkUxOgotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTI6Ci0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFMzoKLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkU0OgotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTU6Ci0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFNjoKLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkU3OiB7Ci0JICAgIERXT1JEIG1hdF9udW0gPSBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlIC0gRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTA7Ci0JICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkgICAgICAgIFRSQUNFKCIgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRSVsZCA6XG4iLCBtYXRfbnVtKTsgIGR1bXBfRDNETUFUUklYKGxwRDNETWF0cml4KTsKLQkgICAgfQotCSAgICBtZW1jcHkoVGhpcy0+dGV4X21hdFttYXRfbnVtXSwgbHBEM0RNYXRyaXgsIDE2ICogc2l6ZW9mKGZsb2F0KSk7Ci0JICAgIG1hdHJpeF9jaGFuZ2VkID0gVEVYTUFUMF9DSEFOR0VEIDw8IG1hdF9udW07Ci0JfSBicmVhazsKLQkgIAotCWRlZmF1bHQ6Ci0JICAgIEVSUigiVW5rbm93biB0cmFuc2Zvcm0gdHlwZSAlMDh4ICEhIVxuIiwgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSk7Ci0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtYXRyaXhfY2hhbmdlZCAhPSAweDAwMDAwMDAwKSBUaGlzLT5tYXRyaWNlc191cGRhdGVkKFRoaXMsIG1hdHJpeF9jaGFuZ2VkKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX0dldFRyYW5zZm9ybShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglMDh4LCVwKVxuIiwgVGhpcywgaWZhY2UsIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsIGxwRDNETWF0cml4KTsKLQotICAgIHN3aXRjaCAoZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSkgewotICAgICAgICBjYXNlIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxEOiB7Ci0JICAgIG1lbWNweShscEQzRE1hdHJpeCwgVGhpcy0+d29ybGRfbWF0LCAxNiAqIHNpemVvZihEM0RWQUxVRSkpOwotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBUUkFDRSgiIHJldHVybmluZyBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCA6XG4iKTsKLQkJZHVtcF9EM0RNQVRSSVgobHBEM0RNYXRyaXgpOwotCSAgICB9Ci0JfSBicmVhazsKLQotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVklFVzogewotCSAgICBtZW1jcHkobHBEM0RNYXRyaXgsIFRoaXMtPnZpZXdfbWF0LCAxNiAqIHNpemVvZihEM0RWQUxVRSkpOwotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBUUkFDRSgiIHJldHVybmluZyBEM0RUUkFOU0ZPUk1TVEFURV9WSUVXIDpcbiIpOwotCQlkdW1wX0QzRE1BVFJJWChscEQzRE1hdHJpeCk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCi0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9QUk9KRUNUSU9OOiB7Ci0JICAgIG1lbWNweShscEQzRE1hdHJpeCwgVGhpcy0+cHJval9tYXQsIDE2ICogc2l6ZW9mKEQzRFZBTFVFKSk7Ci0JICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkgICAgICAgIFRSQUNFKCIgcmV0dXJuaW5nIEQzRFRSQU5TRk9STVNUQVRFX1BST0pFQ1RJT04gOlxuIik7Ci0JCWR1bXBfRDNETUFUUklYKGxwRDNETWF0cml4KTsKLQkgICAgfQotCX0gYnJlYWs7Ci0KLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkUwOgotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTE6Ci0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFMjoKLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkUzOgotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTQ6Ci0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFNToKLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkU2OgotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTc6IHsKLQkgICAgRFdPUkQgbWF0X251bSA9IGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUgLSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFMDsKLQkgICAgbWVtY3B5KGxwRDNETWF0cml4LCBUaGlzLT50ZXhfbWF0W21hdF9udW1dLCAxNiAqIHNpemVvZihEM0RWQUxVRSkpOwotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBUUkFDRSgiIHJldHVybmluZyBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFJWxkIDpcbiIsIG1hdF9udW0pOwotCQlkdW1wX0QzRE1BVFJJWChscEQzRE1hdHJpeCk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCSAgCi0JZGVmYXVsdDoKLQkgICAgRVJSKCJVbmtub3duIHRyYW5zZm9ybSB0eXBlICUwOHggISEhXG4iLCBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlKTsKLQkgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfTXVsdGlwbHlUcmFuc2Zvcm0oTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYIGxwRDNETWF0cml4KQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBMUEQzRE1BVFJJWCBtYXQ7Ci0gICAgRFdPUkQgbWF0cml4X2NoYW5nZWQgPSAweDAwMDAwMDAwOwotCi0gICAgVFJBQ0UoIiglcC8lcCktPiglMDh4LCVwKVxuIiwgVGhpcywgaWZhY2UsIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsIGxwRDNETWF0cml4KTsKLSAgICAKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCIgTXVsdGlwbHlpbmcgYnkgOlxuIik7IGR1bXBfRDNETUFUUklYKGxwRDNETWF0cml4KTsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChkdHN0VHJhbnNmb3JtU3RhdGVUeXBlKSB7Ci0gICAgICAgIGNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfV09STEQ6IHsKLQkgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCSAgICAgICAgVFJBQ0UoIiBSZXN1bHRpbmcgRDNEVFJBTlNGT1JNU1RBVEVfV09STEQgbWF0cml4IGlzIDpcbiIpOwotCSAgICB9Ci0JICAgIG1hdCA9IFRoaXMtPndvcmxkX21hdDsKLQkgICAgbWF0cml4X2NoYW5nZWQgPSBXT1JMRE1BVF9DSEFOR0VEOwotCX0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9WSUVXOiB7Ci0JICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkgICAgICAgIFRSQUNFKCIgUmVzdWx0aW5nIEQzRFRSQU5TRk9STVNUQVRFX1ZJRVcgbWF0cml4IGlzIDpcbiIpOwotCSAgICB9Ci0JICAgIG1hdCA9IFRoaXMtPnZpZXdfbWF0OwotCSAgICBtYXRyaXhfY2hhbmdlZCA9IFZJRVdNQVRfQ0hBTkdFRDsKLQl9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfUFJPSkVDVElPTjogewotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBUUkFDRSgiIFJlc3VsdGluZyBEM0RUUkFOU0ZPUk1TVEFURV9QUk9KRUNUSU9OIG1hdHJpeCBpcyA6XG4iKTsKLQkgICAgfQotCSAgICBtYXQgPSBUaGlzLT5wcm9qX21hdDsKLQkgICAgbWF0cml4X2NoYW5nZWQgPSBQUk9KTUFUX0NIQU5HRUQ7Ci0JfSBicmVhazsKLQotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTA6Ci0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFMToKLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkUyOgotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTM6Ci0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFNDoKLQljYXNlIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkU1OgotCWNhc2UgRDNEVFJBTlNGT1JNU1RBVEVfVEVYVFVSRTY6Ci0JY2FzZSBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFNzogewotCSAgICBEV09SRCBtYXRfbnVtID0gZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSAtIEQzRFRSQU5TRk9STVNUQVRFX1RFWFRVUkUwOwotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBUUkFDRSgiIFJlc3VsdGluZyBEM0RUUkFOU0ZPUk1TVEFURV9URVhUVVJFJWxkIG1hdHJpeCBpcyA6XG4iLCBtYXRfbnVtKTsKLQkgICAgfQotCSAgICBtYXQgPSBUaGlzLT50ZXhfbWF0W21hdF9udW1dOwotCSAgICBtYXRyaXhfY2hhbmdlZCA9IFRFWE1BVDBfQ0hBTkdFRCA8PCBtYXRfbnVtOwotCX0gYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICBFUlIoIlVua25vd24gdHJhbnNmb3JtIHR5cGUgJTA4eCAhISFcbiIsIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUpOwotCSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLSAgICB9Ci0KLSAgICBtdWx0aXBseV9tYXRyaXgobWF0LG1hdCxscEQzRE1hdHJpeCk7Ci0gICAgCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBkdW1wX0QzRE1BVFJJWChtYXQpOwotICAgIH0KLSAgICAKLSAgICBpZiAobWF0cml4X2NoYW5nZWQgIT0gMHgwMDAwMDAwMCkgVGhpcy0+bWF0cmljZXNfdXBkYXRlZChUaGlzLCBtYXRyaXhfY2hhbmdlZCk7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Vmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFZJRVdQT1JUNyBscERhdGEpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBEYXRhKTsKLQotICAgICpscERhdGEgPSBUaGlzLT5hY3RpdmVfdmlld3BvcnQ7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCIgcmV0dXJuaW5nIHZpZXdwb3J0IDpcbiIpOwotCVRSQUNFKCIgICAgLSBkd1ggPSAlbGQgICBkd1kgPSAlbGRcbiIsCi0JICAgICAgbHBEYXRhLT5kd1gsIGxwRGF0YS0+ZHdZKTsKLQlUUkFDRSgiICAgIC0gZHdXaWR0aCA9ICVsZCAgIGR3SGVpZ2h0ID0gJWxkXG4iLAotCSAgICAgIGxwRGF0YS0+ZHdXaWR0aCwgbHBEYXRhLT5kd0hlaWdodCk7Ci0JVFJBQ0UoIiAgICAtIGR2TWluWiA9ICVmICAgZHZNYXhaID0gJWZcbiIsCi0JICAgICAgbHBEYXRhLT5kdk1pblosIGxwRGF0YS0+ZHZNYXhaKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19TZXRNYXRlcmlhbChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUw3IGxwTWF0KQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscE1hdCk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TWF0ZXJpYWwoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMNyBscE1hdCkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscE1hdCk7Ci0gICAgCi0gICAgKmxwTWF0ID0gVGhpcy0+Y3VycmVudF9tYXRlcmlhbDsKLQotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiByZXR1cm5pbmcgbWF0ZXJpYWwgOlxuIik7Ci0JZHVtcF9EM0RNQVRFUklBTDcobHBNYXQpOwotICAgIH0KLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X1NldExpZ2h0KExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdMaWdodEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RMSUdIVDcgbHBMaWdodCkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDhseCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZHdMaWdodEluZGV4LCBscExpZ2h0KTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19HZXRMaWdodChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TGlnaHRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETElHSFQ3IGxwTGlnaHQpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4bHgsJXApXG4iLCBUaGlzLCBpZmFjZSwgZHdMaWdodEluZGV4LCBscExpZ2h0KTsKLQotICAgIGlmIChkd0xpZ2h0SW5kZXggPj0gVGhpcy0+bnVtX3NldF9saWdodHMpCi0gICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCi0gICAgKmxwTGlnaHQgPSBUaGlzLT5saWdodF9wYXJhbWV0ZXJzW2R3TGlnaHRJbmRleF07Ci0KLSAgICAvKiBJZiBkbHRUeXBlIGlzIHplcm8sIHRoZW4gdGhpcyBsaWdodCBoYXMgbmV2ZXIgYmVlbiBzZXQsIGVpdGhlcgotICAgICAgIGJ5IGNhbGxpbmcgU2V0TGlnaHQgb3IgaW1wbGljaXRlbHkgYnkgY2FsbGluZyBFbmFibGVMaWdodCB3aXRob3V0Ci0gICAgICAgY2FsbGluZyBTZXRMaWdodCBmaXJzdC4gKi8KLSAgICBpZiAobHBMaWdodC0+ZGx0VHlwZSA9PSAwKQotICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiByZXR1cm5pbmcgbGlnaHQgOlxuIik7Ci0JZHVtcF9EM0RMSUdIVDcobHBMaWdodCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfU2V0UmVuZGVyU3RhdGUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgZHdSZW5kZXJTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1JlbmRlclN0YXRlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwOHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGR3UmVuZGVyU3RhdGVUeXBlLCBkd1JlbmRlclN0YXRlKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9HZXRSZW5kZXJTdGF0ZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd1JlbmRlclN0YXRlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwOHgsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGR3UmVuZGVyU3RhdGVUeXBlLCBscGR3UmVuZGVyU3RhdGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0JlZ2luU3RhdGVCbG9jayhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPigpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0VuZFN0YXRlQmxvY2soTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd0Jsb2NrSGFuZGxlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscGR3QmxvY2tIYW5kbGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X1ByZUxvYWQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IGxwZGRzVGV4dHVyZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBkZHNUZXh0dXJlKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3UHJpbWl0aXZlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHB2VmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZDNkcHRQcmltaXRpdmVUeXBlLCBkM2R2dFZlcnRleFR5cGUsIGxwdlZlcnRpY2VzLCBkd1ZlcnRleENvdW50LCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3SW5kZXhlZFByaW1pdGl2ZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBkd0luZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luZGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwOHgsJTA4bHgsJXAsJTA4bHgsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgZHdWZXJ0ZXhDb3VudCwgZHdJbmRpY2VzLCBkd0luZGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX1NldENsaXBTdGF0dXMoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEQ0xJUFNUQVRVUyBscEQzRENsaXBTdGF0dXMpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwRDNEQ2xpcFN0YXR1cyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfR2V0Q2xpcFN0YXR1cyhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RDTElQU1RBVFVTIGxwRDNEQ2xpcFN0YXR1cykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBEM0RDbGlwU3RhdHVzKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3UHJpbWl0aXZlU3RyaWRlZChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGR3VmVydGV4VHlwZSwgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsIGR3VmVydGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgbHBJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luZGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCVwLCUwOGx4LCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGR3VmVydGV4VHlwZSwgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsIGR3VmVydGV4Q291bnQsIGxwSW5kZXgsIGR3SW5kZXhDb3VudCwgZHdGbGFncyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfRHJhd1ByaW1pdGl2ZVZCKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkJICAgICAgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcgbHBEM0RWZXJ0ZXhCdWYsCi0JCQkJCSAgICAgIERXT1JEIGR3U3RhcnRWZXJ0ZXgsCi0JCQkJCSAgICAgIERXT1JEIGR3TnVtVmVydGljZXMsCi0JCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4eCwlcCwlMDhseCwlMDhseCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZDNkcHRQcmltaXRpdmVUeXBlLCBscEQzRFZlcnRleEJ1ZiwgZHdTdGFydFZlcnRleCwgZHdOdW1WZXJ0aWNlcywgZHdGbGFncyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfRHJhd0luZGV4ZWRQcmltaXRpdmVWQihMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkJCSAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0JCQkJCQkgICAgIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwRDNEVmVydGV4QnVmLAotCQkJCQkJICAgICBEV09SRCBkd1N0YXJ0VmVydGV4LAotCQkJCQkJICAgICBEV09SRCBkd051bVZlcnRpY2VzLAotCQkJCQkJICAgICBMUFdPUkQgbHB3SW5kaWNlcywKLQkJCQkJCSAgICAgRFdPUkQgZHdJbmRleENvdW50LAotCQkJCQkJICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwOHgsJXAsJTA4bHgsJTA4bHgsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgbHBEM0RWZXJ0ZXhCdWYsIGR3U3RhcnRWZXJ0ZXgsIGR3TnVtVmVydGljZXMsIGxwd0luZGljZXMsIGR3SW5kZXhDb3VudCwgZHdGbGFncyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfQ29tcHV0ZVNwaGVyZVZpc2liaWxpdHkoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFZFQ1RPUiBscENlbnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFZBTFVFIGxwUmFkaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd051bVNwaGVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3UmV0dXJuVmFsdWVzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwLCVwLCUwOGx4LCUwOGx4LCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscENlbnRlcnMsIGxwUmFkaWksIGR3TnVtU3BoZXJlcywgZHdGbGFncywgbHBkd1JldHVyblZhbHVlcyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfR2V0VGV4dHVyZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkJIERXT1JEIGR3U3RhZ2UsCi0JCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyogbHBUZXh0dXJlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVwKVxuIiwgVGhpcywgaWZhY2UsIGR3U3RhZ2UsIGxwVGV4dHVyZSk7Ci0KLSAgICBpZiAoVGhpcy0+Y3VycmVudF90ZXh0dXJlW2R3U3RhZ2VdICE9IE5VTEwpIHsKLSAgICAgICAgKmxwVGV4dHVyZSA9IElDT01fSU5URVJGQUNFKFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtkd1N0YWdlXSwgSURpcmVjdERyYXdTdXJmYWNlNyk7Ci0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKCpscFRleHR1cmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpscFRleHR1cmUgPSBOVUxMOwotICAgIH0KLQotICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSBhdCAlcCAoZm9yIGltcGxlbWVudGF0aW9uIGF0ICVwKS5cbiIsICpscFRleHR1cmUsIFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtkd1N0YWdlXSk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9TZXRUZXh0dXJlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkgRFdPUkQgZHdTdGFnZSwKLQkJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3IGxwVGV4dHVyZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDhseCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZHdTdGFnZSwgbHBUZXh0dXJlKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9HZXRUZXh0dXJlU3RhZ2VTdGF0ZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3U3RhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdTdGF0ZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglMDhseCwlMDh4LCVwKVxuIiwgVGhpcywgaWZhY2UsIGR3U3RhZ2UsIGQzZFRleFN0YWdlU3RhdGVUeXBlLCBscGR3U3RhdGUpOwotICAgIGlmIChscGR3U3RhdGUgJiYgKGR3U3RhZ2UgPCA4KSAmJiBkM2RUZXhTdGFnZVN0YXRlVHlwZSAmJiAoZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgPD0gSElHSEVTVF9URVhUVVJFX1NUQUdFX1NUQVRFKSApIHsKLSAgICAgICAgKmxwZHdTdGF0ZSA9IFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbZHdTdGFnZV1bZDNkVGV4U3RhZ2VTdGF0ZVR5cGUtMV07Ci0JcmV0dXJuIEREX09LOwotICAgIH0KLSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX1NldFRleHR1cmVTdGFnZVN0YXRlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBkM2RUZXhTdGFnZVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3U3RhdGUpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4bHgsJTA4eCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZHdTdGFnZSwgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUsIGR3U3RhdGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX1ZhbGlkYXRlRGV2aWNlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3UGFzc2VzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwKTogc2VtaS1zdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwZHdQYXNzZXMpOwotCi0gICAgLyogRm9yIHRoZSBtb21lbnQsIHdlIGhhdmUgYSBWRVJZIGdvb2QgaGFyZHdhcmUgd2hpY2ggZG9lcyBldmVyeXRoaW5nIGluIG9uZSBwYXNzIDotKSAqLwotICAgICpscGR3UGFzc2VzID0gMTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0FwcGx5U3RhdGVCbG9jayhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0Jsb2NrSGFuZGxlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkd0Jsb2NrSGFuZGxlKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfN19DYXB0dXJlU3RhdGVCbG9jayhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3QmxvY2tIYW5kbGUpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGR3QmxvY2tIYW5kbGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0RlbGV0ZVN0YXRlQmxvY2soTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3QmxvY2tIYW5kbGUpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGR3QmxvY2tIYW5kbGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0NyZWF0ZVN0YXRlQmxvY2soTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFNUQVRFQkxPQ0tUWVBFIGQzZHNiVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3QmxvY2tIYW5kbGUpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4eCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZDNkc2JUeXBlLCBscGR3QmxvY2tIYW5kbGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0xvYWQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IGxwRGVzdFRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQT0lOVCBscERlc3RQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgbHBTcmNUZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUkVDVCBscHJjU3JjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCwlcCwlcCwlMDhseCk6IFBhcnRpYWxseSBJbXBsZW1lbnRlZCFcbiIsIFRoaXMsIGlmYWNlLCBscERlc3RUZXgsIGxwRGVzdFBvaW50LCBscFNyY1RleCwgbHByY1NyY1JlY3QsIGR3RmxhZ3MpOwotICAgIElEaXJlY3QzRFRleHR1cmUyX0xvYWQoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIElEaXJlY3QzRFRleHR1cmUyLCBscERlc3RUZXgpLAotCQkJICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIElEaXJlY3QzRFRleHR1cmUyLCBscFNyY1RleCkpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0xpZ2h0RW5hYmxlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdMaWdodEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBiRW5hYmxlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwOGx4LCVkKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkd0xpZ2h0SW5kZXgsIGJFbmFibGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0dldExpZ2h0RW5hYmxlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdMaWdodEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCogcGJFbmFibGUpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglMDhseCwlcClcbiIsIFRoaXMsIGlmYWNlLCBkd0xpZ2h0SW5kZXgsIHBiRW5hYmxlKTsKLQotICAgICpwYkVuYWJsZSA9IDA7Ci0gICAgaWYgKGR3TGlnaHRJbmRleCA+PSBUaGlzLT5udW1fc2V0X2xpZ2h0cykKLSAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICAvKiBJZiBkbHRUeXBlIGlzIHplcm8sIHRoZW4gdGhpcyBsaWdodCBoYXMgbmV2ZXIgYmVlbiBzZXQsIGVpdGhlcgotICAgICAgIGJ5IGNhbGxpbmcgU2V0TGlnaHQgb3IgaW1wbGljaXRlbHkgYnkgY2FsbGluZyBFbmFibGVMaWdodCB3aXRob3V0Ci0gICAgICAgY2FsbGluZyBTZXRMaWdodCBmaXJzdC4gKi8KLSAgICBpZiAoVGhpcy0+bGlnaHRfcGFyYW1ldGVyc1tkd0xpZ2h0SW5kZXhdLmRsdFR5cGUgPT0gMCkKLSAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgVGhpcy0+bWF4X2FjdGl2ZV9saWdodHM7IGkrKykKLSAgICAgICAgaWYgKFRoaXMtPmFjdGl2ZV9saWdodHNbaV0gPT0gZHdMaWdodEluZGV4KQotICAgICAgICAgICAgKnBiRW5hYmxlID0gVFJVRTsKLQotICAgIFRSQUNFKCIgcmV0dXJuaW5nICVkLlxuIiwgKnBiRW5hYmxlKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X1NldENsaXBQbGFuZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZBTFVFKiBwUGxhbmVFcXVhdGlvbikKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDhseCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZHdJbmRleCwgcFBsYW5lRXF1YXRpb24pOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCAgV0lOQVBJICAKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0dldENsaXBQbGFuZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwgRFdPUkQgZHdJbmRleCwgRDNEVkFMVUUqIHBQbGFuZUVxdWF0aW9uKQotewotICAgIElEaXJlY3QzRERldmljZUltcGwgKlRoaXMgPSAoSURpcmVjdDNERGV2aWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglbGQsJXApXG4iLCBUaGlzLCBkd0luZGV4LCBwUGxhbmVFcXVhdGlvbik7Ci0KLSAgICBpZiAoZHdJbmRleD49VGhpcy0+bWF4X2NsaXBwaW5nX3BsYW5lcykgewotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgIH0KLQotICAgIG1lbWNweSggcFBsYW5lRXF1YXRpb24sIFRoaXMtPmNsaXBwaW5nX3BsYW5lc1tkd0luZGV4XS5wbGFuZSwgc2l6ZW9mKEQzRFZBTFVFWzRdKSk7Ci0KLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0SW5mbyhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEZXZJbmZvSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBwRGV2SW5mb1N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTaXplKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVwLCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGR3RGV2SW5mb0lELCBwRGV2SW5mb1N0cnVjdCwgZHdTaXplKTsKLQotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiBpbmZvIHJlcXVlc3RlZCA6ICIpOwotCXN3aXRjaCAoZHdEZXZJbmZvSUQpIHsKLQkgICAgY2FzZSBEM0RERVZJTkZPSURfVEVYVFVSRU1BTkFHRVI6IFRSQUNFKCJEM0RERVZJTkZPSURfVEVYVFVSRU1BTkFHRVJcbiIpOyBicmVhazsKLQkgICAgY2FzZSBEM0RERVZJTkZPSURfRDNEVEVYVFVSRU1BTkFHRVI6IFRSQUNFKCJEM0RERVZJTkZPSURfRDNEVEVYVFVSRU1BTkFHRVJcbiIpOyBicmVhazsKLQkgICAgY2FzZSBEM0RERVZJTkZPSURfVEVYVFVSSU5HOiBUUkFDRSgiRDNEREVWSU5GT0lEX1RFWFRVUklOR1xuIik7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBFUlIoIiBpbnZhbGlkIGZsYWcgISEhXG4iKTsgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBTX0ZBTFNFOyAvKiBBY2NvcmRpbmcgdG8gTVNETiwgdGhpcyBpcyB2YWxpZCBmb3IgYSBub24tZGVidWcgZHJpdmVyICovCi19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF8xVF9HZXRDYXBzKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0RIV0RldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEREVWSUNFREVTQyBscEQzREhFTERldkRlc2MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwRDNESFdEZXZEZXNjLCBscEQzREhFTERldkRlc2MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUXzFUX0dldFN0YXRzKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RTVEFUUyBscEQzRFN0YXRzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscEQzRFN0YXRzKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF8xVF9BZGRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLQkJCQkJICAgICBMUERJUkVDVDNEVklFV1BPUlQzIGxwRGlyZWN0M0RWaWV3cG9ydDMpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwotICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqbHBEaXJlY3QzRFZpZXdwb3J0SW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBscERpcmVjdDNEVmlld3BvcnQzKTsKLSAgICAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCi0gICAgbHBEaXJlY3QzRFZpZXdwb3J0SW1wbC0+bmV4dCA9IFRoaXMtPnZpZXdwb3J0X2xpc3Q7Ci0gICAgVGhpcy0+dmlld3BvcnRfbGlzdCA9IGxwRGlyZWN0M0RWaWV3cG9ydEltcGw7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfMVRfRGVsZXRlVmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJCQlMUERJUkVDVDNEVklFV1BPUlQzIGxwRGlyZWN0M0RWaWV3cG9ydDMpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwotICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqbHBEaXJlY3QzRFZpZXdwb3J0SW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBscERpcmVjdDNEVmlld3BvcnQzKTsKLSAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmN1cl92aWV3cG9ydCwgKnByZXZfdmlld3BvcnQgPSBOVUxMOwotICAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCi0gICAgY3VyX3ZpZXdwb3J0ID0gVGhpcy0+dmlld3BvcnRfbGlzdDsKLSAgICB3aGlsZSAoY3VyX3ZpZXdwb3J0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGN1cl92aWV3cG9ydCA9PSBscERpcmVjdDNEVmlld3BvcnRJbXBsKSB7Ci0JICAgIGlmIChwcmV2X3ZpZXdwb3J0ID09IE5VTEwpIFRoaXMtPnZpZXdwb3J0X2xpc3QgPSBjdXJfdmlld3BvcnQtPm5leHQ7Ci0JICAgIGVsc2UgcHJldl92aWV3cG9ydC0+bmV4dCA9IGN1cl92aWV3cG9ydC0+bmV4dDsKLQkgICAgLyogVE9ETyA6IGFkZCBkZXNhY3RpdmF0ZSBvZiB0aGUgdmlld3BvcnQgYW5kIGFsbCBhc3NvY2lhdGVkIGxpZ2h0cy4uLiAqLwotCSAgICByZXR1cm4gRERfT0s7Ci0JfQotCXByZXZfdmlld3BvcnQgPSBjdXJfdmlld3BvcnQ7Ci0JY3VyX3ZpZXdwb3J0ID0gY3VyX3ZpZXdwb3J0LT5uZXh0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUXzFUX05leHRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLQkJCQkJICAgICAgTFBESVJFQ1QzRFZJRVdQT1JUMyBscERpcmVjdDNEVmlld3BvcnQzLAotCQkJCQkgICAgICBMUERJUkVDVDNEVklFV1BPUlQzKiBscGxwRGlyZWN0M0RWaWV3cG9ydDMsCi0JCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwotICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqcmVzID0gTlVMTDsKLQotICAgIFRSQUNFKCIoJXAvJXApLT4oJXAsJXAsJTA4bHgpXG4iLCBUaGlzLCBpZmFjZSwgbHBEaXJlY3QzRFZpZXdwb3J0MywgbHBscERpcmVjdDNEVmlld3BvcnQzLCBkd0ZsYWdzKTsKLSAgICAKLSAgICBzd2l0Y2ggKGR3RmxhZ3MpIHsKLSAgICAgICAgY2FzZSBEM0RORVhUX05FWFQ6IHsKLQkgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpscERpcmVjdDNEVmlld3BvcnRJbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCSAgICByZXMgPSBscERpcmVjdDNEVmlld3BvcnRJbXBsLT5uZXh0OwotCX0gYnJlYWs7Ci0JY2FzZSBEM0RORVhUX0hFQUQ6IHsKLQkgICAgcmVzID0gVGhpcy0+dmlld3BvcnRfbGlzdDsKLQl9IGJyZWFrOwotCWNhc2UgRDNETkVYVF9UQUlMOiB7Ci0JICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqY3VyX3ZpZXdwb3J0ID0gVGhpcy0+dmlld3BvcnRfbGlzdDsKLQkgICAgaWYgKGN1cl92aWV3cG9ydCAhPSBOVUxMKSB7Ci0JICAgICAgICB3aGlsZSAoY3VyX3ZpZXdwb3J0LT5uZXh0ICE9IE5VTEwpIGN1cl92aWV3cG9ydCA9IGN1cl92aWV3cG9ydC0+bmV4dDsKLQkgICAgfQotCSAgICByZXMgPSBjdXJfdmlld3BvcnQ7Ci0JfSBicmVhazsKLQlkZWZhdWx0OgotCSAgICAqbHBscERpcmVjdDNEVmlld3BvcnQzID0gTlVMTDsKLQkgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotICAgICpscGxwRGlyZWN0M0RWaWV3cG9ydDMgPSBJQ09NX0lOVEVSRkFDRShyZXMsIElEaXJlY3QzRFZpZXdwb3J0Myk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfU2V0Q3VycmVudFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotCQkJCQkJIExQRElSRUNUM0RWSUVXUE9SVDMgbHBEaXJlY3QzRFZpZXdwb3J0MykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERpcmVjdDNEVmlld3BvcnQzKTsKLQotICAgIC8qIERvIG5vdGhpbmcgaWYgdGhlIHNwZWNpZmllZCB2aWV3cG9ydCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmUgKi8KLSAgICBpZiAoVGhpcy0+Y3VycmVudF92aWV3cG9ydCA9PSBJQ09NX09CSkVDVChJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgbHBEaXJlY3QzRFZpZXdwb3J0MykpCi0gICAgICByZXR1cm4gRERfT0s7Ci0gICAgCi0gICAgLyogU2hvdWxkIGNoZWNrIGlmIHRoZSB2aWV3cG9ydCB3YXMgYWRkZWQgb3Igbm90ICovCi0KLSAgICAvKiBSZWxlYXNlIHByZXZpb3VzIHZpZXdwb3J0IGFuZCBBZGRSZWYgdGhlIG5ldyBvbmUgKi8KLSAgICBpZiAoVGhpcy0+Y3VycmVudF92aWV3cG9ydCkKLSAgICAgIElEaXJlY3QzRFZpZXdwb3J0M19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQsIElEaXJlY3QzRFZpZXdwb3J0MykpOwotICAgIElEaXJlY3QzRFZpZXdwb3J0M19BZGRSZWYobHBEaXJlY3QzRFZpZXdwb3J0Myk7Ci0gICAgCi0gICAgLyogU2V0IHRoaXMgdmlld3BvcnQgYXMgdGhlIGN1cnJlbnQgdmlld3BvcnQgKi8KLSAgICBUaGlzLT5jdXJyZW50X3ZpZXdwb3J0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCi0gICAgLyogQWN0aXZhdGUgdGhpcyB2aWV3cG9ydCAqLwotICAgIFRoaXMtPmN1cnJlbnRfdmlld3BvcnQtPmFjdGl2ZV9kZXZpY2UgPSBUaGlzOwotICAgIFRoaXMtPmN1cnJlbnRfdmlld3BvcnQtPmFjdGl2YXRlKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfR2V0Q3VycmVudFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotCQkJCQkJIExQRElSRUNUM0RWSUVXUE9SVDMqIGxwbHBEaXJlY3QzRFZpZXdwb3J0MykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotCi0gICAgKmxwbHBEaXJlY3QzRFZpZXdwb3J0MyA9IElDT01fSU5URVJGQUNFKFRoaXMtPmN1cnJlbnRfdmlld3BvcnQsIElEaXJlY3QzRFZpZXdwb3J0Myk7Ci0KLSAgICAvKiBBZGRSZWYgdGhlIHJldHVybmVkIHZpZXdwb3J0ICovCi0gICAgSURpcmVjdDNEVmlld3BvcnQzX0FkZFJlZigqbHBscERpcmVjdDNEVmlld3BvcnQzKTsKLSAgICAKLSAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXBcbiIsICpscGxwRGlyZWN0M0RWaWV3cG9ydDMpOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zX0JlZ2luKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleFR5cGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglMDh4LCUwOGx4LCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZHdWZXJ0ZXhUeXBlRGVzYywgZHdGbGFncyk7Ci0KLSAgICBUaGlzLT5wcmltaXRpdmVfdHlwZSA9IGQzZHB0UHJpbWl0aXZlVHlwZTsKLSAgICBUaGlzLT52ZXJ0ZXhfdHlwZSA9IGR3VmVydGV4VHlwZURlc2M7Ci0gICAgVGhpcy0+cmVuZGVyX2ZsYWdzID0gZHdGbGFnczsKLSAgICBUaGlzLT52ZXJ0ZXhfc2l6ZSA9IGdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShUaGlzLT52ZXJ0ZXhfdHlwZSk7Ci0gICAgVGhpcy0+bmJfdmVydGljZXMgPSAwOwotCi0gICAgcmV0dXJuIEQzRF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zX0JlZ2luSW5kZXhlZChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkM2R2dFZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TnVtVmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGQzZHZ0VmVydGV4VHlwZSwgbHB2VmVydGljZXMsIGR3TnVtVmVydGljZXMsIGR3RmxhZ3MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX1ZlcnRleChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBWZXJ0ZXhUeXBlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwVmVydGV4VHlwZSk7Ci0KLSAgICBpZiAoKFRoaXMtPm5iX3ZlcnRpY2VzKzEpKlRoaXMtPnZlcnRleF9zaXplID4gVGhpcy0+YnVmZmVyX3NpemUpCi0gICAgewotCUxQQllURSBvbGRfYnVmZmVyOwotCVRoaXMtPmJ1ZmZlcl9zaXplID0gVGhpcy0+YnVmZmVyX3NpemUgPyBUaGlzLT5idWZmZXJfc2l6ZSAqIDIgOiBUaGlzLT52ZXJ0ZXhfc2l6ZSAqIDM7Ci0Jb2xkX2J1ZmZlciA9IFRoaXMtPnZlcnRleF9idWZmZXI7Ci0JVGhpcy0+dmVydGV4X2J1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5idWZmZXJfc2l6ZSk7Ci0JaWYgKG9sZF9idWZmZXIpCi0JewotCSAgICBDb3B5TWVtb3J5KFRoaXMtPnZlcnRleF9idWZmZXIsIG9sZF9idWZmZXIsIFRoaXMtPm5iX3ZlcnRpY2VzICogVGhpcy0+dmVydGV4X3NpemUpOwotCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvbGRfYnVmZmVyKTsKLQl9Ci0gICAgfQotCi0gICAgQ29weU1lbW9yeShUaGlzLT52ZXJ0ZXhfYnVmZmVyICsgVGhpcy0+bmJfdmVydGljZXMrKyAqIFRoaXMtPnZlcnRleF9zaXplLCBscFZlcnRleFR5cGUsIFRoaXMtPnZlcnRleF9zaXplKTsKLQotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9JbmRleChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgd1ZlcnRleEluZGV4KQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwNHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIHdWZXJ0ZXhJbmRleCk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfRW5kKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4bHgpXG4iLCBUaGlzLCBpZmFjZSwgZHdGbGFncyk7Ci0KLSAgICBJRGlyZWN0M0REZXZpY2UzX0RyYXdQcmltaXRpdmUoaWZhY2UsIFRoaXMtPnByaW1pdGl2ZV90eXBlLCBUaGlzLT52ZXJ0ZXhfdHlwZSwgVGhpcy0+dmVydGV4X2J1ZmZlciwgVGhpcy0+bmJfdmVydGljZXMsIFRoaXMtPnJlbmRlcl9mbGFncyk7Ci0KLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfR2V0TGlnaHRTdGF0ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETElHSFRTVEFURVRZUEUgZHdMaWdodFN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3TGlnaHRTdGF0ZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCVwKTogc3R1YiAhXG4iLCBUaGlzLCBpZmFjZSwgZHdMaWdodFN0YXRlVHlwZSwgbHBkd0xpZ2h0U3RhdGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX1NldExpZ2h0U3RhdGUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUU1RBVEVUWVBFIGR3TGlnaHRTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TGlnaHRTdGF0ZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkd0xpZ2h0U3RhdGVUeXBlLCBkd0xpZ2h0U3RhdGUpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8yXzFUX1N3YXBUZXh0dXJlSGFuZGxlcyhMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEVEVYVFVSRTIgbHBEM0RUZXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RURVhUVVJFMiBscEQzRFRleDIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgdG1wLCpzdXJmMSwqc3VyZjI7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcCk6XG4iLCBUaGlzLCBpZmFjZSwgbHBEM0RUZXgxLCBscEQzRFRleDIpOwotCi0gICAgc3VyZjEgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLElEaXJlY3QzRFRleHR1cmUyLGxwRDNEVGV4MSk7Ci0gICAgc3VyZjIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLElEaXJlY3QzRFRleHR1cmUyLGxwRDNEVGV4Mik7Ci0gICAgdG1wID0gKnN1cmYxOwotICAgICpzdXJmMSA9ICpzdXJmMjsKLSAgICAqc3VyZjIgPSB0bXA7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfTmV4dFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RWSUVXUE9SVDIgbHBEaXJlY3QzRFZpZXdwb3J0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEVklFV1BPUlQyKiBscGxwRGlyZWN0M0RWaWV3cG9ydDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBEaXJlY3QzRFZpZXdwb3J0MiwgbHBscERpcmVjdDNEVmlld3BvcnQyLCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfMl8xVF9FbnVtVGV4dHVyZUZvcm1hdHMoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNVEVYVFVSRUZPUk1BVFNDQUxMQkFDSyBscEQzREVudW1UZXh0dXJlUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBBcmcpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwRDNERW51bVRleHR1cmVQcm9jLCBscEFyZyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfQmVnaW4oTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYVFlQRSBkd1ZlcnRleFR5cGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCUwOHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0LCBkd1ZlcnRleFR5cGVEZXNjLCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpbkluZGV4ZWQoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYVFlQRSBkM2R2dFZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TnVtVmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCUwOHgsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgZHdOdW1WZXJ0aWNlcywgZHdGbGFncyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfRHJhd1ByaW1pdGl2ZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWFRZUEUgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHB2VmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4eCwlMDh4LCVwLCUwOGx4LCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGQzZHZ0VmVydGV4VHlwZSwgbHB2VmVydGljZXMsIGR3VmVydGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8yX0RyYXdJbmRleGVkUHJpbWl0aXZlKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRVJURVhUWVBFIGQzZHZ0VmVydGV4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscHZWZXJ0aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgZHdJbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDh4LCUwOHgsJXAsJTA4bHgsJXAsJTA4bHgsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgZHdWZXJ0ZXhDb3VudCwgZHdJbmRpY2VzLCBkd0luZGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0luaXRpYWxpemUoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRCBscERpcmVjdDNELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEdVSUQgbHBHVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0REVkRlc2MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBEaXJlY3QzRCwgbHBHVUlELCBscEQzRERWRGVzYyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzFfQ3JlYXRlRXhlY3V0ZUJ1ZmZlcihMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVYRUNVVEVCVUZGRVJERVNDIGxwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIqIGxwbHBEaXJlY3QzREV4ZWN1dGVCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBEZXNjLCBscGxwRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBwVW5rT3V0ZXIpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0V4ZWN1dGUoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIgbHBEaXJlY3QzREV4ZWN1dGVCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RWSUVXUE9SVCBscERpcmVjdDNEVmlld3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7Ci0gICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKmxwRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBscERpcmVjdDNERXhlY3V0ZUJ1ZmZlcik7Ci0gICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpscERpcmVjdDNEVmlld3BvcnRJbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGxwRGlyZWN0M0RWaWV3cG9ydCk7Ci0gICAgCi0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBscERpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgbHBEaXJlY3QzRFZpZXdwb3J0LCBkd0ZsYWdzKTsKLQotICAgIC8qIFB1dCB0aGlzIGFzIHRoZSBkZWZhdWx0IGNvbnRleHQgKi8KLQotICAgIC8qIEV4ZWN1dGUuLi4gKi8KLSAgICBscERpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwtPmV4ZWN1dGUobHBEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBUaGlzLCBscERpcmVjdDNEVmlld3BvcnRJbXBsKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX05leHRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RWSUVXUE9SVCBscERpcmVjdDNEVmlld3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRFZJRVdQT1JUKiBscGxwRGlyZWN0M0RWaWV3cG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXAsJXAsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwRGlyZWN0M0RWaWV3cG9ydCwgbHBscERpcmVjdDNEVmlld3BvcnQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX1BpY2soTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIgbHBEaXJlY3QzREV4ZWN1dGVCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RWSUVXUE9SVCBscERpcmVjdDNEVmlld3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEUkVDVCBscFJlY3QpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCwlMDhseCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGxwRGlyZWN0M0RWaWV3cG9ydCwgZHdGbGFncywgbHBSZWN0KTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfMV9HZXRQaWNrUmVjb3JkcyhMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RQSUNLUkVDT1JEIGxwRDNEUGlja1JlYykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwLCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscENvdW50LCBscEQzRFBpY2tSZWMpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0NyZWF0ZU1hdHJpeChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYSEFORExFIGxwRDNETWF0SGFuZGxlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBEM0RNYXRIYW5kbGUpOwotCi0gICAgKmxwRDNETWF0SGFuZGxlID0gKEQzRE1BVFJJWEhBTkRMRSkgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihEM0RNQVRSSVgpKTsKLSAgICBUUkFDRSgiIHJldHVybmluZyBtYXRyaXggaGFuZGxlICVwXG4iLCAodm9pZCAqKSAqbHBEM0RNYXRIYW5kbGUpOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX1NldE1hdHJpeChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVFJJWEhBTkRMRSBEM0RNYXRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglMDhseCwlcClcbiIsIFRoaXMsIGlmYWNlLCAoRFdPUkQpIEQzRE1hdEhhbmRsZSwgbHBEM0RNYXRyaXgpOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCWR1bXBfRDNETUFUUklYKGxwRDNETWF0cml4KTsKLSAgICB9Ci0gICAgKigoRDNETUFUUklYICopIEQzRE1hdEhhbmRsZSkgPSAqbHBEM0RNYXRyaXg7ICAgCi0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0TWF0cml4KExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFUUklYSEFORExFIEQzRE1hdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVwKVxuIiwgVGhpcywgaWZhY2UsIChEV09SRCkgRDNETWF0SGFuZGxlLCBscEQzRE1hdHJpeCk7Ci0KLSAgICAqbHBEM0RNYXRyaXggPSAqKChEM0RNQVRSSVggKikgRDNETWF0SGFuZGxlKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRERldmljZUltcGxfMV9EZWxldGVNYXRyaXgoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRSSVhIQU5ETEUgRDNETWF0SGFuZGxlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4bHgpXG4iLCBUaGlzLCBpZmFjZSwgKERXT1JEKSBEM0RNYXRIYW5kbGUpOwotCi0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKHZvaWQgKikgRDNETWF0SGFuZGxlKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JwKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9RdWVyeUludGVyZmFjZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1F1ZXJ5SW50ZXJmYWNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnApOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RERVZJQ0UgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnApOwotfQotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19BZGRSZWYoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UpCi17Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQWRkUmVmKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSk7Ci19Ci0KLVVMT05HIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0FkZFJlZihMUERJUkVDVDNEREVWSUNFIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfUmVsZWFzZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfUmVsZWFzZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfUmVsZWFzZShMUERJUkVDVDNEREVWSUNFIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19SZWxlYXNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQWRkVmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0JCQkJCUxQRElSRUNUM0RWSUVXUE9SVDIgbHBEaXJlY3QzRFZpZXdwb3J0MikKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNEVmlld3BvcnQyKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19BZGRWaWV3cG9ydChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpLAotCQkJCQkoTFBESVJFQ1QzRFZJRVdQT1JUMykgbHBEaXJlY3QzRFZpZXdwb3J0MiAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSBhcyBhbGwgaW50ZXJmYWNlcyBhcmUgZXF1aXZhbGVudCAqLyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfQWRkVmlld3BvcnQoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLQkJCQkJTFBESVJFQ1QzRFZJRVdQT1JUIGxwRGlyZWN0M0RWaWV3cG9ydCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNEVmlld3BvcnQpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0FkZFZpZXdwb3J0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLQkJCQkJKExQRElSRUNUM0RWSUVXUE9SVDMpIGxwRGlyZWN0M0RWaWV3cG9ydCAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSBhcyBhbGwgaW50ZXJmYWNlcyBhcmUgZXF1aXZhbGVudCAqLyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfRGVsZXRlVmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0JCQkJCSAgIExQRElSRUNUM0RWSUVXUE9SVDIgbHBEaXJlY3QzRFZpZXdwb3J0MikKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNEVmlld3BvcnQyKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19EZWxldGVWaWV3cG9ydChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpLAotCQkJCQkgICAoTFBESVJFQ1QzRFZJRVdQT1JUMykgbHBEaXJlY3QzRFZpZXdwb3J0MiAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSBhcyBhbGwgaW50ZXJmYWNlcyBhcmUgZXF1aXZhbGVudCAqLyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfRGVsZXRlVmlld3BvcnQoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLQkJCQkJICAgTFBESVJFQ1QzRFZJRVdQT1JUIGxwRGlyZWN0M0RWaWV3cG9ydCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNEVmlld3BvcnQpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0RlbGV0ZVZpZXdwb3J0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLQkJCQkJICAgKExQRElSRUNUM0RWSUVXUE9SVDMpIGxwRGlyZWN0M0RWaWV3cG9ydCAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSBhcyBhbGwgaW50ZXJmYWNlcyBhcmUgZXF1aXZhbGVudCAqLyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfTmV4dFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotCQkJCQkgTFBESVJFQ1QzRFZJRVdQT1JUMiBscERpcmVjdDNEVmlld3BvcnQyLAotCQkJCQkgTFBESVJFQ1QzRFZJRVdQT1JUMiogbHBscERpcmVjdDNEVmlld3BvcnQyLAotCQkJCQkgRFdPUkQgZHdGbGFncykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNEVmlld3BvcnQyLCBscGxwRGlyZWN0M0RWaWV3cG9ydDIsIGR3RmxhZ3MpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX05leHRWaWV3cG9ydChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpLAotCQkJCQkgKExQRElSRUNUM0RWSUVXUE9SVDMpIGxwRGlyZWN0M0RWaWV3cG9ydDIgLyogTm8gbmVlZCB0byBjYXN0IGhlcmUgYXMgYWxsIGludGVyZmFjZXMgYXJlIGVxdWl2YWxlbnQgKi8sCi0JCQkJCSAoTFBESVJFQ1QzRFZJRVdQT1JUMyopIGxwbHBEaXJlY3QzRFZpZXdwb3J0MiwKLQkJCQkJIGR3RmxhZ3MpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX05leHRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotCQkJCQkgTFBESVJFQ1QzRFZJRVdQT1JUIGxwRGlyZWN0M0RWaWV3cG9ydCwKLQkJCQkJIExQRElSRUNUM0RWSUVXUE9SVCogbHBscERpcmVjdDNEVmlld3BvcnQsCi0JCQkJCSBEV09SRCBkd0ZsYWdzKQotewotICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRGlyZWN0M0RWaWV3cG9ydCwgbHBscERpcmVjdDNEVmlld3BvcnQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX05leHRWaWV3cG9ydChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSksCi0JCQkJCSAoTFBESVJFQ1QzRFZJRVdQT1JUMykgbHBEaXJlY3QzRFZpZXdwb3J0IC8qIE5vIG5lZWQgdG8gY2FzdCBoZXJlIGFzIGFsbCBpbnRlcmZhY2VzIGFyZSBlcXVpdmFsZW50ICovLAotCQkJCQkgKExQRElSRUNUM0RWSUVXUE9SVDMqKSBscGxwRGlyZWN0M0RWaWV3cG9ydCwKLQkJCQkJIGR3RmxhZ3MpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldERpcmVjdDNEKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotCQkJCQlMUERJUkVDVDNEMyogbHBscERpcmVjdDNEMykKLXsKLSAgICBIUkVTVUxUIHJldDsKLSAgICBMUERJUkVDVDNENyByZXRfcHRyOwotICAKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBscGxwRGlyZWN0M0QzKTsKLSAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldERpcmVjdDNEKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0JCQkJICAgICAgICZyZXRfcHRyKTsKLSAgICAqbHBscERpcmVjdDNEMyA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIElEaXJlY3QzRDMsIHJldF9wdHIpOwotICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcFxuIiwgKmxwbHBEaXJlY3QzRDMpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0RGlyZWN0M0QoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0JCQkJCUxQRElSRUNUM0QyKiBscGxwRGlyZWN0M0QyKQotewotICAgIEhSRVNVTFQgcmV0OwotICAgIExQRElSRUNUM0Q3IHJldF9wdHI7Ci0gIAotICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwbHBEaXJlY3QzRDIpOwotICAgIHJldCA9IElEaXJlY3QzRERldmljZTdfR2V0RGlyZWN0M0QoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLQkJCQkgICAgICAgJnJldF9wdHIpOwotICAgICpscGxwRGlyZWN0M0QyID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgSURpcmVjdDNEMiwgcmV0X3B0cik7Ci0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwXG4iLCAqbHBscERpcmVjdDNEMik7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9HZXREaXJlY3QzRChMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotCQkJCQlMUERJUkVDVDNEKiBscGxwRGlyZWN0M0QpCi17Ci0gICAgSFJFU1VMVCByZXQ7Ci0gICAgTFBESVJFQ1QzRDcgcmV0X3B0cjsKLSAgCi0gICAgVFJBQ0UoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBscERpcmVjdDNEKTsKLSAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldERpcmVjdDNEKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLQkJCQkgICAgICAgJnJldF9wdHIpOwotICAgICpscGxwRGlyZWN0M0QgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBJRGlyZWN0M0QsIHJldF9wdHIpOwotICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcFxuIiwgKmxwbHBEaXJlY3QzRCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRDdXJyZW50Vmlld3BvcnQoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0JCQkJCSAgICAgICBMUERJUkVDVDNEVklFV1BPUlQyIGxwRGlyZWN0M0RWaWV3cG9ydDIpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEaXJlY3QzRFZpZXdwb3J0Mik7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfU2V0Q3VycmVudFZpZXdwb3J0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSksCi0JCQkJCSAgICAgICAoTFBESVJFQ1QzRFZJRVdQT1JUMykgbHBEaXJlY3QzRFZpZXdwb3J0MiAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSBhcyBhbGwgaW50ZXJmYWNlcyBhcmUgZXF1aXZhbGVudCAqLyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0Q3VycmVudFZpZXdwb3J0KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotCQkJCQkgICAgICAgTFBESVJFQ1QzRFZJRVdQT1JUMiogbHBscERpcmVjdDNEVmlld3BvcnQyKQotewotICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwbHBEaXJlY3QzRFZpZXdwb3J0Mik7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfR2V0Q3VycmVudFZpZXdwb3J0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSksCi0JCQkJCSAgICAgICAoTFBESVJFQ1QzRFZJRVdQT1JUMyopIGxwbHBEaXJlY3QzRFZpZXdwb3J0MiAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSBhcyBhbGwgaW50ZXJmYWNlcyBhcmUgZXF1aXZhbGVudCAqLyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRW51bVRleHR1cmVGb3JtYXRzKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBscEQzREVudW1QaXhlbFByb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEFyZykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBscEQzREVudW1QaXhlbFByb2MsIGxwQXJnKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19FbnVtVGV4dHVyZUZvcm1hdHMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0RFbnVtUGl4ZWxQcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEFyZyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQmVnaW5TY2VuZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfQmVnaW5TY2VuZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpblNjZW5lKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19CZWdpblNjZW5lKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSkpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0JlZ2luU2NlbmUoTFBESVJFQ1QzRERFVklDRSBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfQmVnaW5TY2VuZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSkpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0VuZFNjZW5lKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19FbmRTY2VuZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9FbmRTY2VuZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRW5kU2NlbmUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfRW5kU2NlbmUoTFBESVJFQ1QzRERFVklDRSBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRW5kU2NlbmUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUcmFuc2Zvcm0oTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsIGxwRDNETWF0cml4KTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRUcmFuc2Zvcm0oQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0RNYXRyaXgpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFRyYW5zZm9ybShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYIGxwRDNETWF0cml4KQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwgbHBEM0RNYXRyaXgpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEQzRE1hdHJpeCk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VHJhbnNmb3JtKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLCBscEQzRE1hdHJpeCk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0VHJhbnNmb3JtKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRDNETWF0cml4KTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRUcmFuc2Zvcm0oTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBscEQzRE1hdHJpeCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsIGxwRDNETWF0cml4KTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19HZXRUcmFuc2Zvcm0oQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0RNYXRyaXgpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX011bHRpcGx5VHJhbnNmb3JtKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFVFlQRSBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFUUklYIGxwRDNETWF0cml4KQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwgbHBEM0RNYXRyaXgpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X011bHRpcGx5VHJhbnNmb3JtKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzdFRyYW5zZm9ybVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEQzRE1hdHJpeCk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfTXVsdGlwbHlUcmFuc2Zvcm0oTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVUWVBFIGR0c3RUcmFuc2Zvcm1TdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggbHBEM0RNYXRyaXgpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglMDh4LCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLCBscEQzRE1hdHJpeCk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfTXVsdGlwbHlUcmFuc2Zvcm0oQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHN0VHJhbnNmb3JtU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRDNETWF0cml4KTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRSZW5kZXJTdGF0ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RSRU5ERVJTVEFURVRZUEUgZHdSZW5kZXJTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdSZW5kZXJTdGF0ZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGR3UmVuZGVyU3RhdGVUeXBlLCBkd1JlbmRlclN0YXRlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRSZW5kZXJTdGF0ZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVuZGVyU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVuZGVyU3RhdGUpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFJlbmRlclN0YXRlKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1JlbmRlclN0YXRlKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZHdSZW5kZXJTdGF0ZVR5cGUsIGR3UmVuZGVyU3RhdGUpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclN0YXRlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZW5kZXJTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZW5kZXJTdGF0ZSk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0UmVuZGVyU3RhdGUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIGR3UmVuZGVyU3RhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd1JlbmRlclN0YXRlKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZHdSZW5kZXJTdGF0ZVR5cGUsIGxwZHdSZW5kZXJTdGF0ZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0UmVuZGVyU3RhdGUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlbmRlclN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3UmVuZGVyU3RhdGUpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclN0YXRlKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdSZW5kZXJTdGF0ZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGR3UmVuZGVyU3RhdGVUeXBlLCBscGR3UmVuZGVyU3RhdGUpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0dldFJlbmRlclN0YXRlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZW5kZXJTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd1JlbmRlclN0YXRlKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3UHJpbWl0aXZlKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkM2R2dFZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHB2VmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJTA4bHgsJXAsJTA4bHgsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgZHdWZXJ0ZXhDb3VudCwgZHdGbGFncyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRHJhd1ByaW1pdGl2ZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHB2VmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1ZlcnRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd0luZGV4ZWRQcmltaXRpdmUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscHZWZXJ0aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBkd0luZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCVwLCUwOGx4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGQzZHZ0VmVydGV4VHlwZSwgbHB2VmVydGljZXMsIGR3VmVydGV4Q291bnQsIGR3SW5kaWNlcywgZHdJbmRleENvdW50LCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3SW5kZXhlZFByaW1pdGl2ZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM2R2dFZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHB2VmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0luZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdJbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldENsaXBTdGF0dXMoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRENMSVBTVEFUVVMgbHBEM0RDbGlwU3RhdHVzKQotewotICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRDNEQ2xpcFN0YXR1cyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfU2V0Q2xpcFN0YXR1cyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0RDbGlwU3RhdHVzKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRDbGlwU3RhdHVzKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RDTElQU1RBVFVTIGxwRDNEQ2xpcFN0YXR1cykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBscEQzRENsaXBTdGF0dXMpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldENsaXBTdGF0dXMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRDNEQ2xpcFN0YXR1cyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0Q2xpcFN0YXR1cyhMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEQ0xJUFNUQVRVUyBscEQzRENsaXBTdGF0dXMpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEM0RDbGlwU3RhdHVzKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19HZXRDbGlwU3RhdHVzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEQzRENsaXBTdGF0dXMpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldENsaXBTdGF0dXMoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRENMSVBTVEFUVVMgbHBEM0RDbGlwU3RhdHVzKQotewotICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRDNEQ2xpcFN0YXR1cyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0Q2xpcFN0YXR1cyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0RDbGlwU3RhdHVzKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3UHJpbWl0aXZlU3RyaWRlZChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZDNkcHRQcmltaXRpdmVUeXBlLCBkd1ZlcnRleFR5cGUsIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBkd1ZlcnRleENvdW50LCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3UHJpbWl0aXZlU3RyaWRlZChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1ZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19EcmF3SW5kZXhlZFByaW1pdGl2ZVN0cmlkZWQoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgbHBJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdJbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlcCwlMDhseCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZDNkcHRQcmltaXRpdmVUeXBlLCBkd1ZlcnRleFR5cGUsIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBkd1ZlcnRleENvdW50LCBscEluZGV4LCBkd0luZGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3VmVydGV4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3SW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfQ29tcHV0ZVNwaGVyZVZpc2liaWxpdHkoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RWRUNUT1IgbHBDZW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVkFMVUUgbHBSYWRpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd051bVNwaGVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdSZXR1cm5WYWx1ZXMpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlcCwlMDhseCwlMDhseCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBDZW50ZXJzLCBscFJhZGlpLCBkd051bVNwaGVyZXMsIGR3RmxhZ3MsIGxwZHdSZXR1cm5WYWx1ZXMpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDZW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwUmFkaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdOdW1TcGhlcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd1JldHVyblZhbHVlcyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VGV4dHVyZVN0YWdlU3RhdGUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3U3RhdGUpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglMDhseCwlMDh4LCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkd1N0YWdlLCBkM2RUZXhTdGFnZVN0YXRlVHlwZSwgbHBkd1N0YXRlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19HZXRUZXh0dXJlU3RhZ2VTdGF0ZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd1N0YXRlKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUZXh0dXJlU3RhZ2VTdGF0ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBkM2RUZXhTdGFnZVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0YXRlKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJTA4eCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZHdTdGFnZSwgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUsIGR3U3RhdGUpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM2RUZXhTdGFnZVN0YXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXRlKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19WYWxpZGF0ZURldmljZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdQYXNzZXMpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBkd1Bhc3Nlcyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfVmFsaWRhdGVEZXZpY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3UGFzc2VzKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRDYXBzKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RERVZJQ0VERVNDIGxwRDNESFdEZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RERVZJQ0VERVNDIGxwRDNESEVMRGV2RGVzYykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscEQzREhXRGV2RGVzYywgbHBEM0RIRUxEZXZEZXNjKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19HZXRDYXBzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEQzREhXRGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRDNESEVMRGV2RGVzYyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0Q2FwcyhMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RERVZJQ0VERVNDIGxwRDNESFdEZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RERVZJQ0VERVNDIGxwRDNESEVMRGV2RGVzYykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscEQzREhXRGV2RGVzYywgbHBEM0RIRUxEZXZEZXNjKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19HZXRDYXBzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRDNESFdEZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0RIRUxEZXZEZXNjKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9Td2FwVGV4dHVyZUhhbmRsZXMoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEVEVYVFVSRSBscEQzRFRleDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRFRFWFRVUkUgbHBEM0RUZXgyKQotewotICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTIgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRDNEVGV4MSwgbHBEM0RUZXgyKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlMl9Td2FwVGV4dHVyZUhhbmRsZXMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTIsIGxwRDNEVGV4MSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgbHBEM0RUZXgyKSk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0U3RhdHMoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RTVEFUUyBscEQzRFN0YXRzKQotewotICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRDNEU3RhdHMpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0dldFN0YXRzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UzLCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEM0RTdGF0cyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0U3RhdHMoTFBESVJFQ1QzRERFVklDRSBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFNUQVRTIGxwRDNEU3RhdHMpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEM0RTdGF0cyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfR2V0U3RhdHMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRDNEU3RhdHMpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFJlbmRlclRhcmdldChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBOZXdSZW5kZXJUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlMDhseCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBOZXdSZW5kZXJUYXJnZXQsIGR3RmxhZ3MpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2U3X1NldFJlbmRlclRhcmdldChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBESVJFQ1REUkFXU1VSRkFDRTcpIGxwTmV3UmVuZGVyVGFyZ2V0IC8qIE5vIGNhc3QgbmVlZGVkIGFzIERTdXJmNCA9PSBEU3VyZjcgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFJlbmRlclRhcmdldChMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTQqIGxwbHBSZW5kZXJUYXJnZXQpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBscFJlbmRlclRhcmdldCk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfR2V0UmVuZGVyVGFyZ2V0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUERJUkVDVERSQVdTVVJGQUNFNyopIGxwbHBSZW5kZXJUYXJnZXQgLyogTm8gY2FzdCBuZWVkZWQgYXMgRFN1cmY0ID09IERTdXJmNyAqLyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0UmVuZGVyVGFyZ2V0KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFIGxwTmV3UmVuZGVyVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIFRSQUNFKCIoJXApLT4oJXAsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTmV3UmVuZGVyVGFyZ2V0LCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRSZW5kZXJUYXJnZXQoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIElEaXJlY3REcmF3U3VyZmFjZTcsIGxwTmV3UmVuZGVyVGFyZ2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0UmVuZGVyVGFyZ2V0KExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFKiBscGxwUmVuZGVyVGFyZ2V0KQotewotICAgIEhSRVNVTFQgcmV0OwotICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHJldF92YWw7Ci0gIAotICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwbHBSZW5kZXJUYXJnZXQpOwotICAgIHJldCA9IElEaXJlY3QzRERldmljZTdfR2V0UmVuZGVyVGFyZ2V0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0JCQkJCSAgICZyZXRfdmFsKTsKLSAgICAqbHBscFJlbmRlclRhcmdldCA9IChMUERJUkVDVERSQVdTVVJGQUNFKSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdERyYXdTdXJmYWNlMywgcmV0X3ZhbCk7Ci0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwXG4iLCAqbHBscFJlbmRlclRhcmdldCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9WZXJ0ZXgoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFZlcnRleFR5cGUpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBWZXJ0ZXhUeXBlKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19WZXJ0ZXgoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBWZXJ0ZXhUeXBlKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9JbmRleChMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHdWZXJ0ZXhJbmRleCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwNHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIHdWZXJ0ZXhJbmRleCk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTNfSW5kZXgoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VmVydGV4SW5kZXgpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0VuZChMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlM19FbmQoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0TGlnaHRTdGF0ZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUU1RBVEVUWVBFIGR3TGlnaHRTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdMaWdodFN0YXRlKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4eCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZHdMaWdodFN0YXRlVHlwZSwgbHBkd0xpZ2h0U3RhdGUpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX0dldExpZ2h0U3RhdGUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3TGlnaHRTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3TGlnaHRTdGF0ZSk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0TGlnaHRTdGF0ZShMUERJUkVDVDNEREVWSUNFMiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUU1RBVEVUWVBFIGR3TGlnaHRTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0xpZ2h0U3RhdGUpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglMDh4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2UzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkd0xpZ2h0U3RhdGVUeXBlLCBkd0xpZ2h0U3RhdGUpOwotICAgIHJldHVybiBJRGlyZWN0M0REZXZpY2UzX1NldExpZ2h0U3RhdGUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3TGlnaHRTdGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0xpZ2h0U3RhdGUpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0VudW1UZXh0dXJlRm9ybWF0cyhMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1URVhUVVJFRk9STUFUU0NBTExCQUNLIGxwRDNERW51bVRleHR1cmVQcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBBcmcpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlMiBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEM0RFbnVtVGV4dHVyZVByb2MsIGxwQXJnKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlMl9FbnVtVGV4dHVyZUZvcm1hdHMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEQzREVudW1UZXh0dXJlUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBBcmcpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFRleHR1cmUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJICAgICAgIERXT1JEIGR3U3RhZ2UsCi0JCQkJICAgICAgIExQRElSRUNUM0RURVhUVVJFMiBscFRleHR1cmUyKQotewotICAgIFRSQUNFKCIoJXApLT4oJWxkLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkd1N0YWdlLCBscFRleHR1cmUyKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19TZXRUZXh0dXJlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0JCQkJICAgICAgIGR3U3RhZ2UsCi0JCQkJICAgICAgIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgSURpcmVjdERyYXdTdXJmYWNlNywgbHBUZXh0dXJlMikpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdQcmltaXRpdmVWQihMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLQkJCQkJICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotCQkJCQkgICAgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUiBscEQzRFZlcnRleEJ1ZiwKLQkJCQkJICAgIERXT1JEIGR3U3RhcnRWZXJ0ZXgsCi0JCQkJCSAgICBEV09SRCBkd051bVZlcnRpY2VzLAotCQkJCQkgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOHgsJXAsJTA4bHgsJTA4bHgsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIAotCSAgZDNkcHRQcmltaXRpdmVUeXBlLCBscEQzRFZlcnRleEJ1ZiwgZHdTdGFydFZlcnRleCwgZHdOdW1WZXJ0aWNlcywgZHdGbGFncyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRERldmljZTdfRHJhd1ByaW1pdGl2ZVZCKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0JCQkJCSAgICBkM2RwdFByaW1pdGl2ZVR5cGUsCi0JCQkJCSAgICBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBscEQzRFZlcnRleEJ1ZiksCi0JCQkJCSAgICBkd1N0YXJ0VmVydGV4LAotCQkJCQkgICAgZHdOdW1WZXJ0aWNlcywKLQkJCQkJICAgIGR3RmxhZ3MpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlVkIoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJCQkgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkJCSAgIExQRElSRUNUM0RWRVJURVhCVUZGRVIgbHBEM0RWZXJ0ZXhCdWYsCi0JCQkJCQkgICBMUFdPUkQgbHB3SW5kaWNlcywKLQkJCQkJCSAgIERXT1JEIGR3SW5kZXhDb3VudCwKLQkJCQkJCSAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglMDh4LCVwLCVwLCUwOGx4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLAotCSAgZDNkcHRQcmltaXRpdmVUeXBlLCBscEQzRFZlcnRleEJ1ZiwgbHB3SW5kaWNlcywgZHdJbmRleENvdW50LCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19EcmF3SW5kZXhlZFByaW1pdGl2ZVZCKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSksCi0JCQkJCQkgICBkM2RwdFByaW1pdGl2ZVR5cGUsCi0JCQkJCQkgICBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBscEQzRFZlcnRleEJ1ZiksCi0JCQkJCQkgICAwLAotCQkJCQkJICAgZHdJbmRleENvdW50LAotCQkJCQkJICAgbHB3SW5kaWNlcywKLQkJCQkJCSAgIGR3SW5kZXhDb3VudCwKLQkJCQkJCSAgIGR3RmxhZ3MpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0dldFRleHR1cmUoTFBESVJFQ1QzRERFVklDRTMgaWZhY2UsCi0JCQkJICAgICAgIERXT1JEIGR3U3RhZ2UsCi0JCQkJICAgICAgIExQRElSRUNUM0RURVhUVVJFMiogbHBscFRleHR1cmUyKQotewotICAgIEhSRVNVTFQgcmV0OwotICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHJldF92YWw7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVsZCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZHdTdGFnZSwgbHBscFRleHR1cmUyKTsKLSAgICByZXQgPSBJRGlyZWN0M0REZXZpY2U3X0dldFRleHR1cmUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKSwKLQkJCQkgICAgICBkd1N0YWdlLAotCQkJCSAgICAgICZyZXRfdmFsKTsKLQotICAgICpscGxwVGV4dHVyZTIgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdDNEVGV4dHVyZTIsIHJldF92YWwpOwotCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwLlxuIiwgKmxwbHBUZXh0dXJlMik7Ci0gICAgCi0gICAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGV2aWNlX29wZW5nbC5jIGIvZGxscy9kZHJhdy9kZXZpY2Vfb3BlbmdsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTk5NmUuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9kZXZpY2Vfb3BlbmdsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUwICswLDAgQEAKLS8qCi0gKiBEaXJlY3QzRCBEZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCBMaW9uZWwgVWxtZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IENocmlzdGlhbiBDb3N0YQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgTUVTQSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgdGhlIEQzRCBkZXZpY2VzIHRoYXQKLSAqIFdpbmUgc3VwcG9ydHMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIndpbmUvcG9ydC5oIgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jZGVmaW5lIE5PTkFNRUxFU1NVTklPTgotI2RlZmluZSBOT05BTUVMRVNTU1RSVUNUCi0KLSNpbmNsdWRlICJ3aW5kZWYuaCIKLSNpbmNsdWRlICJ3aW5iYXNlLmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJvYmpiYXNlLmgiCi0jaW5jbHVkZSAid2luZ2RpLmgiCi0jaW5jbHVkZSAiZGRyYXcuaCIKLSNpbmNsdWRlICJkM2QuaCIKLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0jaW5jbHVkZSAid2luZS9saWJyYXJ5LmgiCi0KLSNpbmNsdWRlICJkM2RfcHJpdmF0ZS5oIgotI2luY2x1ZGUgIm9wZW5nbF9wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLVdJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGRkcmF3X2dlb20pOwotCi0vKiB4MTFkcnYgR0RJIGVzY2FwZXMgKi8KLSNkZWZpbmUgWDExRFJWX0VTQ0FQRSA2Nzg5Ci1lbnVtIHgxMWRydl9lc2NhcGVfY29kZXMKLXsKLSAgICBYMTFEUlZfR0VUX0RJU1BMQVksICAgLyogZ2V0IFgxMSBkaXNwbGF5IGZvciBhIERDICovCi0gICAgWDExRFJWX0dFVF9EUkFXQUJMRSwgIC8qIGdldCBjdXJyZW50IGRyYXdhYmxlIGZvciBhIERDICovCi0gICAgWDExRFJWX0dFVF9GT05ULCAgICAgIC8qIGdldCBjdXJyZW50IFggZm9udCBmb3IgYSBEQyAqLwotfTsKLQotLyogVGhleSBhcmUgbm9uLXN0YXRpYyBhcyB0aGV5IGFyZSB1c2VkIGJ5IERpcmVjdDNEIGluIHRoZSBjcmVhdGlvbiBmdW5jdGlvbiAqLwotY29uc3QgR1VJRCBJSURfRDNEREVWSUNFX09wZW5HTCA9IHsKLSAgMHgzMTQxNmQ0NCwKLSAgMHg4NmFlLAotICAweDExZDIsCi0gIHsgMHg4MiwweDJkLDB4YTgsMHhkNSwweDMxLDB4ODcsMHhjYSwweGZhIH0KLX07Ci0KLWNvbnN0IGZsb2F0IGlkX21hdFsxNl0gPSB7Ci0gICAgMS4wLCAwLjAsIDAuMCwgMC4wLAotICAgIDAuMCwgMS4wLCAwLjAsIDAuMCwKLSAgICAwLjAsIDAuMCwgMS4wLCAwLjAsCi0gICAgMC4wLCAwLjAsIDAuMCwgMS4wCi19OwotCi0vKiBUaGlzIGlzIGZpbGxlZCBhdCBETEwgbG9hZGluZyB0aW1lICovCi1zdGF0aWMgRDNEREVWSUNFREVTQzcgb3BlbmdsX2RldmljZV9jYXBzOwotR0xfRVhURU5TSU9OU19MSVNUIEdMX2V4dGVuc2lvbnM7Ci0KLXN0YXRpYyB2b2lkIGRyYXdfcHJpbWl0aXZlX3N0cmlkZWQoSURpcmVjdDNERGV2aWNlSW1wbCAqVGhpcywKLQkJCQkgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkgICBEV09SRCBkM2R2dFZlcnRleFR5cGUsCi0JCQkJICAgTFBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0JCQkJICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLQkJCQkgICBMUFdPUkQgZHdJbmRpY2VzLAotCQkJCSAgIERXT1JEIGR3SW5kZXhDb3VudCwKLQkJCQkgICBEV09SRCBkd0ZsYWdzKSA7Ci0KLXN0YXRpYyBEV09SRCBkcmF3X3ByaW1pdGl2ZV9oYW5kbGVfdGV4dHVyZXMoSURpcmVjdDNERGV2aWNlSW1wbCAqVGhpcyk7Ci0KLS8qIHJldHJpZXZlIHRoZSBYIGRpc3BsYXkgdG8gdXNlIG9uIGEgZ2l2ZW4gREMgKi8KLWlubGluZSBzdGF0aWMgRGlzcGxheSAqZ2V0X2Rpc3BsYXkoIEhEQyBoZGMgKQotewotICAgIERpc3BsYXkgKmRpc3BsYXk7Ci0gICAgZW51bSB4MTFkcnZfZXNjYXBlX2NvZGVzIGVzY2FwZSA9IFgxMURSVl9HRVRfRElTUExBWTsKLQotICAgIGlmICghRXh0RXNjYXBlKCBoZGMsIFgxMURSVl9FU0NBUEUsIHNpemVvZihlc2NhcGUpLCAoTFBDU1RSKSZlc2NhcGUsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNwbGF5KSwgKExQU1RSKSZkaXNwbGF5ICkpIGRpc3BsYXkgPSBOVUxMOwotCi0gICAgcmV0dXJuIGRpc3BsYXk7Ci19Ci0KLSNkZWZpbmUgVU5MT0NLX1RFWF9TSVpFIDI1NgotCi0jZGVmaW5lIERFUFRIX1JBTkdFX0JJVCAoMHgwMDAwMDAwMSA8PCAwKQotI2RlZmluZSBWSUVXUE9SVF9CSVQgICAgKDB4MDAwMDAwMDEgPDwgMSkKLQotc3RhdGljIERXT1JEIGQzZGRldmljZV9zZXRfc3RhdGVfZm9yX2ZsdXNoKElEaXJlY3QzRERldmljZUltcGwgKmQzZF9kZXYsIExQQ1JFQ1QgcFJlY3QsIEJPT0xFQU4gdXNlX2FscGhhLCBCT09MRUFOICppbml0aWFsKSB7Ci0gICAgSURpcmVjdDNERGV2aWNlR0xJbXBsKiBnbF9kM2RfZGV2ID0gKElEaXJlY3QzRERldmljZUdMSW1wbCopIGQzZF9kZXY7Ci0gICAgRFdPUkQgb3B0X2JpdG1hcCA9IDB4MDAwMDAwMDA7Ci0gICAgCi0gICAgaWYgKChnbF9kM2RfZGV2LT5jdXJyZW50X2JvdW5kX3RleHR1cmVbMV0gIT0gTlVMTCkgJiYKLQkoKGQzZF9kZXYtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbMV1bRDNEVFNTX0NPTE9ST1AgLSAxXSAhPSBEM0RUT1BfRElTQUJMRSkpKSB7Ci0JaWYgKGdsX2QzZF9kZXYtPmN1cnJlbnRfYWN0aXZlX3RleF91bml0ICE9IEdMX1RFWFRVUkUxX1dJTkUpIHsKLQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTFfV0lORSk7Ci0JICAgIGdsX2QzZF9kZXYtPmN1cnJlbnRfYWN0aXZlX3RleF91bml0ID0gR0xfVEVYVFVSRTFfV0lORTsKLQl9Ci0JLyogRGlzYWJsZSBtdWx0aS10ZXh0dXJpbmcgZm9yIGxldmVsIDEgdG8gZGlzYWJsZSBhbGwgb3RoZXJzICovCi0JZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIH0KLSAgICBpZiAoZ2xfZDNkX2Rldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgIT0gR0xfVEVYVFVSRTBfV0lORSkgewotCUdMX2V4dGVuc2lvbnMuZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwX1dJTkUpOwotCWdsX2QzZF9kZXYtPmN1cnJlbnRfYWN0aXZlX3RleF91bml0ID0gR0xfVEVYVFVSRTBfV0lORTsKLSAgICB9Ci0gICAgaWYgKChnbF9kM2RfZGV2LT5jdXJyZW50X2JvdW5kX3RleHR1cmVbMF0gPT0gTlVMTCkgfHwKLQkoZDNkX2Rldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVswXVtEM0RUU1NfQ09MT1JPUCAtIDFdID09IEQzRFRPUF9ESVNBQkxFKSkKLQlnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBpZiAoZ2xfZDNkX2Rldi0+dW5sb2NrX3RleCA9PSAwKSB7Ci0gICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJmdsX2QzZF9kZXYtPnVubG9ja190ZXgpOwotCWdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgZ2xfZDNkX2Rldi0+dW5sb2NrX3RleCk7Ci0JKmluaXRpYWwgPSBUUlVFOwotCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVApOwotCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgZ2xfZDNkX2Rldi0+dW5sb2NrX3RleCk7Ci0JKmluaXRpYWwgPSBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKGQzZF9kZXYtPnRleF9tYXRfaXNfaWRlbnRpdHlbMF0gPT0gRkFMU0UpIHsKLQlnbE1hdHJpeE1vZGUoR0xfVEVYVFVSRSk7Ci0JZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdsX2QzZF9kZXYtPnRyYW5zZm9ybV9zdGF0ZSAhPSBHTF9UUkFOU0ZPUk1fT1JUSE8pIHsKLQlnbF9kM2RfZGV2LT50cmFuc2Zvcm1fc3RhdGUgPSBHTF9UUkFOU0ZPUk1fT1JUSE87Ci0JZDNkZGV2aWNlX3NldF9vcnRobyhkM2RfZGV2KTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdsX2QzZF9kZXYtPmRlcHRoX3Rlc3QgIT0gRkFMU0UpIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGlmICgoZDNkX2Rldi0+YWN0aXZlX3ZpZXdwb3J0LmR2TWluWiAhPSAwLjApIHx8Ci0JKGQzZF9kZXYtPmFjdGl2ZV92aWV3cG9ydC5kdk1heFogIT0gMS4wKSkgewotCWdsRGVwdGhSYW5nZSgwLjAsIDEuMCk7Ci0Jb3B0X2JpdG1hcCB8PSBERVBUSF9SQU5HRV9CSVQ7Ci0gICAgfQotICAgIGlmICgoZDNkX2Rldi0+YWN0aXZlX3ZpZXdwb3J0LmR3WCAhPSAwKSB8fAotCShkM2RfZGV2LT5hY3RpdmVfdmlld3BvcnQuZHdZICE9IDApIHx8Ci0JKGQzZF9kZXYtPmFjdGl2ZV92aWV3cG9ydC5kd1dpZHRoICE9IGQzZF9kZXYtPnN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd1dpZHRoKSB8fAotCShkM2RfZGV2LT5hY3RpdmVfdmlld3BvcnQuZHdIZWlnaHQgIT0gZDNkX2Rldi0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0KSkgewotCWdsVmlld3BvcnQoMCwgMCwgZDNkX2Rldi0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3V2lkdGgsIGQzZF9kZXYtPnN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCk7Ci0Jb3B0X2JpdG1hcCB8PSBWSUVXUE9SVF9CSVQ7Ci0gICAgfQotICAgIGdsU2Npc3NvcihwUmVjdC0+bGVmdCwgZDNkX2Rldi0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0IC0gcFJlY3QtPmJvdHRvbSwKLQkgICAgICBwUmVjdC0+cmlnaHQgLSBwUmVjdC0+bGVmdCwgcFJlY3QtPmJvdHRvbSAtIHBSZWN0LT50b3ApOwotICAgIGlmIChnbF9kM2RfZGV2LT5saWdodGluZyAhPSBGQUxTRSkgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKLSAgICBpZiAoZ2xfZDNkX2Rldi0+Y3VsbF9mYWNlICE9IEZBTFNFKSBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKLSAgICBpZiAodXNlX2FscGhhKSB7Ci0JaWYgKGdsX2QzZF9kZXYtPmFscGhhX3Rlc3QgPT0gRkFMU0UpIGdsRW5hYmxlKEdMX0FMUEhBX1RFU1QpOwotCWlmICgoZ2xfZDNkX2Rldi0+Y3VycmVudF9hbHBoYV90ZXN0X2Z1bmMgIT0gR0xfTk9URVFVQUwpIHx8IChnbF9kM2RfZGV2LT5jdXJyZW50X2FscGhhX3Rlc3RfcmVmICE9IDAuMCkpCi0JICAgIGdsQWxwaGFGdW5jKEdMX05PVEVRVUFMLCAwLjApOwotICAgIH0gZWxzZSB7Ci0JaWYgKGdsX2QzZF9kZXYtPmFscGhhX3Rlc3QgIT0gRkFMU0UpIGdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKLSAgICB9Ci0gICAgaWYgKGdsX2QzZF9kZXYtPnN0ZW5jaWxfdGVzdCAhPSBGQUxTRSkgZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCk7Ci0gICAgaWYgKGdsX2QzZF9kZXYtPmJsZW5kaW5nICE9IEZBTFNFKSBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIGlmIChnbF9kM2RfZGV2LT5mb2dnaW5nICE9IEZBTFNFKSBnbERpc2FibGUoR0xfRk9HKTsKLSAgICBpZiAoZ2xfZDNkX2Rldi0+Y3VycmVudF90ZXhfZW52ICE9IEdMX1JFUExBQ0UpCi0JZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAKLSAgICByZXR1cm4gb3B0X2JpdG1hcDsKLX0KLQotc3RhdGljIHZvaWQgZDNkZGV2aWNlX3Jlc3RvcmVfc3RhdGVfYWZ0ZXJfZmx1c2goSURpcmVjdDNERGV2aWNlSW1wbCAqZDNkX2RldiwgRFdPUkQgb3B0X2JpdG1hcCwgQk9PTEVBTiB1c2VfYWxwaGEpIHsKLSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwqIGdsX2QzZF9kZXYgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsKikgZDNkX2RldjsKLQotICAgIC8qIEFuZCByZXN0b3JlIGFsbCB0aGUgdmFyaW91cyBzdGF0ZXMgbW9kaWZpZWQgYnkgdGhpcyBjb2RlICovCi0gICAgaWYgKGdsX2QzZF9kZXYtPmRlcHRoX3Rlc3QgIT0gMCkgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgaWYgKGdsX2QzZF9kZXYtPmxpZ2h0aW5nICE9IDApIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKLSAgICBpZiAoKGdsX2QzZF9kZXYtPmFscGhhX3Rlc3QgIT0gMCkgJiYgKHVzZV9hbHBoYSA9PSAwKSkKLQlnbEVuYWJsZShHTF9BTFBIQV9URVNUKTsKLSAgICBlbHNlIGlmICgoZ2xfZDNkX2Rldi0+YWxwaGFfdGVzdCA9PSAwKSAmJiAodXNlX2FscGhhICE9IDApKQotCWdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKLSAgICBpZiAodXNlX2FscGhhKSB7Ci0JaWYgKChnbF9kM2RfZGV2LT5jdXJyZW50X2FscGhhX3Rlc3RfZnVuYyAhPSBHTF9OT1RFUVVBTCkgfHwgKGdsX2QzZF9kZXYtPmN1cnJlbnRfYWxwaGFfdGVzdF9yZWYgIT0gMC4wKSkKLQkgICAgZ2xBbHBoYUZ1bmMoZ2xfZDNkX2Rldi0+Y3VycmVudF9hbHBoYV90ZXN0X2Z1bmMsIGdsX2QzZF9kZXYtPmN1cnJlbnRfYWxwaGFfdGVzdF9yZWYpOwotICAgIH0KLSAgICBpZiAoZ2xfZDNkX2Rldi0+c3RlbmNpbF90ZXN0ICE9IDApIGdsRW5hYmxlKEdMX1NURU5DSUxfVEVTVCk7Ci0gICAgaWYgKGdsX2QzZF9kZXYtPmN1bGxfZmFjZSAhPSAwKSBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOwotICAgIGlmIChnbF9kM2RfZGV2LT5ibGVuZGluZyAhPSAwKSBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgaWYgKGdsX2QzZF9kZXYtPmZvZ2dpbmcgIT0gMCkgZ2xFbmFibGUoR0xfRk9HKTsKLSAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBpZiAob3B0X2JpdG1hcCAmIERFUFRIX1JBTkdFX0JJVCkgewotCWdsRGVwdGhSYW5nZShkM2RfZGV2LT5hY3RpdmVfdmlld3BvcnQuZHZNaW5aLCBkM2RfZGV2LT5hY3RpdmVfdmlld3BvcnQuZHZNYXhaKTsKLSAgICB9Ci0gICAgaWYgKG9wdF9iaXRtYXAgJiBWSUVXUE9SVF9CSVQpIHsKLQlnbFZpZXdwb3J0KGQzZF9kZXYtPmFjdGl2ZV92aWV3cG9ydC5kd1gsCi0JCSAgIGQzZF9kZXYtPnN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCAtIChkM2RfZGV2LT5hY3RpdmVfdmlld3BvcnQuZHdIZWlnaHQgKyBkM2RfZGV2LT5hY3RpdmVfdmlld3BvcnQuZHdZKSwKLQkJICAgZDNkX2Rldi0+YWN0aXZlX3ZpZXdwb3J0LmR3V2lkdGgsIGQzZF9kZXYtPmFjdGl2ZV92aWV3cG9ydC5kd0hlaWdodCk7Ci0gICAgfQotICAgIGlmIChkM2RfZGV2LT50ZXhfbWF0X2lzX2lkZW50aXR5WzBdID09IEZBTFNFKSB7Ci0JZDNkX2Rldi0+bWF0cmljZXNfdXBkYXRlZChkM2RfZGV2LCBURVhNQVQwX0NIQU5HRUQpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ2xfZDNkX2Rldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgIT0gR0xfVEVYVFVSRTBfV0lORSkgewotCUdMX2V4dGVuc2lvbnMuZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwX1dJTkUpOwotCWdsX2QzZF9kZXYtPmN1cnJlbnRfYWN0aXZlX3RleF91bml0ID0gR0xfVEVYVFVSRTBfV0lORTsKLSAgICB9Ci0gICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBnbF9kM2RfZGV2LT5jdXJyZW50X3RleF9lbnYpOwotICAgIC8qIE5vdGUgdGhhdCBoZXJlIHdlIGNvdWxkIGRpcmVjdGx5IHJlLWJpbmQgdGhlIHByZXZpb3VzIHRleHR1cmUuLi4gQnV0IGl0IHdvdWxkIGluIHNvbWUgY2FzZSBiZSBhIHNwdXJpb3VzCi0gICAgICAgYmluZCBpZiBldmVyIHRoZSBnYW1lIGNoYW5nZXMgdGhlIHRleHR1cmUganVzdCBhZnRlci4KLQotICAgICAgIFNvIGNob29zZSAweDAwMDAwMDAxIHRvIHBvc3Rwb25lIHRoZSBiaW5kaW5nIHRvIHRoZSBuZXh0IHRpbWUgd2UgZHJhdyBzb21ldGhpbmcgb24gc2NyZWVuLiAqLwotICAgIGdsX2QzZF9kZXYtPmN1cnJlbnRfYm91bmRfdGV4dHVyZVswXSA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopIDB4MDAwMDAwMDE7Ci0gICAgaWYgKGQzZF9kZXYtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbMF1bRDNEVFNTX0NPTE9ST1AgLSAxXSA9PSBEM0RUT1BfRElTQUJMRSkgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotCi0gICAgLyogQW5kIHJlLWVuYWJsZWQgaWYgbmVlZGVkIHRleHR1cmUgbGV2ZWwgMSAqLwotICAgIGlmICgoZ2xfZDNkX2Rldi0+Y3VycmVudF9ib3VuZF90ZXh0dXJlWzFdICE9IE5VTEwpICYmCi0JKGQzZF9kZXYtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbMV1bRDNEVFNTX0NPTE9ST1AgLSAxXSAhPSBEM0RUT1BfRElTQUJMRSkpIHsKLQlpZiAoZ2xfZDNkX2Rldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgIT0gR0xfVEVYVFVSRTFfV0lORSkgewotCSAgICBHTF9leHRlbnNpb25zLmdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMV9XSU5FKTsKLQkgICAgZ2xfZDNkX2Rldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSBHTF9URVhUVVJFMV9XSU5FOwotCX0KLQlnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICB9Ci19Ci0KLS8qIHJldHJpZXZlIHRoZSBYIGRyYXdhYmxlIHRvIHVzZSBvbiBhIGdpdmVuIERDICovCi1pbmxpbmUgc3RhdGljIERyYXdhYmxlIGdldF9kcmF3YWJsZSggSERDIGhkYyApCi17Ci0gICAgRHJhd2FibGUgZHJhd2FibGU7Ci0gICAgZW51bSB4MTFkcnZfZXNjYXBlX2NvZGVzIGVzY2FwZSA9IFgxMURSVl9HRVRfRFJBV0FCTEU7Ci0KLSAgICBpZiAoIUV4dEVzY2FwZSggaGRjLCBYMTFEUlZfRVNDQVBFLCBzaXplb2YoZXNjYXBlKSwgKExQQ1NUUikmZXNjYXBlLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHJhd2FibGUpLCAoTFBTVFIpJmRyYXdhYmxlICkpIGRyYXdhYmxlID0gMDsKLQotICAgIHJldHVybiBkcmF3YWJsZTsKLX0KLQotc3RhdGljIEJPT0wgb3BlbmdsX2ZsaXAoIExQVk9JRCBkZXYsIExQVk9JRCBkcmF3YWJsZSkKLXsKLSAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2RfZGV2ID0gKElEaXJlY3QzRERldmljZUltcGwgKikgZGV2OwotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCAqZ2xfZDNkX2RldiA9IChJRGlyZWN0M0REZXZpY2VHTEltcGwgKikgZGV2OwotCi0gICAgVFJBQ0UoIiglcCwgJWxkKVxuIiwgZ2xfZDNkX2Rldi0+ZGlzcGxheSwoRHJhd2FibGUpZHJhd2FibGUpOwotICAgIEVOVEVSX0dMKCk7Ci0gICAgaWYgKGdsX2QzZF9kZXYtPnN0YXRlW1dJTkVfR0xfQlVGRkVSX0JBQ0tdID09IFNVUkZBQ0VfTUVNT1JZX0RJUlRZKSB7Ci0gICAgICAgIGQzZF9kZXYtPmZsdXNoX3RvX2ZyYW1lYnVmZmVyKGQzZF9kZXYsICYoZ2xfZDNkX2Rldi0+bG9ja19yZWN0W1dJTkVfR0xfQlVGRkVSX0JBQ0tdKSwgZ2xfZDNkX2Rldi0+bG9ja19zdXJmW1dJTkVfR0xfQlVGRkVSX0JBQ0tdKTsKLSAgICB9Ci0gICAgZ2xfZDNkX2Rldi0+c3RhdGVbV0lORV9HTF9CVUZGRVJfQkFDS10gPSBTVVJGQUNFX0dMOwotICAgIGdsX2QzZF9kZXYtPnN0YXRlW1dJTkVfR0xfQlVGRkVSX0ZST05UXSA9IFNVUkZBQ0VfR0w7Ci0gICAgZ2xYU3dhcEJ1ZmZlcnMoZ2xfZDNkX2Rldi0+ZGlzcGxheSwgKERyYXdhYmxlKWRyYXdhYmxlKTsKLSAgICBMRUFWRV9HTCgpOwotICAgIAotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlPcGVuR0wgc3RhdGljIGZ1bmN0aW9ucwotICovCi1zdGF0aWMgdm9pZCBzZXRfY29udGV4dChJRGlyZWN0M0REZXZpY2VJbXBsKiBUaGlzKQotewotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCogZ2xUaGlzID0gKElEaXJlY3QzRERldmljZUdMSW1wbCopIFRoaXM7Ci0gICAKLSAgICBUUkFDRSgiZ2x4TWFrZUN1cnJlbnQgJXAsICVsZCwgJXBcbiIsZ2xUaGlzLT5kaXNwbGF5LGdsVGhpcy0+ZHJhd2FibGUsIGdsVGhpcy0+Z2xfY29udGV4dCk7Ci0gICAgRU5URVJfR0woKTsKLSAgICBpZiAoZ2xYTWFrZUN1cnJlbnQoZ2xUaGlzLT5kaXNwbGF5LCBnbFRoaXMtPmRyYXdhYmxlLCBnbFRoaXMtPmdsX2NvbnRleHQpID09IEZhbHNlKSB7Ci0JRVJSKCJFcnJvciBpbiBzZXR0aW5nIGN1cnJlbnQgY29udGV4dCAoY29udGV4dCAlcCBkcmF3YWJsZSAlbGQpIVxuIiwKLQkgICAgZ2xUaGlzLT5nbF9jb250ZXh0LCBnbFRoaXMtPmRyYXdhYmxlKTsKLSAgICB9Ci0gICAgTEVBVkVfR0woKTsKLX0KLQotc3RhdGljIHZvaWQgZmlsbF9vcGVuZ2xfY2FwcyhEM0RERVZJQ0VERVNDICpkMSkKLXsKLSAgICBkMS0+ZHdTaXplICA9IHNpemVvZigqZDEpOwotICAgIGQxLT5kd0ZsYWdzID0gRDNERERfQ09MT1JNT0RFTCB8IEQzREREX0RFVkNBUFMgfCBEM0RERF9UUkFOU0ZPUk1DQVBTIHwgRDNERERfQkNMSVBQSU5HIHwgRDNERERfTElHSFRJTkdDQVBTIHwKLQlEM0RERF9MSU5FQ0FQUyB8IEQzREREX1RSSUNBUFMgfCBEM0RERF9ERVZJQ0VSRU5ERVJCSVRERVBUSCB8IEQzREREX0RFVklDRVpCVUZGRVJCSVRERVBUSCB8Ci0JRDNERERfTUFYQlVGRkVSU0laRSB8IEQzREREX01BWFZFUlRFWENPVU5UOwotICAgIGQxLT5kY21Db2xvck1vZGVsID0gRDNEQ09MT1JfUkdCOwotICAgIGQxLT5kd0RldkNhcHMgPSBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdEZXZDYXBzOwotICAgIGQxLT5kdGNUcmFuc2Zvcm1DYXBzLmR3U2l6ZSA9IHNpemVvZihEM0RUUkFOU0ZPUk1DQVBTKTsKLSAgICBkMS0+ZHRjVHJhbnNmb3JtQ2Fwcy5kd0NhcHMgPSBEM0RUUkFOU0ZPUk1DQVBTX0NMSVA7Ci0gICAgZDEtPmJDbGlwcGluZyA9IFRSVUU7Ci0gICAgZDEtPmRsY0xpZ2h0aW5nQ2Fwcy5kd1NpemUgPSBzaXplb2YoRDNETElHSFRJTkdDQVBTKTsKLSAgICBkMS0+ZGxjTGlnaHRpbmdDYXBzLmR3Q2FwcyA9IEQzRExJR0hUQ0FQU19ESVJFQ1RJT05BTCB8IEQzRExJR0hUQ0FQU19QQVJBTExFTFBPSU5UIHwgRDNETElHSFRDQVBTX1BPSU5UIHwgRDNETElHSFRDQVBTX1NQT1Q7Ci0gICAgZDEtPmRsY0xpZ2h0aW5nQ2Fwcy5kd0xpZ2h0aW5nTW9kZWwgPSBEM0RMSUdIVElOR01PREVMX1JHQjsKLSAgICBkMS0+ZGxjTGlnaHRpbmdDYXBzLmR3TnVtTGlnaHRzID0gb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4QWN0aXZlTGlnaHRzOwotICAgIGQxLT5kcGNMaW5lQ2FwcyA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kcGNMaW5lQ2FwczsKLSAgICBkMS0+ZHBjVHJpQ2FwcyA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kcGNUcmlDYXBzOwotICAgIGQxLT5kd0RldmljZVJlbmRlckJpdERlcHRoICA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd0RldmljZVJlbmRlckJpdERlcHRoOwotICAgIGQxLT5kd0RldmljZVpCdWZmZXJCaXREZXB0aCA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd0RldmljZVpCdWZmZXJCaXREZXB0aDsKLSAgICBkMS0+ZHdNYXhCdWZmZXJTaXplID0gMDsKLSAgICBkMS0+ZHdNYXhWZXJ0ZXhDb3VudCA9IDY1NTM2OwotICAgIGQxLT5kd01pblRleHR1cmVXaWR0aCAgPSBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdNaW5UZXh0dXJlV2lkdGg7Ci0gICAgZDEtPmR3TWluVGV4dHVyZUhlaWdodCA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd01pblRleHR1cmVIZWlnaHQ7Ci0gICAgZDEtPmR3TWF4VGV4dHVyZVdpZHRoICA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd01heFRleHR1cmVXaWR0aDsKLSAgICBkMS0+ZHdNYXhUZXh0dXJlSGVpZ2h0ID0gb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4VGV4dHVyZUhlaWdodDsKLSAgICBkMS0+ZHdNaW5TdGlwcGxlV2lkdGggID0gMTsKLSAgICBkMS0+ZHdNaW5TdGlwcGxlSGVpZ2h0ID0gMTsKLSAgICBkMS0+ZHdNYXhTdGlwcGxlV2lkdGggID0gMzI7Ci0gICAgZDEtPmR3TWF4U3RpcHBsZUhlaWdodCA9IDMyOwotICAgIGQxLT5kd01heFRleHR1cmVSZXBlYXQgPSBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdNYXhUZXh0dXJlUmVwZWF0OwotICAgIGQxLT5kd01heFRleHR1cmVBc3BlY3RSYXRpbyA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd01heFRleHR1cmVBc3BlY3RSYXRpbzsKLSAgICBkMS0+ZHdNYXhBbmlzb3Ryb3B5ID0gb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4QW5pc290cm9weTsKLSAgICBkMS0+ZHZHdWFyZEJhbmRMZWZ0ID0gb3BlbmdsX2RldmljZV9jYXBzLmR2R3VhcmRCYW5kTGVmdDsKLSAgICBkMS0+ZHZHdWFyZEJhbmRSaWdodCA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kdkd1YXJkQmFuZFJpZ2h0OwotICAgIGQxLT5kdkd1YXJkQmFuZFRvcCA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kdkd1YXJkQmFuZFRvcDsKLSAgICBkMS0+ZHZHdWFyZEJhbmRCb3R0b20gPSBvcGVuZ2xfZGV2aWNlX2NhcHMuZHZHdWFyZEJhbmRCb3R0b207Ci0gICAgZDEtPmR2RXh0ZW50c0FkanVzdCA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kdkV4dGVudHNBZGp1c3Q7Ci0gICAgZDEtPmR3U3RlbmNpbENhcHMgPSBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdTdGVuY2lsQ2FwczsKLSAgICBkMS0+ZHdGVkZDYXBzID0gb3BlbmdsX2RldmljZV9jYXBzLmR3RlZGQ2FwczsKLSAgICBkMS0+ZHdUZXh0dXJlT3BDYXBzID0gb3BlbmdsX2RldmljZV9jYXBzLmR3VGV4dHVyZU9wQ2FwczsKLSAgICBkMS0+d01heFRleHR1cmVCbGVuZFN0YWdlcyA9IG9wZW5nbF9kZXZpY2VfY2Fwcy53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzOwotICAgIGQxLT53TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSBvcGVuZ2xfZGV2aWNlX2NhcHMud01heFNpbXVsdGFuZW91c1RleHR1cmVzOwotfQotCi1zdGF0aWMgdm9pZCBmaWxsX29wZW5nbF9jYXBzXzcoRDNEREVWSUNFREVTQzcgKmQpCi17Ci0gICAgKmQgPSBvcGVuZ2xfZGV2aWNlX2NhcHM7Ci19Ci0KLUhSRVNVTFQgZDNkZGV2aWNlX2VudW1lcmF0ZShMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgY2IsIExQVk9JRCBjb250ZXh0LCBEV09SRCB2ZXJzaW9uKQotewotICAgIEQzRERFVklDRURFU0MgZHJlZiwgZDEsIGQyOwotICAgIEhSRVNVTFQgcmV0X3ZhbHVlOwotCi0gICAgLyogU29tZSBnYW1lcyAoTW90b3JhY2VyIDIgZGVtbykgaGF2ZSB0aGUgYmFkIGlkZWEgdG8gbW9kaWZ5IHRoZSBkZXZpY2UgbmFtZSBzdHJpbmcuCi0gICAgICAgTGV0J3MgcHV0IHRoZSBzdHJpbmcgaW4gYSBzdWZmaWNpZW50bHkgc2l6ZWQgYXJyYXkgaW4gd3JpdGFibGUgbWVtb3J5LiAqLwotICAgIGNoYXIgZGV2aWNlX25hbWVbNTBdOwotICAgIHN0cmNweShkZXZpY2VfbmFtZSwiZGlyZWN0M2QiKTsKLQotICAgIGZpbGxfb3BlbmdsX2NhcHMoJmRyZWYpOwotCi0gICAgaWYgKHZlcnNpb24gPiAxKSB7Ci0gICAgICAgIC8qIEl0IHNlZW1zIHRoYXQgZW51bWVyYXRpbmcgdGhlIHJlZmVyZW5jZSBJSUQgb24gRGlyZWN0M0QgMSBnYW1lcyAoQXZQIC8gTW90b3JhY2VyMikgYnJlYWtzIHRoZW0gKi8KLQljaGFyIGludGVyZmFjZV9uYW1lW10gPSAiV0lORSBSZWZlcmVuY2UgRGlyZWN0M0RYIHVzaW5nIE9wZW5HTCI7Ci0gICAgICAgIFRSQUNFKCIgZW51bWVyYXRpbmcgT3BlbkdMIEQzRERldmljZSBpbnRlcmZhY2UgdXNpbmcgcmVmZXJlbmNlIElJRCAoSUlEICVzKS5cbiIsIGRlYnVnc3RyX2d1aWQoJklJRF9JRGlyZWN0M0RSZWZEZXZpY2UpKTsKLQlkMSA9IGRyZWY7Ci0JZDIgPSBkcmVmOwotCXJldF92YWx1ZSA9IGNiKChMUElJRCkgJklJRF9JRGlyZWN0M0RSZWZEZXZpY2UsIGludGVyZmFjZV9uYW1lLCBkZXZpY2VfbmFtZSwgJmQxLCAmZDIsIGNvbnRleHQpOwotCWlmIChyZXRfdmFsdWUgIT0gRDNERU5VTVJFVF9PSykKLQkgICAgcmV0dXJuIHJldF92YWx1ZTsKLSAgICB9Ci0KLSAgICB7Ci0JY2hhciBpbnRlcmZhY2VfbmFtZVtdID0gIldJTkUgRGlyZWN0M0RYIHVzaW5nIE9wZW5HTCI7Ci0JVFJBQ0UoIiBlbnVtZXJhdGluZyBPcGVuR0wgRDNERGV2aWNlIGludGVyZmFjZSAoSUlEICVzKS5cbiIsIGRlYnVnc3RyX2d1aWQoJklJRF9EM0RERVZJQ0VfT3BlbkdMKSk7Ci0JZDEgPSBkcmVmOwotCWQyID0gZHJlZjsKLQlyZXRfdmFsdWUgPSBjYigoTFBJSUQpICZJSURfRDNEREVWSUNFX09wZW5HTCwgaW50ZXJmYWNlX25hbWUsIGRldmljZV9uYW1lLCAmZDEsICZkMiwgY29udGV4dCk7Ci0JaWYgKHJldF92YWx1ZSAhPSBEM0RFTlVNUkVUX09LKQotCSAgICByZXR1cm4gcmV0X3ZhbHVlOwotICAgIH0KLQotICAgIHJldHVybiBEM0RFTlVNUkVUX09LOwotfQotCi1IUkVTVUxUIGQzZGRldmljZV9lbnVtZXJhdGU3KExQRDNERU5VTURFVklDRVNDQUxMQkFDSzcgY2IsIExQVk9JRCBjb250ZXh0KQotewotICAgIEQzRERFVklDRURFU0M3IGRkZXNjOwotICAgIGNoYXIgaW50ZXJmYWNlX25hbWVbXSA9ICJXSU5FIERpcmVjdDNENyB1c2luZyBPcGVuR0wiOwotICAgIGNoYXIgZGV2aWNlX25hbWVbXSA9ICJXaW5lIEQzRDcgZGV2aWNlIjsKLQotICAgIGZpbGxfb3BlbmdsX2NhcHNfNygmZGRlc2MpOwotICAgIAotICAgIFRSQUNFKCIgZW51bWVyYXRpbmcgT3BlbkdMIEQzRERldmljZTcgaW50ZXJmYWNlLlxuIik7Ci0gICAgCi0gICAgcmV0dXJuIGNiKGludGVyZmFjZV9uYW1lLCBkZXZpY2VfbmFtZSwgJmRkZXNjLCBjb250ZXh0KTsKLX0KLQotc3RhdGljIFVMT05HIFdJTkFQSQotR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX1JlbGVhc2UoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCAqZ2xUaGlzID0gKElEaXJlY3QzRERldmljZUdMSW1wbCAqKSBUaGlzOwotICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBpZmFjZSwgcmVmICsgMSk7Ci0KLSAgICBpZiAoIXJlZikgewotICAgICAgICBpbnQgaTsKLQlJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmYWNlID0gVGhpcy0+c3VyZmFjZSwgKnN1cmY7Ci0JCi0JLyogUmVsZWFzZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlICovIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfVEVYVFVSRVM7IGkrKykgewotCSAgICBpZiAoVGhpcy0+Y3VycmVudF90ZXh0dXJlW2ldICE9IE5VTEwpCi0JICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+Y3VycmVudF90ZXh0dXJlW2ldLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Ci0JICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnRleF9tYXRbaV0pOwotCX0KLQotCS8qIExvb2sgZm9yIHRoZSBmcm9udCBidWZmZXIgYW5kIG92ZXJyaWRlIGl0cyBzdXJmYWNlJ3MgRmxpcCBtZXRob2QgKGlmIGluIGRvdWJsZSBidWZmZXJpbmcpICovCi0JZm9yIChzdXJmID0gc3VyZmFjZTsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+c3VyZmFjZV9vd25lcikgewotCSAgICBpZiAoKHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyYoRERTQ0FQU19GTElQfEREU0NBUFNfRlJPTlRCVUZGRVIpKSA9PSAoRERTQ0FQU19GTElQfEREU0NBUFNfRlJPTlRCVUZGRVIpKSB7Ci0JICAgICAgICBzdXJmLT5hdXhfY3R4ICA9IE5VTEw7Ci0JCXN1cmYtPmF1eF9kYXRhID0gTlVMTDsKLQkJc3VyZi0+YXV4X2ZsaXAgPSBOVUxMOwotCQlicmVhazsKLQkgICAgfQotCX0KLQlmb3IgKHN1cmYgPSBzdXJmYWNlOyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5zdXJmYWNlX293bmVyKSB7Ci0JICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYyOwotCSAgICBmb3IgKHN1cmYyID0gc3VyZjsgc3VyZjItPnByZXZfYXR0YWNoZWQgIT0gTlVMTDsgc3VyZjIgPSBzdXJmMi0+cHJldl9hdHRhY2hlZCkgOwotCSAgICBmb3IgKDsgc3VyZjIgIT0gTlVMTDsgc3VyZjIgPSBzdXJmMi0+bmV4dF9hdHRhY2hlZCkgewotCSAgICAgICAgaWYgKCgoc3VyZjItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTXzNEREVWSUNFKSkgPT0gKEREU0NBUFNfM0RERVZJQ0UpKSAmJgotCQkgICAgKChzdXJmMi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfWkJVRkZFUikpICE9IChERFNDQVBTX1pCVUZGRVIpKSkgewotCQkgICAgLyogT3ZlcnJpZGUgdGhlIExvY2sgLyBVbmxvY2sgZnVuY3Rpb24gZm9yIGFsbCB0aGVzZSBzdXJmYWNlcyAqLwotCQkgICAgc3VyZjItPmxvY2tfdXBkYXRlID0gc3VyZjItPmxvY2tfdXBkYXRlX3ByZXY7Ci0JCSAgICBzdXJmMi0+dW5sb2NrX3VwZGF0ZSA9IHN1cmYyLT51bmxvY2tfdXBkYXRlX3ByZXY7Ci0JCSAgICAvKiBBbmQgaW5zdGFsbCBhbHNvIHRoZSBibHQgLyBibHRmYXN0IG92ZXJyaWRlcyAqLwotCQkgICAgc3VyZjItPmF1eF9ibHQgPSBOVUxMOwotCQkgICAgc3VyZjItPmF1eF9ibHRmYXN0ID0gTlVMTDsKLQkJfQotCQlzdXJmMi0+ZDNkZGV2aWNlID0gTlVMTDsKLQkgICAgfQotCX0KLQkKLQkvKiBBbmQgd2FybiB0aGUgRDNEIG9iamVjdCB0aGF0IHRoaXMgZGV2aWNlIGlzIG5vIGxvbmdlciBhY3RpdmUuLi4gKi8KLQlUaGlzLT5kM2QtPmQzZF9yZW1vdmVkX2RldmljZShUaGlzLT5kM2QsIFRoaXMpOwotCi0gICAgICAgIC8qIEZyZWUgbGlnaHQgYXJyYXlzICovCi0gICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPmxpZ2h0X3BhcmFtZXRlcnMpOwotICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5hY3RpdmVfbGlnaHRzKTsKLQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPndvcmxkX21hdCk7Ci0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dmlld19tYXQpOwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnByb2pfbWF0KTsKLQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGdsVGhpcy0+c3VyZmFjZV9wdHIpOwotCi0JRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCYoVGhpcy0+Y3JpdCkpOwotCQotCUVOVEVSX0dMKCk7Ci0JaWYgKGdsVGhpcy0+dW5sb2NrX3RleCkKLQkgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmKGdsVGhpcy0+dW5sb2NrX3RleCkpOwotCWdsWERlc3Ryb3lDb250ZXh0KGdsVGhpcy0+ZGlzcGxheSwgZ2xUaGlzLT5nbF9jb250ZXh0KTsKLQlMRUFWRV9HTCgpOwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPmNsaXBwaW5nX3BsYW5lcyk7Ci0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dmVydGV4X2J1ZmZlcik7Ci0KLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZjsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfM18yVF8xVF9HZXRDYXBzKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotCQkJCSAgICAgICBMUEQzRERFVklDRURFU0MgbHBEM0RIV0RldkRlc2MsCi0JCQkJICAgICAgIExQRDNEREVWSUNFREVTQyBscEQzREhFTERldkRlc2MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwotICAgIEQzRERFVklDRURFU0MgZGVzYzsKLSAgICBEV09SRCBkd1NpemU7Ci0KLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRDNESFdEZXZEZXNjLCBscEQzREhFTERldkRlc2MpOwotCi0gICAgZmlsbF9vcGVuZ2xfY2FwcygmZGVzYyk7Ci0gICAgZHdTaXplID0gbHBEM0RIV0RldkRlc2MtPmR3U2l6ZTsKLSAgICBtZW1zZXQobHBEM0RIV0RldkRlc2MsIDAsIGR3U2l6ZSk7Ci0gICAgbWVtY3B5KGxwRDNESFdEZXZEZXNjLCAmZGVzYywgKGR3U2l6ZSA8PSBkZXNjLmR3U2l6ZSA/IGR3U2l6ZSA6IGRlc2MuZHdTaXplKSk7Ci0KLSAgICBkd1NpemUgPSBscEQzREhFTERldkRlc2MtPmR3U2l6ZTsKLSAgICBtZW1zZXQobHBEM0RIRUxEZXZEZXNjLCAwLCBkd1NpemUpOwotICAgIG1lbWNweShscEQzREhFTERldkRlc2MsICZkZXNjLCAoZHdTaXplIDw9IGRlc2MuZHdTaXplID8gZHdTaXplIDogZGVzYy5kd1NpemUpKTsKLQotICAgIFRSQUNFKCIgcmV0dXJuaW5nIGNhcHMgOiAobm8gZHVtcCBmdW5jdGlvbiB5ZXQpXG4iKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIEhSRVNVTFQgZW51bV90ZXh0dXJlX2Zvcm1hdF9PcGVuR0woTFBEM0RFTlVNVEVYVFVSRUZPUk1BVFNDQUxMQkFDSyBjYl8xLAotCQkJCQkgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGNiXzIsCi0JCQkJCSAgTFBWT0lEIGNvbnRleHQsIGludCB2ZXJzaW9uKQotewotICAgIEREU1VSRkFDRURFU0Mgc2Rlc2M7Ci0gICAgTFBERFBJWEVMRk9STUFUIHBmb3JtYXQ7Ci0KLSAgICAvKiBEbyB0aGUgdGV4dHVyZSBlbnVtZXJhdGlvbiAqLwotICAgIHNkZXNjLmR3U2l6ZSA9IHNpemVvZihERFNVUkZBQ0VERVNDKTsKLSAgICBzZGVzYy5kd0ZsYWdzID0gRERTRF9QSVhFTEZPUk1BVCB8IEREU0RfQ0FQUzsKLSAgICBzZGVzYy5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfVEVYVFVSRTsKLSAgICBwZm9ybWF0ID0gJihzZGVzYy5kZHBmUGl4ZWxGb3JtYXQpOwotICAgIHBmb3JtYXQtPmR3U2l6ZSA9IHNpemVvZihERFBJWEVMRk9STUFUKTsKLSAgICBwZm9ybWF0LT5kd0ZvdXJDQyA9IDA7Ci0KLSAgICBUUkFDRSgiRW51bWVyYXRpbmcgR0xfUkdCQSB1bnBhY2tlZCAoMzIpXG4iKTsKLSAgICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwotICAgIHBmb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAzMjsKLSAgICBwZm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gICAgICAgIDB4MDBGRjAwMDA7Ci0gICAgcGZvcm1hdC0+dTMuZHdHQml0TWFzayA9ICAgICAgICAweDAwMDBGRjAwOwotICAgIHBmb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAgICAgICAgMHgwMDAwMDBGRjsKLSAgICBwZm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4RkYwMDAwMDA7Ci0gICAgaWYgKGNiXzEpIGlmIChjYl8xKCZzZGVzYyAsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLSAgICBpZiAoY2JfMikgaWYgKGNiXzIocGZvcm1hdCwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotCi0gICAgVFJBQ0UoIkVudW1lcmF0aW5nIEdMX1JHQiB1bnBhY2tlZCAoMzIpXG4iKTsKLSAgICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7Ci0gICAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDMyOwotICAgIHBmb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAgICAgICAgMHgwMEZGMDAwMDsKLSAgICBwZm9ybWF0LT51My5kd0dCaXRNYXNrID0gICAgICAgIDB4MDAwMEZGMDA7Ci0gICAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDAwMEZGOwotICAgIHBmb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDAwMDsKLSAgICBpZiAoY2JfMSkgaWYgKGNiXzEoJnNkZXNjICwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotICAgIGlmIChjYl8yKSBpZiAoY2JfMihwZm9ybWF0LCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgCi0gICAgVFJBQ0UoIkVudW1lcmF0aW5nIEdMX1JHQiB1bnBhY2tlZCAoMjQpXG4iKTsKLSAgICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7Ci0gICAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDI0OwotICAgIHBmb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwRkYwMDAwOwotICAgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBGRjAwOwotICAgIHBmb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMEZGOwotICAgIHBmb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDAwMDsKLSAgICBpZiAoY2JfMSkgaWYgKGNiXzEoJnNkZXNjICwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotICAgIGlmIChjYl8yKSBpZiAoY2JfMihwZm9ybWF0LCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0KLSAgICAvKiBOb3RlIDogZXZlbiBpZiB0aGlzIGlzIGFuICdlbXVsYXRlZCcgdGV4dHVyZSBmb3JtYXQsIGl0IG5lZWRzIHRvIGJlIGZpcnN0Ci0gICAgICAgICAgICAgIGFzIHNvbWUgZHVtYiBhcHBsaWNhdGlvbnMgc2VlbSB0byByZWx5IG9uIHRoYXQuICovCi0gICAgVFJBQ0UoIkVudW1lcmF0aW5nIEdMX1JHQkEgcGFja2VkIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzUgKEFSR0IpICgxNilcbiIpOwotICAgIHBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQiB8IEREUEZfQUxQSEFQSVhFTFM7Ci0gICAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwotICAgIHBmb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAgICAgICAgMHgwMDAwN0MwMDsKLSAgICBwZm9ybWF0LT51My5kd0dCaXRNYXNrID0gICAgICAgIDB4MDAwMDAzRTA7Ci0gICAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDAwMDFGOwotICAgIHBmb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwODAwMDsKLSAgICBpZiAoY2JfMSkgaWYgKGNiXzEoJnNkZXNjICwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotICAgIGlmIChjYl8yKSBpZiAoY2JfMihwZm9ybWF0LCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0KLSAgICBUUkFDRSgiRW51bWVyYXRpbmcgR0xfUkdCQSBwYWNrZWQgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAoQVJHQikgKDE2KVxuIik7Ci0gICAgcGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKLSAgICBwZm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7Ci0gICAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9ICAgICAgICAweDAwMDAwRjAwOwotICAgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAgICAgICAgMHgwMDAwMDBGMDsKLSAgICBwZm9ybWF0LT51NC5kd0JCaXRNYXNrID0gICAgICAgIDB4MDAwMDAwMEY7Ci0gICAgcGZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDBGMDAwOwotICAgIGlmIChjYl8xKSBpZiAoY2JfMSgmc2Rlc2MgLCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgaWYgKGNiXzIpIGlmIChjYl8yKHBmb3JtYXQsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLQotICAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0IgcGFja2VkIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICgxNilcbiIpOwotICAgIHBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKLSAgICBwZm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7Ci0gICAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDAwMEY4MDA7Ci0gICAgcGZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAwMDA3RTA7Ci0gICAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwMUY7Ci0gICAgcGZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOwotICAgIGlmIChjYl8xKSBpZiAoY2JfMSgmc2Rlc2MgLCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgaWYgKGNiXzIpIGlmIChjYl8yKHBmb3JtYXQsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLQotICAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0IgcGFja2VkIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81ICgxNilcbiIpOwotICAgIHBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKLSAgICBwZm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7Ci0gICAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDAwMDdDMDA7Ci0gICAgcGZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAwMDAzRTA7Ci0gICAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwMUY7Ci0gICAgcGZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOwotICAgIGlmIChjYl8xKSBpZiAoY2JfMSgmc2Rlc2MgLCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgaWYgKGNiXzIpIGlmIChjYl8yKHBmb3JtYXQsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLSAgICAKLSNpZiAwCi0gICAgLyogVGhpcyBpcyBhIGNvbXByb21pc2UgOiBzb21lIGdhbWVzIGNob29zZSB0aGUgZmlyc3QgMTYgYml0IHRleHR1cmUgZm9ybWF0IHdpdGggYWxwaGEgdGhleQotICAgICAgIGZpbmQgZW51bWVyYXRlZCwgb3RoZXJzIHRoZSBsYXN0IG9uZS4gQW5kIGJvdGggd2FudCB0byBoYXZlIHRoZSBBUkdCIG9uZS4KLSAgICAgICAKLSAgICAgICBTbyBiYXNpY2FsbHksIGZvcmdldCBvdXIgT3BlbkdMIHJvb3RzIGFuZCBkbyBub3QgZXZlbiBlbnVtZXJhdGUgb3VyIFJHQkEgb25lcy4KLSAgICAqLwotICAgIC8qIFNlZSBhcmd1bWVudCBhYm91dCB0aGUgUkdCQSBmb3JtYXQgZm9yICdwYWNrZWQnIHRleHR1cmUgZm9ybWF0cyAqLwotICAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0JBIHVucGFja2VkICgzMilcbiIpOwotICAgIHBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQiB8IEREUEZfQUxQSEFQSVhFTFM7Ci0gICAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDMyOwotICAgIHBmb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAgICAgICAgMHhGRjAwMDAwMDsKLSAgICBwZm9ybWF0LT51My5kd0dCaXRNYXNrID0gICAgICAgIDB4MDBGRjAwMDA7Ci0gICAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDBGRjAwOwotICAgIHBmb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDBGRjsKLSAgICBpZiAoY2JfMSkgaWYgKGNiXzEoJnNkZXNjICwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotICAgIGlmIChjYl8yKSBpZiAoY2JfMihwZm9ybWF0LCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgCi0gICAgVFJBQ0UoIkVudW1lcmF0aW5nIEdMX1JHQkEgcGFja2VkIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgKDE2KVxuIik7Ci0gICAgcGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKLSAgICBwZm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7Ci0gICAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9ICAgICAgICAweDAwMDBGMDAwOwotICAgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAgICAgICAgMHgwMDAwMEYwMDsKLSAgICBwZm9ybWF0LT51NC5kd0JCaXRNYXNrID0gICAgICAgIDB4MDAwMDAwRjA7Ci0gICAgcGZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDBGOwotICAgIGlmIChjYl8xKSBpZiAoY2JfMSgmc2Rlc2MgLCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgaWYgKGNiXzIpIGlmIChjYl8yKHBmb3JtYXQsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLQotICAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0JBIHBhY2tlZCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICgxNilcbiIpOwotICAgIHBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQiB8IEREUEZfQUxQSEFQSVhFTFM7Ci0gICAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwotICAgIHBmb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAgICAgICAgMHgwMDAwRjgwMDsKLSAgICBwZm9ybWF0LT51My5kd0dCaXRNYXNrID0gICAgICAgIDB4MDAwMDA3QzA7Ci0gICAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDAwMDNFOwotICAgIHBmb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDAwMTsKLSAgICBpZiAoY2JfMSkgaWYgKGNiXzEoJnNkZXNjICwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotICAgIGlmIChjYl8yKSBpZiAoY2JfMihwZm9ybWF0LCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0jZW5kaWYKLQotICAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0IgcGFja2VkIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgKDgpXG4iKTsKLSAgICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7Ci0gICAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDg7Ci0gICAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9ICAgICAgICAweDAwMDAwMEUwOwotICAgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAgICAgICAgMHgwMDAwMDAxQzsKLSAgICBwZm9ybWF0LT51NC5kd0JCaXRNYXNrID0gICAgICAgIDB4MDAwMDAwMDM7Ci0gICAgcGZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOwotICAgIGlmIChjYl8xKSBpZiAoY2JfMSgmc2Rlc2MgLCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgaWYgKGNiXzIpIGlmIChjYl8yKHBmb3JtYXQsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLQotICAgIFRSQUNFKCJFbnVtZXJhdGluZyBQYWxldHRlZCAoOClcbiIpOwotICAgIHBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1BBTEVUVEVJTkRFWEVEODsKLSAgICBwZm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gODsKLSAgICBwZm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gICAgICAgIDB4MDAwMDAwMDA7Ci0gICAgcGZvcm1hdC0+dTMuZHdHQml0TWFzayA9ICAgICAgICAweDAwMDAwMDAwOwotICAgIHBmb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAgICAgICAgMHgwMDAwMDAwMDsKLSAgICBwZm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7Ci0gICAgaWYgKGNiXzEpIGlmIChjYl8xKCZzZGVzYyAsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLSAgICBpZiAoY2JfMikgaWYgKGNiXzIocGZvcm1hdCwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotCi0gICAgLyogRFhUIHRleHR1cmVzIG9ubHkgZXhpc3QgZm9yIGRldmljZXMgY3JlYXRlZCBmcm9tIElEaXJlY3QzRDMgYW5kIGFib3ZlICovCi0gICAgaWYgKCh2ZXJzaW9uID49IDMpICYmIEdMX2V4dGVuc2lvbnMuczN0Y19jb21wcmVzc2VkX3RleHR1cmUpIHsKLQlUUkFDRSgiRW51bWVyYXRpbmcgRFhUMVxuIik7Ci0JcGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfRk9VUkNDOwotICAgICAgICBwZm9ybWF0LT5kd0ZvdXJDQyA9IE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCcxJyk7Ci0JaWYgKGNiXzEpIGlmIChjYl8xKCZzZGVzYyAsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLQlpZiAoY2JfMikgaWYgKGNiXzIocGZvcm1hdCwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotCi0JVFJBQ0UoIkVudW1lcmF0aW5nIERYVDNcbiIpOwotCXBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0ZPVVJDQzsKLSAgICAgICAgcGZvcm1hdC0+ZHdGb3VyQ0MgPSBNQUtFX0ZPVVJDQygnRCcsJ1gnLCdUJywnMycpOwotCWlmIChjYl8xKSBpZiAoY2JfMSgmc2Rlc2MgLCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0JaWYgKGNiXzIpIGlmIChjYl8yKHBmb3JtYXQsIGNvbnRleHQpID09IDApIHJldHVybiBERF9PSzsKLQotCVRSQUNFKCJFbnVtZXJhdGluZyBEWFQ1XG4iKTsKLQlwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9GT1VSQ0M7Ci0gICAgICAgIHBmb3JtYXQtPmR3Rm91ckNDID0gTUFLRV9GT1VSQ0MoJ0QnLCdYJywnVCcsJzUnKTsKLQlpZiAoY2JfMSkgaWYgKGNiXzEoJnNkZXNjICwgY29udGV4dCkgPT0gMCkgcmV0dXJuIEREX09LOwotCWlmIChjYl8yKSBpZiAoY2JfMihwZm9ybWF0LCBjb250ZXh0KSA9PSAwKSByZXR1cm4gRERfT0s7Ci0gICAgfQotCi0gICAgVFJBQ0UoIkVuZCBvZiBlbnVtZXJhdGlvblxuIik7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi0KLUhSRVNVTFQKLWQzZGRldmljZV9maW5kKElEaXJlY3REcmF3SW1wbCAqZDNkLAotCSAgICAgICBMUEQzREZJTkRERVZJQ0VTRUFSQ0ggbHBEM0RERlMsCi0JICAgICAgIExQRDNERklORERFVklDRVJFU1VMVCBscGxwRDNERGV2aWNlKQotewotICAgIEQzRERFVklDRURFU0MgZGVzYzsKLSAgCi0gICAgaWYgKChscEQzRERGUy0+ZHdGbGFncyAmIEQzREZEU19DT0xPUk1PREVMKSAmJgotCShscEQzRERGUy0+ZGNtQ29sb3JNb2RlbCAhPSBEM0RDT0xPUl9SR0IpKSB7Ci0gICAgICAgIFRSQUNFKCIgdHJ5aW5nIHRvIHJlcXVlc3QgYSBub24tUkdCIEQzRCBjb2xvciBtb2RlbC4gTm90IHN1cHBvcnRlZC5cbiIpOwotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOyAvKiBObyByZWFsIGlkZWEgd2hhdCB0byByZXR1cm4gaGVyZSA6LSkgKi8KLSAgICB9Ci0gICAgaWYgKGxwRDNEREZTLT5kd0ZsYWdzICYgRDNERkRTX0dVSUQpIHsKLSAgICAgICAgVFJBQ0UoIiB0cnlpbmcgdG8gbWF0Y2ggZ3VpZCAlcy5cbiIsIGRlYnVnc3RyX2d1aWQoJihscEQzRERGUy0+Z3VpZCkpKTsKLQlpZiAoKElzRXF1YWxHVUlEKCZJSURfRDNEREVWSUNFX09wZW5HTCwgJihscEQzRERGUy0+Z3VpZCkpID09IDApICYmCi0JICAgIChJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzREhBTERldmljZSwgJihscEQzRERGUy0+Z3VpZCkpID09IDApICYmCi0JICAgIChJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzRFJlZkRldmljZSwgJihscEQzRERGUy0+Z3VpZCkpID09IDApKSB7Ci0JICAgIFRSQUNFKCIgbm8gbWF0Y2ggZm9yIHRoaXMgR1VJRC5cbiIpOwotCSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQl9Ci0gICAgfQotCi0gICAgLyogTm93IHJldHVybiBvdXIgb3duIEdVSUQgKi8KLSAgICBscGxwRDNERGV2aWNlLT5ndWlkID0gSUlEX0QzRERFVklDRV9PcGVuR0w7Ci0gICAgZmlsbF9vcGVuZ2xfY2FwcygmZGVzYyk7Ci0gICAgbHBscEQzRERldmljZS0+ZGRId0Rlc2MgPSBkZXNjOwotICAgIGxwbHBEM0REZXZpY2UtPmRkU3dEZXNjID0gZGVzYzsKLQotICAgIFRSQUNFKCIgcmV0dXJuaW5nIFdpbmUncyBPcGVuR0wgZGV2aWNlIHdpdGggKHVuZHVtcGVkKSBjYXBhYmlsaXRpZXNcbiIpOwotICAgIAotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzJfMVRfRW51bVRleHR1cmVGb3JtYXRzKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotCQkJCQkgICAgICAgTFBEM0RFTlVNVEVYVFVSRUZPUk1BVFNDQUxMQkFDSyBscEQzREVudW1UZXh0dXJlUHJvYywKLQkJCQkJICAgICAgIExQVk9JRCBscEFyZykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcClcbiIsIFRoaXMsIGlmYWNlLCBscEQzREVudW1UZXh0dXJlUHJvYywgbHBBcmcpOwotICAgIHJldHVybiBlbnVtX3RleHR1cmVfZm9ybWF0X09wZW5HTChscEQzREVudW1UZXh0dXJlUHJvYywgTlVMTCwgbHBBcmcsIFRoaXMtPnZlcnNpb24pOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9FbnVtVGV4dHVyZUZvcm1hdHMoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJCSAgICAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBscEQzREVudW1QaXhlbFByb2MsCi0JCQkJCSAgICAgICBMUFZPSUQgbHBBcmcpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXAsJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBEM0RFbnVtUGl4ZWxQcm9jLCBscEFyZyk7Ci0gICAgcmV0dXJuIGVudW1fdGV4dHVyZV9mb3JtYXRfT3BlbkdMKE5VTEwsIGxwRDNERW51bVBpeGVsUHJvYywgbHBBcmcsIFRoaXMtPnZlcnNpb24pOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9TZXRSZW5kZXJTdGF0ZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkJICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIGR3UmVuZGVyU3RhdGVUeXBlLAotCQkJCQkgICAgICBEV09SRCBkd1JlbmRlclN0YXRlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOHgsJTA4bHgpXG4iLCBUaGlzLCBpZmFjZSwgZHdSZW5kZXJTdGF0ZVR5cGUsIGR3UmVuZGVyU3RhdGUpOwotCi0gICAgLyogQ2FsbCB0aGUgcmVuZGVyIHN0YXRlIGZ1bmN0aW9ucyAqLwotICAgIHN0b3JlX3JlbmRlcl9zdGF0ZShUaGlzLCBkd1JlbmRlclN0YXRlVHlwZSwgZHdSZW5kZXJTdGF0ZSwgJlRoaXMtPnN0YXRlX2Jsb2NrKTsKLSAgICBzZXRfcmVuZGVyX3N0YXRlKFRoaXMsIGR3UmVuZGVyU3RhdGVUeXBlLCAmVGhpcy0+c3RhdGVfYmxvY2spOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9HZXRSZW5kZXJTdGF0ZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkJICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIGR3UmVuZGVyU3RhdGVUeXBlLAotCQkJCQkgICAgICBMUERXT1JEIGxwZHdSZW5kZXJTdGF0ZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglMDh4LCVwKVxuIiwgVGhpcywgaWZhY2UsIGR3UmVuZGVyU3RhdGVUeXBlLCBscGR3UmVuZGVyU3RhdGUpOwotCi0gICAgLyogQ2FsbCB0aGUgcmVuZGVyIHN0YXRlIGZ1bmN0aW9ucyAqLwotICAgIGdldF9yZW5kZXJfc3RhdGUoVGhpcywgZHdSZW5kZXJTdGF0ZVR5cGUsIGxwZHdSZW5kZXJTdGF0ZSwgJlRoaXMtPnN0YXRlX2Jsb2NrKTsKLQotICAgIFRSQUNFKCIgLSBhc2tlZCBmb3IgcmVuZGVyaW5nIHN0YXRlIDogJXMsIHJldHVybmluZyB2YWx1ZSAlMDhseC5cbiIsIF9nZXRfcmVuZGVyc3RhdGUoZHdSZW5kZXJTdGF0ZVR5cGUpLCAqbHBkd1JlbmRlclN0YXRlKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfR2V0TGlnaHRTdGF0ZShMUERJUkVDVDNEREVWSUNFMyBpZmFjZSwKLQkJCQkJICBEM0RMSUdIVFNUQVRFVFlQRSBkd0xpZ2h0U3RhdGVUeXBlLAotCQkJCQkgIExQRFdPUkQgbHBkd0xpZ2h0U3RhdGUpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgaWZhY2UpOwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4eCwlcClcbiIsIFRoaXMsIGlmYWNlLCBkd0xpZ2h0U3RhdGVUeXBlLCBscGR3TGlnaHRTdGF0ZSk7Ci0KLSAgICBpZiAoIWR3TGlnaHRTdGF0ZVR5cGUgJiYgKGR3TGlnaHRTdGF0ZVR5cGUgPiBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYKSkgewotCVRSQUNFKCJVbmV4cGVjdGVkIExpZ2h0IFN0YXRlIFR5cGVcbiIpOwotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgIH0KLQkKLSAgICBpZiAoZHdMaWdodFN0YXRlVHlwZSA9PSBEM0RMSUdIVFNUQVRFX01BVEVSSUFMIC8qIDEgKi8pIHsKLQkqbHBkd0xpZ2h0U3RhdGUgPSBUaGlzLT5tYXRlcmlhbDsKLSAgICB9IGVsc2UgaWYgKGR3TGlnaHRTdGF0ZVR5cGUgPT0gRDNETElHSFRTVEFURV9DT0xPUk1PREVMIC8qIDMgKi8pIHsKLQkqbHBkd0xpZ2h0U3RhdGUgPSBEM0RDT0xPUl9SR0I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIHJzOwotCXN3aXRjaCAoZHdMaWdodFN0YXRlVHlwZSkgewotCSAgICBjYXNlIEQzRExJR0hUU1RBVEVfQU1CSUVOVDogICAgICAgLyogMiAqLwotCQlycyA9IEQzRFJFTkRFUlNUQVRFX0FNQklFTlQ7Ci0JCWJyZWFrOwkJCi0JICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dNT0RFOiAgICAgICAvKiA0ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HVkVSVEVYTU9ERTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dTVEFSVDogICAgICAvKiA1ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HU1RBUlQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HRU5EOiAgICAgICAgLyogNiAqLwotCQlycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0VORDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dERU5TSVRZOiAgICAvKiA3ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HREVOU0lUWTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRDNETElHSFRTVEFURV9DT0xPUlZFUlRFWDogICAvKiA4ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfQ09MT1JWRVJURVg7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlFUlIoIlVua25vd24gRDNETElHSFRTVEFURVRZUEUgJWQuXG4iLCBkd0xpZ2h0U3RhdGVUeXBlKTsKLQkJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JfQotCi0JSURpcmVjdDNERGV2aWNlN19HZXRSZW5kZXJTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKLQkgICAgICAgICAgICAgICAgICAgCQlycyxscGR3TGlnaHRTdGF0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9TZXRMaWdodFN0YXRlKExQRElSRUNUM0RERVZJQ0UzIGlmYWNlLAotCQkJCQkgIEQzRExJR0hUU1RBVEVUWVBFIGR3TGlnaHRTdGF0ZVR5cGUsCi0JCQkJCSAgRFdPUkQgZHdMaWdodFN0YXRlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGlmYWNlKTsKLSAgICAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOHgsJTA4bHgpXG4iLCBUaGlzLCBpZmFjZSwgZHdMaWdodFN0YXRlVHlwZSwgZHdMaWdodFN0YXRlKTsKLQotICAgIGlmICghZHdMaWdodFN0YXRlVHlwZSAmJiAoZHdMaWdodFN0YXRlVHlwZSA+IEQzRExJR0hUU1RBVEVfQ09MT1JWRVJURVgpKSB7Ci0JVFJBQ0UoIlVuZXhwZWN0ZWQgTGlnaHQgU3RhdGUgVHlwZVxuIik7Ci0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotCQotICAgIGlmIChkd0xpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfTUFURVJJQUwgLyogMSAqLykgewotCUlEaXJlY3QzRE1hdGVyaWFsSW1wbCAqbWF0ID0gKElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqKSBkd0xpZ2h0U3RhdGU7Ci0KLQlpZiAobWF0ICE9IE5VTEwpIHsKLQkgICAgVFJBQ0UoIiBhY3RpdmF0aW5nIG1hdGVyaWFsICVwLlxuIiwgbWF0KTsKLQkgICAgbWF0LT5hY3RpdmF0ZShtYXQpOwotCX0gZWxzZSB7Ci0JICAgIEZJWE1FKCIgRDNETElHSFRTVEFURV9NQVRFUklBTCBjYWxsZWQgd2l0aCBOVUxMIG1hdGVyaWFsICEhIVxuIik7Ci0JfQotCVRoaXMtPm1hdGVyaWFsID0gZHdMaWdodFN0YXRlOwotICAgIH0gZWxzZSBpZiAoZHdMaWdodFN0YXRlVHlwZSA9PSBEM0RMSUdIVFNUQVRFX0NPTE9STU9ERUwgLyogMyAqLykgewotCXN3aXRjaCAoZHdMaWdodFN0YXRlKSB7Ci0JICAgIGNhc2UgRDNEQ09MT1JfTU9OTzoKLQkgICAgICAgRVJSKCJERENPTE9SX01PTk8gc2hvdWxkIG5vdCBoYXBwZW4hXG4iKTsKLQkgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRDNEQ09MT1JfUkdCOgotCSAgICAgICAvKiBXZSBhcmUgYWxyZWFkeSBpbiB0aGlzIG1vZGUgKi8KLQkgICAgICAgVFJBQ0UoIlNldHRpbmcgY29sb3IgbW9kZWwgdG8gUkdCIChuby1vcCkuXG4iKTsKLQkgICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgIEVSUigiVW5rbm93biBjb2xvciBtb2RlbCFcbiIpOwotCSAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQl9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIHJzOwotCXN3aXRjaCAoZHdMaWdodFN0YXRlVHlwZSkgewotCSAgICBjYXNlIEQzRExJR0hUU1RBVEVfQU1CSUVOVDogICAgICAgLyogMiAqLwotCQlycyA9IEQzRFJFTkRFUlNUQVRFX0FNQklFTlQ7Ci0JCWJyZWFrOwkJCi0JICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dNT0RFOiAgICAgICAvKiA0ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HVkVSVEVYTU9ERTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dTVEFSVDogICAgICAvKiA1ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HU1RBUlQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEQzRExJR0hUU1RBVEVfRk9HRU5EOiAgICAgICAgLyogNiAqLwotCQlycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0VORDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dERU5TSVRZOiAgICAvKiA3ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HREVOU0lUWTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgRDNETElHSFRTVEFURV9DT0xPUlZFUlRFWDogICAvKiA4ICovCi0JCXJzID0gRDNEUkVOREVSU1RBVEVfQ09MT1JWRVJURVg7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlFUlIoIlVua25vd24gRDNETElHSFRTVEFURVRZUEUgJWQuXG4iLCBkd0xpZ2h0U3RhdGVUeXBlKTsKLQkJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JfQotCi0JSURpcmVjdDNERGV2aWNlN19TZXRSZW5kZXJTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKLQkgICAgICAgICAgICAgICAgICAgCQlycyxkd0xpZ2h0U3RhdGUpOwotICAgIH0KLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIEdMZW51bSBjb252ZXJ0X0QzRF9wdHlwZV90b19HTChEM0RQUklNSVRJVkVUWVBFIGQzZHB0KQotewotICAgIHN3aXRjaCAoZDNkcHQpIHsKLSAgICAgICAgY2FzZSBEM0RQVF9QT0lOVExJU1Q6Ci0gICAgICAgICAgICBUUkFDRSgiIHByaW1pdGl2ZSB0eXBlIGlzIFBPSU5UU1xuIik7Ci0JICAgIHJldHVybiBHTF9QT0lOVFM7Ci0KLQljYXNlIEQzRFBUX0xJTkVMSVNUOgotCSAgICBUUkFDRSgiIHByaW1pdGl2ZSB0eXBlIGlzIExJTkVTXG4iKTsKLQkgICAgcmV0dXJuIEdMX0xJTkVTOwotCQkKLQljYXNlIEQzRFBUX0xJTkVTVFJJUDoKLQkgICAgVFJBQ0UoIiBwcmltaXRpdmUgdHlwZSBpcyBMSU5FX1NUUklQXG4iKTsKLQkgICAgcmV0dXJuIEdMX0xJTkVfU1RSSVA7Ci0JICAgIAotCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOgotCSAgICBUUkFDRSgiIHByaW1pdGl2ZSB0eXBlIGlzIFRSSUFOR0xFU1xuIik7Ci0JICAgIHJldHVybiBHTF9UUklBTkdMRVM7Ci0JICAgIAotCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoKLQkgICAgVFJBQ0UoIiBwcmltaXRpdmUgdHlwZSBpcyBUUklBTkdMRV9TVFJJUFxuIik7Ci0JICAgIHJldHVybiBHTF9UUklBTkdMRV9TVFJJUDsKLQkgICAgCi0JY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoKLQkgICAgVFJBQ0UoIiBwcmltaXRpdmUgdHlwZSBpcyBUUklBTkdMRV9GQU5cbiIpOwotCSAgICByZXR1cm4gR0xfVFJJQU5HTEVfRkFOOwotCSAgICAKLQlkZWZhdWx0OgotCSAgICBGSVhNRSgiVW5oYW5kbGVkIHByaW1pdGl2ZSAlMDh4XG4iLCBkM2RwdCk7Ci0JICAgIHJldHVybiBHTF9QT0lOVFM7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgWiBjb29yZGluYXRlIGZyb20gWnByb2ogKi8gCi1zdGF0aWMgZmxvYXQgWmZyb21acHJvaihJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLCBEM0RWQUxVRSBacHJvaikKLXsKLSAgICBmbG9hdCBhLGIsYyxkOwotICAgIC8qIEFzc3VtZSB0aGF0IFggPSBZID0gMCBhbmQgVyA9IDEgKi8KLSAgICBhID0gVGhpcy0+cHJval9tYXQtPl8zMzsKLSAgICBiID0gVGhpcy0+cHJval9tYXQtPl8zNDsKLSAgICBjID0gVGhpcy0+cHJval9tYXQtPl80MzsKLSAgICBkID0gVGhpcy0+cHJval9tYXQtPl80NDsKLSAgICAvKiBXZSBoYXZlIGluIGhvbW9nZW5vdXMgY29vcmRpbmF0ZXMgWicgPSBhICogWiArIGMgYW5kIFcnID0gYiAqIFogKyBkCi0gICAgICogU28gaW4gbm9uIGhvbW9nZW5vdXMgY29vcmRpbmF0ZXMgd2UgaGF2ZSBacHJvaiA9IChhICogWiArIGMpIC8gKGIgKiBaICsgZCkKLSAgICAgKiBBbmQgZmluYWxseSBaID0gKGQgKiBacHJvaiAtIGMpIC8gKGEgLSBiICogWnByb2opCi0gICAgICovCi0gICAgcmV0dXJuIChkKlpwcm9qIC0gYykgLyAoYSAtIGIqWnByb2opOwotfQotCi1zdGF0aWMgdm9pZCBidWlsZF9mb2dfdGFibGUoQllURSAqZm9nX3RhYmxlLCBEV09SRCBmb2dfY29sb3IpIHsKLSAgICBpbnQgaTsKLSAgICAKLSAgICBUUkFDRSgiIHJlYnVpbGRpbmcgZm9nIHRhYmxlICglMDZseCkuLi5cbiIsIGZvZ19jb2xvciAmIDB4MDBGRkZGRkYpOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgQllURSBmb2dfY29sb3JfY29tcG9uZW50ID0gKGZvZ19jb2xvciA+PiAoOCAqIGkpKSAmIDB4RkY7Ci0JRFdPUkQgZWx0OwotCWZvciAoZWx0ID0gMDsgZWx0IDwgMHgxMDAwMDsgZWx0KyspIHsKLQkgICAgLyogV2UgYXBwbHkgdGhlIGZvZyB0cmFuc2Zvcm1hdGlvbiBhbmQgY2FjaGUgdGhlIHJlc3VsdCAqLwotCSAgICBEV09SRCBmb2dfaW50ZW5zaXR5ID0gZWx0ICYgMHhGRjsKLQkgICAgRFdPUkQgdmVydGV4X2NvbG9yID0gKGVsdCA+PiA4KSAmIDB4RkY7Ci0JICAgIGZvZ190YWJsZVsoaSAqIDB4MTAwMDApICsgZWx0XSA9ICgoZm9nX2ludGVuc2l0eSAqIHZlcnRleF9jb2xvcikgKyAoKDB4RkYgLSBmb2dfaW50ZW5zaXR5KSAqIGZvZ19jb2xvcl9jb21wb25lbnQpKSAvIDB4RkY7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZHJhd19wcmltaXRpdmVfaGFuZGxlX0dMX3N0YXRlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsCi0JCQkJCSAgIEJPT0xFQU4gdmVydGV4X3RyYW5zZm9ybWVkLAotCQkJCQkgICBCT09MRUFOIHZlcnRleF9saXQpIHsKLSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwqIGdsVGhpcyA9IChJRGlyZWN0M0REZXZpY2VHTEltcGwqKSBUaGlzOwotICAKLSAgICAvKiBQdXRzIEdMIGluIHRoZSBjb3JyZWN0IGxpZ2h0aW5nIC8gdHJhbnNmb3JtYXRpb24gbW9kZSAqLwotICAgIGlmICgodmVydGV4X3RyYW5zZm9ybWVkID09IEZBTFNFKSAmJiAKLQkoZ2xUaGlzLT50cmFuc2Zvcm1fc3RhdGUgIT0gR0xfVFJBTlNGT1JNX05PUk1BTCkpIHsKLSAgICAgICAgLyogTmVlZCB0byBwdXQgdGhlIGNvcnJlY3QgdHJhbnNmb3JtYXRpb24gYWdhaW4gaWYgd2UgZ28gZnJvbSBUcmFuc2Zvcm1lZAotCSAgIHZlcnRpY2VzIHRvIG5vbi10cmFuc2Zvcm1lZCBvbmVzLgotCSovCi0gICAgICAgIFRoaXMtPnNldF9tYXRyaWNlcyhUaGlzLCBWSUVXTUFUX0NIQU5HRUR8V09STERNQVRfQ0hBTkdFRHxQUk9KTUFUX0NIQU5HRUQsCi0JCQkgICBUaGlzLT53b3JsZF9tYXQsIFRoaXMtPnZpZXdfbWF0LCBUaGlzLT5wcm9qX21hdCk7Ci0JZ2xUaGlzLT50cmFuc2Zvcm1fc3RhdGUgPSBHTF9UUkFOU0ZPUk1fTk9STUFMOwotCi0gICAgfSBlbHNlIGlmICh2ZXJ0ZXhfdHJhbnNmb3JtZWQgJiYKLQkgICAgICAgKGdsVGhpcy0+dHJhbnNmb3JtX3N0YXRlICE9IEdMX1RSQU5TRk9STV9PUlRITykpIHsKLSAgICAgICAgLyogU2V0IG91ciBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiAqLwotCWlmIChnbFRoaXMtPnRyYW5zZm9ybV9zdGF0ZSAhPSBHTF9UUkFOU0ZPUk1fT1JUSE8pIHsKLQkgICAgZ2xUaGlzLT50cmFuc2Zvcm1fc3RhdGUgPSBHTF9UUkFOU0ZPUk1fT1JUSE87Ci0JICAgIGQzZGRldmljZV9zZXRfb3J0aG8oVGhpcyk7Ci0JfQotICAgIH0KLQotICAgIC8qIFRPRE86IG9wdGltaXplIHRoaXMgdG8gbm90IGFsd2F5cyByZXNldCBhbGwgdGhlIGZvZyBzdHVmZiBvbiBhbGwgRHJhd1ByaW1pdGl2ZSBjYWxsCi0gICAgICAgICAgICAgaWYgbm8gZm9nZ2luZyBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQgKi8KLSAgICBpZiAoVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0ZPR0VOQUJMRSAtIDFdKSB7Ci0gICAgICAgIGlmICh2ZXJ0ZXhfdHJhbnNmb3JtZWQpIHsKLQkgICAgaWYgKGdsVGhpcy0+Zm9nZ2luZyAhPSAwKSB7Ci0JCWdsRGlzYWJsZShHTF9GT0cpOwotCQlnbFRoaXMtPmZvZ2dpbmcgPSAwOwotCSAgICB9Ci0JICAgIC8qIE5vdyBjaGVjayBpZiBvdXIgZm9nX3RhYmxlIHN0aWxsIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHZlcnRleCBjb2xvci4KLQkgICAgICAgRWxlbWVudCAnMHguLjAwJyBpcyBhbHdheXMgdGhlIGZvZyBjb2xvciBhcyBpdCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIGZvZyBpbnRlbnNpdHkgKi8KLQkgICAgaWYgKChnbFRoaXMtPmZvZ190YWJsZVswICogMHgxMDAwMCArIDB4MDAwMF0gIT0gKChUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfRk9HQ09MT1IgLSAxXSA+PiAgMCkgJiAweEZGKSkgfHwKLQkJKGdsVGhpcy0+Zm9nX3RhYmxlWzEgKiAweDEwMDAwICsgMHgwMDAwXSAhPSAoKFRoaXMtPnN0YXRlX2Jsb2NrLnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9GT0dDT0xPUiAtIDFdID4+ICA4KSAmIDB4RkYpKSB8fAotCQkoZ2xUaGlzLT5mb2dfdGFibGVbMiAqIDB4MTAwMDAgKyAweDAwMDBdICE9ICgoVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0ZPR0NPTE9SIC0gMV0gPj4gMTYpICYgMHhGRikpKSB7Ci0JICAgICAgICAvKiBXZSBuZWVkIHRvIHJlYnVpbGQgb3VyIGZvZyB0YWJsZS4uLi4gKi8KLQkJYnVpbGRfZm9nX3RhYmxlKGdsVGhpcy0+Zm9nX3RhYmxlLCBUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfRk9HQ09MT1IgLSAxXSk7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBpZiAoVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0ZPR1RBQkxFTU9ERSAtIDFdICE9IEQzREZPR19OT05FKSB7Ci0JICAgICAgICBzd2l0Y2ggKFRoaXMtPnN0YXRlX2Jsb2NrLnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9GT0dUQUJMRU1PREUgLSAxXSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEQzREZPR19MSU5FQVI6IGdsRm9naShHTF9GT0dfTU9ERSwgR0xfTElORUFSKTsgYnJlYWs7IAotCQkgICAgY2FzZSBEM0RGT0dfRVhQOiAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUCk7IGJyZWFrOyAKLQkJICAgIGNhc2UgRDNERk9HX0VYUDI6ICAgZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFAyKTsgYnJlYWs7Ci0JCX0KLQkJaWYgKHZlcnRleF9saXQgPT0gRkFMU0UpIHsKLQkJICAgIGdsRm9nZihHTF9GT0dfU1RBUlQsICooZmxvYXQqKSZUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfRk9HU1RBUlQgLSAxXSk7Ci0JCSAgICBnbEZvZ2YoR0xfRk9HX0VORCwgKihmbG9hdCopJlRoaXMtPnN0YXRlX2Jsb2NrLnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9GT0dFTkQgLSAxXSk7Ci0JCX0gZWxzZSB7Ci0JCSAgICAvKiBTcGVjaWFsIGNhc2Ugb2YgJ3BpeGVsIGZvZycgKi8KLQkJICAgIGdsRm9nZihHTF9GT0dfU1RBUlQsIFpmcm9tWnByb2ooVGhpcywgKihmbG9hdCopJlRoaXMtPnN0YXRlX2Jsb2NrLnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9GT0dTVEFSVCAtIDFdKSk7Ci0JCSAgICBnbEZvZ2YoR0xfRk9HX0VORCwgWmZyb21acHJvaihUaGlzLCAqKGZsb2F0KikmVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0ZPR0VORCAtIDFdKSk7Ci0JCX0KLQkJaWYgKGdsVGhpcy0+Zm9nZ2luZyA9PSAwKSB7Ci0JCSAgICBnbEVuYWJsZShHTF9GT0cpOwotCQkgICAgZ2xUaGlzLT5mb2dnaW5nID0gMTsKLQkJfQotCSAgICB9IGVsc2UgewotCQlpZiAoZ2xUaGlzLT5mb2dnaW5nICE9IDApIHsKLQkJICAgIGdsRGlzYWJsZShHTF9GT0cpOwotCQkgICAgZ2xUaGlzLT5mb2dnaW5nID0gMDsKLQkJfQotCSAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotCWlmIChnbFRoaXMtPmZvZ2dpbmcgIT0gMCkgewotCSAgICBnbERpc2FibGUoR0xfRk9HKTsKLQkgICAgZ2xUaGlzLT5mb2dnaW5nID0gMDsKLQl9Ci0gICAgfQotICAgIAotICAgIC8qIEhhbmRsZSB0aGUgJ25vLW5vcm1hbCcgY2FzZSAqLwotICAgIGlmICgodmVydGV4X2xpdCA9PSBGQUxTRSkgJiYgVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0xJR0hUSU5HIC0gMV0pIHsKLQlpZiAoZ2xUaGlzLT5saWdodGluZyA9PSAwKSB7Ci0JICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKLQkgICAgZ2xUaGlzLT5saWdodGluZyA9IDE7Ci0JfQotICAgIH0gZWxzZSB7Ci0JaWYgKGdsVGhpcy0+bGlnaHRpbmcgIT0gMCkgewotCSAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOwotCSAgICBnbFRoaXMtPmxpZ2h0aW5nID0gMDsKLQl9Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIHRoZSBjb2RlIGZvciBwcmUtdmVydGV4IG1hdGVyaWFsIHByb3BlcnRpZXMgKi8KLSAgICBpZiAodmVydGV4X3RyYW5zZm9ybWVkID09IEZBTFNFKSB7Ci0gICAgICAgIGlmIChUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfTElHSFRJTkcgLSAxXSAmJgotCSAgICBUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQ09MT1JWRVJURVggLSAxXSkgewotCSAgICBpZiAoKFRoaXMtPnN0YXRlX2Jsb2NrLnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9ESUZGVVNFTUFURVJJQUxTT1VSQ0UgLSAxXSAhPSBEM0RNQ1NfTUFURVJJQUwpIHx8Ci0JCShUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQU1CSUVOVE1BVEVSSUFMU09VUkNFIC0gMV0gIT0gRDNETUNTX01BVEVSSUFMKSB8fAotCQkoVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UgLSAxXSAhPSBEM0RNQ1NfTUFURVJJQUwpIHx8Ci0JCShUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSAtIDFdICE9IEQzRE1DU19NQVRFUklBTCkpIHsKLQkgICAgICAgIGdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotaW5saW5lIHN0YXRpYyB2b2lkIGRyYXdfcHJpbWl0aXZlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsIERXT1JEIG1heHZlcnQsIFdPUkQgKmluZGV4LAotCQkJCSAgRDNEVkVSVEVYVFlQRSBkM2R2dCwgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdCwgdm9pZCAqbHB2ZXJ0ZXgpCi17Ci0gICAgRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBIHN0cmlkZWQ7Ci0KLSAgICBzd2l0Y2ggKGQzZHZ0KSB7Ci0gICAgICAgIGNhc2UgRDNEVlRfVkVSVEVYOiB7Ci0JICAgIHN0cmlkZWQucG9zaXRpb24ubHB2RGF0YSA9ICYoKEQzRFZFUlRFWCAqKSBscHZlcnRleCktPnUxLng7Ci0JICAgIHN0cmlkZWQucG9zaXRpb24uZHdTdHJpZGUgPSBzaXplb2YoRDNEVkVSVEVYKTsKLQkgICAgc3RyaWRlZC5ub3JtYWwubHB2RGF0YSA9ICYoKEQzRFZFUlRFWCAqKSBscHZlcnRleCktPnU0Lm54OwotCSAgICBzdHJpZGVkLm5vcm1hbC5kd1N0cmlkZSA9IHNpemVvZihEM0RWRVJURVgpOwotCSAgICBzdHJpZGVkLnRleHR1cmVDb29yZHNbMF0ubHB2RGF0YSA9ICYoKEQzRFZFUlRFWCAqKSBscHZlcnRleCktPnU3LnR1OwotCSAgICBzdHJpZGVkLnRleHR1cmVDb29yZHNbMF0uZHdTdHJpZGUgPSBzaXplb2YoRDNEVkVSVEVYKTsKLQkgICAgZHJhd19wcmltaXRpdmVfc3RyaWRlZChUaGlzLCBkM2RwdCwgRDNERlZGX1ZFUlRFWCwgJnN0cmlkZWQsIDAgLyogVW51c2VkICovLCBpbmRleCwgbWF4dmVydCwgMCAvKiBVbnVzZWQgKi8pOwotCX0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBEM0RWVF9MVkVSVEVYOiB7Ci0JICAgIHN0cmlkZWQucG9zaXRpb24ubHB2RGF0YSA9ICYoKEQzRExWRVJURVggKikgbHB2ZXJ0ZXgpLT51MS54OwotCSAgICBzdHJpZGVkLnBvc2l0aW9uLmR3U3RyaWRlID0gc2l6ZW9mKEQzRExWRVJURVgpOwotCSAgICBzdHJpZGVkLmRpZmZ1c2UubHB2RGF0YSA9ICYoKEQzRExWRVJURVggKikgbHB2ZXJ0ZXgpLT51NC5jb2xvcjsKLQkgICAgc3RyaWRlZC5kaWZmdXNlLmR3U3RyaWRlID0gc2l6ZW9mKEQzRExWRVJURVgpOwotCSAgICBzdHJpZGVkLnNwZWN1bGFyLmxwdkRhdGEgPSAmKChEM0RMVkVSVEVYICopIGxwdmVydGV4KS0+dTUuc3BlY3VsYXI7Ci0JICAgIHN0cmlkZWQuc3BlY3VsYXIuZHdTdHJpZGUgPSBzaXplb2YoRDNETFZFUlRFWCk7Ci0JICAgIHN0cmlkZWQudGV4dHVyZUNvb3Jkc1swXS5scHZEYXRhID0gJigoRDNETFZFUlRFWCAqKSBscHZlcnRleCktPnU2LnR1OwotCSAgICBzdHJpZGVkLnRleHR1cmVDb29yZHNbMF0uZHdTdHJpZGUgPSBzaXplb2YoRDNETFZFUlRFWCk7Ci0JICAgIGRyYXdfcHJpbWl0aXZlX3N0cmlkZWQoVGhpcywgZDNkcHQsIEQzREZWRl9MVkVSVEVYLCAmc3RyaWRlZCwgMCAvKiBVbnVzZWQgKi8sIGluZGV4LCBtYXh2ZXJ0LCAwIC8qIFVudXNlZCAqLyk7Ci0JfSBicmVhazsKLQotICAgICAgICBjYXNlIEQzRFZUX1RMVkVSVEVYOiB7Ci0JICAgIHN0cmlkZWQucG9zaXRpb24ubHB2RGF0YSA9ICYoKEQzRFRMVkVSVEVYICopIGxwdmVydGV4KS0+dTEuc3g7Ci0JICAgIHN0cmlkZWQucG9zaXRpb24uZHdTdHJpZGUgPSBzaXplb2YoRDNEVExWRVJURVgpOwotCSAgICBzdHJpZGVkLmRpZmZ1c2UubHB2RGF0YSA9ICYoKEQzRFRMVkVSVEVYICopIGxwdmVydGV4KS0+dTUuY29sb3I7Ci0JICAgIHN0cmlkZWQuZGlmZnVzZS5kd1N0cmlkZSA9IHNpemVvZihEM0RUTFZFUlRFWCk7Ci0JICAgIHN0cmlkZWQuc3BlY3VsYXIubHB2RGF0YSA9ICYoKEQzRFRMVkVSVEVYICopIGxwdmVydGV4KS0+dTYuc3BlY3VsYXI7Ci0JICAgIHN0cmlkZWQuc3BlY3VsYXIuZHdTdHJpZGUgPSBzaXplb2YoRDNEVExWRVJURVgpOwotCSAgICBzdHJpZGVkLnRleHR1cmVDb29yZHNbMF0ubHB2RGF0YSA9ICYoKEQzRFRMVkVSVEVYICopIGxwdmVydGV4KS0+dTcudHU7Ci0JICAgIHN0cmlkZWQudGV4dHVyZUNvb3Jkc1swXS5kd1N0cmlkZSA9IHNpemVvZihEM0RUTFZFUlRFWCk7Ci0JICAgIGRyYXdfcHJpbWl0aXZlX3N0cmlkZWQoVGhpcywgZDNkcHQsIEQzREZWRl9UTFZFUlRFWCwgJnN0cmlkZWQsIDAgLyogVW51c2VkICovLCBpbmRleCwgbWF4dmVydCwgMCAvKiBVbnVzZWQgKi8pOwotCX0gYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLQkgICAgRklYTUUoIlVuaGFuZGxlZCB2ZXJ0ZXggdHlwZSAlMDh4XG4iLCBkM2R2dCk7Ci0JICAgIGJyZWFrOwotICAgIH0KLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfMl9EcmF3UHJpbWl0aXZlKExQRElSRUNUM0RERVZJQ0UyIGlmYWNlLAotCQkJCSAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkgICAgICAgRDNEVkVSVEVYVFlQRSBkM2R2dFZlcnRleFR5cGUsCi0JCQkJICAgICAgIExQVk9JRCBscHZWZXJ0aWNlcywKLQkJCQkgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLQkJCQkgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBpZmFjZSk7Ci0KLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOHgsJTA4eCwlcCwlMDhseCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGQzZHZ0VmVydGV4VHlwZSwgbHB2VmVydGljZXMsIGR3VmVydGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICBkcmF3X3ByaW1pdGl2ZShUaGlzLCBkd1ZlcnRleENvdW50LCBOVUxMLCBkM2R2dFZlcnRleFR5cGUsIGQzZHB0UHJpbWl0aXZlVHlwZSwgbHB2VmVydGljZXMpOwotCQkgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzJfRHJhd0luZGV4ZWRQcmltaXRpdmUoTFBESVJFQ1QzRERFVklDRTIgaWZhY2UsCi0JCQkJCSAgICAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotCQkJCQkgICAgICBEM0RWRVJURVhUWVBFIGQzZHZ0VmVydGV4VHlwZSwKLQkJCQkJICAgICAgTFBWT0lEIGxwdlZlcnRpY2VzLAotCQkJCQkgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAotCQkJCQkgICAgICBMUFdPUkQgZHdJbmRpY2VzLAotCQkJCQkgICAgICBEV09SRCBkd0luZGV4Q291bnQsCi0JCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4eCwlMDh4LCVwLCUwOGx4LCVwLCUwOGx4LCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgZHdWZXJ0ZXhDb3VudCwgZHdJbmRpY2VzLCBkd0luZGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICBkcmF3X3ByaW1pdGl2ZShUaGlzLCBkd0luZGV4Q291bnQsIGR3SW5kaWNlcywgZDNkdnRWZXJ0ZXhUeXBlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGxwdlZlcnRpY2VzKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzFfQ3JlYXRlRXhlY3V0ZUJ1ZmZlcihMUERJUkVDVDNEREVWSUNFIGlmYWNlLAotCQkJCQkgICAgIExQRDNERVhFQ1VURUJVRkZFUkRFU0MgbHBEZXNjLAotCQkJCQkgICAgIExQRElSRUNUM0RFWEVDVVRFQlVGRkVSKiBscGxwRGlyZWN0M0RFeGVjdXRlQnVmZmVyLAotCQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBpZmFjZSk7Ci0gICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKnJldDsKLSAgICBIUkVTVUxUIHJldF92YWx1ZTsKLSAgICAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRGVzYywgbHBscERpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgcFVua091dGVyKTsKLQotICAgIHJldF92YWx1ZSA9IGQzZGV4ZWN1dGVidWZmZXJfY3JlYXRlKCZyZXQsIFRoaXMtPmQzZCwgVGhpcywgbHBEZXNjKTsKLSAgICAqbHBscERpcmVjdDNERXhlY3V0ZUJ1ZmZlciA9IElDT01fSU5URVJGQUNFKHJldCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcik7Ci0KLSAgICBUUkFDRSgiIHJldHVybmluZyAlcC5cbiIsICpscGxwRGlyZWN0M0RFeGVjdXRlQnVmZmVyKTsKLSAgICAKLSAgICByZXR1cm4gcmV0X3ZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCBmbHVzaF96YnVmZmVyX3RvX0dMKElEaXJlY3QzRERldmljZUltcGwgKmQzZF9kZXYsIExQQ1JFQ1QgcFJlY3QsIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYpIHsKLSAgICBzdGF0aWMgQk9PTEVBTiBmaXJzdCA9IFRSVUU7Ci0gICAgSURpcmVjdDNERGV2aWNlR0xJbXBsKiBnbF9kM2RfZGV2ID0gKElEaXJlY3QzRERldmljZUdMSW1wbCopIGQzZF9kZXY7Ci0gICAgdW5zaWduZWQgaW50IHJvdzsKLSAgICBHTGVudW0gdHlwZTsKLSAgICAKLSAgICBpZiAoZmlyc3QpIHsKLQlNRVNTQUdFKCJXYXJuaW5nIDogYXBwbGljYXRpb24gZG9lcyBkaXJlY3QgbG9ja2luZyBvZiBaQnVmZmVyIC0gZXhwZWN0IHNsb3dkb3ducyBvbiBtYW55IEdMIGltcGxlbWVudGF0aW9ucyA6LSlcbiIpOwotCWZpcnN0ID0gRkFMU0U7Ci0gICAgfQotICAgIAotICAgIFRSQUNFKCJmbHVzaGluZyBaQnVmZmVyIGJhY2sgdG8gR0xcbiIpOwotICAgIAotICAgIGlmIChnbF9kM2RfZGV2LT50cmFuc2Zvcm1fc3RhdGUgIT0gR0xfVFJBTlNGT1JNX09SVEhPKSB7Ci0JZ2xfZDNkX2Rldi0+dHJhbnNmb3JtX3N0YXRlID0gR0xfVFJBTlNGT1JNX09SVEhPOwotCWQzZGRldmljZV9zZXRfb3J0aG8oZDNkX2Rldik7Ci0gICAgfQotICAgIAotICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0KLSAgICBpZiAoZ2xfZDNkX2Rldi0+ZGVwdGhfdGVzdCA9PSAwKSBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICBpZiAoZDNkX2Rldi0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1pGVU5DIC0gMV0gIT0gRDNEQ01QX0FMV0FZUykgZ2xEZXB0aEZ1bmMoR0xfQUxXQVlTKTsKLSAgICBnbENvbG9yTWFzayhHTF9GQUxTRSwgR0xfRkFMU0UsIEdMX0ZBTFNFLCBHTF9GQUxTRSk7IAotCi0gICAgLyogVGhpcyBsb29wIGhlcmUgaXMgdG8gcHJldmVudCB1c2luZyBQaXhlbFpvb20gdGhhdCBtYXkgYmUgdW5vcHRpbWl6ZWQgZm9yIHRoZSAxLjAgLyAtMS4wIGNhc2UKLSAgICAgICBpbiBzb21lIGRyaXZlcnMuLi4KLSAgICAqLwotICAgIHN3aXRjaCAoc3VyZi0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1pCdWZmZXJCaXREZXB0aCkgewotICAgICAgICBjYXNlIDE2OiB0eXBlID0gR0xfVU5TSUdORURfU0hPUlQ7IGJyZWFrOwotCWNhc2UgMzI6IHR5cGUgPSBHTF9VTlNJR05FRF9JTlQ7IGJyZWFrOwotCWRlZmF1bHQ6IEZJWE1FKCJVbmhhbmRsZWQgWkJ1ZmZlciBmb3JtYXQgIVxuIik7IGdvdG8gcmVzdG9yZV9zdGF0ZTsKLSAgICB9Ci0JCi0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBzdXJmLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7IHJvdysrKSB7Ci0JLyogZ2xSYXN0ZXJQb3MzZCgwLjAsIHJvdyArIDEuMCwgMC41KTsgKi8KLQlnbFJhc3RlclBvczJpKDAsIHJvdyArIDEpOwotCWdsRHJhd1BpeGVscyhzdXJmLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCwgMSwgR0xfREVQVEhfQ09NUE9ORU5ULCB0eXBlLAotCQkgICAgICgodW5zaWduZWQgY2hhciAqKSBzdXJmLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlKSArIChyb3cgKiBzdXJmLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoKSk7Ci0gICAgfQotCi0gIHJlc3RvcmVfc3RhdGU6Ci0gICAgZ2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0gICAgaWYgKGQzZF9kZXYtPnN0YXRlX2Jsb2NrLnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9aRlVOQyAtIDFdICE9IEQzRENNUF9BTFdBWVMpCi0JZ2xEZXB0aEZ1bmMoY29udmVydF9EM0RfY29tcGFyZV90b19HTChkM2RfZGV2LT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfWkZVTkMgLSAxXSkpOwotICAgIGlmIChnbF9kM2RfZGV2LT5kZXB0aF90ZXN0ID09IDApIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLX0KLQotLyogVGhlc2UgYXJlIHRoZSB2YXJpb3VzIGhhbmRsZXIgdXNlZCBpbiB0aGUgZ2VuZXJpYyBwYXRoICovCi1pbmxpbmUgc3RhdGljIHZvaWQgaGFuZGxlX3h5eihEM0RWQUxVRSAqY29vcmRzKSB7Ci0gICAgZ2xWZXJ0ZXgzZnYoY29vcmRzKTsKLX0KLWlubGluZSBzdGF0aWMgdm9pZCBoYW5kbGVfeHl6cmh3KEQzRFZBTFVFICpjb29yZHMpIHsKLSAgICBpZiAoKGNvb3Jkc1szXSA8IDFlLTgpICYmIChjb29yZHNbM10gPiAtMWUtOCkpCi0gICAgICAgIGdsVmVydGV4M2Z2KGNvb3Jkcyk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIEdMZmxvYXQgdyA9IDEuMCAvIGNvb3Jkc1szXTsKLQkKLSAgICAgICAgZ2xWZXJ0ZXg0Zihjb29yZHNbMF0gKiB3LAotCQkgICBjb29yZHNbMV0gKiB3LAotCQkgICBjb29yZHNbMl0gKiB3LAotCQkgICB3KTsKLSAgICB9Ci19Ci1pbmxpbmUgc3RhdGljIHZvaWQgaGFuZGxlX25vcm1hbChEM0RWQUxVRSAqY29vcmRzKSB7Ci0gICAgZ2xOb3JtYWwzZnYoY29vcmRzKTsKLX0KLQotaW5saW5lIHN0YXRpYyB2b2lkIGhhbmRsZV9kaWZmdXNlX2Jhc2UoU1RBVEVCTE9DSyAqc2IsIERXT1JEICpjb2xvcikgewotICAgIGlmIChzYi0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0FMUEhBVEVTVEVOQUJMRSAtIDFdIHx8Ci0Jc2ItPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9BTFBIQUJMRU5ERU5BQkxFIC0gMV0pIHsKLSAgICAgICAgZ2xDb2xvcjR1YigoKmNvbG9yID4+IDE2KSAmIDB4RkYsCi0JCSAgICgqY29sb3IgPj4gIDgpICYgMHhGRiwKLQkJICAgKCpjb2xvciA+PiAgMCkgJiAweEZGLAotCQkgICAoKmNvbG9yID4+IDI0KSAmIDB4RkYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQ29sb3IzdWIoKCpjb2xvciA+PiAxNikgJiAweEZGLAotCQkgICAoKmNvbG9yID4+ICA4KSAmIDB4RkYsCi0JCSAgICgqY29sb3IgPj4gIDApICYgMHhGRik7ICAgIAotICAgIH0KLX0KLQotaW5saW5lIHN0YXRpYyB2b2lkIGhhbmRsZV9zcGVjdWxhcl9iYXNlKFNUQVRFQkxPQ0sgKnNiLCBEV09SRCAqY29sb3IpIHsKLSAgICBnbENvbG9yNHViKCgqY29sb3IgPj4gMTYpICYgMHhGRiwKLQkgICAgICAgKCpjb2xvciA+PiAgOCkgJiAweEZGLAotCSAgICAgICAoKmNvbG9yID4+ICAwKSAmIDB4RkYsCi0JICAgICAgICgqY29sb3IgPj4gMjQpICYgMHhGRik7IC8qIE5vIGlkZWEgaWYgdGhlIGFscGhhIGZpZWxkIGlzIHJlYWxseSB1c2VkLi4gKi8KLX0KLQotaW5saW5lIHN0YXRpYyB2b2lkIGhhbmRsZV9kaWZmdXNlKFNUQVRFQkxPQ0sgKnNiLCBEV09SRCAqY29sb3IsIEJPT0xFQU4gbGlnaHRlZCkgewotICAgIGlmICgobGlnaHRlZCA9PSBGQUxTRSkgJiYKLQlzYi0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0xJR0hUSU5HIC0gMV0gJiYKLQlzYi0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0NPTE9SVkVSVEVYIC0gMV0pIHsKLSAgICAgICAgaWYgKHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfRElGRlVTRU1BVEVSSUFMU09VUkNFIC0gMV0gPT0gRDNETUNTX0NPTE9SMSkgewotCSAgICBnbENvbG9yTWF0ZXJpYWwoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UpOwotCSAgICBoYW5kbGVfZGlmZnVzZV9iYXNlKHNiLCBjb2xvcik7Ci0JfQotCWlmIChzYi0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0FNQklFTlRNQVRFUklBTFNPVVJDRSAtIDFdID09IEQzRE1DU19DT0xPUjEpIHsKLQkgICAgZ2xDb2xvck1hdGVyaWFsKEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5UKTsKLQkgICAgaGFuZGxlX2RpZmZ1c2VfYmFzZShzYiwgY29sb3IpOwotCX0KLQlpZiAoKHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSAtIDFdID09IEQzRE1DU19DT0xPUjEpICYmCi0JICAgIHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1BFQ1VMQVJFTkFCTEUgLSAxXSkgewotCSAgICBnbENvbG9yTWF0ZXJpYWwoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NQRUNVTEFSKTsKLQkgICAgaGFuZGxlX2RpZmZ1c2VfYmFzZShzYiwgY29sb3IpOwotCX0KLQlpZiAoc2ItPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9FTUlTU0lWRU1BVEVSSUFMU09VUkNFIC0gMV0gPT0gRDNETUNTX0NPTE9SMSkgewotCSAgICBnbENvbG9yTWF0ZXJpYWwoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0VNSVNTSU9OKTsKLQkgICAgaGFuZGxlX2RpZmZ1c2VfYmFzZShzYiwgY29sb3IpOwotCX0KLSAgICB9IGVsc2UgewotICAgICAgICBoYW5kbGVfZGlmZnVzZV9iYXNlKHNiLCBjb2xvcik7Ci0gICAgfSAgICAKLX0KLQotaW5saW5lIHN0YXRpYyB2b2lkIGhhbmRsZV9zcGVjdWxhcihTVEFURUJMT0NLICpzYiwgRFdPUkQgKmNvbG9yLCBCT09MRUFOIGxpZ2h0ZWQpIHsKLSAgICBpZiAoKGxpZ2h0ZWQgPT0gRkFMU0UpICYmCi0Jc2ItPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9MSUdIVElORyAtIDFdICYmCi0Jc2ItPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9DT0xPUlZFUlRFWCAtIDFdKSB7Ci0gICAgICAgIGlmIChzYi0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0RJRkZVU0VNQVRFUklBTFNPVVJDRSAtIDFdID09IEQzRE1DU19DT0xPUjIpIHsKLQkgICAgZ2xDb2xvck1hdGVyaWFsKEdMX0ZST05UX0FORF9CQUNLLCBHTF9ESUZGVVNFKTsKLQkgICAgaGFuZGxlX3NwZWN1bGFyX2Jhc2Uoc2IsIGNvbG9yKTsKLQl9Ci0JaWYgKHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQU1CSUVOVE1BVEVSSUFMU09VUkNFIC0gMV0gPT0gRDNETUNTX0NPTE9SMikgewotCSAgICBnbENvbG9yTWF0ZXJpYWwoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0FNQklFTlQpOwotCSAgICBoYW5kbGVfc3BlY3VsYXJfYmFzZShzYiwgY29sb3IpOwotCX0KLQlpZiAoKHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSAtIDFdID09IEQzRE1DU19DT0xPUjIpICYmCi0JICAgIHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1BFQ1VMQVJFTkFCTEUgLSAxXSkgewotCSAgICBnbENvbG9yTWF0ZXJpYWwoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NQRUNVTEFSKTsKLQkgICAgaGFuZGxlX3NwZWN1bGFyX2Jhc2Uoc2IsIGNvbG9yKTsKLQl9Ci0JaWYgKHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSAtIDFdID09IEQzRE1DU19DT0xPUjIpIHsKLQkgICAgZ2xDb2xvck1hdGVyaWFsKEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTik7Ci0JICAgIGhhbmRsZV9zcGVjdWxhcl9iYXNlKHNiLCBjb2xvcik7Ci0JfQotICAgIH0KLSAgICAvKiBObyBlbHNlIGhlcmUgYXMgd2UgZG8gbm90IGtub3cgaG93IHRvIGhhbmRsZSAnc3BlY3VsYXInIG9uIGl0cyBvd24gaW4gYW55IGNhc2UuLiAqLwotfQotCi1pbmxpbmUgc3RhdGljIHZvaWQgaGFuZGxlX2RpZmZ1c2VfYW5kX3NwZWN1bGFyKFNUQVRFQkxPQ0sgKnNiLCBCWVRFICpmb2dfdGFibGUsIERXT1JEICpjb2xvcl9kLCBEV09SRCAqY29sb3JfcywgQk9PTEVBTiBsaWdodGVkKSB7Ci0gICAgaWYgKGxpZ2h0ZWQpIHsKLSAgICAgICAgRFdPUkQgY29sb3IgPSAqY29sb3JfZDsKLSAgICAgICAgaWYgKHNiLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfRk9HRU5BQkxFIC0gMV0pIHsKLQkgICAgLyogU3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBzcGVjdWxhciB2YWx1ZSBpcyB1c2VkIHRvIGRvIGZvZ2dpbmcgKi8KLQkgICAgQllURSBmb2dfaW50ZW5zaXR5ID0gKmNvbG9yX3MgPj4gMjQ7IC8qIFRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgc3BlY3VsYXIgY29tcG9uZW50IGlzIHRoZSBmb2cgJ2ludGVuc2l0eScgZm9yIHRoaXMgdmVydGV4ICovCi0JICAgIGNvbG9yICY9IDB4RkYwMDAwMDA7IC8qIE9ubHkga2VlcCB0aGUgYWxwaGEgY29tcG9uZW50ICovCi0JICAgIGNvbG9yIHw9IGZvZ190YWJsZVsoKCpjb2xvcl9kID4+ICAwKSAmIDB4RkYpIDw8IDggfCBmb2dfaW50ZW5zaXR5XSA8PCAgMDsKLQkgICAgY29sb3IgfD0gZm9nX3RhYmxlWygoKmNvbG9yX2QgPj4gIDgpICYgMHhGRikgPDwgOCB8IGZvZ19pbnRlbnNpdHldIDw8ICA4OwotCSAgICBjb2xvciB8PSBmb2dfdGFibGVbKCgqY29sb3JfZCA+PiAxNikgJiAweEZGKSA8PCA4IHwgZm9nX2ludGVuc2l0eV0gPDwgMTY7Ci0JfQotCWlmIChzYi0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1NQRUNVTEFSRU5BQkxFIC0gMV0pIHsKLQkgICAgLyogU3RhbmRhcmQgc3BlY3VsYXIgdmFsdWUgaW4gdHJhbnNmb3JtZWQgbW9kZS4gVE9ETyAqLwotCX0KLQloYW5kbGVfZGlmZnVzZV9iYXNlKHNiLCAmY29sb3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzYi0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0xJR0hUSU5HIC0gMV0pIHsKLQkgICAgaGFuZGxlX2RpZmZ1c2Uoc2IsIGNvbG9yX2QsIEZBTFNFKTsKLQkgICAgaGFuZGxlX3NwZWN1bGFyKHNiLCBjb2xvcl9zLCBGQUxTRSk7Ci0JfSBlbHNlIHsKLQkgICAgLyogSW4gdGhhdCBjYXNlLCBvbmx5IHB1dCB0aGUgZGlmZnVzZSBjb2xvci4uLiAqLwotCSAgICBoYW5kbGVfZGlmZnVzZV9iYXNlKHNiLCBjb2xvcl9kKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfdGV4dHVyZShEV09SRCBzaXplLCBjb25zdCBEM0RWQUxVRSAqY29vcmRzKSB7Ci0gICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgIGNhc2UgMTogZ2xUZXhDb29yZDFmdihjb29yZHMpOyBicmVhazsKLQljYXNlIDI6IGdsVGV4Q29vcmQyZnYoY29vcmRzKTsgYnJlYWs7Ci0JY2FzZSAzOiBnbFRleENvb3JkM2Z2KGNvb3Jkcyk7IGJyZWFrOwotCWNhc2UgNDogZ2xUZXhDb29yZDRmdihjb29yZHMpOyBicmVhazsKLSAgICB9Ci19Ci0KLWlubGluZSBzdGF0aWMgdm9pZCBoYW5kbGVfdGV4dHVyZXMoRFdPUkQgc2l6ZSwgY29uc3QgRDNEVkFMVUUgKmNvb3JkcywgaW50IHRleF9zdGFnZSkgewotICAgIGlmIChHTF9leHRlbnNpb25zLm1heF90ZXh0dXJlX3VuaXRzID4gMCkgewotCUdMX2V4dGVuc2lvbnMuZ2xNdWx0aVRleENvb3JkW3NpemUgLSAxXShHTF9URVhUVVJFMF9XSU5FICsgdGV4X3N0YWdlLCBjb29yZHMpOwotICAgIH0gZWxzZSB7Ci0JaWYgKHRleF9zdGFnZSA9PSAwKSBoYW5kbGVfdGV4dHVyZShzaXplLCBjb29yZHMpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZHJhd19wcmltaXRpdmVfc3RyaWRlZChJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLAotCQkJCSAgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotCQkJCSAgIERXT1JEIGQzZHZ0VmVydGV4VHlwZSwKLQkJCQkgICBMUEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSBscEQzRERyYXdQcmltU3RyaWRlRGF0YSwKLQkJCQkgICBEV09SRCBkd1ZlcnRleENvdW50LAotCQkJCSAgIExQV09SRCBkd0luZGljZXMsCi0JCQkJICAgRFdPUkQgZHdJbmRleENvdW50LAotCQkJCSAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgQk9PTEVBTiB2ZXJ0ZXhfbGlnaHRlZCA9IEZBTFNFOwotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCogZ2xUaGlzID0gKElEaXJlY3QzRERldmljZUdMSW1wbCopIFRoaXM7Ci0gICAgaW50IG51bV9hY3RpdmVfc3RhZ2VzID0gMDsKLSAgICBpbnQgbnVtX3RleF9pbmRleCA9IEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUpOwotICAgIEJPT0wgcmVlbmFibGVfZGVwdGhfdGVzdCA9IEZBTFNFOwotICAgIAotICAgIC8qIEkgcHV0IHRoZSB0cmFjZSBiZWZvcmUgdGhlIHZhcmlvdXMgbG9ja3MuLi4gU28gYXMgdG8gYmV0dGVyIHVuZGVyc3RhbmQgd2hlcmUgbG9ja3Mgb2NjdXIgOi0pICovCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiIFZlcnRleCBmb3JtYXQgOiAiKTsgZHVtcF9mbGV4aWJsZV92ZXJ0ZXgoZDNkdnRWZXJ0ZXhUeXBlKTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIHRvIHByZXZlbnQgJ3RocmVhZCBjb250ZW50aW9uJyBiZXR3ZWVuIGEgdGhyZWFkIGxvY2tpbmcgdGhlIGRldmljZSBhbmQgYW5vdGhlcgotICAgICAgIGRvaW5nIDNEIGRpc3BsYXkgb24gaXQuLi4gKi8KLSAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmKFRoaXMtPmNyaXQpKTsgICAKLSAgICAKLSAgICBFTlRFUl9HTCgpOwotICAgIGlmIChnbFRoaXMtPnN0YXRlW1dJTkVfR0xfQlVGRkVSX0JBQ0tdID09IFNVUkZBQ0VfTUVNT1JZX0RJUlRZKSB7Ci0gICAgICAgIFRoaXMtPmZsdXNoX3RvX2ZyYW1lYnVmZmVyKFRoaXMsICYoZ2xUaGlzLT5sb2NrX3JlY3RbV0lORV9HTF9CVUZGRVJfQkFDS10pLCBnbFRoaXMtPmxvY2tfc3VyZltXSU5FX0dMX0JVRkZFUl9CQUNLXSk7Ci0gICAgfQotICAgIGdsVGhpcy0+c3RhdGVbV0lORV9HTF9CVUZGRVJfQkFDS10gPSBTVVJGQUNFX0dMOwotCi0gICAgaWYgKFRoaXMtPmN1cnJlbnRfemJ1ZmZlciA9PSBOVUxMKSB7Ci0JLyogU2VhcmNoIGZvciBhbiBhdHRhY2hlZCBaQnVmZmVyICovCi0Jc3RhdGljIGNvbnN0IEREU0NBUFMyIHpidWZfY2FwcyA9IHsgRERTQ0FQU19aQlVGRkVSLCAwLCAwLCAwIH07Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTcgemJ1ZjsKLQlIUkVTVUxUIGhyOwotCQotCWhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRBdHRhY2hlZFN1cmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+c3VyZmFjZSwgSURpcmVjdERyYXdTdXJmYWNlNyksCi0JCQkJCQkgICAgKEREU0NBUFMyICopICZ6YnVmX2NhcHMsICZ6YnVmKTsKLQlpZiAoU1VDQ0VFREVEKGhyKSkgewotCSAgICBUaGlzLT5jdXJyZW50X3pidWZmZXIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCB6YnVmKTsKLQkgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHpidWYpOwotCX0gZWxzZSBpZiAoZ2xUaGlzLT5kZXB0aF90ZXN0KSB7Ci0JICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLQkgICAgcmVlbmFibGVfZGVwdGhfdGVzdCA9IFRSVUU7Ci0JfQotICAgIH0KLSAgICBpZiAoVGhpcy0+Y3VycmVudF96YnVmZmVyICE9IE5VTEwpIHsKLQlpZiAoVGhpcy0+Y3VycmVudF96YnVmZmVyLT5nZXRfZGlydHlfc3RhdHVzKFRoaXMtPmN1cnJlbnRfemJ1ZmZlciwgTlVMTCkpIHsKLQkgICAgZmx1c2hfemJ1ZmZlcl90b19HTChUaGlzLCBOVUxMLCBUaGlzLT5jdXJyZW50X3pidWZmZXIpOwotCX0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCAoKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSAhPSBEM0RGVkZfWFlaKSB8fAotICAgICAgICAgKChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfTk9STUFMKSA9PSAwKSApCi0gICAgICAgIHZlcnRleF9saWdodGVkID0gVFJVRTsKLSAgICAKLSAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYWN0aXZlIHRleHR1cmUgc3RhZ2VzIGFuZCBzZXQgdGhlIHZhcmlvdXMgdGV4dHVyZSBwYXJhbWV0ZXJzICovCi0gICAgbnVtX2FjdGl2ZV9zdGFnZXMgPSBkcmF3X3ByaW1pdGl2ZV9oYW5kbGVfdGV4dHVyZXMoVGhpcyk7Ci0KLSAgICAvKiBBbmQgcmVzdG9yZSB0byBoYW5kbGUgJzAnIGluIHRoZSBjYXNlIHdlIHVzZSBnbFRleENvb3JkIGNhbGxzICovCi0gICAgaWYgKGdsVGhpcy0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgIT0gR0xfVEVYVFVSRTBfV0lORSkgewotCUdMX2V4dGVuc2lvbnMuZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwX1dJTkUpOwotCWdsVGhpcy0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSBHTF9URVhUVVJFMF9XSU5FOwotICAgIH0KLQotICAgIGRyYXdfcHJpbWl0aXZlX2hhbmRsZV9HTF9zdGF0ZShUaGlzLAotCQkJCSAgIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykgIT0gRDNERlZGX1hZWiwKLQkJCQkgICB2ZXJ0ZXhfbGlnaHRlZCk7Ci0KLSAgICAvKiBGaXJzdCwgc2VlIGlmIHdlIGNhbiB1c2UgdGhlIE9wZW5HTCB2ZXJ0ZXggYXJyYXlzLi4uIFRoaXMgaXMgdmVyeSBsaW1pdGVkCi0gICAgICAgZm9yIG5vdyB0byBzb21lICdzcGVjaWFsJyBjYXNlcyB3aGVyZSB3ZSBjYW4gZG8gYSBkaXJlY3QgbWFwcGluZyBiZXR3ZWVuIEQzRAotICAgICAgIHR5cGVzIGFuZCBHTCB0eXBlcy4KLQotICAgICAgIE5vdGU6IGluIHRoZSBmdXR1cmUgYWxsIGNhbGxzIHdpbGwgZ28gdGhyb3VnaCB2ZXJ0ZXggYXJyYXlzIGJ1dCB0aGUgYXJyYXlzCi0gICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgdGhpcyBmdW5jdGlvbi4KLQotICAgICAgIE5vdGUyOiBjb2xvdXJzIGNhbm5vdCBiZSBtYXBwZWQgZGlyZWN0bHkgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgYXMgQkdSQSBpbiBtZW1vcnkKLSAgICAgICAgICAgICAgKGllIG5vdCBhcyBhbiBhcnJheSBvZiBSLCBHLCBCLCBBIGFzIE9wZW5HTCBkb2VzIGl0IGJ1dCBhcyBhIExXT1JEIDB4QUFSUkdHQkIKLQkgICAgICB3aGljaCwgYXMgd2UgYXJlIGxpdHRsZSBpbmRpYW4sIGdpdmVzIGEgQiwgRywgUiwgQSBzdG9yYWdlIGluIG1lbW9yeS4KLSAgICAqLwotICAgIGlmICgoKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSA9PSBEM0RGVkZfWFlaKSAmJiAvKiBTdGFuZGFyZCBYWVogdmVydGljZXMgKi8KLQkoKGQzZHZ0VmVydGV4VHlwZSAmIChEM0RGVkZfRElGRlVTRXxEM0RGVkZfU1BFQ1VMQVIpKSA9PSAwKSkgewotCWludCB0ZXhfc3RhZ2U7Ci0JVFJBQ0UoIiB1c2luZyBHTCB2ZXJ0ZXggYXJyYXlzIGZvciBwZXJmb3JtYW5jZSAhXG4iKTsKLQkvKiBGaXJzdCwgdGhlIHZlcnRpY2VzICh3ZSBhcmUgc3VyZSB3ZSBoYXZlIHNvbWUgOi0pICovCi0JZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotCWdsVmVydGV4UG9pbnRlcigzLCBHTF9GTE9BVCwgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnBvc2l0aW9uLmR3U3RyaWRlLCBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+cG9zaXRpb24ubHB2RGF0YSk7Ci0JLyogVGhlbiB0aGUgbm9ybWFscyAqLwotCWlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfTk9STUFMKSB7Ci0JICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLQkgICAgZ2xOb3JtYWxQb2ludGVyKEdMX0ZMT0FULCBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+bm9ybWFsLmR3U3RyaWRlLCBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+bm9ybWFsLmxwdkRhdGEpOwotCX0KLQkvKiBUaGVuIHRoZSBkaWZmdXNlIGNvbG91ciAqLwotCWlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfRElGRlVTRSkgewotCSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLQkgICAgZ2xDb2xvclBvaW50ZXIoMywgR0xfVU5TSUdORURfQllURSwgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPm5vcm1hbC5kd1N0cmlkZSwKLQkJCSAgICgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5scHZEYXRhKSk7Ci0JfQotCS8qIFRoZW4gdGhlIHZhcmlvdXMgdGV4dHVyZXMgKi8KLQlmb3IgKHRleF9zdGFnZSA9IDA7IHRleF9zdGFnZSA8IG51bV9hY3RpdmVfc3RhZ2VzOyB0ZXhfc3RhZ2UrKykgewotCSAgICBpbnQgdGV4X2luZGV4ID0gVGhpcy0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVt0ZXhfc3RhZ2VdW0QzRFRTU19URVhDT09SRElOREVYIC0gMV0gJiAweDAwMDBGRkZGOwotCSAgICBpZiAodGV4X2luZGV4ID49IG51bV90ZXhfaW5kZXgpIHsKLQkJV0FSTigiRGVmYXVsdCB0ZXh0dXJlIGNvb3JkaW5hdGUgbm90IGhhbmRsZWQgaW4gdGhlIHZlcnRleCBhcnJheSBwYXRoICEhIVxuIik7Ci0JCXRleF9pbmRleCA9IG51bV90ZXhfaW5kZXggLSAxOwotCSAgICB9Ci0JICAgIGlmIChHTF9leHRlbnNpb25zLmdsQ2xpZW50QWN0aXZlVGV4dHVyZSkgewotCQlHTF9leHRlbnNpb25zLmdsQ2xpZW50QWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMF9XSU5FICsgdGV4X3N0YWdlKTsKLQkgICAgfQotCSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotCSAgICBnbFRleENvb3JkUG9pbnRlcihHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIHRleF9pbmRleCksIEdMX0ZMT0FULCBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1t0ZXhfaW5kZXhdLmR3U3RyaWRlLAotCQkJICAgICAgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnRleHR1cmVDb29yZHNbdGV4X2luZGV4XS5scHZEYXRhKTsKLQl9Ci0JaWYgKGR3SW5kaWNlcyAhPSBOVUxMKSB7Ci0JICAgIGdsRHJhd0VsZW1lbnRzKGNvbnZlcnRfRDNEX3B0eXBlX3RvX0dMKGQzZHB0UHJpbWl0aXZlVHlwZSksIGR3SW5kZXhDb3VudCwgR0xfVU5TSUdORURfU0hPUlQsIGR3SW5kaWNlcyk7Ci0JfSBlbHNlIHsKLQkgICAgZ2xEcmF3QXJyYXlzKGNvbnZlcnRfRDNEX3B0eXBlX3RvX0dMKGQzZHB0UHJpbWl0aXZlVHlwZSksIDAsIGR3SW5kZXhDb3VudCk7Ci0JfQotCWdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0JaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9OT1JNQUwpIHsKLQkgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLQl9Ci0JaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9ESUZGVVNFKSB7Ci0JICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLQl9Ci0JZm9yICh0ZXhfc3RhZ2UgPSAwOyB0ZXhfc3RhZ2UgPCBudW1fYWN0aXZlX3N0YWdlczsgdGV4X3N0YWdlKyspIHsKLQkgICAgaWYgKEdMX2V4dGVuc2lvbnMuZ2xDbGllbnRBY3RpdmVUZXh0dXJlKSB7Ci0JCUdMX2V4dGVuc2lvbnMuZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwX1dJTkUgKyB0ZXhfc3RhZ2UpOwotCSAgICB9Ci0JICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotCX0KLSAgICB9IGVsc2UgewotCWdsQmVnaW4oY29udmVydF9EM0RfcHR5cGVfdG9fR0woZDNkcHRQcmltaXRpdmVUeXBlKSk7Ci0JCi0JLyogU29tZSBmYXN0IHBhdGhzIGZpcnN0IGJlZm9yZSB0aGUgZ2VuZXJpYyBjYXNlLi4uLiAqLwotCWlmICgoZDNkdnRWZXJ0ZXhUeXBlID09IEQzREZWRl9WRVJURVgpICYmIChudW1fYWN0aXZlX3N0YWdlcyA8PSAxKSkgewotCSAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0JICAgIAotCSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBkd0luZGV4Q291bnQ7IGluZGV4KyspIHsKLQkJaW50IGkgPSAoZHdJbmRpY2VzID09IE5VTEwpID8gaW5kZXggOiBkd0luZGljZXNbaW5kZXhdOwotCQlEM0RWQUxVRSAqbm9ybWFsID0gCi0JCSAgICAoRDNEVkFMVUUgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+bm9ybWFsLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5ub3JtYWwuZHdTdHJpZGUpOwotCQlEM0RWQUxVRSAqdGV4X2Nvb3JkID0KLQkJICAgIChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT50ZXh0dXJlQ29vcmRzWzBdLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT50ZXh0dXJlQ29vcmRzWzBdLmR3U3RyaWRlKTsKLQkJRDNEVkFMVUUgKnBvc2l0aW9uID0KLQkJICAgIChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5wb3NpdGlvbi5scHZEYXRhKSArIGkgKiBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+cG9zaXRpb24uZHdTdHJpZGUpOwotCQkKLQkJaGFuZGxlX25vcm1hbChub3JtYWwpOwotCQloYW5kbGVfdGV4dHVyZSgyLCB0ZXhfY29vcmQpOwotCQloYW5kbGVfeHl6KHBvc2l0aW9uKTsKLQkJCi0JCVRSQUNFXyhkZHJhd19nZW9tKSgiICVmICVmICVmIC8gJWYgJWYgJWYgKCVmICVmKVxuIiwKLQkJCQkgICBwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIHBvc2l0aW9uWzJdLAotCQkJCSAgIG5vcm1hbFswXSwgbm9ybWFsWzFdLCBub3JtYWxbMl0sCi0JCQkJICAgdGV4X2Nvb3JkWzBdLCB0ZXhfY29vcmRbMV0pOwotCSAgICB9Ci0JfSBlbHNlIGlmICgoZDNkdnRWZXJ0ZXhUeXBlID09IEQzREZWRl9UTFZFUlRFWCkgJiYgKG51bV9hY3RpdmVfc3RhZ2VzIDw9IDEpKSB7Ci0JICAgIHVuc2lnbmVkIGludCBpbmRleDsKLQkgICAgCi0JICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGR3SW5kZXhDb3VudDsgaW5kZXgrKykgewotCQlpbnQgaSA9IChkd0luZGljZXMgPT0gTlVMTCkgPyBpbmRleCA6IGR3SW5kaWNlc1tpbmRleF07Ci0JCURXT1JEICpjb2xvcl9kID0gCi0JCSAgICAoRFdPUkQgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5scHZEYXRhKSArIGkgKiBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5kd1N0cmlkZSk7Ci0JCURXT1JEICpjb2xvcl9zID0gCi0JCSAgICAoRFdPUkQgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+c3BlY3VsYXIubHB2RGF0YSkgKyBpICogbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnNwZWN1bGFyLmR3U3RyaWRlKTsKLQkJRDNEVkFMVUUgKnRleF9jb29yZCA9Ci0JCSAgICAoRDNEVkFMVUUgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1swXS5scHZEYXRhKSArIGkgKiBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1swXS5kd1N0cmlkZSk7Ci0JCUQzRFZBTFVFICpwb3NpdGlvbiA9Ci0JCSAgICAoRDNEVkFMVUUgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+cG9zaXRpb24ubHB2RGF0YSkgKyBpICogbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnBvc2l0aW9uLmR3U3RyaWRlKTsKLQkJCi0JCWhhbmRsZV9kaWZmdXNlX2FuZF9zcGVjdWxhcigmKFRoaXMtPnN0YXRlX2Jsb2NrKSwgZ2xUaGlzLT5mb2dfdGFibGUsIGNvbG9yX2QsIGNvbG9yX3MsIFRSVUUpOwotCQloYW5kbGVfdGV4dHVyZSgyLCB0ZXhfY29vcmQpOwotCQloYW5kbGVfeHl6cmh3KHBvc2l0aW9uKTsKLQkJCi0JCVRSQUNFXyhkZHJhd19nZW9tKSgiICVmICVmICVmICVmIC8gJTAybHggJTAybHggJTAybHggJTAybHggLSAlMDJseCAlMDJseCAlMDJseCAlMDJseCAoJWYgJWYpXG4iLAotCQkJCSAgIHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0sIHBvc2l0aW9uWzNdLCAKLQkJCQkgICAoKmNvbG9yX2QgPj4gMTYpICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX2QgPj4gIDgpICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX2QgPj4gIDApICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX2QgPj4gMjQpICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX3MgPj4gMTYpICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX3MgPj4gIDgpICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX3MgPj4gIDApICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX3MgPj4gMjQpICYgMHhGRiwKLQkJCQkgICB0ZXhfY29vcmRbMF0sIHRleF9jb29yZFsxXSk7Ci0JICAgIH0gCi0JfSBlbHNlIGlmICgoKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSA9PSBEM0RGVkZfWFlaKSB8fAotCQkgICAoKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSA9PSBEM0RGVkZfWFlaUkhXKSkgewotCSAgICAvKiBUaGlzIGlzIHRoZSAnc2xvdyBwYXRoJyBidXQgdGhhdCBzaG91bGQgc3VwcG9ydCBhbGwgcG9zc2libGUgdmVydGV4IGZvcm1hdHMgb3V0IHRoZXJlLi4uCi0JICAgICAgIE5vdGUgdGhhdCBwZW9wbGUgc2hvdWxkIHdyaXRlIGEgZmFzdCBwYXRoIGZvciBhbGwgdmVydGV4IGZvcm1hdHMgb3V0IHRoZXJlLi4uCi0JICAgICAgICovICAKLQkgICAgdW5zaWduZWQgaW50IGluZGV4OwotCSAgICAvKiBzdGF0aWMgY29uc3QgRDNEVkFMVUUgbm9faW5kZXhbXSA9IHsgMC4wLCAwLjAsIDAuMCwgMC4wIH07ICovCi0JICAgIAotCSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBkd0luZGV4Q291bnQ7IGluZGV4KyspIHsKLQkJaW50IGkgPSAoZHdJbmRpY2VzID09IE5VTEwpID8gaW5kZXggOiBkd0luZGljZXNbaW5kZXhdOwotCQlpbnQgdGV4X3N0YWdlOwotCQkKLQkJaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9OT1JNQUwpIHsgCi0JCSAgICBEM0RWQUxVRSAqbm9ybWFsID0gCi0JCQkoRDNEVkFMVUUgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+bm9ybWFsLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5ub3JtYWwuZHdTdHJpZGUpOwkgICAgCi0JCSAgICBoYW5kbGVfbm9ybWFsKG5vcm1hbCk7Ci0JCX0KLQkJaWYgKChkM2R2dFZlcnRleFR5cGUgJiAoRDNERlZGX0RJRkZVU0V8RDNERlZGX1NQRUNVTEFSKSkgPT0gKEQzREZWRl9ESUZGVVNFfEQzREZWRl9TUEVDVUxBUikpIHsKLQkJICAgIERXT1JEICpjb2xvcl9kID0gCi0JCQkoRFdPUkQgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5scHZEYXRhKSArIGkgKiBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5kd1N0cmlkZSk7Ci0JCSAgICBEV09SRCAqY29sb3JfcyA9IAotCQkJKERXT1JEICopICgoKGNoYXIgKikgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnNwZWN1bGFyLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5zcGVjdWxhci5kd1N0cmlkZSk7Ci0JCSAgICBoYW5kbGVfZGlmZnVzZV9hbmRfc3BlY3VsYXIoJihUaGlzLT5zdGF0ZV9ibG9jayksIGdsVGhpcy0+Zm9nX3RhYmxlLCBjb2xvcl9kLCBjb2xvcl9zLCB2ZXJ0ZXhfbGlnaHRlZCk7Ci0JCX0gZWxzZSB7Ci0JCSAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1NQRUNVTEFSKSB7IAotCQkJRFdPUkQgKmNvbG9yX3MgPSAKLQkJCSAgICAoRFdPUkQgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+c3BlY3VsYXIubHB2RGF0YSkgKyBpICogbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnNwZWN1bGFyLmR3U3RyaWRlKTsKLQkJCWhhbmRsZV9zcGVjdWxhcigmKFRoaXMtPnN0YXRlX2Jsb2NrKSwgY29sb3JfcywgdmVydGV4X2xpZ2h0ZWQpOwotCQkgICAgfSBlbHNlIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfRElGRlVTRSkgewotCQkJRFdPUkQgKmNvbG9yX2QgPSAKLQkJCSAgICAoRFdPUkQgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5scHZEYXRhKSArIGkgKiBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5kd1N0cmlkZSk7Ci0JCQloYW5kbGVfZGlmZnVzZSgmKFRoaXMtPnN0YXRlX2Jsb2NrKSwgY29sb3JfZCwgdmVydGV4X2xpZ2h0ZWQpOwotCQkgICAgfQotCQl9Ci0JCQotCQlmb3IgKHRleF9zdGFnZSA9IDA7IHRleF9zdGFnZSA8IG51bV9hY3RpdmVfc3RhZ2VzOyB0ZXhfc3RhZ2UrKykgewotCQkgICAgaW50IHRleF9pbmRleCA9IFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbdGV4X3N0YWdlXVtEM0RUU1NfVEVYQ09PUkRJTkRFWCAtIDFdICYgMHgwMDAwRkZGRjsKLQkJICAgIEQzRFZBTFVFICp0ZXhfY29vcmQ7Ci0JCSAgICAKLQkJICAgIGlmICh0ZXhfaW5kZXggPj0gbnVtX3RleF9pbmRleCkgewotCQkJLyogVGhpcyB3aWxsIGhhdmUgdG8gYmUgY2hlY2tlZCBvbiBXaW5kb3dzLiBSZWFsTVlTVCB1c2VzIHRoaXMgZmVhdHVyZSBhbmQgSSB3b3VsZCBmaW5kIGl0IG1vcmUKLQkJCSAqIGxvZ2ljYWwgdG8gcmUtdXNlIHRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXMgc3RhZ2UgdGhhbiBhIGRlZmF1bHQgaW5kZXggb2YgJzAnLgotCQkJICovCi0JCQkKLQkJCS8qIGhhbmRsZV90ZXh0dXJlcygoY29uc3QgRDNEVkFMVUUgKikgbm9faW5kZXgsIHRleF9zdGFnZSk7ICovCi0JCQl0ZXhfaW5kZXggPSBudW1fdGV4X2luZGV4IC0gMTsKLQkJICAgIH0KLQkJICAgIHRleF9jb29yZCA9IChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT50ZXh0dXJlQ29vcmRzW3RleF9pbmRleF0ubHB2RGF0YSkgKyAKLQkJCQkJICAgICAgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT50ZXh0dXJlQ29vcmRzW3RleF9pbmRleF0uZHdTdHJpZGUpOwotCQkgICAgaGFuZGxlX3RleHR1cmVzKEdFVF9URVhDT09SRF9TSVpFX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSwgdGV4X2luZGV4KSwgdGV4X2Nvb3JkLCB0ZXhfc3RhZ2UpOwotCQl9Ci0JCQotCQlpZiAoKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSA9PSBEM0RGVkZfWFlaKSB7Ci0JCSAgICBEM0RWQUxVRSAqcG9zaXRpb24gPQotCQkJKEQzRFZBTFVFICopICgoKGNoYXIgKikgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnBvc2l0aW9uLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5wb3NpdGlvbi5kd1N0cmlkZSk7Ci0JCSAgICBoYW5kbGVfeHl6KHBvc2l0aW9uKTsKLQkJfSBlbHNlIGlmICgoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1BPU0lUSU9OX01BU0spID09IEQzREZWRl9YWVpSSFcpIHsKLQkJICAgIEQzRFZBTFVFICpwb3NpdGlvbiA9Ci0JCQkoRDNEVkFMVUUgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+cG9zaXRpb24ubHB2RGF0YSkgKyBpICogbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnBvc2l0aW9uLmR3U3RyaWRlKTsKLQkJICAgIGhhbmRsZV94eXpyaHcocG9zaXRpb24pOwotCQl9Ci0JCQotCQlpZiAoVFJBQ0VfT04oZGRyYXdfZ2VvbSkpIHsKLQkJICAgIHVuc2lnbmVkIGludCB0ZXhfaW5kZXg7Ci0JCSAgICAKLQkJICAgIGlmICgoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1BPU0lUSU9OX01BU0spID09IEQzREZWRl9YWVopIHsKLQkJCUQzRFZBTFVFICpwb3NpdGlvbiA9Ci0JCQkgICAgKEQzRFZBTFVFICopICgoKGNoYXIgKikgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnBvc2l0aW9uLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5wb3NpdGlvbi5kd1N0cmlkZSk7Ci0JCQlUUkFDRV8oZGRyYXdfZ2VvbSkoIiAlZiAlZiAlZiIsIHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0pOwotCQkgICAgfSBlbHNlIGlmICgoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1BPU0lUSU9OX01BU0spID09IEQzREZWRl9YWVpSSFcpIHsKLQkJCUQzRFZBTFVFICpwb3NpdGlvbiA9Ci0JCQkgICAgKEQzRFZBTFVFICopICgoKGNoYXIgKikgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnBvc2l0aW9uLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5wb3NpdGlvbi5kd1N0cmlkZSk7Ci0JCQlUUkFDRV8oZGRyYXdfZ2VvbSkoIiAlZiAlZiAlZiAlZiIsIHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0sIHBvc2l0aW9uWzNdKTsKLQkJICAgIH0KLQkJICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfTk9STUFMKSB7IAotCQkJRDNEVkFMVUUgKm5vcm1hbCA9IAotCQkJICAgIChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5ub3JtYWwubHB2RGF0YSkgKyBpICogbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPm5vcm1hbC5kd1N0cmlkZSk7CSAgICAKLQkJCVRSQUNFXyhkZHJhd19nZW9tKSgiIC8gJWYgJWYgJWYiLCBub3JtYWxbMF0sIG5vcm1hbFsxXSwgbm9ybWFsWzJdKTsKLQkJICAgIH0KLQkJICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfRElGRlVTRSkgewotCQkJRFdPUkQgKmNvbG9yX2QgPSAKLQkJCSAgICAoRFdPUkQgKikgKCgoY2hhciAqKSBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5scHZEYXRhKSArIGkgKiBscEQzRERyYXdQcmltU3RyaWRlRGF0YS0+ZGlmZnVzZS5kd1N0cmlkZSk7Ci0JCQlUUkFDRV8oZGRyYXdfZ2VvbSkoIiAvICUwMmx4ICUwMmx4ICUwMmx4ICUwMmx4IiwKLQkJCQkJICAgKCpjb2xvcl9kID4+IDE2KSAmIDB4RkYsCi0JCQkJCSAgICgqY29sb3JfZCA+PiAgOCkgJiAweEZGLAotCQkJCQkgICAoKmNvbG9yX2QgPj4gIDApICYgMHhGRiwKLQkJCQkJICAgKCpjb2xvcl9kID4+IDI0KSAmIDB4RkYpOwotCQkgICAgfQotCQkgICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9TUEVDVUxBUikgeyAKLQkJCURXT1JEICpjb2xvcl9zID0gCi0JCQkgICAgKERXT1JEICopICgoKGNoYXIgKikgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnNwZWN1bGFyLmxwdkRhdGEpICsgaSAqIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT5zcGVjdWxhci5kd1N0cmlkZSk7Ci0JCQlUUkFDRV8oZGRyYXdfZ2VvbSkoIiAvICUwMmx4ICUwMmx4ICUwMmx4ICUwMmx4IiwKLQkJCQkJICAgKCpjb2xvcl9zID4+IDE2KSAmIDB4RkYsCi0JCQkJCSAgICgqY29sb3JfcyA+PiAgOCkgJiAweEZGLAotCQkJCQkgICAoKmNvbG9yX3MgPj4gIDApICYgMHhGRiwKLQkJCQkJICAgKCpjb2xvcl9zID4+IDI0KSAmIDB4RkYpOwotCQkgICAgfQotCQkgICAgZm9yICh0ZXhfaW5kZXggPSAwOyB0ZXhfaW5kZXggPCBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlKTsgdGV4X2luZGV4KyspIHsKLQkJCUQzRFZBTFVFICp0ZXhfY29vcmQgPQotCQkJICAgIChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLT50ZXh0dXJlQ29vcmRzW3RleF9pbmRleF0ubHB2RGF0YSkgKyAKLQkJCQkJICBpICogbHBEM0REcmF3UHJpbVN0cmlkZURhdGEtPnRleHR1cmVDb29yZHNbdGV4X2luZGV4XS5kd1N0cmlkZSk7Ci0JCQlzd2l0Y2ggKEdFVF9URVhDT09SRF9TSVpFX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSwgdGV4X2luZGV4KSkgewotCQkJICAgIGNhc2UgMTogVFJBQ0VfKGRkcmF3X2dlb20pKCIgLyAlZiIsIHRleF9jb29yZFswXSk7IGJyZWFrOwotCQkJICAgIGNhc2UgMjogVFJBQ0VfKGRkcmF3X2dlb20pKCIgLyAlZiAlZiIsIHRleF9jb29yZFswXSwgdGV4X2Nvb3JkWzFdKTsgYnJlYWs7Ci0JCQkgICAgY2FzZSAzOiBUUkFDRV8oZGRyYXdfZ2VvbSkoIiAvICVmICVmICVmIiwgdGV4X2Nvb3JkWzBdLCB0ZXhfY29vcmRbMV0sIHRleF9jb29yZFsyXSk7IGJyZWFrOwotCQkJICAgIGNhc2UgNDogVFJBQ0VfKGRkcmF3X2dlb20pKCIgLyAlZiAlZiAlZiAlZiIsIHRleF9jb29yZFswXSwgdGV4X2Nvb3JkWzFdLCB0ZXhfY29vcmRbMl0sIHRleF9jb29yZFszXSk7IGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6IFRSQUNFXyhkZHJhd19nZW9tKSgiSW52YWxpZCB0ZXh0dXJlIHNpemUgKCVsZCkgISEhIiwgR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCB0ZXhfaW5kZXgpKTsgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgICBUUkFDRV8oZGRyYXdfZ2VvbSkoIlxuIik7Ci0JCX0KLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIEVSUigiIG1hdHJpeCB3ZWlnaHRpbmcgbm90IGhhbmRsZWQgeWV0Li4uLlxuIik7Ci0JfQotCQotCWdsRW5kKCk7Ci0gICAgfQotCi0gICAgLyogV2hhdGV2ZXIgdGhlIGNhc2UsIGRpc2FibGUgdGhlIGNvbG9yIG1hdGVyaWFsIHN0dWZmICovCi0gICAgZ2xEaXNhYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKLQotICAgIGlmIChyZWVuYWJsZV9kZXB0aF90ZXN0KQotCWdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotCi0gICAgTEVBVkVfR0woKTsKLSAgICBUUkFDRSgiRW5kXG4iKTsgICAgCi0KLSAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmKFRoaXMtPmNyaXQpKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3UHJpbWl0aXZlKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkgIEQzRFBSSU1JVElWRVRZUEUgZDNkcHRQcmltaXRpdmVUeXBlLAotCQkJCQkgIERXT1JEIGQzZHZ0VmVydGV4VHlwZSwKLQkJCQkJICBMUFZPSUQgbHB2VmVydGljZXMsCi0JCQkJCSAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLQkJCQkJICBEV09SRCBkd0ZsYWdzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgc3RyaWRlZDsKLQotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGQzZHZ0VmVydGV4VHlwZSwgbHB2VmVydGljZXMsIGR3VmVydGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICBjb252ZXJ0X0ZWRl90b19zdHJpZGVkX2RhdGEoZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgJnN0cmlkZWQsIDApOwotICAgIGRyYXdfcHJpbWl0aXZlX3N0cmlkZWQoVGhpcywgZDNkcHRQcmltaXRpdmVUeXBlLCBkM2R2dFZlcnRleFR5cGUsICZzdHJpZGVkLCBkd1ZlcnRleENvdW50LCBOVUxMLCBkd1ZlcnRleENvdW50LCBkd0ZsYWdzKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfRHJhd0luZGV4ZWRQcmltaXRpdmUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJCQkgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0JCQkJCQkgRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlLAotCQkJCQkJIExQVk9JRCBscHZWZXJ0aWNlcywKLQkJCQkJCSBEV09SRCBkd1ZlcnRleENvdW50LAotCQkJCQkJIExQV09SRCBkd0luZGljZXMsCi0JCQkJCQkgRFdPUkQgZHdJbmRleENvdW50LAotCQkJCQkJIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSBzdHJpZGVkOwotCi0gICAgVFJBQ0UoIiglcC8lcCktPiglMDh4LCUwOGx4LCVwLCUwOGx4LCVwLCUwOGx4LCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgZHdWZXJ0ZXhDb3VudCwgZHdJbmRpY2VzLCBkd0luZGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICBjb252ZXJ0X0ZWRl90b19zdHJpZGVkX2RhdGEoZDNkdnRWZXJ0ZXhUeXBlLCBscHZWZXJ0aWNlcywgJnN0cmlkZWQsIDApOwotICAgIGRyYXdfcHJpbWl0aXZlX3N0cmlkZWQoVGhpcywgZDNkcHRQcmltaXRpdmVUeXBlLCBkM2R2dFZlcnRleFR5cGUsICZzdHJpZGVkLCBkd1ZlcnRleENvdW50LCBkd0luZGljZXMsIGR3SW5kZXhDb3VudCwgZHdGbGFncyk7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdQcmltaXRpdmVTdHJpZGVkKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSBscEQzRERyYXdQcmltU3RyaWRlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3VmVydGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLQotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4eCwlMDhseCwlcCwlMDhseCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGR3VmVydGV4VHlwZSwgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsIGR3VmVydGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0gICAgZHJhd19wcmltaXRpdmVfc3RyaWRlZChUaGlzLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGR3VmVydGV4VHlwZSwgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsIGR3VmVydGV4Q291bnQsIE5VTEwsIGR3VmVydGV4Q291bnQsIGR3RmxhZ3MpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgbHBEM0REcmF3UHJpbVN0cmlkZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgbHBJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luZGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0KLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOHgsJTA4bHgsJXAsJTA4bHgsJXAsJTA4bHgsJTA4bHgpXG4iLCBUaGlzLCBpZmFjZSwgZDNkcHRQcmltaXRpdmVUeXBlLCBkd1ZlcnRleFR5cGUsIGxwRDNERHJhd1ByaW1TdHJpZGVEYXRhLCBkd1ZlcnRleENvdW50LCBscEluZGV4LCBkd0luZGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICBkcmF3X3ByaW1pdGl2ZV9zdHJpZGVkKFRoaXMsIGQzZHB0UHJpbWl0aXZlVHlwZSwgZHdWZXJ0ZXhUeXBlLCBscEQzRERyYXdQcmltU3RyaWRlRGF0YSwgZHdWZXJ0ZXhDb3VudCwgbHBJbmRleCwgZHdJbmRleENvdW50LCBkd0ZsYWdzKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3UHJpbWl0aXZlVkIoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJCSAgICBEM0RQUklNSVRJVkVUWVBFIGQzZHB0UHJpbWl0aXZlVHlwZSwKLQkJCQkJICAgIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwRDNEVmVydGV4QnVmLAotCQkJCQkgICAgRFdPUkQgZHdTdGFydFZlcnRleCwKLQkJCQkJICAgIERXT1JEIGR3TnVtVmVydGljZXMsCi0JCQkJCSAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICp2Yl9pbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgbHBEM0RWZXJ0ZXhCdWYpOwotICAgIEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSBzdHJpZGVkOwotCi0gICAgVFJBQ0UoIiglcC8lcCktPiglMDh4LCVwLCUwOGx4LCUwOGx4LCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGQzZHB0UHJpbWl0aXZlVHlwZSwgbHBEM0RWZXJ0ZXhCdWYsIGR3U3RhcnRWZXJ0ZXgsIGR3TnVtVmVydGljZXMsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICBpZiAodmJfaW1wbC0+cHJvY2Vzc2VkKSB7Ci0gICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckdMSW1wbCAqdmJfZ2xpbXAgPSAoSURpcmVjdDNEVmVydGV4QnVmZmVyR0xJbXBsICopIHZiX2ltcGw7Ci0JSURpcmVjdDNERGV2aWNlR0xJbXBsICpnbFRoaXMgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsICopIFRoaXM7Ci0KLQlnbFRoaXMtPnRyYW5zZm9ybV9zdGF0ZSA9IEdMX1RSQU5TRk9STV9WRVJURVhCVUZGRVI7Ci0JVGhpcy0+c2V0X21hdHJpY2VzKFRoaXMsIFZJRVdNQVRfQ0hBTkdFRHxXT1JMRE1BVF9DSEFOR0VEfFBST0pNQVRfQ0hBTkdFRCwKLQkJCSAgICYodmJfZ2xpbXAtPndvcmxkX21hdCksICYodmJfZ2xpbXAtPnZpZXdfbWF0KSwgJih2Yl9nbGltcC0+cHJval9tYXQpKTsKLQotCWNvbnZlcnRfRlZGX3RvX3N0cmlkZWRfZGF0YSh2Yl9nbGltcC0+ZHdWZXJ0ZXhUeXBlRGVzYywgdmJfZ2xpbXAtPnZlcnRpY2VzLCAmc3RyaWRlZCwgZHdTdGFydFZlcnRleCk7Ci0JZHJhd19wcmltaXRpdmVfc3RyaWRlZChUaGlzLCBkM2RwdFByaW1pdGl2ZVR5cGUsIHZiX2dsaW1wLT5kd1ZlcnRleFR5cGVEZXNjLCAmc3RyaWRlZCwgZHdOdW1WZXJ0aWNlcywgTlVMTCwgZHdOdW1WZXJ0aWNlcywgZHdGbGFncyk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBjb252ZXJ0X0ZWRl90b19zdHJpZGVkX2RhdGEodmJfaW1wbC0+ZGVzYy5kd0ZWRiwgdmJfaW1wbC0+dmVydGljZXMsICZzdHJpZGVkLCBkd1N0YXJ0VmVydGV4KTsKLQlkcmF3X3ByaW1pdGl2ZV9zdHJpZGVkKFRoaXMsIGQzZHB0UHJpbWl0aXZlVHlwZSwgdmJfaW1wbC0+ZGVzYy5kd0ZWRiwgJnN0cmlkZWQsIGR3TnVtVmVydGljZXMsIE5VTEwsIGR3TnVtVmVydGljZXMsIGR3RmxhZ3MpOwotICAgIH0KLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3SW5kZXhlZFByaW1pdGl2ZVZCKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLAotCQkJCQkJICAgRDNEUFJJTUlUSVZFVFlQRSBkM2RwdFByaW1pdGl2ZVR5cGUsCi0JCQkJCQkgICBMUERJUkVDVDNEVkVSVEVYQlVGRkVSNyBscEQzRFZlcnRleEJ1ZiwKLQkJCQkJCSAgIERXT1JEIGR3U3RhcnRWZXJ0ZXgsCi0JCQkJCQkgICBEV09SRCBkd051bVZlcnRpY2VzLAotCQkJCQkJICAgTFBXT1JEIGxwd0luZGljZXMsCi0JCQkJCQkgICBEV09SRCBkd0luZGV4Q291bnQsCi0JCQkJCQkgICBEV09SRCBkd0ZsYWdzKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICp2Yl9pbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgbHBEM0RWZXJ0ZXhCdWYpOwotICAgIEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSBzdHJpZGVkOwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4eCwlcCwlMDhseCwlMDhseCwlcCwlMDhseCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBkM2RwdFByaW1pdGl2ZVR5cGUsIGxwRDNEVmVydGV4QnVmLCBkd1N0YXJ0VmVydGV4LCBkd051bVZlcnRpY2VzLCBscHdJbmRpY2VzLCBkd0luZGV4Q291bnQsIGR3RmxhZ3MpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGZsYWdzIDogIik7IGR1bXBfRFBGTEFHUyhkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICBpZiAodmJfaW1wbC0+cHJvY2Vzc2VkKSB7Ci0gICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckdMSW1wbCAqdmJfZ2xpbXAgPSAoSURpcmVjdDNEVmVydGV4QnVmZmVyR0xJbXBsICopIHZiX2ltcGw7Ci0JSURpcmVjdDNERGV2aWNlR0xJbXBsICpnbFRoaXMgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsICopIFRoaXM7Ci0KLQlnbFRoaXMtPnRyYW5zZm9ybV9zdGF0ZSA9IEdMX1RSQU5TRk9STV9WRVJURVhCVUZGRVI7Ci0JVGhpcy0+c2V0X21hdHJpY2VzKFRoaXMsIFZJRVdNQVRfQ0hBTkdFRHxXT1JMRE1BVF9DSEFOR0VEfFBST0pNQVRfQ0hBTkdFRCwKLQkJCSAgICYodmJfZ2xpbXAtPndvcmxkX21hdCksICYodmJfZ2xpbXAtPnZpZXdfbWF0KSwgJih2Yl9nbGltcC0+cHJval9tYXQpKTsKLQotCWNvbnZlcnRfRlZGX3RvX3N0cmlkZWRfZGF0YSh2Yl9nbGltcC0+ZHdWZXJ0ZXhUeXBlRGVzYywgdmJfZ2xpbXAtPnZlcnRpY2VzLCAmc3RyaWRlZCwgZHdTdGFydFZlcnRleCk7Ci0JZHJhd19wcmltaXRpdmVfc3RyaWRlZChUaGlzLCBkM2RwdFByaW1pdGl2ZVR5cGUsIHZiX2dsaW1wLT5kd1ZlcnRleFR5cGVEZXNjLCAmc3RyaWRlZCwgZHdOdW1WZXJ0aWNlcywgbHB3SW5kaWNlcywgZHdJbmRleENvdW50LCBkd0ZsYWdzKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnZlcnRfRlZGX3RvX3N0cmlkZWRfZGF0YSh2Yl9pbXBsLT5kZXNjLmR3RlZGLCB2Yl9pbXBsLT52ZXJ0aWNlcywgJnN0cmlkZWQsIGR3U3RhcnRWZXJ0ZXgpOwotCWRyYXdfcHJpbWl0aXZlX3N0cmlkZWQoVGhpcywgZDNkcHRQcmltaXRpdmVUeXBlLCB2Yl9pbXBsLT5kZXNjLmR3RlZGLCAmc3RyaWRlZCwgZHdOdW1WZXJ0aWNlcywgbHB3SW5kaWNlcywgZHdJbmRleENvdW50LCBkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qIFdlIG5lZWQgYSBzdGF0aWMgZnVuY3Rpb24gZm9yIHRoYXQgdG8gaGFuZGxlIHRoZSAnc3BlY2lhbCcgY2FzZSBvZiAnU0VMRUNUX0FSRzInICovCi1zdGF0aWMgQk9PTEVBTgotaGFuZGxlX2NvbG9yX2FscGhhX2FyZ3MoSURpcmVjdDNERGV2aWNlSW1wbCAqVGhpcywgRFdPUkQgZHdTdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIGQzZFRleFN0YWdlU3RhdGVUeXBlLCBEV09SRCBkd1N0YXRlLCBEM0RURVhUVVJFT1AgdGV4X29wKQotewotICAgIEJPT0xFQU4gaXNfY29tcGxlbWVudCA9IEZBTFNFOwotICAgIEJPT0xFQU4gaXNfYWxwaGFfcmVwbGljYXRlID0gRkFMU0U7Ci0gICAgQk9PTEVBTiBoYW5kbGVkID0gVFJVRTsKLSAgICBHTGVudW0gc3JjOwotICAgIEJPT0xFQU4gaXNfY29sb3IgPSAoKGQzZFRleFN0YWdlU3RhdGVUeXBlID09IEQzRFRTU19DT0xPUkFSRzEpIHx8IChkM2RUZXhTdGFnZVN0YXRlVHlwZSA9PSBEM0RUU1NfQ09MT1JBUkcyKSk7Ci0gICAgaW50IG51bTsKLSAgICAKLSAgICBpZiAoaXNfY29sb3IpIHsKLSAgICAgICAgaWYgKGQzZFRleFN0YWdlU3RhdGVUeXBlID09IEQzRFRTU19DT0xPUkFSRzEpIG51bSA9IDA7Ci0JZWxzZSBpZiAoZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgPT0gRDNEVFNTX0NPTE9SQVJHMikgbnVtID0gMTsKLQllbHNlIHsKLQkgICAgaGFuZGxlZCA9IEZBTFNFOwotCSAgICBudW0gPSAwOwotCX0KLQlpZiAodGV4X29wID09IEQzRFRPUF9TRUxFQ1RBUkcyKSB7Ci0JICAgIG51bSA9IDEgLSBudW07Ci0JfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChkM2RUZXhTdGFnZVN0YXRlVHlwZSA9PSBEM0RUU1NfQUxQSEFBUkcxKSBudW0gPSAwOwotCWVsc2UgaWYgKGQzZFRleFN0YWdlU3RhdGVUeXBlID09IEQzRFRTU19BTFBIQUFSRzIpIG51bSA9IDE7Ci0JZWxzZSB7Ci0JICAgIGhhbmRsZWQgPSBGQUxTRTsKLQkgICAgbnVtID0gMDsKLQl9Ci0JaWYgKHRleF9vcCA9PSBEM0RUT1BfU0VMRUNUQVJHMikgewotCSAgICBudW0gPSAxIC0gbnVtOwotCX0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGR3U3RhdGUgJiBEM0RUQV9DT01QTEVNRU5UKSB7Ci0gICAgICAgIGlzX2NvbXBsZW1lbnQgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoZHdTdGF0ZSAmIEQzRFRBX0FMUEhBUkVQTElDQVRFKSB7Ci0JaXNfYWxwaGFfcmVwbGljYXRlID0gVFJVRTsKLSAgICB9Ci0gICAgZHdTdGF0ZSAmPSBEM0RUQV9TRUxFQ1RNQVNLOwotICAgIGlmICgoZHdTdGFnZSA9PSAwKSAmJiAoZHdTdGF0ZSA9PSBEM0RUQV9DVVJSRU5UKSkgewotICAgICAgICBkd1N0YXRlID0gRDNEVEFfRElGRlVTRTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGR3U3RhdGUpIHsKLSAgICAgICAgY2FzZSBEM0RUQV9DVVJSRU5UOiBzcmMgPSBHTF9QUkVWSU9VU19FWFQ7IGJyZWFrOwotCWNhc2UgRDNEVEFfRElGRlVTRTogc3JjID0gR0xfUFJJTUFSWV9DT0xPUl9FWFQ7IGJyZWFrOwotCWNhc2UgRDNEVEFfVEVYVFVSRTogc3JjID0gR0xfVEVYVFVSRTsgYnJlYWs7Ci0JY2FzZSBEM0RUQV9URkFDVE9SOiB7Ci0JICAgIC8qIEdldCB0aGUgY29uc3RhbnQgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZW5kZXJpbmcgc3RhdGUgKi8KLQkgICAgR0xmbG9hdCBjb2xvcls0XTsKLQkgICAgRFdPUkQgY29sID0gVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1RFWFRVUkVGQUNUT1IgLSAxXTsKLQkgICAgCi0JICAgIGNvbG9yWzBdID0gKChjb2wgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7Ci0JICAgIGNvbG9yWzFdID0gKChjb2wgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7Ci0JICAgIGNvbG9yWzJdID0gKChjb2wgPj4gIDApICYgMHhGRikgLyAyNTUuMGY7Ci0JICAgIGNvbG9yWzNdID0gKChjb2wgPj4gMjQpICYgMHhGRikgLyAyNTUuMGY7Ci0JICAgIGdsVGV4RW52ZnYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX0NPTE9SLCBjb2xvcik7Ci0JICAgIAotCSAgICBzcmMgPSBHTF9DT05TVEFOVF9FWFQ7Ci0JfSBicmVhazsKLQlkZWZhdWx0OiBzcmMgPSBHTF9URVhUVVJFOyBoYW5kbGVkID0gRkFMU0U7IGJyZWFrOwotICAgIH0KLQotICAgIGlmIChpc19jb2xvcikgewotICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NPVVJDRTBfUkdCX0VYVCArIG51bSwgc3JjKTsKLQlpZiAoaXNfYWxwaGFfcmVwbGljYXRlKSB7Ci0JICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDBfUkdCX0VYVCArIG51bSwgaXNfY29tcGxlbWVudCA/IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgOiBHTF9TUkNfQUxQSEEpOwotCX0gZWxzZSB7Ci0JICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDBfUkdCX0VYVCArIG51bSwgaXNfY29tcGxlbWVudCA/IEdMX09ORV9NSU5VU19TUkNfQ09MT1IgOiBHTF9TUkNfQ09MT1IpOwotCX0KLSAgICB9IGVsc2UgewotICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NPVVJDRTBfQUxQSEFfRVhUICsgbnVtLCBzcmMpOwotCWdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDBfQUxQSEFfRVhUICsgbnVtLCBpc19jb21wbGVtZW50ID8gR0xfT05FX01JTlVTX1NSQ19BTFBIQSA6IEdMX1NSQ19BTFBIQSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhbmRsZWQ7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfU2V0VGV4dHVyZVN0YWdlU3RhdGUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJCQkgRFdPUkQgZHdTdGFnZSwKLQkJCQkJCSBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUsCi0JCQkJCQkgRFdPUkQgZHdTdGF0ZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgSURpcmVjdDNERGV2aWNlR0xJbXBsICpnbFRoaXMgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsICopIFRoaXM7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLSAgICBEV09SRCBwcmV2X3N0YXRlOwotICAgIEdMZW51bSB1bml0OwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4bHgsJTA4eCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBkd1N0YWdlLCBkM2RUZXhTdGFnZVN0YXRlVHlwZSwgZHdTdGF0ZSk7Ci0KLSAgICBpZiAoKChHTF9leHRlbnNpb25zLm1heF90ZXh0dXJlX3VuaXRzID09IDApICYmIChkd1N0YWdlID4gMCkpIHx8Ci0JKChHTF9leHRlbnNpb25zLm1heF90ZXh0dXJlX3VuaXRzICE9IDApICYmIChkd1N0YWdlID49IEdMX2V4dGVuc2lvbnMubWF4X3RleHR1cmVfdW5pdHMpKSkgewotCXJldHVybiBERF9PSzsKLSAgICB9Ci0KLSAgICB1bml0ID0gR0xfVEVYVFVSRTBfV0lORSArIGR3U3RhZ2U7Ci0gICAgaWYgKHVuaXQgIT0gZ2xUaGlzLT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCkgewotCUdMX2V4dGVuc2lvbnMuZ2xBY3RpdmVUZXh0dXJlKHVuaXQpOwotCWdsVGhpcy0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSB1bml0OwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKGQzZFRleFN0YWdlU3RhdGVUeXBlKSB7Ci0jZGVmaW5lIEdFTl9DQVNFKGEpIGNhc2UgYTogdHlwZSA9ICNhOyBicmVhawotICAgICAgICBHRU5fQ0FTRShEM0RUU1NfQ09MT1JPUCk7Ci0JR0VOX0NBU0UoRDNEVFNTX0NPTE9SQVJHMSk7Ci0JR0VOX0NBU0UoRDNEVFNTX0NPTE9SQVJHMik7Ci0JR0VOX0NBU0UoRDNEVFNTX0FMUEhBT1ApOwotCUdFTl9DQVNFKEQzRFRTU19BTFBIQUFSRzEpOwotCUdFTl9DQVNFKEQzRFRTU19BTFBIQUFSRzIpOwotCUdFTl9DQVNFKEQzRFRTU19CVU1QRU5WTUFUMDApOwotCUdFTl9DQVNFKEQzRFRTU19CVU1QRU5WTUFUMDEpOwotCUdFTl9DQVNFKEQzRFRTU19CVU1QRU5WTUFUMTApOwotCUdFTl9DQVNFKEQzRFRTU19CVU1QRU5WTUFUMTEpOwotCUdFTl9DQVNFKEQzRFRTU19URVhDT09SRElOREVYKTsKLQlHRU5fQ0FTRShEM0RUU1NfQUREUkVTUyk7Ci0JR0VOX0NBU0UoRDNEVFNTX0FERFJFU1NVKTsKLQlHRU5fQ0FTRShEM0RUU1NfQUREUkVTU1YpOwotCUdFTl9DQVNFKEQzRFRTU19CT1JERVJDT0xPUik7Ci0JR0VOX0NBU0UoRDNEVFNTX01BR0ZJTFRFUik7Ci0JR0VOX0NBU0UoRDNEVFNTX01JTkZJTFRFUik7Ci0JR0VOX0NBU0UoRDNEVFNTX01JUEZJTFRFUik7Ci0JR0VOX0NBU0UoRDNEVFNTX01JUE1BUExPREJJQVMpOwotCUdFTl9DQVNFKEQzRFRTU19NQVhNSVBMRVZFTCk7Ci0JR0VOX0NBU0UoRDNEVFNTX01BWEFOSVNPVFJPUFkpOwotCUdFTl9DQVNFKEQzRFRTU19CVU1QRU5WTFNDQUxFKTsKLQlHRU5fQ0FTRShEM0RUU1NfQlVNUEVOVkxPRkZTRVQpOwotCUdFTl9DQVNFKEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MpOwotI3VuZGVmIEdFTl9DQVNFCi0gICAgICAgIGRlZmF1bHQ6IHR5cGUgPSAiVU5LTk9XTiI7Ci0gICAgfQotCi0gICAgLyogU3RvcmUgdGhlIHZhbHVlcyBpbiB0aGUgc3RhdGUgYXJyYXkgKi8KLSAgICBwcmV2X3N0YXRlID0gVGhpcy0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtkd1N0YWdlXVtkM2RUZXhTdGFnZVN0YXRlVHlwZSAtIDFdOwotICAgIFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbZHdTdGFnZV1bZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgLSAxXSA9IGR3U3RhdGU7Ci0gICAgLyogU29tZSBzcGVjaWFsIGNhc2VzIHdoZW4gb25lIHN0YXRlIG1vZGlmaWVzIG1vcmUgdGhhbiBvbmUuLi4gKi8KLSAgICBpZiAoZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgPT0gRDNEVFNTX0FERFJFU1MpIHsKLSAgICAgICAgVGhpcy0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtkd1N0YWdlXVtEM0RUU1NfQUREUkVTU1UgLSAxXSA9IGR3U3RhdGU7Ci0JVGhpcy0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtkd1N0YWdlXVtEM0RUU1NfQUREUkVTU1YgLSAxXSA9IGR3U3RhdGU7Ci0gICAgfQotCi0gICAgRU5URVJfR0woKTsKLSAgICAKLSAgICBzd2l0Y2ggKGQzZFRleFN0YWdlU3RhdGVUeXBlKSB7Ci0gICAgICAgIGNhc2UgRDNEVFNTX01JTkZJTFRFUjoKLSAgICAgICAgY2FzZSBEM0RUU1NfTUlQRklMVEVSOgotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBpZiAoZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgPT0gRDNEVFNTX01JTkZJTFRFUikgewotCQkgICAgc3dpdGNoICgoRDNEVEVYVFVSRU1JTkZJTFRFUikgZHdTdGF0ZSkgewotCSAgICAgICAgICAgICAgICBjYXNlIEQzRFRGTl9QT0lOVDogIFRSQUNFKCIgU3RhZ2UgdHlwZSBpcyA6IEQzRFRTU19NSU5GSUxURVIgPT4gRDNEVEZOX1BPSU5UXG4iKTsgYnJlYWs7Ci0JCQljYXNlIEQzRFRGTl9MSU5FQVI6IFRSQUNFKCIgU3RhZ2UgdHlwZSBpcyA6IEQzRFRTU19NSU5GSUxURVIgPT4gRDNEVEZOX0xJTkVBUlxuIik7IGJyZWFrOwotCQkJZGVmYXVsdDogRklYTUUoIiBVbmhhbmRsZWQgc3RhZ2UgdHlwZSA6IEQzRFRTU19NSU5GSUxURVIgPT4gJTA4bHhcbiIsIGR3U3RhdGUpOyBicmVhazsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIHN3aXRjaCAoKEQzRFRFWFRVUkVNSVBGSUxURVIpIGR3U3RhdGUpIHsKLQkgICAgICAgICAgICAgICAgY2FzZSBEM0RURlBfTk9ORTogICBUUkFDRSgiIFN0YWdlIHR5cGUgaXMgOiBEM0RUU1NfTUlQRklMVEVSID0+IEQzRFRGUF9OT05FXG4iKTsgYnJlYWs7Ci0JCQljYXNlIEQzRFRGUF9QT0lOVDogIFRSQUNFKCIgU3RhZ2UgdHlwZSBpcyA6IEQzRFRTU19NSVBGSUxURVIgPT4gRDNEVEZQX1BPSU5UXG4iKTsgYnJlYWs7Ci0JCQljYXNlIEQzRFRGUF9MSU5FQVI6IFRSQUNFKCIgU3RhZ2UgdHlwZSBpcyA6IEQzRFRTU19NSVBGSUxURVIgPT4gRDNEVEZQX0xJTkVBUlxuIik7IGJyZWFrOwotCQkJZGVmYXVsdDogRklYTUUoIiBVbmhhbmRsZWQgc3RhZ2UgdHlwZSA6IEQzRFRTU19NSVBGSUxURVIgPT4gJTA4bHhcbiIsIGR3U3RhdGUpOyBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCSAgICAKLSAgICAgICAgY2FzZSBEM0RUU1NfTUFHRklMVEVSOgotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgICAgICBzd2l0Y2ggKChEM0RURVhUVVJFTUFHRklMVEVSKSBkd1N0YXRlKSB7Ci0JICAgICAgICAgICAgY2FzZSBEM0RURkdfUE9JTlQ6ICBUUkFDRSgiIFN0YWdlIHR5cGUgaXMgOiBEM0RUU1NfTUFHRklMVEVSID0+IEQzRFRGR19QT0lOVFxuIik7IGJyZWFrOwotCQkgICAgY2FzZSBEM0RURkdfTElORUFSOiBUUkFDRSgiIFN0YWdlIHR5cGUgaXMgOiBEM0RUU1NfTUFHRklMVEVSID0+IEQzRFRGR19MSU5FQVJcbiIpOyBicmVhazsKLQkJICAgIGRlZmF1bHQ6IEZJWE1FKCIgVW5oYW5kbGVkIHN0YWdlIHR5cGUgOiBEM0RUU1NfTUFHRklMVEVSID0+ICUwOGx4XG4iLCBkd1N0YXRlKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBEM0RUU1NfQUREUkVTUzoKLSAgICAgICAgY2FzZSBEM0RUU1NfQUREUkVTU1U6Ci0gICAgICAgIGNhc2UgRDNEVFNTX0FERFJFU1NWOiB7Ci0JICAgIHN3aXRjaCAoKEQzRFRFWFRVUkVBRERSRVNTKSBkd1N0YXRlKSB7Ci0JICAgICAgICBjYXNlIEQzRFRBRERSRVNTX1dSQVA6ICAgVFJBQ0UoIiBTdGFnZSB0eXBlIGlzIDogJXMgPT4gRDNEVEFERFJFU1NfV1JBUFxuIiwgdHlwZSk7IGJyZWFrOwotCSAgICAgICAgY2FzZSBEM0RUQUREUkVTU19DTEFNUDogIFRSQUNFKCIgU3RhZ2UgdHlwZSBpcyA6ICVzID0+IEQzRFRBRERSRVNTX0NMQU1QXG4iLCB0eXBlKTsgYnJlYWs7Ci0JICAgICAgICBjYXNlIEQzRFRBRERSRVNTX0JPUkRFUjogVFJBQ0UoIiBTdGFnZSB0eXBlIGlzIDogJXMgPT4gRDNEVEFERFJFU1NfQk9SREVSXG4iLCB0eXBlKTsgYnJlYWs7Ci0JCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9SOgotCQkgICAgaWYgKEdMX2V4dGVuc2lvbnMubWlycm9yZWRfcmVwZWF0KSB7Ci0JCQlUUkFDRSgiIFN0YWdlIHR5cGUgaXMgOiAlcyA9PiBEM0RUQUREUkVTU19NSVJST1JcbiIsIHR5cGUpOwotCQkgICAgfSBlbHNlIHsKLQkJCUZJWE1FKCIgU3RhZ2UgdHlwZSBpcyA6ICVzID0+IEQzRFRBRERSRVNTX01JUlJPUiAtIG5vdCBzdXBwb3J0ZWQgYnkgR0wgIVxuIiwgdHlwZSk7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQkgICAgICAgIGRlZmF1bHQ6IEZJWE1FKCIgVW5oYW5kbGVkIHN0YWdlIHR5cGUgOiAlcyA9PiAlMDhseFxuIiwgdHlwZSwgZHdTdGF0ZSk7IGJyZWFrOwotCSAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0KLQljYXNlIEQzRFRTU19BTFBIQU9QOgotCWNhc2UgRDNEVFNTX0NPTE9ST1A6IHsKLSAgICAgICAgICAgIGludCBzY2FsZSA9IDE7Ci0gICAgICAgICAgICBHTGVudW0gcGFybSA9IChkM2RUZXhTdGFnZVN0YXRlVHlwZSA9PSBEM0RUU1NfQUxQSEFPUCkgPyBHTF9DT01CSU5FX0FMUEhBX0VYVCA6IEdMX0NPTUJJTkVfUkdCX0VYVDsKLQkgICAgY29uc3QgY2hhciAqdmFsdWU7Ci0JICAgIGludCBoYW5kbGVkID0gMTsKLQkgICAgCi0JICAgIHN3aXRjaCAoZHdTdGF0ZSkgewotI2RlZmluZSBHRU5fQ0FTRShhKSBjYXNlIGE6IHZhbHVlID0gI2E7IGJyZWFrCi0JICAgICAgICBHRU5fQ0FTRShEM0RUT1BfRElTQUJMRSk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9TRUxFQ1RBUkcxKTsKLQkJR0VOX0NBU0UoRDNEVE9QX1NFTEVDVEFSRzIpOwotCQlHRU5fQ0FTRShEM0RUT1BfTU9EVUxBVEUpOwotCQlHRU5fQ0FTRShEM0RUT1BfTU9EVUxBVEUyWCk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9NT0RVTEFURTRYKTsKLQkJR0VOX0NBU0UoRDNEVE9QX0FERCk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9BRERTSUdORUQpOwotCQlHRU5fQ0FTRShEM0RUT1BfQUREU0lHTkVEMlgpOwotCQlHRU5fQ0FTRShEM0RUT1BfU1VCVFJBQ1QpOwotCQlHRU5fQ0FTRShEM0RUT1BfQUREU01PT1RIKTsKLQkJR0VOX0NBU0UoRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBKTsKLQkJR0VOX0NBU0UoRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBKTsKLQkJR0VOX0NBU0UoRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEEpOwotCQlHRU5fQ0FTRShEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEFQTSk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9CTEVORENVUlJFTlRBTFBIQSk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9QUkVNT0RVTEFURSk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SKTsKLQkJR0VOX0NBU0UoRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEEpOwotCQlHRU5fQ0FTRShEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUik7Ci0JCUdFTl9DQVNFKEQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBKTsKLQkJR0VOX0NBU0UoRDNEVE9QX0JVTVBFTlZNQVApOwotCQlHRU5fQ0FTRShEM0RUT1BfQlVNUEVOVk1BUExVTUlOQU5DRSk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9ET1RQUk9EVUNUMyk7Ci0JCUdFTl9DQVNFKEQzRFRPUF9GT1JDRV9EV09SRCk7Ci0jdW5kZWYgR0VOX0NBU0UKLQkgICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gIlVOS05PV04iOwotCSAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgPT0gRDNEVFNTX0NPTE9ST1ApICYmIChkd1N0YXRlID09IEQzRFRPUF9ESVNBQkxFKSkgewotICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLQkJVFJBQ0UoIiBkaXNhYmxpbmcgMkQgdGV4dHVyaW5nLlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgLyogUmUtZW5hYmxlIHRleHR1cmluZyBvbmx5IGlmIENPTE9ST1Agd2FzIG5vdCBhbHJlYWR5IGRpc2FibGVkLi4uICovCi0JICAgICAgICBpZiAoKGdsVGhpcy0+Y3VycmVudF9ib3VuZF90ZXh0dXJlW2R3U3RhZ2VdICE9IE5VTEwpICYmCi0JCSAgICAoVGhpcy0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtkd1N0YWdlXVtEM0RUU1NfQ09MT1JPUCAtIDFdICE9IEQzRFRPUF9ESVNBQkxFKSkgewotCQkgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0JCSAgICBUUkFDRSgiIGVuYWJsaW5nIDJEIHRleHR1cmluZy5cbiIpOwotCQl9Ci0JCQotICAgICAgICAgICAgICAgIC8qIFJlLUVuYWJsZSBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9DT01CSU5FX0VYVCAqLwotICAgICAgICAgICAgICAgIGlmICgoZHdTdGF0ZSAhPSBEM0RUT1BfRElTQUJMRSkgJiYKLQkJICAgIChUaGlzLT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW2R3U3RhZ2VdW0QzRFRTU19DT0xPUk9QIC0gMV0gIT0gRDNEVE9QX0RJU0FCTEUpKSB7Ci0JCSAgICBpZiAoZ2xUaGlzLT5jdXJyZW50X3RleF9lbnYgIT0gR0xfQ09NQklORV9FWFQpIHsKLQkJCWdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfQ09NQklORV9FWFQpOwotCQkJZ2xUaGlzLT5jdXJyZW50X3RleF9lbnYgPSBHTF9DT01CSU5FX0VYVDsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBOb3cgc2V0IHVwIHRoZSBvcGVyYW5kIGNvcnJlY3RseSAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZHdTdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEQzRFRPUF9ESVNBQkxFOgotCQkgICAgICAgIC8qIENvbnRyYXJ5IHRvIHRoZSBkb2NzLCBhbHBoYSBjYW4gYmUgZGlzYWJsZWQgd2hlbiBjb2xvcm9wIGlzIGVuYWJsZWQKLQkJCSAgIGFuZCBpdCB3b3Jrcywgc28gaWdub3JlIHRoaXMgb3AgKi8KLQkJICAgICAgICBUUkFDRSgiIE5vdGUgOiBkaXNhYmxlIEFMUEhBT1AgYnV0IENPTE9ST1AgZW5hYmxlZCFcbiIpOwotCQkJYnJlYWs7Ci0KLQkJICAgIGNhc2UgRDNEVE9QX1NFTEVDVEFSRzE6Ci0JCSAgICBjYXNlIEQzRFRPUF9TRUxFQ1RBUkcyOgotCQkJZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBwYXJtLCBHTF9SRVBMQUNFKTsKLQkJCWJyZWFrOwotCQkJCi0JCSAgICBjYXNlIEQzRFRPUF9NT0RVTEFURTRYOgotCQkJc2NhbGUgPSBzY2FsZSAqIDI7ICAvKiBEcm9wIHRocm91Z2ggKi8KLQkJICAgIGNhc2UgRDNEVE9QX01PRFVMQVRFMlg6Ci0JCQlzY2FsZSA9IHNjYWxlICogMjsgIC8qIERyb3AgdGhyb3VnaCAqLwotCQkgICAgY2FzZSBEM0RUT1BfTU9EVUxBVEU6Ci0JCQlnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHBhcm0sIEdMX01PRFVMQVRFKTsKLQkJCWJyZWFrOwotCi0JCSAgICBjYXNlIEQzRFRPUF9BREQ6Ci0JCQlnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIHBhcm0sIEdMX0FERCk7Ci0JCQlicmVhazsKLQotCQkgICAgY2FzZSBEM0RUT1BfQUREU0lHTkVEMlg6Ci0JCQlzY2FsZSA9IHNjYWxlICogMjsgIC8qIERyb3AgdGhyb3VnaCAqLwotCQkgICAgY2FzZSBEM0RUT1BfQUREU0lHTkVEOgotCQkJZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBwYXJtLCBHTF9BRERfU0lHTkVEX0VYVCk7Ci0JCQlicmVhazsKLQotCQkJLyogRm9yIHRoZSBmb3VyIGJsZW5kaW5nIG1vZGVzLCB1c2UgdGhlIEFyZzIgcGFyYW1ldGVyICovCi0JCSAgICBjYXNlIEQzRFRPUF9CTEVORERJRkZVU0VBTFBIQToKLQkJICAgIGNhc2UgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBOgotCQkgICAgY2FzZSBEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQToKLQkJICAgIGNhc2UgRDNEVE9QX0JMRU5EQ1VSUkVOVEFMUEhBOiB7Ci0JCSAgICAgICAgR0xlbnVtIHNyYyA9IEdMX1BSSU1BUllfQ09MT1JfRVhUOyAvKiBKdXN0IHRvIHByZXZlbnQgYSBjb21waWxlciB3YXJuaW5nLi4gKi8KLQotCQkJc3dpdGNoIChkd1N0YXRlKSB7Ci0JCQkgICAgY2FzZSBEM0RUT1BfQkxFTkRESUZGVVNFQUxQSEE6IHNyYyA9IEdMX1BSSU1BUllfQ09MT1JfRVhUOwotCQkJICAgIGNhc2UgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBOiBzcmMgPSBHTF9URVhUVVJFOwotCQkJICAgIGNhc2UgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEE6ICBzcmMgPSBHTF9DT05TVEFOVF9FWFQ7Ci0JCQkgICAgY2FzZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEE6IHNyYyA9IEdMX1BSRVZJT1VTX0VYVDsKLQkJCX0KLQkJCQotCQkJZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBwYXJtLCBHTF9JTlRFUlBPTEFURV9FWFQpOwotCQkJZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TT1VSQ0UyX1JHQl9FWFQsIHNyYyk7Ci0JCQlnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQyX1JHQl9FWFQsIEdMX1NSQ19BTFBIQSk7Ci0JCQlnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NPVVJDRTJfQUxQSEFfRVhULCBzcmMpOwotCQkJZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMl9BTFBIQV9FWFQsIEdMX1NSQ19BTFBIQSk7Ci0JCSAgICB9IGJyZWFrOwotCQkJCi0JCSAgICBkZWZhdWx0OgotCQkJaGFuZGxlZCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0JICAgIGlmICgoKHByZXZfc3RhdGUgPT0gRDNEVE9QX1NFTEVDVEFSRzIpICYmIChkd1N0YXRlICE9IEQzRFRPUF9TRUxFQ1RBUkcyKSkgfHwKLQkJKChkd1N0YXRlID09IEQzRFRPUF9TRUxFQ1RBUkcyKSAmJiAocHJldl9zdGF0ZSAhPSBEM0RUT1BfU0VMRUNUQVJHMikpKSB7Ci0JICAgICAgICAvKiBTd2l0Y2ggdGhlIGFyZ3VtZW50cyBpZiBuZWVkZWQuLi4gKi8KLQkgICAgICAgIGlmIChkM2RUZXhTdGFnZVN0YXRlVHlwZSA9PSBEM0RUU1NfQ09MT1JPUCkgewotCQkgICAgaGFuZGxlX2NvbG9yX2FscGhhX2FyZ3MoVGhpcywgZHdTdGFnZSwgRDNEVFNTX0NPTE9SQVJHMSwKLQkJCQkJICAgIFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbZHdTdGFnZV1bRDNEVFNTX0NPTE9SQVJHMSAtIDFdLAotCQkJCQkgICAgZHdTdGF0ZSk7Ci0JCSAgICBoYW5kbGVfY29sb3JfYWxwaGFfYXJncyhUaGlzLCBkd1N0YWdlLCBEM0RUU1NfQ09MT1JBUkcyLAotCQkJCQkgICAgVGhpcy0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtkd1N0YWdlXVtEM0RUU1NfQ09MT1JBUkcyIC0gMV0sCi0JCQkJCSAgICBkd1N0YXRlKTsKLQkJfSBlbHNlIHsKLQkJICAgIGhhbmRsZV9jb2xvcl9hbHBoYV9hcmdzKFRoaXMsIGR3U3RhZ2UsIEQzRFRTU19BTFBIQUFSRzEsCi0JCQkJCSAgICBUaGlzLT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW2R3U3RhZ2VdW0QzRFRTU19BTFBIQUFSRzEgLSAxXSwKLQkJCQkJICAgIGR3U3RhdGUpOwotCQkgICAgaGFuZGxlX2NvbG9yX2FscGhhX2FyZ3MoVGhpcywgZHdTdGFnZSwgRDNEVFNTX0FMUEhBQVJHMiwKLQkJCQkJICAgIFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbZHdTdGFnZV1bRDNEVFNTX0FMUEhBQVJHMiAtIDFdLAotCQkJCQkgICAgZHdTdGF0ZSk7Ci0JCX0KLQkgICAgfQotCSAgICAKLQkgICAgaWYgKGhhbmRsZWQpIHsKLQkgICAgICAgIGlmIChkM2RUZXhTdGFnZVN0YXRlVHlwZSA9PSBEM0RUU1NfQUxQSEFPUCkgewotCQkgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9BTFBIQV9TQ0FMRSwgc2NhbGUpOwotCQl9IGVsc2UgewotCQkgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9SR0JfU0NBTEVfRVhULCBzY2FsZSk7Ci0JCX0JCQkKLQkJVFJBQ0UoIiBTdGFnZSB0eXBlIGlzIDogJXMgPT4gJXNcbiIsIHR5cGUsIHZhbHVlKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIEZJWE1FKCIgVW5oYW5kbGVkIHN0YWdlIHR5cGUgaXMgOiAlcyA9PiAlc1xuIiwgdHlwZSwgdmFsdWUpOwotCSAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0KLQljYXNlIEQzRFRTU19DT0xPUkFSRzE6Ci0JY2FzZSBEM0RUU1NfQ09MT1JBUkcyOgotCWNhc2UgRDNEVFNTX0FMUEhBQVJHMToKLQljYXNlIEQzRFRTU19BTFBIQUFSRzI6IHsKLQkgICAgY29uc3QgY2hhciAqdmFsdWUsICp2YWx1ZV9jb21wID0gIiIsICp2YWx1ZV9hbHBoYSA9ICIiOwotCSAgICBCT09MRUFOIGhhbmRsZWQ7Ci0JICAgIEQzRFRFWFRVUkVPUCB0ZXhfb3A7Ci0JICAgIAotCSAgICBzd2l0Y2ggKGR3U3RhdGUgJiBEM0RUQV9TRUxFQ1RNQVNLKSB7Ci0jZGVmaW5lIEdFTl9DQVNFKGEpIGNhc2UgYTogdmFsdWUgPSAjYTsgYnJlYWsKLQkgICAgICAgIEdFTl9DQVNFKEQzRFRBX0RJRkZVU0UpOwotCQlHRU5fQ0FTRShEM0RUQV9DVVJSRU5UKTsKLQkJR0VOX0NBU0UoRDNEVEFfVEVYVFVSRSk7Ci0JCUdFTl9DQVNFKEQzRFRBX1RGQUNUT1IpOwotCSAgICAgICAgR0VOX0NBU0UoRDNEVEFfU1BFQ1VMQVIpOwotI3VuZGVmIEdFTl9DQVNFCi0JICAgICAgICBkZWZhdWx0OiB2YWx1ZSA9ICJVTktOT1dOIjsKLQkgICAgfQotCSAgICBpZiAoZHdTdGF0ZSAmIEQzRFRBX0NPTVBMRU1FTlQpIHsKLQkgICAgICAgIHZhbHVlX2NvbXAgPSAiIHwgRDNEVEFfQ09NUExFTUVOVCI7Ci0JICAgIH0KLQkgICAgaWYgKGR3U3RhdGUgJiBEM0RUQV9BTFBIQVJFUExJQ0FURSkgewotCSAgICAgICAgdmFsdWVfYWxwaGEgPSAiIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEUiOwotCSAgICB9Ci0KLQkgICAgaWYgKChkM2RUZXhTdGFnZVN0YXRlVHlwZSA9PSBEM0RUU1NfQ09MT1JBUkcxKSB8fCAoZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgPT0gRDNEVFNTX0NPTE9SQVJHMikpIHsKLQkgICAgICAgIHRleF9vcCA9IFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbZHdTdGFnZV1bRDNEVFNTX0NPTE9ST1AgLSAxXTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHRleF9vcCA9IFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbZHdTdGFnZV1bRDNEVFNTX0FMUEhBT1AgLSAxXTsKLQkgICAgfQotCSAgICAKLQkgICAgaGFuZGxlZCA9IGhhbmRsZV9jb2xvcl9hbHBoYV9hcmdzKFRoaXMsIGR3U3RhZ2UsIGQzZFRleFN0YWdlU3RhdGVUeXBlLCBkd1N0YXRlLCB0ZXhfb3ApOwotCSAgICAKLQkgICAgaWYgKGhhbmRsZWQpIHsKLQkgICAgICAgIFRSQUNFKCIgU3RhZ2UgdHlwZSA6ICVzID0+ICVzJXMlc1xuIiwgdHlwZSwgdmFsdWUsIHZhbHVlX2NvbXAsIHZhbHVlX2FscGhhKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIEZJWE1FKCIgVW5oYW5kbGVkIHN0YWdlIHR5cGUgOiAlcyA9PiAlcyVzJXNcbiIsIHR5cGUsIHZhbHVlLCB2YWx1ZV9jb21wLCB2YWx1ZV9hbHBoYSk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCi0JY2FzZSBEM0RUU1NfTUlQTUFQTE9EQklBUzogewotCSAgICBEM0RWQUxVRSB2YWx1ZSA9ICooKEQzRFZBTFVFICopICZkd1N0YXRlKTsKLQkgICAgQk9PTEVBTiBoYW5kbGVkID0gVFJVRTsKLQkgICAgCi0JICAgIGlmICgodmFsdWUgIT0gMC4wKSAmJiAoR0xfZXh0ZW5zaW9ucy5taXBtYXBfbG9kYmlhcyA9PSBGQUxTRSkpCi0JICAgICAgICBoYW5kbGVkID0gRkFMU0U7Ci0KLQkgICAgaWYgKGhhbmRsZWQpIHsKLQkgICAgICAgIFRSQUNFKCIgU3RhZ2UgdHlwZSA6IEQzRFRTU19NSVBNQVBMT0RCSUFTID0+ICVmXG4iLCB2YWx1ZSk7Ci0JCWdsVGV4RW52ZihHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MX1dJTkUsIEdMX1RFWFRVUkVfTE9EX0JJQVNfV0lORSwgdmFsdWUpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgRklYTUUoIiBVbmhhbmRsZWQgc3RhZ2UgdHlwZSA6IEQzRFRTU19NSVBNQVBMT0RCSUFTID0+ICVmXG4iLCB2YWx1ZSk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCi0JY2FzZSBEM0RUU1NfTUFYTUlQTEVWRUw6IAotCSAgICBUUkFDRSgiIFN0YWdlIHR5cGUgOiBEM0RUU1NfTUFYTUlQTEVWRUwgPT4gJWxkXG4iLCBkd1N0YXRlKTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIEQzRFRTU19CT1JERVJDT0xPUjoKLQkgICAgVFJBQ0UoIiBTdGFnZSB0eXBlIDogRDNEVFNTX0JPUkRFUkNPTE9SID0+ICUwMmx4ICUwMmx4ICUwMmx4ICUwMmx4IChSR0JBKVxuIiwKLQkJICAoKGR3U3RhdGUgPj4gMTYpICYgMHhGRiksCi0JCSAgKChkd1N0YXRlID4+ICA4KSAmIDB4RkYpLAotCQkgICgoZHdTdGF0ZSA+PiAgMCkgJiAweEZGKSwKLQkJICAoKGR3U3RhdGUgPj4gMjQpICYgMHhGRikpOwotCSAgICBicmVhazsKLQkgICAgCi0JY2FzZSBEM0RUU1NfVEVYQ09PUkRJTkRFWDogewotCSAgICBCT09MRUFOIGhhbmRsZWQgPSBUUlVFOwotCSAgICBjb25zdCBjaGFyICp2YWx1ZTsKLQkgICAgCi0JICAgIHN3aXRjaCAoZHdTdGF0ZSAmIDB4RkZGRjAwMDApIHsKLSNkZWZpbmUgR0VOX0NBU0UoYSkgY2FzZSBhOiB2YWx1ZSA9ICNhOyBicmVhawotCSAgICAgICAgR0VOX0NBU0UoRDNEVFNTX1RDSV9QQVNTVEhSVSk7Ci0JCUdFTl9DQVNFKEQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VOT1JNQUwpOwotCQlHRU5fQ0FTRShEM0RUU1NfVENJX0NBTUVSQVNQQUNFUE9TSVRJT04pOwotCQlHRU5fQ0FTRShEM0RUU1NfVENJX0NBTUVSQVNQQUNFUkVGTEVDVElPTlZFQ1RPUik7Ci0jdW5kZWYgR0VOX0NBU0UKLQkJZGVmYXVsdDogdmFsdWUgPSAiVU5LTk9XTiI7Ci0JICAgIH0KLQkgICAgaWYgKChkd1N0YXRlICYgMHhGRkZGMDAwMCkgIT0gRDNEVFNTX1RDSV9QQVNTVEhSVSkKLQkgICAgICAgIGhhbmRsZWQgPSBGQUxTRTsKLQotCSAgICBpZiAoaGFuZGxlZCkgewotCSAgICAgICAgVFJBQ0UoIiBTdGFnZSB0eXBlIDogRDNEVFNTX1RFWENPT1JESU5ERVggPT4gJWxkIHwgJXNcbiIsIGR3U3RhdGUgJiAweDAwMDBGRkZGLCB2YWx1ZSk7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgICBGSVhNRSgiIFVuaGFuZGxlZCBzdGFnZSB0eXBlIDogRDNEVFNTX1RFWENPT1JESU5ERVggPT4gJWxkIHwgJXNcbiIsIGR3U3RhdGUgJiAweDAwMDBGRkZGLCB2YWx1ZSk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCSAgICAKLQljYXNlIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1M6IHsKLQkgICAgY29uc3QgY2hhciAqcHJvamVjdGVkID0gIiIsICp2YWx1ZTsKLQkgICAgQk9PTEVBTiBoYW5kbGVkID0gVFJVRTsKLQkgICAgc3dpdGNoIChkd1N0YXRlICYgMHhGRikgewotI2RlZmluZSBHRU5fQ0FTRShhKSBjYXNlIGE6IHZhbHVlID0gI2E7IGJyZWFrCi0JICAgICAgICBHRU5fQ0FTRShEM0RUVEZGX0RJU0FCTEUpOwotCQlHRU5fQ0FTRShEM0RUVEZGX0NPVU5UMSk7Ci0JCUdFTl9DQVNFKEQzRFRURkZfQ09VTlQyKTsKLQkJR0VOX0NBU0UoRDNEVFRGRl9DT1VOVDMpOwotCQlHRU5fQ0FTRShEM0RUVEZGX0NPVU5UNCk7Ci0jdW5kZWYgR0VOX0NBU0UKLQkJZGVmYXVsdDogdmFsdWUgPSAiVU5LTk9XTiI7Ci0JICAgIH0KLQkgICAgaWYgKGR3U3RhdGUgJiBEM0RUVEZGX1BST0pFQ1RFRCkgewotCSAgICAgICAgcHJvamVjdGVkID0gIiB8IEQzRFRURkZfUFJPSkVDVEVEIjsKLQkJaGFuZGxlZCA9IEZBTFNFOwotCSAgICB9Ci0KLQkgICAgaWYgKChkd1N0YXRlICYgMHhGRikgIT0gRDNEVFRGRl9ESVNBQkxFKSB7Ci0JICAgICAgICBUaGlzLT5tYXRyaWNlc191cGRhdGVkKFRoaXMsIFRFWE1BVDBfQ0hBTkdFRCA8PCBkd1N0YWdlKTsKLQkgICAgfQotCi0JICAgIGlmIChoYW5kbGVkKSB7Ci0JICAgICAgICBUUkFDRSgiIFN0YWdlIHR5cGUgOiBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTID0+ICVzJXNcbiIsIHZhbHVlLCBwcm9qZWN0ZWQpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgRklYTUUoIiBVbmhhbmRsZWQgc3RhZ2UgdHlwZSA6IEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgPT4gJXMlc1xuIiwgdmFsdWUsIHByb2plY3RlZCk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCSAgICAKLQlkZWZhdWx0OgotCSAgICBGSVhNRSgiIFVuaGFuZGxlZCBzdGFnZSB0eXBlIDogJXMgPT4gJTA4bHhcbiIsIHR5cGUsIGR3U3RhdGUpOwotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICBMRUFWRV9HTCgpOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIERXT1JECi1kcmF3X3ByaW1pdGl2ZV9oYW5kbGVfdGV4dHVyZXMoSURpcmVjdDNERGV2aWNlSW1wbCAqVGhpcykKLXsKLSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwgKmdsVGhpcyA9IChJRGlyZWN0M0REZXZpY2VHTEltcGwgKikgVGhpczsKLSAgICBEV09SRCBzdGFnZTsKLSAgICBCT09MRUFOIGVuYWJsZV9jb2xvcmtleSA9IEZBTFNFOwotICAgIAotICAgIGZvciAoc3RhZ2UgPSAwOyBzdGFnZSA8IE1BWF9URVhUVVJFUzsgc3RhZ2UrKykgewotCUlEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZfcHRyID0gVGhpcy0+Y3VycmVudF90ZXh0dXJlW3N0YWdlXTsKLQlHTGVudW0gdW5pdDsKLQotCS8qIElmIHRoaXMgc3RhZ2UgaXMgZGlzYWJsZWQsIG5vIG5lZWQgdG8gZ28gZnVydGhlci4uLiAqLwotCWlmIChUaGlzLT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW3N0YWdlXVtEM0RUU1NfQ09MT1JPUCAtIDFdID09IEQzRFRPUF9ESVNBQkxFKQotCSAgICBicmVhazsKLQkKLQkvKiBGaXJzdCBjaGVjayBpZiB3ZSBuZWVkIHRvIGJpbmQgYW55IG90aGVyIHRleHR1cmUgZm9yIHRoaXMgc3RhZ2UgKi8KLQlpZiAoVGhpcy0+Y3VycmVudF90ZXh0dXJlW3N0YWdlXSAhPSBnbFRoaXMtPmN1cnJlbnRfYm91bmRfdGV4dHVyZVtzdGFnZV0pIHsKLQkgICAgaWYgKFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtzdGFnZV0gPT0gTlVMTCkgewotCQlUUkFDRSgiIGRpc2FibGluZyAyRCB0ZXh0dXJpbmcgZm9yIHN0YWdlICVsZC5cbiIsIHN0YWdlKTsKLQkJCi0JCXVuaXQgPSBHTF9URVhUVVJFMF9XSU5FICsgc3RhZ2U7Ci0JCWlmICh1bml0ICE9IGdsVGhpcy0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQpIHsKLQkJICAgIEdMX2V4dGVuc2lvbnMuZ2xBY3RpdmVUZXh0dXJlKHVuaXQpOwotCQkgICAgZ2xUaGlzLT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCA9IHVuaXQ7Ci0JCX0KLQkJZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLQkJZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotCSAgICB9IGVsc2UgewotCQlHTGVudW0gdGV4X25hbWUgPSBnbHRleF9nZXRfdGV4X25hbWUoc3VyZl9wdHIpOwotCQkKLQkJdW5pdCA9IEdMX1RFWFRVUkUwX1dJTkUgKyBzdGFnZTsKLQkJaWYgKHVuaXQgIT0gZ2xUaGlzLT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCkgewotCQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JCSAgICBnbFRoaXMtPmN1cnJlbnRfYWN0aXZlX3RleF91bml0ID0gdW5pdDsKLQkJfQotCi0JCWlmIChnbFRoaXMtPmN1cnJlbnRfYm91bmRfdGV4dHVyZVtzdGFnZV0gPT0gTlVMTCkgewotCQkgICAgaWYgKFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbc3RhZ2VdW0QzRFRTU19DT0xPUk9QIC0gMV0gIT0gRDNEVE9QX0RJU0FCTEUpIHsKLQkJCVRSQUNFKCIgZW5hYmxpbmcgMkQgdGV4dHVyaW5nIGFuZCIpOwotCQkJZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0JCSAgICB9Ci0JCX0KLQkJVFJBQ0UoIiBhY3RpdmF0aW5nIE9wZW5HTCB0ZXh0dXJlIGlkICVkIGZvciBzdGFnZSAlbGQuXG4iLCB0ZXhfbmFtZSwgc3RhZ2UpOwotCQlnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleF9uYW1lKTsKLQkgICAgfQotCi0JICAgIGdsVGhpcy0+Y3VycmVudF9ib3VuZF90ZXh0dXJlW3N0YWdlXSA9IFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtzdGFnZV07Ci0JfSBlbHNlIHsKLQkgICAgaWYgKGdsVGhpcy0+Y3VycmVudF9ib3VuZF90ZXh0dXJlW3N0YWdlXSA9PSBOVUxMKSB7Ci0JCVRSQUNFKCIgZGlzcGxheWluZyB3aXRob3V0IHRleHR1cmluZyBhY3RpdmF0ZWQgZm9yIHN0YWdlICVsZC5cbiIsIHN0YWdlKTsKLQkgICAgfSBlbHNlIHsKLQkJVFJBQ0UoIiB1c2luZyBhbHJlYWR5IGJvdW5kIHRleHR1cmUgaWQgJWQgZm9yIHN0YWdlICVsZC5cbiIsCi0JCSAgICAgICgoSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqKSAoZ2xUaGlzLT5jdXJyZW50X2JvdW5kX3RleHR1cmVbc3RhZ2VdKS0+dGV4X3ByaXZhdGUpLT50ZXhfbmFtZSwgc3RhZ2UpOwotCSAgICB9Ci0JfQotCi0JLyogSWYgbm8gdGV4dXJlIHZhbGlkIGZvciB0aGlzIHN0YWdlLCBnbyBvdXQgb2YgdGhlIGxvb3AgKi8KLQlpZiAoVGhpcy0+Y3VycmVudF90ZXh0dXJlW3N0YWdlXSA9PSBOVUxMKSBicmVhazsKLQotCS8qIFRoZW4gY2hlY2sgaWYgd2UgbmVlZCB0byBmbHVzaCB0aGlzIHRleHR1cmUgdG8gR0wgb3Igbm90IChpZSBkaWQgaXQgY2hhbmdlKSA/LgotCSAgIFRoaXMgd2lsbCBhbHNvIHVwZGF0ZSB0aGUgdmFyaW91cyB0ZXh0dXJlIHBhcmFtZXRlcnMgaWYgbmVlZGVkLgotCSovCi0JZ2x0ZXhfdXBsb2FkX3RleHR1cmUoc3VyZl9wdHIsIFRoaXMsIHN0YWdlKTsKLQotCS8qIEFuZCBmaW5hbGx5IGNoZWNrIGZvciBjb2xvci1rZXlpbmcgKG9ubHkgb24gZmlyc3Qgc3RhZ2UpICovCi0JaWYgKFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtzdGFnZV0tPnN1cmZhY2VfZGVzYy5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCkgewotCSAgICBpZiAoc3RhZ2UgPT0gMCkgewotCQllbmFibGVfY29sb3JrZXkgPSBUUlVFOwotCSAgICB9IGVsc2UgewotCQlzdGF0aWMgQk9PTCB3YXJuID0gRkFMU0U7Ci0JCWlmICh3YXJuID09IEZBTFNFKSB7Ci0JCSAgICB3YXJuID0gVFJVRTsKLQkJICAgIFdBUk4oIiBTdXJmYWNlIGhhcyBjb2xvciBrZXlpbmcgb24gc3RhZ2UgZGlmZmVyZW50IGZyb20gMCAoJWxkKSAhIiwgc3RhZ2UpOwotCQl9Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBpZiAoc3RhZ2UgPT0gMCkgewotCQllbmFibGVfY29sb3JrZXkgPSBGQUxTRTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKiBBcHBhcmVudGx5LCB3aGF0ZXZlciB0aGUgc3RhdGUgb2YgQkxFTkQsIGNvbG9yIGtleWluZyBpcyBhbHdheXMgYWN0aXZhdGVkIGZvciAnb2xkJyBEM0QgdmVyc2lvbnMgKi8KLSAgICBpZiAoKChUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQ09MT1JLRVlFTkFCTEUgLSAxXSkgfHwKLQkgKGdsVGhpcy0+cGFyZW50LnZlcnNpb24gPT0gMSkpICYmCi0JKGVuYWJsZV9jb2xvcmtleSkpIHsKLQlUUkFDRSgiIGNvbG9ya2V5IGFjdGl2YXRlZC5cbiIpOwotCQotCWlmIChnbFRoaXMtPmFscGhhX3Rlc3QgPT0gRkFMU0UpIHsKLQkgICAgZ2xFbmFibGUoR0xfQUxQSEFfVEVTVCk7Ci0JICAgIGdsVGhpcy0+YWxwaGFfdGVzdCA9IFRSVUU7Ci0JfQotCWlmICgoZ2xUaGlzLT5jdXJyZW50X2FscGhhX3Rlc3RfZnVuYyAhPSBHTF9OT1RFUVVBTCkgfHwgKGdsVGhpcy0+Y3VycmVudF9hbHBoYV90ZXN0X3JlZiAhPSAwLjApKSB7Ci0JICAgIGlmIChUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQUxQSEFURVNURU5BQkxFIC0gMV0pIHsKLQkJc3RhdGljIEJPT0wgd2FybiA9IEZBTFNFOwotCQlpZiAod2FybiA9PSBGQUxTRSkgewotCQkgICAgd2FybiA9IFRSVUU7Ci0JCSAgICBXQVJOKCIgT3ZlcnJpZGluZyBhcHBsaWNhdGlvbi1naXZlbiBhbHBoYSB0ZXN0IHZhbHVlcyAtIHNvbWUgZ3JhcGhpY2FsIGdsaXRjaGVzIG1heSBhcHBlYXIgIVxuIik7Ci0JCX0KLQkgICAgfQotCSAgICBnbFRoaXMtPmN1cnJlbnRfYWxwaGFfdGVzdF9mdW5jID0gR0xfTk9URVFVQUw7Ci0JICAgIGdsVGhpcy0+Y3VycmVudF9hbHBoYV90ZXN0X3JlZiA9IDAuMDsKLQkgICAgZ2xBbHBoYUZ1bmMoR0xfTk9URVFVQUwsIDAuMCk7Ci0JfQotCS8qIFNvbWUgc2FuaXR5IGNoZWNrcyBzaG91bGQgYmUgYWRkZWQgaGVyZSBpZiBhIGdhbWUgbWl4ZXMgYWxwaGF0ZXN0ICsgY29sb3Iga2V5aW5nLi4uCi0JICAgT25seSBvbmUgaGFzIGJlZW4gZm91bmQgZm9yIG5vdywgYW5kIHRoZSBBTFBIQUZVTkMgaXMgJ0Fsd2F5cycgc28gaXQgd29ya3MgOi0pICovCi0gICAgfSBlbHNlIHsKLQlpZiAoVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0FMUEhBVEVTVEVOQUJMRSAtIDFdID09IEZBTFNFKSB7Ci0JICAgIGdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKLQkgICAgZ2xUaGlzLT5hbHBoYV90ZXN0ID0gRkFMU0U7Ci0JfQotCS8qIE1heWJlIHdlIHNob3VsZCByZXN0b3JlIGhlcmUgdGhlIGFwcGxpY2F0aW9uLWdpdmVuIGFscGhhIHRlc3Qgc3RhdGVzID8gKi8KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YWdlOwotfQotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX1NldFRleHR1cmUoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJICAgICAgIERXT1JEIGR3U3RhZ2UsCi0JCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IGxwVGV4dHVyZTIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oJTA4bHgsJXApXG4iLCBUaGlzLCBpZmFjZSwgZHdTdGFnZSwgbHBUZXh0dXJlMik7Ci0KLSAgICBpZiAoKChHTF9leHRlbnNpb25zLm1heF90ZXh0dXJlX3VuaXRzID09IDApICYmIChkd1N0YWdlID4gMCkpIHx8Ci0JKChHTF9leHRlbnNpb25zLm1heF90ZXh0dXJlX3VuaXRzICE9IDApICYmIChkd1N0YWdlID49IEdMX2V4dGVuc2lvbnMubWF4X3RleHR1cmVfdW5pdHMpKSkgewotCWlmIChscFRleHR1cmUyICE9IE5VTEwpIHsKLQkgICAgV0FSTigiIHNldHRpbmcgYSB0ZXh0dXJlIHRvIGEgbm9uLXN1cHBvcnRlZCB0ZXh0dXJlIHN0YWdlICFcbiIpOwotCX0KLQlyZXR1cm4gRERfT0s7Ci0gICAgfQotCi0gICAgaWYgKFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtkd1N0YWdlXSAhPSBOVUxMKSB7Ci0JSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMtPmN1cnJlbnRfdGV4dHVyZVtkd1N0YWdlXSwgSURpcmVjdERyYXdTdXJmYWNlNykpOwotICAgIH0KLSAgICAKLSAgICBpZiAobHBUZXh0dXJlMiA9PSBOVUxMKSB7Ci0JVGhpcy0+Y3VycmVudF90ZXh0dXJlW2R3U3RhZ2VdID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0ZXhfaW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGxwVGV4dHVyZTIpOwotCUlEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKHRleF9pbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Ci0JVGhpcy0+Y3VycmVudF90ZXh0dXJlW2R3U3RhZ2VdID0gdGV4X2ltcGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Q2FwcyhMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkgTFBEM0RERVZJQ0VERVNDNyBscEQzREhFTERldkRlc2MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBEM0RIRUxEZXZEZXNjKTsKLQotICAgIGZpbGxfb3BlbmdsX2NhcHNfNyhscEQzREhFTERldkRlc2MpOwotCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgY2FwcyA6IG5vIGR1bXAgZnVuY3Rpb24geWV0LlxuIik7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0TWF0ZXJpYWwoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJICAgICBMUEQzRE1BVEVSSUFMNyBscE1hdCkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscE1hdCk7Ci0gICAgCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiIG1hdGVyaWFsIGlzIDpcbiIpOwotCWR1bXBfRDNETUFURVJJQUw3KGxwTWF0KTsKLSAgICB9Ci0gICAgCi0gICAgVGhpcy0+Y3VycmVudF9tYXRlcmlhbCA9ICpscE1hdDsKLQotICAgIEVOVEVSX0dMKCk7Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLAotCQkgR0xfRElGRlVTRSwKLQkJIChmbG9hdCAqKSAmKFRoaXMtPmN1cnJlbnRfbWF0ZXJpYWwudS5kaWZmdXNlKSk7Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLAotCQkgR0xfQU1CSUVOVCwKLQkJIChmbG9hdCAqKSAmKFRoaXMtPmN1cnJlbnRfbWF0ZXJpYWwudTEuYW1iaWVudCkpOwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywKLQkJIEdMX1NQRUNVTEFSLAotCQkgKGZsb2F0ICopICYoVGhpcy0+Y3VycmVudF9tYXRlcmlhbC51Mi5zcGVjdWxhcikpOwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywKLQkJIEdMX0VNSVNTSU9OLAotCQkgKGZsb2F0ICopICYoVGhpcy0+Y3VycmVudF9tYXRlcmlhbC51My5lbWlzc2l2ZSkpOwotICAgIGdsTWF0ZXJpYWxmKEdMX0ZST05UX0FORF9CQUNLLAotCQlHTF9TSElOSU5FU1MsCi0JCVRoaXMtPmN1cnJlbnRfbWF0ZXJpYWwudTQucG93ZXIpOyAvKiBOb3Qgc3VyZSBhYm91dCB0aGlzLi4uICovCi0gICAgTEVBVkVfR0woKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIExQRDNETElHSFQ3IGdldF9saWdodChJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLCBEV09SRCBkd0xpZ2h0SW5kZXgpCi17Ci0gICAgaWYgKGR3TGlnaHRJbmRleCA+PSBUaGlzLT5udW1fc2V0X2xpZ2h0cykKLSAgICB7Ci0gICAgICAgIC8qIEV4dGVuZCwgb3IgYWxsb2NhdGUgdGhlIGxpZ2h0IHBhcmFtZXRlcnMgYXJyYXkuICovCi0gICAgICAgIERXT1JEIG5ld2xpZ2h0bnVtID0gZHdMaWdodEluZGV4ICsgMTsKLSAgICAgICAgTFBEM0RMSUdIVDcgbmV3YXJyYXlwdHIgPSBOVUxMOwotCi0gICAgICAgIGlmIChUaGlzLT5saWdodF9wYXJhbWV0ZXJzKQotICAgICAgICAgICAgbmV3YXJyYXlwdHIgPSBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotICAgICAgICAgICAgICAgIFRoaXMtPmxpZ2h0X3BhcmFtZXRlcnMsIG5ld2xpZ2h0bnVtICogc2l6ZW9mKEQzRExJR0hUNykpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdhcnJheXB0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotICAgICAgICAgICAgICAgIG5ld2xpZ2h0bnVtICogc2l6ZW9mKEQzRExJR0hUNykpOwotCi0gICAgICAgIGlmICghbmV3YXJyYXlwdHIpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBUaGlzLT5saWdodF9wYXJhbWV0ZXJzID0gbmV3YXJyYXlwdHI7Ci0gICAgICAgIFRoaXMtPm51bV9zZXRfbGlnaHRzID0gbmV3bGlnaHRudW07Ci0gICAgfQotCi0gICAgcmV0dXJuICZUaGlzLT5saWdodF9wYXJhbWV0ZXJzW2R3TGlnaHRJbmRleF07Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0TGlnaHQoTFBESVJFQ1QzRERFVklDRTcgaWZhY2UsCi0JCQkJICBEV09SRCBkd0xpZ2h0SW5kZXgsCi0JCQkJICBMUEQzRExJR0hUNyBscExpZ2h0KQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGlmYWNlKTsKLSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwgKmdsVGhpcyA9IChJRGlyZWN0M0REZXZpY2VHTEltcGwgKikgVGhpczsKLSAgICBMUEQzRExJR0hUNyBscGRlc3RsaWdodCA9IGdldF9saWdodCggVGhpcywgZHdMaWdodEluZGV4ICk7Ci0KLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVwKVxuIiwgVGhpcywgaWZhY2UsIGR3TGlnaHRJbmRleCwgbHBMaWdodCk7Ci0gICAgCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiIHNldHRpbmcgbGlnaHQgOlxuIik7Ci0JZHVtcF9EM0RMSUdIVDcobHBMaWdodCk7Ci0gICAgfQotICAgIAotICAgIC8qIERpcmVjdFg3IGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuCi0gICAgICAgRERFUlJfT1VUT0ZNRU1PUlksIHNvIHdlIGRvIGp1c3QgdGhhdCBpbiBjYXNlIG9mIGFuIGFsbG9jYXRpb24KLSAgICAgICBlcnJvciAod2hpY2ggaXMgdGhlIG9ubHkgcmVhc29uIHdoeSBnZXRfbGlnaHQoKSBjYW4gZmFpbCkuICovCi0gICAgaWYoICFscGRlc3RsaWdodCApCi0gICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKLQotICAgICpscGRlc3RsaWdodCA9ICpscExpZ2h0OwotCi0gICAgLyogU29tZSBjaGVja3MgdG8gcHJpbnQgb3V0IG5pY2Ugd2FybmluZ3MgOi0pICovCi0gICAgc3dpdGNoIChscExpZ2h0LT5kbHRUeXBlKSB7Ci0gICAgICAgIGNhc2UgRDNETElHSFRfRElSRUNUSU9OQUw6Ci0gICAgICAgIGNhc2UgRDNETElHSFRfUE9JTlQ6Ci0gICAgICAgICAgICAvKiBUaGVzZSBhcmUgaGFuZGxlZCBwcm9wZXJseS4uLiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0JICAgIAotICAgICAgICBjYXNlIEQzRExJR0hUX1NQT1Q6Ci0gICAgICAgICAgICBpZiAoKGxwTGlnaHQtPmR2VGhldGEgIT0gMC4wKSB8fAotCQkobHBMaWdodC0+ZHZUaGV0YSAhPSBscExpZ2h0LT5kdlBoaSkpIHsKLQkgICAgICAgIEVSUigiZHZUaGV0YSBub3QgZnVsbHkgc3VwcG9ydGVkIHlldCAhXG4iKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIEVSUigiTGlnaHQgdHlwZSBub3QgaGFuZGxlZCB5ZXQgOiAlMDh4ICFcbiIsIGxwTGlnaHQtPmRsdFR5cGUpOwotICAgIH0KLSAgICAKLSAgICAvKiBUaGlzIHdpbGwgZm9yY2UgdGhlIExpZ2h0IHNldHRpbmcgb24gbmV4dCBkcmF3aW5nIG9mIHByaW1pdGl2ZXMgKi8KLSAgICBnbFRoaXMtPnRyYW5zZm9ybV9zdGF0ZSA9IEdMX1RSQU5TRk9STV9OT05FOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN19MaWdodEVuYWJsZShMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkgICAgIERXT1JEIGR3TGlnaHRJbmRleCwKLQkJCQkgICAgIEJPT0wgYkVuYWJsZSkKLXsKLSAgICBpbnQgbGlnaHRzbG90ID0gLTEsIGk7Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgaWZhY2UpOwotICAgIExQRDNETElHSFQ3IGxwZGVzdGxpZ2h0ID0gZ2V0X2xpZ2h0KFRoaXMsIGR3TGlnaHRJbmRleCk7Ci0KLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVkKVxuIiwgVGhpcywgaWZhY2UsIGR3TGlnaHRJbmRleCwgYkVuYWJsZSk7Ci0KLSAgICAvKiBUaGUgRGlyZWN0WCBkb2MgaXNuJ3QgYXMgZXhwbGljaXQgYXMgZm9yIFNldExpZ2h0IGFzIHdoZXRoZXIgd2UgY2FuCi0gICAgICAgcmV0dXJuIHRoaXMgZnJvbSB0aGlzIGZ1bmN0aW9uLCBidXQgaXQgZG9lc24ndCBzdGF0ZSBvdGhlcndpc2UuICovCi0gICAgaWYgKCFscGRlc3RsaWdodCkKLSAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwotCi0gICAgLyogSWYgdGhpcyBsaWdodCBoYXNuJ3QgYmVlbiBzZXQsIGluaXRpYWxpc2UgaXQgd2l0aCBkZWZhdWx0IHZhbHVlcy4gKi8KLSAgICBpZiAobHBkZXN0bGlnaHQtPmRsdFR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIFRSQUNFKCJzZXR0aW5nIGRlZmF1bHQgbGlnaHQgcGFyYW1ldGVyc1xuIik7Ci0KLSAgICAgICAgLyogV2UgYWx3YXlzIHVzZSBIRUFQX1pFUk9fTUVNT1JZIHdoZW4gYWxsb2NhdGluZyB0aGUgbGlnaHRfcGFyYW1ldGVycwotICAgICAgICAgICBhcnJheSwgc28gd2Ugb25seSBoYXZlIHRvIHNldHVwIGFueXRoaW5nIHRoYXQgc2hvdWQgbm90IGJlIHplcm8uICovCi0gICAgICAgIGxwZGVzdGxpZ2h0LT5kbHRUeXBlID0gRDNETElHSFRfRElSRUNUSU9OQUw7Ci0gICAgICAgIGxwZGVzdGxpZ2h0LT5kY3ZEaWZmdXNlLnUxLnIgPSAxLmY7Ci0gICAgICAgIGxwZGVzdGxpZ2h0LT5kY3ZEaWZmdXNlLnUyLmcgPSAxLmY7Ci0gICAgICAgIGxwZGVzdGxpZ2h0LT5kY3ZEaWZmdXNlLnUzLmIgPSAxLmY7Ci0gICAgICAgIGxwZGVzdGxpZ2h0LT5kdkRpcmVjdGlvbi51My56ID0gMS5mOwotICAgIH0KLQotICAgIC8qIExvb2sgZm9yIHRoaXMgbGlnaHQgaW4gdGhlIGFjdGl2ZSBsaWdodHMgYXJyYXkuICovCi0gICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPm1heF9hY3RpdmVfbGlnaHRzOyBpKyspCi0gICAgICAgIGlmIChUaGlzLT5hY3RpdmVfbGlnaHRzW2ldID09IGR3TGlnaHRJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgbGlnaHRzbG90ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBpdCwgbGV0J3MgZmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIHNsb3QsIGlmIGFueS4gKi8KLSAgICBpZiAobGlnaHRzbG90ID09IC0xKQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVGhpcy0+bWF4X2FjdGl2ZV9saWdodHM7IGkrKykKLSAgICAgICAgICAgIGlmIChUaGlzLT5hY3RpdmVfbGlnaHRzW2ldID09IH4wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpZ2h0c2xvdCA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICBFTlRFUl9HTCgpOwotICAgIGlmIChiRW5hYmxlKSB7Ci0gICAgICAgIGlmIChsaWdodHNsb3QgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXBwIGlzIHRyeWluZyB0byBlbmFibGUgbW9yZSBsaWdodHMgdGhhbgotICAgICAgICAgICAgICAgdGhlIG1heGltdW0gcG9zc2libGUgaW5kaWNhdGVkIGluIHRoZSBjYXBzLgotCi0gICAgICAgICAgICAgICBXaW5kb3dzIGFjdHVhbGx5IGxldCB5b3UgZG8gdGhpcywgYW5kIGRpc2FibGUgb25lIG9mIHRoZQotICAgICAgICAgICAgICAgcHJldmlvdXNseSBlbmFibGVkIGxpZ2h0cyB0byBsZXQgeW91IGVuYWJsZSB0aGlzIG9uZS4KLQotICAgICAgICAgICAgICAgSXQncyBub3QgZG9jdW1lbnRlZCBhbmQgSSdtIG5vdCBzdXJlIGhvdyB3aW5kb3dzIHBpY2sgd2hpY2ggbGlnaHQKLSAgICAgICAgICAgICAgIHRvIGRpc2FibGUgdG8gbWFrZSByb29tIGZvciB0aGlzIG9uZS4gKi8KLSAgICAgICAgICAgIEZJWE1FKCJFbmFibGluZyBtb3JlIGxpZ2h0IHRoYW4gdGhlIG1heGltdW0gaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7Ci0gICAgICAgICAgICByZXR1cm4gRDNEX09LOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xFbmFibGUoR0xfTElHSFQwICsgbGlnaHRzbG90KTsKLQotCi0gICAgICAgIGlmIChUaGlzLT5hY3RpdmVfbGlnaHRzW2xpZ2h0c2xvdF0gPT0gfjApCi0gICAgICAgIHsKLQkgICAgLyogVGhpcyBsaWdodCBnZXRzIGFjdGl2ZS4uLiBOZWVkIHRvIHVwZGF0ZSBpdHMgcGFyYW1ldGVycyB0byBHTCBiZWZvcmUgdGhlIG5leHQgZHJhd2luZyAqLwotCSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwgKmdsVGhpcyA9IChJRGlyZWN0M0REZXZpY2VHTEltcGwgKikgVGhpczsKLQotICAgICAgICAgICAgVGhpcy0+YWN0aXZlX2xpZ2h0c1tsaWdodHNsb3RdID0gZHdMaWdodEluZGV4OwotCSAgICBnbFRoaXMtPnRyYW5zZm9ybV9zdGF0ZSA9IEdMX1RSQU5TRk9STV9OT05FOwotCX0KLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfTElHSFQwICsgbGlnaHRzbG90KTsKLSAgICAgICAgVGhpcy0+YWN0aXZlX2xpZ2h0c1tsaWdodHNsb3RdID0gfjA7Ci0gICAgfQotCi0gICAgTEVBVkVfR0woKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgIFdJTkFQSSAgCi1HTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfU2V0Q2xpcFBsYW5lKExQRElSRUNUM0RERVZJQ0U3IGlmYWNlLCBEV09SRCBkd0luZGV4LCBEM0RWQUxVRSogcFBsYW5lRXF1YXRpb24pIAotewotICAgIElEaXJlY3QzRERldmljZUltcGwgKlRoaXMgPSAoSURpcmVjdDNERGV2aWNlSW1wbCAqKWlmYWNlOwotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCogZ2xUaGlzID0gKElEaXJlY3QzRERldmljZUdMSW1wbCopIFRoaXM7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVsZCwlcClcbiIsIFRoaXMsIGR3SW5kZXgsIHBQbGFuZUVxdWF0aW9uKTsKLQotICAgIGlmIChkd0luZGV4ID49IFRoaXMtPm1heF9jbGlwcGluZ19wbGFuZXMpIHsKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLSAgICB9Ci0KLSAgICBUUkFDRSgiIGNsaXAgcGxhbmUgJWxkIDogJWYgJWYgJWYgJWZcbiIsIGR3SW5kZXgsIHBQbGFuZUVxdWF0aW9uWzBdLCBwUGxhbmVFcXVhdGlvblsxXSwgcFBsYW5lRXF1YXRpb25bMl0sIHBQbGFuZUVxdWF0aW9uWzNdICk7Ci0KLSAgICBtZW1jcHkoVGhpcy0+Y2xpcHBpbmdfcGxhbmVzW2R3SW5kZXhdLnBsYW5lLCBwUGxhbmVFcXVhdGlvbiwgc2l6ZW9mKEQzRFZBTFVFWzRdKSk7Ci0gICAgCi0gICAgLyogVGhpcyBpcyB0byBmb3JjZSB0aGUgcmVzZXQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIG9uIHRoZSBuZXh0IGRyYXdpbmcuCi0gICAgICogVGhpcyBpcyBuZWVkZWQgdG8gdXNlIHRoZSBjb3JyZWN0IG1hdHJpY2VzIGZvciB0aGUgdmFyaW91cyBjbGlwcGluZyBwbGFuZXMuCi0gICAgICovCi0gICAgZ2xUaGlzLT50cmFuc2Zvcm1fc3RhdGUgPSBHTF9UUkFOU0ZPUk1fTk9ORTsKLSAgICAKLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRERldmljZUltcGxfN19TZXRWaWV3cG9ydChMUERJUkVDVDNEREVWSUNFNyBpZmFjZSwKLQkJCQkgICAgIExQRDNEVklFV1BPUlQ3IGxwRGF0YSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERhdGEpOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiIHZpZXdwb3J0IGlzIDpcbiIpOwotCVRSQUNFKCIgICAgLSBkd1ggPSAlbGQgICBkd1kgPSAlbGRcbiIsCi0JICAgICAgbHBEYXRhLT5kd1gsIGxwRGF0YS0+ZHdZKTsKLQlUUkFDRSgiICAgIC0gZHdXaWR0aCA9ICVsZCAgIGR3SGVpZ2h0ID0gJWxkXG4iLAotCSAgICAgIGxwRGF0YS0+ZHdXaWR0aCwgbHBEYXRhLT5kd0hlaWdodCk7Ci0JVFJBQ0UoIiAgICAtIGR2TWluWiA9ICVmICAgZHZNYXhaID0gJWZcbiIsCi0JICAgICAgbHBEYXRhLT5kdk1pblosIGxwRGF0YS0+ZHZNYXhaKTsKLSAgICB9Ci0gICAgRU5URVJfR0woKTsKLSAgICAKLSAgICAvKiBTZXQgdGhlIHZpZXdwb3J0ICovCi0gICAgaWYgKChscERhdGEtPmR2TWluWiAhPSBUaGlzLT5hY3RpdmVfdmlld3BvcnQuZHZNaW5aKSB8fAotCShscERhdGEtPmR2TWF4WiAhPSBUaGlzLT5hY3RpdmVfdmlld3BvcnQuZHZNYXhaKSkgewotCWdsRGVwdGhSYW5nZShscERhdGEtPmR2TWluWiwgbHBEYXRhLT5kdk1heFopOwotICAgIH0KLSAgICBpZiAoKGxwRGF0YS0+ZHdYICE9IFRoaXMtPmFjdGl2ZV92aWV3cG9ydC5kd1gpIHx8Ci0JKGxwRGF0YS0+ZHdZICE9IFRoaXMtPmFjdGl2ZV92aWV3cG9ydC5kd1kpIHx8Ci0JKGxwRGF0YS0+ZHdXaWR0aCAhPSBUaGlzLT5hY3RpdmVfdmlld3BvcnQuZHdXaWR0aCkgfHwKLQkobHBEYXRhLT5kd0hlaWdodCAhPSBUaGlzLT5hY3RpdmVfdmlld3BvcnQuZHdIZWlnaHQpKSB7Ci0JZ2xWaWV3cG9ydChscERhdGEtPmR3WCwKLQkJICAgVGhpcy0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0IC0gKGxwRGF0YS0+ZHdIZWlnaHQgKyBscERhdGEtPmR3WSksCi0JCSAgIGxwRGF0YS0+ZHdXaWR0aCwgbHBEYXRhLT5kd0hlaWdodCk7Ci0gICAgfQotCi0gICAgTEVBVkVfR0woKTsKLQotICAgIFRoaXMtPmFjdGl2ZV92aWV3cG9ydCA9ICpscERhdGE7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNERGV2aWNlNy5mdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh2b2lkKikKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgSURpcmVjdDNERGV2aWNlN1Z0YmwgVlRBQkxFX0lEaXJlY3QzRERldmljZTcgPQotewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF8xVF9RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBHTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfMVRfUmVsZWFzZSwKLSAgICBYQ0FTVChHZXRDYXBzKSBHTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Q2FwcywKLSAgICBYQ0FTVChFbnVtVGV4dHVyZUZvcm1hdHMpIEdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9FbnVtVGV4dHVyZUZvcm1hdHMsCi0gICAgWENBU1QoQmVnaW5TY2VuZSkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfMVRfQmVnaW5TY2VuZSwKLSAgICBYQ0FTVChFbmRTY2VuZSkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfMVRfRW5kU2NlbmUsCi0gICAgWENBU1QoR2V0RGlyZWN0M0QpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUXzFUX0dldERpcmVjdDNELAotICAgIFhDQVNUKFNldFJlbmRlclRhcmdldCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfU2V0UmVuZGVyVGFyZ2V0LAotICAgIFhDQVNUKEdldFJlbmRlclRhcmdldCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfR2V0UmVuZGVyVGFyZ2V0LAotICAgIFhDQVNUKENsZWFyKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfN19DbGVhciwKLSAgICBYQ0FTVChTZXRUcmFuc2Zvcm0pIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX1NldFRyYW5zZm9ybSwKLSAgICBYQ0FTVChHZXRUcmFuc2Zvcm0pIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX0dldFRyYW5zZm9ybSwKLSAgICBYQ0FTVChTZXRWaWV3cG9ydCkgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83X1NldFZpZXdwb3J0LAotICAgIFhDQVNUKE11bHRpcGx5VHJhbnNmb3JtKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9NdWx0aXBseVRyYW5zZm9ybSwKLSAgICBYQ0FTVChHZXRWaWV3cG9ydCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0Vmlld3BvcnQsCi0gICAgWENBU1QoU2V0TWF0ZXJpYWwpIEdMX0lEaXJlY3QzRERldmljZUltcGxfN19TZXRNYXRlcmlhbCwKLSAgICBYQ0FTVChHZXRNYXRlcmlhbCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TWF0ZXJpYWwsCi0gICAgWENBU1QoU2V0TGlnaHQpIEdMX0lEaXJlY3QzRERldmljZUltcGxfN19TZXRMaWdodCwKLSAgICBYQ0FTVChHZXRMaWdodCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0TGlnaHQsCi0gICAgWENBU1QoU2V0UmVuZGVyU3RhdGUpIEdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF8yVF9TZXRSZW5kZXJTdGF0ZSwKLSAgICBYQ0FTVChHZXRSZW5kZXJTdGF0ZSkgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX0dldFJlbmRlclN0YXRlLAotICAgIFhDQVNUKEJlZ2luU3RhdGVCbG9jaykgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfQmVnaW5TdGF0ZUJsb2NrLAotICAgIFhDQVNUKEVuZFN0YXRlQmxvY2spIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0VuZFN0YXRlQmxvY2ssCi0gICAgWENBU1QoUHJlTG9hZCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfUHJlTG9hZCwKLSAgICBYQ0FTVChEcmF3UHJpbWl0aXZlKSBHTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfRHJhd1ByaW1pdGl2ZSwKLSAgICBYQ0FTVChEcmF3SW5kZXhlZFByaW1pdGl2ZSkgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdJbmRleGVkUHJpbWl0aXZlLAotICAgIFhDQVNUKFNldENsaXBTdGF0dXMpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUXzJUX1NldENsaXBTdGF0dXMsCi0gICAgWENBU1QoR2V0Q2xpcFN0YXR1cykgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfMlRfR2V0Q2xpcFN0YXR1cywKLSAgICBYQ0FTVChEcmF3UHJpbWl0aXZlU3RyaWRlZCkgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdQcmltaXRpdmVTdHJpZGVkLAotICAgIFhDQVNUKERyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZCkgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdJbmRleGVkUHJpbWl0aXZlU3RyaWRlZCwKLSAgICBYQ0FTVChEcmF3UHJpbWl0aXZlVkIpIEdMX0lEaXJlY3QzRERldmljZUltcGxfN18zVF9EcmF3UHJpbWl0aXZlVkIsCi0gICAgWENBU1QoRHJhd0luZGV4ZWRQcmltaXRpdmVWQikgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0RyYXdJbmRleGVkUHJpbWl0aXZlVkIsCi0gICAgWENBU1QoQ29tcHV0ZVNwaGVyZVZpc2liaWxpdHkpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5LAotICAgIFhDQVNUKEdldFRleHR1cmUpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0dldFRleHR1cmUsCi0gICAgWENBU1QoU2V0VGV4dHVyZSkgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX1NldFRleHR1cmUsCi0gICAgWENBU1QoR2V0VGV4dHVyZVN0YWdlU3RhdGUpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX0dldFRleHR1cmVTdGFnZVN0YXRlLAotICAgIFhDQVNUKFNldFRleHR1cmVTdGFnZVN0YXRlKSBHTF9JRGlyZWN0M0REZXZpY2VJbXBsXzdfM1RfU2V0VGV4dHVyZVN0YWdlU3RhdGUsCi0gICAgWENBU1QoVmFsaWRhdGVEZXZpY2UpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83XzNUX1ZhbGlkYXRlRGV2aWNlLAotICAgIFhDQVNUKEFwcGx5U3RhdGVCbG9jaykgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfQXBwbHlTdGF0ZUJsb2NrLAotICAgIFhDQVNUKENhcHR1cmVTdGF0ZUJsb2NrKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfN19DYXB0dXJlU3RhdGVCbG9jaywKLSAgICBYQ0FTVChEZWxldGVTdGF0ZUJsb2NrKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfN19EZWxldGVTdGF0ZUJsb2NrLAotICAgIFhDQVNUKENyZWF0ZVN0YXRlQmxvY2spIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF83X0NyZWF0ZVN0YXRlQmxvY2ssCi0gICAgWENBU1QoTG9hZCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfTG9hZCwKLSAgICBYQ0FTVChMaWdodEVuYWJsZSkgR0xfSURpcmVjdDNERGV2aWNlSW1wbF83X0xpZ2h0RW5hYmxlLAotICAgIFhDQVNUKEdldExpZ2h0RW5hYmxlKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfN19HZXRMaWdodEVuYWJsZSwKLSAgICBYQ0FTVChTZXRDbGlwUGxhbmUpIEdMX0lEaXJlY3QzRERldmljZUltcGxfN19TZXRDbGlwUGxhbmUsCi0gICAgWENBU1QoR2V0Q2xpcFBsYW5lKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfN19HZXRDbGlwUGxhbmUsCi0gICAgWENBU1QoR2V0SW5mbykgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzdfR2V0SW5mbywKLX07Ci0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jdW5kZWYgWENBU1QKLSNlbmRpZgotCi0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodHlwZW9mKFZUQUJMRV9JRGlyZWN0M0REZXZpY2UzLmZ1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHZvaWQqKQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBJRGlyZWN0M0REZXZpY2UzVnRibCBWVEFCTEVfSURpcmVjdDNERGV2aWNlMyA9Ci17Ci0gICAgWENBU1QoUXVlcnlJbnRlcmZhY2UpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19BZGRSZWYsCi0gICAgWENBU1QoUmVsZWFzZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1JlbGVhc2UsCi0gICAgWENBU1QoR2V0Q2FwcykgR0xfSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUXzFUX0dldENhcHMsCi0gICAgWENBU1QoR2V0U3RhdHMpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUXzFUX0dldFN0YXRzLAotICAgIFhDQVNUKEFkZFZpZXdwb3J0KSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF8xVF9BZGRWaWV3cG9ydCwKLSAgICBYQ0FTVChEZWxldGVWaWV3cG9ydCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfMVRfRGVsZXRlVmlld3BvcnQsCi0gICAgWENBU1QoTmV4dFZpZXdwb3J0KSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF8xVF9OZXh0Vmlld3BvcnQsCi0gICAgWENBU1QoRW51bVRleHR1cmVGb3JtYXRzKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRW51bVRleHR1cmVGb3JtYXRzLAotICAgIFhDQVNUKEJlZ2luU2NlbmUpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19CZWdpblNjZW5lLAotICAgIFhDQVNUKEVuZFNjZW5lKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRW5kU2NlbmUsCi0gICAgWENBU1QoR2V0RGlyZWN0M0QpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXREaXJlY3QzRCwKLSAgICBYQ0FTVChTZXRDdXJyZW50Vmlld3BvcnQpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX1NldEN1cnJlbnRWaWV3cG9ydCwKLSAgICBYQ0FTVChHZXRDdXJyZW50Vmlld3BvcnQpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX0dldEN1cnJlbnRWaWV3cG9ydCwKLSAgICBYQ0FTVChTZXRSZW5kZXJUYXJnZXQpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRSZW5kZXJUYXJnZXQsCi0gICAgWENBU1QoR2V0UmVuZGVyVGFyZ2V0KSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0UmVuZGVyVGFyZ2V0LAotICAgIFhDQVNUKEJlZ2luKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfM19CZWdpbiwKLSAgICBYQ0FTVChCZWdpbkluZGV4ZWQpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zX0JlZ2luSW5kZXhlZCwKLSAgICBYQ0FTVChWZXJ0ZXgpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8zXzJUX1ZlcnRleCwKLSAgICBYQ0FTVChJbmRleCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzNfMlRfSW5kZXgsCi0gICAgWENBU1QoRW5kKSBNYWluX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9FbmQsCi0gICAgWENBU1QoR2V0UmVuZGVyU3RhdGUpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRSZW5kZXJTdGF0ZSwKLSAgICBYQ0FTVChTZXRSZW5kZXJTdGF0ZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFJlbmRlclN0YXRlLAotICAgIFhDQVNUKEdldExpZ2h0U3RhdGUpIEdMX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9HZXRMaWdodFN0YXRlLAotICAgIFhDQVNUKFNldExpZ2h0U3RhdGUpIEdMX0lEaXJlY3QzRERldmljZUltcGxfM18yVF9TZXRMaWdodFN0YXRlLAotICAgIFhDQVNUKFNldFRyYW5zZm9ybSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1NldFRyYW5zZm9ybSwKLSAgICBYQ0FTVChHZXRUcmFuc2Zvcm0pIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRUcmFuc2Zvcm0sCi0gICAgWENBU1QoTXVsdGlwbHlUcmFuc2Zvcm0pIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19NdWx0aXBseVRyYW5zZm9ybSwKLSAgICBYQ0FTVChEcmF3UHJpbWl0aXZlKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZSwKLSAgICBYQ0FTVChEcmF3SW5kZXhlZFByaW1pdGl2ZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdJbmRleGVkUHJpbWl0aXZlLAotICAgIFhDQVNUKFNldENsaXBTdGF0dXMpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRDbGlwU3RhdHVzLAotICAgIFhDQVNUKEdldENsaXBTdGF0dXMpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRDbGlwU3RhdHVzLAotICAgIFhDQVNUKERyYXdQcmltaXRpdmVTdHJpZGVkKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd1ByaW1pdGl2ZVN0cmlkZWQsCi0gICAgWENBU1QoRHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd0luZGV4ZWRQcmltaXRpdmVTdHJpZGVkLAotICAgIFhDQVNUKERyYXdQcmltaXRpdmVWQikgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0RyYXdQcmltaXRpdmVWQiwKLSAgICBYQ0FTVChEcmF3SW5kZXhlZFByaW1pdGl2ZVZCKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfRHJhd0luZGV4ZWRQcmltaXRpdmVWQiwKLSAgICBYQ0FTVChDb21wdXRlU3BoZXJlVmlzaWJpbGl0eSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX0NvbXB1dGVTcGhlcmVWaXNpYmlsaXR5LAotICAgIFhDQVNUKEdldFRleHR1cmUpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19HZXRUZXh0dXJlLAotICAgIFhDQVNUKFNldFRleHR1cmUpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUZXh0dXJlLAotICAgIFhDQVNUKEdldFRleHR1cmVTdGFnZVN0YXRlKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzNfR2V0VGV4dHVyZVN0YWdlU3RhdGUsCi0gICAgWENBU1QoU2V0VGV4dHVyZVN0YWdlU3RhdGUpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfM19TZXRUZXh0dXJlU3RhZ2VTdGF0ZSwKLSAgICBYQ0FTVChWYWxpZGF0ZURldmljZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8zX1ZhbGlkYXRlRGV2aWNlLAotfTsKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSN1bmRlZiBYQ0FTVAotI2VuZGlmCi0KLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh0eXBlb2YoVlRBQkxFX0lEaXJlY3QzRERldmljZTIuZnVuKSkKLSNlbHNlCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodm9pZCopCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IElEaXJlY3QzRERldmljZTJWdGJsIFZUQUJMRV9JRGlyZWN0M0REZXZpY2UyID0KLXsKLSAgICBYQ0FTVChRdWVyeUludGVyZmFjZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZikgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfUmVsZWFzZSwKLSAgICBYQ0FTVChHZXRDYXBzKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0Q2FwcywKLSAgICBYQ0FTVChTd2FwVGV4dHVyZUhhbmRsZXMpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8yXzFUX1N3YXBUZXh0dXJlSGFuZGxlcywKLSAgICBYQ0FTVChHZXRTdGF0cykgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFN0YXRzLAotICAgIFhDQVNUKEFkZFZpZXdwb3J0KSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfQWRkVmlld3BvcnQsCi0gICAgWENBU1QoRGVsZXRlVmlld3BvcnQpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9EZWxldGVWaWV3cG9ydCwKLSAgICBYQ0FTVChOZXh0Vmlld3BvcnQpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9OZXh0Vmlld3BvcnQsCi0gICAgWENBU1QoRW51bVRleHR1cmVGb3JtYXRzKSBHTF9JRGlyZWN0M0REZXZpY2VJbXBsXzJfMVRfRW51bVRleHR1cmVGb3JtYXRzLAotICAgIFhDQVNUKEJlZ2luU2NlbmUpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9CZWdpblNjZW5lLAotICAgIFhDQVNUKEVuZFNjZW5lKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfRW5kU2NlbmUsCi0gICAgWENBU1QoR2V0RGlyZWN0M0QpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXREaXJlY3QzRCwKLSAgICBYQ0FTVChTZXRDdXJyZW50Vmlld3BvcnQpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9TZXRDdXJyZW50Vmlld3BvcnQsCi0gICAgWENBU1QoR2V0Q3VycmVudFZpZXdwb3J0KSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfR2V0Q3VycmVudFZpZXdwb3J0LAotICAgIFhDQVNUKFNldFJlbmRlclRhcmdldCkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldFJlbmRlclRhcmdldCwKLSAgICBYQ0FTVChHZXRSZW5kZXJUYXJnZXQpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMl9HZXRSZW5kZXJUYXJnZXQsCi0gICAgWENBU1QoQmVnaW4pIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8yX0JlZ2luLAotICAgIFhDQVNUKEJlZ2luSW5kZXhlZCkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzJfQmVnaW5JbmRleGVkLAotICAgIFhDQVNUKFZlcnRleCkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1ZlcnRleCwKLSAgICBYQ0FTVChJbmRleCkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0luZGV4LAotICAgIFhDQVNUKEVuZCkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0VuZCwKLSAgICBYQ0FTVChHZXRSZW5kZXJTdGF0ZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFJlbmRlclN0YXRlLAotICAgIFhDQVNUKFNldFJlbmRlclN0YXRlKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0UmVuZGVyU3RhdGUsCi0gICAgWENBU1QoR2V0TGlnaHRTdGF0ZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldExpZ2h0U3RhdGUsCi0gICAgWENBU1QoU2V0TGlnaHRTdGF0ZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldExpZ2h0U3RhdGUsCi0gICAgWENBU1QoU2V0VHJhbnNmb3JtKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzJfU2V0VHJhbnNmb3JtLAotICAgIFhDQVNUKEdldFRyYW5zZm9ybSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldFRyYW5zZm9ybSwKLSAgICBYQ0FTVChNdWx0aXBseVRyYW5zZm9ybSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX011bHRpcGx5VHJhbnNmb3JtLAotICAgIFhDQVNUKERyYXdQcmltaXRpdmUpIEdMX0lEaXJlY3QzRERldmljZUltcGxfMl9EcmF3UHJpbWl0aXZlLAotICAgIFhDQVNUKERyYXdJbmRleGVkUHJpbWl0aXZlKSBHTF9JRGlyZWN0M0REZXZpY2VJbXBsXzJfRHJhd0luZGV4ZWRQcmltaXRpdmUsCi0gICAgWENBU1QoU2V0Q2xpcFN0YXR1cykgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX1NldENsaXBTdGF0dXMsCi0gICAgWENBU1QoR2V0Q2xpcFN0YXR1cykgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8yX0dldENsaXBTdGF0dXMsCi19OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNERGV2aWNlLmZ1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHZvaWQqKQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBJRGlyZWN0M0REZXZpY2VWdGJsIFZUQUJMRV9JRGlyZWN0M0REZXZpY2UgPQotewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpIFRodW5rX0lEaXJlY3QzRERldmljZUltcGxfMV9SZWxlYXNlLAotICAgIFhDQVNUKEluaXRpYWxpemUpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0luaXRpYWxpemUsCi0gICAgWENBU1QoR2V0Q2FwcykgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldENhcHMsCi0gICAgWENBU1QoU3dhcFRleHR1cmVIYW5kbGVzKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfU3dhcFRleHR1cmVIYW5kbGVzLAotICAgIFhDQVNUKENyZWF0ZUV4ZWN1dGVCdWZmZXIpIEdMX0lEaXJlY3QzRERldmljZUltcGxfMV9DcmVhdGVFeGVjdXRlQnVmZmVyLAotICAgIFhDQVNUKEdldFN0YXRzKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0U3RhdHMsCi0gICAgWENBU1QoRXhlY3V0ZSkgTWFpbl9JRGlyZWN0M0REZXZpY2VJbXBsXzFfRXhlY3V0ZSwKLSAgICBYQ0FTVChBZGRWaWV3cG9ydCkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0FkZFZpZXdwb3J0LAotICAgIFhDQVNUKERlbGV0ZVZpZXdwb3J0KSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfRGVsZXRlVmlld3BvcnQsCi0gICAgWENBU1QoTmV4dFZpZXdwb3J0KSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfTmV4dFZpZXdwb3J0LAotICAgIFhDQVNUKFBpY2spIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX1BpY2ssCi0gICAgWENBU1QoR2V0UGlja1JlY29yZHMpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldFBpY2tSZWNvcmRzLAotICAgIFhDQVNUKEVudW1UZXh0dXJlRm9ybWF0cykgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0VudW1UZXh0dXJlRm9ybWF0cywKLSAgICBYQ0FTVChDcmVhdGVNYXRyaXgpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0NyZWF0ZU1hdHJpeCwKLSAgICBYQ0FTVChTZXRNYXRyaXgpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX1NldE1hdHJpeCwKLSAgICBYQ0FTVChHZXRNYXRyaXgpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0dldE1hdHJpeCwKLSAgICBYQ0FTVChEZWxldGVNYXRyaXgpIE1haW5fSURpcmVjdDNERGV2aWNlSW1wbF8xX0RlbGV0ZU1hdHJpeCwKLSAgICBYQ0FTVChCZWdpblNjZW5lKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfQmVnaW5TY2VuZSwKLSAgICBYQ0FTVChFbmRTY2VuZSkgVGh1bmtfSURpcmVjdDNERGV2aWNlSW1wbF8xX0VuZFNjZW5lLAotICAgIFhDQVNUKEdldERpcmVjdDNEKSBUaHVua19JRGlyZWN0M0REZXZpY2VJbXBsXzFfR2V0RGlyZWN0M0QsCi19OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotc3RhdGljIEhSRVNVTFQgZDNkZGV2aWNlX2NsZWFyKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsCi0JCQkgICAgICAgV0lORV9HTF9CVUZGRVJfVFlQRSBidWZmZXJfdHlwZSwKLQkJCSAgICAgICBEV09SRCBkd0NvdW50LAotCQkJICAgICAgIExQRDNEUkVDVCBscFJlY3RzLAotCQkJICAgICAgIERXT1JEIGR3RmxhZ3MsCi0JCQkgICAgICAgRFdPUkQgZHdDb2xvciwKLQkJCSAgICAgICBEM0RWQUxVRSBkdlosCi0JCQkgICAgICAgRFdPUkQgZHdTdGVuY2lsKQotewotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCAqZ2xUaGlzID0gKElEaXJlY3QzRERldmljZUdMSW1wbCAqKSBUaGlzOwotICAgIEdMYml0ZmllbGQgYml0ZmllbGQgPSAwOwotICAgIEQzRFJFQ1QgcmVjdDsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAKLSAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwLCUwOGx4LCUwOGx4LCVmLCUwOGx4KVxuIiwgVGhpcywgZHdDb3VudCwgbHBSZWN0cywgZHdGbGFncywgZHdDb2xvciwgZHZaLCBkd1N0ZW5jaWwpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQlpZiAoZHdDb3VudCA+IDApIHsKLQkgICAgdW5zaWduZWQgaW50IGk7Ci0JICAgIFRSQUNFKCIgcmVjdGFuZ2xlcyA6XG4iKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgewotCSAgICAgICAgVFJBQ0UoIiAgLSAlbGQgeCAlbGQgICAgICVsZCB4ICVsZFxuIiwgbHBSZWN0c1tpXS51MS54MSwgbHBSZWN0c1tpXS51Mi55MSwgbHBSZWN0c1tpXS51My54MiwgbHBSZWN0c1tpXS51NC55Mik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgaWYgKGR3Q291bnQgPT0gMCkgewotICAgICAgICBkd0NvdW50ID0gMTsKLQlyZWN0LnUxLngxID0gMDsKLQlyZWN0LnUyLnkxID0gMDsKLQlyZWN0LnUzLngyID0gVGhpcy0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7Ci0JcmVjdC51NC55MiA9IFRoaXMtPnN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLQlscFJlY3RzID0gJnJlY3Q7Ci0gICAgfQotICAgIAotICAgIC8qIENsZWFycyB0aGUgc2NyZWVuICovCi0gICAgRU5URVJfR0woKTsKLQotICAgIGlmIChkd0ZsYWdzICYgRDNEQ0xFQVJfVEFSR0VUKSB7Ci0JaWYgKGdsVGhpcy0+c3RhdGVbYnVmZmVyX3R5cGVdID09IFNVUkZBQ0VfTUVNT1JZX0RJUlRZKSB7Ci0JICAgIC8qIFRPRE86IG9wdGltaXplIGhlcmUgdGhlIGNhc2Ugd2hlcmUgQ2xlYXIgY2hhbmdlcyBhbGwgdGhlIHNjcmVlbi4uLiAqLwotCSAgICBUaGlzLT5mbHVzaF90b19mcmFtZWJ1ZmZlcihUaGlzLCAmKGdsVGhpcy0+bG9ja19yZWN0W2J1ZmZlcl90eXBlXSksIGdsVGhpcy0+bG9ja19zdXJmW2J1ZmZlcl90eXBlXSk7Ci0JfQotCWdsVGhpcy0+c3RhdGVbYnVmZmVyX3R5cGVdID0gU1VSRkFDRV9HTDsKLSAgICB9Ci0KLSAgICBpZiAoZHdGbGFncyAmIEQzRENMRUFSX1pCVUZGRVIpIHsKLQliaXRmaWVsZCB8PSBHTF9ERVBUSF9CVUZGRVJfQklUOwotCWlmIChnbFRoaXMtPmRlcHRoX21hc2sgPT0gRkFMU0UpIHsKLQkgICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7IC8qIEVuYWJsZXMgWiB3cml0aW5nIHRvIGJlIHN1cmUgdG8gZGVsZXRlIGFsc28gdGhlIFogYnVmZmVyICovCi0JfQotCWlmIChkdlogIT0gZ2xUaGlzLT5wcmV2X2NsZWFyX1opIHsKLQkgICAgZ2xDbGVhckRlcHRoKGR2Wik7Ci0JICAgIGdsVGhpcy0+cHJldl9jbGVhcl9aID0gZHZaOwotCX0KLQlUUkFDRSgiIGRlcHRoIHZhbHVlIDogJWZcbiIsIGR2Wik7Ci0gICAgfQotICAgIGlmIChkd0ZsYWdzICYgRDNEQ0xFQVJfU1RFTkNJTCkgewotICAgICAgICBiaXRmaWVsZCB8PSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ7Ci0JaWYgKGR3U3RlbmNpbCAhPSBnbFRoaXMtPnByZXZfY2xlYXJfc3RlbmNpbCkgewotCSAgICBnbENsZWFyU3RlbmNpbChkd1N0ZW5jaWwpOwotCSAgICBnbFRoaXMtPnByZXZfY2xlYXJfc3RlbmNpbCA9IGR3U3RlbmNpbDsKLQl9Ci0JVFJBQ0UoIiBzdGVuY2lsIHZhbHVlIDogJWxkXG4iLCBkd1N0ZW5jaWwpOwotICAgIH0gICAgCi0gICAgaWYgKGR3RmxhZ3MgJiBEM0RDTEVBUl9UQVJHRVQpIHsKLSAgICAgICAgYml0ZmllbGQgfD0gR0xfQ09MT1JfQlVGRkVSX0JJVDsKLQlpZiAoZHdDb2xvciAhPSBnbFRoaXMtPnByZXZfY2xlYXJfY29sb3IpIHsKLQkgICAgZ2xDbGVhckNvbG9yKCgoZHdDb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wLAotCQkJICgoZHdDb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wLAotCQkJICgoZHdDb2xvciA+PiAgMCkgJiAweEZGKSAvIDI1NS4wLAotCQkJICgoZHdDb2xvciA+PiAyNCkgJiAweEZGKSAvIDI1NS4wKTsKLQkgICAgZ2xUaGlzLT5wcmV2X2NsZWFyX2NvbG9yID0gZHdDb2xvcjsKLQl9Ci0JVFJBQ0UoIiBjb2xvciB2YWx1ZSAoQVJHQikgOiAlMDhseFxuIiwgZHdDb2xvcik7Ci0gICAgfQotCi0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsgCi0gICAgZm9yIChpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgewotICAgICAgICBnbFNjaXNzb3IobHBSZWN0c1tpXS51MS54MSwgVGhpcy0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0IC0gbHBSZWN0c1tpXS51NC55MiwKLQkJICBscFJlY3RzW2ldLnUzLngyIC0gbHBSZWN0c1tpXS51MS54MSwgbHBSZWN0c1tpXS51NC55MiAtIGxwUmVjdHNbaV0udTIueTEpOwotICAgICAgICBnbENsZWFyKGJpdGZpZWxkKTsKLSAgICB9Ci0gICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7IAotICAgIAotICAgIGlmIChkd0ZsYWdzICYgRDNEQ0xFQVJfWkJVRkZFUikgewotCWlmIChnbFRoaXMtPmRlcHRoX21hc2sgPT0gRkFMU0UpIGdsRGVwdGhNYXNrKEdMX0ZBTFNFKTsKLSAgICB9Ci0gICAgCi0gICAgTEVBVkVfR0woKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIGQzZGRldmljZV9jbGVhcl9iYWNrKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsCi0JCQkJICAgIERXT1JEIGR3Q291bnQsCi0JCQkJICAgIExQRDNEUkVDVCBscFJlY3RzLAotCQkJCSAgICBEV09SRCBkd0ZsYWdzLAotCQkJCSAgICBEV09SRCBkd0NvbG9yLAotCQkJCSAgICBEM0RWQUxVRSBkdlosCi0JCQkJICAgIERXT1JEIGR3U3RlbmNpbCkKLXsKLSAgICByZXR1cm4gZDNkZGV2aWNlX2NsZWFyKFRoaXMsIFdJTkVfR0xfQlVGRkVSX0JBQ0ssIGR3Q291bnQsIGxwUmVjdHMsIGR3RmxhZ3MsIGR3Q29sb3IsIGR2WiwgZHdTdGVuY2lsKTsKLX0KLQotc3RhdGljIEhSRVNVTFQKLXNldHVwX3JlY3RfYW5kX3N1cmZhY2VfZm9yX2JsdChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLAotCQkJICAgICAgIFdJTkVfR0xfQlVGRkVSX1RZUEUgKmJ1ZmZlcl90eXBlX3AsIEQzRFJFQ1QgKnJlY3QpCi17Ci0gICAgSURpcmVjdDNERGV2aWNlR0xJbXBsICpnbF9kM2RfZGV2ID0gKElEaXJlY3QzRERldmljZUdMSW1wbCAqKSBUaGlzLT5kM2RkZXZpY2U7Ci0gICAgV0lORV9HTF9CVUZGRVJfVFlQRSBidWZmZXJfdHlwZTsKLSAgICAKLSAgICAvKiBGaXJzdCBjaGVjayBpZiB3ZSBCTFQgdG8gdGhlIGJhY2tidWZmZXIuLi4gKi8KLSAgICBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX0JBQ0tCVUZGRVIpKSAhPSAwKSB7Ci0JYnVmZmVyX3R5cGUgPSBXSU5FX0dMX0JVRkZFUl9CQUNLOwotICAgIH0gZWxzZSBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX0ZST05UQlVGRkVSfEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpKSAhPSAwKSB7Ci0JYnVmZmVyX3R5cGUgPSBXSU5FX0dMX0JVRkZFUl9GUk9OVDsKLSAgICB9IGVsc2UgewotCUVSUigiT25seSBCTFQgb3ZlcnJpZGUgdG8gZnJvbnQgb3IgYmFjay1idWZmZXIgaXMgc3VwcG9ydGVkIGZvciBub3cgIVxuIik7Ci0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotICAgICAgICAgICAgCi0gICAgaWYgKChnbF9kM2RfZGV2LT5zdGF0ZVtidWZmZXJfdHlwZV0gPT0gU1VSRkFDRV9NRU1PUllfRElSVFkpICYmCi0JKHJlY3QtPnUxLngxID49IGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0ubGVmdCkgJiYKLQkocmVjdC0+dTIueTEgPj0gZ2xfZDNkX2Rldi0+bG9ja19yZWN0W2J1ZmZlcl90eXBlXS50b3ApICYmCi0JKHJlY3QtPnUzLngyIDw9IGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0ucmlnaHQpICYmCi0JKHJlY3QtPnU0LnkyIDw9IGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0uYm90dG9tKSkgewotCS8qIElmIHRoZSBtZW1vcnkgem9uZSBpcyBhbHJlYWR5IGRpcnR5LCB1c2UgdGhlIHN0YW5kYXJkICdpbiBtZW1vcnknIGJsaXQgb3BlcmF0aW9ucyBhbmQgbm90Ci0JICogR0wgdG8gZG8gaXQuCi0JICovCi0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotICAgICpidWZmZXJfdHlwZV9wID0gYnVmZmVyX3R5cGU7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUCi1kM2RkZXZpY2VfYmx0KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsIExQUkVDVCByZHN0LAotCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHNyYywgTFBSRUNUIHJzcmMsCi0JICAgICAgRFdPUkQgZHdGbGFncywgTFBEREJMVEZYIGxwYmx0ZngpCi17Ci0gICAgV0lORV9HTF9CVUZGRVJfVFlQRSBidWZmZXJfdHlwZTsKLSAgICBEM0RSRUNUIHJlY3Q7Ci0KLSAgICBpZiAocmRzdCkgewotCXJlY3QudTEueDEgPSByZHN0LT5sZWZ0OwotCXJlY3QudTIueTEgPSByZHN0LT50b3A7Ci0JcmVjdC51My54MiA9IHJkc3QtPnJpZ2h0OwotCXJlY3QudTQueTIgPSByZHN0LT5ib3R0b207Ci0gICAgfSBlbHNlIHsKLQlyZWN0LnUxLngxID0gMDsKLQlyZWN0LnUyLnkxID0gMDsKLQlyZWN0LnUzLngyID0gVGhpcy0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7Ci0JcmVjdC51NC55MiA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHNldHVwX3JlY3RfYW5kX3N1cmZhY2VfZm9yX2JsdChUaGlzLCAmYnVmZmVyX3R5cGUsICZyZWN0KSAhPSBERF9PSykgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICBpZiAoZHdGbGFncyAmIEREQkxUX0NPTE9SRklMTCkgewotICAgICAgICAvKiBUaGlzIGlzIGVhc3kgdG8gaGFuZGxlIGZvciB0aGUgRDNEIERldmljZS4uLiAqLwotICAgICAgICBEV09SRCBjb2xvcjsKLSAgICAgICAgR0xpbnQgcHJldl9kcmF3OwotICAgICAgICAKLSAgICAgICAgLyogVGhlIGNvbG9yIGFzIGdpdmVuIGluIHRoZSBCbHQgZnVuY3Rpb24gaXMgaW4gdGhlIGZvcm1hdCBvZiB0aGUgZnJhbWUtYnVmZmVyLi4uCi0gICAgICAgICAqICdjbGVhcicgZXhwZWN0IGl0IGluIEFSR0IgZm9ybWF0ID0+IHdlIG5lZWQgdG8gZG8gc29tZSBjb252ZXJzaW9uIDotKQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfUEFMRVRURUlOREVYRUQ4KSB7Ci0gICAgICAgICAgICBpZiAoVGhpcy0+cGFsZXR0ZSkgewotICAgICAgICAgICAgICAgIGNvbG9yID0gKCgweEZGMDAwMDAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKFRoaXMtPnBhbGV0dGUtPnBhbGVudHNbbHBibHRmeC0+dTUuZHdGaWxsQ29sb3JdLnBlUmVkIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKFRoaXMtPnBhbGV0dGUtPnBhbGVudHNbbHBibHRmeC0+dTUuZHdGaWxsQ29sb3JdLnBlR3JlZW4gPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgIChUaGlzLT5wYWxldHRlLT5wYWxlbnRzW2xwYmx0ZngtPnU1LmR3RmlsbENvbG9yXS5wZUJsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29sb3IgPSAweEZGMDAwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX1JHQikgJiYKLSAgICAgICAgICAgICAgICAgICAoKChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDAwMDAwMDAwKSkpIHsKLSAgICAgICAgICAgIGlmICgoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ID09IDE2KSAmJgotICAgICAgICAgICAgICAgIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3UkJpdE1hc2sgPT0gMHhGODAwKSAmJgotICAgICAgICAgICAgICAgIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3R0JpdE1hc2sgPT0gMHgwN0UwKSAmJgotICAgICAgICAgICAgICAgIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnU0LmR3QkJpdE1hc2sgPT0gMHgwMDFGKSkgewotICAgICAgICAgICAgICAgIGlmIChscGJsdGZ4LT51NS5kd0ZpbGxDb2xvciA9PSAweEZGRkYpIHsKLSAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAweEZGRkZGRkZGOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gKCgweEZGMDAwMDAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobHBibHRmeC0+dTUuZHdGaWxsQ29sb3IgJiAweEY4MDApIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChscGJsdGZ4LT51NS5kd0ZpbGxDb2xvciAmIDB4MDdFMCkgPDwgNSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxwYmx0ZngtPnU1LmR3RmlsbENvbG9yICYgMHgwMDFGKSA8PCAzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgoKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAzMikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgPT0gMjQpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrID09IDB4MDBGRjAwMDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3R0JpdE1hc2sgPT0gMHgwMDAwRkYwMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzayA9PSAweDAwMDAwMEZGKSkgewotICAgICAgICAgICAgICAgIGNvbG9yID0gMHhGRjAwMDAwMCB8IGxwYmx0ZngtPnU1LmR3RmlsbENvbG9yOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBFUlIoIldyb25nIHN1cmZhY2UgdHlwZSBmb3IgQkxUIG92ZXJyaWRlICh1bmtub3duIFJHQiBmb3JtYXQpICFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRVJSKCJXcm9uZyBzdXJmYWNlIHR5cGUgZm9yIEJMVCBvdmVycmlkZSAhXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUUkFDRSgiIGV4ZWN1dGluZyBEM0QgRGV2aWNlIG92ZXJyaWRlLlxuIik7Ci0JCi0gICAgICAgIEVOVEVSX0dMKCk7Ci0KLSAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9EUkFXX0JVRkZFUiwgJnByZXZfZHJhdyk7Ci0gICAgICAgIGlmIChidWZmZXJfdHlwZSA9PSBXSU5FX0dMX0JVRkZFUl9GUk9OVCkKLSAgICAgICAgICAgIGdsRHJhd0J1ZmZlcihHTF9GUk9OVCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdsRHJhd0J1ZmZlcihHTF9CQUNLKTsKLSAgICAgICAgCi0gICAgICAgIGQzZGRldmljZV9jbGVhcihUaGlzLT5kM2RkZXZpY2UsIGJ1ZmZlcl90eXBlLCAxLCAmcmVjdCwgRDNEQ0xFQVJfVEFSR0VULCBjb2xvciwgMC4wLCAweDAwMDAwMDAwKTsKLQkKLSAgICAgICAgaWYgKCgoYnVmZmVyX3R5cGUgPT0gV0lORV9HTF9CVUZGRVJfRlJPTlQpICYmIChwcmV2X2RyYXcgPT0gR0xfQkFDSykpIHx8Ci0gICAgICAgICAgICAoKGJ1ZmZlcl90eXBlID09IFdJTkVfR0xfQlVGRkVSX0JBQ0spICAmJiAocHJldl9kcmF3ID09IEdMX0ZST05UKSkpCi0gICAgICAgICAgICBnbERyYXdCdWZmZXIocHJldl9kcmF3KTsKLQkKLSAgICAgICAgTEVBVkVfR0woKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBERF9PSzsKLSAgICB9IGVsc2UgaWYgKChkd0ZsYWdzICYgKH4oRERCTFRfS0VZU1JDfEREQkxUX1dBSVR8RERCTFRfQVNZTkMpKSkgPT0gMCkgewotCS8qIE5vcm1hbCBibGl0IHdpdGhvdXQgYW55IHNwZWNpYWwgY2FzZS4uLiAqLwotCWlmIChzcmMgIT0gTlVMTCkgewotCSAgICAvKiBBbmQgd2hpY2ggaGFzIGEgU1JDIHN1cmZhY2UgKi8KLQkgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3JjX2ltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBzcmMpOwotCSAgICAKLQkgICAgaWYgKChzcmNfaW1wbC0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU18zRERFVklDRSkgJiYKLQkJKHNyY19pbXBsLT5kM2RkZXZpY2UgPT0gVGhpcy0+ZDNkZGV2aWNlKSAmJgotCQkoKGR3RmxhZ3MgJiBEREJMVF9LRVlTUkMpID09IDApKSB7Ci0JCS8qIEJvdGggYXJlIDNEIGRldmljZXMgYW5kIHVzaW5nIHRoZSBzYW1lIEdMIGRldmljZSBhbmQgdGhlIEJsdCBpcyB3aXRob3V0IGNvbG9yLWtleWluZyAqLwotCQlEM0RSRUNUIHNyY19yZWN0OwotCQlpbnQgd2lkdGgsIGhlaWdodDsKLQkJR0xpbnQgcHJldl9kcmF3OwotCQlXSU5FX0dMX0JVRkZFUl9UWVBFIHNyY19idWZmZXJfdHlwZTsKLQkJSURpcmVjdDNERGV2aWNlR0xJbXBsICpnbF9kM2RfZGV2ID0gKElEaXJlY3QzRERldmljZUdMSW1wbCAqKSBUaGlzLT5kM2RkZXZpY2U7Ci0JCUJPT0xFQU4gaW5pdGlhbDsKLQkJRFdPUkQgb3B0X2JpdG1hcDsKLQkJaW50IHgsIHk7Ci0JCi0JCWlmIChyc3JjKSB7Ci0JCSAgICBzcmNfcmVjdC51MS54MSA9IHJzcmMtPmxlZnQ7Ci0JCSAgICBzcmNfcmVjdC51Mi55MSA9IHJzcmMtPnRvcDsKLQkJICAgIHNyY19yZWN0LnUzLngyID0gcnNyYy0+cmlnaHQ7Ci0JCSAgICBzcmNfcmVjdC51NC55MiA9IHJzcmMtPmJvdHRvbTsKLQkJfSBlbHNlIHsKLQkJICAgIHNyY19yZWN0LnUxLngxID0gMDsKLQkJICAgIHNyY19yZWN0LnUyLnkxID0gMDsKLQkJICAgIHNyY19yZWN0LnUzLngyID0gc3JjX2ltcGwtPnN1cmZhY2VfZGVzYy5kd1dpZHRoOwotCQkgICAgc3JjX3JlY3QudTQueTIgPSBzcmNfaW1wbC0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OwotCQl9Ci0KLQkJd2lkdGggPSBzcmNfcmVjdC51My54MiAtIHNyY19yZWN0LnUxLngxOwotCQloZWlnaHQgPSBzcmNfcmVjdC51NC55MiAtIHNyY19yZWN0LnUyLnkxOwotCi0JCWlmICgod2lkdGggIT0gKHJlY3QudTMueDIgLSByZWN0LnUxLngxKSkgfHwKLQkJICAgIChoZWlnaHQgIT0gKHJlY3QudTQueTIgLSByZWN0LnUyLnkxKSkpIHsKLQkJICAgIEZJWE1FKCIgYnVmZmVyIHRvIGJ1ZmZlciBjb3B5IG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJldGNoaW5nIHlldCAhXG4iKTsKLQkJICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCQl9Ci0KLQkJLyogRmlyc3QgY2hlY2sgaWYgd2UgQkxUIGZyb20gdGhlIGJhY2tidWZmZXIuLi4gKi8KLQkJaWYgKChzcmNfaW1wbC0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfQkFDS0JVRkZFUikpICE9IDApIHsKLQkJICAgIHNyY19idWZmZXJfdHlwZSA9IFdJTkVfR0xfQlVGRkVSX0JBQ0s7Ci0JCX0gZWxzZSBpZiAoKHNyY19pbXBsLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiAoRERTQ0FQU19GUk9OVEJVRkZFUnxERFNDQVBTX1BSSU1BUllTVVJGQUNFKSkgIT0gMCkgewotCQkgICAgc3JjX2J1ZmZlcl90eXBlID0gV0lORV9HTF9CVUZGRVJfRlJPTlQ7Ci0JCX0gZWxzZSB7Ci0JCSAgICBFUlIoIlVuZXhwZWN0ZWQgY2FzZSBpbiBkaXJlY3QgYnVmZmVyIHRvIGJ1ZmZlciBjb3B5ICFcbiIpOwotCQkgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JCX0KLQkJCi0JCVRSQUNFKCIgdXNpbmcgZGlyZWN0IGJ1ZmZlciB0byBidWZmZXIgY29weS5cbiIpOwotCi0JCUVOVEVSX0dMKCk7Ci0KLQkJb3B0X2JpdG1hcCA9IGQzZGRldmljZV9zZXRfc3RhdGVfZm9yX2ZsdXNoKFRoaXMtPmQzZGRldmljZSwgKExQQ1JFQ1QpICZyZWN0LCBGQUxTRSwgJmluaXRpYWwpOwotCQkKLQkJaWYgKHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnlfaW5pdChUaGlzLCAwLCAmZ2xfZDNkX2Rldi0+Y3VycmVudF9pbnRlcm5hbF9mb3JtYXQsCi0JCQkJCQkgICAgICBpbml0aWFsLCBGQUxTRSwgVU5MT0NLX1RFWF9TSVpFLCBVTkxPQ0tfVEVYX1NJWkUpICE9IEREX09LKSB7Ci0JCSAgICBFUlIoIiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgYXQgZGlyZWN0IGJ1ZmZlciB0byBidWZmZXIgY29weS5cbiIpOwotCQkgICAgTEVBVkVfR0woKTsKLQkJICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCQl9Ci0JCQotCQlnbEdldEludGVnZXJ2KEdMX0RSQVdfQlVGRkVSLCAmcHJldl9kcmF3KTsKLQkJaWYgKGJ1ZmZlcl90eXBlID09IFdJTkVfR0xfQlVGRkVSX0ZST05UKQotCQkgICAgZ2xEcmF3QnVmZmVyKEdMX0ZST05UKTsKLQkJZWxzZQotCQkgICAgZ2xEcmF3QnVmZmVyKEdMX0JBQ0spOwotCi0JCWlmIChzcmNfYnVmZmVyX3R5cGUgPT0gV0lORV9HTF9CVUZGRVJfRlJPTlQpCi0JCSAgICBnbFJlYWRCdWZmZXIoR0xfRlJPTlQpOwotCQllbHNlCi0JCSAgICBnbFJlYWRCdWZmZXIoR0xfQkFDSyk7Ci0KLQkJLyogTm93IHRoZSBzZXJpb3VzIHN0dWZmIGhhcHBlbnMuIEJhc2ljYWxseSwgd2UgY29weSBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyIHRvIHRoZSB0ZXh0dXJlIG1lbW9yeS4KLQkJICAgQW5kIGRpcmVjdGx5IHJlLWRyYXdzIHRoaXMgb24gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KLQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBVTkxPQ0tfVEVYX1NJWkUpIHsKLQkJICAgIGludCBnZXRfaGVpZ2h0OwotCQkgICAgCi0JCSAgICBpZiAoKHNyY19yZWN0LnUyLnkxICsgeSArIFVOTE9DS19URVhfU0laRSkgPiBzcmNfaW1wbC0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0KQotCQkJZ2V0X2hlaWdodCA9IHNyY19pbXBsLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgLSAoc3JjX3JlY3QudTIueTEgKyB5KTsKLQkJICAgIGVsc2UKLQkJCWdldF9oZWlnaHQgPSBVTkxPQ0tfVEVYX1NJWkU7Ci0JCSAgICAKLQkJICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCArPSBVTkxPQ0tfVEVYX1NJWkUpIHsKLQkJCWludCBnZXRfd2lkdGg7Ci0JCQkKLQkJCWlmICgoc3JjX3JlY3QudTEueDEgKyB4ICsgVU5MT0NLX1RFWF9TSVpFKSA+IHNyY19pbXBsLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCkKLQkJCSAgICBnZXRfd2lkdGggPSBzcmNfaW1wbC0+c3VyZmFjZV9kZXNjLmR3V2lkdGggLSAoc3JjX3JlY3QudTEueDEgKyB4KTsKLQkJCWVsc2UKLQkJCSAgICBnZXRfd2lkdGggPSBVTkxPQ0tfVEVYX1NJWkU7Ci0JCQkKLQkJCWdsQ29weVRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwKLQkJCQkJICAgIDAsIFVOTE9DS19URVhfU0laRSAtIGdldF9oZWlnaHQsCi0JCQkJCSAgICBzcmNfcmVjdC51MS54MSArIHgsIHNyY19pbXBsLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgLSAoc3JjX3JlY3QudTIueTEgKyB5ICsgZ2V0X2hlaWdodCksCi0JCQkJCSAgICBnZXRfd2lkdGgsIGdldF9oZWlnaHQpOwotCQkJCi0JCQlnbEJlZ2luKEdMX1FVQURTKTsKLQkJCWdsVGV4Q29vcmQyZigwLjAsIDAuMCk7Ci0JCQlnbFZlcnRleDNkKHJlY3QudTEueDEgKyB4LAotCQkJCSAgIHJlY3QudTIueTEgKyB5ICsgVU5MT0NLX1RFWF9TSVpFLAotCQkJCSAgIDAuNSk7Ci0JCQlnbFRleENvb3JkMmYoMS4wLCAwLjApOwotCQkJZ2xWZXJ0ZXgzZChyZWN0LnUxLngxICsgeCArIFVOTE9DS19URVhfU0laRSwKLQkJCQkgICByZWN0LnUyLnkxICsgeSArIFVOTE9DS19URVhfU0laRSwKLQkJCQkgICAwLjUpOwotCQkJZ2xUZXhDb29yZDJmKDEuMCwgMS4wKTsKLQkJCWdsVmVydGV4M2QocmVjdC51MS54MSArIHggKyBVTkxPQ0tfVEVYX1NJWkUsCi0JCQkJICAgcmVjdC51Mi55MSArIHksCi0JCQkJICAgMC41KTsKLQkJCWdsVGV4Q29vcmQyZigwLjAsIDEuMCk7Ci0JCQlnbFZlcnRleDNkKHJlY3QudTEueDEgKyB4LAotCQkJCSAgIHJlY3QudTIueTEgKyB5LAotCQkJCSAgIDAuNSk7Ci0JCQlnbEVuZCgpOwotCQkgICAgfQotCQl9Ci0JCQotCQl1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5X3JlbGVhc2UoKTsKLQkJZDNkZGV2aWNlX3Jlc3RvcmVfc3RhdGVfYWZ0ZXJfZmx1c2goVGhpcy0+ZDNkZGV2aWNlLCBvcHRfYml0bWFwLCBGQUxTRSk7Ci0JCQotCQlpZiAoKChidWZmZXJfdHlwZSA9PSBXSU5FX0dMX0JVRkZFUl9GUk9OVCkgJiYgKHByZXZfZHJhdyA9PSBHTF9CQUNLKSkgfHwKLQkJICAgICgoYnVmZmVyX3R5cGUgPT0gV0lORV9HTF9CVUZGRVJfQkFDSykgICYmIChwcmV2X2RyYXcgPT0gR0xfRlJPTlQpKSkKLQkJICAgIGdsRHJhd0J1ZmZlcihwcmV2X2RyYXcpOwotCQkKLQkJTEVBVkVfR0woKTsKLQotCQlyZXR1cm4gRERfT0s7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIFRoaXMgaXMgdGhlIG5vcm1hbCAnd2l0aCBzb3VyY2UnIEJsaXQuIFVzZSB0aGUgdGV4dHVyZSBlbmdpbmUgdG8gZG8gdGhlIEJsdCBmb3IgdXMKLQkJICAgKHRoaXMgcHJldmVudHMgY2FsbGluZyBnbFJlYWRQaXhlbHMpICovCi0JCUQzRFJFQ1Qgc3JjX3JlY3Q7Ci0JCWludCB3aWR0aCwgaGVpZ2h0OwotCQlHTGludCBwcmV2X2RyYXc7Ci0JCUlEaXJlY3QzRERldmljZUdMSW1wbCAqZ2xfZDNkX2RldiA9IChJRGlyZWN0M0REZXZpY2VHTEltcGwgKikgVGhpcy0+ZDNkZGV2aWNlOwotCQlCT09MRUFOIGluaXRpYWw7Ci0JCURXT1JEIG9wdF9iaXRtYXA7Ci0JCWludCB4LCB5OwotCQlkb3VibGUgeF9zdHJldGNoLCB5X3N0cmV0Y2g7Ci0JCQotCQlpZiAocnNyYykgewotCQkgICAgc3JjX3JlY3QudTEueDEgPSByc3JjLT5sZWZ0OwotCQkgICAgc3JjX3JlY3QudTIueTEgPSByc3JjLT50b3A7Ci0JCSAgICBzcmNfcmVjdC51My54MiA9IHJzcmMtPnJpZ2h0OwotCQkgICAgc3JjX3JlY3QudTQueTIgPSByc3JjLT5ib3R0b207Ci0JCX0gZWxzZSB7Ci0JCSAgICBzcmNfcmVjdC51MS54MSA9IDA7Ci0JCSAgICBzcmNfcmVjdC51Mi55MSA9IDA7Ci0JCSAgICBzcmNfcmVjdC51My54MiA9IHNyY19pbXBsLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aDsKLQkJICAgIHNyY19yZWN0LnU0LnkyID0gc3JjX2ltcGwtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLQkJfQotCi0JCXdpZHRoID0gc3JjX3JlY3QudTMueDIgLSBzcmNfcmVjdC51MS54MTsKLQkJaGVpZ2h0ID0gc3JjX3JlY3QudTQueTIgLSBzcmNfcmVjdC51Mi55MTsKLQotCQl4X3N0cmV0Y2ggPSAoZG91YmxlKSAocmVjdC51My54MiAtIHJlY3QudTEueDEpIC8gKGRvdWJsZSkgd2lkdGg7Ci0JCXlfc3RyZXRjaCA9IChkb3VibGUpIChyZWN0LnU0LnkyIC0gcmVjdC51Mi55MSkgLyAoZG91YmxlKSBoZWlnaHQ7Ci0KLQkJVFJBQ0UoIiB1c2luZyBtZW1vcnkgdG8gYnVmZmVyIEJsdCBvdmVycmlkZS5cbiIpOwotCi0JCUVOVEVSX0dMKCk7Ci0KLQkJb3B0X2JpdG1hcCA9IGQzZGRldmljZV9zZXRfc3RhdGVfZm9yX2ZsdXNoKFRoaXMtPmQzZGRldmljZSwgKExQQ1JFQ1QpICZyZWN0LCAoKGR3RmxhZ3MgJiBEREJMVF9LRVlTUkMpICE9IDApLCAmaW5pdGlhbCk7Ci0JCQotCQlpZiAodXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeV9pbml0KHNyY19pbXBsLCAwLCAmZ2xfZDNkX2Rldi0+Y3VycmVudF9pbnRlcm5hbF9mb3JtYXQsCi0JCQkJCQkgICAgICBpbml0aWFsLCAoKGR3RmxhZ3MgJiBEREJMVF9LRVlTUkMpICE9IDApLCBVTkxPQ0tfVEVYX1NJWkUsIFVOTE9DS19URVhfU0laRSkgIT0gRERfT0spIHsKLQkJICAgIEVSUigiIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCBhdCBtZW1vcnkgdG8gYnVmZmVyIEJsdCBvdmVycmlkZS5cbiIpOwotCQkgICAgTEVBVkVfR0woKTsKLQkJICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCQl9Ci0JCQotCQlnbEdldEludGVnZXJ2KEdMX0RSQVdfQlVGRkVSLCAmcHJldl9kcmF3KTsKLQkJaWYgKGJ1ZmZlcl90eXBlID09IFdJTkVfR0xfQlVGRkVSX0ZST05UKQotCQkgICAgZ2xEcmF3QnVmZmVyKEdMX0ZST05UKTsKLQkJZWxzZQotCQkgICAgZ2xEcmF3QnVmZmVyKEdMX0JBQ0spOwotCi0JCS8qIE5vdyB0aGUgc2VyaW91cyBzdHVmZiBoYXBwZW5zLiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBjb2RlIGFzIGZvciB0aGUgbWVtb3J5Ci0JCSAgIGZsdXNoIHRvIGZyYW1lIGJ1ZmZlciAuLi4gd2l0aCBzdHJldGNoaW5nIGFuZCBkaWZmZXJlbnQgcmVjdGFuZ2xlcyBhZGRlZCA6LSkgKi8KLQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSArPSBVTkxPQ0tfVEVYX1NJWkUpIHsKLQkJICAgIFJFQ1QgZmx1c2hfcmVjdDsKLQotCQkgICAgZmx1c2hfcmVjdC50b3AgICAgPSBzcmNfcmVjdC51Mi55MSArIHk7Ci0JCSAgICBmbHVzaF9yZWN0LmJvdHRvbSA9ICgoc3JjX3JlY3QudTIueTEgKyB5ICsgVU5MT0NLX1RFWF9TSVpFID4gc3JjX3JlY3QudTQueTIpID8KLQkJCQkJIHNyY19yZWN0LnU0LnkyIDoKLQkJCQkJIChzcmNfcmVjdC51Mi55MSArIHkgKyBVTkxPQ0tfVEVYX1NJWkUpKTsKLQkJICAgIAotCQkgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IFVOTE9DS19URVhfU0laRSkgewotCQkJZmx1c2hfcmVjdC5sZWZ0ICA9IHNyY19yZWN0LnUxLngxICsgeDsKLQkJCWZsdXNoX3JlY3QucmlnaHQgPSAoKHNyY19yZWN0LnUxLngxICsgeCArIFVOTE9DS19URVhfU0laRSA+IHNyY19yZWN0LnUzLngyKSA/Ci0JCQkJCSAgICBzcmNfcmVjdC51My54MiA6Ci0JCQkJCSAgICAoc3JjX3JlY3QudTEueDEgKyB4ICsgVU5MT0NLX1RFWF9TSVpFKSk7Ci0JCQkKLQkJCXVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnkoJmZsdXNoX3JlY3QsIDAsIDAsICYoZ2xfZDNkX2Rldi0+c3VyZmFjZV9wdHIpKTsKLQkJCQotCQkJZ2xCZWdpbihHTF9RVUFEUyk7Ci0JCQlnbFRleENvb3JkMmYoMC4wLCAwLjApOwotCQkJZ2xWZXJ0ZXgzZChyZWN0LnUxLngxICsgKHggKiB4X3N0cmV0Y2gpLAotCQkJCSAgIHJlY3QudTIueTEgKyAoeSAqIHlfc3RyZXRjaCksCi0JCQkJICAgMC41KTsKLQkJCWdsVGV4Q29vcmQyZigxLjAsIDAuMCk7Ci0JCQlnbFZlcnRleDNkKHJlY3QudTEueDEgKyAoKHggKyBVTkxPQ0tfVEVYX1NJWkUpICogeF9zdHJldGNoKSwKLQkJCQkgICByZWN0LnUyLnkxICsgKHkgKiB5X3N0cmV0Y2gpLAotCQkJCSAgIDAuNSk7Ci0JCQlnbFRleENvb3JkMmYoMS4wLCAxLjApOwotCQkJZ2xWZXJ0ZXgzZChyZWN0LnUxLngxICsgKCh4ICsgVU5MT0NLX1RFWF9TSVpFKSAqIHhfc3RyZXRjaCksCi0JCQkJICAgcmVjdC51Mi55MSArICgoeSArIFVOTE9DS19URVhfU0laRSkgKiB5X3N0cmV0Y2gpLAotCQkJCSAgIDAuNSk7Ci0JCQlnbFRleENvb3JkMmYoMC4wLCAxLjApOwotCQkJZ2xWZXJ0ZXgzZChyZWN0LnUxLngxICsgKHggKiB4X3N0cmV0Y2gpLAotCQkJCSAgIHJlY3QudTIueTEgKyAoKHkgKyBVTkxPQ0tfVEVYX1NJWkUpICogeV9zdHJldGNoKSwKLQkJCQkgICAwLjUpOwotCQkJZ2xFbmQoKTsKLQkJICAgIH0KLQkJfQotCQkKLQkJdXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeV9yZWxlYXNlKCk7Ci0JCWQzZGRldmljZV9yZXN0b3JlX3N0YXRlX2FmdGVyX2ZsdXNoKFRoaXMtPmQzZGRldmljZSwgb3B0X2JpdG1hcCwgKChkd0ZsYWdzICYgRERCTFRfS0VZU1JDKSAhPSAwKSk7Ci0JCQotCQlpZiAoKChidWZmZXJfdHlwZSA9PSBXSU5FX0dMX0JVRkZFUl9GUk9OVCkgJiYgKHByZXZfZHJhdyA9PSBHTF9CQUNLKSkgfHwKLQkJICAgICgoYnVmZmVyX3R5cGUgPT0gV0lORV9HTF9CVUZGRVJfQkFDSykgICYmIChwcmV2X2RyYXcgPT0gR0xfRlJPTlQpKSkKLQkJICAgIGdsRHJhd0J1ZmZlcihwcmV2X2RyYXcpOwotCQkKLQkJTEVBVkVfR0woKTsKLQotCQlyZXR1cm4gRERfT0s7CQkKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci19Ci0KLUhSRVNVTFQKLWQzZGRldmljZV9ibHRmYXN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsIERXT1JEIGRzdHgsCi0JCSAgRFdPUkQgZHN0eSwgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLAotCQkgIExQUkVDVCByc3JjLCBEV09SRCB0cmFucykKLXsKLSAgICBSRUNUIHJzcmMyOwotICAgIFJFQ1QgcmRzdDsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzcmNfaW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIHNyYyk7Ci0gICAgSURpcmVjdDNERGV2aWNlR0xJbXBsICpnbF9kM2RfZGV2ID0gKElEaXJlY3QzRERldmljZUdMSW1wbCAqKSBUaGlzLT5kM2RkZXZpY2U7Ci0gICAgV0lORV9HTF9CVUZGRVJfVFlQRSBidWZmZXJfdHlwZTsKLSAgICBHTGludCBwcmV2X2RyYXc7Ci0gICAgRFdPUkQgb3B0X2JpdG1hcDsKLSAgICBCT09MRUFOIGluaXRpYWw7Ci0gICAgaW50IHdpZHRoLCBoZWlnaHQsIHgsIHk7Ci0gICAgCi0gICAgLyogQ2Fubm90IHN1cHBvcnQgRFNUQ09MT1JLRVkgYmxpdHRpbmcuLi4gKi8KLSAgICBpZiAoKHRyYW5zICYgRERCTFRGQVNUX0RFU1RDT0xPUktFWSkgIT0gMCkgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICBpZiAocnNyYyA9PSBOVUxMKSB7Ci0JV0FSTigicnNyYyBpcyBOVUxMIC0gZ2V0dGluZyB0aGUgd2hvbGUgc3VyZmFjZSAhIVxuIik7Ci0JcnNyYyA9ICZyc3JjMjsKLQlyc3JjLT5sZWZ0ID0gcnNyYy0+dG9wID0gMDsKLQlyc3JjLT5yaWdodCA9IHNyY19pbXBsLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aDsKLQlyc3JjLT5ib3R0b20gPSBzcmNfaW1wbC0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0JcnNyYzIgPSAqcnNyYzsKLQlyc3JjID0gJnJzcmMyOwotICAgIH0KLQotICAgIHJkc3QubGVmdCA9IGRzdHg7Ci0gICAgcmRzdC50b3AgPSBkc3R5OwotICAgIHJkc3QucmlnaHQgPSBkc3R4ICsgKHJzcmMtPnJpZ2h0IC0gcnNyYy0+bGVmdCk7Ci0gICAgaWYgKHJkc3QucmlnaHQgPiBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCkgewotCXJzcmMtPnJpZ2h0IC09IChUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCAtIHJkc3QucmlnaHQpOwotCXJkc3QucmlnaHQgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aDsKLSAgICB9Ci0gICAgcmRzdC5ib3R0b20gPSBkc3R5ICsgKHJzcmMtPmJvdHRvbSAtIHJzcmMtPnRvcCk7Ci0gICAgaWYgKHJkc3QuYm90dG9tID4gVGhpcy0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0KSB7Ci0JcnNyYy0+Ym90dG9tIC09IChUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgLSByZHN0LmJvdHRvbSk7Ci0JcmRzdC5ib3R0b20gPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7Ci0gICAgfQotCi0gICAgd2lkdGggPSByc3JjLT5yaWdodCAtIHJzcmMtPmxlZnQ7Ci0gICAgaGVpZ2h0ID0gcnNyYy0+Ym90dG9tIC0gcnNyYy0+dG9wOwotICAgIAotICAgIGlmIChzZXR1cF9yZWN0X2FuZF9zdXJmYWNlX2Zvcl9ibHQoVGhpcywgJmJ1ZmZlcl90eXBlLCAoRDNEUkVDVCAqKSAmcmRzdCkgIT0gRERfT0spIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCi0gICAgVFJBQ0UoIiB1c2luZyBCbHRGYXN0IG1lbW9yeSB0byBmcmFtZSBidWZmZXIgb3ZlcnJpZGUuXG4iKTsKLSAgICAKLSAgICBFTlRFUl9HTCgpOwotICAgIAotICAgIG9wdF9iaXRtYXAgPSBkM2RkZXZpY2Vfc2V0X3N0YXRlX2Zvcl9mbHVzaChUaGlzLT5kM2RkZXZpY2UsICZyZHN0LCAodHJhbnMgJiBEREJMVEZBU1RfU1JDQ09MT1JLRVkpICE9IDAsICZpbml0aWFsKTsKLSAgICAKLSAgICBpZiAodXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeV9pbml0KHNyY19pbXBsLCAwLCAmZ2xfZDNkX2Rldi0+Y3VycmVudF9pbnRlcm5hbF9mb3JtYXQsCi0JCQkJCSAgaW5pdGlhbCwgKHRyYW5zICYgRERCTFRGQVNUX1NSQ0NPTE9SS0VZKSAhPSAwLAotCQkJCQkgIFVOTE9DS19URVhfU0laRSwgVU5MT0NLX1RFWF9TSVpFKSAhPSBERF9PSykgewotCUVSUigiIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCBhdCBtZW1vcnkgdG8gYnVmZmVyIEJsdCBvdmVycmlkZS5cbiIpOwotCUxFQVZFX0dMKCk7Ci0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotICAgIAotICAgIGdsR2V0SW50ZWdlcnYoR0xfRFJBV19CVUZGRVIsICZwcmV2X2RyYXcpOwotICAgIGlmIChidWZmZXJfdHlwZSA9PSBXSU5FX0dMX0JVRkZFUl9GUk9OVCkKLQlnbERyYXdCdWZmZXIoR0xfRlJPTlQpOwotICAgIGVsc2UKLQlnbERyYXdCdWZmZXIoR0xfQkFDSyk7Ci0gICAgCi0gICAgLyogTm93IHRoZSBzZXJpb3VzIHN0dWZmIGhhcHBlbnMuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGNvZGUgdGhhdCBmb3IgdGhlIG1lbW9yeQotICAgICAgIGZsdXNoIHRvIGZyYW1lIGJ1ZmZlciBidXQgd2l0aCBkaWZmZXJlbnQgcmVjdGFuZ2xlcyBmb3Igc291cmNlIGFuZCBkZXN0aW5hdGlvbiA6LSkgKi8KLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IFVOTE9DS19URVhfU0laRSkgewotCVJFQ1QgZmx1c2hfcmVjdDsKLQkKLQlmbHVzaF9yZWN0LnRvcCAgICA9IHJzcmMtPnRvcCArIHk7Ci0JZmx1c2hfcmVjdC5ib3R0b20gPSAoKHJzcmMtPnRvcCArIHkgKyBVTkxPQ0tfVEVYX1NJWkUgPiByc3JjLT5ib3R0b20pID8KLQkJCSAgICAgcnNyYy0+Ym90dG9tIDoKLQkJCSAgICAgKHJzcmMtPnRvcCArIHkgKyBVTkxPQ0tfVEVYX1NJWkUpKTsKLQkKLQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gVU5MT0NLX1RFWF9TSVpFKSB7Ci0JICAgIGZsdXNoX3JlY3QubGVmdCAgPSByc3JjLT5sZWZ0ICsgeDsKLQkgICAgZmx1c2hfcmVjdC5yaWdodCA9ICgocnNyYy0+bGVmdCArIHggKyBVTkxPQ0tfVEVYX1NJWkUgPiByc3JjLT5yaWdodCkgPwotCQkJCXJzcmMtPnJpZ2h0IDoKLQkJCQkocnNyYy0+bGVmdCArIHggKyBVTkxPQ0tfVEVYX1NJWkUpKTsKLQkgICAgCi0JICAgIHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnkoJmZsdXNoX3JlY3QsIDAsIDAsICYoZ2xfZDNkX2Rldi0+c3VyZmFjZV9wdHIpKTsKLQkgICAgCi0JICAgIGdsQmVnaW4oR0xfUVVBRFMpOwotCSAgICBnbFRleENvb3JkMmYoMC4wLCAwLjApOwotCSAgICBnbFZlcnRleDNkKHJkc3QubGVmdCArIHgsCi0JCSAgICAgICByZHN0LnRvcCArIHksCi0JCSAgICAgICAwLjUpOwotCSAgICBnbFRleENvb3JkMmYoMS4wLCAwLjApOwotCSAgICBnbFZlcnRleDNkKHJkc3QubGVmdCArICh4ICsgVU5MT0NLX1RFWF9TSVpFKSwKLQkJICAgICAgIHJkc3QudG9wICsgeSwKLQkJICAgICAgIDAuNSk7Ci0JICAgIGdsVGV4Q29vcmQyZigxLjAsIDEuMCk7Ci0JICAgIGdsVmVydGV4M2QocmRzdC5sZWZ0ICsgKHggKyBVTkxPQ0tfVEVYX1NJWkUpLAotCQkgICAgICAgcmRzdC50b3AgKyAoeSArIFVOTE9DS19URVhfU0laRSksCi0JCSAgICAgICAwLjUpOwotCSAgICBnbFRleENvb3JkMmYoMC4wLCAxLjApOwotCSAgICBnbFZlcnRleDNkKHJkc3QubGVmdCArIHgsCi0JCSAgICAgICByZHN0LnRvcCArICh5ICsgVU5MT0NLX1RFWF9TSVpFKSwKLQkJICAgICAgIDAuNSk7Ci0JICAgIGdsRW5kKCk7Ci0JfQotICAgIH0KLSAgICAKLSAgICB1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5X3JlbGVhc2UoKTsKLSAgICBkM2RkZXZpY2VfcmVzdG9yZV9zdGF0ZV9hZnRlcl9mbHVzaChUaGlzLT5kM2RkZXZpY2UsIG9wdF9iaXRtYXAsICh0cmFucyAmIEREQkxURkFTVF9TUkNDT0xPUktFWSkgIT0gMCk7Ci0gICAgCi0gICAgaWYgKCgoYnVmZmVyX3R5cGUgPT0gV0lORV9HTF9CVUZGRVJfRlJPTlQpICYmIChwcmV2X2RyYXcgPT0gR0xfQkFDSykpIHx8Ci0JKChidWZmZXJfdHlwZSA9PSBXSU5FX0dMX0JVRkZFUl9CQUNLKSAgJiYgKHByZXZfZHJhdyA9PSBHTF9GUk9OVCkpKQotCWdsRHJhd0J1ZmZlcihwcmV2X2RyYXcpOwotICAgIAotICAgIExFQVZFX0dMKCk7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi12b2lkCi1kM2RkZXZpY2Vfc2V0X29ydGhvKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpCi17Ci0gICAgR0xmbG9hdCBoZWlnaHQsIHdpZHRoOwotICAgIEdMZmxvYXQgdHJhbnNfbWF0WzE2XTsKLQotICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKLSAgICAKLSAgICB3aWR0aCA9IFRoaXMtPnN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd1dpZHRoOwotICAgIGhlaWdodCA9IFRoaXMtPnN1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLSAgICAKLSAgICAvKiBUaGUgWCBheGlzIGlzIHN0cmFpZ2hmb3J3YXJkLi4gRm9yIHRoZSBZIGF4aXMsIHdlIG5lZWQgdG8gY29udmVydCAnRDNEJyBzY3JlZW4gY29vcmRpbmF0ZXMKLSAgICAgKiB0byBPcGVuR0wgc2NyZWVuIGNvb3JkaW5hdGVzIChpZSB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgaXMgbm90IHRoZSBzYW1lKS4KLSAgICAgKi8KLSAgICB0cmFuc19tYXRbIDBdID0gMi4wIC8gd2lkdGg7ICB0cmFuc19tYXRbIDRdID0gMC4wOyAgICAgICAgICAgdHJhbnNfbWF0WyA4XSA9IDAuMDsgICAgdHJhbnNfbWF0WzEyXSA9IC0xLjA7Ci0gICAgdHJhbnNfbWF0WyAxXSA9IDAuMDsgICAgICAgICAgdHJhbnNfbWF0WyA1XSA9IC0yLjAgLyBoZWlnaHQ7IHRyYW5zX21hdFsgOV0gPSAwLjA7ICAgIHRyYW5zX21hdFsxM10gPSAgMS4wOwotI2lmIDAKLSAgICAvKiBJdCBoYXMgYmVlbiBjaGVja2VkIHRoYXQgaW4gTWVzc2lhaCwgd2hpY2ggbWl4ZXMgWFlaIGFuZCBYWVpSSFogdmVydGV4IGZvcm1hdCBpbiB0aGUgc2FtZSBzY2VuZSwKLSAgICAgKiB0aGF0IHRoZSBaIGNvb3JkaW5hdGUgbmVlZHMgdG8gYmUgZ2l2ZW4gdG8gR0wgdW5jaGFuZ2VkLgotICAgICAqLwotICAgIHRyYW5zX21hdFsgMl0gPSAwLjA7ICAgICAgICAgIHRyYW5zX21hdFsgNl0gPSAwLjA7ICAgICAgICAgICB0cmFuc19tYXRbMTBdID0gMi4wOyAgICB0cmFuc19tYXRbMTRdID0gLTEuMDsKLSNlbmRpZgotICAgIHRyYW5zX21hdFsgMl0gPSAwLjA7ICAgICAgICAgIHRyYW5zX21hdFsgNl0gPSAwLjA7ICAgICAgICAgICB0cmFuc19tYXRbMTBdID0gMS4wOyAgICB0cmFuc19tYXRbMTRdID0gIDAuMDsKLSAgICB0cmFuc19tYXRbIDNdID0gMC4wOyAgICAgICAgICB0cmFuc19tYXRbIDddID0gMC4wOyAgICAgICAgICAgdHJhbnNfbWF0WzExXSA9IDAuMDsgICAgdHJhbnNfbWF0WzE1XSA9ICAxLjA7Ci0gICAgCi0gICAgRU5URVJfR0woKTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIC8qIFNlZSB0aGUgT3BlbkdMIFJlZCBCb29rIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHRyYW5zbGF0aW9uIChpbiB0aGUgT3BlbkdMCi0gICAgICAgQ29ycmVjdG5lc3MgVGlwcyBzZWN0aW9uKS4KLSAgICAgICAKLSAgICAgICBCYXNpY2FsbHksIGZyb20gd2hhdCBJIHVuZGVyc3Rvb2QsIGlmIHRoZSBnYW1lIGRvZXMgbm90IGZpbHRlciB0aGUgZm9udCB0ZXh0dXJlLAotICAgICAgIGFzIHRoZSAncmVhbCcgcGl4ZWwgd2lsbCBsaWUgYXQgdGhlIG1pZGRsZSBvZiB0aGUgdHdvIHRleGVscywgT3BlbkdMIG1heSBjaG9vc2UgdGhlIHdyb25nCi0gICAgICAgb25lIGFuZCB3ZSB3aWxsIGhhdmUgc3RyYW5nZSBhcnRpZmFjdHMgKGFzIHRoZSByb3VuZGluZyBhbmQgc3R1ZmYgbWF5IGdpdmUgZGlmZmVyZW50IHJlc3VsdHMKLSAgICAgICBmb3IgZGlmZmVyZW50IHBpeGVscywgaWUgc29tZXRpbWVzIHRha2UgdGhlIGxlZnQgcGl4ZWwsIHNvbWV0aW1lcyB0aGUgcmlnaHQpLgotICAgICovCi0gICAgZ2xUcmFuc2xhdGVmKDAuMzc1LCAwLjM3NSwgMCk7Ci0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZE1hdHJpeGYodHJhbnNfbWF0KTsKLSAgICBMRUFWRV9HTCgpOwotfQotCi12b2lkCi1kM2RkZXZpY2Vfc2V0X21hdHJpY2VzKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsIERXT1JEIG1hdHJpY2VzLAotCQkgICAgICAgRDNETUFUUklYICp3b3JsZF9tYXQsIEQzRE1BVFJJWCAqdmlld19tYXQsIEQzRE1BVFJJWCAqcHJval9tYXQpCi17Ci0gICAgVFJBQ0UoIiglcCwlMDhseCwlcCwlcCwlcClcbiIsIFRoaXMsIG1hdHJpY2VzLCB3b3JsZF9tYXQsIHZpZXdfbWF0LCBwcm9qX21hdCk7Ci0gICAgCi0gICAgRU5URVJfR0woKTsKLSAgICBpZiAoKG1hdHJpY2VzICYgKFZJRVdNQVRfQ0hBTkdFRHxXT1JMRE1BVF9DSEFOR0VEKSkgIT0gMCkgewotICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLQlnbExvYWRNYXRyaXhmKChmbG9hdCAqKSB2aWV3X21hdCk7Ci0KLQkvKiBOb3cgYWxzbyByZS1sb2FkcyBhbGwgdGhlIExpZ2h0cyBhbmQgQ2xpcHBpbmcgUGxhbmVzIHVzaW5nIHRoZSBuZXcgbWF0cmljZXMgKi8KLQlpZiAoVGhpcy0+c3RhdGVfYmxvY2sucmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0NMSVBQSU5HIC0gMV0gIT0gRkFMU0UpIHsKLQkgICAgR0xpbnQgaTsKLQkgICAgRFdPUkQgcnVubmVyOwotCSAgICBmb3IgKGkgPSAwLCBydW5uZXIgPSAweDAwMDAwMDAxOyBpIDwgVGhpcy0+bWF4X2NsaXBwaW5nX3BsYW5lczsgaSsrLCBydW5uZXIgPDw9IDEpIHsKLQkgICAgICAgIGlmIChydW5uZXIgJiBUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQ0xJUFBMQU5FRU5BQkxFIC0gMV0pIHsKLQkJICAgIEdMZG91YmxlIHBsYW5lWzRdOwotCi0JCSAgICBwbGFuZVswXSA9IFRoaXMtPmNsaXBwaW5nX3BsYW5lc1tpXS5wbGFuZVswXTsKLQkJICAgIHBsYW5lWzFdID0gVGhpcy0+Y2xpcHBpbmdfcGxhbmVzW2ldLnBsYW5lWzFdOwotCQkgICAgcGxhbmVbMl0gPSBUaGlzLT5jbGlwcGluZ19wbGFuZXNbaV0ucGxhbmVbMl07Ci0JCSAgICBwbGFuZVszXSA9IFRoaXMtPmNsaXBwaW5nX3BsYW5lc1tpXS5wbGFuZVszXTsKLQkJICAgIAotCQkgICAgZ2xDbGlwUGxhbmUoIEdMX0NMSVBfUExBTkUwICsgaSwgKGNvbnN0IEdMZG91YmxlKikgKCZwbGFuZSkgKTsKLQkJfQotCSAgICB9Ci0JfQotCWlmIChUaGlzLT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfTElHSFRJTkcgLSAxXSAhPSBGQUxTRSkgewotCSAgICBHTGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVGhpcy0+bWF4X2FjdGl2ZV9saWdodHM7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRFdPUkQgZHdMaWdodEluZGV4ID0gVGhpcy0+YWN0aXZlX2xpZ2h0c1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoZHdMaWdodEluZGV4ICE9IH4wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTFBEM0RMSUdIVDcgcExpZ2h0ID0gJlRoaXMtPmxpZ2h0X3BhcmFtZXRlcnNbZHdMaWdodEluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwTGlnaHQtPmRsdFR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLQkJICAgICAgICBjYXNlIEQzRExJR0hUX0RJUkVDVElPTkFMOiB7Ci0JCQkgICAgZmxvYXQgZGlyZWN0aW9uWzRdOwotCQkJICAgIGZsb2F0IGN1dF9vZmYgPSAxODAuMDsKLQkJCSAgICAKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfQU1CSUVOVCwgIChmbG9hdCAqKSAmcExpZ2h0LT5kY3ZBbWJpZW50KTsKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfRElGRlVTRSwgIChmbG9hdCAqKSAmcExpZ2h0LT5kY3ZEaWZmdXNlKTsKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfU1BFQ1VMQVIsIChmbG9hdCAqKSAmcExpZ2h0LT5kY3ZTcGVjdWxhcik7Ci0JCQkgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGksIEdMX1NQT1RfQ1VUT0ZGLCAmY3V0X29mZik7Ci0JCQkgICAgCi0JCQkgICAgZGlyZWN0aW9uWzBdID0gcExpZ2h0LT5kdkRpcmVjdGlvbi51MS54OwotCQkJICAgIGRpcmVjdGlvblsxXSA9IHBMaWdodC0+ZHZEaXJlY3Rpb24udTIueTsKLQkJCSAgICBkaXJlY3Rpb25bMl0gPSBwTGlnaHQtPmR2RGlyZWN0aW9uLnUzLno7Ci0JCQkgICAgZGlyZWN0aW9uWzNdID0gMC4wOwotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9QT1NJVElPTiwgKGZsb2F0ICopIGRpcmVjdGlvbik7Ci0JCQl9IGJyZWFrOwotCi0JCQljYXNlIEQzRExJR0hUX1BPSU5UOiB7Ci0JCQkgICAgZmxvYXQgcG9zaXRpb25bNF07Ci0JCQkgICAgZmxvYXQgY3V0X29mZiA9IDE4MC4wOwotCQkJICAgIAotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9BTUJJRU5ULCAgKGZsb2F0ICopICZwTGlnaHQtPmRjdkFtYmllbnQpOwotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9ESUZGVVNFLCAgKGZsb2F0ICopICZwTGlnaHQtPmRjdkRpZmZ1c2UpOwotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9TUEVDVUxBUiwgKGZsb2F0ICopICZwTGlnaHQtPmRjdlNwZWN1bGFyKTsKLQkJCSAgICBwb3NpdGlvblswXSA9IHBMaWdodC0+ZHZQb3NpdGlvbi51MS54OwotCQkJICAgIHBvc2l0aW9uWzFdID0gcExpZ2h0LT5kdlBvc2l0aW9uLnUyLnk7Ci0JCQkgICAgcG9zaXRpb25bMl0gPSBwTGlnaHQtPmR2UG9zaXRpb24udTMuejsKLQkJCSAgICBwb3NpdGlvblszXSA9IDEuMDsKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfUE9TSVRJT04sIChmbG9hdCAqKSBwb3NpdGlvbik7Ci0JCQkgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGksIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OLCAmcExpZ2h0LT5kdkF0dGVudWF0aW9uMCk7Ci0JCQkgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGksIEdMX0xJTkVBUl9BVFRFTlVBVElPTiwgJnBMaWdodC0+ZHZBdHRlbnVhdGlvbjEpOwotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04sICZwTGlnaHQtPmR2QXR0ZW51YXRpb24yKTsKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfU1BPVF9DVVRPRkYsICZjdXRfb2ZmKTsKLQkJCX0gYnJlYWs7Ci0KLQkJCWNhc2UgRDNETElHSFRfU1BPVDogewotCQkJICAgIGZsb2F0IGRpcmVjdGlvbls0XTsKLQkJCSAgICBmbG9hdCBwb3NpdGlvbls0XTsKLQkJCSAgICBmbG9hdCBjdXRfb2ZmID0gOTAuMCAqIChUaGlzLT5saWdodF9wYXJhbWV0ZXJzW2ldLmR2UGhpIC8gTV9QSSk7Ci0JCQkgICAgCi0JCQkgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGksIEdMX0FNQklFTlQsICAoZmxvYXQgKikgJnBMaWdodC0+ZGN2QW1iaWVudCk7Ci0JCQkgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGksIEdMX0RJRkZVU0UsICAoZmxvYXQgKikgJnBMaWdodC0+ZGN2RGlmZnVzZSk7Ci0JCQkgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGksIEdMX1NQRUNVTEFSLCAoZmxvYXQgKikgJnBMaWdodC0+ZGN2U3BlY3VsYXIpOwotCQkJICAgIAotCQkJICAgIGRpcmVjdGlvblswXSA9IHBMaWdodC0+ZHZEaXJlY3Rpb24udTEueDsKLQkJCSAgICBkaXJlY3Rpb25bMV0gPSBwTGlnaHQtPmR2RGlyZWN0aW9uLnUyLnk7Ci0JCQkgICAgZGlyZWN0aW9uWzJdID0gcExpZ2h0LT5kdkRpcmVjdGlvbi51My56OwotCQkJICAgIGRpcmVjdGlvblszXSA9IDAuMDsKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfU1BPVF9ESVJFQ1RJT04sIChmbG9hdCAqKSBkaXJlY3Rpb24pOwotCQkJICAgIHBvc2l0aW9uWzBdID0gcExpZ2h0LT5kdlBvc2l0aW9uLnUxLng7Ci0JCQkgICAgcG9zaXRpb25bMV0gPSBwTGlnaHQtPmR2UG9zaXRpb24udTIueTsKLQkJCSAgICBwb3NpdGlvblsyXSA9IHBMaWdodC0+ZHZQb3NpdGlvbi51My56OwotCQkJICAgIHBvc2l0aW9uWzNdID0gMS4wOwotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9QT1NJVElPTiwgKGZsb2F0ICopIHBvc2l0aW9uKTsKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sICZwTGlnaHQtPmR2QXR0ZW51YXRpb24wKTsKLQkJCSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgaSwgR0xfTElORUFSX0FUVEVOVUFUSU9OLCAmcExpZ2h0LT5kdkF0dGVudWF0aW9uMSk7Ci0JCQkgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGksIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiwgJnBMaWdodC0+ZHZBdHRlbnVhdGlvbjIpOwotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9TUE9UX0NVVE9GRiwgJmN1dF9vZmYpOwotCQkJICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBpLCBHTF9TUE9UX0VYUE9ORU5ULCAmcExpZ2h0LT5kdkZhbGxvZmYpOwotCQkJfSBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCSAgICAvKiBObyB3YXJuaW5nIGhlcmUgYXMgaXQncyBhbHJlYWR5IGRvbmUgYXQgbGlnaHQgc2V0dGluZyAqLwotCQkJICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLSAgICAgICAgfQotCQotCWdsTXVsdE1hdHJpeGYoKGZsb2F0ICopIHdvcmxkX21hdCk7Ci0gICAgfQotICAgIGlmICgobWF0cmljZXMgJiBQUk9KTUFUX0NIQU5HRUQpICE9IDApIHsKLQlnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0JZ2xMb2FkTWF0cml4ZigoZmxvYXQgKikgcHJval9tYXQpOwotICAgIH0KLSAgICBMRUFWRV9HTCgpOwotfQotCi12b2lkCi1kM2RkZXZpY2VfbWF0cmljZXNfdXBkYXRlZChJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLCBEV09SRCBtYXRyaWNlcykKLXsKLSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwgKmdsVGhpcyA9IChJRGlyZWN0M0REZXZpY2VHTEltcGwgKikgVGhpczsKLSAgICBEV09SRCB0ZXhfbWF0LCB0ZXhfc3RhZ2U7Ci0KLSAgICBUUkFDRSgiKCVwLCUwOGx4KVxuIiwgVGhpcywgbWF0cmljZXMpOwotICAgIAotICAgIGlmIChtYXRyaWNlcyAmIChWSUVXTUFUX0NIQU5HRUR8V09STERNQVRfQ0hBTkdFRHxQUk9KTUFUX0NIQU5HRUQpKSB7Ci0gICAgICAgIGlmIChnbFRoaXMtPnRyYW5zZm9ybV9zdGF0ZSA9PSBHTF9UUkFOU0ZPUk1fTk9STUFMKSB7Ci0JICAgIC8qIFRoaXMgd2lsbCBmb3JjZSBhbiB1cGRhdGUgb2YgdGhlIHRyYW5zZm9ybSBzdGF0ZSBhdCB0aGUgbmV4dCBkcmF3aW5nLiAqLwotCSAgICBnbFRoaXMtPnRyYW5zZm9ybV9zdGF0ZSA9IEdMX1RSQU5TRk9STV9OT05FOwotCX0KLSAgICB9Ci0gICAgaWYgKG1hdHJpY2VzICYgKFRFWE1BVDBfQ0hBTkdFRHxURVhNQVQxX0NIQU5HRUR8VEVYTUFUMl9DSEFOR0VEfFRFWE1BVDNfQ0hBTkdFRHwKLQkJICAgIFRFWE1BVDRfQ0hBTkdFRHxURVhNQVQ1X0NIQU5HRUR8VEVYTUFUNl9DSEFOR0VEfFRFWE1BVDdfQ0hBTkdFRCkpCi0gICAgewotICAgICAgICBFTlRFUl9HTCgpOwotCWZvciAodGV4X21hdCA9IFRFWE1BVDBfQ0hBTkdFRCwgdGV4X3N0YWdlID0gMDsgdGV4X21hdCA8PSBURVhNQVQ3X0NIQU5HRUQ7IHRleF9tYXQgPDw9IDEsIHRleF9zdGFnZSsrKSB7Ci0JICAgIEdMZW51bSB1bml0ID0gR0xfVEVYVFVSRTBfV0lORSArIHRleF9zdGFnZTsKLQkgICAgaWYgKG1hdHJpY2VzICYgdGV4X21hdCkgewotCSAgICAgICAgaWYgKFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbdGV4X3N0YWdlXVtEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTIC0gMV0gIT0gRDNEVFRGRl9ESVNBQkxFKSB7Ci0JCSAgICBpbnQgaXNfaWRlbnRpdHkgPSAobWVtY21wKFRoaXMtPnRleF9tYXRbdGV4X3N0YWdlXSwgaWRfbWF0LCAxNiAqIHNpemVvZihEM0RWQUxVRSkpICE9IDApOwotCi0JCSAgICBpZiAoVGhpcy0+dGV4X21hdF9pc19pZGVudGl0eVt0ZXhfc3RhZ2VdICE9IGlzX2lkZW50aXR5KSB7Ci0JCQlpZiAoZ2xUaGlzLT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCAhPSB1bml0KSB7Ci0JCQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JCQkgICAgZ2xUaGlzLT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCA9IHVuaXQ7Ci0JCQl9Ci0JCQlnbE1hdHJpeE1vZGUoR0xfVEVYVFVSRSk7Ci0JCQlnbExvYWRNYXRyaXhmKChmbG9hdCAqKSBUaGlzLT50ZXhfbWF0W3RleF9zdGFnZV0pOwotCQkgICAgfQotCQkgICAgVGhpcy0+dGV4X21hdF9pc19pZGVudGl0eVt0ZXhfc3RhZ2VdID0gaXNfaWRlbnRpdHk7Ci0JCX0gZWxzZSB7Ci0JCSAgICBpZiAoVGhpcy0+dGV4X21hdF9pc19pZGVudGl0eVt0ZXhfc3RhZ2VdID09IEZBTFNFKSB7Ci0JCQlpZiAoZ2xUaGlzLT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCAhPSB1bml0KSB7Ci0JCQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JCQkgICAgZ2xUaGlzLT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCA9IHVuaXQ7Ci0JCQl9Ci0JCQlnbE1hdHJpeE1vZGUoR0xfVEVYVFVSRSk7Ci0JCQlnbExvYWRJZGVudGl0eSgpOwotCQkJVGhpcy0+dGV4X21hdF9pc19pZGVudGl0eVt0ZXhfc3RhZ2VdID0gVFJVRTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCUxFQVZFX0dMKCk7Ci0gICAgfQotfQotCi0vKiBUT0RPIGZvciBib3RoIHRoZXNlIGZ1bmN0aW9ucyA6Ci0gICAgLSBjaGFuZ2UgLyByZXN0b3JlIE9wZW5HTCBwYXJhbWV0ZXJzIGZvciBwaWN0dXJlcyB0cmFuc2ZlcnMgaW4gY2FzZSB0aGV5IGFyZSBldmVyIG1vZGlmaWVkCi0gICAgICBieSBvdGhlciBPcGVuR0wgY29kZSBpbiBEM0QKLSAgICAtIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBubyAnQmVnaW4gLyBFbmRTY2VuZScgd2FzIGRvbmUgYmV0d2VlbiB0d28gbG9ja3MKLSAgICAtIGhhbmRsZSB0aGUgcmVjdGFuZ2xlcyBpbiB0aGUgdW5sb2NrIHRvbwotICAgIC0gaGFuZGxlIHBpdGNoIGNvcnJlY3RseS4uLgotKi8KLXN0YXRpYyB2b2lkIGQzZGRldmljZV9sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHBSZWN0LCBEV09SRCBkd0ZsYWdzKQotewotICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZF9kZXYgPSBUaGlzLT5kM2RkZXZpY2U7Ci0gICAgSURpcmVjdDNERGV2aWNlR0xJbXBsKiBnbF9kM2RfZGV2ID0gKElEaXJlY3QzRERldmljZUdMSW1wbCopIGQzZF9kZXY7Ci0gICAgV0lORV9HTF9CVUZGRVJfVFlQRSBidWZmZXJfdHlwZTsKLSAgICBSRUNUIGxvY19yZWN0OwotICAgIAotICAgIGlmICgoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfRlJPTlRCVUZGRVJ8RERTQ0FQU19QUklNQVJZU1VSRkFDRSkpICE9IDApIHsKLSAgICAgICAgYnVmZmVyX3R5cGUgPSBXSU5FX0dMX0JVRkZFUl9GUk9OVDsKLQlpZiAoKGdsX2QzZF9kZXYtPnN0YXRlW1dJTkVfR0xfQlVGRkVSX0ZST05UXSAhPSBTVVJGQUNFX0dMKSAmJgotCSAgICAoZ2xfZDNkX2Rldi0+bG9ja19zdXJmW1dJTkVfR0xfQlVGRkVSX0ZST05UXSAhPSBUaGlzKSkgewotCSAgICBFUlIoIkNoYW5nZSBvZiBmcm9udCBidWZmZXIuLiBFeHBlY3QgZ3JhcGhpYyBjb3JydXB0aW9ucyAhXG4iKTsKLQl9Ci0JZ2xfZDNkX2Rldi0+bG9ja19zdXJmW1dJTkVfR0xfQlVGRkVSX0ZST05UXSA9IFRoaXM7Ci0gICAgfSBlbHNlIGlmICgoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfQkFDS0JVRkZFUikpID09IChERFNDQVBTX0JBQ0tCVUZGRVIpKSB7Ci0gICAgICAgIGJ1ZmZlcl90eXBlID0gV0lORV9HTF9CVUZGRVJfQkFDSzsKLQlpZiAoKGdsX2QzZF9kZXYtPnN0YXRlW1dJTkVfR0xfQlVGRkVSX0JBQ0tdICE9IFNVUkZBQ0VfR0wpICYmCi0JICAgIChnbF9kM2RfZGV2LT5sb2NrX3N1cmZbV0lORV9HTF9CVUZGRVJfQkFDS10gIT0gVGhpcykpIHsKLQkgICAgRVJSKCJDaGFuZ2Ugb2YgYmFjayBidWZmZXIuLiBFeHBlY3QgZ3JhcGhpYyBjb3JydXB0aW9ucyAhXG4iKTsKLQl9Ci0JZ2xfZDNkX2Rldi0+bG9ja19zdXJmW1dJTkVfR0xfQlVGRkVSX0JBQ0tdID0gVGhpczsKLSAgICB9IGVsc2UgewotICAgICAgICBFUlIoIldyb25nIHN1cmZhY2UgdHlwZSBmb3IgbG9ja2luZyAhXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBSZWN0ID09IE5VTEwpIHsKLQlsb2NfcmVjdC50b3AgPSAwOwotCWxvY19yZWN0LmxlZnQgPSAwOwotCWxvY19yZWN0LmJvdHRvbSA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLQlsb2NfcmVjdC5yaWdodCA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kd1dpZHRoOwotCXBSZWN0ID0gJmxvY19yZWN0OwotICAgIH0KLSAgICAKLSAgICAvKiBUcnkgdG8gYWNxdWlyZSB0aGUgZGV2aWNlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmKGQzZF9kZXYtPmNyaXQpKTsKLSAgICAKLSAgICBpZiAoZ2xfZDNkX2Rldi0+bG9ja19yZWN0X3ZhbGlkW2J1ZmZlcl90eXBlXSkgewotCUVSUigiVHdvIGNvbnNlY3V0aXZlIGxvY2tzIG9uICVzIGJ1ZmZlci4uLiBFeHBlY3QgcHJvYmxlbXMgIVxuIiwKLQkgICAgKGJ1ZmZlcl90eXBlID09IFdJTkVfR0xfQlVGRkVSX0JBQ0sgPyAiYmFjayIgOiAiZnJvbnQiKSk7Ci0gICAgfQotICAgIGdsX2QzZF9kZXYtPmxvY2tfcmVjdF92YWxpZFtidWZmZXJfdHlwZV0gPSBUUlVFOwotICAgIAotICAgIGlmIChnbF9kM2RfZGV2LT5zdGF0ZVtidWZmZXJfdHlwZV0gIT0gU1VSRkFDRV9HTCkgewotCS8qIENoZWNrIGlmIHRoZSBuZXcgcmVjdGFuZ2xlIGlzIGluIHRoZSBwcmV2aW91cyBvbmUgb3Igbm90LgotCSAgIElmIGl0IGlzIG5vdCwgZmx1c2ggZmlyc3QgdGhlIHByZXZpb3VzIGxvY2tzIG9uIHNjcmVlbi4KLQkqLwotCWlmICgocFJlY3QtPnRvcCAgICA8IGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0udG9wKSB8fAotCSAgICAocFJlY3QtPmxlZnQgICA8IGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0ubGVmdCkgfHwKLQkgICAgKHBSZWN0LT5yaWdodCAgPiBnbF9kM2RfZGV2LT5sb2NrX3JlY3RbYnVmZmVyX3R5cGVdLnJpZ2h0KSB8fAotCSAgICAocFJlY3QtPmJvdHRvbSA+IGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0uYm90dG9tKSkgewotCSAgICBpZiAoZ2xfZDNkX2Rldi0+c3RhdGVbYnVmZmVyX3R5cGVdID09IFNVUkZBQ0VfTUVNT1JZX0RJUlRZKSB7Ci0JCVRSQUNFKCIgZmx1c2hpbmcgYmFjayB0byAlcyBidWZmZXIgYXMgbmV3IHJlY3QgOiAoJWxkeCVsZCkgLSAoJWxkeCVsZCkgbm90IGluY2x1ZGVkIGluIG9sZCByZWN0IDogKCVsZHglbGQpIC0gKCVsZHglbGQpXG4iLAotCQkgICAgICAoYnVmZmVyX3R5cGUgPT0gV0lORV9HTF9CVUZGRVJfQkFDSyA/ICJiYWNrIiA6ICJmcm9udCIpLAotCQkgICAgICBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPnJpZ2h0LCBwUmVjdC0+Ym90dG9tLAotCQkgICAgICBnbF9kM2RfZGV2LT5sb2NrX3JlY3RbYnVmZmVyX3R5cGVdLmxlZnQsIGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0udG9wLAotCQkgICAgICBnbF9kM2RfZGV2LT5sb2NrX3JlY3RbYnVmZmVyX3R5cGVdLnJpZ2h0LCBnbF9kM2RfZGV2LT5sb2NrX3JlY3RbYnVmZmVyX3R5cGVdLmJvdHRvbSk7Ci0JCWQzZF9kZXYtPmZsdXNoX3RvX2ZyYW1lYnVmZmVyKGQzZF9kZXYsICYoZ2xfZDNkX2Rldi0+bG9ja19yZWN0W2J1ZmZlcl90eXBlXSksIGdsX2QzZF9kZXYtPmxvY2tfc3VyZltidWZmZXJfdHlwZV0pOwotCSAgICB9Ci0JICAgIGdsX2QzZF9kZXYtPnN0YXRlW2J1ZmZlcl90eXBlXSA9IFNVUkZBQ0VfR0w7Ci0JICAgIGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtidWZmZXJfdHlwZV0gPSAqcFJlY3Q7Ci0JfQotCS8qIEluIHRoZSBvdGhlciBjYXNlLCBkbyBub3QgdXBncmFkZSB0aGUgbG9ja2luZyByZWN0YW5nbGUgYXMgaXQncyBubyBuZWVkLi4uICovCi0gICAgfSBlbHNlIHsKLQlnbF9kM2RfZGV2LT5sb2NrX3JlY3RbYnVmZmVyX3R5cGVdID0gKnBSZWN0OwotICAgIH0KLSAgICAKLSAgICBpZiAoZ2xfZDNkX2Rldi0+c3RhdGVbYnVmZmVyX3R5cGVdID09IFNVUkZBQ0VfR0wpIHsKLSAgICAgICAgLyogSWYgdGhlIHN1cmZhY2UgaXMgYWxyZWFkeSBpbiBtZW1vcnksIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS4uLiAqLwotICAgICAgICBHTGVudW0gYnVmZmVyX2Zvcm1hdDsKLQlHTGVudW0gYnVmZmVyX2NvbG9yOwotCWludCB5OwotCWNoYXIgKmRzdDsKLQotCVRSQUNFKCIgY29weWluZyAlcyBidWZmZXIgdG8gbWFpbiBtZW1vcnkgd2l0aCByZWN0YW5nbGUgKCVsZHglbGQpIC0gKCVsZHglbGQpLlxuIiwgKGJ1ZmZlcl90eXBlID09IFdJTkVfR0xfQlVGRkVSX0JBQ0sgPyAiYmFjayIgOiAiZnJvbnQiKSwKLQkgICAgICBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPnJpZ2h0LCBwUmVjdC0+Ym90dG9tKTsKLQkKLQkvKiBOb3RlIHRoYXQgaGVyZSB3ZSBjYW5ub3QgZG8gJ29wdG1pemF0aW9ucycgYWJvdXQgdGhlIFdyaXRlT25seSBmbGFnLi4uIEluZGVlZCwgYSBnYW1lCi0JICAgbWF5IG9ubHkgd3JpdGUgdG8gdGhlIGRldmljZS4uLiBCdXQgd2hlbiB3ZSB3aWxsIGJsaXQgaXQgYmFjayB0byB0aGUgc2NyZWVuLCB3ZSBuZWVkCi0JICAgYWxzbyB0byBibGl0IGNvcnJlY3RseSB0aGUgcGFydHMgdGhlIGFwcGxpY2F0aW9uIGRpZCBub3Qgb3ZlcndyaXRlLi4uICovCi0KLQlpZiAoKChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX1JHQikgIT0gMCkgJiYKLQkgICAgKCgoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9BTFBIQVBJWEVMUykgPT0gMCkgfHwKLQkgICAgIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4MDAwMDAwMDApKSkgewotCSAgICBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAxNikgJiYKLQkJKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdSQml0TWFzayA9PSAweEY4MDApICYmCi0JCShUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3R0JpdE1hc2sgPT0gMHgwN0UwKSAmJgotCQkoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51NC5kd0JCaXRNYXNrID09IDB4MDAxRikpIHsKLQkJYnVmZmVyX2Zvcm1hdCA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OwotCQlidWZmZXJfY29sb3IgPSBHTF9SR0I7Ci0JICAgIH0gZWxzZSBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAyNCkgJiYKLQkJICAgICAgIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3UkJpdE1hc2sgPT0gMHhGRjAwMDApICYmCi0JCSAgICAgICAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrID09IDB4MDBGRjAwKSAmJgotCQkgICAgICAgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzayA9PSAweDAwMDBGRikpIHsKLQkJYnVmZmVyX2Zvcm1hdCA9IEdMX1VOU0lHTkVEX0JZVEU7Ci0JCWJ1ZmZlcl9jb2xvciA9IEdMX1JHQjsKLQkgICAgfSBlbHNlIGlmICgoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ID09IDMyKSAmJgotCQkgICAgICAgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdSQml0TWFzayA9PSAweDAwRkYwMDAwKSAmJgotCQkgICAgICAgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdHQml0TWFzayA9PSAweDAwMDBGRjAwKSAmJgotCQkgICAgICAgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzayA9PSAweDAwMDAwMEZGKSkgewotCQlidWZmZXJfZm9ybWF0ID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwotCQlidWZmZXJfY29sb3IgPSBHTF9CR1JBOwotCSAgICB9IGVsc2UgewotCQlFUlIoIiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgYXQgZGV2aWNlIGxvY2tpbmcuXG4iKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgRVJSKCIgdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0IGF0IGRldmljZSBsb2NraW5nIC0gYWxwaGEgb24gZnJhbWUgYnVmZmVyLlxuIik7Ci0JICAgIHJldHVybjsKLQl9Ci0KLQlFTlRFUl9HTCgpOwotCQotCWlmIChidWZmZXJfdHlwZSA9PSBXSU5FX0dMX0JVRkZFUl9GUk9OVCkKLQkgICAgLyogQXBwbGljYXRpb24gd2FudHMgdG8gbG9jayB0aGUgZnJvbnQgYnVmZmVyICovCi0JICAgIGdsUmVhZEJ1ZmZlcihHTF9GUk9OVCk7Ci0JZWxzZSAKLQkgICAgLyogQXBwbGljYXRpb24gd2FudHMgdG8gbG9jayB0aGUgYmFjayBidWZmZXIgKi8KLQkgICAgZ2xSZWFkQnVmZmVyKEdMX0JBQ0spOwotCi0JZHN0ID0gKChjaGFyICopVGhpcy0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZSkgKwotCSAgKHBSZWN0LT50b3AgKiBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoKSArIChwUmVjdC0+bGVmdCAqIEdFVF9CUFAoVGhpcy0+c3VyZmFjZV9kZXNjKSk7Ci0KLQlpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCAhPSAoR0VUX0JQUChUaGlzLT5zdXJmYWNlX2Rlc2MpICogVGhpcy0+c3VyZmFjZV9kZXNjLmR3V2lkdGgpKSB7Ci0JICAgIC8qIFNsb3ctcGF0aCBpbiBjYXNlIG9mICdvZGQnIHN1cmZhY2VzLiBUaGlzIGNvdWxkIGJlIGZpeGVkIHVzaW5nIHNvbWUgR0wgb3B0aW9ucywgYnV0IEkKLQkgICAgICogY291bGQgbm90IGJlIGJvdGhlcmVkIGNvbnNpZGVyaW5nIHRoZSByYXJlIGNhc2VzIHdoZXJlIGl0IG1heSBiZSB1c2VmdWwgOi0pCi0JICAgICAqLwotCSAgICBmb3IgKHkgPSAoVGhpcy0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0IC0gcFJlY3QtPnRvcCAtIDEpOwotCQkgeSA+PSAoKGludCkgVGhpcy0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0IC0gKGludCkgcFJlY3QtPmJvdHRvbSk7Ci0JCSB5LS0pIHsKLQkJZ2xSZWFkUGl4ZWxzKHBSZWN0LT5sZWZ0LCB5LAotCQkJICAgICBwUmVjdC0+cmlnaHQgLSBwUmVjdC0+bGVmdCwgMSwKLQkJCSAgICAgYnVmZmVyX2NvbG9yLCBidWZmZXJfZm9ybWF0LCBkc3QpOwotCQlkc3QgKz0gVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaDsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIC8qIEZhc3RlciBwYXRoIGZvciBzdXJmYWNlIGNvcHkuIE5vdGUgdGhhdCBJIGNhbiB1c2Ugc3RhdGljIHZhcmlhYmxlcyBoZXJlIGFzIEkgYW0KLQkgICAgICogcHJvdGVjdGVkIGJ5IHRoZSBPcGVuR0wgY3JpdGljYWwgc2VjdGlvbiBzbyB0aGlzIGZ1bmN0aW9uIHdvbid0IGJlIGNhbGxlZCBieQotCSAgICAgKiB0d28gdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLgotCSAgICAgKi8KLQkgICAgc3RhdGljIGNoYXIgKmJ1ZmZlciA9IE5VTEw7Ci0JICAgIHN0YXRpYyBpbnQgYnVmZmVyX3dpZHRoID0gMDsKLQkgICAgY2hhciAqZHN0MiA9IGRzdCArICgocFJlY3QtPmJvdHRvbSAtIHBSZWN0LT50b3ApIC0gMSkgKiBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoOwotCSAgICBpbnQgY3VycmVudF93aWR0aCA9IChwUmVjdC0+cmlnaHQgLSBwUmVjdC0+bGVmdCkgKiBHRVRfQlBQKFRoaXMtPnN1cmZhY2VfZGVzYyk7Ci0JICAgIAotCSAgICBnbFJlYWRQaXhlbHMocFJlY3QtPmxlZnQsICgoaW50KSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgLSAoaW50KSBwUmVjdC0+Ym90dG9tKSwKLQkJCSBwUmVjdC0+cmlnaHQgLSBwUmVjdC0+bGVmdCwgcFJlY3QtPmJvdHRvbSAtIHBSZWN0LT50b3AsCi0JCQkgYnVmZmVyX2NvbG9yLCBidWZmZXJfZm9ybWF0LCBkc3QpOwotCi0JICAgIGlmIChjdXJyZW50X3dpZHRoID4gYnVmZmVyX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmZmVyKTsKLQkJYnVmZmVyX3dpZHRoID0gY3VycmVudF93aWR0aDsKLQkJYnVmZmVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlcl93aWR0aCk7Ci0JICAgIH0KLQkgICAgZm9yICh5ID0gMDsgeSA8ICgocFJlY3QtPmJvdHRvbSAtIHBSZWN0LT50b3ApIC8gMik7IHkrKykgewotCQltZW1jcHkoYnVmZmVyLCBkc3QsIGN1cnJlbnRfd2lkdGgpOwotCQltZW1jcHkoZHN0LCBkc3QyLCBjdXJyZW50X3dpZHRoKTsKLQkJbWVtY3B5KGRzdDIsIGJ1ZmZlciwgY3VycmVudF93aWR0aCk7Ci0JCWRzdCAgKz0gVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaDsKLQkJZHN0MiAtPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoOwotCSAgICB9Ci0JfQotCi0JZ2xfZDNkX2Rldi0+c3RhdGVbYnVmZmVyX3R5cGVdID0gU1VSRkFDRV9NRU1PUlk7Ci0JCi0jaWYgMAotCS8qIEkga2VlcCB0aGlzIGNvZGUgaGVyZSBhcyBpdCdzIHZlcnkgdXNlZnVsIHRvIGRlYnVnIDotKSAqLwotCXsKLQkgICAgc3RhdGljIGludCBmbHVzaF9jb3VudCA9IDA7Ci0JICAgIGNoYXIgYnVmWzEyOF07Ci0JICAgIEZJTEUgKmY7Ci0JICAgIAotCSAgICBpZiAoKCsrZmx1c2hfY291bnQgJSA1MCkgPT0gMCkgewotCSAgICAgICAgc3ByaW50ZihidWYsICJsb2NrXyUwNmQucG5tIiwgZmx1c2hfY291bnQpOwotCQlmID0gZm9wZW4oYnVmLCAid2IiKTsKLQkJRERSQVdfZHVtcF9zdXJmYWNlX3RvX2Rpc2soVGhpcywgZik7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLQkKLQlMRUFWRV9HTCgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZDNkZGV2aWNlX2ZsdXNoX3RvX2ZyYW1lX2J1ZmZlcihJRGlyZWN0M0REZXZpY2VJbXBsICpkM2RfZGV2LCBMUENSRUNUIHBSZWN0LCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmKSB7Ci0gICAgUkVDVCBsb2NfcmVjdDsKLSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwqIGdsX2QzZF9kZXYgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsKikgZDNkX2RldjsKLSAgICBpbnQgeCwgeTsKLSAgICBCT09MRUFOIGluaXRpYWw7Ci0gICAgRFdPUkQgb3B0X2JpdG1hcDsKLSAgICAKLSAgICAvKiBOb3RlIDogbm8gbmVlZCBoZXJlIHRvIGxvY2sgdGhlICdkZXZpY2UgY3JpdGljYWwgc2VjdGlvbicgYXMgd2UgYXJlIGFscmVhZHkgcHJvdGVjdGVkIGJ5Ci0gICAgICAgdGhlIEdMIGNyaXRpY2FsIHNlY3Rpb24uICovCi0KLSAgICBpZiAocFJlY3QgPT0gTlVMTCkgewotCWxvY19yZWN0LnRvcCA9IDA7Ci0JbG9jX3JlY3QubGVmdCA9IDA7Ci0JbG9jX3JlY3QuYm90dG9tID0gZDNkX2Rldi0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OwotCWxvY19yZWN0LnJpZ2h0ID0gZDNkX2Rldi0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7Ci0JcFJlY3QgPSAmbG9jX3JlY3Q7Ci0gICAgfQotICAgIAotICAgIFRSQUNFKCIgZmx1c2hpbmcgbWVtb3J5IGJhY2sgdG8gc2NyZWVuIG1lbW9yeSAoJWxkLCVsZCkgeCAoJWxkLCVsZCkuXG4iLCBwUmVjdC0+dG9wLCBwUmVjdC0+bGVmdCwgcFJlY3QtPnJpZ2h0LCBwUmVjdC0+Ym90dG9tKTsKLQotICAgIG9wdF9iaXRtYXAgPSBkM2RkZXZpY2Vfc2V0X3N0YXRlX2Zvcl9mbHVzaChkM2RfZGV2LCBwUmVjdCwgRkFMU0UsICZpbml0aWFsKTsKLSAgICAKLSAgICBpZiAodXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeV9pbml0KHN1cmYsIDAsICZnbF9kM2RfZGV2LT5jdXJyZW50X2ludGVybmFsX2Zvcm1hdCwKLQkJCQkJICBpbml0aWFsLCBGQUxTRSwgVU5MT0NLX1RFWF9TSVpFLCBVTkxPQ0tfVEVYX1NJWkUpICE9IEREX09LKSB7Ci0gICAgICAgIEVSUigiIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCBhdCBmcmFtZSBidWZmZXIgZmx1c2guXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotCQotICAgIGZvciAoeSA9IHBSZWN0LT50b3A7IHkgPCBwUmVjdC0+Ym90dG9tOyB5ICs9IFVOTE9DS19URVhfU0laRSkgewotCVJFQ1QgZmx1c2hfcmVjdDsKLQkKLQlmbHVzaF9yZWN0LnRvcCA9IHk7Ci0JZmx1c2hfcmVjdC5ib3R0b20gPSAoeSArIFVOTE9DS19URVhfU0laRSA+IHBSZWN0LT5ib3R0b20pID8gcFJlY3QtPmJvdHRvbSA6ICh5ICsgVU5MT0NLX1RFWF9TSVpFKTsKLQotCWZvciAoeCA9IHBSZWN0LT5sZWZ0OyB4IDwgcFJlY3QtPnJpZ2h0OyB4ICs9IFVOTE9DS19URVhfU0laRSkgewotCSAgICAvKiBGaXJzdCwgdXBsb2FkIHRoZSB0ZXh0dXJlLi4uICovCi0JICAgIGZsdXNoX3JlY3QubGVmdCA9IHg7Ci0JICAgIGZsdXNoX3JlY3QucmlnaHQgPSAoeCArIFVOTE9DS19URVhfU0laRSA+IHBSZWN0LT5yaWdodCkgID8gcFJlY3QtPnJpZ2h0ICA6ICh4ICsgVU5MT0NLX1RFWF9TSVpFKTsKLQotCSAgICB1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5KCZmbHVzaF9yZWN0LCAwLCAwLCAmKGdsX2QzZF9kZXYtPnN1cmZhY2VfcHRyKSk7Ci0KLQkgICAgZ2xCZWdpbihHTF9RVUFEUyk7Ci0JICAgIGdsVGV4Q29vcmQyZigwLjAsIDAuMCk7Ci0JICAgIGdsVmVydGV4M2QoeCwgeSwgMC41KTsKLQkgICAgZ2xUZXhDb29yZDJmKDEuMCwgMC4wKTsKLQkgICAgZ2xWZXJ0ZXgzZCh4ICsgVU5MT0NLX1RFWF9TSVpFLCB5LCAwLjUpOwotCSAgICBnbFRleENvb3JkMmYoMS4wLCAxLjApOwotCSAgICBnbFZlcnRleDNkKHggKyBVTkxPQ0tfVEVYX1NJWkUsIHkgKyBVTkxPQ0tfVEVYX1NJWkUsIDAuNSk7Ci0JICAgIGdsVGV4Q29vcmQyZigwLjAsIDEuMCk7Ci0JICAgIGdsVmVydGV4M2QoeCwgeSArIFVOTE9DS19URVhfU0laRSwgMC41KTsKLQkgICAgZ2xFbmQoKTsKLQl9Ci0gICAgfQotICAgIAotICAgIHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnlfcmVsZWFzZSgpOwotICAgIGQzZGRldmljZV9yZXN0b3JlX3N0YXRlX2FmdGVyX2ZsdXNoKGQzZF9kZXYsIG9wdF9iaXRtYXAsIEZBTFNFKTsKLSAgICAKLSNpZiAwCi0gICAgLyogSSBrZWVwIHRoaXMgY29kZSBoZXJlIGFzIGl0J3MgdmVyeSB1c2VmdWwgdG8gZGVidWcgOi0pICovCi0gICAgewotICAgICAgICBzdGF0aWMgaW50IGZsdXNoX2NvdW50ID0gMDsKLQljaGFyIGJ1ZlsxMjhdOwotCUZJTEUgKmY7Ci0KLQlpZiAoKCsrZmx1c2hfY291bnQgJSA1MCkgPT0gMCkgewotCSAgICBzcHJpbnRmKGJ1ZiwgImZsdXNoXyUwNmQucG5tIiwgZmx1c2hfY291bnQpOwotCSAgICBmID0gZm9wZW4oYnVmLCAid2IiKTsKLQkgICAgRERSQVdfZHVtcF9zdXJmYWNlX3RvX2Rpc2soc3VyZiwgZik7Ci0JfQotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBkM2RkZXZpY2VfdW5sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHBSZWN0KQotewotICAgIFdJTkVfR0xfQlVGRkVSX1RZUEUgYnVmZmVyX3R5cGU7Ci0gICAgSURpcmVjdDNERGV2aWNlSW1wbCAqZDNkX2RldiA9IFRoaXMtPmQzZGRldmljZTsKLSAgICBJRGlyZWN0M0REZXZpY2VHTEltcGwqIGdsX2QzZF9kZXYgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsKikgZDNkX2RldjsKLSAgCi0gICAgaWYgKChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiAoRERTQ0FQU19GUk9OVEJVRkZFUnxERFNDQVBTX1BSSU1BUllTVVJGQUNFKSkgIT0gMCkgewotICAgICAgICBidWZmZXJfdHlwZSA9IFdJTkVfR0xfQlVGRkVSX0ZST05UOwotICAgIH0gZWxzZSBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX0JBQ0tCVUZGRVIpKSA9PSAoRERTQ0FQU19CQUNLQlVGRkVSKSkgewotCWJ1ZmZlcl90eXBlID0gV0lORV9HTF9CVUZGRVJfQkFDSzsKLSAgICB9IGVsc2UgewotICAgICAgICBFUlIoIldyb25nIHN1cmZhY2UgdHlwZSBmb3IgbG9ja2luZyAhXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGdsX2QzZF9kZXYtPmxvY2tfcmVjdF92YWxpZFtidWZmZXJfdHlwZV0gPT0gRkFMU0UpIHsKLQlFUlIoIlVubG9jayB3aXRob3V0IHByaW9yIGxvY2sgb24gJXMgYnVmZmVyLi4uIEV4cGVjdCBwcm9ibGVtcyAhXG4iLAotCSAgICAoYnVmZmVyX3R5cGUgPT0gV0lORV9HTF9CVUZGRVJfQkFDSyA/ICJiYWNrIiA6ICJmcm9udCIpKTsKLSAgICB9Ci0gICAgZ2xfZDNkX2Rldi0+bG9ja19yZWN0X3ZhbGlkW2J1ZmZlcl90eXBlXSA9IEZBTFNFOwotICAgIAotICAgIC8qIEZpcnN0LCBjaGVjayBpZiB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nLiBGb3IgdGhlIGJhY2tidWZmZXIsIGZsdXNoaW5nIGlzIGRvbmUgYXQgdGhlIG5leHQgM0QgYWN0aXZpdHkuICovCi0gICAgaWYgKChUaGlzLT5sYXN0bG9ja3R5cGUgJiBERExPQ0tfUkVBRE9OTFkpID09IDApIHsKLSAgICAgICAgaWYgKGJ1ZmZlcl90eXBlID09IFdJTkVfR0xfQlVGRkVSX0ZST05UKSB7Ci0JICAgIEdMaW50IHByZXZfZHJhdzsKLQotCSAgICBUUkFDRSgiIGZsdXNoaW5nIGZyb250IGJ1ZmZlciBpbW1lZGlhdGVseSBvbiBzY3JlZW4uXG4iKTsKLQkgICAgCi0JICAgIEVOVEVSX0dMKCk7Ci0JICAgIGdsR2V0SW50ZWdlcnYoR0xfRFJBV19CVUZGRVIsICZwcmV2X2RyYXcpOwotCSAgICBnbERyYXdCdWZmZXIoR0xfRlJPTlQpOwotCSAgICAvKiBOb3RlOiB3ZSBkbyBub3QgdXNlIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlZCBsb2NrIHJlY3RhbmdsZSBidXQgb3VyIG93biBzdG9yZWQgYXQKLQkgICAgICAgICAgICAgbG9jayB0aW1lLiBUaGlzIGlzIGJlY2F1c2UgaW4gb2xkIEQzRCB2ZXJzaW9ucywgdGhlICdsb2NrJyBwYXJhbWV0ZXIgZGlkIG5vdAotCQkgICAgIGV4aXN0LgotCSAgICAqLwotCSAgICBkM2RfZGV2LT5mbHVzaF90b19mcmFtZWJ1ZmZlcihkM2RfZGV2LCAmKGdsX2QzZF9kZXYtPmxvY2tfcmVjdFtXSU5FX0dMX0JVRkZFUl9GUk9OVF0pLCBnbF9kM2RfZGV2LT5sb2NrX3N1cmZbV0lORV9HTF9CVUZGRVJfRlJPTlRdKTsKLQkgICAgZ2xEcmF3QnVmZmVyKHByZXZfZHJhdyk7Ci0JICAgIExFQVZFX0dMKCk7Ci0JfSBlbHNlIHsKLQkgICAgZ2xfZDNkX2Rldi0+c3RhdGVbV0lORV9HTF9CVUZGRVJfQkFDS10gPSBTVVJGQUNFX01FTU9SWV9ESVJUWTsKLQl9Ci0gICAgfQotCi0gICAgLyogQW5kICdmcmVlcycgdGhlIGRldmljZSBjcml0aWNhbCBzZWN0aW9uICovCi0gICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJihkM2RfZGV2LT5jcml0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcHBseV90ZXh0dXJlX3N0YXRlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpCi17Ci0gICAgaW50IHN0YWdlLCBzdGF0ZTsKLSAgICAKLSAgICAvKiBJbml0aWFsaXplIHRleHR1cmUgc3RhZ2VzIHN0YXRlcyAqLwotICAgIGZvciAoc3RhZ2UgPSAwOyBzdGFnZSA8IE1BWF9URVhUVVJFUzsgc3RhZ2UrKykgewotICAgICAgIGZvciAoc3RhdGUgPSAwOyBzdGF0ZSA8IEhJR0hFU1RfVEVYVFVSRV9TVEFHRV9TVEFURTsgc3RhdGUgKz0gMSkgewotCSAgIGlmIChUaGlzLT5zdGF0ZV9ibG9jay5zZXRfZmxhZ3MudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bc3RhdGVdKSB7Ci0JICAgICAgIElEaXJlY3QzRERldmljZTdfU2V0VGV4dHVyZVN0YWdlU3RhdGUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksCi0JCQkJCQkgICAgIHN0YWdlLCBzdGF0ZSArIDEsIFRoaXMtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbc3RhZ2VdW3N0YXRlXSk7Ci0JICAgfQotICAgICAgIH0KLSAgICB9Ci19ICAgICAKLQotSFJFU1VMVAotZDNkZGV2aWNlX2NyZWF0ZShJRGlyZWN0M0REZXZpY2VJbXBsICoqb2JqLCBJRGlyZWN0RHJhd0ltcGwgKmQzZCwgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZmFjZSwgaW50IHZlcnNpb24pCi17Ci0gICAgSURpcmVjdDNERGV2aWNlSW1wbCAqb2JqZWN0OwotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCAqZ2xfb2JqZWN0OwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmY7Ci0gICAgSERDIGRldmljZV9jb250ZXh0OwotICAgIFhWaXN1YWxJbmZvICp2aXM7Ci0gICAgaW50IG51bTsKLSAgICBpbnQgdGV4X251bTsKLSAgICBYVmlzdWFsSW5mbyB0ZW1wbGF0ZTsKLSAgICBHTGVudW0gYnVmZmVyID0gR0xfRlJPTlQ7Ci0gICAgaW50IGxpZ2h0OwotICAgIAotICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoSURpcmVjdDNERGV2aWNlR0xJbXBsKSk7Ci0gICAgaWYgKG9iamVjdCA9PSBOVUxMKSByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7Ci0KLSAgICBnbF9vYmplY3QgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsICopIG9iamVjdDsKLSAgICAKLSAgICBvYmplY3QtPnJlZiA9IDE7Ci0gICAgb2JqZWN0LT5kM2QgPSBkM2Q7Ci0gICAgb2JqZWN0LT5zdXJmYWNlID0gc3VyZmFjZTsKLSAgICBvYmplY3QtPnNldF9jb250ZXh0ID0gc2V0X2NvbnRleHQ7Ci0gICAgb2JqZWN0LT5jbGVhciA9IGQzZGRldmljZV9jbGVhcl9iYWNrOwotICAgIG9iamVjdC0+c2V0X21hdHJpY2VzID0gZDNkZGV2aWNlX3NldF9tYXRyaWNlczsKLSAgICBvYmplY3QtPm1hdHJpY2VzX3VwZGF0ZWQgPSBkM2RkZXZpY2VfbWF0cmljZXNfdXBkYXRlZDsKLSAgICBvYmplY3QtPmZsdXNoX3RvX2ZyYW1lYnVmZmVyID0gZDNkZGV2aWNlX2ZsdXNoX3RvX2ZyYW1lX2J1ZmZlcjsKLSAgICBvYmplY3QtPnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIAotICAgIFRSQUNFKCIgY3JlYXRpbmcgT3BlbkdMIGRldmljZSBmb3Igc3VyZmFjZSA9ICVwLCBkM2QgPSAlcFxuIiwgc3VyZmFjZSwgZDNkKTsKLQotICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJihvYmplY3QtPmNyaXQpKTsKLQotICAgIFRSQUNFKCIgZGV2aWNlIGNyaXRpY2FsIHNlY3Rpb24gOiAlcFxuIiwgJihvYmplY3QtPmNyaXQpKTsKLQotICAgIGRldmljZV9jb250ZXh0ID0gR2V0REMoc3VyZmFjZS0+ZGRyYXdfb3duZXItPndpbmRvdyk7Ci0gICAgZ2xfb2JqZWN0LT5kaXNwbGF5ID0gZ2V0X2Rpc3BsYXkoZGV2aWNlX2NvbnRleHQpOwotICAgIGdsX29iamVjdC0+ZHJhd2FibGUgPSBnZXRfZHJhd2FibGUoZGV2aWNlX2NvbnRleHQpOwotICAgIFJlbGVhc2VEQyhzdXJmYWNlLT5kZHJhd19vd25lci0+d2luZG93LGRldmljZV9jb250ZXh0KTsKLQotICAgIEVOVEVSX0dMKCk7Ci0gICAgdGVtcGxhdGUudmlzdWFsaWQgPSAoVmlzdWFsSUQpR2V0UHJvcEEoIEdldERlc2t0b3BXaW5kb3coKSwgIl9fd2luZV94MTFfdmlzdWFsX2lkIiApOwotICAgIHZpcyA9IFhHZXRWaXN1YWxJbmZvKGdsX29iamVjdC0+ZGlzcGxheSwgVmlzdWFsSURNYXNrLCAmdGVtcGxhdGUsICZudW0pOwotICAgIGlmICh2aXMgPT0gTlVMTCkgewotICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOwotICAgICAgICBFUlIoIk5vIHZpc3VhbCBmb3VuZCAhXG4iKTsKLQlMRUFWRV9HTCgpOwotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFRSQUNFKCIgdmlzdWFsIGZvdW5kXG4iKTsKLSAgICB9Ci0KLSAgICBnbF9vYmplY3QtPmdsX2NvbnRleHQgPSBnbFhDcmVhdGVDb250ZXh0KGdsX29iamVjdC0+ZGlzcGxheSwgdmlzLAotCQkJCQkgICAgIE5VTEwsIEdMX1RSVUUpOwotCi0gICAgaWYgKGdsX29iamVjdC0+Z2xfY29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9iamVjdCk7Ci0gICAgICAgIEVSUigiRXJyb3IgaW4gY29udGV4dCBjcmVhdGlvbiAhXG4iKTsKLQlMRUFWRV9HTCgpOwotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFRSQUNFKCIgY29udGV4dCBjcmVhdGVkICglcClcbiIsIGdsX29iamVjdC0+Z2xfY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIC8qIExvb2sgZm9yIHRoZSBmcm9udCBidWZmZXIgYW5kIG92ZXJyaWRlIGl0cyBzdXJmYWNlJ3MgRmxpcCBtZXRob2QgKGlmIGluIGRvdWJsZSBidWZmZXJpbmcpICovCi0gICAgZm9yIChzdXJmID0gc3VyZmFjZTsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+c3VyZmFjZV9vd25lcikgewotICAgICAgICBpZiAoKHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyYoRERTQ0FQU19GTElQfEREU0NBUFNfRlJPTlRCVUZGRVIpKSA9PSAoRERTQ0FQU19GTElQfEREU0NBUFNfRlJPTlRCVUZGRVIpKSB7Ci0gICAgICAgICAgICBzdXJmLT5hdXhfY3R4ICA9IChMUFZPSUQpIG9iamVjdDsKLSAgICAgICAgICAgIHN1cmYtPmF1eF9kYXRhID0gKExQVk9JRCkgZ2xfb2JqZWN0LT5kcmF3YWJsZTsKLSAgICAgICAgICAgIHN1cmYtPmF1eF9mbGlwID0gb3BlbmdsX2ZsaXA7Ci0JICAgIGJ1ZmZlciA9ICBHTF9CQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogV2UgYXJlIG5vdCBkb2luZyBhbnkgZG91YmxlIGJ1ZmZlcmluZy4uIFRoZW4gZm9yY2UgT3BlbkdMIHRvIGRyYXcgb24gdGhlIGZyb250IGJ1ZmZlciAqLwotICAgIGlmIChzdXJmID09IE5VTEwpIHsKLSAgICAgICAgVFJBQ0UoIiBubyBkb3VibGUgYnVmZmVyaW5nIDogZHJhd2luZyBvbiB0aGUgZnJvbnQgYnVmZmVyXG4iKTsKLSAgICAgICAgYnVmZmVyID0gR0xfRlJPTlQ7Ci0gICAgfQotICAgIAotICAgIGZvciAoc3VyZiA9IHN1cmZhY2U7IHN1cmYgIT0gTlVMTDsgc3VyZiA9IHN1cmYtPnN1cmZhY2Vfb3duZXIpIHsKLSAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZjI7Ci0JZm9yIChzdXJmMiA9IHN1cmY7IHN1cmYyLT5wcmV2X2F0dGFjaGVkICE9IE5VTEw7IHN1cmYyID0gc3VyZjItPnByZXZfYXR0YWNoZWQpIDsKLQlmb3IgKDsgc3VyZjIgIT0gTlVMTDsgc3VyZjIgPSBzdXJmMi0+bmV4dF9hdHRhY2hlZCkgewotCSAgICBUUkFDRSgiIGNoZWNraW5nIHN1cmZhY2UgJXAgOiIsIHN1cmYyKTsKLQkgICAgaWYgKCgoc3VyZjItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTXzNEREVWSUNFKSkgPT0gKEREU0NBUFNfM0RERVZJQ0UpKSAmJgotCQkoKHN1cmYyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiAoRERTQ0FQU19aQlVGRkVSKSkgIT0gKEREU0NBUFNfWkJVRkZFUikpKSB7Ci0JICAgICAgICAvKiBPdmVycmlkZSB0aGUgTG9jayAvIFVubG9jayBmdW5jdGlvbiBmb3IgYWxsIHRoZXNlIHN1cmZhY2VzICovCi0JICAgICAgICBzdXJmMi0+bG9ja191cGRhdGVfcHJldiA9IHN1cmYyLT5sb2NrX3VwZGF0ZTsKLQkgICAgICAgIHN1cmYyLT5sb2NrX3VwZGF0ZSA9IGQzZGRldmljZV9sb2NrX3VwZGF0ZTsKLQkJc3VyZjItPnVubG9ja191cGRhdGVfcHJldiA9IHN1cmYyLT51bmxvY2tfdXBkYXRlOwotCQlzdXJmMi0+dW5sb2NrX3VwZGF0ZSA9IGQzZGRldmljZV91bmxvY2tfdXBkYXRlOwotCQkvKiBBbmQgaW5zdGFsbCBhbHNvIHRoZSBibHQgLyBibHRmYXN0IG92ZXJyaWRlcyAqLwotCQlzdXJmMi0+YXV4X2JsdCA9IGQzZGRldmljZV9ibHQ7Ci0JCXN1cmYyLT5hdXhfYmx0ZmFzdCA9IGQzZGRldmljZV9ibHRmYXN0OwotCQkKLQkJVFJBQ0UoIiBvdmVycmlkaW5nIGRpcmVjdCBzdXJmYWNlIGFjY2Vzcy5cbiIpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgVFJBQ0UoIiBubyBvdmVycmlkZS5cbiIpOwotCSAgICB9Ci0JICAgIHN1cmYyLT5kM2RkZXZpY2UgPSBvYmplY3Q7Ci0JfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgdmFyaW91cyBsaWdodCBwYXJhbWV0ZXJzICovCi0gICAgb2JqZWN0LT5udW1fc2V0X2xpZ2h0cyA9IDA7Ci0gICAgb2JqZWN0LT5tYXhfYWN0aXZlX2xpZ2h0cyA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd01heEFjdGl2ZUxpZ2h0czsKLSAgICBvYmplY3QtPmxpZ2h0X3BhcmFtZXRlcnMgPSBOVUxMOwotICAgIG9iamVjdC0+YWN0aXZlX2xpZ2h0cyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAotICAgICAgICBvYmplY3QtPm1heF9hY3RpdmVfbGlnaHRzICogc2l6ZW9mKG9iamVjdC0+YWN0aXZlX2xpZ2h0c1swXSkpOwotICAgIC8qIEZpbGwgdGhlIGFjdGl2ZSBsaWdodCBhcnJheSB3aXRoIH4wLCB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlIGFuCi0gICAgICAgaW52YWxpZCBsaWdodCBpbmRleC4gV2UgZG9uJ3QgdXNlIDAsIGJlY2F1c2UgaXQncyBhIHZhbGlkIGxpZ2h0IGluZGV4LiAqLwotICAgIGZvciAobGlnaHQ9MDsgbGlnaHQgPCBvYmplY3QtPm1heF9hY3RpdmVfbGlnaHRzOyBsaWdodCsrKQotICAgICAgICBvYmplY3QtPmFjdGl2ZV9saWdodHNbbGlnaHRdID0gfjA7Ci0KLSAgICAKLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBtYXRyaWNlcyAqLwotICAgIG9iamVjdC0+d29ybGRfbWF0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIDE2ICogc2l6ZW9mKGZsb2F0KSk7Ci0gICAgb2JqZWN0LT52aWV3X21hdCAgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgMTYgKiBzaXplb2YoZmxvYXQpKTsKLSAgICBvYmplY3QtPnByb2pfbWF0ICA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCAxNiAqIHNpemVvZihmbG9hdCkpOwotICAgIG1lbWNweShvYmplY3QtPndvcmxkX21hdCwgaWRfbWF0LCAxNiAqIHNpemVvZihmbG9hdCkpOwotICAgIG1lbWNweShvYmplY3QtPnZpZXdfbWF0ICwgaWRfbWF0LCAxNiAqIHNpemVvZihmbG9hdCkpOwotICAgIG1lbWNweShvYmplY3QtPnByb2pfbWF0ICwgaWRfbWF0LCAxNiAqIHNpemVvZihmbG9hdCkpOwotICAgIGZvciAodGV4X251bSA9IDA7IHRleF9udW0gPCBNQVhfVEVYVFVSRVM7IHRleF9udW0rKykgewotICAgICAgICBvYmplY3QtPnRleF9tYXRbdGV4X251bV0gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgMTYgKiBzaXplb2YoZmxvYXQpKTsKLQltZW1jcHkob2JqZWN0LT50ZXhfbWF0W3RleF9udW1dLCBpZF9tYXQsIDE2ICogc2l6ZW9mKGZsb2F0KSk7Ci0Jb2JqZWN0LT50ZXhfbWF0X2lzX2lkZW50aXR5W3RleF9udW1dID0gVFJVRTsKLSAgICB9Ci0gICAgCi0gICAgLyogSW5pdGlhbGlzYXRpb24gKi8KLSAgICBUUkFDRSgiIHNldHRpbmcgY3VycmVudCBjb250ZXh0XG4iKTsKLSAgICBvYmplY3QtPnNldF9jb250ZXh0KG9iamVjdCk7Ci0gICAgVFJBQ0UoIiBjdXJyZW50IGNvbnRleHQgc2V0XG4iKTsKLQotICAgIC8qIGFsbG9jYXRlIHRoZSBjbGlwcGluZyBwbGFuZXMgKi8KLSAgICBvYmplY3QtPm1heF9jbGlwcGluZ19wbGFuZXMgPSBvcGVuZ2xfZGV2aWNlX2NhcHMud01heFVzZXJDbGlwUGxhbmVzOwotICAgIG9iamVjdC0+Y2xpcHBpbmdfcGxhbmVzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIG9iamVjdC0+bWF4X2NsaXBwaW5nX3BsYW5lcyAqIHNpemVvZihkM2Q3Y2xpcHBpbmdwbGFuZSkpOwotCi0gICAgZ2xIaW50KEdMX0ZPR19ISU5ULEdMX05JQ0VTVCk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzIEdMIGNvbnRleHRzIHRvIGJlIGluIHN5bmMgd2l0aCB3aGF0IHdlIHN0b3JlIGxvY2FsbHkgKi8KLSAgICBnbENsZWFyRGVwdGgoMC4wKTsKLSAgICBnbENsZWFyU3RlbmNpbCgwKTsKLSAgICBnbENsZWFyQ29sb3IoMC4wLCAwLjAsIDAuMCwgMC4wKTsKLSAgICBnbERlcHRoTWFzayhHTF9UUlVFKTsKLSAgICBnbF9vYmplY3QtPmRlcHRoX21hc2sgPSBUUlVFOwotICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIGdsX29iamVjdC0+ZGVwdGhfdGVzdCA9IFRSVUU7Ci0gICAgZ2xEaXNhYmxlKEdMX0FMUEhBX1RFU1QpOwotICAgIGdsRGlzYWJsZShHTF9TVEVOQ0lMX1RFU1QpOwotICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOwotICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICBnbERpc2FibGUoR0xfRk9HKTsKLSAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgIGdsX29iamVjdC0+Y3VycmVudF90ZXhfZW52ID0gR0xfUkVQTEFDRTsKLSAgICBnbF9vYmplY3QtPmN1cnJlbnRfYWN0aXZlX3RleF91bml0ID0gR0xfVEVYVFVSRTBfV0lORTsKLSAgICBpZiAoR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUgIT0gTlVMTCkgewotCUdMX2V4dGVuc2lvbnMuZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwX1dJTkUpOwotICAgIH0KLSAgICBnbF9vYmplY3QtPmN1cnJlbnRfYWxwaGFfdGVzdF9yZWYgPSAwLjA7Ci0gICAgZ2xfb2JqZWN0LT5jdXJyZW50X2FscGhhX3Rlc3RfZnVuYyA9IEdMX0FMV0FZUzsKLSAgICBnbEFscGhhRnVuYyhHTF9BTFdBWVMsIDAuMCk7Ci0gICAgCi0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Ci0gICAgZ2xEcmF3QnVmZmVyKGJ1ZmZlcik7Ci0gICAgZ2xSZWFkQnVmZmVyKGJ1ZmZlcik7Ci0gICAgLyogZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOyBOZWVkIGhlcmUgdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIFpCdWZmZXIgYW5kIHRvIHJlZW5hYmxlIGl0IHdoZW4gdGhlIFpCdWZmZXIgaXMgYXR0YWNoZWQgKi8KLSAgICBMRUFWRV9HTCgpOwotCi0gICAgZ2xfb2JqZWN0LT5zdGF0ZVtXSU5FX0dMX0JVRkZFUl9CQUNLXSA9IFNVUkZBQ0VfR0w7Ci0gICAgZ2xfb2JqZWN0LT5zdGF0ZVtXSU5FX0dMX0JVRkZFUl9GUk9OVF0gPSBTVVJGQUNFX0dMOwotICAgIAotICAgIC8qIGZpbGxfZGV2aWNlX2NhcGFiaWxpdGllcyhkM2QtPmRkcmF3KTsgKi8gICAgCi0gICAgCi0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZSwgIFZUQUJMRV9JRGlyZWN0M0REZXZpY2UpOwotICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2UyLCBWVEFCTEVfSURpcmVjdDNERGV2aWNlMik7Ci0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZTMsIFZUQUJMRV9JRGlyZWN0M0REZXZpY2UzKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNERGV2aWNlNywgVlRBQkxFX0lEaXJlY3QzRERldmljZTcpOwotCi0gICAgKm9iaiA9IG9iamVjdDsKLQotICAgIFRSQUNFKCIgY3JlYXRpbmcgaW1wbGVtZW50YXRpb24gYXQgJXAuXG4iLCAqb2JqKTsKLQotICAgIC8qIEFuZCBmaW5hbGx5IHdhcm4gRDNEIHRoYXQgdGhpcyBkZXZpY2UgaXMgbm93IHByZXNlbnQgKi8KLSAgICBvYmplY3QtPmQzZC0+ZDNkX2FkZGVkX2RldmljZShvYmplY3QtPmQzZCwgb2JqZWN0KTsKLQotICAgIEluaXREZWZhdWx0U3RhdGVCbG9jaygmb2JqZWN0LT5zdGF0ZV9ibG9jaywgb2JqZWN0LT52ZXJzaW9uKTsKLSAgICAvKiBBcHBseSBkZWZhdWx0IHJlbmRlciBzdGF0ZSBhbmQgdGV4dHVyZSBzdGFnZSBzdGF0ZSB2YWx1ZXMgKi8KLSAgICBhcHBseV9yZW5kZXJfc3RhdGUob2JqZWN0LCAmb2JqZWN0LT5zdGF0ZV9ibG9jayk7Ci0gICAgYXBwbHlfdGV4dHVyZV9zdGF0ZShvYmplY3QpOwotCi0gICAgLyogQW5kIGZpbGwgdGhlIGZvZyB0YWJsZSB3aXRoIHRoZSBkZWZhdWx0IGZvZyB2YWx1ZSAqLwotICAgIGJ1aWxkX2ZvZ190YWJsZShnbF9vYmplY3QtPmZvZ190YWJsZSwgb2JqZWN0LT5zdGF0ZV9ibG9jay5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfRk9HQ09MT1IgLSAxXSk7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgdm9pZCBmaWxsX29wZW5nbF9wcmltY2FwcyhEM0RQUklNQ0FQUyAqcGMpCi17Ci0gICAgcGMtPmR3U2l6ZSA9IHNpemVvZigqcGMpOwotICAgIHBjLT5kd01pc2NDYXBzID0gRDNEUE1JU0NDQVBTX0NPTkZPUk1BTlQgfCBEM0RQTUlTQ0NBUFNfQ1VMTENDVyB8IEQzRFBNSVNDQ0FQU19DVUxMQ1cgfAotICAgICAgRDNEUE1JU0NDQVBTX0xJTkVQQVRURVJOUkVQIHwgRDNEUE1JU0NDQVBTX01BU0tQTEFORVMgfCBEM0RQTUlTQ0NBUFNfTUFTS1o7Ci0gICAgcGMtPmR3UmFzdGVyQ2FwcyA9IEQzRFBSQVNURVJDQVBTX0RJVEhFUiB8IEQzRFBSQVNURVJDQVBTX0ZPR1JBTkdFIHwgRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgfAotICAgICAgRDNEUFJBU1RFUkNBUFNfRk9HVkVSVEVYIHwgRDNEUFJBU1RFUkNBUFNfU1RJUFBMRSB8IEQzRFBSQVNURVJDQVBTX1pCSUFTIHwgRDNEUFJBU1RFUkNBUFNfWlRFU1QgfCBEM0RQUkFTVEVSQ0FQU19TVUJQSVhFTCB8Ci0JICBEM0RQUkFTVEVSQ0FQU19aRk9HOwotICAgIGlmIChHTF9leHRlbnNpb25zLm1pcG1hcF9sb2RiaWFzKSB7Ci0JcGMtPmR3UmFzdGVyQ2FwcyB8PSBEM0RQUkFTVEVSQ0FQU19NSVBNQVBMT0RCSUFTOwotICAgIH0KLSAgICBwYy0+ZHdaQ21wQ2FwcyA9IEQzRFBDTVBDQVBTX0FMV0FZUyB8IEQzRFBDTVBDQVBTX0VRVUFMIHwgRDNEUENNUENBUFNfR1JFQVRFUiB8IEQzRFBDTVBDQVBTX0dSRUFURVJFUVVBTCB8Ci0gICAgICBEM0RQQ01QQ0FQU19MRVNTIHwgRDNEUENNUENBUFNfTEVTU0VRVUFMIHwgRDNEUENNUENBUFNfTkVWRVIgfCBEM0RQQ01QQ0FQU19OT1RFUVVBTDsKLSAgICBwYy0+ZHdTcmNCbGVuZENhcHMgID0gRDNEUEJMRU5EQ0FQU19aRVJPIHwgRDNEUEJMRU5EQ0FQU19PTkUgfCBEM0RQQkxFTkRDQVBTX0RFU1RDT0xPUiB8IEQzRFBCTEVORENBUFNfSU5WREVTVENPTE9SIHwKLSAgICAgIEQzRFBCTEVORENBUFNfU1JDQUxQSEEgfCBEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwgRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgfCBEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8IEQzRFBCTEVORENBUFNfU1JDQUxQSEFTQVQgfAotCUQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBIHwgRDNEUEJMRU5EQ0FQU19CT1RISU5WU1JDQUxQSEE7Ci0gICAgcGMtPmR3RGVzdEJsZW5kQ2FwcyA9IEQzRFBCTEVORENBUFNfWkVSTyB8IEQzRFBCTEVORENBUFNfT05FIHwgRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiB8IEQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgfAotICAgICAgRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSB8IEQzRFBCTEVORENBUFNfSU5WU1JDQUxQSEEgfCBEM0RQQkxFTkRDQVBTX0RFU1RBTFBIQSB8IEQzRFBCTEVORENBUFNfSU5WREVTVEFMUEhBIHwgRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8Ci0JRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgfCBEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQTsKLSAgICBwYy0+ZHdBbHBoYUNtcENhcHMgID0gRDNEUENNUENBUFNfQUxXQVlTIHwgRDNEUENNUENBUFNfRVFVQUwgfCBEM0RQQ01QQ0FQU19HUkVBVEVSIHwgRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMIHwKLSAgICAgIEQzRFBDTVBDQVBTX0xFU1MgfCBEM0RQQ01QQ0FQU19MRVNTRVFVQUwgfCBEM0RQQ01QQ0FQU19ORVZFUiB8IEQzRFBDTVBDQVBTX05PVEVRVUFMOwotICAgIHBjLT5kd1NoYWRlQ2FwcyA9IEQzRFBTSEFERUNBUFNfQUxQSEFGTEFUQkxFTkQgfCBEM0RQU0hBREVDQVBTX0FMUEhBR09VUkFVREJMRU5EIHwgRDNEUFNIQURFQ0FQU19DT0xPUkZMQVRSR0IgfCBEM0RQU0hBREVDQVBTX0NPTE9SR09VUkFVRFJHQiB8Ci0gICAgICBEM0RQU0hBREVDQVBTX0ZPR0ZMQVQgfCBEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgfCBEM0RQU0hBREVDQVBTX1NQRUNVTEFSRkxBVFJHQiB8IEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJHT1VSQVVEUkdCOwotICAgIHBjLT5kd1RleHR1cmVDYXBzID0gRDNEUFRFWFRVUkVDQVBTX0FMUEhBIHwgRDNEUFRFWFRVUkVDQVBTX0FMUEhBUEFMRVRURSB8IEQzRFBURVhUVVJFQ0FQU19CT1JERVIgfCBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgfAotICAgICAgRDNEUFRFWFRVUkVDQVBTX1BPVzIgfCBEM0RQVEVYVFVSRUNBUFNfVFJBTlNQQVJFTkNZOwotICAgIHBjLT5kd1RleHR1cmVGaWx0ZXJDYXBzID0gRDNEUFRGSUxURVJDQVBTX0xJTkVBUiB8IEQzRFBURklMVEVSQ0FQU19MSU5FQVJNSVBMSU5FQVIgfCBEM0RQVEZJTFRFUkNBUFNfTElORUFSTUlQTkVBUkVTVCB8Ci0gICAgICBEM0RQVEZJTFRFUkNBUFNfTUlQTElORUFSIHwgRDNEUFRGSUxURVJDQVBTX01JUE5FQVJFU1QgfCBEM0RQVEZJTFRFUkNBUFNfTkVBUkVTVCB8IEQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwKLQkgIEQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfCBEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8IEQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgfCBEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiB8Ci0JICAgICAgRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVDsKLSAgICBwYy0+ZHdUZXh0dXJlQmxlbmRDYXBzID0gRDNEUFRCTEVORENBUFNfQUREIHwgRDNEUFRCTEVORENBUFNfQ09QWSB8IEQzRFBUQkxFTkRDQVBTX0RFQ0FMIHwgRDNEUFRCTEVORENBUFNfREVDQUxBTFBIQSB8IEQzRFBUQkxFTkRDQVBTX0RFQ0FMTUFTSyB8Ci0gICAgICBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURSB8IEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFQUxQSEEgfCBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURU1BU0s7Ci0gICAgcGMtPmR3VGV4dHVyZUFkZHJlc3NDYXBzID0gRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgfCBEM0RQVEFERFJFU1NDQVBTX0NMQU1QIHwgRDNEUFRBRERSRVNTQ0FQU19XUkFQIHwgRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWOwotICAgIGlmIChHTF9leHRlbnNpb25zLm1pcnJvcmVkX3JlcGVhdCkgewotCXBjLT5kd1RleHR1cmVBZGRyZXNzQ2FwcyB8PSBEM0RQVEFERFJFU1NDQVBTX01JUlJPUjsKLSAgICB9Ci0gICAgcGMtPmR3U3RpcHBsZVdpZHRoID0gMzI7Ci0gICAgcGMtPmR3U3RpcHBsZUhlaWdodCA9IDMyOwotfQotCi1zdGF0aWMgdm9pZCBmaWxsX2NhcHModm9pZCkKLXsKLSAgICBHTGludCBtYXhfY2xpcF9wbGFuZXM7Ci0gICAgR0xpbnQgZGVwdGhfYml0czsKLSAgICAKLSAgICAvKiBGaWxsIGZpcnN0IGFsbCB0aGUgZmllbGRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBvdmVycmlkZW4gbGF0ZXIgb24gd2l0aAotICAgICAgIGNvcnJlY3Qgb25lcyBmcm9tIHRoZSBHTCBjb2RlCi0gICAgKi8KLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdEZXZDYXBzID0gRDNEREVWQ0FQU19DQU5SRU5ERVJBRlRFUkZMSVAgfCBEM0RERVZDQVBTX0RSQVdQUklNVExWRVJURVggfCBEM0RERVZDQVBTX0VYRUNVVEVTWVNURU1NRU1PUlkgfAotICAgICAgRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgfCBEM0RERVZDQVBTX0ZMT0FUVExWRVJURVggfCBEM0RERVZDQVBTX1RFWFRVUkVOT05MT0NBTFZJRE1FTSB8IEQzRERFVkNBUFNfVEVYVFVSRVNZU1RFTU1FTU9SWSB8Ci0gICAgICBEM0RERVZDQVBTX1RFWFRVUkVWSURFT01FTU9SWSB8IEQzRERFVkNBUFNfVExWRVJURVhTWVNURU1NRU1PUlkgfCBEM0RERVZDQVBTX1RMVkVSVEVYVklERU9NRU1PUlkgfAotICAgICAgLyogRDNEIDcgY2FwYWJpbGl0aWVzICovCi0gICAgICBEM0RERVZDQVBTX0RSQVdQUklNSVRJVkVTMiAvKnwgRDNEREVWQ0FQU19IV1RSQU5TRk9STUFORExJR0hUKi8gfCBEM0RERVZDQVBTX0hXUkFTVEVSSVpBVElPTiB8IEQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyRVg7Ci0gICAgZmlsbF9vcGVuZ2xfcHJpbWNhcHMoJihvcGVuZ2xfZGV2aWNlX2NhcHMuZHBjTGluZUNhcHMpKTsKLSAgICBmaWxsX29wZW5nbF9wcmltY2FwcygmKG9wZW5nbF9kZXZpY2VfY2Fwcy5kcGNUcmlDYXBzKSk7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3RGV2aWNlUmVuZGVyQml0RGVwdGggID0gRERCRF8xNnxEREJEXzI0fEREQkRfMzI7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3TWluVGV4dHVyZVdpZHRoICA9IDE7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3TWluVGV4dHVyZUhlaWdodCA9IDE7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4VGV4dHVyZVdpZHRoICA9IDEwMjQ7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4VGV4dHVyZUhlaWdodCA9IDEwMjQ7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4VGV4dHVyZVJlcGVhdCA9IDE2OwotICAgIG9wZW5nbF9kZXZpY2VfY2Fwcy5kd01heFRleHR1cmVBc3BlY3RSYXRpbyA9IDEwMjQ7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4QW5pc290cm9weSA9IDA7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR2R3VhcmRCYW5kTGVmdCA9IDAuMDsKLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMuZHZHdWFyZEJhbmRSaWdodCA9IDAuMDsKLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMuZHZHdWFyZEJhbmRUb3AgPSAwLjA7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR2R3VhcmRCYW5kQm90dG9tID0gMC4wOwotICAgIG9wZW5nbF9kZXZpY2VfY2Fwcy5kdkV4dGVudHNBZGp1c3QgPSAwLjA7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3U3RlbmNpbENhcHMgPSBEM0RTVEVOQ0lMQ0FQU19ERUNSU0FUIHwgRDNEU1RFTkNJTENBUFNfSU5DUlNBVCB8IEQzRFNURU5DSUxDQVBTX0lOVkVSVCB8IEQzRFNURU5DSUxDQVBTX0tFRVAgfAotICAgICAgRDNEU1RFTkNJTENBUFNfUkVQTEFDRSB8IEQzRFNURU5DSUxDQVBTX1pFUk87Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3VGV4dHVyZU9wQ2FwcyA9IEQzRFRFWE9QQ0FQU19ESVNBQkxFIHwgRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzEgfCBEM0RURVhPUENBUFNfU0VMRUNUQVJHMiB8IEQzRFRFWE9QQ0FQU19NT0RVTEFURTRYIHwKLQlEM0RURVhPUENBUFNfTU9EVUxBVEUyWCB8IEQzRFRFWE9QQ0FQU19NT0RVTEFURSB8IEQzRFRFWE9QQ0FQU19BREQgfCBEM0RURVhPUENBUFNfQUREU0lHTkVEMlggfCBEM0RURVhPUENBUFNfQUREU0lHTkVEIHwKLQkgICAgRDNEVEVYT1BDQVBTX0JMRU5ERElGRlVTRUFMUEhBIHwgRDNEVEVYT1BDQVBTX0JMRU5EVEVYVFVSRUFMUEhBIHwgRDNEVEVYT1BDQVBTX0JMRU5ERkFDVE9SQUxQSEEgfCBEM0RURVhPUENBUFNfQkxFTkRDVVJSRU5UQUxQSEE7Ci0gICAgaWYgKEdMX2V4dGVuc2lvbnMubWF4X3RleHR1cmVfdW5pdHMgIT0gMCkgewotCW9wZW5nbF9kZXZpY2VfY2Fwcy53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gR0xfZXh0ZW5zaW9ucy5tYXhfdGV4dHVyZV91bml0czsKLQlvcGVuZ2xfZGV2aWNlX2NhcHMud01heFNpbXVsdGFuZW91c1RleHR1cmVzID0gR0xfZXh0ZW5zaW9ucy5tYXhfdGV4dHVyZV91bml0czsKLQlvcGVuZ2xfZGV2aWNlX2NhcHMuZHdGVkZDYXBzID0gRDNERlZGQ0FQU19ET05PVFNUUklQRUxFTUVOVFMgfCBHTF9leHRlbnNpb25zLm1heF90ZXh0dXJlX3VuaXRzOwotICAgIH0gZWxzZSB7Ci0Jb3BlbmdsX2RldmljZV9jYXBzLndNYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSAxOwotCW9wZW5nbF9kZXZpY2VfY2Fwcy53TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSAxOwotCW9wZW5nbF9kZXZpY2VfY2Fwcy5kd0ZWRkNhcHMgPSBEM0RGVkZDQVBTX0RPTk9UU1RSSVBFTEVNRU5UUyB8IDE7Ci0gICAgfQotICAgIG9wZW5nbF9kZXZpY2VfY2Fwcy5kd01heEFjdGl2ZUxpZ2h0cyA9IDE2OwotICAgIG9wZW5nbF9kZXZpY2VfY2Fwcy5kdk1heFZlcnRleFcgPSAxMDAwMDAwMDAuMDsgLyogTm8gaWRlYSBleGFjdGx5IHdoYXQgdG8gcHV0IGhlcmUuLi4gKi8KLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMuZGV2aWNlR1VJRCA9IElJRF9JRGlyZWN0M0RUbkxIYWxEZXZpY2U7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLndNYXhVc2VyQ2xpcFBsYW5lcyA9IDE7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLndNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzID0gMDsKLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdWZXJ0ZXhQcm9jZXNzaW5nQ2FwcyA9IEQzRFZUWFBDQVBTX1RFWEdFTiB8IEQzRFZUWFBDQVBTX01BVEVSSUFMU09VUkNFNyB8IEQzRFZUWFBDQVBTX1ZFUlRFWEZPRyB8Ci0JRDNEVlRYUENBUFNfRElSRUNUSU9OQUxMSUdIVFMgfCBEM0RWVFhQQ0FQU19QT1NJVElPTkFMTElHSFRTIHwgRDNEVlRYUENBUFNfTE9DQUxWSUVXRVI7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3UmVzZXJ2ZWQxID0gMDsKLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdSZXNlcnZlZDIgPSAwOwotICAgIG9wZW5nbF9kZXZpY2VfY2Fwcy5kd1Jlc2VydmVkMyA9IDA7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3UmVzZXJ2ZWQ0ID0gMDsKLQotICAgIC8qIEFuZCBub3cgc29tZSBHTCBvdmVycmlkZXMgOi0pICovCi0gICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAoR0xpbnQgKikgJm9wZW5nbF9kZXZpY2VfY2Fwcy5kd01heFRleHR1cmVXaWR0aCk7Ci0gICAgb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4VGV4dHVyZUhlaWdodCA9IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd01heFRleHR1cmVXaWR0aDsKLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdNYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdNYXhUZXh0dXJlV2lkdGg7Ci0gICAgVFJBQ0UoIjogbWF4IHRleHR1cmUgc2l6ZSA9ICVsZFxuIiwgb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4VGV4dHVyZVdpZHRoKTsKLSAgICAKLSAgICBnbEdldEludGVnZXJ2KEdMX01BWF9MSUdIVFMsIChHTGludCAqKSAmb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4QWN0aXZlTGlnaHRzKTsKLSAgICBUUkFDRSgiOiBtYXggYWN0aXZlIGxpZ2h0cyA9ICVsZFxuIiwgb3BlbmdsX2RldmljZV9jYXBzLmR3TWF4QWN0aXZlTGlnaHRzKTsKLQotICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0NMSVBfUExBTkVTLCAmbWF4X2NsaXBfcGxhbmVzKTsKLSAgICBvcGVuZ2xfZGV2aWNlX2NhcHMud01heFVzZXJDbGlwUGxhbmVzID0gbWF4X2NsaXBfcGxhbmVzOwotICAgIFRSQUNFKCI6IG1heCBjbGlwcGluZyBwbGFuZXMgPSAlZFxuIiwgb3BlbmdsX2RldmljZV9jYXBzLndNYXhVc2VyQ2xpcFBsYW5lcyk7Ci0KLSAgICBnbEdldEludGVnZXJ2KEdMX0RFUFRIX0JJVFMsICZkZXB0aF9iaXRzKTsKLSAgICBUUkFDRSgiOiBaIGJpdHMgPSAlZFxuIiwgZGVwdGhfYml0cyk7Ci0gICAgc3dpdGNoIChkZXB0aF9iaXRzKSB7Ci0gICAgICAgIGNhc2UgMTY6IG9wZW5nbF9kZXZpY2VfY2Fwcy5kd0RldmljZVpCdWZmZXJCaXREZXB0aCA9IEREQkRfMTY7IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdEZXZpY2VaQnVmZmVyQml0RGVwdGggPSBEREJEXzE2fEREQkRfMjQ7IGJyZWFrOwotICAgICAgICBjYXNlIDMyOgotICAgICAgICBkZWZhdWx0OiBvcGVuZ2xfZGV2aWNlX2NhcHMuZHdEZXZpY2VaQnVmZmVyQml0RGVwdGggPSBEREJEXzE2fEREQkRfMjR8RERCRF8zMjsgYnJlYWs7Ci0gICAgfQotfQotCi1CT09MCi1kM2RkZXZpY2VfaW5pdF9hdF9zdGFydHVwKHZvaWQgKmdsX2hhbmRsZSkKLXsKLSAgICBYVmlzdWFsSW5mbyB0ZW1wbGF0ZTsKLSAgICBYVmlzdWFsSW5mbyAqdmlzOwotICAgIEhEQyBkZXZpY2VfY29udGV4dDsKLSAgICBEaXNwbGF5ICpkaXNwbGF5OwotICAgIFZpc3VhbCAqdmlzdWFsOwotICAgIERyYXdhYmxlIGRyYXdhYmxlID0gKERyYXdhYmxlKSBHZXRQcm9wQShHZXREZXNrdG9wV2luZG93KCksICJfX3dpbmVfeDExX3dob2xlX3dpbmRvdyIpOwotICAgIFhXaW5kb3dBdHRyaWJ1dGVzIHdpbl9hdHRyOwotICAgIEdMWENvbnRleHQgZ2xfY29udGV4dDsKLSAgICBpbnQgbnVtOwotICAgIGNvbnN0IGNoYXIgKmdsRXh0ZW5zaW9uczsKLSAgICBjb25zdCBjaGFyICpnbFZlcnNpb247Ci0gICAgY29uc3QgY2hhciAqZ2xYRXh0ZW5zaW9ucyA9IE5VTEw7Ci0gICAgY29uc3Qgdm9pZCAqKCpwZ2xYR2V0UHJvY0FkZHJlc3NBUkIpKGNvbnN0IEdMdWJ5dGUgKikgPSBOVUxMOwotICAgIGludCBtYWpvciwgbWlub3IsIHBhdGNoLCBudW1fcGFyc2VkOwotICAgIAotICAgIFRSQUNFKCJJbml0aWFsaXppbmcgR0wuLi5cbiIpOwotCi0gICAgaWYgKCFkcmF3YWJsZSkKLSAgICB7Ci0gICAgICAgIFdBUk4oIngxMWRydiBub3QgbG9hZGVkIC0gRDNEIHN1cHBvcnQgZGlzYWJsZWQhXG4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICAKLSAgICAvKiBHZXQgYSBkZWZhdWx0IHJlbmRlcmluZyBjb250ZXh0IHRvIGhhdmUgdGhlICdjYXBzJyBmdW5jdGlvbiBxdWVyeSBzb21lIGluZm8gZnJvbSBHTCAqLyAgICAKLSAgICBkZXZpY2VfY29udGV4dCA9IEdldERDKDApOwotICAgIGRpc3BsYXkgPSBnZXRfZGlzcGxheShkZXZpY2VfY29udGV4dCk7Ci0gICAgUmVsZWFzZURDKDAsIGRldmljZV9jb250ZXh0KTsKLQotICAgIEVOVEVSX0dMKCk7Ci0gICAgaWYgKFhHZXRXaW5kb3dBdHRyaWJ1dGVzKGRpc3BsYXksIGRyYXdhYmxlLCAmd2luX2F0dHIpKSB7Ci0JdmlzdWFsID0gd2luX2F0dHIudmlzdWFsOwotICAgIH0gZWxzZSB7Ci0JdmlzdWFsID0gRGVmYXVsdFZpc3VhbChkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKLSAgICB9Ci0gICAgdGVtcGxhdGUudmlzdWFsaWQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKHZpc3VhbCk7Ci0gICAgdmlzID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwgVmlzdWFsSURNYXNrLCAmdGVtcGxhdGUsICZudW0pOwotICAgIGlmICh2aXMgPT0gTlVMTCkgewotCUxFQVZFX0dMKCk7Ci0JV0FSTigiRXJyb3IgY3JlYXRpbmcgdmlzdWFsIGluZm8gZm9yIGNhcGFiaWxpdGllcyBpbml0aWFsaXphdGlvbiAtIEQzRCBzdXBwb3J0IGRpc2FibGVkICFcbiIpOwotCXJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZ2xfY29udGV4dCA9IGdsWENyZWF0ZUNvbnRleHQoZGlzcGxheSwgdmlzLCBOVUxMLCBHTF9UUlVFKTsKLSAgICBYRnJlZSh2aXMpOwotCi0gICAgaWYgKGdsX2NvbnRleHQgPT0gTlVMTCkgewotCUxFQVZFX0dMKCk7Ci0JV0FSTigiRXJyb3IgY3JlYXRpbmcgZGVmYXVsdCBjb250ZXh0IGZvciBjYXBhYmlsaXRpZXMgaW5pdGlhbGl6YXRpb24gLSBEM0Qgc3VwcG9ydCBkaXNhYmxlZCAhXG4iKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChnbFhNYWtlQ3VycmVudChkaXNwbGF5LCBkcmF3YWJsZSwgZ2xfY29udGV4dCkgPT0gRmFsc2UpIHsKLQlnbFhEZXN0cm95Q29udGV4dChkaXNwbGF5LCBnbF9jb250ZXh0KTsKLQlMRUFWRV9HTCgpOwotCVdBUk4oIkVycm9yIHNldHRpbmcgZGVmYXVsdCBjb250ZXh0IGFzIGN1cnJlbnQgZm9yIGNhcGFiaWxpdGllcyBpbml0aWFsaXphdGlvbiAtIEQzRCBzdXBwb3J0IGRpc2FibGVkICFcbiIpOwotCXJldHVybiBGQUxTRTsJCi0gICAgfQotICAgIAotICAgIC8qIFRoZW4sIHF1ZXJ5IGFsbCBleHRlbnNpb25zICovCi0gICAgZ2xYRXh0ZW5zaW9ucyA9IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsgLyogTm90ZTogbm90IHVzZWQgcmlnaHQgbm93IGJ1dCB3aWxsIGZvciBQQnVmZmVycyAqLwotICAgIGdsRXh0ZW5zaW9ucyA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOwotICAgIGdsVmVyc2lvbiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOwotICAgIGlmIChnbF9oYW5kbGUgIT0gTlVMTCkgewotCXBnbFhHZXRQcm9jQWRkcmVzc0FSQiA9IHdpbmVfZGxzeW0oZ2xfaGFuZGxlLCAiZ2xYR2V0UHJvY0FkZHJlc3NBUkIiLCBOVUxMLCAwKTsKLSAgICB9Ci0gICAgCi0gICAgLyogUGFyc2UgdGhlIEdMIHZlcnNpb24gc3RyaW5nICovCi0gICAgbnVtX3BhcnNlZCA9IHNzY2FuZihnbFZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmcGF0Y2gpOwotICAgIGlmIChudW1fcGFyc2VkID09IDEpIHsKLQltaW5vciA9IDA7Ci0JcGF0Y2ggPSAwOwotICAgIH0gZWxzZSBpZiAobnVtX3BhcnNlZCA9PSAyKSB7Ci0JcGF0Y2ggPSAwOwotICAgIH0KLSAgICBUUkFDRSgiR0wgdmVyc2lvbiAlZC4lZC4lZFxuIiwgbWFqb3IsIG1pbm9yLCBwYXRjaCk7Ci0KLSAgICAvKiBBbmQgc3RhcnRzIHRvIGZpbGwgdGhlIGV4dGVuc2lvbiBjb250ZXh0IHByb3Blcmx5ICovCi0gICAgbWVtc2V0KCZHTF9leHRlbnNpb25zLCAwLCBzaXplb2YoR0xfZXh0ZW5zaW9ucykpOwotICAgIFRSQUNFKCJHTCBzdXBwb3J0cyBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB1c2VkIGJ5IFdpbmUgOlxuIik7Ci0gICAgCi0gICAgLyogTWlycm9yZWQgUmVwZWF0IGV4dGVuc2lvbiA6Ci0gICAgICAgIC0gR0xfQVJCX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0Ci0JLSBHTF9JQk1fdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKLQktIEdMID49IDEuNAotICAgICovCi0gICAgaWYgKChzdHJzdHIoZ2xFeHRlbnNpb25zLCAiR0xfQVJCX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0IikpIHx8Ci0JKHN0cnN0cihnbEV4dGVuc2lvbnMsICJHTF9JQk1fdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQiKSkgfHwKLQkobWFqb3IgPiAxKSB8fAotCSgobWFqb3IgPT0gMSkgJiYgKG1pbm9yID49IDQpKSkgewotCVRSQUNFKCIgLSBtaXJyb3JlZCByZXBlYXRcbiIpOwotCUdMX2V4dGVuc2lvbnMubWlycm9yZWRfcmVwZWF0ID0gVFJVRTsKLSAgICB9Ci0KLSAgICAvKiBUZXh0dXJlIExPRCBCaWFzIDoKLSAgICAgICAgLSBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcwotICAgICovCi0gICAgaWYgKHN0cnN0cihnbEV4dGVuc2lvbnMsICJHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyIpKSB7Ci0JVFJBQ0UoIiAtIHRleHR1cmUgbG9kIGJpYXNcbiIpOwotCUdMX2V4dGVuc2lvbnMubWlwbWFwX2xvZGJpYXMgPSBUUlVFOwotICAgIH0KLQotICAgIC8qIEZvciBhbGwgc3Vic2VxdWVudCBleHRlbnNpb25zLCB3ZSBuZWVkIGdsWEdldFByb2NBZGRyZXNzICovCi0gICAgaWYgKHBnbFhHZXRQcm9jQWRkcmVzc0FSQiAhPSBOVUxMKSB7Ci0JLyogTXVsdGktdGV4dHVyaW5nIDoKLQkgICAgLSBHTF9BUkJfbXVsdGl0ZXh0dXJlCi0JICAgIC0gR0wgPj0gMS4yLjEKLQkqLwotCWlmICgoc3Ryc3RyKGdsRXh0ZW5zaW9ucywgIkdMX0FSQl9tdWx0aXRleHR1cmUiKSkgfHwKLQkgICAgKG1ham9yID4gMSkgfHwKLQkgICAgKChtYWpvciA9PSAxKSAmJiAobWlub3IgPiAyKSkgfHwKLQkgICAgKChtYWpvciA9PSAxKSAmJiAobWlub3IgPT0gMikgJiYgKHBhdGNoID49IDEpKSkgewotCSAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1VOSVRTX1dJTkUsICYoR0xfZXh0ZW5zaW9ucy5tYXhfdGV4dHVyZV91bml0cykpOwotCSAgICBUUkFDRSgiIC0gbXVsdGktdGV4dHVyaW5nICglZCBzdGFnZXMpXG4iLCBHTF9leHRlbnNpb25zLm1heF90ZXh0dXJlX3VuaXRzKTsKLQkgICAgLyogV2UgcXVlcnkgdGhlIEFSQiB2ZXJzaW9uIHRvIGJlIHRoZSBtb3N0IHBvcnRhYmxlIHdlIGNhbi4uLiAqLwotCSAgICBHTF9leHRlbnNpb25zLmdsQWN0aXZlVGV4dHVyZSA9IHBnbFhHZXRQcm9jQWRkcmVzc0FSQiggKGNvbnN0IEdMdWJ5dGUgKikgImdsQWN0aXZlVGV4dHVyZUFSQiIpOwotCSAgICBHTF9leHRlbnNpb25zLmdsTXVsdGlUZXhDb29yZFswXSA9IHBnbFhHZXRQcm9jQWRkcmVzc0FSQiggKGNvbnN0IEdMdWJ5dGUgKikgImdsTXVsdGlUZXhDb29yZDFmdkFSQiIpOwotCSAgICBHTF9leHRlbnNpb25zLmdsTXVsdGlUZXhDb29yZFsxXSA9IHBnbFhHZXRQcm9jQWRkcmVzc0FSQiggKGNvbnN0IEdMdWJ5dGUgKikgImdsTXVsdGlUZXhDb29yZDJmdkFSQiIpOwotCSAgICBHTF9leHRlbnNpb25zLmdsTXVsdGlUZXhDb29yZFsyXSA9IHBnbFhHZXRQcm9jQWRkcmVzc0FSQiggKGNvbnN0IEdMdWJ5dGUgKikgImdsTXVsdGlUZXhDb29yZDNmdkFSQiIpOwotCSAgICBHTF9leHRlbnNpb25zLmdsTXVsdGlUZXhDb29yZFszXSA9IHBnbFhHZXRQcm9jQWRkcmVzc0FSQiggKGNvbnN0IEdMdWJ5dGUgKikgImdsTXVsdGlUZXhDb29yZDRmdkFSQiIpOwotCSAgICBHTF9leHRlbnNpb25zLmdsQ2xpZW50QWN0aXZlVGV4dHVyZSA9IHBnbFhHZXRQcm9jQWRkcmVzc0FSQiggKGNvbnN0IEdMdWJ5dGUgKikgImdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQiIpOwotCX0gZWxzZSB7Ci0JICAgIEdMX2V4dGVuc2lvbnMubWF4X3RleHR1cmVfdW5pdHMgPSAwOwotCX0KLQotCWlmIChzdHJzdHIoZ2xFeHRlbnNpb25zLCAiR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YyIpKSB7Ci0JICAgIFRSQUNFKCIgLSBTM1RDIGNvbXByZXNzaW9uIHN1cHBvcnRlZFxuIik7Ci0JICAgIEdMX2V4dGVuc2lvbnMuczN0Y19jb21wcmVzc2VkX3RleHR1cmUgPSBUUlVFOwotCSAgICBHTF9leHRlbnNpb25zLmdsQ29tcHJlc3NlZFRleEltYWdlMkQgPSBwZ2xYR2V0UHJvY0FkZHJlc3NBUkIoIChjb25zdCBHTHVieXRlICopICJnbENvbXByZXNzZWRUZXhJbWFnZTJEQVJCIik7Ci0JICAgIEdMX2V4dGVuc2lvbnMuZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCA9IHBnbFhHZXRQcm9jQWRkcmVzc0FSQiggKGNvbnN0IEdMdWJ5dGUgKikgImdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkRBUkIiKTsKLQl9Ci0gICAgfQotICAgIAotICAgIC8qIEZpbGwgdGhlIEQzRCBjYXBhYmlsaXRpZXMgYWNjb3JkaW5nIHRvIHdoYXQgR0wgdGVsbHMgdXMuLi4gKi8KLSAgICBmaWxsX2NhcHMoKTsKLQotICAgIC8qIEFuZCBmcmVlcyB0aGlzIG5vdy11c2VsZXNzIGNvbnRleHQgKi8KLSAgICBnbFhNYWtlQ3VycmVudChkaXNwbGF5LCBOb25lLCBOVUxMKTsKLSAgICBnbFhEZXN0cm95Q29udGV4dChkaXNwbGF5LCBnbF9jb250ZXh0KTsKLSAgICBMRUFWRV9HTCgpOwotICAgIAotICAgIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kaXJlY3QzZC5jIGIvZGxscy9kZHJhdy9kaXJlY3QzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTFlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RpcmVjdDNkLmMKQEAgLTAsMCArMSwxMzk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKKyNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDT0JKTUFDUk9TCisKKyNpbmNsdWRlICJ3aW5kZWYuaCIKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCisjaW5jbHVkZSAid2lubmxzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJ3aW5nZGkuaCIKKyNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImV4Y3B0LmgiCisKKyNpbmNsdWRlICJkZHJhdy5oIgorI2luY2x1ZGUgImQzZC5oIgorCisjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgorCitXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2Q3KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJVW5rbm93biBNZXRob2RzLiBDb21tb24gZm9yIFZlcnNpb24gMSwgMiwgMyBhbmQgNworICoKKyAqIFRoZXNlIGFyZSB0aHVua3Mgd2hpY2ggcmVsYXkgdG8gSURpcmVjdERyYXcuIFNlZSBkZHJhdy5jIGZvcgorICogZGV0YWlscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNESW1wbF83X1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRDcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3N1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3N19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIG9iaik7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfMl9RdWVyeUludGVyZmFjZShJRGlyZWN0M0QyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByZWZpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgb2JqKTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNESW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRCAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgb2JqKTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfN19BZGRSZWYoSURpcmVjdDNENyAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCkgOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfM19BZGRSZWYoSURpcmVjdDNEMyAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCkgOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfMl9BZGRSZWYoSURpcmVjdDNEMiAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCkgOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfMV9BZGRSZWYoSURpcmVjdDNEICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3XG4iLCBUaGlzKTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzdfUmVsZWFzZShJRGlyZWN0M0Q3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3NyIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3N19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzNfUmVsZWFzZShJRGlyZWN0M0QzICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3NyIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3N19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzJfUmVsZWFzZShJRGlyZWN0M0QyICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3NyIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3N19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0QgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCkgOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzciLCBUaGlzKTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0QgTWV0aG9kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRDo6SW5pdGlhbGl6ZQorICoKKyAqIEluaXRpYWxpemVzIHRoZSBJRGlyZWN0M0QgaW50ZXJmYWNlLiBUaGlzIGlzIGEgbm8tb3AgaW1wbGVtZW50YXRpb24sCisgKiBhcyBhbGwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBhdCBjcmVhdGUgdGltZS4KKyAqCisgKiBWZXJzaW9uIDEKKyAqCisgKiBQYXJhbXM6CisgKiAgcmVmaWlkOiA/CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIG5vLW9wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RJbXBsXzFfSW5pdGlhbGl6ZShJRGlyZWN0M0QgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglcykgbm8tb3AuLi5cbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSk7CisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0Q3OjpFbnVtRGV2aWNlcworICoKKyAqIFRoZSBFbnVtRGV2aWNlcyBtZXRob2QgZm9yIElEaXJlY3QzRDcuIEl0IGVudW1lcmF0ZXMgYWxsIHN1cHBvcnRlZAorICogRDNENyBkZXZpY2VzLiBDdXJyZW50bHkgdGhlcmUncyBvbmx5IG9uZS4KKyAqCisgKiBQYXJhbXM6CisgKiAgQ2FsbGJhY2s6IEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW51bWVyYXRlZCBkZXZpY2UKKyAqICBDb250ZXh0OiBQb2ludGVyIHRvIHBhc3MgYmFjayB0byB0aGUgYXBwCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0ssIG9yIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIEdldENhcHMgY2FsbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNESW1wbF83X0VudW1EZXZpY2VzKElEaXJlY3QzRDcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0s3IENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOworICAgIGNoYXIgaW50ZXJmYWNlX25hbWVbXSA9ICJXSU5FIERpcmVjdDNENyB1c2luZyBXaW5lRDNEIjsKKyAgICBjaGFyIGRldmljZV9uYW1lW10gPSAiV2luZSBEM0Q3IGRldmljZSI7CisgICAgRDNEREVWSUNFREVTQzcgZGRlc2M7CisgICAgRDNEREVWSUNFREVTQyBvbGREZXNjOworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgQ2FsbGJhY2ssIENvbnRleHQpOworCisgICAgVFJBQ0UoIiglcCkgRW51bWVyYXRpbmcgV2luZUQzRCBEM0RldmljZTcgaW50ZXJmYWNlXG4iLCBUaGlzKTsKKyAgICBociA9IElEaXJlY3QzREltcGxfR2V0Q2FwcyhUaGlzLT53aW5lRDNELCAmb2xkRGVzYywgJmRkZXNjKTsKKyAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKKyAgICBDYWxsYmFjayhpbnRlcmZhY2VfbmFtZSwgZGV2aWNlX25hbWUsICZkZGVzYywgQ29udGV4dCk7CisKKyAgICBUUkFDRSgiKCVwKSBFbmQgb2YgZW51bWVyYXRpb25cbiIsIFRoaXMpOworICAgIHJldHVybiBEM0RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEMzo6RW51bURldmljZXMKKyAqCisgKiBFbnVtZXJhdGVzIGFsbCBzdXBwb3J0ZWQgRGlyZWN0M0REZXZpY2UgaW50ZXJmYWNlcy4gVGhpcyBpcyB0aGUKKyAqIGltcGxlbWVudGF0aW9uIGZvciBEaXJlY3QzRCAxIHRvIERpcmVjM0QgMywgVmVyc2lvbiA3IGhhcyBpdCdzIG93bi4KKyAqCisgKiBWZXJzaW9uIDEsIDIgYW5kIDMKKyAqCisgKiBQYXJhbXM6CisgKiAgQ2FsbGJhY2s6IEFwcGxpY2F0aW9uLXByb3ZpZGVkIHJvdXRpbmUgdG8gY2FsbCBmb3IgZWFjaCBlbnVtZXJhdGVkIGRldmljZQorICogIENvbnRleHQ6IFBvaW50ZXIgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzLAorICogIFRoZSByZXN1bHQgb2YgSURpcmVjdDNESW1wbF9HZXRDYXBzIGlmIGl0IGZhaWxlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNESW1wbF8zX0VudW1EZXZpY2VzKElEaXJlY3QzRDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOworICAgIEQzRERFVklDRURFU0MgZHJlZiwgZDEsIGQyOworICAgIEQzRERFVklDRURFU0M3IG5ld0Rlc2M7CisgICAgSFJFU1VMVCBocjsKKworICAgIC8qIFNvbWUgZ2FtZXMgKE1vdG9yYWNlciAyIGRlbW8pIGhhdmUgdGhlIGJhZCBpZGVhIHRvIG1vZGlmeSB0aGUgZGV2aWNlIG5hbWUgc3RyaW5nLgorICAgICAgIExldCdzIHB1dCB0aGUgc3RyaW5nIGluIGEgc3VmZmljaWVudGx5IHNpemVkIGFycmF5IGluIHdyaXRhYmxlIG1lbW9yeS4gKi8KKyAgICBjaGFyIGRldmljZV9uYW1lWzUwXTsKKyAgICBzdHJjcHkoZGV2aWNlX25hbWUsImRpcmVjdDNkIik7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgQ2FsbGJhY2ssIENvbnRleHQpOworCisgICAgaHIgPSBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+d2luZUQzRCwgJmRyZWYsICZuZXdEZXNjKTsKKyAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKKworICAgIC8qIERvIEkgaGF2ZSB0byBlbnVtZXJhdGUgdGhlIHJlZmVyZW5jZSBpZD8gSSB0cnkgd2l0aG91dC4gTm90ZSBmcm9tIG9sZCBkM2Q3OgorICAgICAqICJJdCBzZWVtcyB0aGF0IGVudW1lcmF0aW5nIHRoZSByZWZlcmVuY2UgSUlEIG9uIERpcmVjdDNEIDEgZ2FtZXMKKyAgICAgKiAoQXZQIC8gTW90b3JhY2VyMikgYnJlYWtzIHRoZW0iLiBTbyBkbyBub3QgZW51bWVyYXRlIHRoaXMgaWlkIGluIFYxCisgICAgICoKKyAgICAgKiBUaGVyZSdzIGEgcmVnaXN0cnkga2V5IEhLTE1cU29mdHdhcmVcTWljcm9zb2Z0XERpcmVjdDNEXERyaXZlcnMsIEVudW1SZWZlcmVuY2UKKyAgICAgKiB3aGljaCBlbmFibGVzIC8gZGlzYWJsZXMgZW51bWVyYXRpbmcgdGhlIHJlZmVyZW5jZSByYXN0ZXJpemVyLiBJdCdzIGEgRFdPUkQsCisgICAgICogMCBtZWFucyBkaXNhYmxlZCwgMiBtZWFucyBlbmFibGVkLiBUaGUgZW5hYmxlcmVmcmFzdC5yZWcgYW5kIGRpc2FibGVyZWZyYXN0LnJlZworICAgICAqIGZpbGVzIGluIHRoZSBEaXJlY3RYIDcuMCBzZGsgZGVtbyBkaXJlY3Rvcnkgc3VnZ2VzdCB0aGlzLgorICAgICAqLworCisgICAgVFJBQ0UoIiglcCkgRW51bWVyYXRpbmcgV2luZUQzRCBEM0REZXZpY2UgaW50ZXJmYWNlXG4iLCBUaGlzKTsKKyAgICBkMSA9IGRyZWY7CisgICAgZDIgPSBkcmVmOworICAgIENhbGxiYWNrKCAoTFBJSUQpICZJSURfRDNEREVWSUNFX1dpbmVEM0QsICJXaW5lIEQzRERldmljZSB1c2luZyBXaW5lRDNEIGFuZCBPcGVuR0wiLCBkZXZpY2VfbmFtZSwgJmQxLCAmZDIsIENvbnRleHQpOworICAgIFRSQUNFKCIoJXApIEVuZCBvZiBlbnVtZXJhdGlvblxuIiwgVGhpcyk7CisgICAgaWYoaHIgIT0gRDNERU5VTVJFVF9PSykgcmV0dXJuIEQzRF9PSzsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNESW1wbF8yX0VudW1EZXZpY2VzKElEaXJlY3QzRDIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgQ2FsbGJhY2ssIENvbnRleHQpOworICAgIHJldHVybiBJRGlyZWN0M0QzX0VudW1EZXZpY2VzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfMV9FbnVtRGV2aWNlcyhJRGlyZWN0M0QgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDYWxsYmFjaywgQ29udGV4dCk7CisgICAgcmV0dXJuIElEaXJlY3QzRDNfRW51bURldmljZXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEMzo6Q3JlYXRlTGlnaHQKKyAqCisgKiBDcmVhdGVzIGFuIElEaXJlY3QzRExpZ2h0IGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBpbgorICogRGlyZWN0M0QzIG9yIGVhcmxpZXIgZm9yIGxpZ2h0aW5nLiBJbiBEaXJlY3QzRDcgaXQgaGFzIGJlZW4gcmVwbGFjZWQKKyAqIGJ5IHRoZSBESVJFQ1QzRExJR0hUNyBzdHJ1Y3R1cmUuIFdpbmUncyBEaXJlY3QzRExpZ2h0IGltcGxlbWVudGF0aW9uCisgKiB1c2VzIHRoZSBJRGlyZWN0M0REZXZpY2U3IGludGVyZmFjZSB3aXRoIEQzRDcgbGlnaHRzLgorICoKKyAqIFZlcnNpb24gMSwgMiBhbmQgMworICoKKyAqIFBhcmFtczoKKyAqICBMaWdodDogQWRkcmVzcyB0byBzdG9yZSB0aGUgbmV3IGludGVyZmFjZSBwb2ludGVyCisgKiAgVW5rT3V0ZXI6IEJhc2ljYWxseSBmb3IgYWdncmVnYXRpb24sIGJ1dCBkZHJhdyBkb2Vzbid0IHN1cHBvcnQgaXQuCisgKiAgICAgICAgICAgIE11c3QgYmUgTlVMTAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqICBDTEFTU19FX05PQUdHUkVHQVRJT04gaWYgVW5rT3V0ZXIgIT0gTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNESW1wbF8zX0NyZWF0ZUxpZ2h0KElEaXJlY3QzRDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqTGlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyICkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RMaWdodEltcGwgKm9iamVjdDsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBMaWdodCwgVW5rT3V0ZXIpOworCisgICAgaWYoVW5rT3V0ZXIpCisgICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CisKKyAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElEaXJlY3QzRExpZ2h0SW1wbCkpOworICAgIGlmIChvYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOworCisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRExpZ2h0LCBJRGlyZWN0M0RMaWdodF9WdGJsKTsKKyAgICBvYmplY3QtPnJlZiA9IDE7CisgICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CisgICAgb2JqZWN0LT5uZXh0ID0gTlVMTDsKKyAgICBvYmplY3QtPmFjdGl2ZV92aWV3cG9ydCA9IE5VTEw7CisKKyAgICAvKiBVcGRhdGUgZnVuY3Rpb25zICovCisgICAgb2JqZWN0LT5hY3RpdmF0ZSA9IGxpZ2h0X3VwZGF0ZTsKKyAgICBvYmplY3QtPmRlc2FjdGl2YXRlID0gbGlnaHRfYWN0aXZhdGU7CisgICAgb2JqZWN0LT51cGRhdGUgPSBsaWdodF9kZXNhY3RpdmF0ZTsKKyAgICBvYmplY3QtPmFjdGl2ZV92aWV3cG9ydCA9IE5VTEw7CisKKyAgICAqTGlnaHQgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRExpZ2h0KTsKKworICAgIFRSQUNFKCIoJXApIGNyZWF0aW5nIGltcGxlbWVudGF0aW9uIGF0ICVwLlxuIiwgVGhpcywgb2JqZWN0KTsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZUxpZ2h0KElEaXJlY3QzRDIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqRGlyZWN0M0RMaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEaXJlY3QzRExpZ2h0LCBVbmtPdXRlcik7CisgICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlTGlnaHQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0M0RMaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZUxpZ2h0KElEaXJlY3QzRCAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETGlnaHQgKipEaXJlY3QzRExpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0RMaWdodCwgVW5rT3V0ZXIpOworICAgIHJldHVybiBJRGlyZWN0M0QzX0NyZWF0ZUxpZ2h0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdDNETGlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rT3V0ZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRDM6OkNyZWF0ZU1hdGVyaWFsCisgKgorICogQ3JlYXRlcyBhbiBJRGlyZWN0M0RNYXRlcmlhbCBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgRGlyZWN0M0QzCisgKiBhbmQgb2xkZXIgdmVyc2lvbnMuIFRoZSBJRGlyZWN0M0RNYXRlcmlhbCBpbXBsZW1lbnRhdGlvbiB3cmFwcyBpdCdzCisgKiBmdW5jdGlvbmFsaXR5IHRvIElEaXJlY3QzRERldmljZTc6OlNldE1hdGVyaWFsIGFuZCBmcmllbmRzLgorICoKKyAqIFZlcnNpb24gMSwgMiBhbmQgMworICoKKyAqIFBhcmFtczoKKyAqICBNYXRlcmlhbDogQWRkcmVzcyB0byBzdG9yZSB0aGUgbmV3IGludGVyZmFjZSdzIHBvaW50ZXIgdG8KKyAqICBVbmtPdXRlcjogQmFzaWNhbGx5IGZvciBhZ2dyZWdhdGlvbiwgYnV0IGRkcmF3IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKyAqICAgICAgICAgICAgTXVzdCBiZSBOVUxMCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX09VVE9GTUVNT1JZIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorICogIENMQVNTX0VfTk9BR0dSRUdBVElPTiBpZiBVbmtPdXRlciAhPSBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlTWF0ZXJpYWwoSURpcmVjdDNEMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETWF0ZXJpYWwzICoqTWF0ZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyICkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGwgKm9iamVjdDsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBNYXRlcmlhbCwgVW5rT3V0ZXIpOworCisgICAgaWYoVW5rT3V0ZXIpCisgICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CisKKyAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElEaXJlY3QzRE1hdGVyaWFsSW1wbCkpOworICAgIGlmIChvYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOworCisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsMywgSURpcmVjdDNETWF0ZXJpYWwzX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMl9WdGJsKTsKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsX1Z0YmwpOworICAgIG9iamVjdC0+cmVmID0gMTsKKyAgICBvYmplY3QtPmRkcmF3ID0gVGhpczsKKyAgICBvYmplY3QtPmFjdGl2YXRlID0gbWF0ZXJpYWxfYWN0aXZhdGU7CisKKyAgICAqTWF0ZXJpYWwgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsMyk7CisKKyAgICBUUkFDRSgiKCVwKSBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsIFRoaXMsIG9iamVjdCk7CisKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVNYXRlcmlhbChJRGlyZWN0M0QyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbDIgKipEaXJlY3QzRE1hdGVyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKKyAgICBIUkVTVUxUIHJldDsKKyAgICBJRGlyZWN0M0RNYXRlcmlhbDMgKnJldF92YWw7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNETWF0ZXJpYWwsIFVua091dGVyKTsKKyAgICByZXQgPSBJRGlyZWN0M0QzX0NyZWF0ZU1hdGVyaWFsKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7CisKKyAgICAqRGlyZWN0M0RNYXRlcmlhbCA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgSURpcmVjdDNETWF0ZXJpYWwyLCByZXRfdmFsKTsKKworICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcC5cbiIsICpEaXJlY3QzRE1hdGVyaWFsKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZU1hdGVyaWFsKElEaXJlY3QzRCAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETWF0ZXJpYWwgKipEaXJlY3QzRE1hdGVyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOworICAgIEhSRVNVTFQgcmV0OworICAgIExQRElSRUNUM0RNQVRFUklBTDMgcmV0X3ZhbDsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRGlyZWN0M0RNYXRlcmlhbCwgVW5rT3V0ZXIpOworICAgIHJldCA9IElEaXJlY3QzRDNfQ3JlYXRlTWF0ZXJpYWwoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0X3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKKworICAgICpEaXJlY3QzRE1hdGVyaWFsID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBJRGlyZWN0M0RNYXRlcmlhbCwgcmV0X3ZhbCk7CisKKyAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXAuXG4iLCAqRGlyZWN0M0RNYXRlcmlhbCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRDM6OkNyZWF0ZVZpZXdwb3J0CisgKgorICogQ3JlYXRlcyBhbiBJRGlyZWN0M0RWaWV3cG9ydCBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQKKyAqIGJ5IERpcmVjdDNEIGFuZCBlYXJsaWVyIHZlcnNpb25zIGZvciBWaWV3cG9ydCBtYW5hZ2VtZW50LiBJbiBEaXJlY3QzRDcKKyAqIGl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGEgdmlld3BvcnQgc3RydWN0dXJlIGFuZAorICogSURpcmVjdDNERGV2aWNlNzo6KlZpZXdwb3J0LiBXaW5lJ3MgSURpcmVjdDNEVmlld3BvcnQgaW1wbGVtZW50YXRpb24KKyAqIHVzZXMgdGhlIElEaXJlY3QzRERldmljZTcgbWV0aG9kcyBmb3IgaXQncyBmdW5jdGlvbmFsaXR5CisgKgorICogUGFyYW1zOgorICogIFZpZXdwb3J0OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBuZXcgaW50ZXJmYWNlIHBvaW50ZXIKKyAqICBVbmtPdXRlcjogQmFzaWNhbGx5IGZvciBhZ2dyZWdhdGlvbiwgYnV0IGRkcmF3IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKyAqICAgICAgICAgICAgTXVzdCBiZSBOVUxMCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX09VVE9GTUVNT1JZIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorICogIENMQVNTX0VfTk9BR0dSRUdBVElPTiBpZiBVbmtPdXRlciAhPSBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDMgKipWaWV3cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlciApCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpvYmplY3Q7CisKKyAgICBpZihVbmtPdXRlcikKKyAgICAgICAgcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsKKworICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoSURpcmVjdDNEVmlld3BvcnRJbXBsKSk7CisgICAgaWYgKG9iamVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CisKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmlld3BvcnQzLCBJRGlyZWN0M0RWaWV3cG9ydDNfVnRibCk7CisgICAgb2JqZWN0LT5yZWYgPSAxOworICAgIG9iamVjdC0+ZGRyYXcgPSBUaGlzOworICAgIG9iamVjdC0+YWN0aXZhdGUgPSB2aWV3cG9ydF9hY3RpdmF0ZTsKKyAgICBvYmplY3QtPnVzZV92cDIgPSAweEZGOworICAgIG9iamVjdC0+bmV4dCA9IE5VTEw7CisgICAgb2JqZWN0LT5saWdodHMgPSBOVUxMOworICAgIG9iamVjdC0+bnVtX2xpZ2h0cyA9IDA7CisgICAgb2JqZWN0LT5tYXBfbGlnaHRzID0gMDsKKworICAgICpWaWV3cG9ydCA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmlld3BvcnQzKTsKKworICAgIFRSQUNFKCIoJXApIGNyZWF0aW5nIGltcGxlbWVudGF0aW9uIGF0ICVwLlxuIixUaGlzLCBvYmplY3QpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEMiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQyICoqRDNEVmlld3BvcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIEQzRFZpZXdwb3J0MiwgVW5rT3V0ZXIpOworCisgICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRFZpZXdwb3J0MyAqKikgRDNEVmlld3BvcnQyIC8qIE5vIG5lZWQgdG8gY2FzdCBoZXJlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydCAqKkQzRFZpZXdwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNEVmlld3BvcnQsIFVua091dGVyKTsKKworICAgIHJldHVybiBJRGlyZWN0M0QzX0NyZWF0ZVZpZXdwb3J0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0RWaWV3cG9ydDMgKiopIEQzRFZpZXdwb3J0IC8qIE5vIG5lZWQgdG8gY2FzdCBoZXJlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0QzOjpGaW5kRGV2aWNlCisgKgorICogVGhpcyBtZXRob2QgZmluZHMgYSBkZXZpY2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHByb3BlcnRpZXMgYW5kIHJldHVybnMgYQorICogZGV2aWNlIGRlc2NyaXB0aW9uCisgKgorICogVmVyaW9uIDEsIDIgYW5kIDMKKyAqIFBhcmFtczoKKyAqICBEM0RERlM6IERlc2NyaWJlcyB0aGUgcmVxdWVzdGVkIGRldmljZSBjaGFyYWt0ZXJpc3RpY3MKKyAqICBEM0RGRFI6IFJldHVybnMgdGhlIGRldmljZSBkZXNjcmlwdGlvbgorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIG5vIGRldmljZSB3YXMgZm91bmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzREltcGxfM19GaW5kRGV2aWNlKElEaXJlY3QzRDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVNFQVJDSCAqRDNEREZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVJFU1VMVCAqRDNERkRSKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOworICAgIEQzRERFVklDRURFU0MgZGVzYzsKKyAgICBEM0RERVZJQ0VERVNDNyBuZXdEZXNjOworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgRDNEREZTLCBEM0RGRFIpOworCisgICAgaWYgKChEM0RERlMtPmR3RmxhZ3MgJiBEM0RGRFNfQ09MT1JNT0RFTCkgJiYKKyAgICAgICAgKEQzRERGUy0+ZGNtQ29sb3JNb2RlbCAhPSBEM0RDT0xPUl9SR0IpKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIiB0cnlpbmcgdG8gcmVxdWVzdCBhIG5vbi1SR0IgRDNEIGNvbG9yIG1vZGVsLiBOb3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOyAvKiBObyByZWFsIGlkZWEgd2hhdCB0byByZXR1cm4gaGVyZSA6LSkgKi8KKyAgICB9CisgICAgaWYgKEQzRERGUy0+ZHdGbGFncyAmIEQzREZEU19HVUlEKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIiB0cnlpbmcgdG8gbWF0Y2ggZ3VpZCAlcy5cbiIsIGRlYnVnc3RyX2d1aWQoJihEM0RERlMtPmd1aWQpKSk7CisgICAgICAgIGlmICgoSXNFcXVhbEdVSUQoJklJRF9EM0RERVZJQ0VfV2luZUQzRCwgJihEM0RERlMtPmd1aWQpKSA9PSAwKSAmJgorICAgICAgICAgICAgKElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNESEFMRGV2aWNlLCAmKEQzRERGUy0+Z3VpZCkpID09IDApICYmCisgICAgICAgICAgICAoSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RSZWZEZXZpY2UsICYoRDNEREZTLT5ndWlkKSkgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRSQUNFKCIgbm8gbWF0Y2ggZm9yIHRoaXMgR1VJRC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIGNhcHMgKi8KKyAgICBociA9IElEaXJlY3QzREltcGxfR2V0Q2FwcyhUaGlzLT53aW5lRDNELCAmZGVzYywgJm5ld0Rlc2MpOworICAgIGlmKGhyICE9IEQzRF9PSykgcmV0dXJuIGhyOworCisgICAgLyogTm93IHJldHVybiBvdXIgb3duIEdVSUQgKi8KKyAgICBEM0RGRFItPmd1aWQgPSBJSURfRDNEREVWSUNFX1dpbmVEM0Q7CisgICAgRDNERkRSLT5kZEh3RGVzYyA9IGRlc2M7CisgICAgRDNERkRSLT5kZFN3RGVzYyA9IGRlc2M7CisKKyAgICBUUkFDRSgiIHJldHVybmluZyBXaW5lJ3MgV2luZUQzRCBkZXZpY2Ugd2l0aCAodW5kdW1wZWQpIGNhcGFiaWxpdGllc1xuIik7CisKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfMl9GaW5kRGV2aWNlKElEaXJlY3QzRDIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVNFQVJDSCAqRDNEREZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVJFU1VMVCAqRDNERkRSKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIEQzRERGUywgRDNERkRSKTsKKyAgICByZXR1cm4gSURpcmVjdDNEM19GaW5kRGV2aWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEREZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERkRSKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzFfRmluZERldmljZShJRGlyZWN0M0QgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RGSU5EREVWSUNFU0VBUkNIICpEM0RERlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREZJTkRERVZJQ0VSRVNVTFQgKkQzRERldmljZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNEREZTLCBEM0REZXZpY2UpOworICAgIHJldHVybiBJRGlyZWN0M0QzX0ZpbmREZXZpY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RERlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REZXZpY2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRDc6OkNyZWF0ZURldmljZQorICoKKyAqIENyZWF0ZXMgYW4gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbiAyLCAzIGFuZCA3LiBJRGlyZWN0M0REZXZpY2UgMSBpbnRlcmZhY2VzIGFyZSBpbnRlcmZhY2VzIHRvCisgKiBEaXJlY3REcmF3IHN1cmZhY2VzIGFuZCBhcmUgY3JlYXRlZCB3aXRoCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U6OlF1ZXJ5SW50ZXJmYWNlLiBUaGlzIG1ldGhvZCB1c2VzIENyZWF0ZURldmljZSB0bworICogY3JlYXRlIHRoZSBkZXZpY2Ugb2JqZWN0IGFuZCBRdWVyeUludGVyZmFjZXMgZm9yIElEaXJlY3QzRERldmljZQorICoKKyAqIFBhcmFtczoKKyAqICByZWZpaWQ6IElJRCBvZiB0aGUgZGV2aWNlIHRvIGNyZWF0ZQorICogIFN1cmZhY2U6IEluaXRpdGlhbCByZW5kZXJ0YXJnZXQKKyAqICBEZXZpY2U6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgcG9pbnRlcgorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIGEgZGV2aWNlIGV4aXN0cyBhbHJlYWR5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RJbXBsXzdfQ3JlYXRlRGV2aWNlKElEaXJlY3QzRDcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByZWZpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKlN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTcgKipEZXZpY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CisgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqb2JqZWN0OworICAgIElQYXJlbnRJbXBsICpJbmRleEJ1ZmZlclBhcmVudDsKKyAgICBIUkVTVUxUIGhyOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRhcmdldCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIFN1cmZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBTdXJmYWNlLCBEZXZpY2UpOworCisgICAgKkRldmljZSA9IE5VTEw7CisKKyAgICAvKiBGYWlsIGRldmljZSBjcmVhdGlvbiBpZiBub24tb3BlbmdsIHN1cmZhY2VzIGFyZSB1c2VkICovCisgICAgaWYoVGhpcy0+SW1wbFR5cGUgIT0gU1VSRkFDRV9PUEVOR0wpCisgICAgeworICAgICAgICBFUlIoIlRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBjcmVhdGUgYSBEaXJlY3QzRCBkZXZpY2UsIGJ1dCBub24tb3BlbmdsIHN1cmZhY2VzIGFyZSBzZXQgaW4gdGhlIHJlZ2lzdHJ5LiBQbGVhc2Ugc2V0IHRoZSBzdXJmYWNlIGltcGxlbWVudGF0aW9uIHRvIG9wZW5nbCBvciBhdXRvZGV0ZWN0aW9uIHRvIGFsbG93IDNEIHJlbmRlcmluZ1xuIik7CisKKyAgICAgICAgLyogV2Ugb25seSBoaXQgdGhpcyBwYXRoIGlmIGEgZGVmYXVsdCBzdXJmYWNlIGlzIHNldCBpbiB0aGUgcmVnaXN0cnkuIEluY29ycmVjdCBhdXRvZGV0ZWN0aW9uCisgICAgICAgICAqIGlzIGNhdWdodCBpbiBDcmVhdGVTdXJmYWNlIG9yIFF1ZXJ5SW50ZXJmYWNlCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gRERFUlJfTk8zRDsKKyAgICB9CisKKyAgICAvKiBTbyBmYXIgd2UgY2FuIG9ubHkgY3JlYXRlIG9uZSBkZXZpY2UgcGVyIGRkcmF3IG9iamVjdCAqLworICAgIGlmKFRoaXMtPmQzZGRldmljZSkKKyAgICB7CisgICAgICAgIEZJWE1FKCIoJXApOiBPbmx5IG9uZSBEaXJlY3QzRCBkZXZpY2UgcGVyIERpcmVjdERyYXcgb2JqZWN0IHN1cHBvcnRlZFxuIiwgVGhpcyk7CisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoSURpcmVjdDNERGV2aWNlSW1wbCkpOworICAgIGlmKCFvYmplY3QpCisgICAgeworICAgICAgICBFUlIoIk91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGEgSURpcmVjdDNERGV2aWNlIGltcGxlbWVudGF0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOworICAgIH0KKworICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2U3X1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2UzLCBJRGlyZWN0M0REZXZpY2UzX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UyX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTFfVnRibCk7CisKKyAgICBvYmplY3QtPnJlZiA9IDE7CisgICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CisgICAgb2JqZWN0LT52aWV3cG9ydF9saXN0ID0gTlVMTDsKKyAgICBvYmplY3QtPmN1cnJlbnRfdmlld3BvcnQgPSBOVUxMOworICAgIG9iamVjdC0+bWF0ZXJpYWwgPSAwOworICAgIG9iamVjdC0+dGFyZ2V0ID0gdGFyZ2V0OworCisgICAgLyogVGhpcyBpcyBmb3IgY29udmVuaWVuY2UgKi8KKyAgICBvYmplY3QtPndpbmVEM0REZXZpY2UgPSBUaGlzLT53aW5lRDNERGV2aWNlOworCisgICAgLyogQ3JlYXRlIGFuIGluZGV4IGJ1ZmZlciwgaXQncyBuZWVkZWQgZm9yIGluZGV4ZWQgZHJhd2luZyAqLworICAgIEluZGV4QnVmZmVyUGFyZW50ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihJUGFyZW50SW1wbCAqKSk7CisgICAgaWYoIUluZGV4QnVmZmVyUGFyZW50KQorICAgIHsKKyAgICAgICAgRVJSKCJBbGxvY2F0aW5nIG1lbW9yeSBmb3IgYW4gaW5kZXggYnVmZmVyIHBhcmVudCBmYWlsZWRcbiIpOworICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOworICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CisgICAgfQorICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoSW5kZXhCdWZmZXJQYXJlbnQsIElQYXJlbnQsIElQYXJlbnRfVnRibCk7CisgICAgSW5kZXhCdWZmZXJQYXJlbnQtPnJlZiA9IDE7CisKKyAgICAvKiBDcmVhdGUgYW4gSW5kZXggQnVmZmVyLiBXaW5lRDNEIG5lZWRzIG9uZSBmb3IgRHJhd2luZyBpbmRleGVkIHByaW1pdGl2ZXMKKyAgICAgKiBDcmVhdGUgYSAoaG9wZWZ1bGx5KSBsb25nIGVub3VnaHQgYnVmZmVyLCBhbmQgY29weSB0aGUgaW5kaWNlcyBpbnRvIGl0CisgICAgICogSWRlYWxseSwgYSBJV2luZUQzREluZGV4QnVmZmVyOjpTZXREYXRhIG1ldGhvZCBjb3VsZCBiZSBjcmVhdGVkLCB3aGljaAorICAgICAqIHRha2VzIHRoZSBwb2ludGVyIGFuZCBhdm9pZHMgdGhlIG1lbWNweQorICAgICAqLworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfQ3JlYXRlSW5kZXhCdWZmZXIoVGhpcy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAsIC8qIExlbmdodC4gRG9uJ3Qga25vdyBob3cgbG9uZyBpdCBzaG91bGQgYmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIFVzYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk1UX0lOREVYMTYsIC8qIEZvcm1hdC4gRDNENyB1c2VzIFdPUkRTICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE9PTF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdC0+aW5kZXhidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVW5rbm93biAqKSBJQ09NX0lOVEVSRkFDRShJbmRleEJ1ZmZlclBhcmVudCwgSVBhcmVudCkpOworCisgICAgaWYoRkFJTEVEKGhyKSkKKyAgICB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIGNyZWF0ZSBhbiBpbmRleCBidWZmZXJcbiIpOworICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmplY3QpOworICAgICAgICByZXR1cm4gaHI7CisgICAgfQorICAgIEluZGV4QnVmZmVyUGFyZW50LT5jaGlsZCA9IChJVW5rbm93biAqKSBvYmplY3QtPmluZGV4YnVmZmVyOworCisgICAgLyogTm8gbmVlZCB0byBzZXQgdGhlIGluZGljZXMsIGl0J3MgZG9uZSB3aGVuIG5lY2Vzc2FyeSAqLworCisgICAgLyogQWRkUmVmIHRoZSBXaW5lRDNEIERldmljZSAqLworICAgIElXaW5lRDNERGV2aWNlX0FkZFJlZihUaGlzLT53aW5lRDNERGV2aWNlKTsKKworICAgIC8qIERvbid0IGZvcmdldCB0byByZXR1cm4gdGhlIGludGVyZmFjZSA7KSAqLworICAgICpEZXZpY2UgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZTcpOworCisgICAgVFJBQ0UoIiAoJXApIENyZWF0ZWQgYW4gSURpcmVjdDNERGV2aWNlSW1wbCBvYmplY3QgYXQgJXBcbiIsIFRoaXMsIG9iamVjdCk7CisKKyAgICAvKiBUaGlzIGlzIGZvciBhcHBzIHdoaWNoIGNyZWF0ZSBhIG5vbi1mbGlwLCBub24tZDNkIHByaW1hcnkgc3VyZmFjZQorICAgICAqIGFuZCBhbiBvZmZzY3JlZW4gRDNEREVWSUNFIHN1cmZhY2UsIHRoZW4gcmVuZGVyIHRvIHRoZSBvZmZzY3JlZW4gc3VyZmFjZQorICAgICAqIGFuZCBkbyBhIEJsdCBmcm9tIHRoZSBvZmZzY3JlZW4gdG8gdGhlIHByaW1hcnkgc3VyZmFjZS4KKyAgICAgKgorICAgICAqIFNldCB0aGUgb2Zmc2NyZWVuIEQzRERERVZJQ0Ugc3VyZmFjZSg9dGFyZ2V0KSBhcyB0aGUgYmFjayBidWZmZXIsCisgICAgICogYW5kIHRoZSBwcmltYXJ5IHN1cmZhY2UoPVRoaXMtPmQzZF90YXJnZXQpIGFzIHRoZSBmcm9udCBidWZmZXIuCisgICAgICoKKyAgICAgKiBUaGlzIHdheSB0aGUgYXBwIHdpbGwgcmVuZGVyIHRvIHRoZSBEM0RERVZJQ0Ugc3VyZmFjZSBhbmQgV2luZUQzRAorICAgICAqIHdpbGwgY2F0Y2ggdGhlIEJsdCB3YXMgQmFjayBCdWZmZXIgLT4gRnJvbnQgYnVmZmVyIGJsdCBhbmQgcGVyZm9ybQorICAgICAqIGEgZmxpcCBpbnN0ZWFkLiBUaGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCBhIG1peGVkIEdMIC8gR0RJCisgICAgICogZW52aXJvbm1lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjaGVja2VkIGFnYWluc3Qgd2luZG93ZWQgYXBwcy4gVGhlIG9ubHkgYXBwIHRlc3RlZCB3aXRoCisgICAgICogdGhpcyBpcyBtb3RvIHJhY2VyIDIgZHVyaW5nIHRoZSBsb2FkaW5nIHNjcmVlbi4KKyAgICAgKi8KKyAgICBUUkFDRSgiSXNyZW5kZXJ0YXJnZXQ6ICVzLCBkM2RfdGFyZ2V0PSVwXG4iLCB0YXJnZXQtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgPyAidHJ1ZSIgOiAiZmFsc2UiLCBUaGlzLT5kM2RfdGFyZ2V0KTsKKyAgICBpZighKHRhcmdldC0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkgJiYKKyAgICAgICAoVGhpcy0+ZDNkX3RhcmdldCAhPSB0YXJnZXQpKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIiglcCkgVXNpbmcgJXAgYXMgZnJvbnQgYnVmZmVyLCAlcCBhcyBiYWNrIGJ1ZmZlclxuIiwgVGhpcywgVGhpcy0+ZDNkX3RhcmdldCwgdGFyZ2V0KTsKKyAgICAgICAgaHIgPSBJV2luZUQzRERldmljZV9TZXRGcm9udEJhY2tCdWZmZXJzKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5kM2RfdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+V2luZUQzRFN1cmZhY2UpOworICAgICAgICBpZihociAhPSBEM0RfT0spCisgICAgICAgICAgICBFUlIoIiglcCkgRXJyb3IgJTA4bHggc2V0dGluZyB0aGUgZnJvbnQgYW5kIGJhY2sgYnVmZmVyXG4iLCBUaGlzLCBocik7CisKKyAgICAgICAgb2JqZWN0LT5PZmZTY3JlZW5UYXJnZXQgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvYmplY3QtPk9mZlNjcmVlblRhcmdldCA9IEZBTFNFOworICAgIH0KKworICAgIC8qIEFkZFJlZiB0aGUgcmVuZGVyIHRhcmdldC4gQWxzbyBBZGRSZWYgdGhlIHJlbmRlciB0YXJnZXQgZnJvbSBkZHJhdywKKyAgICAgKiBiZWNhdXNlIGlmIGl0IHJlbGVhc2VkIGJlZm9yZSB0aGUgYXBwIHJlbGVhc2VzIHRoZSBEM0QgZGV2aWNlLCB0aGUgRDNEIGNhcGF0aWJsaXRpZXMKKyAgICAgKiBvZiBXaW5lRDNEIHdpbGwgYmUgdW5pbml0aWFsaXplZCwgd2hpY2ggaGFzIGJhZCBlZmZlY3RzLgorICAgICAqCisgICAgICogSW4gbW9zdCBjYXNlcywgdGhvc2Ugc3VyZmFjZXMgYXJlIHRoZSBzdXJmYWNlcyBhcmUgdGhlIHNhbWUgYW55d2F5LCBidXQgdGhpcyB3aWxsIHNpbXBseQorICAgICAqIGFkZCBhbm90aGVyIHJlZiB3aGljaCBpcyByZWxlYXNlZCB3aGVuIHRoZSBkZXZpY2UgaXMgZGVzdHJveWVkLgorICAgICAqLworICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKFN1cmZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMtPmQzZF90YXJnZXQsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKKworICAgIFRoaXMtPmQzZGRldmljZSA9IG9iamVjdDsKKworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNESW1wbF8zX0NyZWF0ZURldmljZShJRGlyZWN0M0QzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U0ICpTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UzICoqRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVwLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdDNEN1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBTdXJmYWNlLCBEZXZpY2UsIFVua091dGVyKTsKKworICAgIGlmKFVua091dGVyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CisKKyAgICBociA9ICBJRGlyZWN0M0Q3X0NyZWF0ZURldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3REcmF3U3VyZmFjZTcgKikgU3VyZmFjZSAvKiBTYW1lIFZUYWJsZXMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEaXJlY3QzRERldmljZTcgKiopIERldmljZSk7CisKKyAgICAqRGV2aWNlID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIElEaXJlY3QzRERldmljZTMsICpEZXZpY2UpOworICAgIHJldHVybiBocjsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlRGV2aWNlKElEaXJlY3QzRDIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByZWZpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMiAqKkRldmljZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApOiBUaHVua2luZyB0byBJRGlyZWN0M0Q3XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIFN1cmZhY2UsIERldmljZSk7CisKKyAgICBociA9ICBJRGlyZWN0M0Q3X0NyZWF0ZURldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIElEaXJlY3REcmF3U3VyZmFjZTcsIFN1cmZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0REZXZpY2U3ICoqKSBEZXZpY2UpOworCisgICAgKkRldmljZSA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2UyLCAqRGV2aWNlKTsKKyAgICByZXR1cm4gaHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNENzo6Q3JlYXRlVmVydGV4QnVmZmVyCisgKgorICogQ3JlYXRlcyBhIG5ldyB2ZXJ0ZXggYnVmZmVyIG9iamVjdCBhbmQgcmV0dXJucyBhIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcKKyAqIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgRGVzYzogUmVxdWVzdGVkIFZlcnRleCBidWZmZXIgcHJvcGVydGllcworICogIFZlcnRleEJ1ZmZlcjogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CisgKiAgRmxhZ3M6IFNvbWUgZmxhZ3MsIG11c3QgYmUgMAorICoKKyAqIFJldHVybnMKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX09VVE9GTUVNT1JZIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorICogIFRoZSByZXR1cm4gdmFsdWUgb2YgSVdpbmVEM0REZXZpY2U6OkNyZWF0ZVZlcnRleEJ1ZmZlciBpZiB0aGlzIGNhbGwgZmFpbHMKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERlc2Mgb3IgVmVydGV4QnVmZmVyIGFyZSBOVUxMLCBvciBGbGFncyAhPSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RJbXBsXzdfQ3JlYXRlVmVydGV4QnVmZmVyKElEaXJlY3QzRDcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRVJURVhCVUZGRVJERVNDICpEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICoqVmVydGV4QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICpvYmplY3Q7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCUwOGx4KVxuIiwgVGhpcywgRGVzYywgVmVydGV4QnVmZmVyLCBGbGFncyk7CisKKyAgICBUUkFDRSgiKCVwKSBWZXJ0ZXggYnVmZmVyIGRlc2NyaXB0aW9uOiBcbiIsIFRoaXMpOworICAgIFRSQUNFKCIoJXApICBkd1NpemU9JWxkXG4iLCBUaGlzLCBEZXNjLT5kd1NpemUpOworICAgIFRSQUNFKCIoJXApICBkd0NhcHM9JTA4bHhcbiIsIFRoaXMsIERlc2MtPmR3Q2Fwcyk7CisgICAgVFJBQ0UoIiglcCkgIEZWRj0lMDhseFxuIiwgVGhpcywgRGVzYy0+ZHdGVkYpOworICAgIFRSQUNFKCIoJXApICBkd051bVZlcnRpY2VzPSVsZFxuIiwgVGhpcywgRGVzYy0+ZHdOdW1WZXJ0aWNlcyk7CisKKyAgICAvKiBEM0Q3IFNESzogIk5vIEZsYWdzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBmb3IgdGhpcyBtZXRob2QuIFRoaXMKKyAgICAgKiBwYXJhbWV0ZXIgbXVzdCBiZSAwIgorICAgICAqCisgICAgICogTmV2ZXIgdHJ1c3QgdGhlIGRvY3VtZW50YXRpb24gLSB0aGlzIGlzIHdyb25nCisgICAgaWYoRmxhZ3MgIT0gMCkKKyAgICB7CisgICAgICAgIEVSUigiKCVwKSBGbGFncyBpcyAlMDhseCwgcmV0dXJuaW5nIERERVJSX0lOVkFMSURQQVJBTVNcbiIsIFRoaXMsIEZsYWdzKTsKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgfQorICAgICAqLworCisgICAgLyogV2VsbCwgdGhpcyBzb3VuZHMgc2FuZSAqLworICAgIGlmKCAoIVZlcnRleEJ1ZmZlcikgfHwgKCFEZXNjKSApCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgLyogTm93IGNyZWF0ZSB0aGUgdmVydGV4IGJ1ZmZlciAqLworICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCkpOworICAgIGlmKCFvYmplY3QpCisgICAgeworICAgICAgICBFUlIoIiglcCkgT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgYSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsIHN0cnVjdHVyZVxuIiwgVGhpcyk7CisgICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKKyAgICB9CisKKyAgICBvYmplY3QtPnJlZiA9IDE7CisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVnRibCk7CisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyMV9WdGJsKTsKKworICAgIG9iamVjdC0+Q2FwcyA9IERlc2MtPmR3Q2FwczsKKworICAgIGhyID0gSVdpbmVEM0REZXZpY2VfQ3JlYXRlVmVydGV4QnVmZmVyKFRoaXMtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERlc2MtPmR3RlZGKSAqIERlc2MtPmR3TnVtVmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYy0+ZHdDYXBzICYgRDNEVkJDQVBTX1dSSVRFT05MWSA/IFdJTkVEM0RVU0FHRV9XUklURU9OTFkgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MtPmR3RlZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MtPmR3Q2FwcyAmIEQzRFZCQ0FQU19TWVNURU1NRU1PUlkgPyBXSU5FRDNEUE9PTF9TWVNURU1NRU0gOiBXSU5FRDNEUE9PTF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3QtPndpbmVEM0RWZXJ0ZXhCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBTaGFyZWRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElVbmtub3duICopIElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOworICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICB7CisgICAgICAgIEVSUigiKCVwKSBJV2luZUQzRERldmljZTo6Q3JlYXRlVmVydGV4QnVmZmVyIGZhaWxlZCB3aXRoIGhyPSUwOGx4XG4iLCBUaGlzLCBocik7CisgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9iamVjdCk7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gdGhlIGludGVyZmFjZSAqLworICAgICpWZXJ0ZXhCdWZmZXIgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpOworCisgICAgVFJBQ0UoIiglcCkgQ3JlYXRlZCBuZXcgdmVydGV4IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBhdCAlcCwgcmV0dXJuaW5nIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgb2JqZWN0LCAqVmVydGV4QnVmZmVyKTsKKyAgICByZXR1cm4gRDNEX09LOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVWZXJ0ZXhCdWZmZXIoSURpcmVjdDNEMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWEJVRkZFUkRFU0MgKkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlciAqKlZlcnRleEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJTA4bHgsJXApOiBSZWxheWluZyB0byBJRGlyZWN0M0Q3XG4iLCBUaGlzLCBEZXNjLCBWZXJ0ZXhCdWZmZXIsIEZsYWdzLCBVbmtPdXRlcik7CisKKyAgICBpZihVbmtPdXRlciAhPSBOVUxMKSByZXR1cm4gQ0xBU1NfRV9OT0FHR1JFR0FUSU9OOworCisgICAgaHIgPSBJRGlyZWN0M0Q3X0NyZWF0ZVZlcnRleEJ1ZmZlcihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqKikgVmVydGV4QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworCisgICAgKlZlcnRleEJ1ZmZlciA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIsICpWZXJ0ZXhCdWZmZXIpOworICAgIHJldHVybiBocjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFbnVtWkJ1ZmZlckZvcm1hdHNDQgorICoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgSURpcmVjdDNENzo6RW51bVpCdWZmZXJGb3JtYXRzLiBDb252ZXJ0cworICogdGhlIFdJTkVEM0RGT1JNQVQgaW50byBhIERpcmVjdERyYXcgcGl4ZWxmb3JtYXQgYW5kIGNhbGxzIHRoZSBhcHBsaWNhdGlvbgorICogY2FsbGJhY2sKKyAqCisgKiBWZXJzaW9uIDMgYW5kIDcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIERldmljZTogUGFyZW50IG9mIHRoZSBJV2luZUQzRERldmljZSwgb3VyIElEaXJlY3REcmF3NyBpbnRlcmZhY2UKKyAqICBmbXQ6IFRoZSBlbnVtZXJhdGVkIHBpeGVsIGZvcm1hdAorICogIENvbnRleHQ6IENvbnRleHQgcGFzc2VkIHRvIElXaW5lRDNERGV2aWNlOjpFbnVtWkJ1ZmZlckZvcm1hdAorICoKKyAqIFJldHVybnM6CisgKiAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24tcHJvdmlkZWQgY2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0VudW1aQnVmZmVyRm9ybWF0c0NCKElVbmtub3duICpEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCit7CisgICAgIHN0cnVjdCBFbnVtWkJ1ZmZlckZvcm1hdHNEYXRhICpjYmRhdGEgPSAoc3RydWN0IEVudW1aQnVmZmVyRm9ybWF0c0RhdGEgKikgQ29udGV4dDsKKyAgICAgRERQSVhFTEZPUk1BVCBwZm9ybWF0OworCisgICAgIG1lbXNldCgmcGZvcm1hdCwgMCwgc2l6ZW9mKEREUElYRUxGT1JNQVQpKTsKKyAgICAgcGZvcm1hdC5kd1NpemU9c2l6ZW9mKEREUElYRUxGT1JNQVQpOworICAgICBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERCgmcGZvcm1hdCwgZm10KTsKKyAgICAgcmV0dXJuIGNiZGF0YS0+Q2FsbGJhY2soJnBmb3JtYXQsIGNiZGF0YS0+Q29udGV4dCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNENzo6RW51bVpCdWZmZXJGb3JtYXRzCisgKgorICogRW51bWVyYXRlcyBhbGwgc3VwcG9ydGVkIFogYnVmZmVyIHBpeGVsIGZvcm1hdHMKKyAqCisgKiBWZXJzaW9uIDMgYW5kIDcKKyAqCisgKiBQYXJhbXM6CisgKiAgcmVmaWlkRGV2aWNlOgorICogIENhbGxiYWNrOiBDYWxsYmFjayB0byBjYWxsIGZvciBlYWNoIHBpeGVsIGZvcm1hdAorICogIENvbnRleHQ6IFBvaW50ZXIgdG8gcGFzcyBiYWNrIHRvIHRoZSBjYWxsYmFjaworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIENhbGxiYWNrIGlzIE5VTEwKKyAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpFbnVtWkJ1ZmZlckZvcm1hdHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzREltcGxfN19FbnVtWkJ1ZmZlckZvcm1hdHMoSURpcmVjdDNENyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJlZmlpZERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNUElYRUxGT1JNQVRTQ0FMTEJBQ0sgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CisgICAgc3RydWN0IEVudW1aQnVmZmVyRm9ybWF0c0RhdGEgY2JkYXRhID0geyBDYWxsYmFjaywgQ29udGV4dCB9OworICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApOiBSZWxheVxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmVmaWlkRGV2aWNlKSwgQ2FsbGJhY2ssIENvbnRleHQpOworCisgICAgaWYoIUNhbGxiYWNrKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIHJldHVybiBJV2luZUQzRERldmljZV9FbnVtWkJ1ZmZlckZvcm1hdHMoVGhpcy0+d2luZUQzRERldmljZSwgRW51bVpCdWZmZXJGb3JtYXRzQ0IsICZjYmRhdGEpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzREltcGxfM19FbnVtWkJ1ZmZlckZvcm1hdHMoSURpcmVjdDNEMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJpaWREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkRGV2aWNlKSwgQ2FsbGJhY2ssIENvbnRleHQpOworICAgIHJldHVybiBJRGlyZWN0M0Q3X0VudW1aQnVmZmVyRm9ybWF0cyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRDc6OkV2aWN0TWFuYWdlZFRleHR1cmVzCisgKgorICogUmVtb3ZlcyBhbGwgbWFuYWdlZCB0ZXh0dXJlcyg9c3VyZmFjZXMgd2l0aCBERFNDQVBTMl9URVhUVVJFTUFOQUdFIG9yCisgKiBERFNDQVBTMl9EM0RURVhUVVJFTUFOQUdFIGNhcHMpIHRvIGJlIHJlbW92ZWQgZnJvbSB2aWRlbyBtZW1vcnkuCisgKgorICogVmVyc2lvbiAzIGFuZCA3CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzREltcGxfN19FdmljdE1hbmFnZWRUZXh0dXJlcyhJRGlyZWN0M0Q3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKTogU3R1YiFcbiIsIFRoaXMpOworCisgICAgLyogSW1wbGVtZW50YXRpb24gaWRlYToKKyAgICAgKiBBZGQgYW4gSVdpbmVEM0RTdXJmYWNlIG1ldGhvZCB3aGljaCBzZXRzIHRoZSBvcGVuZ2wgdGV4dHVyZQorICAgICAqIHByaW9yaXR5IGxvdyBvciBldmVuIHJlbW92ZXMgdGhlIG9wZW5nbCB0ZXh0dXJlLgorICAgICAqLworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RJbXBsXzNfRXZpY3RNYW5hZ2VkVGV4dHVyZXMoSURpcmVjdDNEMyAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRDcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisgICAgcmV0dXJuIElEaXJlY3QzRDdfRXZpY3RNYW5hZ2VkVGV4dHVyZXMoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNENykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzREltcGxfR2V0Q2FwcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBkZXZpY2UgY2FwcyBmcm9tIHdpbmVkM2QKKyAqIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgRDNENyBhbmQgRDNEIC0gRDNEMyBzdHJ1Y3R1cmUKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGZyb20gdmFyaW91cyBwbGFjZXMgaW4gZGRyYXcKKyAqCisgKiBQYXJhbXM6CisgKiAgV2luZUQzRDogVGhlIGludGVyZmFjZSB0byBnZXQgdGhlIGNhcHMgZnJvbQorICogIERlc2MxMjM6IE9sZCBEM0QgPDMgc3RydWN0dXJlIHRvIGZpbGwobmVlZGVkKQorICogIERlc2M3OiBEM0Q3IGRldmljZSBkZXNjIHN0cnVjdHVyZSB0byBmaWxsKG5lZWRlZCkKKyAqCisgKiBSZXR1cm5zCisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MsIG9yIHRoZSByZXR1cm4gdmFsdWUgb2YgSVdpbmVEM0Q6OkdldENhcHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIUkVTVUxUCitJRGlyZWN0M0RJbXBsX0dldENhcHMoSVdpbmVEM0QgKldpbmVEM0QsCisgICAgICAgICAgICAgICAgICAgICAgRDNEREVWSUNFREVTQyAqRGVzYzEyMywKKyAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDNyAqRGVzYzcpCit7CisgICAgV0lORUQzRENBUFMgV0NhcHM7CisgICAgSFJFU1VMVCBocjsKKworICAgIC8qIFNvbWUgVmFyaWFibGVzIHRvIGFzaWduIHRvIHRoZSBwb2ludGVycyBpbiBXQ2FwcyAqLworICAgIFdJTkVEM0RERVZUWVBFIERldlR5cGU7CisgICAgVUlOVCBkdW1teV91aW50OworICAgIGZsb2F0IGR1bW15X2Zsb2F0OworICAgIERXT1JEIGR1bW15X2R3b3JkLCBNYXhUZXh0dXJlQmxlbmRTdGFnZXMsIE1heFNpbXVsdGFuZW91c1RleHR1cmVzOworICAgIERXT1JEIE1heFVzZXJDbGlwUGxhbmVzLCBNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzOworCisgICAgVFJBQ0UoIigpLT4oJXAsJXAsJXBcbiIsIFdpbmVEM0QsIERlc2MxMjMsIERlc2M3KTsKKworICAgIC8qIEFzaWduIHRoZSBwb2ludGVycyBpbiBXQ2FwcyAqLworICAgIFdDYXBzLkRldmljZVR5cGUgPSAmRGV2VHlwZTsKKyAgICBXQ2Fwcy5BZGFwdGVyT3JkaW5hbCA9ICZkdW1teV91aW50OworCisgICAgV0NhcHMuQ2FwcyA9ICZkdW1teV9kd29yZDsKKyAgICBXQ2Fwcy5DYXBzMiA9ICZkdW1teV9kd29yZDsKKyAgICBXQ2Fwcy5DYXBzMyA9ICZkdW1teV9kd29yZDsKKyAgICBXQ2Fwcy5QcmVzZW50YXRpb25JbnRlcnZhbHMgPSAmZHVtbXlfZHdvcmQ7CisKKyAgICBXQ2Fwcy5DdXJzb3JDYXBzID0gJmR1bW15X2R3b3JkOworCisgICAgV0NhcHMuRGV2Q2FwcyA9ICZEZXNjNy0+ZHdEZXZDYXBzOworICAgIFdDYXBzLlByaW1pdGl2ZU1pc2NDYXBzID0gJmR1bW15X2R3b3JkOworICAgIFdDYXBzLlJhc3RlckNhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3UmFzdGVyQ2FwczsKKyAgICBXQ2Fwcy5aQ21wQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdaQ21wQ2FwczsKKyAgICBXQ2Fwcy5TcmNCbGVuZENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzOworICAgIFdDYXBzLkRlc3RCbGVuZENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3RGVzdEJsZW5kQ2FwczsKKyAgICBXQ2Fwcy5BbHBoYUNtcENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3QWxwaGFDbXBDYXBzOworICAgIFdDYXBzLlNoYWRlQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdTaGFkZUNhcHM7CisgICAgV0NhcHMuVGV4dHVyZUNhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHM7CisgICAgV0NhcHMuVGV4dHVyZUZpbHRlckNhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUZpbHRlckNhcHM7CisgICAgV0NhcHMuQ3ViZVRleHR1cmVGaWx0ZXJDYXBzID0gJmR1bW15X2R3b3JkOworICAgIFdDYXBzLlZvbHVtZVRleHR1cmVGaWx0ZXJDYXBzID0gJmR1bW15X2R3b3JkOworICAgIFdDYXBzLlRleHR1cmVBZGRyZXNzQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQWRkcmVzc0NhcHM7CisgICAgV0NhcHMuVm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0gJmR1bW15X2R3b3JkOworCisgICAgV0NhcHMuTGluZUNhcHMgPSAmZHVtbXlfZHdvcmQ7CisgICAgV0NhcHMuTWF4VGV4dHVyZVdpZHRoID0gJkRlc2M3LT5kd01heFRleHR1cmVXaWR0aDsKKyAgICBXQ2Fwcy5NYXhUZXh0dXJlSGVpZ2h0ID0gJkRlc2M3LT5kd01heFRleHR1cmVIZWlnaHQ7CisgICAgV0NhcHMuTWF4Vm9sdW1lRXh0ZW50ID0gJmR1bW15X2R3b3JkOworCisgICAgV0NhcHMuTWF4VGV4dHVyZVJlcGVhdCA9ICZEZXNjNy0+ZHdNYXhUZXh0dXJlUmVwZWF0OworICAgIFdDYXBzLk1heFRleHR1cmVBc3BlY3RSYXRpbyA9ICZEZXNjNy0+ZHdNYXhUZXh0dXJlQXNwZWN0UmF0aW87CisgICAgV0NhcHMuTWF4QW5pc290cm9weSA9ICZEZXNjNy0+ZHdNYXhBbmlzb3Ryb3B5OworICAgIFdDYXBzLk1heFZlcnRleFcgPSAmRGVzYzctPmR2TWF4VmVydGV4VzsKKworICAgIFdDYXBzLkd1YXJkQmFuZExlZnQgPSAmRGVzYzctPmR2R3VhcmRCYW5kTGVmdDsKKyAgICBXQ2Fwcy5HdWFyZEJhbmRUb3AgPSAmRGVzYzctPmR2R3VhcmRCYW5kVG9wOworICAgIFdDYXBzLkd1YXJkQmFuZFJpZ2h0ID0gJkRlc2M3LT5kdkd1YXJkQmFuZFJpZ2h0OworICAgIFdDYXBzLkd1YXJkQmFuZEJvdHRvbSA9ICZEZXNjNy0+ZHZHdWFyZEJhbmRCb3R0b207CisKKyAgICBXQ2Fwcy5FeHRlbnRzQWRqdXN0ID0gJkRlc2M3LT5kdkV4dGVudHNBZGp1c3Q7CisgICAgV0NhcHMuU3RlbmNpbENhcHMgPSAmRGVzYzctPmR3U3RlbmNpbENhcHM7CisKKyAgICBXQ2Fwcy5GVkZDYXBzID0gJkRlc2M3LT5kd0ZWRkNhcHM7CisgICAgV0NhcHMuVGV4dHVyZU9wQ2FwcyA9ICZEZXNjNy0+ZHdUZXh0dXJlT3BDYXBzOworICAgIFdDYXBzLk1heFRleHR1cmVCbGVuZFN0YWdlcyA9ICZNYXhUZXh0dXJlQmxlbmRTdGFnZXM7CisgICAgV0NhcHMuTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSAmTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXM7CisKKyAgICBXQ2Fwcy5WZXJ0ZXhQcm9jZXNzaW5nQ2FwcyA9ICZEZXNjNy0+ZHdWZXJ0ZXhQcm9jZXNzaW5nQ2FwczsKKyAgICBXQ2Fwcy5NYXhBY3RpdmVMaWdodHMgPSAmRGVzYzctPmR3TWF4QWN0aXZlTGlnaHRzOworICAgIFdDYXBzLk1heFVzZXJDbGlwUGxhbmVzID0gJk1heFVzZXJDbGlwUGxhbmVzOworICAgIFdDYXBzLk1heFZlcnRleEJsZW5kTWF0cmljZXMgPSAmTWF4VmVydGV4QmxlbmRNYXRyaWNlczsKKyAgICBXQ2Fwcy5NYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4ID0gJmR1bW15X2R3b3JkOworCisgICAgV0NhcHMuTWF4UG9pbnRTaXplID0gJmR1bW15X2Zsb2F0OworICAgIFdDYXBzLk1heFByaW1pdGl2ZUNvdW50ID0gJmR1bW15X2R3b3JkOworICAgIFdDYXBzLk1heFZlcnRleEluZGV4ID0gJmR1bW15X2R3b3JkOworICAgIFdDYXBzLk1heFN0cmVhbXMgPSAmZHVtbXlfZHdvcmQ7CisgICAgV0NhcHMuTWF4U3RyZWFtU3RyaWRlID0gJmR1bW15X2R3b3JkOworCisgICAgV0NhcHMuVmVydGV4U2hhZGVyVmVyc2lvbiA9ICZkdW1teV9kd29yZDsKKyAgICBXQ2Fwcy5NYXhWZXJ0ZXhTaGFkZXJDb25zdCA9ICZkdW1teV9kd29yZDsKKworICAgIFdDYXBzLlBpeGVsU2hhZGVyVmVyc2lvbiA9ICZkdW1teV9kd29yZDsKKyAgICBXQ2Fwcy5QaXhlbFNoYWRlcjF4TWF4VmFsdWUgPSAmZHVtbXlfZmxvYXQ7CisKKyAgICAvKiBUaGVzZSBhcmUgZHg5IG9ubHksIHNldCB0aGVtIHRvIE5VTEwgKi8KKyAgICBXQ2Fwcy5EZXZDYXBzMiA9IE5VTEw7CisgICAgV0NhcHMuTWF4TnBhdGNoVGVzc2VsbGF0aW9uTGV2ZWwgPSBOVUxMOworICAgIFdDYXBzLlJlc2VydmVkNSA9IE5VTEw7CisgICAgV0NhcHMuTWFzdGVyQWRhcHRlck9yZGluYWwgPSBOVUxMOworICAgIFdDYXBzLkFkYXB0ZXJPcmRpbmFsSW5Hcm91cCA9IE5VTEw7CisgICAgV0NhcHMuTnVtYmVyT2ZBZGFwdGVyc0luR3JvdXAgPSBOVUxMOworICAgIFdDYXBzLkRlY2xUeXBlcyA9IE5VTEw7CisgICAgV0NhcHMuTnVtU2ltdWx0YW5lb3VzUlRzID0gTlVMTDsKKyAgICBXQ2Fwcy5TdHJldGNoUmVjdEZpbHRlckNhcHMgPSBOVUxMOworICAgIC8qIFdDYXBzLlZTMjBDYXBzID0gTlVMTDsgKi8KKyAgICAvKiBXQ2Fwcy5QUzIwQ2FwcyA9IE5VTEw7ICovCisgICAgV0NhcHMuVmVydGV4VGV4dHVyZUZpbHRlckNhcHMgPSBOVUxMOworICAgIFdDYXBzLk1heFZTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IE5VTEw7CisgICAgV0NhcHMuTWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gTlVMTDsKKyAgICBXQ2Fwcy5NYXhWZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBOVUxMOworICAgIFdDYXBzLk1heFBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gTlVMTDsKKyAgICBXQ2Fwcy5SZXNlcnZlZDIgPSBOVUxMOworICAgIFdDYXBzLlJlc2VydmVkMyA9IE5VTEw7CisKKyAgICAvKiBOb3cgZ2V0IHRoZSBjYXBzICovCisgICAgaHIgPSBJV2luZUQzRF9HZXREZXZpY2VDYXBzKFdpbmVEM0QsIDAsIFdJTkVEM0RERVZUWVBFX0hBTCwgJldDYXBzKTsKKyAgICBpZihociAhPSBEM0RfT0spIHJldHVybiBocjsKKworICAgIC8qIEZpbGwgdGhlIG1pc3NpbmcgbWVtYmVycywgYW5kIGRvIHNvbWUgZml4dXAgKi8KKyAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTaXplID0gc2l6ZW9mKERlc2M3LT5kcGNMaW5lQ2Fwcyk7CisgICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwcyA9IEQzRFBUQkxFTkRDQVBTX0FERCB8IEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBUQkxFTkRDQVBTX0NPUFkgfCBEM0RQVEJMRU5EQ0FQU19ERUNBTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBUQkxFTkRDQVBTX0RFQ0FMQUxQSEEgfCBEM0RQVEJMRU5EQ0FQU19ERUNBTE1BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURSB8IEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFQUxQSEE7CisgICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3U3RpcHBsZVdpZHRoID0gMzI7CisgICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3U3RpcHBsZUhlaWdodCA9IDMyOworICAgIC8qIFVzZSB0aGUgc2FtZSBmb3IgdGhlIFRyaUNhcHMgKi8KKyAgICBEZXNjNy0+ZHBjVHJpQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2FwczsKKworICAgIERlc2M3LT5kd0RldmljZVJlbmRlckJpdERlcHRoID0gRERCRF8xNiB8IEREQkRfMjQgfCBEREJEXzMyOworICAgIERlc2M3LT5kd0RldmljZVpCdWZmZXJCaXREZXB0aCA9IEREQkRfMTYgfCBEREJEXzI0OworICAgIERlc2M3LT5kd01pblRleHR1cmVXaWR0aCA9IDE7CisgICAgRGVzYzctPmR3TWluVGV4dHVyZUhlaWdodCA9IDE7CisKKyAgICAvKiBDb252ZXJ0IERXT1JEcyBzYWZlbHkgdG8gV09SRHMgKi8KKyAgICBpZihNYXhUZXh0dXJlQmxlbmRTdGFnZXMgPiA2NTUzNSkgRGVzYzctPndNYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSA2NTUzNTsKKyAgICBlbHNlIERlc2M3LT53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gKFdPUkQpIE1heFRleHR1cmVCbGVuZFN0YWdlczsKKyAgICBpZihNYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA+IDY1NTM1KSBEZXNjNy0+d01heFNpbXVsdGFuZW91c1RleHR1cmVzID0gNjU1MzU7CisgICAgZWxzZSBEZXNjNy0+d01heFNpbXVsdGFuZW91c1RleHR1cmVzID0gKFdPUkQpIE1heFNpbXVsdGFuZW91c1RleHR1cmVzOworCisgICAgaWYoTWF4VXNlckNsaXBQbGFuZXMgPiA2NTUzNSkgRGVzYzctPndNYXhVc2VyQ2xpcFBsYW5lcyA9IDY1NTM1OworICAgIGVsc2UgRGVzYzctPndNYXhVc2VyQ2xpcFBsYW5lcyA9IChXT1JEKSBNYXhVc2VyQ2xpcFBsYW5lczsKKyAgICBpZihNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzID4gNjU1MzUpIERlc2M3LT53TWF4VmVydGV4QmxlbmRNYXRyaWNlcyA9IDY1NTM1OworICAgIGVsc2UgRGVzYzctPndNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzID0gKFdPUkQpIE1heFZlcnRleEJsZW5kTWF0cmljZXM7CisKKyAgICBEZXNjNy0+ZGV2aWNlR1VJRCA9IElJRF9JRGlyZWN0M0RUbkxIYWxEZXZpY2U7CisKKyAgICBEZXNjNy0+ZHdSZXNlcnZlZDEgPSAwOworICAgIERlc2M3LT5kd1Jlc2VydmVkMiA9IDA7CisgICAgRGVzYzctPmR3UmVzZXJ2ZWQzID0gMDsKKyAgICBEZXNjNy0+ZHdSZXNlcnZlZDQgPSAwOworCisgICAgLyogRmlsbCB0aGUgb2xkIHN0cnVjdHVyZSAqLworICAgIG1lbXNldChEZXNjMTIzLCAweDAsIHNpemVvZihEM0RERVZJQ0VERVNDKSk7CisgICAgRGVzYzEyMy0+ZHdTaXplID0gc2l6ZW9mKEQzRERFVklDRURFU0MpOworICAgIERlc2MxMjMtPmR3RmxhZ3MgPSBEM0RERF9DT0xPUk1PREVMICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9ERVZDQVBTICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9UUkFOU0ZPUk1DQVBTICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9CQ0xJUFBJTkcgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9MSUdIVElOR0NBUFMgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9MSU5FQ0FQUyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9UUklDQVBTICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9ERVZJQ0VSRU5ERVJCSVRERVBUSCAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9ERVZJQ0VaQlVGRkVSQklUREVQVEggfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9NQVhCVUZGRVJTSVpFICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9NQVhWRVJURVhDT1VOVDsKKyAgICBEZXNjMTIzLT5kY21Db2xvck1vZGVsID0gRDNEQ09MT1JfUkdCOworICAgIERlc2MxMjMtPmR3RGV2Q2FwcyA9IERlc2M3LT5kd0RldkNhcHM7CisgICAgRGVzYzEyMy0+ZHRjVHJhbnNmb3JtQ2Fwcy5kd1NpemUgPSBzaXplb2YoRDNEVFJBTlNGT1JNQ0FQUyk7CisgICAgRGVzYzEyMy0+ZHRjVHJhbnNmb3JtQ2Fwcy5kd0NhcHMgPSBEM0RUUkFOU0ZPUk1DQVBTX0NMSVA7CisgICAgRGVzYzEyMy0+YkNsaXBwaW5nID0gVFJVRTsKKyAgICBEZXNjMTIzLT5kbGNMaWdodGluZ0NhcHMuZHdTaXplID0gc2l6ZW9mKEQzRExJR0hUSU5HQ0FQUyk7CisgICAgRGVzYzEyMy0+ZGxjTGlnaHRpbmdDYXBzLmR3Q2FwcyA9IEQzRExJR0hUQ0FQU19ESVJFQ1RJT05BTCB8IEQzRExJR0hUQ0FQU19QQVJBTExFTFBPSU5UIHwgRDNETElHSFRDQVBTX1BPSU5UIHwgRDNETElHSFRDQVBTX1NQT1Q7CisgICAgRGVzYzEyMy0+ZGxjTGlnaHRpbmdDYXBzLmR3TGlnaHRpbmdNb2RlbCA9IEQzRExJR0hUSU5HTU9ERUxfUkdCOworICAgIERlc2MxMjMtPmRsY0xpZ2h0aW5nQ2Fwcy5kd051bUxpZ2h0cyA9IERlc2M3LT5kd01heEFjdGl2ZUxpZ2h0czsKKworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3U2l6ZSA9IHNpemVvZihEM0RQUklNQ0FQUyk7CisgICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdNaXNjQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd01pc2NDYXBzOworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3UmFzdGVyQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1Jhc3RlckNhcHM7CisgICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdaQ21wQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1pDbXBDYXBzOworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3U3JjQmxlbmRDYXBzOworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3RGVzdEJsZW5kQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd0Rlc3RCbGVuZENhcHM7CisgICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdTaGFkZUNhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTaGFkZUNhcHM7CisgICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzOworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUZpbHRlckNhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlRmlsdGVyQ2FwczsKKyAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVCbGVuZENhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQmxlbmRDYXBzOworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzOworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3U3RpcHBsZVdpZHRoID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3U3RpcHBsZVdpZHRoOworICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3QWxwaGFDbXBDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3QWxwaGFDbXBDYXBzOworCisgICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1NpemUgPSBzaXplb2YoRDNEUFJJTUNBUFMpOworICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdNaXNjQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3TWlzY0NhcHM7CisgICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1Jhc3RlckNhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1Jhc3RlckNhcHM7CisgICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1pDbXBDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdaQ21wQ2FwczsKKyAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3U3JjQmxlbmRDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdTcmNCbGVuZENhcHM7CisgICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd0Rlc3RCbGVuZENhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd0Rlc3RCbGVuZENhcHM7CisgICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1NoYWRlQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3U2hhZGVDYXBzOworICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHM7CisgICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdUZXh0dXJlRmlsdGVyQ2FwczsKKyAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3VGV4dHVyZUJsZW5kQ2FwczsKKyAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdUZXh0dXJlQWRkcmVzc0NhcHM7CisgICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1N0aXBwbGVXaWR0aCA9IERlc2M3LT5kcGNUcmlDYXBzLmR3U3RpcHBsZVdpZHRoOworICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdBbHBoYUNtcENhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd0FscGhhQ21wQ2FwczsKKworICAgIERlc2MxMjMtPmR3RGV2aWNlUmVuZGVyQml0RGVwdGggPSBEZXNjNy0+ZHdEZXZpY2VSZW5kZXJCaXREZXB0aDsKKyAgICBEZXNjMTIzLT5kd0RldmljZVpCdWZmZXJCaXREZXB0aCA9IERlc2M3LT5kd0RldmljZVpCdWZmZXJCaXREZXB0aDsKKyAgICBEZXNjMTIzLT5kd01heEJ1ZmZlclNpemUgPSAwOworICAgIERlc2MxMjMtPmR3TWF4VmVydGV4Q291bnQgPSA2NTUzNjsKKyAgICBEZXNjMTIzLT5kd01pblRleHR1cmVXaWR0aCAgPSBEZXNjNy0+ZHdNaW5UZXh0dXJlV2lkdGg7CisgICAgRGVzYzEyMy0+ZHdNaW5UZXh0dXJlSGVpZ2h0ID0gRGVzYzctPmR3TWluVGV4dHVyZUhlaWdodDsKKyAgICBEZXNjMTIzLT5kd01heFRleHR1cmVXaWR0aCAgPSBEZXNjNy0+ZHdNYXhUZXh0dXJlV2lkdGg7CisgICAgRGVzYzEyMy0+ZHdNYXhUZXh0dXJlSGVpZ2h0ID0gRGVzYzctPmR3TWF4VGV4dHVyZUhlaWdodDsKKyAgICBEZXNjMTIzLT5kd01pblN0aXBwbGVXaWR0aCAgPSAxOworICAgIERlc2MxMjMtPmR3TWluU3RpcHBsZUhlaWdodCA9IDE7CisgICAgRGVzYzEyMy0+ZHdNYXhTdGlwcGxlV2lkdGggID0gMzI7CisgICAgRGVzYzEyMy0+ZHdNYXhTdGlwcGxlSGVpZ2h0ID0gMzI7CisgICAgRGVzYzEyMy0+ZHdNYXhUZXh0dXJlUmVwZWF0ID0gRGVzYzctPmR3TWF4VGV4dHVyZVJlcGVhdDsKKyAgICBEZXNjMTIzLT5kd01heFRleHR1cmVBc3BlY3RSYXRpbyA9IERlc2M3LT5kd01heFRleHR1cmVBc3BlY3RSYXRpbzsKKyAgICBEZXNjMTIzLT5kd01heEFuaXNvdHJvcHkgPSBEZXNjNy0+ZHdNYXhBbmlzb3Ryb3B5OworICAgIERlc2MxMjMtPmR2R3VhcmRCYW5kTGVmdCA9IERlc2M3LT5kdkd1YXJkQmFuZExlZnQ7CisgICAgRGVzYzEyMy0+ZHZHdWFyZEJhbmRSaWdodCA9IERlc2M3LT5kdkd1YXJkQmFuZFJpZ2h0OworICAgIERlc2MxMjMtPmR2R3VhcmRCYW5kVG9wID0gRGVzYzctPmR2R3VhcmRCYW5kVG9wOworICAgIERlc2MxMjMtPmR2R3VhcmRCYW5kQm90dG9tID0gRGVzYzctPmR2R3VhcmRCYW5kQm90dG9tOworICAgIERlc2MxMjMtPmR2RXh0ZW50c0FkanVzdCA9IERlc2M3LT5kdkV4dGVudHNBZGp1c3Q7CisgICAgRGVzYzEyMy0+ZHdTdGVuY2lsQ2FwcyA9IERlc2M3LT5kd1N0ZW5jaWxDYXBzOworICAgIERlc2MxMjMtPmR3RlZGQ2FwcyA9IERlc2M3LT5kd0ZWRkNhcHM7CisgICAgRGVzYzEyMy0+ZHdUZXh0dXJlT3BDYXBzID0gRGVzYzctPmR3VGV4dHVyZU9wQ2FwczsKKyAgICBEZXNjMTIzLT53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gRGVzYzctPndNYXhUZXh0dXJlQmxlbmRTdGFnZXM7CisgICAgRGVzYzEyMy0+d01heFNpbXVsdGFuZW91c1RleHR1cmVzID0gRGVzYzctPndNYXhTaW11bHRhbmVvdXNUZXh0dXJlczsKKworICAgIHJldHVybiBERF9PSzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEIHZ0YWJsZXMgaW4gdmFyaW91cyB2ZXJzaW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBJRGlyZWN0M0RWdGJsIElEaXJlY3QzRDFfVnRibCA9Cit7CisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfUXVlcnlJbnRlcmZhY2UsCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0FkZFJlZiwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfUmVsZWFzZSwKKyAgICAvKioqIElEaXJlY3QzRCBtZXRob2RzICoqKi8KKyAgICBJRGlyZWN0M0RJbXBsXzFfSW5pdGlhbGl6ZSwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfRW51bURldmljZXMsCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZUxpZ2h0LAorICAgIFRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVNYXRlcmlhbCwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlVmlld3BvcnQsCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0ZpbmREZXZpY2UKK307CisKK2NvbnN0IElEaXJlY3QzRDJWdGJsIElEaXJlY3QzRDJfVnRibCA9Cit7CisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfUXVlcnlJbnRlcmZhY2UsCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0FkZFJlZiwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfUmVsZWFzZSwKKyAgICAvKioqIElEaXJlY3QzRDIgbWV0aG9kcyAqKiovCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0VudW1EZXZpY2VzLAorICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVMaWdodCwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlTWF0ZXJpYWwsCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZVZpZXdwb3J0LAorICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9GaW5kRGV2aWNlLAorICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVEZXZpY2UKK307CisKK2NvbnN0IElEaXJlY3QzRDNWdGJsIElEaXJlY3QzRDNfVnRibCA9Cit7CisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UsCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX0FkZFJlZiwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfUmVsZWFzZSwKKyAgICAvKioqIElEaXJlY3QzRDMgbWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNESW1wbF8zX0VudW1EZXZpY2VzLAorICAgIElEaXJlY3QzREltcGxfM19DcmVhdGVMaWdodCwKKyAgICBJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlTWF0ZXJpYWwsCisgICAgSURpcmVjdDNESW1wbF8zX0NyZWF0ZVZpZXdwb3J0LAorICAgIElEaXJlY3QzREltcGxfM19GaW5kRGV2aWNlLAorICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVEZXZpY2UsCisgICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX0NyZWF0ZVZlcnRleEJ1ZmZlciwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfRW51bVpCdWZmZXJGb3JtYXRzLAorICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19FdmljdE1hbmFnZWRUZXh0dXJlcworfTsKKworY29uc3QgSURpcmVjdDNEN1Z0YmwgSURpcmVjdDNEN19WdGJsID0KK3sKKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLworICAgIFRodW5rX0lEaXJlY3QzREltcGxfN19RdWVyeUludGVyZmFjZSwKKyAgICBUaHVua19JRGlyZWN0M0RJbXBsXzdfQWRkUmVmLAorICAgIFRodW5rX0lEaXJlY3QzREltcGxfN19SZWxlYXNlLAorICAgIC8qKiogSURpcmVjdDNENyBtZXRob2RzICoqKi8KKyAgICBJRGlyZWN0M0RJbXBsXzdfRW51bURldmljZXMsCisgICAgSURpcmVjdDNESW1wbF83X0NyZWF0ZURldmljZSwKKyAgICBJRGlyZWN0M0RJbXBsXzdfQ3JlYXRlVmVydGV4QnVmZmVyLAorICAgIElEaXJlY3QzREltcGxfN19FbnVtWkJ1ZmZlckZvcm1hdHMsCisgICAgSURpcmVjdDNESW1wbF83X0V2aWN0TWFuYWdlZFRleHR1cmVzCit9OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kaXJlY3QzZF9tYWluLmMgYi9kbGxzL2RkcmF3L2RpcmVjdDNkX21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxNWQ5Zi4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L2RpcmVjdDNkX21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDAgTWFyY3VzIE1laXNzbmVyCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAid2luZGVmLmgiCi0jaW5jbHVkZSAid2luYmFzZS5oIgotI2luY2x1ZGUgIndpbmdkaS5oIgotI2luY2x1ZGUgImRkcmF3LmgiCi0jaW5jbHVkZSAiZDNkLmgiCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotCi0jaW5jbHVkZSAiZDNkX3ByaXZhdGUuaCIKLQotV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwotCi0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfMV9Jbml0aWFsaXplKExQRElSRUNUM0QgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcykgbm8tb3AuLi5cbiIsIFRoaXMsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzNfMlRfMVRfRW51bURldmljZXMoTFBESVJFQ1QzRDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgbHBFbnVtRGV2aWNlc0NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwVXNlckFyZykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwLCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscEVudW1EZXZpY2VzQ2FsbGJhY2ssIGxwVXNlckFyZyk7Ci0gICAgcmV0dXJuIEQzRF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNESW1wbF8zXzJUXzFUX0NyZWF0ZUxpZ2h0KExQRElSRUNUM0QzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRExJR0hUKiBscGxwRGlyZWN0M0RMaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBscERpcmVjdDNETGlnaHQsIHBVbmtPdXRlcik7Ci0gICAgcmV0dXJuIEQzRF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNESW1wbF8zXzJUXzFUX0NyZWF0ZU1hdGVyaWFsKExQRElSRUNUM0QzIGlmYWNlLAotCQkJCQkgIExQRElSRUNUM0RNQVRFUklBTDMqIGxwbHBEaXJlY3QzRE1hdGVyaWFsMywKLQkJCQkJICBJVW5rbm93biogcFVua091dGVyKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwbHBEaXJlY3QzRE1hdGVyaWFsMywgcFVua091dGVyKTsKLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzNfMlRfMVRfQ3JlYXRlVmlld3BvcnQoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJCSAgTFBESVJFQ1QzRFZJRVdQT1JUMyogbHBscEQzRFZpZXdwb3J0MywKLQkJCQkJICBJVW5rbm93biogcFVua091dGVyKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwbHBEM0RWaWV3cG9ydDMsIHBVbmtPdXRlcik7Ci0gICAgcmV0dXJuIEQzRF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNESW1wbF8zXzJUXzFUX0ZpbmREZXZpY2UoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJICAgICAgTFBEM0RGSU5EREVWSUNFU0VBUkNIIGxwRDNEREZTLAotCQkJCSAgICAgIExQRDNERklORERFVklDRVJFU1VMVCBscEQzREZEUikKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwLCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscEQzRERGUywgbHBEM0RGRFIpOwotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfMl9DcmVhdGVEZXZpY2UoTFBESVJFQ1QzRDIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmNsc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UgbHBERFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRERFVklDRTIqIGxwbHBEM0REZXZpY2UyKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXMsJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmNsc2lkKSwgbHBERFMsIGxwbHBEM0REZXZpY2UyKTsKLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzNfQ3JlYXRlRGV2aWNlKExQRElSRUNUM0QzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJjbHNpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBscEREUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEREVWSUNFMyogbHBscEQzRERldmljZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVTktOT1dOIGxwVW5rKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXMsJXAsJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmNsc2lkKSwgbHBERFMsIGxwbHBEM0REZXZpY2UzLCBscFVuayk7Ci0gICAgcmV0dXJuIEQzRF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNESW1wbF83XzNUX0VudW1aQnVmZmVyRm9ybWF0cyhMUERJUkVDVDNENyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZDTFNJRCByaWlkRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGxwRW51bUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscENvbnRleHQpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcywlcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkRGV2aWNlKSwgbHBFbnVtQ2FsbGJhY2ssIGxwQ29udGV4dCk7Ci0gICAgcmV0dXJuIEQzRF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNESW1wbF83XzNUX0V2aWN0TWFuYWdlZFRleHR1cmVzKExQRElSRUNUM0Q3IGlmYWNlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlKTsKLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RJbXBsXzdfRW51bURldmljZXMoTFBESVJFQ1QzRDcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0s3IGxwRW51bURldmljZXNDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFVzZXJBcmcpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBFbnVtRGV2aWNlc0NhbGxiYWNrLCBscFVzZXJBcmcpOwotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfN19DcmVhdGVEZXZpY2UoTFBESVJFQ1QzRDcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmNsc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IGxwRERTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RERVZJQ0U3KiBscGxwRDNERGV2aWNlKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXMsJXAsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmNsc2lkKSwgbHBERFMsIGxwbHBEM0REZXZpY2UpOwotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREltcGxfN18zVF9DcmVhdGVWZXJ0ZXhCdWZmZXIoTFBESVJFQ1QzRDcgaWZhY2UsCi0JCQkJCSAgIExQRDNEVkVSVEVYQlVGRkVSREVTQyBscEQzRFZlcnRCdWZEZXNjLAotCQkJCQkgICBMUERJUkVDVDNEVkVSVEVYQlVGRkVSNyogbHBscEQzRFZlcnRCdWYsCi0JCQkJCSAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBEM0RWZXJ0QnVmRGVzYywgbHBscEQzRFZlcnRCdWYsIGR3RmxhZ3MpOwotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzdfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRDcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXc3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwotICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgSURpcmVjdERyYXc3LCBpZmFjZSksCi0JCQkJICAgICAgIHJpaWQsCi0JCQkJICAgICAgIG9icCk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXc3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwotICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgSURpcmVjdERyYXc3LCBpZmFjZSksCi0JCQkJICAgICAgIHJpaWQsCi0JCQkJICAgICAgIG9icCk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzJfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRDIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXc3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwotICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgSURpcmVjdERyYXc3LCBpZmFjZSksCi0JCQkJICAgICAgIHJpaWQsCi0JCQkJICAgICAgIG9icCk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzFfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRCBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3N19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIElEaXJlY3REcmF3NywgaWZhY2UpLAotCQkJCSAgICAgICByaWlkLAotCQkJCSAgICAgICBvYnApOwotfQotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfN19BZGRSZWYoTFBESVJFQ1QzRDcgaWZhY2UpCi17Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3NyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgSURpcmVjdERyYXc3LCBpZmFjZSkpOwotfQotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfM19BZGRSZWYoTFBESVJFQ1QzRDMgaWZhY2UpCi17Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3NyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgSURpcmVjdERyYXc3LCBpZmFjZSkpOwotfQotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMl9BZGRSZWYoTFBESVJFQ1QzRDIgaWZhY2UpCi17Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3NyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgSURpcmVjdERyYXc3LCBpZmFjZSkpOwotfQotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMV9BZGRSZWYoTFBESVJFQ1QzRCBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXc3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdERyYXc3X0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIElEaXJlY3REcmF3NywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzdfUmVsZWFzZShMUERJUkVDVDNENyBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXc3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdERyYXc3X1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgSURpcmVjdERyYXc3LCBpZmFjZSkpOwotfQotCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfM19SZWxlYXNlKExQRElSRUNUM0QzIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwotICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBJRGlyZWN0RHJhdzcsIGlmYWNlKSk7Ci19Ci0KLVVMT05HIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX1JlbGVhc2UoTFBESVJFQ1QzRDIgaWZhY2UpCi17Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3NyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3N19SZWxlYXNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIElEaXJlY3REcmF3NywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzFfUmVsZWFzZShMUERJUkVDVDNEIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwotICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIElEaXJlY3REcmF3NywgaWZhY2UpKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfM19FbnVtWkJ1ZmZlckZvcm1hdHMoTFBESVJFQ1QzRDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJpaWREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIGxwRW51bUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBDb250ZXh0KQotewotICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZERldmljZSksIGxwRW51bUNhbGxiYWNrLCBscENvbnRleHQpOwotICAgIHJldHVybiBJRGlyZWN0M0Q3X0VudW1aQnVmZmVyRm9ybWF0cyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBJRGlyZWN0M0Q3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRW51bUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENvbnRleHQpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8zX0V2aWN0TWFuYWdlZFRleHR1cmVzKExQRElSRUNUM0QzIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0Q3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNEN19FdmljdE1hbmFnZWRUZXh0dXJlcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBJRGlyZWN0M0Q3LCBpZmFjZSkpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX0VudW1EZXZpY2VzKExQRElSRUNUM0QyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBscEVudW1EZXZpY2VzQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwVXNlckFyZykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscEVudW1EZXZpY2VzQ2FsbGJhY2ssIGxwVXNlckFyZyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRDNfRW51bURldmljZXMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgSURpcmVjdDNEMywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRW51bURldmljZXNDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFVzZXJBcmcpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZUxpZ2h0KExQRElSRUNUM0QyIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RMSUdIVCogbHBscERpcmVjdDNETGlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24qIHBVbmtPdXRlcikKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscGxwRGlyZWN0M0RMaWdodCwgcFVua091dGVyKTsKLSAgICByZXR1cm4gSURpcmVjdDNEM19DcmVhdGVMaWdodChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBJRGlyZWN0M0QzLCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBscERpcmVjdDNETGlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVua091dGVyKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVMaWdodChMUERJUkVDVDNEIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RMSUdIVCogbHBscERpcmVjdDNETGlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24qIHBVbmtPdXRlcikKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscGxwRGlyZWN0M0RMaWdodCwgcFVua091dGVyKTsKLSAgICByZXR1cm4gSURpcmVjdDNEM19DcmVhdGVMaWdodChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIElEaXJlY3QzRDMsIGlmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGxwRGlyZWN0M0RMaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVW5rT3V0ZXIpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZU1hdGVyaWFsKExQRElSRUNUM0QgaWZhY2UsCi0JCQkJICAgICBMUERJUkVDVDNETUFURVJJQUwqIGxwbHBEaXJlY3QzRE1hdGVyaWFsLAotCQkJCSAgICAgSVVua25vd24qIHBVbmtPdXRlcikKLXsKLSAgICBIUkVTVUxUIHJldDsKLSAgICBMUERJUkVDVDNETUFURVJJQUwzIHJldF92YWw7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscGxwRGlyZWN0M0RNYXRlcmlhbCwgcFVua091dGVyKTsKLSAgICByZXQgPSBJRGlyZWN0M0QzX0NyZWF0ZU1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgSURpcmVjdDNEMywgaWZhY2UpLAotCQkJCSAgICAmcmV0X3ZhbCwKLQkJCQkgICAgcFVua091dGVyKTsKLQotICAgICpscGxwRGlyZWN0M0RNYXRlcmlhbCA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgSURpcmVjdDNETWF0ZXJpYWwsIHJldF92YWwpOwotCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwLlxuIiwgKmxwbHBEaXJlY3QzRE1hdGVyaWFsKTsKLSAgICAKLSAgICByZXR1cm4gcmV0OwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZVZpZXdwb3J0KExQRElSRUNUM0QgaWZhY2UsCi0JCQkJICAgICBMUERJUkVDVDNEVklFV1BPUlQqIGxwbHBEM0RWaWV3cG9ydCwKLQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBscEQzRFZpZXdwb3J0LCBwVW5rT3V0ZXIpOwotICAgIHJldHVybiBJRGlyZWN0M0QzX0NyZWF0ZVZpZXdwb3J0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgSURpcmVjdDNEMywgaWZhY2UpLAotCQkJCSAgICAoTFBESVJFQ1QzRFZJRVdQT1JUMyAqKSBscGxwRDNEVmlld3BvcnQgLyogTm8gbmVlZCB0byBjYXN0IGhlcmUgKi8sCi0JCQkJICAgIHBVbmtPdXRlcik7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlTWF0ZXJpYWwoTFBESVJFQ1QzRDIgaWZhY2UsCi0JCQkJICAgICBMUERJUkVDVDNETUFURVJJQUwyKiBscGxwRGlyZWN0M0RNYXRlcmlhbDIsCi0JCQkJICAgICBJVW5rbm93biogcFVua091dGVyKQotewotICAgIEhSRVNVTFQgcmV0OwotICAgIExQRElSRUNUM0RNQVRFUklBTDMgcmV0X3ZhbDsKLQotICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwbHBEaXJlY3QzRE1hdGVyaWFsMiwgcFVua091dGVyKTsKLSAgICByZXQgPSBJRGlyZWN0M0QzX0NyZWF0ZU1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIElEaXJlY3QzRDMsIGlmYWNlKSwKLQkJCQkgICAgJnJldF92YWwsCi0JCQkJICAgIHBVbmtPdXRlcik7Ci0KLSAgICAqbHBscERpcmVjdDNETWF0ZXJpYWwyID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBJRGlyZWN0M0RNYXRlcmlhbDIsIHJldF92YWwpOwotCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwLlxuIiwgKmxwbHBEaXJlY3QzRE1hdGVyaWFsMik7Ci0gICAgCi0gICAgcmV0dXJuIHJldDsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVWaWV3cG9ydChMUERJUkVDVDNEMiBpZmFjZSwKLQkJCQkgICAgIExQRElSRUNUM0RWSUVXUE9SVDIqIGxwbHBEM0RWaWV3cG9ydDIsCi0JCQkJICAgICBJVW5rbm93biogcFVua091dGVyKQotewotICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwbHBEM0RWaWV3cG9ydDIsIHBVbmtPdXRlcik7Ci0gICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlVmlld3BvcnQoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgSURpcmVjdDNEMywgaWZhY2UpLAotCQkJCSAgICAgKExQRElSRUNUM0RWSUVXUE9SVDMgKikgbHBscEQzRFZpZXdwb3J0MiAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSAqLywKLQkJCQkgICAgIHBVbmtPdXRlcik7Ci19Ci0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVWZXJ0ZXhCdWZmZXIoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJCSBMUEQzRFZFUlRFWEJVRkZFUkRFU0MgbHBEM0RWZXJ0QnVmRGVzYywKLQkJCQkJIExQRElSRUNUM0RWRVJURVhCVUZGRVIqIGxwbHBEM0RWZXJ0QnVmLAotCQkJCQkgRFdPUkQgZHdGbGFncywKLQkJCQkJIExQVU5LTk9XTiBscFVuaykKLXsKLSAgICBIUkVTVUxUIHJldDsKLSAgICBMUERJUkVDVDNEVkVSVEVYQlVGRkVSNyByZXRfdmFsOwotCi0gICAgVFJBQ0UoIiglcCktPiglcCwlcCwlMDhseCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNENyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEM0RWZXJ0QnVmRGVzYywgbHBscEQzRFZlcnRCdWYsIGR3RmxhZ3MsIGxwVW5rKTsKLSAgICAKLSAgICAvKiBkd0ZsYWdzIGlzIG5vdCB1c2VkIGluIHRoZSBEM0Q3IGludGVyZmFjZSwgdXNlIHRoZSB2ZXJ0ZXggYnVmZmVyIGRlc2NyaXB0aW9uIGluc3RlYWQgKi8KLSAgICBpZiAoZHdGbGFncyAmIEQzRERQX0RPTk9UQ0xJUCkgbHBEM0RWZXJ0QnVmRGVzYy0+ZHdDYXBzIHw9IEQzRFZCQ0FQU19ET05PVENMSVA7Ci0KLSAgICByZXQgPSBJRGlyZWN0M0Q3X0NyZWF0ZVZlcnRleEJ1ZmZlcihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBJRGlyZWN0M0Q3LCBpZmFjZSksCi0JCQkJCWxwRDNEVmVydEJ1ZkRlc2MsCi0JCQkJCSZyZXRfdmFsLAotCQkJCQlkd0ZsYWdzKTsKLQotICAgICpscGxwRDNEVmVydEJ1ZiA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIsIHJldF92YWwpOwotCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaW50ZXJmYWNlICVwLlxuIiwgKmxwbHBEM0RWZXJ0QnVmKTsKLSAgICAKLSAgICByZXR1cm4gcmV0OwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8xX0ZpbmREZXZpY2UoTFBESVJFQ1QzRCBpZmFjZSwKLQkJCQkgTFBEM0RGSU5EREVWSUNFU0VBUkNIIGxwRDNEREZTLAotCQkJCSBMUEQzREZJTkRERVZJQ0VSRVNVTFQgbHBscEQzRERldmljZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscEQzRERGUywgbHBscEQzRERldmljZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRDNfRmluZERldmljZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIElEaXJlY3QzRDMsIGlmYWNlKSwKLQkJCQkgbHBEM0RERlMsCi0JCQkJIGxwbHBEM0REZXZpY2UpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNESW1wbF8yX0ZpbmREZXZpY2UoTFBESVJFQ1QzRDIgaWZhY2UsCi0JCQkJIExQRDNERklORERFVklDRVNFQVJDSCBscEQzRERGUywKLQkJCQkgTFBEM0RGSU5EREVWSUNFUkVTVUxUIGxwRDNERkRSKQotewotICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRDNEREZTLCBscEQzREZEUik7Ci0gICAgcmV0dXJuIElEaXJlY3QzRDNfRmluZERldmljZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBJRGlyZWN0M0QzLCBpZmFjZSksCi0JCQkJIGxwRDNEREZTLAotCQkJCSBscEQzREZEUik7Ci19CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RpcmVjdDNkX29wZW5nbC5jIGIvZGxscy9kZHJhdy9kaXJlY3QzZF9vcGVuZ2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNzlhOC4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L2RpcmVjdDNkX29wZW5nbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMCBNYXJjdXMgTWVpc3NuZXIKLSAqIENvcHlyaWdodCAyMDAwIFBldGVyIEh1bm5pc2V0dAotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCi0jZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKLQotI2luY2x1ZGUgIndpbmRlZi5oIgotI2luY2x1ZGUgIndpbmJhc2UuaCIKLSNpbmNsdWRlICJ3aW5nZGkuaCIKLSNpbmNsdWRlICJkM2QuaCIKLSNpbmNsdWRlICJkZHJhdy5oIgotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0KLSNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCi0jaW5jbHVkZSAiZDNkX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJvcGVuZ2xfcHJpdmF0ZS5oIgotCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotCi1XSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RJbXBsXzFfRW51bURldmljZXMoTFBESVJFQ1QzRCBpZmFjZSwKLQkJCSAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgbHBFbnVtRGV2aWNlc0NhbGxiYWNrLAotCQkJICAgICAgIExQVk9JRCBscFVzZXJBcmcpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRW51bURldmljZXNDYWxsYmFjaywgbHBVc2VyQXJnKTsKLQotICAgIC8qIENhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gZDNkZGV2aWNlcy5jICovCi0gICAgaWYgKGQzZGRldmljZV9lbnVtZXJhdGUobHBFbnVtRGV2aWNlc0NhbGxiYWNrLCBscFVzZXJBcmcsIDEpICE9IEQzREVOVU1SRVRfT0spCi0JcmV0dXJuIEQzRF9PSzsKLQotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RJbXBsXzJfRW51bURldmljZXMoTFBESVJFQ1QzRDIgaWZhY2UsCi0JCQkJICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgbHBFbnVtRGV2aWNlc0NhbGxiYWNrLAotCQkJCSAgTFBWT0lEIGxwVXNlckFyZykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRW51bURldmljZXNDYWxsYmFjaywgbHBVc2VyQXJnKTsKLQotICAgIC8qIENhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gZDNkZGV2aWNlcy5jICovCi0gICAgaWYgKGQzZGRldmljZV9lbnVtZXJhdGUobHBFbnVtRGV2aWNlc0NhbGxiYWNrLCBscFVzZXJBcmcsIDIpICE9IEQzREVOVU1SRVRfT0spCi0JcmV0dXJuIEQzRF9PSzsKLQotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RJbXBsXzNfRW51bURldmljZXMoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0sgbHBFbnVtRGV2aWNlc0NhbGxiYWNrLAotCQkJCSAgTFBWT0lEIGxwVXNlckFyZykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRW51bURldmljZXNDYWxsYmFjaywgbHBVc2VyQXJnKTsKLQotICAgIC8qIENhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gZDNkZGV2aWNlcy5jICovCi0gICAgaWYgKGQzZGRldmljZV9lbnVtZXJhdGUobHBFbnVtRGV2aWNlc0NhbGxiYWNrLCBscFVzZXJBcmcsIDMpICE9IEQzREVOVU1SRVRfT0spCi0JcmV0dXJuIEQzRF9PSzsKLQotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RJbXBsXzNfMlRfMVRfQ3JlYXRlTGlnaHQoTFBESVJFQ1QzRDMgaWZhY2UsCi0JCQkJICAgICBMUERJUkVDVDNETElHSFQqIGxwbHBEaXJlY3QzRExpZ2h0LAotCQkJCSAgICAgSVVua25vd24qIHBVbmtPdXRlcikKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKLSAgICBJRGlyZWN0M0RMaWdodEltcGwgKmQzZGxpbXBsOwotICAgIEhSRVNVTFQgcmV0X3ZhbHVlOwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oJXAsJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBscERpcmVjdDNETGlnaHQsIHBVbmtPdXRlcik7Ci0KLSAgICByZXRfdmFsdWUgPSBkM2RsaWdodF9jcmVhdGUoJmQzZGxpbXBsLCBUaGlzKTsKLSAgICAqbHBscERpcmVjdDNETGlnaHQgPSBJQ09NX0lOVEVSRkFDRShkM2RsaW1wbCwgSURpcmVjdDNETGlnaHQpOwotCi0gICAgcmV0dXJuIHJldF92YWx1ZTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzREltcGxfM18yVF8xVF9DcmVhdGVNYXRlcmlhbChMUERJUkVDVDNEMyBpZmFjZSwKLQkJCQkJTFBESVJFQ1QzRE1BVEVSSUFMMyogbHBscERpcmVjdDNETWF0ZXJpYWwzLAotCQkJCQlJVW5rbm93biogcFVua091dGVyKQotewotICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqRDNEbWF0X2ltcGw7Ci0gICAgSFJFU1VMVCByZXRfdmFsdWU7Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7Ci0gICAgCi0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcClcbiIsIFRoaXMsIGlmYWNlLCBscGxwRGlyZWN0M0RNYXRlcmlhbDMsIHBVbmtPdXRlcik7Ci0gICAgcmV0X3ZhbHVlID0gZDNkbWF0ZXJpYWxfY3JlYXRlKCZEM0RtYXRfaW1wbCwgVGhpcyk7Ci0KLSAgICAqbHBscERpcmVjdDNETWF0ZXJpYWwzID0gSUNPTV9JTlRFUkZBQ0UoRDNEbWF0X2ltcGwsIElEaXJlY3QzRE1hdGVyaWFsMyk7Ci0KLSAgICByZXR1cm4gcmV0X3ZhbHVlOwotfQotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNESW1wbF8zXzJUXzFUX0NyZWF0ZVZpZXdwb3J0KExQRElSRUNUM0QzIGlmYWNlLAotCQkJCQlMUERJUkVDVDNEVklFV1BPUlQzKiBscGxwRDNEVmlld3BvcnQzLAotCQkJCQlJVW5rbm93biogcFVua091dGVyKQotewotICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqRDNEdnBfaW1wbDsKLSAgICBIUkVTVUxUIHJldF92YWx1ZTsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKLSAgICAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwbHBEM0RWaWV3cG9ydDMsIHBVbmtPdXRlcik7Ci0gICAgcmV0X3ZhbHVlID0gZDNkdmlld3BvcnRfY3JlYXRlKCZEM0R2cF9pbXBsLCBUaGlzKTsKLQotICAgICpscGxwRDNEVmlld3BvcnQzID0gSUNPTV9JTlRFUkZBQ0UoRDNEdnBfaW1wbCwgSURpcmVjdDNEVmlld3BvcnQzKTsKLQotICAgIHJldHVybiByZXRfdmFsdWU7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUCi1jcmVhdGVfZGV2aWNlX2hlbHBlcihJRGlyZWN0RHJhd0ltcGwgKlRoaXMsCi0JCSAgICAgUkVGQ0xTSUQgaWlkLAotCQkgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmxwRERTLAotCQkgICAgIHZvaWQgKipvYmosCi0JCSAgICAgaW50IHZlcnNpb24pIHsKLSAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpscGQzZGRldjsKLSAgICBIUkVTVUxUIHJldF92YWx1ZTsKLQotICAgIHJldF92YWx1ZSA9IGQzZGRldmljZV9jcmVhdGUoJmxwZDNkZGV2LCBUaGlzLCBscEREUywgdmVyc2lvbik7Ci0gICAgaWYgKEZBSUxFRChyZXRfdmFsdWUpKSByZXR1cm4gcmV0X3ZhbHVlOwotICAgIAotICAgIGlmICgoaWlkID09IE5VTEwpIHx8Ci0JKElzRXF1YWxHVUlEKCZJSURfRDNEREVWSUNFX09wZW5HTCwgaWlkKSkgfHwKLQkoSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RIQUxEZXZpY2UsIGlpZCkpIHx8Ci0JKElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNEVG5MSGFsRGV2aWNlLCBpaWQpKSB8fAotCShJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzRFJHQkRldmljZSwgaWlkKSkgfHwKLQkoSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RSZWZEZXZpY2UsIGlpZCkpKSB7Ci0gICAgICAgIHN3aXRjaCAodmVyc2lvbikgewotCSAgICBjYXNlIDE6Ci0JCSpvYmogPSBJQ09NX0lOVEVSRkFDRShscGQzZGRldiwgSURpcmVjdDNERGV2aWNlKTsKLQkgICAgICAgIFRSQUNFKCIgcmV0dXJuaW5nIE9wZW5HTCBEM0REZXZpY2UgJXAuXG4iLCAqb2JqKTsKLQkJcmV0dXJuIEQzRF9PSzsKLQotCSAgICBjYXNlIDI6Ci0JCSpvYmogPSBJQ09NX0lOVEVSRkFDRShscGQzZGRldiwgSURpcmVjdDNERGV2aWNlMik7Ci0JICAgICAgICBUUkFDRSgiIHJldHVybmluZyBPcGVuR0wgRDNERGV2aWNlMiAlcC5cbiIsICpvYmopOwotCQlyZXR1cm4gRDNEX09LOwotCi0JICAgIGNhc2UgMzoKLQkJKm9iaiA9IElDT01fSU5URVJGQUNFKGxwZDNkZGV2LCBJRGlyZWN0M0REZXZpY2UzKTsKLQkgICAgICAgIFRSQUNFKCIgcmV0dXJuaW5nIE9wZW5HTCBEM0REZXZpY2UzICVwLlxuIiwgKm9iaik7Ci0JCXJldHVybiBEM0RfT0s7Ci0KLQkgICAgY2FzZSA3OgotCQkqb2JqID0gSUNPTV9JTlRFUkZBQ0UobHBkM2RkZXYsIElEaXJlY3QzRERldmljZTcpOwotCSAgICAgICAgVFJBQ0UoIiByZXR1cm5pbmcgT3BlbkdMIEQzRERldmljZTcgJXAuXG4iLCAqb2JqKTsKLQkJcmV0dXJuIEQzRF9PSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpvYmogPSBOVUxMOwotICAgIEVSUigiIEludGVyZmFjZSB1bmtub3duIHdoZW4gY3JlYXRpbmcgRDNERGV2aWNlICglcylcbiIsIGRlYnVnc3RyX2d1aWQoaWlkKSk7Ci0gICAgSURpcmVjdDNERGV2aWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKGxwZDNkZGV2LCBJRGlyZWN0M0REZXZpY2U3KSk7Ci0gICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci19Ci0gICAgIAotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNESW1wbF8yX0NyZWF0ZURldmljZShMUERJUkVDVDNEMiBpZmFjZSwKLQkJCQlSRUZDTFNJRCByY2xzaWQsCi0JCQkJTFBESVJFQ1REUkFXU1VSRkFDRSBscEREUywKLQkJCQlMUERJUkVDVDNEREVWSUNFMiogbHBscEQzRERldmljZTIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqZGRzdXJmYWNlaW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTMsIGxwRERTKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVzLCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmNsc2lkKSwgbHBERFMsIGxwbHBEM0REZXZpY2UyKTsKLSAgICByZXR1cm4gY3JlYXRlX2RldmljZV9oZWxwZXIoVGhpcywgcmNsc2lkLCBkZHN1cmZhY2VpbXBsLCAodm9pZCAqKikgbHBscEQzRERldmljZTIsIDIpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNESW1wbF8zX0NyZWF0ZURldmljZShMUERJUkVDVDNEMyBpZmFjZSwKLQkJCQlSRUZDTFNJRCByY2xzaWQsCi0JCQkJTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBERFMsCi0JCQkJTFBESVJFQ1QzRERFVklDRTMqIGxwbHBEM0REZXZpY2UzLAotCQkJCUxQVU5LTk9XTiBscFVuaykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpkZHN1cmZhY2VpbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgbHBERFMpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXMsJXAsJXApXG4iLCBUaGlzLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyY2xzaWQpLCBscEREUywgbHBscEQzRERldmljZTMpOwotICAgIHJldHVybiBjcmVhdGVfZGV2aWNlX2hlbHBlcihUaGlzLCByY2xzaWQsIGRkc3VyZmFjZWltcGwsICh2b2lkICoqKSBscGxwRDNERGV2aWNlMywgMyk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RJbXBsXzNfMlRfMVRfRmluZERldmljZShMUERJUkVDVDNEMyBpZmFjZSwKLQkJCQkgICAgTFBEM0RGSU5EREVWSUNFU0VBUkNIIGxwRDNEREZTLAotCQkJCSAgICBMUEQzREZJTkRERVZJQ0VSRVNVTFQgbHBEM0RGRFIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcClcbiIsIFRoaXMsIGlmYWNlLCBscEQzRERGUywgbHBEM0RGRFIpOwotICAgIHJldHVybiBkM2RkZXZpY2VfZmluZChUaGlzLCBscEQzRERGUywgbHBEM0RGRFIpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNESW1wbF83XzNUX0VudW1aQnVmZmVyRm9ybWF0cyhMUERJUkVDVDNENyBpZmFjZSwKLQkJCQkJIFJFRkNMU0lEIHJpaWREZXZpY2UsCi0JCQkJCSBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBscEVudW1DYWxsYmFjaywKLQkJCQkJIExQVk9JRCBscENvbnRleHQpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7Ci0gICAgRERQSVhFTEZPUk1BVCBwZm9ybWF0OwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oJXMsJXAsJXApXG4iLCBUaGlzLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkRGV2aWNlKSwgbHBFbnVtQ2FsbGJhY2ssIGxwQ29udGV4dCk7Ci0KLSAgICBtZW1zZXQoJnBmb3JtYXQsIDAsIHNpemVvZihwZm9ybWF0KSk7Ci0gICAgcGZvcm1hdC5kd1NpemUgPSBzaXplb2YoRERQSVhFTEZPUk1BVCk7Ci0gICAgcGZvcm1hdC5kd0ZvdXJDQyA9IDA7ICAgCi0gICAgVFJBQ0UoIkVudW1lcmF0aW5nIGR1bW15IFpCdWZmZXIgZm9ybWF0ICgxNiBiaXRzKVxuIik7Ci0gICAgcGZvcm1hdC5kd0ZsYWdzID0gRERQRl9aQlVGRkVSOwotICAgIHBmb3JtYXQudTEuZHdaQnVmZmVyQml0RGVwdGggPSAxNjsKLSAgICBwZm9ybWF0LnUzLmR3WkJpdE1hc2sgPSAgICAweDAwMDBGRkZGOwotICAgIHBmb3JtYXQudTUuZHdSR0JaQml0TWFzayA9IDB4MDAwMEZGRkY7Ci0KLSAgICAvKiBXaGF0ZXZlciB0aGUgcmV0dXJuIHZhbHVlLCBzdG9wIGhlcmUuLiAqLwotICAgIGxwRW51bUNhbGxiYWNrKCZwZm9ybWF0LCBscENvbnRleHQpOwotICAgIAotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RJbXBsXzdfRW51bURldmljZXMoTFBESVJFQ1QzRDcgaWZhY2UsCi0JCQkgICAgICAgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLNyBscEVudW1EZXZpY2VzQ2FsbGJhY2ssCi0JCQkgICAgICAgTFBWT0lEIGxwVXNlckFyZykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRW51bURldmljZXNDYWxsYmFjaywgbHBVc2VyQXJnKTsKLQotICAgIGlmIChkM2RkZXZpY2VfZW51bWVyYXRlNyhscEVudW1EZXZpY2VzQ2FsbGJhY2ssIGxwVXNlckFyZykgIT0gRDNERU5VTVJFVF9PSykKLQlyZXR1cm4gRDNEX09LOwotICAgIAotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RJbXBsXzdfQ3JlYXRlRGV2aWNlKExQRElSRUNUM0Q3IGlmYWNlLAotCQkJCVJFRkNMU0lEIHJjbHNpZCwKLQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyBscEREUywKLQkJCQlMUERJUkVDVDNEREVWSUNFNyogbHBscEQzRERldmljZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpkZHN1cmZhY2VpbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgbHBERFMpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXMsJXAsJXApXG4iLCBUaGlzLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyY2xzaWQpLCBscEREUywgbHBscEQzRERldmljZSk7Ci0gICAgcmV0dXJuIGNyZWF0ZV9kZXZpY2VfaGVscGVyKFRoaXMsIHJjbHNpZCwgZGRzdXJmYWNlaW1wbCwgKHZvaWQgKiopIGxwbHBEM0REZXZpY2UsIDcpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotR0xfSURpcmVjdDNESW1wbF83XzNUX0NyZWF0ZVZlcnRleEJ1ZmZlcihMUERJUkVDVDNENyBpZmFjZSwKLQkJCQkJIExQRDNEVkVSVEVYQlVGRkVSREVTQyBscEQzRFZlcnRCdWZEZXNjLAotCQkJCQkgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcqIGxwbHBEM0RWZXJ0QnVmLAotCQkJCQkgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKLSAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICp2YmltcGw7Ci0gICAgSFJFU1VMVCByZXM7Ci0gICAgCi0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBscEQzRFZlcnRCdWZEZXNjLCBscGxwRDNEVmVydEJ1ZiwgZHdGbGFncyk7Ci0KLSAgICByZXMgPSBkM2R2ZXJ0ZXhidWZmZXJfY3JlYXRlKCZ2YmltcGwsIFRoaXMsIGxwRDNEVmVydEJ1ZkRlc2MsIGR3RmxhZ3MpOwotCi0gICAgKmxwbHBEM0RWZXJ0QnVmID0gSUNPTV9JTlRFUkZBQ0UodmJpbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KTsKLSAgICAKLSAgICByZXR1cm4gcmVzOwotfQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNENy5mdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh2b2lkKikKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgSURpcmVjdDNEN1Z0YmwgVlRBQkxFX0lEaXJlY3QzRDcgPQotewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBUaHVua19JRGlyZWN0M0RJbXBsXzdfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKSBUaHVua19JRGlyZWN0M0RJbXBsXzdfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpIFRodW5rX0lEaXJlY3QzREltcGxfN19SZWxlYXNlLAotICAgIFhDQVNUKEVudW1EZXZpY2VzKSBHTF9JRGlyZWN0M0RJbXBsXzdfRW51bURldmljZXMsCi0gICAgWENBU1QoQ3JlYXRlRGV2aWNlKSBHTF9JRGlyZWN0M0RJbXBsXzdfQ3JlYXRlRGV2aWNlLAotICAgIFhDQVNUKENyZWF0ZVZlcnRleEJ1ZmZlcikgR0xfSURpcmVjdDNESW1wbF83XzNUX0NyZWF0ZVZlcnRleEJ1ZmZlciwKLSAgICBYQ0FTVChFbnVtWkJ1ZmZlckZvcm1hdHMpIEdMX0lEaXJlY3QzREltcGxfN18zVF9FbnVtWkJ1ZmZlckZvcm1hdHMsCi0gICAgWENBU1QoRXZpY3RNYW5hZ2VkVGV4dHVyZXMpIE1haW5fSURpcmVjdDNESW1wbF83XzNUX0V2aWN0TWFuYWdlZFRleHR1cmVzLAotfTsKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSN1bmRlZiBYQ0FTVAotI2VuZGlmCi0KLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh0eXBlb2YoVlRBQkxFX0lEaXJlY3QzRDMuZnVuKSkKLSNlbHNlCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodm9pZCopCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IElEaXJlY3QzRDNWdGJsIFZUQUJMRV9JRGlyZWN0M0QzID0KLXsKLSAgICBYQ0FTVChRdWVyeUludGVyZmFjZSkgVGh1bmtfSURpcmVjdDNESW1wbF8zX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZikgVGh1bmtfSURpcmVjdDNESW1wbF8zX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBUaHVua19JRGlyZWN0M0RJbXBsXzNfUmVsZWFzZSwKLSAgICBYQ0FTVChFbnVtRGV2aWNlcykgR0xfSURpcmVjdDNESW1wbF8zX0VudW1EZXZpY2VzLAotICAgIFhDQVNUKENyZWF0ZUxpZ2h0KSBHTF9JRGlyZWN0M0RJbXBsXzNfMlRfMVRfQ3JlYXRlTGlnaHQsCi0gICAgWENBU1QoQ3JlYXRlTWF0ZXJpYWwpIEdMX0lEaXJlY3QzREltcGxfM18yVF8xVF9DcmVhdGVNYXRlcmlhbCwKLSAgICBYQ0FTVChDcmVhdGVWaWV3cG9ydCkgR0xfSURpcmVjdDNESW1wbF8zXzJUXzFUX0NyZWF0ZVZpZXdwb3J0LAotICAgIFhDQVNUKEZpbmREZXZpY2UpIEdMX0lEaXJlY3QzREltcGxfM18yVF8xVF9GaW5kRGV2aWNlLAotICAgIFhDQVNUKENyZWF0ZURldmljZSkgR0xfSURpcmVjdDNESW1wbF8zX0NyZWF0ZURldmljZSwKLSAgICBYQ0FTVChDcmVhdGVWZXJ0ZXhCdWZmZXIpIFRodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVWZXJ0ZXhCdWZmZXIsCi0gICAgWENBU1QoRW51bVpCdWZmZXJGb3JtYXRzKSBUaHVua19JRGlyZWN0M0RJbXBsXzNfRW51bVpCdWZmZXJGb3JtYXRzLAotICAgIFhDQVNUKEV2aWN0TWFuYWdlZFRleHR1cmVzKSBUaHVua19JRGlyZWN0M0RJbXBsXzNfRXZpY3RNYW5hZ2VkVGV4dHVyZXMsCi19OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNEMi5mdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh2b2lkKikKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgSURpcmVjdDNEMlZ0YmwgVlRBQkxFX0lEaXJlY3QzRDIgPQotewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBUaHVua19JRGlyZWN0M0RJbXBsXzJfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKSBUaHVua19JRGlyZWN0M0RJbXBsXzJfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpIFRodW5rX0lEaXJlY3QzREltcGxfMl9SZWxlYXNlLAotICAgIFhDQVNUKEVudW1EZXZpY2VzKSBHTF9JRGlyZWN0M0RJbXBsXzJfRW51bURldmljZXMsCi0gICAgWENBU1QoQ3JlYXRlTGlnaHQpIFRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVMaWdodCwKLSAgICBYQ0FTVChDcmVhdGVNYXRlcmlhbCkgVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZU1hdGVyaWFsLAotICAgIFhDQVNUKENyZWF0ZVZpZXdwb3J0KSBUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlVmlld3BvcnQsCi0gICAgWENBU1QoRmluZERldmljZSkgVGh1bmtfSURpcmVjdDNESW1wbF8yX0ZpbmREZXZpY2UsCi0gICAgWENBU1QoQ3JlYXRlRGV2aWNlKSBHTF9JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlRGV2aWNlLAotfTsKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSN1bmRlZiBYQ0FTVAotI2VuZGlmCi0KLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh0eXBlb2YoVlRBQkxFX0lEaXJlY3QzRC5mdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh2b2lkKikKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgSURpcmVjdDNEVnRibCBWVEFCTEVfSURpcmVjdDNEID0KLXsKLSAgICBYQ0FTVChRdWVyeUludGVyZmFjZSkgVGh1bmtfSURpcmVjdDNESW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZikgVGh1bmtfSURpcmVjdDNESW1wbF8xX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBUaHVua19JRGlyZWN0M0RJbXBsXzFfUmVsZWFzZSwKLSAgICBYQ0FTVChJbml0aWFsaXplKSBNYWluX0lEaXJlY3QzREltcGxfMV9Jbml0aWFsaXplLAotICAgIFhDQVNUKEVudW1EZXZpY2VzKSBHTF9JRGlyZWN0M0RJbXBsXzFfRW51bURldmljZXMsCi0gICAgWENBU1QoQ3JlYXRlTGlnaHQpIFRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVMaWdodCwKLSAgICBYQ0FTVChDcmVhdGVNYXRlcmlhbCkgVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZU1hdGVyaWFsLAotICAgIFhDQVNUKENyZWF0ZVZpZXdwb3J0KSBUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlVmlld3BvcnQsCi0gICAgWENBU1QoRmluZERldmljZSkgVGh1bmtfSURpcmVjdDNESW1wbF8xX0ZpbmREZXZpY2UsCi19OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotc3RhdGljIEhSRVNVTFQgZDNkX2FkZF9kZXZpY2UoSURpcmVjdERyYXdJbXBsICpUaGlzLCBJRGlyZWN0M0REZXZpY2VJbXBsICpkZXZpY2UpCi17Ci0gICAgaWYgIChUaGlzLT5jdXJyZW50X2RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIENyZWF0ZSBkZWxheWVkIHRleHR1cmVzIG5vdyB0aGF0IHdlIGhhdmUgYW4gT3BlbkdMIGNvbnRleHQuLi4KLQkgICBGb3IgdGhhdCwgZ28gdGhyb3VnaCBhbGwgc3VyZmFjZSBhdHRhY2hlZCB0byBvdXIgRERyYXcgb2JqZWN0IGFuZCBjcmVhdGUKLQkgICBPcGVuR0wgdGV4dHVyZXMgZm9yIGFsbCB0ZXh0dXJlcy4uICovCi0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYgPSBUaGlzLT5zdXJmYWNlczsKLQotCXdoaWxlIChzdXJmICE9IE5VTEwpIHsKLQkgICAgaWYgKHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfVEVYVFVSRSkgewotCSAgICAgICAgLyogRm91bmQgYSB0ZXh0dXJlLi4gTm93IGNyZWF0ZSB0aGUgT3BlbkdMIHBhcnQgKi8KLQkgICAgICAgIGQzZHRleHR1cmVfY3JlYXRlKFRoaXMsIHN1cmYsIEZBTFNFLCBzdXJmLT5taXBfbWFpbik7Ci0JICAgIH0KLQkgICAgc3VyZiA9IHN1cmYtPm5leHRfZGRyYXc7Ci0JfQotICAgIH0KLSAgICAvKiBGb3IgdGhlIG1vbWVudCwgb25seSBvbmUgZGV2aWNlICdzdXBwb3J0ZWQnLi4uICovCi0gICAgVGhpcy0+Y3VycmVudF9kZXZpY2UgPSBkZXZpY2U7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIGQzZF9yZW1vdmVfZGV2aWNlKElEaXJlY3REcmF3SW1wbCAqVGhpcywgSURpcmVjdDNERGV2aWNlSW1wbCAqZGV2aWNlKQotewotICAgIFRoaXMtPmN1cnJlbnRfZGV2aWNlID0gTlVMTDsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgZGlyZWN0M2RfY3JlYXRlKElEaXJlY3REcmF3SW1wbCAqVGhpcykKLXsKLSAgICBJRGlyZWN0M0RHTEltcGwgKmdsb2JqZWN0OwotICAgIAotICAgIGdsb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RHTEltcGwpKTsKLSAgICBpZiAoZ2xvYmplY3QgPT0gTlVMTCkgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwotCi0gICAgVGhpcy0+ZDNkX2NyZWF0ZV90ZXh0dXJlID0gZDNkdGV4dHVyZV9jcmVhdGU7Ci0gICAgVGhpcy0+ZDNkX2FkZGVkX2RldmljZSA9IGQzZF9hZGRfZGV2aWNlOwotICAgIFRoaXMtPmQzZF9yZW1vdmVkX2RldmljZSA9IGQzZF9yZW1vdmVfZGV2aWNlOwotCi0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QsICBWVEFCTEVfSURpcmVjdDNEKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDIsIFZUQUJMRV9JRGlyZWN0M0QyKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMsIFZUQUJMRV9JRGlyZWN0M0QzKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDcsIFZUQUJMRV9JRGlyZWN0M0Q3KTsKLQotICAgIFRoaXMtPmQzZF9wcml2YXRlID0gZ2xvYmplY3Q7Ci0KLSAgICBUUkFDRSgiIGNyZWF0aW5nIE9wZW5HTCBwcml2YXRlIHN0b3JhZ2UgYXQgJXAuXG4iLCBnbG9iamVjdCk7Ci0gICAgCi0gICAgcmV0dXJuIEQzRF9PSzsKLX0KZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZXhlY3V0ZWJ1ZmZlci5jIGIvZGxscy9kZHJhdy9leGVjdXRlYnVmZmVyLmMKaW5kZXggMjc0YzJhMC4uNjgzZmZlMyAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9leGVjdXRlYnVmZmVyLmMKKysrIGIvZGxscy9kZHJhdy9leGVjdXRlYnVmZmVyLmMKQEAgLTEsOCArMSw5IEBACiAvKiBEaXJlY3QzRCBFeGVjdXRlQnVmZmVyCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCBMaW9uZWwgVUxNRVIKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IENocmlzdGlhbiBDb3N0YQorICogQ29weXJpZ2h0IChjKSAyMDA2ICAgICAgU3RlZmFuIET2c2luZ2VyCiAgKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QzREV4ZWN1dGVCdWZmZXIuCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtMjAsMzggKzIxLDQ1IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIndpbmUvcG9ydC5oIgogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAKKyNkZWZpbmUgQ09CSk1BQ1JPUwogI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAogCiAjaW5jbHVkZSAid2luZGVmLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm5scy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAib2JqYmFzZS5oIgogI2luY2x1ZGUgIndpbmdkaS5oIgorI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZXhjcHQuaCIKKwogI2luY2x1ZGUgImRkcmF3LmgiCiAjaW5jbHVkZSAiZDNkLmgiCisKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCiAjaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgogCi0jaW5jbHVkZSAiZDNkX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJvcGVuZ2xfcHJpdmF0ZS5oIgorV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CiAKLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLVdJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGRkcmF3X2dlb20pOwotCi1zdGF0aWMgdm9pZCBfZHVtcF9kM2RzdGF0dXMoTFBEM0RTVEFUVVMgbHBTdGF0dXMpIHsKLQotfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBfZHVtcF9leGVjdXRlZGF0YQorICogX2R1bXBfRDNERVhFQ1VURUJVRkZFUkRFU0MKKyAqCisgKiBEZWJ1ZyBmdW5jdGlvbnMgd2hpY2ggd3JpdGUgdGhlIGV4ZWN1dGVidWZmZXIgZGF0YSB0byB0aGUgY29uc29sZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQgX2R1bXBfZXhlY3V0ZWRhdGEoTFBEM0RFWEVDVVRFREFUQSBscERhdGEpIHsKICAgICBEUFJJTlRGKCJkd1NpemUgOiAlbGRcbiIsIGxwRGF0YS0+ZHdTaXplKTsKICAgICBEUFJJTlRGKCJWZXJ0ZXggICAgICBPZmZzZXQgOiAlbGQgIENvdW50ICA6ICVsZFxuIiwgbHBEYXRhLT5kd1ZlcnRleE9mZnNldCwgbHBEYXRhLT5kd1ZlcnRleENvdW50KTsKICAgICBEUFJJTlRGKCJJbnN0cnVjdGlvbiBPZmZzZXQgOiAlbGQgIExlbmd0aCA6ICVsZFxuIiwgbHBEYXRhLT5kd0luc3RydWN0aW9uT2Zmc2V0LCBscERhdGEtPmR3SW5zdHJ1Y3Rpb25MZW5ndGgpOwogICAgIERQUklOVEYoIkhWZXJ0ZXggICAgIE9mZnNldCA6ICVsZFxuIiwgbHBEYXRhLT5kd0hWZXJ0ZXhPZmZzZXQpOwotICAgIF9kdW1wX2QzZHN0YXR1cygmKGxwRGF0YS0+ZHNTdGF0dXMpKTsKIH0KIAogc3RhdGljIHZvaWQgX2R1bXBfRDNERVhFQ1VURUJVRkZFUkRFU0MoTFBEM0RFWEVDVVRFQlVGRkVSREVTQyBscERlc2MpIHsKQEAgLTYyLDkgKzcwLDI4IEBACiAgICAgRFBSSU5URigibHBEYXRhICAgICAgIDogJXBcbiIsIGxwRGVzYy0+bHBEYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgZXhlY3V0ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCAqVGhpcywKLQkJICAgIElEaXJlY3QzRERldmljZUltcGwgKmxwRGV2aWNlLAotCQkgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpscFZpZXdwb3J0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9FeGVjdXRlCisgKgorICogVGhlIG1haW4gZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXhlY3V0ZSBidWZmZXIKKyAqIEl0IHRyYW5zZm9ybXMgdGhlIHZlcnRpY2VzIGlmIG5lY2Vzc2FyeSwgYW5kIGNhbGxzIElEaXJlY3QzRERldmljZTcKKyAqIGZvciBkcmF3aW5nIHRoZSB2ZXJ0aWNlcy4gSXQgaXMgY2FsbGVkIGZyb20KKyAqIElEaXJlY3QzRERldmljZTo6RXhlY3V0ZQorICoKKyAqIFRPRE86IFBlcmhhcHMgc29tZSBjb21tZW50cyBhYm91dCB0aGUgdmFyaW9zIG9wY29kZXMgd291bGRuJ3QgaHVydAorICoKKyAqIERvbid0IGRlY2xhcmUgdGhpcyBzdGF0aWMsIGFzIGl0J3MgY2FsbGVkIGZyb20gZGV2aWNlLmMsCisgKiBJRGlyZWN0M0REZXZpY2U6OkV4ZWN1dGUKKyAqCisgKiBQYXJhbXM6CisgKiAgRGV2aWNlOiAzRCBEZXZpY2UgYXNzb2NpYXRlZCB0byB1c2UgZm9yIGRyYXdpbmcKKyAqICBWaWV3cG9ydDogVmlld3BvcnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfRXhlY3V0ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCAqVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqbHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqbHBWaWV3cG9ydCkKIHsKICAgICAvKiBEV09SRCBicyA9IFRoaXMtPmRlc2MuZHdCdWZmZXJTaXplOyAqLwogICAgIERXT1JEIHZzID0gVGhpcy0+ZGF0YS5kd1ZlcnRleE9mZnNldDsKQEAgLTgxLDcgKzEwOCw3IEBACiAgICAgbHBWaWV3cG9ydC0+YWN0aXZhdGUobHBWaWV3cG9ydCk7CiAKICAgICBUUkFDRSgiRXhlY3V0ZURhdGEgOlxuIik7Ci0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKKyAgICBpZiAoVFJBQ0VfT04oZDNkNykpCiAgICAgICBfZHVtcF9leGVjdXRlZGF0YSgmKFRoaXMtPmRhdGEpKTsKIAogICAgIHdoaWxlICgxKSB7CkBAIC0xMTcsMzIgKzE0NCwzOSBAQAogCQkJCiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIExQRDNEVFJJQU5HTEUgY2kgPSAoTFBEM0RUUklBTkdMRSkgaW5zdHI7Ci0JCSAgICBUUkFDRV8oZGRyYXdfZ2VvbSkoIiAgdjE6ICVkICB2MjogJWQgIHYzOiAlZFxuIixjaS0+dTEudjEsIGNpLT51Mi52MiwgY2ktPnUzLnYzKTsKLQkJICAgIFRSQUNFXyhkZHJhd19nZW9tKSgiICBGbGFncyA6ICIpOwotCQkgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgeworCQkgICAgVFJBQ0VfKGQzZDcpKCIgIHYxOiAlZCAgdjI6ICVkICB2MzogJWRcbiIsY2ktPnUxLnYxLCBjaS0+dTIudjIsIGNpLT51My52Myk7CisJCSAgICBUUkFDRV8oZDNkNykoIiAgRmxhZ3MgOiAiKTsKKwkJICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogCQkJLyogV2lyZWZyYW1lICovCiAJCQlpZiAoY2ktPndGbGFncyAmIEQzRFRSSUZMQUdfRURHRUVOQUJMRTEpCi0JICAgICAgICAJICAgIFRSQUNFXyhkZHJhd19nZW9tKSgiRURHRUVOQUJMRTEgIik7CisJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiRURHRUVOQUJMRTEgIik7CiAJICAgIAkJaWYgKGNpLT53RmxhZ3MgJiBEM0RUUklGTEFHX0VER0VFTkFCTEUyKQotCSAgICAgICAgCSAgICBUUkFDRV8oZGRyYXdfZ2VvbSkoIkVER0VFTkFCTEUyICIpOworCSAgICAgICAgCSAgICBUUkFDRV8oZDNkNykoIkVER0VFTkFCTEUyICIpOwogCSAgICAJCWlmIChjaS0+d0ZsYWdzICYgRDNEVFJJRkxBR19FREdFRU5BQkxFMSkKLQkgICAgICAgIAkgICAgVFJBQ0VfKGRkcmF3X2dlb20pKCJFREdFRU5BQkxFMyAiKTsKKwkgICAgICAgIAkgICAgVFJBQ0VfKGQzZDcpKCJFREdFRU5BQkxFMyAiKTsKIAkgICAgCQkvKiBTdHJpcHMgLyBGYW5zICovCiAJICAgIAkJaWYgKGNpLT53RmxhZ3MgPT0gRDNEVFJJRkxBR19FVkVOKQotCSAgICAgICAgCSAgICBUUkFDRV8oZGRyYXdfZ2VvbSkoIkVWRU4gIik7CisJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiRVZFTiAiKTsKIAkgICAgCQlpZiAoY2ktPndGbGFncyA9PSBEM0RUUklGTEFHX09ERCkKLQkgICAgICAgIAkgICAgVFJBQ0VfKGRkcmF3X2dlb20pKCJPREQgIik7CisJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiT0REICIpOwogCSAgICAJCWlmIChjaS0+d0ZsYWdzID09IEQzRFRSSUZMQUdfU1RBUlQpCi0JICAgICAgICAJICAgIFRSQUNFXyhkZHJhd19nZW9tKSgiU1RBUlQgIik7CisJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiU1RBUlQgIik7CiAJICAgIAkJaWYgKChjaS0+d0ZsYWdzID4gMCkgJiYgKGNpLT53RmxhZ3MgPCAzMCkpCi0JICAgICAgIAkJICAgIFRSQUNFXyhkZHJhd19nZW9tKSgiU1RBUlRGTEFUKCVkKSAiLCBjaS0+d0ZsYWdzKTsKLQkgICAgCQlUUkFDRV8oZGRyYXdfZ2VvbSkoIlxuIik7CisJICAgICAgIAkJICAgIFRSQUNFXyhkM2Q3KSgiU1RBUlRGTEFUKCVkKSAiLCBjaS0+d0ZsYWdzKTsKKwkgICAgCQlUUkFDRV8oZDNkNykoIlxuIik7CiAgICAgICAgIAkgICAgfQogCQkgICAgVGhpcy0+aW5kaWNlc1soaSAqIDMpICAgIF0gPSBjaS0+dTEudjE7CiAJCSAgICBUaGlzLT5pbmRpY2VzWyhpICogMykgKyAxXSA9IGNpLT51Mi52MjsKIAkJICAgIFRoaXMtPmluZGljZXNbKGkgKiAzKSArIDJdID0gY2ktPnUzLnYzOwogICAgICAgICAgICAgICAgICAgICBpbnN0ciArPSBzaXplOwogCQl9CisgICAgICAgICAgICAgICAgLyogSURpcmVjdDNERGV2aWNlcyBoYXZlIGNvbG9yIGtleWluZyBhbHdheXMgZW5hYmxlZCAtCisgICAgICAgICAgICAgICAgICogZW5hYmxlIGl0IGJlZm9yZSBkcmF3aW5nLiBUaGlzIG92ZXJ3cml0ZXMgYW55IEFMUEhBKgorICAgICAgICAgICAgICAgICAqIHJlbmRlciBzdGF0ZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGxwRGV2aWNlLT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RSU19DT0xPUktFWUVOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2U3X0RyYXdJbmRleGVkUHJpbWl0aXZlKElDT01fSU5URVJGQUNFKGxwRGV2aWNlLElEaXJlY3QzRERldmljZTcpLAogCQkJCSAgICAgICAgICAgICAgICAgICAgICBEM0RQVF9UUklBTkdMRUxJU1QsRDNERlZGX1RMVkVSVEVYLHRsX3Z4LDAsVGhpcy0+aW5kaWNlcyxjb3VudCozLDApOwogCSAgICB9IGJyZWFrOwpAQCAtMjY0LDkgKzI5OCwyNyBAQAogCQl9CiAJICAgIH0gYnJlYWs7CiAKLQkgICAgY2FzZSBEM0RPUF9QUk9DRVNTVkVSVElDRVM6IHsKLQkgICAgICAgIGludCBpOwotCQlUUkFDRSgiUFJPQ0VTU1ZFUlRJQ0VTICAoJWQpXG4iLCBjb3VudCk7CisgICAgICAgICAgICBjYXNlIEQzRE9QX1BST0NFU1NWRVJUSUNFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBTaGFyZSBjb2RlIHdpdGggSURpcmVjdDNEVmVydGV4QnVmZmVyOjpQcm9jZXNzVmVydGljZXMgYW5kIC8gb3IKKyAgICAgICAgICAgICAgICAgKiBJV2luZUQzRERldmljZTo6UHJvY2Vzc1ZlcnRpY2VzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgRDNETUFUUklYIHZpZXdfbWF0LCB3b3JsZF9tYXQsIHByb2pfbWF0OworICAgICAgICAgICAgICAgIFRSQUNFKCJQUk9DRVNTVkVSVElDRVMgICglZClcbiIsIGNvdW50KTsKKworICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgdHJhbnNmb3JtIGFuZCB3b3JsZCBtYXRyaXggKi8KKyAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0obHBEZXZpY2UtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFX1ZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWV3X21hdCk7CisKKyAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0obHBEZXZpY2UtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9qX21hdCk7CisKKyAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0obHBEZXZpY2UtPndpbmVEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd29ybGRfbWF0KTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQkgICAgTFBEM0RQUk9DRVNTVkVSVElDRVMgY2kgPSAoTFBEM0RQUk9DRVNTVkVSVElDRVMpIGluc3RyOwpAQCAtMjc0LDcgKzMyNiw3IEBACiAJCSAgICBUUkFDRSgiICBTdGFydCA6ICVkIERlc3QgOiAlZCBDb3VudCA6ICVsZFxuIiwKIAkJCSAgY2ktPndTdGFydCwgY2ktPndEZXN0LCBjaS0+ZHdDb3VudCk7CiAJCSAgICBUUkFDRSgiICBGbGFncyA6ICIpOwotCQkgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgeworCQkgICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAJCSAgICAgICAgaWYgKGNpLT5kd0ZsYWdzICYgRDNEUFJPQ0VTU1ZFUlRJQ0VTX0NPUFkpCiAJCQkgICAgVFJBQ0UoIkNPUFkgIik7CiAJCQlpZiAoY2ktPmR3RmxhZ3MgJiBEM0RQUk9DRVNTVkVSVElDRVNfTk9DT0xPUikKQEAgLTMyMSwyMiArMzczLDIyIEBACiAJCSAgICAgICAgdW5zaWduZWQgaW50IG5iOwogCQkJRDNEVkVSVEVYICAqc3JjID0gKChMUEQzRFZFUlRFWCkgICgoY2hhciAqKVRoaXMtPmRlc2MubHBEYXRhICsgdnMpKSArIGNpLT53U3RhcnQ7CiAJCQlEM0RUTFZFUlRFWCAqZHN0ID0gKChMUEQzRFRMVkVSVEVYKSAoVGhpcy0+dmVydGV4X2RhdGEpKSArIGNpLT53RGVzdDsKLQkJCUQzRE1BVFJJWCAqbWF0MiA9IGxwRGV2aWNlLT53b3JsZF9tYXQ7CisJCQlEM0RNQVRSSVggKm1hdDIgPSAmd29ybGRfbWF0OwogCQkJRDNETUFUUklYIG1hdDsKIAkJCUQzRFZBTFVFIG54LG55LG56OwogCQkJRDNEVklFV1BPUlQqIFZpZXdwb3J0ID0gJmxwVmlld3BvcnQtPnZpZXdwb3J0cy52cDE7CiAJCQkKLQkJCWlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkJCSAgICBUUkFDRSgiICBQcm9qZWN0aW9uIE1hdHJpeCA6ICglcClcbiIsIGxwRGV2aWNlLT5wcm9qX21hdCk7Ci0JCQkgICAgZHVtcF9EM0RNQVRSSVgobHBEZXZpY2UtPnByb2pfbWF0KTsKLQkJCSAgICBUUkFDRSgiICBWaWV3ICAgICAgIE1hdHJpeCA6ICglcClcbiIsIGxwRGV2aWNlLT52aWV3X21hdCk7Ci0JCQkgICAgZHVtcF9EM0RNQVRSSVgobHBEZXZpY2UtPnZpZXdfbWF0KTsKLQkJCSAgICBUUkFDRSgiICBXb3JsZCBNYXRyaXggOiAoJXApXG4iLCBscERldmljZS0+d29ybGRfbWF0KTsKLQkJCSAgICBkdW1wX0QzRE1BVFJJWChscERldmljZS0+d29ybGRfbWF0KTsKKwkJCWlmIChUUkFDRV9PTihkM2Q3KSkgeworCQkJICAgIFRSQUNFKCIgIFByb2plY3Rpb24gTWF0cml4IDogKCVwKVxuIiwgJnByb2pfbWF0KTsKKwkJCSAgICBkdW1wX0QzRE1BVFJJWCgmcHJval9tYXQpOworCQkJICAgIFRSQUNFKCIgIFZpZXcgICAgICAgTWF0cml4IDogKCVwKVxuIiwgJnZpZXdfbWF0KTsKKwkJCSAgICBkdW1wX0QzRE1BVFJJWCgmdmlld19tYXQpOworCQkJICAgIFRSQUNFKCIgIFdvcmxkIE1hdHJpeCA6ICglcClcbiIsICZ3b3JsZF9tYXQpOworCQkJICAgIGR1bXBfRDNETUFUUklYKCZ3b3JsZF9tYXQpOwogCQkJfQogCi0JCQltdWx0aXBseV9tYXRyaXgoJm1hdCxscERldmljZS0+dmlld19tYXQsbHBEZXZpY2UtPndvcmxkX21hdCk7Ci0JCQltdWx0aXBseV9tYXRyaXgoJm1hdCxscERldmljZS0+cHJval9tYXQsJm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBseV9tYXRyaXgoJm1hdCwmdmlld19tYXQsJndvcmxkX21hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBseV9tYXRyaXgoJm1hdCwmcHJval9tYXQsJm1hdCk7CiAKIAkJCWZvciAobmIgPSAwOyBuYiA8IGNpLT5kd0NvdW50OyBuYisrKSB7CiAJCQkgICAgLyogTm9ybWFscyB0cmFuc2Zvcm1hdGlvbiAqLwpAQCAtMzc1LDE3ICs0MjcsMTcgQEAKIAkJCUQzRE1BVFJJWCBtYXQ7CiAJCQlEM0RWSUVXUE9SVCogVmlld3BvcnQgPSAmbHBWaWV3cG9ydC0+dmlld3BvcnRzLnZwMTsKIAkJCQotCQkJaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCQkJICAgIFRSQUNFKCIgIFByb2plY3Rpb24gTWF0cml4IDogKCVwKVxuIiwgbHBEZXZpY2UtPnByb2pfbWF0KTsKLQkJCSAgICBkdW1wX0QzRE1BVFJJWChscERldmljZS0+cHJval9tYXQpOwotCQkJICAgIFRSQUNFKCIgIFZpZXcgICAgICAgTWF0cml4IDogKCVwKVxuIiwgbHBEZXZpY2UtPnZpZXdfbWF0KTsKLQkJCSAgICBkdW1wX0QzRE1BVFJJWChscERldmljZS0+dmlld19tYXQpOworCQkJaWYgKFRSQUNFX09OKGQzZDcpKSB7CisJCQkgICAgVFJBQ0UoIiAgUHJvamVjdGlvbiBNYXRyaXggOiAoJXApXG4iLCAmcHJval9tYXQpOworCQkJICAgIGR1bXBfRDNETUFUUklYKCZwcm9qX21hdCk7CisJCQkgICAgVFJBQ0UoIiAgVmlldyAgICAgICBNYXRyaXggOiAoJXApXG4iLCZ2aWV3X21hdCk7CisJCQkgICAgZHVtcF9EM0RNQVRSSVgoJnZpZXdfbWF0KTsKIAkJCSAgICBUUkFDRSgiICBXb3JsZCBNYXRyaXggOiAoJXApXG4iLCAmbWF0KTsKIAkJCSAgICBkdW1wX0QzRE1BVFJJWCgmbWF0KTsKIAkJCX0KIAotCQkJbXVsdGlwbHlfbWF0cml4KCZtYXQsbHBEZXZpY2UtPnZpZXdfbWF0LGxwRGV2aWNlLT53b3JsZF9tYXQpOwotCQkJbXVsdGlwbHlfbWF0cml4KCZtYXQsbHBEZXZpY2UtPnByb2pfbWF0LCZtYXQpOworCQkJbXVsdGlwbHlfbWF0cml4KCZtYXQsJnZpZXdfbWF0LCZ3b3JsZF9tYXQpOworCQkJbXVsdGlwbHlfbWF0cml4KCZtYXQsJnByb2pfbWF0LCZtYXQpOwogCiAJCQlmb3IgKG5iID0gMDsgbmIgPCBjaS0+ZHdDb3VudDsgbmIrKykgewogCQkJICAgIGRzdC0+dTUuY29sb3IgPSBzcmMtPnU0LmNvbG9yOwpAQCAtNDkwLDUwICs1NDIsODUgQEAKICAgICA7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsXzFfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlF1ZXJ5SW50ZXJmYWNlCisgKgorICogV2VsbCwgYSB1c3VhbCBRdWVyeUludGVyZmFjZSBmdW5jdGlvbi4gRG9uJ3Qga25vdyBmdXIgc3VyZSB3aGljaAorICogaW50ZXJmYWNlcyBpdCBjYW4gUXVlcnkuCisgKgorICogUGFyYW1zOgorICogIHJpaWQ6IFRoZSBpbnRlcmZhY2UgSUQgcXVlcmllZCBmb3IKKyAqICBvYmo6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIGluIGNhc2Ugb2YgYSBzdWNjZXNzIChTX09LPyBUaGluayBpdCdzIHRoZSBzYW1lKQorICogIE9MRV9FX0VOVU1fTk9NT1JFIGlmIHRoZSBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kLgorICogICAoRV9OT0lOVEVSRkFDRT8/IERvbid0IGtub3cgd2hhdCBJIHJlYWxseSBuZWVkKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVzLCVwKVxuIiwgVGhpcywgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CisgICAgVFJBQ0UoIiglcC8lcCktPiglcywlcClcbiIsIFRoaXMsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYmopOwogCi0gICAgKm9icCA9IE5VTEw7CisgICAgKm9iaiA9IE5VTEw7CiAKICAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCAgcmlpZCApICkgewogICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKSk7Ci0JKm9icCA9IGlmYWNlOwotCVRSQUNFKCIgIENyZWF0aW5nIElVbmtub3duIGludGVyZmFjZSBhdCAlcC5cbiIsICpvYnApOworCSpvYmogPSBpZmFjZTsKKwlUUkFDRSgiICBDcmVhdGluZyBJVW5rbm93biBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JqKTsKIAlyZXR1cm4gU19PSzsKICAgICB9CiAgICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RNYXRlcmlhbCwgcmlpZCApICkgewogICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKSk7Ci0gICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKTsKLQlUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGludGVyZmFjZSAlcFxuIiwgKm9icCk7CisgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKTsKKwlUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyIGludGVyZmFjZSAlcFxuIiwgKm9iaik7CiAJcmV0dXJuIFNfT0s7CiAgICAgfQogICAgIEZJWE1FKCIoJXApOiBpbnRlcmZhY2UgZm9yIElJRCAlcyBOT1QgZm91bmQhXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKLSAgICByZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7CisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiB9CiAKLVVMT05HIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX0FkZFJlZihMUERJUkVDVDNERVhFQ1VURUJVRkZFUiBpZmFjZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpBZGRSZWYKKyAqCisgKiBBIG5vcm1hbCBBZGRSZWYgbWV0aG9kLCBub3RoaW5nIHNwZWNpYWwKKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSBuZXcgcmVmY291bnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9BZGRSZWYoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKIAotICAgIEZJWE1FKCIoJXAvJXApLT4oKWluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIGlmYWNlLCByZWYgLSAxKTsKKyAgICBGSVhNRSgiKCVwKS0+KClpbmNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCByZWYgLSAxKTsKIAogICAgIHJldHVybiByZWY7CiB9CiAKLVVMT05HIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX1JlbGVhc2UoTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIgaWZhY2UpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlJlbGVhc2UKKyAqCisgKiBBIG5vcm1hbCBSZWxlYXNlIG1ldGhvZCwgbm90aGluZyBzcGVjaWFsCisgKgorICogUmV0dXJuczoKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUmVsZWFzZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwogCi0gICAgVFJBQ0UoIiglcC8lcCktPigpZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgaWZhY2UsIHJlZiArIDEpOworICAgIFRSQUNFKCIoJXApLT4oKWRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiArIDEpOwogCiAgICAgaWYgKCFyZWYpIHsKICAgICAgICAgaWYgKFRoaXMtPm5lZWRfZnJlZSkKQEAgLTU0Nyw1MCArNjM0LDk2IEBACiAgICAgcmV0dXJuIHJlZjsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfMV9Jbml0aWFsaXplKExQRElSRUNUM0RFWEVDVVRFQlVGRkVSIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRERFVklDRSBscERpcmVjdDNERGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFWEVDVVRFQlVGRkVSREVTQyBscERlc2MpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OkluaXRpYWxpemUKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgRXhlY3V0ZSBCdWZmZXIuIFRoaXMgbWV0aG9kIGV4aXN0cyBmb3IgQ09NIGNvbXBsaWFuY2UKKyAqIE5vdGhpbmcgdG8gZG8gaGVyZS4KKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfSW5pdGlhbGl6ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UgKmxwRGlyZWN0M0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgKmxwRGVzYykKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXAsJXApIG5vLW9wLi4uLlxuIiwgVGhpcywgaWZhY2UsIGxwRGlyZWN0M0REZXZpY2UsIGxwRGVzYyk7Ci0gICAgcmV0dXJuIEREX09LOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIG5vLW9wLi4uLlxuIiwgVGhpcywgbHBEaXJlY3QzRERldmljZSwgbHBEZXNjKTsKKyAgICByZXR1cm4gRDNEX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX0xvY2soTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVYRUNVVEVCVUZGRVJERVNDIGxwRGVzYykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6TG9jaworICoKKyAqIExvY2tzIHRoZSBidWZmZXIsIHNvIHRoZSBhcHAgY2FuIHdyaXRlIGludG8gaXQuCisgKgorICogUGFyYW1zOgorICogIERlc2M6IFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBidWZmZXIgZGVzY3JpcHRpb24uIFRoaXMgRGVzY3JpcHRpb24gY29udGFpbnMKKyAqICAgICAgICBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBkYXRhLgorICoKKyAqIFJldHVybnM6CisgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBEM0RfT0sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0xvY2soSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREVYRUNVVEVCVUZGRVJERVNDICpscERlc2MpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgICBEV09SRCBkd1NpemU7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERlc2MpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscERlc2MpOwogCiAgICAgZHdTaXplID0gbHBEZXNjLT5kd1NpemU7CiAgICAgbWVtc2V0KGxwRGVzYywgMCwgZHdTaXplKTsKICAgICBtZW1jcHkobHBEZXNjLCAmVGhpcy0+ZGVzYywgZHdTaXplKTsKICAgICAKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CisgICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgIFRSQUNFKCIgIFJldHVybmluZyBkZXNjcmlwdGlvbiA6XG4iKTsKIAlfZHVtcF9EM0RFWEVDVVRFQlVGRkVSREVTQyhscERlc2MpOwogICAgIH0KLSAgICByZXR1cm4gRERfT0s7CisgICAgcmV0dXJuIEQzRF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfMV9VbmxvY2soTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIgaWZhY2UpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlVubG9jaworICoKKyAqIFVubG9ja3MgdGhlIGJ1ZmZlci4gV2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkbyBoZXJlCisgKgorICogUmV0dXJuczoKKyAqICBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIEQzRF9PSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfVW5sb2NrKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPigpIG5vLW9wLi4uXG4iLCBUaGlzLCBpZmFjZSk7Ci0gICAgcmV0dXJuIEREX09LOworICAgIFRSQUNFKCIoJXApLT4oKSBuby1vcC4uLlxuIiwgVGhpcyk7CisgICAgcmV0dXJuIEQzRF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfMV9TZXRFeGVjdXRlRGF0YShMUERJUkVDVDNERVhFQ1VURUJVRkZFUiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVYRUNVVEVEQVRBIGxwRGF0YSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6U2V0RXhlY3V0ZURhdGEKKyAqCisgKiBTZXRzIHRoZSBleGVjdXRlIGRhdGEuIFRoaXMgZGF0YSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBidWZmZXIncyBjb250ZW50CisgKgorICogUGFyYW1zOgorICogIERhdGE6IFBvaW50ZXIgdG8gYSBEM0RFWEVDVVRFREFUQSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZGF0YSB0bworICogIGFzc2lnbgorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiB0aGUgdmVydGV4IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfU2V0RXhlY3V0ZURhdGEoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RFWEVDVVRFREFUQSAqbHBEYXRhKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICAgRFdPUkQgbmJ2ZXJ0OwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBEYXRhKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBEYXRhKTsKIAogICAgIG1lbWNweSgmVGhpcy0+ZGF0YSwgbHBEYXRhLCBscERhdGEtPmR3U2l6ZSk7CiAKQEAgLTYwMSwyNiArNzM0LDM4IEBACiAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dmVydGV4X2RhdGEpOwogICAgIFRoaXMtPnZlcnRleF9kYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIG5idmVydCAqIHNpemVvZihEM0RUTFZFUlRFWCkpOwogCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgeworICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgICBfZHVtcF9leGVjdXRlZGF0YShscERhdGEpOwogICAgIH0KIAotICAgIHJldHVybiBERF9PSzsKKyAgICByZXR1cm4gRDNEX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX0dldEV4ZWN1dGVEYXRhKExQRElSRUNUM0RFWEVDVVRFQlVGRkVSIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERVhFQ1VURURBVEEgbHBEYXRhKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpHZXRFeGVjdXRlRGF0YQorICoKKyAqIFJldHVybnMgdGhlIGRhdGEgaW4gdGhlIGV4ZWN1dGUgYnVmZmVyCisgKgorICogUGFyYW1zOgorICogIERhdGE6IFBvaW50ZXIgdG8gYSBEM0RFWEVDVVRFREFUQSBzdHJ1Y3R1cmUgdXNlZCB0byByZXR1cm4gZGF0YQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0dldEV4ZWN1dGVEYXRhKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURURBVEEgKmxwRGF0YSkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgIERXT1JEIGR3U2l6ZTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscERhdGEpOworICAgIFRSQUNFKCIoJXApLT4oJXApOiBzdHViIVxuIiwgVGhpcywgbHBEYXRhKTsKIAogICAgIGR3U2l6ZSA9IGxwRGF0YS0+ZHdTaXplOwogICAgIG1lbXNldChscERhdGEsIDAsIGR3U2l6ZSk7CiAgICAgbWVtY3B5KGxwRGF0YSwgJlRoaXMtPmRhdGEsIGR3U2l6ZSk7CiAKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CisgICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgIFRSQUNFKCJSZXR1cm5pbmcgZGF0YSA6XG4iKTsKIAlfZHVtcF9leGVjdXRlZGF0YShscERhdGEpOwogICAgIH0KQEAgLTYyOCw5NiArNzczLDYzIEBACiAgICAgcmV0dXJuIEREX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX1ZhbGlkYXRlKExQRElSRUNUM0RFWEVDVVRFQlVGRkVSIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBkd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFZBTElEQVRFQ0FMTEJBQ0sgbHBGdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFVzZXJBcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdSZXNlcnZlZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6VmFsaWRhdGUKKyAqCisgKiBEaXJlY3RYIDUgU0RLOiAiVGhlIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlZhbGlkYXRlIG1ldGhvZCBpcyBub3QKKyAqIGN1cnJlbnRseSBpbXBsZW1lbnRlZCIKKyAqCisgKiBQYXJhbXM6CisgKiAgPworICoKKyAqIFJldHVybnM6CisgKiAgRERFUlJfVU5TVVBQT1JURUQsIGJlY2F1c2UgaXQncyBub3QgaW1wbGVtZW50ZWQgaW4gV2luZG93cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1ZhbGlkYXRlKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVkFMSURBVEVDQUxMQkFDSyBGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqVXNlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFJlc2VydmVkKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCwlcCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBkd09mZnNldCwgbHBGdW5jLCBscFVzZXJBcmcsIGR3UmVzZXJ2ZWQpOwotICAgIHJldHVybiBERF9PSzsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwLCUwOGx4KTogVW5pbXBsZW1lbnRlZCFcbiIsIFRoaXMsIE9mZnNldCwgRnVuYywgVXNlckFyZywgUmVzZXJ2ZWQpOworICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsgLyogVW5jaGVja2VkICovCiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsXzFfT3B0aW1pemUoTFBESVJFQ1QzREVYRUNVVEVCVUZGRVIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEdW1teSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6T3B0aW1pemUKKyAqCisgKiBEaXJlY3RYNSBTREs6ICJUaGUgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6T3B0aW1pemUgbWV0aG9kIGlzIG5vdAorICogY3VycmVudGx5IHN1cHBvcnRlZCIKKyAqCisgKiBQYXJhbXM6CisgKiAgRHVtbXk6IFNlZW1zIHRvIGJlIGFuIHVudXNlZCBkdW1teSA7KQorICoKKyAqIFJldHVybnM6CisgKiAgRERFUlJfVU5TVVBQT1JURUQsIGJlY2F1c2UgaXQncyBub3QgaW1wbGVtZW50ZWQgaW4gV2luZG93cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX09wdGltaXplKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRHVtbXkpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4KSBuby1vcC4uLlxuIiwgVGhpcywgaWZhY2UsIGR3RHVtbXkpOwotICAgIHJldHVybiBERF9PSzsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4KTogVW5pbXBsZW1lbnRlZFxuIiwgVGhpcywgRHVtbXkpOworICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsgLyogVW5jaGVja2VkICovCiB9CiAKLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodHlwZW9mKFZUQUJMRV9JRGlyZWN0M0RFeGVjdXRlQnVmZmVyLmZ1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHZvaWQqKQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyVnRibCBWVEFCTEVfSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciA9Citjb25zdCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyVnRibCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX1Z0YmwgPQogewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBNYWluX0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsXzFfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKSBNYWluX0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsXzFfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpIE1haW5fSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfMV9SZWxlYXNlLAotICAgIFhDQVNUKEluaXRpYWxpemUpIE1haW5fSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfMV9Jbml0aWFsaXplLAotICAgIFhDQVNUKExvY2spIE1haW5fSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfMV9Mb2NrLAotICAgIFhDQVNUKFVubG9jaykgTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX1VubG9jaywKLSAgICBYQ0FTVChTZXRFeGVjdXRlRGF0YSkgTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX1NldEV4ZWN1dGVEYXRhLAotICAgIFhDQVNUKEdldEV4ZWN1dGVEYXRhKSBNYWluX0lEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsXzFfR2V0RXhlY3V0ZURhdGEsCi0gICAgWENBU1QoVmFsaWRhdGUpIE1haW5fSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfMV9WYWxpZGF0ZSwKLSAgICBYQ0FTVChPcHRpbWl6ZSkgTWFpbl9JRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF8xX09wdGltaXplLAorICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAorICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9SZWxlYXNlLAorICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0luaXRpYWxpemUsCisgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfTG9jaywKKyAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9VbmxvY2ssCisgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfU2V0RXhlY3V0ZURhdGEsCisgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfR2V0RXhlY3V0ZURhdGEsCisgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfVmFsaWRhdGUsCisgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfT3B0aW1pemUsCiB9OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotCi1IUkVTVUxUIGQzZGV4ZWN1dGVidWZmZXJfY3JlYXRlKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsICoqb2JqLCBJRGlyZWN0RHJhd0ltcGwgKmQzZCwgSURpcmVjdDNERGV2aWNlSW1wbCAqZDNkZGV2LCBMUEQzREVYRUNVVEVCVUZGRVJERVNDIGxwRGVzYykKLXsKLSAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCogb2JqZWN0OwotCi0gICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCkpOwotCi0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIFZUQUJMRV9JRGlyZWN0M0RFeGVjdXRlQnVmZmVyKTsKLSAgICAKLSAgICBvYmplY3QtPnJlZiA9IDE7Ci0gICAgb2JqZWN0LT5kM2QgPSBkM2Q7Ci0gICAgb2JqZWN0LT5kM2RkZXYgPSBkM2RkZXY7Ci0KLSAgICAvKiBJbml0aWFsaXplcyBtZW1vcnkgKi8KLSAgICBtZW1jcHkoJm9iamVjdC0+ZGVzYywgbHBEZXNjLCBscERlc2MtPmR3U2l6ZSk7Ci0KLSAgICAvKiBObyBidWZmZXIgZ2l2ZW4gKi8KLSAgICBpZiAoKG9iamVjdC0+ZGVzYy5kd0ZsYWdzICYgRDNEREVCX0xQREFUQSkgPT0gMCkKLSAgICAgICAgb2JqZWN0LT5kZXNjLmxwRGF0YSA9IE5VTEw7Ci0KLSAgICAvKiBObyBidWZmZXIgc2l6ZSBnaXZlbiAqLwotICAgIGlmICgobHBEZXNjLT5kd0ZsYWdzICYgRDNEREVCX0JVRlNJWkUpID09IDApCi0gICAgICAgIG9iamVjdC0+ZGVzYy5kd0J1ZmZlclNpemUgPSAwOwotCi0gICAgLyogQ3JlYXRlIGJ1ZmZlciBpZiBhc2tlZCAqLwotICAgIGlmICgob2JqZWN0LT5kZXNjLmxwRGF0YSA9PSBOVUxMKSAmJiAob2JqZWN0LT5kZXNjLmR3QnVmZmVyU2l6ZSA+IDApKSB7Ci0gICAgICAgIG9iamVjdC0+bmVlZF9mcmVlID0gVFJVRTsKLQlvYmplY3QtPmRlc2MubHBEYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxvYmplY3QtPmRlc2MuZHdCdWZmZXJTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBvYmplY3QtPm5lZWRfZnJlZSA9IEZBTFNFOwotICAgIH0KLQotICAgIC8qIE5vIHZlcnRpY2VzIGZvciB0aGUgbW9tZW50ICovCi0gICAgb2JqZWN0LT52ZXJ0ZXhfZGF0YSA9IE5VTEw7Ci0KLSAgICBvYmplY3QtPmRlc2MuZHdGbGFncyB8PSBEM0RERUJfTFBEQVRBOwotCi0gICAgb2JqZWN0LT5leGVjdXRlID0gZXhlY3V0ZTsKLQotICAgIG9iamVjdC0+aW5kaWNlcyA9IE5VTEw7Ci0gICAgb2JqZWN0LT5uYl9pbmRpY2VzID0gMDsKLQotICAgICpvYmogPSBvYmplY3Q7Ci0KLSAgICBUUkFDRSgiIGNyZWF0aW5nIGltcGxlbWVudGF0aW9uIGF0ICVwLlxuIiwgKm9iaik7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2dhbW1hLmMgYi9kbGxzL2RkcmF3L2dhbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNjkyYgotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvZGRyYXcvZ2FtbWEuYwpAQCAtMCwwICsxLDIxMyBAQAorLyogRGlyZWN0RHJhd0dhbW1hQ29udHJvbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAyMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNiBTdGVmYW4gRPZzaW5nZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAid2luZS9wb3J0LmgiCisjaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQ09CSk1BQ1JPUworCisjaW5jbHVkZSAid2luZGVmLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2luZ2RpLmgiCisjaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJleGNwdC5oIgorCisjaW5jbHVkZSAiZGRyYXcuaCIKKyNpbmNsdWRlICJkM2QuaCIKKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKworV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOworV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoZGRyYXdfdGh1bmspOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVVua293biBwYXJ0cyBmb2xsb3cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdHYW1tYUNvbnRyb2w6OlF1ZXJ5SW50ZXJmYWNlCisgKgorICogUXVlcnlJbnRlcmZhY2UsIHRodW5rcyB0byBJRGlyZWN0RHJhd1N1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgcmlpZDogSW50ZXJmYWNlIGlkIHF1ZXJpZWQgZm9yCisgKiAgb2JqOiBSZXR1cm5zIHRoZSBpbnRlcmZhY2UgcG9pbnRlcgorICoKKyAqIFJldHVybnM6CisgKiAgU19PSyBvciBFX05PSU5URVJGQUNFOiBTZWUgSURpcmVjdERyYXdTdXJmYWNlNzo6UXVlcnlJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdHYW1tYUNvbnRyb2xJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3REcmF3R2FtbWFDb250cm9sICppZmFjZSwgUkVGSUlEIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTdcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbDo6QWRkUmVmCisgKgorICogQWRkcmVmLCB0aHVua3MgdG8gSURpcmVjdERyYXdTdXJmYWNlCisgKgorICogUmV0dXJuczoKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0RHJhd0dhbW1hQ29udHJvbEltcGxfQWRkUmVmKElEaXJlY3REcmF3R2FtbWFDb250cm9sICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIFRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTdcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3R2FtbWFDb250cm9sOjpSZWxlYXNlCisgKgorICogUmVsZWFzZSwgdGh1bmtzIHRvIElEaXJlY3REcmF3U3VyZmFjZQorICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdERyYXdHYW1tYUNvbnRyb2xJbXBsX1JlbGVhc2UoSURpcmVjdERyYXdHYW1tYUNvbnRyb2wgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3R2FtbWFDb250cm9sLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgVGh1bmtpbmcgdG8gSURpcmVjdERyYXdTdXJmYWNlN1xuIiwgVGhpcyk7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3R2FtbWFDb250cm9sCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3R2FtbWFDb250cm9sOjpHZXRHYW1tYVJhbXAKKyAqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGdhbW1hIHJhbXAgZm9yIGEgc3VyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogSWdub3JlZAorICogIEdhbW1hUmFtcDogQWRkcmVzcyB0byB3cml0ZSB0aGUgcmFtcCB0bworICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgR2FtbWFSYW1wIGlzIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdHYW1tYUNvbnRyb2xJbXBsX0dldEdhbW1hUmFtcChJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREdBTU1BUkFNUCAqR2FtbWFSYW1wKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3R2FtbWFDb250cm9sLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglMDhseCwlcClcbiIsIFRoaXMsRmxhZ3MsR2FtbWFSYW1wKTsKKworICAgIC8qIFRoaXMgbG9va3Mgc2FuZSAqLworICAgIGlmKCFHYW1tYVJhbXApCisgICAgeworICAgICAgICBFUlIoIiglcCkgR2FtbWFSYW1wIGlzIE5VTEwsIHJldHVybmluZyBEREVSUl9JTlZBTElEUEFSQU1TXG4iLCBUaGlzKTsKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgfQorCisgICAgaWYoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKKyAgICB7CisgICAgICAgIC8qIFRoaXMgcmV0dXJucyBhIHZvaWQgKi8KKyAgICAgICAgSVdpbmVEM0REZXZpY2VfR2V0R2FtbWFSYW1wKFRoaXMtPmRkcmF3LT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBTd2FwY2hhaW4gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzREdBTU1BUkFNUCAqKSBHYW1tYVJhbXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBFUlIoIiglcCkgVW5pbXBsZW1lbnRlZCBmb3Igbm9uLXByaW1hcnkgc3VyZmFjZXNcbiIsIFRoaXMpOworICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3R2FtbWFDb250cm9sOjpTZXRHYW1tYVJhbXAKKyAqCisgKiBTZXRzIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGdhbW1hIHJhbXBzIGZvcgorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogQ2FuIGJlIEREU0dSX0NBTElCUkFURSB0byByZXF1ZXN0IGNhbGlicmF0aW9uCisgKiAgR2FtbWFSYW1wOiBTdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmV3IGdhbW1hIHJhbXAKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEdhbW1hUmFtcCBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3R2FtbWFDb250cm9sSW1wbF9TZXRHYW1tYVJhbXAoSURpcmVjdERyYXdHYW1tYUNvbnRyb2wgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERHQU1NQVJBTVAgKkdhbW1hUmFtcCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXApXG4iLCBUaGlzLEZsYWdzLEdhbW1hUmFtcCk7CisKKyAgICAvKiBUaGlzIGxvb2tzIHNhbmUgKi8KKyAgICBpZighR2FtbWFSYW1wKQorICAgIHsKKyAgICAgICAgRVJSKCIoJXApIEdhbW1hUmFtcCBpcyBOVUxMLCByZXR1cm5pbmcgRERFUlJfSU5WQUxJRFBBUkFNU1xuIiwgVGhpcyk7CisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIGlmKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCisgICAgeworICAgICAgICAvKiBUaGlzIHJldHVybnMgYSB2b2lkICovCisgICAgICAgIElXaW5lRDNERGV2aWNlX1NldEdhbW1hUmFtcChUaGlzLT5kZHJhdy0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogU3dhcGNoYWluICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzREdBTU1BUkFNUCAqKSBHYW1tYVJhbXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBFUlIoIiglcCkgVW5pbXBsZW1lbnRlZCBmb3Igbm9uLXByaW1hcnkgc3VyZmFjZXNcbiIsIFRoaXMpOworICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworY29uc3QgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xWdGJsIElEaXJlY3REcmF3R2FtbWFDb250cm9sX1Z0YmwgPQoreworICAgIElEaXJlY3REcmF3R2FtbWFDb250cm9sSW1wbF9RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbEltcGxfQWRkUmVmLAorICAgIElEaXJlY3REcmF3R2FtbWFDb250cm9sSW1wbF9SZWxlYXNlLAorICAgIElEaXJlY3REcmF3R2FtbWFDb250cm9sSW1wbF9HZXRHYW1tYVJhbXAsCisgICAgSURpcmVjdERyYXdHYW1tYUNvbnRyb2xJbXBsX1NldEdhbW1hUmFtcAorfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZ2xfYXBpLmggYi9kbGxzL2RkcmF3L2dsX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTczNWU0Li4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZ2xfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyogR0wgQVBJIGxpc3QKLSAqIENvcHlyaWdodCAoYykgMjAwMyBMaW9uZWwgVWxtZXIgLyBNaWtlIE1jQ29ybWFjawotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgc3RydWN0dXJlcyB0aGF0IGFyZSBub3QgZXhwb3J0ZWQKLSAqIHRocm91Z2ggZDNkLmggYW5kIGFsbCBjb21tb24gbWFjcm9zLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLS8qIE5vdGUgOiB0aGlzIGZpbGUgaXMgTk9UIHByb3RlY3RlZCBhZ2FpbnN0IGRvdWJsZS1pbmNsdXNpb24gZm9yIHByZXR0eSBnb29kCi0gICAgICAgICAgcmVhc29ucyA6LSkgKi8KLQotI2lmbmRlZiBHTF9BUElfRlVOQ1RJT04KLSNlcnJvciAiVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCB3aXRoIEdMX0FQSV9GVU5DVElPTiBkZWZpbmVkICEiCi0jZW5kaWYKLQotR0xfQVBJX0ZVTkNUSU9OKGdsQWxwaGFGdW5jKQotR0xfQVBJX0ZVTkNUSU9OKGdsQmVnaW4pCi1HTF9BUElfRlVOQ1RJT04oZ2xCaW5kVGV4dHVyZSkKLUdMX0FQSV9GVU5DVElPTihnbEJsZW5kRnVuYykKLUdMX0FQSV9GVU5DVElPTihnbENsZWFyKQotR0xfQVBJX0ZVTkNUSU9OKGdsQ2xlYXJDb2xvcikKLUdMX0FQSV9GVU5DVElPTihnbENsZWFyRGVwdGgpCi1HTF9BUElfRlVOQ1RJT04oZ2xDbGVhclN0ZW5jaWwpCi1HTF9BUElfRlVOQ1RJT04oZ2xDbGlwUGxhbmUpCi1HTF9BUElfRlVOQ1RJT04oZ2xDb2xvcjNmKQotR0xfQVBJX0ZVTkNUSU9OKGdsQ29sb3IzdWIpCi1HTF9BUElfRlVOQ1RJT04oZ2xDb2xvcjR1YikKLUdMX0FQSV9GVU5DVElPTihnbENvbG9yTWFzaykKLUdMX0FQSV9GVU5DVElPTihnbENvbG9yTWF0ZXJpYWwpCi1HTF9BUElfRlVOQ1RJT04oZ2xDb2xvclBvaW50ZXIpCi1HTF9BUElfRlVOQ1RJT04oZ2xDb3B5UGl4ZWxzKQotR0xfQVBJX0ZVTkNUSU9OKGdsQ29weVRleFN1YkltYWdlMkQpCi1HTF9BUElfRlVOQ1RJT04oZ2xDdWxsRmFjZSkKLUdMX0FQSV9GVU5DVElPTihnbERlbGV0ZVRleHR1cmVzKQotR0xfQVBJX0ZVTkNUSU9OKGdsRGVwdGhGdW5jKQotR0xfQVBJX0ZVTkNUSU9OKGdsRGVwdGhNYXNrKQotR0xfQVBJX0ZVTkNUSU9OKGdsRGVwdGhSYW5nZSkKLUdMX0FQSV9GVU5DVElPTihnbERpc2FibGUpCi1HTF9BUElfRlVOQ1RJT04oZ2xEaXNhYmxlQ2xpZW50U3RhdGUpCi1HTF9BUElfRlVOQ1RJT04oZ2xEcmF3QXJyYXlzKQotR0xfQVBJX0ZVTkNUSU9OKGdsRHJhd0J1ZmZlcikKLUdMX0FQSV9GVU5DVElPTihnbERyYXdFbGVtZW50cykKLUdMX0FQSV9GVU5DVElPTihnbERyYXdQaXhlbHMpCi1HTF9BUElfRlVOQ1RJT04oZ2xFbmFibGUpCi1HTF9BUElfRlVOQ1RJT04oZ2xFbmFibGVDbGllbnRTdGF0ZSkKLUdMX0FQSV9GVU5DVElPTihnbEVuZCkKLUdMX0FQSV9GVU5DVElPTihnbEZsdXNoKQotR0xfQVBJX0ZVTkNUSU9OKGdsRm9nZikKLUdMX0FQSV9GVU5DVElPTihnbEZvZ2Z2KQotR0xfQVBJX0ZVTkNUSU9OKGdsRm9naSkKLUdMX0FQSV9GVU5DVElPTihnbEZyb250RmFjZSkKLUdMX0FQSV9GVU5DVElPTihnbEdlblRleHR1cmVzKQotR0xfQVBJX0ZVTkNUSU9OKGdsR2V0Qm9vbGVhbnYpCi1HTF9BUElfRlVOQ1RJT04oZ2xHZXRFcnJvcikKLUdMX0FQSV9GVU5DVElPTihnbEdldEZsb2F0dikKLUdMX0FQSV9GVU5DVElPTihnbEdldEludGVnZXJ2KQotR0xfQVBJX0ZVTkNUSU9OKGdsR2V0U3RyaW5nKQotR0xfQVBJX0ZVTkNUSU9OKGdsR2V0VGV4RW52aXYpCi1HTF9BUElfRlVOQ1RJT04oZ2xHZXRUZXhQYXJhbWV0ZXJpdikKLUdMX0FQSV9GVU5DVElPTihnbEhpbnQpCi1HTF9BUElfRlVOQ1RJT04oZ2xMaWdodE1vZGVsZnYpCi1HTF9BUElfRlVOQ1RJT04oZ2xMaWdodE1vZGVsaSkKLUdMX0FQSV9GVU5DVElPTihnbExpZ2h0ZnYpCi1HTF9BUElfRlVOQ1RJT04oZ2xMb2FkSWRlbnRpdHkpCi1HTF9BUElfRlVOQ1RJT04oZ2xMb2FkTWF0cml4ZikKLUdMX0FQSV9GVU5DVElPTihnbE1hdGVyaWFsZikKLUdMX0FQSV9GVU5DVElPTihnbE1hdGVyaWFsZnYpCi1HTF9BUElfRlVOQ1RJT04oZ2xNYXRyaXhNb2RlKQotR0xfQVBJX0ZVTkNUSU9OKGdsTXVsdE1hdHJpeGYpCi1HTF9BUElfRlVOQ1RJT04oZ2xOb3JtYWwzZikKLUdMX0FQSV9GVU5DVElPTihnbE5vcm1hbDNmdikKLUdMX0FQSV9GVU5DVElPTihnbE5vcm1hbFBvaW50ZXIpCi1HTF9BUElfRlVOQ1RJT04oZ2xPcnRobykKLUdMX0FQSV9GVU5DVElPTihnbFBpeGVsU3RvcmVpKQotR0xfQVBJX0ZVTkNUSU9OKGdsUG9seWdvbk1vZGUpCi1HTF9BUElfRlVOQ1RJT04oZ2xQb2x5Z29uT2Zmc2V0KQotR0xfQVBJX0ZVTkNUSU9OKGdsUG9wTWF0cml4KQotR0xfQVBJX0ZVTkNUSU9OKGdsUHVzaE1hdHJpeCkKLUdMX0FQSV9GVU5DVElPTihnbFJhc3RlclBvczJpKQotR0xfQVBJX0ZVTkNUSU9OKGdsUmFzdGVyUG9zM2QpCi1HTF9BUElfRlVOQ1RJT04oZ2xSZWFkQnVmZmVyKQotR0xfQVBJX0ZVTkNUSU9OKGdsUmVhZFBpeGVscykKLUdMX0FQSV9GVU5DVElPTihnbFNjaXNzb3IpCi1HTF9BUElfRlVOQ1RJT04oZ2xTaGFkZU1vZGVsKQotR0xfQVBJX0ZVTkNUSU9OKGdsU3RlbmNpbEZ1bmMpCi1HTF9BUElfRlVOQ1RJT04oZ2xTdGVuY2lsTWFzaykKLUdMX0FQSV9GVU5DVElPTihnbFN0ZW5jaWxPcCkKLUdMX0FQSV9GVU5DVElPTihnbFRleENvb3JkMWZ2KQotR0xfQVBJX0ZVTkNUSU9OKGdsVGV4Q29vcmQyZikKLUdMX0FQSV9GVU5DVElPTihnbFRleENvb3JkMmZ2KQotR0xfQVBJX0ZVTkNUSU9OKGdsVGV4Q29vcmQzZnYpCi1HTF9BUElfRlVOQ1RJT04oZ2xUZXhDb29yZDRmdikKLUdMX0FQSV9GVU5DVElPTihnbFRleENvb3JkUG9pbnRlcikKLUdMX0FQSV9GVU5DVElPTihnbFRleEVudmYpCi1HTF9BUElfRlVOQ1RJT04oZ2xUZXhFbnZmdikKLUdMX0FQSV9GVU5DVElPTihnbFRleEVudmkpCi1HTF9BUElfRlVOQ1RJT04oZ2xUZXhJbWFnZTJEKQotR0xfQVBJX0ZVTkNUSU9OKGdsVGV4UGFyYW1ldGVyaSkKLUdMX0FQSV9GVU5DVElPTihnbFRleFBhcmFtZXRlcmZ2KQotR0xfQVBJX0ZVTkNUSU9OKGdsVGV4U3ViSW1hZ2UyRCkKLUdMX0FQSV9GVU5DVElPTihnbFRyYW5zbGF0ZWYpCi1HTF9BUElfRlVOQ1RJT04oZ2xWZXJ0ZXgzZCkKLUdMX0FQSV9GVU5DVElPTihnbFZlcnRleDNmKQotR0xfQVBJX0ZVTkNUSU9OKGdsVmVydGV4M2Z2KQotR0xfQVBJX0ZVTkNUSU9OKGdsVmVydGV4NGYpCi1HTF9BUElfRlVOQ1RJT04oZ2xWZXJ0ZXhQb2ludGVyKQotR0xfQVBJX0ZVTkNUSU9OKGdsVmlld3BvcnQpCi1HTF9BUElfRlVOQ1RJT04oZ2xYQ3JlYXRlQ29udGV4dCkKLUdMX0FQSV9GVU5DVElPTihnbFhEZXN0cm95Q29udGV4dCkKLUdMX0FQSV9GVU5DVElPTihnbFhNYWtlQ3VycmVudCkKLUdMX0FQSV9GVU5DVElPTihnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcpCi1HTF9BUElfRlVOQ1RJT04oZ2xYU3dhcEJ1ZmZlcnMpCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2dsX3ByaXZhdGUuaCBiL2RsbHMvZGRyYXcvZ2xfcHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjlkYWNhLi4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZ2xfcHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qIEdMICdoYWNrJyBwcml2YXRlIGluY2x1ZGUgZmlsZQotICogQ29weXJpZ2h0IChjKSAyMDAzIExpb25lbCBVbG1lciAvIE1pa2UgTWNDb3JtYWNrCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBzdHJ1Y3R1cmVzIHRoYXQgYXJlIG5vdCBleHBvcnRlZAotICogdGhyb3VnaCBkM2QuaCBhbmQgYWxsIGNvbW1vbiBtYWNyb3MuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLQotI2lmbmRlZiBfX0dSQVBISUNTX1dJTkVfR0xfUFJJVkFURV9ICi0jZGVmaW5lIF9fR1JBUEhJQ1NfV0lORV9HTF9QUklWQVRFX0gKLQotI2lmZGVmIEhBVkVfT1BFTkdMCi0KLSN1bmRlZiBBUElFTlRSWQotI3VuZGVmIENBTExCQUNLCi0jdW5kZWYgV0lOQVBJCi0KLSNkZWZpbmUgWE1EX0ggLyogVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBYbWQuaCBpbmNsdXNpb24gYnVnIDotLyAqLwotI2luY2x1ZGUgPEdML2dsLmg+Ci0jaW5jbHVkZSA8R0wvZ2x4Lmg+Ci0jaWZkZWYgSEFWRV9HTF9HTEVYVF9ICi0jIGluY2x1ZGUgPEdML2dsZXh0Lmg+Ci0jZW5kaWYKLSN1bmRlZiAgWE1EX0gKLQotI3VuZGVmIEFQSUVOVFJZCi0jdW5kZWYgQ0FMTEJBQ0sKLSN1bmRlZiBXSU5BUEkKLQotLyogUmVkZWZpbmVzIHRoZSBjb25zdGFudHMgKi8KLSNkZWZpbmUgQ0FMTEJBQ0sgICAgX19zdGRjYWxsCi0jZGVmaW5lIFdJTkFQSSAgICAgIF9fc3RkY2FsbAotI2RlZmluZSBBUElFTlRSWSAgICBXSU5BUEkKLQotI2RlZmluZSBHTF9BUElfRlVOQ1RJT04oZikgZXh0ZXJuIHR5cGVvZihmKSAqIHAjI2Y7Ci0jaW5jbHVkZSAiZ2xfYXBpLmgiCi0jdW5kZWYgR0xfQVBJX0ZVTkNUSU9OCi0KLS8qIFRoaXMgaXMgYWxzbyB3aGVyZSBJIHN0b3JlIG91ciBwcml2YXRlIGV4dGVuc2lvbiBkZWZpbmVzLi4uCi0gICBJIGtub3cgdGhhdCBSYXBoYWVsIHdvbid0IGxpa2UgaXQsIGJ1dCB3ZWxsLCBJIHByZWZlciBkb2luZyB0aGF0IHRoYW4gYmF0dGxpbmcgMTAgZGlmZmVyZW50IGhlYWRlcnMgOi0pCi0KLSAgIE5vdGU6IHRoaXMgaXMgcGVyZmVjdGx5ICdsZWdhbCcgYXMgdGhlIHRocmVlIHZhcmlhbnRzIG9mIHRoZSBlbnVtIGhhdmUgZXhhY3RseSB0aGUgc2FtZSB2YWx1ZQotKi8KLSNkZWZpbmUgR0xfTUlSUk9SRURfUkVQRUFUX1dJTkUgICAgICAgICAgICAgICAgIDB4ODM3MAotI2RlZmluZSBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MX1dJTkUgICAgICAgICAgMHg4NTAwCi0jZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfV0lORSAgICAgICAgICAgICAgICAweDg1MDEKLSNkZWZpbmUgR0xfVEVYVFVSRTBfV0lORSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAotI2RlZmluZSBHTF9URVhUVVJFMV9XSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCi0jZGVmaW5lIEdMX1RFWFRVUkUyX1dJTkUgICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKLSNkZWZpbmUgR0xfVEVYVFVSRTNfV0lORSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMwotI2RlZmluZSBHTF9URVhUVVJFNF9XSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0Ci0jZGVmaW5lIEdMX1RFWFRVUkU1X1dJTkUgICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKLSNkZWZpbmUgR0xfVEVYVFVSRTZfV0lORSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgotI2RlZmluZSBHTF9URVhUVVJFN19XSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3Ci0jZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTX1dJTkUgICAgICAgICAgICAgICAweDg0RTIKLQotI2lmbmRlZiBHTFBSSVZBVEVfTk9fUkVERUZJTkUKLQotI2RlZmluZSBnbEFscGhhRnVuYyBwZ2xBbHBoYUZ1bmMKLSNkZWZpbmUgZ2xCZWdpbiBwZ2xCZWdpbgotI2RlZmluZSBnbEJpbmRUZXh0dXJlIHBnbEJpbmRUZXh0dXJlCi0jZGVmaW5lIGdsQmxlbmRGdW5jIHBnbEJsZW5kRnVuYwotI2RlZmluZSBnbENsZWFyIHBnbENsZWFyCi0jZGVmaW5lIGdsQ2xlYXJDb2xvciBwZ2xDbGVhckNvbG9yCi0jZGVmaW5lIGdsQ2xlYXJEZXB0aCBwZ2xDbGVhckRlcHRoCi0jZGVmaW5lIGdsQ2xlYXJTdGVuY2lsIHBnbENsZWFyU3RlbmNpbAotI2RlZmluZSBnbENsaXBQbGFuZSBwZ2xDbGlwUGxhbmUKLSNkZWZpbmUgZ2xDb2xvcjNmIHBnbENvbG9yM2YKLSNkZWZpbmUgZ2xDb2xvcjN1YiBwZ2xDb2xvcjN1YgotI2RlZmluZSBnbENvbG9yNHViIHBnbENvbG9yNHViCi0jZGVmaW5lIGdsQ29sb3JNYXNrIHBnbENvbG9yTWFzawotI2RlZmluZSBnbENvbG9yUG9pbnRlciBwZ2xDb2xvclBvaW50ZXIKLSNkZWZpbmUgZ2xDb3B5UGl4ZWxzIHBnbENvcHlQaXhlbHMKLSNkZWZpbmUgZ2xDb3B5VGV4U3ViSW1hZ2UyRCBwZ2xDb3B5VGV4U3ViSW1hZ2UyRAotI2RlZmluZSBnbENvbG9yTWF0ZXJpYWwgcGdsQ29sb3JNYXRlcmlhbAotI2RlZmluZSBnbEN1bGxGYWNlIHBnbEN1bGxGYWNlCi0jZGVmaW5lIGdsRGVsZXRlVGV4dHVyZXMgcGdsRGVsZXRlVGV4dHVyZXMKLSNkZWZpbmUgZ2xEZXB0aEZ1bmMgcGdsRGVwdGhGdW5jCi0jZGVmaW5lIGdsRGVwdGhNYXNrIHBnbERlcHRoTWFzawotI2RlZmluZSBnbERlcHRoUmFuZ2UgcGdsRGVwdGhSYW5nZQotI2RlZmluZSBnbERpc2FibGUgcGdsRGlzYWJsZQotI2RlZmluZSBnbERpc2FibGVDbGllbnRTdGF0ZSBwZ2xEaXNhYmxlQ2xpZW50U3RhdGUKLSNkZWZpbmUgZ2xEcmF3QXJyYXlzIHBnbERyYXdBcnJheXMKLSNkZWZpbmUgZ2xEcmF3QnVmZmVyIHBnbERyYXdCdWZmZXIKLSNkZWZpbmUgZ2xEcmF3RWxlbWVudHMgcGdsRHJhd0VsZW1lbnRzCi0jZGVmaW5lIGdsRHJhd1BpeGVscyBwZ2xEcmF3UGl4ZWxzCi0jZGVmaW5lIGdsRW5hYmxlIHBnbEVuYWJsZQotI2RlZmluZSBnbEVuYWJsZUNsaWVudFN0YXRlIHBnbEVuYWJsZUNsaWVudFN0YXRlCi0jZGVmaW5lIGdsRW5kIHBnbEVuZAotI2RlZmluZSBnbEZsdXNoIHBnbEZsdXNoCi0jZGVmaW5lIGdsRm9nZiBwZ2xGb2dmCi0jZGVmaW5lIGdsRm9nZnYgcGdsRm9nZnYKLSNkZWZpbmUgZ2xGb2dpIHBnbEZvZ2kKLSNkZWZpbmUgZ2xGcm9udEZhY2UgcGdsRnJvbnRGYWNlCi0jZGVmaW5lIGdsR2VuVGV4dHVyZXMgcGdsR2VuVGV4dHVyZXMKLSNkZWZpbmUgZ2xHZXRCb29sZWFudiBwZ2xHZXRCb29sZWFudgotI2RlZmluZSBnbEdldEVycm9yIHBnbEdldEVycm9yCi0jZGVmaW5lIGdsR2V0RmxvYXR2IHBnbEdldEZsb2F0dgotI2RlZmluZSBnbEdldEludGVnZXJ2IHBnbEdldEludGVnZXJ2Ci0jZGVmaW5lIGdsR2V0U3RyaW5nIHBnbEdldFN0cmluZwotI2RlZmluZSBnbEdldFRleEVudml2IHBnbEdldFRleEVudml2Ci0jZGVmaW5lIGdsR2V0VGV4UGFyYW1ldGVyaXYgcGdsR2V0VGV4UGFyYW1ldGVyaXYKLSNkZWZpbmUgZ2xIaW50IHBnbEhpbnQKLSNkZWZpbmUgZ2xMaWdodE1vZGVsZnYgcGdsTGlnaHRNb2RlbGZ2Ci0jZGVmaW5lIGdsTGlnaHRNb2RlbGkgcGdsTGlnaHRNb2RlbGkKLSNkZWZpbmUgZ2xMaWdodGZ2IHBnbExpZ2h0ZnYKLSNkZWZpbmUgZ2xMb2FkSWRlbnRpdHkgcGdsTG9hZElkZW50aXR5Ci0jZGVmaW5lIGdsTG9hZE1hdHJpeGYgcGdsTG9hZE1hdHJpeGYKLSNkZWZpbmUgZ2xNYXRlcmlhbGYgcGdsTWF0ZXJpYWxmCi0jZGVmaW5lIGdsTWF0ZXJpYWxmdiBwZ2xNYXRlcmlhbGZ2Ci0jZGVmaW5lIGdsTWF0cml4TW9kZSBwZ2xNYXRyaXhNb2RlCi0jZGVmaW5lIGdsTXVsdE1hdHJpeGYgcGdsTXVsdE1hdHJpeGYKLSNkZWZpbmUgZ2xOb3JtYWwzZiBwZ2xOb3JtYWwzZgotI2RlZmluZSBnbE5vcm1hbDNmdiBwZ2xOb3JtYWwzZnYKLSNkZWZpbmUgZ2xOb3JtYWxQb2ludGVyIHBnbE5vcm1hbFBvaW50ZXIKLSNkZWZpbmUgZ2xPcnRobyBwZ2xPcnRobwotI2RlZmluZSBnbFBpeGVsU3RvcmVpIHBnbFBpeGVsU3RvcmVpCi0jZGVmaW5lIGdsUG9seWdvbk1vZGUgcGdsUG9seWdvbk1vZGUKLSNkZWZpbmUgZ2xQb2x5Z29uT2Zmc2V0IHBnbFBvbHlnb25PZmZzZXQKLSNkZWZpbmUgZ2xQb3BNYXRyaXggcGdsUG9wTWF0cml4Ci0jZGVmaW5lIGdsUHVzaE1hdHJpeCBwZ2xQdXNoTWF0cml4Ci0jZGVmaW5lIGdsUmFzdGVyUG9zMmkgcGdsUmFzdGVyUG9zMmkKLSNkZWZpbmUgZ2xSYXN0ZXJQb3MzZCBwZ2xSYXN0ZXJQb3MzZAotI2RlZmluZSBnbFJlYWRCdWZmZXIgcGdsUmVhZEJ1ZmZlcgotI2RlZmluZSBnbFJlYWRQaXhlbHMgcGdsUmVhZFBpeGVscwotI2RlZmluZSBnbFNjaXNzb3IgcGdsU2Npc3NvcgotI2RlZmluZSBnbFNoYWRlTW9kZWwgcGdsU2hhZGVNb2RlbAotI2RlZmluZSBnbFN0ZW5jaWxGdW5jIHBnbFN0ZW5jaWxGdW5jCi0jZGVmaW5lIGdsU3RlbmNpbE1hc2sgcGdsU3RlbmNpbE1hc2sKLSNkZWZpbmUgZ2xTdGVuY2lsT3AgcGdsU3RlbmNpbE9wCi0jZGVmaW5lIGdsVGV4Q29vcmQxZnYgcGdsVGV4Q29vcmQxZnYKLSNkZWZpbmUgZ2xUZXhDb29yZDJmIHBnbFRleENvb3JkMmYKLSNkZWZpbmUgZ2xUZXhDb29yZDJmdiBwZ2xUZXhDb29yZDJmdgotI2RlZmluZSBnbFRleENvb3JkM2Z2IHBnbFRleENvb3JkM2Z2Ci0jZGVmaW5lIGdsVGV4Q29vcmQ0ZnYgcGdsVGV4Q29vcmQ0ZnYKLSNkZWZpbmUgZ2xUZXhDb29yZFBvaW50ZXIgcGdsVGV4Q29vcmRQb2ludGVyCi0jZGVmaW5lIGdsVGV4RW52ZiBwZ2xUZXhFbnZmCi0jZGVmaW5lIGdsVGV4RW52ZnYgcGdsVGV4RW52ZnYKLSNkZWZpbmUgZ2xUZXhFbnZpIHBnbFRleEVudmkKLSNkZWZpbmUgZ2xUZXhJbWFnZTJEIHBnbFRleEltYWdlMkQKLSNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJpIHBnbFRleFBhcmFtZXRlcmkKLSNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJmdiBwZ2xUZXhQYXJhbWV0ZXJmdgotI2RlZmluZSBnbFRleFN1YkltYWdlMkQgcGdsVGV4U3ViSW1hZ2UyRAotI2RlZmluZSBnbFRyYW5zbGF0ZWYgcGdsVHJhbnNsYXRlZgotI2RlZmluZSBnbFZlcnRleDNkIHBnbFZlcnRleDNkCi0jZGVmaW5lIGdsVmVydGV4M2YgcGdsVmVydGV4M2YKLSNkZWZpbmUgZ2xWZXJ0ZXgzZnYgcGdsVmVydGV4M2Z2Ci0jZGVmaW5lIGdsVmVydGV4NGYgcGdsVmVydGV4NGYKLSNkZWZpbmUgZ2xWZXJ0ZXhQb2ludGVyIHBnbFZlcnRleFBvaW50ZXIKLSNkZWZpbmUgZ2xWaWV3cG9ydCBwZ2xWaWV3cG9ydAotI2RlZmluZSBnbFhDcmVhdGVDb250ZXh0IHBnbFhDcmVhdGVDb250ZXh0Ci0jZGVmaW5lIGdsWERlc3Ryb3lDb250ZXh0IHBnbFhEZXN0cm95Q29udGV4dAotI2RlZmluZSBnbFhNYWtlQ3VycmVudCBwZ2xYTWFrZUN1cnJlbnQKLSNkZWZpbmUgZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nIHBnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcKLSNkZWZpbmUgZ2xYU3dhcEJ1ZmZlcnMgcGdsWFN3YXBCdWZmZXJzCi0KLSNlbmRpZiAvKiBHTFBSSVZBVEVfTk9fUkVERUZJTkUgKi8KLQotI2VuZGlmIC8qIEhBVkVfT1BFTkdMICovCi0KLSNlbmRpZiAvKiBfX0dSQVBISUNTX1dJTkVfR0xfUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2xpZ2h0LmMgYi9kbGxzL2RkcmF3L2xpZ2h0LmMKaW5kZXggODI0ODRlNi4uZDViN2RkNiAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9saWdodC5jCisrKyBiL2RsbHMvZGRyYXcvbGlnaHQuYwpAQCAtMSw1ICsxLDYgQEAKIC8qIERpcmVjdDNEIExpZ2h0CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTggLyAyMDAyIExpb25lbCBVTE1FUgorICogQ29weXJpZ2h0IChjKSAyMDA2ICAgICAgICBTdGVmYW4gRNZTSU5HRVIKICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIERpcmVjdDNETGlnaHQuCiAgKgpAQCAtMTksNTUgKzIwLDk2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIndpbmUvcG9ydC5oIgorI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogCi0jZGVmaW5lIE5PTkFNRUxFU1NVTklPTgotI2RlZmluZSBOT05BTUVMRVNTU1RSVUNUCisjZGVmaW5lIENPQkpNQUNST1MKIAogI2luY2x1ZGUgIndpbmRlZi5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJ3aW5ubHMuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgIm9iamJhc2UuaCIKICNpbmNsdWRlICJ3aW5nZGkuaCIKKyNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImV4Y3B0LmgiCisKICNpbmNsdWRlICJkZHJhdy5oIgogI2luY2x1ZGUgImQzZC5oIgotI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKIAotI2luY2x1ZGUgImQzZF9wcml2YXRlLmgiCi0jaW5jbHVkZSAib3BlbmdsX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCiAKLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKK1dJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwogCi0vKiBGaXJzdCwgdGhlICdtYWluJyBpbnRlcmZhY2UuLi4gKi8KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRExpZ2h0SW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RMSUdIVCBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJVW5rbm93biBNZXRob2RzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRExpZ2h0OjpRdWVyeUludGVyZmFjZQorICoKKyAqIFF1ZXJpZXMgdGhlIG9iamVjdCBmb3IgZGlmZmVyZW50IGludGVyZmFjZXMuIFVuaW1wbGVtZW50ZWQgZm9yIHRoaXMKKyAqIG9iamVjdCBhdCB0aGUgbW9tZW50CisgKgorICogUGFyYW1zOgorICogIHJpaWQ6IEludGVyZmFjZSBpZCBhc2tlZCBmb3IKKyAqICBvYmo6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSByZXN1bHRpbmcgcG9pbnRlciBhdC4KKyAqCisgKiBSZXR1cm5zOgorICogIEVfTk9JTlRFUkZBQ0UsIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNETGlnaHRJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRExpZ2h0ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JwKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRExpZ2h0SW1wbCwgSURpcmVjdDNETGlnaHQsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVzLCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwotICAgIHJldHVybiBERF9PSzsKKyAgICBGSVhNRSgiKCVwKS0+KCVzLCVwKTogc3R1YiFcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CisgICAgKm9icCA9IE5VTEw7CisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiB9CiAKLVVMT05HIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RMaWdodEltcGxfMV9BZGRSZWYoTFBESVJFQ1QzRExJR0hUIGlmYWNlKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RMaWdodDo6QWRkUmVmCisgKgorICogSW5jcmVhc2VzIHRoZSByZWZjb3VudCBieSAxCisgKgorICogUmV0dXJuczoKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdDNETGlnaHRJbXBsX0FkZFJlZihJRGlyZWN0M0RMaWdodCAqaWZhY2UpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgaWZhY2UpOwogICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwogCi0gICAgVFJBQ0UoIiglcC8lcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIGlmYWNlLCByZWYgLSAxKTsKKyAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmIC0gMSk7CiAKICAgICByZXR1cm4gcmVmOwogfQogCi1VTE9ORyBXSU5BUEkKLU1haW5fSURpcmVjdDNETGlnaHRJbXBsXzFfUmVsZWFzZShMUERJUkVDVDNETElHSFQgaWZhY2UpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRExpZ2h0OjpSZWxlYXNlCisgKgorICogUmVkdWNlcyB0aGUgcmVmY291bnQgYnkgb25lLiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlIG9iamVjdAorICogaXMgZGVzdHJveWVkCisgKgorICogUmV0dXJuczoKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdDNETGlnaHRJbXBsX1JlbGVhc2UoSURpcmVjdDNETGlnaHQgKmlmYWNlKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRExpZ2h0SW1wbCwgSURpcmVjdDNETGlnaHQsIGlmYWNlKTsKICAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKIAotICAgIFRSQUNFKCIoJXAvJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBpZmFjZSwgcmVmICsgMSk7CisgICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiArIDEpOwogCiAgICAgaWYgKCFyZWYpIHsKICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CkBAIC03NiwxNiArMTE4LDQ2IEBACiAgICAgcmV0dXJuIHJlZjsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNETGlnaHRJbXBsXzFfSW5pdGlhbGl6ZShMUERJUkVDVDNETElHSFQgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRCBscERpcmVjdDNEKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RMaWdodCBNZXRob2RzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRExpZ2h0OjpJbml0aWFsaXplCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIGludGVyZmFjZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLCBiZWNhdXNlCisgKiBpbml0aWFsaXphdGlvbiB0YWtlcyBwbGFjZSBhdCBjcmVhdGlvbiB0aW1lCisgKgorICogUGFyYW1zOgorICogIERpcmVjdDNEOiBQb2ludGVyIHRvIGFuIElEaXJlY3QzRCBpbnRlcmZhY2UuCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRExpZ2h0SW1wbF9Jbml0aWFsaXplKElEaXJlY3QzRExpZ2h0ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqbHBEaXJlY3QzRCkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcCkgbm8tb3AuLi5cbiIsIFRoaXMsIGlmYWNlLCBscERpcmVjdDNEKTsKLSAgICByZXR1cm4gRERfT0s7CisgICAgSURpcmVjdERyYXdJbXBsICpkM2QgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgbHBEaXJlY3QzRCk7CisgICAgVFJBQ0UoIiglcCktPiglcCkgbm8tb3AuLi5cbiIsIFRoaXMsIGQzZCk7CisgICAgcmV0dXJuIEQzRF9PSzsKIH0KIAotLyoqKiBJRGlyZWN0M0RMaWdodCBtZXRob2RzICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNETGlnaHQ6OlNldExpZ2h0CisgKgorICogQXNzaWducyBhIGxpZ2h0aW5nIHZhbHVlIHRvIHRoaXMgb2JqZWN0CisgKgorICogUGFyYW1zOgorICogIExpZ2h0OiBMaWdodGluZyBwYXJhbWV0ZXMgdG8gc2V0CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgTGlnaHQgaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGR1bXBfbGlnaHQoTFBEM0RMSUdIVDIgbGlnaHQpCiB7CiAgICAgRFBSSU5URigiICAgIC0gZHdTaXplIDogJWxkXG4iLCBsaWdodC0+ZHdTaXplKTsKQEAgLTk1LDE0ICsxNjcsMTQgQEAKICAgICAwLjAsIDAuMCwgMC4wLCAwLjAKIH07CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRExpZ2h0SW1wbF8xX1NldExpZ2h0KExQRElSRUNUM0RMSUdIVCBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RMSUdIVCBscExpZ2h0KQorc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RMaWdodEltcGxfU2V0TGlnaHQoSURpcmVjdDNETGlnaHQgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRExJR0hUICpscExpZ2h0KQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRExpZ2h0SW1wbCwgSURpcmVjdDNETGlnaHQsIGlmYWNlKTsKICAgICBMUEQzRExJR0hUNyBsaWdodDcgPSAmKFRoaXMtPmxpZ2h0Nyk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscExpZ2h0KTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwTGlnaHQpOworICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgICBUUkFDRSgiICBMaWdodCBkZWZpbml0aW9uIDpcbiIpOwogCWR1bXBfbGlnaHQoKExQRDNETElHSFQyKSBscExpZ2h0KTsKICAgICB9CkBAIC0xMzUsMTYgKzIwNywyOCBAQAogICAgIGlmICgoVGhpcy0+bGlnaHQuZHdGbGFncyAmIEQzRExJR0hUX0FDVElWRSkgIT0gMCkgewogICAgICAgICBUaGlzLT51cGRhdGUoVGhpcyk7ICAgICAgICAKICAgICB9Ci0gICAgcmV0dXJuIEREX09LOworICAgIHJldHVybiBEM0RfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRExpZ2h0SW1wbF8xX0dldExpZ2h0KExQRElSRUNUM0RMSUdIVCBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RMSUdIVCBscExpZ2h0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RMaWdodDo6R2V0TGlnaHQKKyAqCisgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXJzIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgSURpcmVjdDNETGlnaHQgb2JqZWN0CisgKgorICogUGFyYW1zOgorICogIExpZ2h0OiBQb2ludGVyIHRvIGFuIEQzRExJR0hUIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgcGFyYW1ldGVycworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIExpZ2h0IGlzIE5VTEwKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNETGlnaHRJbXBsX0dldExpZ2h0KElEaXJlY3QzRExpZ2h0ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RMSUdIVCAqbHBMaWdodCkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBpZmFjZSk7CiAgICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscExpZ2h0KTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CisgICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgIFRSQUNFKCIgIFJldHVybmluZyBsaWdodCBkZWZpbml0aW9uIDpcbiIpOwogCWR1bXBfbGlnaHQoJlRoaXMtPmxpZ2h0KTsKICAgICB9CkBAIC0xNTIsMTEgKzIzNiwxMyBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCUxpZ2h0IHN0YXRpYyBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgdm9pZCB1cGRhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBsaWdodF91cGRhdGUKKyAqCisgKiBVcGRhdGVzIHRoZSBEaXJlY3QzRERldmljZTcgbGlnaHRpbmcgcGFyYW1ldGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbGlnaHRfdXBkYXRlKElEaXJlY3QzRExpZ2h0SW1wbCogVGhpcykKIHsKICAgICBJRGlyZWN0M0REZXZpY2VJbXBsKiBkZXZpY2U7CiAKQEAgLTE2OSw3ICsyNTUsMTMgQEAKICAgICBJRGlyZWN0M0REZXZpY2U3X1NldExpZ2h0KElDT01fSU5URVJGQUNFKGRldmljZSxJRGlyZWN0M0REZXZpY2U3KSwgVGhpcy0+ZHdMaWdodEluZGV4LCAmKFRoaXMtPmxpZ2h0NykpOwogfQogCi1zdGF0aWMgdm9pZCBhY3RpdmF0ZShJRGlyZWN0M0RMaWdodEltcGwqIFRoaXMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGxpZ2h0X2FjdGl2YXRlCisgKgorICogVXNlcyB0aGUgRGlyZWN0M0REZXZpY2U3OjpMaWdodEVuYWJsZSBtZXRob2QgdG8gYWN0aXZlIHRoZSBsaWdodAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbGlnaHRfYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKQogewogICAgIElEaXJlY3QzRERldmljZUltcGwqIGRldmljZTsKIApAQCAtMTc5LDcgKzI3MSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICBkZXZpY2UgPSAgVGhpcy0+YWN0aXZlX3ZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlOwogICAgIAotICAgIHVwZGF0ZShUaGlzKTsKKyAgICBsaWdodF91cGRhdGUoVGhpcyk7CiAgICAgLyogSWYgd2FzIG5vdCBhY3RpdmUsIGFjdGl2YXRlIGl0ICovCiAgICAgaWYgKChUaGlzLT5saWdodC5kd0ZsYWdzICYgRDNETElHSFRfQUNUSVZFKSA9PSAwKSB7CiAgICAgICAgIElEaXJlY3QzRERldmljZTdfTGlnaHRFbmFibGUoSUNPTV9JTlRFUkZBQ0UoZGV2aWNlLElEaXJlY3QzRERldmljZTcpLCBUaGlzLT5kd0xpZ2h0SW5kZXgsIFRSVUUpOwpAQCAtMTg3LDcgKzI3OSwxNCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZGVzYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbGlnaHRfZGVzYWN0aXZhdGUKKyAqCisgKiBVc2VzIHRoZSBEaXJlY3QzRERldmljZTc6OkxpZ2h0RW5hYmxlIG1ldGhvZCB0byBkZWFjdGl2YXRlIHRoZSBsaWdodAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbGlnaHRfZGVzYWN0aXZhdGUoSURpcmVjdDNETGlnaHRJbXBsKiBUaGlzKQogewogICAgIElEaXJlY3QzRERldmljZUltcGwqIGRldmljZTsKIApAQCAtMjA0LDY0ICszMDMsMTQgQEAKICAgICB9CiB9CiAKLVVMT05HIFdJTkFQSQotR0xfSURpcmVjdDNETGlnaHRJbXBsXzFfUmVsZWFzZShMUERJUkVDVDNETElHSFQgaWZhY2UpCitjb25zdCBJRGlyZWN0M0RMaWdodFZ0YmwgSURpcmVjdDNETGlnaHRfVnRibCA9CiB7Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgaWZhY2UpOwotICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwotICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBpZmFjZSwgcmVmICsgMSk7Ci0KLSAgICBpZiAoIXJlZikgewotICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZjsKLX0KLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh0eXBlb2YoVlRBQkxFX0lEaXJlY3QzRExpZ2h0LmZ1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHZvaWQqKQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBJRGlyZWN0M0RMaWdodFZ0YmwgVlRBQkxFX0lEaXJlY3QzRExpZ2h0ID0KLXsKLSAgICBYQ0FTVChRdWVyeUludGVyZmFjZSkgTWFpbl9JRGlyZWN0M0RMaWdodEltcGxfMV9RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpIE1haW5fSURpcmVjdDNETGlnaHRJbXBsXzFfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpIEdMX0lEaXJlY3QzRExpZ2h0SW1wbF8xX1JlbGVhc2UsCi0gICAgWENBU1QoSW5pdGlhbGl6ZSkgTWFpbl9JRGlyZWN0M0RMaWdodEltcGxfMV9Jbml0aWFsaXplLAotICAgIFhDQVNUKFNldExpZ2h0KSBNYWluX0lEaXJlY3QzRExpZ2h0SW1wbF8xX1NldExpZ2h0LAotICAgIFhDQVNUKEdldExpZ2h0KSBNYWluX0lEaXJlY3QzRExpZ2h0SW1wbF8xX0dldExpZ2h0LAorICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNETGlnaHRJbXBsX1F1ZXJ5SW50ZXJmYWNlLAorICAgIElEaXJlY3QzRExpZ2h0SW1wbF9BZGRSZWYsCisgICAgSURpcmVjdDNETGlnaHRJbXBsX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0M0RMaWdodCBNZXRob2RzICoqKi8KKyAgICBJRGlyZWN0M0RMaWdodEltcGxfSW5pdGlhbGl6ZSwKKyAgICBJRGlyZWN0M0RMaWdodEltcGxfU2V0TGlnaHQsCisgICAgSURpcmVjdDNETGlnaHRJbXBsX0dldExpZ2h0CiB9OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotCi0KLQotSFJFU1VMVCBkM2RsaWdodF9jcmVhdGUoSURpcmVjdDNETGlnaHRJbXBsICoqb2JqLCBJRGlyZWN0RHJhd0ltcGwgKmQzZCkKLXsKLSAgICBJRGlyZWN0M0RMaWdodEltcGwgKm9iamVjdDsKLSAgICAKLSAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElEaXJlY3QzRExpZ2h0SW1wbCkpOwotICAgIGlmIChvYmplY3QgPT0gTlVMTCkgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwotICAgIAotICAgIG9iamVjdC0+cmVmID0gMTsKLSAgICBvYmplY3QtPmQzZCA9IGQzZDsKLSAgICBvYmplY3QtPm5leHQgPSBOVUxMOwotICAgIG9iamVjdC0+YWN0aXZhdGUgPSBhY3RpdmF0ZTsKLSAgICBvYmplY3QtPmRlc2FjdGl2YXRlID0gZGVzYWN0aXZhdGU7Ci0gICAgb2JqZWN0LT51cGRhdGUgPSB1cGRhdGU7Ci0gICAgb2JqZWN0LT5hY3RpdmVfdmlld3BvcnQgPSBOVUxMOwotICAgIAotICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RMaWdodCwgVlRBQkxFX0lEaXJlY3QzRExpZ2h0KTsKLQotICAgICpvYmogPSBvYmplY3Q7Ci0KLSAgICBUUkFDRSgiIGNyZWF0aW5nIGltcGxlbWVudGF0aW9uIGF0ICVwLlxuIiwgKm9iaik7Ci0gICAgCi0gICAgcmV0dXJuIEQzRF9PSzsKLX0KZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvbWFpbi5jIGIvZGxscy9kZHJhdy9tYWluLmMKaW5kZXggOTZiNzU2OC4uODRmODgyMyAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9tYWluLmMKKysrIGIvZGxscy9kZHJhdy9tYWluLmMKQEAgLTEsOCArMSw5IEBACi0vKgkJRGlyZWN0RHJhdyBCYXNlIEZ1bmN0aW9ucworLyogICAgICAgIERpcmVjdERyYXcgQmFzZSBGdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5Ny0xOTk5IE1hcmN1cyBNZWlzc25lcgotICogQ29weXJpZ2h0IDE5OTggTGlvbmVsIFVsbWVyIChtb3N0IG9mIERpcmVjdDNEIHN0dWZmKQorICogQ29weXJpZ2h0IDE5OTggTGlvbmVsIFVsbWVyCiAgKiBDb3B5cmlnaHQgMjAwMC0yMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNiBTdGVmYW4gRPZzaW5nZXIKICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIChpbnRlcm5hbCkgZHJpdmVyIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMsCiAgKiBkcml2ZXIgZW51bWVyYXRpb24gQVBJcyBhbmQgRGlyZWN0RHJhdyBjcmVhdGlvbiBmdW5jdGlvbnMuCkBAIC0yMiwxMCArMjMsOSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogICovCiAKLSNkZWZpbmUgR0xQUklWQVRFX05PX1JFREVGSU5FCi0KICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKKyNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KQEAgLTQxLDUxOCArNDEsNjAzIEBACiAjaW5jbHVkZSAid2luZ2RpLmgiCiAjaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKICNpbmNsdWRlICJleGNwdC5oIgorI2luY2x1ZGUgIndpbnJlZy5oIgogCiAjaW5jbHVkZSAiZGRyYXcuaCIKICNpbmNsdWRlICJkM2QuaCIKIAotLyogVGhpcyBmb3IgYWxsIHRoZSBlbnVtZXJhdGlvbiBhbmQgY3JlYXRpb24gb2YgRDNELXJlbGF0ZWQgb2JqZWN0cyAqLwogI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0jaW5jbHVkZSAid2luZS9saWJyYXJ5LmgiCi0KLSNpbmNsdWRlICJnbF9wcml2YXRlLmgiCi0KLSN1bmRlZiBHTFBSSVZBVEVfTk9fUkVERUZJTkUKLQotI2RlZmluZSBNQVhfRERSQVdfRFJJVkVSUyAzCi1zdGF0aWMgY29uc3QgZGRyYXdfZHJpdmVyKiBERFJBV19kcml2ZXJzW01BWF9ERFJBV19EUklWRVJTXTsKLXN0YXRpYyBpbnQgRERSQVdfbnVtX2RyaXZlcnM7IC8qID0gMCAqLwotc3RhdGljIGludCBERFJBV19kZWZhdWx0X2RyaXZlcjsKLQotdm9pZCAoKndpbmVfdHN4MTFfbG9ja19wdHIpKHZvaWQpID0gTlVMTDsKLXZvaWQgKCp3aW5lX3RzeDExX3VubG9ja19wdHIpKHZvaWQpID0gTlVMTDsKIAogV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBkcml2ZXIncyBndWlkICovCitHVUlEIGd1aWQgPSB7MHg0MGMxYjI0OCwweDlkN2QsMHg0YTI5LHsweGQ3LDB4YjcsMHg0YywweGQ4LDB4MTAsMHg5ZiwweDNkLDB4NWR9fTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIExQVk9JRCBscENhbGxiYWNrOwotICAgIExQVk9JRCBscENvbnRleHQ7Ci19IERpcmVjdERyYXdFbnVtZXJhdGVQcm9jRGF0YTsKKy8qIFRoZSBjb25maWd1cmVkIGRlZmF1bHQgc3VyZmFjZSAqLworV0lORUQzRFNVUkZUWVBFIERlZmF1bHRTdXJmYWNlVHlwZSA9IFNVUkZBQ0VfVU5LTk9XTjsKIAotQk9PTCBvcGVuZ2xfaW5pdGlhbGl6ZWQgPSAwOwotCi0jaWZkZWYgSEFWRV9PUEVOR0wKLQotI2luY2x1ZGUgIm9wZW5nbF9wcml2YXRlLmgiCi0KLXN0YXRpYyB2b2lkICpnbF9oYW5kbGUgPSBOVUxMOwotCi0jZGVmaW5lIEdMX0FQSV9GVU5DVElPTihmKSB0eXBlb2YoZikgKiBwIyNmOwotI2luY2x1ZGUgImdsX2FwaS5oIgotI3VuZGVmIEdMX0FQSV9GVU5DVElPTgotCi0jaWZuZGVmIFNPTkFNRV9MSUJHTAotI2RlZmluZSBTT05BTUVfTElCR0wgImxpYkdMLnNvIgotI2VuZGlmCi0KLXN0YXRpYyBCT09MIEREUkFXX2JpbmRfdG9fb3BlbmdsKCB2b2lkICkKLXsKLSAgICBjb25zdCBjaGFyICpnbG5hbWUgPSBTT05BTUVfTElCR0w7Ci0KLSAgICBnbF9oYW5kbGUgPSB3aW5lX2Rsb3BlbihnbG5hbWUsIFJUTERfTk9XLCBOVUxMLCAwKTsKLSAgICBpZiAoIWdsX2hhbmRsZSkgewotICAgICAgICBXQVJOKCJXaW5lIGNhbm5vdCBmaW5kIHRoZSBPcGVuR0wgZ3JhcGhpY3MgbGlicmFyeSAoJXMpLlxuIixnbG5hbWUpOwotCXJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSNkZWZpbmUgR0xfQVBJX0ZVTkNUSU9OKGYpICBcCi0gICAgaWYoKHAjI2YgPSB3aW5lX2Rsc3ltKGdsX2hhbmRsZSwgI2YsIE5VTEwsIDApKSA9PSBOVUxMKSBcCi0gICAgeyBcCi0gICAgICAgIFdBUk4oIkNhbid0IGZpbmQgc3ltYm9sICVzXG4iLCAjZik7IFwKLSAgICAgICAgZ290byBzeW1fbm90X2ZvdW5kOyBcCi0gICAgfQotI2luY2x1ZGUgImdsX2FwaS5oIgotI3VuZGVmIEdMX0FQSV9GVU5DVElPTgotCi0gICAgLyogQW5kIG5vdyBjYWxscyB0aGUgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgdmFyaW91cyBmaWVsZHMgZm9yIHRoZSByZW5kZXJpbmcgZGV2aWNlcyAqLwotICAgIHJldHVybiBkM2RkZXZpY2VfaW5pdF9hdF9zdGFydHVwKGdsX2hhbmRsZSk7Ci0gICAgCi1zeW1fbm90X2ZvdW5kOgotICAgIFdBUk4oIldpbmUgY2Fubm90IGZpbmQgY2VydGFpbiBmdW5jdGlvbnMgdGhhdCBpdCBuZWVkcyBpbnNpZGUgdGhlIE9wZW5HTFxuIgotCSAiZ3JhcGhpY3MgbGlicmFyeS4gIFRvIGVuYWJsZSBXaW5lIHRvIHVzZSBPcGVuR0wgcGxlYXNlIHVwZ3JhZGVcbiIKLQkgInlvdXIgT3BlbkdMIGxpYnJhcmllc1xuIik7Ci0gICAgd2luZV9kbGNsb3NlKGdsX2hhbmRsZSwgTlVMTCwgMCk7Ci0gICAgZ2xfaGFuZGxlID0gTlVMTDsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLSNlbmRpZiAvKiBIQVZFX09QRU5HTCAqLwotCi1CT09MIHMzdGNfaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgdm9pZCAqczN0Y19oYW5kbGUgPSBOVUxMOwotCi1GVU5DX0ZFVENIXzJEX1RFWEVMX1JHQkFfRFhUMSBmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDE7Ci1GVU5DX0ZFVENIXzJEX1RFWEVMX1JHQkFfRFhUMyBmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDM7Ci1GVU5DX0ZFVENIXzJEX1RFWEVMX1JHQkFfRFhUNSBmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDU7Ci0KLSNpZm5kZWYgU09OQU1FX0xJQlRYQ19EWFROCi0jZGVmaW5lIFNPTkFNRV9MSUJUWENfRFhUTiAibGlidHhjX2R4dG4uc28iCi0jZW5kaWYKLQotc3RhdGljIEJPT0wgRERSQVdfYmluZF90b19zM3RjKCB2b2lkICkKLXsKLSAgICBjb25zdCBjaGFyICogY29uc3QgczN0Y25hbWUgPSBTT05BTUVfTElCVFhDX0RYVE47Ci0KLSAgICBzM3RjX2hhbmRsZSA9IHdpbmVfZGxvcGVuKHMzdGNuYW1lLCBSVExEX05PVywgTlVMTCwgMCk7Ci0gICAgaWYgKCFzM3RjX2hhbmRsZSkgewotICAgICAgICBUUkFDRSgiTm8gUzNUQyBzb2Z0d2FyZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgc2VlbXMgdG8gYmUgcHJlc2VudCAoJXMpLlxuIixzM3RjbmFtZSk7Ci0JcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBUUkFDRSgiRm91bmQgUzNUQyBzb2Z0d2FyZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgKCVzKS5cbiIsczN0Y25hbWUpOwotCi0jZGVmaW5lIEFQSV9GVU5DVElPTihmKSAgXAotICAgIGlmKChmID0gd2luZV9kbHN5bShzM3RjX2hhbmRsZSwgI2YsIE5VTEwsIDApKSA9PSBOVUxMKSBcCi0gICAgeyBcCi0gICAgICAgIFdBUk4oIkNhbid0IGZpbmQgc3ltYm9sICVzXG4iLCAjZik7IFwKLSAgICAgICAgZ290byBzeW1fbm90X2ZvdW5kOyBcCi0gICAgfQotICAgIEFQSV9GVU5DVElPTihmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDEpOwotICAgIEFQSV9GVU5DVElPTihmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDMpOwotICAgIEFQSV9GVU5DVElPTihmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDUpOwotI3VuZGVmIEFQSV9GVU5DVElPTgotCi0gICAgcmV0dXJuIFRSVUU7Ci0gICAgCi1zeW1fbm90X2ZvdW5kOgotICAgIFdBUk4oIldpbmUgY2Fubm90IGZpbmQgZnVuY3Rpb25zIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgUzNUQyBzb2Z0d2FyZSBkZWNvbXByZXNzaW9uXG4iKTsKLSAgICB3aW5lX2RsY2xvc2UoczN0Y19oYW5kbGUsIE5VTEwsIDApOwotICAgIHMzdGNfaGFuZGxlID0gTlVMTDsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEaXJlY3REcmF3RW51bWVyYXRlRXhBIChERFJBVy5AKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRW51bWVyYXRlcyBhbGwgRGlyZWN0RHJhdyBkZXZpY2VzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBEaXJlY3REcmF3Q3JlYXRlIGFuZCBmcmllbmRzCisgKiBDcmVhdGVzIGEgbmV3IEREcmF3IGludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBSRUZJSUQKICAqCi0gKiBQQVJBTVMKLSAqICBscENhbGxiYWNrIFtJXSBEREVudW1DYWxsYmFja0V4IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRpb24gb2YgCi0gKgkJICAgZWFjaCBlbnVtZXJhdGVkIEhBTC4KLSAqICBscENvbnRleHQgIFtJXSBhcHBsaWNhdGlvbi1kZWZpbmVkIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suCi0gKiAgZHdGbGFncyAgICBbSV0gU3BlY2lmaWVzIHRoZSBlbnVtZXJhdGlvbiBzY29wZS4gc2VlIG1zZG4uCisgKiBJbnRlcmZhY2VzIHRoYXQgY2FuIGJlIGNyZWF0ZWQ6CisgKiAgSURpcmVjdERyYXcsIElEaXJlY3REcmF3MiwgSURpcmVjdERyYXc0LCBJRGlyZWN0RHJhdzcKKyAqICBJRGlyZWN0M0QsIElEaXJlY3QzRDIsIElEaXJlY3QzRDMsIElEaXJlY3QzRDcuIChEb2VzIFdpbmRvd3MgcmV0dXJuCisgKiAgSURpcmVjdDNEIGludGVyZmFjZXM/KQogICoKLSAqIFJFVFVSTlMKLSAqICBTdWNjZXNzOiBERF9PSy4KLSAqICBGYWlsdXJlOiBEREVSUl9JTlZBTElEUEFSQU1TCi0gKi8KLUhSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdFbnVtZXJhdGVFeEEoCi0gICAgTFBEREVOVU1DQUxMQkFDS0VYQSBscENhbGxiYWNrLCBMUFZPSUQgbHBDb250ZXh0LCBEV09SRCBkd0ZsYWdzKQorICogQXJndW1lbnRzOgorICogIGd1aWQ6IElEIG9mIHRoZSByZXF1ZXN0ZWQgZHJpdmVyLCBOVUxMIGZvciB0aGUgZGVmYXVsdCBkcml2ZXIuCisgKiAgICAgICAgVGhlIEdVSUQgY2FuIGJlIHF1ZXJpZWQgd2l0aCBEaXJlY3REcmF3RW51bWVyYXRlKEV4KUEvVworICogIEREOiBVc2VkIHRvIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBvYmplY3QKKyAqICBVbmtPdXRlcjogRm9yIGFnZ3JlZ2F0aW9uLCB3aGljaCBpcyB1bnN1cHBvcnRlZC4gTXVzdCBiZSBOVUxMCisgKiAgaWlkOiByZXF1ZXN0ZWQgdmVyc2lvbiBJRC4KKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIGlmIHRoZSBJbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjZXNzZnVsbHkKKyAqICBDTEFTU19FX05PQUdHUkVHQVRJT04gaWYgVW5rT3V0ZXIgaXMgbm90IE5VTEwKKyAqICBFX09VVE9GTUVNT1JZIGlmIHNvbWUgYWxsb2NhdGlvbiBmYWlsZWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVAorRERSQVdfQ3JlYXRlKEdVSUQgKmd1aWQsCisgICAgICAgICAgICAgdm9pZCAqKkRELAorICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlciwKKyAgICAgICAgICAgICBSRUZJSUQgaWlkKQogewotICAgIGludCBpOwotICAgIEJPT0wgc3RvcCA9IEZBTFNFOwotICAgIFRSQUNFKCIoJXAsJXAsICUwOGx4KVxuIiwgbHBDYWxsYmFjaywgbHBDb250ZXh0LCBkd0ZsYWdzKTsKKyAgICBJRGlyZWN0RHJhd0ltcGwgKlRoaXMgPSBOVUxMOworICAgIEhSRVNVTFQgaHI7CisgICAgSVdpbmVEM0QgKndpbmVEM0QgPSBOVUxMOworICAgIElXaW5lRDNERGV2aWNlICp3aW5lRDNERGV2aWNlID0gTlVMTDsKKyAgICBIREMgaERDOworICAgIFdJTkVEM0RERVZUWVBFIGRldmljZXR5cGU7CiAKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JVFJBQ0UoIiAgRmxhZ3MgOiAiKTsKLQlpZiAoZHdGbGFncyAmIERERU5VTV9BVFRBQ0hFRFNFQ09OREFSWURFVklDRVMpCi0JICAgIFRSQUNFKCJEREVOVU1fQVRUQUNIRURTRUNPTkRBUllERVZJQ0VTICIpOwotCWlmIChkd0ZsYWdzICYgRERFTlVNX0RFVEFDSEVEU0VDT05EQVJZREVWSUNFUykKLQkgICAgVFJBQ0UoIkRERU5VTV9ERVRBQ0hFRFNFQ09OREFSWURFVklDRVMgIik7Ci0JaWYgKGR3RmxhZ3MgJiBEREVOVU1fTk9ORElTUExBWURFVklDRVMpCi0JICAgIFRSQUNFKCJEREVOVU1fTk9ORElTUExBWURFVklDRVMgIik7Ci0JVFJBQ0UoIlxuIik7Ci0gICAgfQorICAgIFRSQUNFKCIoJXMsJXAsJXApXG4iLCBkZWJ1Z3N0cl9ndWlkKGd1aWQpLCBERCwgVW5rT3V0ZXIpOwogCi0gICAgZm9yIChpPTA7IGk8RERSQVdfbnVtX2RyaXZlcnM7IGkrKykKKyAgICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgZ3VpZHMuIFdlbGwsIHRoZXJlJ3Mgbm8gc3BlY2lhbCBndWlkIGFueXdheQorICAgICAqIE9LLCB3ZSBjb3VsZAorICAgICAqLworICAgIGlmIChndWlkID09IChHVUlEICopIEREQ1JFQVRFX0VNVUxBVElPTk9OTFkpCiAgICAgewotICAgICAgICBUUkFDRSgiRW51bWVyYXRpbmcgJXMvJXMgaW50ZXJmYWNlXG4iLAotCSAgICAgIEREUkFXX2RyaXZlcnNbaV0tPmluZm8tPnN6RHJpdmVyLAotCSAgICAgIEREUkFXX2RyaXZlcnNbaV0tPmluZm8tPnN6RGVzY3JpcHRpb24pOwotCi0JLyogV2UgaGF2ZSB0byBwYXNzIE5VTEwgZnJvbSB0aGUgcHJpbWFyeSBkaXNwbGF5IGRldmljZS4KLQkgKiBSb2FkUmFnZSBjaGFwdGVyIDYncyBlbnVtZXJhdGlvbiByb3V0aW5lIGV4cGVjdHMgaXQuICovCi0gICAgICAgIF9fVFJZCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghbHBDYWxsYmFjaygoRERSQVdfZGVmYXVsdF9kcml2ZXIgPT0gaSkgPyBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOihMUEdVSUQpJkREUkFXX2RyaXZlcnNbaV0tPmluZm8tPmd1aWREZXZpY2VJZGVudGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUilERFJBV19kcml2ZXJzW2ldLT5pbmZvLT5zekRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUilERFJBV19kcml2ZXJzW2ldLT5pbmZvLT5zekRyaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENvbnRleHQsIDApKQotICAgICAgICAgICAgICAgIHN0b3AgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIF9fRVhDRVBUX1BBR0VfRkFVTFQKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsKLSAgICAgICAgfQotICAgICAgICBfX0VORFRSWQotICAgICAgICBpZiAoc3RvcCkgcmV0dXJuIEREX09LOworICAgICAgICAvKiBVc2UgdGhlIHJlZmVyZW5jZSBkZXZpY2UgaWQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBjaGFuZ2UgYW55dGhpbmcsCisgICAgICAgICAqIFdpbmVEM0QgYWx3YXlzIHVzZXMgT3BlbkdMIGZvciBEM0QgcmVuZGVyaW5nLiBPbmUgY291bGQgbWFrZSBpdCByZXF1ZXN0CisgICAgICAgICAqIGluZGlyZWN0IHJlbmRlcmluZworICAgICAgICAgKi8KKyAgICAgICAgZGV2aWNldHlwZSA9IFdJTkVEM0RERVZUWVBFX1JFRjsKKyAgICB9CisgICAgZWxzZSBpZihndWlkID09IChHVUlEICopIEREQ1JFQVRFX0hBUkRXQVJFT05MWSkKKyAgICB7CisgICAgICAgIGRldmljZXR5cGUgPSBXSU5FRDNEREVWVFlQRV9IQUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRldmljZXR5cGUgPSAwOwogICAgIH0KIAotICAgIC8qIFVuc3VwcG9ydGVkIGZsYWdzICovCi0gICAgaWYgKGR3RmxhZ3MgJiBEREVOVU1fTk9ORElTUExBWURFVklDRVMpIHsKLQlGSVhNRSgibm8gbm9uLWRpc3BsYXkgZGV2aWNlcyBzdXBwb3J0ZWQuXG4iKTsKLSAgICB9Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREVOVU1fREVUQUNIRURTRUNPTkRBUllERVZJQ0VTKSB7Ci0JRklYTUUoIm5vIGRldGFjaGVkIHNlY29uZGFyeSBkZXZpY2VzIHN1cHBvcnRlZC5cbiIpOworICAgIC8qIEREcmF3IGRvZXNuJ3Qgc3VwcG9ydCBhZ2dyZWF0aW9uLCBhY2NvcmRpbmcgdG8gbXNkbiAqLworICAgIGlmIChVbmtPdXRlciAhPSBOVUxMKQorICAgICAgICByZXR1cm4gQ0xBU1NfRV9OT0FHR1JFR0FUSU9OOworCisgICAgLyogRGlyZWN0RHJhdyBjcmVhdGlvbiBjb21lcyBoZXJlICovCisgICAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoSURpcmVjdERyYXdJbXBsKSk7CisgICAgaWYoIVRoaXMpCisgICAgeworICAgICAgICBFUlIoIk91dCBvZiBtZW1vcnkgd2hlbiBjcmVhdGluZyBEaXJlY3REcmF3XG4iKTsKKyAgICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CiAgICAgfQogCisgICAgLyogVGhlIGludGVyZmFjZXM6CisgICAgICogSURpcmVjdERyYXcgYW5kIElEaXJlY3QzRCBhcmUgdGhlIHNhbWUgb2JqZWN0LAorICAgICAqIFF1ZXJ5SW50ZXJmYWNlIGlzIHVzZWQgdG8gZ2V0IG90aGVyIGludGVyZmFjZXMuCisgICAgICovCisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdywgIElEaXJlY3REcmF3MV9WdGJsKTsKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3MiwgSURpcmVjdERyYXcyX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc0LCBJRGlyZWN0RHJhdzRfVnRibCk7CisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcsIElEaXJlY3REcmF3N19WdGJsKTsKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRCwgIElEaXJlY3QzRDFfVnRibCk7CisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QyLCBJRGlyZWN0M0QyX1Z0YmwpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMywgSURpcmVjdDNEM19WdGJsKTsKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDcsIElEaXJlY3QzRDdfVnRibCk7CisgICAgVGhpcy0+cmVmID0gMTsKKworICAgIC8qIFNlZSBjb21tZW50cyBpbiBJRGlyZWN0RHJhd0ltcGxfQ3JlYXRlTmV3U3VyZmFjZSBmb3IgYSBkZXNjcmlwdGlvbgorICAgICAqIG9mIHRoaXMgbWVtYmVyLgorICAgICAqIFJlYWQgZnJvbSBhIHJlZ2lzdHJ5IGtleSwgc2hvdWxkIGFkZCBhIHdpbmVjZmcgb3B0aW9uIGxhdGVyCisgICAgICovCisgICAgVGhpcy0+SW1wbFR5cGUgPSBEZWZhdWx0U3VyZmFjZVR5cGU7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIHNldHRpbmdzICovCisgICAgaERDID0gQ3JlYXRlRENBKCJESVNQTEFZIiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgVGhpcy0+b3JpZ19icHAgPSBHZXREZXZpY2VDYXBzKGhEQywgQklUU1BJWEVMKSAqIEdldERldmljZUNhcHMoaERDLCBQTEFORVMpOworICAgIERlbGV0ZURDKGhEQyk7CisgICAgVGhpcy0+b3JpZ193aWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOworICAgIFRoaXMtPm9yaWdfaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CisKKyAgICAvKiBJbml0aWFsaXplIFdpbmVEM0QKKyAgICAgKgorICAgICAqIEFsbCBSZW5kZXJpbmcgKDJEIGFuZCAzRCkgaXMgcmVsYXllZCB0byBXaW5lRDNELAorICAgICAqIGJ1dCBEaXJlY3REcmF3IHNwZWNpZmljIG1hbmFnZW1lbnQsIGxpa2UgRERTVVJGQUNFREVTQyBhbmQgRERQSVhFTEZPUk1BVAorICAgICAqIHN0cnVjdHVyZSBoYW5kbGluZyBpcyBoYW5kbGVkIGluIHRoaXMgbGliLgorICAgICAqLworICAgIHdpbmVEM0QgPSBXaW5lRGlyZWN0M0RDcmVhdGUoMCAvKiBTREtWZXJzaW9uICovLCA3IC8qIERYVmVyc2lvbiAqLywgKElVbmtub3duICopIFRoaXMgLyogUGFyZW50ICovKTsKKyAgICBpZighd2luZUQzRCkKKyAgICB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIGluaXRpYWxpc2UgV2luZUQzRFxuIik7CisgICAgICAgIGhyID0gRV9PVVRPRk1FTU9SWTsKKyAgICAgICAgZ290byBlcnJfb3V0OworICAgIH0KKyAgICBUaGlzLT53aW5lRDNEID0gd2luZUQzRDsKKyAgICBUUkFDRSgiV2luZUQzRCBjcmVhdGVkIGF0ICVwXG4iLCB3aW5lRDNEKTsKKworICAgIC8qIEluaXRpYWxpemVkIG1lbWJlci4uLgorICAgICAqCisgICAgICogSXQgaXMgc2V0IHRvIGZhbHNlIGF0IGNyZWF0aW9uIHRpbWUsIGFuZCBzZXQgdG8gdHJ1ZSBpbgorICAgICAqIElEaXJlY3REcmF3Nzo6SW5pdGlhbGl6ZS4gSXQncyBzb2xlIHB1cnBvc2UgaXMgdG8gcmV0dXJuIEREX09LIG9uCisgICAgICogaW5pdGlhbGl6ZSBvbmx5IG9uY2UKKyAgICAgKi8KKyAgICBUaGlzLT5pbml0aWFsaXplZCA9IEZBTFNFOworCisgICAgLyogSW5pdGlhbGl6ZSBXaW5lRDNERGV2aWNlCisgICAgICoKKyAgICAgKiBJdCBpcyB1c2VkIGZvciBzY3JlZW4gc2V0dXAsIHN1cmZhY2UgYW5kIHBhbGV0dGUgY3JlYXRpb24KKyAgICAgKiBXaGVuIGEgRGlyZWN0M0REZXZpY2U3IGlzIGNyZWF0ZWQsIHRoZSBEM0QgY2FwYXRpYmxpdGllcyBvZiBXaW5lRDNEIGFyZQorICAgICAqIGluaXRpYWxpemVkCisgICAgICovCisgICAgaHIgPSBJV2luZUQzRF9DcmVhdGVEZXZpY2Uod2luZUQzRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qRDNEX0FEQVBURVJfREVGQVVMVCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyogRm9jdXNXaW5kb3csIGRvbid0IGtub3cgeWV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogQmVoYXZpb3JGbGFncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVW5rbm93biAqKSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpKTsKKyAgICBpZihGQUlMRUQoaHIpKQorICAgIHsKKyAgICAgICAgRVJSKCJGYWlsZWQgdG8gY3JlYXRlIGEgd2luZUQzRERldmljZSwgcmVzdWx0ID0gJWx4XG4iLCBocik7CisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICB9CisgICAgVGhpcy0+d2luZUQzRERldmljZSA9IHdpbmVEM0REZXZpY2U7CisgICAgVFJBQ0UoIndpbmVEM0REZXZpY2UgY3JlYXRlZCBhdCAlcFxuIiwgVGhpcy0+d2luZUQzRERldmljZSk7CisKKyAgICAvKiBSZWdpc3RlciB0aGUgd2luZG93IGNsYXNzCisgICAgICoKKyAgICAgKiBJdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGhpZGRlbiB3aW5kb3cgZm9yIEQzRAorICAgICAqIHJlbmRlcmluZywgaWYgdGhlIGFwcGxpY2F0aW9uIGRpZG4ndCBwYXNzIG9uZS4KKyAgICAgKiBJdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBDcmVhdGluZyBhIGRldmljZSB3aW5kb3cKKyAgICAgKiBmcm9tIFNldENvb3BlcmF0aXZlTGV2ZWwKKyAgICAgKgorICAgICAqIFRoZSBuYW1lOiBERFJBV188YWRkcmVzcz4uIFRoZSBjbGFzc25hbWUgaXMKKyAgICAgKiAzMiBiaXQgbG9uZywgc28gYSA2NCBiaXQgYWRkcmVzcyB3aWxsIGZpdCBuaWNlbHkKKyAgICAgKiAoV2lsbCB0aGlzIGJlIGNvbXBpbGVkIGZvciA2NCBiaXQgYW55d2F5PykKKyAgICAgKgorICAgICAqLworICAgIHNwcmludGYoVGhpcy0+Y2xhc3NuYW1lLCAiRERSQVdfJXAiLCBUaGlzKTsKKworICAgIG1lbXNldCgmVGhpcy0+d25kX2NsYXNzLCAwLCBzaXplb2YoVGhpcy0+d25kX2NsYXNzKSk7CisgICAgVGhpcy0+d25kX2NsYXNzLnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7CisgICAgVGhpcy0+d25kX2NsYXNzLmxwZm5XbmRQcm9jID0gRGVmV2luZG93UHJvY0E7CisgICAgVGhpcy0+d25kX2NsYXNzLmNiQ2xzRXh0cmEgPSAwOworICAgIFRoaXMtPnduZF9jbGFzcy5jYlduZEV4dHJhID0gMDsKKyAgICBUaGlzLT53bmRfY2xhc3MuaEluc3RhbmNlID0gR2V0TW9kdWxlSGFuZGxlQSgwKTsKKyAgICBUaGlzLT53bmRfY2xhc3MuaEljb24gPSAwOworICAgIFRoaXMtPnduZF9jbGFzcy5oQ3Vyc29yID0gMDsKKyAgICBUaGlzLT53bmRfY2xhc3MuaGJyQmFja2dyb3VuZCA9IChIQlJVU0gpIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKTsKKyAgICBUaGlzLT53bmRfY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKKyAgICBUaGlzLT53bmRfY2xhc3MubHBzekNsYXNzTmFtZSA9IFRoaXMtPmNsYXNzbmFtZTsKKyAgICBpZighUmVnaXN0ZXJDbGFzc0EoJlRoaXMtPnduZF9jbGFzcykpCisgICAgeworICAgICAgICBFUlIoIlJlZ2lzdGVyQ2xhc3NBIGZhaWxlZCFcbiIpOworICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBhbW91bnQgb2YgdmlkZW8gbWVtb3J5ICovCisgICAgVGhpcy0+dG90YWxfdmlkbWVtID0gSVdpbmVEM0REZXZpY2VfR2V0QXZhaWxhYmxlVGV4dHVyZU1lbShUaGlzLT53aW5lRDNERGV2aWNlKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGNhcHMgKi8KKyAgICBUaGlzLT5jYXBzLmR3U2l6ZSA9IHNpemVvZihUaGlzLT5jYXBzKTsKKyNkZWZpbmUgQkxJVF9DQVBTIChERENBUFNfQkxUIHwgRERDQVBTX0JMVENPTE9SRklMTCB8IEREQ0FQU19CTFRERVBUSEZJTEwgXAorICAgICAgICAgIHwgRERDQVBTX0JMVFNUUkVUQ0ggfCBERENBUFNfQ0FOQkxUU1lTTUVNIHwgRERDQVBTX0NBTkNMSVAJICBcCisgICAgICAgICAgfCBERENBUFNfQ0FOQ0xJUFNUUkVUQ0hFRCB8IEREQ0FQU19DT0xPUktFWQkJCSAgXAorICAgICAgICAgIHwgRERDQVBTX0NPTE9SS0VZSFdBU1NJU1QgfCBERENBUFNfT1ZFUkxBWSB8IEREQ0FQU19PVkVSTEFZU1RSRVRDSCB8RERDQVBTX0FMSUdOQk9VTkRBUllTUkMgKQorI2RlZmluZSBDS0VZX0NBUFMgKEREQ0tFWUNBUFNfREVTVEJMVCB8IEREQ0tFWUNBUFNfU1JDQkxUKQorI2RlZmluZSBGWF9DQVBTIChEREZYQ0FQU19CTFRBTFBIQSB8IERERlhDQVBTX0JMVE1JUlJPUkxFRlRSSUdIVAlcCisgICAgICAgICAgICAgICAgfCBEREZYQ0FQU19CTFRNSVJST1JVUERPV04gfCBEREZYQ0FQU19CTFRST1RBVElPTjkwCVwKKyAgICAgICAgICAgICAgICB8IERERlhDQVBTX0JMVFNIUklOS1ggfCBEREZYQ0FQU19CTFRTSFJJTktYTgkJXAorICAgICAgICAgICAgICAgIHwgRERGWENBUFNfQkxUU0hSSU5LWSB8IERERlhDQVBTX0JMVFNIUklOS1hOCQlcCisgICAgICAgICAgICAgICAgfCBEREZYQ0FQU19CTFRTVFJFVENIWCB8IERERlhDQVBTX0JMVFNUUkVUQ0hYTgkJXAorICAgICAgICAgICAgICAgIHwgRERGWENBUFNfQkxUU1RSRVRDSFkgfCBEREZYQ0FQU19CTFRTVFJFVENIWU4pCisgICAgVGhpcy0+Y2Fwcy5kd0NhcHMgfD0gRERDQVBTX0dESSB8IEREQ0FQU19QQUxFVFRFIHwgQkxJVF9DQVBTOworCisgICAgVGhpcy0+Y2Fwcy5kd0NhcHMyIHw9IEREQ0FQUzJfQ0VSVElGSUVEIHwgRERDQVBTMl9OT1BBR0VMT0NLUkVRVUlSRUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBERENBUFMyX1BSSU1BUllHQU1NQSB8IEREQ0FQUzJfV0lERVNVUkZBQ0VTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRERDQVBTMl9DQU5SRU5ERVJXSU5ET1dFRDsKKyAgICBUaGlzLT5jYXBzLmR3Q0tleUNhcHMgfD0gQ0tFWV9DQVBTOworICAgIFRoaXMtPmNhcHMuZHdGWENhcHMgfD0gRlhfQ0FQUzsKKyAgICBUaGlzLT5jYXBzLmR3UGFsQ2FwcyB8PSBERFBDQVBTXzhCSVQgfCBERFBDQVBTX1BSSU1BUllTVVJGQUNFOworICAgIFRoaXMtPmNhcHMuZHdWaWRNZW1Ub3RhbCA9IFRoaXMtPnRvdGFsX3ZpZG1lbTsKKyAgICBUaGlzLT5jYXBzLmR3VmlkTWVtRnJlZSA9IFRoaXMtPnRvdGFsX3ZpZG1lbTsKKyAgICBUaGlzLT5jYXBzLmR3U1ZCQ2FwcyB8PSBCTElUX0NBUFM7CisgICAgVGhpcy0+Y2Fwcy5kd1NWQkNLZXlDYXBzIHw9IENLRVlfQ0FQUzsKKyAgICBUaGlzLT5jYXBzLmR3U1ZCRlhDYXBzIHw9IEZYX0NBUFM7CisgICAgVGhpcy0+Y2Fwcy5kd1ZTQkNhcHMgfD0gQkxJVF9DQVBTOworICAgIFRoaXMtPmNhcHMuZHdWU0JDS2V5Q2FwcyB8PSBDS0VZX0NBUFM7CisgICAgVGhpcy0+Y2Fwcy5kd1ZTQkZYQ2FwcyB8PSBGWF9DQVBTOworICAgIFRoaXMtPmNhcHMuZHdTU0JDYXBzIHw9IEJMSVRfQ0FQUzsKKyAgICBUaGlzLT5jYXBzLmR3U1NCQ0tleUNhcHMgfD0gQ0tFWV9DQVBTOworICAgIFRoaXMtPmNhcHMuZHdTU0JGWENhcHMgfD0gRlhfQ0FQUzsKKyAgICBUaGlzLT5jYXBzLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfQUxQSEEgfCBERFNDQVBTX0JBQ0tCVUZGRVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0FQU19GTElQIHwgRERTQ0FQU19GUk9OVEJVRkZFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTX09GRlNDUkVFTlBMQUlOIHwgRERTQ0FQU19QQUxFVFRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfCBERFNDQVBTX1NZU1RFTU1FTU9SWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTX1ZJREVPTUVNT1JZIHwgRERTQ0FQU19WSVNJQkxFOworICAgIC8qIEhhY2tzIGZvciBEM0QgY29kZSAqLworICAgIC8qIFRPRE86IENoZWNrIGlmIFdpbmVEM0QgaGFzIDNEIGVuYWJsZWQKKyAgICAgICBOZWVkIG9wZW5nbCBzdXJmYWNlcyBvciBhdXRvIGZvciAzRAorICAgICAqLworICAgIGlmKFRoaXMtPkltcGxUeXBlID09IDAgfHwgVGhpcy0+SW1wbFR5cGUgPT0gU1VSRkFDRV9PUEVOR0wpCisgICAgeworICAgICAgICBUaGlzLT5jYXBzLmR3Q2FwcyB8PSBERENBUFNfM0Q7CisgICAgICAgIFRoaXMtPmNhcHMuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU18zRERFVklDRSB8IEREU0NBUFNfTUlQTUFQIHwgRERTQ0FQU19URVhUVVJFIHwgRERTQ0FQU19aQlVGRkVSOworICAgIH0KKyAgICBUaGlzLT5jYXBzLmRkc09sZENhcHMuZHdDYXBzID0gVGhpcy0+Y2Fwcy5kZHNDYXBzLmR3Q2FwczsKKworI3VuZGVmIEJMSVRfQ0FQUworI3VuZGVmIENLRVlfQ0FQUworI3VuZGVmIEZYX0NBUFMKKworICAgIC8qIEFkZCB0aGUgb2JqZWN0IHRvIHRoZSBkZHJhdyBjbGVhbnVwIGxpc3QgKi8KKyAgICBUaGlzLT5uZXh0ID0gZGRyYXdfbGlzdDsKKyAgICBkZHJhd19saXN0ID0gVGhpczsKKworICAgIC8qIENhbGwgUXVlcnlJbnRlcmZhY2UgdG8gZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlICovCisgICAgaHIgPSBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoIElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NyksIGlpZCwgREQpOworICAgIElEaXJlY3REcmF3N19SZWxlYXNlKCBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpICk7CisgICAgaWYoU1VDQ0VFREVEKGhyKSkgcmV0dXJuIEREX09LOworCitlcnJfb3V0OgorICAgIC8qIExldCdzIGhvcGUgd2UgbmV2ZXIgbmVlZCB0aGlzIDspICovCisgICAgaWYod2luZUQzRERldmljZSkgSVdpbmVEM0REZXZpY2VfUmVsZWFzZSh3aW5lRDNERGV2aWNlKTsKKyAgICBpZih3aW5lRDNEKSBJV2luZUQzRF9SZWxlYXNlKHdpbmVEM0QpOworICAgIGlmKFRoaXMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworICAgIHJldHVybiBocjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEaXJlY3REcmF3Q3JlYXRlIChERFJBVy5AKQorICoKKyAqIENyZWF0ZXMgbGVnYWN5IERpcmVjdERyYXcgSW50ZXJmYWNlcy4gQ2FuJ3QgY3JlYXRlIElEaXJlY3REcmF3NworICogaW50ZXJmYWNlcyBpbiB0aGVvcnkKKyAqCisgKiBBcmd1bWVudHMsIHJldHVybiB2YWx1ZXM6IFNlZSBERFJBV19DcmVhdGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIUkVTVUxUIFdJTkFQSQorRGlyZWN0RHJhd0NyZWF0ZShHVUlEICpHVUlELAorICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhdyAqKkRELAorICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCit7CisgICAgVFJBQ0UoIiglcywlcCwlcClcbiIsIGRlYnVnc3RyX2d1aWQoR1VJRCksIERELCBVbmtPdXRlcik7CisKKyAgICByZXR1cm4gRERSQVdfQ3JlYXRlKEdVSUQsICh2b2lkICoqKSBERCwgVW5rT3V0ZXIsICZJSURfSURpcmVjdERyYXcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERpcmVjdERyYXdDcmVhdGVFeCAoRERSQVcuQCkKKyAqCisgKiBPbmx5IGNyZWF0ZXMgbmV3IElEaXJlY3REcmF3NyBpbnRlcmZhY2VzLCBzdXBwb3NlZCB0byBmYWlsIGlmIGxlZ2FjeQorICogaW50ZXJmYWNlcyBhcmUgcmVxdWVzdGVkLgorICoKKyAqIEFyZ3VtZW50cywgcmV0dXJuIHZhbHVlczogU2VlIEREUkFXX0NyZWF0ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hSRVNVTFQgV0lOQVBJCitEaXJlY3REcmF3Q3JlYXRlRXgoR1VJRCAqR1VJRCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICoqREQsCisgICAgICAgICAgICAgICAgICAgUkVGSUlEIGlpZCwKKyAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCit7CisgICAgVFJBQ0UoIiglcywlcCwlcywlcClcbiIsIGRlYnVnc3RyX2d1aWQoR1VJRCksIERELCBkZWJ1Z3N0cl9ndWlkKGlpZCksIFVua091dGVyKTsKKworICAgIGlmICghSXNFcXVhbEdVSUQoaWlkLCAmSUlEX0lEaXJlY3REcmF3NykpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgcmV0dXJuIEREUkFXX0NyZWF0ZShHVUlELCBERCwgVW5rT3V0ZXIsIGlpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGlyZWN0RHJhd0VudW1lcmF0ZUEgKEREUkFXLkApCisgKgorICogRW51bWVyYXRlcyBsZWdhY3kgZGRyYXcgZHJpdmVycywgYXNjaWkgdmVyc2lvbi4gV2Ugb25seSBoYXZlIG9uZQorICogZHJpdmVyLCB3aGljaCByZWxheXMgdG8gV2luZUQzRC4gSWYgd2Ugd2VyZSBzdWZmaWNpZW50bHkgY29vbCwKKyAqIHdlIGNvdWxkIG9mZmVyIHZhcmlvdXMgaW50ZXJmYWNlcywgd2hpY2ggdXNlIGEgZGlmZmVyZW50IGRlZmF1bHQgc3VyZmFjZQorICogaW1wbGVtZW50YXRpb24sIGJ1dCBJIHRoaW5rIGl0J3MgYmV0dGVyIHRvIG9mZmVyIHRoaXMgY2hvaWNlIGluCisgKiB3aW5lY2ZnLCBiZWNhdXNlIHNvbWUgYXBwcyB1c2UgdGhlIGRlZmF1bHQgZHJpdmVyLCBzbyB3ZSB3b3VsZCBuZWVkCisgKiBhIHdpbmVjZmcgb3B0aW9uIGFueXdheSwgYW5kIHRoZXJlIHNob3VsZG4ndCBiZSAyIHdheXMgdG8gc2V0IG9uZSBzZXR0aW5nCisgKgorICogQXJndW1lbnRzOgorICogIENhbGxiYWNrOiBDYWxsYmFjayBmdW5jdGlvbiBmcm9tIHRoZSBhcHAKKyAqICBDb250ZXh0OiBBcmd1bWVudCB0byB0aGUgY2FsbCBiYWNrLgorICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIEVfSU5WQUxJREFSRyBpZiB0aGUgQ2FsbGJhY2sgY2F1c2VkIGEgcGFnZSBmYXVsdAorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIUkVTVUxUIFdJTkFQSQorRGlyZWN0RHJhd0VudW1lcmF0ZUEoTFBEREVOVU1DQUxMQkFDS0EgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQoreworICAgIEJPT0wgc3RvcCA9IEZBTFNFOworCisgICAgVFJBQ0UoIiBFbnVtZXJhdGluZyBkZWZhdWx0IERpcmVjdERyYXcgSEFMIGludGVyZmFjZVxuIik7CisgICAgLyogV2Ugb25seSBoYXZlIG9uZSBkcml2ZXIgKi8KKyAgICBfX1RSWQorICAgIHsKKyAgICAgICAgc3RvcCA9ICFDYWxsYmFjayhOVUxMLCAiRGlyZWN0RHJhdyBIQUwiLCAiZGlzcGxheSIsIENvbnRleHQpOworICAgIH0KKyAgICBfX0VYQ0VQVF9QQUdFX0ZBVUxUCisgICAgeworICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOworICAgIH0KKyAgICBfX0VORFRSWQorCisgICAgVFJBQ0UoIiBFbmQgb2YgZW51bWVyYXRpb25cbiIpOwogICAgIHJldHVybiBERF9PSzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGlyZWN0RHJhd0VudW1lcmF0ZUV4QSAoRERSQVcuQCkKKyAqCisgKiBFbnVtZXJhdGVzIERpcmVjdERyYXc3IGRyaXZlcnMsIGFzY2lpIHZlcnNpb24uIFNlZQorICogdGhlIGNvbW1lbnRzIGFib3ZlIERpcmVjdERyYXdFbnVtZXJhdGVBIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEZsYWcgbWVtYmVyIGlzIG5vdCBzdXBwb3J0ZWQgcmlnaHQgbm93LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hSRVNVTFQgV0lOQVBJCitEaXJlY3REcmF3RW51bWVyYXRlRXhBKExQRERFTlVNQ0FMTEJBQ0tFWEEgQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIEJPT0wgc3RvcCA9IEZBTFNFOworICAgIFRSQUNFKCJFbnVtZXJhdGluZyBkZWZhdWx0IERpcmVjdERyYXcgSEFMIGludGVyZmFjZVxuIik7CisKKyAgICAvKiBXZSBvbmx5IGhhdmUgb25lIGRyaXZlciBieSBub3cgKi8KKyAgICBfX1RSWQorICAgIHsKKyAgICAgICAgLyogUXVpY2tUaW1lIGV4cGVjdHMgdGhlIGRlc2NyaXB0aW9uICJEaXJlY3REcmF3IEhBTCIgKi8KKyAgICAgICAgc3RvcCA9ICFDYWxsYmFjayhOVUxMLCAiRGlyZWN0RHJhdyBIQUwiLCAiZGlzcGxheSIsIENvbnRleHQsIDApOworICAgIH0KKyAgICBfX0VYQ0VQVF9QQUdFX0ZBVUxUCisgICAgeworICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOworICAgIH0KKyAgICBfX0VORFRSWTsKKworICAgIFRSQUNFKCJFbmQgb2YgZW51bWVyYXRpb25cbiIpOworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEaXJlY3REcmF3RW51bWVyYXRlVyAoRERSQVcuQCkKKyAqCisgKiBFbnVtZXJhdGVzIGxlZ2FjeSBkcml2ZXJzLCB1bmljb2RlIHZlcnNpb24uIFNlZQorICogdGhlIGNvbW1lbnRzIGFib3ZlIERpcmVjdERyYXdFbnVtZXJhdGVBIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEZsYWcgbWVtYmVyIGlzIG5vdCBzdXBwb3J0ZWQgcmlnaHQgbm93LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEaXJlY3REcmF3RW51bWVyYXRlRXhXIChERFJBVy5AKQotICovCi0KLXN0YXRpYyBCT09MIENBTExCQUNLIERpcmVjdERyYXdFbnVtZXJhdGVFeFByb2NXKAotICAgIEdVSUQgKmxwR1VJRCwgTFBTVFIgbHBEcml2ZXJEZXNjcmlwdGlvbiwgTFBTVFIgbHBEcml2ZXJOYW1lLAotICAgIExQVk9JRCBscENvbnRleHQsIEhNT05JVE9SIGhtKQotewotICAgIElOVCBsZW47Ci0gICAgQk9PTCBiUmVzdWx0OwotICAgIExQV1NUUiBscERyaXZlckRlc2NyaXB0aW9uVywgbHBEcml2ZXJOYW1lVzsKLSAgICBEaXJlY3REcmF3RW51bWVyYXRlUHJvY0RhdGEgKnBFUEQgPSAoRGlyZWN0RHJhd0VudW1lcmF0ZVByb2NEYXRhKilscENvbnRleHQ7Ci0KLSAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIGxwRHJpdmVyRGVzY3JpcHRpb24sIC0xLCBOVUxMLCAwICk7Ci0gICAgbHBEcml2ZXJEZXNjcmlwdGlvblcgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbiAqIHNpemVvZihXQ0hBUikgKTsKLSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIGxwRHJpdmVyRGVzY3JpcHRpb24sIC0xLCBscERyaXZlckRlc2NyaXB0aW9uVywgbGVuICk7Ci0KLSAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIGxwRHJpdmVyTmFtZSwgLTEsIE5VTEwsIDAgKTsKLSAgICBscERyaXZlck5hbWVXID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpICk7Ci0gICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCBscERyaXZlck5hbWUsIC0xLCBscERyaXZlck5hbWVXLCBsZW4gKTsKLQotICAgIGJSZXN1bHQgPSAoKihMUERERU5VTUNBTExCQUNLRVhXICopIHBFUEQtPmxwQ2FsbGJhY2spKGxwR1VJRCwgbHBEcml2ZXJEZXNjcmlwdGlvblcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEcml2ZXJOYW1lVywgcEVQRC0+bHBDb250ZXh0LCBobSk7Ci0KLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscERyaXZlckRlc2NyaXB0aW9uVyk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBEcml2ZXJOYW1lVyk7Ci0gICAgcmV0dXJuIGJSZXN1bHQ7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdFbnVtZXJhdGVFeFcoCi0gIExQRERFTlVNQ0FMTEJBQ0tFWFcgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCwgRFdPUkQgZHdGbGFncykKLXsKLSAgICBEaXJlY3REcmF3RW51bWVyYXRlUHJvY0RhdGEgZXBkOwotICAgIGVwZC5scENhbGxiYWNrID0gKExQVk9JRCkgbHBDYWxsYmFjazsKLSAgICBlcGQubHBDb250ZXh0ID0gbHBDb250ZXh0OwotCi0gICAgcmV0dXJuIERpcmVjdERyYXdFbnVtZXJhdGVFeEEoRGlyZWN0RHJhd0VudW1lcmF0ZUV4UHJvY1csIChMUFZPSUQpICZlcGQsIDApOwotfQorICoKKyAqIEVudW1lcmF0ZXMgRGlyZWN0RHJhdzcgZHJpdmVycywgdW5pY29kZSB2ZXJzaW9uLiBTZWUKKyAqIHRoZSBjb21tZW50cyBhYm92ZSBEaXJlY3REcmF3RW51bWVyYXRlQSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBGbGFnIG1lbWJlciBpcyBub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCURpcmVjdERyYXdFbnVtZXJhdGVBIChERFJBVy5AKQotICovCi0KLXN0YXRpYyBCT09MIENBTExCQUNLIERpcmVjdERyYXdFbnVtZXJhdGVQcm9jQSgKLQlHVUlEICpscEdVSUQsIExQU1RSIGxwRHJpdmVyRGVzY3JpcHRpb24sIExQU1RSIGxwRHJpdmVyTmFtZSwKLQlMUFZPSUQgbHBDb250ZXh0LCBITU9OSVRPUiBobSkKLXsKLSAgICBEaXJlY3REcmF3RW51bWVyYXRlUHJvY0RhdGEgKnBFUEQgPSAoRGlyZWN0RHJhd0VudW1lcmF0ZVByb2NEYXRhKilscENvbnRleHQ7Ci0KLSAgICByZXR1cm4gKChMUERERU5VTUNBTExCQUNLQSkgcEVQRC0+bHBDYWxsYmFjaykoCi0JbHBHVUlELCBscERyaXZlckRlc2NyaXB0aW9uLCBscERyaXZlck5hbWUsIHBFUEQtPmxwQ29udGV4dCk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdFbnVtZXJhdGVBKAotICBMUERERU5VTUNBTExCQUNLQSBscENhbGxiYWNrLCBMUFZPSUQgbHBDb250ZXh0KQotewotICAgIERpcmVjdERyYXdFbnVtZXJhdGVQcm9jRGF0YSBlcGQ7Ci0gICAgZXBkLmxwQ2FsbGJhY2sgPSAoTFBWT0lEKSBscENhbGxiYWNrOwotICAgIGVwZC5scENvbnRleHQgPSBscENvbnRleHQ7Ci0KLSAgICByZXR1cm4gRGlyZWN0RHJhd0VudW1lcmF0ZUV4QShEaXJlY3REcmF3RW51bWVyYXRlUHJvY0EsIChMUFZPSUQpICZlcGQsIDApOwotfQorICogQ2xhc3NmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlEaXJlY3REcmF3RW51bWVyYXRlVyAoRERSQVcuQCkKLSAqLwotCi1zdGF0aWMgQk9PTCBXSU5BUEkgRGlyZWN0RHJhd0VudW1lcmF0ZVByb2NXKAotICBHVUlEICpscEdVSUQsIExQV1NUUiBscERyaXZlckRlc2NyaXB0aW9uLCBMUFdTVFIgbHBEcml2ZXJOYW1lLAotICBMUFZPSUQgbHBDb250ZXh0LCBITU9OSVRPUiBobSkKKyAqIENGX0NyZWF0ZURpcmVjdERyYXcKKyAqCisgKiBERHJhdyBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGNsYXNzIGZhY3RvcnkKKyAqCisgKiBQYXJhbXM6CisgKiAgVW5rT3V0ZXI6IFNldCB0byBOVUxMCisgKiAgaWlkOiBJRCBvZiB0aGUgd2FudGVkIGludGVyZmFjZQorICogIG9iajogQWRkcmVzcyB0byBwYXNzIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBiYWNrCisgKgorICogUmV0dXJucworICogIEREX09LIC8gRERFUlIqLCBzZWUgRERSQVdfQ3JlYXRlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQKK0NGX0NyZWF0ZURpcmVjdERyYXcoSVVua25vd24qIFVua091dGVyLCBSRUZJSUQgaWlkLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQogewotICAgIERpcmVjdERyYXdFbnVtZXJhdGVQcm9jRGF0YSAqcEVQRCA9IChEaXJlY3REcmF3RW51bWVyYXRlUHJvY0RhdGEqKWxwQ29udGV4dDsKLQotICAgIHJldHVybiAoKExQRERFTlVNQ0FMTEJBQ0tXKSBwRVBELT5scENhbGxiYWNrKSgKLQlscEdVSUQsIGxwRHJpdmVyRGVzY3JpcHRpb24sIGxwRHJpdmVyTmFtZSwgcEVQRC0+bHBDb250ZXh0KTsKLX0KLQotSFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd0VudW1lcmF0ZVcoCi0gIExQRERFTlVNQ0FMTEJBQ0tXIGxwQ2FsbGJhY2ssIExQVk9JRCBscENvbnRleHQpCi17Ci0gICAgRGlyZWN0RHJhd0VudW1lcmF0ZVByb2NEYXRhIGVwZDsKLSAgICBlcGQubHBDYWxsYmFjayA9IChMUFZPSUQpIGxwQ2FsbGJhY2s7Ci0gICAgZXBkLmxwQ29udGV4dCA9IGxwQ29udGV4dDsKLQotICAgIHJldHVybiBEaXJlY3REcmF3RW51bWVyYXRlRXhXKERpcmVjdERyYXdFbnVtZXJhdGVQcm9jVywgKExQVk9JRCkgJmVwZCwgMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCURpcmVjdERyYXdDcmVhdGUgKEREUkFXLkApCi0gKi8KLQotY29uc3QgZGRyYXdfZHJpdmVyKiBERFJBV19GaW5kRHJpdmVyKGNvbnN0IEdVSUQqIHBHVUlEKQotewotICAgIHN0YXRpYyBjb25zdCBHVUlEIHplcm9HVUlEOyAvKiBnZXRzIHplcm8taW5pdGVkICovCi0KLSAgICBUUkFDRSgiKCVzKVxuIiwgcEdVSUQgPyBkZWJ1Z3N0cl9ndWlkKHBHVUlEKSA6ICIobnVsbCkiKTsKLQotICAgIGlmIChERFJBV19udW1fZHJpdmVycyA9PSAwKSByZXR1cm4gTlVMTDsKLQotICAgIGlmIChwR1VJRCA9PSAoTFBHVUlEKUREQ1JFQVRFX0VNVUxBVElPTk9OTFkKLQl8fCBwR1VJRCA9PSAoTFBHVUlEKUREQ1JFQVRFX0hBUkRXQVJFT05MWSkKLQlwR1VJRCA9IE5VTEw7Ci0KLSAgICBpZiAocEdVSUQgPT0gTlVMTCB8fCBtZW1jbXAocEdVSUQsICZ6ZXJvR1VJRCwgc2l6ZW9mKEdVSUQpKSA9PSAwKQotICAgIHsKLQkvKiBVc2UgdGhlIGRlZmF1bHQgZHJpdmVyLiAqLwotCXJldHVybiBERFJBV19kcml2ZXJzW0REUkFXX2RlZmF1bHRfZHJpdmVyXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkvKiBMb29rIGZvciBhIG1hdGNoaW5nIEdVSUQuICovCi0KLQlpbnQgaTsKLQlmb3IgKGk9MDsgaSA8IEREUkFXX251bV9kcml2ZXJzOyBpKyspCi0JewotCSAgICBpZiAoSXNFcXVhbEdVSUQocEdVSUQsCi0JCQkgICAgJkREUkFXX2RyaXZlcnNbaV0tPmluZm8tPmd1aWREZXZpY2VJZGVudGlmaWVyKSkKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPCBERFJBV19udW1fZHJpdmVycykKLQl7Ci0JICAgIHJldHVybiBERFJBV19kcml2ZXJzW2ldOwotCX0KLQllbHNlCi0JewotCSAgICBFUlIoIiglcyk6IGRpZCBub3QgcmVjb2duaXplIHJlcXVlc3RlZCBHVUlELlxuIixkZWJ1Z3N0cl9ndWlkKHBHVUlEKSk7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIEREUkFXX0NyZWF0ZSgKLQlMUEdVSUQgbHBHVUlELCBMUFZPSUQgKmxwbHBERCwgTFBVTktOT1dOIHBVbmtPdXRlciwgUkVGSUlEIGlpZCwgQk9PTCBleAotKSB7Ci0gICAgY29uc3QgZGRyYXdfZHJpdmVyKiBkcml2ZXI7Ci0gICAgTFBESVJFQ1REUkFXNyBwREQ7CiAgICAgSFJFU1VMVCBocjsKIAotICAgIFRSQUNFKCIoJXMsJXAsJXAsJWQpXG4iLCBkZWJ1Z3N0cl9ndWlkKGxwR1VJRCksIGxwbHBERCwgcFVua091dGVyLCBleCk7CisgICAgVFJBQ0UoIiglcCwlcywlcClcbiIsIFVua091dGVyLCBkZWJ1Z3N0cl9ndWlkKGlpZCksIG9iaik7CiAKLSAgICBpZiAoRERSQVdfbnVtX2RyaXZlcnMgPT0gMCkKLSAgICB7Ci0JV0FSTigibm8gRGlyZWN0RHJhdyBkcml2ZXJzIHJlZ2lzdGVyZWRcbiIpOwotCXJldHVybiBEREVSUl9JTlZBTElERElSRUNURFJBV0dVSUQ7Ci0gICAgfQotCi0gICAgaWYgKGxwR1VJRCA9PSAoTFBHVUlEKUREQ1JFQVRFX0VNVUxBVElPTk9OTFkKLQl8fCBscEdVSUQgPT0gKExQR1VJRClERENSRUFURV9IQVJEV0FSRU9OTFkpCi0JbHBHVUlEID0gTlVMTDsKLQotICAgIGlmIChwVW5rT3V0ZXIgIT0gTlVMTCkKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgLyogQ0xBU1NfRV9OT0FHR1JFR0FUSU9OPyAqLwotCi0gICAgZHJpdmVyID0gRERSQVdfRmluZERyaXZlcihscEdVSUQpOwotICAgIGlmIChkcml2ZXIgPT0gTlVMTCkgcmV0dXJuIERERVJSX0lOVkFMSURESVJFQ1REUkFXR1VJRDsKLQotICAgIGhyID0gZHJpdmVyLT5jcmVhdGUobHBHVUlELCAmcERELCBwVW5rT3V0ZXIsIGV4KTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCi0gICAgaHIgPSBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UocERELCBpaWQsIGxwbHBERCk7Ci0gICAgSURpcmVjdERyYXc3X1JlbGVhc2UocEREKTsKKyAgICBociA9IEREUkFXX0NyZWF0ZShOVUxMLCBvYmosIFVua091dGVyLCBpaWQpOwogICAgIHJldHVybiBocjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJRGlyZWN0RHJhd0NyZWF0ZSAoRERSQVcuQCkKKyAqIENGX0NyZWF0ZURpcmVjdERyYXcKICAqCi0gKiBPbmx5IGNyZWF0ZXMgbGVnYWN5IElEaXJlY3REcmF3IGludGVyZmFjZXMuCi0gKiBDYW5ub3QgY3JlYXRlIElEaXJlY3REcmF3NyBpbnRlcmZhY2VzLgotICogSW4gdGhlb3J5LgotICovCi1IUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3Q3JlYXRlKAotCUxQR1VJRCBscEdVSUQsIExQRElSRUNURFJBVyogbHBscERELCBMUFVOS05PV04gcFVua091dGVyCi0pIHsKLSAgICBUUkFDRSgiKCVzLCVwLCVwKVxuIiwgZGVidWdzdHJfZ3VpZChscEdVSUQpLCBscGxwREQsIHBVbmtPdXRlcik7Ci0gICAgcmV0dXJuIEREUkFXX0NyZWF0ZShscEdVSUQsIChMUFZPSUQqKSBscGxwREQsIHBVbmtPdXRlciwgJklJRF9JRGlyZWN0RHJhdywgRkFMU0UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlEaXJlY3REcmF3Q3JlYXRlRXggKEREUkFXLkApCisgKiBDbGlwcGVyIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgY2xhc3MgZmFjdG9yeQogICoKLSAqIE9ubHkgY3JlYXRlcyBuZXcgSURpcmVjdERyYXc3IGludGVyZmFjZXMuCi0gKiBTdXBwb3NlZCB0byBmYWlsIGlmIGxlZ2FjeSBpbnRlcmZhY2VzIGFyZSByZXF1ZXN0ZWQuCi0gKiBJbiB0aGVvcnkuCi0gKi8KLUhSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdDcmVhdGVFeCgKLQlMUEdVSUQgbHBHVUlELCBMUFZPSUQqIGxwbHBERCwgUkVGSUlEIGlpZCwgTFBVTktOT1dOIHBVbmtPdXRlcgotKSB7Ci0gICAgVFJBQ0UoIiglcywlcCwlcywlcClcbiIsIGRlYnVnc3RyX2d1aWQobHBHVUlEKSwgbHBscERELCBkZWJ1Z3N0cl9ndWlkKGlpZCksIHBVbmtPdXRlcik7Ci0KLSAgICBpZiAoIUlzRXF1YWxHVUlEKGlpZCwgJklJRF9JRGlyZWN0RHJhdzcpKQotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCi0gICAgcmV0dXJuIEREUkFXX0NyZWF0ZShscEdVSUQsIGxwbHBERCwgcFVua091dGVyLCBpaWQsIFRSVUUpOwotfQotCi1leHRlcm4gSFJFU1VMVCBVbmluaXRfRGlyZWN0RHJhd19DcmVhdGUoY29uc3QgR1VJRCosIExQRElSRUNURFJBVzcqLAotCQkJCQlMUFVOS05PV04sIEJPT0wpOwotCi0vKiBUaGlzIGlzIGZvciB0aGUgY2xhc3MgZmFjdG9yeS4gKi8KLXN0YXRpYyBIUkVTVUxUIEREUkFXX0NyZWF0ZURpcmVjdERyYXcoSVVua25vd24qIHBVbmtPdXRlciwgUkVGSUlEIGlpZCwKLQkJCQkgICAgICBMUFZPSUQqIHBwT2JqKQorICogUGFyYW1zOgorICogIFVua091dGVyOiBTZXQgdG8gTlVMTAorICogIGlpZDogSUQgb2YgdGhlIHdhbnRlZCBpbnRlcmZhY2UKKyAqICBvYmo6IEFkZHJlc3MgdG8gcGFzcyB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYmFjaworICoKKyAqIFJldHVybnMKKyAqICBERF9PSyAvIERERVJSKiwgc2VlIEREUkFXX0NyZWF0ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUCitDRl9DcmVhdGVEaXJlY3REcmF3Q2xpcHBlcihJVW5rbm93biogVW5rT3V0ZXIsIFJFRklJRCByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKIHsKLSAgICBMUERJUkVDVERSQVc3IHBERDsKICAgICBIUkVTVUxUIGhyOwotICAgIEJPT0wgZXg7CisgICAgSURpcmVjdERyYXdDbGlwcGVyICpDbGlwOwogCi0gICAgVFJBQ0UoIiglcCwlcywlcClcbiIsIHBVbmtPdXRlciwgZGVidWdzdHJfZ3VpZChpaWQpLCBwcE9iaik7Ci0gICAgCi0gICAgLyogVGhpcyBpcyBhIG1pZ2h0eSBoYWNrIDotKSAqLwotICAgIGlmIChJc0VxdWFsR1VJRChpaWQsICZJSURfSURpcmVjdERyYXc3KSkKLQlleCA9IFRSVUU7Ci0gICAgZWxzZQotICAgICAgICBleCA9IEZBTFNFOwotICAgIAotICAgIGhyID0gVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlKE5VTEwsICZwREQsIHBVbmtPdXRlciwgZXgpOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisgICAgaHIgPSBEaXJlY3REcmF3Q3JlYXRlQ2xpcHBlcigwLCAmQ2xpcCwgVW5rT3V0ZXIpOworICAgIGlmIChociAhPSBERF9PSykgcmV0dXJuIGhyOwogCi0gICAgaHIgPSBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UocERELCBpaWQsIHBwT2JqKTsKLSAgICBJRGlyZWN0RHJhd19SZWxlYXNlKHBERCk7CisgICAgaHIgPSBJRGlyZWN0RHJhd0NsaXBwZXJfUXVlcnlJbnRlcmZhY2UoQ2xpcCwgcmlpZCwgb2JqKTsKKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJfUmVsZWFzZShDbGlwKTsKICAgICByZXR1cm4gaHI7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERpcmVjdERyYXcgQ2xhc3NGYWN0b3J5Ci0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBJQ09NX1ZGSUVMRF9NVUxUSShJQ2xhc3NGYWN0b3J5KTsKLQotICAgIExPTkcgcmVmOwotICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIGlpZCwKLQkJCQkgTFBWT0lEICpwcE9iaik7Ci19IElDbGFzc0ZhY3RvcnlJbXBsOwotCi1zdHJ1Y3Qgb2JqZWN0X2NyZWF0aW9uX2luZm8KLXsKLSAgICBjb25zdCBDTFNJRCAqY2xzaWQ7Ci0gICAgSFJFU1VMVCAoKnBmbkNyZWF0ZUluc3RhbmNlKShJVW5rbm93biAqcFVua091dGVyLCBSRUZJSUQgcmlpZCwKLQkJCQkgTFBWT0lEICpwcE9iaik7Ci19OwotCi0vKiBUaGVyZSBzaG91bGQgYmUgbW9yZSwgYnV0IHRoZXNlIGFyZSB0aGUgb25seSBvbmVzIGxpc3RlZCBpbiB0aGUgaGVhZGVyCi0gKiBmaWxlLiAqLwotZXh0ZXJuIEhSRVNVTFQgRERSQVdfQ3JlYXRlRGlyZWN0RHJhd0NsaXBwZXIoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIHJpaWQsCi0JCQkJCSAgICAgTFBWT0lEICpwcE9iaik7Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2JqZWN0X2NyZWF0aW9uX2luZm8gb2JqZWN0X2NyZWF0aW9uW10gPQogewotICAgIHsgJkNMU0lEX0RpcmVjdERyYXcsICAgICAgIAlERFJBV19DcmVhdGVEaXJlY3REcmF3IH0sCi0gICAgeyAmQ0xTSURfRGlyZWN0RHJhdzcsCUREUkFXX0NyZWF0ZURpcmVjdERyYXcgfSwKLSAgICB7ICZDTFNJRF9EaXJlY3REcmF3Q2xpcHBlciwJRERSQVdfQ3JlYXRlRGlyZWN0RHJhd0NsaXBwZXIgfQorICAgIHsgJkNMU0lEX0RpcmVjdERyYXcsICAgICAgICBDRl9DcmVhdGVEaXJlY3REcmF3IH0sCisgICAgeyAmQ0xTSURfRGlyZWN0RHJhdzcsICAgICAgIENGX0NyZWF0ZURpcmVjdERyYXcgfSwKKyAgICB7ICZDTFNJRF9EaXJlY3REcmF3Q2xpcHBlciwgQ0ZfQ3JlYXRlRGlyZWN0RHJhd0NsaXBwZXIgfQogfTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Q2xhc3NGYWN0b3J5OjpRdWVyeUludGVyZmFjZQorICoKKyAqIFF1ZXJ5SW50ZXJmYWNlIGZvciB0aGUgY2xhc3MgZmFjdG9yeQorICoKKyAqIFBBUkFNUworICogICAgcmlpZCAgIFJlZmVyZW5jZSB0byBpZGVudGlmaWVyIG9mIHF1ZXJpZWQgaW50ZXJmYWNlCisgKiAgICBwcHYgICAgQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogU19PSworICogICAgRmFpbHVyZTogRV9OT0lOVEVSRkFDRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1ERENGX1F1ZXJ5SW50ZXJmYWNlKExQQ0xBU1NGQUNUT1JZIGlmYWNlLFJFRklJRCByaWlkLExQVk9JRCAqcHBvYmopCitJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeUltcGxfUXVlcnlJbnRlcmZhY2UoSUNsYXNzRmFjdG9yeSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQogewotICAgIElDbGFzc0ZhY3RvcnlJbXBsICpUaGlzID0gKElDbGFzc0ZhY3RvcnlJbXBsICopaWZhY2U7CisgICAgSUNPTV9USElTX0ZST00oSUNsYXNzRmFjdG9yeUltcGwsIElDbGFzc0ZhY3RvcnksIGlmYWNlKTsKIAotICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBwcG9iaik7Ci0gICAgCisgICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CisKICAgICBpZiAoSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JVW5rbm93bikKLQl8fCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lDbGFzc0ZhY3RvcnkpKQorICAgICAgICB8fCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lDbGFzc0ZhY3RvcnkpKQogICAgIHsKLQlJQ2xhc3NGYWN0b3J5X0FkZFJlZihpZmFjZSk7Ci0JKnBwb2JqID0gVGhpczsKLQlyZXR1cm4gU19PSzsKKyAgICAgICAgSUNsYXNzRmFjdG9yeV9BZGRSZWYoaWZhY2UpOworICAgICAgICAqb2JqID0gVGhpczsKKyAgICAgICAgcmV0dXJuIFNfT0s7CiAgICAgfQogCi0gICAgV0FSTigiKCVwKS0+KCVzLCVwKSxub3QgZm91bmRcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJpaWQpLHBwb2JqKTsKKyAgICBXQVJOKCIoJXApLT4oJXMsJXApLG5vdCBmb3VuZFxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmlpZCksb2JqKTsKICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKIH0KIAotc3RhdGljIFVMT05HIFdJTkFQSSBERENGX0FkZFJlZihMUENMQVNTRkFDVE9SWSBpZmFjZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeTo6QWRkUmVmCisgKgorICogQWRkUmVmIGZvciB0aGUgY2xhc3MgZmFjdG9yeQorICoKKyAqIFJFVFVSTlMKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeUltcGxfQWRkUmVmKElDbGFzc0ZhY3RvcnkgKmlmYWNlKQogewotICAgIElDbGFzc0ZhY3RvcnlJbXBsICpUaGlzID0gKElDbGFzc0ZhY3RvcnlJbXBsICopaWZhY2U7CisgICAgSUNPTV9USElTX0ZST00oSUNsYXNzRmFjdG9yeUltcGwsIElDbGFzc0ZhY3RvcnksIGlmYWNlKTsKICAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKIAogICAgIFRSQUNFKCIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAlbGQuXG4iLCBUaGlzLCByZWYgLSAxKTsKLSAgICAKKwogICAgIHJldHVybiByZWY7CiB9CiAKLXN0YXRpYyBVTE9ORyBXSU5BUEkgRERDRl9SZWxlYXNlKExQQ0xBU1NGQUNUT1JZIGlmYWNlKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3Q2xhc3NGYWN0b3J5OjpSZWxlYXNlCisgKgorICogUmVsZWFzZSBmb3IgdGhlIGNsYXNzIGZhY3RvcnkuIElmIHRoZSByZWZjb3VudCBmYWxscyB0byAwLCB0aGUgb2JqZWN0CisgKiBpcyBkZXN0cm95ZWQKKyAqCisgKiBSRVRVUk5TCisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdERyYXdDbGFzc0ZhY3RvcnlJbXBsX1JlbGVhc2UoSUNsYXNzRmFjdG9yeSAqaWZhY2UpCiB7Ci0gICAgSUNsYXNzRmFjdG9yeUltcGwgKlRoaXMgPSAoSUNsYXNzRmFjdG9yeUltcGwgKilpZmFjZTsKKyAgICBJQ09NX1RISVNfRlJPTShJQ2xhc3NGYWN0b3J5SW1wbCwgSUNsYXNzRmFjdG9yeSwgaWZhY2UpOwogICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOwogICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbGQuXG4iLCBUaGlzLCByZWYrMSk7CiAKICAgICBpZiAocmVmID09IDApCi0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CisgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwogCiAgICAgcmV0dXJuIHJlZjsKIH0KIAogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgRERDRl9DcmVhdGVJbnN0YW5jZSgKLQlMUENMQVNTRkFDVE9SWSBpZmFjZSxMUFVOS05PV04gcE91dGVyLFJFRklJRCByaWlkLExQVk9JRCAqcHBvYmoKLSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeTo6Q3JlYXRlSW5zdGFuY2UKKyAqCisgKiBXaGF0IGlzIHRoaXM/IFNlZW1zIHRvIGNyZWF0ZSBEaXJlY3REcmF3IG9iamVjdHMuLi4KKyAqCisgKiBQYXJhbXMKKyAqICBUaGUgdXN1c2FsIHRoaW5ncz8/PworICoKKyAqIFJFVFVSTlMKKyAqICA/Pz8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdDbGFzc0ZhY3RvcnlJbXBsX0NyZWF0ZUluc3RhbmNlKElDbGFzc0ZhY3RvcnkgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQogewotICAgIElDbGFzc0ZhY3RvcnlJbXBsICpUaGlzID0gKElDbGFzc0ZhY3RvcnlJbXBsICopaWZhY2U7CisgICAgSUNPTV9USElTX0ZST00oSUNsYXNzRmFjdG9yeUltcGwsIElDbGFzc0ZhY3RvcnksIGlmYWNlKTsKIAotICAgIFRSQUNFKCIoJXApLT4oJXAsJXMsJXApXG4iLFRoaXMscE91dGVyLGRlYnVnc3RyX2d1aWQocmlpZCkscHBvYmopOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXMsJXApXG4iLFRoaXMsVW5rT3V0ZXIsZGVidWdzdHJfZ3VpZChyaWlkKSxvYmopOwogCi0gICAgcmV0dXJuIFRoaXMtPnBmbkNyZWF0ZUluc3RhbmNlKHBPdXRlciwgcmlpZCwgcHBvYmopOworICAgIHJldHVybiBUaGlzLT5wZm5DcmVhdGVJbnN0YW5jZShVbmtPdXRlciwgcmlpZCwgb2JqKTsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIEREQ0ZfTG9ja1NlcnZlcihMUENMQVNTRkFDVE9SWSBpZmFjZSxCT09MIGRvbG9jaykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeTo6TG9ja1NlcnZlcgorICoKKyAqIFdoYXQgaXMgdGhpcz8KKyAqCisgKiBQYXJhbXMKKyAqICA/Pz8KKyAqCisgKiBSRVRVUk5TCisgKiAgU19PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeUltcGxfTG9ja1NlcnZlcihJQ2xhc3NGYWN0b3J5ICppZmFjZSxCT09MIGRvbG9jaykKIHsKLSAgICBJQ2xhc3NGYWN0b3J5SW1wbCAqVGhpcyA9IChJQ2xhc3NGYWN0b3J5SW1wbCAqKWlmYWNlOworICAgIElDT01fVEhJU19GUk9NKElDbGFzc0ZhY3RvcnlJbXBsLCBJQ2xhc3NGYWN0b3J5LCBpZmFjZSk7CiAgICAgRklYTUUoIiglcCktPiglZCksc3R1YiFcbiIsVGhpcyxkb2xvY2spOwogICAgIHJldHVybiBTX09LOwogfQogCi1zdGF0aWMgY29uc3QgSUNsYXNzRmFjdG9yeVZ0YmwgRERDRl9WdGJsID0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgY2xhc3MgZmFjdG9yeSBWVGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IElDbGFzc0ZhY3RvcnlWdGJsIElDbGFzc0ZhY3RvcnlfVnRibCA9CiB7Ci0gICAgRERDRl9RdWVyeUludGVyZmFjZSwKLSAgICBERENGX0FkZFJlZiwKLSAgICBERENGX1JlbGVhc2UsCi0gICAgRERDRl9DcmVhdGVJbnN0YW5jZSwKLSAgICBERENGX0xvY2tTZXJ2ZXIKKyAgICBJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeUltcGxfUXVlcnlJbnRlcmZhY2UsCisgICAgSURpcmVjdERyYXdDbGFzc0ZhY3RvcnlJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeUltcGxfUmVsZWFzZSwKKyAgICBJRGlyZWN0RHJhd0NsYXNzRmFjdG9yeUltcGxfQ3JlYXRlSW5zdGFuY2UsCisgICAgSURpcmVjdERyYXdDbGFzc0ZhY3RvcnlJbXBsX0xvY2tTZXJ2ZXIKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01OTUsMTAgKzY4MCwxMCBAQAogCXJldHVybiBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFOwogICAgIH0KIAotICAgIGZhY3RvcnkgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpmYWN0b3J5KSk7CisgICAgZmFjdG9yeSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoKmZhY3RvcnkpKTsKICAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKIAotICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoZmFjdG9yeSwgSUNsYXNzRmFjdG9yeSwgRERDRl9WdGJsKTsKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKGZhY3RvcnksIElDbGFzc0ZhY3RvcnksIElDbGFzc0ZhY3RvcnlfVnRibCk7CiAgICAgZmFjdG9yeS0+cmVmID0gMTsKIAogICAgIGZhY3RvcnktPnBmbkNyZWF0ZUluc3RhbmNlID0gb2JqZWN0X2NyZWF0aW9uW2ldLnBmbkNyZWF0ZUluc3RhbmNlOwpAQCAtNjIxLDEwMyArNzA2LDE5MCBAQAogICAgIHJldHVybiBTX0ZBTFNFOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbml0aWFsaXNhdGlvbgotICovCi0KLS8qIENob29zZSB3aGljaCBkcml2ZXIgaXMgY29uc2lkZXJlZCB0aGUgcHJpbWFyeSBkaXNwbGF5IGRyaXZlci4gSXQgd2lsbAotICogYmUgY3JlYXRlZCB3aGVuIHdlIGdldCBhIE5VTEwgZ3VpZCBmb3IgdGhlIERpcmVjdERyYXdDcmVhdGUoRXgpLiAqLwotc3RhdGljIGludCBERFJBV19DaG9vc2VEZWZhdWx0RHJpdmVyKHZvaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVzdHJveUNhbGxiYWNrCisgKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBFbnVtU3VyZmFjZXMgY2FsbCBpbiBEbGxNYWluLgorICogRHVtcHMgc29tZSBzdXJmYWNlIGluZm8gYW5kIHJlbGVhc2VzIHRoZSBzdXJmYWNlCisgKgorICogUGFyYW1zOgorICogIHN1cmY6IFRoZSBlbnVtZXJhdGVkIHN1cmZhY2UKKyAqICBkZXNjOiBpdCdzIGRlc2NyaXB0aW9uCisgKiAgY29udGV4dDogUG9pbnRlciB0byB0aGUgZGRyYXcgaW1wbAorICoKKyAqIFJldHVybnM6CisgKiAgRERFTlVNUkVUX09LOworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIUkVTVUxUIFdJTkFQSQorRGVzdHJveUNhbGxiYWNrKElEaXJlY3REcmF3U3VyZmFjZTcgKnN1cmYsCisgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKmRlc2MsCisgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkKIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgYmVzdCA9IDA7Ci0gICAgaW50IGJlc3Rfc2NvcmUgPSAwOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKkltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBzdXJmKTsKKyAgICBJRGlyZWN0RHJhd0ltcGwgKmRkcmF3ID0gKElEaXJlY3REcmF3SW1wbCAqKSBjb250ZXh0OworICAgIFVMT05HIHJlZjsKIAotICAgIGFzc2VydChERFJBV19udW1fZHJpdmVycyA+IDApOworICAgIHJlZiA9IElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmKTsgIC8qIEZvciB0aGUgRW51bVN1cmZhY2VzICovCisgICAgV0FSTigiU3VyZmFjZSAlcCBoYXMgYW4gcmVmZXJlbmNlIGNvdW50IG9mICVsZFxuIiwgSW1wbCwgcmVmKTsKIAotICAgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIHJlYWxseSBzdHVwaWQuICovCi0gICAgZm9yIChpPTA7IGkgPCBERFJBV19udW1fZHJpdmVyczsgaSsrKQotICAgIHsKLQlpZiAoRERSQVdfZHJpdmVyc1tpXS0+cHJlZmVyZW5jZSA+IGJlc3Rfc2NvcmUpCi0JewotCSAgICBiZXN0X3Njb3JlID0gRERSQVdfZHJpdmVyc1tpXS0+cHJlZmVyZW5jZTsKLQkgICAgYmVzdCA9IGk7Ci0JfQotICAgIH0KKyAgICAvKiBTa2lwIHN1cmZhY2VzIHdoaWNoIGFyZSBhdHRhY2hlZCBzb21ld2hlcmUgb3Igd2hpY2ggYXJlCisgICAgICogcGFydCBvZiBhIGNvbXBsZXggY29tcG91bmQuIFRoZXkgd2lsbCBnZXQgcmVsZWFzZWQgd2hlbiBkZXN0cm95aW5nCisgICAgICogdGhlIHJvb3QKKyAgICAgKi8KKyAgICBpZiggKEltcGwtPmZpcnN0X2NvbXBsZXggIT0gSW1wbCkgfHwgKEltcGwtPmZpcnN0X2F0dGFjaGVkICE9IEltcGwpICkKKyAgICAgICAgcmV0dXJuIERERU5VTVJFVF9PSzsKKyAgICAvKiBTa2lwIG91ciBkZXB0aCBzdGVuY2lsIHN1cmZhY2UsIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2l0aCB0aGUgcmVuZGVyIHRhcmdldCAqLworICAgIGlmKCBJbXBsID09IGRkcmF3LT5EZXB0aFN0ZW5jaWxCdWZmZXIpCisgICAgICAgIHJldHVybiBEREVOVU1SRVRfT0s7CiAKLSAgICBhc3NlcnQoYmVzdF9zY29yZSA+IDApOworICAgIC8qIERlc3Ryb3kgdGhlIHN1cmZhY2UgKi8KKyAgICB3aGlsZShyZWYpIHJlZiA9IElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShzdXJmKTsKIAotICAgIHJldHVybiBiZXN0OworICAgIHJldHVybiBEREVOVU1SRVRfT0s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCURsbE1haW4gKEREUkFXLjApCi0gKi8KLUJPT0wgV0lOQVBJIERsbE1haW4oSElOU1RBTkNFIGhJbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscHYpCisgKiBnZXRfY29uZmlnX2tleQorICoKKyAqIFJlYWRzIGEgY29uZmlnIGtleSBmcm9tIHRoZSByZWdpc3RyeS4gVGFrZW4gZnJvbSBXaW5lRDNECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW5saW5lIHN0YXRpYyBEV09SRCBnZXRfY29uZmlnX2tleShIS0VZIGRlZmtleSwgSEtFWSBhcHBrZXksIGNvbnN0IGNoYXIqIG5hbWUsIGNoYXIqIGJ1ZmZlciwgRFdPUkQgc2l6ZSkKIHsKLSAgICAvKiBJZiB3ZSB3ZXJlIHN1ZmZpY2llbnRseSBjb29sLCBERHJhdyBkcml2ZXJzIHdvdWxkIGp1c3QgYmUgQ09NCi0gICAgICogb2JqZWN0cywgcmVnaXN0ZXJlZCB3aXRoIGEgcGFydGljdWxhciBjb21wb25lbnQgY2F0ZWdvcnkuICovCisgICAgaWYgKDAgIT0gYXBwa2V5ICYmICFSZWdRdWVyeVZhbHVlRXhBKCBhcHBrZXksIG5hbWUsIDAsIE5VTEwsIChMUEJZVEUpIGJ1ZmZlciwgJnNpemUgKSkgcmV0dXJuIDA7CisgICAgaWYgKDAgIT0gZGVma2V5ICYmICFSZWdRdWVyeVZhbHVlRXhBKCBkZWZrZXksIG5hbWUsIDAsIE5VTEwsIChMUEJZVEUpIGJ1ZmZlciwgJnNpemUgKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOworfQogCi0gICAgRERSQVdfSEFMX0luaXQoaEluc3RETEwsIGZkd1JlYXNvbiwgbHB2KTsKLSAgICBERFJBV19Vc2VyX0luaXQoaEluc3RETEwsIGZkd1JlYXNvbiwgbHB2KTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGxsTWFpbiAoRERSQVcuMCkKKyAqCisgKiBDb3VsZCBiZSB1c2VkIHRvIHJlZ2lzdGVyIERpcmVjdERyYXcgZHJpdmVycywgaWYgd2UgaGF2ZSBtb3JlIHRoYW4KKyAqIG9uZS4gQWxzbyB1c2VkIHRvIGRlc3Ryb3kgYW55IG9iamVjdHMgbGVmdCBhdCB1bmxvYWQgaWYgdGhlCisgKiBhcHAgZGlkbid0IHJlbGVhc2UgdGhlbSBwcm9wZXJseShHb3RoaWMgMiwgRGlhYmxvIDIsIE1vdG8gcmFjZXIsIC4uLikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIFdJTkFQSQorRGxsTWFpbihISU5TVEFOQ0UgaEluc3RETEwsCisgICAgICAgIERXT1JEIFJlYXNvbiwKKyAgICAgICAgdm9pZCAqbHB2KQoreworICAgIHN0YXRpYyBMT05HIGNvdW50ZXIgPSAwOwogCi0gICAgaWYgKGZkd1JlYXNvbiA9PSBETExfUFJPQ0VTU19BVFRBQ0gpCisgICAgVFJBQ0UoIiglcCwlbHgsJXApXG4iLCBoSW5zdERMTCwgUmVhc29uLCBscHYpOworICAgIGlmIChSZWFzb24gPT0gRExMX1BST0NFU1NfQVRUQUNIKQogICAgIHsKLSAgICAgICAgSE1PRFVMRSBtb2Q7CisgICAgICAgIGNoYXIgYnVmZmVyW01BWF9QQVRIKzEwXTsKKyAgICAgICAgRFdPUkQgc2l6ZSA9IHNpemVvZihidWZmZXIpOworICAgICAgICBIS0VZIGhrZXkgPSAwOworICAgICAgICBIS0VZIGFwcGtleSA9IDA7CisgICAgICAgIERXT1JEIGxlbjsKKworICAgICAgIC8qIEBAIFdpbmUgcmVnaXN0cnkga2V5OiBIS0NVXFNvZnR3YXJlXFdpbmVcRGlyZWN0M0QgKi8KKyAgICAgICBpZiAoIFJlZ09wZW5LZXlBKCBIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxXaW5lXFxEaXJlY3QzRCIsICZoa2V5ICkgKSBoa2V5ID0gMDsKKworICAgICAgIGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lQSggMCwgYnVmZmVyLCBNQVhfUEFUSCApOworICAgICAgIGlmIChsZW4gJiYgbGVuIDwgTUFYX1BBVEgpCisgICAgICAgeworICAgICAgICAgICAgSEtFWSB0bXBrZXk7CisgICAgICAgICAgICAvKiBAQCBXaW5lIHJlZ2lzdHJ5IGtleTogSEtDVVxTb2Z0d2FyZVxXaW5lXEFwcERlZmF1bHRzXGFwcC5leGVcRGlyZWN0M0QgKi8KKyAgICAgICAgICAgIGlmICghUmVnT3BlbktleUEoIEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFdpbmVcXEFwcERlZmF1bHRzIiwgJnRtcGtleSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKnAsICphcHBuYW1lID0gYnVmZmVyOworICAgICAgICAgICAgICAgIGlmICgocCA9IHN0cnJjaHIoIGFwcG5hbWUsICcvJyApKSkgYXBwbmFtZSA9IHAgKyAxOworICAgICAgICAgICAgICAgIGlmICgocCA9IHN0cnJjaHIoIGFwcG5hbWUsICdcXCcgKSkpIGFwcG5hbWUgPSBwICsgMTsKKyAgICAgICAgICAgICAgICBzdHJjYXQoIGFwcG5hbWUsICJcXERpcmVjdDNEIiApOworICAgICAgICAgICAgICAgIFRSQUNFKCJhcHBuYW1lID0gWyVzXVxuIiwgYXBwbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKFJlZ09wZW5LZXlBKCB0bXBrZXksIGFwcG5hbWUsICZhcHBrZXkgKSkgYXBwa2V5ID0gMDsKKyAgICAgICAgICAgICAgICBSZWdDbG9zZUtleSggdG1wa2V5ICk7CisgICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgaWYgKCAwICE9IGhrZXkgfHwgMCAhPSBhcHBrZXkgKQorICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIWdldF9jb25maWdfa2V5KCBoa2V5LCBhcHBrZXksICJEaXJlY3REcmF3UmVuZGVyZXIiLCBidWZmZXIsIHNpemUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChidWZmZXIsImdkaSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIkRlZmF1bHRpbmcgdG8gR0RJIHN1cmZhY2VzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFN1cmZhY2VUeXBlID0gU1VSRkFDRV9HREk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYnVmZmVyLCJvcGVuZ2wiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFKCJEZWZhdWx0aW5nIHRvIG9wZW5nbCBzdXJmYWNlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIERlZmF1bHRTdXJmYWNlVHlwZSA9IFNVUkZBQ0VfT1BFTkdMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gZGVmYXVsdCBzdXJmYWNlIHR5cGUuIFN1cHBvcnRlZCBhcmU6XG4gZ2RpLCBvcGVuZ2wiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKGhJbnN0RExMKTsKKyAgICAgICAgVFJBQ0UoIkF0dGFjaCBjb3VudGVyOiAlbGRcbiIsIEludGVybG9ja2VkSW5jcmVtZW50KCZjb3VudGVyKSk7CisgICAgfQorICAgIGVsc2UgaWYgKFJlYXNvbiA9PSBETExfUFJPQ0VTU19ERVRBQ0gpCisgICAgeworICAgICAgICBUUkFDRSgiQXR0YWNoIGNvdW50ZXI6ICVsZFxuIiwgSW50ZXJsb2NrZWREZWNyZW1lbnQoJmNvdW50ZXIpKTsKIAotICAgICAgICBtb2QgPSBHZXRNb2R1bGVIYW5kbGVBKCAid2luZXgxMS5kcnYiICk7Ci0gICAgICAgIGlmIChtb2QpCisgICAgICAgIGlmKGNvdW50ZXIgPT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrX3B0ciAgID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyggbW9kLCAid2luZV90c3gxMV9sb2NrIiApOwotICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2tfcHRyID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyggbW9kLCAid2luZV90c3gxMV91bmxvY2siICk7Ci0gICAgICAgIH0KLSNpZmRlZiBIQVZFX09QRU5HTAotICAgICAgICBvcGVuZ2xfaW5pdGlhbGl6ZWQgPSBERFJBV19iaW5kX3RvX29wZW5nbCgpOwotI2VuZGlmIC8qIEhBVkVfT1BFTkdMICovCi0gICAgICAgIHMzdGNfaW5pdGlhbGl6ZWQgPSBERFJBV19iaW5kX3RvX3MzdGMoKTsKKyAgICAgICAgICAgIGlmKGRkcmF3X2xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURpcmVjdERyYXdJbXBsICpkZHJhdzsKKyAgICAgICAgICAgICAgICBXQVJOKCJUaGVyZSBhcmUgc3RpbGwgZXhpc3RpbmcgRGlyZWN0RHJhdyBpbnRlcmZhY2VzLiBXaW5lIGJ1ZyBvciBidWdneSBhcHBsaWNhdGlvbj9cbiIpOwogCi0gICAgICAgIGlmIChERFJBV19udW1fZHJpdmVycyA+IDApCi0gICAgICAgICAgICBERFJBV19kZWZhdWx0X2RyaXZlciA9IEREUkFXX0Nob29zZURlZmF1bHREcml2ZXIoKTsKKyAgICAgICAgICAgICAgICBmb3IoZGRyYXcgPSBkZHJhd19saXN0OyBkZHJhdzsgZGRyYXcgPSBkZHJhdy0+bmV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEhSRVNVTFQgaHI7CisgICAgICAgICAgICAgICAgICAgIEREU1VSRkFDRURFU0MyIGRlc2M7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgICAgIFdBUk4oIkREcmF3ICVwIGhhcyBhIHJlZmNvdW50IG9mICVsZFxuIiwgZGRyYXcsIGRkcmF3LT5yZWYpOworCisgICAgICAgICAgICAgICAgICAgIGRkcmF3LT5Eb05vdERlc3Ryb3kgPSBUUlVFOyAvKiBBdm9pZCB0byBkZXN0cm95IHRoZSBvYmplY3QgdG9vIGVhcmx5ICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBhIEQzRCBkZXZpY2UgZXhpc3Q/IERlc3Ryb3kgaXQKKyAgICAgICAgICAgICAgICAgICAgICogVE9ETzogRGVzdHJveSBhbGwgVmVydGV4IGJ1ZmZlcnMsIExpZ2h0cywgTWF0ZXJpYWxzCisgICAgICAgICAgICAgICAgICAgICAqIGFuZCBleGVjdHVyZSBidWZmZXJzIHRvbworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoZGRyYXctPmQzZGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgV0FSTigiRERyYXcgJXAgaGFzIGQzZGRldmljZSAlcCBhdHRhY2hlZFxuIiwgZGRyYXcsIGRkcmF3LT5kM2RkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoSURpcmVjdDNERGV2aWNlN19SZWxlYXNlKElDT01fSU5URVJGQUNFKGRkcmF3LT5kM2RkZXZpY2UsIElEaXJlY3QzRERldmljZTcpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVsZWFzZSB0aGUgb2JqZWN0cworICAgICAgICAgICAgICAgICAgICAgKiBEbyBhbiBFbnVtU3VyZmFjZXMgdG8gZmluZCBhbnkgaGFuZ2luZyBzdXJmYWNlcworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworICAgICAgICAgICAgICAgICAgICBkZXNjLmR3U2l6ZSA9IHNpemVvZihkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDw9IDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaHIgPSBJRGlyZWN0RHJhdzdfRW51bVN1cmZhY2VzKElDT01fSU5URVJGQUNFKGRkcmF3LCBJRGlyZWN0RHJhdzcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREVOVU1TVVJGQUNFU19BTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBkZHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdHJveUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhyICE9IEQzRF9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIoIiglcCkgRW51bVN1cmZhY2VzIGZhaWxlZCwgcHJlcGFyZSBmb3IgdHJvdWJsZVxuIiwgZGRyYXcpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHN1cmZhY2UgY291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoZGRyYXctPnN1cmZhY2VzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiRERyYXcgJXAgc3RpbGwgaGFzICVsZCBzdXJmYWNlcyBhdHRhY2hlZFxuIiwgZGRyYXcsIGRkcmF3LT5zdXJmYWNlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSB0aGUgY29vcGVyYXRpdmUgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXc3X1NldENvb3BlcmF0aXZlTGV2ZWwoSUNPTV9JTlRFUkZBQ0UoZGRyYXcsIElEaXJlY3REcmF3NyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0xfTk9STUFMKTsKKyAgICAgICAgICAgICAgICAgICAgZGRyYXctPkRvTm90RGVzdHJveSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd0ltcGxfRGVzdHJveShkZHJhdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIFRSVUU7CiB9Ci0KLS8qIFJlZ2lzdGVyIGEgZGlyZWN0IGRyYXcgZHJpdmVyLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB5b3VyIGluaXQKLSAqIGZ1bmN0aW9uLiAoVGhhdCdzIHdoeSB0aGVyZSBpcyBubyBsb2NraW5nOiB5b3VyIGluaXQgZnVuYyBpcyBjYWxsZWQgZnJvbQotICogb3VyIERsbEluaXQsIHdoaWNoIGlzIHNlcmlhbGlzZWQuKSAqLwotdm9pZCBERFJBV19yZWdpc3Rlcl9kcml2ZXIoY29uc3QgZGRyYXdfZHJpdmVyICpkcml2ZXIpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRERSQVdfbnVtX2RyaXZlcnM7IGkrKykKLSAgICB7Ci0JaWYgKEREUkFXX2RyaXZlcnNbaV0gPT0gZHJpdmVyKQotCXsKLQkgICAgRVJSKCJEcml2ZXIgcmVyZWdpc3RlcmluZyAlcFxuIiwgZHJpdmVyKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoRERSQVdfbnVtX2RyaXZlcnMgPT0gc2l6ZW9mKEREUkFXX2RyaXZlcnMpL3NpemVvZihERFJBV19kcml2ZXJzWzBdKSkKLSAgICB7Ci0JRVJSKCJ0b28gbWFueSBERFJBVyBkcml2ZXJzXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgRERSQVdfZHJpdmVyc1tERFJBV19udW1fZHJpdmVycysrXSA9IGRyaXZlcjsKLX0KLQotLyogVGhpcyB0b3RhbGx5IGRvZXNuJ3QgYmVsb25nIGhlcmUuICovCi1MT05HIEREUkFXX3dpZHRoX2JwcF90b19waXRjaChEV09SRCB3aWR0aCwgRFdPUkQgYnBwKQotewotICAgIExPTkcgcGl0Y2g7Ci0KLSAgICBhc3NlcnQoYnBwICE9IDApOyAvKiBrZWVwcyBoYXBwZW5pbmcuLi4gKi8KLQotICAgIGlmIChicHAgPT0gMTUpIGJwcCA9IDE2OwotICAgIHBpdGNoID0gd2lkdGggKiAoYnBwIC8gOCk7Ci0gICAgcmV0dXJuIHBpdGNoICsgKDggLSAocGl0Y2ggJSA4KSkgJSA4OwotfQpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9tYXRlcmlhbC5jIGIvZGxscy9kZHJhdy9tYXRlcmlhbC5jCmluZGV4IDVkZGQyMGQuLmRmNTc4M2QgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvbWF0ZXJpYWwuYworKysgYi9kbGxzL2RkcmF3L21hdGVyaWFsLmMKQEAgLTEsNSArMSw2IEBACiAvKiBEaXJlY3QzRCBNYXRlcmlhbAogICogQ29weXJpZ2h0IChjKSAyMDAyIExpb25lbCBVTE1FUgorICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE1lNJTkdFUgogICoKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGlyZWN0M0RNYXRlcmlhbC4KICAqCkBAIC0xOSwzOCArMjAsNjQgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAid2luZS9wb3J0LmgiCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KIAorI2RlZmluZSBDT0JKTUFDUk9TCiAjZGVmaW5lIE5PTkFNRUxFU1NVTklPTgotI2RlZmluZSBOT05BTUVMRVNTU1RSVUNUCiAKICNpbmNsdWRlICJ3aW5kZWYuaCIKICNpbmNsdWRlICJ3aW5iYXNlLmgiCisjaW5jbHVkZSAid2lubmxzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJvYmpiYXNlLmgiCiAjaW5jbHVkZSAid2luZ2RpLmgiCisjaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJleGNwdC5oIgorCiAjaW5jbHVkZSAiZGRyYXcuaCIKICNpbmNsdWRlICJkM2QuaCIKKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKICNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiAKLSNpbmNsdWRlICJkM2RfcHJpdmF0ZS5oIgotI2luY2x1ZGUgIm9wZW5nbF9wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKK1dJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOworV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoZGRyYXdfdGh1bmspOwogCiBzdGF0aWMgdm9pZCBkdW1wX21hdGVyaWFsKExQRDNETUFURVJJQUwgbWF0KQogewogICAgIERQUklOVEYoIiAgZHdTaXplIDogJWxkXG4iLCBtYXQtPmR3U2l6ZSk7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8zXzJUXzFUX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RNQVRFUklBTDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVVua25vd24gTWV0aG9kcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlF1ZXJ5SW50ZXJmYWNlCisgKgorICogUXVlcnlJbnRlcmZhY2UgZm9yIElEaXJlY3QzRE1hdGVyaWFsLiBDYW4gcXVlcnkgYWxsIElEaXJlY3QzRE1hdGVyaWFsCisgKiB2ZXJzaW9ucy4KKyAqCisgKiBQYXJhbXM6CisgKiAgcmlpZDogSW50ZXJmYWNlIGlkIHF1ZXJpZWQgZm9yCisgKiAgb2JqOiBBZGRyZXNzIHRvIHBhc3MgdGhlIGludGVyZmFjZSBwb2ludGVyIGJhY2sKKyAqCisgKiBSZXR1cm5zOgorICogIFNfT0sgb24gc3VjY2VzcworICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RNYXRlcmlhbEltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXMsJXApXG4iLCBUaGlzLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKIAogICAgICpvYnAgPSBOVUxMOwogCkBAIC03OSwyNyArMTA2LDQ2IEBACiAJcmV0dXJuIFNfT0s7CiAgICAgfQogICAgIEZJWE1FKCIoJXApOiBpbnRlcmZhY2UgZm9yIElJRCAlcyBOT1QgZm91bmQhXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKLSAgICByZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7CisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiB9CiAKLVVMT05HIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RNYXRlcmlhbEltcGxfM18yVF8xVF9BZGRSZWYoTFBESVJFQ1QzRE1BVEVSSUFMMyBpZmFjZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNETWF0ZXJpYWwzOjpBZGRSZWYKKyAqCisgKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50LgorICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3QzRE1hdGVyaWFsSW1wbF9BZGRSZWYoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwogCi0gICAgVFJBQ0UoIiglcC8lcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIGlmYWNlLCByZWYgLSAxKTsKKyAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmIC0gMSk7CiAKICAgICByZXR1cm4gcmVmOwogfQogCi1VTE9ORyBXSU5BUEkKLU1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzNfMlRfMVRfUmVsZWFzZShMUERJUkVDVDNETUFURVJJQUwzIGlmYWNlKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlJlbGVhc2UKKyAqCisgKiBSZWR1Y2VzIHRoZSByZWZjb3VudCBieSBvbmUuIElmIHRoZSByZWZjb3VudCBmYWxscyB0byAwLCB0aGUgb2JqZWN0CisgKiBpcyBkZXN0cm95ZWQKKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSBuZXcgcmVmY291bnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0M0RNYXRlcmlhbEltcGxfUmVsZWFzZShJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CiAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgaWZhY2UsIHJlZiArIDEpOworICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCByZWYgKyAxKTsKIAogICAgIGlmICghcmVmKSB7CiAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwpAQCAtMTA4LDM4ICsxNTQsOTAgQEAKICAgICByZXR1cm4gcmVmOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9Jbml0aWFsaXplKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEIGxwRGlyZWN0M0QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRE1hdGVyaWFsIE1ldGhvZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RNYXRlcmlhbDo6SW5pdGlhbGl6ZQorICoKKyAqIEEgbm8tb3AgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBQYXJhbXM6CisgKiAgRGlyZWN0M0Q6IFBvaW50ZXIgdG8gYSBEaXJlY3QzRCBpbnRlcmZhY2UKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNETWF0ZXJpYWxJbXBsX0luaXRpYWxpemUoSURpcmVjdDNETWF0ZXJpYWwgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqRGlyZWN0M0QpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApIG5vLW9wLi4uIVxuIiwgVGhpcywgaWZhY2UsIGxwRGlyZWN0M0QpOwotICAgIHJldHVybiBERF9PSzsKKworICAgIFRSQUNFKCIoJXApLT4oJXApIG5vLW9wLi4uIVxuIiwgVGhpcywgRGlyZWN0M0QpOworCisgICAgcmV0dXJuIEQzRF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUmVzZXJ2ZShMUERJUkVDVDNETUFURVJJQUwgaWZhY2UpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRE1hdGVyaWFsOjpSZXNlcnZlCisgKgorICogRGlyZWN0WCA1IHNkazogIlRoZSBJRGlyZWN0M0RNYXRlcmlhbDI6OlJlc2VydmUgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCIKKyAqIE9kZC4gVGhleSBzZWVtIHRvIGhhdmUgbWl4ZWQgdGhlaXIgaW50ZXJmYWNlcy4KKyAqCisgKiBSZXR1cm5zOgorICogIERERVJSX1VOU1VQUE9SVEVECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RNYXRlcmlhbEltcGxfUmVzZXJ2ZShJRGlyZWN0M0RNYXRlcmlhbCAqaWZhY2UpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgaWZhY2UpOwotICAgIFRSQUNFKCIoJXAvJXApLT4oKSBub3QgaW1wbGVtZW50ZWQuXG4iLCBUaGlzLCBpZmFjZSk7Ci0gICAgcmV0dXJuIEREX09LOworICAgIFRSQUNFKCIoJXApLT4oKSBub3QgaW1wbGVtZW50ZWRcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9VbnJlc2VydmUoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RNYXRlcmlhbDo6VW5yZXNlcnZlCisgKgorICogTm90IHN1cHBvcnRlZCB0b28KKyAqCisgKiBSZXR1cm5zOgorICogIERERVJSX1VOU1VQUE9SVEVECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RNYXRlcmlhbEltcGxfVW5yZXNlcnZlKElEaXJlY3QzRE1hdGVyaWFsICppZmFjZSkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPigpIG5vdCBpbXBsZW1lbnRlZC5cbiIsIFRoaXMsIGlmYWNlKTsKLSAgICByZXR1cm4gRERfT0s7CisgICAgVFJBQ0UoIiglcCktPigpIG5vdCBpbXBsZW1lbnRlZC5cbiIsIFRoaXMpOworCisgICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RNYXRlcmlhbEltcGxfM18yVF8xVF9TZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMIGxwTWF0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlNldE1hdGVyaWFsCisgKgorICogU2V0cyB0aGUgbWF0ZXJpYWwgZGVzY3JpcHRpb24KKyAqCisgKiBQYXJhbXM6CisgKiAgTWF0OiBNYXRlcmlhbCB0byBzZXQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXQgaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNETWF0ZXJpYWxJbXBsX1NldE1hdGVyaWFsKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUwgKmxwTWF0KQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscE1hdCk7Ci0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBNYXQpOworICAgIGlmIChUUkFDRV9PTihkM2Q3KSkKICAgICAgICAgZHVtcF9tYXRlcmlhbChscE1hdCk7CiAKICAgICAvKiBTdG9yZXMgdGhlIG1hdGVyaWFsICovCkBAIC0xNDksMTQgKzI0NywyNyBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzNfMlRfMVRfR2V0TWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNETWF0ZXJpYWwzOjpHZXRNYXRlcmlhbAorICoKKyAqIFJldHVybnMgdGhlIG1hdGVyaWFsIGFzc2lnbmVkIHRvIHRoaXMgaW50ZXJmYWNlCisgKgorICogUGFyYW1zOgorICogIE1hdDogUG9pbnRlciB0byBhIEQzRE1BVEVSSUFMIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgbWF0ZXJpYWwgZGVzY3JpcHRpb24KKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXQgaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNETWF0ZXJpYWxJbXBsX0dldE1hdGVyaWFsKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUwgKmxwTWF0KQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICAgRFdPUkQgZHdTaXplOwotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBNYXQpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBNYXQpOworICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgICBUUkFDRSgiICBSZXR1cm5pbmcgbWF0ZXJpYWwgOiAiKTsKICAgICAgICAgZHVtcF9tYXRlcmlhbCgmVGhpcy0+bWF0KTsKICAgICB9CkBAIC0xNjksMTAgKzI4MCwyNSBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzNfMlRfMVRfR2V0SGFuZGxlKExQRElSRUNUM0RNQVRFUklBTDMgaWZhY2UsCi0JCQkJCSAgICAgTFBESVJFQ1QzRERFVklDRTMgbHBEaXJlY3QzRERldmljZTMsCi0JCQkJCSAgICAgTFBEM0RNQVRFUklBTEhBTkRMRSBscEhhbmRsZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNETWF0ZXJpYWwzOjpHZXRIYW5kbGUKKyAqCisgKiBSZXR1cm5zIGEgaGFuZGxlIGZvciB0aGUgbWF0ZXJpYWwgaW50ZXJmYWNlLiBUaGUgaGFuZGxlIGlzIHNpbXBseSBhCisgKiBwb2ludGVyIHRvIHRoZSBtYXRlcmlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFBhcmFtczoKKyAqICBEaXJlY3QzRERldmljZTM6IFRoZSBkZXZpY2UgdGhpcyBoYW5kbGUgaXMgYXNzaWduZWQgdG8KKyAqICBIYW5kbGU6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGhhbmRsZSB0bworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIEhhbmRsZSBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0SGFuZGxlKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTMgKmxwRGlyZWN0M0REZXZpY2UzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRFUklBTEhBTkRMRSAqbHBIYW5kbGUpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgICBUUkFDRSgiKCVwLyVwKS0+KCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRGlyZWN0M0REZXZpY2UzLCBscEhhbmRsZSk7CkBAIC0xOTEsNyArMzE3LDcgQEAKIAkJCQkJTFBESVJFQ1QzRERFVklDRTIgbHBEaXJlY3QzRERldmljZTIsCiAJCQkJCUxQRDNETUFURVJJQUxIQU5ETEUgbHBIYW5kbGUpCiB7Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlMiwgbHBIYW5kbGUpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlMiwgbHBIYW5kbGUpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0SGFuZGxlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAJCQkJCUNPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UzLCBscERpcmVjdDNERGV2aWNlMiksCiAJCQkJCWxwSGFuZGxlKTsKQEAgLTIwMiw3ICszMjgsNyBAQAogCQkJCQlMUERJUkVDVDNEREVWSUNFIGxwRGlyZWN0M0REZXZpY2UsCiAJCQkJCUxQRDNETUFURVJJQUxIQU5ETEUgbHBIYW5kbGUpCiB7Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlLCBscEhhbmRsZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRGlyZWN0M0REZXZpY2UsIGxwSGFuZGxlKTsKICAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0dldEhhbmRsZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAJCQkJCUNPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTMsIGxwRGlyZWN0M0REZXZpY2UpLAogCQkJCQlscEhhbmRsZSk7CkBAIC0yMTMsNyArMzM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCiB7Ci0gICAgVFJBQ0UoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnApOwpAQCAtMjI0LDE5NSArMzUwLDEzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CiAgICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JwKTsKIH0KIAotVUxPTkcgV0lOQVBJCitzdGF0aWMgVUxPTkcgV0lOQVBJCiBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9BZGRSZWYoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfQWRkUmVmKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSkpOwogfQogCi1VTE9ORyBXSU5BUEkKK3N0YXRpYyBVTE9ORyBXSU5BUEkKIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0FkZFJlZihMUERJUkVDVDNETUFURVJJQUwgaWZhY2UpCiB7Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKICAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSkpOwogfQogCi1VTE9ORyBXSU5BUEkKK3N0YXRpYyBVTE9ORyBXSU5BUEkKIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1JlbGVhc2UoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKIH0KIAotVUxPTkcgV0lOQVBJCitzdGF0aWMgVUxPTkcgV0lOQVBJCiBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9SZWxlYXNlKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSkpOwogfQogCi1IUkVTVUxUIFdJTkFQSQorc3RhdGljIEhSRVNVTFQgV0lOQVBJCiBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9TZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfU2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWF0KTsKIH0KIAotSFJFU1VMVCBXSU5BUEkKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQogVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfU2V0TWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfU2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBNYXQpOwogfQogCi1IUkVTVUxUIFdJTkFQSQorc3RhdGljIEhSRVNVTFQgV0lOQVBJCiBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWF0KTsKIH0KIAotSFJFU1VMVCBXSU5BUEkKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQogVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0TWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKIHsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBNYXQpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJTWF0cmlhbDIgc3RhdGljIGZ1bmN0aW9ucwotICovCi1zdGF0aWMgdm9pZCBhY3RpdmF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIFRoaXMpIHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYXRlcmlhbF9hY3RpdmF0ZQorICoKKyAqIFVzZXMgSURpcmVjdDNERGV2aWNlNzo6U2V0TWF0ZXJpYWwgdG8gYWN0aXZhdGUgdGhlIG1hdGVyaWFsCisgKgorICogUGFyYW1zOgorICogIFRoaXM6IFBvaW50ZXIgdG8gdGhlIG1hdGVyaWFsIGltcGxlbWVudGF0aW9uIHRvIGFjdGl2YXRlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtYXRlcmlhbF9hY3RpdmF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIFRoaXMpCit7CisgICAgRDNETUFURVJJQUw3IGQzZDdtYXQ7CisKICAgICBUUkFDRSgiQWN0aXZhdGluZyBtYXRlcmlhbCAlcFxuIiwgVGhpcyk7CisgICAgZDNkN21hdC51LmRpZmZ1c2UgPSBUaGlzLT5tYXQudS5kaWZmdXNlOworICAgIGQzZDdtYXQudTEuYW1iaWVudCA9IFRoaXMtPm1hdC51MS5hbWJpZW50OworICAgIGQzZDdtYXQudTIuc3BlY3VsYXIgPSBUaGlzLT5tYXQudTIuc3BlY3VsYXI7CisgICAgZDNkN21hdC51My5lbWlzc2l2ZSA9IFRoaXMtPm1hdC51My5lbWlzc2l2ZTsKKyAgICBkM2Q3bWF0LnU0LnBvd2VyID0gVGhpcy0+bWF0LnU0LnBvd2VyOwogCi0gICAgLyogU2V0IHRoZSBjdXJyZW50IE1hdGVyaWFsICovCi0gICAgRU5URVJfR0woKTsKLSAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssCi0JCSBHTF9ESUZGVVNFLAotCQkgKGZsb2F0ICopICYoVGhpcy0+bWF0LnUuZGlmZnVzZSkpOwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywKLQkJIEdMX0FNQklFTlQsCi0JCSAoZmxvYXQgKikgJihUaGlzLT5tYXQudTEuYW1iaWVudCkpOwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywKLQkJIEdMX1NQRUNVTEFSLAotCQkgKGZsb2F0ICopICYoVGhpcy0+bWF0LnUyLnNwZWN1bGFyKSk7Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLAotCQkgR0xfRU1JU1NJT04sCi0JCSAoZmxvYXQgKikgJihUaGlzLT5tYXQudTMuZW1pc3NpdmUpKTsKLSAgICBMRUFWRV9HTCgpOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCURQUklOVEYoIiAtIHNpemUgIDogJWxkXG4iLCBUaGlzLT5tYXQuZHdTaXplKTsKLQlEUFJJTlRGKCIgLSBkaWZmdXNlIDogIik7IGR1bXBfRDNEQ09MT1JWQUxVRSgmKFRoaXMtPm1hdC51LmRpZmZ1c2UpKTsgRFBSSU5URigiXG4iKTsKLQlEUFJJTlRGKCIgLSBhbWJpZW50IDogIik7IGR1bXBfRDNEQ09MT1JWQUxVRSgmKFRoaXMtPm1hdC51MS5hbWJpZW50KSk7IERQUklOVEYoIlxuIik7Ci0JRFBSSU5URigiIC0gc3BlY3VsYXI6ICIpOyBkdW1wX0QzRENPTE9SVkFMVUUoJihUaGlzLT5tYXQudTIuc3BlY3VsYXIpKTsgRFBSSU5URigiXG4iKTsKLQlEUFJJTlRGKCIgLSBlbWlzc2l2ZTogIik7IGR1bXBfRDNEQ09MT1JWQUxVRSgmKFRoaXMtPm1hdC51My5lbWlzc2l2ZSkpOyBEUFJJTlRGKCJcbiIpOwotCURQUklOVEYoIiAtIHBvd2VyIDogJWZcbiIsIFRoaXMtPm1hdC51NC5wb3dlcik7Ci0JRFBSSU5URigiIC0gdGV4dHVyZSBoYW5kbGUgOiAlMDhseFxuIiwgKERXT1JEKVRoaXMtPm1hdC5oVGV4dHVyZSk7Ci0gICAgfQorICAgIElEaXJlY3QzRERldmljZTdfU2V0TWF0ZXJpYWwoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+YWN0aXZlX2RldmljZSwgSURpcmVjdDNERGV2aWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZDNkN21hdCk7CiB9CiAKLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodHlwZW9mKFZUQUJMRV9JRGlyZWN0M0RNYXRlcmlhbDMuZnVuKSkKLSNlbHNlCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodm9pZCopCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IElEaXJlY3QzRE1hdGVyaWFsM1Z0YmwgVlRBQkxFX0lEaXJlY3QzRE1hdGVyaWFsMyA9Citjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDNWdGJsIElEaXJlY3QzRE1hdGVyaWFsM19WdGJsID0KIHsKLSAgICBYQ0FTVChRdWVyeUludGVyZmFjZSkgTWFpbl9JRGlyZWN0M0RNYXRlcmlhbEltcGxfM18yVF8xVF9RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpIE1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzNfMlRfMVRfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpIE1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzNfMlRfMVRfUmVsZWFzZSwKLSAgICBYQ0FTVChTZXRNYXRlcmlhbCkgTWFpbl9JRGlyZWN0M0RNYXRlcmlhbEltcGxfM18yVF8xVF9TZXRNYXRlcmlhbCwKLSAgICBYQ0FTVChHZXRNYXRlcmlhbCkgTWFpbl9JRGlyZWN0M0RNYXRlcmlhbEltcGxfM18yVF8xVF9HZXRNYXRlcmlhbCwKLSAgICBYQ0FTVChHZXRIYW5kbGUpIE1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzNfMlRfMVRfR2V0SGFuZGxlLAorICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1F1ZXJ5SW50ZXJmYWNlLAorICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9BZGRSZWYsCisgICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0M0RNYXRlcmlhbDMgTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1NldE1hdGVyaWFsLAorICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9HZXRNYXRlcmlhbCwKKyAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0SGFuZGxlLAogfTsKIAotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSN1bmRlZiBYQ0FTVAotI2VuZGlmCi0KLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh0eXBlb2YoVlRBQkxFX0lEaXJlY3QzRE1hdGVyaWFsMi5mdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh2b2lkKikKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgSURpcmVjdDNETWF0ZXJpYWwyVnRibCBWVEFCTEVfSURpcmVjdDNETWF0ZXJpYWwyID0KK2NvbnN0IElEaXJlY3QzRE1hdGVyaWFsMlZ0YmwgSURpcmVjdDNETWF0ZXJpYWwyX1Z0YmwgPQogewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9SZWxlYXNlLAotICAgIFhDQVNUKFNldE1hdGVyaWFsKSBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9TZXRNYXRlcmlhbCwKLSAgICBYQ0FTVChHZXRNYXRlcmlhbCkgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfR2V0TWF0ZXJpYWwsCi0gICAgWENBU1QoR2V0SGFuZGxlKSBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRIYW5kbGUsCisgICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KKyAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9RdWVyeUludGVyZmFjZSwKKyAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9BZGRSZWYsCisgICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfUmVsZWFzZSwKKyAgICAvKioqIElEaXJlY3QzRE1hdGVyaWFsMiBNZXRob2RzICoqKi8KKyAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9TZXRNYXRlcmlhbCwKKyAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRNYXRlcmlhbCwKKyAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRIYW5kbGUsCiB9OwogCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNETWF0ZXJpYWwuZnVuKSkKLSNlbHNlCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodm9pZCopCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IElEaXJlY3QzRE1hdGVyaWFsVnRibCBWVEFCTEVfSURpcmVjdDNETWF0ZXJpYWwgPQorY29uc3QgSURpcmVjdDNETWF0ZXJpYWxWdGJsIElEaXJlY3QzRE1hdGVyaWFsX1Z0YmwgPQogewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9SZWxlYXNlLAotICAgIFhDQVNUKEluaXRpYWxpemUpIE1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfSW5pdGlhbGl6ZSwKLSAgICBYQ0FTVChTZXRNYXRlcmlhbCkgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfU2V0TWF0ZXJpYWwsCi0gICAgWENBU1QoR2V0TWF0ZXJpYWwpIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0dldE1hdGVyaWFsLAotICAgIFhDQVNUKEdldEhhbmRsZSkgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0SGFuZGxlLAotICAgIFhDQVNUKFJlc2VydmUpIE1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUmVzZXJ2ZSwKLSAgICBYQ0FTVChVbnJlc2VydmUpIE1haW5fSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfVW5yZXNlcnZlLAorICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCisgICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUXVlcnlJbnRlcmZhY2UsCisgICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfQWRkUmVmLAorICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0M0RNYXRlcmlhbDEgTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX0luaXRpYWxpemUsCisgICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfU2V0TWF0ZXJpYWwsCisgICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0TWF0ZXJpYWwsCisgICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0SGFuZGxlLAorICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9SZXNlcnZlLAorICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9VbnJlc2VydmUKIH07Ci0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jdW5kZWYgWENBU1QKLSNlbmRpZgotCi0KLQotCi1IUkVTVUxUIGQzZG1hdGVyaWFsX2NyZWF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwgKipvYmosIElEaXJlY3REcmF3SW1wbCAqZDNkKQotewotICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqb2JqZWN0OwotCi0gICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RNYXRlcmlhbEltcGwpKTsKLSAgICBpZiAob2JqZWN0ID09IE5VTEwpIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKLQotICAgIG9iamVjdC0+cmVmID0gMTsKLSAgICBvYmplY3QtPmQzZCA9IGQzZDsKLSAgICBvYmplY3QtPmFjdGl2YXRlID0gYWN0aXZhdGU7Ci0gICAgCi0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsLCAgVlRBQkxFX0lEaXJlY3QzRE1hdGVyaWFsKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwyLCBWVEFCTEVfSURpcmVjdDNETWF0ZXJpYWwyKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwzLCBWVEFCTEVfSURpcmVjdDNETWF0ZXJpYWwzKTsKLQotICAgICpvYmogPSBvYmplY3Q7Ci0gICAgCi0gICAgVFJBQ0UoIiBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsICpvYmopOwotICAgIAotICAgIHJldHVybiBEM0RfT0s7Ci19CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L29wZW5nbF9wcml2YXRlLmggYi9kbGxzL2RkcmF3L29wZW5nbF9wcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWFmZDQuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9vcGVuZ2xfcHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qIE1FU0EgcHJpdmF0ZSBpbmNsdWRlIGZpbGUKLSAqIENvcHlyaWdodCAoYykgMTk5OCBMaW9uZWwgVUxNRVIKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHN0cnVjdHVyZXMgdGhhdCBhcmUgbm90IGV4cG9ydGVkCi0gKiB0aHJvdWdoIGQzZC5oIGFuZCBhbGwgY29tbW9uIG1hY3Jvcy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKLSAqLwotCi0jaWZuZGVmIF9fR1JBUEhJQ1NfV0lORV9NRVNBX1BSSVZBVEVfSAotI2RlZmluZSBfX0dSQVBISUNTX1dJTkVfTUVTQV9QUklWQVRFX0gKLQotI2luY2x1ZGUgImQzZF9wcml2YXRlLmgiCi0KLSNpZmRlZiBIQVZFX09QRU5HTAotCi0jaW5jbHVkZSAiZ2xfcHJpdmF0ZS5oIgotCi0vKiBYMTEgbG9ja2luZyAqLwotCi1leHRlcm4gdm9pZCAoKndpbmVfdHN4MTFfbG9ja19wdHIpKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCp3aW5lX3RzeDExX3VubG9ja19wdHIpKHZvaWQpOwotCi0vKiBBcyBHTFggcmVsaWVzIG9uIFgsIHRoaXMgaXMgbmVlZGVkICovCi0jZGVmaW5lIEVOVEVSX0dMKCkgd2luZV90c3gxMV9sb2NrX3B0cigpCi0jZGVmaW5lIExFQVZFX0dMKCkgd2luZV90c3gxMV91bmxvY2tfcHRyKCkKLQotZXh0ZXJuIGNvbnN0IEdVSUQgSUlEX0QzRERFVklDRV9PcGVuR0w7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgU1VSRkFDRV9HTCwKLSAgICBTVVJGQUNFX01FTU9SWSwKLSAgICBTVVJGQUNFX01FTU9SWV9ESVJUWQotfSBTVVJGQUNFX1NUQVRFOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgJ2QzZF9wcml2YXRlJyBmaWVsZCBvZiB0aGUgSURpcmVjdERyYXcgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RHTEltcGwKLXsKLSAgICBpbnQgZHVtbXk7IC8qIEVtcHR5IGZvciB0aGUgbW9tZW50ICovCi19IElEaXJlY3QzREdMSW1wbDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlICdwcml2YXRlJyBmaWVsZCBvZiB0aGUgSURpcmVjdERyYXdTdXJmYWNlSW1wbCBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IElEaXJlY3QzRFRleHR1cmVHTEltcGwKLXsKLSAgICBHTHVpbnQgdGV4X25hbWU7Ci0gICAgQk9PTEVBTiBsb2FkZWQ7IC8qIEZvciB0aGUgbW9tZW50LCB0aGlzIGlzIGhlcmUuLiBTaG91bGQgYmUgcGFydCBvZiBzdXJmYWNlIG1hbmFnZW1lbnQgdGhvdWdoICovCi0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqbWFpbjsgLyogUG9pbnRlciB0byB0aGUgJ21haW4nIHN1cmZhY2Ugb2YgdGhlIG1pcC1tYXAgc2V0ICovCi0gICAgCi0gICAgLyogVGV4dHVyZSB1cGxvYWQgbWFuYWdlbWVudCAqLwotICAgIEJPT0xFQU4gaW5pdGlhbF91cGxvYWRfZG9uZTsKLSAgICBTVVJGQUNFX1NUQVRFIGRpcnR5X2ZsYWc7Ci0KLSAgICAvKiBUaGlzIGlzIHVzZWQgdG8gb3B0aW1pemUgZGlydHkgY2hlY2tpbmcgaW4gY2FzZSBvZiBtaXBtYXBwaW5nLgotICAgICAgIE5vdGUgdGhhdCBhIGJpdG1hcCBjb3VsZCBoYXZlIGJlZW4gdXNlZCBidXQgaXQgd2FzIG5vdCB3b3J0aCB0aGUgcGFpbiBhcyBpdCB3aWxsIGJlIHZlcnkgcmFyZQotICAgICAgIHRvIGhhdmUgb25seSBvbmUgbWlwbWFwIGxldmVsIGNoYW5nZS4uLgotCi0gICAgICAgVGhlIF9fZ2xvYmFsX2RpcnR5X2ZsYWcgd2lsbCBvbmx5IGJlIHNldCBmb3IgdGhlIG1haW4gbWlwbWFwIGxldmVsLgotICAgICovCi0gICAgU1VSRkFDRV9TVEFURSBfX2dsb2JhbF9kaXJ0eV9mbGFnOwotICAgIFNVUkZBQ0VfU1RBVEUgKmdsb2JhbF9kaXJ0eV9mbGFnOwotICAgIAotICAgIC8qIFRoaXMgaXMgdG8gb3B0aW1pemUgdGhlICdwZXItdGV4dHVyZScgcGFyYW1ldGVycy4gKi8KLSAgICBEV09SRCAqdGV4X3BhcmFtZXRlcnM7Ci0gICAgCi0gICAgLyogU3VyZmFjZSBvcHRpbWl6YXRpb24gKi8KLSAgICB2b2lkICpzdXJmYWNlX3B0cjsKLQotICAgIC8qIFVzZWQgdG8gZGV0ZWN0IGEgY2hhbmdlIGluIGludGVybmFsIGZvcm1hdCB3aGVuIGdvaW5nIGZyb20gbm9uLUNLIHRleHR1cmUgdG8gQ0stZWQgdGV4dHVyZSAqLwotICAgIEdMZW51bSBjdXJyZW50X2ludGVybmFsX2Zvcm1hdDsKLSAgICAKLSAgICAvKiBUaGlzIGlzIGZvciBub3cgdXNlZCB0byBvdmVycmlkZSAnc3RhbmRhcmQnIHN1cmZhY2Ugc3R1ZmYgdG8gYmUgYXMgdHJhbnNwYXJlbnQgYXMgcG9zc2libGUgKi8KLSAgICB2b2lkICgqZmluYWxfcmVsZWFzZSkoc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMpOwotICAgIHZvaWQgKCpsb2NrX3VwZGF0ZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgTFBDUkVDVCBwUmVjdCwgRFdPUkQgZHdGbGFncyk7Ci0gICAgdm9pZCAoKnVubG9ja191cGRhdGUpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcFJlY3QpOwotICAgIHZvaWQgKCpzZXRfcGFsZXR0ZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKTsKLX0gSURpcmVjdDNEVGV4dHVyZUdMSW1wbDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBHTF9UUkFOU0ZPUk1fTk9ORSA9IDAsCi0gICAgR0xfVFJBTlNGT1JNX09SVEhPLAotICAgIEdMX1RSQU5TRk9STV9OT1JNQUwsCi0gICAgR0xfVFJBTlNGT1JNX1ZFUlRFWEJVRkZFUgotfSBHTF9UUkFOU0ZPUk1fU1RBVEU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgV0lORV9HTF9CVUZGRVJfQkFDSyA9IDAsCi0gICAgV0lORV9HTF9CVUZGRVJfRlJPTlQKLX0gV0lORV9HTF9CVUZGRVJfVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNERGV2aWNlR0xJbXBsCi17Ci0gICAgc3RydWN0IElEaXJlY3QzRERldmljZUltcGwgcGFyZW50OwotICAgIAotICAgIEdMWENvbnRleHQgZ2xfY29udGV4dDsKLQotICAgIC8qIFRoaXMgc3RvcmVzIHRoZSB0ZXh0dXJlcyB3aGljaCBhcmUgYWN0dWFsbHkgYm91bmQgdG8gdGhlIEdMIGNvbnRleHQgKi8KLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpjdXJyZW50X2JvdW5kX3RleHR1cmVbTUFYX1RFWFRVUkVTXTsKLQotICAgIC8qIFRoZSBsYXN0IHR5cGUgb2YgdmVydGV4IGRyYXduICovCi0gICAgR0xfVFJBTlNGT1JNX1NUQVRFIHRyYW5zZm9ybV9zdGF0ZTsKLQotICAgIC8qIFVzZWQgdG8gaGFuZGxlIGZvZ2dpbmcgZmFzdGVyLi4uICovCi0gICAgQllURSBmb2dfdGFibGVbMyAqIDB4MTAwMDBdOyAvKiAzIGlzIGZvciBSLCBHIGFuZCBCCi0JCQkJICAgIDB4MTAwMDAgaXMgMHhGRiBmb3IgdGhlIHZlcnRleCBjb2xvciBhbmQKLQkJCQkgICAgICAgICAgICAgICAweEZGIGZvciB0aGUgZm9nIGludGVuc2l0eSAqLwotICAgIAotICAgIERpc3BsYXkgICpkaXNwbGF5OwotICAgIERyYXdhYmxlIGRyYXdhYmxlOwotCi0gICAgLyogVmFyaWFibGVzIHVzZWQgZm9yIHRoZSBmbHVzaCB0byBmcmFtZS1idWZmZXIgY29kZSB1c2luZyB0aGUgdGV4dHVyaW5nIGNvZGUgKi8KLSAgICBHTHVpbnQgdW5sb2NrX3RleDsKLSAgICB2b2lkICpzdXJmYWNlX3B0cjsKLSAgICBHTGVudW0gY3VycmVudF9pbnRlcm5hbF9mb3JtYXQ7Ci0KLSAgICAvKiAwIGlzIGJhY2stYnVmZmVyLCAxIGlzIGZyb250LWJ1ZmZlciAqLwotICAgIFNVUkZBQ0VfU1RBVEUgc3RhdGVbMl07Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqbG9ja19zdXJmWzJdOwotICAgIFJFQ1QgbG9ja19yZWN0WzJdOwotICAgIC8qIFRoaXMgaXMganVzdCBoZXJlIHRvIHByaW50LW91dCBhIG5pY2Ugd2FybmluZyBpZiB3ZSBoYXZlIHR3byBzdWNjZXNzaXZlIGxvY2tzICovCi0gICAgQk9PTEVBTiBsb2NrX3JlY3RfdmFsaWRbMl07Ci0KLSAgICAvKiBUaGlzIGlzIHVzZWQgdG8gb3B0aW1pemUgc29tZSBzdHVmZiAqLwotICAgIERXT1JEIHByZXZfY2xlYXJfY29sb3I7Ci0gICAgRFdPUkQgcHJldl9jbGVhcl9zdGVuY2lsOwotICAgIEQzRFZBTFVFIHByZXZfY2xlYXJfWjsKLSAgICBCT09MRUFOIGRlcHRoX21hc2ssIGRlcHRoX3Rlc3QsIGFscGhhX3Rlc3QsIHN0ZW5jaWxfdGVzdCwgY3VsbF9mYWNlLCBsaWdodGluZywgYmxlbmRpbmcsIGZvZ2dpbmc7Ci0gICAgR0xlbnVtIGN1cnJlbnRfYWxwaGFfdGVzdF9mdW5jOwotICAgIEdMY2xhbXBmIGN1cnJlbnRfYWxwaGFfdGVzdF9yZWY7Ci0gICAgR0xlbnVtIGN1cnJlbnRfdGV4X2VudjsKLSAgICBHTGVudW0gY3VycmVudF9hY3RpdmVfdGV4X3VuaXQ7Ci19IElEaXJlY3QzRERldmljZUdMSW1wbDsKLQotLyogVGhpcyBpcyBmb3IgdGhlIE9wZW5HTCBhZGRpdGlvbnMuLi4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdHJ1Y3QgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCBwYXJlbnQ7Ci0KLSAgICBEV09SRCBkd1ZlcnRleFR5cGVEZXNjOwotICAgIEQzRE1BVFJJWCB3b3JsZF9tYXQsIHZpZXdfbWF0LCBwcm9qX21hdDsKLSAgICBMUFZPSUQgdmVydGljZXM7Ci19IElEaXJlY3QzRFZlcnRleEJ1ZmZlckdMSW1wbDsKLQotLyogVGhpcyBpcyBmb3IgR0wgZXh0ZW5zaW9uIHN1cHBvcnQuCi0gICAKLSAgIFRoaXMgY2FuIGNvbnRhaW4gZWl0aGVyIG9ubHkgYSBib29sZWFuIGlmIG5vIGZ1bmN0aW9uIHBvaW50ZXIgZXhpc3RzIG9yIGEgc2V0Ci0gICBvZiBmdW5jdGlvbiBwb2ludGVycy4KLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogTWlycm9yZWQgUmVwZWF0ICovCi0gICAgQk9PTEVBTiBtaXJyb3JlZF9yZXBlYXQ7Ci0gICAgLyogTWlwbWFwIGxvZC1iaWFzICovCi0gICAgQk9PTEVBTiBtaXBtYXBfbG9kYmlhczsKLSAgICAvKiBNdWx0aS10ZXh0dXJpbmcgKi8KLSAgICBHTGludCBtYXhfdGV4dHVyZV91bml0czsKLSAgICB2b2lkICgqZ2xBY3RpdmVUZXh0dXJlKShHTGVudW0gdGV4dHVyZSk7Ci0gICAgdm9pZCAoKmdsTXVsdGlUZXhDb29yZFs0XSkoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Ci0gICAgdm9pZCAoKmdsQ2xpZW50QWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpOwotICAgIC8qIFMzVEMvRFhUTiBjb21wcmVzc2VkIHRleHR1cmUgKi8KLSAgICBCT09MRUFOIHMzdGNfY29tcHJlc3NlZF90ZXh0dXJlOwotICAgIHZvaWQgKCpnbENvbXByZXNzZWRUZXhJbWFnZTJEKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Ci0gICAgdm9pZCAoKmdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotfSBHTF9FWFRFTlNJT05TX0xJU1Q7IAotZXh0ZXJuIEdMX0VYVEVOU0lPTlNfTElTVCBHTF9leHRlbnNpb25zOwotCi0vKiBBbGwgbm9uLXN0YXRpYyBmdW5jdGlvbnMgJ2V4cG9ydGVkJyBieSB2YXJpb3VzIHN1Yi1vYmplY3RzICovCi1leHRlcm4gSFJFU1VMVCBkaXJlY3QzZF9jcmVhdGUoSURpcmVjdERyYXdJbXBsICpUaGlzKTsKLWV4dGVybiBIUkVTVUxUIGQzZHRleHR1cmVfY3JlYXRlKElEaXJlY3REcmF3SW1wbCAqZDNkLCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmLCBCT09MRUFOIGF0X2NyZWF0aW9uLCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICptYWluX3N1cmYpOwotZXh0ZXJuIEhSRVNVTFQgZDNkbGlnaHRfY3JlYXRlKElEaXJlY3QzRExpZ2h0SW1wbCAqKm9iaiwgSURpcmVjdERyYXdJbXBsICpkM2QpOwotZXh0ZXJuIEhSRVNVTFQgZDNkZXhlY3V0ZWJ1ZmZlcl9jcmVhdGUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKipvYmosIElEaXJlY3REcmF3SW1wbCAqZDNkLCBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2RkZXYsIExQRDNERVhFQ1VURUJVRkZFUkRFU0MgbHBEZXNjKTsKLWV4dGVybiBIUkVTVUxUIGQzZG1hdGVyaWFsX2NyZWF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwgKipvYmosIElEaXJlY3REcmF3SW1wbCAqZDNkKTsKLWV4dGVybiBIUkVTVUxUIGQzZHZpZXdwb3J0X2NyZWF0ZShJRGlyZWN0M0RWaWV3cG9ydEltcGwgKipvYmosIElEaXJlY3REcmF3SW1wbCAqZDNkKTsKLWV4dGVybiBIUkVTVUxUIGQzZHZlcnRleGJ1ZmZlcl9jcmVhdGUoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCAqKm9iaiwgSURpcmVjdERyYXdJbXBsICpkM2QsIExQRDNEVkVSVEVYQlVGRkVSREVTQyBscEQzRFZlcnRCdWZEZXNjLCBEV09SRCBkd0ZsYWdzKTsKLWV4dGVybiBIUkVTVUxUIGQzZGRldmljZV9jcmVhdGUoSURpcmVjdDNERGV2aWNlSW1wbCAqKm9iaiwgSURpcmVjdERyYXdJbXBsICpkM2QsIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZhY2UsIGludCB2ZXJzaW9uKTsKLQotLyogVXNlZCBmb3IgRGlyZWN0M0QgdG8gcmVxdWVzdCB0aGUgZGV2aWNlIHRvIGVudW1lcmF0ZSBpdHNlbGYgKi8KLWV4dGVybiBIUkVTVUxUIGQzZGRldmljZV9lbnVtZXJhdGUoTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIGNiLCBMUFZPSUQgY29udGV4dCwgRFdPUkQgdmVyc2lvbikgOwotZXh0ZXJuIEhSRVNVTFQgZDNkZGV2aWNlX2VudW1lcmF0ZTcoTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLNyBjYiwgTFBWT0lEIGNvbnRleHQpIDsKLWV4dGVybiBIUkVTVUxUIGQzZGRldmljZV9maW5kKElEaXJlY3REcmF3SW1wbCAqZDNkLCBMUEQzREZJTkRERVZJQ0VTRUFSQ0ggbHBEM0RERlMsIExQRDNERklORERFVklDRVJFU1VMVCBscGxwRDNERGV2aWNlKTsKLQotLyogVXNlZCBieSB0aGUgRExMIGluaXQgcm91dGluZSB0byBzZXQtdXAgdGhlIEdMIGNvbnRleHQgYW5kIHN0dWZmIHByb3Blcmx5ICovCi1leHRlcm4gQk9PTCBkM2RkZXZpY2VfaW5pdF9hdF9zdGFydHVwKHZvaWQgKmdsX2hhbmRsZSk7Ci0KLS8qIFVzZWQgdG8gdXBsb2FkIHRoZSB0ZXh0dXJlICovCi1leHRlcm4gSFJFU1VMVCBnbHRleF91cGxvYWRfdGV4dHVyZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLCBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2RkZXYsIERXT1JEIHN0YWdlKSA7Ci0KLS8qIFVzZWQgdG8gZ2V0IHRoZSB0ZXh0dXJlIG5hbWUgKi8KLWV4dGVybiBHTHVpbnQgZ2x0ZXhfZ2V0X3RleF9uYW1lKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMpIDsKLQotLyogVXNlZCB0byBzZXQtdXAgb3VyIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uICovCi1leHRlcm4gdm9pZCBkM2RkZXZpY2Vfc2V0X29ydGhvKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMpIDsKLQotLyogUmVuZGVyaW5nIHN0YXRlIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBzZXRfcmVuZGVyX3N0YXRlKElEaXJlY3QzRERldmljZUltcGwqIFRoaXMsIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwgU1RBVEVCTE9DSyAqbHBTdGF0ZUJsb2NrKTsKLWV4dGVybiB2b2lkIHN0b3JlX3JlbmRlcl9zdGF0ZShJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLCBEM0RSRU5ERVJTVEFURVRZUEUgZHdSZW5kZXJTdGF0ZVR5cGUsIERXT1JEIGR3UmVuZGVyU3RhdGUsIFNUQVRFQkxPQ0sqIGxwU3RhdGVCbG9jayk7Ci1leHRlcm4gdm9pZCBnZXRfcmVuZGVyX3N0YXRlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwgTFBEV09SRCBscGR3UmVuZGVyU3RhdGUsIFNUQVRFQkxPQ0sqIGxwU3RhdGVCbG9jayk7Ci1leHRlcm4gdm9pZCBhcHBseV9yZW5kZXJfc3RhdGUoSURpcmVjdDNERGV2aWNlSW1wbCogVGhpcywgU1RBVEVCTE9DSyogbHBTdGF0ZUJsb2NrKTsKLQotLyogTWVtb3J5IHRvIHRleHR1cmUgY29udmVyc2lvbiBjb2RlLiBTcGxpdCBpbiB0aHJlZSBmdW5jdGlvbnMgdG8gZG8gc29tZSBvcHRpbWl6YXRpb25zLiAqLwotZXh0ZXJuIEhSRVNVTFQgdXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeV9pbml0KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZhY2UsIEdMdWludCBsZXZlbCwgR0xlbnVtICpwcmV2X2ludGVybmFsX2Zvcm1hdCwKLQkJCQkJCSBCT09MRUFOIG5lZWRfdG9fYWxsb2MsIEJPT0xFQU4gbmVlZF9hbHBoYV9jaywgRFdPUkQgdGV4X3dpZHRoLCBEV09SRCB0ZXhfaGVpZ2h0KTsKLWV4dGVybiBIUkVTVUxUIHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnkoUkVDVCAqcmVjdCwgRFdPUkQgeG9mZnNldCwgRFdPUkQgeW9mZnNldCwgdm9pZCAqKnRlbXBfYnVmZmVyKTsKLWV4dGVybiBIUkVTVUxUIHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnlfcmVsZWFzZSh2b2lkKTsKLQotLyogU29tZSB1dGlsaXRpZXMgZnVuY3Rpb25zIG5lZWRlZCB0byBiZSBzaGFyZWQuLiAqLwotZXh0ZXJuIEdMZW51bSBjb252ZXJ0X0QzRF9jb21wYXJlX3RvX0dMKEQzRENNUEZVTkMgZHdSZW5kZXJTdGF0ZSkgOwotCi0jZW5kaWYgLyogSEFWRV9PUEVOR0wgKi8KLQotI2VuZGlmIC8qIF9fR1JBUEhJQ1NfV0lORV9NRVNBX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9vcGVuZ2xfdXRpbHMuYyBiL2RsbHMvZGRyYXcvb3BlbmdsX3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjAyMTkuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9vcGVuZ2xfdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMjYgKzAsMCBAQAotLyogRGlyZWN0M0QgQ29tbW9uIGZ1bmN0aW9ucwotICogQ29weXJpZ2h0IChjKSAxOTk4IExpb25lbCBVTE1FUgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgTUVTQSBjb21tb24gY29kZQotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jZGVmaW5lIE5PTkFNRUxFU1NVTklPTgotI2RlZmluZSBOT05BTUVMRVNTU1RSVUNUCi0jaW5jbHVkZSAid2luZGVmLmgiCi0jaW5jbHVkZSAid2luYmFzZS5oIgotI2luY2x1ZGUgIm9iamJhc2UuaCIKLSNpbmNsdWRlICJ3aW5nZGkuaCIKLSNpbmNsdWRlICJkZHJhdy5oIgotI2luY2x1ZGUgImQzZC5oIgotI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKLQotI2luY2x1ZGUgIm9wZW5nbF9wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotR0xlbnVtIGNvbnZlcnRfRDNEX2NvbXBhcmVfdG9fR0woRDNEQ01QRlVOQyBkd1JlbmRlclN0YXRlKQotewotICAgIHN3aXRjaCAoZHdSZW5kZXJTdGF0ZSkgewotICAgICAgICBjYXNlIEQzRENNUF9ORVZFUjogcmV0dXJuIEdMX05FVkVSOwotCWNhc2UgRDNEQ01QX0xFU1M6IHJldHVybiBHTF9MRVNTOwotCWNhc2UgRDNEQ01QX0VRVUFMOiByZXR1cm4gR0xfRVFVQUw7Ci0JY2FzZSBEM0RDTVBfTEVTU0VRVUFMOiByZXR1cm4gR0xfTEVRVUFMOwotCWNhc2UgRDNEQ01QX0dSRUFURVI6IHJldHVybiBHTF9HUkVBVEVSOwotCWNhc2UgRDNEQ01QX05PVEVRVUFMOiByZXR1cm4gR0xfTk9URVFVQUw7Ci0JY2FzZSBEM0RDTVBfR1JFQVRFUkVRVUFMOiByZXR1cm4gR0xfR0VRVUFMOwotCWNhc2UgRDNEQ01QX0FMV0FZUzogcmV0dXJuIEdMX0FMV0FZUzsKLQlkZWZhdWx0OiBFUlIoIlVuZXhwZWN0ZWQgY29tcGFyZSB0eXBlICVkICFcbiIsIGR3UmVuZGVyU3RhdGUpOwotICAgIH0KLSAgICByZXR1cm4gR0xfQUxXQVlTOwotfQotCi1HTGVudW0gY29udmVydF9EM0Rfc3RlbmNpbG9wX3RvX0dMKEQzRFNURU5DSUxPUCBkd1JlbmRlclN0YXRlKQotewotICAgIHN3aXRjaCAoZHdSZW5kZXJTdGF0ZSkgewotICAgICAgICBjYXNlIEQzRFNURU5DSUxPUF9LRUVQOiByZXR1cm4gR0xfS0VFUDsKLSAgICAgICAgY2FzZSBEM0RTVEVOQ0lMT1BfWkVSTzogcmV0dXJuIEdMX1pFUk87Ci0gICAgICAgIGNhc2UgRDNEU1RFTkNJTE9QX1JFUExBQ0U6IHJldHVybiBHTF9SRVBMQUNFOwotICAgICAgICBjYXNlIEQzRFNURU5DSUxPUF9JTkNSU0FUOiByZXR1cm4gR0xfSU5DUjsKLSAgICAgICAgY2FzZSBEM0RTVEVOQ0lMT1BfREVDUlNBVDogcmV0dXJuIEdMX0RFQ1I7Ci0gICAgICAgIGNhc2UgRDNEU1RFTkNJTE9QX0lOVkVSVDogcmV0dXJuIEdMX0lOVkVSVDsKLSAgICAgICAgY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUjogV0FSTigiRDNEU1RFTkNJTE9QX0lOQ1Igbm90IHByb3Blcmx5IGhhbmRsZWQgIVxuIik7IHJldHVybiBHTF9JTkNSOwotICAgICAgICBjYXNlIEQzRFNURU5DSUxPUF9ERUNSOiBXQVJOKCJEM0RTVEVOQ0lMT1BfREVDUiBub3QgcHJvcGVybHkgaGFuZGxlZCAhXG4iKTsgcmV0dXJuIEdMX0RFQ1I7Ci0gICAgICAgIGRlZmF1bHQ6IEVSUigiVW5leHBlY3RlZCBjb21wYXJlIHR5cGUgJWQgIVxuIiwgZHdSZW5kZXJTdGF0ZSk7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBHTF9LRUVQOwotfQotCi1HTGVudW0gY29udmVydF9EM0RfYmxlbmRvcF90b19HTChEM0RCTEVORCBkd1JlbmRlclN0YXRlKQotewotICAgIHN3aXRjaCAoKEQzREJMRU5EKSBkd1JlbmRlclN0YXRlKSB7Ci0gICAgICAgIGNhc2UgRDNEQkxFTkRfWkVSTzogcmV0dXJuIEdMX1pFUk87Ci0gICAgICAgIGNhc2UgRDNEQkxFTkRfT05FOiByZXR1cm4gR0xfT05FOwotCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEE6IHJldHVybiBHTF9TUkNfQUxQSEE7Ci0JY2FzZSBEM0RCTEVORF9JTlZTUkNBTFBIQTogcmV0dXJuIEdMX09ORV9NSU5VU19TUkNfQUxQSEE7Ci0JY2FzZSBEM0RCTEVORF9ERVNUQUxQSEE6IHJldHVybiBHTF9EU1RfQUxQSEE7Ci0JY2FzZSBEM0RCTEVORF9JTlZERVNUQUxQSEE6IHJldHVybiBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOwotCWNhc2UgRDNEQkxFTkRfREVTVENPTE9SOiByZXR1cm4gR0xfRFNUX0NPTE9SOwotCWNhc2UgRDNEQkxFTkRfSU5WREVTVENPTE9SOiByZXR1cm4gR0xfT05FX01JTlVTX0RTVF9DT0xPUjsKLQljYXNlIEQzREJMRU5EX1NSQ0FMUEhBU0FUOiByZXR1cm4gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOwotCWNhc2UgRDNEQkxFTkRfU1JDQ09MT1I6IHJldHVybiBHTF9TUkNfQ09MT1I7Ci0JY2FzZSBEM0RCTEVORF9JTlZTUkNDT0xPUjogcmV0dXJuIEdMX09ORV9NSU5VU19TUkNfQ09MT1I7Ci0gICAgICAgIGRlZmF1bHQ6IEVSUigiVW5oYW5kbGVkIGJsZW5kIG1vZGUgJWQgIVxuIiwgZHdSZW5kZXJTdGF0ZSk7IHJldHVybiBHTF9aRVJPOwotICAgIH0KLX0KLQotdm9pZCBzZXRfcmVuZGVyX3N0YXRlKElEaXJlY3QzRERldmljZUltcGwqIFRoaXMsCi0JCSAgICAgIEQzRFJFTkRFUlNUQVRFVFlQRSBkd1JlbmRlclN0YXRlVHlwZSwgU1RBVEVCTE9DSyAqbHBTdGF0ZUJsb2NrKQotewotICAgIERXT1JEIGR3UmVuZGVyU3RhdGUgPSBscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtkd1JlbmRlclN0YXRlVHlwZSAtIDFdOwotICAgIElEaXJlY3QzRERldmljZUdMSW1wbCAqZ2xUaGlzID0gKElEaXJlY3QzRERldmljZUdMSW1wbCAqKSBUaGlzOwotICAgIAotICAgIFRSQUNFKCIlcyA9ICUwOGx4XG4iLCBfZ2V0X3JlbmRlcnN0YXRlKGR3UmVuZGVyU3RhdGVUeXBlKSwgZHdSZW5kZXJTdGF0ZSk7Ci0KLSAgICAvKiBGaXJzdCwgYWxsIHRoZSBzdGlwcGxlIHBhdHRlcm5zICovCi0gICAgaWYgKChkd1JlbmRlclN0YXRlVHlwZSA+PSBEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjAwKSAmJgotCShkd1JlbmRlclN0YXRlVHlwZSA8PSBEM0RSRU5ERVJTVEFURV9TVElQUExFUEFUVEVSTjMxKSkgewotICAgICAgICBFUlIoIlVuaGFuZGxlZCBkd1JlbmRlclN0YXRlVHlwZSBzdGlwcGxlICVkIVxuIixkd1JlbmRlclN0YXRlVHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRU5URVJfR0woKTsKLQotCS8qIEFsbCBvdGhlcnMgc3RhdGUgdmFyaWFibGVzICovCi0Jc3dpdGNoIChkd1JlbmRlclN0YXRlVHlwZSkgewotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVIQU5ETEU6IHsgICAgLyogIDEgKi8KLQkgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleCA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKikgZHdSZW5kZXJTdGF0ZTsKLQkJCi0JCUlEaXJlY3QzRERldmljZTdfU2V0VGV4dHVyZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKLQkJCQkJICAgIDAsIAotCQkJCQkgICAgSUNPTV9JTlRFUkZBQ0UodGV4LCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7Ci0JICAgIH0gYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9BTlRJQUxJQVM6ICAgICAgICAvKiAgMiAqLwotCSAgICAgICAgaWYgKGR3UmVuZGVyU3RhdGUpCi0JCSAgICBFUlIoIkQzRFJFTkRFUlNUQVRFX0FOVElBTElBUyBub3Qgc3VwcG9ydGVkIHlldCAhXG4iKTsKLQkgICAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTVTogIC8qIDQ0ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1NWOiAgLyogNDUgKi8KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9URVhUVVJFQUREUkVTUzogeyAvKiAgMyAqLwotCSAgICAgICAgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIGQzZFRleFN0YWdlU3RhdGVUeXBlOwotCi0JCWlmIChkd1JlbmRlclN0YXRlVHlwZSA9PSBEM0RSRU5ERVJTVEFURV9URVhUVVJFQUREUkVTUykgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUgPSBEM0RUU1NfQUREUkVTUzsKLQkJZWxzZSBpZiAoZHdSZW5kZXJTdGF0ZVR5cGUgPT0gRDNEUkVOREVSU1RBVEVfVEVYVFVSRUFERFJFU1NVKSBkM2RUZXhTdGFnZVN0YXRlVHlwZSA9IEQzRFRTU19BRERSRVNTVTsKLQkJZWxzZSBkM2RUZXhTdGFnZVN0YXRlVHlwZSA9IEQzRFRTU19BRERSRVNTVjsKLQotCQlJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRERldmljZTcpLAotCQkJCQkJICAgICAgMCwgZDNkVGV4U3RhZ2VTdGF0ZVR5cGUsCi0JCQkJCQkgICAgICBkd1JlbmRlclN0YXRlKTsKLQkgICAgfSBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9URVhUVVJFUEVSU1BFQ1RJVkU6IC8qIDQgKi8KLQkgICAgICAgIGlmIChkd1JlbmRlclN0YXRlKQotCQkgICAgZ2xIaW50KEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0xfTklDRVNUKTsKLQkJZWxzZQotCQkgICAgZ2xIaW50KEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0xfRkFTVEVTVCk7Ci0JICAgICAgICBicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1dSQVBVOiAvKiA1ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfV1JBUFY6IC8qIDYgKi8KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9XUkFQMDogLyogMTI4ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfV1JBUDE6IC8qIDEyOSAqLwotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1dSQVAyOiAvKiAxMzAgKi8KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9XUkFQMzogLyogMTMxICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfV1JBUDQ6IC8qIDEzMiAqLwotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1dSQVA1OiAvKiAxMzMgKi8KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9XUkFQNjogLyogMTM0ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfV1JBUDc6IC8qIDEzNSAqLwotCSAgICAgICAgaWYgKGR3UmVuZGVyU3RhdGUpCi0JCSAgICBFUlIoIlRleHR1cmUgV1JBUCBtb2RlcyB1bnN1cHBvcnRlZCBieSBPcGVuR0wuLiBFeHBlY3QgZ3JhcGhpY2FsIGdsaXRjaGVzICFcbiIpOwotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9aRU5BQkxFOiAgICAgICAgICAvKiAgNyAqLwotCSAgICAgICAgLyogVG8gaW52ZXN0aWdhdGUgOiBpbiBPcGVuR0wsIGlmIHdlIGRpc2FibGUgdGhlIGRlcHRoIHRlc3QsIHRoZSBaIGJ1ZmZlciB3aWxsIE5PVCBiZQotCQkgICB1cGRhdGVkIGVpdGhlci4uIE5vIGlkZWEgYWJvdXQgd2hhdCBoYXBwZW5zIGluIEQzRC4KLQkJICAgCi0JCSAgIE1heWJlIHJlcGxhY2luZyB0aGUgWiBmdW5jdGlvbiBieSBBTFdBWVMgd291bGQgYmUgYSBiZXR0ZXIgaWRlYS4gKi8KLQkgICAgICAgIGlmIChkd1JlbmRlclN0YXRlID09IEQzRFpCX1RSVUUpIHsKLQkJICAgIGlmIChnbFRoaXMtPmRlcHRoX3Rlc3QgPT0gRkFMU0UpIHsKLQkJCWdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotCQkJZ2xUaGlzLT5kZXB0aF90ZXN0ID0gVFJVRTsKLQkJICAgIH0KLQkJfSBlbHNlIGlmIChkd1JlbmRlclN0YXRlID09IEQzRFpCX0ZBTFNFKSB7Ci0JCSAgICBpZiAoZ2xUaGlzLT5kZXB0aF90ZXN0KSB7Ci0JCQlnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7Ci0JCQlnbFRoaXMtPmRlcHRoX3Rlc3QgPSBGQUxTRTsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIGlmIChnbFRoaXMtPmRlcHRoX3Rlc3QgPT0gRkFMU0UpIHsKLQkJCWdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotCQkJZ2xUaGlzLT5kZXB0aF90ZXN0ID0gVFJVRTsKLQkJICAgIH0KLQkJICAgIFdBUk4oIiB3LWJ1ZmZlcmluZyBub3Qgc3VwcG9ydGVkLlxuIik7Ci0JCX0KLQkgICAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfRklMTE1PREU6ICAgICAgICAgICAvKiAgOCAqLwotCSAgICAgICAgc3dpdGNoICgoRDNERklMTE1PREUpIGR3UmVuZGVyU3RhdGUpIHsKLQkJICAgIGNhc2UgRDNERklMTF9QT0lOVDoKLQkJICAgICAgICBnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLEdMX1BPSU5UKTsgICAgICAgIAotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEQzREZJTExfV0lSRUZSQU1FOgotCQkJZ2xQb2x5Z29uTW9kZShHTF9GUk9OVF9BTkRfQkFDSyxHTF9MSU5FKTsgCi0JCQlicmVhazsKLQkJICAgIGNhc2UgRDNERklMTF9TT0xJRDoKLQkJCWdsUG9seWdvbk1vZGUoR0xfRlJPTlRfQU5EX0JBQ0ssR0xfRklMTCk7IAotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJRVJSKCJVbmhhbmRsZWQgZmlsbCBtb2RlICVsZCAhXG4iLGR3UmVuZGVyU3RhdGUpOwotCQkgfQotCSAgICAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfU0hBREVNT0RFOiAgICAgICAgICAvKiAgOSAqLwotCSAgICAgICAgc3dpdGNoICgoRDNEU0hBREVNT0RFKSBkd1JlbmRlclN0YXRlKSB7Ci0JCSAgICBjYXNlIEQzRFNIQURFX0ZMQVQ6Ci0JCSAgICAgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEQzRFNIQURFX0dPVVJBVUQ6Ci0JCQlnbFNoYWRlTW9kZWwoR0xfU01PT1RIKTsKLQkJCWJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJCUVSUigiVW5oYW5kbGVkIHNoYWRlIG1vZGUgJWxkICFcbiIsZHdSZW5kZXJTdGF0ZSk7Ci0JCX0KLQkgICAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfWldSSVRFRU5BQkxFOiAgICAgLyogMTQgKi8KLQkgICAgICAgIGlmICgoZHdSZW5kZXJTdGF0ZSAhPSBGQUxTRSkgJiYgKGdsVGhpcy0+ZGVwdGhfbWFzayA9PSBGQUxTRSkpCi0JCSAgICBnbERlcHRoTWFzayhHTF9UUlVFKTsKLQkJZWxzZSBpZiAoKGR3UmVuZGVyU3RhdGUgPT0gRkFMU0UpICYmIChnbFRoaXMtPmRlcHRoX21hc2sgIT0gRkFMU0UpKQotCQkgICAgZ2xEZXB0aE1hc2soR0xfRkFMU0UpOwotCSAgICAgICAgZ2xUaGlzLT5kZXB0aF9tYXNrID0gZHdSZW5kZXJTdGF0ZTsKLQkgICAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0FMUEhBVEVTVEVOQUJMRTogIC8qIDE1ICovCi0JICAgICAgICBpZiAoKGR3UmVuZGVyU3RhdGUgIT0gMCkgJiYgKGdsVGhpcy0+YWxwaGFfdGVzdCA9PSBGQUxTRSkpCi0JCSAgICBnbEVuYWJsZShHTF9BTFBIQV9URVNUKTsKLQkgICAgICAgIGVsc2UgaWYgKChkd1JlbmRlclN0YXRlID09IDApICYmIChnbFRoaXMtPmFscGhhX3Rlc3QgIT0gRkFMU0UpKQotCQkgICAgZ2xEaXNhYmxlKEdMX0FMUEhBX1RFU1QpOwotCQlnbFRoaXMtPmFscGhhX3Rlc3QgPSBkd1JlbmRlclN0YXRlOwotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9URVhUVVJFTUFHOiB7ICAgICAvKiAxNyAqLwotCSAgICAgICAgRFdPUkQgdGV4X21hZyA9IDB4RkZGRkZGRkY7Ci0KLQkgICAgICAgIHN3aXRjaCAoKEQzRFRFWFRVUkVGSUxURVIpIGR3UmVuZGVyU3RhdGUpIHsKLQkJICAgIGNhc2UgRDNERklMVEVSX05FQVJFU1Q6Ci0JCSAgICAgICAgdGV4X21hZyA9IEQzRFRGR19QT0lOVDsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBEM0RGSUxURVJfTElORUFSOgotCQkgICAgICAgIHRleF9tYWcgPSBEM0RURkdfTElORUFSOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJRVJSKCJVbmhhbmRsZWQgdGV4dHVyZSBtYWcgJWxkICFcbiIsZHdSZW5kZXJTdGF0ZSk7Ci0JICAgICAgICB9Ci0KLQkJaWYgKHRleF9tYWcgIT0gMHhGRkZGRkZGRikgewotCQkgICAgSURpcmVjdDNERGV2aWNlN19TZXRUZXh0dXJlU3RhZ2VTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwgMCwgRDNEVFNTX01BR0ZJTFRFUiwgdGV4X21hZyk7Ci0JCX0KLQkgICAgfSBicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVNSU46IHsgICAgICAgLyogMTggKi8KLQkgICAgICAgIERXT1JEIHRleF9taW4gPSAweEZGRkZGRkZGOwotCi0JICAgICAgICBzd2l0Y2ggKChEM0RURVhUVVJFRklMVEVSKSBkd1JlbmRlclN0YXRlKSB7Ci0JCSAgICBjYXNlIEQzREZJTFRFUl9ORUFSRVNUOgotCQkgICAgICAgIHRleF9taW4gPSBEM0RURk5fUE9JTlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRDNERklMVEVSX0xJTkVBUjoKLQkJICAgICAgICB0ZXhfbWluID0gRDNEVEZOX0xJTkVBUjsKLQkJCWJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJCUVSUigiVW5oYW5kbGVkIHRleHR1cmUgbWluICVsZCAhXG4iLGR3UmVuZGVyU3RhdGUpOwotCSAgICAgICAgfQotCi0JCWlmICh0ZXhfbWluICE9IDB4RkZGRkZGRkYpIHsKLQkJICAgIElEaXJlY3QzRERldmljZTdfU2V0VGV4dHVyZVN0YWdlU3RhdGUoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyksIDAsIEQzRFRTU19NSU5GSUxURVIsIHRleF9taW4pOwotCQl9Ci0JICAgIH0gYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9TUkNCTEVORDogICAgICAgICAgIC8qIDE5ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfREVTVEJMRU5EOiAgICAgICAgICAvKiAyMCAqLwotCSAgICAgICAgZ2xCbGVuZEZ1bmMoY29udmVydF9EM0RfYmxlbmRvcF90b19HTChscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9TUkNCTEVORCAtIDFdKSwKLQkJCSAgICBjb252ZXJ0X0QzRF9ibGVuZG9wX3RvX0dMKGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0RFU1RCTEVORCAtIDFdKSk7Ci0JICAgICAgICBicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVNQVBCTEVORDogeyAgLyogMjEgKi8KLQkJSURpcmVjdDNERGV2aWNlNyAqZDNkZGV2ID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERGV2aWNlNyk7Ci0JCQotCSAgICAgICAgc3dpdGNoICgoRDNEVEVYVFVSRUJMRU5EKSBkd1JlbmRlclN0YXRlKSB7Ci0JCSAgICBjYXNlIEQzRFRCTEVORF9ERUNBTDoKLQkJICAgICAgICBpZiAoZ2xUaGlzLT5jdXJyZW50X3RleF9lbnYgIT0gR0xfUkVQTEFDRSkgewotCQkJICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0JCQkgICAgZ2xUaGlzLT5jdXJyZW50X3RleF9lbnYgPSBHTF9SRVBMQUNFOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEQzRFRCTEVORF9ERUNBTEFMUEhBOgotCQkJaWYgKGdsVGhpcy0+Y3VycmVudF90ZXhfZW52ICE9IEdMX1JFUExBQ0UpIHsKLQkJCSAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0RFQ0FMKTsKLQkJCSAgICBnbFRoaXMtPmN1cnJlbnRfdGV4X2VudiA9IEdMX0RFQ0FMOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEQzRFRCTEVORF9NT0RVTEFURToKLQkJCWlmIChnbFRoaXMtPmN1cnJlbnRfdGV4X2VudiAhPSBHTF9NT0RVTEFURSkgewotCQkJICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfTU9EVUxBVEUpOwotCQkJICAgIGdsVGhpcy0+Y3VycmVudF90ZXhfZW52ID0gR0xfTU9EVUxBVEU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgRDNEVEJMRU5EX01PRFVMQVRFQUxQSEE6Ci0JCQlJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKGQzZGRldiwgMCwgRDNEVFNTX0NPTE9SQVJHMSwgRDNEVEFfVEVYVFVSRSk7Ci0JCQlJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKGQzZGRldiwgMCwgRDNEVFNTX0FMUEhBQVJHMSwgRDNEVEFfVEVYVFVSRSk7Ci0JCQlJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKGQzZGRldiwgMCwgRDNEVFNTX0NPTE9SQVJHMiwgRDNEVEFfQ1VSUkVOVCk7Ci0JCQlJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKGQzZGRldiwgMCwgRDNEVFNTX0FMUEhBQVJHMiwgRDNEVEFfQ1VSUkVOVCk7Ci0JCQlJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKGQzZGRldiwgMCwgRDNEVFNTX0NPTE9ST1AsIEQzRFRPUF9NT0RVTEFURSk7Ci0JCQlJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKGQzZGRldiwgMCwgRDNEVFNTX0FMUEhBT1AsIEQzRFRPUF9NT0RVTEFURSk7Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgICAgRVJSKCJVbmhhbmRsZWQgdGV4dHVyZSBlbnZpcm9ubWVudCAlbGQgIVxuIixkd1JlbmRlclN0YXRlKTsKLQkJfQotCSAgICB9IGJyZWFrOwotCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfQ1VMTE1PREU6ICAgICAgICAgICAvKiAyMiAqLwotCSAgICAgICAgc3dpdGNoICgoRDNEQ1VMTCkgZHdSZW5kZXJTdGF0ZSkgewotCQkgICAgY2FzZSBEM0RDVUxMX05PTkU6Ci0JCSAgICAgICAgIGlmIChnbFRoaXMtPmN1bGxfZmFjZSAhPSAwKSB7Ci0JCQkgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOwotCQkJICAgICBnbFRoaXMtPmN1bGxfZmFjZSA9IDA7Ci0JCQkgfQotCQkJIGJyZWFrOwotCQkgICAgY2FzZSBEM0RDVUxMX0NXOgotCQkJIGlmIChnbFRoaXMtPmN1bGxfZmFjZSA9PSAwKSB7Ci0JCQkgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7Ci0JCQkgICAgIGdsVGhpcy0+Y3VsbF9mYWNlID0gMTsKLQkJCSB9Ci0JCQkgZ2xGcm9udEZhY2UoR0xfQ0NXKTsKLQkJCSBnbEN1bGxGYWNlKEdMX0JBQ0spOwotCQkJIGJyZWFrOwotCQkgICAgY2FzZSBEM0RDVUxMX0NDVzoKLQkJCSBpZiAoZ2xUaGlzLT5jdWxsX2ZhY2UgPT0gMCkgewotCQkJICAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOwotCQkJICAgICBnbFRoaXMtPmN1bGxfZmFjZSA9IDE7Ci0JCQkgfQotCQkJIGdsRnJvbnRGYWNlKEdMX0NXKTsKLQkJCSBnbEN1bGxGYWNlKEdMX0JBQ0spOwotCQkJIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJCSBFUlIoIlVuaGFuZGxlZCBjdWxsIG1vZGUgJWxkICFcbiIsZHdSZW5kZXJTdGF0ZSk7Ci0JCX0KLQkgICAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfWkZVTkM6ICAgICAgICAgICAgLyogMjMgKi8KLQkgICAgICAgIGdsRGVwdGhGdW5jKGNvbnZlcnRfRDNEX2NvbXBhcmVfdG9fR0woZHdSZW5kZXJTdGF0ZSkpOwotCSAgICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfQUxQSEFSRUY6ICAgIC8qIDI0ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfQUxQSEFGVU5DOiB7IC8qIDI1ICovCi0JCSAgICBHTGVudW0gZnVuYyA9IGNvbnZlcnRfRDNEX2NvbXBhcmVfdG9fR0wobHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQUxQSEFGVU5DIC0gMV0pOwotCQkgICAgR0xjbGFtcGYgcmVmID0gKGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0FMUEhBUkVGIC0gMV0gJiAweDAwMDAwMEZGKSAvIDI1NS4wOwotCi0JCSAgICBpZiAoKGZ1bmMgIT0gZ2xUaGlzLT5jdXJyZW50X2FscGhhX3Rlc3RfZnVuYykgfHwgKHJlZiAhPSBnbFRoaXMtPmN1cnJlbnRfYWxwaGFfdGVzdF9yZWYpKSB7Ci0JCQlnbEFscGhhRnVuYyhmdW5jLCByZWYpOwotCQkJZ2xUaGlzLT5jdXJyZW50X2FscGhhX3Rlc3RfZnVuYyA9IGZ1bmM7Ci0JCQlnbFRoaXMtPmN1cnJlbnRfYWxwaGFfdGVzdF9yZWYgPSByZWY7Ci0JCSAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICBicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0RJVEhFUkVOQUJMRTogICAgIC8qIDI2ICovCi0JICAgICAgICBpZiAoZHdSZW5kZXJTdGF0ZSkKLQkJICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7Ci0JCWVsc2UKLQkJICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9BTFBIQUJMRU5ERU5BQkxFOiAgIC8qIDI3ICovCi0JICAgICAgICBpZiAoKGR3UmVuZGVyU3RhdGUgIT0gMCkgJiYgKGdsVGhpcy0+YmxlbmRpbmcgPT0gMCkpIHsKLQkJICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLQkJfSBlbHNlIGlmICgoZHdSZW5kZXJTdGF0ZSA9PSAwKSAmJiAoZ2xUaGlzLT5ibGVuZGluZyAhPSAwKSkgewotCQkgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLQkJfQotCSAgICAgICAgZ2xUaGlzLT5ibGVuZGluZyA9IGR3UmVuZGVyU3RhdGU7Ci0KLQkgICAgICAgIC8qIEhhY2sgZm9yIHNvbWUgb2xkIGdhbWVzIC4uLiAqLwotCSAgICAgICAgaWYgKGdsVGhpcy0+cGFyZW50LnZlcnNpb24gPT0gMSkgewotCQkgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfQ09MT1JLRVlFTkFCTEUgLSAxXSA9IGR3UmVuZGVyU3RhdGU7Ci0JCX0KLQkgICAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0ZPR0VOQUJMRTogLyogMjggKi8KLQkgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZS4gT25seSB0aGUgc3RvcmFnZSBtYXR0ZXJzIDotKSAqLwotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9TUEVDVUxBUkVOQUJMRTogLyogMjkgKi8KLQkgICAgICAgIGlmIChkd1JlbmRlclN0YXRlKQotCQkgICAgRVJSKCIgU3BlY3VsYXIgTGlnaHRpbmcgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKLQkgICAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1NVQlBJWEVMOiAgLyogMzEgKi8KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9TVUJQSVhFTFg6IC8qIDMyICovCi0JICAgICAgICAvKiBXZSBkbyBub3Qgc3VwcG9ydCB0aGlzIGFueXdheSwgc28gd2h5IHByb3Rlc3QgOi0pICovCi0JICAgICAgICBicmVhazsgCi0KLSAJICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfU1RJUFBMRURBTFBIQTogLyogMzMgKi8KLQkgICAgICAgIGlmIChkd1JlbmRlclN0YXRlKQotCQkgICAgRVJSKCIgU3RpcHBsZWQgQWxwaGEgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9GT0dDT0xPUjogeyAvKiAzNCAqLwotCSAgICAgICAgR0xmbG9hdCBjb2xvcls0XTsKLQkJY29sb3JbMF0gPSAoKGR3UmVuZGVyU3RhdGUgPj4gMTYpICYgMHhGRikvMjU1LjBmOwotCQljb2xvclsxXSA9ICgoZHdSZW5kZXJTdGF0ZSA+PiAgOCkgJiAweEZGKS8yNTUuMGY7Ci0JCWNvbG9yWzJdID0gKChkd1JlbmRlclN0YXRlID4+ICAwKSAmIDB4RkYpLzI1NS4wZjsKLQkJY29sb3JbM10gPSAoKGR3UmVuZGVyU3RhdGUgPj4gMjQpICYgMHhGRikvMjU1LjBmOwotCQlnbEZvZ2Z2KEdMX0ZPR19DT0xPUixjb2xvcik7Ci0JCS8qIE5vdGU6IGdsRm9naXYgZG9lcyBub3Qgc2VlbSB0byB3b3JrICovCi0JICAgIH0gYnJlYWs7Ci0KLSAJICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfRk9HVEFCTEVNT0RFOiAgLyogMzUgKi8KLSAJICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfRk9HVkVSVEVYTU9ERTogLyogMTQwICovCi0gCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0ZPR1NUQVJUOiAgICAgIC8qIDM2ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfRk9HRU5EOiAgICAgICAgLyogMzcgKi8KLQkgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZS4gT25seSB0aGUgc3RvcmFnZSBtYXR0ZXJzIDotKSAqLwotCQlicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0ZPR0RFTlNJVFk6ICAgIC8qIDM4ICovCi0JCWdsRm9naShHTF9GT0dfREVOU0lUWSwqKGZsb2F0KikmZHdSZW5kZXJTdGF0ZSk7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfQ09MT1JLRVlFTkFCTEU6ICAgICAvKiA0MSAqLwotCSAgICAgICAgLyogTm90aGluZyBkb25lIGhlcmUsIG9ubHkgc3RvcmFnZSBtYXR0ZXJzLiAqLwotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9NSVBNQVBMT0RCSUFTOiAvKiA0NiAqLwotCSAgICAgICAgSURpcmVjdDNERGV2aWNlN19TZXRUZXh0dXJlU3RhZ2VTdGF0ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0REZXZpY2U3KSwKLQkJCQkJCSAgICAgIDAsIEQzRFRTU19NSVBNQVBMT0RCSUFTLAotCQkJCQkJICAgICAgZHdSZW5kZXJTdGF0ZSk7Ci0JICAgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9aQklBUzogLyogNDcgKi8KLQkgICAgICAgIC8qIFRoaXMgaXMgYSB0YWQgYml0IGhhY2t5Li4gQnV0IHdlbGwsIG5vIGlkZWEgaG93IHRvIGRvIGl0IGJldHRlciBpbiBPcGVuR0wgOi0vICovCi0JICAgICAgICBpZiAoZHdSZW5kZXJTdGF0ZSA9PSAwKSB7Ci0JCSAgICBnbERpc2FibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCk7Ci0JCSAgICBnbERpc2FibGUoR0xfUE9MWUdPTl9PRkZTRVRfTElORSk7Ci0JCSAgICBnbERpc2FibGUoR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQpOwotCQl9IGVsc2UgewotCQkgICAgZ2xFbmFibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCk7Ci0JCSAgICBnbEVuYWJsZShHTF9QT0xZR09OX09GRlNFVF9MSU5FKTsKLQkJICAgIGdsRW5hYmxlKEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UKTsKLQkJICAgIGdsUG9seWdvbk9mZnNldCgxLjAsIGR3UmVuZGVyU3RhdGUgKiAxLjApOwotCQl9Ci0JICAgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9GTFVTSEJBVENIOiAgICAgICAgIC8qIDUwICovCi0JICAgICAgICBicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1NURU5DSUxFTkFCTEU6ICAgIC8qIDUyICovCi0JICAgICAgICBpZiAoKGR3UmVuZGVyU3RhdGUgIT0gMCkgJiYgKGdsVGhpcy0+c3RlbmNpbF90ZXN0ID09IDApKQotCQkgICAgZ2xFbmFibGUoR0xfU1RFTkNJTF9URVNUKTsKLQkJZWxzZSBpZiAoKGR3UmVuZGVyU3RhdGUgPT0gMCkgJiYgKGdsVGhpcy0+c3RlbmNpbF90ZXN0ICE9IDApKQotCQkgICAgZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCk7Ci0JICAgICAgICBnbFRoaXMtPnN0ZW5jaWxfdGVzdCA9IGR3UmVuZGVyU3RhdGU7Ci0JCWJyZWFrOwotCSAgICAKLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9TVEVOQ0lMRkFJTDogICAgICAvKiA1MyAqLwotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1NURU5DSUxaRkFJTDogICAgIC8qIDU0ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfU1RFTkNJTFBBU1M6ICAgICAgLyogNTUgKi8KLQkJZ2xTdGVuY2lsT3AoY29udmVydF9EM0Rfc3RlbmNpbG9wX3RvX0dMKGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1NURU5DSUxGQUlMIC0gMV0pLAotCQkJICAgIGNvbnZlcnRfRDNEX3N0ZW5jaWxvcF90b19HTChscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9TVEVOQ0lMWkZBSUwgLSAxXSksCi0JCQkgICAgY29udmVydF9EM0Rfc3RlbmNpbG9wX3RvX0dMKGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1NURU5DSUxQQVNTIC0gMV0pKTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9TVEVOQ0lMRlVOQzogICAgICAvKiA1NiAqLwotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1NURU5DSUxSRUY6ICAgICAgIC8qIDU3ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfU1RFTkNJTE1BU0s6ICAgICAgLyogNTggKi8KLQkJZ2xTdGVuY2lsRnVuYyhjb252ZXJ0X0QzRF9jb21wYXJlX3RvX0dMKGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1NURU5DSUxGVU5DIC0gMV0pLAotCQkJICAgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1RFTkNJTFJFRiAtIDFdLAotCQkJICAgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1RFTkNJTE1BU0sgLSAxXSk7Ci0JCWJyZWFrOwotCSAgCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfU1RFTkNJTFdSSVRFTUFTSzogLyogNTkgKi8KLQkgICAgICAgIGdsU3RlbmNpbE1hc2soZHdSZW5kZXJTdGF0ZSk7Ci0JICAgICAgICBicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX1RFWFRVUkVGQUNUT1I6ICAgICAgLyogNjAgKi8KLQkgICAgICAgIC8qIE9ubHkgdGhlIHN0b3JhZ2UgbWF0dGVycy4uLiAqLwotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9DTElQUElORzogICAgICAgICAgLyogMTM2ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfQ0xJUFBMQU5FRU5BQkxFOiB7IC8qIDE1MiAqLwotCQkgICAgR0xpbnQgaTsKLQkJICAgIERXT1JEIG1hc2ssIHJ1bm5lcjsKLQkJICAgIAotCQkgICAgaWYgKGR3UmVuZGVyU3RhdGVUeXBlID09IEQzRFJFTkRFUlNUQVRFX0NMSVBQSU5HKSB7Ci0JCQltYXNrID0gKChkd1JlbmRlclN0YXRlKSA/Ci0JCQkJKFRoaXMtPnN0YXRlX2Jsb2NrLnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9DTElQUExBTkVFTkFCTEUgLSAxXSkgOiAoMHgwMDAwMDAwMCkpOwotCQkgICAgfSBlbHNlIHsKLQkJCW1hc2sgPSBkd1JlbmRlclN0YXRlOwotCQkgICAgfQotCQkgICAgZm9yIChpID0gMCwgcnVubmVyID0gMHgwMDAwMDAwMTsgaSA8IFRoaXMtPm1heF9jbGlwcGluZ19wbGFuZXM7IGkrKywgcnVubmVyID0gKHJ1bm5lciA8PCAxKSkgewotCQkJaWYgKG1hc2sgJiBydW5uZXIpIHsKLQkJCSAgICBHTGludCBlbmFibGVkOwotCQkJICAgIGdsR2V0SW50ZWdlcnYoR0xfQ0xJUF9QTEFORTAgKyBpLCAmZW5hYmxlZCk7Ci0JCQkgICAgaWYgKGVuYWJsZWQgPT0gR0xfRkFMU0UpIHsKLQkJCSAgICAgICAgZ2xFbmFibGUoR0xfQ0xJUF9QTEFORTAgKyBpKTsKLQkJCQkvKiBOZWVkIHRvIGZvcmNlIGEgdHJhbnNmb3JtIGNoYW5nZSBzbyB0aGF0IHRoaXMgY2xpcHBpbmcgcGxhbmUgcGFyYW1ldGVycyBhcmUgc2VudAotCQkJCSAqIHByb3Blcmx5IHRvIEdMLgotCQkJCSAqLwotCQkJCWdsVGhpcy0+dHJhbnNmb3JtX3N0YXRlID0gR0xfVFJBTlNGT1JNX05PTkU7Ci0JCQkgICAgfQotCQkJfSBlbHNlIHsKLQkJCSAgICBnbERpc2FibGUoR0xfQ0xJUF9QTEFORTAgKyBpKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9MSUdIVElORzogICAgLyogMTM3ICovCi0JICAgICAgICAvKiBOb3RoaW5nIHRvIGRvLCBvbmx5IHN0b3JhZ2UgbWF0dGVycy4uLiAqLwotCSAgICAgICAgYnJlYWs7Ci0JCQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0FNQklFTlQ6IHsgICAgICAgICAgICAvKiAxMzkgKi8KLQkgICAgICAgIGZsb2F0IGxpZ2h0WzRdOwotCi0JCWxpZ2h0WzBdID0gKChkd1JlbmRlclN0YXRlID4+IDE2KSAmIDB4RkYpIC8gMjU1LjA7Ci0JCWxpZ2h0WzFdID0gKChkd1JlbmRlclN0YXRlID4+ICA4KSAmIDB4RkYpIC8gMjU1LjA7Ci0JCWxpZ2h0WzJdID0gKChkd1JlbmRlclN0YXRlID4+ICAwKSAmIDB4RkYpIC8gMjU1LjA7Ci0JCWxpZ2h0WzNdID0gKChkd1JlbmRlclN0YXRlID4+IDI0KSAmIDB4RkYpIC8gMjU1LjA7Ci0JCWdsTGlnaHRNb2RlbGZ2KEdMX0xJR0hUX01PREVMX0FNQklFTlQsIChmbG9hdCAqKSBsaWdodCk7Ci0JICAgIH0gYnJlYWs7Ci0KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9DT0xPUlZFUlRFWDogICAgICAgICAgLyogMTQxICovCi0JICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZS4uIE9ubHkgc3RvcmFnZSBtYXR0ZXJzICovCi0JICAgICAgICAgIGJyZWFrOwotCQkgIAotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0xPQ0FMVklFV0VSOiAgICAgICAgICAvKiAxNDIgKi8KLQkgICAgICAgIGlmIChkd1JlbmRlclN0YXRlKQotCQkgICAgZ2xMaWdodE1vZGVsaShHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIsIEdMX1RSVUUpOwotCQllbHNlCi0JCSAgICBnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUiwgR0xfRkFMU0UpOwotCQlicmVhazsKLQotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX05PUk1BTElaRU5PUk1BTFM6ICAgICAvKiAxNDMgKi8KLQkgICAgICAgIGlmIChkd1JlbmRlclN0YXRlKSB7Ci0JCSAgICBnbEVuYWJsZShHTF9OT1JNQUxJWkUpOwotCQkgICAgZ2xFbmFibGUoR0xfUkVTQ0FMRV9OT1JNQUwpOwotCQl9IGVsc2UgewotCQkgICAgZ2xEaXNhYmxlKEdMX05PUk1BTElaRSk7Ci0JCSAgICBnbERpc2FibGUoR0xfUkVTQ0FMRV9OT1JNQUwpOwotCQl9Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfRElGRlVTRU1BVEVSSUFMU09VUkNFOiAgICAvKiAxNDUgKi8KLQkgICAgY2FzZSBEM0RSRU5ERVJTVEFURV9TUEVDVUxBUk1BVEVSSUFMU09VUkNFOiAgIC8qIDE0NiAqLwotCSAgICBjYXNlIEQzRFJFTkRFUlNUQVRFX0FNQklFTlRNQVRFUklBTFNPVVJDRTogICAgLyogMTQ3ICovCi0JICAgIGNhc2UgRDNEUkVOREVSU1RBVEVfRU1JU1NJVkVNQVRFUklBTFNPVVJDRTogICAvKiAxNDggKi8KLQkgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZS4gT25seSB0aGUgc3RvcmFnZSBtYXR0ZXJzIDotKSAqLwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgICAgRVJSKCJVbmhhbmRsZWQgZHdSZW5kZXJTdGF0ZVR5cGUgJXMgKCUwOHgpIHZhbHVlIDogJTA4bHggIVxuIiwKLQkJICAgIF9nZXRfcmVuZGVyc3RhdGUoZHdSZW5kZXJTdGF0ZVR5cGUpLCBkd1JlbmRlclN0YXRlVHlwZSwgZHdSZW5kZXJTdGF0ZSk7Ci0JfQotCUxFQVZFX0dMKCk7Ci0gICAgfQotfQotCi12b2lkIHN0b3JlX3JlbmRlcl9zdGF0ZShJRGlyZWN0M0REZXZpY2VJbXBsICpUaGlzLAotCQkJRDNEUkVOREVSU1RBVEVUWVBFIGR3UmVuZGVyU3RhdGVUeXBlLCBEV09SRCBkd1JlbmRlclN0YXRlLCBTVEFURUJMT0NLICpscFN0YXRlQmxvY2spCi17Ci0gICAgVFJBQ0UoIiVzID0gJTA4bHhcbiIsIF9nZXRfcmVuZGVyc3RhdGUoZHdSZW5kZXJTdGF0ZVR5cGUpLCBkd1JlbmRlclN0YXRlKTsKLSAgICAKLSAgICAvKiBTb21lIHNwZWNpYWwgY2FzZXMgZmlyc3QuLiAqLwotICAgIGlmIChkd1JlbmRlclN0YXRlVHlwZSA9PSBEM0RSRU5ERVJTVEFURV9TUkNCTEVORCkgewotICAgICAgICBpZiAoZHdSZW5kZXJTdGF0ZSA9PSBEM0RCTEVORF9CT1RIU1JDQUxQSEEpIHsKLQkgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfU1JDQkxFTkQgLSAxXSA9IEQzREJMRU5EX1NSQ0FMUEhBOwotCSAgICBscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9ERVNUQkxFTkQgLSAxXSA9IEQzREJMRU5EX0lOVlNSQ0FMUEhBOwotCSAgICByZXR1cm47Ci0JfSBlbHNlIGlmIChkd1JlbmRlclN0YXRlID09IEQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQSkgewotCSAgICBscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9TUkNCTEVORCAtIDFdID0gRDNEQkxFTkRfSU5WU1JDQUxQSEE7Ci0JICAgIGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX0RFU1RCTEVORCAtIDFdID0gRDNEQkxFTkRfU1JDQUxQSEE7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfSBlbHNlIGlmIChkd1JlbmRlclN0YXRlVHlwZSA9PSBEM0RSRU5ERVJTVEFURV9URVhUVVJFQUREUkVTUykgewotICAgICAgICBscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9URVhUVVJFQUREUkVTU1UgLSAxXSA9IGR3UmVuZGVyU3RhdGU7Ci0gICAgICAgIGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1RFWFRVUkVBRERSRVNTViAtIDFdID0gZHdSZW5kZXJTdGF0ZTsKLSAgICB9IGVsc2UgaWYgKGR3UmVuZGVyU3RhdGVUeXBlID09IEQzRFJFTkRFUlNUQVRFX1dSQVBVKSB7Ci0gICAgICAgIGlmIChkd1JlbmRlclN0YXRlKSAKLQkgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfV1JBUDBdIHw9IEQzRFdSQVBfVTsKLQllbHNlCi0JICAgIGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW0QzRFJFTkRFUlNUQVRFX1dSQVAwXSAmPSB+RDNEV1JBUF9VOwotICAgIH0gZWxzZSBpZiAoZHdSZW5kZXJTdGF0ZVR5cGUgPT0gRDNEUkVOREVSU1RBVEVfV1JBUFYpIHsKLSAgICAgICAgaWYgKGR3UmVuZGVyU3RhdGUpIAotCSAgICBscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtEM0RSRU5ERVJTVEFURV9XUkFQMF0gfD0gRDNEV1JBUF9WOwotCWVsc2UKLQkgICAgbHBTdGF0ZUJsb2NrLT5yZW5kZXJfc3RhdGVbRDNEUkVOREVSU1RBVEVfV1JBUDBdICY9IH5EM0RXUkFQX1Y7Ci0gICAgfQotICAgIAotICAgIC8qIERlZmF1bHQgY2FzZSAqLwotICAgIGxwU3RhdGVCbG9jay0+cmVuZGVyX3N0YXRlW2R3UmVuZGVyU3RhdGVUeXBlIC0gMV0gPSBkd1JlbmRlclN0YXRlOwotfQotCi12b2lkIGdldF9yZW5kZXJfc3RhdGUoSURpcmVjdDNERGV2aWNlSW1wbCAqVGhpcywKLQkJICAgICAgRDNEUkVOREVSU1RBVEVUWVBFIGR3UmVuZGVyU3RhdGVUeXBlLCBMUERXT1JEIGxwZHdSZW5kZXJTdGF0ZSwgU1RBVEVCTE9DSyAqbHBTdGF0ZUJsb2NrKQotewotICAgICpscGR3UmVuZGVyU3RhdGUgPSBscFN0YXRlQmxvY2stPnJlbmRlcl9zdGF0ZVtkd1JlbmRlclN0YXRlVHlwZSAtIDFdOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpCi0gICAgICAgIFRSQUNFKCIlcyA9ICUwOGx4XG4iLCBfZ2V0X3JlbmRlcnN0YXRlKGR3UmVuZGVyU3RhdGVUeXBlKSwgKmxwZHdSZW5kZXJTdGF0ZSk7Ci19Ci0KLXZvaWQgYXBwbHlfcmVuZGVyX3N0YXRlKElEaXJlY3QzRERldmljZUltcGwgKlRoaXMsIFNUQVRFQkxPQ0sgKmxwU3RhdGVCbG9jaykKLXsKLSAgICBEV09SRCBpOwotICAgIFRSQUNFKCIoJXAsJXApXG4iLCBUaGlzLCBscFN0YXRlQmxvY2spOwotICAgIGZvcihpID0gMDsgaSA8IEhJR0hFU1RfUkVOREVSX1NUQVRFOyBpKyspCi0JaWYgKGxwU3RhdGVCbG9jay0+c2V0X2ZsYWdzLnJlbmRlcl9zdGF0ZVtpXSkKLSAgICAgICAgICAgIHNldF9yZW5kZXJfc3RhdGUoVGhpcywgaSArIDEsIGxwU3RhdGVCbG9jayk7Ci19Ci0KLQotLyogVGV4dHVyZSBtYW5hZ2VtZW50IGNvZGUuCi0KLSAgICAtIHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnlfaW5pdCBpbml0aWFsaXplIHRoZSBjb2RlIGFuZCBjb21wdXRlcyB0aGUgR0wgZm9ybWF0cyAKLSAgICAgIGFjY29yZGluZyB0byB0aGUgc3VyZmFjZSBkZXNjcmlwdGlvbi4KLQotICAgIC0gdXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeSBkb2VzIHRoZSByZWFsIHVwbG9hZC4gSWYgb25lIGJ1ZmZlciBpcyBzcGxpdCBvdmVyCi0gICAgICBtdWx0aXBsZSB0ZXh0dXJlcywgdGhpcyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFmdGVyIHRoZSAnX2luaXQnIGNhbGwuICdyZWN0JwotICAgICAgY2FuIGJlIE5VTEwgaWYgdGhlIHdob2xlIGJ1ZmZlciBuZWVkcyB0byBiZSB1cGxvYWQuCi0KLSAgICAtIHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnlfcmVsZWFzZSBkb2VzIHRoZSBjbGVhbi11cC4KLQotICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyBjYXNlcyA6Ci0gICAgLSB0ZXh0dXJlIG1hbmFnZW1lbnQgKGllIHRvIHVwbG9hZCBhIEQzRCB0ZXh0dXJlIHRvIEdMIHdoZW4gaXQgY2hhbmdlcykuCi0gICAgLSBmbHVzaCBvZiB0aGUgJ2luLW1lbW9yeScgZnJhbWUgYnVmZmVyIHRvIHRoZSBHTCBmcmFtZSBidWZmZXIgdXNpbmcgdGhlIHRleHR1cmUKLSAgICAgIGVuZ2luZS4KLSAgICAtIHVzZSBvZiB0aGUgdGV4dHVyZSBlbmdpbmUgdG8gc2ltdWxhdGUgQmxpdHMgdG8gdGhlIDNEIERldmljZS4KLSovCi10eXBlZGVmIGVudW0gewotICAgIE5PX0NPTlZFUlNJT04sCi0gICAgQ09OVkVSVF9QQUxFVFRFRCwKLSAgICBDT05WRVJUX0NLXzU2NSwKLSAgICBDT05WRVJUX0NLXzU1NTEsCi0gICAgQ09OVkVSVF9DS180NDQ0LAotICAgIENPTlZFUlRfQ0tfNDQ0NF9BUkdCLAotICAgIENPTlZFUlRfQ0tfMTU1NSwKLSAgICBDT05WRVJUXzU1NSwKLSAgICBDT05WRVJUX0NLX1JHQjI0LAotICAgIENPTlZFUlRfQ0tfODg4OCwKLSAgICBDT05WRVJUX0NLXzg4ODhfQVJHQiwKLSAgICBDT05WRVJUX1JHQjMyXzg4OAotfSBDT05WRVJUX1RZUEVTOwotCi0vKiBOb3RlIDogd2Ugc3VwcG9zZSB0aGF0IGFsbCB0aGUgY29kZSBjYWxsaW5nIHRoaXMgaXMgcHJvdGVjdGVkIGJ5IHRoZSBHTCBsb2NrLi4uIE90aGVyd2lzZSBiYWQgdGhpbmdzCi0gICBtYXkgaGFwcGVuIDotKSAqLwotc3RhdGljIEdMZW51bSBjdXJyZW50X2Zvcm1hdDsKLXN0YXRpYyBHTGVudW0gY3VycmVudF9waXhlbF9mb3JtYXQ7Ci1zdGF0aWMgQ09OVkVSVF9UWVBFUyBjb252ZXJ0X3R5cGU7Ci1zdGF0aWMgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqY3VycmVudF9zdXJmYWNlOwotc3RhdGljIEdMdWludCBjdXJyZW50X2xldmVsOwotc3RhdGljIERXT1JEIGN1cnJlbnRfdGV4X3dpZHRoOwotc3RhdGljIERXT1JEIGN1cnJlbnRfdGV4X2hlaWdodDsKLXN0YXRpYyBHTHVpbnQgY3VycmVudF9hbGlnbmVtZW50X2NvbnN0cmFpbnRzOwotc3RhdGljIGludCBjdXJyZW50X3N0b3JhZ2Vfd2lkdGg7Ci0KLUhSRVNVTFQgdXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeV9pbml0KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZfcHRyLCBHTHVpbnQgbGV2ZWwsIEdMZW51bSAqY3VycmVudF9pbnRlcm5hbF9mb3JtYXQsCi0JCQkJCSAgQk9PTEVBTiBuZWVkX3RvX2FsbG9jLCBCT09MRUFOIG5lZWRfYWxwaGFfY2ssIERXT1JEIHRleF93aWR0aCwgRFdPUkQgdGV4X2hlaWdodCkKLXsKLSAgICBjb25zdCBERFBJWEVMRk9STUFUICogY29uc3Qgc3JjX3BmID0gJihzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdCk7Ci0gICAgQk9PTCBlcnJvciA9IEZBTFNFOwotICAgIEJPT0wgY29sb3JrZXlfYWN0aXZlID0gbmVlZF9hbHBoYV9jayAmJiAoc3VyZl9wdHItPnN1cmZhY2VfZGVzYy5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCk7Ci0gICAgR0xlbnVtIGludGVybmFsX2Zvcm1hdCA9IEdMX0xVTUlOQU5DRTsgLyogQSBib2d1cyB2YWx1ZSB0byBiZSBzdXJlIHRvIGhhdmUgYSBuaWNlIE1lc2Egd2FybmluZyA6LSkgKi8KLSAgICBCWVRFIGJwcCA9IEdFVF9CUFAoc3VyZl9wdHItPnN1cmZhY2VfZGVzYyk7Ci0gICAgQk9PTCBzdWJfdGV4dHVyZSA9IFRSVUU7Ci0KLSAgICBjdXJyZW50X3N1cmZhY2UgPSBzdXJmX3B0cjsKLSAgICBjdXJyZW50X2xldmVsID0gbGV2ZWw7Ci0KLSAgICBpZiAoc3JjX3BmLT5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpIHsKLQlHTGVudW0gcmV0VmFsOwotCWludCBzaXplID0gc3VyZl9wdHItPnN1cmZhY2VfZGVzYy51MS5kd0xpbmVhclNpemU7Ci0JaW50IHdpZHRoID0gc3VyZl9wdHItPnN1cmZhY2VfZGVzYy5kd1dpZHRoOwotCWludCBoZWlnaHQgPSBzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OwotCUxQVk9JRCBidWZmZXIgPSBzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZTsKLQotCXN3aXRjaCAoc3JjX3BmLT5kd0ZvdXJDQykgewotCSAgICBjYXNlIE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCcxJyk6IHJldFZhbCA9IEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOyBicmVhazsKLQkgICAgY2FzZSBNQUtFX0ZPVVJDQygnRCcsJ1gnLCdUJywnMycpOiByZXRWYWwgPSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDsgYnJlYWs7Ci0JICAgIGNhc2UgTUFLRV9GT1VSQ0MoJ0QnLCdYJywnVCcsJzUnKTogcmV0VmFsID0gR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ7IGJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlGSVhNRSgiRm91ckNDIE5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gRERfT0s7Ci0JfQotCi0JaWYgKEdMX2V4dGVuc2lvbnMuczN0Y19jb21wcmVzc2VkX3RleHR1cmUpIHsKLQkgICAgR0xfZXh0ZW5zaW9ucy5nbENvbXByZXNzZWRUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIGN1cnJlbnRfbGV2ZWwsIHJldFZhbCwgd2lkdGgsIGhlaWdodCwgMCwgc2l6ZSwgYnVmZmVyKTsKLQl9IGVsc2UKLQkgICAgRVJSKCJUcnlpbmcgdG8gdXBsb2FkIFMzVEMgdGV4dHVyZSB3aGVyZWFzIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBpdFxuIik7Ci0KLQlyZXR1cm4gRERfT0s7Ci0gICAgfQotCi0gICAgLyogRmlyc3QsIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyAuLi4gKi8KLSAgICBpZiAoKHN1cmZfcHRyLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoICUgYnBwKSAhPSAwKSB7Ci0JRklYTUUoIldhcm5pbmcgOiBwaXRjaCBpcyBub3QgYSBtdWx0aXBsZSBvZiBCUFAgLSBub3Qgc3VwcG9ydGVkIHlldCAhXG4iKTsKLSAgICB9IGVsc2UgewotCS8qIEluIHRoYXQgY2FzZSwgbm8gbmVlZCB0byBoYXZlIGFueSBhbGlnbmVtZW50IGNvbnN0cmFpbnRzLi4uICovCi0JaWYgKGN1cnJlbnRfYWxpZ25lbWVudF9jb25zdHJhaW50cyAhPSAxKSB7Ci0JICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7Ci0JICAgIGN1cnJlbnRfYWxpZ25lbWVudF9jb25zdHJhaW50cyA9IDE7Ci0JfQotICAgIH0KLQotICAgIC8qIE5vdGU6IHdlIG9ubHkgY2hlY2sgd2lkdGggaGVyZSBhcyB5b3UgY2Fubm90IGhhdmUgd2lkdGggbm9uLXplcm8gd2hpbGUgaGVpZ2h0IGlzIHNldCB0byB6ZXJvICovCi0gICAgaWYgKHRleF93aWR0aCA9PSAwKSB7Ci0Jc3ViX3RleHR1cmUgPSBGQUxTRTsKLQkKLQl0ZXhfd2lkdGggPSBzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7Ci0JdGV4X2hlaWdodCA9IHN1cmZfcHRyLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7Ci0gICAgfQotCi0gICAgY3VycmVudF90ZXhfd2lkdGggPSB0ZXhfd2lkdGg7Ci0gICAgY3VycmVudF90ZXhfaGVpZ2h0ID0gdGV4X2hlaWdodDsKLQotICAgIGlmIChzcmNfcGYtPmR3RmxhZ3MgJiBERFBGX1BBTEVUVEVJTkRFWEVEOCkgewotCS8qICoqKioqKioqKioqKioqKioKLQkgICBQYWxldHRlZCBUZXh0dXJlCi0JICAgKioqKioqKioqKioqKioqKiAqLwotCWN1cnJlbnRfZm9ybWF0ID0gR0xfUkdCQTsKLQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCWN1cnJlbnRfcGl4ZWxfZm9ybWF0ID0gR0xfVU5TSUdORURfQllURTsKLQljb252ZXJ0X3R5cGUgPSBDT05WRVJUX1BBTEVUVEVEOwotICAgIH0gZWxzZSBpZiAoc3JjX3BmLT5kd0ZsYWdzICYgRERQRl9SR0IpIHsKLQkvKiAqKioqKioqKioqKioKLQkgICBSR0IgVGV4dHVyZXMKLQkgICAqKioqKioqKioqKiogKi8KLQlpZiAoc3JjX3BmLT51MS5kd1JHQkJpdENvdW50ID09IDgpIHsKLQkgICAgaWYgKChzcmNfcGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgotCQkoc3JjX3BmLT51NS5kd1JHQkFscGhhQml0TWFzayAhPSAweDAwKSkgewotCQllcnJvciA9IFRSVUU7Ci0JICAgIH0gZWxzZSB7Ci0JCWlmICgoc3JjX3BmLT51Mi5kd1JCaXRNYXNrID09IDB4RTApICYmCi0JCSAgICAoc3JjX3BmLT51My5kd0dCaXRNYXNrID09IDB4MUMpICYmCi0JCSAgICAoc3JjX3BmLT51NC5kd0JCaXRNYXNrID09IDB4MDMpKSB7Ci0JCSAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqCi0JCSAgICAgICBHTF9VTlNJR05FRF9CWVRFXzNfM18yCi0JCSAgICAgICAqKioqKioqKioqKioqKioqKioqKioqICovCi0JCSAgICBpZiAoY29sb3JrZXlfYWN0aXZlKSB7Ci0JCQkvKiBUaGlzIHRleHR1cmUgZm9ybWF0IHdpbGwgbmV2ZXIgYmUgdXNlZC4uIFNvIGRvIG5vdCBjYXJlIGFib3V0IGNvbG9yIGtleWluZwotCQkJICAgdXAgdW50aWwgdGhlIHBvaW50IGluIHRpbWUgaXQgd2lsbCBiZSBuZWVkZWQgOi0pICovCi0JCQlGSVhNRSgiIENvbG9yS2V5aW5nIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFJHQiAzMzIgZm9ybWF0ICFcbiIpOwotCQkgICAgfQotCQkgICAgY3VycmVudF9mb3JtYXQgPSBHTF9SR0I7Ci0JCSAgICBpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0I7Ci0JCSAgICBjdXJyZW50X3BpeGVsX2Zvcm1hdCA9IEdMX1VOU0lHTkVEX0JZVEVfM18zXzI7Ci0JCSAgICBjb252ZXJ0X3R5cGUgPSBOT19DT05WRVJTSU9OOwotCQl9IGVsc2UgewotCQkgICAgZXJyb3IgPSBUUlVFOwotCQl9Ci0JICAgIH0KLQl9IGVsc2UgaWYgKHNyY19wZi0+dTEuZHdSR0JCaXRDb3VudCA9PSAxNikgewotCSAgICBpZiAoKHNyY19wZi0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCi0JCShzcmNfcGYtPnU1LmR3UkdCQWxwaGFCaXRNYXNrICE9IDB4MDAwMCkpIHsKLQkJaWYgKChzcmNfcGYtPnUyLmR3UkJpdE1hc2sgPT0gICAgICAgIDB4RjgwMCkgJiYKLQkJICAgIChzcmNfcGYtPnUzLmR3R0JpdE1hc2sgPT0gICAgICAgIDB4MDdDMCkgJiYKLQkJICAgIChzcmNfcGYtPnU0LmR3QkJpdE1hc2sgPT0gICAgICAgIDB4MDAzRSkgJiYKLQkJICAgIChzcmNfcGYtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4MDAwMSkpIHsKLQkJICAgIGN1cnJlbnRfZm9ybWF0ID0gR0xfUkdCQTsKLQkJICAgIGludGVybmFsX2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCSAgICBjdXJyZW50X3BpeGVsX2Zvcm1hdCA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzE7Ci0JCSAgICBpZiAoY29sb3JrZXlfYWN0aXZlKSB7Ci0JCQljb252ZXJ0X3R5cGUgPSBDT05WRVJUX0NLXzU1NTE7Ci0JCSAgICB9IGVsc2UgewotCQkJY29udmVydF90eXBlID0gTk9fQ09OVkVSU0lPTjsKLQkJICAgIH0KLQkJfSBlbHNlIGlmICgoc3JjX3BmLT51Mi5kd1JCaXRNYXNrID09ICAgICAgICAweEYwMDApICYmCi0JCQkgICAoc3JjX3BmLT51My5kd0dCaXRNYXNrID09ICAgICAgICAweDBGMDApICYmCi0JCQkgICAoc3JjX3BmLT51NC5kd0JCaXRNYXNrID09ICAgICAgICAweDAwRjApICYmCi0JCQkgICAoc3JjX3BmLT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDAwMEYpKSB7Ci0JCSAgICBjdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCSAgICBpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkgICAgY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OwotCQkgICAgaWYgKGNvbG9ya2V5X2FjdGl2ZSkgewotCQkJY29udmVydF90eXBlID0gQ09OVkVSVF9DS180NDQ0OwotCQkgICAgfSBlbHNlIHsKLQkJCWNvbnZlcnRfdHlwZSA9IE5PX0NPTlZFUlNJT047Ci0JCSAgICB9Ci0JCX0gZWxzZSBpZiAoKHNyY19wZi0+dTIuZHdSQml0TWFzayA9PSAgICAgICAgMHgwRjAwKSAmJgotCQkJICAgKHNyY19wZi0+dTMuZHdHQml0TWFzayA9PSAgICAgICAgMHgwMEYwKSAmJgotCQkJICAgKHNyY19wZi0+dTQuZHdCQml0TWFzayA9PSAgICAgICAgMHgwMDBGKSAmJgotCQkJICAgKHNyY19wZi0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHhGMDAwKSkgewotCQkgICAgaWYgKGNvbG9ya2V5X2FjdGl2ZSkgewotCQkJY29udmVydF90eXBlID0gQ09OVkVSVF9DS180NDQ0X0FSR0I7Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OwotCQkgICAgfSBlbHNlIHsKLQkJCWNvbnZlcnRfdHlwZSA9IE5PX0NPTlZFUlNJT047Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX0JHUkE7Ci0JCQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVjsKLQkJICAgIH0KLQkJfSBlbHNlIGlmICgoc3JjX3BmLT51Mi5kd1JCaXRNYXNrID09ICAgICAgICAweDdDMDApICYmCi0JCQkgICAoc3JjX3BmLT51My5kd0dCaXRNYXNrID09ICAgICAgICAweDAzRTApICYmCi0JCQkgICAoc3JjX3BmLT51NC5kd0JCaXRNYXNrID09ICAgICAgICAweDAwMUYpICYmCi0JCQkgICAoc3JjX3BmLT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDgwMDApKSB7Ci0JCSAgICBpZiAoY29sb3JrZXlfYWN0aXZlKSB7Ci0JCQljb252ZXJ0X3R5cGUgPSBDT05WRVJUX0NLXzE1NTU7Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOwotCQkgICAgfSBlbHNlIHsKLQkJCWNvbnZlcnRfdHlwZSA9IE5PX0NPTlZFUlNJT047Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX0JHUkE7Ci0JCQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVjsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIGVycm9yID0gVFJVRTsKLQkJfQotCSAgICB9IGVsc2UgewotCQlpZiAoKHNyY19wZi0+dTIuZHdSQml0TWFzayA9PSAweEY4MDApICYmCi0JCSAgICAoc3JjX3BmLT51My5kd0dCaXRNYXNrID09IDB4MDdFMCkgJiYKLQkJICAgIChzcmNfcGYtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDFGKSkgewotCQkgICAgaWYgKGNvbG9ya2V5X2FjdGl2ZSkgewotCQkJY29udmVydF90eXBlID0gQ09OVkVSVF9DS181NjU7Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOwotCQkgICAgfSBlbHNlIHsKLQkJCWNvbnZlcnRfdHlwZSA9IE5PX0NPTlZFUlNJT047Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX1JHQjsKLQkJCWludGVybmFsX2Zvcm1hdCA9IEdMX1JHQjsKLQkJCWN1cnJlbnRfcGl4ZWxfZm9ybWF0ID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7Ci0JCSAgICB9Ci0JCX0gZWxzZSBpZiAoKHNyY19wZi0+dTIuZHdSQml0TWFzayA9PSAweDdDMDApICYmCi0JCQkgICAoc3JjX3BmLT51My5kd0dCaXRNYXNrID09IDB4MDNFMCkgJiYKLQkJCSAgIChzcmNfcGYtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDFGKSkgewotCQkgICAgY29udmVydF90eXBlID0gQ09OVkVSVF81NTU7Ci0JCSAgICBjdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCSAgICBpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkgICAgY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOwotCQl9IGVsc2UgewotCQkgICAgZXJyb3IgPSBUUlVFOwotCQl9Ci0JICAgIH0KLQl9IGVsc2UgaWYgKHNyY19wZi0+dTEuZHdSR0JCaXRDb3VudCA9PSAyNCkgewotCSAgICBpZiAoKHNyY19wZi0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCi0JCShzcmNfcGYtPnU1LmR3UkdCQWxwaGFCaXRNYXNrICE9IDB4MDAwMDAwKSkgewotCQllcnJvciA9IFRSVUU7Ci0JICAgIH0gZWxzZSB7Ci0JCWlmICgoc3JjX3BmLT51Mi5kd1JCaXRNYXNrID09IDB4RkYwMDAwKSAmJgotCQkgICAgKHNyY19wZi0+dTMuZHdHQml0TWFzayA9PSAweDAwRkYwMCkgJiYKLQkJICAgIChzcmNfcGYtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDAwRkYpKSB7Ci0JCSAgICBpZiAoY29sb3JrZXlfYWN0aXZlKSB7Ci0JCQljb252ZXJ0X3R5cGUgPSBDT05WRVJUX0NLX1JHQjI0OwotCQkJY3VycmVudF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJaW50ZXJuYWxfZm9ybWF0ID0gR0xfUkdCQTsKLQkJCWN1cnJlbnRfcGl4ZWxfZm9ybWF0ID0gR0xfVU5TSUdORURfSU5UXzhfOF84Xzg7Ci0JCSAgICB9IGVsc2UgewotCQkJY29udmVydF90eXBlID0gTk9fQ09OVkVSU0lPTjsKLQkJCWN1cnJlbnRfZm9ybWF0ID0gR0xfQkdSOwotCQkJaW50ZXJuYWxfZm9ybWF0ID0gR0xfUkdCOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9CWVRFOwotCQkgICAgfQotCQl9IGVsc2UgewotCQkgICAgZXJyb3IgPSBUUlVFOwotCQl9Ci0JICAgIH0KLQl9IGVsc2UgaWYgKHNyY19wZi0+dTEuZHdSR0JCaXRDb3VudCA9PSAzMikgewotCSAgICBpZiAoKHNyY19wZi0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCi0JCShzcmNfcGYtPnU1LmR3UkdCQWxwaGFCaXRNYXNrICE9IDB4MDAwMDAwMDApKSB7Ci0JCWlmICgoc3JjX3BmLT51Mi5kd1JCaXRNYXNrID09ICAgICAgICAweEZGMDAwMDAwKSAmJgotCQkgICAgKHNyY19wZi0+dTMuZHdHQml0TWFzayA9PSAgICAgICAgMHgwMEZGMDAwMCkgJiYKLQkJICAgIChzcmNfcGYtPnU0LmR3QkJpdE1hc2sgPT0gICAgICAgIDB4MDAwMEZGMDApICYmCi0JCSAgICAoc3JjX3BmLT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDAwMDAwMEZGKSkgewotCQkgICAgaWYgKGNvbG9ya2V5X2FjdGl2ZSkgewotCQkJY29udmVydF90eXBlID0gQ09OVkVSVF9DS184ODg4OwotCQkgICAgfSBlbHNlIHsKLQkJCWNvbnZlcnRfdHlwZSA9IE5PX0NPTlZFUlNJT047Ci0JCSAgICB9Ci0JCSAgICBjdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCSAgICBpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkgICAgY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9JTlRfOF84XzhfODsKLQkJfSBlbHNlIGlmICgoc3JjX3BmLT51Mi5kd1JCaXRNYXNrID09ICAgICAgICAweDAwRkYwMDAwKSAmJgotCQkJICAgKHNyY19wZi0+dTMuZHdHQml0TWFzayA9PSAgICAgICAgMHgwMDAwRkYwMCkgJiYKLQkJCSAgIChzcmNfcGYtPnU0LmR3QkJpdE1hc2sgPT0gICAgICAgIDB4MDAwMDAwRkYpICYmCi0JCQkgICAoc3JjX3BmLT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEZGMDAwMDAwKSkgewotCQkgICAgaWYgKGNvbG9ya2V5X2FjdGl2ZSkgewotCQkJY29udmVydF90eXBlID0gQ09OVkVSVF9DS184ODg4X0FSR0I7Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9JTlRfOF84XzhfODsKLQkJICAgIH0gZWxzZSB7Ci0JCQljb252ZXJ0X3R5cGUgPSBOT19DT05WRVJTSU9OOwotCQkJY3VycmVudF9mb3JtYXQgPSBHTF9CR1JBOwotCQkJaW50ZXJuYWxfZm9ybWF0ID0gR0xfUkdCQTsKLQkJCWN1cnJlbnRfcGl4ZWxfZm9ybWF0ID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwotCQkgICAgfQotCQl9IGVsc2UgewotCQkgICAgZXJyb3IgPSBUUlVFOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCWlmICgoc3JjX3BmLT51Mi5kd1JCaXRNYXNrID09IDB4MDBGRjAwMDApICYmCi0JCSAgICAoc3JjX3BmLT51My5kd0dCaXRNYXNrID09IDB4MDAwMEZGMDApICYmCi0JCSAgICAoc3JjX3BmLT51NC5kd0JCaXRNYXNrID09IDB4MDAwMDAwRkYpKSB7Ci0JCSAgICBpZiAobmVlZF9hbHBoYV9jaykgewotCQkJY29udmVydF90eXBlID0gQ09OVkVSVF9SR0IzMl84ODg7Ci0JCQljdXJyZW50X2Zvcm1hdCA9IEdMX1JHQkE7Ci0JCQlpbnRlcm5hbF9mb3JtYXQgPSBHTF9SR0JBOwotCQkJY3VycmVudF9waXhlbF9mb3JtYXQgPSBHTF9VTlNJR05FRF9JTlRfOF84XzhfODsKLQkJICAgIH0gZWxzZSB7Ci0JCQljb252ZXJ0X3R5cGUgPSBOT19DT05WRVJTSU9OOwotCQkJY3VycmVudF9mb3JtYXQgPSBHTF9CR1JBOwotCQkJaW50ZXJuYWxfZm9ybWF0ID0gR0xfUkdCQTsKLQkJCWN1cnJlbnRfcGl4ZWxfZm9ybWF0ID0gR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWOwotCQkgICAgfQotCQl9IGVsc2UgewotCQkgICAgZXJyb3IgPSBUUlVFOwotCQl9Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBlcnJvciA9IFRSVUU7Ci0JfQotICAgIH0gZWxzZSB7Ci0JZXJyb3IgPSBUUlVFOwotICAgIH0gCi0KLSAgICBpZiAoZXJyb3IpIHsKLQlFUlIoIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCBmb3IgdGV4dHVyZXMgOlxuIik7Ci0JaWYgKEVSUl9PTihkZHJhdykpIHsKLQkgICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdChzcmNfcGYpOwotCX0KLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBJWEVMRk9STUFUOwotICAgIH0gZWxzZSB7Ci0JaWYgKChuZWVkX3RvX2FsbG9jKSB8fAotCSAgICAoaW50ZXJuYWxfZm9ybWF0ICE9ICpjdXJyZW50X2ludGVybmFsX2Zvcm1hdCkpIHsKLQkgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIGxldmVsLCBpbnRlcm5hbF9mb3JtYXQsCi0JCQkgdGV4X3dpZHRoLCB0ZXhfaGVpZ2h0LCAwLAotCQkJIGN1cnJlbnRfZm9ybWF0LCBjdXJyZW50X3BpeGVsX2Zvcm1hdCwgTlVMTCk7Ci0JICAgICpjdXJyZW50X2ludGVybmFsX2Zvcm1hdCA9IGludGVybmFsX2Zvcm1hdDsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHN1Yl90ZXh0dXJlICYmIChjb252ZXJ0X3R5cGUgPT0gTk9fQ09OVkVSU0lPTikpIHsKLQljdXJyZW50X3N0b3JhZ2Vfd2lkdGggPSBzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCAvIGJwcDsKLSAgICB9IGVsc2UgewotCWlmIChzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCA9PSAoc3VyZl9wdHItPnN1cmZhY2VfZGVzYy5kd1dpZHRoICogYnBwKSkgewotCSAgICBjdXJyZW50X3N0b3JhZ2Vfd2lkdGggPSAwOwotCX0gZWxzZSB7Ci0JICAgIGN1cnJlbnRfc3RvcmFnZV93aWR0aCA9IHN1cmZfcHRyLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoIC8gYnBwOwotCX0JCi0gICAgfQotICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX1JPV19MRU5HVEgsIGN1cnJlbnRfc3RvcmFnZV93aWR0aCk7Ci0KLSAgICBUUkFDRSgiIGluaXRpYWxpemVkIHRleHR1cmUgdXBsb2FkIGZvciBsZXZlbCAlZCB3aXRoIGNvbnZlcnNpb24gJWQuXG4iLCBjdXJyZW50X2xldmVsLCBjb252ZXJ0X3R5cGUpOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCB1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5KFJFQ1QgKnJlY3QsIERXT1JEIHhvZmZzZXQsIERXT1JEIHlvZmZzZXQsIHZvaWQgKip0ZW1wX2J1ZmZlcikKLXsKLSAgICBjb25zdCBERFNVUkZBQ0VERVNDICogY29uc3Qgc3JjX2QgPSAoRERTVVJGQUNFREVTQyAqKSYoY3VycmVudF9zdXJmYWNlLT5zdXJmYWNlX2Rlc2MpOwotICAgIHZvaWQgKnN1cmZfYnVmZmVyID0gTlVMTDsKLSAgICBSRUNUIGxyZWN0OwotICAgIERXT1JEIHdpZHRoLCBoZWlnaHQ7Ci0gICAgQllURSBicHAgPSBHRVRfQlBQKGN1cnJlbnRfc3VyZmFjZS0+c3VyZmFjZV9kZXNjKTsKLSAgICBpbnQgbGluZV9pbmNyZWFzZTsKLSAgICAKLSAgICBpZiAocmVjdCA9PSBOVUxMKSB7Ci0JbHJlY3QudG9wID0gMDsKLQlscmVjdC5sZWZ0ID0gMDsKLQlscmVjdC5ib3R0b20gPSBjdXJyZW50X3RleF9oZWlnaHQ7Ci0JbHJlY3QucmlnaHQgPSBjdXJyZW50X3RleF93aWR0aDsKLQlyZWN0ID0gJmxyZWN0OwotICAgIH0KLQotICAgIHdpZHRoID0gcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0OwotICAgIGhlaWdodCA9IHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcDsKLQotICAgIGlmIChjdXJyZW50X3N1cmZhY2UtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfRk9VUkNDKSB7Ci0JR0xpbnQgcmV0VmFsOwotCWludCBzaXplID0gY3VycmVudF9zdXJmYWNlLT5zdXJmYWNlX2Rlc2MudTEuZHdMaW5lYXJTaXplOwotCWludCB3aWR0aF8gPSBjdXJyZW50X3N1cmZhY2UtPnN1cmZhY2VfZGVzYy5kd1dpZHRoOwotCWludCBoZWlnaHRfID0gY3VycmVudF9zdXJmYWNlLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7Ci0JTFBWT0lEIGJ1ZmZlciA9IGN1cnJlbnRfc3VyZmFjZS0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZTsKLQotCXN3aXRjaCAoY3VycmVudF9zdXJmYWNlLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDKSB7Ci0JICAgIGNhc2UgTUFLRV9GT1VSQ0MoJ0QnLCdYJywnVCcsJzEnKTogcmV0VmFsID0gR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7IGJyZWFrOwotCSAgICBjYXNlIE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCczJyk6IHJldFZhbCA9IEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOyBicmVhazsKLQkgICAgY2FzZSBNQUtFX0ZPVVJDQygnRCcsJ1gnLCdUJywnNScpOiByZXRWYWwgPSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCUZJWE1FKCJOb3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIEREX09LOwotCX0KLQotCWlmIChHTF9leHRlbnNpb25zLnMzdGNfY29tcHJlc3NlZF90ZXh0dXJlKSB7Ci0JICAgIC8qIEdMX2V4dGVuc2lvbnMuZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCBjdXJyZW50X2xldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCByZXRWYWwsICh1bnNpZ25lZCBjaGFyKil0ZW1wX2J1ZmZlcik7ICovCi0JICAgIEdMX2V4dGVuc2lvbnMuZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCBjdXJyZW50X2xldmVsLCByZXRWYWwsIHdpZHRoXywgaGVpZ2h0XywgMCwgc2l6ZSwgYnVmZmVyKTsKLQl9IGVsc2UKLQkgICAgRVJSKCJUcnlpbmcgdG8gdXBsb2FkIFMzVEMgdGV4dHVyZSB3aGVyZWFzIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBpdFxuIik7Ci0KLQlyZXR1cm4gRERfT0s7Ci0gICAgfQotICAgIAotICAgIC8qIFVzZWQgd2hlbiBjb252ZXJ0aW5nIHN0dWZmICovCi0gICAgbGluZV9pbmNyZWFzZSA9IHNyY19kLT51MS5sUGl0Y2ggLSAod2lkdGggKiBicHApOwotCi0gICAgc3dpdGNoIChjb252ZXJ0X3R5cGUpIHsKLSAgICAgICAgY2FzZSBDT05WRVJUX1BBTEVUVEVEOiB7Ci0JICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCA9IGN1cnJlbnRfc3VyZmFjZS0+cGFsZXR0ZTsKLQkgICAgQllURSB0YWJsZVsyNTZdWzRdOwotCSAgICB1bnNpZ25lZCBpbnQgaTsKLQkgICAgdW5zaWduZWQgaW50IHgsIHk7Ci0JICAgIEJZVEUgKnNyYyA9IChCWVRFICopICgoKEJZVEUgKikgc3JjX2QtPmxwU3VyZmFjZSkgKyAoYnBwICogcmVjdC0+bGVmdCkgKyAoc3JjX2QtPnUxLmxQaXRjaCAqIHJlY3QtPnRvcCkpLCAqZHN0OwotCSAgICAKLQkgICAgaWYgKHBhbCA9PSBOVUxMKSB7Ci0JCS8qIFVwbG9hZCBhIGJsYWNrIHRleHR1cmUuIFRoZSByZWFsIG9uZSB3aWxsIGJlIHVwbG9hZGVkIG9uIHBhbGV0dGUgY2hhbmdlICovCi0JCVdBUk4oIlBhbGV0dGl6ZWQgdGV4dHVyZSBMb2FkaW5nIHdpdGggYSBOVUxMIHBhbGV0dGUgIVxuIik7Ci0JCW1lbXNldCh0YWJsZSwgMCwgMjU2ICogNCk7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIEdldCB0aGUgc3VyZmFjZSdzIHBhbGV0dGUgKi8KLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCSAgICB0YWJsZVtpXVswXSA9IHBhbC0+cGFsZW50c1tpXS5wZVJlZDsKLQkJICAgIHRhYmxlW2ldWzFdID0gcGFsLT5wYWxlbnRzW2ldLnBlR3JlZW47Ci0JCSAgICB0YWJsZVtpXVsyXSA9IHBhbC0+cGFsZW50c1tpXS5wZUJsdWU7Ci0JCSAgICBpZiAoKHNyY19kLT5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCkgJiYKLQkJCShpID49IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpICYmCi0JCQkoaSA8PSBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSkpCi0JCQkvKiBXZSBzaG91bGQgbWF5YmUgaGVyZSBwdXQgYSBtb3JlICduZXV0cmFsJyBjb2xvciB0aGFuIHRoZSBzdGFuZGFyZCBicmlnaHQgcHVycGxlCi0JCQkgICBvbmUgb2Z0ZW4gdXNlZCBieSBhcHBsaWNhdGlvbiB0byBwcmV2ZW50IHRoZSBuaWNlIHB1cnBsZSBib3JkZXJzIHdoZW4gYmktbGluZWFyCi0JCQkgICBmaWx0ZXJpbmcgaXMgb24gKi8KLQkJCXRhYmxlW2ldWzNdID0gMHgwMDsKLQkJICAgIGVsc2UKLQkJCXRhYmxlW2ldWzNdID0gMHhGRjsKLQkJfQotCSAgICB9Ci0JICAgIAotCSAgICBpZiAoKnRlbXBfYnVmZmVyID09IE5VTEwpCi0JCSp0ZW1wX2J1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCAKLQkJCQkJIGN1cnJlbnRfdGV4X3dpZHRoICogY3VycmVudF90ZXhfaGVpZ2h0ICogc2l6ZW9mKERXT1JEKSk7Ci0JICAgIGRzdCA9IChCWVRFICopICp0ZW1wX2J1ZmZlcjsKLQotCSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLQkJICAgIEJZVEUgY29sb3IgPSAqc3JjKys7Ci0JCSAgICAqZHN0KysgPSB0YWJsZVtjb2xvcl1bMF07Ci0JCSAgICAqZHN0KysgPSB0YWJsZVtjb2xvcl1bMV07Ci0JCSAgICAqZHN0KysgPSB0YWJsZVtjb2xvcl1bMl07Ci0JCSAgICAqZHN0KysgPSB0YWJsZVtjb2xvcl1bM107Ci0JCX0KLQkJc3JjICs9IGxpbmVfaW5jcmVhc2U7Ci0JICAgIH0KLQl9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09OVkVSVF9DS181NjU6IHsKLQkgICAgLyogQ29udmVydGluZyB0aGUgNTY1IGZvcm1hdCBpbiA1NTUxIHBhY2tlZCB0byBlbXVsYXRlIGNvbG9yLWtleWluZy4KLQkgICAgICAgCi0JICAgICAgIE5vdGUgOiBpbiBhbGwgdGhlc2UgY29udmVyc2lvbiwgaXQgd291bGQgYmUgYmVzdCB0byBhdmVyYWdlIHRoZSBhdmVyYWdpbmcKLQkgICAgICAgICAgICAgIHBpeGVscyB0byBnZXQgdGhlIGNvbG9yIG9mIHRoZSBwaXhlbCB0aGF0IHdpbGwgYmUgY29sb3Ita2V5ZWQgdG8KLQkJICAgICAgcHJldmVudCAnY29sb3IgYmxlZWRpbmcnLiBUaGlzIHdpbGwgYmUgZG9uZSBsYXRlciBvbiBpZiBldmVyIGl0IGlzCi0JCSAgICAgIHRvbyB2aXNpYmxlLgotCQkgICAgICAKLQkgICAgICAgTm90ZTI6IHdoZW4gdXNpbmcgY29sb3Ita2V5aW5nICsgYWxwaGEsIGFyZSB0aGUgYWxwaGEgYml0cyBwYXJ0IG9mIHRoZQotCSAgICAgICAgICAgICAgY29sb3Itc3BhY2Ugb3Igbm90ID8KLQkgICAgKi8KLQkgICAgdW5zaWduZWQgaW50IHgsIHk7Ci0JICAgIFdPUkQgKnNyYyA9IChXT1JEICopICgoKEJZVEUgKikgc3JjX2QtPmxwU3VyZmFjZSkgKyAoYnBwICogcmVjdC0+bGVmdCkgKyAoc3JjX2QtPnUxLmxQaXRjaCAqIHJlY3QtPnRvcCkpLCAqZHN0OwotCSAgICAKLQkgICAgaWYgKCp0ZW1wX2J1ZmZlciA9PSBOVUxMKQotCQkqdGVtcF9idWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCQkJIGN1cnJlbnRfdGV4X3dpZHRoICogY3VycmVudF90ZXhfaGVpZ2h0ICogc2l6ZW9mKFdPUkQpKTsKLQkgICAgZHN0ID0gKFdPUkQgKikgKnRlbXBfYnVmZmVyOwotCSAgICAKLQkgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0JCSAgICBXT1JEIGNvbG9yID0gKnNyYysrOwotCQkgICAgKmRzdCA9ICgoY29sb3IgJiAweEZGQzApIHwgKChjb2xvciAmIDB4MUYpIDw8IDEpKTsKLQkJICAgIGlmICgoY29sb3IgPCBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlKSB8fAotCQkJKGNvbG9yID4gc3JjX2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpKQotCQkJKmRzdCB8PSAweDAwMDE7Ci0JCSAgICBkc3QrKzsKLQkJfQotCQlzcmMgPSAoV09SRCAqKSAoKChCWVRFICopIHNyYykgKyBsaW5lX2luY3JlYXNlKTsKLQkgICAgfQotCX0gYnJlYWs7Ci0JCi0gICAgICAgIGNhc2UgQ09OVkVSVF9DS181NTUxOiB7Ci0JICAgIC8qIENoYW5nZSB0aGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbG9yLWtleWVkIHBpeGVscyB0byBlbXVsYXRlIGNvbG9yLWtleWluZy4gKi8KLQkgICAgdW5zaWduZWQgaW50IHgsIHk7Ci0JICAgIFdPUkQgKnNyYyA9IChXT1JEICopICgoKEJZVEUgKikgc3JjX2QtPmxwU3VyZmFjZSkgKyAoYnBwICogcmVjdC0+bGVmdCkgKyAoc3JjX2QtPnUxLmxQaXRjaCAqIHJlY3QtPnRvcCkpLCAqZHN0OwotCSAgICAKLQkgICAgaWYgKCp0ZW1wX2J1ZmZlciA9PSBOVUxMKQotCQkqdGVtcF9idWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCQkJIGN1cnJlbnRfdGV4X3dpZHRoICogY3VycmVudF90ZXhfaGVpZ2h0ICogc2l6ZW9mKFdPUkQpKTsKLQkgICAgZHN0ID0gKFdPUkQgKikgKnRlbXBfYnVmZmVyOwotCSAgICAKLQkgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0JCSAgICBXT1JEIGNvbG9yID0gKnNyYysrOwotCQkgICAgKmRzdCA9IGNvbG9yICYgMHhGRkZFOwotCQkgICAgaWYgKChjb2xvciA8IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpIHx8Ci0JCQkoY29sb3IgPiBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSkpCi0JCQkqZHN0IHw9IGNvbG9yICYgMHgwMDAxOwotCQkgICAgZHN0Kys7Ci0JCX0KLQkJc3JjID0gKFdPUkQgKikgKCgoQllURSAqKSBzcmMpICsgbGluZV9pbmNyZWFzZSk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCQotICAgICAgICBjYXNlIENPTlZFUlRfQ0tfNDQ0NDogewotCSAgICAvKiBDaGFuZ2UgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb2xvci1rZXllZCBwaXhlbHMgdG8gZW11bGF0ZSBjb2xvci1rZXlpbmcuICovCi0JICAgIHVuc2lnbmVkIGludCB4LCB5OwotCSAgICBXT1JEICpzcmMgPSAoV09SRCAqKSAoKChCWVRFICopIHNyY19kLT5scFN1cmZhY2UpICsgKGJwcCAqIHJlY3QtPmxlZnQpICsgKHNyY19kLT51MS5sUGl0Y2ggKiByZWN0LT50b3ApKSwgKmRzdDsKLQkgICAgCi0JICAgIGlmICgqdGVtcF9idWZmZXIgPT0gTlVMTCkKLQkJKnRlbXBfYnVmZmVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkJCSBjdXJyZW50X3RleF93aWR0aCAqIGN1cnJlbnRfdGV4X2hlaWdodCAqIHNpemVvZihXT1JEKSk7Ci0JICAgIGRzdCA9IChXT1JEICopICp0ZW1wX2J1ZmZlcjsKLQkgICAgCi0JICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotCQkgICAgV09SRCBjb2xvciA9ICpzcmMrKzsKLQkJICAgICpkc3QgPSBjb2xvciAmIDB4RkZGMDsKLQkJICAgIGlmICgoY29sb3IgPCBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlKSB8fAotCQkJKGNvbG9yID4gc3JjX2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpKQotCQkJKmRzdCB8PSBjb2xvciAmIDB4MDAwRjsKLQkJICAgIGRzdCsrOwotCQl9Ci0JCXNyYyA9IChXT1JEICopICgoKEJZVEUgKikgc3JjKSArIGxpbmVfaW5jcmVhc2UpOwotCSAgICB9Ci0JfSBicmVhazsKLQkKLSAgICAgICAgY2FzZSBDT05WRVJUX0NLXzQ0NDRfQVJHQjogewotCSAgICAvKiBNb3ZlIHRoZSBmb3VyIEFscGhhIGJpdHMuLi4gKi8KLQkgICAgdW5zaWduZWQgaW50IHgsIHk7Ci0JICAgIFdPUkQgKnNyYyA9IChXT1JEICopICgoKEJZVEUgKikgc3JjX2QtPmxwU3VyZmFjZSkgKyAoYnBwICogcmVjdC0+bGVmdCkgKyAoc3JjX2QtPnUxLmxQaXRjaCAqIHJlY3QtPnRvcCkpLCAqZHN0OwotCSAgICAKLQkgICAgaWYgKCp0ZW1wX2J1ZmZlciA9PSBOVUxMKQotCQkqdGVtcF9idWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCQkJIGN1cnJlbnRfdGV4X3dpZHRoICogY3VycmVudF90ZXhfaGVpZ2h0ICogc2l6ZW9mKFdPUkQpKTsKLQkgICAgZHN0ID0gKFdPUkQgKikgKnRlbXBfYnVmZmVyOwotCSAgICAKLQkgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0JCSAgICBXT1JEIGNvbG9yID0gKnNyYysrOwotCQkgICAgKmRzdCA9IChjb2xvciAmIDB4MEZGRikgPDwgNDsKLQkJICAgIGlmICgoY29sb3IgPCBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlKSB8fAotCQkJKGNvbG9yID4gc3JjX2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpKQotCQkJKmRzdCB8PSAoY29sb3IgJiAweEYwMDApID4+IDEyOwotCQkgICAgZHN0Kys7Ci0JCX0KLQkJc3JjID0gKFdPUkQgKikgKCgoQllURSAqKSBzcmMpICsgbGluZV9pbmNyZWFzZSk7Ci0JICAgIH0KLQl9IGJyZWFrOwotCQotICAgICAgICBjYXNlIENPTlZFUlRfQ0tfMTU1NTogewotCSAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLQkgICAgV09SRCAqc3JjID0gKFdPUkQgKikgKCgoQllURSAqKSBzcmNfZC0+bHBTdXJmYWNlKSArIChicHAgKiByZWN0LT5sZWZ0KSArIChzcmNfZC0+dTEubFBpdGNoICogcmVjdC0+dG9wKSksICpkc3Q7Ci0JICAgIAotCSAgICBpZiAoKnRlbXBfYnVmZmVyID09IE5VTEwpCi0JCSp0ZW1wX2J1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCQkgY3VycmVudF90ZXhfd2lkdGggKiBjdXJyZW50X3RleF9oZWlnaHQgKiBzaXplb2YoV09SRCkpOwotCSAgICBkc3QgPSAoV09SRCAqKSAqdGVtcF9idWZmZXI7Ci0JICAgIAotCSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLQkJICAgIFdPUkQgY29sb3IgPSAqc3JjKys7Ci0JCSAgICAqZHN0ID0gKGNvbG9yICYgMHg3RkZGKSA8PCAxOwotCQkgICAgaWYgKChjb2xvciA8IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpIHx8Ci0JCQkoY29sb3IgPiBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSkpCi0JCQkqZHN0IHw9IChjb2xvciAmIDB4ODAwMCkgPj4gMTU7Ci0JCSAgICBkc3QrKzsKLQkJfQotCQlzcmMgPSAoV09SRCAqKSAoKChCWVRFICopIHNyYykgKyBsaW5lX2luY3JlYXNlKTsKLQkgICAgfQotCX0gYnJlYWs7Ci0JCi0gICAgICAgIGNhc2UgQ09OVkVSVF81NTU6IHsKLQkgICAgLyogQ29udmVydGluZyB0aGUgMDU1NSBmb3JtYXQgaW4gNTU1MSBwYWNrZWQgKi8KLQkgICAgdW5zaWduZWQgaW50IHgsIHk7Ci0JICAgIFdPUkQgKnNyYyA9IChXT1JEICopICgoKEJZVEUgKikgc3JjX2QtPmxwU3VyZmFjZSkgKyAoYnBwICogcmVjdC0+bGVmdCkgKyAoc3JjX2QtPnUxLmxQaXRjaCAqIHJlY3QtPnRvcCkpLCAqZHN0OwotCSAgICAKLQkgICAgaWYgKCp0ZW1wX2J1ZmZlciA9PSBOVUxMKQotCQkqdGVtcF9idWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCQkJIGN1cnJlbnRfdGV4X3dpZHRoICogY3VycmVudF90ZXhfaGVpZ2h0ICogc2l6ZW9mKFdPUkQpKTsKLQkgICAgZHN0ID0gKFdPUkQgKikgKnRlbXBfYnVmZmVyOwotCSAgICAKLQkgICAgaWYgKHNyY19kLT5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCkgewotCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0JCQlXT1JEIGNvbG9yID0gKnNyYysrOwotCQkJKmRzdCA9IChjb2xvciAmIDB4N0ZGRikgPDwgMTsKLQkJCWlmICgoY29sb3IgPCBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlKSB8fAotCQkJICAgIChjb2xvciA+IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlKSkKLQkJCSAgICAqZHN0IHw9IDB4MDAwMTsKLQkJCWRzdCsrOwotCQkgICAgfQotCQkgICAgc3JjID0gKFdPUkQgKikgKCgoQllURSAqKSBzcmMpICsgbGluZV9pbmNyZWFzZSk7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotCQkJV09SRCBjb2xvciA9ICpzcmMrKzsKLQkJCSpkc3QrKyA9ICgoY29sb3IgJiAweDdGRkYpIDw8IDEpIHwgMHgwMDAxOwotCQkgICAgfQotCQkgICAgc3JjID0gKFdPUkQgKikgKCgoQllURSAqKSBzcmMpICsgbGluZV9pbmNyZWFzZSk7Ci0JCX0KLQkgICAgfQotCSAgICAKLQl9IGJyZWFrOwotCQotICAgICAgICBjYXNlIENPTlZFUlRfQ0tfUkdCMjQ6IHsKLQkgICAgLyogVGhpcyBpcyBhIHBhaW4gOi0pICovCi0JICAgIHVuc2lnbmVkIGludCB4LCB5OwotCSAgICBCWVRFICpzcmMgPSAoQllURSAqKSAoKChCWVRFICopIHNyY19kLT5scFN1cmZhY2UpICsgKGJwcCAqIHJlY3QtPmxlZnQpICsgKHNyY19kLT51MS5sUGl0Y2ggKiByZWN0LT50b3ApKTsKLQkgICAgRFdPUkQgKmRzdDsKLQotCSAgICBpZiAoKnRlbXBfYnVmZmVyID09IE5VTEwpCi0JCSp0ZW1wX2J1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCQkgY3VycmVudF90ZXhfd2lkdGggKiBjdXJyZW50X3RleF9oZWlnaHQgKiBzaXplb2YoRFdPUkQpKTsKLQkgICAgZHN0ID0gKERXT1JEICopICp0ZW1wX2J1ZmZlcjsKLQotCSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLQkJICAgIERXT1JEIGNvbG9yID0gKigoRFdPUkQgKikgc3JjKSAmIDB4MDBGRkZGRkY7Ci0JCSAgICBzcmMgKz0gMzsKLQkJICAgICpkc3QgPSBjb2xvciA8PCA4OwotCQkgICAgaWYgKChjb2xvciA8IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpIHx8Ci0JCQkoY29sb3IgPiBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSkpCi0JCQkqZHN0IHw9IDB4RkY7Ci0JCSAgICBkc3QrKzsKLQkJfQotCQlzcmMgKz0gbGluZV9pbmNyZWFzZTsKLQkgICAgfQotCX0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDT05WRVJUX0NLXzg4ODg6IHsKLQkgICAgLyogSnVzdCB1c2UgdGhlIGFscGhhIGNvbXBvbmVudCB0byBoYW5kbGUgY29sb3Ita2V5aW5nLi4uICovCi0JICAgIHVuc2lnbmVkIGludCB4LCB5OwotCSAgICBEV09SRCAqc3JjID0gKERXT1JEICopICgoKEJZVEUgKikgc3JjX2QtPmxwU3VyZmFjZSkgKyAoYnBwICogcmVjdC0+bGVmdCkgKyAoc3JjX2QtPnUxLmxQaXRjaCAqIHJlY3QtPnRvcCkpLCAqZHN0OwotCSAgICAKLQkgICAgaWYgKCp0ZW1wX2J1ZmZlciA9PSBOVUxMKQotCQkqdGVtcF9idWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCQkJIGN1cnJlbnRfdGV4X3dpZHRoICogY3VycmVudF90ZXhfaGVpZ2h0ICogc2l6ZW9mKERXT1JEKSk7CSAgICAKLQkgICAgZHN0ID0gKERXT1JEICopICp0ZW1wX2J1ZmZlcjsKLQkgICAgCi0JICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotCQkgICAgRFdPUkQgY29sb3IgPSAqc3JjKys7Ci0JCSAgICAqZHN0ID0gY29sb3IgJiAweEZGRkZGRjAwOwotCQkgICAgaWYgKChjb2xvciA8IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpIHx8Ci0JCQkoY29sb3IgPiBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSkpCi0JCQkqZHN0IHw9IGNvbG9yICYgMHgwMDAwMDBGRjsKLQkJICAgIGRzdCsrOwotCQl9Ci0JCXNyYyA9IChEV09SRCAqKSAoKChCWVRFICopIHNyYykgKyBsaW5lX2luY3JlYXNlKTsKLQkgICAgfQotCX0gYnJlYWs7Ci0JCi0gICAgICAgIGNhc2UgQ09OVkVSVF9DS184ODg4X0FSR0I6IHsKLQkgICAgdW5zaWduZWQgaW50IHgsIHk7Ci0JICAgIERXT1JEICpzcmMgPSAoRFdPUkQgKikgKCgoQllURSAqKSBzcmNfZC0+bHBTdXJmYWNlKSArIChicHAgKiByZWN0LT5sZWZ0KSArIChzcmNfZC0+dTEubFBpdGNoICogcmVjdC0+dG9wKSksICpkc3Q7Ci0JICAgIAotCSAgICBpZiAoKnRlbXBfYnVmZmVyID09IE5VTEwpCi0JCSp0ZW1wX2J1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCQkgY3VycmVudF90ZXhfd2lkdGggKiBjdXJyZW50X3RleF9oZWlnaHQgKiBzaXplb2YoRFdPUkQpKTsJICAgIAotCSAgICBkc3QgPSAoRFdPUkQgKikgKnRlbXBfYnVmZmVyOwotCSAgICAKLQkgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0JCSAgICBEV09SRCBjb2xvciA9ICpzcmMrKzsKLQkJICAgICpkc3QgPSAoY29sb3IgJiAweDAwRkZGRkZGKSA8PCA4OwotCQkgICAgaWYgKChjb2xvciA8IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpIHx8Ci0JCQkoY29sb3IgPiBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSkpCi0JCQkqZHN0IHw9IChjb2xvciAmIDB4RkYwMDAwMDApID4+IDI0OwotCQkgICAgZHN0Kys7Ci0JCX0KLQkJc3JjID0gKERXT1JEICopICgoKEJZVEUgKikgc3JjKSArIGxpbmVfaW5jcmVhc2UpOwotCSAgICB9Ci0JfSBicmVhazsKLQkKLSAgICAgICAgY2FzZSBDT05WRVJUX1JHQjMyXzg4ODogewotCSAgICAvKiBKdXN0IGFkZCBhbiBhbHBoYSBjb21wb25lbnQgYW5kIGhhbmRsZSBjb2xvci1rZXlpbmcuLi4gKi8KLQkgICAgdW5zaWduZWQgaW50IHgsIHk7Ci0JICAgIERXT1JEICpzcmMgPSAoRFdPUkQgKikgKCgoQllURSAqKSBzcmNfZC0+bHBTdXJmYWNlKSArIChicHAgKiByZWN0LT5sZWZ0KSArIChzcmNfZC0+dTEubFBpdGNoICogcmVjdC0+dG9wKSksICpkc3Q7Ci0JICAgIAotCSAgICBpZiAoKnRlbXBfYnVmZmVyID09IE5VTEwpCi0JCSp0ZW1wX2J1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCQkgY3VycmVudF90ZXhfd2lkdGggKiBjdXJyZW50X3RleF9oZWlnaHQgKiBzaXplb2YoRFdPUkQpKTsJICAgIAotCSAgICBkc3QgPSAoRFdPUkQgKikgKnRlbXBfYnVmZmVyOwotCSAgICAKLQkgICAgaWYgKHNyY19kLT5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCkgewotCQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0JCQlEV09SRCBjb2xvciA9ICpzcmMrKzsKLQkJCSpkc3QgPSBjb2xvciA8PCA4OwotCQkJaWYgKChjb2xvciA8IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpIHx8Ci0JCQkgICAgKGNvbG9yID4gc3JjX2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpKQotCQkJICAgICpkc3QgfD0gMHhGRjsKLQkJCWRzdCsrOwotCQkgICAgfQotCQkgICAgc3JjID0gKERXT1JEICopICgoKEJZVEUgKikgc3JjKSArIGxpbmVfaW5jcmVhc2UpOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQkgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLQkJCSpkc3QrKyA9ICgqc3JjKysgPDwgOCkgfCAweEZGOwotCQkgICAgfQotCQkgICAgc3JjID0gKERXT1JEICopICgoKEJZVEUgKikgc3JjKSArIGxpbmVfaW5jcmVhc2UpOwotCQl9Ci0JICAgIH0KLQl9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgTk9fQ09OVkVSU0lPTjoKLQkgICAgLyogTm90aGluZyB0byBkbyBoZXJlIGFzIHRoZSBuYW1lIHN1Z2dlc3RzLi4uIEp1c3Qgc2V0LXVwIHRoZSBidWZmZXIgY29ycmVjdGx5ICovCi0JICAgIHN1cmZfYnVmZmVyID0gKCgoQllURSAqKSBzcmNfZC0+bHBTdXJmYWNlKSArIChicHAgKiByZWN0LT5sZWZ0KSArIChzcmNfZC0+dTEubFBpdGNoICogcmVjdC0+dG9wKSk7Ci0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChjb252ZXJ0X3R5cGUgIT0gTk9fQ09OVkVSU0lPTikgewotCS8qIFdoZW4gZG9pbmcgY29udmVyc2lvbiwgdGhlIHN0b3JhZ2UgaXMgYWx3YXlzIG9mIHdpZHRoICd3aWR0aCcgYXMgdGhlcmUgd2lsbCBuZXZlcgotCSAgIGJlIGFueSBQaXRjaCBpc3N1ZS4uLiBGb3Igbm93IDotKQotCSovCi0Jc3VyZl9idWZmZXIgPSAqdGVtcF9idWZmZXI7Ci0JaWYgKHdpZHRoICE9IGN1cnJlbnRfc3RvcmFnZV93aWR0aCkgewotCSAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19ST1dfTEVOR1RILCB3aWR0aCk7Ci0JICAgIGN1cnJlbnRfc3RvcmFnZV93aWR0aCA9IHdpZHRoOwotCX0KLSAgICB9Ci0gICAgCi0gICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsCi0JCSAgICBjdXJyZW50X2xldmVsLAotCQkgICAgeG9mZnNldCwgeW9mZnNldCwKLQkJICAgIHdpZHRoLCBoZWlnaHQsCi0JCSAgICBjdXJyZW50X2Zvcm1hdCwKLQkJICAgIGN1cnJlbnRfcGl4ZWxfZm9ybWF0LAotCQkgICAgc3VyZl9idWZmZXIpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnlfcmVsZWFzZSh2b2lkKQotewotICAgIGN1cnJlbnRfc3VyZmFjZSA9IE5VTEw7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3BhbGV0dGUuYyBiL2RsbHMvZGRyYXcvcGFsZXR0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Yjg4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L3BhbGV0dGUuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoJCURpcmVjdERyYXcgLSBJRGlyZWN0UGFsZXR0ZSBiYXNlIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAyMDA2IFN0ZWZhbiBE9nNpbmdlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgorCitXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdQYWxldHRlOjpRdWVyeUludGVyZmFjZQorICoKKyAqIEEgdXN1YWwgUXVlcnlJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uIENhbiBvbmx5IFF1ZXJ5IElVbmtub3duIGFuZAorICogSURpcmVjdERyYXdQYWxldHRlCisgKgorICogUGFyYW1zOgorICogIHJlZmlpZDogVGhlIGludGVyZmFjZSBpZCBxdWVyaWVkIGZvcgorICogIG9iajogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CisgKgorICogUmV0dXJuczoKKyAqICBTX09LIG9uIHN1Y2Nlc3MKKyAqICBFX05PSU5URVJGQUNFIGlmIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlIHdhc24ndCBmb3VuZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3REcmF3UGFsZXR0ZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByZWZpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksb2JqKTsKKworICAgIGlmIChJc0VxdWFsR1VJRChyZWZpaWQsICZJSURfSVVua25vd24pCisgICAgICAgIHx8IElzRXF1YWxHVUlEKHJlZmlpZCwgJklJRF9JRGlyZWN0RHJhd1BhbGV0dGUpKQorICAgIHsKKyAgICAgICAgKm9iaiA9IGlmYWNlOworICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKGlmYWNlKTsKKyAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpvYmogPSBOVUxMOworICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdQYWxldHRlSW1wbDo6QWRkUmVmCisgKgorICogSW5jcmVhc2VzIHRoZSByZWZjb3VudC4KKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSBuZXcgcmVmY291bnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0FkZFJlZihJRGlyZWN0RHJhd1BhbGV0dGUgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgaWZhY2UpOworICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOworCisgICAgVFJBQ0UoIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiAtIDEpOworCisgICAgcmV0dXJuIHJlZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsOjpSZWxlYXNlCisgKgorICogUmVkdWNlcyB0aGUgcmVmY291bnQuIElmIHRoZSByZWZjb3VudCBmYWxscyB0byAwLCB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZAorICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3REcmF3UGFsZXR0ZUltcGxfUmVsZWFzZShJRGlyZWN0RHJhd1BhbGV0dGUgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgaWZhY2UpOworICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOworCisgICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiArIDEpOworCisgICAgaWYgKHJlZiA9PSAwKQorICAgIHsKKyAgICAgICAgSVdpbmVEM0RQYWxldHRlX1JlbGVhc2UoVGhpcy0+d2luZUQzRFBhbGV0dGUpOworICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVmOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3UGFsZXR0ZTo6SW5pdGlhbGl6ZQorICoKKyAqIEluaXRpYWxpemVzIHRoZSBwYWxldHRlLiBBcyB3ZSBzdGFydCBpbml0aWFsaXplZCwgcmV0dXJuCisgKiBEREVSUl9BTFJFQURZSU5JVElBTElaRUQKKyAqCisgKiBQYXJhbXM6CisgKiAgREQ6IERpcmVjdERyYXcgaW50ZXJmYWNlIHRoaXMgcGFsZXR0ZSBpcyBhc2lnbmVkIHRvCisgKiAgRmxhZ3M6IFNvbWUgZmxhZ3MsIGFzIHVzdWFsCisgKiAgQ29sb3JUYWJsZTogVGhlIHN0YXJ0dXAgY29sb3IgdGFibGUKKyAqCisgKiBSZXR1cm5zOgorICogIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdQYWxldHRlSW1wbF9Jbml0aWFsaXplKElEaXJlY3REcmF3UGFsZXR0ZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXcgKkRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTEVUVEVFTlRSWSAqQ29sb3JUYWJsZSkKK3sKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVseCwlcClcbiIsIGlmYWNlLCBERCwgRmxhZ3MsIENvbG9yVGFibGUpOworICAgIHJldHVybiBEREVSUl9BTFJFQURZSU5JVElBTElaRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdQYWxldHRlOjpHZXRDYXBzCisgKgorICogUmV0dXJucyB0aGUgcGFsZXR0ZSBkZXNjcmlwdGlvbgorICoKKyAqIFBhcmFtczoKKyAqICBDYXBzOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBjYXBzIGF0CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ2FwcyBpcyBOVUxMCisgKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEUGFsZXR0ZTo6R2V0Q2FwcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdQYWxldHRlSW1wbF9HZXRDYXBzKElEaXJlY3REcmF3UGFsZXR0ZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKkNhcHMpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCk6IFJlbGF5XG4iLCBUaGlzLCBDYXBzKTsKKworICAgIHJldHVybiBJV2luZUQzRFBhbGV0dGVfR2V0Q2FwcyhUaGlzLT53aW5lRDNEUGFsZXR0ZSwgQ2Fwcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdQYWxldHRlOjpTZXRFbnRyaWVzCisgKgorICogU2V0cyB0aGUgcGFsZXR0ZSBlbnRyaWVzIGZyb20gYSBQQUxFVFRFRU5UUlkgc3RydWN0dXJlLiBXaW5lRDNEIHRha2VzCisgKiBjYXJlIGZvciB1cGRhdGluZyB0aGUgc3VyZmFjZS4KKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6IEZsYWdzLCBhcyB1c3VhbAorICogIFN0YXJ0OiBGaXJzdCBwYWxldHRlIGVudHJ5IHRvIHNldAorICogIENvdW50OiBOdW1iZXIgb2YgZW50cmllcyB0byBzZXQKKyAqICBQYWxFbnQ6IFNvdXJjZSBlbnRyaWVzCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgUGFsRW50IGlzIE5VTEwKKyAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRFbnRyaWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1NldEVudHJpZXMoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgKlBhbEVudCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLCBJRGlyZWN0RHJhd1BhbGV0dGUsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVseCwlbGQsJWxkLCVwKTogUmVsYXlcbiIsIFRoaXMsIEZsYWdzLCBTdGFydCwgQ291bnQsIFBhbEVudCk7CisKKyAgICBpZighUGFsRW50KQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIHJldHVybiBJV2luZUQzRFBhbGV0dGVfU2V0RW50cmllcyhUaGlzLT53aW5lRDNEUGFsZXR0ZSwgRmxhZ3MsIFN0YXJ0LCBDb3VudCwgUGFsRW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1BhbGV0dGU6OkdldEVudHJpZXMKKyAqCisgKiBSZXR1cm5zIHRoZSBlbnRyaWVzIHN0b3JlZCBpbiB0aGlzIGludGVyZmFjZS4KKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6IEZsYWdzIDopCisgKiAgU3RhcnQ6IEZpcnN0IGVudHJ5IHRvIHJldHVybgorICogIENvdW50OiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gcmV0dXJuCisgKiAgUGFsRW50OiBQQUxFVFRFRU5UUlkgc3RydWN0dXJlIHRvIHdyaXRlIHRoZSBlbnRyaWVzIHRvCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgUGFsRW50IGlzIE5VTEwKKyAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRFbnRyaWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0dldEVudHJpZXMoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgKlBhbEVudCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLCBJRGlyZWN0RHJhd1BhbGV0dGUsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVseCwlbGQsJWxkLCVwKTogUmVsYXlcbiIsIFRoaXMsIEZsYWdzLCBTdGFydCwgQ291bnQsIFBhbEVudCk7CisKKyAgICBpZighUGFsRW50KQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIHJldHVybiBJV2luZUQzRFBhbGV0dGVfR2V0RW50cmllcyhUaGlzLT53aW5lRDNEUGFsZXR0ZSwgRmxhZ3MsIFN0YXJ0LCBDb3VudCwgUGFsRW50KTsKK30KKworY29uc3QgSURpcmVjdERyYXdQYWxldHRlVnRibCBJRGlyZWN0RHJhd1BhbGV0dGVfVnRibCA9Cit7CisgICAgLyoqKiBJVW5rbm93biAqKiovCisgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0RHJhd1BhbGV0dGUgKioqLworICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0Q2FwcywKKyAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0dldEVudHJpZXMsCisgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9Jbml0aWFsaXplLAorICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfU2V0RW50cmllcworfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvcGFsZXR0ZV9oYWwuYyBiL2RsbHMvZGRyYXcvcGFsZXR0ZV9oYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwNjQyYS4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L3BhbGV0dGVfaGFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoJRGlyZWN0RHJhd1BhbGV0dGUgSEFMIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotc3RhdGljIGNvbnN0IElEaXJlY3REcmF3UGFsZXR0ZVZ0YmwgRERSQVdfSEFMX1BhbGV0dGVfVlRhYmxlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUlEaXJlY3REcmF3UGFsZXR0ZQotICovCi1IUkVTVUxUIEhBTF9EaXJlY3REcmF3UGFsZXR0ZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcywKLQkJCQkJSURpcmVjdERyYXdJbXBsKiBwREQsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgTFBERFJBV0lfRElSRUNURFJBV19HQkwgZGRfZ2JsID0gcERELT5sb2NhbC5scEdibDsKLSAgICBEREhBTF9DUkVBVEVQQUxFVFRFREFUQSBkYXRhOwotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBociA9IE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQ29uc3RydWN0KFRoaXMsIHBERCwgZHdGbGFncyk7Ci0gICAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKLQotICAgIFRoaXMtPmZpbmFsX3JlbGVhc2UgPSBIQUxfRGlyZWN0RHJhd1BhbGV0dGVfZmluYWxfcmVsZWFzZTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3UGFsZXR0ZSwgRERSQVdfSEFMX1BhbGV0dGVfVlRhYmxlKTsKLQotICAgIC8qIGluaXRpYWxpemUgSEFMIHBhbGV0dGUgKi8KLSAgICBkYXRhLmxwREQgPSBkZF9nYmw7Ci0gICAgZGF0YS5scEREUGFsZXR0ZSA9ICZUaGlzLT5nbG9iYWw7Ci0gICAgZGF0YS5scENvbG9yVGFibGUgPSBOVUxMOwotICAgIGRhdGEuZGRSVmFsID0gMDsKLSAgICBkYXRhLkNyZWF0ZVBhbGV0dGUgPSBkZF9nYmwtPmxwRERDQnRtcC0+SEFMREQuQ3JlYXRlUGFsZXR0ZTsKLSAgICBpZiAoZGF0YS5DcmVhdGVQYWxldHRlKQotCWRhdGEuQ3JlYXRlUGFsZXR0ZSgmZGF0YSk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQKLUhBTF9EaXJlY3REcmF3UGFsZXR0ZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsKiBwREQsIERXT1JEIGR3RmxhZ3MsCi0JCQkgICAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSwKLQkJCSAgICAgTFBVTktOT1dOIHBVbmtPdXRlcikKLXsKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBUaGlzOwotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBpZiAocFVua091dGVyICE9IE5VTEwpCi0JcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsgLyogdW5jaGVja2VkICovCi0KLSAgICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZigqVGhpcykpOwotICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwotCi0gICAgaHIgPSBIQUxfRGlyZWN0RHJhd1BhbGV0dGVfQ29uc3RydWN0KFRoaXMsIHBERCwgZHdGbGFncyk7Ci0gICAgaWYgKEZBSUxFRChocikpCi0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7Ci0gICAgZWxzZQotCSpwcFBhbGV0dGUgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1BhbGV0dGUpOwotCi0gICAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIFdJTkFQSQotSEFMX0RpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSwgRFdPUkQgZHdGbGFncywKLQkJCQkgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkgTFBQQUxFVFRFRU5UUlkgcGFsZW50KQotewotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdQYWxldHRlSW1wbCAqKWlmYWNlOwotICAgIExQRERSQVdJX0RJUkVDVERSQVdfR0JMIGRkX2dibCA9IFRoaXMtPmxvY2FsLmxwRERfbGNsLT5scEdibDsKLSAgICBEREhBTF9TRVRFTlRSSUVTREFUQSBkYXRhOwotCi0gICAgVFJBQ0UoIiglcCktPlNldEVudHJpZXMoJTA4bHgsJWxkLCVsZCwlcClcbiIsVGhpcyxkd0ZsYWdzLGR3U3RhcnQsZHdDb3VudCwKLQkgIHBhbGVudCk7Ci0KLSAgICBkYXRhLmxwREQgPSBkZF9nYmw7Ci0gICAgZGF0YS5scEREUGFsZXR0ZSA9ICZUaGlzLT5nbG9iYWw7Ci0gICAgZGF0YS5kd0Jhc2UgPSBkd1N0YXJ0OwotICAgIGRhdGEuZHdOdW1FbnRyaWVzID0gZHdDb3VudDsKLSAgICBkYXRhLmxwRW50cmllcyA9IHBhbGVudDsKLSAgICBkYXRhLmRkUlZhbCA9IDA7Ci0gICAgZGF0YS5TZXRFbnRyaWVzID0gZGRfZ2JsLT5scEREQ0J0bXAtPkhBTEREUGFsZXR0ZS5TZXRFbnRyaWVzOwotICAgIGlmIChkYXRhLlNldEVudHJpZXMpCi0JZGF0YS5TZXRFbnRyaWVzKCZkYXRhKTsKLQotICAgIHJldHVybiBNYWluX0RpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoaWZhY2UsIGR3RmxhZ3MsIGR3U3RhcnQsIGR3Q291bnQsIHBhbGVudCk7Ci19Ci0KLXZvaWQgSEFMX0RpcmVjdERyYXdQYWxldHRlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcykKLXsKLSAgICBMUEREUkFXSV9ESVJFQ1REUkFXX0dCTCBkZF9nYmwgPSBUaGlzLT5sb2NhbC5scEREX2xjbC0+bHBHYmw7Ci0gICAgRERIQUxfREVTVFJPWVBBTEVUVEVEQVRBIGRhdGE7Ci0KLSAgICAvKiBkZXN0cm95IEhBTCBwYWxldHRlICovCi0gICAgZGF0YS5scEREID0gZGRfZ2JsOwotICAgIGRhdGEubHBERFBhbGV0dGUgPSAmVGhpcy0+Z2xvYmFsOwotICAgIGRhdGEuZGRSVmFsID0gMDsKLSAgICBkYXRhLkRlc3Ryb3lQYWxldHRlID0gZGRfZ2JsLT5scEREQ0J0bXAtPkhBTEREUGFsZXR0ZS5EZXN0cm95UGFsZXR0ZTsKLSAgICBpZiAoZGF0YS5EZXN0cm95UGFsZXR0ZSkKLQlkYXRhLkRlc3Ryb3lQYWxldHRlKCZkYXRhKTsKLQotICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfZmluYWxfcmVsZWFzZShUaGlzKTsKLX0KLQotc3RhdGljIGNvbnN0IElEaXJlY3REcmF3UGFsZXR0ZVZ0YmwgRERSQVdfSEFMX1BhbGV0dGVfVlRhYmxlID0KLXsKLSAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX1F1ZXJ5SW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmLAotICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZSwKLSAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX0dldENhcHMsCi0gICAgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9HZXRFbnRyaWVzLAotICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZSwKLSAgICBIQUxfRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcwotfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvcGFsZXR0ZV9tYWluLmMgYi9kbGxzL2RkcmF3L3BhbGV0dGVfbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZiMGRlLi4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvcGFsZXR0ZV9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoJCURpcmVjdERyYXcgLSBJRGlyZWN0UGFsZXR0ZSBiYXNlIGludGVyZmFjZQotICoKLSAqIENvcHlyaWdodCAxOTk3LTIwMDAgTWFyY3VzIE1laXNzbmVyCi0gKiBDb3B5cmlnaHQgMjAwMC0yMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotI2RlZmluZSBTSVpFX0JJVFMgKEREUENBUFNfMUJJVCB8IEREUENBUFNfMkJJVCB8IEREUENBUFNfNEJJVCB8IEREUENBUFNfOEJJVCkKLQotLyogRm9yIHVuc2lnbmVkIHguIDAgaXMgbm90IGEgcG93ZXIgb2YgMi4gKi8KLSNkZWZpbmUgSVNfUE9XXzIoeCkgKCgoeCkgJiAoKHgpIC0gMSkpID09IDApCi0KLXN0YXRpYyBjb25zdCBJRGlyZWN0RHJhd1BhbGV0dGVWdGJsIEREUkFXX01haW5fUGFsZXR0ZV9WVGFibGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJSURpcmVjdERyYXdQYWxldHRlCi0gKi8KLUhSRVNVTFQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcywKLQkJCQkJIElEaXJlY3REcmF3SW1wbCogcERELCBEV09SRCBkd0ZsYWdzKQotewotICAgIGlmICghSVNfUE9XXzIoZHdGbGFncyAmIFNJWkVfQklUUykpIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCi0gICAgaWYgKGR3RmxhZ3MgJiBERFBDQVBTXzhCSVRFTlRSSUVTKQotCVdBUk4oImNyZWF0aW5nIHBhbGV0dGUgd2l0aCA4IGJpdCBlbnRyaWVzXG4iKTsKLQotICAgIFRoaXMtPnBhbE51bUVudHJpZXMgPSBNYWluX0RpcmVjdERyYXdQYWxldHRlX1NpemUoZHdGbGFncyk7Ci0gICAgVGhpcy0+cmVmID0gMTsKLQotICAgIFRoaXMtPmxvY2FsLmxwR2JsID0gJlRoaXMtPmdsb2JhbDsKLSAgICBUaGlzLT5sb2NhbC5scEREX2xjbCA9ICZwREQtPmxvY2FsOwotICAgIFRoaXMtPmdsb2JhbC5scEREX2xjbCA9ICZwREQtPmxvY2FsOwotICAgIFRoaXMtPmdsb2JhbC5kd1Byb2Nlc3NJZCA9IEdldEN1cnJlbnRQcm9jZXNzSWQoKTsKLSAgICBUaGlzLT5nbG9iYWwuZHdGbGFncyA9IGR3RmxhZ3M7Ci0KLSAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9maW5hbF9yZWxlYXNlOwotICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdQYWxldHRlLCBERFJBV19NYWluX1BhbGV0dGVfVlRhYmxlKTsKLQotICAgIC8qIHdlIGNvdWxkIGRlZmVyIGhwYWwgY3JlYXRpb24gdW50aWwgd2UgbmVlZCBpdCwKLSAgICAgKiBidXQgZG9lcyBhbnlvbmUgaGF2ZSBhIGNhc2Ugd2hlcmUgaXQgd291bGQgYmUgdXNlZnVsPyAqLwotICAgIFRoaXMtPmhwYWwgPSBDcmVhdGVQYWxldHRlKChjb25zdCBMT0dQQUxFVFRFKikmKFRoaXMtPnBhbFZlcnNpb24pKTsKLQotICAgIE1haW5fRGlyZWN0RHJhd19BZGRQYWxldHRlKHBERCwgVGhpcyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQKLU1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQ3JlYXRlKElEaXJlY3REcmF3SW1wbCogcERELCBEV09SRCBkd0ZsYWdzLAotCQkJICAgICAgTFBESVJFQ1REUkFXUEFMRVRURSogcHBQYWxldHRlLAotCQkJICAgICAgTFBVTktOT1dOIHBVbmtPdXRlcikKLXsKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBUaGlzOwotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBpZiAocFVua091dGVyICE9IE5VTEwpCi0JcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsgLyogdW5jaGVja2VkICovCi0KLSAgICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZigqVGhpcykpOwotICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwotCi0gICAgaHIgPSBNYWluX0RpcmVjdERyYXdQYWxldHRlX0NvbnN0cnVjdChUaGlzLCBwREQsIGR3RmxhZ3MpOwotICAgIGlmIChGQUlMRUQoaHIpKQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwotICAgIGVsc2UKLQkqcHBQYWxldHRlID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdQYWxldHRlKTsKLQotICAgIHJldHVybiBocjsKLX0KLQotRFdPUkQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9TaXplKERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgc3dpdGNoIChkd0ZsYWdzICYgU0laRV9CSVRTKQotICAgIHsKLSAgICBjYXNlIEREUENBUFNfMUJJVDogcmV0dXJuIDI7Ci0gICAgY2FzZSBERFBDQVBTXzJCSVQ6IHJldHVybiA0OwotICAgIGNhc2UgRERQQ0FQU180QklUOiByZXR1cm4gMTY7Ci0gICAgY2FzZSBERFBDQVBTXzhCSVQ6IHJldHVybiAyNTY7Ci0gICAgZGVmYXVsdDogYXNzZXJ0KDApOyByZXR1cm4gMjU2OwotICAgIH0KLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcyhMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkgIExQUEFMRVRURUVOVFJZIHBhbGVudCkKLXsKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICpUaGlzID0gKElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKilpZmFjZTsKLQotICAgIFRSQUNFKCIoJXApLT5HZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLFRoaXMsZHdGbGFncyxkd1N0YXJ0LGR3Q291bnQsCi0JICBwYWxlbnQpOwotCi0gICAgaWYgKGR3RmxhZ3MgIT0gMCkgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7IC8qIHVuY2hlY2tlZCAqLwotICAgIGlmIChkd1N0YXJ0ICsgZHdDb3VudCA+IE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfU2l6ZShUaGlzLT5nbG9iYWwuZHdGbGFncykpCi0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0KLSAgICBpZiAoVGhpcy0+Z2xvYmFsLmR3RmxhZ3MgJiBERFBDQVBTXzhCSVRFTlRSSUVTKQotICAgIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQlMUEJZVEUgZW50cnkgPSAoTFBCWVRFKXBhbGVudDsKLQotCWZvciAoaT1kd1N0YXJ0OyBpIDwgZHdDb3VudCtkd1N0YXJ0OyBpKyspCi0JICAgICplbnRyeSsrID0gVGhpcy0+cGFsZW50c1tpXS5wZVJlZDsKLSAgICB9Ci0gICAgZWxzZQotCW1lbWNweShwYWxlbnQsIFRoaXMtPnBhbGVudHMrZHdTdGFydCwgZHdDb3VudCAqIHNpemVvZihQQUxFVFRFRU5UUlkpKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkgIExQUEFMRVRURUVOVFJZIHBhbGVudCkKLXsKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICpUaGlzID0gKElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKilpZmFjZTsKLQotICAgIFRSQUNFKCIoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLFRoaXMsZHdGbGFncyxkd1N0YXJ0LGR3Q291bnQsCi0JICBwYWxlbnQpOwotCi0gICAgaWYgKFRoaXMtPmdsb2JhbC5kd0ZsYWdzICYgRERQQ0FQU184QklURU5UUklFUykKLSAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0JY29uc3QgQllURSogZW50cnkgPSAoY29uc3QgQllURSopcGFsZW50OwotCi0JZm9yIChpPWR3U3RhcnQ7IGkgPCBkd0NvdW50K2R3U3RhcnQ7IGkrKykKLQkgICAgVGhpcy0+cGFsZW50c1tpXS5wZVJlZCA9ICplbnRyeSsrOwotICAgIH0KLSAgICBlbHNlIHsKLQltZW1jcHkoVGhpcy0+cGFsZW50cytkd1N0YXJ0LCBwYWxlbnQsIGR3Q291bnQgKiBzaXplb2YoUEFMRVRURUVOVFJZKSk7Ci0KLQlpZiAoVGhpcy0+aHBhbCkKLQkgICAgU2V0UGFsZXR0ZUVudHJpZXMoVGhpcy0+aHBhbCwgZHdTdGFydCwgZHdDb3VudCwgVGhpcy0+cGFsZW50cytkd1N0YXJ0KTsKLQotCWlmIChUaGlzLT5nbG9iYWwuZHdGbGFncyAmIEREUENBUFNfUFJJTUFSWVNVUkZBQ0UpIHsKLQkgICAgLyogdXBkYXRlIHBoeXNpY2FsIHBhbGV0dGUgKi8KLQkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcHN1cmYgPSBOVUxMOwotCSAgICBJRGlyZWN0RHJhdzdfR2V0R0RJU3VyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLT5kZHJhd19vd25lcixJRGlyZWN0RHJhdzcpLCAmcHN1cmYpOwotCSAgICBpZiAocHN1cmYpIHsKLQkJSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsCi0JCQkJCQkJICAgSURpcmVjdERyYXdTdXJmYWNlNywgcHN1cmYpOwotCQlzdXJmLT51cGRhdGVfcGFsZXR0ZShzdXJmLCBUaGlzLCBkd1N0YXJ0LCBkd0NvdW50LCBwYWxlbnQpOwotCQlJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocHN1cmYpOwotCSAgICB9Ci0JICAgIGVsc2UgRVJSKCJjYW4ndCBmaW5kIEdESSBzdXJmYWNlISFcbiIpOwotCX0KLSAgICB9Ci0KLSNpZiAwCi0gICAgLyogTm93LCBpZiB3ZSBhcmUgaW4gJ2RlcHRoIGNvbnZlcnNpb24gbW9kZScsIHVwZGF0ZSB0aGUgc2NyZWVuIHBhbGV0dGUgKi8KLSAgICAvKiBGSVhNRTogd2UgbmVlZCB0byB1cGRhdGUgdGhlIGltYWdlIG9yIHdlIHdvbid0IGdldCBwYWxldHRlIGZhZGluZy4gKi8KLSAgICBpZiAoVGhpcy0+ZGRyYXctPmQtPnBhbGV0dGVfY29udmVydCAhPSBOVUxMKQotCVRoaXMtPmRkcmF3LT5kLT5wYWxldHRlX2NvbnZlcnQocGFsZW50LFRoaXMtPnNjcmVlbl9wYWxlbnRzLHN0YXJ0LGNvdW50KTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi12b2lkIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBUaGlzKQotewotICAgIE1haW5fRGlyZWN0RHJhd19SZW1vdmVQYWxldHRlKFRoaXMtPmRkcmF3X293bmVyLCBUaGlzKTsKLQotICAgIGlmIChUaGlzLT5ocGFsKSBEZWxldGVPYmplY3QoVGhpcy0+aHBhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfRGVzdHJveShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBUaGlzKQotewotICAgIFRoaXMtPmZpbmFsX3JlbGVhc2UoVGhpcyk7Ci0KLSAgICBpZiAoVGhpcy0+cHJpdmF0ZSAhPSBUaGlzKzEpCi0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+cHJpdmF0ZSk7Ci0KLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7Ci19Ci0KLXZvaWQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Gb3JjZURlc3Ryb3koSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcykKLXsKLSAgICBXQVJOKCJkZWxldGluZyBwYWxldHRlICVwIHdpdGggcmVmY250ICVsdVxuIiwgVGhpcywgVGhpcy0+cmVmKTsKLSAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX0Rlc3Ryb3koVGhpcyk7Ci19Ci0KLVVMT05HIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UpCi17Ci0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICopaWZhY2U7Ci0gICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmICsgMSk7Ci0KLSAgICBpZiAoIXJlZikKLSAgICB7Ci0JTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9EZXN0cm95KFRoaXMpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiByZWY7Ci19Ci0KLVVMT05HIFdJTkFQSSBNYWluX0RpcmVjdERyYXdQYWxldHRlX0FkZFJlZihMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlKSB7Ci0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICopaWZhY2U7Ci0gICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmIC0gMSk7Ci0KLSAgICByZXR1cm4gcmVmOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Jbml0aWFsaXplKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UsCi0JCQkJICBMUERJUkVDVERSQVcgZGRyYXcsIERXT1JEIGR3RmxhZ3MsCi0JCQkJICBMUFBBTEVUVEVFTlRSWSBwYWxlbnQpCi17Ci0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICopaWZhY2U7Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlbGQsJXApXG4iLCBUaGlzLCBkZHJhdywgZHdGbGFncywgcGFsZW50KTsKLSAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9HZXRDYXBzKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UsIExQRFdPUkQgbHBkd0NhcHMpCi17Ci0gICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICpUaGlzID0gKElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKilpZmFjZTsKLSAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMsbHBkd0NhcHMpOwotCi0gICAqbHBkd0NhcHMgPSBUaGlzLT5nbG9iYWwuZHdGbGFnczsKLQotICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLAotCQkJCSAgICAgIFJFRklJRCByZWZpaWQsIExQVk9JRCAqb2JqKQotewotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdQYWxldHRlSW1wbCAqKWlmYWNlOwotICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLFRoaXMsZGVidWdzdHJfZ3VpZChyZWZpaWQpLG9iaik7Ci0KLSAgICBpZiAoSXNFcXVhbEdVSUQocmVmaWlkLCAmSUlEX0lVbmtub3duKQotCXx8IElzRXF1YWxHVUlEKHJlZmlpZCwgJklJRF9JRGlyZWN0RHJhd1BhbGV0dGUpKQotICAgIHsKLQkqb2JqID0gaWZhY2U7Ci0JSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZihpZmFjZSk7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdQYWxldHRlVnRibCBERFJBV19NYWluX1BhbGV0dGVfVlRhYmxlID0KLXsKLSAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX1F1ZXJ5SW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmLAotICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZSwKLSAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX0dldENhcHMsCi0gICAgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9HZXRFbnRyaWVzLAotICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZSwKLSAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMKLX07CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3BhcmVudC5jIGIvZGxscy9kZHJhdy9wYXJlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdiM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9wYXJlbnQuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIElQYXJlbnQgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCisgKgorICogQSB1bml2ZXJzYWwgcGFyZW50IGludGVyZmFjZSBmb3IgZXZlcnl0aGluZyBpbiBXaW5lRDNEIHRoYXQgZG9lc24ndCBoYXZlCisgKiBhIEREcmF3IGNvdW50ZXJwYXJ0CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIndpbmUvcG9ydC5oIgorI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIENPQkpNQUNST1MKKworI2luY2x1ZGUgIndpbmRlZi5oIgorI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJ3aW5ubHMuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbmdkaS5oIgorI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZXhjcHQuaCIKKworI2luY2x1ZGUgImRkcmF3LmgiCisjaW5jbHVkZSAiZDNkLmgiCisKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCisKK1dJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKworY29uc3QgR1VJRCBJSURfSVBhcmVudCA9IHsweGMyMGU0Yzg4LCAweDc0ZTcsIDB4NDk0MCwgezB4YmEsIDB4OWYsIDB4MmUsIDB4MzIsIDB4M2YsIDB4OWQsIDB4YzksIDB4ODF9fTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJVW5rbm93biBtZXRob2RzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVBhcmVudDo6UXVlcnlpbnRlcmZhY2UKKyAqCisgKiBJdCBjYW4ndCBxdWVyeSBhbnkgaW50ZXJmYWNlcywgYW5kIGl0J3Mgbm90IHVzZWQgZm9yIGFueXRoaW5nLiBTbworICogaXQganVzdCByZXR1cm5zIEVfTk9JTlRFUkZBQ0UKKyAqCisgKiBQYXJhbXM6CisgKiAgcmlpZDogZ3VpZCBvZiBxdWVyaWVkIGludGVyZmFjZQorICogIG9iajogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZQorICoKKyAqIFJldHVybiB2YWx1ZXMKKyAqICBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIEVfTk9JTlRFUkZBQ0UgYW5kIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lQYXJlbnRJbXBsX1F1ZXJ5SW50ZXJmYWNlKElQYXJlbnQgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQoreworICAgIElDT01fVEhJU19GUk9NKElQYXJlbnRJbXBsLCBJUGFyZW50LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CisKKyAgICAqb2JqID0gTlVMTDsKKyAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByaWlkICkgfHwKKyAgICAgICAgIElzRXF1YWxHVUlEKCAmSUlEX0lQYXJlbnQsIHJpaWQgKSApCisgICAgeworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSVBhcmVudCk7CisgICAgICAgIElQYXJlbnRfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElQYXJlbnQpKTsKKyAgICAgICAgcmV0dXJuIEREX09LOworICAgIH0KKyAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJUGFyZW50OjpBZGRSZWYKKyAqCisgKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50CisgKgorICogUGFyYW1zOgorICoKKyAqIFJldHVybiB2YWx1ZXMKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSVBhcmVudEltcGxfQWRkUmVmKElQYXJlbnQgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElQYXJlbnRJbXBsLCBJUGFyZW50LCBpZmFjZSk7CisgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CisKKyAgICBUUkFDRSgiKCVwKSA6IEFkZFJlZiBmcm9tICVsZFxuIiwgVGhpcywgcmVmIC0gMSk7CisKKyAgICByZXR1cm4gcmVmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVBhcmVudDo6UmVsZWFzZQorICoKKyAqIFJlbGVhc2VzIHRoZSByZWZjb3VudCwgYW5kIGRlc3Ryb3lzIHRoZSBvYmplY3QgaWYgdGhlIHJlZmNvdW50IGZhbGxzIHRvIDAKKyAqIEFsc28gcmVsZWFzZXMgdGhlIGNoaWxkIG9iamVjdCwgaWYgZGVzdHJveWVkLiBUaGF0J3MgYWxtb3N0IHRoZSB3aG9sZSBzZW5zZQorICogb2YgdGhpcyBpbnRlcmZhY2UuCisgKgorICogUGFyYW1zOgorICoKKyAqIFJldHVybiB2YWx1ZXMKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSSAKK0lQYXJlbnRJbXBsX1JlbGVhc2UoSVBhcmVudCAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSVBhcmVudEltcGwsIElQYXJlbnQsIGlmYWNlKTsKKyAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKKworICAgIFRSQUNFKCIoJXApIDogUmVsZWFzZVJlZiB0byAlbGRcbiIsIFRoaXMsIHJlZik7CisKKyAgICBpZiAocmVmID09IDApCisgICAgeworICAgICAgICBUUkFDRSgiKCVwKSBSZWxlYXNpbmcgY2hpbGQgYXQgJXBcbiIsIFRoaXMsIFRoaXMtPmNoaWxkKTsKKyAgICAgICAgaWYoVGhpcy0+Y2hpbGQpCisgICAgICAgICAgICBJVW5rbm93bl9SZWxlYXNlKFRoaXMtPmNoaWxkKTsKKyAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CisgICAgICAgIFRSQUNFKCJSZWxlYXNlZFxuIik7CisgICAgfQorICAgIHJldHVybiByZWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIFZUYWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgSVBhcmVudFZ0YmwgSVBhcmVudF9WdGJsID0KK3sKKyAgICAgSVBhcmVudEltcGxfUXVlcnlJbnRlcmZhY2UsCisgICAgIElQYXJlbnRJbXBsX0FkZFJlZiwKKyAgICAgSVBhcmVudEltcGxfUmVsZWFzZSwKK307CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3N1cmZhY2UuYyBiL2RsbHMvZGRyYXcvc3VyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2VjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L3N1cmZhY2UuYwpAQCAtMCwwICsxLDIwOTEgQEAKKy8qIERpcmVjdERyYXcgU3VyZmFjZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgTGlvbmVsIFVsbWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgKGludGVybmFsKSBkcml2ZXIgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucywKKyAqIGRyaXZlciBlbnVtZXJhdGlvbiBBUElzIGFuZCBEaXJlY3REcmF3IGNyZWF0aW9uIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAid2luZS9wb3J0LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDT0JKTUFDUk9TCisjZGVmaW5lIE5PTkFNRUxFU1NVTklPTgorCisjaW5jbHVkZSAid2luZGVmLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2luZ2RpLmgiCisjaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJleGNwdC5oIgorCisjaW5jbHVkZSAiZGRyYXcuaCIKKyNpbmNsdWRlICJkM2QuaCIKKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCisKK1dJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJVW5rb3duIHBhcnRzIGZvbGxvdworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlF1ZXJ5SW50ZXJmYWNlCisgKgorICogQSBub3JtYWwgUXVlcnlJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uIEZvciBRdWVyeUludGVyZmFjZSBydWxlcworICogc2VlIGRkcmF3LmMsIElEaXJlY3REcmF3Nzo6UXVlcnlJbnRlcmZhY2UuIFRoaXMgbWV0aG9kCisgKiBjYW4gUXVlcnkgSURpcmVjdERyYXdTdXJmYWNlIGludGVyZmFjZXMgaW4gYWxsIHZlcnNpb24sIElEaXJlY3QzRFRleHR1cmUKKyAqIGluIGFsbCB2ZXJzaW9ucywgdGhlIElEaXJlY3REcmF3R2FtbWFDb250cm9sIGludGVyZmFjZSBhbmQgaXQgY2FuCisgKiBjcmVhdGUgYW4gSURpcmVjdDNERGV2aWNlLiAoVXNlcyBJRGlyZWN0M0Q3OjpDcmVhdGVEZXZpY2UpCisgKgorICogUGFyYW1zOgorICogIHJpaWQ6IFRoZSBpbnRlcmZhY2UgaWQgcXVlcmllZCBmb3IKKyAqICBvYmo6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIHBvaW50ZXIgdG8KKyAqCisgKiBSZXR1cm5zOgorICogIFNfT0sgb24gc3VjY2VzcworICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisKKyAgICAvKiBBY2NvcmRpbmcgdG8gQ09NIGRvY3MsIGlmIHRoZSBRdWVyeUludGVyZmFjZSBmYWlscywgb2JqIHNob3VsZCBiZSBzZXQgdG8gTlVMTCAqLworICAgICpvYmogPSBOVUxMOworCisgICAgaWYoIXJpaWQpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJpaWQpLG9iaik7CisgICAgaWYgKElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVVua25vd24pCisgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSURpcmVjdERyYXdTdXJmYWNlNykKKyAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U0KSApCisgICAgeworICAgICAgICBJVW5rbm93bl9BZGRSZWYoaWZhY2UpOworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CisgICAgICAgIFRSQUNFKCIoJXApIHJldHVybmluZyBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CisgICAgICAgIHJldHVybiBTX09LOworICAgIH0KKyAgICBlbHNlIGlmKCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMpCisgICAgICAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UyKQorICAgICAgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSURpcmVjdERyYXdTdXJmYWNlKSApCisgICAgeworICAgICAgICBJVW5rbm93bl9BZGRSZWYoaWZhY2UpOworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlMyk7CisgICAgICAgIFRSQUNFKCIoJXApIHJldHVybmluZyBJRGlyZWN0RHJhd1N1cmZhY2UzIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgKm9iaik7CisgICAgICAgIHJldHVybiBTX09LOworICAgIH0KKyAgICBlbHNlIGlmKCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lEaXJlY3REcmF3R2FtbWFDb250cm9sKSApCisgICAgeworICAgICAgICBJVW5rbm93bl9BZGRSZWYoaWZhY2UpOworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdHYW1tYUNvbnRyb2wpOworICAgICAgICBUUkFDRSgiKCVwKSByZXR1cm5pbmcgSURpcmVjdERyYXdHYW1tYUNvbnRyb2wgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKyAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgfQorICAgIGVsc2UgaWYoIElzRXF1YWxHVUlEKHJpaWQsICZJSURfRDNEREVWSUNFX1dpbmVEM0QpIHx8CisgICAgICAgICAgICAgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JRGlyZWN0M0RIQUxEZXZpY2UpICkKKyAgICB7CisgICAgICAgIElEaXJlY3QzRERldmljZTcgKmQzZDsKKworICAgICAgICAvKiBDYWxsIGludG8gSURpcmVjdDNENyBmb3IgY3JlYXRpb24gKi8KKyAgICAgICAgSURpcmVjdDNEN19DcmVhdGVEZXZpY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3QzRDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQzZCk7CisKKyAgICAgICAgKm9iaiA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2UsIGQzZCk7CisgICAgICAgIFRSQUNFKCIoJXApIFJldHVybmluZyBJRGlyZWN0M0REZXZpY2UgaW50ZXJmYWNlIGF0ICVwXG4iLCBUaGlzLCAqb2JqKTsKKworICAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisgICAgZWxzZSBpZiAoSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEVGV4dHVyZSwgcmlpZCApIHx8CisgICAgICAgICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEVGV4dHVyZTIsIHJpaWQgKSkKKyAgICB7CisgICAgICAgIGlmIChJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RUZXh0dXJlLCByaWlkICkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RUZXh0dXJlKTsKKyAgICAgICAgICAgIFRSQUNFKCIgcmV0dXJuaW5nIERpcmVjdDNEVGV4dHVyZSBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JqKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RUZXh0dXJlMik7CisgICAgICAgICAgICBUUkFDRSgiIHJldHVybmluZyBEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZSBhdCAlcC5cbiIsICpvYmopOworICAgICAgICB9CisgICAgICAgIElVbmtub3duX0FkZFJlZiggKElVbmtub3duICopICpvYmopOworICAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisKKyAgICBFUlIoIk5vIGludGVyZmFjZVxuIik7CisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6QWRkUmVmCisgKgorICogQSBub3JtYWwgYWRkcmVmIGltcGxlbWVudGF0aW9uCisgKgorICogUmV0dXJuczoKKyAqICBUaGUgbmV3IHJlZmNvdW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9BZGRSZWYoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFVMT05HIHJlZkNvdW50ID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CisKKyAgICBUUkFDRSgiKCVwKSA6IEFkZFJlZiBpbmNyZWFzaW5nIGZyb20gJWxkXG4iLCBUaGlzLCByZWZDb3VudCAtIDEpOworICAgIHJldHVybiByZWZDb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0Rlc3Ryb3kKKyAqCisgKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgSURpcmVjdERyYXdTdXJmYWNlNzo6UmVsZWFzZQorICoKKyAqIEZyZWVzIHRoZSBzdXJmYWNlLCByZWdhcmRsZXNzIG9mIGl0J3MgcmVmY291bnQuCisgKiAgU2VlIElEaXJlY3REcmF3U3VyZmFjZTc6OlJlbGVhc2UgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqCisgKiBQYXJhbXM6CisgKiAgVGhpczogU3VyZmFjZSB0byBmcmVlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9EZXN0cm95KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMpCit7CisgICAgVFJBQ0UoIiglcClcbiIsIFRoaXMpOworCisgICAgLyogQ2hlY2sgdGhlIHJlZmNvdW50IGFuZCBnaXZlIGEgd2FybmluZyAqLworICAgIGlmKFRoaXMtPnJlZiA+IDEpCisgICAgeworICAgICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBsZXggc3VyZmFjZSBpcyBkZXN0cm95ZWQsCisgICAgICAgICAqIGJlY2F1c2UgdGhlIDJuZCBzdXJmYWNlIHdhcyBhZGRyZWYoKWVkIHdoZW4gdGhlIGFwcAorICAgICAgICAgKiBjYWxsZWQgR2V0QXR0YWNoZWRTdXJmYWNlCisgICAgICAgICAqLworICAgICAgICBXQVJOKCIoJXApOiBEZXN0cm95aW5nIHN1cmZhY2Ugd2l0aCByZWZvdW50ICVsZFxuIiwgVGhpcywgVGhpcy0+cmVmKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgYXR0YWNoZWQgc3VyZmFjZXMgYW5kIGRldGFjaCB0aGVtICovCisgICAgaWYoVGhpcy0+Zmlyc3RfYXR0YWNoZWQgIT0gVGhpcykKKyAgICB7CisgICAgICAgIC8qIFdlbGwsIHRoaXMgc2hvdWxkbid0IGhhcHBlbjogVGhlIHN1cmZhY2UgYmVlaW5nIGF0dGFjaGVkIGlzIGFkZHJlZigpZWQKKyAgICAgICAgICAqIGluIEFkZEF0dGFjaGVkU3VyZmFjZSwgc28gaXQgc2hvdWxkbid0IGJlIHJlbGVhc2VkIHVudGlsIERlbGV0ZUF0dGFjaGVkU3VyZmFjZQorICAgICAgICAgICogaXMgY2FsbGVkLCBiZWNhdXNlIHRoZSByZWZjb3VudCBpcyBob2xkLiBJdCBsb29rcyBsaWtlIHRoZSBhcHAgcmVsZWFzZWQoKQorICAgICAgICAgICogaXQgb2Z0ZW4gZW5vdWdodCB0byBmb3JjZSB0aGlzCisgICAgICAgICAgKi8KKyAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqcm9vdCA9IElDT01fSU5URVJGQUNFKFRoaXMtPmZpcnN0X2F0dGFjaGVkLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKyAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqZGV0YWNoID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CisKKyAgICAgICAgRklYTUUoIiglcCkgRnJlZWluZyBhIHN1cmZhY2UgdGhhdCBpcyBhdHRhY2hlZCB0byBzdXJmYWNlICVwXG4iLCBUaGlzLCBUaGlzLT5maXJzdF9hdHRhY2hlZCk7CisKKyAgICAgICAgLyogVGhlIHJlZmNvdW50IHdpbGwgZHJvcCB0byAtMSBoZXJlICovCisgICAgICAgIGlmKElEaXJlY3REcmF3U3VyZmFjZTdfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKHJvb3QsIDAsIGRldGFjaCkgIT0gRERfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiKCVwKSBEZWxldGVBdHRhY2hlZFN1cmZhY2UgZmFpbGVkIVxuIiwgVGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZShUaGlzLT5uZXh0X2F0dGFjaGVkICE9IE5VTEwpCisgICAgeworICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpyb290ID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CisgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKmRldGFjaCA9IElDT01fSU5URVJGQUNFKFRoaXMtPm5leHRfYXR0YWNoZWQsIElEaXJlY3REcmF3U3VyZmFjZTcpOworCisgICAgICAgIGlmKElEaXJlY3REcmF3U3VyZmFjZTdfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKHJvb3QsIDAsIGRldGFjaCkgIT0gRERfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiKCVwKSBEZWxldGVBdHRhY2hlZFN1cmZhY2UgZmFpbGVkIVxuIiwgVGhpcyk7CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBOb3cgZGVzdHJveSB0aGUgc3VyZmFjZS4gV2FpdDogSXQgY291bGQgaGF2ZSBiZWVuIHJlbGVhc2VkIGlmIHdlIGFyZSBhIHRleHR1cmUgKi8KKyAgICBpZihUaGlzLT5XaW5lRDNEU3VyZmFjZSkKKyAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1JlbGVhc2UoVGhpcy0+V2luZUQzRFN1cmZhY2UpOworCisgICAgLyogUmVkdWNlIHRoZSBkZHJhdyBzdXJmYWNlIGNvdW50ICovCisgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPmRkcmF3LT5zdXJmYWNlcyk7CisgICAgaWYoVGhpcy0+cHJldikKKyAgICAgICAgVGhpcy0+cHJldi0+bmV4dCA9IFRoaXMtPm5leHQ7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXNzZXJ0KFRoaXMtPmRkcmF3LT5zdXJmYWNlX2xpc3QgPT0gVGhpcyk7CisgICAgICAgIFRoaXMtPmRkcmF3LT5zdXJmYWNlX2xpc3QgPSBUaGlzLT5uZXh0OworICAgIH0KKyAgICBpZihUaGlzLT5uZXh0KQorICAgICAgICBUaGlzLT5uZXh0LT5wcmV2ID0gVGhpcy0+cHJldjsKKworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlJlbGVhc2UKKyAqCisgKiBSZWR1Y2VzIHRoZSBzdXJmYWNlJ3MgcmVmY291bnQgYnkgMS4gSWYgdGhlIHJlZmNvdW50IGZhbGxzIHRvIDAsIHRoZQorICogc3VyZmFjZSBpcyBkZXN0cm95ZWQuCisgKgorICogRGVzdHJveWluZyB0aGUgc3VyZmFjZSBpcyBhIGJpdCB0cmlja3kuIEZvciB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuCisgKiBXaW5lRDNEU3VyZmFjZXMgYW5kIERpcmVjdERyYXdTdXJmYWNlcyBzZWUgSURpcmVjdERyYXc3OjpDcmVhdGVTdXJmYWNlCisgKiBJdCBoYXMgYSBuaWNlIGdyYXBoIGV4cGxhaW5pbmcgdGhlIGNvbm5lY3Rpb24uCisgKgorICogV2hhdCBoYXBwZW5zIGhlcmUgaXMgYmFzaWNhbGx5IHRoaXM6CisgKiBXaGVuIGEgc3VyZmFjZSBpcyBkZXN0cm95ZWQsIGl0J3MgV2luZUQzRFN1cmZhY2UgaXMgcmVsZWFzZWQsCisgKiBhbmQgdGhlIHJlZmNvdW50IG9mIHRoZSBEaXJlY3REcmF3IGludGVyZmFjZSBpcyByZWR1Y2VkIGJ5IDEuIElmIGl0IGhhcworICogY29tcGxleCBzdXJmYWNlcyBhdHRhY2hlZCB0byBpdCwgdGhlbiB0aGVzZSBzdXJmYWNlcyBhcmUgZGVzdHJveWVkIHRvbywKKyAqIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgcmVmY291bnQuIElmIGFueSBzdXJmYWNlIGJlZWluZyBkZXN0cm95ZWQgaGFzIGFub3RoZXIKKyAqIHN1cmZhY2UgYXR0YWNoZWQgdG8gaXQod2l0aCBhICJzb2Z0IiBhdHRhY2htZW50LCBub3QgY29tcGxleCksIHRoZW4KKyAqIHRoaXMgc3VyZmFjZSBpcyBkZXRhY2hlZCB3aXRoIERlbGV0ZUF0dGFjaGVkU3VyZmFjZS4KKyAqCisgKiBXaGVuIHRoZSBzdXJmYWNlIGlzIGEgdGV4dHVyZSwgdGhlIFdpbmVEM0RUZXh0dXJlIGlzIHJlbGVhc2VkLgorICogSWYgdGhlIHN1cmZhY2UgaXMgdGhlIERpcmVjdDNEIHJlbmRlciB0YXJnZXQsIHRoZW4gdGhlIEQzRAorICogY2FwYXRpYmxpdGllcyBvZiB0aGUgV2luZUQzRERldmljZSBhcmUgdW5pbml0aWFsaXplZCwgd2hpY2ggY2F1c2VzIHRoZQorICogc3dhcGNoYWluIHRvIGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfUmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVUxPTkcgcmVmOworICAgIFRSQUNFKCIoJXApIDogUmVsZWFzaW5nIGZyb20gJWxkXG4iLCBUaGlzLCBUaGlzLT5yZWYpOworICAgIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZWYpOworCisgICAgaWYgKHJlZiA9PSAwKQorICAgIHsKKworICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmOworICAgICAgICBJRGlyZWN0RHJhd0ltcGwgKmRkcmF3OworCisgICAgICAgIC8qIERlc3Ryb3kgYWxsIGNvbXBsZXggYXR0YWNoZWQgc3VyZmFjZXMKKyAgICAgICAgICogVGhlcmVmb3JlLCBzdGFydCB3aXRoIHRoZSBmaXJzdCBzdXJmYWNlLAorICAgICAgICAgKiBleGNlcHQgZm9yIHRleHR1cmVzLiBOb3QgZW50aXJlbHkgc3VyZSB3aGF0IGhhcworICAgICAgICAgKiB0byBoYXBwZW4gZXhhY3RseSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICovCisgICAgICAgIGlmKCAoVGhpcy0+Zmlyc3RfY29tcGxleCAhPSBUaGlzKSAmJiAhKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfVEVYVFVSRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJWE1FKCIoJXApIERlc3Ryb3lpbmcgYSBzdXJmYWNlIHdoaWNoIGlzIGEgYXR0YWNoZWQgdG8gYSBjb21wbGV4IHJvb3QgJXBcbiIsIFRoaXMsIFRoaXMtPmZpcnN0X2NvbXBsZXgpOworICAgICAgICB9CisgICAgICAgIGRkcmF3ID0gVGhpcy0+ZGRyYXc7CisKKyAgICAgICAgLyogSWYgaXQncyBhIHRleHR1cmUsIGRlc3Ryb3kgdGhlIFdpbmVEM0RUZXh0dXJlLgorICAgICAgICAgKiBXaW5lRDNEIHdpbGwgZGVzdHJveSB0aGUgSVBhcmVudCBpbnRlcmZhY2VzCisgICAgICAgICAqIG9mIHRoZSBzdWJsZXZlbHMsIHdoaWNoIGRlc3Ryb3lzIHRoZSBXaW5lRDNEU3VyZmFjZXMuCisgICAgICAgICAqIFNldCB0aGUgc3VyZmFjZXMgdG8gTlVMTCB0byBhdm9pZCBkZXN0cm95aW5nIHRoZW0gYWdhaW4gbGF0ZXIKKyAgICAgICAgICovCisgICAgICAgIGlmKFRoaXMtPndpbmVEM0RUZXh0dXJlKQorICAgICAgICB7CisgICAgICAgICAgICBJV2luZUQzRFRleHR1cmVfUmVsZWFzZShUaGlzLT53aW5lRDNEVGV4dHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgaXQncyB0aGUgUmVuZGVyVGFyZ2V0LCBkZXN0cm95IHRoZSBkM2RkZXZpY2UgKi8KKyAgICAgICAgZWxzZSBpZiggKGRkcmF3LT5kM2RfaW5pdGlhbGl6ZWQpICYmIChUaGlzID09IGRkcmF3LT5kM2RfdGFyZ2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoIiglcCkgRGVzdHJveWluZyB0aGUgcmVuZGVyIHRhcmdldCwgdW5pbml0aWFsaXppbmcgRDNEXG4iLCBUaGlzKTsKKworICAgICAgICAgICAgLyogVW5zZXQgYW55IGluZGV4IGJ1ZmZlciwganVzdCB0byBiZSBzdXJlICovCisgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRJbmRpY2VzKGRkcmF3LT53aW5lRDNERGV2aWNlLCBOVUxMLCAwKTsKKworICAgICAgICAgICAgaWYoSVdpbmVEM0REZXZpY2VfVW5pbml0M0QoZGRyYXctPndpbmVEM0REZXZpY2UpICE9IEQzRF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBOb3QgZ29vZCAqLworICAgICAgICAgICAgICAgIEVSUigiKCVwKSBGYWlsZWQgdG8gdW5pbml0IDNEXG4iLCBUaGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGcmVlIHRoZSBkM2Qgd2luZG93IGlmIG9uZSB3YXMgY3JlYXRlZCAqLworICAgICAgICAgICAgICAgIGlmKGRkcmF3LT5kM2Rfd2luZG93ICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUUkFDRSgiICglcCkgRGVzdHJveWluZyB0aGUgaGlkZGVuIHJlbmRlciB3aW5kb3cgJXBcbiIsIFRoaXMsIGRkcmF3LT5kM2Rfd2luZG93KTsKKyAgICAgICAgICAgICAgICAgICAgRGVzdHJveVdpbmRvdyhkZHJhdy0+ZDNkX3dpbmRvdyk7CisgICAgICAgICAgICAgICAgICAgIGRkcmF3LT5kM2Rfd2luZG93ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogVW5zZXQgdGhlIHBvaW50ZXJzICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRkcmF3LT5kM2RfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGRkcmF3LT5kM2RfdGFyZ2V0ID0gTlVMTDsKKworICAgICAgICAgICAgLyogV3JpdGUgYSB0cmFjZSBiZWNhdXNlIEQzRCB1bmxvYWRpbmcgd2FzIHRoZSByZWFzb24gZm9yIG1hbnkKKyAgICAgICAgICAgICAqIGNyYXNoZXMgZHVyaW5nIGRldmVsb3BtZW50LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBUUkFDRSgiKCVwKSBEM0QgdW5sb2FkZWRcbiIsIFRoaXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTXzNEREVWSUNFICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0FQU19URVhUVVJFICAgICAgICApICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSXQncyBhIHJlbmRlciB0YXJnZXQsIGJ1dCBubyBzd2FwY2hhaW4gd2FzIGNyZWF0ZWQuCisgICAgICAgICAgICAgKiBUaGUgSVBhcmVudCBpbnRlcmZhY2VzIGhhdmUgdG8gYmUgcmVsZWFzZWQgbWFudWFsbHkuCisgICAgICAgICAgICAgKiBUaGUgc2FtZSBhcHBsaWVzIGZvciB0ZXh0dXJlcyB3aXRob3V0IGFuCisgICAgICAgICAgICAgKiBJV2luZUQzRFRleHR1cmUgb2JqZWN0IGF0dGFjaGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN1cmYgPSBUaGlzOworICAgICAgICAgICAgd2hpbGUoc3VyZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUGFyZW50ICpQYXJlbnQ7CisKKyAgICAgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfR2V0UGFyZW50KHN1cmYtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElVbmtub3duICoqKSAmUGFyZW50KTsKKyAgICAgICAgICAgICAgICBJUGFyZW50X1JlbGVhc2UoUGFyZW50KTsgIC8qIEZvciB0aGUgZ2V0UGFyZW50ICovCisgICAgICAgICAgICAgICAgSVBhcmVudF9SZWxlYXNlKFBhcmVudCk7ICAvKiBUbyByZWxlYXNlIGl0ICovCisgICAgICAgICAgICAgICAgc3VyZiA9IHN1cmYtPm5leHRfY29tcGxleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIExvb3AgdGhyb3VnaCBhbGwgY29tcGxleCBhdHRhY2hlZCBzdXJmYWNlcywKKyAgICAgICAgICogYW5kIGRlc3Ryb3kgdGhlbQorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUoIChzdXJmID0gVGhpcy0+bmV4dF9jb21wbGV4KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRoaXMtPm5leHRfY29tcGxleCA9IHN1cmYtPm5leHRfY29tcGxleDsgIC8qIFVuY2hhaW4gaXQgZnJvbSB0aGUgY29tcGxleCBsaXN0aW5nICovCisgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0Rlc3Ryb3koc3VyZik7ICAgICAvKiBEZXN0cm95IGl0ICovCisgICAgICAgIH0KKworICAgICAgICAvKiBEZXN0cm95IHRoZSBzdXJmYWNlLgorICAgICAgICAgKi8KKyAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9EZXN0cm95KFRoaXMpOworCisgICAgICAgIC8qIFJlZHVjZSB0aGUgZGRyYXcgcmVmY291bnQgKi8KKyAgICAgICAgSURpcmVjdERyYXc3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoZGRyYXcsIElEaXJlY3REcmF3NykpOworICAgIH0KKworICAgIHJldHVybiByZWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0QXR0YWNoZWRTdXJmYWNlCisgKgorICogUmV0dXJucyBhbiBhdHRhY2hlZCBzdXJmYWNlIHdpdGggdGhlIHJlcXVlc3RlZCBjYXBzLiBTdXJmYWNlIGF0dGNobWVudAorICogYW5kIGNvbXBsZXggc3VyZmFjZXMgYXJlIG5vdCBjbGVhcmx5IGRlc2NyaWJlZCBieSB0aGUgTVNETiBvciBzZGssCisgKiBzbyB0aGlzIG1ldGhvZCBpcyB0cmlja3kgYW5kIGxpa2VseSB0byBjb250YWluIHByb2JsZW1zLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyB0aGUgY29tcGxleCBjaGFpbiBmaXJzdCwgdGhlbiB0aGUKKyAqIGF0dGFjaG1lbnQgY2hhaW4sIGFuZCB0aGVuIGl0IGNoZWNrcyBpZiB0aGUgY2FwcyBtYXRjaCB0byBpdHNlbGYuCisgKgorICogVGhlIGNoYWlucyBhcmUgc2VhcmNoZWQgZnJvbSBUaGlzIGRvd24gdG8gdGhlIGxhc3Qgc3VyZmFjZSBpbiB0aGUgY2hhaW4sCisgKiBub3QgZnJvbSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY2hhaW4uIFRoZSBmaXJzdCBzdXJmYWNlIGZvdW5kIGlzCisgKiByZXR1cm5lZC4gVGhlIE1TRE4gc2F5cyB0aGF0IHRoaXMgbWV0aG9kIGZhaWxzIGlmIG1vcmUgdGhhbiBvbmUgc3VyZmFjZQorICogbWF0Y2hlcyB0aGUgY2FwcywgYnV0IGFwcGFyZW50bHkgdGhpcyBpcyBpbmNvcnJlY3QuCisgKgorICogVGhlIGZvdW5kIHN1cmZhY2UgaXMgQWRkUmVmZWQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuCisgKgorICogUGFyYW1zOgorICogIENhcHM6IFBvaW50ZXIgdG8gYSBERENBUFMyIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjYXBzIGFza2VkIGZvcgorICogIFN1cmZhY2U6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGZvdW5kIHN1cmZhY2UKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIENhcHMgb3IgU3VyZmFjZSBpcyBOVUxMCisgKiAgRERFUlJfTk9URk9VTkQgaWYgbm8gc3VyZmFjZSB3YXMgZm91bmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0QXR0YWNoZWRTdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTQ0FQUzIgKkNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICoqU3VyZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZjsKKyAgICBERFNDQVBTMiBvdXJfY2FwczsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBDYXBzLCBTdXJmYWNlKTsKKworICAgIG91cl9jYXBzID0gKkNhcHM7CisKKyAgICBpZihUaGlzLT52ZXJzaW9uIDwgNykKKyAgICB7CisgICAgICAgIC8qIEVhcmxpZXIgZHggYXBwcyBwdXQgZ2FyYmFnZSBpbnRvIHRoZXNlIG1lbWJlcnMsIGNsZWFyIHRoZW0gKi8KKyAgICAgICAgb3VyX2NhcHMuZHdDYXBzMiA9IDA7CisgICAgICAgIG91cl9jYXBzLmR3Q2FwczMgPSAwOworICAgICAgICBvdXJfY2Fwcy5kd0NhcHM0ID0gMDsKKyAgICB9CisKKyAgICBUUkFDRSgiKCVwKTogTG9va2luZyBmb3IgY2FwczogJWx4LCVseCwlbHgsJWx4XG4iLCBUaGlzLCBvdXJfY2Fwcy5kd0NhcHMsIG91cl9jYXBzLmR3Q2FwczIsIG91cl9jYXBzLmR3Q2FwczMsIG91cl9jYXBzLmR3Q2FwczQpOyAvKiBGSVhNRTogQmV0dGVyIGRlYnVnZ2luZyAqLworCisgICAgLyogRmlyc3QsIGxvb2sgYXQgdGhlIGNvbXBsZXggY2hhaW4gKi8KKyAgICBzdXJmID0gVGhpczsKKworICAgIHdoaWxlKCAoc3VyZiA9IHN1cmYtPm5leHRfY29tcGxleCkgKQorICAgIHsKKyAgICAgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoIlN1cmZhY2U6ICglcCkgY2FwczogJWx4LCVseCwlbHgsJWx4XG4iLCBzdXJmLAorICAgICAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcywKKyAgICAgICAgICAgICAgICAgICBzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMyLAorICAgICAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczMsCisgICAgICAgICAgICAgICAgICAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzNCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBvdXJfY2Fwcy5kd0NhcHMpID09IG91cl9jYXBzLmR3Q2FwcykgJiYKKyAgICAgICAgICAgICgoc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiAmIG91cl9jYXBzLmR3Q2FwczIpID09IG91cl9jYXBzLmR3Q2FwczIpKSB7CisKKyAgICAgICAgICAgIC8qIE1TRE46ICJUaGlzIG1ldGhvZCBmYWlscyBpZiBtb3JlIHRoYW4gb25lIHN1cmZhY2UgaXMgYXR0YWNoZWQKKyAgICAgICAgICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgY2FwYWJpbGl0aWVzIHJlcXVlc3RlZC4iCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIG1pcG1hcCBkZW1vIG9mIHRoZSBEaXJlY3RYNyBzZGsgc2hvd3Mgd2hhdCB0byBkbyBoZXJlOgorICAgICAgICAgICAgICogYXBhcmVudGx5IGFwcHMgZXhwZWN0IHRoZSBmaXJzdCBmb3VuZCBzdXJmYWNlIHRvIGJlIHJldHVybmVkLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIFRSQUNFKCIoJXApOiBSZXR1cm5pbmcgc3VyZmFjZSAlcFxuIiwgVGhpcywgc3VyZik7CisgICAgICAgICAgICBUUkFDRSgiKCVwKTogbWlwbWFwY291bnQ9JWRcbiIsIFRoaXMsIHN1cmYtPm1pcG1hcF9sZXZlbCk7CisgICAgICAgICAgICAqU3VyZmFjZSA9IElDT01fSU5URVJGQUNFKHN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcpOworICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoKlN1cmZhY2UpOworICAgICAgICAgICAgcmV0dXJuIEREX09LOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTmV4dCwgbG9vayBhdCB0aGUgYXR0YWNobWVudCBjaGFpbiAqLworICAgIHN1cmYgPSBUaGlzOworCisgICAgd2hpbGUoIChzdXJmID0gc3VyZi0+bmV4dF9hdHRhY2hlZCkgKQorICAgIHsKKyAgICAgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoIlN1cmZhY2U6ICglcCkgY2FwczogJWx4LCVseCwlbHgsJWx4XG4iLCBzdXJmLAorICAgICAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcywKKyAgICAgICAgICAgICAgICAgICBzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMyLAorICAgICAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczMsCisgICAgICAgICAgICAgICAgICAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzNCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBvdXJfY2Fwcy5kd0NhcHMpID09IG91cl9jYXBzLmR3Q2FwcykgJiYKKyAgICAgICAgICAgICgoc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiAmIG91cl9jYXBzLmR3Q2FwczIpID09IG91cl9jYXBzLmR3Q2FwczIpKSB7CisKKyAgICAgICAgICAgIC8qIE1TRE46ICJUaGlzIG1ldGhvZCBmYWlscyBpZiBtb3JlIHRoYW4gb25lIHN1cmZhY2UgaXMgYXR0YWNoZWQKKyAgICAgICAgICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgY2FwYWJpbGl0aWVzIHJlcXVlc3RlZC4iCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIG1pcG1hcCBkZW1vIG9mIHRoZSBEaXJlY3RYNyBzZGsgc2hvd3Mgd2hhdCB0byBkbyBoZXJlOgorICAgICAgICAgICAgICogYXBhcmVudGx5IGFwcHMgZXhwZWN0IHRoZSBmaXJzdCBmb3VuZCBzdXJmYWNlIHRvIGJlIHJldHVybmVkLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIFRSQUNFKCIoJXApOiBSZXR1cm5pbmcgc3VyZmFjZSAlcFxuIiwgVGhpcywgc3VyZik7CisgICAgICAgICAgICAqU3VyZmFjZSA9IElDT01fSU5URVJGQUNFKHN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcpOworICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoKlN1cmZhY2UpOworICAgICAgICAgICAgcmV0dXJuIEREX09LOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSXMgdGhpcyB2YWxpZD8gKi8KKyNpZiAwCisgICAgaWYgKCgoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgb3VyX2NhcHMuZHdDYXBzKSA9PSBvdXJfY2Fwcy5kd0NhcHMpICYmCisgICAgICAgICgoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiAmIG91cl9jYXBzLmR3Q2FwczIpID09IG91cl9jYXBzLmR3Q2FwczIpICYmIAorICAgICAgICBUaGlzID09IFRoaXMtPmZpcnN0X2NvbXBsZXgpCisgICAgeworCisgICAgICAgIFRSQUNFKCIoJXApOiBSZXR1cm5pbmcgc3VyZmFjZSAlcFxuIiwgVGhpcywgVGhpcyk7CisgICAgICAgICpTdXJmYWNlID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CisgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKCpTdXJmYWNlKTsKKyAgICAgICAgcmV0dXJuIEREX09LOworICAgIH0KKyNlbmRpZgorCisgICAgLyogV2hhdCB0byBkbyBoZXJlPyBDb250aW51ZSB3aXRoIHRoZSBzdXJmYWNlIHJvb3Q/PyAqLworCisgICAgVFJBQ0UoIiglcCkgRGlkbid0IGZpbmQgYSB2YWxpZCBzdXJmYWNlXG4iLCBUaGlzKTsKKyAgICByZXR1cm4gRERFUlJfTk9URk9VTkQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6TG9jaworICoKKyAqIExvY2tzIHRoZSBzdXJmYWNlIGFuZCByZXR1cm5lcyBhIHBvaW50ZXIgdG8gdGhlIHN1cmZhY2UncyBtZW1vcnkKKyAqCisgKiBQYXJhbXM6CisgKiAgUmVjdDogUmVjdGFuZ2xlIHRvIGxvY2suIElmIE5VTEwsIHRoZSB3aG9sZSBzdXJmYWNlIGlzIGxvY2tlZAorICogIEREU0Q6IFBvaW50ZXIgdG8gYSBERFNVUkZBQ0VERVNDMiB3aGljaCBzaGFsbCByZWNlaXZlIHRoZSBzdXJmYWNlJ3MgZGVzYy4KKyAqICBGbGFnczogTG9ja2luZyBmbGFncywgZS5nIFJlYWQgb25seSBvciB3cml0ZSBvbmx5CisgKiAgaDogQW4gZXZlbnQgaGFuZGxlIHRoYXQncyBub3QgdXNlZCBhbmQgbXVzdCBiZSBOVUxMCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBERFNEIGlzIE5VTEwKKyAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpMb2NrUmVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9Mb2NrKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QgKlJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERTVVJGQUNFREVTQzIgKkREU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFIGgpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFdJTkVEM0RMT0NLRURfUkVDVCBMb2NrZWRSZWN0OworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcCwlbHgsJXApXG4iLCBUaGlzLCBSZWN0LCBERFNELCBGbGFncywgaCk7CisKKyAgICBpZighRERTRCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICAvKiBTaG91bGQgSSBjaGVjayBmb3IgdGhlIGhhbmRsZSB0byBiZSBOVUxMPworICAgICAqCisgICAgICogVGhlIERETE9DSyBmbGFncyBhbmQgdGhlIEQzRExPQ0sgZmxhZ3MgYXJlIGVxdWFsCisgICAgICogZm9yIHRoZSBzdXBwb3J0ZWQgdmFsdWVzLiBUaGUgb3RoZXJzIGFyZSBpZ25vcmVkIGJ5IFdpbmVEM0QKKyAgICAgKi8KKworICAgIC8qIEhtbS4gQW5hcmNoeSBvbmxpbmUgcGFzc2VzIGFuIHVuaW5pdGlhbGl6ZWQgc3VyZmFjZSBkZXNjcmlwdG9yLAorICAgICAqIHRoYXQgbWVhbnMgaXQgZG9lc24ndCBoYXZlIGR3U2l6ZSBzZXQuIEluaXQgaXQgdG8gc29tZSBzYW5lCisgICAgICogdmFsdWUKKyAgICAgKi8KKyAgICBpZihERFNELT5kd1NpemUgPD0gc2l6ZW9mKEREU1VSRkFDRURFU0MpKQorICAgIHsKKyAgICAgICAgRERTRC0+ZHdTaXplID0gc2l6ZW9mKEREU1VSRkFDRURFU0MpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBERFNELT5kd1NpemUgPSBzaXplb2YoRERTVVJGQUNFREVTQzIpOworICAgIH0KKworICAgIEREX1NUUlVDVF9DT1BZX0JZU0laRShERFNELCYoVGhpcy0+c3VyZmFjZV9kZXNjKSk7CisgICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfTG9ja1JlY3QoVGhpcy0+V2luZUQzRFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxvY2tlZFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7CisgICAgaWYoaHIgIT0gRDNEX09LKSByZXR1cm4gaHI7CisKKyAgICAvKiBPdmVycmlkZSB0aGUgbWVtb3J5IGFyZWEgYW5kIHRoZSBwaXRjaCAqLworICAgIEREU0QtPmR3RmxhZ3MgfD0gRERTRF9MUFNVUkZBQ0U7CisgICAgRERTRC0+bHBTdXJmYWNlID0gTG9ja2VkUmVjdC5wQml0czsKKyAgICBERFNELT5kd0ZsYWdzIHw9IEREU0RfUElUQ0g7CisgICAgRERTRC0+dTEubFBpdGNoID0gTG9ja2VkUmVjdC5QaXRjaDsKKworICAgIFRSQUNFKCJsb2NrZWQgc3VyZmFjZSByZXR1cm5pbmcgZGVzY3JpcHRpb24gOlxuIik7CisgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoRERTRCk7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6VW5sb2NrCisgKgorICogVW5sb2NrcyBhbiBsb2NrZWQgc3VyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBSZWN0OiBOb3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRFN1cmZhY2U6OlVubG9ja1JlY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfVW5sb2NrKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVCAqcFJlY3QpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBwUmVjdCk7CisKKyAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX1VubG9ja1JlY3QoVGhpcy0+V2luZUQzRFN1cmZhY2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkZsaXAKKyAqCisgKiBGbGlwcyBhIHN1cmZhY2Ugd2l0aCB0aGUgRERTQ0FQU19GTElQIGZsYWcuIFRoZSBmbGlwIGlzIHJlbGF5ZWQgdG8KKyAqIElXaW5lRDNEU3VyZmFjZTo6RmxpcC4gQmVjYXVzZSBXaW5lRDNEIGRvZXNuJ3QgaGFuZGxlIGF0dGFjaGVkIHN1cmZhY2VzLAorICogdGhlIGZsaXAgdGFyZ2V0IGlzIHBhc3NlZCB0byBXaW5lRDNELCBldmVuIGlmIHRoZSBhcHAgZGlkbid0IHNwZWNpZnkgb25lCisgKgorICogUGFyYW1zOgorICogIERlc3RPdmVycmlkZTogU3BlY2lmaWVzIHRoZSBzdXJmYWNlIHRoYXQgd2lsbCBiZWNvbWUgdGhlIG5ldyBmcm9udAorICogICAgICAgICAgICAgICAgYnVmZmVyLiBJZiBOVUxMLCB0aGUgY3VycmVudCBiYWNrIGJ1ZmZlciBpcyB1c2VkCisgKiAgRmxhZ3M6IHNvbWUgRGlyZWN0RHJhdyBmbGFncywgc2VlIGluY2x1ZGUvZGRyYXcuaAorICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX05PVEZMSVBQQUJMRSBpZiBubyBmbGlwIHRhcmdldCBjb3VsZCBiZSBmb3VuZAorICogIERERVJSX0lOVkFMSURPQkpFQ1QgaWYgdGhlIHN1cmZhY2UgaXNuJ3QgYSBmcm9udCBidWZmZXIKKyAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpGbGlwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0ZsaXAoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqRGVzdE92ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpPdmVycmlkZSA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIERlc3RPdmVycmlkZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqT3ZlcnJpZGU3OworICAgIEhSRVNVTFQgaHI7CisgICAgVFJBQ0UoIiglcCktPiglcCwlbHgpXG4iLCBUaGlzLCBEZXN0T3ZlcnJpZGUsIEZsYWdzKTsKKworICAgIC8qIEZsaXAgaGFzIHRvIGJlIGNhbGxlZCBmcm9tIGEgZnJvbnQgYnVmZmVyCisgICAgICogV2hhdCBhYm91dCBvdmVybGF5IHN1cmZhY2VzLCBBRkFJSyB0aGV5IGNhbiBmbGlwIHRvbz8KKyAgICAgKi8KKyAgICBpZiggIShUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0ZST05UQlVGRkVSKSApCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElET0JKRUNUOyAvKiBVbmNrZWNrZWQgKi8KKworICAgIC8qIFdpbmVEM0QgZG9lc24ndCBrZWVwIHRyYWNrIG9mIGF0dGFjaGVkIHN1cmZhY2UsIHNvIGZpbmQgdGhlIHRhcmdldCAqLworICAgIGlmKCFPdmVycmlkZSkKKyAgICB7CisgICAgICAgIEREU0NBUFMyIENhcHM7CisKKyAgICAgICAgbWVtc2V0KCZDYXBzLCAwLCBzaXplb2YoQ2FwcykpOworICAgICAgICBDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX0JBQ0tCVUZGRVI7CisgICAgICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRBdHRhY2hlZFN1cmZhY2UoaWZhY2UsICZDYXBzLCAmT3ZlcnJpZGU3KTsKKyAgICAgICAgaWYoaHIgIT0gRERfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiQ2FuJ3QgZmluZCBhIGZsaXAgdGFyZ2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBEREVSUl9OT1RGTElQUEFCTEU7IC8qIFVuY2hlY2tlZCAqLworICAgICAgICB9CisgICAgICAgIE92ZXJyaWRlID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgT3ZlcnJpZGU3KTsKKworICAgICAgICAvKiBGb3IgdGhlIEdldEF0dGFjaGVkU3VyZmFjZSAqLworICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoT3ZlcnJpZGU3KTsKKyAgICB9CisKKyAgICByZXR1cm4gIElXaW5lRDNEU3VyZmFjZV9GbGlwKFRoaXMtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGUtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkJsdAorICoKKyAqIFBlcmZvcm1zIGEgYmxpdCBvbiB0aGUgc3VyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBEZXN0UmVjdDogRGVzdGluYXRpb24gcmVjdGFuZ2xlLCBjYW4gYmUgTlVMTAorICogIFNyY1N1cmZhY2U6IFNvdXJjZSBzdXJmYWNlLCBjYW4gYmUgTlVMTAorICogIFNyY1JlY3Q6IFNvdXJjZSByZWN0YW5nZSwgY2FuIGJlIE5VTEwKKyAqICBGbGFnczogQmx0IGZsYWdzCisgKiAgRERCbHRGeDogU29tZSBleHRlbmRlZCBibHQgcGFyYW1ldGVycywgY29ubmVjdGVkIHRvIHRoZSBmbGFncworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBTZWUgSVdpbmVEM0RTdXJmYWNlOjpCbHQgZm9yIG1vcmUgZGV0YWlscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9CbHQoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpEZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKlNyY1N1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEREJMVEZYICpEREJsdEZ4KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpTcmMgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBTcmNTdXJmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwLCVseCwlcClcbiIsIFRoaXMsIERlc3RSZWN0LCBTcmMsIFNyY1JlY3QsIEZsYWdzLCBEREJsdEZ4KTsKKworICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfQmx0KFRoaXMtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYyA/IFNyYy0+V2luZUQzRFN1cmZhY2UgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERCbHRGeCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6QWRkQXR0YWNoZWRTdXJmYWNlCisgKgorICogQXR0YWNoZXMgYW4gc3VyZmFjZSB0byBhbm90aGVyIHN1cmZhY2UuIFN1cmZhY2UgYXR0YWNobWVudHMgYXJlCisgKiBpbmNvcnJlY3RseSBkZXNjcmliZWQgaW4gdGhlIFNESyBhbmQgdGhlIE1TRE4sIGFuZCB0aGlzIG1ldGhvZAorICogaXMgcHJvbmUgdG8gYnVncy4gVGhlIHN1cmZhY2UgdGhhdCBpcyBhdHRhY2hlZCBpcyBBZGRSZWZlZC4KKyAqCisgKiBUaGUgYXR0YWNobWVudCBsaXN0IGNvbnNpc3RzIG9mIGEgZmlyc3Qgc3VyZmFjZShmaXJzdF9hdHRhY2hlZCkgYW5kCisgKiBmb3IgZWFjaCBzdXJmYWNlIGEgcG9pbnRlciB0byB0aGUgbmV4dCBhdHRhY2hlZCBzdXJmYWNlIChuZXh0X2F0dGFjaGVkKS4KKyAqIEZvciB0aGUgZmlyc3Qgc3VyZmFjZSwgYW5kIGEgc3VyZmFjZSB0aGF0IGhhcyBubyBhdHRhY2htZW50cworICogZmlyc3RfYXR0YWNoZWQgcG9pbnRzIHRvIHRoZSBzdXJmYWNlIGl0c2VsZi4gQSBzdXJmYWNlIHRoYXQgaGFzCisgKiBubyBzdWNjZXNzb3JzIGluIHRoZSBjaGFpbiBoYXMgbmV4dF9hdHRhY2hlZCBzZXQgdG8gTlVMTC4KKyAqCisgKiBOZXdseSBhdHRhY2hlZCBzdXJmYWNlcyBhcmUgYXR0YWNoZWQgcmlnaHQgYWZ0ZXIgdGhlIHJvb3Qgc3VyZmFjZS4gVGhlCisgKiBjb21wbGV4IGNoYWlucyBhcmUgaGFuZGxlZCBzZXBlcmF0ZWx5IGluIGEgc2ltbWlsYXIgY2hhaW4sIHdpdGgKKyAqIGZpcnN0X2NvbXBsZXggYW5kIG5leHRfY29tcGxleC4gSWYgYSBzdXJmYWNlIGlzIGF0dGFjaGVkIHRvIGEgY29tcGxleAorICogc3VyZmFjZSBjb21wb3VuZCwgaXQncyBhdHRhY2hlZCB0byB0aGUgc3VyZmFjZSB0aGF0IHRoZSBhcHAgcmVxdWVzdGVkLAorICogbm90IHRoZSBjb21wbGV4IHJvb3QuIFNlZSBHZXRBdHRhY2hlZFN1cmZhY2UgZm9yIGEgZGVzY3JpcHRpb24KKyAqIGhvdyBzdXJmYWNlcyBhcmUgZm91bmQuCisgKgorICogVGhpcyBpcyBob3cgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd29ya3MsIGFuZCBpdCB3YXMgY29kZWQgYnkgbG9va2luZworICogYXQgdGhlIG5lZWRzIG9mIHRoZSBhcHBsaWNhdGlvbnMuCisgKgorICogU28gZmFyIG9ubHkgWi1CdWZmZXIgYXR0YWNobWVudHMgYXJlIHRlc3RlZCwgYnV0IHRoZXJlJ3Mgbm8gY29kZSB5ZXQKKyAqIHRvIGFjdGl2YXRlIHRoZW0uIE1pcG1hcHMgY291bGQgYmUgdHJpY2t5IHRvIGFjdGl2YXRlIGluIFdpbmVEM0QuCisgKiBCYWNrIGJ1ZmZlcnMgc2hvdWxkIHdvcmsgaW4gMkQgbW9kZSwgYnV0IHRoZXkgYXJlIG5vdCB0ZXN0ZWQuCisgKiBSZW5kZXJpbmcgdG8gdGhlIHByaW1hcnkgc3VyZmFjZSBhbmQgc3dpdGNoaW5nIGJldHdlZW4gdGhhdCBhbmQKKyAqIGRvdWJsZSBidWZmZXJpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBXaW5lRDNELCBzbyBmb3IgM0QgaXQgbWlnaHQKKyAqIGhhdmUgdW5leHBlY3RlZCByZXN1bHRzLgorICoKKyAqIFBhcmFtczoKKyAqICBBdHRhY2g6IFN1cmZhY2UgdG8gYXR0YWNoIHRvIGlmYWNlCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfQ0FOTk9UQVRUQUNIU1VSRkFDRSBpZiB0aGUgc3VyZmFjZSBjYW4ndCBiZSBhdHRhY2hlZCBmb3Igc29tZSByZWFzb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkQXR0YWNoZWRTdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqQXR0YWNoKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpTdXJmID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgQXR0YWNoKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgU3VyZik7CisKKyAgICAvKiBTaG91bGQgSSBtYWtlIHN1cmUgdG8gYWRkIGl0IHRvIHRoZSBmaXJzdCBjb21wbGV4IHN1cmZhY2U/ICovCisKKyAgICBpZihTdXJmID09IFRoaXMpCisgICAgICAgIHJldHVybiBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFOyAvKiB1bmNoZWNrZWQgKi8KKworICAgIC8qIFRPRE8gTVNETjogIllvdSBjYW4gYXR0YWNoIG9ubHkgei1idWZmZXIgc3VyZmFjZXMgd2l0aCB0aGlzIG1ldGhvZC4iCisgICAgICogQnV0IGFwcGFyZW50bHkgYmFja2J1ZmZlcnMgYW5kIG1pcG1hcHMgY2FuIGJlIGF0dGFjaGVkIHRvby4gKi8KKworICAgIC8qIFNldCBNSVBNQVBTVUJMRVZFTCBpZiB0aGlzIHNlZW1zIHRvIGJlIG9uZSAqLworICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJgorICAgICAgICBTdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkKKyAgICB7CisgICAgICAgIFN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIgfD0gRERTQ0FQUzJfTUlQTUFQU1VCTEVWRUw7CisgICAgICAgIC8qIEZJWE1FOiB3ZSBzaG91bGQgcHJvYmFibHkgYWxzbyBhZGQgdG8gZHdNaXBNYXBDb3VudCBvZiB0aGlzCisgICAgICAgICAgKiBhbmQgYWxsIHBhcmVudCBzdXJmYWNlcyAodXBkYXRlIGNyZWF0ZV90ZXh0dXJlIGlmIHlvdSBkbykgKi8KKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgc3VyZmFjZSBpcyBhbHJlYWR5IGF0dGFjaGVkIHNvbWV3aGVyZSAqLworICAgIGlmKCAoU3VyZi0+bmV4dF9hdHRhY2hlZCAhPSBOVUxMKSB8fAorICAgICAgICAoU3VyZi0+Zmlyc3RfYXR0YWNoZWQgIT0gU3VyZikgKQorICAgIHsKKyAgICAgICAgIEVSUigiKCVwKSBUaGUgU3VyZmFjZSAlcCBpcyBhbHJlYWR5IGF0dGFjaGVkIHNvbWV3aGVyZSBlbHNlOiBuZXh0X2F0dGFjaGVkID0gJXAsIGZpcnN0X2F0dGFjaGVkID0gJXAsIGNhbid0IGhhbmRsZSBieSBub3dcbiIsIFRoaXMsIFN1cmYsIFN1cmYtPm5leHRfYXR0YWNoZWQsIFN1cmYtPmZpcnN0X2F0dGFjaGVkKTsKKyAgICAgICAgcmV0dXJuIERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0U7CisgICAgfQorCisgICAgLyogVGhpcyBpbnNlcnRzIHRoZSBuZXcgc3VyZmFjZSBhdCB0aGUgMm5kIHBvc2l0aW9uIGluIHRoZSBjaGFpbiwgcmlnaHQgYWZ0ZXIgdGhlIHJvb3Qgc3VyZmFjZSAqLworICAgIFN1cmYtPm5leHRfYXR0YWNoZWQgPSBUaGlzLT5uZXh0X2F0dGFjaGVkOworICAgIFN1cmYtPmZpcnN0X2F0dGFjaGVkID0gVGhpcy0+Zmlyc3RfYXR0YWNoZWQ7CisgICAgVGhpcy0+bmV4dF9hdHRhY2hlZCA9IFN1cmY7CisKKyAgICAvKiBNU0ROOiAKKyAgICAgKiAiVGhpcyBtZXRob2QgaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBzdXJmYWNlIGJlaW5nIGF0dGFjaGVkLiIKKyAgICAgKi8KKyAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihBdHRhY2gpOworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpEZWxldGVBdHRhY2hlZFN1cmZhY2UKKyAqCisgKiBSZW1vdmVzIGEgc3VyZmFjZSBmcm9tIHRoZSBhdHRhY2htZW50IGNoYWluLiBUaGUgc3VyZmFjZSdzIHJlZmNvdW50CisgKiBpcyBkZWNyZWFzZWQgYnkgb25lIGFmdGVyIGl0IGhhcyBiZWVuIHJlbW92ZWQKKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6IFNvbWUgZmxhZ3MsIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAqICBBdHRhY2g6IFN1cmZhY2UgdG8gZGV0YWNoCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfU1VSRkFDRU5PVEFUVEFDSEVEIGlmIHRoZSBzdXJmYWNlIGlzbid0IGF0dGFjaGVkIHRvCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqQXR0YWNoKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpTdXJmID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgQXR0YWNoKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpQcmV2ID0gVGhpczsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwKVxuIiwgVGhpcywgRmxhZ3MsIFN1cmYpOworCisgICAgaWYgKCFTdXJmIHx8IChTdXJmLT5maXJzdF9hdHRhY2hlZCAhPSBUaGlzKSB8fCAoU3VyZiA9PSBUaGlzKSApCisgICAgICAgIHJldHVybiBEREVSUl9TVVJGQUNFTk9UQVRUQUNIRUQ7IC8qIHVuY2hlY2tlZCAqLworCisgICAgLyogUmVtb3ZlIE1JUE1BUFNVQkxFVkVMIGlmIHRoaXMgc2VlbWVkIHRvIGJlIG9uZSAqLworICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJgorICAgICAgICBTdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkKKyAgICB7CisgICAgICAgIFN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIgJj0gfkREU0NBUFMyX01JUE1BUFNVQkxFVkVMOworICAgICAgICAvKiBGSVhNRTogd2Ugc2hvdWxkIHByb2JhYmx5IGFsc28gc3VidHJhY3QgZnJvbSBkd01pcE1hcENvdW50IG9mIHRoaXMKKyAgICAgICAgICogYW5kIGFsbCBwYXJlbnQgc3VyZmFjZXMgKi8KKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBQcmVjZXNzb3Igb2YgdGhlIGRldGFjaGVkIHN1cmZhY2UgKi8KKyAgICB3aGlsZShQcmV2KQorICAgIHsKKyAgICAgICAgaWYoUHJldi0+bmV4dF9hdHRhY2hlZCA9PSBTdXJmKSBicmVhazsKKyAgICAgICAgUHJldiA9IFByZXYtPm5leHRfYXR0YWNoZWQ7CisgICAgfQorCisgICAgLyogVGhlcmUgbXVzdCBiZSBhIHN1cmZhY2UsIG90aGVyd2lzZSB0aGVyZSdzIGEgYnVnICovCisgICAgYXNzZXJ0KFByZXYgIT0gTlVMTCk7CisKKyAgICAvKiBVbmNoYWluIHRoZSBzdXJmYWNlICovCisgICAgUHJldi0+bmV4dF9hdHRhY2hlZCA9IFN1cmYtPm5leHRfYXR0YWNoZWQ7CisgICAgU3VyZi0+bmV4dF9hdHRhY2hlZCA9IE5VTEw7CisgICAgU3VyZi0+Zmlyc3RfYXR0YWNoZWQgPSBTdXJmOworCisgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKEF0dGFjaCk7CisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkFkZE92ZXJsYXlEaXJ0eVJlY3QKKyAqCisgKiAiVGhpcyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCIKKyAqCisgKiBQYXJhbXM6CisgKiAgUmVjdDogPworICoKKyAqIFJldHVybnM6CisgKiAgRERFUlJfVU5TVVBQT1JURUQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkT3ZlcmxheURpcnR5UmVjdChJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJFQ1QgUmVjdCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxSZWN0KTsKKworICAgIC8qIE1TRE4gc2F5cyBpdCdzIG5vdCBpbXBsZW1lbnRlZC4gSSBjb3VsZCBmb3J3YXJkIGl0IHRvIFdpbmVEM0QsIAorICAgICAqIHRoZW4gd2UnZCBpbXBsZW1lbnQgaXQsIGJ1dCBJIGRvbid0IHRoaW5rIHRoYXQncyBhIGdvb2QgaWRlYQorICAgICAqIChTdGVmYW4gRPZzaW5nZXIpCisgICAgICovCisjaWYgMAorICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdChUaGlzLT5XaW5lRDNEU3VyZmFjZSwgcFJlY3QpOworI2VuZGlmCisgICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOyAvKiB1bmNoZWNrZWQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXREQworICoKKyAqIFJldHVybnMgYSBHREkgZGV2aWNlIGNvbnRleHQgZm9yIHRoZSBzdXJmYWNlCisgKgorICogUGFyYW1zOgorICogIGhkYzogQWRkcmVzcyBvZiBhIEhEQyB2YXJpYWJsZSB0byBzdG9yZSB0aGUgZGMgdG8KKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIGhkYyBpcyBOVUxMCisgKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRFN1cmZhY2U6OkdldERDCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldERDKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIREMgKmhkYykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCk6IFJlbGF5XG4iLCBUaGlzLCBoZGMpOworCisgICAgaWYoIWhkYykKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX0dldERDKFRoaXMtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpSZWxlYXNlREMKKyAqCisgKiBSZWxlYXNlcyB0aGUgREMgdGhhdCB3YXMgY29uc3RydWN0ZWQgd2l0aCBHZXREQworICoKKyAqIFBhcmFtczoKKyAqICBoZGM6IEhEQyB0byByZWxlYXNlCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEU3VyZmFjZTo6UmVsZWFzZURDCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1JlbGVhc2VEQyhJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhEQyBoZGMpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheVxuIiwgVGhpcywgaGRjKTsKKworICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfUmVsZWFzZURDKFRoaXMtPldpbmVEM0RTdXJmYWNlLCBoZGMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldENhcHMKKyAqCisgKiBSZXR1cm5zIHRoZSBzdXJmYWNlJ3MgY2FwcworICoKKyAqIFBhcmFtczoKKyAqICBDYXBzOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBjYXBzIHRvCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBDYXBzIGlzIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0Q2FwcyhJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNDQVBTMiAqQ2FwcykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxDYXBzKTsKKworICAgIGlmKCFDYXBzKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgICpDYXBzID0gVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHM7CisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldFByaW9yaXR5CisgKgorICogU2V0cyBhIHRleHR1cmUgcHJpb3JpdHkgZm9yIG1hbmFnZWQgdGV4dHVyZXMuCisgKgorICogUGFyYW1zOgorICogIFByaW9yaXR5OiBUaGUgbmV3IHByaW9yaXR5CisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEU3VyZmFjZTo6U2V0UHJpb3JpdHkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0UHJpb3JpdHkoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsIERXT1JEIFByaW9yaXR5KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVsZCk6IFJlbGF5IVxuIixUaGlzLFByaW9yaXR5KTsKKworICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfU2V0UHJpb3JpdHkoVGhpcy0+V2luZUQzRFN1cmZhY2UsIFByaW9yaXR5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRQcmlvcml0eQorICoKKyAqIFJldHVybnMgdGhlIHN1cmZhY2UncyBwcmlvcml0eQorICoKKyAqIFBhcmFtczoKKyAqICBQcmlvcml0eTogQWRkcmVzcyBvZiBhIHZhcmlhYmxlIHRvIHdyaXRlIHRoZSBwcmlvcml0eSB0bworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFByaW9yaXR5ID09IE5VTEwKKyAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpHZXRQcmlvcml0eQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRQcmlvcml0eShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKlByaW9yaXR5KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXlcbiIsVGhpcyxQcmlvcml0eSk7CisKKyAgICBpZighUHJpb3JpdHkpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgKlByaW9yaXR5ID0gSVdpbmVEM0RTdXJmYWNlX0dldFByaW9yaXR5KFRoaXMtPldpbmVEM0RTdXJmYWNlKTsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6U2V0UHJpdmF0ZURhdGEKKyAqCisgKiBTdG9yZXMgc29tZSBkYXRhIGluIHRoZSBzdXJmYWNlIHRoYXQgaXMgaW50ZW5kZWQgZm9yIHRoZSBhcHBsaWNhdGlvbidzCisgKiB1c2UuCisgKgorICogUGFyYW1zOgorICogIHRhZzogR1VJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGRhdGEKKyAqICBEYXRhOiBQb2ludGVyIHRvIHRoZSBwcml2YXRlIGRhdGEKKyAqICBTaXplOiBTaXplIG9mIHRoZSBwcml2YXRlIGRhdGEKKyAqICBGbGFnczogU29tZSBmbGFncworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpTZXRQcml2YXRlRGF0YQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRQcml2YXRlRGF0YShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGR1VJRCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVsZCwlbHgpOiBSZWxheVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZCh0YWcpLCBEYXRhLCBTaXplLCBGbGFncyk7CisKKyAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX1NldFByaXZhdGVEYXRhKFRoaXMtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0UHJpdmF0ZURhdGEKKyAqCisgKiBSZXR1cm5lcyB0aGUgcHJpdmF0ZSBkYXRhIHNldCB3aXRoIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldFByaXZhdGVEYXRhCisgKgorICogUGFyYW1zOgorICogIHRhZzogR1VJRCBvZiB0aGUgZGF0YSB0byByZXR1cm4KKyAqICBEYXRhOiBBZGRyZXNzIHdoZXJlIHRvIHdyaXRlIHRoZSBkYXRhIHRvCisgKiAgU2l6ZTogU2l6ZSBvZiB0aGUgYnVmZmVyIGF0IERhdGEKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERhdGEgaXMgTlVMTAorICogIEZvciBtb3JlIGRldGFpbHMsIHNlZSBJV2luZUQzRFN1cmZhY2U6OkdldFByaXZhdGVEYXRhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldFByaXZhdGVEYXRhKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZHVUlEIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKlNpemUpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApOiBSZWxheVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZCh0YWcpLCBEYXRhLCBTaXplKTsKKworICAgIGlmKCFEYXRhKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfR2V0UHJpdmF0ZURhdGEoVGhpcy0+V2luZUQzRFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6RnJlZVByaXZhdGVEYXRhCisgKgorICogRnJlZXMgcHJpdmF0ZSBzdG9yZWQgaW4gdGhlIHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgdGFnOiBUYWcgb2YgdGhlIGRhdGEgdG8gZnJlZQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpGcmVlUHJpdmF0ZURhdGEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfRnJlZVByaXZhdGVEYXRhKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGR1VJRCB0YWcpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMpOiBSZWxheVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZCh0YWcpKTsKKworICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfRnJlZVByaXZhdGVEYXRhKFRoaXMtPldpbmVEM0RTdXJmYWNlLCB0YWcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlBhZ2VMb2NrCisgKgorICogUHJldmVudHMgYSBzeXNtZW0gc3VyZmFjZSBmcm9tIGJlaW5nIHBhZ2VkIG91dAorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogTm90IHVzZWQsIG11c3QgYmUgMCh1bmNoZWNrZWQpCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9QYWdlTG9jayhJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgVFJBQ0UoIiglcCktPiglbHgpXG4iLCBpZmFjZSwgRmxhZ3MpOworCisgICAgLyogVGhpcyBpcyBXaW5kb3dzIG1lbW9yeSBtYW5hZ2VtZW50IHJlbGF0ZWQgLSB3ZSBkb24ndCBuZWVkIHRoaXMgKi8KKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6UGFnZVVubG9jaworICoKKyAqIEFsbG93cyBhIHN5c21lbSBzdXJmYWNlIHRvIGJlIHBhZ2VkIG91dAorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogTm90IHVzZWQsIG11c3QgYmUgMCh1bmNrZWNoZWQpCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9QYWdlVW5sb2NrKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIFRSQUNFKCIoJXApLT4oJWx4KVxuIiwgaWZhY2UsIEZsYWdzKTsKKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpCbHRCYXRjaAorICoKKyAqIEFuIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24KKyAqCisgKiBQYXJhbXM6CisgKiAgPworICoKKyAqIFJldHVybnM6CisgKiAgRERFUlJfVU5TVVBQT1JURUQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0JsdEJhdGNoKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLCBEREJMVEJBVENIICpCYXRjaCwgRFdPUkQgQ291bnQsIERXT1JEIEZsYWdzKQoreworICAgIFRSQUNFKCIoJXApLT4oJXAsJWxkLCUwOGx4KVxuIixpZmFjZSxCYXRjaCxDb3VudCxGbGFncyk7CisKKyAgICAvKiBNU0ROOiAibm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCIgKi8KKyAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6RW51bUF0dGFjaGVkU3VyZmFjZXMKKyAqCisgKiBFbnVtZXJhdGVzIGFsbCBzdXJmYWNlcyBhdHRhY2hlZCB0byB0aGlzIHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgY29udGV4dDogUG9pbnRlciB0byBwYXNzIHVubW9kaWZpZWQgdG8gdGhlIGNhbGxiYWNrCisgKiAgY2I6IENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggc3VyZmFjZQorICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgY2IgaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9FbnVtQXR0YWNoZWRTdXJmYWNlcyhJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZjsKKyAgICBERFNVUkZBQ0VERVNDMiBkZXNjOworCisgICAgLyogQXR0YWNoZWQgc3VyZmFjZXMgYXJlbid0IGhhbmRsZWQgaW4gV2luZUQzRCAqLworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLFRoaXMsY29udGV4dCxjYik7CisKKyAgICBpZighY2IpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgZm9yIChzdXJmID0gVGhpcy0+bmV4dF9jb21wbGV4OyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5uZXh0X2NvbXBsZXgpCisgICAgeworICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShzdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7CisgICAgICAgIGRlc2MgPSBzdXJmLT5zdXJmYWNlX2Rlc2M7CisgICAgICAgIC8qIGNoZWNrOiAhPSBEREVOVU1SRVRfT0sgb3IgPT0gRERFTlVNUkVUX0NBTkNFTD8gKi8KKyAgICAgICAgaWYgKGNiKElDT01fSU5URVJGQUNFKHN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcpLCAmZGVzYywgY29udGV4dCkgPT0gRERFTlVNUkVUX0NBTkNFTCkKKyAgICAgICAgICAgIHJldHVybiBERF9PSzsKKyAgICB9CisKKyAgICBmb3IgKHN1cmYgPSBUaGlzLT5uZXh0X2F0dGFjaGVkOyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5uZXh0X2F0dGFjaGVkKQorICAgIHsKKyAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNykpOworICAgICAgICBkZXNjID0gc3VyZi0+c3VyZmFjZV9kZXNjOworICAgICAgICAvKiBjaGVjazogIT0gRERFTlVNUkVUX09LIG9yID09IERERU5VTVJFVF9DQU5DRUw/ICovCisgICAgICAgIGlmIChjYiggSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNyksICZkZXNjLCBjb250ZXh0KSA9PSBEREVOVU1SRVRfQ0FOQ0VMKQorICAgICAgICAgICAgcmV0dXJuIEREX09LOworICAgIH0KKworICAgIFRSQUNFKCIgZW5kIG9mIGVudW1lcmF0aW9uLlxuIik7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6RW51bU92ZXJsYXlaT3JkZXJzCisgKgorICogIkVudW1lcmF0ZXMgdGhlIG92ZXJsYXkgc3VyZmFjZXMgb24gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiIKKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6IERERU5VTU9WRVJMQVlaX0JBQ0tUT0ZST05UICBvciBEREVOVU1PVkVSTEFZWl9GUk9OVFRPQkFDSworICogIGNvbnRleHQ6IGNvbnRleHQgdG8gcGFzcyBiYWNrIHRvIHRoZSBjYWxsYmFjaworICogIGNiOiBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudW1lcmF0ZWQgc3VyZmFjZQorICoKKyAqIFJldHVybnM6CisgKiAgRERfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9FbnVtT3ZlcmxheVpPcmRlcnMoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNiKQoreworICAgICBGSVhNRSgiKCVwKS0+KCVseCwlcCwlcCk6IFN0dWIhXG4iLCBpZmFjZSwgRmxhZ3MsIGNvbnRleHQsIGNiKTsKKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRCbHRTdGF0dXMKKyAqCisgKiBSZXR1cm5zIHRoZSBibGl0dGluZyBzdGF0dXMKKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6IERER0JTX0NBTkJMVCBvciBEREdCU19JU0JMVERPTkUKKyAqCisgKiBSZXR1cm5zOgorICogIFNlZSBJV2luZUQzRFN1cmZhY2U6OkJsdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRCbHRTdGF0dXMoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglbHgpOiBSZWxheVxuIiwgVGhpcywgRmxhZ3MpOworCisgICAgcmV0dXJuIElXaW5lRDNEU3VyZmFjZV9HZXRCbHRTdGF0dXMoVGhpcy0+V2luZUQzRFN1cmZhY2UsIEZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRDb2xvcktleQorICoKKyAqIFJldHVybnMgdGhlIGNvbG9yIGtleSBhc3NpZ25lZCB0byB0aGUgc3VyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogU29tZSBmbGFncworICogIENLZXk6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGtleSB0bworICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ0tleSBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldENvbG9yS2V5KElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERDT0xPUktFWSAqQ0tleSkKK3sKKyAgICAvKiBUaGVyZSBpcyBhIERERVJSX05PQ09MT1JLRVkgZXJyb3IsIGJ1dCBob3cgZG8gd2Uga25vdyBpZiBhIGNvbG9yIGtleQorICAgICAqIGlzbid0IHRoZXJlPyBUaGF0J3MgbGlrZSBzYXlpbmcgdGhhdCBhbiBpbnQgaXNuJ3QgdGhlcmUuIChXaGljaCBNUworICAgICAqIGhhcyBkb25lIGluIG90aGVyIGRvY3MuKSAqLworCisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworCisgICAgaWYoIUNLZXkpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgc3dpdGNoIChGbGFncykKKyAgICB7CisgICAgY2FzZSBERENLRVlfREVTVEJMVDoKKyAgICAgICAgKkNLZXkgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLRGVzdEJsdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEREQ0tFWV9ERVNUT1ZFUkxBWToKKyAgICAgICAgKkNLZXkgPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTMuZGRja0NLRGVzdE92ZXJsYXk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBERENLRVlfU1JDQkxUOgorICAgICAgICAqQ0tleSA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNCbHQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBERENLRVlfU1JDT1ZFUkxBWToKKyAgICAgICAgKkNLZXkgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLU3JjT3ZlcmxheTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0RmxpcFN0YXR1cworICoKKyAqIFJldHVybnMgdGhlIGZsaXBwaW5nIHN0YXR1cyBvZiB0aGUgc3VyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBGbGFnczogRERHRlNfQ0FORkxJUCBvZiBEREdGU19JU0ZMSVBET05FCisgKgorICogUmV0dXJuczoKKyAqICBTZWUgSVdpbmVEM0RTdXJmYWNlOjpHZXRGbGlwU3RhdHVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldEZsaXBTdGF0dXMoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJWx4KTogUmVsYXlcbiIsIFRoaXMsIEZsYWdzKTsKKworICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfR2V0RmxpcFN0YXR1cyhUaGlzLT5XaW5lRDNEU3VyZmFjZSwgRmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldE92ZXJsYXlQb3NpdGlvbgorICoKKyAqIFJldHVybnMgdGhlIGRpc3BsYXkgY29vcmRpbmF0ZXMgb2YgYSB2aXNpYmxlIGFuZCBhY3RpdmUgb3ZlcmxheSBzdXJmYWNlCisgKgorICogUGFyYW1zOgorICogIFgKKyAqICBZCisgKgorICogUmV0dXJuczoKKyAqICBEREVSUl9OT1RBT1ZFUkxBWVNVUkZBQ0UsIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRPdmVybGF5UG9zaXRpb24oSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HICpYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyAqWSkgeworICAgIEZJWE1FKCIoJXApLT4oJXAsJXApOiBTdHViIVxuIiwgaWZhY2UsIFgsIFkpOworCisgICAgcmV0dXJuIERERVJSX05PVEFPVkVSTEFZU1VSRkFDRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRQaXhlbEZvcm1hdAorICoKKyAqIFJldHVybnMgdGhlIHBpeGVsIGZvcm1hdCBvZiB0aGUgU3VyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBQaXhlbEZvcm1hdDogUG9pbnRlciB0byBhIEREUElYRUxGT1JNQVQgc3RydWN0dXJlIHRvIHdoaWNoIHRoZSBwaXhlbAorICogICAgICAgICAgICAgICBmb3JtYXQgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFBpeGVsRm9ybWF0IGlzIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UGl4ZWxGb3JtYXQoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREUElYRUxGT1JNQVQgKlBpeGVsRm9ybWF0KQoreworICAgIC8qIFdoYXQgaXMgRERFUlJfSU5WQUxJRFNVUkZBQ0VUWVBFIGZvciBoZXJlPyAqLworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLFBpeGVsRm9ybWF0KTsKKworICAgIGlmKCFQaXhlbEZvcm1hdCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBERF9TVFJVQ1RfQ09QWV9CWVNJWkUoUGl4ZWxGb3JtYXQsJlRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQpOworCisgICAgcmV0dXJuIEREX09LOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0U3VyZmFjZURlc2MKKyAqCisgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgRERTRDogQWRkcmVzcyBvZiBhIEREU1VSRkFDRURFU0MyIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIGZpbGxlZCB3aXRoIHRoZQorICogICAgICAgIHN1cmZhY2UgZGVzYworICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRERTRCBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldFN1cmZhY2VEZXNjKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqRERTRCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLEREU0QpOworCisgICAgaWYoIUREU0QpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaWYgKChERFNELT5kd1NpemUgPCBzaXplb2YoRERTVVJGQUNFREVTQykpIHx8CisgICAgICAgIChERFNELT5kd1NpemUgPiBzaXplb2YoRERTVVJGQUNFREVTQzIpKSkKKyAgICB7CisgICAgICAgIEVSUigiSW1wb3NzaWJsZS9TdHJhbmdlIHN0cnVjdCBzaXplICVsZC5cbiIsRERTRC0+ZHdTaXplKTsKKyAgICAgICAgcmV0dXJuIERERVJSX0dFTkVSSUM7CisgICAgfQorCisgICAgRERfU1RSVUNUX0NPUFlfQllTSVpFKEREU0QsJlRoaXMtPnN1cmZhY2VfZGVzYyk7CisgICAgVFJBQ0UoIlJldHVybmluZyBzdXJmYWNlIGRlc2M6XG4iKTsKKyAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhERFNEKTsKKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpJbml0aWFsaXplCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIHN1cmZhY2UuIFRoaXMgaXMgYSBuby1vcCBpbiBXaW5lCisgKgorICogUGFyYW1zOgorICogIEREOiBQb2ludGVyIHRvIGFuIERpcmVjdERyYXcgaW50ZXJmYWNlCisgKiAgRERTRDogU3VyZmFjZSBkZXNjcmlwdGlvbiBmb3IgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBSZXR1cm5zOgorICogIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9Jbml0aWFsaXplKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3ICpERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFNVUkZBQ0VERVNDMiAqRERTRCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdJbXBsICpkZGltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3REcmF3LCBERCk7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsVGhpcyxkZGltcGwsRERTRCk7CisKKyAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OklzTG9zdAorICoKKyAqIENoZWNrcyBpZiB0aGUgc3VyZmFjZSBpcyBsb3N0CisgKgorICogUmV0dXJuczoKKyAqICBERF9PSywgaWYgdGhlIHN1cmZhY2UgaXMgdXNlYWJsZQorICogIERERVJSX0lTTE9TVCBpZiB0aGUgc3VyZmFjZSBpcyBsb3N0CisgKiAgU2VlIElXaW5lRDNEU3VyZmFjZTo6SXNMb3N0IGZvciBtb3JlIGRldGFpbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfSXNMb3N0KElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKVxuIiwgVGhpcyk7CisKKyAgICAvKiBXZSBsb3NlIHRoZSBzdXJmYWNlIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgY2hhbmdlZCAqLworICAgIGlmKFRoaXMtPkltcGxUeXBlICE9IFRoaXMtPmRkcmF3LT5JbXBsVHlwZSkKKyAgICB7CisgICAgICAgIC8qIEJ1dCB0aGlzIHNob3VsZG4ndCBoYXBwZW4uIFdoZW4gd2UgY2hhbmdlIHRoZSBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICogYWxsIHN1cmZhY2VzIGFyZSByZS1jcmVhdGVkIGF1dG9tYXRpY2FsbHksIGFuZCB0aGVpciBjb250ZW50CisgICAgICAgICAqIGlzIGNvcGllZAorICAgICAgICAgKi8KKyAgICAgICAgRVJSKCIgKCVwKSBJbXBsZW1lbnRhdGlvbiB3YXMgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLCBUaGlzLCBUaGlzLT5JbXBsVHlwZSwgVGhpcy0+ZGRyYXctPkltcGxUeXBlKTsKKyAgICAgICAgcmV0dXJuIERERVJSX1NVUkZBQ0VMT1NUOworICAgIH0KKworICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfSXNMb3N0KFRoaXMtPldpbmVEM0RTdXJmYWNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpSZXN0b3JlCisgKgorICogUmVzdG9yZXMgYSBsb3N0IHN1cmZhY2UuIFRoaXMgbWFrZXMgdGhlIHN1cmZhY2UgdXNhYmxlIGFnYWluLCBidXQKKyAqIGRvZXNuJ3QgcmVsb2FkIGl0cyBvbGQgY29udGVudHMKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBTZWUgSVdpbmVEM0RTdXJmYWNlOjpSZXN0b3JlIGZvciBtb3JlIGRldGFpbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfUmVzdG9yZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcClcbiIsIFRoaXMpOworCisgICAgaWYoVGhpcy0+SW1wbFR5cGUgIT0gVGhpcy0+ZGRyYXctPkltcGxUeXBlKQorICAgIHsKKyAgICAgICAgLyogQ2FsbCB0aGUgcmVjcmVhdGlvbiBjYWxsYmFjay4gTWFrZSBzdXJlIHRvIEFkZFJlZiBmaXJzdCAqLworICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmKGlmYWNlKTsKKyAgICAgICAgSURpcmVjdERyYXdJbXBsX1JlY3JlYXRlU3VyZmFjZXNDYWxsYmFjayhpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGhpcy0+c3VyZmFjZV9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogTm90IG5lZWRlZCAqLyk7CisgICAgfQorICAgIHJldHVybiBJV2luZUQzRFN1cmZhY2VfUmVzdG9yZShUaGlzLT5XaW5lRDNEU3VyZmFjZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6U2V0T3ZlcmxheVBvc2l0aW9uCisgKgorICogQ2hhbmdlcyB0aGUgZGlzcGxheSBjb29yZGluYXRlcyBvZiBhbiBvdmVybGF5IHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgWDoKKyAqICBZOgorICoKKyAqIFJldHVybnM6CisgKiAgIERERVJSX05PVEFPVkVSTEFZU1VSRkFDRSwgYmVjYXVzZSB3ZSBkb24ndCBzdXBwb3J0IG92ZXJsYXlzIHJpZ2h0IG5vdworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldE92ZXJsYXlQb3NpdGlvbihJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgWSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglbGQsJWxkKTogU3R1YiFcbiIsIFRoaXMsIFgsIFkpOworICAgIHJldHVybiBEREVSUl9OT1RBT1ZFUkxBWVNVUkZBQ0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6VXBkYXRlT3ZlcmxheQorICoKKyAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG92ZXJsYXkgc3VyZmFjZS4KKyAqCisgKiBQYXJhbXM6CisgKiAgU3JjUmVjdDogVGhlIHNlY3Rpb24gb2YgdGhlIHNvdXJjZSBiZWluZyB1c2VkIGZvciB0aGUgb3ZlcmxheQorICogIERzdFN1cmZhY2U6IEFkZHJlc3Mgb2YgdGhlIHN1cmZhY2UgdGhhdCBpcyBvdmVybGFpZAorICogIERzdFJlY3Q6IFBsYWNlIG9mIHRoZSBvdmVybGF5CisgKiAgRmxhZ3M6IHNvbWUgRERPVkVSXyogZmxhZ3MKKyAqCisgKiBSZXR1cm5zOgorICogIERERVJSX1VOU1VQUE9SVEVELCBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgb3ZlcmxheXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfVXBkYXRlT3ZlcmxheShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJFQ1QgU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3ICpEc3RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUkVDVCBEc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRERPVkVSTEFZRlggRlgpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKkRzdCA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIERzdFN1cmZhY2UpOworICAgIEZJWE1FKCIoJXApLT4oJXAsJXAsJXAsJWx4LCVwKTogU3R1YiFcbiIsIFRoaXMsIFNyY1JlY3QsIERzdCwgRHN0UmVjdCwgRmxhZ3MsIEZYKTsKKyAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6VXBkYXRlT3ZlcmxheURpc3BsYXkKKyAqCisgKiBUaGUgRFg3IHNkayBzYXlzIHRoYXQgaXQncyBub3QgaW1wbGVtZW50ZWQKKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6ID8KKyAqCisgKiBSZXR1cm5zOiBEREVSUl9VTlNVUFBPUlRFRCwgYmVjYXVzZSB3ZSBkb24ndCBzdXBwb3J0IG92ZXJsYXlzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1VwZGF0ZU92ZXJsYXlEaXNwbGF5KElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglbHgpXG4iLCBUaGlzLCBGbGFncyk7CisgICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlVwZGF0ZU92ZXJsYXlaT3JkZXIKKyAqCisgKiBTZXRzIGFuIG92ZXJsYXkncyBaIG9yZGVyCisgKgorICogUGFyYW1zOgorICogIEZsYWdzOiBERE9WRVJaXyogZmxhZ3MKKyAqICBERFNSZWY6IERlZmluZXMgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSBvdmVybGF5IGNoYWluCisgKgorICogUmV0dXJuczoKKyAqICBEREVSUl9OT1RPVkVSTEFZU1VSRkFDRSwgYmVjYXVzZSB3ZSBkb24ndCBzdXBwb3J0IG92ZXJsYXlzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1VwZGF0ZU92ZXJsYXlaT3JkZXIoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNyAqRERTUmVmKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpSZWYgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBERFNSZWYpOworICAgIEZJWE1FKCIoJXApLT4oJWx4LCVwKVxuIiwgVGhpcywgRmxhZ3MsIFJlZik7CisgICAgcmV0dXJuIERERVJSX05PVEFPVkVSTEFZU1VSRkFDRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXREREludGVyZmFjZQorICoKKyAqIFJldHVybnMgdGhlIElEaXJlY3REcmF3NyBpbnRlcmZhY2UgcG9pbnRlciBvZiB0aGUgRGlyZWN0RHJhdyBvYmplY3QgdGhpcworICogc3VyZmFjZSBiZWxvbmdzIHRvCisgKgorICogUGFyYW1zOgorICogIEREOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciB0bworICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgREQgaXMgTlVMTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXREREludGVyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKkREKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMsREQpOworCisgICAgaWYoIUREKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgICooKElEaXJlY3REcmF3NyAqKikgREQpID0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXcsIElEaXJlY3REcmF3Nyk7CisgICAgSURpcmVjdERyYXc3X0FkZFJlZiggKElEaXJlY3REcmF3NyAqKSAqREQpOworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKiBUaGlzIHNlZW1zIGFsc28gd2luZG93cyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyAtIEkgZG9uJ3QgdGhpbmsgV2luZUQzRCBuZWVkcyB0aGlzICovCitIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgdm9sYXRpbGUgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogdlRoaXMgPSBUaGlzOworCisgICAgVFJBQ0UoIiglcClcbiIsVGhpcyk7CisgICAgLyogQSB1bmlxdW5lc3MgdmFsdWUgb2YgMCBpcyBhcHBhcmVudGx5IHNwZWNpYWwuCisgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGNoZWNrZWQuICovCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgRFdPUkQgb2xkX3VuaXF1ZW5lc3NfdmFsdWUgPSB2VGhpcy0+dW5pcXVlbmVzc192YWx1ZTsKKyAgICAgICAgRFdPUkQgbmV3X3VuaXF1ZW5lc3NfdmFsdWUgPSBvbGRfdW5pcXVlbmVzc192YWx1ZSsxOworCisgICAgICAgIGlmIChvbGRfdW5pcXVlbmVzc192YWx1ZSA9PSAwKSBicmVhazsKKyAgICAgICAgaWYgKG5ld191bmlxdWVuZXNzX3ZhbHVlID09IDApIG5ld191bmlxdWVuZXNzX3ZhbHVlID0gMTsKKworICAgICAgICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKExPTkcqKSZ2VGhpcy0+dW5pcXVlbmVzc192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3VuaXF1ZW5lc3NfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld191bmlxdWVuZXNzX3ZhbHVlKQorICAgICAgICAgICAgPT0gb2xkX3VuaXF1ZW5lc3NfdmFsdWUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0VW5pcXVlbmVzc1ZhbHVlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLCBMUERXT1JEIHBWYWx1ZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBWYWx1ZSk7CisgICAgKnBWYWx1ZSA9IFRoaXMtPnVuaXF1ZW5lc3NfdmFsdWU7CisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldExPRAorICoKKyAqIFNldHMgdGhlIGxldmVsIG9mIGRldGFpbCBvZiBhIHRleHR1cmUKKyAqCisgKiBQYXJhbXM6CisgKiAgTWF4TE9EOiBMT0QgdG8gc2V0CisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRE9CSkVDVCBpZiB0aGUgc3VyZmFjZSBpcyBpbnZhbGlkIGZvciB0aGlzIG1ldGhvZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRMT0QoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBNYXhMT0QpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJWxkKVxuIiwgVGhpcywgTWF4TE9EKTsKKworICAgIGlmICghKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIgJiBERFNDQVBTMl9URVhUVVJFTUFOQUdFKSkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURPQkpFQ1Q7CisKKyAgICBpZighVGhpcy0+d2luZUQzRFRleHR1cmUpCisgICAgeworICAgICAgICBFUlIoIiglcCkgVGhlIERpcmVjdERyYXcgdGV4dHVyZSBoYXMgbm8gV2luZUQzRFRleHR1cmUhXG4iLCBUaGlzKTsKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURPQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIElXaW5lRDNEVGV4dHVyZV9TZXRMT0QoVGhpcy0+d2luZUQzRFRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TE9EKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRMT0QKKyAqCisgKiBSZXR1cm5zIHRoZSBsZXZlbCBvZiBkZXRhaWwgb2YgYSBEaXJlY3QzRCB0ZXh0dXJlCisgKgorICogUGFyYW1zOgorICogIE1heExPRDogQWRkcmVzcyB0byB3cml0ZSB0aGUgTE9EIHRvCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXhMT0QgaXMgTlVMTAorICogIERERVJSX0lOVkFMSURPQkpFQ1QgaWYgdGhlIHN1cmZhY2UgaXMgaW52YWxpZCBmb3IgdGhpcyBtZXRob2QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0TE9EKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKk1heExPRCkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIE1heExPRCk7CisKKyAgICBpZighTWF4TE9EKQorICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIGlmICghKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIgJiBERFNDQVBTMl9URVhUVVJFTUFOQUdFKSkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURPQkpFQ1Q7CisKKyAgICAqTWF4TE9EID0gSVdpbmVEM0RUZXh0dXJlX0dldExPRChUaGlzLT53aW5lRDNEVGV4dHVyZSk7CisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkJsdEZhc3QKKyAqCisgKiBQZXJmb3JtcyBhIGZhc3QgQmxpdC4KKyAqCisgKiBQYXJhbXM6CisgKiAgZHN0eDogVGhlIHggY29vcmRpbmF0ZSB0byBibGl0IHRvIG9uIHRoZSBkZXN0aW5hdGlvbgorICogIGRzdHk6IFRoZSB5IGNvb3JkaW5hdGUgdG8gYmxpdCB0byBvbiB0aGUgZGVzdGluYXRpb24KKyAqICBTb3VyY2U6IFRoZSBzb3VyY2Ugc3VyZmFjZQorICogIHJzcmM6IFRoZSBzb3VyY2UgcmVjdGFuZ2xlCisgKiAgdHJhbnM6IFR5cGUgb2YgdHJhbnNmZXIuIFNvbWUgRERCTFRGQVNUXyogZmxhZ3MKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgSVdpbmVEM0RTdXJmYWNlOjpCbHRGYXN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0JsdEZhc3QoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkc3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpyc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHRyYW5zKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzcmMgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBTb3VyY2UpOworICAgIFRSQUNFKCIoJXApLT4oJWxkLCVsZCwlcCwlcCwlbGQpOiBSZWxheVxuIiwgVGhpcywgZHN0eCwgZHN0eSwgU291cmNlLCByc3JjLCB0cmFucyk7CisKKyAgICByZXR1cm4gSVdpbmVEM0RTdXJmYWNlX0JsdEZhc3QoVGhpcy0+V2luZUQzRFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHgsIGRzdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA/IHNyYy0+V2luZUQzRFN1cmZhY2UgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdERyYXdTdXJmYWNlNzo6R2V0Q2xpcHBlcgorICoKKyAqIFJldHVybnMgdGhlIElEaXJlY3REcmF3Q2xpcHBlciBpbnRlcmZhY2Ugb2YgdGhlIGNsaXBwZXIgYXNzaWduZWQgdG8gdGhpcworICogc3VyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBDbGlwcGVyOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAorICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ2xpcHBlciBpcyBOVUxMCisgKiAgRERFUlJfTk9DTElQUEVSQVRUQUNIRUQgaWYgdGhlcmUncyBubyBjbGlwcGVyIGF0dGFjaGVkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldENsaXBwZXIoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdDbGlwcGVyICoqQ2xpcHBlcikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIENsaXBwZXIpOworCisgICAgaWYoIUNsaXBwZXIpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaWYoVGhpcy0+Y2xpcHBlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRERFUlJfTk9DTElQUEVSQVRUQUNIRUQ7CisKKyAgICAqQ2xpcHBlciA9IElDT01fSU5URVJGQUNFKFRoaXMtPmNsaXBwZXIsIElEaXJlY3REcmF3Q2xpcHBlcik7CisgICAgSURpcmVjdERyYXdDbGlwcGVyX0FkZFJlZigqQ2xpcHBlcik7CisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldENsaXBwZXIKKyAqCisgKiBTZXRzIGEgY2xpcHBlciBmb3IgdGhlIHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgQ2xpcHBlcjogSURpcmVjdERyYXdDbGlwcGVyIGludGVyZmFjZSBvZiB0aGUgY2xpcHBlciB0byBzZXQKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0Q2xpcHBlcihJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd0NsaXBwZXIgKkNsaXBwZXIpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxDbGlwcGVyKTsKKyAgICBpZiAoSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdDbGlwcGVySW1wbCwgSURpcmVjdERyYXdDbGlwcGVyLCBDbGlwcGVyKSA9PSBUaGlzLT5jbGlwcGVyKQorICAgICAgICByZXR1cm4gRERfT0s7CisKKyAgICBpZiAoVGhpcy0+Y2xpcHBlciAhPSBOVUxMKQorICAgICAgICBJRGlyZWN0RHJhd0NsaXBwZXJfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLT5jbGlwcGVyLCBJRGlyZWN0RHJhd0NsaXBwZXIpICk7CisKKyAgICBUaGlzLT5jbGlwcGVyID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdDbGlwcGVySW1wbCwgSURpcmVjdERyYXdDbGlwcGVyLCBDbGlwcGVyKTsKKyAgICBpZiAoQ2xpcHBlciAhPSBOVUxMKQorICAgICAgICBJRGlyZWN0RHJhd0NsaXBwZXJfQWRkUmVmKENsaXBwZXIpOworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldFN1cmZhY2VEZXNjCisgKgorICogU2V0cyB0aGUgc3VyZmFjZSBkZXNjcmlwdGlvbi4gSXQgY2FuIG92ZXJyaWRlIHRoZSBwaXhlbCBmb3JtYXQsIHRoZSBzdXJmYWNlCisgKiBtZW1vcnksIC4uLgorICogSXQncyBub3QgcmVhbGx5IHRlc3RlZC4KKyAqCisgKiBQYXJhbXM6CisgKiBERFNEOiBQb2ludGVyIHRvIHRoZSBuZXcgc3VyZmFjZSBkZXNjcmlwdGlvbiB0byBzZXQKKyAqIEZsYWdzOiBTb21lIGZsYWdzCisgKgorICogUmV0dXJuczoKKyAqICBERF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBERFNEIGlzIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0U3VyZmFjZURlc2MoSURpcmVjdERyYXdTdXJmYWNlNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREU1VSRkFDRURFU0MyICpERFNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSk7CisgICAgQllURSAqbmV3U3VyZmFjZSA9IE5VTEw7CisgICAgRFdPUkQgbmV3U2l6ZSA9IDA7CisgICAgV0lORUQzREZPUk1BVCBuZXdGb3JtYXQgPSBXSU5FRDNERk1UX1VOS05PV047CisgICAgSFJFU1VMVCBocjsKKyAgICBGSVhNRSgiKCVwKS0+KCVwLCVseClcbiIsIFRoaXMsIEREU0QsIEZsYWdzKTsKKyAgICBhc3NlcnQoMCk7CisKKyAgICBpZighRERTRCkKKyAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBpZiAoRERTRC0+ZHdGbGFncyAmIEREU0RfUElYRUxGT1JNQVQpCisgICAgeworICAgICAgICBuZXdGb3JtYXQgPSBQaXhlbEZvcm1hdF9ERDJXaW5lRDNEKCZERFNELT51NC5kZHBmUGl4ZWxGb3JtYXQpOworICAgIH0KKyAgICBpZiAoRERTRC0+ZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKQorICAgIHsKKyAgICAgICAgbmV3U3VyZmFjZSA9IEREU0QtPmxwU3VyZmFjZTsKKyAgICAgICAgbmV3U2l6ZSA9IEREU0QtPnUxLmR3TGluZWFyU2l6ZTsKKyAgICAgICAgLyogdG8gYXZvaWQgdW5wcmVkaWN0YWJsZSB0aGluZ3MgKi8KKyAgICAgICAgYXNzZXJ0KG5ld1NpemUgIT0gMCk7CisgICAgfQorCisgICAgLyogQmV0dGVyOiBVc2UgU2V0Rm9ybWF0ICovCisgICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfU2V0UGl4ZWxGb3JtYXQoVGhpcy0+V2luZUQzRFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2l6ZSk7CisgICAgaWYoaHIgIT0gRERfT0spIHJldHVybiBocjsKKworICAgIC8qIFN0b3JlIHRoZSBuZXcgZGF0YS4gTm90IHJlYWxseSBuZWNlc3NhcnksIGFzIFdpbmVEM0Qgc3RvcmVzIGl0IHRvbywKKyAgICAgKiBidXQgZm9yIGNvbXBsZXRlbmVzcworICAgICAqLworICAgIGlmKG5ld0Zvcm1hdCAhPSBXSU5FRDNERk1UX1VOS05PV04pCisgICAgeworICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1BJWEVMRk9STUFUOworICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0ID0gRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0OworICAgIH0KKyAgICBpZihuZXdTdXJmYWNlICE9IE5VTEwpCisgICAgeworICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID0gbmV3U3VyZmFjZTsKKyAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmR3TGluZWFyU2l6ZSA9IG5ld1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OkdldFBhbGV0dGUKKyAqCisgKiBSZXR1cm5zIHRoZSBJRGlyZWN0RHJhd1BhbGV0dGUgaW50ZXJmYWNlIG9mIHRoZSBwYWxldHRlIGN1cnJlbnRseSBhc3NpZ25lZAorICogdG8gdGhlIHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgUGFsOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBpbnRlcmZhY2UgcG9pbnRlciB0bworICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgUGFsIGlzIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGUgKipQYWwpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIElXaW5lRDNEUGFsZXR0ZSAqd1BhbDsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJXApOiBSZWxheVxuIiwgVGhpcywgUGFsKTsKKworICAgIGlmKCFQYWwpCisgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfR2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwgJndQYWwpOworICAgIGlmKGhyICE9IEREX09LKSByZXR1cm4gaHI7CisKKyAgICBpZih3UGFsKQorICAgIHsKKyAgICAgICAgaHIgPSBJV2luZUQzRFBhbGV0dGVfR2V0UGFyZW50KHdQYWwsIChJVW5rbm93biAqKikgUGFsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKlBhbCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGhyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldENvbG9yS2V5CisgKgorICogU2V0cyB0aGUgY29sb3Iga2V5aW5nIG9wdGlvbnMgZm9yIHRoZSBzdXJmYWNlLiBPYnNlcnZhdGlvbnMgc2hvd2VkIHRoYXQKKyAqIGluIGNhc2Ugb2YgY29tcGxleCBzdXJmYWNlcyB0aGUgY29sb3Iga2V5IGhhcyB0byBiZSBhc3NpZ25lZCB0byBhbGwKKyAqIHN1YmxldmVscy4KKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6IEREQ0tFWV8qCisgKiAgQ0tleTogVGhlIG5ldyBjb2xvciBrZXkKKyAqCisgKiBSZXR1cm5zOgorICogIEREX09LIG9uIHN1Y2Nlc3MKKyAqICBTZWUgSVdpbmVEM0RTdXJmYWNlOjpTZXRDb2xvcktleSBmb3IgZGV0YWlscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRDb2xvcktleShJRGlyZWN0RHJhd1N1cmZhY2U3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREQ09MT1JLRVkgKkNLZXkpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmY7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCVseCwlcClcbiIsIFRoaXMsIEZsYWdzLCBDS2V5KTsKKworICAgIGZvcihzdXJmID0gVGhpcy0+Zmlyc3RfY29tcGxleDsgc3VyZjsgc3VyZiA9IHN1cmYtPm5leHRfY29tcGxleCkKKyAgICB7CisgICAgICAgIGhyID0gSVdpbmVEM0RTdXJmYWNlX1NldENvbG9yS2V5KHN1cmYtPldpbmVEM0RTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0tleSk7CisgICAgICAgIGlmKEZBSUxFRChocikpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdBUk4oIklXaW5lRDNEU3VyZmFjZTo6U2V0Q29sb3JLZXkgZm9yIHN1cmZhY2UgJXAgZmFpbGVkIHdpdGggaHI9JTA4bHhcbiIsCisgICAgICAgICAgICAgICAgIHN1cmYtPldpbmVEM0RTdXJmYWNlLCBocik7CisgICAgICAgICAgICByZXR1cm4gaHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldFBhbGV0dGUKKyAqCisgKiBBc3NpZ25zIGEgRGlyZWN0RHJhd1BhbGV0dGUgb2JqZWN0IHRvIHRoZSBzdXJmYWNlCisgKgorICogUGFyYW1zOgorICogIFBhbDogSW50ZXJmYWNlIHRvIHRoZSBwYWxldHRlIHRvIHNldAorICoKKyAqIFJldHVybnM6CisgKiAgRERfT0sgb24gc3VjY2VzcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRQYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZTcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3UGFsZXR0ZSAqUGFsKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1BhbGV0dGUgKm9sZFBhbDsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmOworICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKlBhbEltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLCBJRGlyZWN0RHJhd1BhbGV0dGUsIFBhbCk7CisgICAgSFJFU1VMVCBocjsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgUGFsKTsKKworICAgIC8qIEZpbmQgdGhlIG9sZCBwYWxldHRlICovCisgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGFsZXR0ZShpZmFjZSwgJm9sZFBhbCk7CisgICAgaWYoaHIgIT0gRERfT0spIHJldHVybiBocjsKKyAgICBpZihvbGRQYWwpIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKG9sZFBhbCk7ICAvKiBGb3IgdGhlIEdldFBhbGV0dGUgKi8KKworICAgIC8qIFNldCB0aGUgbmV3IFBhbGV0dGUgKi8KKyAgICBJV2luZUQzRFN1cmZhY2VfU2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWxJbXBsID8gUGFsSW1wbC0+d2luZUQzRFBhbGV0dGUgOiBOVUxMKTsKKyAgICAvKiBBZGRSZWYgdGhlIFBhbGV0dGUgKi8KKyAgICBpZihQYWwpIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoUGFsKTsKKworICAgIC8qIFJlbGVhc2UgdGhlIG9sZCBwYWxldHRlICovCisgICAgaWYob2xkUGFsKSBJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZShvbGRQYWwpOworCisgICAgLyogSWYgdGhpcyBpcyBhIGZyb250IGJ1ZmZlciwgYWxzbyB1cGRhdGUgdGhlIGJhY2sgYnVmZmVycyAqLworICAgIGlmKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfRlJPTlRCVUZGRVIpCisgICAgeworICAgICAgICBmb3Ioc3VyZiA9IFRoaXMtPm5leHRfY29tcGxleDsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9jb21wbGV4KQorICAgICAgICB7CisgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldFBhbGV0dGUoSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgVlRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IElEaXJlY3REcmF3U3VyZmFjZTdWdGJsIElEaXJlY3REcmF3U3VyZmFjZTdfVnRibCA9Cit7CisgICAgLyoqKiBJVW5rbm93biAqKiovCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2UgKioqLworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkQXR0YWNoZWRTdXJmYWNlLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQWRkT3ZlcmxheURpcnR5UmVjdCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0JsdCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0JsdEJhdGNoLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfQmx0RmFzdCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0VudW1BdHRhY2hlZFN1cmZhY2VzLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfRW51bU92ZXJsYXlaT3JkZXJzLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfRmxpcCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldEF0dGFjaGVkU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldEJsdFN0YXR1cywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldENhcHMsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRDbGlwcGVyLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0Q29sb3JLZXksCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXREQywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0dldEZsaXBTdGF0dXMsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRPdmVybGF5UG9zaXRpb24sCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRQYWxldHRlLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UGl4ZWxGb3JtYXQsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRTdXJmYWNlRGVzYywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX0luaXRpYWxpemUsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9Jc0xvc3QsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9Mb2NrLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfUmVsZWFzZURDLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfUmVzdG9yZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldENsaXBwZXIsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRDb2xvcktleSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldE92ZXJsYXlQb3NpdGlvbiwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldFBhbGV0dGUsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9VbmxvY2ssCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9VcGRhdGVPdmVybGF5LAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfVXBkYXRlT3ZlcmxheURpc3BsYXksCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9VcGRhdGVPdmVybGF5Wk9yZGVyLAorICAgIC8qKiogSURpcmVjdERyYXdTdXJmYWNlMiAqKiovCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXREREludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhZ2VMb2NrLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfUGFnZVVubG9jaywKKyAgICAvKioqIElEaXJlY3REcmF3U3VyZmFjZTMgKioqLworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfU2V0U3VyZmFjZURlc2MsCisgICAgLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2U0ICoqKi8KKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldFByaXZhdGVEYXRhLAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UHJpdmF0ZURhdGEsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9GcmVlUHJpdmF0ZURhdGEsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRVbmlxdWVuZXNzVmFsdWUsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9DaGFuZ2VVbmlxdWVuZXNzVmFsdWUsCisgICAgLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2U3ICoqKi8KKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1NldFByaW9yaXR5LAorICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGxfR2V0UHJpb3JpdHksCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9TZXRMT0QsCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbF9HZXRMT0QKK307CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3N1cmZhY2VfZGliLmMgYi9kbGxzL2RkcmF3L3N1cmZhY2VfZGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYThhYjEuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9zdXJmYWNlX2RpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4MyArMCwwIEBACi0vKgkJRElCU2VjdGlvbiBEaXJlY3REcmF3U3VyZmFjZSBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgotICogQ29weXJpZ2h0IDE5OTgtMjAwMCBMaW9uZWwgVWxtZXIKLSAqIENvcHlyaWdodCAyMDAwLTIwMDEgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAid2luZS9wb3J0LmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAotCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0jaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImQzZF9wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotLyogRklYTUUgKi8KLWV4dGVybiBIQklUTUFQIERJQl9DcmVhdGVESUJTZWN0aW9uKCBIREMgaGRjLCBjb25zdCBCSVRNQVBJTkZPICpibWksIFVJTlQgdXNhZ2UsIFZPSUQgKipiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBzZWN0aW9uLCBEV09SRCBvZmZzZXQsIERXT1JEIG92cl9waXRjaCApOwotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgRElCX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlOwotCi0vKiBSZXR1cm4gdGhlIHdpZHRoIG9mIGEgRElCIGJpdG1hcCBpbiBieXRlcy4gRElCIGJpdG1hcCBkYXRhIGlzIDMyLWJpdCBhbGlnbmVkLiAqLwotaW5saW5lIHN0YXRpYyBpbnQgZ2V0X2RpYl93aWR0aF9ieXRlcyggaW50IHdpZHRoLCBpbnQgZGVwdGggKQotewotICAgIGludCB3b3JkczsKLQotICAgIHN3aXRjaChkZXB0aCkKLSAgICB7Ci0gICAgY2FzZSAxOiAgd29yZHMgPSAod2lkdGggKyAzMSkgLyAzMjsgYnJlYWs7Ci0gICAgY2FzZSA0OiAgd29yZHMgPSAod2lkdGggKyA3KSAvIDg7IGJyZWFrOwotICAgIGNhc2UgODogIHdvcmRzID0gKHdpZHRoICsgMykgLyA0OyBicmVhazsKLSAgICBjYXNlIDE1OgotICAgIGNhc2UgMTY6IHdvcmRzID0gKHdpZHRoICsgMSkgLyAyOyBicmVhazsKLSAgICBjYXNlIDI0OiB3b3JkcyA9ICh3aWR0aCAqIDMgKyAzKS80OyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBXQVJOKCIoJWQpOiBVbnN1cHBvcnRlZCBkZXB0aFxuIiwgZGVwdGggKTsKLSAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAzMjogd29yZHMgPSB3aWR0aDsgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiA0ICogd29yZHM7Ci19Ci0KLQotc3RhdGljIEhSRVNVTFQgY3JlYXRlX2RpYihJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIEJJVE1BUElORk8qIGJfaW5mbzsKLSAgICBVSU5UIHVzYWdlOwotICAgIEhEQyBkZGM7Ci0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpdiA9IFRoaXMtPnByaXZhdGU7Ci0KLSAgICBhc3NlcnQoVGhpcy0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZSAhPSBOVUxMKTsKLQotICAgIHN3aXRjaCAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50KQotICAgIHsKLSAgICBjYXNlIDE2OgotICAgIGNhc2UgMzI6Ci0JLyogQWxsb2NhdGUgZXh0cmEgc3BhY2UgdG8gc3RvcmUgdGhlIFJHQiBiaXQgbWFza3MuICovCi0JYl9pbmZvID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyAzICogc2l6ZW9mKERXT1JEKSk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDI0OgotCWJfaW5mbyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKLQlicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JLyogQWxsb2NhdGUgZXh0cmEgc3BhY2UgZm9yIGEgcGFsZXR0ZS4gKi8KLQliX2luZm8gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoUkdCUVVBRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogKDEgPDwgVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50KSk7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgYl9pbmZvLT5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGggPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aDsKLSAgICBiX2luZm8tPmJtaUhlYWRlci5iaUhlaWdodCA9IC1UaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7Ci0gICAgYl9pbmZvLT5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOwotICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQ7Ci0KLSAgICBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCAhPSAxNikKLQkmJiAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ICE9IDMyKSkKLSAgICAgICAgYl9pbmZvLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICBlbHNlCi0gICAgICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9CSVRGSUVMRFM7Ci0KLSAgICBiX2luZm8tPmJtaUhlYWRlci5iaVNpemVJbWFnZQotCT0gKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCAvIDgpCi0JKiBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCAqIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLQotICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpWFBlbHNQZXJNZXRlciA9IDA7Ci0gICAgYl9pbmZvLT5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKLSAgICBiX2luZm8tPmJtaUhlYWRlci5iaUNsclVzZWQgPSAwOwotICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpQ2xySW1wb3J0YW50ID0gMDsKLQotICAgIGlmICghVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCkgewotCS8qIFRoaXMgY2FuJ3QgaGFwcGVuLCByaWdodD8gKi8KLQkvKiBvciB1c2UgR0RJX0dldE9iaiB0byBnZXQgaXQgZnJvbSB0aGUgY3JlYXRlZCBESUI/ICovCi0JVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCA9IGdldF9kaWJfd2lkdGhfYnl0ZXMoYl9pbmZvLT5ibWlIZWFkZXIuYmlXaWR0aCwgYl9pbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCk7Ci0JVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9QSVRDSDsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQpCi0gICAgewotICAgIGNhc2UgMTY6Ci0gICAgY2FzZSAzMjoKLSAgICB7Ci0JRFdPUkQgKm1hc2tzID0gKERXT1JEICopICYoYl9pbmZvLT5ibWlDb2xvcnMpOwotCi0JdXNhZ2UgPSAwOwotCW1hc2tzWzBdID0gVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrOwotCW1hc2tzWzFdID0gVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrOwotCW1hc2tzWzJdID0gVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51NC5kd0JCaXRNYXNrOwotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgMjQ6Ci0JLyogTm90aGluZyB0byBkbyAqLwotCXVzYWdlID0gRElCX1JHQl9DT0xPUlM7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCS8qIERvbid0IGtub3cgcGFsZXR0ZSAqLwotCXVzYWdlID0gMDsKLQlicmVhazsKLSAgICB9Ci0KLSAgICBkZGMgPSBDcmVhdGVEQ0EoIkRJU1BMQVkiLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICBpZiAoZGRjID09IDApCi0gICAgewotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJfaW5mbyk7Ci0JcmV0dXJuIEhSRVNVTFRfRlJPTV9XSU4zMihHZXRMYXN0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdi0+ZGliLkRJQnNlY3Rpb24KLQk9IERJQl9DcmVhdGVESUJTZWN0aW9uKGRkYywgYl9pbmZvLCB1c2FnZSwgJihwcml2LT5kaWIuYml0bWFwX2RhdGEpLCAwLAotCQkJICAgICAgIChEV09SRClUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlLAotCQkJICAgICAgIFRoaXMtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2gpOwotICAgIERlbGV0ZURDKGRkYyk7Ci0gICAgaWYgKCFwcml2LT5kaWIuRElCc2VjdGlvbikgewotCUVSUigiQ3JlYXRlRElCU2VjdGlvbiBmYWlsZWQhXG4iKTsKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBiX2luZm8pOwotCXJldHVybiBIUkVTVUxUX0ZST01fV0lOMzIoR2V0TGFzdEVycm9yKCkpOwotICAgIH0KLQotICAgIFRSQUNFKCJESUJTZWN0aW9uIGF0IDogJXBcbiIsIHByaXYtPmRpYi5iaXRtYXBfZGF0YSk7Ci0KLSAgICBpZiAoIVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UpIHsKLQlUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID0gcHJpdi0+ZGliLmJpdG1hcF9kYXRhOwotCVRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzIHw9IEREU0RfTFBTVVJGQUNFOwotICAgIH0KLQotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJfaW5mbyk7Ci0KLSAgICAvKiBJIGRvbid0IHRoaW5rIGl0J3Mgd29ydGggY2hlY2tpbmcgZm9yIHRoaXMuICovCi0gICAgaWYgKHByaXYtPmRpYi5iaXRtYXBfZGF0YSAhPSBUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlKQotCUVSUigidW5leHBlY3RlZCBlcnJvciBjcmVhdGluZyBEaXJlY3REcmF3U3VyZmFjZSBESUIgc2VjdGlvblxuIik7Ci0KLSAgICAvKiB0aGlzIHNlZW1zIGxpa2UgYSBnb29kIHBsYWNlIHRvIHB1dCB0aGUgaGFuZGxlIGZvciBIQUwgZHJpdmVyIHVzZSAqLwotICAgIFRoaXMtPmdsb2JhbF9tb3JlLmhLZXJuZWxTdXJmYWNlID0gKFVMT05HX1BUUilwcml2LT5kaWIuRElCc2VjdGlvbjsKLQotICAgIHJldHVybiBTX09LOwotfQotCi12b2lkIERJQl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCi17Ci0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpdiA9IFRoaXMtPnByaXZhdGU7Ci0KLSAgICBEZWxldGVPYmplY3QocHJpdi0+ZGliLkRJQnNlY3Rpb24pOwotCi0gICAgaWYgKCFwcml2LT5kaWIuY2xpZW50X21lbW9yeSkKLQlWaXJ0dWFsRnJlZShUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlLCAwLCBNRU1fUkVMRUFTRSk7Ci0KLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Ci19Ci0KLUhSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApCi17Ci0gICAgcmV0dXJuIERJQl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcy0+ZGRyYXdfb3duZXIsCi0JCQkJCSZUaGlzLT5zdXJmYWNlX2Rlc2MsIHBwRHVwLCBOVUxMKTsKLX0KLQotSFJFU1VMVCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsCi0JCQkJCUlEaXJlY3REcmF3SW1wbCAqcERELAotCQkJCQljb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QpCi17Ci0gICAgSFJFU1VMVCBocjsKLSAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcml2ID0gVGhpcy0+cHJpdmF0ZTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLFRoaXMscERELHBERFNEKTsKLSAgICBociA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgcEREU0QpOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcsCi0JCQlESUJfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGUpOwotCi0gICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlOwotICAgIFRoaXMtPmR1cGxpY2F0ZV9zdXJmYWNlID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlOwotICAgIFRoaXMtPmZsaXBfZGF0YSA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGE7Ci0KLSAgICBUaGlzLT5nZXRfZGMgICAgID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kYzsKLSAgICBUaGlzLT5yZWxlYXNlX2RjID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX3JlbGVhc2VfZGM7Ci0gICAgVGhpcy0+aERDID0gTlVMTDsKLQotICAgIFRoaXMtPnNldF9wYWxldHRlICAgID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX3NldF9wYWxldHRlOwotICAgIFRoaXMtPnVwZGF0ZV9wYWxldHRlID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlOwotCi0gICAgVFJBQ0UoIiglbGR4JWxkLCBwaXRjaD0lbGQpXG4iLAotCSAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3V2lkdGgsIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCwKLQkgIFRoaXMtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2gpOwotICAgIC8qIFhYWCBsb2FkIGR3V2lkdGggYW5kIGR3SGVpZ2h0IGZyb20gcEREIGlmIHRoZXkgYXJlIG5vdCBzcGVjaWZpZWQ/ICovCi0KLSAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJiBERFNEX0xQU1VSRkFDRSkKLSAgICB7Ci0JLyogIkNsaWVudCBtZW1vcnkiOiBpdCBpcyBtYW5hZ2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gKi8KLQkvKiBYWFggV2hhdCBpZiBsUGl0Y2ggaXMgbm90IHNldD8gVXNlIGR3V2lkdGggb3IgZmFpbD8gKi8KLQotCXByaXYtPmRpYi5jbGllbnRfbWVtb3J5ID0gVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZiAoIShUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmIEREU0RfUElUQ0gpKQotCXsKLQkgICAgaW50IHBpdGNoID0gVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaDsKLQkgICAgaWYgKHBpdGNoICUgOCAhPSAwKQotCQlwaXRjaCArPSA4IC0gKHBpdGNoICUgOCk7Ci0JfQotCS8qIFhYWCBlbHNlOiBob3cgc2hvdWxkIGxQaXRjaCBiZSB2ZXJpZmllZD8gKi8KLQotCVRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzIHw9IEREU0RfTFBTVVJGQUNFOwotCi0JLyogRW5zdXJlIHRoYXQgRERTRF9QSVRDSCBpcyByZXNwZWN0ZWQgZm9yIEREUEZfRk9VUkNDIHN1cmZhY2VzIHRvbyAqLwotIAlpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MgJiYgIShUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmIEREU0RfUElUQ0gpKSB7Ci0JICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UKLQkJPSBWaXJ0dWFsQWxsb2MoTlVMTCwgVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmR3TGluZWFyU2l6ZSwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpOwotCSAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX0xJTkVBUlNJWkU7Ci0JfSBlbHNlIHsKLQkgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZQotCQk9IFZpcnR1YWxBbGxvYyhOVUxMLCBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoCi0JCQkgICAqIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCArIDQsIC8qIFRoZSArIDQgaGVyZSBpcyBmb3IgZHVtYiBnYW1lcyByZWFkaW5nIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHN1cmZhY2UKLQkJCQkJCQkJIHdoZW4gcmVhZGluZyB0aGUgbGFzdCBieXRlIC8gaGFsZiB1c2luZyB3b3JkIGFjY2VzcyAqLwotCQkJICAgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpOwotCSAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1BJVENIOwotCX0KLQotCWlmIChUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID09IE5VTEwpCi0JewotCSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Ci0JICAgIHJldHVybiBIUkVTVUxUX0ZST01fV0lOMzIoR2V0TGFzdEVycm9yKCkpOwotCX0KLQotCXByaXYtPmRpYi5jbGllbnRfbWVtb3J5ID0gRkFMU0U7Ci0gICAgfQotCi0gICAgaHIgPSBjcmVhdGVfZGliKFRoaXMpOwotICAgIGlmIChGQUlMRUQoaHIpKQotICAgIHsKLQlpZiAoIXByaXYtPmRpYi5jbGllbnRfbWVtb3J5KQotCSAgICBWaXJ0dWFsRnJlZShUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlLCAwLCBNRU1fUkVMRUFTRSk7Ci0KLQlNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Ci0KLQlyZXR1cm4gaHI7Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKiBOb3QgYW4gQVBJICovCi1IUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsICpwREQsCi0JCQkJICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QsCi0JCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAotCQkJCSAgICAgSVVua25vd24gKnBVbmtPdXRlcikKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzOwotICAgIEhSRVNVTFQgaHI7Ci0gICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsKLQotICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLQkJICAgICBzaXplb2YoKlRoaXMpICsgc2l6ZW9mKERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGwpKTsKLSAgICBpZiAoVGhpcyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLQotICAgIFRoaXMtPnByaXZhdGUgPSAoRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCopKFRoaXMrMSk7Ci0KLSAgICBociA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoVGhpcywgcERELCBwRERTRCk7Ci0gICAgaWYgKEZBSUxFRChocikpCi0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7Ci0gICAgZWxzZQotCSpwcFN1cmYgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKLQotICAgIHJldHVybiBocjsKLQotfQotCi0vKiBBZGRBdHRhY2hlZFN1cmZhY2U6IGdlbmVyaWMgKi8KLS8qIEFkZE92ZXJsYXlEaXJ0eVJlY3Q6IGdlbmVyaWMsIHVuaW1wbGVtZW50ZWQgKi8KLQotc3RhdGljIEhSRVNVTFQgX0JsdF9Db2xvckZpbGwoCi0gICAgTFBCWVRFIGJ1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBMT05HIGxQaXRjaCwgRFdPUkQgY29sb3IKLSkgewotICAgIGludCB4LCB5OwotICAgIExQQllURSBmaXJzdDsKLQotICAgIC8qIERvIGZpcnN0IHJvdyAqLwotCi0jZGVmaW5lIENPTE9SRklMTF9ST1codHlwZSkgeyBcCi0gICAgdHlwZSAqZCA9ICh0eXBlICopIGJ1ZjsgXAotICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSBcCi0JZFt4XSA9ICh0eXBlKSBjb2xvcjsgXAotICAgIGJyZWFrOyBcCi19Ci0KLSAgICBzd2l0Y2goYnBwKSB7Ci0gICAgY2FzZSAxOiBDT0xPUkZJTExfUk9XKEJZVEUpCi0gICAgY2FzZSAyOiBDT0xPUkZJTExfUk9XKFdPUkQpCi0gICAgY2FzZSAzOiB7IEJZVEUgKmQgPSAoQllURSAqKSBidWY7Ci0gICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrLGQrPTMpIHsKLSAgICAgICAgICAgICAgICBkWzBdID0gKGNvbG9yICAgICkgJiAweEZGOwotICAgICAgICAgICAgICAgIGRbMV0gPSAoY29sb3I+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgZFsyXSA9IChjb2xvcj4+MTYpICYgMHhGRjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazt9Ci0gICAgY2FzZSA0OiBDT0xPUkZJTExfUk9XKERXT1JEKQotICAgIGRlZmF1bHQ6Ci0JRklYTUUoIkNvbG9yIGZpbGwgbm90IGltcGxlbWVudGVkIGZvciBicHAgJWQhXG4iLCBicHAqOCk7Ci0JcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwotICAgIH0KLQotI3VuZGVmIENPTE9SRklMTF9ST1cKLQotICAgIC8qIE5vdyBjb3B5IGZpcnN0IHJvdyAqLwotICAgIGZpcnN0ID0gYnVmOwotICAgIGZvciAoeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykgewotCWJ1ZiArPSBsUGl0Y2g7Ci0JbWVtY3B5KGJ1ZiwgZmlyc3QsIHdpZHRoICogYnBwKTsKLSAgICB9Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgdm9pZCBDb21wdXRlU2hpZnRzKERXT1JEIG1hc2ssIERXT1JEKiBsc2hpZnQsIERXT1JEKiByc2hpZnQpCi17Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgaW50IGJpdHMgPSAwOwotICAgICpsc2hpZnQgPSAwOwotICAgICpyc2hpZnQgPSAwOwotICAgIAotICAgIGlmICghbWFzaykKLQlyZXR1cm47Ci0gICAgCi0gICAgd2hpbGUoIShtYXNrICYgKDEgPDwgcG9zKSkpCi0JcG9zKys7IAotICAgIAotICAgIHdoaWxlKG1hc2sgJiAoMSA8PCAocG9zK2JpdHMpKSkKLQliaXRzKys7Ci0gICAgCi0gICAgKmxzaGlmdCA9IHBvczsKLSAgICAqcnNoaWZ0ID0gOCAtIGJpdHM7Ci19Ci0KLS8qIFRoaXMgaXMgdXNlZCB0byBmYWN0b3JpemUgdGhlIGRlY29tcHJlc3Npb24gYmV0d2VlbiB0aGUgQmx0IGFuZCBCbHRGYXN0IGNvZGUgKi8KLXN0YXRpYyB2b2lkIERvRFhUQ0RlY29tcHJlc3Npb24oY29uc3QgRERTVVJGQUNFREVTQzIgKnNkZXNjLCBjb25zdCBERFNVUkZBQ0VERVNDMiAqZGRlc2MpCi17Ci0gICAgRFdPUkQgcnMscmIscm07Ci0gICAgRFdPUkQgZ3MsZ2IsZ207Ci0gICAgRFdPUkQgYnMsYmIsYm07Ci0gICAgRFdPUkQgYXMsYWIsYW07Ci0KLSAgICBpZiAoIXMzdGNfaW5pdGlhbGl6ZWQpIHsKLQkvKiBGSVhNRTogV2UgbWF5IGZha2UgdGhpcyBieSByZW5kZXJpbmcgdGhlIHRleHR1cmUgaW50byB0aGUgZnJhbWVidWZmZXIgdXNpbmcgT3BlbkdMIGZ1bmN0aW9ucyBhbmQgcmVhZGluZyBiYWNrCi0JICogICAgICAgIHRoZSBmcmFtZWJ1ZmZlci4gVGhpcyB3aWxsIGJlIHNsb3cgYW5kIHNvbWV3aGF0IHVnbHkuICovIAotCUZJWE1FKCJNYW51YWwgUzNUQyBkZWNvbXByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbmF0aXZlIG1vZGVcbiIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgcm0gPSBkZGVzYy0+dTQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3UkJpdE1hc2s7Ci0gICAgQ29tcHV0ZVNoaWZ0cyhybSwgJnJzLCAmcmIpOwotICAgIGdtID0gZGRlc2MtPnU0LmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrOwotICAgIENvbXB1dGVTaGlmdHMoZ20sICZncywgJmdiKTsKLSAgICBibSA9IGRkZXNjLT51NC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdCQml0TWFzazsKLSAgICBDb21wdXRlU2hpZnRzKGJtLCAmYnMsICZiYik7Ci0gICAgYW0gPSBkZGVzYy0+dTQuZGRwZlBpeGVsRm9ybWF0LnU1LmR3UkdCQWxwaGFCaXRNYXNrOwotICAgIENvbXB1dGVTaGlmdHMoYW0sICZhcywgJmFiKTsKLSAgICBpZiAoc2Rlc2MtPnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyA9PSBNQUtFX0ZPVVJDQygnRCcsJ1gnLCdUJywnMScpKSB7Ci0JaW50IGlzMTYgPSBkZGVzYy0+dTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgPT0gMTY7Ci0JaW50IHBpdGNoID0gZGRlc2MtPnUxLmxQaXRjaDsKLQlpbnQgd2lkdGggPSBkZGVzYy0+ZHdXaWR0aDsKLQlpbnQgaGVpZ2h0ID0gZGRlc2MtPmR3SGVpZ2h0OwotCWludCB4LHk7Ci0JdW5zaWduZWQgY2hhciogZHN0ID0gKHVuc2lnbmVkIGNoYXIqKSBkZGVzYy0+bHBTdXJmYWNlOwotCXVuc2lnbmVkIGNoYXIqIHNyYyA9ICh1bnNpZ25lZCBjaGFyKikgc2Rlc2MtPmxwU3VyZmFjZTsKLQlmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKLQkgICAgZm9yICh5ID0wOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJRFdPUkQgcGl4ZWwgPSAwOwotCQlCWVRFIGRhdGFbNF07Ci0JCSgqZmV0Y2hfMmRfdGV4ZWxfcmdiYV9keHQxKSh3aWR0aCwgc3JjLCB4LCB5LCBkYXRhKTsKLQkJcGl4ZWwgPSAwOwotCQlwaXhlbCB8PSAoKGRhdGFbMF0gPj4gcmIpIDw8IHJzKSAmIHJtOwotCQlwaXhlbCB8PSAoKGRhdGFbMV0gPj4gZ2IpIDw8IGdzKSAmIGdtOwotCQlwaXhlbCB8PSAoKGRhdGFbMl0gPj4gYmIpIDw8IGJzKSAmIGJtOwotCQlwaXhlbCB8PSAoKGRhdGFbM10gPj4gYWIpIDw8IGFzKSAmIGFtOwotCQlpZiAoaXMxNikKLQkJICAgICooKFdPUkQqKShkc3QreSpwaXRjaCt4KihpczE2PzI6NCkpKSA9IHBpeGVsOwotCQllbHNlCi0JCSAgICAqKChEV09SRCopKGRzdCt5KnBpdGNoK3gqKGlzMTY/Mjo0KSkpID0gcGl4ZWw7Ci0JICAgIH0KLSAgICB9IGVsc2UgaWYgKHNkZXNjLT51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MgPT0gTUFLRV9GT1VSQ0MoJ0QnLCdYJywnVCcsJzMnKSkgewotCWludCBpczE2ID0gZGRlc2MtPnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ID09IDE2OwotCWludCBwaXRjaCA9IGRkZXNjLT51MS5sUGl0Y2g7Ci0JaW50IHdpZHRoID0gZGRlc2MtPmR3V2lkdGg7Ci0JaW50IGhlaWdodCA9IGRkZXNjLT5kd0hlaWdodDsKLQlpbnQgeCx5OwotCXVuc2lnbmVkIGNoYXIqIGRzdCA9ICh1bnNpZ25lZCBjaGFyKikgZGRlc2MtPmxwU3VyZmFjZTsKLQl1bnNpZ25lZCBjaGFyKiBzcmMgPSAodW5zaWduZWQgY2hhciopIHNkZXNjLT5scFN1cmZhY2U7Ci0JZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCi0JICAgIGZvciAoeSA9MDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCURXT1JEIHBpeGVsID0gMDsKLQkJQllURSBkYXRhWzRdOwotCQkoKmZldGNoXzJkX3RleGVsX3JnYmFfZHh0Mykod2lkdGgsIHNyYywgeCwgeSwgZGF0YSk7Ci0JCXBpeGVsID0gMDsKLQkJcGl4ZWwgfD0gKChkYXRhWzBdID4+IHJiKSA8PCBycykgJiBybTsKLQkJcGl4ZWwgfD0gKChkYXRhWzFdID4+IGdiKSA8PCBncykgJiBnbTsKLQkJcGl4ZWwgfD0gKChkYXRhWzJdID4+IGJiKSA8PCBicykgJiBibTsKLQkJcGl4ZWwgfD0gKChkYXRhWzNdID4+IGFiKSA8PCBhcykgJiBhbTsKLQkJaWYgKGlzMTYpCi0JCSAgICAqKChXT1JEKikoZHN0K3kqcGl0Y2greCooaXMxNj8yOjQpKSkgPSBwaXhlbDsKLQkJZWxzZQotCQkgICAgKigoRFdPUkQqKShkc3QreSpwaXRjaCt4KihpczE2PzI6NCkpKSA9IHBpeGVsOwotCSAgICB9Ci0gICAgfSBlbHNlIGlmIChzZGVzYy0+dTQuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID09IE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCc1JykpIHsKLQlpbnQgaXMxNiA9IGRkZXNjLT51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAxNjsKLQlpbnQgcGl0Y2ggPSBkZGVzYy0+dTEubFBpdGNoOwotCWludCB3aWR0aCA9IGRkZXNjLT5kd1dpZHRoOwotCWludCBoZWlnaHQgPSBkZGVzYy0+ZHdIZWlnaHQ7Ci0JaW50IHgseTsKLQl1bnNpZ25lZCBjaGFyKiBkc3QgPSAodW5zaWduZWQgY2hhciopIGRkZXNjLT5scFN1cmZhY2U7Ci0JdW5zaWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNoYXIqKSBzZGVzYy0+bHBTdXJmYWNlOwotCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQotCSAgICBmb3IgKHkgPTA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlEV09SRCBwaXhlbCA9IDA7Ci0JCUJZVEUgZGF0YVs0XTsKLQkJKCpmZXRjaF8yZF90ZXhlbF9yZ2JhX2R4dDUpKHdpZHRoLCBzcmMsIHgsIHksIGRhdGEpOwotCQlwaXhlbCA9IDA7Ci0JCXBpeGVsIHw9ICgoZGF0YVswXSA+PiByYikgPDwgcnMpICYgcm07Ci0JCXBpeGVsIHw9ICgoZGF0YVsxXSA+PiBnYikgPDwgZ3MpICYgZ207Ci0JCXBpeGVsIHw9ICgoZGF0YVsyXSA+PiBiYikgPDwgYnMpICYgYm07Ci0JCXBpeGVsIHw9ICgoZGF0YVszXSA+PiBhYikgPDwgYXMpICYgYW07Ci0JCWlmIChpczE2KQotCQkgICAgKigoV09SRCopKGRzdCt5KnBpdGNoK3gqKGlzMTY/Mjo0KSkpID0gcGl4ZWw7Ci0JCWVsc2UKLQkJICAgICooKERXT1JEKikoZHN0K3kqcGl0Y2greCooaXMxNj8yOjQpKSkgPSBwaXhlbDsKLQkgICAgfQotICAgIH0KLSNpZiAwIC8qIFVzZWZ1bCBmb3IgZGVidWdnaW5nICovCi0gICAgewotCXN0YXRpYyBpbnQgaWR4OwotCWNoYXIgdGV4bmFtZVsyNTVdOwotCUZJTEUqIGY7Ci0Jc3ByaW50Zih0ZXhuYW1lLCAiZHh0XyVkLnBubSIsIGlkeCsrKTsKLQlmID0gZm9wZW4odGV4bmFtZSwidyIpOwotCUREUkFXX2R1bXBfc3VyZmFjZV90b19kaXNrKFRoaXMsIGYsIDEpOwotCWZjbG9zZShmKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotSFJFU1VMVCBXSU5BUEkKLURJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHQoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQUkVDVCByZHN0LAotCQkJICBMUERJUkVDVERSQVdTVVJGQUNFNyBzcmMsIExQUkVDVCByc3JjLAotCQkJICBEV09SRCBkd0ZsYWdzLCBMUEREQkxURlggbHBibHRmeCkKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLSAgICBSRUNUCQl4ZHN0LHhzcmM7Ci0gICAgRERTVVJGQUNFREVTQzIJZGRlc2Msc2Rlc2M7Ci0gICAgSFJFU1VMVAkJcmV0ID0gRERfT0s7Ci0gICAgaW50IGJwcCwgc3JjaGVpZ2h0LCBzcmN3aWR0aCwgZHN0aGVpZ2h0LCBkc3R3aWR0aCwgd2lkdGg7Ci0gICAgaW50IHgsIHk7Ci0gICAgTFBCWVRFIGRidWYsIHNidWY7Ci0gICAgCi0gICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcCwlMDhseCwlcClcbiIsIFRoaXMscmRzdCxzcmMscnNyYyxkd0ZsYWdzLGxwYmx0ZngpOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCWlmIChyZHN0KSBUUkFDRSgiXHRkZXN0cmVjdCA6JWxkeCVsZC0lbGR4JWxkXG4iLHJkc3QtPmxlZnQscmRzdC0+dG9wLHJkc3QtPnJpZ2h0LHJkc3QtPmJvdHRvbSk7Ci0JaWYgKHJzcmMpIFRSQUNFKCJcdHNyY3JlY3QgIDolbGR4JWxkLSVsZHglbGRcbiIscnNyYy0+bGVmdCxyc3JjLT50b3AscnNyYy0+cmlnaHQscnNyYy0+Ym90dG9tKTsKLQlUUkFDRSgiXHRmbGFnczogIik7Ci0JRERSQVdfZHVtcF9EREJMVChkd0ZsYWdzKTsKLQlpZiAoZHdGbGFncyAmIEREQkxUX0RERlgpIHsKLQkgICAgVFJBQ0UoIlx0YmxpdGZ4OiAiKTsKLQkgICAgRERSQVdfZHVtcF9EREJMVEZYKGxwYmx0ZngtPmR3RERGWCk7Ci0JfQotICAgIH0KLQotICAgIGlmICgoVGhpcy0+bG9ja2VkKSB8fCAoKHNyYyAhPSBOVUxMKSAmJiAoKChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopc3JjKS0+bG9ja2VkKSkpIHsKLSAgICAgICAgV0FSTigiIFN1cmZhY2UgaXMgYnVzeSwgcmV0dXJuaW5nIERERVJSX1NVUkZBQ0VCVVNZXG4iKTsKLSAgICAgICAgcmV0dXJuIERERVJSX1NVUkZBQ0VCVVNZOwotICAgIH0KLQotICAgIC8qIEZpcnN0LCBjaGVjayBpZiB0aGUgcG9zc2libGUgb3ZlcnJpZGUgZnVuY3Rpb24gaGFuZGxlcyB0aGlzIGNhc2UgKi8KLSAgICBpZiAoVGhpcy0+YXV4X2JsdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChUaGlzLT5hdXhfYmx0KFRoaXMsIHJkc3QsIHNyYywgcnNyYywgZHdGbGFncywgbHBibHRmeCkgPT0gRERfT0spIHJldHVybiBERF9PSzsKLSAgICB9Ci0KLSAgICBERF9TVFJVQ1RfSU5JVCgmZGRlc2MpOwotICAgIEREX1NUUlVDVF9JTklUKCZzZGVzYyk7Ci0KLSAgICBzZGVzYy5kd1NpemUgPSBzaXplb2Yoc2Rlc2MpOwotICAgIGRkZXNjLmR3U2l6ZSA9IHNpemVvZihkZGVzYyk7Ci0KLSAgICBpZiAoc3JjID09IGlmYWNlKSB7Ci0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhpZmFjZSwgTlVMTCwgJmRkZXNjLCAwLCAwKTsKLSAgICAgICAgRERfU1RSVUNUX0NPUFlfQllTSVpFKCZzZGVzYywgJmRkZXNjKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoc3JjKSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3JjLCBOVUxMLCAmc2Rlc2MsIERETE9DS19SRUFET05MWSwgMCk7Ci0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhpZmFjZSxOVUxMLCZkZGVzYyxERExPQ0tfV1JJVEVPTkxZLDApOwotICAgIH0KLQotICAgIGlmICghbHBibHRmeCB8fCAhKGxwYmx0ZngtPmR3RERGWCkpIGR3RmxhZ3MgJj0gfkREQkxUX0RERlg7Ci0KLSAgICBpZiAoKHNkZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpICYmCi0JKGRkZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpKSB7Ci0JaWYgKHNkZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyAhPSBzZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MpIHsKLQkgICAgRklYTUUoIkZPVVJDQy0+Rk9VUkNDIGNvcHkgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBzYW1lIHR5cGUgb2Ygc3VyZmFjZVxuIik7Ci0JICAgIHJldCA9IERERVJSX0lOVkFMSURQSVhFTEZPUk1BVDsKLQkgICAgZ290byByZWxlYXNlOwotCX0KLQltZW1jcHkoZGRlc2MubHBTdXJmYWNlLCBzZGVzYy5scFN1cmZhY2UsIGRkZXNjLnUxLmR3TGluZWFyU2l6ZSk7Ci0JZ290byByZWxlYXNlOwotICAgIH0KLQotICAgIGlmICgoc2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykgJiYKLQkoIShkZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfRk9VUkNDKSkpIHsKLQlEb0RYVENEZWNvbXByZXNzaW9uKCZzZGVzYywgJmRkZXNjKTsKLQlnb3RvIHJlbGVhc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChyZHN0KSB7Ci0JbWVtY3B5KCZ4ZHN0LHJkc3Qsc2l6ZW9mKHhkc3QpKTsKLSAgICB9IGVsc2UgewotCXhkc3QudG9wCT0gMDsKLQl4ZHN0LmJvdHRvbQk9IGRkZXNjLmR3SGVpZ2h0OwotCXhkc3QubGVmdAk9IDA7Ci0JeGRzdC5yaWdodAk9IGRkZXNjLmR3V2lkdGg7Ci0gICAgfQotCi0gICAgaWYgKHJzcmMpIHsKLQltZW1jcHkoJnhzcmMscnNyYyxzaXplb2YoeHNyYykpOwotICAgIH0gZWxzZSB7Ci0JaWYgKHNyYykgewotCSAgICB4c3JjLnRvcAk9IDA7Ci0JICAgIHhzcmMuYm90dG9tCT0gc2Rlc2MuZHdIZWlnaHQ7Ci0JICAgIHhzcmMubGVmdAk9IDA7Ci0JICAgIHhzcmMucmlnaHQJPSBzZGVzYy5kd1dpZHRoOwotCX0gZWxzZSB7Ci0JICAgIG1lbXNldCgmeHNyYywwLHNpemVvZih4c3JjKSk7Ci0JfQotICAgIH0KLQotICAgIC8qIEZpcnN0IGNoZWNrIGZvciB0aGUgdmFsaWRpdHkgb2Ygc291cmNlIC8gZGVzdGluYXRpb24gcmVjdGFuZ2xlcy4gVGhpcyB3YXMKLSAgICAgICB2ZXJpZmllZCB1c2luZyBhIHRlc3QgYXBwbGljYXRpb24gKyBieSBNU0ROLgotICAgICovCi0gICAgaWYgKChzcmMgIT0gTlVMTCkgJiYKLQkoKHhzcmMuYm90dG9tID4gc2Rlc2MuZHdIZWlnaHQpIHx8ICh4c3JjLmJvdHRvbSA8IDApIHx8Ci0JICh4c3JjLnRvcCA+IHNkZXNjLmR3SGVpZ2h0KSB8fCAoeHNyYy50b3AgPCAwKSB8fAotCSAoeHNyYy5sZWZ0ID4gc2Rlc2MuZHdXaWR0aCkgfHwgKHhzcmMubGVmdCA8IDApIHx8Ci0JICh4c3JjLnJpZ2h0ID4gc2Rlc2MuZHdXaWR0aCkgfHwgKHhzcmMucmlnaHQgPCAwKSB8fAotCSAoeHNyYy5yaWdodCA8IHhzcmMubGVmdCkgfHwgKHhzcmMuYm90dG9tIDwgeHNyYy50b3ApKSkgewotICAgICAgICBXQVJOKCJBcHBsaWNhdGlvbiBnYXZlIHVzIGJhZCBzb3VyY2UgcmVjdGFuZ2xlIGZvciBCbHQuXG4iKTsKLQlyZXQgPSBEREVSUl9JTlZBTElEUkVDVDsKLQlnb3RvIHJlbGVhc2U7Ci0gICAgfQotICAgIC8qIEZvciB0aGUgRGVzdGluYXRpb24gcmVjdCwgaXQgY2FuIGJlIG91dCBvZiBib3VuZHMgb24gdGhlIGNvbmRpdGlvbiB0aGF0IGEgY2xpcHBlcgotICAgICAgIGlzIHNldCBmb3IgdGhlIGdpdmVuIHN1cmZhY2UuCi0gICAgKi8KLSAgICBpZiAoKFRoaXMtPmNsaXBwZXIgPT0gTlVMTCkgJiYKLQkoKHhkc3QuYm90dG9tID4gZGRlc2MuZHdIZWlnaHQpIHx8ICh4ZHN0LmJvdHRvbSA8IDApIHx8Ci0JICh4ZHN0LnRvcCA+IGRkZXNjLmR3SGVpZ2h0KSB8fCAoeGRzdC50b3AgPCAwKSB8fAotCSAoeGRzdC5sZWZ0ID4gZGRlc2MuZHdXaWR0aCkgfHwgKHhkc3QubGVmdCA8IDApIHx8Ci0JICh4ZHN0LnJpZ2h0ID4gZGRlc2MuZHdXaWR0aCkgfHwgKHhkc3QucmlnaHQgPCAwKSB8fAotCSAoeGRzdC5yaWdodCA8IHhkc3QubGVmdCkgfHwgKHhkc3QuYm90dG9tIDwgeGRzdC50b3ApKSkgewotICAgICAgICBXQVJOKCJBcHBsaWNhdGlvbiBnYXZlIHVzIGJhZCBkZXN0aW5hdGlvbiByZWN0YW5nbGUgZm9yIEJsdCB3aXRob3V0IGEgY2xpcHBlciBzZXQuXG4iKTsKLQlyZXQgPSBEREVSUl9JTlZBTElEUkVDVDsKLQlnb3RvIHJlbGVhc2U7Ci0gICAgfQotICAgIAotICAgIC8qIE5vdyBoYW5kbGUgbmVnYXRpdmUgdmFsdWVzIGluIHRoZSByZWN0YW5nbGVzLiBXYXJuaW5nOiBvbmx5IHN1cHBvcnRlZCBmb3Igbm93Ci0gICAgICAgaW4gdGhlICdzaW1wbGUnIGNhc2VzIChpZSBub3QgaW4gYW55IHN0cmV0Y2hpbmcgLyByb3RhdGlvbiBjYXNlcykuCi0KLSAgICAgICBGaXJzdCwgdGhlIGNhc2Ugd2hlcmUgbm90aGluZyBpcyB0byBiZSBkb25lLgotICAgICovCi0gICAgaWYgKCgoeGRzdC5ib3R0b20gPD0gMCkgfHwgKHhkc3QucmlnaHQgPD0gMCkgfHwgKHhkc3QudG9wID49IChpbnQpIGRkZXNjLmR3SGVpZ2h0KSB8fCAoeGRzdC5sZWZ0ID49IChpbnQpIGRkZXNjLmR3V2lkdGgpKSB8fAotICAgICAgICAoKHNyYyAhPSBOVUxMKSAmJgotICAgICAgICAgKCh4c3JjLmJvdHRvbSA8PSAwKSB8fCAoeHNyYy5yaWdodCA8PSAwKSB8fCAoeHNyYy50b3AgPj0gKGludCkgc2Rlc2MuZHdIZWlnaHQpIHx8ICh4c3JjLmxlZnQgPj0gKGludCkgc2Rlc2MuZHdXaWR0aCkpKSkKLSAgICB7Ci0gICAgICAgIFRSQUNFKCJOb3RoaW5nIHRvIGJlIGRvbmUgIVxuIik7Ci0gICAgICAgIGdvdG8gcmVsZWFzZTsKLSAgICB9Ci0KLSAgICAvKiBUaGUgZWFzeSBjYXNlIDogdGhlIHNvdXJjZS1sZXNzIGJsaXRzLi4uLiAqLwotICAgIGlmIChzcmMgPT0gTlVMTCkgewotICAgICAgICBSRUNUIGZ1bGxfcmVjdDsKLSAgICAgICAgUkVDVCB0ZW1wX3JlY3Q7IC8qIE5vIGlkZWEgaWYgaW50ZXJzZWN0IHJlY3QgY2FuIGJlIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgc291cmNlIHJlY3QgKi8KLQotCWZ1bGxfcmVjdC5sZWZ0ICAgPSAwOwotCWZ1bGxfcmVjdC50b3AgICAgPSAwOwotCWZ1bGxfcmVjdC5yaWdodCAgPSBkZGVzYy5kd1dpZHRoOwotCWZ1bGxfcmVjdC5ib3R0b20gPSBkZGVzYy5kd0hlaWdodDsKLSAgICAgICAgSW50ZXJzZWN0UmVjdCgmdGVtcF9yZWN0LCAmZnVsbF9yZWN0LCAmeGRzdCk7Ci0gICAgICAgIHhkc3QgPSB0ZW1wX3JlY3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogT25seSBoYW5kbGUgY2xpcHBpbmcgb24gdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSAqLwotICAgICAgICBpbnQgY2xpcF9ob3JpeiA9ICh4ZHN0LmxlZnQgPCAwKSB8fCAoeGRzdC5yaWdodCAgPiAoaW50KSBkZGVzYy5kd1dpZHRoICk7Ci0gICAgICAgIGludCBjbGlwX3ZlcnQgID0gKHhkc3QudG9wICA8IDApIHx8ICh4ZHN0LmJvdHRvbSA+IChpbnQpIGRkZXNjLmR3SGVpZ2h0KTsKLSAgICAgICAgaWYgKGNsaXBfdmVydCB8fCBjbGlwX2hvcml6KSB7Ci0gICAgICAgICAgICAvKiBOb3cgY2hlY2sgaWYgdGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvciBub3QuLi4gKi8KLSAgICAgICAgICAgIGlmICgoKCh4ZHN0LmJvdHRvbSAtIHhkc3QudG9wICkgIT0gKHhzcmMuYm90dG9tIC0geHNyYy50b3AgKSkgJiYgY2xpcF92ZXJ0ICkgfHwKLSAgICAgICAgICAgICAgICAoKCh4ZHN0LnJpZ2h0ICAtIHhkc3QubGVmdCkgIT0gKHhzcmMucmlnaHQgIC0geHNyYy5sZWZ0KSkgJiYgY2xpcF9ob3JpeikgfHwKLSAgICAgICAgICAgICAgICAoZHdGbGFncyAmIEREQkxUX0RERlgpKSB7Ci0gICAgICAgICAgICAgICAgV0FSTigiT3V0IG9mIHNjcmVlbiByZWN0YW5nbGUgaW4gc3BlY2lhbCBjYXNlLiBOb3QgaGFuZGxlZCByaWdodCBub3cuXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIHJlbGVhc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjbGlwX2hvcml6KSB7Ci0gICAgICAgICAgICAgIGlmICh4ZHN0LmxlZnQgPCAwKSB7IHhzcmMubGVmdCAtPSB4ZHN0LmxlZnQ7IHhkc3QubGVmdCA9IDA7IH0KLSAgICAgICAgICAgICAgaWYgKHhkc3QucmlnaHQgPiBkZGVzYy5kd1dpZHRoKSB7IHhzcmMucmlnaHQgLT0gKHhkc3QucmlnaHQgLSAoaW50KSBkZGVzYy5kd1dpZHRoKTsgeGRzdC5yaWdodCA9IChpbnQpIGRkZXNjLmR3V2lkdGg7IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbGlwX3ZlcnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoeGRzdC50b3AgPCAwKSB7IHhzcmMudG9wIC09IHhkc3QudG9wOyB4ZHN0LnRvcCA9IDA7IH0KLSAgICAgICAgICAgICAgICBpZiAoeGRzdC5ib3R0b20gPiBkZGVzYy5kd0hlaWdodCkgeyB4c3JjLmJvdHRvbSAtPSAoeGRzdC5ib3R0b20gLSAoaW50KSBkZGVzYy5kd0hlaWdodCk7IHhkc3QuYm90dG9tID0gKGludCkgZGRlc2MuZHdIZWlnaHQ7IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEFuZCBjaGVjayBpZiBhZnRlciBjbGlwcGluZyBzb21ldGhpbmcgaXMgc3RpbGwgdG8gYmUgZG9uZS4uLiAqLwotICAgICAgICAgICAgaWYgKCh4ZHN0LmJvdHRvbSA8PSAwKSB8fCAoeGRzdC5yaWdodCA8PSAwKSB8fCAoeGRzdC50b3AgPj0gKGludCkgZGRlc2MuZHdIZWlnaHQpIHx8ICh4ZHN0LmxlZnQgPj0gKGludCkgZGRlc2MuZHdXaWR0aCkgfHwKLSAgICAgICAgICAgICAgICAoeHNyYy5ib3R0b20gPD0gMCkgfHwgKHhzcmMucmlnaHQgPD0gMCkgfHwgKHhzcmMudG9wID49IChpbnQpIHNkZXNjLmR3SGVpZ2h0KSB8fCAoeHNyYy5sZWZ0ID49IChpbnQpIHNkZXNjLmR3V2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgVFJBQ0UoIk5vdGhpbmcgdG8gYmUgZG9uZSBhZnRlciBjbGlwcGluZyAhXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIHJlbGVhc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBicHAgPSBHRVRfQlBQKGRkZXNjKTsKLSAgICBzcmNoZWlnaHQgPSB4c3JjLmJvdHRvbSAtIHhzcmMudG9wOwotICAgIHNyY3dpZHRoID0geHNyYy5yaWdodCAtIHhzcmMubGVmdDsKLSAgICBkc3RoZWlnaHQgPSB4ZHN0LmJvdHRvbSAtIHhkc3QudG9wOwotICAgIGRzdHdpZHRoID0geGRzdC5yaWdodCAtIHhkc3QubGVmdDsKLSAgICB3aWR0aCA9ICh4ZHN0LnJpZ2h0IC0geGRzdC5sZWZ0KSAqIGJwcDsKLQotICAgIGFzc2VydCh3aWR0aCA8PSBkZGVzYy51MS5sUGl0Y2gpOwotCi0gICAgZGJ1ZiA9IChCWVRFKilkZGVzYy5scFN1cmZhY2UrKHhkc3QudG9wKmRkZXNjLnUxLmxQaXRjaCkrKHhkc3QubGVmdCpicHApOwotCi0gICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9XQUlUKSB7Ci0Jc3RhdGljIEJPT0wgZGlzcGxheWVkID0gRkFMU0U7Ci0JaWYgKCFkaXNwbGF5ZWQpCi0JICAgIEZJWE1FKCJDYW4ndCBoYW5kbGUgRERCTFRfV0FJVCBmbGFnIHJpZ2h0IG5vdy5cbiIpOwotCWRpc3BsYXllZCA9IFRSVUU7Ci0JZHdGbGFncyAmPSB+RERCTFRfV0FJVDsKLSAgICB9Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9BU1lOQykgewotCXN0YXRpYyBCT09MIGRpc3BsYXllZCA9IEZBTFNFOwotCWlmICghZGlzcGxheWVkKQotCSAgICBGSVhNRSgiQ2FuJ3QgaGFuZGxlIEREQkxUX0FTWU5DIGZsYWcgcmlnaHQgbm93LlxuIik7Ci0JZGlzcGxheWVkID0gVFJVRTsKLQlkd0ZsYWdzICY9IH5EREJMVF9BU1lOQzsKLSAgICB9Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9ET05PVFdBSVQpIHsKLQkvKiBEREJMVF9ET05PVFdBSVQgYXBwZWFyZWQgaW4gRFg3ICovCi0Jc3RhdGljIEJPT0wgZGlzcGxheWVkID0gRkFMU0U7Ci0JaWYgKCFkaXNwbGF5ZWQpCi0JICAgIEZJWE1FKCJDYW4ndCBoYW5kbGUgRERCTFRfRE9OT1RXQUlUIGZsYWcgcmlnaHQgbm93LlxuIik7Ci0JZGlzcGxheWVkID0gVFJVRTsKLQlkd0ZsYWdzICY9IH5EREJMVF9ET05PVFdBSVQ7Ci0gICAgfQotCi0gICAgLyogRmlyc3QsIGFsbCB0aGUgJ3NvdXJjZS1sZXNzJyBibGl0cyAqLwotICAgIGlmIChkd0ZsYWdzICYgRERCTFRfQ09MT1JGSUxMKSB7Ci0JcmV0ID0gX0JsdF9Db2xvckZpbGwoZGJ1ZiwgZHN0d2lkdGgsIGRzdGhlaWdodCwgYnBwLAotCQkJICAgICBkZGVzYy51MS5sUGl0Y2gsIGxwYmx0ZngtPnU1LmR3RmlsbENvbG9yKTsKLQlkd0ZsYWdzICY9IH5EREJMVF9DT0xPUkZJTEw7Ci0gICAgfQotCi0gICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9ERVBUSEZJTEwpCi0JRklYTUUoIkREQkxUX0RFUFRIRklMTCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCFcbiIpOwotICAgIGlmIChkd0ZsYWdzICYgRERCTFRfUk9QKSB7Ci0JLyogQ2F0Y2ggc29tZSBkZWdlbmVyYXRlIGNhc2VzIGhlcmUgKi8KLQlzd2l0Y2gobHBibHRmeC0+ZHdST1ApIHsKLQljYXNlIEJMQUNLTkVTUzoKLQkgICAgcmV0ID0gX0JsdF9Db2xvckZpbGwoZGJ1Zixkc3R3aWR0aCxkc3RoZWlnaHQsYnBwLGRkZXNjLnUxLmxQaXRjaCwwKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEFBMDAyOTogLyogTm8tb3AgKi8KLQkgICAgYnJlYWs7Ci0JY2FzZSBXSElURU5FU1M6Ci0JICAgIHJldCA9IF9CbHRfQ29sb3JGaWxsKGRidWYsZHN0d2lkdGgsZHN0aGVpZ2h0LGJwcCxkZGVzYy51MS5sUGl0Y2gsfjApOwotCSAgICBicmVhazsKLQljYXNlIFNSQ0NPUFk6IC8qIHdlbGwsIHdlIGRvIHRoYXQgYmVsb3cgPyAqLwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgcmFzdGVyIG9wOiAlMDhseCAgUGF0dGVybjogJXBcbiIsIGxwYmx0ZngtPmR3Uk9QLCBscGJsdGZ4LT51NS5scEREU1BhdHRlcm4pOwotCSAgICBnb3RvIGVycm9yOwotCX0KLQlkd0ZsYWdzICY9IH5EREJMVF9ST1A7Ci0gICAgfQotICAgIGlmIChkd0ZsYWdzICYgRERCTFRfRERST1BTKSB7Ci0JRklYTUUoIlx0RGRyYXcgUmFzdGVyIE9wczogJTA4bHggIFBhdHRlcm46ICVwXG4iLCBscGJsdGZ4LT5kd0REUk9QLCBscGJsdGZ4LT51NS5scEREU1BhdHRlcm4pOwotICAgIH0KLSAgICAvKiBOb3cgdGhlICd3aXRoIHNvdXJjZScgYmxpdHMgKi8KLSAgICBpZiAoc3JjKSB7Ci0JTFBCWVRFIHNiYXNlOwotCWludCBzeCwgeGluYywgc3ksIHlpbmM7Ci0KLQlpZiAoIWRzdHdpZHRoIHx8ICFkc3RoZWlnaHQpIC8qIGhtbS4uLiBzdHVwaWQgcHJvZ3JhbSA/ICovCi0JICAgIGdvdG8gcmVsZWFzZTsKLQlzYmFzZSA9IChCWVRFKilzZGVzYy5scFN1cmZhY2UrKHhzcmMudG9wKnNkZXNjLnUxLmxQaXRjaCkreHNyYy5sZWZ0KmJwcDsKLQl4aW5jID0gKHNyY3dpZHRoIDw8IDE2KSAvIGRzdHdpZHRoOwotCXlpbmMgPSAoc3JjaGVpZ2h0IDw8IDE2KSAvIGRzdGhlaWdodDsKLQotCWlmICghZHdGbGFncykgewotCSAgICAvKiBObyBlZmZlY3RzLCB3ZSBjYW4gY2hlYXQgaGVyZSAqLwotCSAgICBpZiAoZHN0d2lkdGggPT0gc3Jjd2lkdGgpIHsKLQkJaWYgKGRzdGhlaWdodCA9PSBzcmNoZWlnaHQpIHsKLQkJICAgIC8qIE5vIHN0cmV0Y2hpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbi4gVGhpcyBuZWVkcyB0byBiZSBhcwotCQkgICAgICogZmFzdCBhcyBwb3NzaWJsZSAqLwotCQkgICAgc2J1ZiA9IHNiYXNlOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBvdmVybGFwcGluZyBzdXJmYWNlcyAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjICE9IGlmYWNlIHx8IHhkc3QudG9wIDwgeHNyYy50b3AgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhkc3QucmlnaHQgPD0geHNyYy5sZWZ0IHx8IHhzcmMucmlnaHQgPD0geGRzdC5sZWZ0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvdmVybGFwLCBvciBkc3QgYWJvdmUgc3JjLCBzbyBjb3B5IGZyb20gdG9wIGRvd253YXJkcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGRzdGhlaWdodDsgeSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkYnVmLCBzYnVmLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2J1ZiArPSBzZGVzYy51MS5sUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1ZiArPSBkZGVzYy51MS5sUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeGRzdC50b3AgPiB4c3JjLnRvcCkgIC8qIGNvcHkgZnJvbSBib3R0b20gdXB3YXJkcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYnVmICs9IChzZGVzYy51MS5sUGl0Y2gqZHN0aGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRidWYgKz0gKGRkZXNjLnUxLmxQaXRjaCpkc3RoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGRzdGhlaWdodDsgeSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNidWYgLT0gc2Rlc2MudTEubFBpdGNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidWYgLT0gZGRlc2MudTEubFBpdGNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkYnVmLCBzYnVmLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBzcmMgYW5kIGRzdCBvdmVybGFwcGluZyBvbiB0aGUgc2FtZSBsaW5lLCB1c2UgbWVtbW92ZSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShkYnVmLCBzYnVmLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2J1ZiArPSBzZGVzYy51MS5sUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1ZiArPSBkZGVzYy51MS5sUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIC8qIFN0cmV0Y2hpbmcgaW4gWSBkaXJlY3Rpb24gb25seSAqLwotCQkgICAgZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpIHsKLQkJCXNidWYgPSBzYmFzZSArIChzeSA+PiAxNikgKiBzZGVzYy51MS5sUGl0Y2g7Ci0JCQltZW1jcHkoZGJ1Ziwgc2J1Ziwgd2lkdGgpOwotCQkJZGJ1ZiArPSBkZGVzYy51MS5sUGl0Y2g7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJLyogU3RyZXRjaGluZyBpbiBYIGRpcmVjdGlvbiAqLwotCQlpbnQgbGFzdF9zeSA9IC0xOwotCQlmb3IgKHkgPSBzeSA9IDA7IHkgPCBkc3RoZWlnaHQ7IHkrKywgc3kgKz0geWluYykgewotCQkgICAgc2J1ZiA9IHNiYXNlICsgKHN5ID4+IDE2KSAqIHNkZXNjLnUxLmxQaXRjaDsKLQotCQkgICAgaWYgKChzeSA+PiAxNikgPT0gKGxhc3Rfc3kgPj4gMTYpKSB7Ci0JCQkvKiB0aGlzIHNvdXJjZXJvdyBpcyB0aGUgc2FtZSBhcyBsYXN0IHNvdXJjZXJvdyAtCi0JCQkgKiBjb3B5IGFscmVhZHkgc3RyZXRjaGVkIHJvdwotCQkJICovCi0JCQltZW1jcHkoZGJ1ZiwgZGJ1ZiAtIGRkZXNjLnUxLmxQaXRjaCwgd2lkdGgpOwotCQkgICAgfSBlbHNlIHsKLSNkZWZpbmUgU1RSRVRDSF9ST1codHlwZSkgeyBcCi0JCSAgICB0eXBlICpzID0gKHR5cGUgKikgc2J1ZiwgKmQgPSAodHlwZSAqKSBkYnVmOyBcCi0JCSAgICBmb3IgKHggPSBzeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBzeCArPSB4aW5jKSBcCi0JCSAgICBkW3hdID0gc1tzeCA+PiAxNl07IFwKLQkJICAgIGJyZWFrOyB9Ci0KLQkJICAgIHN3aXRjaChicHApIHsKLQkJICAgIGNhc2UgMTogU1RSRVRDSF9ST1coQllURSkKLQkJICAgIGNhc2UgMjogU1RSRVRDSF9ST1coV09SRCkKLQkJICAgIGNhc2UgNDogU1RSRVRDSF9ST1coRFdPUkQpCi0JCSAgICBjYXNlIDM6IHsKLQkJCUxQQllURSBzLGQgPSBkYnVmOwotCQkJZm9yICh4ID0gc3ggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgc3grPSB4aW5jKSB7Ci0JCQkgICAgRFdPUkQgcGl4ZWw7Ci0KLQkJCSAgICBzID0gc2J1ZiszKihzeD4+MTYpOwotCQkJICAgIHBpeGVsID0gc1swXXwoc1sxXTw8OCl8KHNbMl08PDE2KTsKLQkJCSAgICBkWzBdID0gKHBpeGVsICAgICkmMHhmZjsKLQkJCSAgICBkWzFdID0gKHBpeGVsPj4gOCkmMHhmZjsKLQkJCSAgICBkWzJdID0gKHBpeGVsPj4xNikmMHhmZjsKLQkJCSAgICBkKz0zOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBkZWZhdWx0OgotCQkJRklYTUUoIlN0cmV0Y2hlZCBibGl0IG5vdCBpbXBsZW1lbnRlZCBmb3IgYnBwICVkIVxuIiwgYnBwKjgpOwotCQkJcmV0ID0gRERFUlJfVU5TVVBQT1JURUQ7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgfQotI3VuZGVmIFNUUkVUQ0hfUk9XCi0JCSAgICB9Ci0JCSAgICBkYnVmICs9IGRkZXNjLnUxLmxQaXRjaDsKLQkJICAgIGxhc3Rfc3kgPSBzeTsKLQkJfQotCSAgICB9Ci0JfSBlbHNlIHsKLSAgICAgICAgICAgTE9ORyBkc3R5aW5jID0gZGRlc2MudTEubFBpdGNoLCBkc3R4aW5jID0gYnBwOwotICAgICAgICAgICBEV09SRCBrZXlsb3cgPSAweEZGRkZGRkZGLCBrZXloaWdoID0gMCwga2V5bWFzayA9IDB4RkZGRkZGRkY7Ci0gICAgICAgICAgIGlmIChkd0ZsYWdzICYgKEREQkxUX0tFWVNSQyB8IEREQkxUX0tFWURFU1QgfCBEREJMVF9LRVlTUkNPVkVSUklERSB8IEREQkxUX0tFWURFU1RPVkVSUklERSkpIHsKLQotCSAgICAgIGlmIChkd0ZsYWdzICYgRERCTFRfS0VZU1JDKSB7Ci0JCSBrZXlsb3cgID0gc2Rlc2MuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlOwotCQkga2V5aGlnaCA9IHNkZXNjLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7Ci0JICAgICAgfSBlbHNlIGlmIChkd0ZsYWdzICYgRERCTFRfS0VZREVTVCl7Ci0JCSBrZXlsb3cgID0gZGRlc2MuZGRja0NLRGVzdEJsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKLQkJIGtleWhpZ2ggPSBkZGVzYy5kZGNrQ0tEZXN0Qmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKLQkgICAgICB9IGVsc2UgaWYgKGR3RmxhZ3MgJiBEREJMVF9LRVlTUkNPVkVSUklERSkgewotCQkga2V5bG93ICA9IGxwYmx0ZngtPmRkY2tTcmNDb2xvcmtleS5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKLQkJIGtleWhpZ2ggPSBscGJsdGZ4LT5kZGNrU3JjQ29sb3JrZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwotCSAgICAgIH0gZWxzZSB7Ci0JCSBrZXlsb3cgID0gbHBibHRmeC0+ZGRja0Rlc3RDb2xvcmtleS5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKLQkJIGtleWhpZ2ggPSBscGJsdGZ4LT5kZGNrRGVzdENvbG9ya2V5LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKLQkgICAgICB9Ci0KLQkJaWYoYnBwID09IDEpCi0JCQlrZXltYXNrID0gMHhmZjsKLQkJZWxzZQotCQkJa2V5bWFzayA9IHNkZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrIHwgc2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3R0JpdE1hc2sgfAotCQkJICAgICAgICAgIHNkZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51NC5kd0JCaXRNYXNrOwotCi0JICAgICAgZHdGbGFncyAmPSB+KEREQkxUX0tFWVNSQyB8IEREQkxUX0tFWURFU1QgfCBEREJMVF9LRVlTUkNPVkVSUklERSB8IEREQkxUX0tFWURFU1RPVkVSUklERSk7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBpZiAoZHdGbGFncyAmIEREQkxUX0RERlgpICB7Ci0gICAgICAgICAgICAgIExQQllURSBkVG9wTGVmdCwgZFRvcFJpZ2h0LCBkQm90dG9tTGVmdCwgZEJvdHRvbVJpZ2h0LCB0bXA7Ci0gICAgICAgICAgICAgIExPTkcgdG1weHk7Ci0gICAgICAgICAgICAgIGRUb3BMZWZ0ICAgICA9IGRidWY7Ci0gICAgICAgICAgICAgIGRUb3BSaWdodCAgICA9IGRidWYrKChkc3R3aWR0aC0xKSpicHApOwotICAgICAgICAgICAgICBkQm90dG9tTGVmdCAgPSBkVG9wTGVmdCsoKGRzdGhlaWdodC0xKSpkZGVzYy51MS5sUGl0Y2gpOwotICAgICAgICAgICAgICBkQm90dG9tUmlnaHQgPSBkQm90dG9tTGVmdCsoKGRzdHdpZHRoLTEpKmJwcCk7Ci0KLSAgICAgICAgICAgICAgaWYgKGxwYmx0ZngtPmR3RERGWCAmIEREQkxURlhfQVJJVEhTVFJFVENIWSl7Ci0gICAgICAgICAgICAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0byBkbyBhbnl0aGluZyBhYm91dCB0aGlzIGZsYWcgKi8KLSAgICAgICAgICAgICAgICAgV0FSTigiZHdmbGFncz1EREJMVF9EREZYIG5vdGhpbmcgZG9uZSBmb3IgRERCTFRGWF9BUklUSFNUUkVUQ0hZXG4iKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAobHBibHRmeC0+ZHdEREZYICYgRERCTFRGWF9NSVJST1JMRUZUUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgdG1wICAgICAgICAgID0gZFRvcFJpZ2h0OwotICAgICAgICAgICAgICAgICBkVG9wUmlnaHQgICAgPSBkVG9wTGVmdDsKLSAgICAgICAgICAgICAgICAgZFRvcExlZnQgICAgID0gdG1wOwotICAgICAgICAgICAgICAgICB0bXAgICAgICAgICAgPSBkQm90dG9tUmlnaHQ7Ci0gICAgICAgICAgICAgICAgIGRCb3R0b21SaWdodCA9IGRCb3R0b21MZWZ0OwotICAgICAgICAgICAgICAgICBkQm90dG9tTGVmdCAgPSB0bXA7Ci0gICAgICAgICAgICAgICAgIGRzdHhpbmMgPSBkc3R4aW5jICotMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAobHBibHRmeC0+ZHdEREZYICYgRERCTFRGWF9NSVJST1JVUERPV04pIHsKLSAgICAgICAgICAgICAgICAgdG1wICAgICAgICAgID0gZFRvcExlZnQ7Ci0gICAgICAgICAgICAgICAgIGRUb3BMZWZ0ICAgICA9IGRCb3R0b21MZWZ0OwotICAgICAgICAgICAgICAgICBkQm90dG9tTGVmdCAgPSB0bXA7Ci0gICAgICAgICAgICAgICAgIHRtcCAgICAgICAgICA9IGRUb3BSaWdodDsKLSAgICAgICAgICAgICAgICAgZFRvcFJpZ2h0ICAgID0gZEJvdHRvbVJpZ2h0OwotICAgICAgICAgICAgICAgICBkQm90dG9tUmlnaHQgPSB0bXA7Ci0gICAgICAgICAgICAgICAgIGRzdHlpbmMgPSBkc3R5aW5jICotMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAobHBibHRmeC0+ZHdEREZYICYgRERCTFRGWF9OT1RFQVJJTkcpIHsKLSAgICAgICAgICAgICAgICAgLyogSSBkb24ndCB0aGluayB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nIGFib3V0IHRoaXMgZmxhZyAqLwotICAgICAgICAgICAgICAgICBXQVJOKCJkd2ZsYWdzPUREQkxUX0RERlggbm90aGluZyBkb25lIGZvciBEREJMVEZYX05PVEVBUklOR1xuIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGxwYmx0ZngtPmR3RERGWCAmIEREQkxURlhfUk9UQVRFMTgwKSB7Ci0gICAgICAgICAgICAgICAgIHRtcCAgICAgICAgICA9IGRCb3R0b21SaWdodDsKLSAgICAgICAgICAgICAgICAgZEJvdHRvbVJpZ2h0ID0gZFRvcExlZnQ7Ci0gICAgICAgICAgICAgICAgIGRUb3BMZWZ0ICAgICA9IHRtcDsKLSAgICAgICAgICAgICAgICAgdG1wICAgICAgICAgID0gZEJvdHRvbUxlZnQ7Ci0gICAgICAgICAgICAgICAgIGRCb3R0b21MZWZ0ICA9IGRUb3BSaWdodDsKLSAgICAgICAgICAgICAgICAgZFRvcFJpZ2h0ICAgID0gdG1wOwotICAgICAgICAgICAgICAgICBkc3R4aW5jID0gZHN0eGluYyAqIC0xOwotICAgICAgICAgICAgICAgICBkc3R5aW5jID0gZHN0eWluYyAqIC0xOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChscGJsdGZ4LT5kd0RERlggJiBEREJMVEZYX1JPVEFURTI3MCkgewotICAgICAgICAgICAgICAgICB0bXAgICAgICAgICAgPSBkVG9wTGVmdDsKLSAgICAgICAgICAgICAgICAgZFRvcExlZnQgICAgID0gZEJvdHRvbUxlZnQ7Ci0gICAgICAgICAgICAgICAgIGRCb3R0b21MZWZ0ICA9IGRCb3R0b21SaWdodDsKLSAgICAgICAgICAgICAgICAgZEJvdHRvbVJpZ2h0ID0gZFRvcFJpZ2h0OwotICAgICAgICAgICAgICAgICBkVG9wUmlnaHQgICAgPSB0bXA7Ci0gICAgICAgICAgICAgICAgIHRtcHh5ICAgPSBkc3R4aW5jOwotICAgICAgICAgICAgICAgICBkc3R4aW5jID0gZHN0eWluYzsKLSAgICAgICAgICAgICAgICAgZHN0eWluYyA9IHRtcHh5OwotICAgICAgICAgICAgICAgICBkc3R4aW5jID0gZHN0eGluYyAqIC0xOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChscGJsdGZ4LT5kd0RERlggJiBEREJMVEZYX1JPVEFURTkwKSB7Ci0gICAgICAgICAgICAgICAgIHRtcCAgICAgICAgICA9IGRUb3BMZWZ0OwotICAgICAgICAgICAgICAgICBkVG9wTGVmdCAgICAgPSBkVG9wUmlnaHQ7Ci0gICAgICAgICAgICAgICAgIGRUb3BSaWdodCAgICA9IGRCb3R0b21SaWdodDsKLSAgICAgICAgICAgICAgICAgZEJvdHRvbVJpZ2h0ID0gZEJvdHRvbUxlZnQ7Ci0gICAgICAgICAgICAgICAgIGRCb3R0b21MZWZ0ICA9IHRtcDsKLSAgICAgICAgICAgICAgICAgdG1weHkgICA9IGRzdHhpbmM7Ci0gICAgICAgICAgICAgICAgIGRzdHhpbmMgPSBkc3R5aW5jOwotICAgICAgICAgICAgICAgICBkc3R5aW5jID0gdG1weHk7Ci0gICAgICAgICAgICAgICAgIGRzdHlpbmMgPSBkc3R5aW5jICogLTE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGxwYmx0ZngtPmR3RERGWCAmIEREQkxURlhfWkJVRkZFUkJBU0VERVNUKSB7Ci0gICAgICAgICAgICAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0byBkbyBhbnl0aGluZyBhYm91dCB0aGlzIGZsYWcgKi8KLSAgICAgICAgICAgICAgICAgV0FSTigiZHdmbGFncz1EREJMVF9EREZYIG5vdGhpbmcgZG9uZSBmb3IgRERCTFRGWF9aQlVGRkVSQkFTRURFU1RcbiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRidWYgPSBkVG9wTGVmdDsKLSAgICAgICAgICAgICAgZHdGbGFncyAmPSB+KEREQkxUX0RERlgpOwotICAgICAgICAgICB9Ci0KLSNkZWZpbmUgQ09QWV9DT0xPUktFWV9GWCh0eXBlKSB7IFwKLQkgICAgdHlwZSAqcywgKmQgPSAodHlwZSAqKSBkYnVmLCAqZHgsIHRtcDsgXAotICAgICAgICAgICAgZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpIHsgXAotICAgICAgICAgICAgICAgcyA9ICh0eXBlKikoc2Jhc2UgKyAoc3kgPj4gMTYpICogc2Rlc2MudTEubFBpdGNoKTsgXAotICAgICAgICAgICAgICAgZHggPSBkOyBcCi0JICAgICAgIGZvciAoeCA9IHN4ID0gMDsgeCA8IGRzdHdpZHRoOyB4KyssIHN4ICs9IHhpbmMpIHsgXAotCQkgIHRtcCA9IHNbc3ggPj4gMTZdOyBcCi0JCSAgaWYgKCh0bXAgJiBrZXltYXNrKSA8IGtleWxvdyB8fCAodG1wICYga2V5bWFzaykgPiBrZXloaWdoKSBkeFswXSA9IHRtcDsgXAotICAgICAgICAgICAgICAgICAgZHggPSAodHlwZSopKCgoTFBCWVRFKWR4KStkc3R4aW5jKTsgXAotCSAgICAgICB9IFwKLSAgICAgICAgICAgICAgIGQgPSAodHlwZSopKCgoTFBCWVRFKWQpK2RzdHlpbmMpOyBcCi0JICAgIH0gXAotICAgICAgICAgICAgYnJlYWs7IH0KLQotCSAgICBzd2l0Y2ggKGJwcCkgewotCSAgICBjYXNlIDE6IENPUFlfQ09MT1JLRVlfRlgoQllURSkKLQkgICAgY2FzZSAyOiBDT1BZX0NPTE9SS0VZX0ZYKFdPUkQpCi0JICAgIGNhc2UgNDogQ09QWV9DT0xPUktFWV9GWChEV09SRCkKLSAJICAgIGNhc2UgMzoge0xQQllURSBzLGQgPSBkYnVmLCBkeDsKLQkJZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpIHsKLQkJICAgIHNidWYgPSBzYmFzZSArIChzeSA+PiAxNikgKiBzZGVzYy51MS5sUGl0Y2g7Ci0JCSAgICBkeCA9IGQ7Ci0JCSAgICBmb3IgKHggPSBzeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBzeCs9IHhpbmMpIHsKLQkJCURXT1JEIHBpeGVsOwotCQkJcyA9IHNidWYrMyooc3g+PjE2KTsKLQkJCXBpeGVsID0gc1swXXwoc1sxXTw8OCl8KHNbMl08PDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGl4ZWwgJiBrZXltYXNrKSA8IGtleWxvdyB8fCAocGl4ZWwgJiBrZXltYXNrKSA+IGtleWhpZ2gpIHsKLQkJICAgICAgICAgICAgZHhbMF0gPSAocGl4ZWwgICAgKSYweGZmOwotCQkJICAgIGR4WzFdID0gKHBpeGVsPj4gOCkmMHhmZjsKLQkJCSAgICBkeFsyXSA9IChwaXhlbD4+MTYpJjB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgZHgrPSBkc3R4aW5jOwotCQkgICAgfQotCQkgICAgZCArPSBkc3R5aW5jOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazt9Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgIEZJWE1FKCIlcyBjb2xvci1rZXllZCBibGl0IG5vdCBpbXBsZW1lbnRlZCBmb3IgYnBwICVkIVxuIiwKLQkgICAgICAgICAgKGR3RmxhZ3MgJiBEREJMVF9LRVlTUkMpID8gIlNvdXJjZSIgOiAiRGVzdGluYXRpb24iLCBicHAqOCk7Ci0JCSAgcmV0ID0gRERFUlJfVU5TVVBQT1JURUQ7Ci0JCSAgZ290byBlcnJvcjsKLSN1bmRlZiBDT1BZX0NPTE9SS0VZX0ZYCi0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotZXJyb3I6Ci0gICAgaWYgKGR3RmxhZ3MgJiYgRklYTUVfT04oZGRyYXcpKSB7Ci0JRklYTUUoIlx0VW5zdXBwb3J0ZWQgZmxhZ3M6ICIpOwotCUREUkFXX2R1bXBfRERCTFQoZHdGbGFncyk7Ci0gICAgfQotCi1yZWxlYXNlOgotICAgIElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKGlmYWNlLE5VTEwpOwotICAgIGlmIChzcmMgJiYgc3JjICE9IGlmYWNlKSBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhzcmMsTlVMTCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogQmx0QmF0Y2g6IGdlbmVyaWMsIHVuaW1wbGVtZW50ZWQgKi8KLQotSFJFU1VMVCBXSU5BUEkKLURJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkc3R4LAotCQkJICAgICAgRFdPUkQgZHN0eSwgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLAotCQkJICAgICAgTFBSRUNUIHJzcmMsIERXT1JEIHRyYW5zKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotICAgIGludAkJCWJwcCwgdywgaCwgeCwgeTsKLSAgICBERFNVUkZBQ0VERVNDMglkZGVzYyxzZGVzYzsKLSAgICBIUkVTVUxUCQlyZXQgPSBERF9PSzsKLSAgICBMUEJZVEUJCXNidWYsIGRidWY7Ci0gICAgUkVDVAkJcnNyYzI7Ci0gICAgUkVDVCAgICAgICAgICAgICAgICBsb2NrX3NyYywgbG9ja19kc3QsIGxvY2tfdW5pb247Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JVFJBQ0UoIiglcCktPiglbGQsJWxkLCVwLCVwLCUwOGx4KVxuIiwKLQkJVGhpcyxkc3R4LGRzdHksc3JjLHJzcmMsdHJhbnMKLQkpOwotCVRSQUNFKCJcdHRyYW5zOiIpOwotCWlmIChGSVhNRV9PTihkZHJhdykpCi0JICBERFJBV19kdW1wX0REQkxURkFTVCh0cmFucyk7Ci0JaWYgKHJzcmMpCi0JICBUUkFDRSgiXHRzcmNyZWN0OiAlbGR4JWxkLSVsZHglbGRcbiIscnNyYy0+bGVmdCxyc3JjLT50b3AscnNyYy0+cmlnaHQscnNyYy0+Ym90dG9tKTsKLQllbHNlCi0JICBUUkFDRSgiIHNyY3JlY3Q6IE5VTExcbiIpOwotICAgIH0KLQotICAgIGlmICgoVGhpcy0+bG9ja2VkKSB8fCAoKHNyYyAhPSBOVUxMKSAmJiAoKChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopc3JjKS0+bG9ja2VkKSkpIHsKLSAgICAgICAgV0FSTigiIFN1cmZhY2UgaXMgYnVzeSwgcmV0dXJuaW5nIERERVJSX1NVUkZBQ0VCVVNZXG4iKTsKLSAgICAgICAgcmV0dXJuIERERVJSX1NVUkZBQ0VCVVNZOwotICAgIH0KLQotICAgIC8qIEZpcnN0LCBjaGVjayBpZiB0aGUgcG9zc2libGUgb3ZlcnJpZGUgZnVuY3Rpb24gaGFuZGxlcyB0aGlzIGNhc2UgKi8KLSAgICBpZiAoVGhpcy0+YXV4X2JsdGZhc3QgIT0gTlVMTCkgewotICAgICAgICBpZiAoVGhpcy0+YXV4X2JsdGZhc3QoVGhpcywgZHN0eCwgZHN0eSwgc3JjLCByc3JjLCB0cmFucykgPT0gRERfT0spIHJldHVybiBERF9PSzsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIHN1cmZhY2UgZGVzY3JpcHRpb24gd2l0aG91dCBsb2NraW5nIHRvIGZpcnN0IGNvbXB1dGUgdGhlIHdpZHRoIC8gaGVpZ2h0ICovCi0gICAgZGRlc2MgPSBUaGlzLT5zdXJmYWNlX2Rlc2M7Ci0gICAgc2Rlc2MgPSAoSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgc3JjKSktPnN1cmZhY2VfZGVzYzsKLQotICAgIGlmICghcnNyYykgewotCVdBUk4oInJzcmMgaXMgTlVMTCFcbiIpOwotCXJzcmMgPSAmcnNyYzI7Ci0JcnNyYy0+bGVmdCA9IHJzcmMtPnRvcCA9IDA7Ci0JcnNyYy0+cmlnaHQgPSBzZGVzYy5kd1dpZHRoOwotCXJzcmMtPmJvdHRvbSA9IHNkZXNjLmR3SGVpZ2h0OwotICAgIH0KLQotICAgIC8qIENoZWNrIHNvdXJjZSByZWN0IGZvciB2YWxpZGl0eS4gQ29waWVkIGZyb20gbm9ybWFsIEJsdC4gRml4ZXMgQmFsZHVyJ3MgR2F0ZS4qLwotICAgIGlmICgocnNyYy0+Ym90dG9tID4gc2Rlc2MuZHdIZWlnaHQpIHx8IChyc3JjLT5ib3R0b20gPCAwKSB8fAotCShyc3JjLT50b3AgPiBzZGVzYy5kd0hlaWdodCkgfHwgKHJzcmMtPnRvcCA8IDApIHx8Ci0JKHJzcmMtPmxlZnQgPiBzZGVzYy5kd1dpZHRoKSB8fCAocnNyYy0+bGVmdCA8IDApIHx8Ci0JKHJzcmMtPnJpZ2h0ID4gc2Rlc2MuZHdXaWR0aCkgfHwgKHJzcmMtPnJpZ2h0IDwgMCkgfHwKLQkocnNyYy0+cmlnaHQgPCByc3JjLT5sZWZ0KSB8fCAocnNyYy0+Ym90dG9tIDwgcnNyYy0+dG9wKSkgewotICAgICAgICBXQVJOKCJBcHBsaWNhdGlvbiBnYXZlIHVzIGJhZCBzb3VyY2UgcmVjdGFuZ2xlIGZvciBCbHRGYXN0LlxuIik7Ci0JcmV0dXJuIERERVJSX0lOVkFMSURSRUNUOwotICAgIH0KLSAKLSAgICBoPXJzcmMtPmJvdHRvbS1yc3JjLT50b3A7Ci0gICAgaWYgKGg+ZGRlc2MuZHdIZWlnaHQtZHN0eSkgaD1kZGVzYy5kd0hlaWdodC1kc3R5OwotICAgIGlmIChoPnNkZXNjLmR3SGVpZ2h0LXJzcmMtPnRvcCkgaD1zZGVzYy5kd0hlaWdodC1yc3JjLT50b3A7Ci0gICAgaWYgKGg8PTApIHJldHVybiBEREVSUl9JTlZBTElEUkVDVDsKLQotICAgIHc9cnNyYy0+cmlnaHQtcnNyYy0+bGVmdDsKLSAgICBpZiAodz5kZGVzYy5kd1dpZHRoLWRzdHgpIHc9ZGRlc2MuZHdXaWR0aC1kc3R4OwotICAgIGlmICh3PnNkZXNjLmR3V2lkdGgtcnNyYy0+bGVmdCkgdz1zZGVzYy5kd1dpZHRoLXJzcmMtPmxlZnQ7Ci0gICAgaWYgKHc8PTApIHJldHVybiBEREVSUl9JTlZBTElEUkVDVDsKLQotICAgIC8qIE5vdyBjb21wdXRlIHRoZSBsb2NraW5nIHJlY3RhbmdsZS4uLiAqLwotICAgIGxvY2tfc3JjLmxlZnQgPSByc3JjLT5sZWZ0OwotICAgIGxvY2tfc3JjLnRvcCA9IHJzcmMtPnRvcDsKLSAgICBsb2NrX3NyYy5yaWdodCA9IGxvY2tfc3JjLmxlZnQgKyB3OwotICAgIGxvY2tfc3JjLmJvdHRvbSA9IGxvY2tfc3JjLnRvcCArIGg7Ci0KLSAgICBsb2NrX2RzdC5sZWZ0ID0gZHN0eDsKLSAgICBsb2NrX2RzdC50b3AgPSBkc3R5OwotICAgIGxvY2tfZHN0LnJpZ2h0ID0gZHN0eCArIHc7Ci0gICAgbG9ja19kc3QuYm90dG9tID0gZHN0eSArIGg7Ci0gICAgCi0gICAgYnBwID0gR0VUX0JQUChUaGlzLT5zdXJmYWNlX2Rlc2MpOwotCi0gICAgLyogV2UgbmVlZCB0byBsb2NrIHRoZSBzdXJmYWNlcywgb3Igd2Ugd29uJ3QgZ2V0IHJlZnJlc2hlcyB3aGVuIGRvbmUuICovCi0gICAgaWYgKHNyYyA9PSBpZmFjZSkgewotICAgICAgICBpbnQgcGl0Y2g7Ci0KLSAgICAgICAgVW5pb25SZWN0KCZsb2NrX3VuaW9uLCAmbG9ja19zcmMsICZsb2NrX2RzdCk7Ci0KLSAgICAgICAgLyogTG9jayB0aGUgdW5pb24gb2YgdGhlIHR3byByZWN0YW5nbGVzICovCi0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhpZmFjZSwgJmxvY2tfdW5pb24sICZkZGVzYywgMCwgMCk7Ci0KLSAgICAgICAgcGl0Y2ggPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoOwotCi0gICAgICAgIC8qIFNpbmNlIHNkZXNjIHdhcyBvcmlnaW5hbGx5IGNvcGllZCBmcm9tIHRoaXMgc3VyZmFjZSdzIGRlc2NyaXB0aW9uLCB3ZSBjYW4ganVzdCByZXVzZSBpdCAqLwotICAgICAgICBzZGVzYy5scFN1cmZhY2UgPSAoQllURSAqKVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UgKyBsb2NrX3NyYy50b3AgKiBwaXRjaCArIGxvY2tfc3JjLmxlZnQgKiBicHA7IAotICAgICAgICBkZGVzYy5scFN1cmZhY2UgPSAoQllURSAqKVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UgKyBsb2NrX2RzdC50b3AgKiBwaXRjaCArIGxvY2tfZHN0LmxlZnQgKiBicHA7IAotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNkZXNjLmR3U2l6ZSA9IHNpemVvZihzZGVzYyk7Ci0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhzcmMsICZsb2NrX3NyYywgJnNkZXNjLCBERExPQ0tfUkVBRE9OTFksIDApOwotICAgICAgICBkZGVzYy5kd1NpemUgPSBzaXplb2YoZGRlc2MpOwotICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soaWZhY2UsICZsb2NrX2RzdCwgJmRkZXNjLCBERExPQ0tfV1JJVEVPTkxZLCAwKTsKLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgZmlyc3QgdGhlIEZPVVJDQyBzdXJmYWNlcy4uLiAqLwotICAgIGlmICgoc2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykgJiYgKGRkZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpKSB7Ci0JaWYgKHRyYW5zKQotCSAgICBGSVhNRSgidHJhbnMgYXJnIG5vdCBzdXBwb3J0ZWQgd2hlbiBhIEZPVVJDQyBzdXJmYWNlIGlzIGludm9sdmVkXG4iKTsKLQlpZiAoZHN0eCB8fCBkc3R5KQotCSAgICBGSVhNRSgib2Zmc2V0IGZvciBkZXN0aW5hdGlvbiBzdXJmYWNlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCWlmIChzZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MgIT0gc2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDKSB7Ci0JICAgIEZJWE1FKCJGT1VSQ0MtPkZPVVJDQyBjb3B5IG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgc2FtZSB0eXBlIG9mIHN1cmZhY2VcbiIpOwotCSAgICByZXQgPSBEREVSUl9JTlZBTElEUElYRUxGT1JNQVQ7Ci0JICAgIGdvdG8gZXJyb3I7Ci0JfQotCW1lbWNweShkZGVzYy5scFN1cmZhY2UsIHNkZXNjLmxwU3VyZmFjZSwgZGRlc2MudTEuZHdMaW5lYXJTaXplKTsKLQlnb3RvIGVycm9yOwotICAgIH0KLSAgICBpZiAoKHNkZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpICYmCi0JKCEoZGRlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykpKSB7Ci0JRG9EWFRDRGVjb21wcmVzc2lvbigmc2Rlc2MsICZkZGVzYyk7Ci0JZ290byBlcnJvcjsKLSAgICB9Ci0gICAgCi0gICAgc2J1ZiA9IChCWVRFICopIHNkZXNjLmxwU3VyZmFjZTsKLSAgICBkYnVmID0gKEJZVEUgKikgZGRlc2MubHBTdXJmYWNlOwotICAgIAotICAgIGlmICh0cmFucyAmIChEREJMVEZBU1RfU1JDQ09MT1JLRVkgfCBEREJMVEZBU1RfREVTVENPTE9SS0VZKSkgewotCURXT1JEIGtleWxvdywga2V5aGlnaDsKLQlpZiAodHJhbnMgJiBEREJMVEZBU1RfU1JDQ09MT1JLRVkpIHsKLQkgICAga2V5bG93ICA9IHNkZXNjLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKLQkgICAga2V5aGlnaCA9IHNkZXNjLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7Ci0JfSBlbHNlIHsKLQkgICAgLyogSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCAqLwotCSAgICBGSVhNRSgiRERCTFRGQVNUX0RFU1RDT0xPUktFWSBub3QgZnVsbHkgc3VwcG9ydGVkIHlldC5cbiIpOwotCSAgICBrZXlsb3cgID0gZGRlc2MuZGRja0NLRGVzdEJsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKLQkgICAga2V5aGlnaCA9IGRkZXNjLmRkY2tDS0Rlc3RCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwotCX0KLQotI2RlZmluZSBDT1BZQk9YX0NPTE9SS0VZKHR5cGUpIHsgXAotICAgICAgICAgICAgdHlwZSAqZCwgKnMsIHRtcDsgXAotICAgICAgICAgICAgcyA9ICh0eXBlICopIHNkZXNjLmxwU3VyZmFjZTsgXAotICAgICAgICAgICAgZCA9ICh0eXBlICopIGRkZXNjLmxwU3VyZmFjZTsgXAotICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeyBcCi0JICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7IFwKLQkgICAgICAgICAgICB0bXAgPSBzW3hdOyBcCi0JICAgICAgICAgICAgaWYgKHRtcCA8IGtleWxvdyB8fCB0bXAgPiBrZXloaWdoKSBkW3hdID0gdG1wOyBcCi0JICAgICAgICB9IFwKLQkgICAgICAgIHMgPSAodHlwZSAqKSgoQllURSAqKXMgKyBzZGVzYy51MS5sUGl0Y2gpOyBcCi0JICAgICAgICBkID0gKHR5cGUgKikoKEJZVEUgKilkICsgZGRlc2MudTEubFBpdGNoKTsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICBicmVhazsgXAotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChicHApIHsKLQkgICAgY2FzZSAxOiBDT1BZQk9YX0NPTE9SS0VZKEJZVEUpCi0JICAgIGNhc2UgMjogQ09QWUJPWF9DT0xPUktFWShXT1JEKQotCSAgICBjYXNlIDQ6IENPUFlCT1hfQ09MT1JLRVkoRFdPUkQpCi0JICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCWVRFICpkLCAqczsKLSAgICAgICAgICAgICAgICBEV09SRCB0bXA7Ci0gICAgICAgICAgICAgICAgcyA9IChCWVRFICopIHNkZXNjLmxwU3VyZmFjZTsKLSAgICAgICAgICAgICAgICBkID0gKEJZVEUgKikgZGRlc2MubHBTdXJmYWNlOwotICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHcgKiAzOyB4ICs9IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IChEV09SRClzW3hdICsgKChEV09SRClzW3ggKyAxXSA8PCA4KSArICgoRFdPUkQpc1t4ICsgMl0gPDwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA8IGtleWxvdyB8fCB0bXAgPiBrZXloaWdoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZFt4ICsgMF0gPSBzW3ggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkW3ggKyAxXSA9IHNbeCArIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbeCArIDJdID0gc1t4ICsgMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcyArPSBzZGVzYy51MS5sUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIGQgKz0gZGRlc2MudTEubFBpdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQkgICAgZGVmYXVsdDoKLQkJRklYTUUoIlNvdXJjZSBjb2xvciBrZXkgYmxpdHRpbmcgbm90IHN1cHBvcnRlZCBmb3IgYnBwICVkXG4iLGJwcCo4KTsKLQkgICAgICAgIHJldCA9IERERVJSX1VOU1VQUE9SVEVEOwotCSAgICAgICAgZ290byBlcnJvcjsKLQl9Ci0jdW5kZWYgQ09QWUJPWF9DT0xPUktFWQotICAgIH0gZWxzZSB7Ci0JaW50IHdpZHRoID0gdyAqIGJwcDsKLQotCWZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKLQkgICAgbWVtY3B5KGRidWYsIHNidWYsIHdpZHRoKTsKLQkgICAgc2J1ZiArPSBzZGVzYy51MS5sUGl0Y2g7Ci0JICAgIGRidWYgKz0gZGRlc2MudTEubFBpdGNoOwotCX0KLSAgICB9Ci0gICAgCi1lcnJvcjoKLSAgICBpZiAoc3JjID09IGlmYWNlKSB7Ci0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKGlmYWNlLCAmbG9ja191bmlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soaWZhY2UsICZsb2NrX2RzdCk7Ci0gICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKHNyYywgJmxvY2tfc3JjKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiBDaGFuZ2VVbmlxdWVuZXNzVmFsdWU6IGdlbmVyaWMgKi8KLS8qIERlbGV0ZUF0dGFjaGVkU3VyZmFjZTogZ2VuZXJpYyAqLwotLyogRW51bUF0dGFjaGVkU3VyZmFjZXM6IGdlbmVyaWMgKi8KLS8qIEVudW1PdmVybGF5Wk9yZGVyczogZ2VuZXJpYywgdW5pbXBsZW1lbnRlZCAqLwotCi1CT09MIERJQl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGEoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogZnJvbnQsCi0JCQkJICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrLAotCQkJCSAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udF9wcml2ID0gZnJvbnQtPnByaXZhdGU7Ci0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogYmFja19wcml2ID0gYmFjay0+cHJpdmF0ZTsKLQotICAgIFRSQUNFKCIoJXAsJXApXG4iLGZyb250LGJhY2spOwotCi0gICAgewotCUhCSVRNQVAgdG1wOwotCXRtcCA9IGZyb250X3ByaXYtPmRpYi5ESUJzZWN0aW9uOwotCWZyb250X3ByaXYtPmRpYi5ESUJzZWN0aW9uID0gYmFja19wcml2LT5kaWIuRElCc2VjdGlvbjsKLQliYWNrX3ByaXYtPmRpYi5ESUJzZWN0aW9uID0gdG1wOwotICAgIH0KLQotICAgIHsKLQl2b2lkKiB0bXA7Ci0JdG1wID0gZnJvbnRfcHJpdi0+ZGliLmJpdG1hcF9kYXRhOwotCWZyb250X3ByaXYtPmRpYi5iaXRtYXBfZGF0YSA9IGJhY2tfcHJpdi0+ZGliLmJpdG1hcF9kYXRhOwotCWJhY2tfcHJpdi0+ZGliLmJpdG1hcF9kYXRhID0gdG1wOwotCi0JdG1wID0gZnJvbnQtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2U7Ci0JZnJvbnQtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UgPSBiYWNrLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlOwotCWJhY2stPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UgPSB0bXA7Ci0gICAgfQotCi0gICAgLyogY2xpZW50X21lbW9yeSBzaG91bGQgbm90IGJlIGRpZmZlcmVudCwgYnV0IGp1c3QgaW4gY2FzZSAqLwotICAgIHsKLQlCT09MIHRtcDsKLQl0bXAgPSBmcm9udF9wcml2LT5kaWIuY2xpZW50X21lbW9yeTsKLQlmcm9udF9wcml2LT5kaWIuY2xpZW50X21lbW9yeSA9IGJhY2tfcHJpdi0+ZGliLmNsaWVudF9tZW1vcnk7Ci0JYmFja19wcml2LT5kaWIuY2xpZW50X21lbW9yeSA9IHRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGEoZnJvbnQsIGJhY2ssIGR3RmxhZ3MpOwotfQotCi0vKiBGbGlwOiBnZW5lcmljICovCi0vKiBGcmVlUHJpdmF0ZURhdGE6IGdlbmVyaWMgKi8KLS8qIEdldEF0dGFjaGVkU3VyZmFjZTogZ2VuZXJpYyAqLwotLyogR2V0Qmx0U3RhdHVzOiBnZW5lcmljICovCi0vKiBHZXRDYXBzOiBnZW5lcmljIChSZXR1cm5zIHRoZSBjYXBzIGZyb20gVGhpcy0+c3VyZmFjZV9kZXNjLikgKi8KLS8qIEdldENsaXBwZXI6IGdlbmVyaWMgKi8KLS8qIEdldENvbG9yS2V5OiBnZW5lcmljICovCi0KLUhSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2FsbG9jX2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyogcGhEQykKLXsKLSAgICBESUJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0gICAgSERDIGhEQzsKLQotICAgIFRSQUNFKCJHcmFiYmluZyBhIERDIGZvciBzdXJmYWNlOiAlcFxuIiwgVGhpcyk7Ci0KLSAgICBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoMCk7Ci0gICAgcHJpdi0+ZGliLmhvbGRiaXRtYXAgPSBTZWxlY3RPYmplY3QoaERDLCBwcml2LT5kaWIuRElCc2VjdGlvbik7Ci0gICAgaWYgKFRoaXMtPnBhbGV0dGUpCi0JU2VsZWN0UGFsZXR0ZShoREMsIFRoaXMtPnBhbGV0dGUtPmhwYWwsIEZBTFNFKTsKLQotICAgICpwaERDID0gaERDOwotCi0gICAgcmV0dXJuIFNfT0s7Ci19Ci0KLUhSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZyZWVfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDIGhEQykKLXsKLSAgICBESUJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0KLSAgICBUUkFDRSgiUmVsZWFzaW5nIERDIGZvciBzdXJmYWNlOiAlcFxuIiwgVGhpcyk7Ci0KLSAgICBTZWxlY3RPYmplY3QoaERDLCBwcml2LT5kaWIuaG9sZGJpdG1hcCk7Ci0gICAgRGVsZXRlREMoaERDKTsKLQotICAgIHJldHVybiBTX09LOwotfQotCi1IUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDKiBwaERDKQotewotICAgIHJldHVybiBESUJfRGlyZWN0RHJhd1N1cmZhY2VfYWxsb2NfZGMoVGhpcywgcGhEQyk7Ci19Ci0KLUhSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX3JlbGVhc2VfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDIGhEQykKLXsKLSAgICByZXR1cm4gRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZyZWVfZGMoVGhpcywgaERDKTsKLX0KLQotLyogR2V0RERJbnRlcmZhY2U6IGdlbmVyaWMgKi8KLS8qIEdldEZsaXBTdGF0dXM6IGdlbmVyaWMgKi8KLS8qIEdldExPRDogZ2VuZXJpYyAqLwotLyogR2V0T3ZlcmxheVBvc2l0aW9uOiBnZW5lcmljICovCi0vKiBHZXRQYWxldHRlOiBnZW5lcmljICovCi0vKiBHZXRQaXhlbEZvcm1hdDogZ2VuZXJpYyAqLwotLyogR2V0UHJpb3JpdHk6IGdlbmVyaWMgKi8KLS8qIEdldFByaXZhdGVEYXRhOiBnZW5lcmljICovCi0vKiBHZXRTdXJmYWNlRGVzYzogZ2VuZXJpYyAqLwotLyogR2V0VW5pcXVlbmVzc1ZhbHVlOiBnZW5lcmljICovCi0vKiBJbml0aWFsaXplOiBnZW5lcmljICovCi0vKiBJc0xvc3Q6IGdlbmVyaWMgKi8KLS8qIExvY2s6IGdlbmVyaWMgd2l0aCBjYWxsYmFjaz8gKi8KLS8qIFBhZ2VMb2NrOiBnZW5lcmljICovCi0vKiBQYWdlVW5sb2NrOiBnZW5lcmljICovCi0KLUhSRVNVTFQgV0lOQVBJCi1ESUJfRGlyZWN0RHJhd1N1cmZhY2VfUmVzdG9yZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKVxuIixpZmFjZSk7Ci0gICAgcmV0dXJuIEREX09LOwkvKiA/Pz8gKi8KLX0KLQotLyogU2V0Q2xpcHBlcjogZ2VuZXJpYyAqLwotLyogU2V0Q29sb3JLZXk6IGdlbmVyaWMgKi8KLS8qIFNldExPRDogZ2VuZXJpYyAqLwotLyogU2V0T3ZlcmxheVBvc2l0aW9uOiBnZW5lcmljICovCi0KLXZvaWQgRElCX0RpcmVjdERyYXdTdXJmYWNlX3NldF9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJICAgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCkKLXsKLSAgICBpZiAoIXBhbCkgcmV0dXJuOwotICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQotCVRoaXMtPnVwZGF0ZV9wYWxldHRlKFRoaXMsIHBhbCwKLQkJCSAgICAgMCwgcGFsLT5wYWxOdW1FbnRyaWVzLAotCQkJICAgICBwYWwtPnBhbGVudHMpOwotfQotCi12b2lkIERJQl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKLQkJCQkJICBEV09SRCBkd1N0YXJ0LCBEV09SRCBkd0NvdW50LAotCQkJCQkgIExQUEFMRVRURUVOVFJZIHBhbGVudCkKLXsKLSAgICBSR0JRVUFEIGNvbFsyNTZdOwotICAgIHVuc2lnbmVkIGludCBuOwotICAgIEhEQyBkYzsKLQotICAgIFRSQUNFKCJ1cGRhdGluZyBwcmltYXJ5IHBhbGV0dGVcbiIpOwotICAgIGZvciAobj0wOyBuPGR3Q291bnQ7IG4rKykgewotICAgICAgY29sW25dLnJnYlJlZCAgID0gcGFsZW50W25dLnBlUmVkOwotICAgICAgY29sW25dLnJnYkdyZWVuID0gcGFsZW50W25dLnBlR3JlZW47Ci0gICAgICBjb2xbbl0ucmdiQmx1ZSAgPSBwYWxlbnRbbl0ucGVCbHVlOwotICAgICAgY29sW25dLnJnYlJlc2VydmVkID0gMDsKLSAgICB9Ci0gICAgVGhpcy0+Z2V0X2RjKFRoaXMsICZkYyk7Ci0gICAgU2V0RElCQ29sb3JUYWJsZShkYywgZHdTdGFydCwgZHdDb3VudCwgY29sKTsKLSAgICBUaGlzLT5yZWxlYXNlX2RjKFRoaXMsIGRjKTsKLQotICAgIC8qIFByb3BhZ2F0ZSBjaGFuZ2UgdG8gYmFja2J1ZmZlcnMgaWYgdGhlcmUgYXJlIGFueSAqLwotICAgIC8qIEJhc2ljYWxseSB0aGlzIGlzIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBGbGlwIGNvZGUgdG8gZmluZCB0aGUgYmFja2J1ZmZlciAqLwotICAgIC8qIGFuZCBkdXBsaWNhdGUgdGhlIHBhbGV0dGUgdXBkYXRlIHRoZXJlIGFzIHdlbGwgKi8KLSAgICBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyYoRERTQ0FQU19GTElQfEREU0NBUFNfRlJPTlRCVUZGRVIpKQotCT09IChERFNDQVBTX0ZMSVB8RERTQ0FQU19GUk9OVEJVRkZFUikpCi0gICAgewotCXN0YXRpYyBERFNDQVBTMiBiYWNrX2NhcHMgPSB7IEREU0NBUFNfQkFDS0JVRkZFUiB9OwotCUxQRElSRUNURFJBV1NVUkZBQ0U3IHRndDsKLQotCUhSRVNVTFQgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLElEaXJlY3REcmF3U3VyZmFjZTcpLAotCQkJCQkJCSAgICAmYmFja19jYXBzLCAmdGd0KTsKLQlpZiAoIUZBSUxFRChocikpCi0JewotCSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiB0YXJnZXQgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLAotCQkJCQkJCSBJRGlyZWN0RHJhd1N1cmZhY2U3LHRndCk7Ci0JICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZSh0Z3QpOwotCSAgICB0YXJnZXQtPmdldF9kYyh0YXJnZXQsICZkYyk7Ci0JICAgIFNldERJQkNvbG9yVGFibGUoZGMsIGR3U3RhcnQsIGR3Q291bnQsIGNvbCk7Ci0JICAgIHRhcmdldC0+cmVsZWFzZV9kYyh0YXJnZXQsIGRjKTsKLQl9Ci0gICAgfQotfQotCi0vKiBTZXRQYWxldHRlOiBnZW5lcmljICovCi0vKiBTZXRQcmlvcml0eTogZ2VuZXJpYyAqLwotLyogU2V0UHJpdmF0ZURhdGE6IGdlbmVyaWMgKi8KLQotSFJFU1VMVCBXSU5BUEkKLURJQl9EaXJlY3REcmF3U3VyZmFjZV9TZXRTdXJmYWNlRGVzYyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICAgIExQRERTVVJGQUNFREVTQzIgcEREU0QsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0gICAgRElCX1BSSVZfVkFSKHByaXYsIFRoaXMpOwotICAgIEhSRVNVTFQgaHIgPSBERF9PSzsKLSAgICBEV09SRCBmbGFncyA9IHBERFNELT5kd0ZsYWdzOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiKCVwKS0+KCVwLCUwOGx4KVxuIixpZmFjZSxwRERTRCxkd0ZsYWdzKTsKLSAgICAgICAgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MocEREU0QpOwotICAgIH0KLQotICAgIGlmIChwRERTRC0+ZHdGbGFncyAmIEREU0RfUElYRUxGT1JNQVQpIHsKLSAgICAgICAgZmxhZ3MgJj0gfkREU0RfUElYRUxGT1JNQVQ7Ci0JaWYgKGZsYWdzICYgRERTRF9MUFNVUkZBQ0UpIHsKLQkgICAgVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdCA9IHBERFNELT51NC5kZHBmUGl4ZWxGb3JtYXQ7Ci0JfSBlbHNlIHsKLQkgICAgRklYTUUoIkNoYW5nZSBvZiBwaXhlbCBmb3JtYXQgd2l0aG91dCBzdXJmYWNlIHJlLWFsbG9jYXRpb24gaXMgbm90IHN1cHBvcnRlZCAhXG4iKTsKLQl9Ci0gICAgfQotICAgIGlmIChwRERTRC0+ZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKSB7Ci0JSEJJVE1BUCBvbGRibXAgPSBwcml2LT5kaWIuRElCc2VjdGlvbjsKLQlMUFZPSUQgb2xkc3VyZiA9IFRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2U7Ci0JQk9PTCBvbGRjID0gcHJpdi0+ZGliLmNsaWVudF9tZW1vcnk7Ci0KLQlmbGFncyAmPSB+RERTRF9MUFNVUkZBQ0U7Ci0KLQlUUkFDRSgibmV3IGxwU3VyZmFjZT0lcFxuIixwRERTRC0+bHBTdXJmYWNlKTsKLQlUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID0gcEREU0QtPmxwU3VyZmFjZTsKLQlwcml2LT5kaWIuY2xpZW50X21lbW9yeSA9IFRSVUU7Ci0KLQlociA9IGNyZWF0ZV9kaWIoVGhpcyk7Ci0JaWYgKEZBSUxFRChocikpCi0JewotCSAgICBwcml2LT5kaWIuRElCc2VjdGlvbiA9IG9sZGJtcDsKLQkgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZSA9IG9sZHN1cmY7Ci0JICAgIHByaXYtPmRpYi5jbGllbnRfbWVtb3J5ID0gb2xkYzsKLQkgICAgcmV0dXJuIGhyOwotCX0KLQotCURlbGV0ZU9iamVjdChvbGRibXApOwotCi0JaWYgKCFvbGRjKQotCSAgICBWaXJ0dWFsRnJlZShvbGRzdXJmLCAwLCBNRU1fUkVMRUFTRSk7Ci0gICAgfQotICAgIGlmIChmbGFncykgewotICAgICAgICBXQVJOKCJVbmhhbmRsZWQgZmxhZ3MgOiAlMDhseFxuIiwgZmxhZ3MpOwotICAgIH0KLSAgICByZXR1cm4gaHI7Ci19Ci0KLS8qIFVubG9jazogPz8/LCBuZWVkIGNhbGxiYWNrICovCi0vKiBVcGRhdGVPdmVybGF5OiBnZW5lcmljICovCi0vKiBVcGRhdGVPdmVybGF5RGlzcGxheTogZ2VuZXJpYyAqLwotLyogVXBkYXRlT3ZlcmxheVpPcmRlcjogZ2VuZXJpYyAqLwotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgRElCX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlID0KLXsKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZEF0dGFjaGVkU3VyZmFjZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZE92ZXJsYXlEaXJ0eVJlY3QsCi0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX0JsdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0JsdEJhdGNoLAotICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVsZXRlQXR0YWNoZWRTdXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRW51bUF0dGFjaGVkU3VyZmFjZXMsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtT3ZlcmxheVpPcmRlcnMsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GbGlwLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENsaXBwZXIsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDb2xvcktleSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERDLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RmxpcFN0YXR1cywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldE92ZXJsYXlQb3NpdGlvbiwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBhbGV0dGUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQaXhlbEZvcm1hdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0lzTG9zdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0xvY2ssCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlREMsCi0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX1Jlc3RvcmUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDbGlwcGVyLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q29sb3JLZXksCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRPdmVybGF5UG9zaXRpb24sCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlEaXNwbGF5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheVpPcmRlciwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERESW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZUxvY2ssCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9QYWdlVW5sb2NrLAotICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9TZXRTdXJmYWNlRGVzYywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaXZhdGVEYXRhLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpdmF0ZURhdGEsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GcmVlUHJpdmF0ZURhdGEsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRVbmlxdWVuZXNzVmFsdWUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9DaGFuZ2VVbmlxdWVuZXNzVmFsdWUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQcmlvcml0eSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaW9yaXR5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0TE9ELAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0TE9ECi19OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9zdXJmYWNlX2Zha2V6YnVmZmVyLmMgYi9kbGxzL2RkcmF3L3N1cmZhY2VfZmFrZXpidWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyMWJiMS4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L3N1cmZhY2VfZmFrZXpidWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKgkJRGlyZWN0RHJhdy9EaXJlY3QzRCBaLUJ1ZmZlciBzdGFuZCBpbgotICoKLSAqIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCi0gKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIERpcmVjdERyYXdTdXJmYWNlIGltcGxlbWVudGF0aW9uIHRoYXQgcmVwcmVzZW50cwotICogYSBaLUJ1ZmZlciBzdXJmYWNlLiBIb3dldmVyIGl0IGRvZXMgbm90IHN0b3JlIGFuIGltYWdlIGFuZCBkb2VzIG5vdAotICogc3VwcG9ydCBMb2NrL1VubG9jayBvciBHZXREQy4gSXQgaXMgbWVyZWx5IGEgcGxhY2Vob2xkZXIgcmVxdWlyZWQgYnkgdGhlCi0gKiBEaXJlY3QzRCBhcmNoaXRlY3R1cmUuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCi0jZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKLQotI2luY2x1ZGUgIndpbmRlZi5oIgotI2luY2x1ZGUgIndpbmJhc2UuaCIKLSNpbmNsdWRlICJ3aW5nZGkuaCIKLSNpbmNsdWRlICJkZHJhdy5oIgotI2luY2x1ZGUgImQzZC5oIgotCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotCi0jaW5jbHVkZSAiZGRjb21pbXBsLmgiCi0jaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImQzZF9wcml2YXRlLmgiCi0KLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLQotc3RhdGljIGNvbnN0IElEaXJlY3REcmF3U3VyZmFjZTdWdGJsIEZha2VaQnVmZmVyX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlOwotCi0jaWZkZWYgSEFWRV9PUEVOR0wKLXN0YXRpYyB2b2lkIHpidWZmZXJfbG9ja191cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgTFBDUkVDVCBwUmVjdCwgRFdPUkQgZHdGbGFncykKLXsKLSAgICAvKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBkbyBhbnl0aGluZyBmb3Igbm93Li4uIEF0IGxlYXN0IGl0J3Mgbm90IG5lZWRlZCBmb3IgR3JpbSBGYW5kYW5nbyA6LSkgKi8KLX0KLQotc3RhdGljIHZvaWQgemJ1ZmZlcl91bmxvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcFJlY3QpCi17Ci0gICAgKChGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwgKikgVGhpcy0+cHJpdmF0ZSktPmluX21lbW9yeSA9IFRSVUU7Ci19Ci0KLXN0YXRpYyBCT09MRUFOIHpidWZmZXJfZ2V0X2RpcnR5X3N0YXR1cyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHBSZWN0KQotewotICAgIGlmICgoKEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlSW1wbCAqKSBUaGlzLT5wcml2YXRlKS0+aW5fbWVtb3J5KSB7Ci0JKChGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwgKikgVGhpcy0+cHJpdmF0ZSktPmluX21lbW9yeSA9IEZBTFNFOwotCXJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0jZW5kaWYKLQotSFJFU1VMVCBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywKLQkJCQkJCUlEaXJlY3REcmF3SW1wbCAqcERELAotCQkJCQkJY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNEKQotewotICAgIEhSRVNVTFQgaHI7Ci0gICAgQllURSB6ZGVwdGggPSAxNjsgLyogRGVmYXVsdCB2YWx1ZS4uIFNob3VsZCB1c2UgdGhlIG9uZSBmcm9tIEdMICovCi0gICAgCi0gICAgYXNzZXJ0KHBERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfWkJVRkZFUik7Ci0KLSAgICBociA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgcEREU0QpOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcsCi0JCQlGYWtlWkJ1ZmZlcl9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZSk7Ci0KLSAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZTsKLSAgICBUaGlzLT5kdXBsaWNhdGVfc3VyZmFjZSA9IEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlOwotCi0jaWZkZWYgSEFWRV9PUEVOR0wgICAgIAotICAgIGlmIChvcGVuZ2xfaW5pdGlhbGl6ZWQpIHsKLQlUaGlzLT5sb2NrX3VwZGF0ZSA9IHpidWZmZXJfbG9ja191cGRhdGU7Ci0JVGhpcy0+dW5sb2NrX3VwZGF0ZSA9IHpidWZmZXJfdW5sb2NrX3VwZGF0ZTsKLQlUaGlzLT5nZXRfZGlydHlfc3RhdHVzID0gemJ1ZmZlcl9nZXRfZGlydHlfc3RhdHVzOwotICAgIH0KLSNlbmRpZgotCQotICAgIAotICAgIC8qIEJlZ2lubmluZyBvZiBzb21lIEQzRCBoYWNrcyA6LSkgKi8KLSAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJiBERFNEX1pCVUZGRVJCSVRERVBUSCkgewotCXpkZXB0aCA9IFRoaXMtPnN1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50OyAvKiBUaGlzIGlzIHdoZXJlIHRoZSBaIGJ1ZmZlciBkZXB0aCBpcyBzdG9yZWQgaW4gJ29sZCcgdmVyc2lvbnMgKi8KLSAgICB9Ci0gICAgCi0gICAgaWYgKChUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmIEREU0RfUElYRUxGT1JNQVQpID09IDApIHsKLQlUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1BJWEVMRk9STUFUOwotCVRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQpOwotCVRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKLQlUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gemRlcHRoOwotICAgIH0KLSAgICBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzICYgRERTRF9QSVRDSCkgPT0gMCkgewotCVRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzIHw9IEREU0RfUElUQ0g7Ci0JVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCA9ICgoemRlcHRoICsgNykgLyA4KSAqIFRoaXMtPnN1cmZhY2VfZGVzYy5kd1dpZHRoOwotICAgIH0KLSAgICBUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkJCSAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCAqIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCk7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKiBOb3QgYW4gQVBJICovCi1IUkVTVUxUIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwqIHBERCwKLQkJCQkJICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCi0JCQkJCSAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKLQkJCQkJICAgICBJVW5rbm93biogcFVua091dGVyKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXM7Ci0gICAgSFJFU1VMVCBocjsKLSAgICBhc3NlcnQocFVua091dGVyID09IE5VTEwpOwotCi0gICAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgIHNpemVvZigqVGhpcykKLQkJICAgICArIHNpemVvZihGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwpKTsKLSAgICBpZiAoVGhpcyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLQotICAgIFRoaXMtPnByaXZhdGUgPSAoRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKikoVGhpcysxKTsKLQotICAgIGhyID0gRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgcEREU0QpOwotICAgIGlmIChGQUlMRUQoaHIpKQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwotICAgIGVsc2UKLQkqcHBTdXJmID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7Ci0KLSAgICByZXR1cm4gaHI7Ci19Ci0KLXZvaWQKLUZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKLXsKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Ci19Ci0KLUhSRVNVTFQKLUZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApCi17Ci0gICAgcmV0dXJuIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLT5kZHJhd19vd25lciwKLQkJCQkJCSZUaGlzLT5zdXJmYWNlX2Rlc2MsIHBwRHVwLAotCQkJCQkJTlVMTCk7Ci19Ci0KLS8qIHB1dCB5b3VyIGJyZWFrcG9pbnQvYWJvcnQgY2FsbCBoZXJlICovCi1zdGF0aWMgSFJFU1VMVCBjYW50X2RvX3RoYXQoY29uc3QgY2hhciAqcykKLXsKLSAgICBGSVhNRSgiYXR0ZW1wdCB0byAlcyBmYWtlIHotYnVmZmVyXG4iLCBzKTsKLSAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1GYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9CbHQoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQUkVDVCByZHN0LAotCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLCBMUFJFQ1QgcnNyYywKLQkJCQkgIERXT1JEIGR3RmxhZ3MsIExQRERCTFRGWCBscGJsdGZ4KQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwLCUwOGx4LCVwKVxuIiwgVGhpcyxyZHN0LHNyYyxyc3JjLGR3RmxhZ3MsbHBibHRmeCk7Ci0JaWYgKHJkc3QpIFRSQUNFKCJcdGRlc3RyZWN0IDolbGR4JWxkLSVsZHglbGRcbiIscmRzdC0+bGVmdCxyZHN0LT50b3AscmRzdC0+cmlnaHQscmRzdC0+Ym90dG9tKTsKLQlpZiAocnNyYykgVFJBQ0UoIlx0c3JjcmVjdCAgOiVsZHglbGQtJWxkeCVsZFxuIixyc3JjLT5sZWZ0LHJzcmMtPnRvcCxyc3JjLT5yaWdodCxyc3JjLT5ib3R0b20pOwotCVRSQUNFKCJcdGZsYWdzOiAiKTsKLQlERFJBV19kdW1wX0REQkxUKGR3RmxhZ3MpOwotCWlmIChkd0ZsYWdzICYgRERCTFRfRERGWCkgewotCSAgICBUUkFDRSgiXHRibGl0Zng6ICIpOwotCSAgICBERFJBV19kdW1wX0REQkxURlgobHBibHRmeC0+ZHdEREZYKTsKLQl9Ci0gICAgfQotCi0gICAgLyogV2Ugb25seSBzdXBwb3J0IHRoZSBCTFQgd2l0aCBERVBUSF9GSUxMIGZvciBub3cgKi8KLSAgICBpZiAoKGR3RmxhZ3MgJiBEREJMVF9ERVBUSEZJTEwpICYmIChUaGlzLT5kZHJhd19vd25lci0+ZDNkX3ByaXZhdGUgIT0gTlVMTCkpIHsKLSAgICAgICAgaWYgKFRoaXMtPmRkcmF3X293bmVyLT5jdXJyZW50X2RldmljZSAhPSBOVUxMKSB7Ci0JICAgIEQzRFJFQ1QgcmVjdDsKLQkgICAgaWYgKHJkc3QpIHsKLQkgICAgICAgIHJlY3QudTEueDEgPSByZHN0LT5sZWZ0OwotCQlyZWN0LnUyLnkxID0gcmRzdC0+dG9wOwotCQlyZWN0LnUzLngyID0gcmRzdC0+cmlnaHQ7Ci0JCXJlY3QudTQueTIgPSByZHN0LT5ib3R0b207Ci0JICAgIH0KLQkgICAgVGhpcy0+ZGRyYXdfb3duZXItPmN1cnJlbnRfZGV2aWNlLT5jbGVhcihUaGlzLT5kZHJhd19vd25lci0+Y3VycmVudF9kZXZpY2UsCi0JCQkJCQkgICAgIChyZHN0ID09IE5VTEwgPyAwIDogMSksICZyZWN0LAotCQkJCQkJICAgICBEM0RDTEVBUl9aQlVGRkVSLAotCQkJCQkJICAgICAweDAwMDAwMDAwLAotCQkJCQkJICAgICAoKGRvdWJsZSkgbHBibHRmeC0+dTUuZHdGaWxsRGVwdGgpIC8gNDI5NDk2NzI5NS4wLAotCQkJCQkJICAgICAweDAwMDAwMDAwKTsKLQkgICAgcmV0dXJuIEREX09LOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2FudF9kb190aGF0KCJibHQgdG8gYSIpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHN0eCwKLQkJCQkgICAgICBEV09SRCBkc3R5LCBMUERJUkVDVERSQVdTVVJGQUNFNyBzcmMsCi0JCQkJICAgICAgTFBSRUNUIHJzcmMsIERXT1JEIHRyYW5zKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCUZJWE1FKCIoJXApLT4oJWxkLCVsZCwlcCwlcCwlMDhseClcbiIsCi0JCVRoaXMsZHN0eCxkc3R5LHNyYyxyc3JjLHRyYW5zCi0JKTsKLQlGSVhNRSgiXHR0cmFuczoiKTsKLQlpZiAoRklYTUVfT04oZGRyYXcpKQotCSAgRERSQVdfZHVtcF9EREJMVEZBU1QodHJhbnMpOwotCWlmIChyc3JjKQotCSAgRklYTUUoIlx0c3JjcmVjdDogJWxkeCVsZC0lbGR4JWxkXG4iLHJzcmMtPmxlZnQscnNyYy0+dG9wLHJzcmMtPnJpZ2h0LHJzcmMtPmJvdHRvbSk7Ci0JZWxzZQotCSAgRklYTUUoIiBzcmNyZWN0OiBOVUxMXG4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2FudF9kb190aGF0KCJibHRmYXN0IHRvIGEiKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBIREMgKnBoREMpCi17Ci0gICAgcmV0dXJuIGNhbnRfZG9fdGhhdCgiZ2V0IGEgREMgZm9yIGEiKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2VEQyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgSERDIGhEQykKLXsKLSAgICByZXR1cm4gY2FudF9kb190aGF0KCJyZWxlYXNlIGEgREMgZm9yIGEiKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX1Jlc3RvcmUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UpCi17Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfU2V0U3VyZmFjZURlc2MoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJCSAgICAgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwKLQkJCQkJICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIC8qIFhYWCAqLwotICAgIGFib3J0KCk7Ci0gICAgcmV0dXJuIEVfRkFJTDsKLX0KLQotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgRmFrZVpCdWZmZXJfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGU9Ci17Ci0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZFJlZiwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRBdHRhY2hlZFN1cmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRPdmVybGF5RGlydHlSZWN0LAotICAgIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0JsdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0JsdEJhdGNoLAotICAgIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3QsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9EZWxldGVBdHRhY2hlZFN1cmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtQXR0YWNoZWRTdXJmYWNlcywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0VudW1PdmVybGF5Wk9yZGVycywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZsaXAsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRBdHRhY2hlZFN1cmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRCbHRTdGF0dXMsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDYXBzLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2xpcHBlciwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENvbG9yS2V5LAotICAgIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0dldERDLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RmxpcFN0YXR1cywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldE92ZXJsYXlQb3NpdGlvbiwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBhbGV0dGUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQaXhlbEZvcm1hdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0lzTG9zdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0xvY2ssCi0gICAgRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZURDLAotICAgIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX1Jlc3RvcmUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDbGlwcGVyLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q29sb3JLZXksCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRPdmVybGF5UG9zaXRpb24sCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlEaXNwbGF5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheVpPcmRlciwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERESW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZUxvY2ssCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9QYWdlVW5sb2NrLAotICAgIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX1NldFN1cmZhY2VEZXNjLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpdmF0ZURhdGEsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcml2YXRlRGF0YSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZyZWVQcml2YXRlRGF0YSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFVuaXF1ZW5lc3NWYWx1ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaW9yaXR5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpb3JpdHksCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRMT0QsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRMT0QKLX07CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3N1cmZhY2VfZ2FtbWEuYyBiL2RsbHMvZGRyYXcvc3VyZmFjZV9nYW1tYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTVmMTZjLi4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvc3VyZmFjZV9nYW1tYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoJCURpcmVjdERyYXdHYW1tYUNvbnRyb2wgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgMjAwMSBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJ3aW5lcnJvci5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0jaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgotCi1XSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLSNkZWZpbmUgQ09OVkVSVChwZGRnYykgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsCVwKLQkJCQkJICBJRGlyZWN0RHJhd0dhbW1hQ29udHJvbCwJXAotCQkJCQkgIElEaXJlY3REcmF3U3VyZmFjZTcsCQlcCi0JCQkJCSAgKHBkZGdjKSkKLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJCi1EaXJlY3REcmF3R2FtbWFDb250cm9sX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNURFJBV0dBTU1BQ09OVFJPTCBpZmFjZSwgUkVGSUlEIHJpaWQsCi0JCQkJICAgICAgTFBWT0lEICpwcE9iaikKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIHBwT2JqKTsKLSAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLX0KLQotc3RhdGljIFVMT05HIFdJTkFQSQotRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9BZGRSZWYoTFBESVJFQ1REUkFXR0FNTUFDT05UUk9MIGlmYWNlKQotewotICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihDT05WRVJUKGlmYWNlKSk7Ci19Ci0KLXN0YXRpYyBVTE9ORyBXSU5BUEkKLURpcmVjdERyYXdHYW1tYUNvbnRyb2xfUmVsZWFzZShMUERJUkVDVERSQVdHQU1NQUNPTlRST0wgaWZhY2UpCi17Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShDT05WRVJUKGlmYWNlKSk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9HZXRHYW1tYVJhbXAoTFBESVJFQ1REUkFXR0FNTUFDT05UUk9MIGlmYWNlLCBEV09SRCBkd0ZsYWdzLCBMUERER0FNTUFSQU1QIGxwR2FtbWFSYW1wKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3R2FtbWFDb250cm9sLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPiglMDhseCwlcClcbiIsIGlmYWNlLGR3RmxhZ3MsbHBHYW1tYVJhbXApOwotICAgIHJldHVybiBUaGlzLT5nZXRfZ2FtbWFfcmFtcChUaGlzLCBkd0ZsYWdzLCBscEdhbW1hUmFtcCk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSQotRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9TZXRHYW1tYVJhbXAoTFBESVJFQ1REUkFXR0FNTUFDT05UUk9MIGlmYWNlLCBEV09SRCBkd0ZsYWdzLCBMUERER0FNTUFSQU1QIGxwR2FtbWFSYW1wKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3R2FtbWFDb250cm9sLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPiglMDhseCwlcClcbiIsIGlmYWNlLGR3RmxhZ3MsbHBHYW1tYVJhbXApOwotICAgIHJldHVybiBUaGlzLT5zZXRfZ2FtbWFfcmFtcChUaGlzLCBkd0ZsYWdzLCBscEdhbW1hUmFtcCk7Ci19Ci0KLWNvbnN0IElEaXJlY3REcmF3R2FtbWFDb250cm9sVnRibCBERFJBV19JRERHQ19WVGFibGUgPQotewotICAgIERpcmVjdERyYXdHYW1tYUNvbnRyb2xfUXVlcnlJbnRlcmZhY2UsCi0gICAgRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9BZGRSZWYsCi0gICAgRGlyZWN0RHJhd0dhbW1hQ29udHJvbF9SZWxlYXNlLAotICAgIERpcmVjdERyYXdHYW1tYUNvbnRyb2xfR2V0R2FtbWFSYW1wLAotICAgIERpcmVjdERyYXdHYW1tYUNvbnRyb2xfU2V0R2FtbWFSYW1wCi19OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9zdXJmYWNlX2hhbC5jIGIvZGxscy9kZHJhdy9zdXJmYWNlX2hhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Q5NDU1Li4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvc3VyZmFjZV9oYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKglEaXJlY3REcmF3U3VyZmFjZSBIQUwgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDEgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAotCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKLQotV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgSEFMX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlOwotCi1zdGF0aWMgSFJFU1VMVCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfY3JlYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJCSAgICBJRGlyZWN0RHJhd0ltcGwqIHBERCkKLXsKLSAgICBIQUxfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0gICAgSEFMX0REUkFXX1BSSVZfVkFSKGRkcHJpdiwgcEREKTsKLSAgICBMUEREUkFXSV9ESVJFQ1REUkFXX0dCTCBkZF9nYmwgPSBwREQtPmxvY2FsLmxwR2JsOwotICAgIExQRERSQVdJX0REUkFXU1VSRkFDRV9MQ0wgbG9jYWwgPSAmVGhpcy0+bG9jYWw7Ci0gICAgRERIQUxfQ1JFQVRFU1VSRkFDRURBVEEgZGF0YTsKLSAgICBIUkVTVUxUIGhyOwotCi0gICAgZGF0YS5scEREID0gZGRfZ2JsOwotICAgIGRhdGEubHBERFN1cmZhY2VEZXNjID0gKExQRERTVVJGQUNFREVTQykmVGhpcy0+c3VyZmFjZV9kZXNjOwotICAgIGRhdGEubHBscFNMaXN0ID0gJmxvY2FsOwotICAgIGRhdGEuZHdTQ250ID0gMTsKLSAgICBkYXRhLmRkUlZhbCA9IDA7Ci0gICAgZGF0YS5DcmVhdGVTdXJmYWNlID0gZGRfZ2JsLT5scEREQ0J0bXAtPkhBTERELkNyZWF0ZVN1cmZhY2U7Ci0gICAgaHIgPSBkYXRhLkNyZWF0ZVN1cmZhY2UoJmRhdGEpOwotCi0gICAgaWYgKGhyID09IERESEFMX0RSSVZFUl9IQU5ETEVEKSB7Ci0JaWYgKFRoaXMtPmdsb2JhbC5mcFZpZE1lbSA8IDQpIHsKLQkgICAgLyogZ3JhYiBmcmFtZWJ1ZmZlciBkYXRhIGZyb20gY3VycmVudF9tb2RlICovCi0JICAgIHByaXYtPmhhbC5mYl9waXRjaCA9IGRkX2dibC0+dm1pRGF0YS5sRGlzcGxheVBpdGNoOwotCSAgICBwcml2LT5oYWwuZmJfdm9mcyAgPSBkZHByaXYtPmhhbC5uZXh0X3ZvZnM7Ci0JICAgIHByaXYtPmhhbC5mYl9hZGRyICA9ICgoTFBCWVRFKWRkX2dibC0+dm1pRGF0YS5mcFByaW1hcnkpICsKLQkJCQkgZGRfZ2JsLT52bWlEYXRhLmxEaXNwbGF5UGl0Y2ggKiBwcml2LT5oYWwuZmJfdm9mczsKLQkgICAgVFJBQ0UoInZvZnM9JWxkLCBhZGRyPSVwXG4iLCBwcml2LT5oYWwuZmJfdm9mcywgcHJpdi0+aGFsLmZiX2FkZHIpOwotCSAgICBkZHByaXYtPmhhbC5uZXh0X3ZvZnMgKz0gVGhpcy0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OwotCi0JICAgIFRoaXMtPmdsb2JhbC5mcFZpZE1lbSA9IChGTEFUUFRSKXByaXYtPmhhbC5mYl9hZGRyOwotCSAgICBUaGlzLT5nbG9iYWwudTQubFBpdGNoID0gcHJpdi0+aGFsLmZiX3BpdGNoOwotCX0KLQlUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID0gKExQVk9JRClUaGlzLT5nbG9iYWwuZnBWaWRNZW07Ci0JVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9MUFNVUkZBQ0U7Ci0JaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfRVhFQ1VURUJVRkZFUikgewotCSAgICBUaGlzLT5zdXJmYWNlX2Rlc2MudTEuZHdMaW5lYXJTaXplID0gVGhpcy0+Z2xvYmFsLnU0LmR3TGluZWFyU2l6ZTsKLQkgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9MSU5FQVJTSVpFOwotCX0gZWxzZSB7Ci0JICAgIFRoaXMtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2ggPSBUaGlzLT5nbG9iYWwudTQubFBpdGNoOwotCSAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1BJVENIOwotCX0KLSAgICB9Ci0gICAgZWxzZSBwcml2LT5oYWwubmVlZF9sYXRlID0gVFJVRTsKLQotICAgIHJldHVybiBkYXRhLmRkUlZhbDsKLX0KLQotc3RhdGljIGlubGluZSBCT09MIEhBTF9Jc1VzZXIoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKLXsKLSAgICBIQUxfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0gICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX1RFWFRVUkUgfCBERFNDQVBTX0VYRUNVVEVCVUZGRVIpKQotCXJldHVybiBGQUxTRTsKLSAgICBpZiAocHJpdi0+aGFsLmZiX2FkZHIpCi0JcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1IUkVTVUxUCi1IQUxfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJSURpcmVjdERyYXdJbXBsKiBwREQsCi0JCQkJY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNEKQotewotICAgIEhBTF9QUklWX1ZBUihwcml2LCBUaGlzKTsKLSAgICBMUEREUkFXSV9ESVJFQ1REUkFXX0dCTCBkZF9nYmwgPSBwREQtPmxvY2FsLmxwR2JsOwotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBUUkFDRSgiKCVwLCVwLCVwKVxuIixUaGlzLHBERCxwRERTRCk7Ci0KLSAgICAvKiBjb3B5IHN1cmZhY2VfZGVzYywgd2UgbWF5IHdhbnQgdG8gbW9kaWZ5IGl0IGJlZm9yZSBESUIgY29uc3RydWN0aW9uICovCi0gICAgVGhpcy0+c3VyZmFjZV9kZXNjID0gKnBERFNEOwotCi0gICAgLyogdGhlIGRyaXZlciBtYXkgd2FudCB0byBkZXJlZmVyZW5jZSB0aGVzZSBwb2ludGVycyAqLwotICAgIFRoaXMtPmxvY2FsLmxwU3VyZk1vcmUgPSAmVGhpcy0+bW9yZTsKLSAgICBUaGlzLT5sb2NhbC5scEdibCA9ICZUaGlzLT5nbG9iYWw7Ci0gICAgVGhpcy0+Z21vcmUgPSAmVGhpcy0+Z2xvYmFsX21vcmU7Ci0KLSAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19URVhUVVJFKSB7Ci0JaHIgPSBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfY3JlYXRlX3N1cmZhY2UoVGhpcywgcEREKTsKLQlpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCi0JaHIgPSBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgJlRoaXMtPnN1cmZhY2VfZGVzYyk7Ci0JaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19FWEVDVVRFQlVGRkVSKSB7Ci0JRklYTUUoImNyZWF0ZSBleGVjdXRlIGJ1ZmZlclxuIik7Ci0JcmV0dXJuIERERVJSX0dFTkVSSUM7Ci0gICAgfQotICAgIGVsc2UgewotCWlmICghKGRkX2dibC0+ZHdGbGFncyAmIEREUkFXSV9NT0RFQ0hBTkdFRCkpIHsKLQkgICAgLyogZm9yY2UgYSBtb2RlIHNldCAoSEFMcyBsaWtlIERHQSBtYXkgbmVlZCBpdCkgKi8KLQkgICAgaHIgPSBIQUxfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShJQ09NX0lOVEVSRkFDRShwREQsIElEaXJlY3REcmF3NyksCi0JCQkJCSAgICAgICBwREQtPndpZHRoLCBwREQtPmhlaWdodCwKLQkJCQkJICAgICAgIHBERC0+cGl4ZWxmb3JtYXQudTEuZHdSR0JCaXRDb3VudCwKLQkJCQkJICAgICAgIDAsIDApOwotCSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCX0KLQotCWlmIChkZF9nYmwtPnZtaURhdGEuZnBQcmltYXJ5KSB7Ci0JICAgIGhyID0gSEFMX0RpcmVjdERyYXdTdXJmYWNlX2NyZWF0ZV9zdXJmYWNlKFRoaXMsIHBERCk7Ci0JICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLQkgICAgaWYgKHByaXYtPmhhbC5uZWVkX2xhdGUpIHsKLQkJLyogdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UuLi4gZHJpdmVyIGVycm9yPyAqLwotCQlFUlIoImRyaXZlciBmYWlsZWQgdG8gY3JlYXRlIGZyYW1lYnVmZmVyIHN1cmZhY2VcbiIpOwotCQlyZXR1cm4gRERFUlJfR0VORVJJQzsKLQkgICAgfQotCi0JICAgIGhyID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChUaGlzLCBwREQsICZUaGlzLT5zdXJmYWNlX2Rlc2MpOwotCSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotCX0gZWxzZSB7Ci0JICAgIC8qIG5vIGZyYW1lYnVmZmVyLCBjb25zdHJ1Y3QgVXNlci1iYXNlZCBwcmltYXJ5ICovCi0JICAgIGhyID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoVGhpcywgcERELCBwRERTRCk7Ci0JICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLQkgICAgLyogbXVzdCBub3RpZnkgSEFMICphZnRlciogY3JlYXRpbmcgVXNlci1iYXNlZCBwcmltYXJ5ICovCi0JICAgIC8qIChvciB1c2UgQ3JlYXRlU3VyZmFjZUV4LCB3aGljaCB3ZSBkb24ndCB5ZXQpICovCi0JICAgIGhyID0gSEFMX0RpcmVjdERyYXdTdXJmYWNlX2NyZWF0ZV9zdXJmYWNlKFRoaXMsIHBERCk7Ci0JICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLQkgICAgcHJpdi0+aGFsLm5lZWRfbGF0ZSA9IEZBTFNFOwotCX0KLSAgICB9Ci0KLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcsCi0JCQlIQUxfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGUpOwotCi0gICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IEhBTF9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlOwotICAgIFRoaXMtPmxhdGVfYWxsb2NhdGUgPSBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfbGF0ZV9hbGxvY2F0ZTsKLSAgICBUaGlzLT5kdXBsaWNhdGVfc3VyZmFjZSA9IEhBTF9EaXJlY3REcmF3U3VyZmFjZV9kdXBsaWNhdGVfc3VyZmFjZTsKLQotICAgIFRoaXMtPmZsaXBfZGF0YSAgID0gSEFMX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YTsKLSAgICBUaGlzLT5mbGlwX3VwZGF0ZSA9IEhBTF9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX3VwZGF0ZTsKLQotICAgIFRoaXMtPnNldF9wYWxldHRlICAgID0gSEFMX0RpcmVjdERyYXdTdXJmYWNlX3NldF9wYWxldHRlOwotCi0gICAgVGhpcy0+Z2V0X2Rpc3BsYXlfd2luZG93ID0gSEFMX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdzsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVAotSEFMX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKnBERCwKLQkJCSAgICAgY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNELAotCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAotCQkJICAgICBJVW5rbm93biAqcFVua091dGVyKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXM7Ci0gICAgSFJFU1VMVCBocjsKLSAgICBhc3NlcnQocFVua091dGVyID09IE5VTEwpOwotCi0gICAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgIHNpemVvZigqVGhpcykgKyBzaXplb2YoSEFMX0RpcmVjdERyYXdTdXJmYWNlSW1wbCkpOwotICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwotCi0gICAgVGhpcy0+cHJpdmF0ZSA9IChIQUxfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKikoVGhpcysxKTsKLQotICAgIGhyID0gSEFMX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChUaGlzLCBwREQsIHBERFNEKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKLSAgICBlbHNlCi0JKnBwU3VyZiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpOwotCi0gICAgcmV0dXJuIGhyOwotfQotCi12b2lkIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCi17Ci0gICAgTFBERFJBV0lfRElSRUNURFJBV19HQkwgZGRfZ2JsID0gVGhpcy0+bW9yZS5scEREX2xjbC0+bHBHYmw7Ci0gICAgRERIQUxfREVTVFJPWVNVUkZBQ0VEQVRBIGRhdGE7Ci0KLSAgICAvKiBkZXN0cm95IEhBTCBzdXJmYWNlICovCi0gICAgZGF0YS5scEREID0gZGRfZ2JsOwotICAgIGRhdGEubHBERFN1cmZhY2UgPSAmVGhpcy0+bG9jYWw7Ci0gICAgZGF0YS5kZFJWYWwgPSAwOwotICAgIGRhdGEuRGVzdHJveVN1cmZhY2UgPSBkZF9nYmwtPmxwRERDQnRtcC0+SEFMRERTdXJmYWNlLkRlc3Ryb3lTdXJmYWNlOwotICAgIGRhdGEuRGVzdHJveVN1cmZhY2UoJmRhdGEpOwotCi0gICAgaWYgKEhBTF9Jc1VzZXIoVGhpcykpIHsKLQlVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Ci0gICAgfSBlbHNlIHsKLQlESUJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShUaGlzKTsKLSAgICB9Ci19Ci0KLUhSRVNVTFQgSEFMX0RpcmVjdERyYXdTdXJmYWNlX2xhdGVfYWxsb2NhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKLXsKLSAgICBIQUxfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0gICAgaWYgKHByaXYtPmhhbC5uZWVkX2xhdGUpIHsKLQlwcml2LT5oYWwubmVlZF9sYXRlID0gRkFMU0U7Ci0JcmV0dXJuIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9jcmVhdGVfc3VyZmFjZShUaGlzLCBUaGlzLT5kZHJhd19vd25lcik7Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotdm9pZCBIQUxfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkgICAgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKQotewotICAgIExQRERSQVdJX0RJUkVDVERSQVdfR0JMIGRkX2dibCA9IFRoaXMtPm1vcmUubHBERF9sY2wtPmxwR2JsOwotICAgIERESEFMX1NFVFBBTEVUVEVEQVRBIGRhdGE7Ci0KLSAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoVGhpcywgcGFsKTsKLSAgICBkYXRhLmxwREQgPSBkZF9nYmw7Ci0gICAgZGF0YS5scEREU3VyZmFjZSA9ICZUaGlzLT5sb2NhbDsKLSAgICBkYXRhLmxwRERQYWxldHRlID0gKHBhbCAhPSBOVUxMID8gJnBhbC0+Z2xvYmFsIDogTlVMTCk7Ci0gICAgZGF0YS5kZFJWYWwgPSAwOwotICAgIGRhdGEuQXR0YWNoID0gVFJVRTsgLyogd2hhdCdzIHRoaXM/ICovCi0gICAgZGF0YS5TZXRQYWxldHRlID0gZGRfZ2JsLT5scEREQ0J0bXAtPkhBTEREU3VyZmFjZS5TZXRQYWxldHRlOwotICAgIGlmIChkYXRhLlNldFBhbGV0dGUpCi0JZGF0YS5TZXRQYWxldHRlKCZkYXRhKTsKLX0KLQotSFJFU1VMVCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJCUxQRElSRUNURFJBV1NVUkZBQ0U3KiBwcER1cCkKLXsKLSAgICByZXR1cm4gSEFMX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLT5kZHJhd19vd25lciwKLQkJCQkJICAgICAmVGhpcy0+c3VyZmFjZV9kZXNjLCBwcER1cCwgTlVMTCk7Ci19Ci0KLXZvaWQgSEFMX0RpcmVjdERyYXdTdXJmYWNlX2xvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJICAgICAgIExQQ1JFQ1QgcFJlY3QsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgTFBERFJBV0lfRElSRUNURFJBV19HQkwgZGRfZ2JsID0gVGhpcy0+bW9yZS5scEREX2xjbC0+bHBHYmw7Ci0gICAgRERIQUxfTE9DS0RBVEEJZGF0YTsKLQotICAgIGRhdGEubHBERAkJPSBkZF9nYmw7Ci0gICAgZGF0YS5scEREU3VyZmFjZQk9ICZUaGlzLT5sb2NhbDsKLSAgICBkYXRhLmRkUlZhbAkJPSAwOwotICAgIGRhdGEubHBTdXJmRGF0YQk9IFRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2U7IC8qIEZJWE1FOiBjb3JyZWN0PyAqLwotICAgIGlmIChwUmVjdCkgewotCWRhdGEuckFyZWEudG9wCT0gcFJlY3QtPnRvcDsKLQlkYXRhLnJBcmVhLmJvdHRvbQk9IHBSZWN0LT5ib3R0b207Ci0JZGF0YS5yQXJlYS5sZWZ0CT0gcFJlY3QtPmxlZnQ7Ci0JZGF0YS5yQXJlYS5yaWdodAk9IHBSZWN0LT5yaWdodDsKLQlkYXRhLmJIYXNSZWN0IAk9IFRSVUU7Ci0gICAgfSBlbHNlIHsKLQlkYXRhLmJIYXNSZWN0IAk9IEZBTFNFOwotICAgIH0KLSAgICBkYXRhLmR3RmxhZ3MJPSBkd0ZsYWdzOwotCi0gICAgZGF0YS5Mb2NrCQk9IGRkX2dibC0+bHBERENCdG1wLT5IQUxERFN1cmZhY2UuTG9jazsKLSAgICBpZiAoZGF0YS5Mb2NrICYmIChkYXRhLkxvY2soJmRhdGEpID09IERESEFMX0RSSVZFUl9IQU5ETEVEKSkKLQlyZXR1cm47Ci0KLSAgICBpZiAoSEFMX0lzVXNlcihUaGlzKSkgewotCVVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfbG9ja191cGRhdGUoVGhpcywgcFJlY3QsIGR3RmxhZ3MpOwotICAgIH0gZWxzZSB7Ci0JTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9sb2NrX3VwZGF0ZShUaGlzLCBwUmVjdCwgZHdGbGFncyk7Ci0gICAgfQotfQotCi12b2lkIEhBTF9EaXJlY3REcmF3U3VyZmFjZV91bmxvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSBMUENSRUNUIHBSZWN0KQotewotICAgIExQRERSQVdJX0RJUkVDVERSQVdfR0JMIGRkX2dibCA9IFRoaXMtPm1vcmUubHBERF9sY2wtPmxwR2JsOwotICAgIERESEFMX1VOTE9DS0RBVEEJZGF0YTsKLQotICAgIGRhdGEubHBERAkJPSBkZF9nYmw7Ci0gICAgZGF0YS5scEREU3VyZmFjZQk9ICZUaGlzLT5sb2NhbDsKLSAgICBkYXRhLmRkUlZhbAkJPSAwOwotICAgIGRhdGEuVW5sb2NrCQk9IGRkX2dibC0+bHBERENCdG1wLT5IQUxERFN1cmZhY2UuVW5sb2NrOwotICAgIGlmIChkYXRhLlVubG9jayAmJiAoZGF0YS5VbmxvY2soJmRhdGEpID09IERESEFMX0RSSVZFUl9IQU5ETEVEKSkKLQlyZXR1cm47Ci0KLSAgICBpZiAoSEFMX0lzVXNlcihUaGlzKSkgewotCVVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfdW5sb2NrX3VwZGF0ZShUaGlzLCBwUmVjdCk7Ci0gICAgfSBlbHNlIHsKLQlNYWluX0RpcmVjdERyYXdTdXJmYWNlX3VubG9ja191cGRhdGUoVGhpcywgcFJlY3QpOwotICAgIH0KLX0KLQotQk9PTCBIQUxfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF9kYXRhKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZyb250LAotCQkJCSAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogYmFjaywKLQkJCQkgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSEFMX1BSSVZfVkFSKGZyb250X3ByaXYsIGZyb250KTsKLSAgICBIQUxfUFJJVl9WQVIoYmFja19wcml2LCBiYWNrKTsKLSAgICBMUEREUkFXSV9ESVJFQ1REUkFXX0dCTCBkZF9nYmwgPSBmcm9udC0+bW9yZS5scEREX2xjbC0+bHBHYmw7Ci0gICAgRERIQUxfRkxJUERBVEEgZGF0YTsKLSAgICBCT09MIHJldDsKLQotICAgIHsKLQlEV09SRCB0bXA7Ci0JdG1wID0gZnJvbnRfcHJpdi0+aGFsLmZiX3ZvZnM7Ci0JZnJvbnRfcHJpdi0+aGFsLmZiX3ZvZnMgPSBiYWNrX3ByaXYtPmhhbC5mYl92b2ZzOwotCWJhY2tfcHJpdi0+aGFsLmZiX3ZvZnMgPSB0bXA7Ci0gICAgfQotICAgIHsKLQlMUFZPSUQgdG1wOwotCXRtcCA9IGZyb250X3ByaXYtPmhhbC5mYl9hZGRyOwotCWZyb250X3ByaXYtPmhhbC5mYl9hZGRyID0gYmFja19wcml2LT5oYWwuZmJfYWRkcjsKLQliYWNrX3ByaXYtPmhhbC5mYl9hZGRyID0gdG1wOwotICAgIH0KLQotICAgIGlmIChIQUxfSXNVc2VyKGZyb250KSkgewotCXJldCA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF9kYXRhKGZyb250LCBiYWNrLCBkd0ZsYWdzKTsKLSAgICB9IGVsc2UgewotCXJldCA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGEoZnJvbnQsIGJhY2ssIGR3RmxhZ3MpOwotICAgIH0KLQotICAgIFRSQUNFKCIoJXAsJXApXG4iLGZyb250LGJhY2spOwotICAgIGRhdGEubHBERCA9IGRkX2dibDsKLSAgICBkYXRhLmxwU3VyZkN1cnIgPSAmZnJvbnQtPmxvY2FsOwotICAgIGRhdGEubHBTdXJmVGFyZyA9ICZiYWNrLT5sb2NhbDsKLSAgICBkYXRhLmxwU3VyZkN1cnJMZWZ0ID0gTlVMTDsKLSAgICBkYXRhLmxwU3VyZlRhcmdMZWZ0ID0gTlVMTDsKLSAgICBkYXRhLmR3RmxhZ3MgPSBkd0ZsYWdzOwotICAgIGRhdGEuZGRSVmFsID0gMDsKLSAgICBkYXRhLkZsaXAgPSBkZF9nYmwtPmxwRERDQnRtcC0+SEFMRERTdXJmYWNlLkZsaXA7Ci0gICAgaWYgKGRhdGEuRmxpcCkKLQlpZiAoZGF0YS5GbGlwKCZkYXRhKSA9PSBEREhBTF9EUklWRVJfSEFORExFRCkgcmV0ID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIEhBTF9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBEV09SRCBkd0ZsYWdzKQotewotICAgIGlmIChIQUxfSXNVc2VyKFRoaXMpKSB7Ci0JVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX3VwZGF0ZShUaGlzLCBkd0ZsYWdzKTsKLSAgICB9Ci19Ci0KLUhXTkQgSEFMX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgSURpcmVjdERyYXdTdXJmYWNlN1Z0YmwgSEFMX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlID0KLXsKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZEF0dGFjaGVkU3VyZmFjZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZE92ZXJsYXlEaXJ0eVJlY3QsCi0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX0JsdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0JsdEJhdGNoLAotICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVsZXRlQXR0YWNoZWRTdXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRW51bUF0dGFjaGVkU3VyZmFjZXMsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtT3ZlcmxheVpPcmRlcnMsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GbGlwLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENsaXBwZXIsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDb2xvcktleSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERDLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RmxpcFN0YXR1cywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldE92ZXJsYXlQb3NpdGlvbiwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBhbGV0dGUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQaXhlbEZvcm1hdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0lzTG9zdCwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0xvY2ssCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlREMsCi0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX1Jlc3RvcmUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDbGlwcGVyLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q29sb3JLZXksCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRPdmVybGF5UG9zaXRpb24sCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlEaXNwbGF5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheVpPcmRlciwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERESW50ZXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZUxvY2ssCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9QYWdlVW5sb2NrLAotICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9TZXRTdXJmYWNlRGVzYywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaXZhdGVEYXRhLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpdmF0ZURhdGEsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GcmVlUHJpdmF0ZURhdGEsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRVbmlxdWVuZXNzVmFsdWUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9DaGFuZ2VVbmlxdWVuZXNzVmFsdWUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQcmlvcml0eSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaW9yaXR5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0TE9ELAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0TE9ECi19OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9zdXJmYWNlX21haW4uYyBiL2RsbHMvZGRyYXcvc3VyZmFjZV9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDVhOTkuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9zdXJmYWNlX21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE1MTYgKzAsMCBAQAotLyoJCURpcmVjdERyYXdTdXJmYWNlIGJhc2UgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgotICogQ29weXJpZ2h0IDE5OTgtMjAwMCBMaW9uZWwgVWxtZXIgKG1vc3Qgb2YgRGlyZWN0M0Qgc3R1ZmYpCi0gKiBDb3B5cmlnaHQgMjAwMC0yMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIENPQkpNQUNST1MKLSNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCi0jZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKLQotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKLSNpbmNsdWRlICJvcGVuZ2xfcHJpdmF0ZS5oIgotCi1XSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci1XSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd19mbGlwKTsKLVdJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGRkcmF3X2Zwcyk7Ci0KLS8qKiBDcmVhdGlvbi9EZXN0cnVjdGlvbiBmdW5jdGlvbnMgKi8KLQotSFJFU1VMVAotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywKLQkJCQkgSURpcmVjdERyYXdJbXBsICpwREQsCi0JCQkJIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgcERELCBwRERTRCk7Ci0KLSAgICBpZiAocEREU0QgIT0gJlRoaXMtPnN1cmZhY2VfZGVzYykgewotCVRoaXMtPnN1cmZhY2VfZGVzYy5kd1NpemUgPSBzaXplb2YoVGhpcy0+c3VyZmFjZV9kZXNjKTsKLQlERF9TVFJVQ1RfQ09QWV9CWVNJWkUoJihUaGlzLT5zdXJmYWNlX2Rlc2MpLHBERFNEKTsKLSAgICB9Ci0gICAgVGhpcy0+dW5pcXVlbmVzc192YWx1ZSA9IDE7IC8qIHVuY2hlY2tlZCAqLwotICAgIFRoaXMtPnJlZiA9IDE7Ci0KLSAgICBUaGlzLT5sb2NhbC5scFN1cmZNb3JlID0gJlRoaXMtPm1vcmU7Ci0gICAgVGhpcy0+bG9jYWwubHBHYmwgPSAmVGhpcy0+Z2xvYmFsOwotICAgIFRoaXMtPmxvY2FsLmR3UHJvY2Vzc0lkID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOwotICAgIFRoaXMtPmxvY2FsLmR3RmxhZ3MgPSAwOyAvKiBGSVhNRSAqLwotICAgIFRoaXMtPmxvY2FsLmRkc0NhcHMuZHdDYXBzID0gVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzOwotICAgIC8qIEZJWE1FOiBtb3JlIGxvY2FsIHN0dWZmICovCi0gICAgVGhpcy0+bW9yZS5scEREX2xjbCA9ICZwREQtPmxvY2FsOwotICAgIFRoaXMtPm1vcmUuZGRzQ2Fwc0V4LmR3Q2FwczIgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMyOwotICAgIFRoaXMtPm1vcmUuZGRzQ2Fwc0V4LmR3Q2FwczMgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMzOwotICAgIFRoaXMtPm1vcmUuZGRzQ2Fwc0V4LmR3Q2FwczQgPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHM0OwotICAgIC8qIEZJWE1FOiBtb3JlIG1vcmUgc3R1ZmYgKi8KLSAgICBUaGlzLT5nbW9yZSA9ICZUaGlzLT5nbG9iYWxfbW9yZTsKLSAgICBUaGlzLT5nbG9iYWwudTMubHBERCA9IHBERC0+bG9jYWwubHBHYmw7Ci0gICAgLyogRklYTUU6IG1vcmUgZ2xvYmFsIHN0dWZmICovCi0KLSAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlOwotICAgIFRoaXMtPmxhdGVfYWxsb2NhdGUgPSBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2xhdGVfYWxsb2NhdGU7Ci0gICAgVGhpcy0+YXR0YWNoID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9hdHRhY2g7Ci0gICAgVGhpcy0+ZGV0YWNoID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9kZXRhY2g7Ci0gICAgVGhpcy0+bG9ja191cGRhdGUgPSBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2xvY2tfdXBkYXRlOwotICAgIFRoaXMtPnVubG9ja191cGRhdGUgPSBNYWluX0RpcmVjdERyYXdTdXJmYWNlX3VubG9ja191cGRhdGU7Ci0gICAgVGhpcy0+bG9zZV9zdXJmYWNlID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9sb3NlX3N1cmZhY2U7Ci0gICAgVGhpcy0+c2V0X3BhbGV0dGUgICAgPSBNYWluX0RpcmVjdERyYXdTdXJmYWNlX3NldF9wYWxldHRlOwotICAgIFRoaXMtPnVwZGF0ZV9wYWxldHRlID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZTsKLSAgICBUaGlzLT5nZXRfZGlzcGxheV93aW5kb3cgPSBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdzsKLSAgICBUaGlzLT5nZXRfZ2FtbWFfcmFtcCA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2dhbW1hX3JhbXA7Ci0gICAgVGhpcy0+c2V0X2dhbW1hX3JhbXAgPSBNYWluX0RpcmVjdERyYXdTdXJmYWNlX3NldF9nYW1tYV9yYW1wOwotCi0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2UzLAotCQkJRERSQVdfSUREUzNfVGh1bmtfVlRhYmxlKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3R2FtbWFDb250cm9sLAotCQkJRERSQVdfSURER0NfVlRhYmxlKTsKLQotICAgIC8qIFRoZXJlIGlzIG5vIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgSUREUzcgb3IgdGV4dHVyZSAqLwotCi0gICAgTWFpbl9EaXJlY3REcmF3X0FkZFN1cmZhY2UocERELCBUaGlzKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXZvaWQgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCi17Ci0gICAgTWFpbl9EaXJlY3REcmF3X1JlbW92ZVN1cmZhY2UoVGhpcy0+ZGRyYXdfb3duZXIsIFRoaXMpOwotfQotCi1IUkVTVUxUIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfbGF0ZV9hbGxvY2F0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIHZvaWQgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9EZXN0cm95KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCi17Ci0gICAgaWYgKFRoaXMtPnBhbGV0dGUpIHsKLSAgICAgICAgSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+cGFsZXR0ZSwgSURpcmVjdERyYXdQYWxldHRlKSk7Ci0JVGhpcy0+cGFsZXR0ZSA9IE5VTEw7Ci0gICAgfQotICAgIFRoaXMtPmZpbmFsX3JlbGVhc2UoVGhpcyk7Ci0gICAgaWYgKFRoaXMtPnByaXZhdGUgIT0gVGhpcysxKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5wcml2YXRlKTsKLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT50ZXhfcHJpdmF0ZSk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7Ci19Ci0KLXZvaWQgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Gb3JjZURlc3Ryb3koSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKLXsKLSAgICBXQVJOKCJkZXN0cm95aW5nIHN1cmZhY2UgJXAgd2l0aCByZWZjbnQgJWx1XG4iLCBUaGlzLCBUaGlzLT5yZWYpOwotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVzdHJveShUaGlzKTsKLX0KLQotVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSkKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLSAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKLQotICAgIFRSQUNFKCIoJXApLT4oKTogZGVjcmVhc2luZyBmcm9tICVsZFxuIiwgVGhpcywgcmVmICsgMSk7Ci0gICAgCi0gICAgaWYgKHJlZiA9PSAwKQotICAgIHsKLQlpZiAoVGhpcy0+YXV4X3JlbGVhc2UpCi0JICAgIFRoaXMtPmF1eF9yZWxlYXNlKFRoaXMtPmF1eF9jdHgsIFRoaXMtPmF1eF9kYXRhKTsKLQlNYWluX0RpcmVjdERyYXdTdXJmYWNlX0Rlc3Ryb3koVGhpcyk7Ci0KLQlUUkFDRSgicmVsZWFzZWQgc3VyZmFjZSAlcFxuIiwgVGhpcyk7Ci0JCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlZjsKLX0KLQotVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwotCi0gICAgVFJBQ0UoIiglcCktPigpOiBpbmNyZWFzaW5nIGZyb20gJWxkXG4iLCBUaGlzLCByZWYgLSAxKTsKLSAgICAKLSAgICByZXR1cm4gcmVmOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgUkVGSUlEIHJpaWQsCi0JCQkJICAgICAgTFBWT0lEKiBwcE9iaikKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgcHBPYmopOwotCi0gICAgKnBwT2JqID0gTlVMTDsKLQotICAgIGlmKCFyaWlkKQotICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQotICAgIGlmIChJc0VxdWFsR1VJRCgmSUlEX0lVbmtub3duLCByaWlkKQotCXx8IElzRXF1YWxHVUlEKCZJSURfSURpcmVjdERyYXdTdXJmYWNlNywgcmlpZCkKLQl8fCBJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTQsIHJpaWQpKQotICAgIHsKLSAgICAgICAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7Ci0JKnBwT2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIGVsc2UgaWYgKElzRXF1YWxHVUlEKCZJSURfSURpcmVjdERyYXdTdXJmYWNlLCByaWlkKQotCSAgICAgfHwgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UyLCByaWlkKQotCSAgICAgfHwgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UzLCByaWlkKSkKLSAgICB7Ci0gICAgICAgIEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwotCSpwcE9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTMpOwotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBlbHNlIGlmIChJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3REcmF3R2FtbWFDb250cm9sLCByaWlkKSkKLSAgICB7Ci0gICAgICAgIEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwotCSpwcE9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3R2FtbWFDb250cm9sKTsKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0jaWZkZWYgSEFWRV9PUEVOR0wKLSAgICAvKiBpbnRlcmZhY2VzIGZvbGxvd2luZyBoZXJlIHJlcXVpcmUgT3BlbkdMICovCi0gICAgaWYoICFvcGVuZ2xfaW5pdGlhbGl6ZWQgKQotICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfRDNEREVWSUNFX09wZW5HTCwgcmlpZCApIHx8Ci0JICBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RIQUxEZXZpY2UsIHJpaWQpICkKLSAgICB7Ci0gICAgICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZGRldmltcGw7Ci0JSFJFU1VMVCByZXRfdmFsdWU7Ci0KLQlyZXRfdmFsdWUgPSBkM2RkZXZpY2VfY3JlYXRlKCZkM2RkZXZpbXBsLCBUaGlzLT5kZHJhd19vd25lciwgVGhpcywgMSk7Ci0JaWYgKEZBSUxFRChyZXRfdmFsdWUpKSByZXR1cm4gcmV0X3ZhbHVlOwotCi0JKnBwT2JqID0gSUNPTV9JTlRFUkZBQ0UoZDNkZGV2aW1wbCwgSURpcmVjdDNERGV2aWNlKTsKLQlUUkFDRSgiIHJldHVybmluZyBEaXJlY3QzRERldmljZSBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqcHBPYmopOwotCQotCUludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOyAvKiBObyBpZGVhIGlmIHRoaXMgaXMgY29ycmVjdC4uIE5lZWQgdG8gY2hlY2sgdXNpbmcgcmVhbCBXaW5kb3dzICovCi0JcmV0dXJuIHJldF92YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEVGV4dHVyZSwgcmlpZCApIHx8Ci0JICAgICBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RUZXh0dXJlMiwgcmlpZCApKQotICAgIHsKLQlIUkVTVUxUIHJldF92YWx1ZSA9IFNfT0s7Ci0KLQkvKiBOb3RlOiB0aGlzIGlzIG5vdCBleGFjdGx5IGhvdyBXaW5kb3dzIGRvZXMgaXQuLi4gQnV0IHRoaXMgc2VlbXMgbm90IHRvIGh1cnQgdGhlIG9ubHkKLQkgICAgICAgICBhcHBsaWNhdGlvbiBJIGtub3cgY3JlYXRpbmcgYSB0ZXh0dXJlIHdpdGhvdXQgdGhpcyBmbGFnIHNldCBhbmQgaXQgd2lsbCBwcmV2ZW50Ci0JCSBidWdzIGluIG90aGVyIHBhcnRzIG9mIFdpbmUuCi0JKi8KLQlUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19URVhUVVJFOwotCi0JLyogSW4gY2FzZSB0aGUgdGV4dHVyZSBzdXJmYWNlIHdhcyBjcmVhdGVkIGJlZm9yZSB0aGUgRDNEIGNyZWF0aW9uICovCi0JaWYgKFRoaXMtPnRleF9wcml2YXRlID09IE5VTEwpIHsKLSAgIAkgICAgaWYgKFRoaXMtPmRkcmF3X293bmVyLT5kM2RfcHJpdmF0ZSA9PSBOVUxMKSB7Ci0JICAgICAgICBFUlIoIlRleHR1cmUgY3JlYXRlZCB3aXRoIG5vIEQzRCBvYmplY3QgeWV0Li4gTm90IHN1cHBvcnRlZCAhXG4iKTsKLQkJcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci0JICAgIH0KLQotCSAgICByZXRfdmFsdWUgPSBUaGlzLT5kZHJhd19vd25lci0+ZDNkX2NyZWF0ZV90ZXh0dXJlKFRoaXMtPmRkcmF3X293bmVyLCBUaGlzLCBGQUxTRSwgVGhpcy0+bWlwX21haW4pOwotCSAgICBpZiAoRkFJTEVEKHJldF92YWx1ZSkpIHJldHVybiByZXRfdmFsdWU7Ci0JfQotCWlmIChJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RUZXh0dXJlLCByaWlkICkpIHsKLQkgICAgKnBwT2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVGV4dHVyZSk7Ci0JICAgIFRSQUNFKCIgcmV0dXJuaW5nIERpcmVjdDNEVGV4dHVyZSBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqcHBPYmopOwotCX0gZWxzZSB7Ci0JICAgICpwcE9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFRleHR1cmUyKTsKLQkgICAgVFJBQ0UoIiByZXR1cm5pbmcgRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqcHBPYmopOwotCX0KLQlJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKLQlyZXR1cm4gcmV0X3ZhbHVlOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci19Ci0KLS8qKiogQ2FsbGJhY2tzICovCi0KLUJPT0wKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfYXR0YWNoKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsCi0JCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0bykKLXsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotQk9PTCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2RldGFjaChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi12b2lkCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX2xvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcFJlY3QsCi0JRFdPUkQgZHdGbGFncykKLXsKLX0KLQotdm9pZAotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV91bmxvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJICAgICBMUENSRUNUIHBSZWN0KQotewotfQotCi12b2lkCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX2xvc2Vfc3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotfQotCi12b2lkCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX3NldF9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKQotewotfQotCi12b2lkCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJICAgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsLAotCQkJCSAgICAgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsCi0JCQkJICAgICAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KQotewotfQotCi1IV05ECi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIHJldHVybiAwOwotfQotCi1IUkVTVUxUCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX2dldF9nYW1tYV9yYW1wKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJICAgICAgRFdPUkQgZHdGbGFncywKLQkJCQkgICAgICBMUERER0FNTUFSQU1QIGxwR2FtbWFSYW1wKQotewotICAgIEhEQyBoREM7Ci0gICAgSFJFU1VMVCBocjsKLSAgICBociA9IFRoaXMtPmdldF9kYyhUaGlzLCAmaERDKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotICAgIGhyID0gR2V0RGV2aWNlR2FtbWFSYW1wKGhEQywgbHBHYW1tYVJhbXApID8gRERfT0sgOiBEREVSUl9VTlNVUFBPUlRFRDsKLSAgICBUaGlzLT5yZWxlYXNlX2RjKFRoaXMsIGhEQyk7Ci0gICAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX3NldF9nYW1tYV9yYW1wKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJICAgICAgRFdPUkQgZHdGbGFncywKLQkJCQkgICAgICBMUERER0FNTUFSQU1QIGxwR2FtbWFSYW1wKQotewotICAgIEhEQyBoREM7Ci0gICAgSFJFU1VMVCBocjsKLSAgICBociA9IFRoaXMtPmdldF9kYyhUaGlzLCAmaERDKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwotICAgIGhyID0gU2V0RGV2aWNlR2FtbWFSYW1wKGhEQywgbHBHYW1tYVJhbXApID8gRERfT0sgOiBEREVSUl9VTlNVUFBPUlRFRDsKLSAgICBUaGlzLT5yZWxlYXNlX2RjKFRoaXMsIGhEQyk7Ci0gICAgcmV0dXJuIGhyOwotfQotCi0KLS8qKiogSW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRBdHRhY2hlZFN1cmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcEF0dGFjaCkKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwKLQkJCQkJICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcsIHBBdHRhY2gpOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwQXR0YWNoKTsKLQotICAgIC8qIERvZXMgd2luZG93cyBjaGVjayB0aGlzPyAqLwotICAgIGlmIChzdXJmID09IFRoaXMpCi0JcmV0dXJuIERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0U7IC8qIHVuY2hlY2tlZCAqLwotCi0gICAgLyogRG9lcyB3aW5kb3dzIGNoZWNrIHRoaXM/ICovCi0gICAgaWYgKHN1cmYtPmRkcmF3X293bmVyICE9IFRoaXMtPmRkcmF3X293bmVyKQotCXJldHVybiBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFOyAvKiB1bmNoZWNrZWQgKi8KLQotICAgIGlmIChzdXJmLT5zdXJmYWNlX293bmVyICE9IE5VTEwpCi0JcmV0dXJuIERERVJSX1NVUkZBQ0VBTFJFQURZQVRUQUNIRUQ7IC8qIHVuY2hlY2tlZCAqLwotCi0gICAgLyogVE9ETyBNU0ROOiAiWW91IGNhbiBhdHRhY2ggb25seSB6LWJ1ZmZlciBzdXJmYWNlcyB3aXRoIHRoaXMgbWV0aG9kLiIKLSAgICAgKiBCdXQgYXBwYXJlbnRseSBiYWNrYnVmZmVycyBhbmQgbWlwbWFwcyBjYW4gYmUgYXR0YWNoZWQgdG9vLiAqLwotCi0gICAgLyogU2V0IE1JUE1BUFNVQkxFVkVMIGlmIHRoaXMgc2VlbXMgdG8gYmUgb25lICovCi0gICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmCi0Jc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApIHsKLQlzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMyIHw9IEREU0NBUFMyX01JUE1BUFNVQkxFVkVMOwotCS8qIEZJWE1FOiB3ZSBzaG91bGQgcHJvYmFibHkgYWxzbyBhZGQgdG8gZHdNaXBNYXBDb3VudCBvZiB0aGlzCi0JICogYW5kIGFsbCBwYXJlbnQgc3VyZmFjZXMgKHVwZGF0ZSBjcmVhdGVfdGV4dHVyZSBpZiB5b3UgZG8pICovCi0gICAgfQotCi0gICAgLyogQ2FsbGJhY2sgdG8gYWxsb3cgdGhlIHN1cmZhY2UgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgbm93IHRoYXQgaXQgaXMKLSAgICAgKiBhdHRhY2hlZC4gKGUuZy4gbWF5YmUgdGhlIFotYnVmZmVyIHRlbGxzIHRoZSByZW5kZXJlciB0byB1c2UgaXQuKSAqLwotICAgIGlmICghc3VyZi0+YXR0YWNoKHN1cmYsIFRoaXMpKQotCXJldHVybiBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFOwotCi0gICAgLyogY2hlY2s6IFdoZXJlIHNob3VsZCBpdCBnbyBpbiB0aGUgY2hhaW4/IFRoaXMgcHV0cyBpdCBvbiB0aGUgaGVhZC4gKi8KLSAgICBpZiAoVGhpcy0+YXR0YWNoZWQpCi0JVGhpcy0+YXR0YWNoZWQtPnByZXZfYXR0YWNoZWQgPSBzdXJmOwotICAgIHN1cmYtPm5leHRfYXR0YWNoZWQgPSBUaGlzLT5hdHRhY2hlZDsKLSAgICBzdXJmLT5wcmV2X2F0dGFjaGVkID0gTlVMTDsKLSAgICBUaGlzLT5hdHRhY2hlZCA9IHN1cmY7Ci0gICAgc3VyZi0+c3VyZmFjZV9vd25lciA9IFRoaXM7Ci0KLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihwQXR0YWNoKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotLyogTVNETjogIm5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuIiAqLwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgTFBSRUNUIHBSZWN0KQotewotICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLGlmYWNlLHBSZWN0KTsKLSAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIHVuY2hlY2tlZCAqLwotfQotCi0vKiBNU0ROOiAibm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4iICovCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQlMUEREQkxUQkFUQ0ggcEJhdGNoLCBEV09SRCBkd0NvdW50LAotCQkJCURXT1JEIGR3RmxhZ3MpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlbGQsJTA4bHgpXG4iLGlmYWNlLHBCYXRjaCxkd0NvdW50LGR3RmxhZ3MpOwotICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsgLyogdW5jaGVja2VkICovCi19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSkKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLSAgICB2b2xhdGlsZSBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiB2VGhpcyA9IFRoaXM7Ci0KLSAgICBUUkFDRSgiKCVwKVxuIixUaGlzKTsKLSAgICAvKiBBIHVuaXF1bmVzcyB2YWx1ZSBvZiAwIGlzIGFwcGFyZW50bHkgc3BlY2lhbC4KLSAgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGNoZWNrZWQuICovCi0gICAgd2hpbGUgKDEpCi0gICAgewotCURXT1JEIG9sZF91bmlxdWVuZXNzX3ZhbHVlID0gdlRoaXMtPnVuaXF1ZW5lc3NfdmFsdWU7Ci0JRFdPUkQgbmV3X3VuaXF1ZW5lc3NfdmFsdWUgPSBvbGRfdW5pcXVlbmVzc192YWx1ZSsxOwotCi0JaWYgKG9sZF91bmlxdWVuZXNzX3ZhbHVlID09IDApIGJyZWFrOwotCWlmIChuZXdfdW5pcXVlbmVzc192YWx1ZSA9PSAwKSBuZXdfdW5pcXVlbmVzc192YWx1ZSA9IDE7Ci0KLQlpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKExPTkcqKSZ2VGhpcy0+dW5pcXVlbmVzc192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF91bmlxdWVuZXNzX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VuaXF1ZW5lc3NfdmFsdWUpCi0JICAgID09IG9sZF91bmlxdWVuZXNzX3ZhbHVlKQotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgICBEV09SRCBkd0ZsYWdzLAotCQkJCQkgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBBdHRhY2gpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZiA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsCi0JCQkJCSAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3LCBwQXR0YWNoKTsKLQotICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXApXG4iLFRoaXMsZHdGbGFncyxwQXR0YWNoKTsKLQotICAgIGlmICghc3VyZiB8fCAoc3VyZi0+c3VyZmFjZV9vd25lciAhPSBUaGlzKSkKLQlyZXR1cm4gRERFUlJfU1VSRkFDRU5PVEFUVEFDSEVEOyAvKiB1bmNoZWNrZWQgKi8KLQotICAgIHN1cmYtPmRldGFjaChzdXJmKTsKLQotICAgIC8qIFJlbW92ZSBNSVBNQVBTVUJMRVZFTCBpZiB0aGlzIHNlZW1lZCB0byBiZSBvbmUgKi8KLSAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYKLQlzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkgewotCXN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczIgJj0gfkREU0NBUFMyX01JUE1BUFNVQkxFVkVMOwotCS8qIEZJWE1FOiB3ZSBzaG91bGQgcHJvYmFibHkgYWxzbyBzdWJ0cmFjdCBmcm9tIGR3TWlwTWFwQ291bnQgb2YgdGhpcwotCSAqIGFuZCBhbGwgcGFyZW50IHN1cmZhY2VzICovCi0gICAgfQotCi0gICAgaWYgKHN1cmYtPm5leHRfYXR0YWNoZWQpCi0Jc3VyZi0+bmV4dF9hdHRhY2hlZC0+cHJldl9hdHRhY2hlZCA9IHN1cmYtPnByZXZfYXR0YWNoZWQ7Ci0gICAgaWYgKHN1cmYtPnByZXZfYXR0YWNoZWQpCi0Jc3VyZi0+cHJldl9hdHRhY2hlZC0+bmV4dF9hdHRhY2hlZCA9IHN1cmYtPm5leHRfYXR0YWNoZWQ7Ci0gICAgaWYgKFRoaXMtPmF0dGFjaGVkID09IHN1cmYpCi0JVGhpcy0+YXR0YWNoZWQgPSBzdXJmLT5uZXh0X2F0dGFjaGVkOwotCi0gICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHBBdHRhY2gpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtQXR0YWNoZWRTdXJmYWNlcyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgIExQVk9JRCBjb250ZXh0LAotCQkJCQkgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYikKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmOwotICAgIEREU1VSRkFDRURFU0MyIGRlc2M7Ci0gICAgCi0gICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsVGhpcyxjb250ZXh0LGNiKTsKLQotICAgIGZvciAoc3VyZiA9IFRoaXMtPmF0dGFjaGVkOyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5uZXh0X2F0dGFjaGVkKQotICAgIHsKLQlMUERJUkVDVERSQVdTVVJGQUNFNyBpc3VyZiA9IElDT01fSU5URVJGQUNFKHN1cmYsIElEaXJlY3REcmF3U3VyZmFjZTcpOwotCi0JaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCSAgICBUUkFDRSgiICA9PiBlbnVtZXJhdGluZyBzdXJmYWNlICVwIChwcml2LiAlcCkgd2l0aCBkZXNjcmlwdGlvbjpcbiIsIGlzdXJmLCBzdXJmKTsKLQkgICAgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoJnN1cmYtPnN1cmZhY2VfZGVzYyk7Ci0JfQotCi0JSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoaXN1cmYpOwotCWRlc2MgPSBzdXJmLT5zdXJmYWNlX2Rlc2M7Ci0JLyogY2hlY2s6ICE9IERERU5VTVJFVF9PSyBvciA9PSBEREVOVU1SRVRfQ0FOQ0VMPyAqLwotCWlmIChjYihpc3VyZiwgJmRlc2MsIGNvbnRleHQpID09IERERU5VTVJFVF9DQU5DRUwpCi0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIFRSQUNFKCIgZW5kIG9mIGVudW1lcmF0aW9uLlxuIik7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtT3ZlcmxheVpPcmRlcnMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJCSAgRFdPUkQgZHdGbGFncywgTFBWT0lEIGNvbnRleHQsCi0JCQkJCSAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYikKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwLCVwKVxuIixpZmFjZSxkd0ZsYWdzLGNvbnRleHQsY2IpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotQk9PTCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKLQkJCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrLAotCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgLyogdW5pcXVlbmVzc192YWx1ZT8gKi8KLSAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeS4gQnV0IGlzIGl0IHNhZmU/ICovCi0gICAgewotCUhEQyB0bXAgPSBmcm9udC0+aERDOwotCWZyb250LT5oREMgPSBiYWNrLT5oREM7Ci0JYmFjay0+aERDID0gdG1wOwotICAgIH0KLQotICAgIHsKLQlCT09MIHRtcCA9IGZyb250LT5kY19pbl91c2U7Ci0JZnJvbnQtPmRjX2luX3VzZSA9IGJhY2stPmRjX2luX3VzZTsKLQliYWNrLT5kY19pbl91c2UgPSB0bXA7Ci0gICAgfQotCi0gICAgewotCUZMQVRQVFIgdG1wID0gZnJvbnQtPmdsb2JhbC5mcFZpZE1lbTsKLQlmcm9udC0+Z2xvYmFsLmZwVmlkTWVtID0gYmFjay0+Z2xvYmFsLmZwVmlkTWVtOwotCWJhY2stPmdsb2JhbC5mcFZpZE1lbSA9IHRtcDsKLSAgICB9Ci0KLSAgICB7Ci0JVUxPTkdfUFRSIHRtcCA9IGZyb250LT5nbG9iYWxfbW9yZS5oS2VybmVsU3VyZmFjZTsKLQlmcm9udC0+Z2xvYmFsX21vcmUuaEtlcm5lbFN1cmZhY2UgPSBiYWNrLT5nbG9iYWxfbW9yZS5oS2VybmVsU3VyZmFjZTsKLQliYWNrLT5nbG9iYWxfbW9yZS5oS2VybmVsU3VyZmFjZSA9IHRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyogVGhpcyBpcyB1bm5lY2Vzc2FyZWx5IGNvbXBsaWNhdGVkIDotKSAqLwotI2RlZmluZSBNRUFTVVJFTUVOVF9XSU5ET1cgNQotI2RlZmluZSBOVU1CRVJfT0ZfV0lORE9XUyAxMAotCi1zdGF0aWMgTE9OR0xPTkcgcGVyZl9mcmVxOwotc3RhdGljIExPTkdMT05HIHBlcmZfc3RvcmFnZVtOVU1CRVJfT0ZfV0lORE9XU107Ci1zdGF0aWMgTE9OR0xPTkcgcHJldl90aW1lID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3VycmVudF93aW5kb3c7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG1lYXN1cmVtZW50c19pbl93aW5kb3c7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHZhbGlkX3dpbmRvd3M7Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZsaXAoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgb3ZlcnJpZGUsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogdGFyZ2V0OwotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwLCUwOGx4KVxuIixUaGlzLG92ZXJyaWRlLGR3RmxhZ3MpOwotCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3X2ZwcykpIHsKLQlMT05HTE9ORyBjdXJyZW50X3RpbWU7Ci0JTE9OR0xPTkcgZnJhbWVfZHVyYXRpb247Ci0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIgKikgJmN1cnJlbnRfdGltZSk7Ci0KLQlpZiAocHJldl90aW1lICE9IDApIHsKLQkgICAgTE9OR0xPTkcgdG90YWxfdGltZSA9IDA7Ci0JICAgIGludCB0b3RfbWVhczsKLQkgICAgCi0JICAgIGZyYW1lX2R1cmF0aW9uID0gY3VycmVudF90aW1lIC0gcHJldl90aW1lOwotCSAgICBwcmV2X3RpbWUgPSBjdXJyZW50X3RpbWU7Ci0JICAgIAotCSAgICBwZXJmX3N0b3JhZ2VbY3VycmVudF93aW5kb3ddICs9IGZyYW1lX2R1cmF0aW9uOwotCSAgICBtZWFzdXJlbWVudHNfaW5fd2luZG93Kys7Ci0JICAgIAotCSAgICBpZiAobWVhc3VyZW1lbnRzX2luX3dpbmRvdyA+PSBNRUFTVVJFTUVOVF9XSU5ET1cpIHsKLQkJY3VycmVudF93aW5kb3crKzsKLQkJdmFsaWRfd2luZG93cysrOwotCi0JCWlmICh2YWxpZF93aW5kb3dzIDwgTlVNQkVSX09GX1dJTkRPV1MpIHsKLQkJICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgdG90X21lYXMgPSB2YWxpZF93aW5kb3dzICogTUVBU1VSRU1FTlRfV0lORE9XOwotCQkgICAgZm9yIChpID0gMDsgaSA8IHZhbGlkX3dpbmRvd3M7IGkrKykgewotCQkJdG90YWxfdGltZSArPSBwZXJmX3N0b3JhZ2VbaV07Ci0JCSAgICB9Ci0JCX0gZWxzZSB7Ci0JCSAgICBpbnQgaTsKLQkJICAgIHRvdF9tZWFzID0gTlVNQkVSX09GX1dJTkRPV1MgKiBNRUFTVVJFTUVOVF9XSU5ET1c7Ci0JCSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1dJTkRPV1M7IGkrKykgewotCQkJdG90YWxfdGltZSArPSBwZXJmX3N0b3JhZ2VbaV07Ci0JCSAgICB9Ci0JCX0KLQotCQlUUkFDRV8oZGRyYXdfZnBzKSgiICU5LjVmXG4iLCAoZG91YmxlKSAocGVyZl9mcmVxICogdG90X21lYXMpIC8gKGRvdWJsZSkgdG90YWxfdGltZSk7Ci0JCQotCQlpZiAoY3VycmVudF93aW5kb3cgPj0gTlVNQkVSX09GX1dJTkRPV1MpIHsKLQkJICAgIGN1cnJlbnRfd2luZG93ID0gMDsKLQkJfQotCQlwZXJmX3N0b3JhZ2VbY3VycmVudF93aW5kb3ddID0gMDsKLQkJbWVhc3VyZW1lbnRzX2luX3dpbmRvdyA9IDA7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICBwcmV2X3RpbWUgPSBjdXJyZW50X3RpbWU7Ci0JICAgIG1lbXNldChwZXJmX3N0b3JhZ2UsIDAsIHNpemVvZihwZXJmX3N0b3JhZ2UpKTsKLQkgICAgY3VycmVudF93aW5kb3cgPSAwOwotCSAgICB2YWxpZF93aW5kb3dzID0gMDsKLQkgICAgbWVhc3VyZW1lbnRzX2luX3dpbmRvdyA9IDA7Ci0JICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIgKikgJnBlcmZfZnJlcSk7Ci0JfQotICAgIH0KLSAgICAKLSAgICAvKiBNU0ROOiAiVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbmx5IGZvciBhIHN1cmZhY2UgdGhhdCBoYXMgdGhlCi0gICAgICogRERTQ0FQU19GTElQIGFuZCBERFNDQVBTX0ZST05UQlVGRkVSIGNhcGFiaWxpdGllcy4iICovCi0gICAgaWYgKChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMmKEREU0NBUFNfRkxJUHxERFNDQVBTX0ZST05UQlVGRkVSKSkKLQkhPSAoRERTQ0FQU19GTElQfEREU0NBUFNfRlJPTlRCVUZGRVIpKQotCXJldHVybiBEREVSUl9OT1RGTElQUEFCTEU7Ci0KLSAgICBpZiAoVGhpcy0+YXV4X2ZsaXApCi0JaWYgKFRoaXMtPmF1eF9mbGlwKFRoaXMtPmF1eF9jdHgsIFRoaXMtPmF1eF9kYXRhKSkKLQkgICAgcmV0dXJuIEREX09LOwotCi0gICAgLyogMS4gZmluZCB0aGUgZmxpcCB0YXJnZXQgKi8KLSAgICAvKiBYWFggSSBkb24ndCB0aGluayB0aGlzIGFsZ29yaXRobSB3b3JrcyBmb3IgbW9yZSB0aGFuIDEgYmFja2J1ZmZlci4gKi8KLSAgICBpZiAob3ZlcnJpZGUgPT0gTlVMTCkKLSAgICB7Ci0Jc3RhdGljIEREU0NBUFMyIGJhY2tfY2FwcyA9IHsgRERTQ0FQU19CQUNLQlVGRkVSIH07Ci0JTFBESVJFQ1REUkFXU1VSRkFDRTcgdGd0OwotCi0JaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShpZmFjZSwgJmJhY2tfY2FwcywgJnRndCk7Ci0JaWYgKEZBSUxFRChocikpIHJldHVybiBEREVSUl9OT1RGTElQUEFCTEU7IC8qIHVuY2hlY2tlZCAqLwotCi0JdGFyZ2V0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywKLQkJCSAgICAgdGd0KTsKLQlJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UodGd0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlCT09MIG9uX2NoYWluID0gRkFMU0U7Ci0JSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZjsKLQotCS8qIE1TRE46ICJUaGUgbWV0aG9kIGZhaWxzIGlmIHRoZSBzcGVjaWZpZWQgW292ZXJyaWRlXSBzdXJmYWNlIGlzIG5vdAotCSAqIGEgbWVtYmVyIG9mIHRoZSBmbGlwcGluZyBjaGFpbi4iICovCi0KLQkvKiBWZXJpZnkgdGhhdCBvdmVycmlkZSBpcyBvbiB0aGlzIGZsaXAgY2hhaW4uIFdlIGFzc3VtZSB0aGF0Ci0JICogc3VyZiBpcyB0aGUgaGVhZCBvZiB0aGUgZmxpcHBpbmcgY2hhaW4sIGJlY2F1c2UgaXQncyB0aGUgZnJvbnQKLQkgKiBidWZmZXIuICovCi0JdGFyZ2V0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywKLQkJCSAgICAgb3ZlcnJpZGUpOwotCi0JLyogRWl0aGVyIHRhcmdldCBpcyAoaW5kaXJlY3RseSkgYXR0YWNoZWQgdG8gVGhpcyBvciBUaGlzIGlzCi0JICogKGluZGlyZWN0bHkpIGF0dGFjaGVkIHRvIHRhcmdldC4gKi8KLQlmb3IgKHN1cmYgPSB0YXJnZXQ7IHN1cmYgIT0gTlVMTDsgc3VyZiA9IHN1cmYtPnN1cmZhY2Vfb3duZXIpCi0JewotCSAgICBpZiAoc3VyZiA9PSBUaGlzKQotCSAgICB7Ci0JCW9uX2NoYWluID0gVFJVRTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQlpZiAoIW9uX2NoYWluKQotCSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgLyogdW5jaGVja2VkICovCi0gICAgfQotCi0gICAgVFJBQ0UoImZsaXAgdG8gYmFja2J1ZmZlcjogJXBcbiIsdGFyZ2V0KTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXdfZmxpcCkpIHsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGZsaXBfY291bnQgPSAwOwotCUlEaXJlY3REcmF3UGFsZXR0ZUltcGwgKnBhbGV0dGU7Ci0JY2hhciBidWZbMzJdOwotCUZJTEUgKmY7Ci0KLQkvKiBIYWNrIGZvciBwYWxldHRlZCBnYW1lcy4uLiAqLwotCXBhbGV0dGUgPSB0YXJnZXQtPnBhbGV0dGU7Ci0JdGFyZ2V0LT5wYWxldHRlID0gVGhpcy0+cGFsZXR0ZTsKLQkKLQlzcHJpbnRmKGJ1ZiwgImZsaXBfJTA4ZC5wcG0iLCBmbGlwX2NvdW50KyspOwotCVRSQUNFXyhkZHJhd19mbGlwKSgiRHVtcGluZyBmaWxlICVzIHRvIGRpc2suXG4iLCBidWYpOwotCWYgPSBmb3BlbihidWYsICJ3YiIpOwotCUREUkFXX2R1bXBfc3VyZmFjZV90b19kaXNrKHRhcmdldCwgZiwgOCk7Ci0JdGFyZ2V0LT5wYWxldHRlID0gcGFsZXR0ZTsKLSAgICB9Ci0KLSAgICBpZiAoVGhpcy0+ZmxpcF9kYXRhKFRoaXMsIHRhcmdldCwgZHdGbGFncykpCi0JVGhpcy0+ZmxpcF91cGRhdGUoVGhpcywgZHdGbGFncyk7Ci0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgUHJpdmF0ZURhdGEqIGZpbmRfcHJpdmF0ZV9kYXRhKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsCi0JCQkJICAgICAgUkVGR1VJRCB0YWcpCi17Ci0gICAgUHJpdmF0ZURhdGEqIGRhdGE7Ci0gICAgZm9yIChkYXRhID0gVGhpcy0+cHJpdmF0ZV9kYXRhOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KQotICAgIHsKLQlpZiAoSXNFcXVhbEdVSUQoJmRhdGEtPnRhZywgdGFnKSkgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRhdGE7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZyZWVQcml2YXRlRGF0YShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgUkVGR1VJRCB0YWcpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0gICAgUHJpdmF0ZURhdGEgKmRhdGE7Ci0KLSAgICBkYXRhID0gZmluZF9wcml2YXRlX2RhdGEoVGhpcywgdGFnKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gRERFUlJfTk9URk9VTkQ7Ci0KLSAgICBpZiAoZGF0YS0+cHJldikKLQlkYXRhLT5wcmV2LT5uZXh0ID0gZGF0YS0+bmV4dDsKLSAgICBpZiAoZGF0YS0+bmV4dCkKLQlkYXRhLT5uZXh0LT5wcmV2ID0gZGF0YS0+cHJldjsKLQotICAgIGlmIChkYXRhLT5mbGFncyAmIEREU1BEX0lVTktOT1dOUFRSKQotICAgIHsKLQlpZiAoZGF0YS0+cHRyLm9iamVjdCAhPSBOVUxMKQotCSAgICBJVW5rbm93bl9SZWxlYXNlKGRhdGEtPnB0ci5vYmplY3QpOwotICAgIH0KLSAgICBlbHNlCi0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGF0YS0+cHRyLmRhdGEpOwotCi0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGF0YSk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICBMUEREU0NBUFMyIHBDYXBzLAotCQkJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmZhY2UpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZjsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmb3VuZCA9IE5VTEw7Ci0gICAgRERTQ0FQUzIgb3VyX2NhcHM7Ci0gICAgCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiKCVwKS0+TG9va2luZyBmb3IgY2FwczogJWx4LCVseCwlbHgsJWx4IG91dHB1dDogJXBcbiIsVGhpcyxwQ2Fwcy0+ZHdDYXBzLCBwQ2Fwcy0+ZHdDYXBzMiwKLQkgICAgICBwQ2Fwcy0+ZHdDYXBzMywgcENhcHMtPmR3Q2FwczQsIHBwU3VyZmFjZSk7Ci0JVFJBQ0UoIiAgIENhcHMgYXJlIDogIik7IEREUkFXX2R1bXBfRERTQ0FQUzIocENhcHMpOyBUUkFDRSgiXG4iKTsKLSAgICB9Ci0KLSAgICBvdXJfY2FwcyA9ICpwQ2FwczsKLSAgICBpZiAoKFRoaXMtPmRkcmF3X293bmVyLT5sb2NhbC5kd0xvY2FsRmxhZ3MgJiBERFJBV0lMQ0xfRElSRUNURFJBVzcpID09IDApIHsKLSAgICAgICAgLyogQXMgdGhpcyBpcyBub3QgYSBEaXJlY3REcmF3NyBhcHBsaWNhdGlvbiwgcmVtb3ZlIHRoZSBnYXJiYWdlIHRoYXQgc29tZSBnYW1lcwotCSAgIHB1dCBpbiB0aGUgbmV3IGZpZWxkcyBvZiB0aGUgRERTQ0FQUzIgc3RydWN0dXJlLiAqLwotICAgICAgICBvdXJfY2Fwcy5kd0NhcHMyID0gMDsKLQlvdXJfY2Fwcy5kd0NhcHMzID0gMDsKLQlvdXJfY2Fwcy5kd0NhcHM0ID0gMDsKLQlpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JICAgIFRSQUNFKCIgICBSZWFsIGNhcHMgYXJlIDogIik7IEREUkFXX2R1bXBfRERTQ0FQUzIoJm91cl9jYXBzKTsgVFJBQ0UoIlxuIik7Ci0JfQotICAgIH0KLSAgICAKLSAgICBmb3IgKHN1cmYgPSBUaGlzLT5hdHRhY2hlZDsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9hdHRhY2hlZCkKLSAgICB7Ci0gICAgICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkgICAgVFJBQ0UoIlN1cmZhY2U6ICglcCkgY2FwczogJWx4LCVseCwlbHgsJWx4XG4iLCBzdXJmLAotCQkgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcywKLQkJICBzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMyLAotCQkgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczMsCi0JCSAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzNCk7Ci0JICAgIFRSQUNFKCIgICBTdXJmYWNlIGNhcHMgYXJlIDogIik7IEREUkFXX2R1bXBfRERTQ0FQUzIoJihzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2FwcykpOyBUUkFDRSgiXG4iKTsKLQl9Ci0JaWYgKCgoc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgb3VyX2NhcHMuZHdDYXBzKSA9PSBvdXJfY2Fwcy5kd0NhcHMpICYmCi0JICAgICgoc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiAmIG91cl9jYXBzLmR3Q2FwczIpID09IG91cl9jYXBzLmR3Q2FwczIpKQotCXsKLQkgICAgLyogTVNETjogIlRoaXMgbWV0aG9kIGZhaWxzIGlmIG1vcmUgdGhhbiBvbmUgc3VyZmFjZSBpcyBhdHRhY2hlZAotCSAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIGNhcGFiaWxpdGllcyByZXF1ZXN0ZWQuIiAqLwotCSAgICBpZiAoZm91bmQgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGSVhNRSgiTW9yZSB0aGFuIG9uZSBhdHRhY2hlZCBzdXJmYWNlIG1hdGNoZXMgcmVxdWVzdGVkIGNhcHMuICBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlP1xuIik7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgY29kZSByZXR1cm5lZCAnRERFUlJfTk9URk9VTkQnLiAgVGhhdCBhcHBlYXJzIG5vdAotICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvcnJlY3QsIGdpdmVuIHdoYXQgM0RNYXJrIGV4cGVjdHMgZnJvbSBNaXBNYXBwZWQgc3VyZmFjZXMuCi0gICAgICAgICAgICAgICAgICAgV2Ugc2hhbGwganVzdCBjb250aW51ZSBpbnN0ZWFkLiAqLwotICAgICAgICAgICAgfQotCi0JICAgIGZvdW5kID0gc3VyZjsKLQl9Ci0gICAgfQotCi0gICAgaWYgKGZvdW5kID09IE5VTEwpIHsKLSAgICAgICAgVFJBQ0UoIkRpZCBub3QgZmluZCBhbnkgdmFsaWQgc3VyZmFjZVxuIik7Ci0JcmV0dXJuIERERVJSX05PVEZPVU5EOwotICAgIH0KLQotICAgICpwcFN1cmZhY2UgPSBJQ09NX0lOVEVSRkFDRShmb3VuZCwgSURpcmVjdERyYXdTdXJmYWNlNyk7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCJSZXR1cm5pbmcgc3VyZmFjZSAlcCB3aXRoIGRlc2NyaXB0aW9uIDpcbiIsICpwcFN1cmZhY2UpOwotCUREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKCYoZm91bmQtPnN1cmZhY2VfZGVzYykpOwotICAgIH0KLSAgICAKLSAgICAvKiBYWFggZDNkZnJhbWUuY3BwIHNvbWV0aW1lcyBBZGRSZWZzIHRoaW5ncyB0aGF0IGl0IGdldHMgZnJvbSB1cy4gKi8KLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShmb3VuZCwgSURpcmVjdERyYXdTdXJmYWNlNykpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkd0ZsYWdzKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4bHgpXG4iLGlmYWNlLGR3RmxhZ3MpOwotCi0gICAgc3dpdGNoIChkd0ZsYWdzKQotICAgIHsKLSAgICBjYXNlIERER0JTX0NBTkJMVDoKLSAgICBjYXNlIERER0JTX0lTQkxURE9ORToKLQlyZXR1cm4gRERfT0s7Ci0KLSAgICBkZWZhdWx0OgotCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgIH0KLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgTFBERFNDQVBTMiBwQ2FwcykKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscENhcHMpOwotICAgICpwQ2FwcyA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2xpcHBlcihMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgIExQRElSRUNURFJBV0NMSVBQRVIqIHBwQ2xpcHBlcikKLXsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscHBDbGlwcGVyKTsKLSAgICBpZiAoVGhpcy0+Y2xpcHBlciA9PSBOVUxMKQotCXJldHVybiBEREVSUl9OT0NMSVBQRVJBVFRBQ0hFRDsKLQotICAgICpwcENsaXBwZXIgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5jbGlwcGVyLCBJRGlyZWN0RHJhd0NsaXBwZXIpOwotICAgIElEaXJlY3REcmF3Q2xpcHBlcl9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+Y2xpcHBlciwKLQkJCQkJICAgICBJRGlyZWN0RHJhd0NsaXBwZXIpKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENvbG9yS2V5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgIExQRERDT0xPUktFWSBwQ0tleSkKLXsKLSAgICAvKiBUaGVyZSBpcyBhIERERVJSX05PQ09MT1JLRVkgZXJyb3IsIGJ1dCBob3cgZG8gd2Uga25vdyBpZiBhIGNvbG9yIGtleQotICAgICAqIGlzbid0IHRoZXJlPyBUaGF0J3MgbGlrZSBzYXlpbmcgdGhhdCBhbiBpbnQgaXNuJ3QgdGhlcmUuIChXaGljaCBNUwotICAgICAqIGhhcyBkb25lIGluIG90aGVyIGRvY3MuKSAqLwotCi0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwKVxuIixUaGlzLGR3RmxhZ3MscENLZXkpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGNvbG9ya2V5IGZsYWdzIDogIik7Ci0JRERSQVdfZHVtcF9jb2xvcmtleWZsYWcoZHdGbGFncyk7Ci0gICAgfQotCi0gICAgc3dpdGNoIChkd0ZsYWdzKQotICAgIHsKLSAgICBjYXNlIEREQ0tFWV9ERVNUQkxUOgotCSpwQ0tleSA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tEZXN0Qmx0OwotCWJyZWFrOwotCi0gICAgY2FzZSBERENLRVlfREVTVE9WRVJMQVk6Ci0JKnBDS2V5ID0gVGhpcy0+c3VyZmFjZV9kZXNjLnUzLmRkY2tDS0Rlc3RPdmVybGF5OwotCWJyZWFrOwotCi0gICAgY2FzZSBERENLRVlfU1JDQkxUOgotCSpwQ0tleSA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNCbHQ7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIEREQ0tFWV9TUkNPVkVSTEFZOgotCSpwQ0tleSA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNPdmVybGF5OwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qIFhYWCBXZSBuZWVkIHRvIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBEQyBpZiB0aGUgc3VyZmFjZSBnZXRzIGxvc3QuICovCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREQyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgSERDICpwaERDKQotewotICAgIEREU1VSRkFDRURFU0MyIGRkc2Q7Ci0gICAgSFJFU1VMVCBocjsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilpZmFjZTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscGhEQyk7Ci0gICAgQ0hFQ0tfTE9TVChUaGlzKTsKLQotICAgIExPQ0tfT0JKRUNUKFRoaXMpOwotCi0gICAgaWYgKFRoaXMtPmRjX2luX3VzZSkKLSAgICB7Ci0JVU5MT0NLX09CSkVDVChUaGlzKTsKLQlyZXR1cm4gRERFUlJfRENBTFJFQURZQ1JFQVRFRDsKLSAgICB9Ci0KLSAgICAvKiBMb2NrIGFzIHBlciBNU0ROLgotICAgICAqIFN0cmFuZ2U6IExvY2sgbGlzdHMgRERFUlJfU1VSRkFDRUJVU1kgYXMgYW4gZXJyb3IsIG1lYW5pbmcgdGhhdCBhbm90aGVyCi0gICAgICogdGhyZWFkIGhhcyBpdCBsb2NrZWQsIGJ1dCBHZXREQyBkb2VzIG5vdC4gKi8KLSAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKLSAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhpZmFjZSwgTlVMTCwgJmRkc2QsIDAsIDApOwotICAgIGlmIChGQUlMRUQoaHIpKQotICAgIHsKLQlVTkxPQ0tfT0JKRUNUKFRoaXMpOwotCXJldHVybiBocjsKLSAgICB9Ci0KLSAgICBociA9IFRoaXMtPmdldF9kYyhUaGlzLCAmVGhpcy0+aERDKTsKLQotICAgIGlmICgoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9QQUxFVFRFSU5ERVhFRDgpICYmCi0JKFRoaXMtPnBhbGV0dGUgPT0gTlVMTCkpIHsKLQlJRGlyZWN0RHJhd0ltcGwgKmRkcmF3ID0gVGhpcy0+ZGRyYXdfb3duZXI7Ci0JSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZjsKLQkKLQlmb3IgKHN1cmYgPSBkZHJhdy0+c3VyZmFjZXM7IHN1cmYgIT0gTlVMTDsgc3VyZiA9IHN1cmYtPm5leHRfZGRyYXcpIHsKLQkgICAgaWYgKCgoc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfCBERFNDQVBTX0ZST05UQlVGRkVSKSkgPT0gKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgfCBERFNDQVBTX0ZST05UQlVGRkVSKSkgJiYKLQkJKHN1cmYtPnBhbGV0dGUgIT0gTlVMTCkpIHsKLQkJUkdCUVVBRCBjb2xbMjU2XTsKLQkJSURpcmVjdERyYXdQYWxldHRlSW1wbCAqcGFsID0gc3VyZi0+cGFsZXR0ZTsKLQkJdW5zaWduZWQgaW50IG47Ci0JCWZvciAobj0wOyBuPDI1NjsgbisrKSB7Ci0JCSAgICBjb2xbbl0ucmdiUmVkICAgPSBwYWwtPnBhbGVudHNbbl0ucGVSZWQ7Ci0JCSAgICBjb2xbbl0ucmdiR3JlZW4gPSBwYWwtPnBhbGVudHNbbl0ucGVHcmVlbjsKLQkJICAgIGNvbFtuXS5yZ2JCbHVlICA9IHBhbC0+cGFsZW50c1tuXS5wZUJsdWU7Ci0JCSAgICBjb2xbbl0ucmdiUmVzZXJ2ZWQgPSAwOwotCQl9Ci0JCVNldERJQkNvbG9yVGFibGUoVGhpcy0+aERDLCAwLCAyNTYsIGNvbCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgfQotICAgIAotICAgIGlmIChTVUNDRUVERUQoaHIpKQotICAgIHsKLQlUUkFDRSgicmV0dXJuaW5nICVwXG4iLFRoaXMtPmhEQyk7Ci0KLQkqcGhEQyA9IFRoaXMtPmhEQzsKLQlUaGlzLT5kY19pbl91c2UgPSBUUlVFOwotICAgIH0KLSAgICBlbHNlIFdBUk4oIk5vIERDISBQcmVwYXJlIGZvciB0cm91YmxlXG4iKTsKLQotICAgIFVOTE9DS19PQkpFQ1QoVGhpcyk7Ci0gICAgcmV0dXJuIGhyOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREREludGVyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgTFBWT0lEKiBwREQpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBERCk7Ci0gICAgKnBERCA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3X293bmVyLCBJRGlyZWN0RHJhdzcpOwotICAgIElEaXJlY3REcmF3N19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXdfb3duZXIsIElEaXJlY3REcmF3NykpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RmxpcFN0YXR1cyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdGbGFncykKLXsKLSAgICAvKiBYWFg6IERERVJSX0lOVkFMSURTVVJGQUNFVFlQRSAqLwotCi0gICAgVFJBQ0UoIiglcCktPiglMDhseClcbiIsaWZhY2UsZHdGbGFncyk7Ci0gICAgc3dpdGNoIChkd0ZsYWdzKQotICAgIHsKLSAgICBjYXNlIERER0ZTX0NBTkZMSVA6Ci0gICAgY2FzZSBEREdGU19JU0ZMSVBET05FOgotCXJldHVybiBERF9PSzsKLQotICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRMT0QoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQRFdPUkQgcGR3TWF4TE9EKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwZHdNYXhMT0QpOwotICAgIENIRUNLX1RFWFRVUkUoVGhpcyk7Ci0KLSAgICAqcGR3TWF4TE9EID0gVGhpcy0+bWF4X2xvZDsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldE92ZXJsYXlQb3NpdGlvbihMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICBMUExPTkcgcFgsIExQTE9ORyBwWSkKLXsKLSAgICByZXR1cm4gRERFUlJfTk9UQU9WRVJMQVlTVVJGQUNFOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQYWxldHRlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCSAgTFBESVJFQ1REUkFXUEFMRVRURSogcHBQYWxldHRlKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwcFBhbGV0dGUpOwotICAgIGlmIChUaGlzLT5wYWxldHRlID09IE5VTEwpCi0JcmV0dXJuIERERVJSX05PUEFMRVRURUFUVEFDSEVEOwotCi0gICAgKnBwUGFsZXR0ZSA9IElDT01fSU5URVJGQUNFKFRoaXMtPnBhbGV0dGUsIElEaXJlY3REcmF3UGFsZXR0ZSk7Ci0gICAgSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLT5wYWxldHRlLAotCQkJCQkgICAgIElEaXJlY3REcmF3UGFsZXR0ZSkpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGl4ZWxGb3JtYXQoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgICAgTFBERFBJWEVMRk9STUFUIHBERFBpeGVsRm9ybWF0KQotewotICAgIC8qIFdoYXQgaXMgRERFUlJfSU5WQUxJRFNVUkZBQ0VUWVBFIGZvciBoZXJlPyAqLwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwRERQaXhlbEZvcm1hdCk7Ci0gICAgRERfU1RSVUNUX0NPUFlfQllTSVpFKHBERFBpeGVsRm9ybWF0LCZUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0KTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaW9yaXR5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCSAgIExQRFdPUkQgcGR3UHJpb3JpdHkpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBkd1ByaW9yaXR5KTsKLSAgICBDSEVDS19URVhUVVJFKFRoaXMpOwotCi0gICAgKnBkd1ByaW9yaXR5ID0gVGhpcy0+cHJpb3JpdHk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcml2YXRlRGF0YShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICAgICBSRUZHVUlEIHRhZywgTFBWT0lEIHBCdWZmZXIsCi0JCQkJICAgICAgTFBEV09SRCBwY2JCdWZmZXJTaXplKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotICAgIFByaXZhdGVEYXRhKiBkYXRhOwotCi0gICAgVFJBQ0UoIiglcCktPiglcCksIHNpemUgPSAlbGRcbiIsIFRoaXMsIHBCdWZmZXIsICpwY2JCdWZmZXJTaXplKTsKLQotICAgIGRhdGEgPSBmaW5kX3ByaXZhdGVfZGF0YShUaGlzLCB0YWcpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiBEREVSUl9OT1RGT1VORDsKLQotICAgIC8qIFRoaXMgbWF5IG5vdCBiZSByaWdodC4gKi8KLSAgICBpZiAoKGRhdGEtPmZsYWdzICYgRERTUERfVk9MQVRJTEUpCi0JJiYgZGF0YS0+dW5pcXVlbmVzc192YWx1ZSAhPSBUaGlzLT51bmlxdWVuZXNzX3ZhbHVlKQotCXJldHVybiBEREVSUl9FWFBJUkVEOwotCi0gICAgaWYgKCpwY2JCdWZmZXJTaXplIDwgZGF0YS0+c2l6ZSkKLSAgICB7Ci0JKnBjYkJ1ZmZlclNpemUgPSBkYXRhLT5zaXplOwotCXJldHVybiBEREVSUl9NT1JFREFUQTsKLSAgICB9Ci0KLSAgICBpZiAoZGF0YS0+ZmxhZ3MgJiBERFNQRF9JVU5LTk9XTlBUUikKLSAgICB7Ci0JKihMUFVOS05PV04gKilwQnVmZmVyID0gZGF0YS0+cHRyLm9iamVjdDsKLQlJVW5rbm93bl9BZGRSZWYoZGF0YS0+cHRyLm9iamVjdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JbWVtY3B5KHBCdWZmZXIsIGRhdGEtPnB0ci5kYXRhLCBkYXRhLT5zaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCSAgICAgIExQRERTVVJGQUNFREVTQzIgcEREU0QpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBERFNEKTsKLSAgICBpZiAoKHBERFNELT5kd1NpemUgPCBzaXplb2YoRERTVVJGQUNFREVTQykpIHx8Ci0gICAgCShwRERTRC0+ZHdTaXplID4gc2l6ZW9mKEREU1VSRkFDRURFU0MyKSkpIHsKLQlFUlIoIkltcG9zc2libGUvU3RyYW5nZSBzdHJ1Y3Qgc2l6ZSAlbGQuXG4iLHBERFNELT5kd1NpemUpOwotCXJldHVybiBEREVSUl9HRU5FUklDOwotICAgIH0KLQotICAgIEREX1NUUlVDVF9DT1BZX0JZU0laRShwRERTRCwmVGhpcy0+c3VyZmFjZV9kZXNjKTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhwRERTRCk7Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0VW5pcXVlbmVzc1ZhbHVlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCQkgIExQRFdPUkQgcFZhbHVlKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwVmFsdWUpOwotICAgICpwVmFsdWUgPSBUaGlzLT51bmlxdWVuZXNzX3ZhbHVlOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgIExQRElSRUNURFJBVyBwREQsIExQRERTVVJGQUNFREVTQzIgcEREU0QpCi17Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsaWZhY2UscERELHBERFNEKTsKLSAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jc0xvc3QoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKSBpcyVzIGxvc3RcbiIsVGhpcywgKFRoaXMtPmxvc3QgPyAiIiA6ICIgbm90IikpOwotICAgIHJldHVybiBUaGlzLT5sb3N0ID8gRERFUlJfU1VSRkFDRUxPU1QgOiBERF9PSzsKLX0KLQotCi0vKiBYWFggVGhpcyBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueSBsb2NraW5nIG9yIGtlZXAgdHJhY2sgb2YgdGhlIGxvY2tlZAotICogcmVjdGFuZ2xlcy4gVGhlIGJlaGF2aW91ciBpcyBwb29ybHkgZG9jdW1lbnRlZC4gKi8KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX0xvY2soTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQUkVDVCBwcmVjdCwKLQkJCSAgICBMUEREU1VSRkFDRURFU0MyIHBERFNELCBEV09SRCBmbGFncywgSEFORExFIGgpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCIoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCVwKVxuIixUaGlzLHByZWN0LHBERFNELGZsYWdzLGgpOwotCVRSQUNFKCIgLSBsb2NraW5nIGZsYWdzIDogIik7IEREUkFXX2R1bXBfbG9ja2ZsYWcoZmxhZ3MpOwotICAgIH0KLSAgICBpZiAoV0FSTl9PTihkZHJhdykpIHsKLQlpZiAoZmxhZ3MgJiB+KERETE9DS19XQUlUfERETE9DS19SRUFET05MWXxERExPQ0tfV1JJVEVPTkxZKSkgewotCSAgICBXQVJOKCIgLSB1bnN1cHBvcnRlZCBsb2NraW5nIGZsYWcgOiAiKTsgRERSQVdfZHVtcF9sb2NrZmxhZyhmbGFncyAmIH4oRERMT0NLX1dBSVR8RERMT0NLX1JFQURPTkxZfERETE9DS19XUklURU9OTFkpKTsKLQl9Ci0gICAgfQotICAgIGlmIChOVUxMICE9IGgpIHsKLSAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotICAgIGlmIChOVUxMID09IHBERFNEKSB7Ci0gICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgIH0KLQotICAgIC8qIElmIHRoZSBzdXJmYWNlIGlzIGFscmVhZHkgbG9ja2VkLCByZXR1cm4gYnVzeSAqLwotICAgIGlmIChUaGlzLT5sb2NrZWQpIHsKLSAgICAgICAgV0FSTigiIFN1cmZhY2UgaXMgYnVzeSwgcmV0dXJuaW5nIERERVJSX1NVUkZBQ0VCVVNZXG4iKTsKLSAgICAgICAgcmV0dXJuIERERVJSX1NVUkZBQ0VCVVNZOwotICAgIH0KLQotICAgIC8qIEZpcnN0LCBjb3B5IHRoZSBTdXJmYWNlIGRlc2NyaXB0aW9uICovCi0gICAgRERfU1RSVUNUX0NPUFlfQllTSVpFKHBERFNELCYoVGhpcy0+c3VyZmFjZV9kZXNjKSk7Ci0KLSAgICAvKiBVc2VkIHRvIG9wdGltaXplIHRoZSBEM0QgRGV2aWNlIGxvY2tpbmcgKi8KLSAgICBUaGlzLT5sYXN0bG9ja3R5cGUgPSBmbGFncyAmIChERExPQ0tfUkVBRE9OTFl8RERMT0NLX1dSSVRFT05MWSk7Ci0gICAgCi0gICAgLyogSWYgYXNrZWQgb25seSBmb3IgYSBwYXJ0LCBjaGFuZ2UgdGhlIHN1cmZhY2UgcG9pbnRlci4KLSAgICAgKiAoTm90IGRvY3VtZW50ZWQuKSAqLwotICAgIGlmIChwcmVjdCAhPSBOVUxMKSB7Ci0JVFJBQ0UoIglscHJlY3Q6ICVsZHglbGQtJWxkeCVsZFxuIiwKLQkJcHJlY3QtPmxlZnQscHJlY3QtPnRvcCxwcmVjdC0+cmlnaHQscHJlY3QtPmJvdHRvbSk7Ci0JLyogRmlyc3QgZG8gc29tZSBzYW5pdHkgY2hlY2tpbmdzIG9uIHRoZSByZWN0YW5nbGUgd2UgcmVjZWl2ZS4KLQkgICBEdW5nZW9uU2llZ2Ugc2VlbXMgdG8gZ2l2ZXMgdXMgb25jZSBhIHZlcnkgYmFkIHJlY3RhbmdsZSBmb3IgZXhhbXBsZSAqLwotCWlmICgocHJlY3QtPnRvcCA8IDApIHx8Ci0JICAgIChwcmVjdC0+bGVmdCA8IDApIHx8Ci0JICAgIChwcmVjdC0+Ym90dG9tIDwgMCkgfHwKLQkgICAgKHByZWN0LT5yaWdodCA8IDApIHx8Ci0JICAgIChwcmVjdC0+bGVmdCA+PSBwcmVjdC0+cmlnaHQpIHx8Ci0JICAgIChwcmVjdC0+dG9wID49IHByZWN0LT5ib3R0b20pIHx8Ci0JICAgIChwcmVjdC0+bGVmdCA+PSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCkgfHwKLQkgICAgKHByZWN0LT5yaWdodCA+IFRoaXMtPnN1cmZhY2VfZGVzYy5kd1dpZHRoKSB8fAotCSAgICAocHJlY3QtPnRvcCA+PSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQpIHx8Ci0JICAgIChwcmVjdC0+Ym90dG9tID4gVGhpcy0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0KSkgewotCSAgICBFUlIoIiBJbnZhbGlkIHZhbHVlcyBpbiBMUFJFQ1QgISEhXG4iKTsKLQkgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JfQotCi0JVGhpcy0+bG9ja191cGRhdGUoVGhpcywgcHJlY3QsIGZsYWdzKTsKLQotCWlmIChwRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykgewotCSAgICBpbnQgYmxrc2l6ZTsKLQkgICAgc3dpdGNoKHBERFNELT51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGb3VyQ0MpIHsKLQkJY2FzZSBNQUtFX0ZPVVJDQygnRCcsJ1gnLCdUJywnMScpIDogYmxrc2l6ZSA9IDg7IGJyZWFrOwotCQljYXNlIE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCczJykgOiBibGtzaXplID0gMTY7IGJyZWFrOwotCQljYXNlIE1BS0VfRk9VUkNDKCdEJywnWCcsJ1QnLCc1JykgOiBibGtzaXplID0gMTY7IGJyZWFrOwotCQlkZWZhdWx0OiByZXR1cm4gRERFUlJfSU5WQUxJRFBJWEVMRk9STUFUOwotCSAgICB9Ci0JICAgIHBERFNELT5scFN1cmZhY2UgPSAoY2hhciAqKVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UKLQkJKyBwcmVjdC0+dG9wLzQgKiAocEREU0QtPmR3V2lkdGgrMykvNCAqIGJsa3NpemUKLQkgICAgCSsgcHJlY3QtPmxlZnQvNCAqIGJsa3NpemU7Ci0JfSBlbHNlCi0JICAgIHBERFNELT5scFN1cmZhY2UgPSAoY2hhciAqKVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UKLQkJKyBwcmVjdC0+dG9wICogVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaAotCQkrIHByZWN0LT5sZWZ0ICogR0VUX0JQUChUaGlzLT5zdXJmYWNlX2Rlc2MpOwotICAgIH0gZWxzZSB7Ci0JVGhpcy0+bG9ja191cGRhdGUoVGhpcywgTlVMTCwgZmxhZ3MpOwotICAgIH0KLQotICAgIFRoaXMtPmxvY2tlZCA9IFRSVUU7Ci0KLSAgICBUUkFDRSgibG9ja2VkIHN1cmZhY2UgcmV0dXJuaW5nIGRlc2NyaXB0aW9uIDpcbiIpOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIEREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKHBERFNEKTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VMb2NrKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkd0ZsYWdzKQotewotICAgIC8qIFNvbWUgc3VyZmFjZSB0eXBlcyBzaG91bGQgcmV0dXJuIERERVJSX0NBTlRQQUdFTE9DSy4gKi8KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VVbmxvY2soTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgLyogU29tZSBzdXJmYWNlIHR5cGVzIHNob3VsZCByZXR1cm4gRERFUlJfQ0FOVFBBR0VVTkxPQ0ssIGFuZCB3ZSBzaG91bGQKLSAgICAgKiBrZWVwIHRyYWNrIHNvIHdlIGNhbiByZXR1cm4gRERFUlJfTk9UUEFHRUxPQ0tFRCBhcyBhcHByb3ByaWF0ZS4gKi8KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2VEQyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgSERDIGhEQykKLXsKLSAgICBIUkVTVUxUIGhyOwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxoREMpOwotCi0gICAgaWYgKCFUaGlzLT5kY19pbl91c2UgfHwgVGhpcy0+aERDICE9IGhEQykKLQlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQotICAgIFRoaXMtPnJlbGVhc2VfZGMoVGhpcywgaERDKTsKLQotICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soaWZhY2UsIE5VTEwpOwotICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7Ci0KLSAgICBUaGlzLT5kY19pbl91c2UgPSBGQUxTRTsKLSAgICBUaGlzLT5oREMgPSAwOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi0vKiBSZXN0b3JlICovCi0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENsaXBwZXIoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICBMUERJUkVDVERSQVdDTElQUEVSIHBERENsaXBwZXIpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBERENsaXBwZXIpOwotICAgIGlmIChwRERDbGlwcGVyID09IElDT01fSU5URVJGQUNFKFRoaXMtPmNsaXBwZXIsIElEaXJlY3REcmF3Q2xpcHBlcikpCi0JcmV0dXJuIEREX09LOwotCi0gICAgaWYgKFRoaXMtPmNsaXBwZXIgIT0gTlVMTCkKLQlJRGlyZWN0RHJhd0NsaXBwZXJfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLT5jbGlwcGVyLAotCQkJCQkJICBJRGlyZWN0RHJhd0NsaXBwZXIpKTsKLQotICAgIFRoaXMtPmNsaXBwZXIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsLCBJRGlyZWN0RHJhd0NsaXBwZXIsCi0JCQkJcEREQ2xpcHBlcik7Ci0gICAgaWYgKHBERENsaXBwZXIgIT0gTlVMTCkKLQlJRGlyZWN0RHJhd0NsaXBwZXJfQWRkUmVmKHBERENsaXBwZXIpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDb2xvcktleShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICBEV09SRCBkd0ZsYWdzLCBMUEREQ09MT1JLRVkgcENLZXkpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0gICAgCi0gICAgVFJBQ0UoIiglcCktPiglMDhseCwlcClcbiIsVGhpcyxkd0ZsYWdzLHBDS2V5KTsKLQotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLSAgICAgICAgVFJBQ0UoIiAtIGNvbG9ya2V5IGZsYWdzIDogIik7Ci0JRERSQVdfZHVtcF9jb2xvcmtleWZsYWcoZHdGbGFncyk7Ci0gICAgfQotCi0gICAgaWYgKChkd0ZsYWdzICYgRERDS0VZX0NPTE9SU1BBQ0UpICE9IDApIHsKLSAgICAgICAgRklYTUUoIiBjb2xvcmtleSB2YWx1ZSBub3Qgc3VwcG9ydGVkICglMDhseCkgIVxuIiwgZHdGbGFncyk7Ci0JcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0gICAgfQotICAgIAotICAgIC8qIFRPRE86IGludmVzdGlnYXRlIGlmIHRoaXMgZnVuY3Rpb24gY2FuIHRha2UgbXVsdGlwbGUgYml0cyBzZXQgYXQgdGhlIHNhbWUKLSAgICAgICAgICAgICB0aW1lIChpZSBzZXR0aW5nIG11bHRpcGxlIGNvbG9ya2V5IHZhbHVlcyBhdCB0aGUgc2FtZSB0aW1lIHdpdGggb25seQotCSAgICAgb25lIEFQSSBjYWxsKS4KLSAgICAqLwotICAgIGlmIChwQ0tleSkgewotICAgICAgICBzd2l0Y2ggKGR3RmxhZ3MgJiB+RERDS0VZX0NPTE9SU1BBQ0UpIHsKLQkgICAgY2FzZSBERENLRVlfREVTVEJMVDoKLQkgICAgICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tEZXN0Qmx0ID0gKnBDS2V5OwotCQlUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX0NLREVTVEJMVDsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBERENLRVlfREVTVE9WRVJMQVk6Ci0JICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MudTMuZGRja0NLRGVzdE92ZXJsYXkgPSAqcENLZXk7Ci0JCVRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzIHw9IEREU0RfQ0tERVNUT1ZFUkxBWTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBERENLRVlfU1JDT1ZFUkxBWToKLQkgICAgICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNPdmVybGF5ID0gKnBDS2V5OwotCQlUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX0NLU1JDT1ZFUkxBWTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBERENLRVlfU1JDQkxUOgotCSAgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmRkY2tDS1NyY0JsdCA9ICpwQ0tleTsKLQkJVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9DS1NSQ0JMVDsKLQkJYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCX0KLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKGR3RmxhZ3MgJiB+RERDS0VZX0NPTE9SU1BBQ0UpIHsKLQkgICAgY2FzZSBERENLRVlfREVTVEJMVDoKLQkJVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJj0gfkREU0RfQ0tERVNUQkxUOwotCQlicmVhazsKLQotCSAgICBjYXNlIEREQ0tFWV9ERVNUT1ZFUkxBWToKLQkJVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJj0gfkREU0RfQ0tERVNUT1ZFUkxBWTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBERENLRVlfU1JDT1ZFUkxBWToKLQkJVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJj0gfkREU0RfQ0tTUkNPVkVSTEFZOwotCQlicmVhazsKLQotCSAgICBjYXNlIEREQ0tFWV9TUkNCTFQ6Ci0JCVRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzICY9IH5ERFNEX0NLU1JDQkxUOwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JfQotICAgIH0KLQotICAgIGlmIChUaGlzLT5hdXhfc2V0Y29sb3JrZXlfY2IpIFRoaXMtPmF1eF9zZXRjb2xvcmtleV9jYihUaGlzLCBkd0ZsYWdzLCBwQ0tleSk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldExPRChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdNYXhMT0QpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCUwOGx4KVxuIixUaGlzLGR3TWF4TE9EKTsKLSAgICBDSEVDS19URVhUVVJFKFRoaXMpOwotCi0gICAgVGhpcy0+bWF4X2xvZCA9IGR3TWF4TE9EOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0T3ZlcmxheVBvc2l0aW9uKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCQkgIExPTkcgWCwgTE9ORyBZKQotewotICAgIHJldHVybiBEREVSUl9OT1RBT1ZFUkxBWVNVUkZBQ0U7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICBMUERJUkVDVERSQVdQQUxFVFRFIHBQYWxldHRlKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotICAgIElEaXJlY3REcmF3UGFsZXR0ZSAqcGFsX3RvX3JlbCA9IE5VTEw7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBQYWxldHRlKTsKLSAgICBpZiAocFBhbGV0dGUgPT0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+cGFsZXR0ZSwgSURpcmVjdERyYXdQYWxldHRlKSkKLQlyZXR1cm4gRERfT0s7Ci0KLSAgICBpZiAoVGhpcy0+cGFsZXR0ZSAhPSBOVUxMKSB7Ci0JaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCi0JICAgIFRoaXMtPnBhbGV0dGUtPmdsb2JhbC5kd0ZsYWdzICY9IH5ERFBDQVBTX1BSSU1BUllTVVJGQUNFOwotCXBhbF90b19yZWwgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5wYWxldHRlLCBJRGlyZWN0RHJhd1BhbGV0dGUpOwotICAgIH0KLQotICAgIFRoaXMtPnBhbGV0dGUgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLCBJRGlyZWN0RHJhd1BhbGV0dGUsCi0JCQkJcFBhbGV0dGUpOwotICAgIGlmIChwUGFsZXR0ZSAhPSBOVUxMKSB7Ci0JSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZihwUGFsZXR0ZSk7Ci0JaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCi0JICAgIFRoaXMtPnBhbGV0dGUtPmdsb2JhbC5kd0ZsYWdzIHw9IEREUENBUFNfUFJJTUFSWVNVUkZBQ0U7Ci0gICAgfQotCi0gICAgVGhpcy0+c2V0X3BhbGV0dGUoVGhpcywgVGhpcy0+cGFsZXR0ZSk7Ci0KLSAgICAvKiBEbyB0aGUgcGFsZXR0ZSByZWxlYXNlIGF0IHRoZSBlbmQgdG8gcHJldmVudCBkb2luZyBzb21lICdsb29wJyB3aGVuIHJlbW92aW5nCi0gICAgICogdGhlIHN1cmZhY2UgbWFpbnRhaW5pbmcgdGhlIGxhc3QgcmVmZXJlbmNlIG9uIGEgcGFsZXR0ZS4KLSAgICAgKi8KLSAgICBpZiAocGFsX3RvX3JlbCAhPSBOVUxMKQotCUlEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKHBhbF90b19yZWwpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQcmlvcml0eShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICBEV09SRCBkd1ByaW9yaXR5KQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPiglMDhseClcbiIsVGhpcyxkd1ByaW9yaXR5KTsKLSAgICBDSEVDS19URVhUVVJFKFRoaXMpOwotCi0gICAgVGhpcy0+cHJpb3JpdHkgPSBkd1ByaW9yaXR5OwotICAgIHJldHVybiBERF9PSzsKLX0KLQotLyogQmUgY2FyZWZ1bCB3aGVuIGxvY2tpbmcgdGhpczogaXQgaXMgcmlza3kgdG8gY2FsbCB0aGUgb2JqZWN0J3MgQWRkUmVmCi0gKiBvciBSZWxlYXNlIGhvbGRpbmcgYSBsb2NrLiAqLwotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpdmF0ZURhdGEoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCi0JCQkJICAgICAgUkVGR1VJRCB0YWcsIExQVk9JRCBwRGF0YSwKLQkJCQkgICAgICBEV09SRCBjYlNpemUsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgUHJpdmF0ZURhdGEqIGRhdGE7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopaWZhY2U7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwKSwgc2l6ZT0lbGRcbiIsIFRoaXMsIHBEYXRhLCBjYlNpemUpOwotCi0gICAgZGF0YSA9IGZpbmRfcHJpdmF0ZV9kYXRhKFRoaXMsIHRhZyk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0JZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoKmRhdGEpKTsKLQlpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7Ci0KLQlkYXRhLT50YWcgPSAqdGFnOwotCWRhdGEtPmZsYWdzID0gZHdGbGFnczsKLQlkYXRhLT51bmlxdWVuZXNzX3ZhbHVlID0gVGhpcy0+dW5pcXVlbmVzc192YWx1ZTsKLQotCWlmIChkd0ZsYWdzICYgRERTUERfSVVOS05PV05QVFIpCi0JewotCSAgICBkYXRhLT5wdHIub2JqZWN0ID0gKExQVU5LTk9XTilwRGF0YTsKLQkgICAgZGF0YS0+c2l6ZSA9IHNpemVvZihMUFVOS05PV04pOwotCSAgICBJVW5rbm93bl9BZGRSZWYoZGF0YS0+cHRyLm9iamVjdCk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIGRhdGEtPnB0ci5kYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGNiU2l6ZSk7Ci0JICAgIGlmIChkYXRhLT5wdHIuZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRhdGEpOwotCQlyZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7Ci0JICAgIH0KLQotICAgICAgICAgICAgZGF0YS0+c2l6ZSA9IGNiU2l6ZTsKLSAgICAgICAgICAgIG1lbWNweShkYXRhLT5wdHIuZGF0YSwgcERhdGEsIGRhdGEtPnNpemUpOwotCX0KLQotCS8qIGxpbmsgaXQgaW4gKi8KLQlkYXRhLT5uZXh0ID0gVGhpcy0+cHJpdmF0ZV9kYXRhOwotCWRhdGEtPnByZXYgPSBOVUxMOwotCWlmIChUaGlzLT5wcml2YXRlX2RhdGEpCi0JICAgIFRoaXMtPnByaXZhdGVfZGF0YS0+cHJldiA9IGRhdGE7Ci0JVGhpcy0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKLQotCXJldHVybiBERF9PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkvKiBJIGRvbid0IGFjdHVhbGx5IGtub3cgaG93IHdpbmRvd3MgaGFuZGxlcyB0aGlzIGNhc2UuIFRoZSBvbmx5Ci0JICogcmVhc29uIEkgZG9uJ3QganVzdCBjYWxsIEZyZWVQcml2YXRlRGF0YSBpcyBiZWNhdXNlIEkgd2FudCB0bwotCSAqIGd1YXJhbnRlZSBTZXRQcml2YXRlRGF0YSB3b3JraW5nIHdoZW4gdXNpbmcgTFBVTktOT1dOIG9yIGRhdGEKLQkgKiB0aGF0IGlzIG5vIGxhcmdlciB0aGFuIHRoZSBvbGQgZGF0YS4gKi8KLQotICAgICAgICBGSVhNRSgiUmVwbGFjaW5nIGV4aXN0aW5nIHByaXZhdGUgZGF0YSBub3QgaW1wbGVtZW50ZWQgeWV0LlxuIik7Ci0JcmV0dXJuIEVfRkFJTDsKLSAgICB9Ci19Ci0KLS8qIFNldFN1cmZhY2VEZXNjICovCi0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0RpcmVjdERyYXdTdXJmYWNlX1VubG9jayhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgTFBSRUNUIHBSZWN0KQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWlmYWNlOwotCi0gICAgVFJBQ0UoIiglcCktPlVubG9jayglcClcbiIsVGhpcyxwUmVjdCk7Ci0KLSAgICBpZiAoIVRoaXMtPmxvY2tlZCkgewotICAgICAgICBXQVJOKCJTdXJmYWNlIG5vdCBsb2NrZWQgLSByZXR1cmluZyBEREVSUl9OT1RMT0NLRURcbiIpOwotICAgICAgICByZXR1cm4gRERFUlJfTk9UTE9DS0VEOwotICAgIH0KLQotICAgIFRoaXMtPmxvY2tlZCA9IEZBTFNFOwotICAgIFRoaXMtPnVubG9ja191cGRhdGUoVGhpcywgcFJlY3QpOwotICAgIGlmIChUaGlzLT5hdXhfdW5sb2NrKQotCVRoaXMtPmF1eF91bmxvY2soVGhpcy0+YXV4X2N0eCwgVGhpcy0+YXV4X2RhdGEsIHBSZWN0KTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkgICAgIExQUkVDVCBwU3JjUmVjdCwKLQkJCQkgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBEc3RTdXJmYWNlLAotCQkJCSAgICAgTFBSRUNUIHBEc3RSZWN0LCBEV09SRCBkd0ZsYWdzLAotCQkJCSAgICAgTFBERE9WRVJMQVlGWCBwRlgpCi17Ci0gICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwotfQotCi0vKiBNU0ROOiAibm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4iICovCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5RGlzcGxheShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKLQkJCQkJICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5Wk9yZGVyKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAotCQkJCQkgICBEV09SRCBkd0ZsYWdzLAotCQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFNyBwRERTUmVmKQotewotICAgIHJldHVybiBEREVSUl9OT1RBT1ZFUkxBWVNVUkZBQ0U7Ci19CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3N1cmZhY2VfdGh1bmtzLmMgYi9kbGxzL2RkcmF3L3N1cmZhY2VfdGh1bmtzLmMKaW5kZXggN2E5ODYxYy4uYmJhNDliZCAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9zdXJmYWNlX3RodW5rcy5jCisrKyBiL2RsbHMvZGRyYXcvc3VyZmFjZV90aHVua3MuYwpAQCAtMTcsNiArMTcsOCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKKyNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKICNpbmNsdWRlICJ3aW5kZWYuaCIKQEAgLTM4LDYgKzQwLDggQEAKIAkJCQkJICAgICBJRGlyZWN0RHJhd1N1cmZhY2UzLAlcCiAJCQkJCSAgICAgKHBkZHMpKQogCitXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CisKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSQogSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywgUkVGSUlEIGlpZCwKIAkJCQkgICAgICAgTFBWT0lEICpwcE9iaikKQEAgLTUyLDkgKzU2LDExIEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkKLUlEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcykKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgaWZhY2UpCiB7Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShDT05WRVJUKFRoaXMpKTsKKyAgICBJQ09NX1RISVNfRlJPTSggSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlMywgaWZhY2UpOworICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKENPTlZFUlQoaWZhY2UpKTsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJCkBAIC0zODksNyArMzk1LDcgQEAKIAkJCQkJICAgICAgZHdGbGFncyk7CiB9CiAKLWNvbnN0IElEaXJlY3REcmF3U3VyZmFjZTNWdGJsIEREUkFXX0lERFMzX1RodW5rX1ZUYWJsZSA9Citjb25zdCBJRGlyZWN0RHJhd1N1cmZhY2UzVnRibCBJRGlyZWN0RHJhd1N1cmZhY2UzX1Z0YmwgPQogewogICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0FkZFJlZiwKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvc3VyZmFjZV91c2VyLmMgYi9kbGxzL2RkcmF3L3N1cmZhY2VfdXNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY2MDg4Li4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvc3VyZmFjZV91c2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzUgKzAsMCBAQAotLyoJVXNlci1iYXNlZCBwcmltYXJ5IHN1cmZhY2UgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDAtMjAwMSBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCi0jaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgotCi1XSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLS8qIGlmIHlvdSB1c2UgT1dOX1dJTkRPVywgZG9uJ3QgdXNlIFNZTkNfVVBEQVRFLCBvciB5b3UgbWF5IGdldCB0cm91YmxlICovCi0vKiAjZGVmaW5lIFNZTkNfVVBEQVRFICovCi0vKgotICogRklYTUU6IFRoaXMgZG9lcyBub3Qgd29yayBhbnkgbW9yZSBiZWNhdXNlIHRoZSBjcmVhdGVkIHdpbmRvdyBoYXMgaXRzIG93bgotICogICAgICAgIHRocmVhZCBxdWV1ZSB0aGF0IGNhbm5vdCBiZSBtYW5pcHVsYXRlZCBieSBhcHBsaWNhdGlvbiB0aHJlYWRzLgotICogI2RlZmluZSBPV05fV0lORE9XCi0gKi8KLQotI2lmZGVmIE9XTl9XSU5ET1cKLXN0YXRpYyB2b2lkIFVzZXJfY3JlYXRlX293bl93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7Ci1zdGF0aWMgdm9pZCBVc2VyX2Rlc3Ryb3lfb3duX3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKLSNlbmRpZgotI2lmbmRlZiBTWU5DX1VQREFURQotc3RhdGljIERXT1JEIENBTExCQUNLIFVzZXJfdXBkYXRlX3RocmVhZChMUFZPSUQpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBVc2VyX2NvcHlfdG9fc2NyZWVuKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcmMpOwotCi1zdGF0aWMgSFdORCBnZXRfZGlzcGxheV93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgTFBQT0lOVCBwdCk7Ci0KLXN0YXRpYyBjb25zdCBJRGlyZWN0RHJhd1N1cmZhY2U3VnRibCBVc2VyX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlOwotCi1IUkVTVUxUCi1Vc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCSBJRGlyZWN0RHJhd0ltcGwqIHBERCwKLQkJCQkgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNEKQotewotICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0gICAgSFJFU1VMVCBocjsKLQotICAgIFRSQUNFKCIoJXAsJXAsJXApXG4iLFRoaXMscERELHBERFNEKTsKLSAgICBociA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoVGhpcywgcERELCBwRERTRCk7Ci0gICAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKLQotICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNywKLQkJCVVzZXJfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGUpOwotCi0gICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZTsKLSAgICBUaGlzLT5kdXBsaWNhdGVfc3VyZmFjZSA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2U7Ci0KLSAgICBUaGlzLT5sb2NrX3VwZGF0ZSAgID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9sb2NrX3VwZGF0ZTsKLSAgICBUaGlzLT51bmxvY2tfdXBkYXRlID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV91bmxvY2tfdXBkYXRlOwotCi0gICAgVGhpcy0+ZmxpcF9kYXRhICAgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YTsKLSAgICBUaGlzLT5mbGlwX3VwZGF0ZSA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF91cGRhdGU7Ci0KLSAgICBUaGlzLT5nZXRfZGMgICAgID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGM7Ci0gICAgVGhpcy0+cmVsZWFzZV9kYyA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfcmVsZWFzZV9kYzsKLQotICAgIFRoaXMtPnNldF9wYWxldHRlICAgID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZTsKLSAgICBUaGlzLT51cGRhdGVfcGFsZXR0ZSA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfdXBkYXRlX3BhbGV0dGU7Ci0KLSAgICBUaGlzLT5nZXRfZ2FtbWFfcmFtcCA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2dhbW1hX3JhbXA7Ci0gICAgVGhpcy0+c2V0X2dhbW1hX3JhbXAgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3NldF9nYW1tYV9yYW1wOwotCi0gICAgVGhpcy0+Z2V0X2Rpc3BsYXlfd2luZG93ID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGlzcGxheV93aW5kb3c7Ci0KLSAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKLSAgICB7Ci0jaWZkZWYgT1dOX1dJTkRPVwotCURpcmVjdERyYXdTdXJmYWNlX1JlZ2lzdGVyQ2xhc3MoKTsKLSNlbmRpZgotI2lmbmRlZiBTWU5DX1VQREFURQotCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJnByaXYtPnVzZXIuY3JpdCk7Ci0JcHJpdi0+dXNlci5yZWZyZXNoX2V2ZW50ID0gQ3JlYXRlRXZlbnRXKE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKLQlwcml2LT51c2VyLnVwZGF0ZV9ldmVudCA9IENyZWF0ZUV2ZW50VyhOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOwotCXByaXYtPnVzZXIudXBkYXRlX3RocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCBVc2VyX3VwZGF0ZV90aHJlYWQsIFRoaXMsIDAsIE5VTEwpOwotI2lmZGVmIE9XTl9XSU5ET1cKLQlpZiAoVGhpcy0+ZGRyYXdfb3duZXItPmNvb3BlcmF0aXZlX2xldmVsICYgRERTQ0xfRlVMTFNDUkVFTikgewotCSAgICAvKiB3YWl0IGZvciB3aW5kb3cgY3JlYXRpb24gKG9yIHVwZGF0ZSB0aHJlYWQgZGVzdHJ1Y3Rpb24pICovCi0JICAgIHdoaWxlIChXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDEsICZwcml2LT51c2VyLnVwZGF0ZV90aHJlYWQsIEZBTFNFLCAxMDApID09IFdBSVRfVElNRU9VVCkKLQkJaWYgKFRoaXMtPm1vcmUubHBERFJBV1Jlc2VydmVkKSBicmVhazsKLQkgICAgaWYgKCFUaGlzLT5tb3JlLmxwRERSQVdSZXNlcnZlZCkgewotCQlFUlIoIndpbmRvdyBjcmVhdGlvbiBmYWlsZWRcbiIpOwotCSAgICB9Ci0JfQotI2VuZGlmCi0jZWxzZQotI2lmZGVmIE9XTl9XSU5ET1cKLQlVc2VyX2NyZWF0ZV9vd25fd2luZG93KFRoaXMpOwotI2VuZGlmCi0jZW5kaWYKLQlpZiAoIVRoaXMtPm1vcmUubHBERFJBV1Jlc2VydmVkKQotCSAgICBUaGlzLT5tb3JlLmxwRERSQVdSZXNlcnZlZCA9IChMUFZPSUQpcERELT53aW5kb3c7Ci0gICAgfQotCi0gICAgcmV0dXJuIERJQl9EaXJlY3REcmF3U3VyZmFjZV9hbGxvY19kYyhUaGlzLCAmcHJpdi0+dXNlci5jYWNoZWRfZGMpOwotfQotCi1IUkVTVUxUCi1Vc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKnBERCwKLQkJCSAgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKLQkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3ICpwcFN1cmYsCi0JCQkgICAgICBJVW5rbm93biAqcFVua091dGVyKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXM7Ci0gICAgSFJFU1VMVCBocjsKLSAgICBhc3NlcnQocFVua091dGVyID09IE5VTEwpOwotCi0gICAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgIHNpemVvZigqVGhpcykgKyBzaXplb2YoVXNlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwpKTsKLSAgICBpZiAoVGhpcyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLQotICAgIFRoaXMtPnByaXZhdGUgPSAoVXNlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwqKShUaGlzKzEpOwotCi0gICAgaHIgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChUaGlzLCBwREQsIHBERFNEKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKLSAgICBlbHNlCi0JKnBwU3VyZiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpOwotCi0gICAgcmV0dXJuIGhyOwotfQotCi12b2lkIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0KLSAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKLSAgICB7Ci0jaWZuZGVmIFNZTkNfVVBEQVRFCi0JSEFORExFIGV2ZW50ID0gcHJpdi0+dXNlci51cGRhdGVfZXZlbnQ7Ci0JcHJpdi0+dXNlci51cGRhdGVfZXZlbnQgPSAwOwotCVNldEV2ZW50KGV2ZW50KTsKLQlUUkFDRSgid2FpdGluZyBmb3IgdXBkYXRlIHRocmVhZCB0byB0ZXJtaW5hdGUuLi5cbiIpOwotI2lmZGVmIE9XTl9XSU5ET1cKLQkvKiBkaXNwYXRjaCBhbnkgd2FpdGluZyBzZW5kbWVzc2FnZXMgKi8KLQl7Ci0JICAgIE1TRyBtc2c7Ci0JICAgIFBlZWtNZXNzYWdlQSgmbXNnLCAwLCAwLCAwLCBQTV9OT1JFTU9WRSk7Ci0JfQotCS8qIHRvIGF2b2lkIGRlYWRsb2NrcywgYWxsb3cgU2VuZE1lc3NhZ2VzIGZyb20gdXBkYXRlIHRocmVhZAotCSAqIHRocm91Z2ggd2hpbGUgd2Ugd2FpdCBmb3IgaXQgKi8KLQl3aGlsZSAoTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cygxLCAmcHJpdi0+dXNlci51cGRhdGVfdGhyZWFkLCBGQUxTRSwKLQkJCQkJIElORklOSVRFLCBRU19TRU5ETUVTU0FHRSkgPT0gV0FJVF9PQkpFQ1RfMCsxKQotCXsKLQkgICAgTVNHIG1zZzsKLQkgICAgUGVla01lc3NhZ2VBKCZtc2csIDAsIDAsIDAsIFBNX05PUkVNT1ZFKTsKLQl9Ci0jZWxzZQotCVdhaXRGb3JTaW5nbGVPYmplY3QocHJpdi0+dXNlci51cGRhdGVfdGhyZWFkLElORklOSVRFKTsKLSNlbmRpZgotCVRSQUNFKCJ1cGRhdGUgdGhyZWFkIHRlcm1pbmF0ZWRcbiIpOwotCUNsb3NlSGFuZGxlKGV2ZW50KTsKLQlDbG9zZUhhbmRsZShwcml2LT51c2VyLnVwZGF0ZV90aHJlYWQpOwotCUNsb3NlSGFuZGxlKHByaXYtPnVzZXIucmVmcmVzaF9ldmVudCk7Ci0JRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZwcml2LT51c2VyLmNyaXQpOwotI2Vsc2UKLSNpZmRlZiBPV05fV0lORE9XCi0JVXNlcl9kZXN0cm95X293bl93aW5kb3coVGhpcyk7Ci0jZW5kaWYKLSNlbmRpZgotCVRoaXMtPm1vcmUubHBERFJBV1Jlc2VydmVkID0gMDsKLSNpZmRlZiBPV05fV0lORE9XCi0JRGlyZWN0RHJhd1N1cmZhY2VfVW5yZWdpc3RlckNsYXNzKCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZyZWVfZGMoVGhpcywgcHJpdi0+dXNlci5jYWNoZWRfZGMpOwotICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKFRoaXMpOwotfQotCi1zdGF0aWMgaW50IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfaW5pdF93YWl0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCi17Ci0gICAgVVNFUl9QUklWX1ZBUihwcml2LCBUaGlzKTsKLSAgICBpbnQgbmVlZF93YWl0OwotICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZwcml2LT51c2VyLmNyaXQpOwotICAgIHByaXYtPnVzZXIud2FpdF9jb3VudCsrOwotICAgIG5lZWRfd2FpdCA9IHByaXYtPnVzZXIuaW5fcmVmcmVzaDsKLSAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmcHJpdi0+dXNlci5jcml0KTsKLSAgICByZXR1cm4gbmVlZF93YWl0OwotfQotCi1zdGF0aWMgdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2VuZF93YWl0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCi17Ci0gICAgVVNFUl9QUklWX1ZBUihwcml2LCBUaGlzKTsKLSAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmcHJpdi0+dXNlci5jcml0KTsKLSAgICBpZiAoIS0tcHJpdi0+dXNlci53YWl0X2NvdW50KQotCVJlc2V0RXZlbnQocHJpdi0+dXNlci5yZWZyZXNoX2V2ZW50KTsKLSAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmcHJpdi0+dXNlci5jcml0KTsKLX0KLQotc3RhdGljIHZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV93YWl0X3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0gICAgaWYgKHByaXYtPnVzZXIuaW5fcmVmcmVzaCkgewotCWlmIChVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2luaXRfd2FpdChUaGlzKSkKLQkgICAgV2FpdEZvclNpbmdsZU9iamVjdChwcml2LT51c2VyLnJlZnJlc2hfZXZlbnQsIDIpOwotCVVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZW5kX3dhaXQoVGhpcyk7Ci0gICAgfQotfQotCi12b2lkIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfbG9ja191cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJTFBDUkVDVCBwUmVjdCwgRFdPUkQgZHdGbGFncykKLXsKLSNpZiAwCi0gICAgaWYgKCEoZHdGbGFncyAmIERETE9DS19XUklURU9OTFkpKQotCVVzZXJfY29weV9mcm9tX3NjcmVlbihUaGlzLCBwUmVjdCk7Ci0jZW5kaWYKLSAgICBpZiAoZHdGbGFncyAmIERETE9DS19XQUlUKSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3dhaXRfdXBkYXRlKFRoaXMpOwotCi0gICAgaWYgKHBSZWN0KSB7Ci0JVGhpcy0+bGFzdGxvY2tyZWN0ID0gKnBSZWN0OwotICAgIH0gZWxzZSB7Ci0JVGhpcy0+bGFzdGxvY2tyZWN0LmxlZnQgPSBUaGlzLT5sYXN0bG9ja3JlY3QucmlnaHQgPSAwOwotICAgIH0KLX0KLQotdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3VubG9ja191cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJICBMUENSRUNUIHBSZWN0KQotewotICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQotICAgIHsKLSNpZmRlZiBTWU5DX1VQREFURQotCVVzZXJfY29weV90b19zY3JlZW4oVGhpcywgcFJlY3QpOwotI2Vsc2UKLQlVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOwotCVNldEV2ZW50KHByaXYtPnVzZXIudXBkYXRlX2V2ZW50KTsKLSNlbmRpZgotICAgIH0KLX0KLQotdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3NldF9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCUlEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCkKLXsKLSAgICBVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOwotCi0gICAgaWYgKCFwYWwpIHsKLQlGSVhNRSgic2VsZWN0aW5nIG51bGwgcGFsZXR0ZVxuIik7Ci0JLyogSSBkb24ndCB0aGluayBzZWxlY3RpbmcgR0RJIG9iamVjdCAwIHdpbGwgd29yaywgd2Ugc2hvdWxkIHNlbGVjdAotCSAqIHRoZSBvcmlnaW5hbCBwYWxldHRlLCByZXR1cm5lZCBieSB0aGUgZmlyc3QgU2VsZWN0UGFsZXR0ZSAqLwotCVNlbGVjdFBhbGV0dGUocHJpdi0+dXNlci5jYWNoZWRfZGMsIDAsIEZBTFNFKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgU2VsZWN0UGFsZXR0ZShwcml2LT51c2VyLmNhY2hlZF9kYywgcGFsLT5ocGFsLCBGQUxTRSk7Ci0KLSAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoVGhpcywgcGFsKTsKLX0KLQotdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCi0JCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKLQkJCQkJICAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKLQkJCQkJICAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KQotewotI2lmbmRlZiBTWU5DX1VQREFURQotICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0jZW5kaWYKLQotICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZShUaGlzLCBwYWwsIGR3U3RhcnQsIGR3Q291bnQsIHBhbGVudCk7Ci0gICAgLyogRklYTUU6IHJlYWxpemUgcGFsZXR0ZSBvbiBkaXNwbGF5IHdpbmRvdyAqLwotCi0jaWZuZGVmIFNZTkNfVVBEQVRFCi0gICAgLyogd2l0aCBhc3luYyB1cGRhdGVzLCBpdCdzIHByb2JhYmx5IGNvb2wgdG8gZm9yY2UgYW4gdXBkYXRlICovCi0gICAgU2V0RXZlbnQocHJpdi0+dXNlci51cGRhdGVfZXZlbnQpOwotI2VuZGlmCi19Ci0KLUhSRVNVTFQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9kdXBsaWNhdGVfc3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcER1cCkKLXsKLSAgICByZXR1cm4gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcy0+ZGRyYXdfb3duZXIsCi0JCQkJCSAmVGhpcy0+c3VyZmFjZV9kZXNjLCBwcER1cCwgTlVMTCk7Ci19Ci0KLUJPT0wgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGEoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogZnJvbnQsCi0JCQkJICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogYmFjaywKLQkJCQkgICAgICBEV09SRCBkd0ZsYWdzKQotewotICAgIFVTRVJfUFJJVl9WQVIoZnJvbnRfcHJpdiwgZnJvbnQpOwotICAgIFVTRVJfUFJJVl9WQVIoYmFja19wcml2LCBiYWNrKTsKLQotICAgIHsKLQlIREMgdG1wOwotCXRtcCA9IGZyb250X3ByaXYtPnVzZXIuY2FjaGVkX2RjOwotCWZyb250X3ByaXYtPnVzZXIuY2FjaGVkX2RjID0gYmFja19wcml2LT51c2VyLmNhY2hlZF9kYzsKLQliYWNrX3ByaXYtPnVzZXIuY2FjaGVkX2RjID0gdG1wOwotICAgIH0KLQotICAgIHJldHVybiBESUJfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF9kYXRhKGZyb250LCBiYWNrLCBkd0ZsYWdzKTsKLX0KLQotdm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIERXT1JEIGR3RmxhZ3MpCi17Ci0jaWZkZWYgU1lOQ19VUERBVEUKLSAgICBUaGlzLT5sYXN0bG9ja3JlY3QubGVmdCA9IFRoaXMtPmxhc3Rsb2NrcmVjdC5yaWdodCA9IDA7Ci0gICAgYXNzZXJ0KFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpOwotICAgIFVzZXJfY29weV90b19zY3JlZW4oVGhpcyxOVUxMKTsKLSNlbHNlCi0gICAgVVNFUl9QUklWX1ZBUihwcml2LCBUaGlzKTsKLSAgICBhc3NlcnQoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSk7Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREZMSVBfV0FJVCkgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV93YWl0X3VwZGF0ZShUaGlzKTsKLSAgICBUaGlzLT5sYXN0bG9ja3JlY3QubGVmdCA9IFRoaXMtPmxhc3Rsb2NrcmVjdC5yaWdodCA9IDA7Ci0gICAgU2V0RXZlbnQocHJpdi0+dXNlci51cGRhdGVfZXZlbnQpOwotI2VuZGlmCi19Ci0KLUhSRVNVTFQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDKiBwaERDKQotewotICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0KLSAgICAqcGhEQyA9IHByaXYtPnVzZXIuY2FjaGVkX2RjOwotICAgIHJldHVybiBTX09LOwotfQotCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfcmVsZWFzZV9kYyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkgIEhEQyBoREMpCi17Ci0gICAgcmV0dXJuIFNfT0s7Ci19Ci0KLUhSRVNVTFQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZ2FtbWFfcmFtcChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAotCQkJCQkgICAgICBEV09SRCBkd0ZsYWdzLAotCQkJCQkgICAgICBMUERER0FNTUFSQU1QIGxwR2FtbWFSYW1wKQotewotICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQotICAgIHsKLQlQT0lOVCBvZmZzZXQ7Ci0JSFdORCBoRGlzcGxheVduZDsKLQlIREMgaERpc3BsYXlEQzsKLQlIUkVTVUxUIGhyOwotCWhEaXNwbGF5V25kID0gZ2V0X2Rpc3BsYXlfd2luZG93KFRoaXMsICZvZmZzZXQpOwotCWhEaXNwbGF5REMgPSBHZXREQ0V4KGhEaXNwbGF5V25kLCAwLCBEQ1hfQ0xJUFNJQkxJTkdTfERDWF9DQUNIRSk7Ci0JaHIgPSBHZXREZXZpY2VHYW1tYVJhbXAoaERpc3BsYXlEQywgbHBHYW1tYVJhbXApID8gRERfT0sgOiBEREVSUl9VTlNVUFBPUlRFRDsKLQlSZWxlYXNlREMoaERpc3BsYXlXbmQsIGhEaXNwbGF5REMpOwotCXJldHVybiBocjsKLSAgICB9Ci0gICAgcmV0dXJuIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2dhbW1hX3JhbXAoVGhpcywgZHdGbGFncywgbHBHYW1tYVJhbXApOwotfQotCi1IUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X2dhbW1hX3JhbXAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKLQkJCQkJICAgICAgRFdPUkQgZHdGbGFncywKLQkJCQkJICAgICAgTFBEREdBTU1BUkFNUCBscEdhbW1hUmFtcCkKLXsKLSAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKLSAgICB7Ci0JUE9JTlQgb2Zmc2V0OwotCUhXTkQgaERpc3BsYXlXbmQ7Ci0JSERDIGhEaXNwbGF5REM7Ci0JSFJFU1VMVCBocjsKLQloRGlzcGxheVduZCA9IGdldF9kaXNwbGF5X3dpbmRvdyhUaGlzLCAmb2Zmc2V0KTsKLQloRGlzcGxheURDID0gR2V0RENFeChoRGlzcGxheVduZCwgMCwgRENYX0NMSVBTSUJMSU5HU3xEQ1hfQ0FDSEUpOwotCWhyID0gU2V0RGV2aWNlR2FtbWFSYW1wKGhEaXNwbGF5REMsIGxwR2FtbWFSYW1wKSA/IEREX09LIDogRERFUlJfVU5TVVBQT1JURUQ7Ci0JUmVsZWFzZURDKGhEaXNwbGF5V25kLCBoRGlzcGxheURDKTsKLQlyZXR1cm4gaHI7Ci0gICAgfQotICAgIHJldHVybiBNYWluX0RpcmVjdERyYXdTdXJmYWNlX3NldF9nYW1tYV9yYW1wKFRoaXMsIGR3RmxhZ3MsIGxwR2FtbWFSYW1wKTsKLX0KLQotLyogUmV0dXJucyB0aGUgd2luZG93IHRoYXQgaG9zdHMgdGhlIGRpc3BsYXkuCi0gKiAqcHQgaXMgc2V0IHRvIHRoZSB1cHBlciBsZWZ0IHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cgcmVsYXRpdmUgdG8gdGhlCi0gKiB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc3VyZmFjZS4gKi8KLXN0YXRpYyBIV05EIGdldF9kaXNwbGF5X3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUFBPSU5UIHB0KQotewotICAgIG1lbXNldChwdCwgMCwgc2l6ZW9mKCpwdCkpOwotCi0gICAgaWYgKFRoaXMtPmRkcmF3X293bmVyLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0ZVTExTQ1JFRU4pCi0gICAgewotI2lmZGVmIE9XTl9XSU5ET1cKLQlVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOwotI2lmIDEKLQlTZXRXaW5kb3dQb3MocHJpdi0+dXNlci53aW5kb3csIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAotCQkgICAgIFNXUF9ERUZFUkVSQVNFfFNXUF9OT0FDVElWQVRFfFNXUF9OT0NPUFlCSVRTfFNXUF9OT01PVkV8Ci0JCSAgICAgU1dQX05PUkVEUkFXfFNXUF9OT1NFTkRDSEFOR0lOR3xTV1BfTk9TSVpFKTsKLSNlbmRpZgotCXJldHVybiBwcml2LT51c2VyLndpbmRvdzsKLSNlbHNlCi0JcmV0dXJuIFRoaXMtPmRkcmF3X293bmVyLT53aW5kb3c7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZiAoVGhpcy0+Y2xpcHBlciAhPSBOVUxMKQotCXsKLQkgICAgLyogbG9va3Mgc2lsbHksIGJ1dCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBjbGlwcGVyIGxvY2tlZCAqLwotCSAgICBIV05EIGhXbmQgPSBUaGlzLT5jbGlwcGVyLT5oV25kOwotCi0JICAgIGlmIChoV25kICE9IDApCi0JICAgIHsKLQkJQ2xpZW50VG9TY3JlZW4oaFduZCwgcHQpOwotCQlyZXR1cm4gaFduZDsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJc3RhdGljIEJPT0wgd2FybiA9IDA7Ci0JCWlmICghd2FybisrKSBGSVhNRSgiY2xpcHBlciBjbGlwIGxpc3RzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCi0JCXJldHVybiBHZXREZXNrdG9wV2luZG93KCk7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkgICAgc3RhdGljIEJPT0wgd2FybiA9IDA7Ci0JICAgIGlmICghd2FybisrKSBXQVJOKCJob3N0aW5nIG9uIHJvb3RcbiIpOwotCi0JICAgIHJldHVybiBHZXREZXNrdG9wV2luZG93KCk7Ci0JfQotICAgIH0KLX0KLQotSFdORCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIFBPSU5UIG9mZnNldDsKLSAgICByZXR1cm4gZ2V0X2Rpc3BsYXlfd2luZG93KFRoaXMsICZvZmZzZXQpOwotfQotCi0jaWZkZWYgT1dOX1dJTkRPVwotc3RhdGljIHZvaWQgVXNlcl9jcmVhdGVfb3duX3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQotewotICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0KLSAgICBpZiAoVGhpcy0+ZGRyYXdfb3duZXItPmNvb3BlcmF0aXZlX2xldmVsICYgRERTQ0xfRlVMTFNDUkVFTikKLSAgICB7Ci0JcHJpdi0+dXNlci53aW5kb3cgPSBDcmVhdGVXaW5kb3dFeEEoV1NfRVhfVE9QTU9TVCB8Ci0JCQkJCSAgICBXU19FWF9MQVlFUkVEIHwKLQkJCQkJICAgIFdTX0VYX1RSQU5TUEFSRU5ULAotCQkJCQkgICAgIldJTkVfRERSQVciLCAiRGlyZWN0RHJhdyIsCi0JCQkJCSAgICBXU19QT1BVUCwKLQkJCQkJICAgIDAsIDAsCi0JCQkJCSAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCwKLQkJCQkJICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCwKLQkJCQkJICAgIEdldERlc2t0b3BXaW5kb3coKSwKLQkJCQkJICAgIDAsIDAsIFRoaXMpOwotCVRoaXMtPm1vcmUubHBERFJBV1Jlc2VydmVkID0gKExQVk9JRClwcml2LT51c2VyLndpbmRvdzsKLQlTZXRXaW5kb3dQb3MocHJpdi0+dXNlci53aW5kb3csIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAotCQkgICAgIFNXUF9ERUZFUkVSQVNFfFNXUF9OT0FDVElWQVRFfFNXUF9OT0NPUFlCSVRTfFNXUF9OT01PVkV8Ci0JCSAgICAgU1dQX05PUkVEUkFXfFNXUF9OT1NFTkRDSEFOR0lOR3xTV1BfTk9TSVpFfFNXUF9TSE9XV0lORE9XKTsKLQlVcGRhdGVXaW5kb3cocHJpdi0+dXNlci53aW5kb3cpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgVXNlcl9kZXN0cm95X293bl93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKLXsKLSAgICBVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOwotCi0gICAgaWYgKHByaXYtPnVzZXIud2luZG93KQotICAgIHsKLQlTZXRXaW5kb3dQb3MocHJpdi0+dXNlci53aW5kb3csIDAsIDAsIDAsIDAsIDAsCi0JCSAgICAgU1dQX0RFRkVSRVJBU0V8U1dQX05PQUNUSVZBVEV8U1dQX05PQ09QWUJJVFN8U1dQX05PTU9WRXxTV1BfTk9aT1JERVJ8Ci0JCSAgICAgU1dQX05PUkVEUkFXfFNXUF9OT1NFTkRDSEFOR0lOR3xTV1BfTk9TSVpFfFNXUF9ISURFV0lORE9XKTsKLQlUaGlzLT5tb3JlLmxwRERSQVdSZXNlcnZlZCA9IE5VTEw7Ci0JRGVzdHJveVdpbmRvdyhwcml2LT51c2VyLndpbmRvdyk7Ci0JcHJpdi0+dXNlci53aW5kb3cgPSAwOwotICAgIH0KLX0KLSNlbmRpZgotCi0jaWZuZGVmIFNZTkNfVVBEQVRFCi1zdGF0aWMgRFdPUkQgQ0FMTEJBQ0sgVXNlcl91cGRhdGVfdGhyZWFkKExQVk9JRCBhcmcpCi17Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyA9IChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICopYXJnOwotICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7Ci0gICAgdm9sYXRpbGUgSEFORExFICpwQWN0aXZlID0gKHZvbGF0aWxlIEhBTkRMRSAqKSZwcml2LT51c2VyLnVwZGF0ZV9ldmVudDsKLSAgICBIQU5ETEUgZXZlbnQgPSAqcEFjdGl2ZTsKLQotI2lmZGVmIE9XTl9XSU5ET1cKLSAgICBVc2VyX2NyZWF0ZV9vd25fd2luZG93KFRoaXMpOwotI2VuZGlmCi0KLSAgICAvKiB0aGUgcG9pbnQgb2YgdGhpcyBpcyB0aGF0IG1hbnkgZ2FtZXMgbG9jayB0aGUgcHJpbWFyeSBzdXJmYWNlCi0gICAgICogbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lOyB0aGlzIHRocmVhZCB3aWxsIHRoZW4gc2ltcGx5IGNvcHkgYXMKLSAgICAgKiBvZnRlbiBhcyBpdCBjYW4gd2l0aG91dCBrZWVwaW5nIHRoZSBtYWluIHRocmVhZCB3YWl0aW5nIGZvcgotICAgICAqIGVhY2ggdW5sb2NrLCB0aHVzIGtlZXBpbmcgdGhlIGZyYW1lIHJhdGUgaGlnaCAqLwotICAgIGRvIHsKLSNpZmRlZiBPV05fV0lORE9XCi0JRFdPUkQgcmV0ID0gTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cygxLCAmZXZlbnQsIEZBTFNFLCBJTkZJTklURSwgUVNfQUxMSU5QVVQpOwotCU1TRyBtc2c7Ci0KLQl3aGlsZSAoUGVla01lc3NhZ2VBKCZtc2csIDAsIDAsIDAsIFBNX1JFTU9WRSkpCi0JewotCSAgICBzd2l0Y2ggKG1zZy5tZXNzYWdlKSB7Ci0JICAgIGNhc2UgV01fUEFJTlQ6Ci0JCURpc3BhdGNoTWVzc2FnZUEoJm1zZyk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQkvKiBzaW5jZSB3ZSByaXNrIGdldHRpbmcga2V5Ym9hcmQgbWVzc2FnZXMgcG9zdGVkIHRvIHVzLAotCQkgKiByZXBvc3QgcG9zdGVkIG1lc3NhZ2VzIHRvIGNvb3BlcmF0aXZlIHdpbmRvdyAqLwotCQlQb3N0TWVzc2FnZUEoVGhpcy0+ZGRyYXdfb3duZXItPndpbmRvdywgbXNnLm1lc3NhZ2UsIG1zZy53UGFyYW0sIG1zZy5sUGFyYW0pOwotCSAgICB9Ci0JfQotI2Vsc2UKLQlEV09SRCByZXQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGV2ZW50LCBJTkZJTklURSk7Ci0jZW5kaWYKLQlpZiAocmV0ID09IFdBSVRfT0JKRUNUXzApCi0JewotCSAgICBpZiAoKnBBY3RpdmUpIHsKLQkJcHJpdi0+dXNlci5pbl9yZWZyZXNoID0gVFJVRTsKLQkJVXNlcl9jb3B5X3RvX3NjcmVlbihUaGlzLCBOVUxMKTsKLQkJRW50ZXJDcml0aWNhbFNlY3Rpb24oJnByaXYtPnVzZXIuY3JpdCk7Ci0JCXByaXYtPnVzZXIuaW5fcmVmcmVzaCA9IEZBTFNFOwotCQlpZiAocHJpdi0+dXNlci53YWl0X2NvdW50KQotCQkgICAgU2V0RXZlbnQocHJpdi0+dXNlci5yZWZyZXNoX2V2ZW50KTsKLQkJTGVhdmVDcml0aWNhbFNlY3Rpb24oJnByaXYtPnVzZXIuY3JpdCk7Ci0JICAgIH0gZWxzZQotCQlicmVhazsKLQl9Ci0JZWxzZSBpZiAocmV0ICE9IFdBSVRfT0JKRUNUXzArMSkgYnJlYWs7Ci0gICAgfSB3aGlsZSAoVFJVRSk7Ci0KLSAgICBTZXRFdmVudChwcml2LT51c2VyLnJlZnJlc2hfZXZlbnQpOwotI2lmZGVmIE9XTl9XSU5ET1cKLSAgICBVc2VyX2Rlc3Ryb3lfb3duX3dpbmRvdyhUaGlzKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgVXNlcl9jb3B5X3RvX3NjcmVlbihJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHJjKQotewotICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQotICAgIHsKLQlQT0lOVCBvZmZzZXQ7Ci0JSFdORCBoRGlzcGxheVduZDsKLQlIREMgaERpc3BsYXlEQzsKLQlIREMgaFN1cmZhY2VEQzsKLQlSRUNUIGRyYXdyZWN0OwotCi0JaWYgKEZBSUxFRChUaGlzLT5nZXRfZGMoVGhpcywgJmhTdXJmYWNlREMpKSkKLQkgICAgcmV0dXJuOwotCi0JaERpc3BsYXlXbmQgPSBnZXRfZGlzcGxheV93aW5kb3coVGhpcywgJm9mZnNldCk7Ci0JaERpc3BsYXlEQyA9IEdldERDRXgoaERpc3BsYXlXbmQsIDAsIERDWF9DTElQU0lCTElOR1N8RENYX0NBQ0hFKTsKLSNpZiAwCi0JLyogRklYTUU6IHRoaXMgZG9lc24ndCB3b3JrLi4uIGlmIHVzZXJzIHJlYWxseSB3YW50IHRvIHJ1bgotCSAqIFggaW4gOGJwcCwgdGhlbiB3ZSBuZWVkIHRvIGNhbGwgZGlyZWN0bHkgaW50byBkaXNwbGF5LmRydgotCSAqIChvciBXaW5lJ3MgZXF1aXZhbGVudCksIGFuZCBmb3JjZSBhIHByaXZhdGUgY29sb3JtYXAKLQkgKiB3aXRob3V0IGRlZmF1bHQgZW50cmllcy4gKi8KLQlpZiAoVGhpcy0+cGFsZXR0ZSkgewotCSAgICBTZWxlY3RQYWxldHRlKGhEaXNwbGF5REMsIFRoaXMtPnBhbGV0dGUtPmhwYWwsIEZBTFNFKTsKLQkgICAgUmVhbGl6ZVBhbGV0dGUoaERpc3BsYXlEQyk7IC8qIHNlbmRzIG1lc3NhZ2VzID0+IGRlYWRsb2NrcyAqLwotCX0KLSNlbmRpZgotCWRyYXdyZWN0LmxlZnQJPSAwOwotCWRyYXdyZWN0LnJpZ2h0CT0gVGhpcy0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7Ci0JZHJhd3JlY3QudG9wCT0gMDsKLQlkcmF3cmVjdC5ib3R0b20JPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7Ci0KLQlpZiAoVGhpcy0+Y2xpcHBlcikgewotCSAgICBSRUNUIHhyYzsKLQkgICAgSFdORCBod25kID0gVGhpcy0+Y2xpcHBlci0+aFduZDsKLQkgICAgaWYgKGh3bmQgJiYgR2V0Q2xpZW50UmVjdChod25kLCZ4cmMpKSB7Ci0JCU9mZnNldFJlY3QoJnhyYyxvZmZzZXQueCxvZmZzZXQueSk7Ci0JCUludGVyc2VjdFJlY3QoJmRyYXdyZWN0LCZkcmF3cmVjdCwmeHJjKTsKLQkgICAgfQotCX0KLQlpZiAocmMpCi0JICAgIEludGVyc2VjdFJlY3QoJmRyYXdyZWN0LCZkcmF3cmVjdCxyYyk7Ci0JZWxzZSB7Ci0JICAgIC8qIE9ubHkgdXNlIHRoaXMgaWYgdGhlIGNhbGxlciBkaWQgbm90IHBhc3MgYSByZWN0YW5nbGUsIHNpbmNlCi0JICAgICAqIGR1ZSB0byBkb3VibGUgbG9ja2luZyB0aGlzIGNvdWxkIGJlIHRoZSB3cm9uZyBvbmUgLi4uICovCi0JICAgIGlmIChUaGlzLT5sYXN0bG9ja3JlY3QubGVmdCAhPSBUaGlzLT5sYXN0bG9ja3JlY3QucmlnaHQpCi0JCUludGVyc2VjdFJlY3QoJmRyYXdyZWN0LCZkcmF3cmVjdCwmVGhpcy0+bGFzdGxvY2tyZWN0KTsKLQl9Ci0JQml0Qmx0KGhEaXNwbGF5REMsCi0JCWRyYXdyZWN0LmxlZnQtb2Zmc2V0LngsIGRyYXdyZWN0LnRvcC1vZmZzZXQueSwKLQkJZHJhd3JlY3QucmlnaHQtZHJhd3JlY3QubGVmdCwgZHJhd3JlY3QuYm90dG9tLWRyYXdyZWN0LnRvcCwKLQkJaFN1cmZhY2VEQywKLQkJZHJhd3JlY3QubGVmdCwgZHJhd3JlY3QudG9wLAotCQlTUkNDT1BZCi0JKTsKLQlSZWxlYXNlREMoaERpc3BsYXlXbmQsIGhEaXNwbGF5REMpOwotICAgIH0KLX0KLQotI2lmIDAKLXN0YXRpYyB2b2lkIFVzZXJfY29weV9mcm9tX3NjcmVlbihJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHJjKQotewotICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQotICAgIHsKLQlQT0lOVCBvZmZzZXQ7Ci0JSFdORCBoRGlzcGxheVduZCA9IGdldF9kaXNwbGF5X3dpbmRvdyhUaGlzLCAmb2Zmc2V0KTsKLQlIREMgaERpc3BsYXlEQyA9IEdldERDKGhEaXNwbGF5V25kKTsKLQlSRUNUIGRyYXdyZWN0OwotCi0JZHJhd3JlY3QubGVmdAk9IDA7Ci0JZHJhd3JlY3QucmlnaHQJPSBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aDsKLQlkcmF3cmVjdC50b3AJPSAwOwotCWRyYXdyZWN0LmJvdHRvbQk9IFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLQlpZiAocmMpCi0JICAgIEludGVyc2VjdFJlY3QoJmRyYXdyZWN0LCZkcmF3cmVjdCxyYyk7Ci0KLQlCaXRCbHQoVGhpcy0+aERDLAotCSAgICBkcmF3cmVjdC5sZWZ0LCBkcmF3cmVjdC50b3AsCi0JICAgIGRyYXdyZWN0LnJpZ2h0LWRyYXdyZWN0LmxlZnQsIGRyYXdyZWN0LmJvdHRvbS1kcmF3cmVjdC50b3AsCi0JICAgIGhEaXNwbGF5REMsCi0JICAgIGRyYXdyZWN0LmxlZnQrb2Zmc2V0LngsIGRyYXdyZWN0LnRvcCtvZmZzZXQueSwKLQkgICAgU1JDQ09QWQotCSk7Ci0JUmVsZWFzZURDKGhEaXNwbGF5V25kLCBoRGlzcGxheURDKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IElEaXJlY3REcmF3U3VyZmFjZTdWdGJsIFVzZXJfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGUgPQotewotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRSZWYsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdCwKLSAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQmx0QmF0Y2gsCi0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3QsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9EZWxldGVBdHRhY2hlZFN1cmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtQXR0YWNoZWRTdXJmYWNlcywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0VudW1PdmVybGF5Wk9yZGVycywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZsaXAsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRBdHRhY2hlZFN1cmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRCbHRTdGF0dXMsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDYXBzLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2xpcHBlciwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENvbG9yS2V5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0REMsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRGbGlwU3RhdHVzLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0T3ZlcmxheVBvc2l0aW9uLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGFsZXR0ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBpeGVsRm9ybWF0LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jbml0aWFsaXplLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSXNMb3N0LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfTG9jaywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2VEQywKLSAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfUmVzdG9yZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENsaXBwZXIsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDb2xvcktleSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldE92ZXJsYXlQb3NpdGlvbiwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VbmxvY2ssCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheURpc3BsYXksCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5Wk9yZGVyLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RERJbnRlcmZhY2UsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9QYWdlTG9jaywKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VVbmxvY2ssCi0gICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX1NldFN1cmZhY2VEZXNjLAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpdmF0ZURhdGEsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcml2YXRlRGF0YSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZyZWVQcml2YXRlRGF0YSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFVuaXF1ZW5lc3NWYWx1ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZSwKLSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaW9yaXR5LAotICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpb3JpdHksCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRMT0QsCi0gICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRMT0QKLX07CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3N1cmZhY2Vfd25kcHJvYy5jIGIvZGxscy9kZHJhdy9zdXJmYWNlX3duZHByb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzNmM0OC4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L3N1cmZhY2Vfd25kcHJvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCVVzZXItYmFzZWQgcHJpbWFyeSBzdXJmYWNlIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJ3aW5lcnJvci5oIgotCi0jaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgotCi0jaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgotCi1XSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLXN0YXRpYyBMUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3U3VyZmFjZV9XbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotCi12b2lkIERpcmVjdERyYXdTdXJmYWNlX1JlZ2lzdGVyQ2xhc3Modm9pZCkKLXsKLSAgICBXTkRDTEFTU0Egd2M7Ci0gICAgbWVtc2V0KCZ3YywgMCwgc2l6ZW9mKHdjKSk7Ci0gICAgd2MubHBmblduZFByb2MgPSBEaXJlY3REcmF3U3VyZmFjZV9XbmRQcm9jOwotICAgIHdjLmNiV25kRXh0cmEgID0gc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZUltcGwqKTsKLSAgICB3Yy5oQ3Vyc29yICAgICA9IChIQ1VSU09SKUlEQ19BUlJPVzsKLSAgICB3Yy5scHN6Q2xhc3NOYW1lID0gIldJTkVfRERSQVciOwotICAgIFJlZ2lzdGVyQ2xhc3NBKCZ3Yyk7Ci19Ci0KLXZvaWQgRGlyZWN0RHJhd1N1cmZhY2VfVW5yZWdpc3RlckNsYXNzKHZvaWQpCi17Ci0gICAgVW5yZWdpc3RlckNsYXNzQSgiV0lORV9ERFJBVyIsIDApOwotfQotCi1zdGF0aWMgTFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd1N1cmZhY2VfV25kUHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXM7Ci0gICAgTFJFU1VMVCByZXQ7Ci0KLSAgICBUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilHZXRXaW5kb3dMb25nUHRyQShod25kLCAwKTsKLSAgICBpZiAoVGhpcykgewotCUhXTkQgd2luZG93ID0gVGhpcy0+ZGRyYXdfb3duZXItPndpbmRvdzsKLQotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBXTV9ERVNUUk9ZOgotCWNhc2UgV01fTkNERVNUUk9ZOgotCWNhc2UgV01fU0hPV1dJTkRPVzoKLQljYXNlIFdNX1dJTkRPV1BPU0NIQU5HSU5HOgotCWNhc2UgV01fV0lORE9XUE9TQ0hBTkdFRDoKLQljYXNlIFdNX1NJWkU6Ci0JY2FzZSBXTV9NT1ZFOgotCWNhc2UgV01fRVJBU0VCS0dORDoKLQljYXNlIFdNX1NZTkNQQUlOVDoKLQkgICAgLyogc2luY2Ugd2UncmUgcHJldGVuZGluZyBmdWxsc2NyZWVuLAotCSAgICAgKiBsZXQncyBub3QgcGFzcyB0aGVzZSBvbiB0byB0aGUgYXBwICovCi0JICAgIHJldCA9IERlZldpbmRvd1Byb2NBKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwotCSAgICBicmVhazsKLQljYXNlIFdNX05DSElUVEVTVDoKLQkgICAgcmV0ID0gSFRDTElFTlQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgV01fTU9VU0VBQ1RJVkFURToKLQkgICAgcmV0ID0gTUFfTk9BQ1RJVkFURTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBXTV9QQUlOVDoKLQkgICAgewotCQlQQUlOVFNUUlVDVCBwczsKLQkJSERDIGRjOwotCQlkYyA9IEJlZ2luUGFpbnQoaHduZCwgJnBzKTsKLQkJLyogY2FsbCBVc2VyX2NvcHlfdG9fc2NyZWVuPyAqLwotCQlFbmRQYWludChod25kLCAmcHMpOwotCQlyZXQgPSAwOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHJldCA9IHdpbmRvdyA/IFNlbmRNZXNzYWdlQSh3aW5kb3csIG1zZywgd1BhcmFtLCBsUGFyYW0pCi0JCQkgOiBEZWZXaW5kb3dQcm9jQShod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiAobXNnID09IFdNX0NSRUFURSkgewotCSAgICBDUkVBVEVTVFJVQ1RBICpjcyA9IChDUkVBVEVTVFJVQ1RBICopbFBhcmFtOwotCSAgICBUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKiljcy0+bHBDcmVhdGVQYXJhbXM7Ci0JICAgIFNldFdpbmRvd0xvbmdQdHJBKGh3bmQsIDAsIChMT05HX1BUUilUaGlzKTsKLQl9Ci0JcmV0ID0gRGVmV2luZG93UHJvY0EoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3Rlc3RzL2QzZC5jIGIvZGxscy9kZHJhdy90ZXN0cy9kM2QuYwppbmRleCBkZWYzZmFlLi44N2YwMjMxIDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L3Rlc3RzL2QzZC5jCisrKyBiL2RsbHMvZGRyYXcvdGVzdHMvZDNkLmMKQEAgLTMyMCw1MyArMzIwLDI5IEBACiAgICAgaWYoIW91dCkgZ290byBvdXQ7CiAKICAgICAvKiBDaGVjayB0aGUgcmVzdWx0cyAqLwotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFswXS54LCAxMjguMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnksIDEyOC4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMF0ueiwgMC4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMF0ucmh3LCAxLjAgKSkKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAwIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMF0ueCwgb3V0WzBdLnksIG91dFswXS56LCBvdXRbMF0ucmh3KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKFRSVUUsICJPdXRwdXQgMCB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzBdLngsIG91dFswXS55LCBvdXRbMF0ueiwgb3V0WzBdLnJodyk7Ci0gICAgfQorICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzBdLngsIDEyOC4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS55LCAxMjguMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMF0ueiwgMC4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS5yaHcsIDEuMCApLAorICAgICAgICAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwogCi0gICAgaWYoICFjb21wYXJlZmxvYXQob3V0WzFdLngsIDI1Ni4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ueSwgMC4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ueiwgMS4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ucmh3LCAxLjAgKSkKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAxIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKFRSVUUsICJPdXRwdXQgMSB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzFdLngsIG91dFsxXS55LCBvdXRbMV0ueiwgb3V0WzFdLnJodyk7Ci0gICAgfQorICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzFdLngsIDI1Ni4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFsxXS55LCAwLjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzFdLnosIDEuMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMV0ucmh3LCAxLjAgKSwKKyAgICAgICAgIk91dHB1dCAxIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKIAotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFsyXS54LCAwLjAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsyXS55LCAyNTYuMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzJdLnosIDAuNSApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzJdLnJodywgMS4wICkpCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soRkFMU0UsICJPdXRwdXQgMiB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzJdLngsIG91dFsyXS55LCBvdXRbMl0ueiwgb3V0WzJdLnJodyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDIgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsyXS54LCBvdXRbMl0ueSwgb3V0WzJdLnosIG91dFsyXS5yaHcpOwotICAgIH0KKyAgICBvayggY29tcGFyZWZsb2F0KG91dFsyXS54LCAwLjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnksIDI1Ni4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFsyXS56LCAwLjUgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnJodywgMS4wICksCisgICAgICAgICJPdXRwdXQgMiB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzJdLngsIG91dFsyXS55LCBvdXRbMl0ueiwgb3V0WzJdLnJodyk7CiAKLSAgICBpZiggIWNvbXBhcmVmbG9hdChvdXRbM10ueCwgMTkyLjAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFszXS55LCAxOTIuMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnosIDAuMjUgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFszXS5yaHcsIDEuMCApKQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAzIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbM10ueCwgb3V0WzNdLnksIG91dFszXS56LCBvdXRbM10ucmh3KTsKLSAgICB9CisgICAgb2soIGNvbXBhcmVmbG9hdChvdXRbM10ueCwgMTkyLjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnksIDE5Mi4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFszXS56LCAwLjI1ICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFszXS5yaHcsIDEuMCApLAorICAgICAgICAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwogCiAgICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1VubG9jayhscFZCdWZEZXN0MSk7CiAgICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlVubG9jayByZXR1cm5lZDogJWx4XG4iLCByYyk7CkBAIC0zNzksMTYgKzM1NSwxMCBAQAogICAgICAqIHNvIGxldCdzIGNoZWNrIGZvciBpdDogSWYgdGhlIG91dHB1dCB2ZXJ0ZXggYnVmZmVyIGhhcyB0byBSSFcgdmFsdWUsCiAgICAgICogVGhlIFJIVyB2YWx1ZSBvZiB0aGUgbGFzdCB2ZXJ0ZXggaXMgd3JpdHRlbiBpbnRvIHRoZSBuZXh0IHZlcnRleAogICAgICAqLwotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dDJbNF0ueCwgMS4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXQyWzRdLnksIDAuMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0Mls0XS56LCAwLjAgKSApCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soRkFMU0UsICJPdXRwdXQgNCB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZilcbiIsIG91dDJbNF0ueCwgb3V0Mls0XS55LCBvdXQyWzRdLnopOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCA0IHZlcnRleCBpcyAoJWYgLCAlZiAsICVmKVxuIiwgb3V0Mls0XS54LCBvdXQyWzRdLnksIG91dDJbNF0ueik7Ci0gICAgfQorICAgIG9rKCBjb21wYXJlZmxvYXQob3V0Mls0XS54LCAxLjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0Mls0XS55LCAwLjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0Mls0XS56LCAwLjAgKSwKKyAgICAgICAgIk91dHB1dCA0IHZlcnRleCBpcyAoJWYgLCAlZiAsICVmKVxuIiwgb3V0Mls0XS54LCBvdXQyWzRdLnksIG91dDJbNF0ueik7CiAKICAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVW5sb2NrKGxwVkJ1ZkRlc3QyKTsKICAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6VW5sb2NrIHJldHVybmVkOiAlbHhcbiIsIHJjKTsKQEAgLTQxNCw1MyArMzg0LDI5IEBACiAgICAgaWYoIW91dCkgZ290byBvdXQ7CiAKICAgICAvKiBDaGVjayB0aGUgcmVzdWx0cyAqLwotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFswXS54LCAxMzMuMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnksIDcwLjAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFswXS56LCAtMi4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMF0ucmh3LCAxLjAgKSkKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAwIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMF0ueCwgb3V0WzBdLnksIG91dFswXS56LCBvdXRbMF0ucmh3KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKFRSVUUsICJPdXRwdXQgMCB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzBdLngsIG91dFswXS55LCBvdXRbMF0ueiwgb3V0WzBdLnJodyk7Ci0gICAgfQorICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzBdLngsIDEzMy4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS55LCA3MC4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS56LCAtMi4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS5yaHcsIDEuMCApLAorICAgICAgICAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwogCi0gICAgaWYoICFjb21wYXJlZmxvYXQob3V0WzFdLngsIDI1Ni4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ueSwgNS4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ueiwgNC4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ucmh3LCAxLjAgKSkKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAxIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKFRSVUUsICJPdXRwdXQgMSB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzFdLngsIG91dFsxXS55LCBvdXRbMV0ueiwgb3V0WzFdLnJodyk7Ci0gICAgfQorICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzFdLngsIDI1Ni4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFsxXS55LCA1LjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzFdLnosIDQuMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMV0ucmh3LCAxLjAgKSwKKyAgICAgICAgIk91dHB1dCAxIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKIAotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFsyXS54LCAxMC4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMl0ueSwgMTM1LjAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsyXS56LCAxLjAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsyXS5yaHcsIDEuMCApKQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDIgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAyIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKLSAgICB9CisgICAgb2soIGNvbXBhcmVmbG9hdChvdXRbMl0ueCwgMTAuMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMl0ueSwgMTM1LjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnosIDEuMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMl0ucmh3LCAxLjAgKSwKKyAgICAgICAgIk91dHB1dCAyIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKIAotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFszXS54LCAxOTQuNSApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnksIDEwMi41ICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbM10ueiwgLTAuNSApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnJodywgMS4wICkpCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soRkFMU0UsICJPdXRwdXQgMyB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzNdLngsIG91dFszXS55LCBvdXRbM10ueiwgb3V0WzNdLnJodyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwotICAgIH0KKyAgICBvayggY29tcGFyZWZsb2F0KG91dFszXS54LCAxOTQuNSApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbM10ueSwgMTAyLjUgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnosIC0wLjUgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnJodywgMS4wICksCisgICAgICAgICJPdXRwdXQgMyB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzNdLngsIG91dFszXS55LCBvdXRbM10ueiwgb3V0WzNdLnJodyk7CiAKICAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVW5sb2NrKGxwVkJ1ZkRlc3QxKTsKICAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6VW5sb2NrIHJldHVybmVkOiAlbHhcbiIsIHJjKTsKQEAgLTQ5NSw1MyArNDQxLDI5IEBACiAgICAgb2socmM9PUQzRF9PSywgIklEaXJlY3QzRERldmljZTdfU2V0Vmlld3BvcnQgZmFpbGVkXG4iKTsKIAogICAgIC8qIENoZWNrIHRoZSByZXN1bHRzICovCi0gICAgaWYoICFjb21wYXJlZmxvYXQob3V0WzBdLngsIDI1Ni4wICkgfHwgICAgLyogWCBjb29yZGluYXRlIGlzIGN1dCBhdCB0aGUgc3VyZmFjZSBlZGdlcyAqLwotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFswXS55LCA3MC4wICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMF0ueiwgLTIuMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnJodywgKDEuMCAvIDMuMCkpKQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAwIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMF0ueCwgb3V0WzBdLnksIG91dFswXS56LCBvdXRbMF0ucmh3KTsKLSAgICB9CisgICAgb2soIGNvbXBhcmVmbG9hdChvdXRbMF0ueCwgMjU2LjAgKSAmJiAgICAvKiBYIGNvb3JkaW5hdGUgaXMgY3V0IGF0IHRoZSBzdXJmYWNlIGVkZ2VzICovCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMF0ueSwgNzAuMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMF0ueiwgLTIuMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMF0ucmh3LCAoMS4wIC8gMy4wKSksCisgICAgICAgICJPdXRwdXQgMCB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzBdLngsIG91dFswXS55LCBvdXRbMF0ueiwgb3V0WzBdLnJodyk7CiAKLSAgICBpZiggIWNvbXBhcmVmbG9hdChvdXRbMV0ueCwgMjU2LjAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsxXS55LCA3OC4xMjUwMDAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsxXS56LCAtMi43NTAwMDAgKSB8fAotICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsxXS5yaHcsIDAuMTI1MDAwICkpCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soRkFMU0UsICJPdXRwdXQgMSB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzFdLngsIG91dFsxXS55LCBvdXRbMV0ueiwgb3V0WzFdLnJodyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDEgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwotICAgIH0KKyAgICBvayggY29tcGFyZWZsb2F0KG91dFsxXS54LCAyNTYuMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMV0ueSwgNzguMTI1MDAwICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFsxXS56LCAtMi43NTAwMDAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzFdLnJodywgMC4xMjUwMDAgKSwKKyAgICAgICAgIk91dHB1dCAxIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKIAotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFsyXS54LCAyNTYuMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzJdLnksIDQ0LjAwMDAwMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzJdLnosIDAuNDAwMDAwICkgfHwKLSAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMl0ucmh3LCAwLjQwMDAwMCApKQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDIgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsyXS54LCBvdXRbMl0ueSwgb3V0WzJdLnosIG91dFsyXS5yaHcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAyIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMl0ueCwgb3V0WzJdLnksIG91dFsyXS56LCBvdXRbMl0ucmh3KTsKLSAgICB9CisgICAgb2soIGNvbXBhcmVmbG9hdChvdXRbMl0ueCwgMjU2LjAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnksIDQ0LjAwMDAwMCApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMl0ueiwgMC40MDAwMDAgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnJodywgMC40MDAwMDAgKSwKKyAgICAgICAgIk91dHB1dCAyIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMl0ueCwgb3V0WzJdLnksIG91dFsyXS56LCBvdXRbMl0ucmh3KTsKIAotICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFszXS54LCAyNTYuMCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnksIDgxLjgxODE4NCApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnosIC0zLjA5MDkwOSApIHx8Ci0gICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnJodywgMC4zNjM2MzYgKSkKLSAgICB7Ci0gICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAzIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbM10ueCwgb3V0WzNdLnksIG91dFszXS56LCBvdXRbM10ucmh3KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG9kb193aW5lIG9rKFRSVUUsICJPdXRwdXQgMyB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzNdLngsIG91dFszXS55LCBvdXRbM10ueiwgb3V0WzNdLnJodyk7Ci0gICAgfQorICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzNdLngsIDI1Ni4wICkgJiYKKyAgICAgICAgY29tcGFyZWZsb2F0KG91dFszXS55LCA4MS44MTgxODQgKSAmJgorICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnosIC0zLjA5MDkwOSApICYmCisgICAgICAgIGNvbXBhcmVmbG9hdChvdXRbM10ucmh3LCAwLjM2MzYzNiApLAorICAgICAgICAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwogCiAgICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1VubG9jayhscFZCdWZEZXN0MSk7CiAgICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlVubG9jayByZXR1cm5lZDogJWx4XG4iLCByYyk7CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3RleHR1cmUuYyBiL2RsbHMvZGRyYXcvdGV4dHVyZS5jCmluZGV4IDY2YzA3ZjMuLjA3YjVlZGIgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvdGV4dHVyZS5jCisrKyBiL2RsbHMvZGRyYXcvdGV4dHVyZS5jCkBAIC0xLDUgKzEsNiBAQAogLyogRGlyZWN0M0QgVGV4dHVyZQogICogQ29weXJpZ2h0IChjKSAxOTk4IExpb25lbCBVTE1FUgorICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE1lNJTkdFUgogICoKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIERpcmVjdDNEVGV4dHVyZTIuCiAgKgpAQCAtMjEsNDIgKzIyLDIzOCBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIndpbmUvcG9ydC5oIgogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAKKyNkZWZpbmUgQ09CSk1BQ1JPUwogI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAogCiAjaW5jbHVkZSAid2luZGVmLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm5scy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAib2JqYmFzZS5oIgogI2luY2x1ZGUgIndpbmdkaS5oIgorI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZXhjcHQuaCIKKwogI2luY2x1ZGUgImRkcmF3LmgiCiAjaW5jbHVkZSAiZDNkLmgiCisKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCiAjaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgogCi0jaW5jbHVkZSAib3BlbmdsX3ByaXZhdGUuaCIKK1dJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwogCi1XSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci1XSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190ZXgpOwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotc3RhdGljIHZvaWQgCi1zbm9vcF90ZXh0dXJlKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMpIHsKLSAgICBJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICpnbFRoaXMgPSAoSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqKSBUaGlzLT50ZXhfcHJpdmF0ZTsKLSAgICBjaGFyIGJ1ZlsxMjhdOwotICAgIEZJTEUgKmY7Ci0KLSAgICBUUkFDRV8oZGRyYXdfdGV4KSgiRHVtcGluZyBzdXJmYWNlIGlkICglNWQpIGxldmVsICglMmQpIDogXG4iLCBnbFRoaXMtPnRleF9uYW1lLCBUaGlzLT5taXBtYXBfbGV2ZWwpOwotICAgIEREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKCYoVGhpcy0+c3VyZmFjZV9kZXNjKSk7Ci0gICAgCi0gICAgc3ByaW50ZihidWYsICJ0ZXhfJTA1ZF8lMDJkLnBubSIsIGdsVGhpcy0+dGV4X25hbWUsIFRoaXMtPm1pcG1hcF9sZXZlbCk7Ci0gICAgZiA9IGZvcGVuKGJ1ZiwgIndiIik7Ci0gICAgRERSQVdfZHVtcF9zdXJmYWNlX3RvX2Rpc2soVGhpcywgZiwgMSk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElVbmtub3duIGludGVyZmFjZXMuIFRoZXkgYXJlIHRodW5rcyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7CiB9CiAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JqKTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSQorVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9BZGRSZWYoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0FkZFJlZihJRGlyZWN0M0RUZXh0dXJlICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfUmVsZWFzZShJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNykpOworfQorCisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFRleHR1cmUgaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVGV4dHVyZTE6OkluaXRpYWxpemUKKyAqCisgKiBUaGUgc2RrIHNheXMgaXQncyBub3QgaW1wbGVtZW50ZWQKKyAqCisgKiBQYXJhbXM6CisgKiAgPworICoKKyAqIFJldHVybnMKKyAqICBEREVSUl9VTlNVUFBPUlRFRAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Jbml0aWFsaXplKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZSAqRGlyZWN0M0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlICpERFN1cmZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOworICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgRGlyZWN0M0REZXZpY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2UzLCBERFN1cmZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIE5vdCBpbXBsZW1lbnRlZFxuIiwgVGhpcywgZDNkLCBzdXJmKTsKKyAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIFVuY2hlY2tlZCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFRleHR1cmUyOjpQYWxldHRlQ2hhbmdlZAorICoKKyAqIEluZm9ybXMgdGhlIHRleHR1cmUgYWJvdXQgYSBwYWxldHRlIGNoYW5nZQorICoKKyAqIFBhcmFtczoKKyAqICBTdGFydDogU3RhcnQgaW5kZXggb2YgdGhlIGNoYW5nZQorICogIENvdW50OiBUaGUgbnVtYmVyIG9mIGNoYW5nZWQgZW50cmllcworICoKKyAqIFJldHVybnMKKyAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFRleHR1cmVJbXBsX1BhbGV0dGVDaGFuZ2VkKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CisgICAgRklYTUUoIiglcCktPiglMDhseCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBTdGFydCwgQ291bnQpOworICAgIHJldHVybiBEM0RfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9QYWxldHRlQ2hhbmdlZChJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50KQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UuXG4iLCBUaGlzLCBTdGFydCwgQ291bnQpOworCisgICAgcmV0dXJuIElEaXJlY3QzRFRleHR1cmUyX1BhbGV0dGVDaGFuZ2VkKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVGV4dHVyZTo6VW5sb2FkCisgKgorICogRFg1IFNESzogIlRoZSBJRGlyZWN0M0RUZXh0dXJlMjo6VW5sb2FkIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAqCisgKgorICogUmV0dXJuczoKKyAqICBEREVSUl9VTlNVUFBPUlRFRAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVGV4dHVyZUltcGxfMV9VbmxvYWQoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oKTogbm90IGltcGxlbWVudGVkIVxuIiwgVGhpcyk7CisgICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFRleHR1cmUyOjpHZXRIYW5kbGUKKyAqCisgKiBSZXR1cm5zIGhhbmRsZSBmb3IgdGhlIHRleHR1cmUuIEF0IHRoZSBtb21lbnQsIHRoZSBpbnRlcmZhY2UKKyAqIHRvIHRoZSBJV2luZUQzRFRleHR1cmUgaXMgdXNlZC4KKyAqCisgKiBQYXJhbXM6CisgKiAgRGlyZWN0M0REZXZpY2UyOiBEZXZpY2UgdGhpcyBoYW5kbGUgaXMgYXNzaWduZWQgdG8KKyAqICBIYW5kbGU6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGhhbmRsZSBhdC4KKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVGV4dHVyZUltcGxfR2V0SGFuZGxlKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTIgKkRpcmVjdDNERGV2aWNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRFWFRVUkVIQU5ETEUgKmxwSGFuZGxlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CisgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqZDNkID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgRGlyZWN0M0REZXZpY2UyKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBkM2QsIGxwSGFuZGxlKTsKKworICAgIC8qIFRoZSBoYW5kbGUgaXMgdGhlIFdpbmVEM0RUZXh0dXJlIGludGVyZmFjZS4gU2V0UmVuZGVyU3RhdGUgZGVwZW5kcyBvbiB0aGlzICovCisgICAgaWYoVGhpcy0+ZGRyYXctPndpbmVEM0REZXZpY2UpCisgICAgICAgICpscEhhbmRsZSA9IChEM0RURVhUVVJFSEFORExFKSBUaGlzLT53aW5lRDNEVGV4dHVyZTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGlzIGlzIHRvIGZvb2wgYXBwbGljYXRpb25zIHdoaWNoIGNyZWF0ZSBhIHRleHR1cmUgd2l0aG91dCBhIEQzRERldmljZSAqLworICAgICAgICAqbHBIYW5kbGUgPSAoRDNEVEVYVFVSRUhBTkRMRSkgVGhpczsKKyAgICB9CisKKyAgICBUUkFDRSgiIHJldHVybmluZyBoYW5kbGUgJTA4bHguXG4iLCAqbHBIYW5kbGUpOworCisgICAgcmV0dXJuIEQzRF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0dldEhhbmRsZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RERVZJQ0UgbHBEaXJlY3QzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVEVYVFVSRUhBTkRMRSBscEhhbmRsZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVGV4dHVyZTIgaW50ZXJmYWNlLlxuIiwgVGhpcywgbHBEaXJlY3QzRERldmljZSwgbHBIYW5kbGUpOworCisgICAgcmV0dXJuIElEaXJlY3QzRFRleHR1cmUyX0dldEhhbmRsZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTIsIGxwRGlyZWN0M0REZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBIYW5kbGUpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N1Yl9taW1hcGxldmVsCisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBtaXBtYXAgbGV2ZWwKKyAqCisgKiB0ZXhfcHRyOiBTdXJmYWNlIG9mIHdoaWNoIHRvIHJldHVybiB0aGUgbmV4dCBsZXZlbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICoKIGdldF9zdWJfbWltYXBsZXZlbChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0ZXhfcHRyKQogewpAQCAtNjUsODczICsyNjIsMjQ1IEBACiAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgbmV4dF9sZXZlbDsKICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmX3B0cjsKICAgICBIUkVTVUxUIGhyOwotICAgIAorCiAgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShJQ09NX0lOVEVSRkFDRSh0ZXhfcHRyLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKLQkJCQkJCShERFNDQVBTMiAqKSAmbWlwbWFwX2NhcHMsICZuZXh0X2xldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChERFNDQVBTMiAqKSAmbWlwbWFwX2NhcHMsICZuZXh0X2xldmVsKTsKICAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIE5VTEw7Ci0gICAgCisKICAgICBzdXJmX3B0ciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIG5leHRfbGV2ZWwpOwogICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShuZXh0X2xldmVsKTsKLSAgICAKKwogICAgIHJldHVybiBzdXJmX3B0cjsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJICAgSURpcmVjdFN1cmZhY2UgY2FsbGJhY2sgbWV0aG9kcwotICovCi0KLUhSRVNVTFQKLWdsdGV4X2Rvd25sb2FkX3RleHR1cmUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZl9wdHIpIHsKLSAgICBJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICpnbF9zdXJmX3B0ciA9IChJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICopIHN1cmZfcHRyLT50ZXhfcHJpdmF0ZTsKLQotICAgIEZJWE1FKCJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Li4uIEV4cGVjdCBzb21lIGdyYXBoaWNhbCBnbGl0Y2hlcyAhISFcbiIpOwotCi0gICAgLyogR0wgYW5kIG1lbW9yeSBhcmUgaW4gc3luYyBhZ2FpbiAuLi4gCi0gICAgICAgTm8gbmVlZCB0byBjaGFuZ2UgdGhlICdnbG9iYWwnIGZsYWcgYXMgaXQgb25seSBoYW5kbGVzIHRoZSAnTUVNT1JZX0RJUlRZJyBjYXNlLgotICAgICovCi0gICAgZ2xfc3VyZl9wdHItPmRpcnR5X2ZsYWcgPSBTVVJGQUNFX01FTU9SWTsKLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyBHTGVudW0KLWNvbnZlcnRfbWluX2ZpbHRlcl90b19HTChEM0RURVhUVVJFTUlORklMVEVSIGR3TWluU3RhdGUsIEQzRFRFWFRVUkVNSVBGSUxURVIgZHdNaXBTdGF0ZSkKLXsKLSAgICBHTGVudW0gZ2xfc3RhdGU7Ci0KLSAgICBpZiAoZHdNaXBTdGF0ZSA9PSBEM0RURlBfTk9ORSkgewotICAgICAgICBzd2l0Y2ggKGR3TWluU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgRDNEVEZOX1BPSU5UOiAgZ2xfc3RhdGUgPSBHTF9ORUFSRVNUOyBicmVhazsKLQkgICAgY2FzZSBEM0RURk5fTElORUFSOiBnbF9zdGF0ZSA9IEdMX0xJTkVBUjsgIGJyZWFrOwotCSAgICBkZWZhdWx0OiAgICAgICAgICAgIGdsX3N0YXRlID0gR0xfTElORUFSOyAgYnJlYWs7Ci0JfQotICAgIH0gZWxzZSBpZiAoZHdNaXBTdGF0ZSA9PSBEM0RURlBfUE9JTlQpIHsKLSAgICAgICAgc3dpdGNoIChkd01pblN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEQzRFRGTl9QT0lOVDogIGdsX3N0YXRlID0gR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDsgYnJlYWs7Ci0JICAgIGNhc2UgRDNEVEZOX0xJTkVBUjogZ2xfc3RhdGUgPSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1Q7ICBicmVhazsKLQkgICAgZGVmYXVsdDogICAgICAgICAgICBnbF9zdGF0ZSA9IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVDsgIGJyZWFrOwotCX0KLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKGR3TWluU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgRDNEVEZOX1BPSU5UOiAgZ2xfc3RhdGUgPSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVI7IGJyZWFrOwotCSAgICBjYXNlIEQzRFRGTl9MSU5FQVI6IGdsX3N0YXRlID0gR0xfTElORUFSX01JUE1BUF9MSU5FQVI7ICBicmVhazsKLQkgICAgZGVmYXVsdDogICAgICAgICAgICBnbF9zdGF0ZSA9IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSOyAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gZ2xfc3RhdGU7Ci19Ci0KLXN0YXRpYyBHTGVudW0KLWNvbnZlcnRfbWFnX2ZpbHRlcl90b19HTChEM0RURVhUVVJFTUFHRklMVEVSIGR3U3RhdGUpCi17Ci0gICAgR0xlbnVtIGdsX3N0YXRlOwotCi0gICAgc3dpdGNoIChkd1N0YXRlKSB7Ci0gICAgICAgIGNhc2UgRDNEVEZHX1BPSU5UOgotCSAgICBnbF9zdGF0ZSA9IEdMX05FQVJFU1Q7Ci0JICAgIGJyZWFrOwotICAgICAgICBjYXNlIEQzRFRGR19MSU5FQVI6Ci0JICAgIGdsX3N0YXRlID0gR0xfTElORUFSOwotCSAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLQkgICAgZ2xfc3RhdGUgPSBHTF9MSU5FQVI7Ci0JICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZ2xfc3RhdGU7Ci19Ci0KLXN0YXRpYyBHTGVudW0KLWNvbnZlcnRfdGV4X2FkZHJlc3NfdG9fR0woRDNEVEVYVFVSRUFERFJFU1MgZHdTdGF0ZSkKLXsKLSAgICBHTGVudW0gZ2xfc3RhdGU7Ci0gICAgc3dpdGNoIChkd1N0YXRlKSB7Ci0gICAgICAgIGNhc2UgRDNEVEFERFJFU1NfV1JBUDogICBnbF9zdGF0ZSA9IEdMX1JFUEVBVDsgYnJlYWs7Ci0JY2FzZSBEM0RUQUREUkVTU19DTEFNUDogIGdsX3N0YXRlID0gR0xfQ0xBTVA7IGJyZWFrOwotCWNhc2UgRDNEVEFERFJFU1NfQk9SREVSOiBnbF9zdGF0ZSA9IEdMX0NMQU1QX1RPX0VER0U7IGJyZWFrOwotCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9SOgotCSAgICBpZiAoR0xfZXh0ZW5zaW9ucy5taXJyb3JlZF9yZXBlYXQpIHsKLQkJZ2xfc3RhdGUgPSBHTF9NSVJST1JFRF9SRVBFQVRfV0lORTsKLQkgICAgfSBlbHNlIHsKLQkJZ2xfc3RhdGUgPSBHTF9SRVBFQVQ7Ci0JCS8qIFRoaXMgaXMgYSBUUkFDRSBpbnN0ZWFkIG9mIGEgRklYTUUgYXMgdGhlIEZJWE1FIHdhcyBhbHJlYWR5IHByaW50ZWQgd2hlbiB0aGUgZ2FtZQotCQkgICBhY3R1YWxseSBzZXQgRDNEVEFERFJFU1NfTUlSUk9SLgotCQkqLwotCQlUUkFDRSgiIHNldHRpbmcgR0xfUkVQRUFUIGluc3RlYWQgb2YgR0xfTUlSUk9SRURfUkVQRUFULlxuIik7Ci0JICAgIH0KLQlicmVhazsKLQlkZWZhdWx0OiAgICAgICAgICAgICAgICAgZ2xfc3RhdGUgPSBHTF9SRVBFQVQ7IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZ2xfc3RhdGU7Ci19Ci0KLUhSRVNVTFQKLWdsdGV4X3VwbG9hZF90ZXh0dXJlKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZfcHRyLCBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2RkZXYsIERXT1JEIHN0YWdlKSB7Ci0gICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqZ2xfc3VyZl9wdHIgPSAoSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqKSBzdXJmX3B0ci0+dGV4X3ByaXZhdGU7Ci0gICAgSURpcmVjdDNERGV2aWNlR0xJbXBsICpnbF9kM2RkZXYgPSAoSURpcmVjdDNERGV2aWNlR0xJbXBsICopIGQzZGRldjsKLSAgICBCT09MRUFOIGNoYW5nZWQgPSBGQUxTRTsKLSAgICBHTGVudW0gdW5pdCA9IEdMX1RFWFRVUkUwX1dJTkUgKyBzdGFnZTsKLSAgICAKLSAgICBpZiAoc3VyZl9wdHItPm1pcG1hcF9sZXZlbCAhPSAwKSB7Ci0gICAgICAgIFdBUk4oIiBhcHBsaWNhdGlvbiBhY3RpdmF0aW5nIGEgc3ViLWxldmVsIG9mIHRoZSBtaXBtYXBwaW5nIGNoYWluIChsZXZlbCAlZCkgIVxuIiwgc3VyZl9wdHItPm1pcG1hcF9sZXZlbCk7Ci0gICAgfQotCi0gICAgLyogTm93IGNoZWNrIGlmIHRoZSB0ZXh0dXJlIHBhcmFtZXRlcnMgZm9yIHRoaXMgdGV4dHVyZSBhcmUgc3RpbGwgaW4tbGluZSB3aXRoIHdoYXQgRDNEIGV4cGVjdAotICAgICAgIHVzIHRvIGRvLi4KLQotICAgICAgIE5PVEU6IHRoZXJlIGlzIG5vIGNoZWNrIGZvciB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBzYW1lIHRleHR1cmUgaXMgYm91bmQgdG8gbXVsdGlwbGUgc3RhZ2UKLSAgICAgICAgICAgICBidXQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyBwZXIgc3RhZ2UuCi0gICAgKi8KLSAgICBpZiAoKGdsX3N1cmZfcHRyLT50ZXhfcGFyYW1ldGVycyA9PSBOVUxMKSB8fAotCShnbF9zdXJmX3B0ci0+dGV4X3BhcmFtZXRlcnNbRDNEVFNTX01BWE1JUExFVkVMIC0gRDNEVFNTX0FERFJFU1NVXSAhPSAKLQkgZDNkZGV2LT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW3N0YWdlXVtEM0RUU1NfTUFYTUlQTEVWRUwgLSAxXSkpIHsKLQlEV09SRCBtYXhfbWlwX2xldmVsOwotCQotCWlmICgoc3VyZl9wdHItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKSA9PSAwKSB7Ci0JICAgIG1heF9taXBfbGV2ZWwgPSAwOwotCX0gZWxzZSB7Ci0JICAgIG1heF9taXBfbGV2ZWwgPSBzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQgLSAxOwotCSAgICBpZiAoZDNkZGV2LT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW3N0YWdlXVtEM0RUU1NfTUFYTUlQTEVWRUwgLSAxXSAhPSAwKSB7Ci0JCWlmIChtYXhfbWlwX2xldmVsID49IGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX01BWE1JUExFVkVMIC0gMV0pIHsKLQkJICAgIG1heF9taXBfbGV2ZWwgPSBkM2RkZXYtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbc3RhZ2VdW0QzRFRTU19NQVhNSVBMRVZFTCAtIDFdIC0gMTsKLQkJfQotCSAgICB9Ci0JfQotCWlmICh1bml0ICE9IGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQpIHsKLQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JICAgIGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSB1bml0OwotCX0KLQlnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQVhfTEVWRUwsIG1heF9taXBfbGV2ZWwpOwotCWNoYW5nZWQgPSBUUlVFOwotICAgIH0KLSAgICAKLSAgICBpZiAoKGdsX3N1cmZfcHRyLT50ZXhfcGFyYW1ldGVycyA9PSBOVUxMKSB8fAotCShnbF9zdXJmX3B0ci0+dGV4X3BhcmFtZXRlcnNbRDNEVFNTX01BR0ZJTFRFUiAtIEQzRFRTU19BRERSRVNTVV0gIT0gCi0JIGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX01BR0ZJTFRFUiAtIDFdKSkgewotCWlmICh1bml0ICE9IGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQpIHsKLQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JICAgIGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSB1bml0OwotCX0KLQlnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCAKLQkJCWNvbnZlcnRfbWFnX2ZpbHRlcl90b19HTChkM2RkZXYtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbc3RhZ2VdW0QzRFRTU19NQUdGSUxURVIgLSAxXSkpOwotCWNoYW5nZWQgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoKGdsX3N1cmZfcHRyLT50ZXhfcGFyYW1ldGVycyA9PSBOVUxMKSB8fAotCShnbF9zdXJmX3B0ci0+dGV4X3BhcmFtZXRlcnNbRDNEVFNTX01JTkZJTFRFUiAtIEQzRFRTU19BRERSRVNTVV0gIT0gCi0JIGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX01JTkZJTFRFUiAtIDFdKSB8fAotCShnbF9zdXJmX3B0ci0+dGV4X3BhcmFtZXRlcnNbRDNEVFNTX01JUEZJTFRFUiAtIEQzRFRTU19BRERSRVNTVV0gIT0gCi0JIGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX01JUEZJTFRFUiAtIDFdKSkgewotCWlmICh1bml0ICE9IGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQpIHsKLQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JICAgIGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSB1bml0OwotCX0KLQlnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLAotCQkJY29udmVydF9taW5fZmlsdGVyX3RvX0dMKGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX01JTkZJTFRFUiAtIDFdLAotCQkJCQkJIGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX01JUEZJTFRFUiAtIDFdKSk7Ci0JY2hhbmdlZCA9IFRSVUU7Ci0gICAgfQotICAgIGlmICgoZ2xfc3VyZl9wdHItPnRleF9wYXJhbWV0ZXJzID09IE5VTEwpIHx8Ci0JKGdsX3N1cmZfcHRyLT50ZXhfcGFyYW1ldGVyc1tEM0RUU1NfQUREUkVTU1UgLSBEM0RUU1NfQUREUkVTU1VdICE9IAotCSBkM2RkZXYtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbc3RhZ2VdW0QzRFRTU19BRERSRVNTVSAtIDFdKSkgewotCWlmICh1bml0ICE9IGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQpIHsKLQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JICAgIGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSB1bml0OwotCX0KLQlnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsCi0JCQljb252ZXJ0X3RleF9hZGRyZXNzX3RvX0dMKGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX0FERFJFU1NVIC0gMV0pKTsKLQljaGFuZ2VkID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKChnbF9zdXJmX3B0ci0+dGV4X3BhcmFtZXRlcnMgPT0gTlVMTCkgfHwKLQkoZ2xfc3VyZl9wdHItPnRleF9wYXJhbWV0ZXJzW0QzRFRTU19BRERSRVNTViAtIEQzRFRTU19BRERSRVNTVV0gIT0gCi0JIGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX0FERFJFU1NWIC0gMV0pKSB7Ci0JaWYgKHVuaXQgIT0gZ2xfZDNkZGV2LT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCkgewotCSAgICBHTF9leHRlbnNpb25zLmdsQWN0aXZlVGV4dHVyZSh1bml0KTsKLQkgICAgZ2xfZDNkZGV2LT5jdXJyZW50X2FjdGl2ZV90ZXhfdW5pdCA9IHVuaXQ7Ci0JfQotCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwKLQkJCWNvbnZlcnRfdGV4X2FkZHJlc3NfdG9fR0woZDNkZGV2LT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW3N0YWdlXVtEM0RUU1NfQUREUkVTU1YgLSAxXSkpOwkKLQljaGFuZ2VkID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKChnbF9zdXJmX3B0ci0+dGV4X3BhcmFtZXRlcnMgPT0gTlVMTCkgfHwKLQkoZ2xfc3VyZl9wdHItPnRleF9wYXJhbWV0ZXJzW0QzRFRTU19CT1JERVJDT0xPUiAtIEQzRFRTU19BRERSRVNTVV0gIT0gCi0JIGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX0JPUkRFUkNPTE9SIC0gMV0pKSB7Ci0JR0xmbG9hdCBjb2xvcls0XTsKLQkKLQljb2xvclswXSA9ICgoZDNkZGV2LT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW3N0YWdlXVtEM0RUU1NfQk9SREVSQ09MT1IgLSAxXSA+PiAxNikgJiAweEZGKSAvIDI1NS4wOwotCWNvbG9yWzFdID0gKChkM2RkZXYtPnN0YXRlX2Jsb2NrLnRleHR1cmVfc3RhZ2Vfc3RhdGVbc3RhZ2VdW0QzRFRTU19CT1JERVJDT0xPUiAtIDFdID4+ICA4KSAmIDB4RkYpIC8gMjU1LjA7Ci0JY29sb3JbMl0gPSAoKGQzZGRldi0+c3RhdGVfYmxvY2sudGV4dHVyZV9zdGFnZV9zdGF0ZVtzdGFnZV1bRDNEVFNTX0JPUkRFUkNPTE9SIC0gMV0gPj4gIDApICYgMHhGRikgLyAyNTUuMDsKLQljb2xvclszXSA9ICgoZDNkZGV2LT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW3N0YWdlXVtEM0RUU1NfQk9SREVSQ09MT1IgLSAxXSA+PiAyNCkgJiAweEZGKSAvIDI1NS4wOwotCWlmICh1bml0ICE9IGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQpIHsKLQkgICAgR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JICAgIGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSB1bml0OwotCX0KLQlnbFRleFBhcmFtZXRlcmZ2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQk9SREVSX0NPTE9SLCBjb2xvcik7Ci0JY2hhbmdlZCA9IFRSVUU7Ci0gICAgfQotCi0gICAgaWYgKGNoYW5nZWQpIHsKLQlpZiAoZ2xfc3VyZl9wdHItPnRleF9wYXJhbWV0ZXJzID09IE5VTEwpIHsKLQkgICAgZ2xfc3VyZl9wdHItPnRleF9wYXJhbWV0ZXJzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkJCQkgICAgc2l6ZW9mKERXT1JEKSAqIChEM0RUU1NfTUFYTUlQTEVWRUwgKyAxIC0gRDNEVFNTX0FERFJFU1NVKSk7Ci0JfQotCW1lbWNweShnbF9zdXJmX3B0ci0+dGV4X3BhcmFtZXRlcnMsICYoZDNkZGV2LT5zdGF0ZV9ibG9jay50ZXh0dXJlX3N0YWdlX3N0YXRlW3N0YWdlXVtEM0RUU1NfQUREUkVTU1UgLSAxXSksCi0JICAgICAgIHNpemVvZihEV09SRCkgKiAoRDNEVFNTX01BWE1JUExFVkVMICsgMSAtIEQzRFRTU19BRERSRVNTVSkpOwotICAgIH0KLQotICAgIGlmICgqKGdsX3N1cmZfcHRyLT5nbG9iYWxfZGlydHlfZmxhZykgIT0gU1VSRkFDRV9NRU1PUllfRElSVFkpIHsKLQlUUkFDRSgiIG5vdGhpbmcgdG8gZG8gLSBtZW1vcnkgY29weSBhbmQgR0wgc3RhdGUgaW4gc3luY2ggZm9yIGFsbCB0ZXh0dXJlIGxldmVscy5cbiIpOwotCXJldHVybiBERF9PSzsKLSAgICB9Ci0gICAgCi0gICAgd2hpbGUgKHN1cmZfcHRyICE9IE5VTEwpIHsKLSAgICAgICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqZ2xfc3VyZl9wdHIgPSAoSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqKSBzdXJmX3B0ci0+dGV4X3ByaXZhdGU7Ci0JCi0JaWYgKGdsX3N1cmZfcHRyLT5kaXJ0eV9mbGFnICE9IFNVUkZBQ0VfTUVNT1JZX0RJUlRZKSB7Ci0gICAgICAgICAgICBUUkFDRSgiICAgLSBsZXZlbCAlZCBhbHJlYWR5IHVwbG9hZGVkLlxuIiwgc3VyZl9wdHItPm1pcG1hcF9sZXZlbCk7Ci0JfSBlbHNlIHsKLQkgICAgVFJBQ0UoIiAgIC0gdXBsb2FkaW5nIHRleHR1cmUgbGV2ZWwgJWQgKGluaXRpYWwgZG9uZSA9ICVkKS5cbiIsCi0JCSAgc3VyZl9wdHItPm1pcG1hcF9sZXZlbCwgZ2xfc3VyZl9wdHItPmluaXRpYWxfdXBsb2FkX2RvbmUpOwotCi0JICAgIC8qIFRleHR1cmUgc25vb3BpbmcgZm9yIHRoZSBjdXJpb3VzIDotKSAqLwotCSAgICBpZiAoVFJBQ0VfT04oZGRyYXdfdGV4KSkgewotCQlzbm9vcF90ZXh0dXJlKHN1cmZfcHRyKTsKLQkgICAgfQotCi0JICAgIGlmICh1bml0ICE9IGdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQpIHsKLQkJR0xfZXh0ZW5zaW9ucy5nbEFjdGl2ZVRleHR1cmUodW5pdCk7Ci0JCWdsX2QzZGRldi0+Y3VycmVudF9hY3RpdmVfdGV4X3VuaXQgPSB1bml0OwotCSAgICB9Ci0JICAgIAotCSAgICBpZiAodXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeV9pbml0KHN1cmZfcHRyLCBzdXJmX3B0ci0+bWlwbWFwX2xldmVsLCAmKGdsX3N1cmZfcHRyLT5jdXJyZW50X2ludGVybmFsX2Zvcm1hdCksCi0JCQkJCQkgIGdsX3N1cmZfcHRyLT5pbml0aWFsX3VwbG9hZF9kb25lID09IEZBTFNFLCBUUlVFLCAwLCAwKSA9PSBERF9PSykgewotCSAgICAgICAgdXBsb2FkX3N1cmZhY2VfdG9fdGV4X21lbW9yeShOVUxMLCAwLCAwLCAmKGdsX3N1cmZfcHRyLT5zdXJmYWNlX3B0cikpOwotCQl1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5X3JlbGVhc2UoKTsKLQkJZ2xfc3VyZl9wdHItPmRpcnR5X2ZsYWcgPSBTVVJGQUNFX01FTU9SWTsKLQkJZ2xfc3VyZl9wdHItPmluaXRpYWxfdXBsb2FkX2RvbmUgPSBUUlVFOwotCSAgICB9IGVsc2UgewotCQlFUlIoIlByb2JsZW0gZm9yIHVwbG9hZCBvZiB0ZXh0dXJlICVkIChsZXZlbCA9ICVkIC8gaW5pdGlhbCBkb25lID0gJWQpLlxuIiwKLQkJICAgIGdsX3N1cmZfcHRyLT50ZXhfbmFtZSwgc3VyZl9wdHItPm1pcG1hcF9sZXZlbCwgZ2xfc3VyZl9wdHItPmluaXRpYWxfdXBsb2FkX2RvbmUpOwotCSAgICB9Ci0JfQotCQotCWlmIChzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApIHsKLQkgICAgc3VyZl9wdHIgPSBnZXRfc3ViX21pbWFwbGV2ZWwoc3VyZl9wdHIpOwotCX0gZWxzZSB7Ci0JICAgIHN1cmZfcHRyID0gTlVMTDsKLQl9Ci0gICAgfQotICAgIAotICAgICooZ2xfc3VyZl9wdHItPmdsb2JhbF9kaXJ0eV9mbGFnKSA9IFNVUkZBQ0VfTUVNT1JZOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Jbml0aWFsaXplKExQRElSRUNUM0RURVhUVVJFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRERFVklDRSBscERpcmVjdDNERGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU3VyZmFjZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCkgbm8tb3AuLi5cbiIsIFRoaXMsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlLCBscEREU3VyZmFjZSk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgSFJFU1VMVAotZ2x0ZXhfc2V0Y29sb3JrZXlfY2IoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIGNrZXkgKQotewotICAgIElEaXJlY3QzRFRleHR1cmVHTEltcGwgKmdsVGhpcyA9IChJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICopIFRoaXMtPnRleF9wcml2YXRlOwotCi0gICAgaWYgKGdsVGhpcy0+ZGlydHlfZmxhZyA9PSBTVVJGQUNFX0dMKSB7Ci0JR0xpbnQgY3VyX3RleDsKLQotCVRSQUNFKCIgZmx1c2hpbmcgR0wgdGV4dHVyZSBiYWNrIHRvIG1lbW9yeS5cbiIpOwotCQotCUVOVEVSX0dMKCk7Ci0JZ2xHZXRJbnRlZ2VydihHTF9URVhUVVJFX0JJTkRJTkdfMkQsICZjdXJfdGV4KTsKLQlnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdsVGhpcy0+dGV4X25hbWUpOwotCWdsdGV4X2Rvd25sb2FkX3RleHR1cmUoVGhpcyk7Ci0JZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBjdXJfdGV4KTsKLQlMRUFWRV9HTCgpOwotICAgIH0KLQotICAgIGdsVGhpcy0+ZGlydHlfZmxhZyA9IFNVUkZBQ0VfTUVNT1JZX0RJUlRZOwotICAgICooZ2xUaGlzLT5nbG9iYWxfZGlydHlfZmxhZykgPSBTVVJGQUNFX01FTU9SWV9ESVJUWTsKLSAgICAvKiBUT0RPOiBjaGVjayBjb2xvci1rZXlpbmcgb24gbWlwbWFwcGVkIHN1cmZhY2VzLi4uICovCi0gICAgCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUCi1nbHRleF9ibHQoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywgTFBSRUNUIHJkc3QsCi0JICBMUERJUkVDVERSQVdTVVJGQUNFNyBzcmMsIExQUkVDVCByc3JjLAotCSAgRFdPUkQgZHdGbGFncywgTFBEREJMVEZYIGxwYmx0ZngpCi17Ci0gICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0JSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3JjX3B0ciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsIHNyYyk7Ci0JaWYgKHNyY19wdHItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfM0RERVZJQ0UpIHsKLQkgICAgRklYTUUoIkJsdCBmcm9tIGZyYW1lYnVmZmVyIHRvIHRleHR1cmUgLSB1bnN1cHBvcnRlZCBub3csIHBsZWFzZSByZXBvcnQgIVxuIik7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLX0KLQotSFJFU1VMVAotZ2x0ZXhfYmx0ZmFzdChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmX3B0ciwgRFdPUkQgZHN0eCwKLQkgICAgICBEV09SRCBkc3R5LCBMUERJUkVDVERSQVdTVVJGQUNFNyBzcmMsCi0JICAgICAgTFBSRUNUIHJzcmMsIERXT1JEIHRyYW5zKQotewotICAgIGlmIChzcmMgIT0gTlVMTCkgewotCUlEaXJlY3REcmF3U3VyZmFjZUltcGwgKnNyY19wdHIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBzcmMpOwotCQotCWlmICgoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU18zRERFVklDRSkgJiYKLQkgICAgKCh0cmFucyAmIChEREJMVEZBU1RfU1JDQ09MT1JLRVkgfCBEREJMVEZBU1RfREVTVENPTE9SS0VZKSkgPT0gMCkpIHsKLQkgICAgLyogVGhpcyBpcyBhIGJsdCB3aXRob3V0IGNvbG9yIGtleWluZy4uLiBXZSBjYW4gdXNlIHRoZSBkaXJlY3QgY29weS4gKi8KLQkgICAgUkVDVCByc3JjMjsKLQkgICAgRFdPUkQgd2lkdGgsIGhlaWdodDsKLQkgICAgR0xpbnQgY3VyX3RleDsKLQkgICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqZ2xfc3VyZl9wdHIgPSBzdXJmX3B0ci0+dGV4X3ByaXZhdGU7Ci0JICAgIGludCB5OwotCSAgICAKLQkgICAgaWYgKHJzcmMgPT0gTlVMTCkgewotCQlXQVJOKCJyc3JjIGlzIE5VTExcbiIpOwotCQlyc3JjID0gJnJzcmMyOwotCQkKLQkJcnNyYy0+bGVmdCA9IDA7Ci0JCXJzcmMtPnRvcCA9IDA7Ci0JCXJzcmMtPnJpZ2h0ID0gc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7Ci0JCXJzcmMtPmJvdHRvbSA9IHNyY19wdHItPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKLQkgICAgfQotCSAgICAKLQkgICAgd2lkdGggPSByc3JjLT5yaWdodCAtIHJzcmMtPmxlZnQ7Ci0JICAgIGhlaWdodCA9IHJzcmMtPmJvdHRvbSAtIHJzcmMtPnRvcDsKLQkgICAgCi0JICAgIGlmICgoKGRzdHggKyB3aWR0aCkgID4gc3VyZl9wdHItPnN1cmZhY2VfZGVzYy5kd1dpZHRoKSB8fAotCQkoKGRzdHkgKyBoZWlnaHQpID4gc3VyZl9wdHItPnN1cmZhY2VfZGVzYy5kd0hlaWdodCkpIHsKLQkJRklYTUUoIkRvZXMgbm90IGhhbmRsZSBjbGlwcGluZyB5ZXQgaW4gRkIgPT4gVGV4dHVyZSBibGl0cyAhXG4iKTsKLQkJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JICAgIH0KLQotCSAgICBpZiAoKHdpZHRoID09IDApIHx8IChoZWlnaHQgPT0gMCkpIHsKLQkJcmV0dXJuIEREX09LOwotCSAgICB9Ci0JICAgIAotCSAgICBUUkFDRSgiIGRpcmVjdCBmcmFtZSBidWZmZXIgPT4gdGV4dHVyZSBCbHRGYXN0IG92ZXJyaWRlLlxuIik7Ci0JICAgIAotCSAgICBFTlRFUl9HTCgpOwotCSAgICAKLQkgICAgZ2xHZXRJbnRlZ2VydihHTF9URVhUVVJFX0JJTkRJTkdfMkQsICZjdXJfdGV4KTsKLQkgICAgLyogVGhpcyBjYWxsIGlzIHRvIGNyZWF0ZSB0aGUgYWN0dWFsIHRleHR1cmUgbmFtZSBpbiBHTCAoYXMgd2UgZG8gJ2xhdGUnIElEIGNyZWF0aW9uKSAqLwotCSAgICBnbHRleF9nZXRfdGV4X25hbWUoc3VyZl9wdHIpOwotCSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdsX3N1cmZfcHRyLT50ZXhfbmFtZSk7Ci0JICAgIAotCSAgICBpZiAoKGdsX3N1cmZfcHRyLT5kaXJ0eV9mbGFnID09IFNVUkZBQ0VfTUVNT1JZX0RJUlRZKSAmJgotCQkhKChkc3R4ID09IDApICYmIChkc3R5ID09IDApICYmCi0JCSAgKHdpZHRoID09IHN1cmZfcHRyLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCkgJiYgKGhlaWdodCA9PSBzdXJmX3B0ci0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0KSkpIHsKLQkJLyogSWYgbm90ICdmdWxsIHNpemUnIGFuZCB0aGUgc3VyZmFjZSBpcyBkaXJ0eSwgZmlyc3QgZmx1c2ggaXQgdG8gR0wgYmVmb3JlIGRvaW5nIHRoZSBjb3B5LiAqLwotCSAgICAgICAgaWYgKHVwbG9hZF9zdXJmYWNlX3RvX3RleF9tZW1vcnlfaW5pdChzdXJmX3B0ciwgc3VyZl9wdHItPm1pcG1hcF9sZXZlbCwgJihnbF9zdXJmX3B0ci0+Y3VycmVudF9pbnRlcm5hbF9mb3JtYXQpLAotCQkJCQkJICAgICAgZ2xfc3VyZl9wdHItPmluaXRpYWxfdXBsb2FkX2RvbmUgPT0gRkFMU0UsIFRSVUUsIDAsIDApID09IEREX09LKSB7Ci0JCSAgICB1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5KE5VTEwsIDAsIDAsICYoZ2xfc3VyZl9wdHItPnN1cmZhY2VfcHRyKSk7Ci0JCSAgICB1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5X3JlbGVhc2UoKTsKLQkJICAgIGdsX3N1cmZfcHRyLT5kaXJ0eV9mbGFnID0gU1VSRkFDRV9NRU1PUlk7Ci0JCSAgICBnbF9zdXJmX3B0ci0+aW5pdGlhbF91cGxvYWRfZG9uZSA9IFRSVUU7Ci0JCX0gZWxzZSB7Ci0JCSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGN1cl90ZXgpOwotCQkgICAgTEVBVkVfR0woKTsKLQkJICAgIEVSUigiRXJyb3IgYXQgdGV4dHVyZSB1cGxvYWQgIVxuIik7Ci0JCSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQkJfQotCSAgICB9Ci0KLQkgICAgLyogVGhpcyBpcyBhIGhhY2sgYW5kIHdvdWxkIG5lZWQgc29tZSBjbGVhbi11cCA6LSkgKi8KLQkgICAgaWYgKGdsX3N1cmZfcHRyLT5pbml0aWFsX3VwbG9hZF9kb25lID09IEZBTFNFKSB7Ci0JCWlmICh1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5X2luaXQoc3VyZl9wdHIsIHN1cmZfcHRyLT5taXBtYXBfbGV2ZWwsICYoZ2xfc3VyZl9wdHItPmN1cnJlbnRfaW50ZXJuYWxfZm9ybWF0KSwKLQkJCQkJCSAgICAgIFRSVUUsIFRSVUUsIDAsIDApID09IEREX09LKSB7Ci0JCSAgICB1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5KE5VTEwsIDAsIDAsICYoZ2xfc3VyZl9wdHItPnN1cmZhY2VfcHRyKSk7Ci0JCSAgICB1cGxvYWRfc3VyZmFjZV90b190ZXhfbWVtb3J5X3JlbGVhc2UoKTsKLQkJICAgIGdsX3N1cmZfcHRyLT5kaXJ0eV9mbGFnID0gU1VSRkFDRV9NRU1PUlk7Ci0JCSAgICBnbF9zdXJmX3B0ci0+aW5pdGlhbF91cGxvYWRfZG9uZSA9IFRSVUU7Ci0JCX0gZWxzZSB7Ci0JCSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGN1cl90ZXgpOwotCQkgICAgTEVBVkVfR0woKTsKLQkJICAgIEVSUigiRXJyb3IgYXQgdGV4dHVyZSB1cGxvYWQgKGluaXRpYWwgY2FzZSkgIVxuIik7Ci0JCSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLQkJfQotCSAgICB9Ci0JICAgIAotCSAgICBpZiAoKHNyY19wdHItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIChERFNDQVBTX0ZST05UQlVGRkVSfEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpKSAhPSAwKQotCQlnbFJlYWRCdWZmZXIoR0xfRlJPTlQpOwotCSAgICBlbHNlIGlmICgoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfQkFDS0JVRkZFUikpID09IChERFNDQVBTX0JBQ0tCVUZGRVIpKQotCQlnbFJlYWRCdWZmZXIoR0xfQkFDSyk7Ci0JICAgIGVsc2UgewotCQlFUlIoIldyb25nIHN1cmZhY2UgdHlwZSBmb3IgbG9ja2luZyAhXG4iKTsKLQkJZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBjdXJfdGV4KTsKLQkJTEVBVkVfR0woKTsKLQkJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7Ci0JICAgIH0KLQkgICAgCi0JICAgIGZvciAoeSA9IChzcmNfcHRyLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgLSByc3JjLT50b3AgLSAxKTsKLQkJIHkgPj0gKHNyY19wdHItPnN1cmZhY2VfZGVzYy5kd0hlaWdodCAtIChyc3JjLT50b3AgKyBoZWlnaHQpKTsKLQkJIHktLSkgewotCQlnbENvcHlUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIHN1cmZfcHRyLT5taXBtYXBfbGV2ZWwsCi0JCQkJICAgIGRzdHgsIGRzdHksCi0JCQkJICAgIHJzcmMtPmxlZnQsIHksCi0JCQkJICAgIHdpZHRoLCAxKTsKLQkJZHN0eSsrOwotCSAgICB9Ci0JICAgIAotCSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGN1cl90ZXgpOwotCSAgICBMRUFWRV9HTCgpOwotCSAgICAKLQkgICAgLyogVGhlIFNVUkZBQ0VfR0wgY2FzZSBpcyBub3QgaGFuZGxlZCBieSB0aGUgJ2dsb2JhbCcgZGlydHkgZmxhZyAqLwotCSAgICBnbF9zdXJmX3B0ci0+ZGlydHlfZmxhZyA9IFNVUkZBQ0VfR0w7Ci0JICAgIAotCSAgICByZXR1cm4gRERfT0s7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVGV4dHVyZUltcGxfMl8xVF9QYWxldHRlQ2hhbmdlZChMUERJUkVDVDNEVEVYVFVSRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NvdW50KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RUZXh0dXJlMjo6TG9hZAorICoKKyAqIExvYWRzIGEgdGV4dHVyZSBjcmVhdGVkIHdpdGggdGhlIEREU0NBUFNfQUxMT0NPTkxPQUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzbid0IHJlbGF5ZWQgdG8gV2luZUQzRCBiZWNhdXNlIHRoZSB3aG9sZSBpbnRlcmZhY2UgaXMKKyAqIGltcGxlbWVudGVkIGluIEREcmF3IG9ubHkuIEZvciBzcGVlZCBpbXByb3ZlbWVudHMgYSBpbXBsZW1lbnRhdGlvbiB3aGljaAorICogdGFrZXMgT3BlbkdMIG1vcmUgaW50byBhY2NvdW50IGNvdWxkIGJlIHBsYWNlZCBpbnRvIFdpbmVEM0QuCisgKgorICogUGFyYW1zOgorICogIEQzRFRleHR1cmUyOiBBZGRyZXNzIG9mIHRoZSB0ZXh0dXJlIHRvIGxvYWQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RUZXh0dXJlSW1wbF9Mb2FkKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZTIgKkQzRFRleHR1cmUyKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDhseCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZHdTdGFydCwgZHdDb3VudCk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1VubG9hZChMUERJUkVDVDNEVEVYVFVSRSBpZmFjZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPigpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVGV4dHVyZUltcGxfMl8xVF9HZXRIYW5kbGUoTFBESVJFQ1QzRFRFWFRVUkUyIGlmYWNlLAotCQkJCQkgTFBESVJFQ1QzRERFVklDRTIgbHBEaXJlY3QzRERldmljZTIsCi0JCQkJCSBMUEQzRFRFWFRVUkVIQU5ETEUgbHBIYW5kbGUpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKLSAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpscERldmljZUltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBscERpcmVjdDNERGV2aWNlMik7Ci0gICAgCi0gICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcClcbiIsIFRoaXMsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlMiwgbHBIYW5kbGUpOwotCi0gICAgLyogVGhlIGhhbmRsZSBpcyBzaW1wbHkgdGhlIHBvaW50ZXIgdG8gdGhlIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZSAqLwotICAgICpscEhhbmRsZSA9IChEM0RURVhUVVJFSEFORExFKSBUaGlzOwotCi0gICAgVFJBQ0UoIiByZXR1cm5pbmcgaGFuZGxlICUwOGx4LlxuIiwgKmxwSGFuZGxlKTsKLSAgICAKLSAgICAvKiBOb3cgc2V0IHRoZSBkZXZpY2UgZm9yIHRoaXMgdGV4dHVyZSAqLwotICAgIFRoaXMtPmQzZGRldmljZSA9IGxwRGV2aWNlSW1wbDsKLQotICAgIHJldHVybiBEM0RfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfMVRfTG9hZChMUERJUkVDVDNEVEVYVFVSRTIgaWZhY2UsCi0JCQkJICAgIExQRElSRUNUM0RURVhUVVJFMiBscEQzRFRleHR1cmUyKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBEM0RUZXh0dXJlMik7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgdm9pZCBnbHRleF9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwpCi17Ci0gICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqZ2xUaGlzID0gKElEaXJlY3QzRFRleHR1cmVHTEltcGwgKikgVGhpcy0+dGV4X3ByaXZhdGU7Ci0KLSAgICBpZiAoZ2xUaGlzLT5kaXJ0eV9mbGFnID09IFNVUkZBQ0VfR0wpIHsKLQlHTGludCBjdXJfdGV4OwotCQotCVRSQUNFKCIgZmx1c2hpbmcgR0wgdGV4dHVyZSBiYWNrIHRvIG1lbW9yeS5cbiIpOwotCQotCUVOVEVSX0dMKCk7Ci0JZ2xHZXRJbnRlZ2VydihHTF9URVhUVVJFX0JJTkRJTkdfMkQsICZjdXJfdGV4KTsKLQlnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdsVGhpcy0+dGV4X25hbWUpOwotCWdsdGV4X2Rvd25sb2FkX3RleHR1cmUoVGhpcyk7Ci0JZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBjdXJfdGV4KTsKLQlMRUFWRV9HTCgpOwotICAgIH0KLSAgICAKLSAgICAvKiBGaXJzdCBjYWxsIHRoZSBwcmV2aW91cyBzZXRfcGFsZXR0ZSBmdW5jdGlvbiAqLwotICAgIGdsVGhpcy0+c2V0X3BhbGV0dGUoVGhpcywgcGFsKTsKLSAgICAKLSAgICAvKiBBbmQgc2V0IHRoZSBkaXJ0eSBmbGFnICovCi0gICAgZ2xUaGlzLT5kaXJ0eV9mbGFnID0gU1VSRkFDRV9NRU1PUllfRElSVFk7Ci0gICAgKihnbFRoaXMtPmdsb2JhbF9kaXJ0eV9mbGFnKSA9IFNVUkZBQ0VfTUVNT1JZX0RJUlRZOwotICAgIAotICAgIC8qIFRPRE86IGNoZWNrIHBhbGV0dGUgb24gbWlwbWFwcGVkIHN1cmZhY2VzLi4uCi0gICAgICAgVE9ETzogZG8gd2UgbmVlZCB0byByZS11cGxvYWQgaW4gY2FzZSBvZiB1c2FnZSBvZiB0aGUgcGFsZXR0ZWQgdGV4dHVyZSBleHRlbnNpb24gPyAqLwotfQotCi1zdGF0aWMgdm9pZAotZ2x0ZXhfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzKQotewotICAgIElEaXJlY3QzRFRleHR1cmVHTEltcGwgKmdsVGhpcyA9IChJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICopIFRoaXMtPnRleF9wcml2YXRlOwotICAgIERXT1JEIG1lbV91c2VkOwotICAgIGludCBpOwotCi0gICAgVFJBQ0UoIiBkZWxldGluZyB0ZXh0dXJlIHdpdGggR0wgaWQgJWQuXG4iLCBnbFRoaXMtPnRleF9uYW1lKTsKLQotICAgIC8qIEFuZCBkZWxldGUgdGV4dHVyZSBoYW5kbGUgKi8KLSAgICBFTlRFUl9HTCgpOwotICAgIGlmIChnbFRoaXMtPnRleF9uYW1lICE9IDApCi0gICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJihnbFRoaXMtPnRleF9uYW1lKSk7Ci0gICAgTEVBVkVfR0woKTsJCi0KLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBnbFRoaXMtPnN1cmZhY2VfcHRyKTsKLQotICAgIC8qIEFuZCBpZiB0aGlzIHRleHR1cmUgd2FzIHRoZSBjdXJyZW50IG9uZSwgcmVtb3ZlIGl0IGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KLSAgICBpZiAoVGhpcy0+ZDNkZGV2aWNlICE9IE5VTEwpCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVEVYVFVSRVM7IGkrKykKLQkgICAgaWYgKFRoaXMtPmQzZGRldmljZS0+Y3VycmVudF90ZXh0dXJlW2ldID09IFRoaXMpCi0JICAgICAgICBUaGlzLT5kM2RkZXZpY2UtPmN1cnJlbnRfdGV4dHVyZVtpXSA9IE5VTEw7Ci0KLSAgICAvKiBBbGwgdGhpcyBzaG91bGQgYmUgcGFydCBvZiBtYWluIHN1cmZhY2UgbWFuYWdlbWVudCBub3QganVzdCBhIGhhY2sgZm9yIHRleHR1cmUuLiAqLwotICAgIGlmIChnbFRoaXMtPmxvYWRlZCkgewotICAgICAgICBtZW1fdXNlZCA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCAqCi0JICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoOwotCVRoaXMtPmRkcmF3X293bmVyLT5mcmVlX21lbW9yeShUaGlzLT5kZHJhd19vd25lciwgbWVtX3VzZWQpOwotICAgIH0KLQotICAgIGdsVGhpcy0+ZmluYWxfcmVsZWFzZShUaGlzKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsdGV4X2xvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcFJlY3QsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqZ2xUaGlzID0gKElEaXJlY3QzRFRleHR1cmVHTEltcGwgKikgVGhpcy0+dGV4X3ByaXZhdGU7Ci0gICAgCi0gICAgZ2xUaGlzLT5sb2NrX3VwZGF0ZShUaGlzLCBwUmVjdCwgZHdGbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbHRleF91bmxvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcFJlY3QpCi17Ci0gICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqZ2xUaGlzID0gKElEaXJlY3QzRFRleHR1cmVHTEltcGwgKikgVGhpcy0+dGV4X3ByaXZhdGU7Ci0KLSAgICBnbFRoaXMtPnVubG9ja191cGRhdGUoVGhpcywgcFJlY3QpOwotICAgIAotICAgIC8qIFNldCB0aGUgZGlydHkgZmxhZyBhY2NvcmRpbmcgdG8gdGhlIGxvY2sgdHlwZSAqLwotICAgIGlmICgoVGhpcy0+bGFzdGxvY2t0eXBlICYgRERMT0NLX1JFQURPTkxZKSA9PSAwKSB7Ci0gICAgICAgIGdsVGhpcy0+ZGlydHlfZmxhZyA9IFNVUkZBQ0VfTUVNT1JZX0RJUlRZOwotCSooZ2xUaGlzLT5nbG9iYWxfZGlydHlfZmxhZykgPSBTVVJGQUNFX01FTU9SWV9ESVJUWTsKLSAgICB9Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RUZXh0dXJlSW1wbF8yXzFUX0xvYWQoTFBESVJFQ1QzRFRFWFRVUkUyIGlmYWNlLAotCQkJCSAgTFBESVJFQ1QzRFRFWFRVUkUyIGxwRDNEVGV4dHVyZTIpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzcmNfcHRyID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGxwRDNEVGV4dHVyZTIpOwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKmRzdF9wdHIgPSBUaGlzOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnNyY19wdHIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgRDNEVGV4dHVyZTIpOworICAgIElXaW5lRDNEUGFsZXR0ZSAqd2luZV9wYWwsICp3aW5lX3BhbF9zcmM7CisgICAgSURpcmVjdERyYXdQYWxldHRlICpwYWwgPSBOVUxMLCAqcGFsX3NyYyA9IE5VTEw7CisgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqcGFsX2ltcGwsICpwYWxfaW1wbF9zcmM7CiAgICAgSFJFU1VMVCByZXRfdmFsdWUgPSBEM0RfT0s7Ci0gICAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRDNEVGV4dHVyZTIpOwogCi0gICAgaWYgKCgoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApICE9IChkc3RfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkpIHx8Ci0JKHNyY19wdHItPnN1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50ICE9IGRzdF9wdHItPnN1cmZhY2VfZGVzYy51Mi5kd01pcE1hcENvdW50KSkgeworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBzcmNfcHRyKTsKKworICAgIGlmICgoKHNyY19wdHItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKSAhPSAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApKSB8fAorICAgICAgICAoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQgIT0gVGhpcy0+c3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQpKQorICAgIHsKICAgICAgICAgRVJSKCJUcnlpbmcgdG8gbG9hZCBzdXJmYWNlcyB3aXRoIGRpZmZlcmVudCBtaXAtbWFwIGNvdW50cyAhXG4iKTsKICAgICB9CiAKLSAgICAvKiBOb3cgbG9vcCB0aHJvdWdoIGFsbCBtaXBtYXAgbGV2ZWxzIGFuZCBsb2FkIGFsbCBvZiB0aGVtLi4uICovCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqZ2xfZHN0X3B0ciA9IChJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICopIGRzdF9wdHItPnRleF9wcml2YXRlOwotCUREU1VSRkFDRURFU0MgKnNyY19kLCAqZHN0X2Q7Ci0JCi0JaWYgKGdsX2RzdF9wdHIgIT0gTlVMTCkgewotCSAgICBpZiAoZ2xfZHN0X3B0ci0+bG9hZGVkID09IEZBTFNFKSB7Ci0JICAgICAgICAvKiBPbmx5IGNoZWNrIG1lbW9yeSBmb3Igbm90IGFscmVhZHkgbG9hZGVkIHRleHR1cmUuLi4gKi8KLQkgICAgICAgIERXT1JEIG1lbV91c2VkOwotCQlpZiAoZHN0X3B0ci0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpCi0gICAgICAgICAgICAgICAgICAgIG1lbV91c2VkID0gZHN0X3B0ci0+c3VyZmFjZV9kZXNjLnUxLmR3TGluZWFyU2l6ZTsKLQkJZWxzZQotICAgICAgICAgICAgICAgICAgICBtZW1fdXNlZCA9IGRzdF9wdHItPnN1cmZhY2VfZGVzYy5kd0hlaWdodCAqIGRzdF9wdHItPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2g7Ci0JCWlmIChUaGlzLT5kZHJhd19vd25lci0+YWxsb2NhdGVfbWVtb3J5KFRoaXMtPmRkcmF3X293bmVyLCBtZW1fdXNlZCkgPCAwKSB7Ci0JCSAgICBUUkFDRSgiIG91dCBvZiB2aXJ0dWFsIG1lbW9yeS4uLiBXYXJuaW5nIGFwcGxpY2F0aW9uLlxuIik7Ci0JCSAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7Ci0JCX0KLQkgICAgfQotCSAgICBnbF9kc3RfcHRyLT5sb2FkZWQgPSBUUlVFOwotCX0KLSAgICAKLQlUUkFDRSgiIGNvcHlpbmcgc3VyZmFjZSAlcCB0byBzdXJmYWNlICVwIChtaXBtYXAgbGV2ZWwgJWQpXG4iLCBzcmNfcHRyLCBkc3RfcHRyLCBzcmNfcHRyLT5taXBtYXBfbGV2ZWwpOworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICBERFNVUkZBQ0VERVNDICpzcmNfZCwgKmRzdF9kOwogCi0JaWYgKCBkc3RfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0FMTE9DT05MT0FEICkKLQkgICAgLyogSWYgdGhlIHN1cmZhY2UgaXMgbm90IGFsbG9jYXRlZCBhbmQgaXRzIGxvY2F0aW9uIGlzIG5vdCB5ZXQgc3BlY2lmaWVkLAotCSAgICAgICBmb3JjZSBpdCB0byB2aWRlbyBtZW1vcnkgKi8gCi0JICAgIGlmICggIShkc3RfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiAoRERTQ0FQU19TWVNURU1NRU1PUll8RERTQ0FQU19WSURFT01FTU9SWSkpICkKLQkgICAgICAgIGRzdF9wdHItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX1ZJREVPTUVNT1JZOworICAgICAgICBUUkFDRSgiIGNvcHlpbmcgc3VyZmFjZSAlcCB0byBzdXJmYWNlICVwIChtaXBtYXAgbGV2ZWwgJWQpXG4iLCBzcmNfcHRyLCBUaGlzLCBzcmNfcHRyLT5taXBtYXBfbGV2ZWwpOwogCi0JLyogU3VwcHJlc3MgdGhlIEFMTE9DT05MT0FEIGZsYWcgKi8KLQlkc3RfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJj0gfkREU0NBUFNfQUxMT0NPTkxPQUQ7Ci0gICAgCi0JLyogQWZ0ZXIgc2VlaW5nIHNvbWUgbG9ncywgbm90IHN1cmUgYXQgYWxsIGFib3V0IHRoaXMuLi4gKi8KLQlpZiAoZHN0X3B0ci0+cGFsZXR0ZSA9PSBOVUxMKSB7Ci0JICAgIGRzdF9wdHItPnBhbGV0dGUgPSBzcmNfcHRyLT5wYWxldHRlOwotCSAgICBpZiAoc3JjX3B0ci0+cGFsZXR0ZSAhPSBOVUxMKSBJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKElDT01fSU5URVJGQUNFKHNyY19wdHItPnBhbGV0dGUsIElEaXJlY3REcmF3UGFsZXR0ZSkpOwotCX0gZWxzZSB7Ci0JICAgIGlmIChzcmNfcHRyLT5wYWxldHRlICE9IE5VTEwpIHsKLQkgICAgICAgIFBBTEVUVEVFTlRSWSBwYWxlbnRbMjU2XTsKLQkJSURpcmVjdERyYXdQYWxldHRlX0dldEVudHJpZXMoSUNPTV9JTlRFUkZBQ0Uoc3JjX3B0ci0+cGFsZXR0ZSwgSURpcmVjdERyYXdQYWxldHRlKSwKLQkJCQkJICAgICAgMCwgMCwgMjU2LCBwYWxlbnQpOwotCQlJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhJQ09NX0lOVEVSRkFDRShkc3RfcHRyLT5wYWxldHRlLCBJRGlyZWN0RHJhd1BhbGV0dGUpLAotCQkJCQkgICAgICAwLCAwLCAyNTYsIHBhbGVudCk7Ci0JICAgIH0KLQl9Ci0JCi0JLyogQ29weSBvbmUgc3VyZmFjZSBvbiB0aGUgb3RoZXIgKi8KLQlkc3RfZCA9IChERFNVUkZBQ0VERVNDICopJihkc3RfcHRyLT5zdXJmYWNlX2Rlc2MpOwotCXNyY19kID0gKEREU1VSRkFDRURFU0MgKikmKHNyY19wdHItPnN1cmZhY2VfZGVzYyk7CisgICAgICAgIGlmICggVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19BTExPQ09OTE9BRCApCisgICAgICAgICAgICAvKiBJZiB0aGUgc3VyZmFjZSBpcyBub3QgYWxsb2NhdGVkIGFuZCBpdHMgbG9jYXRpb24gaXMgbm90IHlldCBzcGVjaWZpZWQsCisgICAgICAgICAgICAgIGZvcmNlIGl0IHRvIHZpZGVvIG1lbW9yeSAqLyAKKyAgICAgICAgICAgIGlmICggIShUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiAoRERTQ0FQU19TWVNURU1NRU1PUll8RERTQ0FQU19WSURFT01FTU9SWSkpICkKKyAgICAgICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19WSURFT01FTU9SWTsKIAotCWlmICgoc3JjX2QtPmR3V2lkdGggIT0gZHN0X2QtPmR3V2lkdGgpIHx8IChzcmNfZC0+ZHdIZWlnaHQgIT0gZHN0X2QtPmR3SGVpZ2h0KSkgewotCSAgICAvKiBTaG91bGQgYWxzbyBjaGVjayBmb3Igc2FtZSBwaXhlbCBmb3JtYXQsIHUxLmxQaXRjaCwgLi4uICovCi0JICAgIEVSUigiRXJyb3IgaW4gc3VyZmFjZSBzaXplc1xuIik7Ci0JICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKLQl9IGVsc2UgewotCSAgICAvKiBMUERJUkVDVDNEREVWSUNFMiBkM2RkID0gKExQRElSRUNUM0RERVZJQ0UyKSBUaGlzLT5EM0RkZXZpY2U7ICovCi0JICAgIC8qIEkgc2hvdWxkIHB1dCBhIG1hY3JvIGZvciB0aGUgY2FsY3VsdXMgb2YgYnBwICovCi0JICAKLQkgICAgLyogQ29weSBhbHNvIHRoZSBDb2xvcktleWluZyBzdHVmZiAqLwotCSAgICBpZiAoc3JjX2QtPmR3RmxhZ3MgJiBERFNEX0NLU1JDQkxUKSB7Ci0JICAgICAgICBkc3RfZC0+ZHdGbGFncyB8PSBERFNEX0NLU1JDQkxUOwotCQlkc3RfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlID0gc3JjX2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKLQkJZHN0X2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUgPSBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKLQkgICAgfQorICAgICAgICAvKiBTdXBwcmVzcyB0aGUgQUxMT0NPTkxPQUQgZmxhZyAqLworICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJj0gfkREU0NBUFNfQUxMT0NPTkxPQUQ7CiAKLQkgICAgLyogQ29weSB0aGUgbWFpbiBtZW1vcnkgdGV4dHVyZSBpbnRvIHRoZSBzdXJmYWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIE9wZW5HTAotCSAgICAgICB0ZXh0dXJlIG9iamVjdC4gKi8KLQkgICAgaWYgKGRzdF9wdHItPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfRk9VUkNDKQotCSAgICAgICAgbWVtY3B5KGRzdF9kLT5scFN1cmZhY2UsIHNyY19kLT5scFN1cmZhY2UsIHNyY19wdHItPnN1cmZhY2VfZGVzYy51MS5kd0xpbmVhclNpemUpOwotCSAgICBlbHNlCi0JICAgICAgICBtZW1jcHkoZHN0X2QtPmxwU3VyZmFjZSwgc3JjX2QtPmxwU3VyZmFjZSwgc3JjX2QtPnUxLmxQaXRjaCAqIHNyY19kLT5kd0hlaWdodCk7CisgICAgICAgIC8qIEdldCB0aGUgcGFsZXR0ZXMgKi8KKyAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0dldFBhbGV0dGUoVGhpcy0+V2luZUQzRFN1cmZhY2UsICZ3aW5lX3BhbCk7CisgICAgICAgIGlmKCByZXRfdmFsdWUgIT0gRDNEX09LKQorICAgICAgICB7CisgICAgICAgICAgICBFUlIoIklXaW5lRDNEU3VyZmFjZTo6R2V0UGFsZXR0ZSBmYWlsZWQhIFRoaXMgaXMgdW5leHBlY3RlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYod2luZV9wYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEUGFsZXR0ZV9HZXRQYXJlbnQod2luZV9wYWwsIChJVW5rbm93biAqKikgJnBhbCk7CisgICAgICAgICAgICBpZihyZXRfdmFsdWUgIT0gRDNEX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVSUigiSVdpbmVEM0RQYWxldHRlOjpHZXRQYXJlbnQgZmFpbGVkISBUaGlzIGlzIHVuZXhwZWN0ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbF9pbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBwYWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHBhbF9pbXBsID0gTlVMTDsKKyAgICAgICAgfQogCi0JICAgIGlmIChnbF9kc3RfcHRyICE9IE5VTEwpIHsKLQkJLyogU2V0IHRoaXMgdGV4dHVyZSBhcyBkaXJ0eSAqLwotCQlnbF9kc3RfcHRyLT5kaXJ0eV9mbGFnID0gU1VSRkFDRV9NRU1PUllfRElSVFk7Ci0JCSooZ2xfZHN0X3B0ci0+Z2xvYmFsX2RpcnR5X2ZsYWcpID0gU1VSRkFDRV9NRU1PUllfRElSVFk7Ci0JICAgIH0KLQl9CisgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEU3VyZmFjZV9HZXRQYWxldHRlKHNyY19wdHItPldpbmVEM0RTdXJmYWNlLCAmd2luZV9wYWxfc3JjKTsKKyAgICAgICAgaWYoIHJldF92YWx1ZSAhPSBEM0RfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUigiSVdpbmVEM0RTdXJmYWNlOjpHZXRQYWxldHRlIGZhaWxlZCEgVGhpcyBpcyB1bmV4cGVjdGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKKyAgICAgICAgfQorICAgICAgICBpZih3aW5lX3BhbF9zcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEUGFsZXR0ZV9HZXRQYXJlbnQod2luZV9wYWxfc3JjLCAoSVVua25vd24gKiopICZwYWxfc3JjKTsKKyAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVJSKCJJV2luZUQzRFBhbGV0dGU6OkdldFBhcmVudCBmYWlsZWQhIFRoaXMgaXMgdW5leHBlY3RlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFsX2ltcGxfc3JjID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBwYWxfc3JjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhbF9pbXBsX3NyYyA9IE5VTEw7CisgICAgICAgIH0KIAotCWlmIChzcmNfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkgewotCSAgICBzcmNfcHRyID0gZ2V0X3N1Yl9taW1hcGxldmVsKHNyY19wdHIpOwotCX0gZWxzZSB7Ci0JICAgIHNyY19wdHIgPSBOVUxMOwotCX0KLQlpZiAoZHN0X3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApIHsKLQkgICAgZHN0X3B0ciA9IGdldF9zdWJfbWltYXBsZXZlbChkc3RfcHRyKTsKLQl9IGVsc2UgewotCSAgICBkc3RfcHRyID0gTlVMTDsKLQl9CisgICAgICAgIC8qIEFmdGVyIHNlZWluZyBzb21lIGxvZ3MsIG5vdCBzdXJlIGF0IGFsbCBhYm91dCB0aGlzLi4uICovCisgICAgICAgIGlmIChwYWxfaW1wbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfU2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwgd2luZV9wYWwpOworICAgICAgICAgICAgaWYgKHBhbF9pbXBsX3NyYyAhPSBOVUxMKSBJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKElDT01fSU5URVJGQUNFKHBhbF9pbXBsX3NyYywgSURpcmVjdERyYXdQYWxldHRlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFsX2ltcGxfc3JjICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEFMRVRURUVOVFJZIHBhbGVudFsyNTZdOworICAgICAgICAgICAgICAgIElEaXJlY3REcmF3UGFsZXR0ZV9HZXRFbnRyaWVzKElDT01fSU5URVJGQUNFKHBhbF9pbXBsX3NyYywgSURpcmVjdERyYXdQYWxldHRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTYsIHBhbGVudCk7CisgICAgICAgICAgICAgICAgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoSUNPTV9JTlRFUkZBQ0UocGFsX2ltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMjU2LCBwYWxlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQlpZiAoKHNyY19wdHIgPT0gTlVMTCkgfHwgKGRzdF9wdHIgPT0gTlVMTCkpIHsKLQkgICAgaWYgKHNyY19wdHIgIT0gZHN0X3B0cikgewotCSAgICAgICAgRVJSKCIgTG9hZGluZyBzdXJmYWNlIHdpdGggZGlmZmVyZW50IG1pcG1hcCBzdHJ1Y3R1cmUgISEhXG4iKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9CisgICAgICAgIC8qIENvcHkgb25lIHN1cmZhY2Ugb24gdGhlIG90aGVyICovCisgICAgICAgIGRzdF9kID0gKEREU1VSRkFDRURFU0MgKikmKFRoaXMtPnN1cmZhY2VfZGVzYyk7CisgICAgICAgIHNyY19kID0gKEREU1VSRkFDRURFU0MgKikmKHNyY19wdHItPnN1cmZhY2VfZGVzYyk7CisKKyAgICAgICAgaWYgKChzcmNfZC0+ZHdXaWR0aCAhPSBkc3RfZC0+ZHdXaWR0aCkgfHwgKHNyY19kLT5kd0hlaWdodCAhPSBkc3RfZC0+ZHdIZWlnaHQpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTaG91bGQgYWxzbyBjaGVjayBmb3Igc2FtZSBwaXhlbCBmb3JtYXQsIHUxLmxQaXRjaCwgLi4uICovCisgICAgICAgICAgICBFUlIoIkVycm9yIGluIHN1cmZhY2Ugc2l6ZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV0lORUQzRExPQ0tFRF9SRUNUIHBTcmNSZWN0LCBwRHN0UmVjdDsKKworICAgICAgICAgICAgLyogTFBESVJFQ1QzRERFVklDRTIgZDNkZCA9IChMUERJUkVDVDNEREVWSUNFMikgVGhpcy0+RDNEZGV2aWNlOyAqLworICAgICAgICAgICAgLyogSSBzaG91bGQgcHV0IGEgbWFjcm8gZm9yIHRoZSBjYWxjdWx1cyBvZiBicHAgKi8KKworICAgICAgICAgICAgLyogQ29weSBhbHNvIHRoZSBDb2xvcktleWluZyBzdHVmZiAqLworICAgICAgICAgICAgaWYgKHNyY19kLT5kd0ZsYWdzICYgRERTRF9DS1NSQ0JMVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RfZC0+ZHdGbGFncyB8PSBERFNEX0NLU1JDQkxUOworICAgICAgICAgICAgICAgIGRzdF9kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUgPSBzcmNfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlOworICAgICAgICAgICAgICAgIGRzdF9kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlID0gc3JjX2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENvcHkgdGhlIG1haW4gbWVtb3J5IHRleHR1cmUgaW50byB0aGUgc3VyZmFjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBPcGVuR0wKKyAgICAgICAgICAgICAgdGV4dHVyZSBvYmplY3QuICovCisKKyAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEU3VyZmFjZV9Mb2NrUmVjdChzcmNfcHRyLT5XaW5lRDNEU3VyZmFjZSwgJnBTcmNSZWN0LCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVJSKCIgKCVwKSBMb2NraW5nIHRoZSBzb3VyY2Ugc3VyZmFjZSBmYWlsZWRcbiIsIFRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0xvY2tSZWN0KFRoaXMtPldpbmVEM0RTdXJmYWNlLCAmcERzdFJlY3QsIE5VTEwsIDApOworICAgICAgICAgICAgaWYocmV0X3ZhbHVlICE9IEQzRF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUlIoIiAoJXApIExvY2tpbmcgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UgZmFpbGVkXG4iLCBUaGlzKTsKKyAgICAgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChzcmNfcHRyLT5XaW5lRDNEU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpCisgICAgICAgICAgICAgICAgbWVtY3B5KHBEc3RSZWN0LnBCaXRzLCBwU3JjUmVjdC5wQml0cywgc3JjX3B0ci0+c3VyZmFjZV9kZXNjLnUxLmR3TGluZWFyU2l6ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWVtY3B5KHBEc3RSZWN0LnBCaXRzLCBwU3JjUmVjdC5wQml0cywgcFNyY1JlY3QuUGl0Y2ggKiBzcmNfZC0+ZHdIZWlnaHQpOworCisgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChzcmNfcHRyLT5XaW5lRDNEU3VyZmFjZSk7CisgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChUaGlzLT5XaW5lRDNEU3VyZmFjZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyY19wdHIgPSBnZXRfc3ViX21pbWFwbGV2ZWwoc3JjX3B0cik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzcmNfcHRyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19NSVBNQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRoaXMgPSBnZXRfc3ViX21pbWFwbGV2ZWwoVGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBUaGlzID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc3JjX3B0ciA9PSBOVUxMKSB8fCAoVGhpcyA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyY19wdHIgIT0gVGhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUlIoIiBMb2FkaW5nIHN1cmZhY2Ugd2l0aCBkaWZmZXJlbnQgbWlwbWFwIHN0cnVjdHVyZSAhISFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmV0X3ZhbHVlOwogfQogCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9RdWVyeUludGVyZmFjZShMUERJUkVDVDNEVEVYVFVSRTIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Mb2FkKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFRleHR1cmUgKkQzRFRleHR1cmUpCiB7Ci0gICAgVFJBQ0UoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKLSAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKSwKLQkJCQkJICAgICAgcmlpZCwKLQkJCQkJICAgICAgb2JwKTsKLX0KKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGV4dHVyZSA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIEQzRFRleHR1cmUpOworICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIFRoaXMsIFRleHR1cmUpOwogCi1VTE9ORyBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfQWRkUmVmKExQRElSRUNUM0RURVhUVVJFMiBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX1JlbGVhc2UoTFBESVJFQ1QzRFRFWFRVUkUyIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRFRFWFRVUkUgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwotICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1F1ZXJ5SW50ZXJmYWNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBpZmFjZSksCi0JCQkJCSAgICAgIHJpaWQsCi0JCQkJCSAgICAgIG9icCk7Ci19Ci0KLVVMT05HIFdJTkFQSQotVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYoTFBESVJFQ1QzRFRFWFRVUkUgaWZhY2UpCi17Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwotICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdERyYXdTdXJmYWNlNywgaWZhY2UpKTsKLX0KLQotVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1JlbGVhc2UoTFBESVJFQ1QzRFRFWFRVUkUgaWZhY2UpCi17Ci0gICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3REcmF3U3VyZmFjZTcgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwotICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKSk7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1BhbGV0dGVDaGFuZ2VkKExQRElSRUNUM0RURVhUVVJFIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NvdW50KQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkd1N0YXJ0LCBkd0NvdW50KTsKLSAgICByZXR1cm4gSURpcmVjdDNEVGV4dHVyZTJfUGFsZXR0ZUNoYW5nZWQoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q291bnQpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9HZXRIYW5kbGUoTFBESVJFQ1QzRFRFWFRVUkUgaWZhY2UsCi0JCQkJICAgICAgIExQRElSRUNUM0RERVZJQ0UgbHBEaXJlY3QzRERldmljZSwKLQkJCQkgICAgICAgTFBEM0RURVhUVVJFSEFORExFIGxwSGFuZGxlKQotewotICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlLCBscEhhbmRsZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRFRleHR1cmUyX0dldEhhbmRsZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKSwKLQkJCQkgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlMiwgbHBEaXJlY3QzRERldmljZSksCi0JCQkJICAgICAgIGxwSGFuZGxlKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfTG9hZChMUERJUkVDVDNEVEVYVFVSRSBpZmFjZSwKLQkJCQkgIExQRElSRUNUM0RURVhUVVJFIGxwRDNEVGV4dHVyZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEM0RUZXh0dXJlKTsKICAgICByZXR1cm4gSURpcmVjdDNEVGV4dHVyZTJfTG9hZChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZSwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKSwKLQkJCQkgIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgbHBEM0RUZXh0dXJlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3QzRFRleHR1cmUyLCBEM0RUZXh0dXJlKSk7CiB9CiAKLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodHlwZW9mKFZUQUJMRV9JRGlyZWN0M0RUZXh0dXJlMi5mdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh2b2lkKikKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgSURpcmVjdDNEVGV4dHVyZTJWdGJsIFZUQUJMRV9JRGlyZWN0M0RUZXh0dXJlMiA9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBWVGFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBJRGlyZWN0M0RUZXh0dXJlMlZ0YmwgSURpcmVjdDNEVGV4dHVyZTJfVnRibCA9CiB7Ci0gICAgWENBU1QoUXVlcnlJbnRlcmZhY2UpIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKSBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX1JlbGVhc2UsCi0gICAgWENBU1QoR2V0SGFuZGxlKSBNYWluX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfMVRfR2V0SGFuZGxlLAotICAgIFhDQVNUKFBhbGV0dGVDaGFuZ2VkKSBNYWluX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfMVRfUGFsZXR0ZUNoYW5nZWQsCi0gICAgWENBU1QoTG9hZCkgR0xfSURpcmVjdDNEVGV4dHVyZUltcGxfMl8xVF9Mb2FkLAorICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfUXVlcnlJbnRlcmZhY2UsCisgICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9BZGRSZWYsCisgICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9SZWxlYXNlLAorICAgIElEaXJlY3QzRFRleHR1cmVJbXBsX0dldEhhbmRsZSwKKyAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF9QYWxldHRlQ2hhbmdlZCwKKyAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF9Mb2FkLAogfTsKIAotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSN1bmRlZiBYQ0FTVAotI2VuZGlmCiAKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh0eXBlb2YoVlRBQkxFX0lEaXJlY3QzRFRleHR1cmUuZnVuKSkKLSNlbHNlCi0jIGRlZmluZSBYQ0FTVChmdW4pICAgICAodm9pZCopCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIFZUQUJMRV9JRGlyZWN0M0RUZXh0dXJlID0KK2NvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIElEaXJlY3QzRFRleHR1cmUxX1Z0YmwgPQogewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZikgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYsCi0gICAgWENBU1QoUmVsZWFzZSkgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9SZWxlYXNlLAotICAgIFhDQVNUKEluaXRpYWxpemUpIE1haW5fSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Jbml0aWFsaXplLAotICAgIFhDQVNUKEdldEhhbmRsZSkgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9HZXRIYW5kbGUsCi0gICAgWENBU1QoUGFsZXR0ZUNoYW5nZWQpIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUGFsZXR0ZUNoYW5nZWQsCi0gICAgWENBU1QoTG9hZCkgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Mb2FkLAotICAgIFhDQVNUKFVubG9hZCkgTWFpbl9JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1VubG9hZCwKKyAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAorICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfQWRkUmVmLAorICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUmVsZWFzZSwKKyAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0luaXRpYWxpemUsCisgICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9HZXRIYW5kbGUsCisgICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9QYWxldHRlQ2hhbmdlZCwKKyAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0xvYWQsCisgICAgSURpcmVjdDNEVGV4dHVyZUltcGxfMV9VbmxvYWQsCiB9OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotSFJFU1VMVCBkM2R0ZXh0dXJlX2NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKmQzZCwgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3VyZiwgQk9PTEVBTiBhdF9jcmVhdGlvbiwgCi0JCQkgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKm1haW4pCi17Ci0gICAgLyogRmlyc3QsIGluaXRpYWxpemUgdGhlIHRleHR1cmUgdnRhYmxlcy4uLiAqLwotICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdDNEVGV4dHVyZSwgIFZUQUJMRV9JRGlyZWN0M0RUZXh0dXJlKTsKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKHN1cmYsIElEaXJlY3QzRFRleHR1cmUyLCBWVEFCTEVfSURpcmVjdDNEVGV4dHVyZTIpOwotCQotICAgIC8qIE9ubHkgY3JlYXRlIGFsbCB0aGUgcHJpdmF0ZSBzdHVmZiBpZiB3ZSBhY3R1YWxseSBoYXZlIGFuIE9wZW5HTCBjb250ZXh0Li4gKi8KLSAgICBpZiAoZDNkLT5jdXJyZW50X2RldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIElEaXJlY3QzRFRleHR1cmVHTEltcGwgKnByaXZhdGU7Ci0KLSAgICAgICAgcHJpdmF0ZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoSURpcmVjdDNEVGV4dHVyZUdMSW1wbCkpOwotCWlmIChwcml2YXRlID09IE5VTEwpIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKLQotCXN1cmYtPnRleF9wcml2YXRlID0gcHJpdmF0ZTsKLQkKLQlwcml2YXRlLT5maW5hbF9yZWxlYXNlID0gc3VyZi0+ZmluYWxfcmVsZWFzZTsKLQlwcml2YXRlLT5sb2NrX3VwZGF0ZSA9IHN1cmYtPmxvY2tfdXBkYXRlOwotCXByaXZhdGUtPnVubG9ja191cGRhdGUgPSBzdXJmLT51bmxvY2tfdXBkYXRlOwotCXByaXZhdGUtPnNldF9wYWxldHRlID0gc3VyZi0+c2V0X3BhbGV0dGU7Ci0JCi0JLyogSWYgYXQgY3JlYXRpb24sIHdlIGNhbiBvcHRpbWl6ZSBzdHVmZiBhbmQgd2FpdCB0aGUgZmlyc3QgJ3VubG9jaycgdG8gdXBsb2FkIGEgdmFsaWQgc3R1ZmYgdG8gT3BlbkdMLgotCSAgIE90aGVyd2lzZSwgaXQgd2lsbCBiZSB1cGxvYWRlZCBoZXJlIChhbmQgbWF5IGJlIGludmFsaWQpLiAqLwotCXN1cmYtPmZpbmFsX3JlbGVhc2UgPSBnbHRleF9maW5hbF9yZWxlYXNlOwotCXN1cmYtPmxvY2tfdXBkYXRlID0gZ2x0ZXhfbG9ja191cGRhdGU7Ci0Jc3VyZi0+dW5sb2NrX3VwZGF0ZSA9IGdsdGV4X3VubG9ja191cGRhdGU7Ci0Jc3VyZi0+YXV4X3NldGNvbG9ya2V5X2NiID0gZ2x0ZXhfc2V0Y29sb3JrZXlfY2I7Ci0Jc3VyZi0+c2V0X3BhbGV0dGUgPSBnbHRleF9zZXRfcGFsZXR0ZTsKLQotCS8qIFdlIGFyZSB0aGUgb25seSBvbmUgdG8gdXNlIHRoZSBhdXhfYmx0IGFuZCBhdXhfYmx0ZmFzdCBvdmVycmlkZXMsIHNvIG5vIG5lZWQKLQkgICB0byBzYXZlIHRob3NlLi4uICovCi0Jc3VyZi0+YXV4X2JsdCA9IGdsdGV4X2JsdDsKLQlzdXJmLT5hdXhfYmx0ZmFzdCA9IGdsdGV4X2JsdGZhc3Q7Ci0JCi0JVFJBQ0UoIiBHTCB0ZXh0dXJlIGNyZWF0ZWQgZm9yIHN1cmZhY2UgJXAgKHByaXZhdGUgZGF0YSBhdCAlcClcbiIsIHN1cmYsIHByaXZhdGUpOwotCi0JLyogRG8gbm90IGNyZWF0ZSB0aGUgT3BlbkdMIHRleHR1cmUgaWQgaGVyZSBhcyBzb21lIGdhbWUgZ2VuZXJhdGUgdGV4dHVyZXMgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgd2hpY2gKLQkgICAgY2F1c2UgcHJvYmxlbXMuLiAqLwotCXByaXZhdGUtPnRleF9uYW1lID0gMDsKLQlpZiAoc3VyZi0+bWlwbWFwX2xldmVsID09IDApIHsKLQkgICAgcHJpdmF0ZS0+bWFpbiA9IE5VTEw7Ci0JICAgIHByaXZhdGUtPl9fZ2xvYmFsX2RpcnR5X2ZsYWcgPSBTVVJGQUNFX01FTU9SWV9ESVJUWTsKLQkgICAgcHJpdmF0ZS0+Z2xvYmFsX2RpcnR5X2ZsYWcgPSAmKHByaXZhdGUtPl9fZ2xvYmFsX2RpcnR5X2ZsYWcpOwotCX0gZWxzZSB7Ci0JICAgIHByaXZhdGUtPm1haW4gPSBtYWluOwotCSAgICBwcml2YXRlLT5nbG9iYWxfZGlydHlfZmxhZyA9ICYoKChJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICopIChwcml2YXRlLT5tYWluLT50ZXhfcHJpdmF0ZSkpLT5fX2dsb2JhbF9kaXJ0eV9mbGFnKTsKLQl9Ci0JcHJpdmF0ZS0+aW5pdGlhbF91cGxvYWRfZG9uZSA9IEZBTFNFOwotCXByaXZhdGUtPmRpcnR5X2ZsYWcgPSBTVVJGQUNFX01FTU9SWV9ESVJUWTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRDNEX09LOwotfQotCi1HTHVpbnQgZ2x0ZXhfZ2V0X3RleF9uYW1lKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYpCi17Ci0gICAgSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqcHJpdmF0ZSA9IChJRGlyZWN0M0RUZXh0dXJlR0xJbXBsICopIChzdXJmLT50ZXhfcHJpdmF0ZSk7Ci0gICAgCi0gICAgaWYgKHByaXZhdGUtPnRleF9uYW1lID09IDApIHsKLQkvKiBUaGUgdGV4dHVyZSB3YXMgbm90IGNyZWF0ZWQgeWV0Li4uICovCQotCUVOVEVSX0dMKCk7Ci0JaWYgKHN1cmYtPm1pcG1hcF9sZXZlbCA9PSAwKSB7Ci0JICAgIGdsR2VuVGV4dHVyZXMoMSwgJihwcml2YXRlLT50ZXhfbmFtZSkpOwotCSAgICBpZiAocHJpdmF0ZS0+dGV4X25hbWUgPT0gMCkgRVJSKCJFcnJvciBhdCBjcmVhdGlvbiBvZiBPcGVuR0wgdGV4dHVyZSBJRCAhXG4iKTsKLQkgICAgVFJBQ0UoIiBHTCB0ZXh0dXJlIGlkIGlzIDogJWQuXG4iLCBwcml2YXRlLT50ZXhfbmFtZSk7Ci0JfSBlbHNlIHsKLQkgICAgcHJpdmF0ZS0+dGV4X25hbWUgPSBnbHRleF9nZXRfdGV4X25hbWUocHJpdmF0ZS0+bWFpbik7Ci0JICAgIFRSQUNFKCIgR0wgdGV4dHVyZSBpZCByZXVzaW5nIGlkICVkIGZyb20gc3VyZmFjZSAlcCAocHJpdmF0ZSBhdCAlcCkpLlxuIiwgcHJpdmF0ZS0+dGV4X25hbWUsIHByaXZhdGUtPm1haW4sIHByaXZhdGUtPm1haW4tPnRleF9wcml2YXRlKTsKLQl9Ci0JTEVBVkVfR0woKTsKLSAgICB9Ci0gICAgcmV0dXJuICgoSURpcmVjdDNEVGV4dHVyZUdMSW1wbCAqKSAoc3VyZi0+dGV4X3ByaXZhdGUpKS0+dGV4X25hbWU7Ci19CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3V0aWxzLmMgYi9kbGxzL2RkcmF3L3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmZDUxYgotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvZGRyYXcvdXRpbHMuYwpAQCAtMCwwICsxLDExNzEgQEAKKy8qCisgKiBEaXJlY3REcmF3IGhlbHBlciBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBNYXJjdXMgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAoYykgMTk5OCBMaW9uZWwgVWxtZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2RlZmluZSBOT05BTUVMRVNTVU5JT04KKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCisKK1dJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKwordm9pZCBERFJBV19kdW1wX2ZsYWdzXyhEV09SRCBmbGFncywgY29uc3QgZmxhZ19pbmZvKiBuYW1lcywgc2l6ZV90IG51bV9uYW1lcywgaW50IG5ld2xpbmUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0RECisgKgorICogQ29udmVydHMgYW4gV0lORUQzREZPUk1BVCB2YWx1ZSBpbnRvIGEgRERQSVhFTEZPUk1BVCBzdHJ1Y3R1cmUKKyAqCisgKiBQYXJhbXM6CisgKiAgRERQaXhlbEZvcm1hdDogQWRkcmVzcyBvZiB0aGUgc3RydWN0dXJlIHRvIHdyaXRlIHRoZSBwaXhlbCBmb3JtYXQgdG8KKyAqICBXaW5lRDNERm9ybWF0OiBTb3VyY2UgZm9ybWF0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RGT1JNQVQgV2luZUQzREZvcm1hdCkKK3sKKyAgICBEV09SRCBTaXplID0gRERQaXhlbEZvcm1hdC0+ZHdTaXplOworICAgIFRSQUNFKCJDb252ZXJ0aW5nIFdJTkVEM0RGT1JNQVQgJWQgdG8gRERSQVdcbiIsIFdpbmVEM0RGb3JtYXQpOworCisgICAgaWYoU2l6ZT09MCkgcmV0dXJuOworCisgICAgbWVtc2V0KEREUGl4ZWxGb3JtYXQsIDB4MDAsIFNpemUpOworICAgIEREUGl4ZWxGb3JtYXQtPmR3U2l6ZSA9IFNpemU7CisgICAgc3dpdGNoKFdpbmVEM0RGb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjhHOEI4OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDI0OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBmZjAwMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMGZmOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThSOEc4Qjg6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDMyOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBmZjAwMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMGZmOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweGZmMDAwMDAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX1g4UjhHOEI4OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDMyOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBmZjAwMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMGZmOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhCOEc4Ujg6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMzI7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwMDAwMDBmZjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBmZjAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDBmZjAwMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0lORUQzREZNVF9SNUc2QjU6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHhGODAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDdFMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMUY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0lORUQzREZNVF9YMVI1RzVCNToKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDdDMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwM0UwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX0ExUjVHNUI1OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDdDMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwM0UwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHg4MDAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E0UjRHNEI0OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDBGMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMEYwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwRjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHhGMDAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX1IzRzNCMjoKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSA4OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4RTA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgxQzsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAzOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9QQUxFVFRFSU5ERVhFRDggfCBERFBGX1JHQjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSA4OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQUxQSEE7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGggPSA4OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThSM0czQjI6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBFMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMUM7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDAzOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweEYwMDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDRSNEc0QjQ6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwRjAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDBGMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMEY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKiBIb3cgYXJlIFogYnVmZmVyIGJpdCBkZXB0aCBhbmQgU3RlbmNpbCBidWZmZXIgYml0IGRlcHRoIHJlbGF0ZWQ/CisgICAgICAgICAqLworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE2OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMTY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwMDAwRkZGRjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQlpCaXRNYXNrID0gMHgwMDAwRkZGRjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0lORUQzREZNVF9EMzI6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGggPSAzMjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweEZGRkZGRkZGOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCWkJpdE1hc2sgPSAweEZGRkZGRkZGOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFg0UzQ6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOworICAgICAgICAgICAgLyogU2hvdWxkIEkgc2V0IGR3WkJ1ZmZlckJpdERlcHRoIHRvIDMyIGhlcmU/ICovCisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDI0OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPSA0OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdaQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRTODoKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1pCVUZGRVIgfCBERFBGX1NURU5DSUxCVUZGRVI7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CisgICAgICAgICAgICAvKiBTaG91bGQgSSBzZXQgZHdaQnVmZmVyQml0RGVwdGggdG8gMzIgaGVyZT8gKi8KKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMjQ7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDg7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFg4OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMjQ7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDg7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QxNVMxOgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUiB8IEREUEZfU1RFTkNJTEJVRkZFUjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIC8qIFNob3VsZCBJIHNldCBkd1pCdWZmZXJCaXREZXB0aCB0byAxNiBoZXJlPyAqLworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGggPSAxNTsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gMTsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVVlWWToKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX1lVWTI6CisgICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQxOgorICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMjoKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDM6CisgICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ0OgorICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUNToKKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX01VTFRJMl9BUkdCOgorICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRzhSOF9HOEI4OgorICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjhHOF9COEc4OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfRk9VUkNDOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSBXaW5lRDNERm9ybWF0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogTHVtaW5hbmNlICovCisgICAgICAgIGNhc2UgV0lORUQzREZNVF9MODoKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0xVTUlOQU5DRTsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQgPSA4OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdMdW1pbmFuY2VCaXRNYXNrID0gMHhmZjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV0lORUQzREZNVF9BNEw0OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQUxQSEFQSVhFTFMgfCBERFBGX0xVTUlOQU5DRTsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQgPSA0OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdMdW1pbmFuY2VCaXRNYXNrID0gMHgwZjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4ZjA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThMODoKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0FMUEhBUElYRUxTIHwgRERQRl9MVU1JTkFOQ0U7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50ID0gMTY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0x1bWluYW5jZUJpdE1hc2sgPSAweDAwZmY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAweDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrID0gMHgwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweGZmMDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBCdW1wIG1hcHBpbmcgKi8KKyAgICAgICAgY2FzZSBXSU5FRDNERk1UX1Y4VTg6CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9CVU1QRFVEVjsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKKyAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3QnVtcEJpdENvdW50ID0gMTY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0J1bXBEdUJpdE1hc2sgPSAgICAgICAgIDB4MDAwMDAwZmY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAgICAgICAgIDB4MDAwMGZmMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrID0gIDB4MDAwMDAwMDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDZWNVU1OgorICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQlVNUERVRFY7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CisgICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0J1bXBCaXRDb3VudCA9IDE2OworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrID0gICAgICAgICAweDAwMDAwMDFmOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrID0gICAgICAgICAweDAwMDAwM2UwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9ICAweDAwMDBmYzAwOworICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVSUigiQ2FuJ3QgdHJhbnNsYXRlIHRoaXMgUGl4ZWxmb3JtYXQgJWRcbiIsIFdpbmVEM0RGb3JtYXQpOworICAgIH0KKworICAgIGlmKFRSQUNFX09OKGRkcmF3KSkgeworICAgICAgICBUUkFDRSgiUmV0dXJuaW5nOiAiKTsKKyAgICAgICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdChERFBpeGVsRm9ybWF0KTsKKyAgICAgICAgVFJBQ0UoIlxuIik7CisgICAgfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQaXhlbEZvcm1hdF9ERDJXaW5lRDNECisgKgorICogUmVhZHMgYSBERFBJWEVMRk9STUFUIHN0cnVjdHVyZSBhbmQgcmV0dXJucyB0aGUgZXF1YWwgV0lORUQzREZPUk1BVAorICoKKyAqIFBhcmFtczoKKyAqICBERFBpeGVsRm9ybWF0OiBUaGUgc291cmNlIGZvcm1hdAorICoKKyAqIFJldHVybnM6CisgKiAgVGhlIFdJTkVEM0RGT1JNQVQgZXF1YWwgdG8gdGhlIEREcmF3IGZvcm1hdAorICogIFdJTkVEM0RGTVRfVU5LTk9XTiBpZiBhIG1hdGNoaW5nIGZvcm1hdCB3YXNuJ3QgZm91bmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dJTkVEM0RGT1JNQVQKK1BpeGVsRm9ybWF0X0REMldpbmVEM0QoRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCkKK3sKKyAgICBUUkFDRSgiQ29udmVydCBhIERpcmVjdERyYXcgUGl4ZWxmb3JtYXQgdG8gYSBXaW5lRDNEIFBpeGVsZm9ybWF0XG4iKTsgICAgCisgICAgaWYoVFJBQ0VfT04oZGRyYXcpKQorICAgIHsKKyAgICAgICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdChERFBpeGVsRm9ybWF0KTsKKyAgICAgICAgVFJBQ0UoIlxuIik7CisgICAgfQorCisgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfUEFMRVRURUlOREVYRUQ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfUDg7CisgICAgfQorICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIChERFBGX1BBTEVUVEVJTkRFWEVEMSB8IEREUEZfUEFMRVRURUlOREVYRUQyIHwgRERQRl9QQUxFVFRFSU5ERVhFRDQpICkKKyAgICB7CisgICAgICAgIEZJWE1FKCJERFBGX1BBTEVUVEVJTkRFWEVEMSB0byBERFBGX1BBTEVUVEVJTkRFWEVENCBhcmUgbm90IHN1cHBvcnRlZCBieSBXaW5lRDNEICh5ZXQpLiBSZXR1cm5pbmcgV0lORUQzREZNVF9QOFxuIik7CisgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1A4OworICAgIH0KKyAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX1JHQikKKyAgICB7CisgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgb25seSBmb3JtYXQgdGhhdCBjYW4gbWF0Y2ggaGVyZSAqLworICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1IzRzNCMjsKKworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBDb2xvciBtYXNrcyAqLworICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweEY4MDApICYmCisgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDdFMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDFGKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SNUc2QjU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID09IDB4N0MwMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwM0UwKSAmJgorICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMUYpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHg4MDAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0ExUjVHNUI1OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9YMVI1RzVCNTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPT0gMHgwRjAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9PSAweDAwRjApICYmCisgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAwRikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9BTFBIQVBJWEVMUykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEYwMDApKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTRSNEc0QjQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1g0UjRHNEI0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCisgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEZGMDApICYmCisgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID09IDB4MDBFMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwMDFDKSAmJgorICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMDMpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0E4UjNHM0IyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFUlIoIjE2IGJpdCBSR0IgUGl4ZWwgZm9ybWF0IGRvZXMgbm90IG1hdGNoXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOworCisgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1I4RzhCODsKKworICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBDb2xvciBtYXNrcyAqLworICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDAwRkYwMDAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9PSAweDAwMDBGRjAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMDAwMEZGKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4RkYwMDAwMDApKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQThSOEc4Qjg7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1g4UjhHOEI4OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVSUigiMzIgYml0IFJHQiBwaXhlbCBmb3JtYXQgZG9lcyBub3QgbWF0Y2hcbiIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEVSUigiSW52YWxpZCBkd1JHQkJpdENvdW50IGluIFBpeGVsZm9ybWF0IHN0cnVjdHVyZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEEpICkKKyAgICB7CisgICAgICAgIC8qIEFscGhhIG9ubHkgUGl4ZWxmb3JtYXQgKi8KKyAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIEVSUigiVW5zdXBwb3J0ZWQgQWxwaGEtT25seSBiaXQgZGVwdGggMHglbHhcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCk7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTg7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRVJSKCJJbnZhbGlkIEFscGhhQml0RGVwdGggaW4gQWxwaGEtT25seSBQaXhlbGZvcm1hdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0xVTUlOQU5DRSkKKyAgICB7CisgICAgICAgIC8qIEx1bWluYW5jZS1vbmx5IG9yIGx1bWluYW5jZS1hbHBoYSAqLworICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9BTFBIQVBJWEVMUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogTHVtaW5hbmNlIHdpdGggQWxwaGEgKi8KKyAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+dTEuZHdBbHBoYUJpdERlcHRoID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BNEw0OworICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gQWxwaGEgLyBMdW1pbmFuY2UgYml0IGRlcHRoIGNvbWJpbmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKKworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgRVJSKCJBIGx1bWluYW5jZSBQaXhlbGZvcm1hdCBzaG91bGRuJ3QgaGF2ZSA2IGx1bWluYW5jZSBiaXRzLiBSZXR1cm5pbmcgRDNERk1UX0w2VjVVNSBmb3Igbm93ISFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9MNlY1VTU7CisKKyAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCA9PSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQThMODsKKyAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmtvd24gQWxwaGEgLyBMdW1pbmNhc2UgYml0IGRlcHRoIGNvbWJpbmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEx1bWluYW5jZS1vbmx5ICovCisgICAgICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIEVSUigiQSBsdW1pbmFuY2UgUGl4ZWxmb3JtYXQgc2hvdWxkbid0IGhhdmUgNiBsdW1pbmFuY2UgYml0cy4gUmV0dXJuaW5nIEQzREZNVF9MNlY1VTUgZm9yIG5vdyEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDZWNVU1OworCisgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9MODsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEVSUigiVW5rb3duIGx1bWluYW5jZS1vbmx5IGJpdCBkZXB0aCAweCVseFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CisgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfWkJVRkZFUikKKyAgICB7CisgICAgICAgIC8qIFogYnVmZmVyICovCisgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX1NURU5DSUxCVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgIEVSUigiOCBCaXRzIForU3RlbmNpbCBidWZmZXIgcGl4ZWxmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gUmV0dXJuaW5nIFdJTkVEM0RGTVRfVU5LT1dOXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKKworICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QxNVMxOworCisgICAgICAgICAgICAgICAgICAgIEVSUigiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGEgMTYgYml0IFogYnVmZmVyIHdpdGggJWxkIGJpdCBzdGVuY2lsIGJ1ZmZlciBwaXhlbGZvcm1hdFxuIiwgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOworCisgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgRVJSKCJEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgYSAyNCBiaXQgZGVwdGggYnVmZmVyIHdpdGggc3RlbmNpbCBiaXRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0Uzg7CisKKyAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9PSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0Uzg7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QyNFg0UzQ7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFUlIoIlVua293biBaIGJ1ZmZlciBkZXB0aCAlbGRcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgIEVSUigiOCBCaXQgWiBidWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkLiBUcnlpbmcgYSAxNiBCaXQgb25lXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDE2OworCisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDE2OworCisgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0WDg7CisKKyAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMzI7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFUlIoIlVuc3VwcG9ydGVkIFogYnVmZmVyIGRlcHRoICVsZFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfRk9VUkNDKQorICAgIHsKKyAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnVScsICdZJywgJ1YnLCAnWScpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VWVZZOworICAgICAgICB9CisgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ1knLCAnVScsICdZJywgJzInKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfWVVZMjsKKyAgICAgICAgfQorICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcxJykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDE7CisgICAgICAgIH0KKyAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnMicpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQyOworICAgICAgICB9CisgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzMnKSkKKyAgICAgICAgeworICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQzOworICAgICAgICB9CisgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzQnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRFhUNDsKKyAgICAgICAgfQorICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICc1JykpCisgICAgICAgIHsKKwkgICAgcmV0dXJuIFdJTkVEM0RGTVRfRFhUNTsKKyAgICAgICAgfQorICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdHJywgJ1InLCAnRycsICdCJykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0c4UjhfRzhCODsKKyAgICAgICAgfQorICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdSJywgJ0cnLCAnQicsICdHJykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1I4RzhfQjhHODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOyAgLyogQWJ1c2UgdGhpcyBhcyBhIGVycm9yIHZhbHVlICovCisgICAgfQorICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQlVNUERVRFYpCisgICAgeworICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPnUxLmR3QnVtcEJpdENvdW50ICAgICAgICAgPT0gMTYgICAgICAgICkgJiYKKyAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51Mi5kd0J1bXBEdUJpdE1hc2sgICAgICAgID09IDB4MDAwMDAwZmYpICYmCisgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrICAgICAgICA9PSAweDAwMDBmZjAwKSAmJgorICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPT0gMHgwMDAwMDAwMCkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9WOFU4OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgICAgICAgICA9PSAxNiAgICAgICAgKSAmJgorICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUyLmR3QnVtcER1Qml0TWFzayAgICAgICAgPT0gMHgwMDAwMDAxZikgJiYKKyAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgICAgICAgID09IDB4MDAwMDAzZTApICYmCisgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9PSAweDAwMDBmYzAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0w2VjVVNTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEVSUigiVW5rbm93biBQaXhlbGZvcm1hdCFcbiIpOworICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaW91cyBkdW1waW5nIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGV5IHdyaXRlIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmljIGZ1bmN0aW9uIHRvIGEgRFBSSU5URi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorRERSQVdfZHVtcF9EV09SRChjb25zdCB2b2lkICppbikKK3sKKyAgICBEUFJJTlRGKCIlbGQiLCAqKChjb25zdCBEV09SRCAqKSBpbikpOworfQorc3RhdGljIHZvaWQKK0REUkFXX2R1bXBfUFRSKGNvbnN0IHZvaWQgKmluKQoreworICAgIERQUklOVEYoIiVwIiwgKigoY29uc3Qgdm9pZCAqIGNvbnN0KikgaW4pKTsKK30KK3ZvaWQKK0REUkFXX2R1bXBfRERDT0xPUktFWShjb25zdCBERENPTE9SS0VZICpkZGNrKQoreworICAgIERQUklOVEYoIiBMb3cgOiAlbGQgIC0gSGlnaCA6ICVsZCIsIGRkY2stPmR3Q29sb3JTcGFjZUxvd1ZhbHVlLCBkZGNrLT5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpOworfQordm9pZCBERFJBV19kdW1wX0REU0NBUFMyKGNvbnN0IEREU0NBUFMyICppbikKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPSB7CisgICAgICAgIEZFKEREU0NBUFNfUkVTRVJWRUQxKSwKKyAgICAgICAgRkUoRERTQ0FQU19BTFBIQSksCisgICAgICAgIEZFKEREU0NBUFNfQkFDS0JVRkZFUiksCisgICAgICAgIEZFKEREU0NBUFNfQ09NUExFWCksCisgICAgICAgIEZFKEREU0NBUFNfRkxJUCksCisgICAgICAgIEZFKEREU0NBUFNfRlJPTlRCVUZGRVIpLAorICAgICAgICBGRShERFNDQVBTX09GRlNDUkVFTlBMQUlOKSwKKyAgICAgICAgRkUoRERTQ0FQU19PVkVSTEFZKSwKKyAgICAgICAgRkUoRERTQ0FQU19QQUxFVFRFKSwKKyAgICAgICAgRkUoRERTQ0FQU19QUklNQVJZU1VSRkFDRSksCisgICAgICAgIEZFKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0VMRUZUKSwKKyAgICAgICAgRkUoRERTQ0FQU19TWVNURU1NRU1PUlkpLAorICAgICAgICBGRShERFNDQVBTX1RFWFRVUkUpLAorICAgICAgICBGRShERFNDQVBTXzNEREVWSUNFKSwKKyAgICAgICAgRkUoRERTQ0FQU19WSURFT01FTU9SWSksCisgICAgICAgIEZFKEREU0NBUFNfVklTSUJMRSksCisgICAgICAgIEZFKEREU0NBUFNfV1JJVEVPTkxZKSwKKyAgICAgICAgRkUoRERTQ0FQU19aQlVGRkVSKSwKKyAgICAgICAgRkUoRERTQ0FQU19PV05EQyksCisgICAgICAgIEZFKEREU0NBUFNfTElWRVZJREVPKSwKKyAgICAgICAgRkUoRERTQ0FQU19IV0NPREVDKSwKKyAgICAgICAgRkUoRERTQ0FQU19NT0RFWCksCisgICAgICAgIEZFKEREU0NBUFNfTUlQTUFQKSwKKyAgICAgICAgRkUoRERTQ0FQU19SRVNFUlZFRDIpLAorICAgICAgICBGRShERFNDQVBTX0FMTE9DT05MT0FEKSwKKyAgICAgICAgRkUoRERTQ0FQU19WSURFT1BPUlQpLAorICAgICAgICBGRShERFNDQVBTX0xPQ0FMVklETUVNKSwKKyAgICAgICAgRkUoRERTQ0FQU19OT05MT0NBTFZJRE1FTSksCisgICAgICAgIEZFKEREU0NBUFNfU1RBTkRBUkRWR0FNT0RFKSwKKyAgICAgICAgRkUoRERTQ0FQU19PUFRJTUlaRUQpCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzMltdID0geworICAgICAgICBGRShERFNDQVBTMl9IQVJEV0FSRURFSU5URVJMQUNFKSwKKyAgICAgICAgRkUoRERTQ0FQUzJfSElOVERZTkFNSUMpLAorICAgICAgICBGRShERFNDQVBTMl9ISU5UU1RBVElDKSwKKyAgICAgICAgRkUoRERTQ0FQUzJfVEVYVFVSRU1BTkFHRSksCisgICAgICAgIEZFKEREU0NBUFMyX1JFU0VSVkVEMSksCisgICAgICAgIEZFKEREU0NBUFMyX1JFU0VSVkVEMiksCisgICAgICAgIEZFKEREU0NBUFMyX09QQVFVRSksCisgICAgICAgIEZFKEREU0NBUFMyX0hJTlRBTlRJQUxJQVNJTkcpLAorICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQKSwKKyAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVgpLAorICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWCksCisgICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVZKSwKKyAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVkpLAorICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWiksCisgICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVaKSwKKyAgICAgICAgRkUoRERTQ0FQUzJfTUlQTUFQU1VCTEVWRUwpLAorICAgICAgICBGRShERFNDQVBTMl9EM0RURVhUVVJFTUFOQUdFKSwKKyAgICAgICAgRkUoRERTQ0FQUzJfRE9OT1RQRVJTSVNUKSwKKyAgICAgICAgRkUoRERTQ0FQUzJfU1RFUkVPU1VSRkFDRUxFRlQpCisgICAgfTsKKworICAgIEREUkFXX2R1bXBfZmxhZ3NfKGluLT5kd0NhcHMsIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSksIDApOworICAgIEREUkFXX2R1bXBfZmxhZ3NfKGluLT5kd0NhcHMyLCBmbGFnczIsIHNpemVvZihmbGFnczIpL3NpemVvZihmbGFnczJbMF0pLCAwKTsKK30KKwordm9pZAorRERSQVdfZHVtcF9ERFNDQVBTKGNvbnN0IEREU0NBUFMgKmluKQoreworICAgIEREU0NBUFMyIGluX2JpczsKKworICAgIGluX2Jpcy5kd0NhcHMgPSBpbi0+ZHdDYXBzOworICAgIGluX2Jpcy5kd0NhcHMyID0gMDsKKyAgICBpbl9iaXMuZHdDYXBzMyA9IDA7CisgICAgaW5fYmlzLmR3Q2FwczQgPSAwOworCisgICAgRERSQVdfZHVtcF9ERFNDQVBTMigmaW5fYmlzKTsKK30KKwordm9pZAorRERSQVdfZHVtcF9mbGFnc18oRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBmbGFnX2luZm8qIG5hbWVzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9uYW1lcywKKyAgICAgICAgICAgICAgICAgIGludCBuZXdsaW5lKQoreworICAgIHVuc2lnbmVkIGludAlpOworCisgICAgZm9yIChpPTA7IGkgPCBudW1fbmFtZXM7IGkrKykKKyAgICAgICAgaWYgKChmbGFncyAmIG5hbWVzW2ldLnZhbCkgfHwgICAgICAvKiBzdGFuZGFyZCBmbGFnIHZhbHVlICovCisgICAgICAgICAgICAoKCFmbGFncykgJiYgKCFuYW1lc1tpXS52YWwpKSkgLyogemVybyB2YWx1ZSBvbmx5ICovCisgICAgICAgICAgICBEUFJJTlRGKCIlcyAiLCBuYW1lc1tpXS5uYW1lKTsKKworICAgIGlmIChuZXdsaW5lKQorICAgICAgICBEUFJJTlRGKCJcbiIpOworfQorCit2b2lkCitERFJBV19kdW1wX3BpeGVsZm9ybWF0X2ZsYWcoRFdPUkQgZmxhZ21hc2spCit7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgRkUoRERQRl9BTFBIQVBJWEVMUyksCisgICAgICAgICAgICBGRShERFBGX0FMUEhBKSwKKyAgICAgICAgICAgIEZFKEREUEZfRk9VUkNDKSwKKyAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQ0KSwKKyAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRURUTzgpLAorICAgICAgICAgICAgRkUoRERQRl9QQUxFVFRFSU5ERVhFRDgpLAorICAgICAgICAgICAgRkUoRERQRl9SR0IpLAorICAgICAgICAgICAgRkUoRERQRl9DT01QUkVTU0VEKSwKKyAgICAgICAgICAgIEZFKEREUEZfUkdCVE9ZVVYpLAorICAgICAgICAgICAgRkUoRERQRl9ZVVYpLAorICAgICAgICAgICAgRkUoRERQRl9aQlVGRkVSKSwKKyAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQxKSwKKyAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQyKSwKKyAgICAgICAgICAgIEZFKEREUEZfWlBJWEVMUykKKyAgICB9OworCisgICAgRERSQVdfZHVtcF9mbGFnc18oZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSksIDApOworfQorCit2b2lkCitERFJBV19kdW1wX21lbWJlcnMoRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJfaW5mbyogbWVtcywKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX21lbXMpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG51bV9tZW1zOyBpKyspCisgICAgeworICAgICAgICBpZiAobWVtc1tpXS52YWwgJiBmbGFncykKKyAgICAgICAgeworICAgICAgICAgICAgRFBSSU5URigiIC0gJXMgOiAiLCBtZW1zW2ldLm5hbWUpOworICAgICAgICAgICAgbWVtc1tpXS5mdW5jKChjb25zdCBjaGFyICopZGF0YSArIG1lbXNbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgIERQUklOVEYoIlxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK0REUkFXX2R1bXBfcGl4ZWxmb3JtYXQoY29uc3QgRERQSVhFTEZPUk1BVCAqcGYpCit7CisgICAgRFBSSU5URigiKCAiKTsKKyAgICBERFJBV19kdW1wX3BpeGVsZm9ybWF0X2ZsYWcocGYtPmR3RmxhZ3MpOworICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfRk9VUkNDKQorICAgIHsKKyAgICAgICAgRFBSSU5URigiLCBkd0ZvdXJDQyBjb2RlICclYyVjJWMlYycgKDB4JTA4bHgpIC0gJWxkIGJpdHMgcGVyIHBpeGVsIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoIHBmLT5kd0ZvdXJDQyAgICAgJjB4ZmYpLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSgocGYtPmR3Rm91ckNDPj4gOCkmMHhmZiksCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKChwZi0+ZHdGb3VyQ0M+PjE2KSYweGZmKSwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MjQpJjB4ZmYpLAorICAgICAgICAgICAgICAgIHBmLT5kd0ZvdXJDQywKKyAgICAgICAgICAgICAgICBwZi0+dTEuZHdZVVZCaXRDb3VudAorICAgICAgICApOworICAgIH0KKyAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1JHQikKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNtZDsKKyAgICAgICAgRFBSSU5URigiLCBSR0IgYml0czogJWxkLCAiLCBwZi0+dTEuZHdSR0JCaXRDb3VudCk7CisgICAgICAgIHN3aXRjaCAocGYtPnUxLmR3UkdCQml0Q291bnQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSA0OiBjbWQgPSAiJTFseCI7IGJyZWFrOworICAgICAgICBjYXNlIDg6IGNtZCA9ICIlMDJseCI7IGJyZWFrOworICAgICAgICBjYXNlIDE2OiBjbWQgPSAiJTA0bHgiOyBicmVhazsKKyAgICAgICAgY2FzZSAyNDogY21kID0gIiUwNmx4IjsgYnJlYWs7CisgICAgICAgIGNhc2UgMzI6IGNtZCA9ICIlMDhseCI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBFUlIoIlVuZXhwZWN0ZWQgYml0IGRlcHRoICFcbiIpOyBjbWQgPSAiJWQiOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBEUFJJTlRGKCIgUiAiKTsgRFBSSU5URihjbWQsIHBmLT51Mi5kd1JCaXRNYXNrKTsKKyAgICAgICAgRFBSSU5URigiIEcgIik7IERQUklOVEYoY21kLCBwZi0+dTMuZHdHQml0TWFzayk7CisgICAgICAgIERQUklOVEYoIiBCICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU0LmR3QkJpdE1hc2spOworICAgICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKQorICAgICAgICB7CisgICAgICAgICAgICBEUFJJTlRGKCIgQSAiKTsgRFBSSU5URihjbWQsIHBmLT51NS5kd1JHQkFscGhhQml0TWFzayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9aUElYRUxTKQorICAgICAgICB7CisgICAgICAgICAgICBEUFJJTlRGKCIgWiAiKTsgRFBSSU5URihjbWQsIHBmLT51NS5kd1JHQlpCaXRNYXNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1pCVUZGRVIpCisgICAgeworICAgICAgICBEUFJJTlRGKCIsIFogYml0cyA6ICVsZCIsIHBmLT51MS5kd1pCdWZmZXJCaXREZXB0aCk7CisgICAgfQorICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfQUxQSEEpCisgICAgeworICAgICAgICBEUFJJTlRGKCIsIEFscGhhIGJpdHMgOiAlbGQiLCBwZi0+dTEuZHdBbHBoYUJpdERlcHRoKTsKKyAgICB9CisgICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9CVU1QRFVEVikKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNtZCA9ICIlMDhseCI7CisgICAgICAgIERQUklOVEYoIiwgQnVtcCBiaXRzOiAlbGQsICIsIHBmLT51MS5kd0J1bXBCaXRDb3VudCk7CisgICAgICAgIERQUklOVEYoIiBVICIpOyBEUFJJTlRGKGNtZCwgcGYtPnUyLmR3QnVtcER1Qml0TWFzayk7CisgICAgICAgIERQUklOVEYoIiBWICIpOyBEUFJJTlRGKGNtZCwgcGYtPnUzLmR3QnVtcER2Qml0TWFzayk7CisgICAgICAgIERQUklOVEYoIiBMICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2spOworICAgIH0KKyAgICBEUFJJTlRGKCIpIik7Cit9CisKK3ZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoY29uc3QgRERTVVJGQUNFREVTQzIgKmxwZGRzZCkKK3sKKyNkZWZpbmUgU1RSVUNUIEREU1VSRkFDRURFU0MyCisgICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1FKEREU0RfSEVJR0hULCBERFJBV19kdW1wX0RXT1JELCBkd0hlaWdodCksCisgICAgICAgICAgICBNRShERFNEX1dJRFRILCBERFJBV19kdW1wX0RXT1JELCBkd1dpZHRoKSwKKyAgICAgICAgICAgIE1FKEREU0RfUElUQ0gsIEREUkFXX2R1bXBfRFdPUkQsIHUxIC8qIGxQaXRjaCAqLyksCisgICAgICAgICAgICBNRShERFNEX0xJTkVBUlNJWkUsIEREUkFXX2R1bXBfRFdPUkQsIHUxIC8qIGR3TGluZWFyU2l6ZSAqLyksCisgICAgICAgICAgICBNRShERFNEX0JBQ0tCVUZGRVJDT1VOVCwgRERSQVdfZHVtcF9EV09SRCwgZHdCYWNrQnVmZmVyQ291bnQpLAorICAgICAgICAgICAgTUUoRERTRF9NSVBNQVBDT1VOVCwgRERSQVdfZHVtcF9EV09SRCwgdTIgLyogZHdNaXBNYXBDb3VudCAqLyksCisgICAgICAgICAgICBNRShERFNEX1pCVUZGRVJCSVRERVBUSCwgRERSQVdfZHVtcF9EV09SRCwgdTIgLyogZHdaQnVmZmVyQml0RGVwdGggKi8pLCAvKiBUaGlzIGlzIGZvciAnb2xkLXN0eWxlJyBEM0QgKi8KKyAgICAgICAgICAgIE1FKEREU0RfUkVGUkVTSFJBVEUsIEREUkFXX2R1bXBfRFdPUkQsIHUyIC8qIGR3UmVmcmVzaFJhdGUgKi8pLAorICAgICAgICAgICAgTUUoRERTRF9BTFBIQUJJVERFUFRILCBERFJBV19kdW1wX0RXT1JELCBkd0FscGhhQml0RGVwdGgpLAorICAgICAgICAgICAgTUUoRERTRF9MUFNVUkZBQ0UsIEREUkFXX2R1bXBfUFRSLCBscFN1cmZhY2UpLAorICAgICAgICAgICAgTUUoRERTRF9DS0RFU1RPVkVSTEFZLCBERFJBV19kdW1wX0REQ09MT1JLRVksIHUzIC8qIGRkY2tDS0Rlc3RPdmVybGF5ICovKSwKKyAgICAgICAgICAgIE1FKEREU0RfQ0tERVNUQkxULCBERFJBV19kdW1wX0REQ09MT1JLRVksIGRkY2tDS0Rlc3RCbHQpLAorICAgICAgICAgICAgTUUoRERTRF9DS1NSQ09WRVJMQVksIEREUkFXX2R1bXBfRERDT0xPUktFWSwgZGRja0NLU3JjT3ZlcmxheSksCisgICAgICAgICAgICBNRShERFNEX0NLU1JDQkxULCBERFJBV19kdW1wX0REQ09MT1JLRVksIGRkY2tDS1NyY0JsdCksCisgICAgICAgICAgICBNRShERFNEX1BJWEVMRk9STUFULCBERFJBV19kdW1wX3BpeGVsZm9ybWF0LCB1NCAvKiBkZHBmUGl4ZWxGb3JtYXQgKi8pCisgICAgICAgIH07CisgICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNfY2Fwc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgTUUoRERTRF9DQVBTLCBERFJBV19kdW1wX0REU0NBUFMsIGRkc0NhcHMpCisgICAgICAgIH07CisgICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNfY2FwczJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1FKEREU0RfQ0FQUywgRERSQVdfZHVtcF9ERFNDQVBTMiwgZGRzQ2FwcykKKyAgICAgICAgfTsKKyN1bmRlZiBTVFJVQ1QKKworICAgIGlmIChOVUxMID09IGxwZGRzZCkKKyAgICB7CisgICAgICAgIERQUklOVEYoIihudWxsKVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAobHBkZHNkLT5kd1NpemUgPj0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKSkKKyAgICAgIHsKKyAgICAgICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnNfY2FwczIsIDEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIEREUkFXX2R1bXBfbWVtYmVycyhscGRkc2QtPmR3RmxhZ3MsIGxwZGRzZCwgbWVtYmVyc19jYXBzLCAxKTsKKyAgICAgIH0KKyAgICAgIEREUkFXX2R1bXBfbWVtYmVycyhscGRkc2QtPmR3RmxhZ3MsIGxwZGRzZCwgbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lbWJlcnMpL3NpemVvZihtZW1iZXJzWzBdKSk7CisgICAgfQorfQorCit2b2lkCitkdW1wX0QzRE1BVFJJWChEM0RNQVRSSVggKm1hdCkKK3sKKyAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8xMSwgbWF0LT5fMTIsIG1hdC0+XzEzLCBtYXQtPl8xNCk7CisgICAgRFBSSU5URigiICAlZiAlZiAlZiAlZlxuIiwgbWF0LT5fMjEsIG1hdC0+XzIyLCBtYXQtPl8yMywgbWF0LT5fMjQpOworICAgIERQUklOVEYoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzMxLCBtYXQtPl8zMiwgbWF0LT5fMzMsIG1hdC0+XzM0KTsKKyAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl80MSwgbWF0LT5fNDIsIG1hdC0+XzQzLCBtYXQtPl80NCk7Cit9CisKK0RXT1JECitnZXRfZmxleGlibGVfdmVydGV4X3NpemUoRFdPUkQgZDNkdnRWZXJ0ZXhUeXBlKQoreworICAgIERXT1JEIHNpemUgPSAwOworICAgIGludCBpOworCisgICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9OT1JNQUwpIHNpemUgKz0gMyAqIHNpemVvZihEM0RWQUxVRSk7CisgICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9ESUZGVVNFKSBzaXplICs9IHNpemVvZihEV09SRCk7CisgICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9TUEVDVUxBUikgc2l6ZSArPSBzaXplb2YoRFdPUkQpOworICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUkVTRVJWRUQxKSBzaXplICs9IHNpemVvZihEV09SRCk7CisgICAgc3dpdGNoIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykKKyAgICB7CisgICAgICAgIGNhc2UgRDNERlZGX1hZWjogc2l6ZSArPSAzICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRDNERlZGX1hZWlJIVzogc2l6ZSArPSA0ICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IFRSQUNFKCIgbWF0cml4IHdlaWdodGluZyBub3QgaGFuZGxlZCB5ZXQuLi5cbiIpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgR0VUX1RFWENPVU5UX0ZST01fRlZGKGQzZHZ0VmVydGV4VHlwZSk7IGkrKykKKyAgICB7CisgICAgICAgIHNpemUgKz0gR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCBpKSAqIHNpemVvZihEM0RWQUxVRSk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgRERSQVdfQ29udmVydF9ERFNDQVBTXzFfVG9fMihjb25zdCBERFNDQVBTKiBwSW4sIEREU0NBUFMyKiBwT3V0KQoreworICAgIC8qIDIgYWRkcyB0aHJlZSBhZGRpdGlvbmFsIGNhcHMgZmllbGRzIHRvIHRoZSBlbmQuIEJvdGggdmVyc2lvbnMKKyAgICAgKiBhcmUgdW52ZXJzaW9uZWQuICovCisgICAgcE91dC0+ZHdDYXBzID0gcEluLT5kd0NhcHM7CisgICAgcE91dC0+ZHdDYXBzMiA9IDA7CisgICAgcE91dC0+ZHdDYXBzMyA9IDA7CisgICAgcE91dC0+ZHdDYXBzNCA9IDA7Cit9CisKK3ZvaWQgRERSQVdfQ29udmVydF9ERERFVklDRUlERU5USUZJRVJfMl9Ub18xKGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIqIHBJbiwgRERERVZJQ0VJREVOVElGSUVSKiBwT3V0KQoreworICAgIC8qIDIgYWRkcyBhIGR3V0hRTExldmVsIGZpZWxkIHRvIHRoZSBlbmQuIEJvdGggc3RydWN0dXJlcyBhcmUKKyAgICAgKiB1bnZlcnNpb25lZC4gKi8KKyAgICBtZW1jcHkocE91dCwgcEluLCBzaXplb2YoKnBPdXQpKTsKK30KKwordm9pZCBERFJBV19kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoRFdPUkQgY29vcGxldmVsKQoreworICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIEZFKEREU0NMX0ZVTExTQ1JFRU4pLAorICAgICAgICAgICAgRkUoRERTQ0xfQUxMT1dSRUJPT1QpLAorICAgICAgICAgICAgRkUoRERTQ0xfTk9XSU5ET1dDSEFOR0VTKSwKKyAgICAgICAgICAgIEZFKEREU0NMX05PUk1BTCksCisgICAgICAgICAgICBGRShERFNDTF9BTExPV01PREVYKSwKKyAgICAgICAgICAgIEZFKEREU0NMX0VYQ0xVU0lWRSksCisgICAgICAgICAgICBGRShERFNDTF9TRVRGT0NVU1dJTkRPVyksCisgICAgICAgICAgICBGRShERFNDTF9TRVRERVZJQ0VXSU5ET1cpLAorICAgICAgICAgICAgRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQorICAgIH07CisKKyAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQorICAgIHsKKyAgICAgICAgRFBSSU5URigiIC0gIik7CisgICAgICAgIEREUkFXX2R1bXBfZmxhZ3MoY29vcGxldmVsLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pKTsKKyAgICB9Cit9CisKK3ZvaWQgRERSQVdfZHVtcF9ERENBUFMoY29uc3QgRERDQVBTICpscGNhcHMpCit7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczFbXSA9CisgICAgeworICAgICAgRkUoRERDQVBTXzNEKSwKKyAgICAgIEZFKEREQ0FQU19BTElHTkJPVU5EQVJZREVTVCksCisgICAgICBGRShERENBUFNfQUxJR05TSVpFREVTVCksCisgICAgICBGRShERENBUFNfQUxJR05CT1VOREFSWVNSQyksCisgICAgICBGRShERENBUFNfQUxJR05TSVpFU1JDKSwKKyAgICAgIEZFKEREQ0FQU19BTElHTlNUUklERSksCisgICAgICBGRShERENBUFNfQkxUKSwKKyAgICAgIEZFKEREQ0FQU19CTFRRVUVVRSksCisgICAgICBGRShERENBUFNfQkxURk9VUkNDKSwKKyAgICAgIEZFKEREQ0FQU19CTFRTVFJFVENIKSwKKyAgICAgIEZFKEREQ0FQU19HREkpLAorICAgICAgRkUoRERDQVBTX09WRVJMQVkpLAorICAgICAgRkUoRERDQVBTX09WRVJMQVlDQU5UQ0xJUCksCisgICAgICBGRShERENBUFNfT1ZFUkxBWUZPVVJDQyksCisgICAgICBGRShERENBUFNfT1ZFUkxBWVNUUkVUQ0gpLAorICAgICAgRkUoRERDQVBTX1BBTEVUVEUpLAorICAgICAgRkUoRERDQVBTX1BBTEVUVEVWU1lOQyksCisgICAgICBGRShERENBUFNfUkVBRFNDQU5MSU5FKSwKKyAgICAgIEZFKEREQ0FQU19TVEVSRU9WSUVXKSwKKyAgICAgIEZFKEREQ0FQU19WQkkpLAorICAgICAgRkUoRERDQVBTX1pCTFRTKSwKKyAgICAgIEZFKEREQ0FQU19aT1ZFUkxBWVMpLAorICAgICAgRkUoRERDQVBTX0NPTE9SS0VZKSwKKyAgICAgIEZFKEREQ0FQU19BTFBIQSksCisgICAgICBGRShERENBUFNfQ09MT1JLRVlIV0FTU0lTVCksCisgICAgICBGRShERENBUFNfTk9IQVJEV0FSRSksCisgICAgICBGRShERENBUFNfQkxUQ09MT1JGSUxMKSwKKyAgICAgIEZFKEREQ0FQU19CQU5LU1dJVENIRUQpLAorICAgICAgRkUoRERDQVBTX0JMVERFUFRIRklMTCksCisgICAgICBGRShERENBUFNfQ0FOQ0xJUCksCisgICAgICBGRShERENBUFNfQ0FOQ0xJUFNUUkVUQ0hFRCksCisgICAgICBGRShERENBUFNfQ0FOQkxUU1lTTUVNKQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczJbXSA9CisgICAgeworICAgICAgRkUoRERDQVBTMl9DRVJUSUZJRUQpLAorICAgICAgRkUoRERDQVBTMl9OTzJERFVSSU5HM0RTQ0VORSksCisgICAgICBGRShERENBUFMyX1ZJREVPUE9SVCksCisgICAgICBGRShERENBUFMyX0FVVE9GTElQT1ZFUkxBWSksCisgICAgICBGRShERENBUFMyX0NBTkJPQklOVEVSTEVBVkVEKSwKKyAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CTk9OSU5URVJMRUFWRUQpLAorICAgICAgRkUoRERDQVBTMl9DT0xPUkNPTlRST0xPVkVSTEFZKSwKKyAgICAgIEZFKEREQ0FQUzJfQ09MT1JDT05UUk9MUFJJTUFSWSksCisgICAgICBGRShERENBUFMyX0NBTkRST1BaMTZCSVQpLAorICAgICAgRkUoRERDQVBTMl9OT05MT0NBTFZJRE1FTSksCisgICAgICBGRShERENBUFMyX05PTkxPQ0FMVklETUVNQ0FQUyksCisgICAgICBGRShERENBUFMyX05PUEFHRUxPQ0tSRVFVSVJFRCksCisgICAgICBGRShERENBUFMyX1dJREVTVVJGQUNFUyksCisgICAgICBGRShERENBUFMyX0NBTkZMSVBPRERFVkVOKSwKKyAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CSEFSRFdBUkUpLAorICAgICAgRkUoRERDQVBTMl9DT1BZRk9VUkNDKSwKKyAgICAgIEZFKEREQ0FQUzJfUFJJTUFSWUdBTU1BKSwKKyAgICAgIEZFKEREQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQpLAorICAgICAgRkUoRERDQVBTMl9DQU5DQUxJQlJBVEVHQU1NQSksCisgICAgICBGRShERENBUFMyX0ZMSVBJTlRFUlZBTCksCisgICAgICBGRShERENBUFMyX0ZMSVBOT1ZTWU5DKSwKKyAgICAgIEZFKEREQ0FQUzJfQ0FOTUFOQUdFVEVYVFVSRSksCisgICAgICBGRShERENBUFMyX1RFWE1BTklOTk9OTE9DQUxWSURNRU0pLAorICAgICAgRkUoRERDQVBTMl9TVEVSRU8pLAorICAgICAgRkUoRERDQVBTMl9TWVNUT05PTkxPQ0FMX0FTX1NZU1RPTE9DQUwpCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzM1tdID0KKyAgICB7CisgICAgICBGRShERENLRVlDQVBTX0RFU1RCTFQpLAorICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUQ0xSU1BBQ0UpLAorICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUQ0xSU1BBQ0VZVVYpLAorICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUWVVWKSwKKyAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVkpLAorICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWUNMUlNQQUNFKSwKKyAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVlDTFJTUEFDRVlVViksCisgICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZT05FQUNUSVZFKSwKKyAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVlZVVYpLAorICAgICAgRkUoRERDS0VZQ0FQU19TUkNCTFQpLAorICAgICAgRkUoRERDS0VZQ0FQU19TUkNCTFRDTFJTUEFDRSksCisgICAgICBGRShERENLRVlDQVBTX1NSQ0JMVENMUlNQQUNFWVVWKSwKKyAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUWVVWKSwKKyAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWSksCisgICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlDTFJTUEFDRSksCisgICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlDTFJTUEFDRVlVViksCisgICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlPTkVBQ1RJVkUpLAorICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZWVVWKSwKKyAgICAgIEZFKEREQ0tFWUNBUFNfTk9DT1NUT1ZFUkxBWSkKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M0W10gPQorICAgIHsKKyAgICAgIEZFKERERlhDQVBTX0JMVEFMUEhBKSwKKyAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBTFBIQSksCisgICAgICBGRShEREZYQ0FQU19CTFRBUklUSFNUUkVUQ0hZTiksCisgICAgICBGRShEREZYQ0FQU19CTFRBUklUSFNUUkVUQ0hZKSwKKyAgICAgIEZFKERERlhDQVBTX0JMVE1JUlJPUkxFRlRSSUdIVCksCisgICAgICBGRShEREZYQ0FQU19CTFRNSVJST1JVUERPV04pLAorICAgICAgRkUoRERGWENBUFNfQkxUUk9UQVRJT04pLAorICAgICAgRkUoRERGWENBUFNfQkxUUk9UQVRJT045MCksCisgICAgICBGRShEREZYQ0FQU19CTFRTSFJJTktYKSwKKyAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1hOKSwKKyAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1kpLAorICAgICAgRkUoRERGWENBUFNfQkxUU0hSSU5LWU4pLAorICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFgpLAorICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFhOKSwKKyAgICAgIEZFKERERlhDQVBTX0JMVFNUUkVUQ0hZKSwKKyAgICAgIEZFKERERlhDQVBTX0JMVFNUUkVUQ0hZTiksCisgICAgICBGRShEREZYQ0FQU19PVkVSTEFZQVJJVEhTVFJFVENIWSksCisgICAgICBGRShEREZYQ0FQU19PVkVSTEFZQVJJVEhTVFJFVENIWU4pLAorICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1gpLAorICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1hOKSwKKyAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTSFJJTktZKSwKKyAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTSFJJTktZTiksCisgICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFgpLAorICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hYTiksCisgICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFkpLAorICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hZTiksCisgICAgICBGRShEREZYQ0FQU19PVkVSTEFZTUlSUk9STEVGVFJJR0hUKSwKKyAgICAgIEZFKERERlhDQVBTX09WRVJMQVlNSVJST1JVUERPV04pCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzNVtdID0KKyAgICB7CisgICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBRURHRUJMRU5EKSwKKyAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFQSVhFTFMpLAorICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVBJWEVMU05FRyksCisgICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBU1VSRkFDRVMpLAorICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVNVUkZBQ0VTTkVHKSwKKyAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBRURHRUJMRU5EKSwKKyAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBUElYRUxTKSwKKyAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBUElYRUxTTkVHKSwKKyAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBU1VSRkFDRVMpLAorICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFTVVJGQUNFU05FRykKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M2W10gPQorICAgIHsKKyAgICAgIEZFKEREUENBUFNfNEJJVCksCisgICAgICBGRShERFBDQVBTXzhCSVRFTlRSSUVTKSwKKyAgICAgIEZFKEREUENBUFNfOEJJVCksCisgICAgICBGRShERFBDQVBTX0lOSVRJQUxJWkUpLAorICAgICAgRkUoRERQQ0FQU19QUklNQVJZU1VSRkFDRSksCisgICAgICBGRShERFBDQVBTX1BSSU1BUllTVVJGQUNFTEVGVCksCisgICAgICBGRShERFBDQVBTX0FMTE9XMjU2KSwKKyAgICAgIEZFKEREUENBUFNfVlNZTkMpLAorICAgICAgRkUoRERQQ0FQU18xQklUKSwKKyAgICAgIEZFKEREUENBUFNfMkJJVCksCisgICAgICBGRShERFBDQVBTX0FMUEhBKSwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M3W10gPQorICAgIHsKKyAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMSksCisgICAgICBGRShERFNWQ0FQU19SRVNFUlZFRDIpLAorICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQzKSwKKyAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVENCksCisgICAgICBGRShERFNWQ0FQU19TVEVSRU9TRVFVRU5USUFMKSwKKyAgICB9OworCisgICAgRFBSSU5URigiIC0gZHdTaXplIDogJWxkXG4iLCBscGNhcHMtPmR3U2l6ZSk7CisgICAgRFBSSU5URigiIC0gZHdDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0NhcHMsIGZsYWdzMSwgc2l6ZW9mKGZsYWdzMSkvc2l6ZW9mKGZsYWdzMVswXSkpOworICAgIERQUklOVEYoIiAtIGR3Q2FwczIgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3Q2FwczIsIGZsYWdzMiwgc2l6ZW9mKGZsYWdzMikvc2l6ZW9mKGZsYWdzMlswXSkpOworICAgIERQUklOVEYoIiAtIGR3Q0tleUNhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3Q0tleUNhcHMsIGZsYWdzMywgc2l6ZW9mKGZsYWdzMykvc2l6ZW9mKGZsYWdzM1swXSkpOworICAgIERQUklOVEYoIiAtIGR3RlhDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0ZYQ2FwcywgZmxhZ3M0LCBzaXplb2YoZmxhZ3M0KS9zaXplb2YoZmxhZ3M0WzBdKSk7CisgICAgRFBSSU5URigiIC0gZHdGWEFscGhhQ2FwcyA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdGWEFscGhhQ2FwcywgZmxhZ3M1LCBzaXplb2YoZmxhZ3M1KS9zaXplb2YoZmxhZ3M1WzBdKSk7CisgICAgRFBSSU5URigiIC0gZHdQYWxDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd1BhbENhcHMsIGZsYWdzNiwgc2l6ZW9mKGZsYWdzNikvc2l6ZW9mKGZsYWdzNlswXSkpOworICAgIERQUklOVEYoIiAtIGR3U1ZDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd1NWQ2FwcywgZmxhZ3M3LCBzaXplb2YoZmxhZ3M3KS9zaXplb2YoZmxhZ3M3WzBdKSk7CisgICAgRFBSSU5URigiLi4uXG4iKTsKKyAgICBEUFJJTlRGKCIgLSBkd051bUZvdXJDQ0NvZGVzIDogJWxkXG4iLCBscGNhcHMtPmR3TnVtRm91ckNDQ29kZXMpOworICAgIERQUklOVEYoIiAtIGR3Q3VyclZpc2libGVPdmVybGF5cyA6ICVsZFxuIiwgbHBjYXBzLT5kd0N1cnJWaXNpYmxlT3ZlcmxheXMpOworICAgIERQUklOVEYoIiAtIGR3TWluT3ZlcmxheVN0cmV0Y2ggOiAlbGRcbiIsIGxwY2Fwcy0+ZHdNaW5PdmVybGF5U3RyZXRjaCk7CisgICAgRFBSSU5URigiIC0gZHdNYXhPdmVybGF5U3RyZXRjaCA6ICVsZFxuIiwgbHBjYXBzLT5kd01heE92ZXJsYXlTdHJldGNoKTsKKyAgICBEUFJJTlRGKCIuLi5cbiIpOworICAgIERQUklOVEYoIiAtIGRkc0NhcHMgOiAiKTsgRERSQVdfZHVtcF9ERFNDQVBTMigmbHBjYXBzLT5kZHNDYXBzKTsgRFBSSU5URigiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtdWx0aXBseV9tYXRyaXgKKyAqCisgKiBNdWx0aXBsaWVzIDIgNHg0IG1hdHJpY2VzIHNyYzEgYW5kIHNyYzIsIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBkZXN0LgorICoKKyAqIFBhcmFtczoKKyAqICBkZXN0OiBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYXRyaXgKKyAqICBzcmMxOiBQb2ludGVyIHRvIHRoZSBmaXJzdCBzb3VyY2UgbWF0cml4CisgKiAgc3JjMjogUG9pbnRlciB0byB0aGUgc2Vjb3VuZCBzb3VyY2UgbWF0cml4CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorbXVsdGlwbHlfbWF0cml4KEQzRE1BVFJJWCAqZGVzdCwKKyAgICAgICAgICAgICAgICBEM0RNQVRSSVggKnNyYzEsCisgICAgICAgICAgICAgICAgRDNETUFUUklYICpzcmMyKQoreworICAgIEQzRE1BVFJJWCB0ZW1wOworCisgICAgLyogTm93IGRvIHRoZSBtdWx0aXBsaWNhdGlvbiAnYnkgaGFuZCcuCisgICAgICAgSSBrbm93IHRoYXQgYWxsIHRoaXMgY291bGQgYmUgb3B0aW1pc2VkLCBidXQgdGhpcyB3aWxsIGJlIGRvbmUgbGF0ZXIgOi0pICovCisgICAgdGVtcC5fMTEgPSAoc3JjMS0+XzExICogc3JjMi0+XzExKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzE0KTsKKyAgICB0ZW1wLl8yMSA9IChzcmMxLT5fMTEgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yMSAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzMxICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDEgKiBzcmMyLT5fMjQpOworICAgIHRlbXAuXzMxID0gKHNyYzEtPl8xMSAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80MSAqIHNyYzItPl8zNCk7CisgICAgdGVtcC5fNDEgPSAoc3JjMS0+XzExICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzQ0KTsKKworICAgIHRlbXAuXzEyID0gKHNyYzEtPl8xMiAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80MiAqIHNyYzItPl8xNCk7CisgICAgdGVtcC5fMjIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzI0KTsKKyAgICB0ZW1wLl8zMiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fMzQpOworICAgIHRlbXAuXzQyID0gKHNyYzEtPl8xMiAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80MiAqIHNyYzItPl80NCk7CisKKyAgICB0ZW1wLl8xMyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fMTEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl8xMikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzEzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fMTQpOworICAgIHRlbXAuXzIzID0gKHNyYzEtPl8xMyAqIHNyYzItPl8yMSkgKyAoc3JjMS0+XzIzICogc3JjMi0+XzIyKSArIChzcmMxLT5fMzMgKiBzcmMyLT5fMjMpICsgKHNyYzEtPl80MyAqIHNyYzItPl8yNCk7CisgICAgdGVtcC5fMzMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzM0KTsKKyAgICB0ZW1wLl80MyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fNDEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl80MikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzQzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fNDQpOworCisgICAgdGVtcC5fMTQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzExKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzE0KTsKKyAgICB0ZW1wLl8yNCA9IChzcmMxLT5fMTQgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yNCAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzM0ICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDQgKiBzcmMyLT5fMjQpOworICAgIHRlbXAuXzM0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80NCAqIHNyYzItPl8zNCk7CisgICAgdGVtcC5fNDQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzQ0KTsKKworICAgIC8qIEFuZCBjb3B5IHRoZSBuZXcgbWF0cml4IGluIHRoZSBnb29kIHN0b3JhZ2UuLiAqLworICAgIG1lbWNweShkZXN0LCAmdGVtcCwgMTYgKiBzaXplb2YoRDNEVkFMVUUpKTsKK30KKworCitIUkVTVUxUCitocl9kZHJhd19mcm9tX3dpbmVkM2QoSFJFU1VMVCBocikKK3sKKyAgICBzd2l0Y2goaHIpCisgICAgeworICAgICAgICBjYXNlIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw6IHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gaHI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy92ZXJ0ZXhidWZmZXIuYyBiL2RsbHMvZGRyYXcvdmVydGV4YnVmZmVyLmMKaW5kZXggZjQxNDJjNS4uMDUxNDAzOCAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy92ZXJ0ZXhidWZmZXIuYworKysgYi9kbGxzL2RkcmF3L3ZlcnRleGJ1ZmZlci5jCkBAIC0xLDUgKzEsNiBAQAotLyogRGlyZWN0M0QgVmlld3BvcnQKKy8qIERpcmVjdDNEIFZlcnRleCBCdWZmZXIKICAqIENvcHlyaWdodCAoYykgMjAwMiBMaW9uZWwgVUxNRVIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTdGVmYW4gRNZTSU5HRVIKICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIERpcmVjdDNEVmVydGV4QnVmZmVyIENPTSBvYmplY3QKICAqCkBAIC0xOSw1OCArMjAsMTEyIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIndpbmUvcG9ydC5oIgorI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIENPQkpNQUNST1MKIAogI2luY2x1ZGUgIndpbmRlZi5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJ3aW5ubHMuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgIm9iamJhc2UuaCIKICNpbmNsdWRlICJ3aW5nZGkuaCIKKyNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImV4Y3B0LmgiCisKICNpbmNsdWRlICJkZHJhdy5oIgogI2luY2x1ZGUgImQzZC5oIgotI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKIAotI2luY2x1ZGUgImQzZF9wcml2YXRlLmgiCi0jaW5jbHVkZSAib3BlbmdsX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCiAKLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKLVdJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGRkcmF3X2dlb20pOworV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CitXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN18xVF9RdWVyeUludGVyZmFjZShMUERJUkVDVDNEVkVSVEVYQlVGRkVSNyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVVua25vd24gTWV0aG9kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OlF1ZXJ5SW50ZXJmYWNlCisgKgorICogVGhlIFF1ZXJ5SW50ZXJmYWNlIE1ldGhvZCBmb3IgVmVydGV4IEJ1ZmZlcnMKKyAqIEZvciBhIGxpbmsgdG8gUXVlcnlJbnRlcmZhY2UgcnVsZXMsIHNlZSBJRGlyZWN0RHJhdzc6OlF1ZXJ5SW50ZXJmYWNlCisgKgorICogUGFyYW1zCisgKiAgcmlpZDogUXVlcnlpZWQgSW50ZXJmYWNlIGlkCisgKiAgb2JqOiBBZGRyZXNzIHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKKyAqCisgKiBSZXR1cm5zOgorICogIFNfT0sgb24gc3VjY2VzcworICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIGludGVyZmFjZSB3YXNuJ3QgZm91bmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAqKm9iaikKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcywlcClcbiIsIFRoaXMsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYmopOwogCiAgICAgLyogQnkgZGVmYXVsdCwgc2V0IHRoZSBvYmplY3QgcG9pbnRlciB0byBOVUxMICovCi0gICAgKm9icCA9IE5VTEw7Ci0gICAgICAKLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCAgcmlpZCApICkgeworICAgICpvYmogPSBOVUxMOworCisgICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JVW5rbm93biwgIHJpaWQgKSApCisgICAgewogICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpKTsKLQkqb2JwID0gaWZhY2U7Ci0JVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9icCk7Ci0JcmV0dXJuIFNfT0s7CisgICAgICAgICpvYmogPSBpZmFjZTsKKyAgICAgICAgVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CisgICAgICAgIHJldHVybiBTX09LOwogICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRFZlcnRleEJ1ZmZlciwgcmlpZCApICkgeworICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEVmVydGV4QnVmZmVyLCByaWlkICkgKQorICAgIHsKICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcyxJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSk7Ci0gICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIpOwotCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRFZlcnRleEJ1ZmZlciBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwotCXJldHVybiBTX09LOworICAgICAgICAqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVmVydGV4QnVmZmVyKTsKKyAgICAgICAgVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNEVmVydGV4QnVmZmVyIGludGVyZmFjZSAlcFxuIiwgKm9iaik7CisgICAgICAgIHJldHVybiBTX09LOwogICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIHJpaWQgKSApIHsKKyAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIHJpaWQgKSApCisgICAgewogICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpKTsKLSAgICAgICAgKm9icCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpOwotCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlICVwXG4iLCAqb2JwKTsKLQlyZXR1cm4gU19PSzsKKyAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpOworICAgICAgICBUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZSAlcFxuIiwgKm9iaik7CisgICAgICAgIHJldHVybiBTX09LOwogICAgIH0KICAgICBGSVhNRSgiKCVwKTogaW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSk7Ci0gICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOworICAgIHJldHVybiBFX05PSU5URVJGQUNFOwogfQogCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1RodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CisKKyAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6QWRkUmVmCisgKgorICogQWRkUmVmIGZvciBWZXJ0ZXggQnVmZmVycworICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIFVMT05HIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzdfMVRfQWRkUmVmKExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGlmYWNlKQorSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9BZGRSZWYoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqaWZhY2UpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpOwogICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwpAQCAtODEsNDc3ICsxMzYsNDI2IEBACiB9CiAKIFVMT05HIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzdfMVRfUmVsZWFzZShMUERJUkVDVDNEVkVSVEVYQlVGRkVSNyBpZmFjZSkKK1RodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9BZGRSZWYoSURpcmVjdDNEVmVydGV4QnVmZmVyICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OlJlbGVhc2UKKyAqCisgKiBSZWxlYXNlIGZvciBWZXJ0ZXggQnVmZmVycworICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VMT05HIFdJTkFQSQorSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9SZWxlYXNlKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKmlmYWNlKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKICAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKIAotICAgIFRSQUNFKCIoJXAvJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBpZmFjZSwgcmVmICsgMSk7CisgICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiArIDEpOwogCi0gICAgaWYgKHJlZiA9PSAwKSB7Ci0gICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnZlcnRpY2VzKTsKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAocmVmID09IDApCisgICAgeworICAgICAgICBJV2luZUQzRFZlcnRleEJ1ZmZlcl9SZWxlYXNlKFRoaXMtPndpbmVEM0RWZXJ0ZXhCdWZmZXIpOworICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiByZWY7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN18xVF9Mb2NrKExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIGxwbHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdTaXplKQotewotICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVwLCVwKVxuIiwgVGhpcywgaWZhY2UsIGR3RmxhZ3MsIGxwbHBEYXRhLCBscGR3U2l6ZSk7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCIgbG9jayBmbGFncyA6ICIpOwotCUREUkFXX2R1bXBfbG9ja2ZsYWcoZHdGbGFncyk7Ci0gICAgfQotICAgIAotICAgIGlmIChUaGlzLT5wcm9jZXNzZWQpIHsKLSAgICAgICAgV0FSTigiIGFwcGxpY2F0aW9uIGRvZXMgYSBMb2NrIG9uIGEgdmVydGV4IGJ1ZmZlciByZXN1bHRpbmcgZnJvbSBhIFByb2Nlc3NWZXJ0aWNlcyBjYWxsLiBFeHBlY3QgcHJvYmxlbXMgIVxuIik7Ci0gICAgfQotCi0gICAgaWYgKFRoaXMtPmRlc2MuZHdDYXBzICYgRDNEVkJDQVBTX09QVElNSVpFRCkgcmV0dXJuIEQzREVSUl9WRVJURVhCVUZGRVJPUFRJTUlaRUQ7Ci0KLSAgICBpZiAobHBkd1NpemUgIT0gTlVMTCkgKmxwZHdTaXplID0gVGhpcy0+dmVydGV4X2J1ZmZlcl9zaXplOwotICAgICpscGxwRGF0YSA9IFRoaXMtPnZlcnRpY2VzOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF83XzFUX1VubG9jayhMUERJUkVDVDNEVkVSVEVYQlVGRkVSNyBpZmFjZSkKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPigpXG4iLCBUaGlzLCBpZmFjZSk7Ci0gICAgLyogTm90aGluZyB0byBkbyBoZXJlIGZvciBub3cuIE1heWJlIHNvbWUgb3B0aW1pemF0aW9ucyBpZiBldmVyIHdlIHdhbnQgdG8gZG8gc29tZSA6LSkgKi8KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN18xVF9Qcm9jZXNzVmVydGljZXMoTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcgaWZhY2UsCi0JCQkJCQkgICAgRFdPUkQgZHdWZXJ0ZXhPcCwKLQkJCQkJCSAgICBEV09SRCBkd0Rlc3RJbmRleCwKLQkJCQkJCSAgICBEV09SRCBkd0NvdW50LAotCQkJCQkJICAgIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwU3JjQnVmZmVyLAotCQkJCQkJICAgIERXT1JEIGR3U3JjSW5kZXgsCi0JCQkJCQkgICAgTFBESVJFQ1QzRERFVklDRTcgbHBEM0REZXZpY2UsCi0JCQkJCQkgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDhseCwlMDhseCwlMDhseCwlcCwlMDhseCwlcCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZHdWZXJ0ZXhPcCwgZHdEZXN0SW5kZXgsIGR3Q291bnQsIGxwU3JjQnVmZmVyLCBkd1NyY0luZGV4LCBscEQzRERldmljZSwgZHdGbGFncyk7ICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF83XzFUX0dldFZlcnRleEJ1ZmZlckRlc2MoTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVkVSVEVYQlVGRkVSREVTQyBscEQzRFZlcnRleEJ1ZmZlckRlc2MpCi17Ci0gICAgRFdPUkQgc2l6ZTsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7Ci0gICAgCi0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscEQzRFZlcnRleEJ1ZmZlckRlc2MpOwotICAgIAotICAgIHNpemUgPSBscEQzRFZlcnRleEJ1ZmZlckRlc2MtPmR3U2l6ZTsKLSAgICBtZW1zZXQobHBEM0RWZXJ0ZXhCdWZmZXJEZXNjLCAwLCBzaXplKTsKLSAgICBtZW1jcHkobHBEM0RWZXJ0ZXhCdWZmZXJEZXNjLCAmVGhpcy0+ZGVzYywgCi0JICAgKHNpemUgPCBUaGlzLT5kZXNjLmR3U2l6ZSkgPyBzaXplIDogVGhpcy0+ZGVzYy5kd1NpemUpOwotICAgIAotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF83XzFUX09wdGltaXplKExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGlmYWNlLAotCQkJCQkgICAgIExQRElSRUNUM0RERVZJQ0U3IGxwRDNERGV2aWNlLAotCQkJCQkgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJXAsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGxwRDNERGV2aWNlLCBkd0ZsYWdzKTsKLQotICAgIFRoaXMtPmRlc2MuZHdDYXBzIHw9IEQzRFZCQ0FQU19PUFRJTUlaRUQ7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN19Qcm9jZXNzVmVydGljZXNTdHJpZGVkKExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleE9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0Rlc3RJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgbHBTdHJpZGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleFR5cGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNEREVWSUNFNyBscEQzRERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglMDhseCwlMDhseCwlMDhseCwlcCwlMDhseCwlcCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgZHdWZXJ0ZXhPcCwgZHdEZXN0SW5kZXgsIGR3Q291bnQsIGxwU3RyaWRlRGF0YSwgZHdWZXJ0ZXhUeXBlRGVzYywgbHBEM0REZXZpY2UsIGR3RmxhZ3MpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9Qcm9jZXNzVmVydGljZXMoTFBESVJFQ1QzRFZFUlRFWEJVRkZFUiBpZmFjZSwKLQkJCQkJCSAgRFdPUkQgZHdWZXJ0ZXhPcCwKLQkJCQkJCSAgRFdPUkQgZHdEZXN0SW5kZXgsCi0JCQkJCQkgIERXT1JEIGR3Q291bnQsCi0JCQkJCQkgIExQRElSRUNUM0RWRVJURVhCVUZGRVIgbHBTcmNCdWZmZXIsCi0JCQkJCQkgIERXT1JEIGR3U3JjSW5kZXgsCi0JCQkJCQkgIExQRElSRUNUM0RERVZJQ0UzIGxwRDNERGV2aWNlLAotCQkJCQkJICBEV09SRCBkd0ZsYWdzKQotewotICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJTA4bHgsJTA4bHgsJXAsJTA4bHgsJXAsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsCi0JICBkd1ZlcnRleE9wLCBkd0Rlc3RJbmRleCwgZHdDb3VudCwgbHBTcmNCdWZmZXIsIGR3U3JjSW5kZXgsIGxwRDNERGV2aWNlLCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Qcm9jZXNzVmVydGljZXMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpLAotCQkJCQkJICBkd1ZlcnRleE9wLAotCQkJCQkJICBkd0Rlc3RJbmRleCwKLQkJCQkJCSAgZHdDb3VudCwKLQkJCQkJCSAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgbHBTcmNCdWZmZXIpLAotCQkJCQkJICBkd1NyY0luZGV4LAotCQkJCQkJICBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgbHBEM0REZXZpY2UpLAotCQkJCQkJICBkd0ZsYWdzKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9PcHRpbWl6ZShMUERJUkVDVDNEVkVSVEVYQlVGRkVSIGlmYWNlLAotCQkJCQkgICBMUERJUkVDVDNEREVWSUNFMyBscEQzRERldmljZSwKLQkJCQkJICAgRFdPUkQgZHdGbGFncykKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBscEQzRERldmljZSwgZHdGbGFncyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfT3B0aW1pemUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpLAotCQkJCQkgICBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgSURpcmVjdDNERGV2aWNlNywgbHBEM0REZXZpY2UpLAotCQkJCQkgICBkd0ZsYWdzKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9RdWVyeUludGVyZmFjZShMUERJUkVDVDNEVkVSVEVYQlVGRkVSIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKQotewotICAgIFRSQUNFKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JwKTsKLX0KLQogVUxPTkcgV0lOQVBJCi1UaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfQWRkUmVmKExQRElSRUNUM0RWRVJURVhCVUZGRVIgaWZhY2UpCitUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfUmVsZWFzZShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKmlmYWNlKQogewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpKTsKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIsIGlmYWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMpOworCisgICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSk7CiB9CiAKLVVMT05HIFdJTkFQSQotVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1JlbGVhc2UoTFBESVJFQ1QzRFZFUlRFWEJVRkZFUiBpZmFjZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVmVydGV4QnVmZmVyNyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSkpOwotfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgTWV0aG9kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX0xvY2soTFBESVJFQ1QzRFZFUlRFWEJVRkZFUiBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIGxwbHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3U2l6ZSkKLXsKLSAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIGlmYWNlLCBkd0ZsYWdzLCBscGxwRGF0YSwgbHBkd1NpemUpOwotICAgIHJldHVybiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X0xvY2soQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwbHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBkd1NpemUpOwotfQotCi1IUkVTVUxUIFdJTkFQSQotVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1VubG9jayhMUERJUkVDVDNEVkVSVEVYQlVGRkVSIGlmYWNlKQotewotICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIGlmYWNlKTsKLSAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19VbmxvY2soQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLVRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9HZXRWZXJ0ZXhCdWZmZXJEZXNjKExQRElSRUNUM0RWRVJURVhCVUZGRVIgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFZFUlRFWEJVRkZFUkRFU0MgbHBEM0RWZXJ0ZXhCdWZmZXJEZXNjKQotewotICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRDNEVmVydGV4QnVmZmVyRGVzYyk7Ci0gICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfR2V0VmVydGV4QnVmZmVyRGVzYyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEQzRFZlcnRleEJ1ZmZlckRlc2MpOwotfQotCi0jZGVmaW5lIGNvcHlfYW5kX25leHQoZGVzdCwgc3JjLCBzaXplKSBtZW1jcHkoZGVzdCwgc3JjLCBzaXplKTsgZGVzdCArPSAoc2l6ZSkKLQotc3RhdGljIEhSRVNVTFQKLXByb2Nlc3NfdmVydGljZXNfc3RyaWRlZChJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICpUaGlzLAotCQkJIERXT1JEIGR3VmVydGV4T3AsCi0JCQkgRFdPUkQgZHdEZXN0SW5kZXgsCi0JCQkgRFdPUkQgZHdDb3VudCwKLQkJCSBMUEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSBscFN0cmlkZURhdGEsCi0JCQkgRFdPUkQgZHdWZXJ0ZXhUeXBlRGVzYywKLQkJCSBJRGlyZWN0M0REZXZpY2VJbXBsICpkZXZpY2VfaW1wbCwKLQkJCSBEV09SRCBkd0ZsYWdzKQotewotICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckdMSW1wbCAqZ2xUaGlzID0gKElEaXJlY3QzRFZlcnRleEJ1ZmZlckdMSW1wbCAqKSBUaGlzOwotICAgIERXT1JEIHNpemUgPSBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoZHdWZXJ0ZXhUeXBlRGVzYyk7Ci0gICAgY2hhciAqZGVzdF9wdHI7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBUaGlzLT5wcm9jZXNzZWQgPSBUUlVFOwotCi0gICAgLyogRm9yIHRoZSBtb21lbnQsIHRoZSB0cmljayBpcyB0byBzYXZlIHRoZSB0cmFuc2Zvcm0gYW5kIGxpZ2h0aW5nIHN0YXRlIGF0IHByb2Nlc3MKLSAgICAgICB0aW1lIHRvIHJlc3RvcmUgdGhlbSBhdCBkcmF3aW5nIHRpbWUuCi0gICAgICAgCi0gICAgICAgVGhlIEJJRyBwcm9ibGVtIHdpdGggdGhpcyBtZXRob2QgaXMgbm90aGluZyBwcmV2ZW50cyBEM0QgdG8gZG8gZGlydHkgdHJpY2tzIGxpa2UKLSAgICAgICBwcm9jZXNzaW5nIHR3byBkaWZmZXJlbnQgc2V0cyBvZiB2ZXJ0aWNlcyB3aXRoIHR3byBkaWZmZXJlbnQgcmVuZGVyaW5nIHBhcmFtZXRlcnMKLSAgICAgICBhbmQgdGhlbiB0byBkaXNwbGF5IHRoZW0gdXNpbmcgdGhlIHNhbWUgRHJhd1ByaW1pdGl2ZSBjYWxsLgotCi0gICAgICAgSXQgd291bGQgYmUgbmljZSB0byBjaGVjayBmb3Igc3VjaCBjb2RlIGhlcmUgKGJ1dCB3ZWxsLCBldmVuIHRoaXMgaXMgbm90IHRyaXZpYWwKLSAgICAgICB0byBkbykuCi0KLSAgICAgICBUaGlzIGlzIGV4YWN0bHkgd2hhdCB0aGUgVFdJU1QuRVhFIGRlbW8gZG9lcyBidXQgdXNpbmcgdGhlIHNhbWUga2luZCBvZiB1Z2x5IHN0dWZmCi0gICAgICAgaW4gdGhlIEQzREV4ZWN1dGVCdWZmZXIgY29kZS4gSSByZWFsbHkgd29uZGVyIHdoeSBNaWNyb3NvZnQgd2VudCBiYWNrIGluIHRpbWUgd2hlbgotICAgICAgIGltcGxlbWVudGluZyB0aGlzIG1vc3RseSB1c2VsZXNzIChJTUhPKSBBUEkuCi0gICAgKi8KLSAgICBnbFRoaXMtPmR3VmVydGV4VHlwZURlc2MgPSBkd1ZlcnRleFR5cGVEZXNjOwotCi0gICAgaWYgKGR3VmVydGV4VHlwZURlc2MgJiBEM0RGVkZfTk9STUFMKSB7Ci0gICAgICAgIFdBUk4oIiBsaWdodGluZyBzdGF0ZSBub3Qgc2F2ZWQgeWV0Li4uIFNvbWUgc3RyYW5nZSBzdHVmZiBtYXkgaGFwcGVuICFcbiIpOwotICAgIH0KLQotICAgIGlmIChnbFRoaXMtPnZlcnRpY2VzID09IE5VTEwpIHsKLSAgICAgICAgZ2xUaGlzLT52ZXJ0aWNlcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplICogVGhpcy0+ZGVzYy5kd051bVZlcnRpY2VzKTsKLSAgICB9Ci0gICAgZGVzdF9wdHIgPSAoKGNoYXIgKikgZ2xUaGlzLT52ZXJ0aWNlcykgKyBkd0Rlc3RJbmRleCAqIHNpemU7Ci0gICAgCi0gICAgbWVtY3B5KCYoZ2xUaGlzLT53b3JsZF9tYXQpLCBkZXZpY2VfaW1wbC0+d29ybGRfbWF0LCBzaXplb2YoRDNETUFUUklYKSk7Ci0gICAgbWVtY3B5KCYoZ2xUaGlzLT52aWV3X21hdCksIGRldmljZV9pbXBsLT52aWV3X21hdCwgc2l6ZW9mKEQzRE1BVFJJWCkpOwotICAgIG1lbWNweSgmKGdsVGhpcy0+cHJval9tYXQpLCBkZXZpY2VfaW1wbC0+cHJval9tYXQsIHNpemVvZihEM0RNQVRSSVgpKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBkd0NvdW50OyBpKyspIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHRleF9pbmRleDsKLQotCWlmICgoZHdWZXJ0ZXhUeXBlRGVzYyAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSA9PSBEM0RGVkZfWFlaKSB7Ci0JICAgIEQzRFZBTFVFICpwb3NpdGlvbiA9Ci0JICAgICAgKEQzRFZBTFVFICopICgoKGNoYXIgKikgbHBTdHJpZGVEYXRhLT5wb3NpdGlvbi5scHZEYXRhKSArIGkgKiBscFN0cmlkZURhdGEtPnBvc2l0aW9uLmR3U3RyaWRlKTsKLQkgICAgY29weV9hbmRfbmV4dChkZXN0X3B0ciwgcG9zaXRpb24sIDMgKiBzaXplb2YoRDNEVkFMVUUpKTsKLQl9IGVsc2UgaWYgKChkd1ZlcnRleFR5cGVEZXNjICYgRDNERlZGX1BPU0lUSU9OX01BU0spID09IEQzREZWRl9YWVpSSFcpIHsKLQkgICAgRDNEVkFMVUUgKnBvc2l0aW9uID0KLQkgICAgICAoRDNEVkFMVUUgKikgKCgoY2hhciAqKSBscFN0cmlkZURhdGEtPnBvc2l0aW9uLmxwdkRhdGEpICsgaSAqIGxwU3RyaWRlRGF0YS0+cG9zaXRpb24uZHdTdHJpZGUpOwotCSAgICBjb3B5X2FuZF9uZXh0KGRlc3RfcHRyLCBwb3NpdGlvbiwgNCAqIHNpemVvZihEM0RWQUxVRSkpOwotCX0KLQlpZiAoZHdWZXJ0ZXhUeXBlRGVzYyAmIEQzREZWRl9SRVNFUlZFRDEpIHsKLQkgICAgZGVzdF9wdHIgKz0gc2l6ZW9mKERXT1JEKTsKLQl9Ci0JaWYgKGR3VmVydGV4VHlwZURlc2MgJiBEM0RGVkZfTk9STUFMKSB7IAotCSAgICBEM0RWQUxVRSAqbm9ybWFsID0gCi0JICAgICAgKEQzRFZBTFVFICopICgoKGNoYXIgKikgbHBTdHJpZGVEYXRhLT5ub3JtYWwubHB2RGF0YSkgKyBpICogbHBTdHJpZGVEYXRhLT5ub3JtYWwuZHdTdHJpZGUpOwkgICAgCi0JICAgIGNvcHlfYW5kX25leHQoZGVzdF9wdHIsIG5vcm1hbCwgMyAqIHNpemVvZihEM0RWQUxVRSkpOwotCX0KLQlpZiAoZHdWZXJ0ZXhUeXBlRGVzYyAmIEQzREZWRl9ESUZGVVNFKSB7Ci0JICAgIERXT1JEICpjb2xvcl9kID0gCi0JICAgICAgKERXT1JEICopICgoKGNoYXIgKikgbHBTdHJpZGVEYXRhLT5kaWZmdXNlLmxwdkRhdGEpICsgaSAqIGxwU3RyaWRlRGF0YS0+ZGlmZnVzZS5kd1N0cmlkZSk7Ci0JICAgIGNvcHlfYW5kX25leHQoZGVzdF9wdHIsIGNvbG9yX2QsIHNpemVvZihEV09SRCkpOwotCX0KLQlpZiAoZHdWZXJ0ZXhUeXBlRGVzYyAmIEQzREZWRl9TUEVDVUxBUikgeyAKLQkgICAgRFdPUkQgKmNvbG9yX3MgPSAKLQkgICAgICAoRFdPUkQgKikgKCgoY2hhciAqKSBscFN0cmlkZURhdGEtPnNwZWN1bGFyLmxwdkRhdGEpICsgaSAqIGxwU3RyaWRlRGF0YS0+c3BlY3VsYXIuZHdTdHJpZGUpOwotCSAgICBjb3B5X2FuZF9uZXh0KGRlc3RfcHRyLCBjb2xvcl9zLCBzaXplb2YoRFdPUkQpKTsKLQl9Ci0JZm9yICh0ZXhfaW5kZXggPSAwOyB0ZXhfaW5kZXggPCBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoZHdWZXJ0ZXhUeXBlRGVzYyk7IHRleF9pbmRleCsrKSB7Ci0JICAgIEQzRFZBTFVFICp0ZXhfY29vcmQgPQotCSAgICAgIChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1t0ZXhfaW5kZXhdLmxwdkRhdGEpICsgCi0JCQkgICAgaSAqIGxwU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1t0ZXhfaW5kZXhdLmR3U3RyaWRlKTsKLQkgICAgY29weV9hbmRfbmV4dChkZXN0X3B0ciwgdGV4X2Nvb3JkLCBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkd1ZlcnRleFR5cGVEZXNjLCB0ZXhfaW5kZXgpICogc2l6ZW9mKEQzRFZBTFVFKSk7Ci0JfQotCi0JaWYgKFRSQUNFX09OKGRkcmF3X2dlb20pKSB7Ci0JICAgIGlmICgoZHdWZXJ0ZXhUeXBlRGVzYyAmIEQzREZWRl9QT1NJVElPTl9NQVNLKSA9PSBEM0RGVkZfWFlaKSB7Ci0JICAgICAgICBEM0RWQUxVRSAqcG9zaXRpb24gPQotCQkgIChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwU3RyaWRlRGF0YS0+cG9zaXRpb24ubHB2RGF0YSkgKyBpICogbHBTdHJpZGVEYXRhLT5wb3NpdGlvbi5kd1N0cmlkZSk7Ci0JCVRSQUNFXyhkZHJhd19nZW9tKSgiICVmICVmICVmIiwgcG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCBwb3NpdGlvblsyXSk7Ci0JICAgIH0gZWxzZSBpZiAoKGR3VmVydGV4VHlwZURlc2MgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykgPT0gRDNERlZGX1hZWlJIVykgewotCSAgICAgICAgRDNEVkFMVUUgKnBvc2l0aW9uID0KLQkJICAoRDNEVkFMVUUgKikgKCgoY2hhciAqKSBscFN0cmlkZURhdGEtPnBvc2l0aW9uLmxwdkRhdGEpICsgaSAqIGxwU3RyaWRlRGF0YS0+cG9zaXRpb24uZHdTdHJpZGUpOwotCQlUUkFDRV8oZGRyYXdfZ2VvbSkoIiAlZiAlZiAlZiAlZiIsIHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0sIHBvc2l0aW9uWzNdKTsKLQkgICAgfQotCSAgICBpZiAoZHdWZXJ0ZXhUeXBlRGVzYyAmIEQzREZWRl9OT1JNQUwpIHsgCi0JICAgICAgICBEM0RWQUxVRSAqbm9ybWFsID0gCi0JCSAgKEQzRFZBTFVFICopICgoKGNoYXIgKikgbHBTdHJpZGVEYXRhLT5ub3JtYWwubHB2RGF0YSkgKyBpICogbHBTdHJpZGVEYXRhLT5ub3JtYWwuZHdTdHJpZGUpOwkgICAgCi0JCVRSQUNFXyhkZHJhd19nZW9tKSgiIC8gJWYgJWYgJWYiLCBub3JtYWxbMF0sIG5vcm1hbFsxXSwgbm9ybWFsWzJdKTsKLQkgICAgfQotCSAgICBpZiAoZHdWZXJ0ZXhUeXBlRGVzYyAmIEQzREZWRl9ESUZGVVNFKSB7Ci0JICAgICAgICBEV09SRCAqY29sb3JfZCA9IAotCQkgIChEV09SRCAqKSAoKChjaGFyICopIGxwU3RyaWRlRGF0YS0+ZGlmZnVzZS5scHZEYXRhKSArIGkgKiBscFN0cmlkZURhdGEtPmRpZmZ1c2UuZHdTdHJpZGUpOwotCQlUUkFDRV8oZGRyYXdfZ2VvbSkoIiAvICUwMmx4ICUwMmx4ICUwMmx4ICUwMmx4IiwKLQkJCQkgICAoKmNvbG9yX2QgPj4gMTYpICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX2QgPj4gIDgpICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX2QgPj4gIDApICYgMHhGRiwKLQkJCQkgICAoKmNvbG9yX2QgPj4gMjQpICYgMHhGRik7Ci0JICAgIH0KLQkgICAgaWYgKGR3VmVydGV4VHlwZURlc2MgJiBEM0RGVkZfU1BFQ1VMQVIpIHsgCi0JICAgICAgICBEV09SRCAqY29sb3JfcyA9IAotCQkgIChEV09SRCAqKSAoKChjaGFyICopIGxwU3RyaWRlRGF0YS0+c3BlY3VsYXIubHB2RGF0YSkgKyBpICogbHBTdHJpZGVEYXRhLT5zcGVjdWxhci5kd1N0cmlkZSk7Ci0JCVRSQUNFXyhkZHJhd19nZW9tKSgiIC8gJTAybHggJTAybHggJTAybHggJTAybHgiLAotCQkJCSAgICgqY29sb3JfcyA+PiAxNikgJiAweEZGLAotCQkJCSAgICgqY29sb3JfcyA+PiAgOCkgJiAweEZGLAotCQkJCSAgICgqY29sb3JfcyA+PiAgMCkgJiAweEZGLAotCQkJCSAgICgqY29sb3JfcyA+PiAyNCkgJiAweEZGKTsKLQkgICAgfQotCSAgICBmb3IgKHRleF9pbmRleCA9IDA7IHRleF9pbmRleCA8IEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkd1ZlcnRleFR5cGVEZXNjKTsgdGV4X2luZGV4KyspIHsKLQkgICAgICAgIEQzRFZBTFVFICp0ZXhfY29vcmQgPQotCQkgIChEM0RWQUxVRSAqKSAoKChjaGFyICopIGxwU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1t0ZXhfaW5kZXhdLmxwdkRhdGEpICsgCi0JCQkJaSAqIGxwU3RyaWRlRGF0YS0+dGV4dHVyZUNvb3Jkc1t0ZXhfaW5kZXhdLmR3U3RyaWRlKTsKLQkJc3dpdGNoIChHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkd1ZlcnRleFR5cGVEZXNjLCB0ZXhfaW5kZXgpKSB7Ci0JCSAgICBjYXNlIDE6IFRSQUNFXyhkZHJhd19nZW9tKSgiIC8gJWYiLCB0ZXhfY29vcmRbMF0pOyBicmVhazsKLQkJICAgIGNhc2UgMjogVFJBQ0VfKGRkcmF3X2dlb20pKCIgLyAlZiAlZiIsIHRleF9jb29yZFswXSwgdGV4X2Nvb3JkWzFdKTsgYnJlYWs7Ci0JCSAgICBjYXNlIDM6IFRSQUNFXyhkZHJhd19nZW9tKSgiIC8gJWYgJWYgJWYiLCB0ZXhfY29vcmRbMF0sIHRleF9jb29yZFsxXSwgdGV4X2Nvb3JkWzJdKTsgYnJlYWs7Ci0JCSAgICBjYXNlIDQ6IFRSQUNFXyhkZHJhd19nZW9tKSgiIC8gJWYgJWYgJWYgJWYiLCB0ZXhfY29vcmRbMF0sIHRleF9jb29yZFsxXSwgdGV4X2Nvb3JkWzJdLCB0ZXhfY29vcmRbM10pOyBicmVhazsKLQkJICAgIGRlZmF1bHQ6IFRSQUNFXyhkZHJhd19nZW9tKSgiSW52YWxpZCB0ZXh0dXJlIHNpemUgKCVsZCkgISEhIiwgR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZHdWZXJ0ZXhUeXBlRGVzYywgdGV4X2luZGV4KSk7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgICAgVFJBQ0VfKGRkcmF3X2dlb20pKCJcbiIpOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLSN1bmRlZiBjb3B5X2FuZF9uZXh0Ci0KLUhSRVNVTFQgV0lOQVBJCi1HTF9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzdfMVRfUHJvY2Vzc1ZlcnRpY2VzKExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGlmYWNlLAotCQkJCQkJICBEV09SRCBkd1ZlcnRleE9wLAotCQkJCQkJICBEV09SRCBkd0Rlc3RJbmRleCwKLQkJCQkJCSAgRFdPUkQgZHdDb3VudCwKLQkJCQkJCSAgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcgbHBTcmNCdWZmZXIsCi0JCQkJCQkgIERXT1JEIGR3U3JjSW5kZXgsCi0JCQkJCQkgIExQRElSRUNUM0RERVZJQ0U3IGxwRDNERGV2aWNlLAotCQkJCQkJICBEV09SRCBkd0ZsYWdzKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3OjpMb2NrCisgKgorICogTG9ja3MgdGhlIHZlcnRleCBidWZmZXIgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2ZXJ0ZXggZGF0YQorICogTG9ja2luZyB2ZXJ0ZXggYnVmZmVycyBpcyBzaW1taWxhciB0byBsb2NraW5nIHN1cmZhY2VzLCBiZWNhdXNlIFdpbmRvd3MKKyAqIHVzZXMgc3VyZmFjZXMgdG8gc3RvcmUgdmVydGV4IGRhdGEgaW50ZXJuYWxseShBY2NvcmRpbmcgdG8gdGhlIERYIHNkaykKKyAqCisgKiBQYXJhbXM6CisgKiAgRmxhZ3M6IExvY2tpbmcgZmxhZ3MuIFJlbGV2YW50IGhlcmUgYXJlIERETE9DS19SRUFET05MWSwgRERMT0NLX1dSSVRFT05MWSwKKyAqICAgICAgICAgRERMT0NLX0RJU0NBUkRDT05URU5UUyBhbmQgRERMT0NLX05PT1ZFUldSSVRFLgorICogIERhdGE6ICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmVydGV4IGRhdGEKKyAqICBTaXplOiAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlmIG5vdCBOVUxMCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGF0YSBpcyBOVUxMCisgKiAgRDNERVJSX1ZFUlRFWEJVRkZFUk9QVElNSVpFRCBpZiBjYWxsZWQgb24gYW4gb3B0aW1pemVkIGJ1ZmZlcihXaW5lRDNEKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9Mb2NrKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpTaXplKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKLSAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICpzcmNfaW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGxwU3JjQnVmZmVyKTsKLSAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpkZXZpY2VfaW1wbCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIGxwRDNERGV2aWNlKTsKLSAgICBEM0REUkFXUFJJTUlUSVZFU1RSSURFRERBVEEgc3RyaWRlZDsKKyAgICBXSU5FRDNEVkVSVEVYQlVGRkVSX0RFU0MgRGVzYzsKKyAgICBIUkVTVUxUIGhyOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXAsJXApXG4iLCBUaGlzLCBGbGFncywgRGF0YSwgU2l6ZSk7CisKKyAgICAvKiBHZXQgdGhlIHNpemUsIGZvciByZXR1cm5pbmcgaXQsIGFuZCBmb3IgbG9ja2luZyAqLworICAgIGhyID0gSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfR2V0RGVzYyhUaGlzLT53aW5lRDNEVmVydGV4QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRGVzYyk7CisgICAgaWYoaHIgIT0gRDNEX09LKQorICAgIHsKKyAgICAgICAgRVJSKCIoJXApIElXaW5lRDNEVmVydGV4QnVmZmVyOjpHZXREZXNjIGZhaWxlZCB3aXRoIGhyPSUwOGx4XG4iLCBUaGlzLCBocik7CisgICAgICAgIHJldHVybiBocjsKKyAgICB9CisKKyAgICBpZihTaXplKSAqU2l6ZSA9IERlc2MuU2l6ZTsKKworICAgIHJldHVybiBJV2luZUQzRFZlcnRleEJ1ZmZlcl9Mb2NrKFRoaXMtPndpbmVEM0RWZXJ0ZXhCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBPZmZzZXRUb0xvY2sgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYy5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFICoqKSBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfTG9jayhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpTaXplKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglMDhseCwlcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEVmVydGV4QnVmZmVyNyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBGbGFncywgRGF0YSwgU2l6ZSk7CisKKyAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6VW5sb2NrCisgKgorICogVW5sb2NrcyBhIHZlcnRleCBCdWZmZXIKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1VubG9jayhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICppZmFjZSkKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPigpXG4iLCBUaGlzKTsKKworICAgIC8qIFRoaXMgaXMgZWFzeSA6KSAqLworICAgIHJldHVybiBJV2luZUQzRFZlcnRleEJ1ZmZlcl9VbmxvY2soVGhpcy0+d2luZUQzRFZlcnRleEJ1ZmZlcik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1VubG9jayhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKmlmYWNlKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgaWZhY2UpOworICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CisKKyAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19VbmxvY2soSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEVmVydGV4QnVmZmVyNykpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6UHJvY2Vzc1ZlcnRpY2VzCisgKgorICogUHJvY2Vzc2VzIHVudHJhbnNmb3JtZWQgVmVydGljZXMgaW50byBhIHRyYW5zZm9ybWVkIG9yIG9wdGltaXplZCB2ZXJ0ZXgKKyAqIGJ1ZmZlci4gSXQgY2FuIGFsc28gcGVyZm9ybSBvdGhlciBvcGVyYXRpb25zLCBzdWNoIGFzIGxpZ2h0aW5nIG9yIGNsaXBwaW5nCisgKgorICogUGFyYW1zCisgKiAgVmVydGV4T3A6IE9wZXJhdGlvbihzKSB0byBwZXJmb3JtOiBEM0RWT1BfQ0xJUCwgX0VYVEVOVFMsIF9MSUdIVCwgX1RSQU5TRk9STQorICogIERlc3RJbmRleDogSW5kZXggaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcihUaGlzKSwgd2hlcmUgdGhlIHZlcnRpY2VzIGFyZQorICogICAgICAgICAgICAgcGxhY2VkCisgKiAgQ291bnQ6IE51bWJlciBvZiBWZXJ0aWNlcyBpbiB0aGUgU291cmNlIGJ1ZmZlciB0byBwcm9jZXNzCisgKiAgU3JjQnVmZmVyOiBTb3VyY2UgdmVydGV4IGJ1ZmZlcgorICogIFNyY0luZGV4OiBJbmRleCBvZiB0aGUgZmlyc3QgdmVydGV4IGluIHRoZSBzcmMgYnVmZmVyIHRvIHByb2Nlc3MKKyAqICBEM0REZXZpY2U6IERldmljZSB0byB1c2UgZm9yIHRyYW5zZm9ybWF0aW9uCisgKiAgRmxhZ3M6IDAgZm9yIGRlZmF1bHQsIEQzRFBWX0RPTk9UQ09QWURBVEEgdG8gcHJldmVudCBjb3B5aW5nCisgKiAgICAgICAgIHVuY2hhbmVkIHZlcnRpY2VzCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgSWYgRDNEVk9QX1RSQU5TRk9STSB3YXNuJ3QgcGFzc2VkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1Byb2Nlc3NWZXJ0aWNlcyhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFZlcnRleE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRGVzdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICpTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTcmNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTcgKkQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICpTcmMgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBTcmNCdWZmZXIpOworICAgIElEaXJlY3QzRERldmljZUltcGwgKkQzRCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIEQzRERldmljZSk7CisgICAgQk9PTCBvbGRDbGlwLCBkb0NsaXA7CisgICAgSFJFU1VMVCBocjsKKworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJWxkLCVsZCwlcCwlbGQsJXAsJTA4bHgpXG4iLCBUaGlzLCBWZXJ0ZXhPcCwgRGVzdEluZGV4LCBDb3VudCwgU3JjLCBTcmNJbmRleCwgRDNELCBGbGFncyk7CisKKyAgICAvKiBWZXJ0ZXggb3BlcmF0aW9uczoKKyAgICAgKiBEM0RWT1BfQ0xJUDogQ2xpcHMgdmVydGljZXMgb3V0c2lkZSB0aGUgdmlld2luZyBmcnVzdHJ1bS4gTmVlZHMgY2xpcHBpbmcgaW5mb3JtYXRpb24KKyAgICAgKiBpbiB0aGUgdmVydGV4IGJ1ZmZlciAoQnVmZmVyIG1heSBub3QgYmUgY3JlYXRlZCB3aXRoIEQzRFZCQ0FQU19ET05PVENMSVApCisgICAgICogRDNEVk9QX0VYVEVOVFM6IENhdXNlcyB0aGUgc2NyZWVuIGV4dGVudHMgdG8gYmUgdXBkYXRlZCB3aGVuIHJlbmRlcmluZyB0aGUgdmVydGljZXMKKyAgICAgKiBEM0RWT1BfTElHSFQ6IExpZ2h0cyB0aGUgdmVydGljZXMKKyAgICAgKiBEM0RWT1BfVFJBTlNGT1JNOiBUcmFuc2Zvcm0gdGhlIHZlcnRpY2VzLiBUaGlzIGZsYWcgaXMgbmVjZXNzYXJ5CisgICAgICoKKyAgICAgKiBXaW5lRDNEIG9ubHkgdHJhbnNmb3JtcyBhbmQgY2xpcHMgdGhlIHZlcnRpY2VzIGJ5IG5vdywgc28gRVhURU5UUyBhbmQgTElHSFQKKyAgICAgKiBhcmUgbm90IGltcGxlbWVudGVkLiBDbGlwcGluZyBpcyBkaXNhYmxlZCBBVE0sIGJlY2F1c2Ugb2YgdW5zdXJlIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgaWYoICEoVmVydGV4T3AgJiBEM0RWT1BfVFJBTlNGT1JNKSApIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgLyogV2luZUQzRCBkb2Vzbid0IGtub3cgZDNkNyB2ZXJ0ZXggb3BlcmF0aW9uLCBpdCB1c2VzCisgICAgICogcmVuZGVyIHN0YXRlcyBpbnN0ZWFkLiBTZXQgdGhlIHJlbmRlciBzdGF0ZXMgYWNjb3JkaW5nIHRvCisgICAgICogdGhlIHZlcnRleCBvcHMKKyAgICAgKi8KKyAgICBkb0NsaXAgPSBWZXJ0ZXhPcCAmIEQzRFZPUF9DTElQID8gVFJVRSA6IEZBTFNFOworICAgIElXaW5lRDNERGV2aWNlX0dldFJlbmRlclN0YXRlKEQzRC0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUlNfQ0xJUFBJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEICopICZvbGRDbGlwKTsKKyAgICBpZihkb0NsaXAgIT0gb2xkQ2xpcCkKKyAgICB7CisgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKEQzRC0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFJTX0NMSVBQSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaXApOworICAgIH0KKworCisgICAgaHIgPSBJV2luZUQzRERldmljZV9Qcm9jZXNzVmVydGljZXMoRDNELT53aW5lRDNERGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT53aW5lRDNEVmVydGV4QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyYy0+d2luZUQzRFZlcnRleEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7CisKKyAgICAvKiBSZXN0b3JlIHRoZSBzdGF0ZXMgaWYgbmVlZGVkICovCisgICAgaWYoZG9DbGlwICE9IG9sZENsaXApCisgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKEQzRC0+d2luZUQzRERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFJTX0NMSVBQSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDbGlwKTsKKyAgICByZXR1cm4gaHI7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1Byb2Nlc3NWZXJ0aWNlcyhJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRGVzdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyICpTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UzICpEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgaWZhY2UpOworICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwgKlNyYyA9IElDT01fT0JKRUNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgU3JjQnVmZmVyKTsKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpEM0QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UzLCBEM0REZXZpY2UpOworCisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCUwOGx4LCUwOGx4LCUwOGx4LCVwLCUwOGx4LCVwLCUwOGx4KSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMsIFZlcnRleE9wLCBEZXN0SW5kZXgsIENvdW50LCBTcmMsIFNyY0luZGV4LCBEM0QsIEZsYWdzKTsKKworICAgIHJldHVybiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Byb2Nlc3NWZXJ0aWNlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4T3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDT01fSU5URVJGQUNFKFNyYywgSURpcmVjdDNEVmVydGV4QnVmZmVyNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShEM0QsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6R2V0VmVydGV4QnVmZmVyRGVzYworICoKKyAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIGEgdmVydGV4IGJ1ZmZlcgorICoKKyAqIFBhcmFtczoKKyAqICBEZXNjOiBBZGRyZXNzIHRvIHdyaXRlIHRoZSBkZXNjcmlwdGlvbiB0bworICoKKyAqIFJldHVybnMKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIERlc2MgaXMgTlVMTAorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX0dldFZlcnRleEJ1ZmZlckRlc2MoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkVSVEVYQlVGRkVSREVTQyAqRGVzYykKK3sKKyAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3LCBpZmFjZSk7CisgICAgV0lORUQzRFZFUlRFWEJVRkZFUl9ERVNDIFdEZXNjOworICAgIEhSRVNVTFQgaHI7CiAgICAgRFdPUkQgc2l6ZTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgRGVzYyk7CiAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCUwOGx4LCUwOGx4LCVwLCUwOGx4LCVwLCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGR3VmVydGV4T3AsIGR3RGVzdEluZGV4LCBkd0NvdW50LCBscFNyY0J1ZmZlciwgZHdTcmNJbmRleCwgbHBEM0REZXZpY2UsIGR3RmxhZ3MpOyAgICAKKyAgICBpZighRGVzYykgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCIgLSB2ZXJ0ZXggb3BlcmF0aW9ucyA6ICIpOyBkdW1wX0QzRFZPUChkd1ZlcnRleE9wKTsKLQlUUkFDRSgiIC0gZmxhZ3MgICAgICAgICAgICAgOiAiKTsgZHVtcF9EM0RQVihkd0ZsYWdzKTsKKyAgICBociA9IElXaW5lRDNEVmVydGV4QnVmZmVyX0dldERlc2MoVGhpcy0+d2luZUQzRFZlcnRleEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldEZXNjKTsKKyAgICBpZihociAhPSBEM0RfT0spCisgICAgeworICAgICAgICBFUlIoIiglcCkgSVdpbmVEM0RWZXJ0ZXhCdWZmZXI6OkdldERlc2MgZmFpbGVkIHdpdGggaHI9JTA4bHhcbiIsIFRoaXMsIGhyKTsKKyAgICAgICAgcmV0dXJuIGhyOwogICAgIH0KIAotICAgIGlmICgoZHdWZXJ0ZXhPcCAmIEQzRFZPUF9UUkFOU0ZPUk0pID09IDApIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIC8qIENsZWFyIHRoZSByZXR1cm4gdmFsdWUgb2YgZ2FyYmFnZSAqLworICAgIHNpemUgPSBEZXNjLT5kd1NpemU7CisgICAgbWVtc2V0KERlc2MsIDAsIHNpemUpOwogCi0gICAgc2l6ZSA9IGdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShzcmNfaW1wbC0+ZGVzYy5kd0ZWRik7Ci0gICAgY29udmVydF9GVkZfdG9fc3RyaWRlZF9kYXRhKHNyY19pbXBsLT5kZXNjLmR3RlZGLCAoKGNoYXIgKikgc3JjX2ltcGwtPnZlcnRpY2VzKSArIGR3U3JjSW5kZXggKiBzaXplLCAmc3RyaWRlZCwgMCk7CisgICAgLyogTm93IGZpbGwgdGhlIERlc2Mgc3RydWN0dXJlICovCisgICAgRGVzYy0+ZHdTaXplID0gc2l6ZTsKKyAgICBEZXNjLT5kd0NhcHMgPSBUaGlzLT5DYXBzOworICAgIERlc2MtPmR3RlZGID0gV0Rlc2MuRlZGOworICAgIERlc2MtPmR3TnVtVmVydGljZXMgPSBXRGVzYy5TaXplIC8gZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKFdEZXNjLkZWRik7CiAKLSAgICByZXR1cm4gcHJvY2Vzc192ZXJ0aWNlc19zdHJpZGVkKFRoaXMsIGR3VmVydGV4T3AsIGR3RGVzdEluZGV4LCBkd0NvdW50LCAmc3RyaWRlZCwgc3JjX2ltcGwtPmRlc2MuZHdGVkYsIGRldmljZV9pbXBsLCBkd0ZsYWdzKTsKLX0KLQotSFJFU1VMVCBXSU5BUEkKLUdMX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN19Qcm9jZXNzVmVydGljZXNTdHJpZGVkKExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGlmYWNlLAotCQkJCQkJICAgICAgRFdPUkQgZHdWZXJ0ZXhPcCwKLQkJCQkJCSAgICAgIERXT1JEIGR3RGVzdEluZGV4LAotCQkJCQkJICAgICAgRFdPUkQgZHdDb3VudCwKLQkJCQkJCSAgICAgIExQRDNERFJBV1BSSU1JVElWRVNUUklERUREQVRBIGxwU3RyaWRlRGF0YSwKLQkJCQkJCSAgICAgIERXT1JEIGR3VmVydGV4VHlwZURlc2MsCi0JCQkJCQkgICAgICBMUERJUkVDVDNEREVWSUNFNyBscEQzRERldmljZSwKLQkJCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpOwotICAgIElEaXJlY3QzRERldmljZUltcGwgKmRldmljZV9pbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgbHBEM0REZXZpY2UpOwotCi0gICAgVFJBQ0UoIiglcC8lcCktPiglMDhseCwlMDhseCwlMDhseCwlcCwlMDhseCwlcCwlMDhseClcbiIsIFRoaXMsIGlmYWNlLCBkd1ZlcnRleE9wLCBkd0Rlc3RJbmRleCwgZHdDb3VudCwgbHBTdHJpZGVEYXRhLCBkd1ZlcnRleFR5cGVEZXNjLCBscEQzRERldmljZSwgZHdGbGFncyk7Ci0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgICBUUkFDRSgiIC0gdmVydGV4IG9wZXJhdGlvbnMgOiAiKTsgZHVtcF9EM0RWT1AoZHdWZXJ0ZXhPcCk7Ci0JVFJBQ0UoIiAtIGZsYWdzICAgICAgICAgICAgIDogIik7IGR1bXBfRDNEUFYoZHdGbGFncyk7Ci0JVFJBQ0UoIiAtIHZlcnRleCBmb3JtYXQgICAgIDogIik7IGR1bXBfZmxleGlibGVfdmVydGV4KGR3VmVydGV4VHlwZURlc2MpOwotICAgIH0KLQotICAgIGlmICgoZHdWZXJ0ZXhPcCAmIEQzRFZPUF9UUkFOU0ZPUk0pID09IDApIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCi0gICAgcmV0dXJuIHByb2Nlc3NfdmVydGljZXNfc3RyaWRlZChUaGlzLCBkd1ZlcnRleE9wLCBkd0Rlc3RJbmRleCwgZHdDb3VudCwgbHBTdHJpZGVEYXRhLCBkd1ZlcnRleFR5cGVEZXNjLCBkZXZpY2VfaW1wbCwgZHdGbGFncyk7Ci19Ci0KLQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNEVmVydGV4QnVmZmVyNy5mdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikgICAgICh2b2lkKikKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgSURpcmVjdDNEVmVydGV4QnVmZmVyN1Z0YmwgVlRBQkxFX0lEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgPQotewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBNYWluX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN18xVF9RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpIE1haW5fSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF83XzFUX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKSBNYWluX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN18xVF9SZWxlYXNlLAotICAgIFhDQVNUKExvY2spIE1haW5fSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF83XzFUX0xvY2ssCi0gICAgWENBU1QoVW5sb2NrKSBNYWluX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN18xVF9VbmxvY2ssCi0gICAgWENBU1QoUHJvY2Vzc1ZlcnRpY2VzKSBHTF9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzdfMVRfUHJvY2Vzc1ZlcnRpY2VzLAotICAgIFhDQVNUKEdldFZlcnRleEJ1ZmZlckRlc2MpIE1haW5fSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF83XzFUX0dldFZlcnRleEJ1ZmZlckRlc2MsCi0gICAgWENBU1QoT3B0aW1pemUpIE1haW5fSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF83XzFUX09wdGltaXplLAotICAgIFhDQVNUKFByb2Nlc3NWZXJ0aWNlc1N0cmlkZWQpIEdMX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfN19Qcm9jZXNzVmVydGljZXNTdHJpZGVkCi19OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNEVmVydGV4QnVmZmVyLmZ1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHZvaWQqKQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJWdGJsIFZUQUJMRV9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgPQotewotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKSBUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKSBUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9SZWxlYXNlLAotICAgIFhDQVNUKExvY2spIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9Mb2NrLAotICAgIFhDQVNUKFVubG9jaykgVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1VubG9jaywKLSAgICBYQ0FTVChQcm9jZXNzVmVydGljZXMpIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9Qcm9jZXNzVmVydGljZXMsCi0gICAgWENBU1QoR2V0VmVydGV4QnVmZmVyRGVzYykgVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX0dldFZlcnRleEJ1ZmZlckRlc2MsCi0gICAgWENBU1QoT3B0aW1pemUpIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9PcHRpbWl6ZQotfTsKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSN1bmRlZiBYQ0FTVAotI2VuZGlmCi0KLUhSRVNVTFQgZDNkdmVydGV4YnVmZmVyX2NyZWF0ZShJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICoqb2JqLCBJRGlyZWN0RHJhd0ltcGwgKmQzZCwgTFBEM0RWRVJURVhCVUZGRVJERVNDIGxwRDNEVmVydEJ1ZkRlc2MsIERXT1JEIGR3RmxhZ3MpCi17Ci0gICAgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCAqb2JqZWN0OwotICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9IHsKLSAgICAgICAgRkUoRDNEVkJDQVBTX0RPTk9UQ0xJUCksCi0gICAgICAgIEZFKEQzRFZCQ0FQU19PUFRJTUlaRUQpLAotCUZFKEQzRFZCQ0FQU19TWVNURU1NRU1PUlkpLAotCUZFKEQzRFZCQ0FQU19XUklURU9OTFkpCi0gICAgfTsKLQotICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoSURpcmVjdDNEVmVydGV4QnVmZmVyR0xJbXBsKSk7Ci0gICAgaWYgKG9iamVjdCA9PSBOVUxMKSByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7Ci0KLSAgICBvYmplY3QtPnJlZiA9IDE7Ci0gICAgb2JqZWN0LT5kM2QgPSBkM2Q7Ci0gICAgb2JqZWN0LT5kZXNjID0gKmxwRDNEVmVydEJ1ZkRlc2M7Ci0gICAgb2JqZWN0LT52ZXJ0ZXhfYnVmZmVyX3NpemUgPSBnZXRfZmxleGlibGVfdmVydGV4X3NpemUobHBEM0RWZXJ0QnVmRGVzYy0+ZHdGVkYpICogbHBEM0RWZXJ0QnVmRGVzYy0+ZHdOdW1WZXJ0aWNlczsKLSAgICBvYmplY3QtPnZlcnRpY2VzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIG9iamVjdC0+dmVydGV4X2J1ZmZlcl9zaXplKTsKLSAgICAKLSAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCAgVlRBQkxFX0lEaXJlY3QzRFZlcnRleEJ1ZmZlcik7Ci0gICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIFZUQUJMRV9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KTsKLQotICAgICpvYmogPSBvYmplY3Q7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICAgIFRSQUNFKCIgY3JlYXRpbmcgaW1wbGVtZW50YXRpb24gYXQgJXAgd2l0aCBkZXNjcmlwdGlvbiA6XG4iLCAqb2JqKTsKLQlUUkFDRSgiICBmbGFncyAgICAgICAgOiAiKTsgRERSQVdfZHVtcF9mbGFnc18obHBEM0RWZXJ0QnVmRGVzYy0+ZHdDYXBzLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pLCBUUlVFKTsKLQlUUkFDRSgiICB2ZXJ0ZXggdHlwZSAgOiAiKTsgZHVtcF9mbGV4aWJsZV92ZXJ0ZXgobHBEM0RWZXJ0QnVmRGVzYy0+ZHdGVkYpOwotCVRSQUNFKCIgIG51bSB2ZXJ0aWNlcyA6ICVsZFxuIiwgbHBEM0RWZXJ0QnVmRGVzYy0+ZHdOdW1WZXJ0aWNlcyk7Ci0gICAgfQotICAgIAotICAgIAogICAgIHJldHVybiBEM0RfT0s7CiB9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX0dldFZlcnRleEJ1ZmZlckRlc2MoSURpcmVjdDNEVmVydGV4QnVmZmVyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWEJVRkZFUkRFU0MgKkRlc2MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CisgICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3IGludGVyZmFjZS5cbiIsIFRoaXMsIERlc2MpOworCisgICAgcmV0dXJuIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfR2V0VmVydGV4QnVmZmVyRGVzYyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmVydGV4QnVmZmVyNzo6T3B0aW1pemUKKyAqCisgKiBDb252ZXJ0cyBhbiB1bm9wdGltaXplZCB2ZXJ0ZXggYnVmZmVyIGludG8gYW4gb3B0aW1pemVkIGJ1ZmZlcgorICoKKyAqIFBhcmFtczoKKyAqICBEM0REZXZpY2U6IERldmljZSBmb3Igd2hpY2ggdGhpcyBidWZmZXIgaXMgb3B0aW1pemVkCisgKiAgRmxhZ3M6IE5vdCB1c2VkLCBzaG91bGQgYmUgc2V0IHRvIDAKKyAqCisgKiBSZXR1cm5zCisgKiAgRDNEX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX09wdGltaXplKElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2U3ICpEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQoreworICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIGlmYWNlKTsKKyAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpEM0QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2U3LCBEM0REZXZpY2UpOworICAgIEZJWE1FKCIoJXApLT4oJXAsJTA4bHgpOiBzdHViIVxuIiwgVGhpcywgRDNELCBGbGFncyk7CisKKyAgICAvKiBXZSBjb3VsZCBmb3J3YXJkIHRoaXMgY2FsbCB0byBXaW5lRDNEIGFuZCB0YWtlIGFkdmFudGFnZQorICAgICAqIG9mIGl0IG9uY2Ugd2UgdXNlIE9wZW5HTCB2ZXJ0ZXggYnVmZmVycworICAgICAqLworICAgIFRoaXMtPkNhcHMgfD0gRDNEVkJDQVBTX09QVElNSVpFRDsKKworICAgIHJldHVybiBERF9PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfT3B0aW1pemUoSURpcmVjdDNEVmVydGV4QnVmZmVyICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2UzICpEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyLCBpZmFjZSk7CisgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqRDNEID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgRDNERGV2aWNlKTsKKyAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNELCBGbGFncyk7CisKKyAgICByZXR1cm4gSURpcmVjdDNEVmVydGV4QnVmZmVyN19PcHRpbWl6ZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX0lOVEVSRkFDRShEM0QsIElEaXJlY3QzRERldmljZTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3OjpQcm9jZXNzVmVydGljZXNTdHJpZGVkCisgKgorICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIHVudHJhbnNmb3JtZWQgc3RyaWRlZCB2ZXJ0aWNlcyBpbnRvIGEgcHJvY2Vzc2VkCisgKiBvciBvcHRpbWl6ZWQgdmVydGV4IGJ1ZmZlci4KKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBwYXJhbWV0ZXJzLCBzZWUKKyAqIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjc6OlByb2Nlc3NWZXJ0aWNlcworICoKKyAqIFBhcmFtczoKKyAqICBWZXJ0ZXhPcDogT3BlcmF0aW9ucyB0byBwZXJmb3JtCisgKiAgRGVzdEluZGV4OiBEZXN0aW5hdGlvbiBpbmRleCB0byB3cml0ZSB0aGUgdmVydGljZXMgdG8KKyAqICBDb3VudDogTnVtYmVyIG9mIGlucHV0IHZlcnRpY2VzCisgKiAgU3RyaWRlRGF0YTogQXJyYXkgY29udGFpbmluZyB0aGUgaW5wdXQgdmVydGljZXMKKyAqICBWZXJ0ZXhUeXBlRGVzYzogVmVydGV4IERlc2NyaXB0aW9uIG9yIHNvdXJjZSBpbmRleD8/Pz8/Pz8/PworICogIEQzRERldmljZTogSURpcmVjdDNERGV2aWNlNyB0byB1c2UgZm9yIHByb2Nlc3NpbmcKKyAqICBGbGFnczogQ2FuIGJlIEQzRFBWX0RPTk9UQ09QWURBVEEgdG8gYXZvaWQgY29weWluZyB1bm1vZGlmaWVkIHZlcnRpY2VzCisgKgorICogUmV0dXJucworICogIEQzRF9PSyBvbiBzdWNjZXNzLCBvciBEREVSUl8qCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1Byb2Nlc3NWZXJ0aWNlc1N0cmlkZWQoSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgVmVydGV4T3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRGVzdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERSQVdQUklNSVRJVkVTVFJJREVEREFUQSAqU3RyaWRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBWZXJ0ZXhUeXBlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2U3ICpEM0REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCit7CisgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgaWZhY2UpOworICAgIElEaXJlY3QzRERldmljZUltcGwgKkQzRCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTcsIEQzRERldmljZSk7CisgICAgRklYTUUoIiglcCktPiglMDhseCwlMDhseCwlMDhseCwlcCwlMDhseCwlcCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBWZXJ0ZXhPcCwgRGVzdEluZGV4LCBDb3VudCwgU3RyaWRlRGF0YSwgVmVydGV4VHlwZURlc2MsIEQzRCwgRmxhZ3MpOworICAgIHJldHVybiBERF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgVlRhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3VnRibCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Z0YmwgPQoreworICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIgTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF9Mb2NrLAorICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfVW5sb2NrLAorICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfUHJvY2Vzc1ZlcnRpY2VzLAorICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfR2V0VmVydGV4QnVmZmVyRGVzYywKKyAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX09wdGltaXplLAorICAgIC8qKiogSURpcmVjdDNEVmVydGV4QnVmZmVyNyBNZXRob2RzICoqKi8KKyAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsX1Byb2Nlc3NWZXJ0aWNlc1N0cmlkZWQKK307CisKK2NvbnN0IElEaXJlY3QzRFZlcnRleEJ1ZmZlclZ0YmwgSURpcmVjdDNEVmVydGV4QnVmZmVyMV9WdGJsID0KK3sKKyAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLworICAgIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9RdWVyeUludGVyZmFjZSwKKyAgICBUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfQWRkUmVmLAorICAgIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9SZWxlYXNlLAorICAgIC8qKiogSURpcmVjdDNEVmVydGV4QnVmZmVyIE1ldGhvZHMgKioqLworICAgIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9Mb2NrLAorICAgIFRodW5rX0lEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGxfMV9VbmxvY2ssCisgICAgVGh1bmtfSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbF8xX1Byb2Nlc3NWZXJ0aWNlcywKKyAgICBUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfR2V0VmVydGV4QnVmZmVyRGVzYywKKyAgICBUaHVua19JRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsXzFfT3B0aW1pemUKK307CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3ZpZXdwb3J0LmMgYi9kbGxzL2RkcmF3L3ZpZXdwb3J0LmMKaW5kZXggNGI4M2Y1OS4uYWIwNmVjZSAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy92aWV3cG9ydC5jCisrKyBiL2RsbHMvZGRyYXcvdmlld3BvcnQuYwpAQCAtMSw1ICsxLDYgQEAKIC8qIERpcmVjdDNEIFZpZXdwb3J0CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVMTUVSCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIETWU0lOR0VSCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QzRFZpZXdwb3J0Mi4KICAqCkBAIC0xOSwyNiArMjAsNDMgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAid2luZS9wb3J0LmgiCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KIAorI2RlZmluZSBDT0JKTUFDUk9TCiAjZGVmaW5lIE5PTkFNRUxFU1NVTklPTgotI2RlZmluZSBOT05BTUVMRVNTU1RSVUNUCiAKICNpbmNsdWRlICJ3aW5kZWYuaCIKICNpbmNsdWRlICJ3aW5iYXNlLmgiCisjaW5jbHVkZSAid2lubmxzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJvYmpiYXNlLmgiCiAjaW5jbHVkZSAid2luZ2RpLmgiCisjaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJleGNwdC5oIgorCiAjaW5jbHVkZSAiZGRyYXcuaCIKICNpbmNsdWRlICJkM2QuaCIKKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKICNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiAKLSNpbmNsdWRlICJkM2RfcHJpdmF0ZS5oIgorV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CiAKLVdJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVscGVyIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBhY3RpdmF0ZShJRGlyZWN0M0RWaWV3cG9ydEltcGwqIFRoaXMpIHsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdmlld3BvcnRfYWN0aXZhdGUKKyAqCisgKiBhY3RpdmF0ZXMgdGhlIHZpZXdwb3J0IHVzaW5nIElEaXJlY3QzRERldmljZTc6OlNldFZpZXdwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB2aWV3cG9ydF9hY3RpdmF0ZShJRGlyZWN0M0RWaWV3cG9ydEltcGwqIFRoaXMpIHsKICAgICBJRGlyZWN0M0RMaWdodEltcGwqIGxpZ2h0OwogICAgIEQzRFZJRVdQT1JUNyB2cDsKICAgICAKQEAgLTcxLDcgKzg5LDEyIEBACiAgICAgSURpcmVjdDNERGV2aWNlN19TZXRWaWV3cG9ydChJQ09NX0lOVEVSRkFDRShUaGlzLT5hY3RpdmVfZGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwgJnZwKTsKIH0KIAotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF9kdW1wX0QzRFZJRVdQT1JULCBfZHVtcF9EM0RWSUVXUE9SVDIKKyAqCisgKiBXcml0ZXMgdmlld3BvcnQgaW5mb3JtYXRpb24gdG8gVFJBQ0UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBfZHVtcF9EM0RWSUVXUE9SVChEM0RWSUVXUE9SVCAqbHB2cCkKIHsKICAgICBUUkFDRSgiICAgIC0gZHdTaXplID0gJWxkICAgZHdYID0gJWxkICAgZHdZID0gJWxkXG4iLApAQCAtMTAwLDEzICsxMjMsMzMgQEAKIAkgIGxwdnAtPmR2TWluWiwgbHB2cC0+ZHZNYXhaKTsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RWSUVXUE9SVDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJVW5rbm93biBNZXRob2RzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6UXVlcnlJbnRlcmZhY2UKKyAqCisgKiBBIG5vcm1hbCBRdWVyeUludGVyZmFjZS4gQ2FuIHF1ZXJ5IGFsbCBpbnRlcmZhY2UgdmVyc2lvbnMgYW5kIHRoZQorICogSVVua25vd24gaW50ZXJmYWNlLiBUaGUgVlRhYmxlcyBvZiB0aGUgZGlmZmVyZW50IHZlcnNpb25zCisgKiBhcmUgZXF1YWwKKyAqCisgKiBQYXJhbXM6CisgKiAgcmVmaWlkOiBJbnRlcmZhY2UgaWQgcXVlcmllZCBmb3IKKyAqICBvYmo6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGludGVyZmFjZSBwb2ludGVyIHRvCisgKgorICogUmV0dXJuczoKKyAqICBTX09LIG9uIHN1Y2Nlc3MuCisgKiAgRV9OT0lOVEVSRkFDRSBpZiB0aGUgcmVxdWVzdGVkIGludGVyZmFjZSB3YXNuJ3QgZm91bmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYnApCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVzLCVwKVxuIiwgVGhpcywgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CisgICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CiAKICAgICAqb2JwID0gTlVMTDsKIApAQCAtMTIwLDI3ICsxNjMsNDUgQEAKIAlyZXR1cm4gU19PSzsKICAgICB9CiAgICAgRklYTUUoIiglcCk6IGludGVyZmFjZSBmb3IgSUlEICVzIE5PVCBmb3VuZCFcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCkpOwotICAgIHJldHVybiBPTEVfRV9FTlVNX05PTU9SRTsKKyAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKIH0KIAotVUxPTkcgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9BZGRSZWYoTFBESVJFQ1QzRFZJRVdQT1JUMyBpZmFjZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpBZGRSZWYKKyAqCisgKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50LgorICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG5ldyByZWZjb3VudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRSZWYoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwogCi0gICAgVFJBQ0UoIiglcC8lcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIGlmYWNlLCByZWYgLSAxKTsKKyAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmIC0gMSk7CiAKICAgICByZXR1cm4gcmVmOwogfQogCi1VTE9ORyBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX1JlbGVhc2UoTFBESVJFQ1QzRFZJRVdQT1JUMyBpZmFjZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpSZWxlYXNlCisgKgorICogUmVkdWNlcyB0aGUgcmVmY291bnQuIElmIGl0IGZhbGxzIHRvIDAsIHRoZSBpbnRlcmZhY2UgaXMgcmVsZWFzZWQKKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSBuZXcgcmVmY291bnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfUmVsZWFzZShJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CiAKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgaWZhY2UsIHJlZiArIDEpOworICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCByZWYgKyAxKTsKIAogICAgIGlmICghcmVmKSB7CiAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwpAQCAtMTQ5LDE5ICsyMTAsNDYgQEAKICAgICByZXR1cm4gcmVmOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZpZXdwb3J0IE1ldGhvZHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9Jbml0aWFsaXplKExQRElSRUNUM0RWSUVXUE9SVDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0QgbHBEaXJlY3QzRCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpJbml0aWFsaXplCisgKgorICogTm8tb3AgaW5pdGlhbGl6YXRpb24uCisgKgorICogUGFyYW1zOgorICogIERpcmVjdDNEOiBUaGUgZGlyZWN0M0QgZGV2aWNlIHRoaXMgdmlld3BvcnQgaXMgYXNzaWduZWQgdG8KKyAqCisgKiBSZXR1cm5zOgorICogIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVmlld3BvcnRJbXBsX0luaXRpYWxpemUoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqRGlyZWN0M0QpCiB7Ci0gICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKSBuby1vcC4uLlxuIiwgVGhpcywgaWZhY2UsIGxwRGlyZWN0M0QpOwotICAgIHJldHVybiBERF9PSzsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKSBuby1vcC4uLlxuIiwgaWZhY2UsIERpcmVjdDNEKTsKKyAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfR2V0Vmlld3BvcnQoTFBESVJFQ1QzRFZJRVdQT1JUMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVklFV1BPUlQgbHBEYXRhKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldFZpZXdwb3J0CisgKgorICogUmV0dXJucyB0aGUgdmlld3BvcnQgZGF0YSBhc3NpZ25lZCB0byB0aGlzIHZpZXdwb3J0IGludGVyZmFjZQorICoKKyAqIFBhcmFtczoKKyAqICBEYXRhOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBkYXRhCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgRGF0YSBpcyBOVUxMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0Vmlld3BvcnQoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWSUVXUE9SVCAqbHBEYXRhKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICAgRFdPUkQgZHdTaXplOwpAQCAtMTc0LDcgKzI2Miw3IEBACiAgICAgbWVtc2V0KGxwRGF0YSwgMCwgZHdTaXplKTsKICAgICBtZW1jcHkobHBEYXRhLCAmKFRoaXMtPnZpZXdwb3J0cy52cDEpLCBkd1NpemUpOwogCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgeworICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgICBUUkFDRSgiICByZXR1cm5pbmcgRDNEVklFV1BPUlQgOlxuIik7CiAJX2R1bXBfRDNEVklFV1BPUlQobHBEYXRhKTsKICAgICB9CkBAIC0xODIsMTUgKzI3MCwyOCBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWaWV3cG9ydDM6OlNldFZpZXdwb3J0CisgKgorICogU2V0cyB0aGUgdmlld3BvcnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlCisgKgorICogUGFyYW1zOgorICogIGxwRGF0YTogVmlld3BvcnQgdG8gc2V0CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEYXRhIGlzIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfU2V0Vmlld3BvcnQoTFBESVJFQ1QzRFZJRVdQT1JUMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVklFV1BPUlQgbHBEYXRhKQorSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldFZpZXdwb3J0KElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQgKmxwRGF0YSkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgIExQRElSRUNUM0RWSUVXUE9SVDMgY3VycmVudF92aWV3cG9ydDsKICAgICBUUkFDRSgiKCVwLyVwKS0+KCVwKVxuIiwgVGhpcywgaWZhY2UsIGxwRGF0YSk7CiAKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CisgICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgIFRSQUNFKCIgIGdldHRpbmcgRDNEVklFV1BPUlQgOlxuIik7CiAJX2R1bXBfRDNEVklFV1BPUlQobHBEYXRhKTsKICAgICB9CkBAIC0yMTUsMzYgKzMxNiw3NSBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX1RyYW5zZm9ybVZlcnRpY2VzKExQRElSRUNUM0RWSUVXUE9SVDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1ZlcnRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RUUkFOU0ZPUk1EQVRBIGxwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwT2ZmU2NyZWVuKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWaWV3cG9ydDM6OlRyYW5zZm9ybVZlcnRpY2VzCisgKgorICogVHJhbnNmb3JtcyB2ZXJ0aWNlcyBieSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICoKKyAqIFBhcmFtczoKKyAqICBkd1ZlcnRleENvdW50OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIHRvIGJlIHRyYW5zZm9ybWVkCisgKiAgbHBEYXRhOiBQb2ludGVyIHRvIHRoZSB2ZXJ0ZXggZGF0YQorICogIGR3RmxhZ3M6IEQzRFRSQU5TRk9STV9DTElQUEVEIG9yIEQzRFRSQU5TRk9STV9VTkNMSVBQRUQKKyAqICBscE9mZlNjcmVlbjogSXMgc2V0IHRvIG5vbnplcm8gaWYgYWxsIHZlcnRpY2VzIGFyZSBvZmYtc2NyZWVuCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVmlld3BvcnRJbXBsX1RyYW5zZm9ybVZlcnRpY2VzKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdWZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1EQVRBICpscERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqbHBPZmZTY3JlZW4pCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCUwOGx4LCVwLCUwOGx4LCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBkd1ZlcnRleENvdW50LCBscERhdGEsIGR3RmxhZ3MsIGxwT2ZmU2NyZWVuKTsKKyAgICBGSVhNRSgiKCVwKS0+KCUwOGx4LCVwLCUwOGx4LCVwKTogc3R1YiFcbiIsIFRoaXMsIGR3VmVydGV4Q291bnQsIGxwRGF0YSwgZHdGbGFncywgbHBPZmZTY3JlZW4pOwogICAgIGlmIChscE9mZlNjcmVlbikKIAkqbHBPZmZTY3JlZW4gPSAwOwogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX0xpZ2h0RWxlbWVudHMoTFBESVJFQ1QzRFZJRVdQT1JUMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdFbGVtZW50Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETElHSFREQVRBIGxwRGF0YSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpMaWdodEVsZW1lbnRzCisgKgorICogVGhlIERpcmVjdFggNS4wIHNkayBzYXlzIHRoYXQgaXQncyBub3QgaW1wbGVtZW50ZWQKKyAqCisgKiBQYXJhbXM6CisgKiAgPworICoKKyAqIFJldHVybnM6CisgKiAgRERFUlJfVU5TVVBQT1JURUQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9MaWdodEVsZW1lbnRzKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0VsZW1lbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETElHSFREQVRBIGxwRGF0YSkKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwotICAgIEZJWE1FKCIoJXAvJXApLT4oJTA4bHgsJXApOiBzdHViIVxuIiwgVGhpcywgaWZhY2UsIGR3RWxlbWVudENvdW50LCBscERhdGEpOwotICAgIHJldHVybiBERF9PSzsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwKTogVW5pbXBsZW1lbnRlZCFcbiIsIFRoaXMsIGR3RWxlbWVudENvdW50LCBscERhdGEpOworICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX1NldEJhY2tncm91bmQoTFBESVJFQ1QzRFZJRVdQT1JUMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUxIQU5ETEUgaE1hdCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpTZXRCYWNrZ3JvdW5kCisgKgorICogU2V0cyB0amUgYmFja2dyb3VuZCBtYXRlcmlhbAorICoKKyAqIFBhcmFtczoKKyAqICBoTWF0OiBIYW5kbGUgZnJvbSBhIElEaXJlY3QzRE1hdGVyaWFsIGludGVyZmFjZQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRCYWNrZ3JvdW5kKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRFUklBTEhBTkRMRSBoTWF0KQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglMDhseClcbiIsIFRoaXMsIGlmYWNlLCAoRFdPUkQpIGhNYXQpOworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgpXG4iLCBUaGlzLCAoRFdPUkQpIGhNYXQpOwogICAgIAogICAgIFRoaXMtPmJhY2tncm91bmQgPSAoSURpcmVjdDNETWF0ZXJpYWxJbXBsICopIGhNYXQ7CiAgICAgVFJBQ0UoIiBzZXR0aW5nIGJhY2tncm91bmQgY29sb3IgOiAlZiAlZiAlZiAlZlxuIiwKQEAgLTI1Myw0MyArMzkzLDEwMCBAQAogCSAgVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51My5iLAogCSAgVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51NC5hKTsKIAotICAgIHJldHVybiBERF9PSzsKKyAgICByZXR1cm4gRDNEX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfR2V0QmFja2dyb3VuZChMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMSEFORExFIGxwaE1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBCT09MIGxwVmFsaWQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6R2V0QmFja2dyb3VuZAorICoKKyAqIFJldHVybnMgdGhlIG1hdGVyaWFsIGhhbmRsZSBhc3NpZ25lZCB0byB0aGUgYmFja2dyb3VuZCBvZiB0aGUgdmlld3BvcnQKKyAqCisgKiBQYXJhbXM6CisgKiAgbHBoTWF0OiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBoYW5kbGUKKyAqICBscFZhbGlkOiBpcyBzZXQgdG8gRkFMU0UgaWYgbm8gYmFja2dyb3VuZCBpcyBzZXQsIFRSVUUgaWYgb25lIGlzIHNldAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCisgKiAgKERERVJSX0lOVkFMSURQQVJBTVMgaWYgTWF0IG9yIFZhbGlkIGlzIE5VTEwpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0QmFja2dyb3VuZChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUxIQU5ETEUgKmxwaE1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKmxwVmFsaWQpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwLCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscGhNYXQsIGxwVmFsaWQpOwotICAgIHJldHVybiBERF9PSzsKKyAgICBGSVhNRSgiKCVwKS0+KCVwLCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwaE1hdCwgbHBWYWxpZCk7CisgICAgcmV0dXJuIEQzRF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX1NldEJhY2tncm91bmREZXB0aChMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UgbHBERFN1cmZhY2UpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6U2V0QmFja2dyb3VuZERlcHRoCisgKgorICogU2V0cyBhIHN1cmZhY2UgdGhhdCByZXByZXNlbnRzIHRoZSBiYWNrZ3JvdW5kIGRlcHRoLiBJdCdzIGNvbnRlbnRzIGFyZQorICogdXNlZCB0byBzZXQgdGhlIGRlcHRoIGJ1ZmZlciBpbiBJRGlyZWN0M0RWaWV3cG9ydDM6OkNsZWFyCisgKgorICogUGFyYW1zOgorICogIGxwRERTdXJmYWNlOiBTdXJmYWNlIHRvIHNldAorICoKKyAqIFJldHVybnM6IEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgc3R1YgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldEJhY2tncm91bmREZXB0aChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2UgKmxwRERTdXJmYWNlKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBERFN1cmZhY2UpOwotICAgIHJldHVybiBERF9PSzsKKyAgICBGSVhNRSgiKCVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwRERTdXJmYWNlKTsKKyAgICByZXR1cm4gRDNEX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfR2V0QmFja2dyb3VuZERlcHRoKExQRElSRUNUM0RWSUVXUE9SVDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSogbHBscEREU3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEJPT0wgbHBWYWxpZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpHZXRCYWNrZ3JvdW5kRGVwdGgKKyAqCisgKiBSZXR1cm5zIHRoZSBzdXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZGVwdGggZmllbGQKKyAqCisgKiBQYXJhbXM6CisgKiAgbHBscEREU3VyZmFjZTogQWRkcmVzcyB0byBzdG9yZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIKKyAqICBscFZhbGlkOiBTZXQgdG8gVFJVRSBpZiBhIGRlcHRoIGlzIGFzaWduZWQsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCisgKiAgKERERVJSX0lOVkFMSURQQVJBTVMgaWYgRERTdXJmYWNlIG9mIFZhbGlkIGlzIE5VTEwpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0QmFja2dyb3VuZERlcHRoKElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqKmxwbHBERFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQk9PTCBscFZhbGlkKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7Ci0gICAgRklYTUUoIiglcC8lcCktPiglcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBscEREU3VyZmFjZSwgbHBWYWxpZCk7CisgICAgRklYTUUoIiglcCktPiglcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBscGxwRERTdXJmYWNlLCBscFZhbGlkKTsKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9DbGVhcihMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEUkVDVCBscFJlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpDbGVhcgorICoKKyAqIENsZWFycyB0aGUgcmVuZGVyIHRhcmdldCBhbmQgLyBvciB0aGUgeiBidWZmZXIKKyAqCisgKiBQYXJhbXM6CisgKiAgZHdDb3VudDogVGhlIGFtb3VudCBvZiByZWN0YW5nbGVzIHRvIGNsZWFyLiBJZiAwLCB0aGUgd2hvbGUgYnVmZmVyIGlzCisgKiAgICAgICAgICAgY2xlYXJlZAorICogIGxwUmVjdHM6IFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHJlY3RhbmdsZXMuIElmIE5VTEwsIENvdW50IG11c3QgYmUgMAorICogIGR3RmxhZ3M6IEQzRENMRUFSX1pCVUZGRVIgYW5kIC8gb3IgRDNEQ0xFQVJfVEFSR0VUCisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0sgb24gc3VjY2VzcworICogIEQzREVSUl9WSUVXUE9SVEhBU05PREVWSUNFIGlmIHRoZXJlJ3Mgbm8gYWN0aXZlIGRldmljZQorICogIFRoZSByZXR1cm4gdmFsdWUgb2YgSURpcmVjdDNERGV2aWNlNzo6Q2xlYXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9DbGVhcihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3Q291bnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFJFQ1QgKmxwUmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncykKIHsKICAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RWaWV3cG9ydEltcGwsIElEaXJlY3QzRFZpZXdwb3J0MywgaWZhY2UpOwogICAgIERXT1JEIGNvbG9yID0gMHgwMDAwMDAwMDsKQEAgLTMxMCwyMSArNTA3LDQwIEBACiAJICAgICAgKChpbnQpICgoVGhpcy0+YmFja2dyb3VuZC0+bWF0LnUuZGlmZnVzZS51NC5hKSAqIDI1NSkgPDwgMjQpOwogCX0KICAgICB9Ci0gICAgcmV0dXJuIFRoaXMtPmFjdGl2ZV9kZXZpY2UtPmNsZWFyKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIGR3Q291bnQsIGxwUmVjdHMsIAotCQkJCSAgICAgIGR3RmxhZ3MgJiAoRDNEQ0xFQVJfWkJVRkZFUiB8IEQzRENMRUFSX1RBUkdFVCksCi0JCQkJICAgICAgY29sb3IsIDEuMCwgMHgwMDAwMDAwMCk7CisKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19DbGVhcihJQ09NX0lOVEVSRkFDRShUaGlzLT5hY3RpdmVfZGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwUmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyAmIChEM0RDTEVBUl9aQlVGRkVSIHwgRDNEQ0xFQVJfVEFSR0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCk7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9BZGRMaWdodChMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRExJR0hUIGxwRGlyZWN0M0RMaWdodCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpBZGRMaWdodAorICoKKyAqIEFkZHMgYW4gbGlnaHQgdG8gdGhlIHZpZXdwb3J0CisgKgorICogUGFyYW1zOgorICogIGxwRGlyZWN0M0RMaWdodDogSW50ZXJmYWNlIG9mIHRoZSBsaWdodCB0byBhZGQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEaXJlY3QzRExpZ2h0IGlzIE5VTEwKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZXJlIGFyZSA4IGxpZ2h0cyBvciBtb3JlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfQWRkTGlnaHQoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RMaWdodCAqbHBEaXJlY3QzRExpZ2h0KQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICAgSURpcmVjdDNETGlnaHRJbXBsICpscERpcmVjdDNETGlnaHRJbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNETGlnaHRJbXBsLCBJRGlyZWN0M0RMaWdodCwgbHBEaXJlY3QzRExpZ2h0KTsKICAgICBEV09SRCBpID0gMDsKICAgICBEV09SRCBtYXAgPSBUaGlzLT5tYXBfbGlnaHRzOwogICAgIAotICAgIFRSQUNFKCIoJXAvJXApLT4oJXApXG4iLCBUaGlzLCBpZmFjZSwgbHBEaXJlY3QzRExpZ2h0KTsKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBEaXJlY3QzRExpZ2h0KTsKICAgICAKICAgICBpZiAoVGhpcy0+bnVtX2xpZ2h0cyA+PSA4KQogICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKQEAgLTM1MCwxOCArNTY2LDMxIEBACiAgICAgICAgIGxwRGlyZWN0M0RMaWdodEltcGwtPmFjdGl2YXRlKGxwRGlyZWN0M0RMaWdodEltcGwpOwogICAgIH0KICAgICAKLSAgICByZXR1cm4gRERfT0s7CisgICAgcmV0dXJuIEQzRF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX0RlbGV0ZUxpZ2h0KExQRElSRUNUM0RWSUVXUE9SVDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVDNETElHSFQgbHBEaXJlY3QzRExpZ2h0KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWaWV3cG9ydDM6OkRlbGV0ZUxpZ2h0CisgKgorICogRGVsZXRlcyBhIGxpZ2h0IGZyb20gdGhlIHZpZXdwb3J0cycgbGlnaHQgbGlzdAorICoKKyAqIFBhcmFtczoKKyAqICBscERpcmVjdDNETGlnaHQ6IExpZ2h0IHRvIGRlbGV0ZQorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIHRoZSBsaWdodCB3YXNuJ3QgZm91bmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9EZWxldGVMaWdodChJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICpscERpcmVjdDNETGlnaHQpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgICBJRGlyZWN0M0RMaWdodEltcGwgKmxwRGlyZWN0M0RMaWdodEltcGwgPSBJQ09NX09CSkVDVChJRGlyZWN0M0RMaWdodEltcGwsIElEaXJlY3QzRExpZ2h0LCBscERpcmVjdDNETGlnaHQpOwogICAgIElEaXJlY3QzRExpZ2h0SW1wbCAqY3VyX2xpZ2h0LCAqcHJldl9saWdodCA9IE5VTEw7CiAgICAgCi0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERpcmVjdDNETGlnaHQpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscERpcmVjdDNETGlnaHQpOwogICAgIGN1cl9saWdodCA9IFRoaXMtPmxpZ2h0czsKICAgICB3aGlsZSAoY3VyX2xpZ2h0ICE9IE5VTEwpIHsKICAgICAgICAgaWYgKGN1cl9saWdodCA9PSBscERpcmVjdDNETGlnaHRJbXBsKSB7CkBAIC0zNzIsNyArNjAxLDcgQEAKIAkgICAgY3VyX2xpZ2h0LT5hY3RpdmVfdmlld3BvcnQgPSBOVUxMOwogCSAgICBUaGlzLT5udW1fbGlnaHRzLS07CiAJICAgIFRoaXMtPm1hcF9saWdodHMgJj0gfigxPDxscERpcmVjdDNETGlnaHRJbXBsLT5kd0xpZ2h0SW5kZXgpOwotCSAgICByZXR1cm4gRERfT0s7CisJICAgIHJldHVybiBEM0RfT0s7CiAJfQogCXByZXZfbGlnaHQgPSBjdXJfbGlnaHQ7CiAJY3VyX2xpZ2h0ID0gY3VyX2xpZ2h0LT5uZXh0OwpAQCAtMzgwLDI0ICs2MDksNTcgQEAKICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX05leHRMaWdodChMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNUM0RMSUdIVCBscERpcmVjdDNETGlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRExJR0hUKiBscGxwRGlyZWN0M0RMaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZsYWdzKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWaWV3cG9ydDo6TmV4dExpZ2h0CisgKgorICogRW51bWVyYXRlcyB0aGUgbGlnaHRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlld3BvcnQKKyAqCisgKiBQYXJhbXM6CisgKiAgbHBEaXJlY3QzRExpZ2h0OiBMaWdodCB0byBzdGFydCB3aXRoCisgKiAgbHBscERpcmVjdDNETGlnaHQ6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIHN1Y2Nlc3NvciB0bworICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LLCBiZWNhdXNlIGl0J3MgYSBzdHViCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfTmV4dExpZ2h0KElEaXJlY3QzRFZpZXdwb3J0MyAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICpscERpcmVjdDNETGlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqbHBscERpcmVjdDNETGlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwLCVwLCUwOGx4KTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscERpcmVjdDNETGlnaHQsIGxwbHBEaXJlY3QzRExpZ2h0LCBkd0ZsYWdzKTsKLSAgICByZXR1cm4gRERfT0s7CisgICAgRklYTUUoIiglcCktPiglcCwlcCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBscERpcmVjdDNETGlnaHQsIGxwbHBEaXJlY3QzRExpZ2h0LCBkd0ZsYWdzKTsKKyAgICByZXR1cm4gRDNEX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSQotTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yX0dldFZpZXdwb3J0MihMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFZJRVdQT1JUMiBscERhdGEpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZpZXdwb3J0MiBNZXRob2RzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6R2V0Vmlld3BvcnQyCisgKgorICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNldCB2aWV3cG9ydCBpbiBhIEQzRFZJRVdQT1JUMiBzdHJ1Y3R1cmUuCisgKiBTaW1taWxhciB0byBJRGlyZWN0M0RWaWV3cG9ydDM6OkdldFZpZXdwb3J0CisgKgorICogUGFyYW1zOgorICogIGxwRGF0YTogUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHRvIGZpbGwKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBvbiBzdWNjZXNzCisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiB0aGUgdmlld3BvcnQgd2FzIHNldCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDM6OlNldFZpZXdwb3J0CisgKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEYXRhIGlzIE5VTEwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRWaWV3cG9ydDIoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQyICpscERhdGEpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgICBEV09SRCBkd1NpemU7Ci0gICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERhdGEpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscERhdGEpOwogICAgIGlmIChUaGlzLT51c2VfdnAyICE9IDEpIHsKICAgICAgICAgRVJSKCIgIFJlcXVlc3RpbmcgdG8gZ2V0IGEgRDNEVklFV1BPUlQyIHN0cnVjdCB3aGVyZSBhIEQzRFZJRVdQT1JUIHdhcyBzZXQgIVxuIik7CiAJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CkBAIC00MDYsMjMgKzY2OCwzNSBAQAogICAgIG1lbXNldChscERhdGEsIDAsIGR3U2l6ZSk7CiAgICAgbWVtY3B5KGxwRGF0YSwgJihUaGlzLT52aWV3cG9ydHMudnAyKSwgZHdTaXplKTsKIAotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKKyAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKICAgICAgICAgVFJBQ0UoIiAgcmV0dXJuaW5nIEQzRFZJRVdQT1JUMiA6XG4iKTsKIAlfZHVtcF9EM0RWSUVXUE9SVDIobHBEYXRhKTsKICAgICB9CiAgICAgCi0gICAgcmV0dXJuIEREX09LOworICAgIHJldHVybiBEM0RfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfU2V0Vmlld3BvcnQyKExQRElSRUNUM0RWSUVXUE9SVDMgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEVklFV1BPUlQyIGxwRGF0YSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpTZXRWaWV3cG9ydDIKKyAqCisgKiBTZXRzIHRoZSB2aWV3cG9ydCBmcm9tIGEgRDNEVklFV1BPUlQyIHN0cnVjdHVyZQorICoKKyAqIFBhcmFtczoKKyAqICBscERhdGE6IFZpZXdwb3J0IHRvIHNldAorICoKKyAqIFJldHVybnM6CisgKiAgRDNEX09LIG9uIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRWaWV3cG9ydDIoSURpcmVjdDNEVmlld3BvcnQzICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVklFV1BPUlQyICpscERhdGEpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKICAgICBMUERJUkVDVDNEVklFV1BPUlQzIGN1cnJlbnRfdmlld3BvcnQ7CiAgICAgVFJBQ0UoIiglcC8lcCktPiglcClcbiIsIFRoaXMsIGlmYWNlLCBscERhdGEpOwogCi0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgeworICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgICBUUkFDRSgiICBnZXR0aW5nIEQzRFZJRVdQT1JUMiA6XG4iKTsKIAlfZHVtcF9EM0RWSUVXUE9SVDIobHBEYXRhKTsKICAgICB9CkBAIC00MzgsMTA1ICs3MTIsMTI2IEBACiAgICAgICBJRGlyZWN0M0RWaWV3cG9ydDNfUmVsZWFzZShjdXJyZW50X3ZpZXdwb3J0KTsKICAgICB9CiAKLSAgICByZXR1cm4gRERfT0s7CisgICAgcmV0dXJuIEQzRF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkKLU1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfU2V0QmFja2dyb3VuZERlcHRoMihMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGxwRERTKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWaWV3cG9ydDMgTWV0aG9kcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRGlyZWN0M0RWaWV3cG9ydDM6OlNldEJhY2tncm91bmREZXB0aDIKKyAqCisgKiBTZXRzIGEgSURpcmVjdERyYXdTdXJmYWNlNCBzdXJmYWNlIGFzIHRoZSBiYWNrZ3JvdW5kIGRlcHRoIHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgbHBERFM6IFN1cmZhY2UgdG8gc2V0CisgKgorICogUmV0dXJuczoKKyAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBzdHViCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0QmFja2dyb3VuZERlcHRoMihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNCAqbHBERFMpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLyVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGlmYWNlLCBscEREUyk7Ci0gICAgcmV0dXJuIEREX09LOworICAgIEZJWE1FKCIoJXApLT4oJXApOiBzdHViIVxuIiwgVGhpcywgbHBERFMpOworICAgIHJldHVybiBEM0RfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zX0dldEJhY2tncm91bmREZXB0aDIoTFBESVJFQ1QzRFZJRVdQT1JUMyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNCogbHBscEREUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEJPT0wgbHBWYWxpZCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSURpcmVjdDNEVmlld3BvcnQzOjpHZXRCYWNrZ3JvdW5kRGVwdGgyCisgKgorICogUmV0dXJucyB0aGUgSURpcmVjdDNEU3VyZmFjZTQgaW50ZXJmYWNlIHRvIHRoZSBiYWNrZ3JvdW5kIGRlcHRoIHN1cmZhY2UKKyAqCisgKiBQYXJhbXM6CisgKiAgbHBscEREUzogQWRkcmVzcyB0byBzdG9yZSB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYXQKKyAqICBscFZhbGlkOiBTZXQgdG8gdHJ1ZSBpZiBhIHN1cmZhY2UgaXMgYXNzaWduZWQKKyAqCisgKiBSZXR1cm5zOgorICogIEQzRF9PSyBiZWNhdXNlIGl0J3MgYSBzdHViCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0QmFja2dyb3VuZERlcHRoMihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNCAqKmxwbHBERFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpscFZhbGlkKQogewogICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRFZpZXdwb3J0SW1wbCwgSURpcmVjdDNEVmlld3BvcnQzLCBpZmFjZSk7CiAgICAgRklYTUUoIiglcC8lcCktPiglcCwlcCk6IHN0dWIhXG4iLCBUaGlzLCBpZmFjZSwgbHBscEREUywgbHBWYWxpZCk7Ci0gICAgcmV0dXJuIEREX09LOworICAgIHJldHVybiBEM0RfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJCi1NYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zX0NsZWFyMihMUERJUkVDVDNEVklFV1BPUlQzIGlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNEUkVDVCBscFJlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3Q29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWQUxVRSBkdlosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0ZW5jaWwpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElEaXJlY3QzRFZpZXdwb3J0Mzo6Q2xlYXIyCisgKgorICogQW5vdGhlciBjbGVhcmluZyBtZXRob2QKKyAqCisgKiBQYXJhbXM6CisgKiAgQ291bnQ6IE51bWJlciBvZiByZWN0YW5nbGVzIHRvIGNsZWFyCisgKiAgUmVjdHM6IFJlY3RhbmdsZSBhcnJheSB0byBjbGVhcgorICogIEZsYWdzOiBTb21lIGZsYWdzIDopCisgKiAgQ29sb3I6IENvbG9yIHRvIGZpbGwgdGhlIHJlbmRlciB0YXJnZXQgd2l0aAorICogIFo6IFZhbHVlIHRvIGZpbGwgdGhlIGRlcHRoIGJ1ZmZlciB3aXRoCisgKiAgU3RlbmNpbDogVmFsdWUgdG8gZmlsbCB0aGUgc3RlbmNpbCBiaXRzIHdpdGgKKyAqCisgKiBSZXR1cm5zOgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdDNEVmlld3BvcnRJbXBsX0NsZWFyMihJRGlyZWN0M0RWaWV3cG9ydDMgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFJFQ1QgbHBSZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVkFMVUUgZHZaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1N0ZW5jaWwpCiB7CiAgICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNEVmlld3BvcnRJbXBsLCBJRGlyZWN0M0RWaWV3cG9ydDMsIGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwLyVwKS0+KCUwOGx4LCVwLCUwOGx4LCUwOGx4LCVmLCUwOGx4KVxuIiwgVGhpcywgaWZhY2UsIGR3Q291bnQsIGxwUmVjdHMsIGR3RmxhZ3MsIGR3Q29sb3IsIGR2WiwgZHdTdGVuY2lsKTsKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwLCUwOGx4LCUwOGx4LCVmLCUwOGx4KVxuIiwgVGhpcywgZHdDb3VudCwgbHBSZWN0cywgZHdGbGFncywgZHdDb2xvciwgZHZaLCBkd1N0ZW5jaWwpOwogICAgIGlmIChUaGlzLT5hY3RpdmVfZGV2aWNlID09IE5VTEwpIHsKICAgICAgICAgRVJSKCIgVHJ5aW5nIHRvIGNsZWFyIGEgdmlld3BvcnQgbm90IGF0dGFjaGVkIHRvIGEgZGV2aWNlICFcbiIpOwogCXJldHVybiBEM0RFUlJfVklFV1BPUlRIQVNOT0RFVklDRTsKICAgICB9Ci0gICAgcmV0dXJuIFRoaXMtPmFjdGl2ZV9kZXZpY2UtPmNsZWFyKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIGR3Q291bnQsIGxwUmVjdHMsIGR3RmxhZ3MsIGR3Q29sb3IsIGR2WiwgZHdTdGVuY2lsKTsKKyAgICByZXR1cm4gSURpcmVjdDNERGV2aWNlN19DbGVhcihJQ09NX0lOVEVSRkFDRShUaGlzLT5hY3RpdmVfZGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwUmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2WiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0ZW5jaWwpOwogfQogCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHR5cGVvZihWVEFCTEVfSURpcmVjdDNEVmlld3BvcnQzLmZ1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKSAgICAgKHZvaWQqKQotI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZSBWVGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGNvbnN0IElEaXJlY3QzRFZpZXdwb3J0M1Z0YmwgVlRBQkxFX0lEaXJlY3QzRFZpZXdwb3J0MyA9Citjb25zdCBJRGlyZWN0M0RWaWV3cG9ydDNWdGJsIElEaXJlY3QzRFZpZXdwb3J0M19WdGJsID0KIHsKLSAgICBYQ0FTVChRdWVyeUludGVyZmFjZSkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKSBNYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9BZGRSZWYsCi0gICAgWENBU1QoUmVsZWFzZSkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfUmVsZWFzZSwKLSAgICBYQ0FTVChJbml0aWFsaXplKSBNYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9Jbml0aWFsaXplLAotICAgIFhDQVNUKEdldFZpZXdwb3J0KSBNYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9HZXRWaWV3cG9ydCwKLSAgICBYQ0FTVChTZXRWaWV3cG9ydCkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfU2V0Vmlld3BvcnQsCi0gICAgWENBU1QoVHJhbnNmb3JtVmVydGljZXMpIE1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX1RyYW5zZm9ybVZlcnRpY2VzLAotICAgIFhDQVNUKExpZ2h0RWxlbWVudHMpIE1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX0xpZ2h0RWxlbWVudHMsCi0gICAgWENBU1QoU2V0QmFja2dyb3VuZCkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfU2V0QmFja2dyb3VuZCwKLSAgICBYQ0FTVChHZXRCYWNrZ3JvdW5kKSBNYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9HZXRCYWNrZ3JvdW5kLAotICAgIFhDQVNUKFNldEJhY2tncm91bmREZXB0aCkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfU2V0QmFja2dyb3VuZERlcHRoLAotICAgIFhDQVNUKEdldEJhY2tncm91bmREZXB0aCkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfR2V0QmFja2dyb3VuZERlcHRoLAotICAgIFhDQVNUKENsZWFyKSBNYWluX0lEaXJlY3QzRFZpZXdwb3J0SW1wbF8zXzJfMV9DbGVhciwKLSAgICBYQ0FTVChBZGRMaWdodCkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfQWRkTGlnaHQsCi0gICAgWENBU1QoRGVsZXRlTGlnaHQpIE1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl8xX0RlbGV0ZUxpZ2h0LAotICAgIFhDQVNUKE5leHRMaWdodCkgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yXzFfTmV4dExpZ2h0LAotICAgIFhDQVNUKEdldFZpZXdwb3J0MikgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM18yX0dldFZpZXdwb3J0MiwKLSAgICBYQ0FTVChTZXRWaWV3cG9ydDIpIE1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfMl9TZXRWaWV3cG9ydDIsCi0gICAgWENBU1QoU2V0QmFja2dyb3VuZERlcHRoMikgTWFpbl9JRGlyZWN0M0RWaWV3cG9ydEltcGxfM19TZXRCYWNrZ3JvdW5kRGVwdGgyLAotICAgIFhDQVNUKEdldEJhY2tncm91bmREZXB0aDIpIE1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfR2V0QmFja2dyb3VuZERlcHRoMiwKLSAgICBYQ0FTVChDbGVhcjIpIE1haW5fSURpcmVjdDNEVmlld3BvcnRJbXBsXzNfQ2xlYXIyLAorICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX1F1ZXJ5SW50ZXJmYWNlLAorICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9BZGRSZWYsCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX1JlbGVhc2UsCisgICAgLyoqKiBJRGlyZWN0M0RWaWV3cG9ydCBNZXRob2RzICovCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0luaXRpYWxpemUsCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldFZpZXdwb3J0LAorICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRWaWV3cG9ydCwKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfVHJhbnNmb3JtVmVydGljZXMsCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0xpZ2h0RWxlbWVudHMsCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldEJhY2tncm91bmQsCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldEJhY2tncm91bmQsCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX1NldEJhY2tncm91bmREZXB0aCwKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfR2V0QmFja2dyb3VuZERlcHRoLAorICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9DbGVhciwKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfQWRkTGlnaHQsCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0RlbGV0ZUxpZ2h0LAorICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9OZXh0TGlnaHQsCisgICAgLyoqKiBJRGlyZWN0M0RWaWV3cG9ydDIgTWV0aG9kcyAqKiovCisgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsX0dldFZpZXdwb3J0MiwKKyAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGxfU2V0Vmlld3BvcnQyLAorICAgIC8qKiogSURpcmVjdDNEVmlld3BvcnQzIE1ldGhvZHMgKioqLworICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9TZXRCYWNrZ3JvdW5kRGVwdGgyLAorICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9HZXRCYWNrZ3JvdW5kRGVwdGgyLAorICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbF9DbGVhcjIsCiB9OwotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotI3VuZGVmIFhDQVNUCi0jZW5kaWYKLQotCi0KLQotSFJFU1VMVCBkM2R2aWV3cG9ydF9jcmVhdGUoSURpcmVjdDNEVmlld3BvcnRJbXBsICoqb2JqLCBJRGlyZWN0RHJhd0ltcGwgKmQzZCkKLXsKLSAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKm9iamVjdDsKLQotICAgIG9iamVjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoSURpcmVjdDNEVmlld3BvcnRJbXBsKSk7Ci0gICAgaWYgKG9iamVjdCA9PSBOVUxMKSByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7Ci0KLSAgICBvYmplY3QtPnJlZiA9IDE7Ci0gICAgb2JqZWN0LT5kM2QgPSBkM2Q7Ci0gICAgb2JqZWN0LT5hY3RpdmF0ZSA9IGFjdGl2YXRlOwotICAgIG9iamVjdC0+dXNlX3ZwMiA9IDB4RkY7Ci0gICAgb2JqZWN0LT5uZXh0ID0gTlVMTDsKLSAgICBvYmplY3QtPmxpZ2h0cyA9IE5VTEw7Ci0gICAgb2JqZWN0LT5udW1fbGlnaHRzID0gMDsKLSAgICBvYmplY3QtPm1hcF9saWdodHMgPSAwOwotICAgIAotICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RWaWV3cG9ydDMsIFZUQUJMRV9JRGlyZWN0M0RWaWV3cG9ydDMpOwotCi0gICAgKm9iaiA9IG9iamVjdDsKLQotICAgIFRSQUNFKCIgY3JlYXRpbmcgaW1wbGVtZW50YXRpb24gYXQgJXAuXG4iLCAqb2JqKTsKLSAgICAKLSAgICByZXR1cm4gRDNEX09LOwotfQo=