ZGlmZiAtLWdpdCBhL3NyYy9mZWF0dXJlLmggYi9zcmMvZmVhdHVyZS5oCmluZGV4IGMyM2FkZTQuLjllOTliOTEgMTAwNjQ0Ci0tLSBhL3NyYy9mZWF0dXJlLmgKKysrIGIvc3JjL2ZlYXR1cmUuaApAQCAtNzU2LDYgKzc1Niw3IEBACiAjaWYgZGVmaW5lZChGRUFUX1dJTkRPV1MpICYmIGRlZmluZWQoRkVBVF9OT1JNQUwpIFwKICAgICAmJiAoZGVmaW5lZChGRUFUX0dVSV9HVEspIFwKIAl8fCAoZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgJiYgZGVmaW5lZChIQVZFX1hNX05PVEVCT09LX0gpKSBcCisJfHwgZGVmaW5lZChGRUFUX0dVSV9NQUMpIFwKIAl8fCAoZGVmaW5lZChGRUFUX0dVSV9NU1dJTikgJiYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+IDEwMjApKSkKICMgZGVmaW5lIEZFQVRfR1VJX1RBQkxJTkUKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2d1aS5jIGIvc3JjL2d1aS5jCmluZGV4IGYxODBjYzMuLmFkY2E3ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9ndWkuYworKysgYi9zcmMvZ3VpLmMKQEAgLTExNTksNyArMTE1OSw3IEBACiAjZW5kaWYKIAogIyBpZiBkZWZpbmVkKEZFQVRfR1VJX1RBQkxJTkUpICYmIChkZWZpbmVkKEZFQVRfR1VJX01TV0lOKSBcCi0JfHwgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikpCisgCXx8IGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIHx8IGRlZmluZWQoRkVBVF9HVUlfTUFDKSkKICAgICBpZiAoZ3VpX2hhc190YWJsaW5lKCkpCiAJdGV4dF9hcmVhX3kgKz0gZ3VpLnRhYmxpbmVfaGVpZ2h0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvZ3VpLmggYi9zcmMvZ3VpLmgKaW5kZXggODdmZDRjMS4uMmU3NTdiOCAxMDA2NDQKLS0tIGEvc3JjL2d1aS5oCisrKyBiL3NyYy9ndWkuaApAQCAtNDIxLDcgKzQyMSw4IEBACiAjZW5kaWYJLyogRkVBVF9HVUlfR1RLICovCiAKICNpZiBkZWZpbmVkKEZFQVRfR1VJX1RBQkxJTkUpIFwKLQkmJiAoZGVmaW5lZChGRUFUX0dVSV9XMzIpIHx8IGRlZmluZWQoRkVBVF9HVUlfTU9USUYpKQorIAkmJiAoZGVmaW5lZChGRUFUX0dVSV9XMzIpIHx8IGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIFwKKyAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChGRUFUX0dVSV9NQUMpKQogICAgIGludAkJdGFibGluZV9oZWlnaHQ7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL2d1aV9tYWMuYyBiL3NyYy9ndWlfbWFjLmMKaW5kZXggNjExNGQ3OS4uMDAzZjdhNyAxMDA2NDQKLS0tIGEvc3JjL2d1aV9tYWMuYworKysgYi9zcmMvZ3VpX21hYy5jCkBAIC00LDcgKzQsNyBAQAogICoJCQkJR1VJL01vdGlmIHN1cHBvcnQgYnkgUm9iZXJ0IFdlYmIKICAqCQkJCU1hY2ludG9zaCBwb3J0IGJ5IERhbnkgU3QtQW1hbnQKICAqCQkJCQkgICAgICBhbmQgQXhlbCBLaWVsaG9ybgotICoJCQkJUG9ydCB0byBNUFcgYnkgQmVybmhhcmQgUHKfbW1lcgorICoJCQkJUG9ydCB0byBNUFcgYnkgQmVybmhhcmQgUHJ1ZW1tZXIKICAqCQkJCUluaXRpYWwgQ2FyYm9uIHBvcnQgYnkgQW1tb24gU2tpZG1vcmUKICAqCiAgKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KQEAgLTI2MCw2ICsyNjAsMTEgQEAKIE9TRXJyIEhhbmRsZVVudXNlZFBhcm1zKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCk7CiAjZW5kaWYKIAorI2lmZGVmIEZFQVRfR1VJX1RBQkxJTkUKK3N0YXRpYyB2b2lkIGluaXRpYWxpc2VfdGFibGluZSh2b2lkKTsKK3N0YXRpYyBXaW5kb3dSZWYgZHJhd2VyID0gTlVMTDsgLy8gVE9ETzogcHV0IGludG8gZ3VpLmgKKyNlbmRpZgorCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDb252ZXJzaW9uIFV0aWxpdHkKQEAgLTIzNTcsNiArMjM2MiwxMyBAQAogCiAgICAgdGhlUGFydCA9IEZpbmRXaW5kb3codGhlRXZlbnQtPndoZXJlLCAmd2hpY2hXaW5kb3cpOwogCisjaWZkZWYgRkVBVF9HVUlfVEFCTElORQorICAgIC8qIHByZXZlbnQgdGhhdCB0aGUgdmltIHdpbmRvdyBzaXplIGNoYW5nZXMgaWYgaXQncyBhY3RpdmF0ZWQgYnkgYQorICAgICAgIGNsaWNrIGludG8gdGhlIHRhYiBwYW5lICovCisgICAgaWYgKHdoaWNoV2luZG93ID09IGRyYXdlcikKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisKICAgICBzd2l0Y2ggKHRoZVBhcnQpCiAgICAgewogCWNhc2UgKGluRGVzayk6CkBAIC0zMDk3LDYgKzMxMDksMTMgQEAKICNlbmRpZgogKi8KIAorI2lmZGVmIEZFQVRfR1VJX1RBQkxJTkUKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgdGFibGluZQorICAgICAqLworICAgIGluaXRpYWxpc2VfdGFibGluZSgpOworI2VuZGlmCisKICAgICAvKiBUT0RPOiBMb2FkIGJpdG1hcCBpZiB1c2luZyBUT09MQkFSICovCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNTg5NSw3ICs1OTE0LDcgQEAKICAgICB0aGVDUEIuZGlySW5mby5pb0ZEaXJJbmRleCA9IDA7CiAgICAgdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBmaWxlLm5hbWU7CiAgICAgdGhlQ1BCLmRpckluZm8uaW9WUmVmTnVtICAgPSBmaWxlLnZSZWZOdW07Ci0gIC8qdGhlQ1BCLmhGaWxlSW5mby5pb0RpcklEICAgPSAwOyovCisgICAgLyp0aGVDUEIuaEZpbGVJbmZvLmlvRGlySUQgICA9IDA7Ki8KICAgICB0aGVDUEIuZGlySW5mby5pb0RyRGlySUQgICA9IGZpbGUucGFySUQ7CiAKICAgICAvKiBBcyBpb0ZEaXJJbmRleCA9IDAsIGdldCB0aGUgaW5mbyBvZiBpb05hbWVQdHIsCkBAIC02MDkzLDQgKzYxMTIsNDA3IEBACiAgICAgcmV0dXJuIChzY3JpcHQgIT0gc21Sb21hbgogCSAgICAmJiBzY3JpcHQgPT0gR2V0U2NyaXB0TWFuYWdlclZhcmlhYmxlKHNtU3lzU2NyaXB0KSkgPyAxIDogMDsKIH0KKwogI2VuZGlmIC8qIGRlZmluZWQoVVNFX0lNX0NPTlRST0wpIHx8IGRlZmluZWQoUFJPVE8pICovCisKKworCisKKyNpZiBkZWZpbmVkKEZFQVRfR1VJX1RBQkxJTkUpIHx8IGRlZmluZWQoUFJPVE8pCisvLyBkcmF3ZXIgaW1wbGVtZW50YXRpb24KK3N0YXRpYyBNZW51UmVmIGNvbnRleHRNZW51ID0gTlVMTDsKK2VudW0KK3sKKyAgICBrVGFiQ29udGV4dE1lbnVJZCA9IDQyLAorfTsKKworLy8gdGhlIGNhbGxlciBoYXMgdG8gQ0ZSZWxlYXNlKCkgdGhlIHJldHVybmVkIHN0cmluZworICAgIHN0YXRpYyBDRlN0cmluZ1JlZgorZ2V0VGFiTGFiZWwodGFicGFnZV9UICpwYWdlKQoreworICAgIGdldF90YWJsaW5lX2xhYmVsKHBhZ2UsIEZBTFNFKTsKKyNpZmRlZiBNQUNPU19DT05WRVJUCisgICAgcmV0dXJuIG1hY19lbmNfdG9fY2ZzdHJpbmcoTmFtZUJ1ZmYsIFNUUkxFTihOYW1lQnVmZikpOworI2Vsc2UKKyAgICAvLyBUT0RPOiBjaGVjayBpbnRlcm5hbCBlbmNvZGluZz8KKyAgICByZXR1cm4gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoY2hhciAqKU5hbWVCdWZmLAorCQkJCQkJICAga0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbik7CisjZW5kaWYKK30KKworCisjZGVmaW5lIERSQVdFUl9TSVpFIDE1MAorI2RlZmluZSBEUkFXRVJfSU5TRVQgMTYKKworc3RhdGljIENvbnRyb2xSZWYgZGF0YUJyb3dzZXIgPSBOVUxMOworCisvLyB3aGVuIHRoZSB0YWJsaW5lIGlzIGhpZGRlbiwgdmltIGRvZXNuJ3QgY2FsbCB1cGRhdGVfdGFibGluZSgpLiBXaGVuCisvLyB0aGUgdGFibGluZSBpcyBzaG93biBhZ2Fpbiwgc2hvd190YWJsaW5lKCkgaXMgY2FsbGVkIGJlZm9yZSB1cGF0ZV90YWJsaW5lKCksCisvLyBhbmQgYmVjYXVzZSBvZiB0aGlzLCB0aGUgdGFiIGxhYmVscyBhbmQgdmltcyBpbnRlcm5hbCB0YWJzIGFyZSBvdXQgb2Ygc3luYworLy8gZm9yIGEgdmVyeSBzaG9ydCB0aW1lLiB0byBwcmV2ZW50IGluY29uc2lzdGVudCBzdGF0ZSwgd2Ugc3RvcmUgdGhlIGxhYmVscworLy8gb2YgdGhlIHRhYnMsIG5vdCBwb2ludGVycyB0byB0aGUgdGFicyAod2hpY2ggYXJlIGludmFsaWQgZm9yIGEgc2hvcnQgdGltZSkuCitzdGF0aWMgQ0ZTdHJpbmdSZWYgKnRhYkxhYmVscyA9IE5VTEw7CitzdGF0aWMgaW50IHRhYkxhYmVsc1NpemUgPSAwOworCitlbnVtCit7CisgICAga1RhYnNDb2x1bW4gPSAnVGFicycKK307CisKKyAgICBzdGF0aWMgaW50CitnZXRUYWJDb3VudCh2b2lkKQoreworICAgIHRhYnBhZ2VfVAkqdHA7CisgICAgaW50CQludW1UYWJzID0gMDsKKworICAgIGZvciAodHAgPSBmaXJzdF90YWJwYWdlOyB0cCAhPSBOVUxMOyB0cCA9IHRwLT50cF9uZXh0KQorICAgICAgICArK251bVRhYnM7CisgICAgcmV0dXJuIG51bVRhYnM7Cit9CisKKy8vIGRhdGEgYnJvd3NlciBpdGVtIGRpc3BsYXkgY2FsbGJhY2sKKyAgICBzdGF0aWMgT1NTdGF0dXMKK2RiSXRlbURhdGFDYWxsYmFjayhDb250cm9sUmVmIGJyb3dzZXIsCisJRGF0YUJyb3dzZXJJdGVtSUQgaXRlbUlELAorICAgICAgICBEYXRhQnJvd3NlclByb3BlcnR5SUQgcHJvcGVydHkgLyogY29sdW1uIGlkICovLAorICAgICAgICBEYXRhQnJvd3Nlckl0ZW1EYXRhUmVmIGl0ZW1EYXRhLAorCUJvb2xlYW4gY2hhbmdlVmFsdWUpCit7CisgICAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisKKyAgICAvLyBhc3NlcnQocHJvcGVydHkgPT0ga1RhYnNDb2x1bW4pOyAvLyB3aHkgaXMgdGhpcyB2aW9sYXRlZD8/CisKKyAgICAvLyBjaGFuZ2VWYWx1ZSBpcyB0cnVlIGlmIHdlIGhhdmUgYSBtb2RpZmllYWJsZSBsaXN0IGFuZCBkYXRhIHdhcyBjaGFuZ2VkLgorICAgIC8vIEluIG91ciBjYXNlLCBpdCdzIGFsd2F5cyBmYWxzZS4KKyAgICAvLyAodGhhdCBpczogaWYgKGNoYW5nZVZhbHVlKSB1cGRhdGVJbnRlcm5hbERhdGEoKTsgZWxzZSByZXR1cm4KKyAgICAvLyBpbnRlcm5hbERhdGEoKTsKKyAgICBpZiAoIWNoYW5nZVZhbHVlKQorICAgIHsKKwlDRlN0cmluZ1JlZiBzdHI7CisKKwlhc3NlcnQoaXRlbUlEIC0gMSA+PSAwICYmIGl0ZW1JRCAtIDEgPCB0YWJMYWJlbHNTaXplKTsKKwlzdHIgPSB0YWJMYWJlbHNbaXRlbUlEIC0gMV07CisJc3RhdHVzID0gU2V0RGF0YUJyb3dzZXJJdGVtRGF0YVRleHQoaXRlbURhdGEsIHN0cik7CisgICAgfQorICAgIGVsc2UKKwlzdGF0dXMgPSBlcnJEYXRhQnJvd3NlclByb3BlcnR5Tm90U3VwcG9ydGVkOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gZGF0YSBicm93c2VyIGFjdGlvbiBjYWxsYmFjaworICAgIHN0YXRpYyB2b2lkCitkYkl0ZW1Ob3RpZmljYXRpb25DYWxsYmFjayhDb250cm9sUmVmIGJyb3dzZXIsCisJRGF0YUJyb3dzZXJJdGVtSUQgaXRlbSwKKwlEYXRhQnJvd3Nlckl0ZW1Ob3RpZmljYXRpb24gbWVzc2FnZSkKK3sKKyAgICBzd2l0Y2ggKG1lc3NhZ2UpCisgICAgeworCWNhc2Uga0RhdGFCcm93c2VySXRlbVNlbGVjdGVkOgorCSAgICBzZW5kX3RhYmxpbmVfZXZlbnQoaXRlbSk7CisJICAgIGJyZWFrOworICAgIH0KK30KKworLy8gY2FsbGJhY2tzIG5lZWRlZCBmb3IgY29udGV4dHVhbCBtZW51OgorICAgIHN0YXRpYyB2b2lkCitkYkdldENvbnRleHR1YWxNZW51Q2FsbGJhY2soQ29udHJvbFJlZiBicm93c2VyLAorCU1lbnVSZWYgKm1lbnUsCisgICAgICAgIFVJbnQzMiAqaGVscFR5cGUsCisJQ0ZTdHJpbmdSZWYgKmhlbHBJdGVtU3RyaW5nLAorICAgICAgICBBRURlc2MgKnNlbGVjdGlvbikKK3sKKyAgICAvLyBvbiBtYWMgb3MgOToga0NNSGVscEl0ZW1Ob0hlbHAsIGJ1dCBpdCdzIG5vdCB0aGUgc2FtZQorICAgICpoZWxwVHlwZSA9IGtDTUhlbHBJdGVtUmVtb3ZlSGVscDsgLy8gT1MgWCBvbmx5IDstKQorICAgICpoZWxwSXRlbVN0cmluZyA9IE5VTEw7CisKKyAgICAqbWVudSA9IGNvbnRleHRNZW51OworfQorCisgICAgc3RhdGljIHZvaWQKK2RiU2VsZWN0Q29udGV4dHVhbE1lbnVDYWxsYmFjayhDb250cm9sUmVmIGJyb3dzZXIsCisJTWVudVJlZiBtZW51LAorCVVJbnQzMiBzZWxlY3Rpb25UeXBlLAorCVNJbnQxNiBtZW51SUQsCisJTWVudUl0ZW1JbmRleCBtZW51SXRlbSkKK3sKKyAgICBpZiAoc2VsZWN0aW9uVHlwZSA9PSBrQ01NZW51SXRlbVNlbGVjdGVkKQorICAgIHsKKwlNZW51Q29tbWFuZCBjb21tYW5kOworCUdldE1lbnVJdGVtQ29tbWFuZElEKG1lbnUsIG1lbnVJdGVtLCAmY29tbWFuZCk7CisKKwkvLyBnZXQgdGFiIHRoYXQgd2FzIHNlbGVjdGVkIHdoZW4gdGhlIGNvbnRleHQgbWVudSBhcHBlYXJlZAorCS8vICh0aGVyZSBpcyBhbHdheXMgb25lIHRhYiBzZWxlY3RlZCkuIFRPRE86IGNoZWNrIGlmIHRoZSBjb250ZXh0IG1lbnUKKwkvLyBpc24ndCBvcGVuZWQgb24gYW4gaXRlbSBidXQgb24gZW1wdHkgc3BhY2UgKGhhcyB0byBiZSBwb3NzaWJsZSBzb21lCisJLy8gd2F5LCB0aGUgZmluZGVyIGRvZXMgaXQgdG9vIDstKSApCisJSGFuZGxlIGl0ZW1zID0gTmV3SGFuZGxlKDApOworCWlmIChpdGVtcyAhPSBOVUxMKQorCXsKKwkgICAgaW50IG51bUl0ZW1zOworCisJICAgIEdldERhdGFCcm93c2VySXRlbXMoYnJvd3Nlciwga0RhdGFCcm93c2VyTm9JdGVtLCBmYWxzZSwKKwkJCQkJICAga0RhdGFCcm93c2VySXRlbUlzU2VsZWN0ZWQsIGl0ZW1zKTsKKwkgICAgbnVtSXRlbXMgPSBHZXRIYW5kbGVTaXplKGl0ZW1zKSAvIHNpemVvZihEYXRhQnJvd3Nlckl0ZW1JRCk7CisJICAgIGlmIChudW1JdGVtcyA+IDApCisJICAgIHsKKwkJaW50IGlkeDsKKwkJRGF0YUJyb3dzZXJJdGVtSUQgKml0ZW1zUHRyOworCisJCUhMb2NrKGl0ZW1zKTsKKwkJaXRlbXNQdHIgPSAoRGF0YUJyb3dzZXJJdGVtSUQgKikqaXRlbXM7CisJCWlkeCA9IGl0ZW1zUHRyWzBdOworCQlIVW5sb2NrKGl0ZW1zKTsKKwkJc2VuZF90YWJsaW5lX21lbnVfZXZlbnQoaWR4LCBjb21tYW5kKTsKKwkgICAgfQorCSAgICBEaXNwb3NlSGFuZGxlKGl0ZW1zKTsKKwl9CisgICAgfQorfQorCisvLyBmb2N1cyBjYWxsYmFjayBvZiB0aGUgZGF0YSBicm93c2VyIHRvIGFsd2F5cyBsZWF2ZSBmb2N1cyBpbiB2aW0KKyAgICBzdGF0aWMgT1NTdGF0dXMKK2RiRm9jdXNDYWxsYmFjayhFdmVudEhhbmRsZXJDYWxsUmVmIGhhbmRsZXIsIEV2ZW50UmVmIGV2ZW50LCB2b2lkICpkYXRhKQoreworICAgIGFzc2VydChHZXRFdmVudENsYXNzKGV2ZW50KSA9PSBrRXZlbnRDbGFzc0NvbnRyb2wKKwkgICAgJiYgR2V0RXZlbnRLaW5kKGV2ZW50KSA9PSBrRXZlbnRDb250cm9sU2V0Rm9jdXNQYXJ0KTsKKworICAgIHJldHVybiBwYXJhbUVycjsKK30KKworCisvLyBkcmF3ZXIgY2FsbGJhY2sgdG8gcmVzaXplIGRhdGEgYnJvd3NlciB0byBkcmF3ZXIgc2l6ZQorICAgIHN0YXRpYyBPU1N0YXR1cworZHJhd2VyQ2FsbGJhY2soRXZlbnRIYW5kbGVyQ2FsbFJlZiBoYW5kbGVyLCBFdmVudFJlZiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKyAgICBzd2l0Y2ggKEdldEV2ZW50S2luZChldmVudCkpCisgICAgeworCWNhc2Uga0V2ZW50V2luZG93Qm91bmRzQ2hhbmdlZDogLy8gbW92ZSBvciByZXNpemUKKwkgICAgeworCQlVSW50MzIgYXR0cmliczsKKwkJR2V0RXZlbnRQYXJhbWV0ZXIoZXZlbnQsIGtFdmVudFBhcmFtQXR0cmlidXRlcywgdHlwZVVJbnQzMiwKKwkJCQkgICAgICAgTlVMTCwgc2l6ZW9mKGF0dHJpYnMpLCBOVUxMLCAmYXR0cmlicyk7CisJCWlmIChhdHRyaWJzICYga1dpbmRvd0JvdW5kc0NoYW5nZVNpemVDaGFuZ2VkKSAvLyByZXNpemUKKwkJeworCQkgICAgUmVjdCByOworCQkgICAgR2V0V2luZG93Qm91bmRzKGRyYXdlciwga1dpbmRvd0NvbnRlbnRSZ24sICZyKTsKKwkJICAgIFNldFJlY3QoJnIsIDAsIDAsIHIucmlnaHQgLSByLmxlZnQsIHIuYm90dG9tIC0gci50b3ApOworCQkgICAgU2V0Q29udHJvbEJvdW5kcyhkYXRhQnJvd3NlciwgJnIpOworCQkgICAgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKGRhdGFCcm93c2VyLAorCQkJCQkJCWtUYWJzQ29sdW1uLCByLnJpZ2h0KTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBldmVudE5vdEhhbmRsZWRFcnI7Cit9CisKKy8vIExvYWQgRGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzKCkgZHluYW1pY2FsbHkgb24gdGlnZXIgKGFuZCBiZXR0ZXIpLgorLy8gVGhpcyB3YXkgdGhlIGNvZGUgd29ya3Mgb24gMTAuMiBhbmQgMTAuMyBhcyB3ZWxsIChpdCBkb2Vzbid0IGhhdmUgdGhlCisvLyBibHVlIGhpZ2hsaWdodHMgaW4gdGhlIGxpc3QgdmlldyBvbiB0aGVzZSBzeXN0ZW1zLCB0aG91Z2guIE9oIHdlbGwuKQorCisKKyNpbXBvcnQgPG1hY2gtby9keWxkLmg+CisKK2VudW0geyBrTXlEYXRhQnJvd3NlckF0dHJpYnV0ZUxpc3RWaWV3QWx0ZXJuYXRpbmdSb3dDb2xvcnMgPSAoMSA8PCAxKSB9OworCisgICAgc3RhdGljIE9TU3RhdHVzCitteURhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlcyhDb250cm9sUmVmIGluRGF0YUJyb3dzZXIsCisJT3B0aW9uQml0cyBpbkF0dHJpYnV0ZXNUb1NldCwKKwlPcHRpb25CaXRzIGluQXR0cmlidXRlc1RvQ2xlYXIpCit7CisgICAgbG9uZyBvc1ZlcnNpb247CisgICAgY2hhciAqc3ltYm9sTmFtZTsKKyAgICBOU1N5bWJvbCBzeW1ib2wgPSBOVUxMOworICAgIE9TU3RhdHVzICgqZGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzKShDb250cm9sUmVmIGluRGF0YUJyb3dzZXIsCisJICAgICAgT3B0aW9uQml0cyAgIGluQXR0cmlidXRlc1RvU2V0LCBPcHRpb25CaXRzIGluQXR0cmlidXRlc1RvQ2xlYXIpOworCisgICAgR2VzdGFsdChnZXN0YWx0U3lzdGVtVmVyc2lvbiwgJm9zVmVyc2lvbik7CisgICAgaWYgKG9zVmVyc2lvbiA8IDB4MTA0MCkgLy8gb25seSBzdXBwb3J0ZWQgZm9yIDEwLjQgKGFuZCB1cCkKKwlyZXR1cm4gbm9FcnI7CisKKyAgICAvLyBDIG5hbWUgbWFuZ2xpbmcuLi4KKyAgICBzeW1ib2xOYW1lID0gIl9EYXRhQnJvd3NlckNoYW5nZUF0dHJpYnV0ZXMiOworICAgIGlmICghTlNJc1N5bWJvbE5hbWVEZWZpbmVkKHN5bWJvbE5hbWUpCisJICAgIHx8IChzeW1ib2wgPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woc3ltYm9sTmFtZSkpID09IE5VTEwpCisJcmV0dXJuIG5vRXJyOworCisgICAgZGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzID0gTlNBZGRyZXNzT2ZTeW1ib2woc3ltYm9sKTsKKyAgICBpZiAoZGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzID09IE5VTEwpCisJcmV0dXJuIG5vRXJyOyAvLyB3ZWxsLi4uCisgICAgcmV0dXJuIGRhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlcyhpbkRhdGFCcm93c2VyLAorCQkJCSAgICAgIGluQXR0cmlidXRlc1RvU2V0LCBpbkF0dHJpYnV0ZXNUb0NsZWFyKTsKK30KKworICAgIHN0YXRpYyB2b2lkCitpbml0aWFsaXNlX3RhYmxpbmUodm9pZCkKK3sKKyAgICBSZWN0IGRyYXdlclJlY3QgPSB7IDAsIDAsIDAsIERSQVdFUl9TSVpFIH07CisgICAgRGF0YUJyb3dzZXJDYWxsYmFja3MgZGJDYWxsYmFja3M7CisgICAgRXZlbnRUeXBlU3BlYyBmb2N1c0V2ZW50ID0ge2tFdmVudENsYXNzQ29udHJvbCwga0V2ZW50Q29udHJvbFNldEZvY3VzUGFydH07CisgICAgRXZlbnRUeXBlU3BlYyByZXNpemVFdmVudCA9IHtrRXZlbnRDbGFzc1dpbmRvdywga0V2ZW50V2luZG93Qm91bmRzQ2hhbmdlZH07CisgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sRGVzYzsKKworICAgIC8vIGRyYXdlcnMgaGF2ZSB0byBoYXZlIGNvbXBvc2l0aW5nIGVuYWJsZWQKKyAgICBDcmVhdGVOZXdXaW5kb3coa0RyYXdlcldpbmRvd0NsYXNzLAorCSAgICBrV2luZG93U3RhbmRhcmRIYW5kbGVyQXR0cmlidXRlCisJCSAgICB8IGtXaW5kb3dDb21wb3NpdGluZ0F0dHJpYnV0ZQorCQkgICAgfCBrV2luZG93UmVzaXphYmxlQXR0cmlidXRlCisJCSAgICB8IGtXaW5kb3dMaXZlUmVzaXplQXR0cmlidXRlLAorCSAgICAmZHJhd2VyUmVjdCwgJmRyYXdlcik7CisKKyAgICBTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQoZHJhd2VyLCBrVGhlbWVCcnVzaERyYXdlckJhY2tncm91bmQsIHRydWUpOworICAgIFNldERyYXdlclBhcmVudChkcmF3ZXIsIGd1aS5WaW1XaW5kb3cpOworICAgIFNldERyYXdlck9mZnNldHMoZHJhd2VyLCBrV2luZG93T2Zmc2V0VW5jaGFuZ2VkLCBEUkFXRVJfSU5TRVQpOworCisKKyAgICAvLyBjcmVhdGUgbGlzdCB2aWV3IGVtYmVkZGVkIGluIGRyYXdlcgorICAgIENyZWF0ZURhdGFCcm93c2VyQ29udHJvbChkcmF3ZXIsICZkcmF3ZXJSZWN0LCBrRGF0YUJyb3dzZXJMaXN0VmlldywKKwkJCQkJCQkJJmRhdGFCcm93c2VyKTsKKworICAgIGRiQ2FsbGJhY2tzLnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMYXRlc3RDYWxsYmFja3M7CisgICAgSW5pdERhdGFCcm93c2VyQ2FsbGJhY2tzKCZkYkNhbGxiYWNrcyk7CisgICAgZGJDYWxsYmFja3MudS52MS5pdGVtRGF0YUNhbGxiYWNrID0KKwkJCQlOZXdEYXRhQnJvd3Nlckl0ZW1EYXRhVVBQKGRiSXRlbURhdGFDYWxsYmFjayk7CisgICAgZGJDYWxsYmFja3MudS52MS5pdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2sgPQorCQlOZXdEYXRhQnJvd3Nlckl0ZW1Ob3RpZmljYXRpb25VUFAoZGJJdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2spOworICAgIGRiQ2FsbGJhY2tzLnUudjEuZ2V0Q29udGV4dHVhbE1lbnVDYWxsYmFjayA9CisJICAgICAgTmV3RGF0YUJyb3dzZXJHZXRDb250ZXh0dWFsTWVudVVQUChkYkdldENvbnRleHR1YWxNZW51Q2FsbGJhY2spOworICAgIGRiQ2FsbGJhY2tzLnUudjEuc2VsZWN0Q29udGV4dHVhbE1lbnVDYWxsYmFjayA9CisJTmV3RGF0YUJyb3dzZXJTZWxlY3RDb250ZXh0dWFsTWVudVVQUChkYlNlbGVjdENvbnRleHR1YWxNZW51Q2FsbGJhY2spOworCisgICAgU2V0RGF0YUJyb3dzZXJDYWxsYmFja3MoZGF0YUJyb3dzZXIsICZkYkNhbGxiYWNrcyk7CisKKyAgICBTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KGRhdGFCcm93c2VyLCAwKTsgLy8gbm8gaGVhZGVyCisgICAgU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKGRhdGFCcm93c2VyLCBmYWxzZSwgdHJ1ZSk7IC8vIG9ubHkgdmVydGljYWwKKyAgICBTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKGRhdGFCcm93c2VyLAorCSAgICAgIGtEYXRhQnJvd3NlclNlbGVjdE9ubHlPbmUgfCBrRGF0YUJyb3dzZXJOZXZlckVtcHR5U2VsZWN0aW9uU2V0KTsKKyAgICBTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKGRhdGFCcm93c2VyLAorCQkJCQkgICAgIGtEYXRhQnJvd3NlclRhYmxlVmlld0ZpbGxIaWxpdGUpOworICAgIEJvb2xlYW4gYiA9IGZhbHNlOworICAgIFNldENvbnRyb2xEYXRhKGRhdGFCcm93c2VyLCBrQ29udHJvbEVudGlyZUNvbnRyb2wsCisJCSAga0NvbnRyb2xEYXRhQnJvd3NlckluY2x1ZGVzRnJhbWVBbmRGb2N1c1RhZywgc2l6ZW9mKGIpLCAmYik7CisKKyAgICAvLyBlbmFibGUgYmx1ZSBiYWNrZ3JvdW5kIGluIGRhdGEgYnJvd3NlciAodGhpcyBpcyBvbmx5IGluIDEwLjQgYW5kIHZpbQorICAgIC8vIGhhcyB0byBzdXBwb3J0IG9sZGVyIG9zeCB2ZXJzaW9ucyBhcyB3ZWxsLCBzbyB3ZSBoYXZlIHRvIGxvYWQgdGhpcworICAgIC8vIGZ1bmN0aW9uIGR5bmFtaWNhbGx5KQorICAgIG15RGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzKGRhdGFCcm93c2VyLAorCQkgICAgICBrTXlEYXRhQnJvd3NlckF0dHJpYnV0ZUxpc3RWaWV3QWx0ZXJuYXRpbmdSb3dDb2xvcnMsIDApOworCisgICAgLy8gaW5zdGFsbCBjYWxsYmFjayB0aGF0IGtlZXBzIGZvY3VzIGluIHZpbSBhbmQgYXdheSBmcm9tIHRoZSBkYXRhIGJyb3dzZXIKKyAgICBJbnN0YWxsQ29udHJvbEV2ZW50SGFuZGxlcihkYXRhQnJvd3NlciwgZGJGb2N1c0NhbGxiYWNrLCAxLCAmZm9jdXNFdmVudCwKKwkJCQkJCQkJICBOVUxMLCBOVUxMKTsKKworICAgIC8vIGluc3RhbGwgY2FsbGJhY2sgdGhhdCBrZWVwcyBkYXRhIGJyb3dzZXIgYXQgdGhlIHNpemUgb2YgdGhlIGRyYXdlcgorICAgIEluc3RhbGxXaW5kb3dFdmVudEhhbmRsZXIoZHJhd2VyLCBkcmF3ZXJDYWxsYmFjaywgMSwgJnJlc2l6ZUV2ZW50LAorCQkJCQkJCQkgIE5VTEwsIE5VTEwpOworCisgICAgLy8gYWRkICJ0YWJzIiBjb2x1bW4gdG8gZGF0YSBicm93c2VyCisgICAgY29sRGVzYy5wcm9wZXJ0eURlc2MucHJvcGVydHlJRCA9IGtUYWJzQ29sdW1uOworICAgIGNvbERlc2MucHJvcGVydHlEZXNjLnByb3BlcnR5VHlwZSA9IGtEYXRhQnJvd3NlclRleHRUeXBlOworCisgICAgLy8gYWRkIGlmIGl0ZW1zIGNhbiBiZSBzZWxlY3RlZCAoPyk6IGtEYXRhQnJvd3Nlckxpc3RWaWV3U2VsZWN0aW9uQ29sdW1uCisgICAgY29sRGVzYy5wcm9wZXJ0eURlc2MucHJvcGVydHlGbGFncyA9IGtEYXRhQnJvd3NlckRlZmF1bHRQcm9wZXJ0eUZsYWdzOworCisgICAgY29sRGVzYy5oZWFkZXJCdG5EZXNjLnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMaXN0Vmlld0xhdGVzdEhlYWRlckRlc2M7CisgICAgY29sRGVzYy5oZWFkZXJCdG5EZXNjLm1pbmltdW1XaWR0aCA9IDEwMDsKKyAgICBjb2xEZXNjLmhlYWRlckJ0bkRlc2MubWF4aW11bVdpZHRoID0gMTUwOworICAgIGNvbERlc2MuaGVhZGVyQnRuRGVzYy50aXRsZU9mZnNldCA9IDA7CisgICAgY29sRGVzYy5oZWFkZXJCdG5EZXNjLnRpdGxlU3RyaW5nID0gQ0ZTVFIoIlRhYnMiKTsKKyAgICBjb2xEZXNjLmhlYWRlckJ0bkRlc2MuaW5pdGlhbE9yZGVyID0ga0RhdGFCcm93c2VyT3JkZXJJbmNyZWFzaW5nOworICAgIGNvbERlc2MuaGVhZGVyQnRuRGVzYy5idG5Gb250U3R5bGUuZmxhZ3MgPSAwOyAvLyB1c2UgZGVmYXVsdCBmb250CisgICAgY29sRGVzYy5oZWFkZXJCdG5EZXNjLmJ0bkNvbnRlbnRJbmZvLmNvbnRlbnRUeXBlID0ga0NvbnRyb2xDb250ZW50VGV4dE9ubHk7CisKKyAgICBBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKGRhdGFCcm93c2VyLCAmY29sRGVzYywgMCk7CisKKyAgICAvLyBjcmVhdGUgdGFibGluZSBwb3B1cCBtZW51IHJlcXVpcmVkIGJ5IHZpbSBkb2NzIChzZWUgOmhlIHRhYmxpbmUtbWVudSkKKyAgICBDcmVhdGVOZXdNZW51KGtUYWJDb250ZXh0TWVudUlkLCAwLCAmY29udGV4dE1lbnUpOworICAgIEFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhjb250ZXh0TWVudSwgQ0ZTVFIoIkNsb3NlIiksIDAsCisJCQkJCQkgICAgVEFCTElORV9NRU5VX0NMT1NFLCBOVUxMKTsKKyAgICBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoY29udGV4dE1lbnUsIENGU1RSKCJOZXcgVGFiIiksIDAsCisJCQkJCQkgICAgICBUQUJMSU5FX01FTlVfTkVXLCBOVUxMKTsKKyAgICBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoY29udGV4dE1lbnUsIENGU1RSKCJPcGVuIFRhYi4uLiIpLCAwLAorCQkJCQkJICAgICBUQUJMSU5FX01FTlVfT1BFTiwgTlVMTCk7Cit9CisKKworLyoKKyAqIFNob3cgb3IgaGlkZSB0aGUgdGFibGluZS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2hvd190YWJsaW5lKGludCBzaG93aXQpCit7CisgICAgaWYgKHNob3dpdCA9PSAwKQorICAgICAgICBDbG9zZURyYXdlcihkcmF3ZXIsIHRydWUpOworICAgIGVsc2UKKyAgICAgICAgT3BlbkRyYXdlcihkcmF3ZXIsIGtXaW5kb3dFZGdlUmlnaHQsIHRydWUpOworfQorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiB0YWJsaW5lIGlzIGRpc3BsYXllZC4KKyAqLworICAgIGludAorZ3VpX21jaF9zaG93aW5nX3RhYmxpbmUodm9pZCkKK3sKKyAgICBXaW5kb3dEcmF3ZXJTdGF0ZSBzdGF0ZSA9IEdldERyYXdlclN0YXRlKGRyYXdlcik7CisKKyAgICByZXR1cm4gc3RhdGUgPT0ga1dpbmRvd0RyYXdlck9wZW4gfHwgc3RhdGUgPT0ga1dpbmRvd0RyYXdlck9wZW5pbmc7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGxhYmVscyBvZiB0aGUgdGFibGluZS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfdXBkYXRlX3RhYmxpbmUodm9pZCkKK3sKKyAgICB0YWJwYWdlX1QJKnRwOworICAgIGludAkJbnVtVGFicyA9IGdldFRhYkNvdW50KCk7CisgICAgaW50CQluciA9IDE7CisgICAgaW50CQljdXJ0YWJpZHggPSAxOworCisgICAgLy8gYWRqdXN0IGRhdGEgYnJvd3NlcgorICAgIGlmICh0YWJMYWJlbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWJMYWJlbHNTaXplOyArK2kpCisgICAgICAgICAgICBDRlJlbGVhc2UodGFiTGFiZWxzW2ldKTsKKyAgICAgICAgZnJlZSh0YWJMYWJlbHMpOworICAgIH0KKyAgICB0YWJMYWJlbHMgPSAoQ0ZTdHJpbmdSZWYgKiltYWxsb2MobnVtVGFicyAqIHNpemVvZihDRlN0cmluZ1JlZikpOworICAgIHRhYkxhYmVsc1NpemUgPSBudW1UYWJzOworCisgICAgZm9yICh0cCA9IGZpcnN0X3RhYnBhZ2U7IHRwICE9IE5VTEw7IHRwID0gdHAtPnRwX25leHQsICsrbnIpCisgICAgeworCWlmICh0cCA9PSBjdXJ0YWIpCisJICAgIGN1cnRhYmlkeCA9IG5yOworICAgICAgICB0YWJMYWJlbHNbbnItMV0gPSBnZXRUYWJMYWJlbCh0cCk7CisgICAgfQorCisgICAgUmVtb3ZlRGF0YUJyb3dzZXJJdGVtcyhkYXRhQnJvd3Nlciwga0RhdGFCcm93c2VyTm9JdGVtLCAwLCBOVUxMLAorCQkJCQkJICBrRGF0YUJyb3dzZXJJdGVtTm9Qcm9wZXJ0eSk7CisgICAgLy8gZGF0YSBicm93c2VyIHVzZXMgaWRzIDEsIDIsIDMsIC4uLiBudW1UYWJzIHBlciBkZWZhdWx0LCBzbyB3ZQorICAgIC8vIGNhbiBwYXNzIE5VTEwgZm9yIHRoZSBpZCBhcnJheQorICAgIEFkZERhdGFCcm93c2VySXRlbXMoZGF0YUJyb3dzZXIsIGtEYXRhQnJvd3Nlck5vSXRlbSwgbnVtVGFicywgTlVMTCwKKwkJCQkJCSAga0RhdGFCcm93c2VySXRlbU5vUHJvcGVydHkpOworCisgICAgRGF0YUJyb3dzZXJJdGVtSUQgaXRlbSA9IGN1cnRhYmlkeDsKKyAgICBTZXREYXRhQnJvd3NlclNlbGVjdGVkSXRlbXMoZGF0YUJyb3dzZXIsIDEsICZpdGVtLCBrRGF0YUJyb3dzZXJJdGVtc0Fzc2lnbik7Cit9CisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgdGFiIHRvICJuciIuICBGaXJzdCB0YWIgaXMgMS4KKyAqLworICAgIHZvaWQKK2d1aV9tY2hfc2V0X2N1cnRhYihucikKKyAgICBpbnQJCW5yOworeworICAgIERhdGFCcm93c2VySXRlbUlEIGl0ZW0gPSBucjsKKyAgICBTZXREYXRhQnJvd3NlclNlbGVjdGVkSXRlbXMoZGF0YUJyb3dzZXIsIDEsICZpdGVtLCBrRGF0YUJyb3dzZXJJdGVtc0Fzc2lnbik7CisKKyAgICAvLyBUT0RPOiBjYWxsIHNvbWV0aGluZyBsaWtlIHRoaXM/OiAob3IgcmVzdG9yZSBzY3JvbGwgcG9zaXRpb24sIG9yLi4uKQorICAgIFJldmVhbERhdGFCcm93c2VySXRlbShkYXRhQnJvd3NlciwgaXRlbSwga1RhYnNDb2x1bW4sCisJCQkJCQkgICAgICBrRGF0YUJyb3dzZXJSZXZlYWxPbmx5KTsKK30KKworI2VuZGlmIC8vIEZFQVRfR1VJX1RBQkxJTkUKZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ndWlfbWFjLnBybyBiL3NyYy9wcm90by9ndWlfbWFjLnBybwppbmRleCBjOTQzYjA4Li4yOWFiOWQzIDEwMDY0NAotLS0gYS9zcmMvcHJvdG8vZ3VpX21hYy5wcm8KKysrIGIvc3JjL3Byb3RvL2d1aV9tYWMucHJvCkBAIC04NCw2ICs4NCwxMCBAQAogaW50IGd1aV9tY2hfZGlhbG9nIF9fQVJHUygoaW50IHR5cGUsIGNoYXJfdSAqdGl0bGUsIGNoYXJfdSAqbWVzc2FnZSwgY2hhcl91ICpidXR0b25zLCBpbnQgZGZsdGJ1dHRvbiwgY2hhcl91ICp0ZXh0ZmllbGQpKTsKIGNoYXJfdSAqZ3VpX21jaF9icm93c2UgX19BUkdTKChpbnQgc2F2aW5nLCBjaGFyX3UgKnRpdGxlLCBjaGFyX3UgKmRmbHQsIGNoYXJfdSAqZXh0LCBjaGFyX3UgKmluaXRkaXIsIGNoYXJfdSAqZmlsdGVyKSk7CiB2b2lkIGd1aV9tY2hfc2V0X2ZvcmVncm91bmQgX19BUkdTKCh2b2lkKSk7Cit2b2lkIGd1aV9tY2hfc2hvd190YWJsaW5lIF9fQVJHUygoaW50IHNob3dpdCkpOworaW50IGd1aV9tY2hfc2hvd2luZ190YWJsaW5lIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3VwZGF0ZV90YWJsaW5lIF9fQVJHUygodm9pZCkpOwordm9pZCBndWlfbWNoX3NldF9jdXJ0YWIgX19BUkdTKChpbnQgbnIpKTsKIAogY2hhcl91ICpDMlBhc2NhbF9zYXZlIF9fQVJHUygoY2hhcl91ICpDc3RyaW5nKSk7CiBjaGFyX3UgKkMyUGFzY2FsX3NhdmVfYW5kX3JlbW92ZV9iYWNrc2xhc2ggX19BUkdTKChjaGFyX3UgKkNzdHJpbmcpKTsKZGlmZiAtLWdpdCBhL3NyYy92ZXJzaW9uLmMgYi9zcmMvdmVyc2lvbi5jCmluZGV4IGQ3YzZiMjkuLjhmNGVhMjkgMTAwNjQ0Ci0tLSBhL3NyYy92ZXJzaW9uLmMKKysrIGIvc3JjL3ZlcnNpb24uYwpAQCAtNjY3LDYgKzY2Nyw4IEBACiBzdGF0aWMgaW50IGluY2x1ZGVkX3BhdGNoZXNbXSA9CiB7ICAgLyogQWRkIG5ldyBwYXRjaCBudW1iZXIgYmVsb3cgdGhpcyBsaW5lICovCiAvKiovCisgICAgMjMyLAorLyoqLwogICAgIDIzMSwKIC8qKi8KICAgICAyMzAsCg==