ZGlmZiAtLWdpdCBhL3N0ZC9yb29tL2tyYWV1dGVybGFkZW4uYyBiL3N0ZC9yb29tL2tyYWV1dGVybGFkZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjk5NzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3Jvb20va3JhZXV0ZXJsYWRlbi5jCkBAIC0wLDAgKzEsMTY3IEBACisvLyAoYykgMjAwMyBieSBQYWRyZWljIChwYWRyZWljQG1nLm11ZC5kZSkKKy8vIAorLy8gRXMga2FubiBiZXN0aW1tdGUgTGFlZGVuIHp1bSBIYW5kZWxuIHZvbiBLcmFldXRlcm4gZ2ViZW4uCisvLyBadW5hZWNoc3QgZWlubWFsIGdpYnQgZXMgZWluZW4gaW4gZGVyIER1bmtlbGVsZmVuZ2lsZGUuCisvLyBIaWVyIGtvZW5uZW4gS3JhZXV0ZXIgZ2UtIHVuZCB2ZXJrYXVmdCB3ZXJkZW4uCisvLyBHcnVuZHNhZXR6bGljaCBrYW5uIGVzIGJlbGllYmlnIHZpZWxlIGtyYWV1dGVya3VuZGlnZQorLy8gSGFlbmRsZXIgZ2ViZW4sIGVpbmUga3VyemUgQWJzcHJhY2hlIHdhZXJlIGplZG9jaCB2b24gVm9ydGVpbC4KKworLy8gRGVyIExhZGVuIGVyd2VpdGVydCBkaWUgcm9vbS9zaG9wIEZ1bmt0aW9uZW4uCisvLyBadXIgVmVyd2VuZHVuZyBtdXNzIGRpZXNlciBub2NoIG1pdCBlaW5lbSBzdGQvcm9vbSBrb21iaW5pZXJ0CisvLyB3ZXJkZW4uIERpZXMgZXJsYXVidCBkaWUgVmVyd2VuZHVuZyB2b24gZWlnZW5lbiBTdGFuZGFyZHJhZXVtZW4gb2RlcgorLy8gS29tYmluYXRpb24gbWl0IEtuZWlwZW4uCisKK2luaGVyaXQgIi9zdGQvcm9vbS9zaG9wIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPGl0ZW1zL2tyYWV1dGVyL2tyYWV1dGVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBGbGFnLCBkYXMgaW0gcmVzZXQoKSBkYXMgU3BlaWNoZXJuIGF1c2xvZXN0LCB3ZW5uIGVzIGdlc2V0enQgaXN0Lgorc3RhdGljICBpbnQgbmVlZF9zYXZlOyAgCitzdGF0aWMgIGludCBiYXNpc3ZhbHVlPTQwMDsgLy8gZ2lidCBkZW4gX0R1cmNoc2Nobml0dHN3ZXJ0XyBlaW5lcyBLcmF1dHMgYW4KK3N0YXRpYyAgaW50IG1heHZhbHVlPTEwMDAwOyAvLyBiZXN0aW1tdCBkZW4gbWF4LiBXZXJ0IGFsbGVyIEtyYWV1dGVyCisKKy8vIEVudGhhZWx0IGZ1ZXIgamVkZSBQbGFudElEIGVpbmVuIFphZWhsZXIsIGRlciBhbmdpYnQsIHdpZXZpZWwgdm9uIGRlbQorLy8gamV3ZWlsaWdlbiBLcmF1dCB2ZXJrYXVmdCB3dXJkZS4KKy8vIHByaXZhdGUgaW50ICpjb3VudD0oe30pOworCisvLyBTdW1tZSB1ZWJlciBhbGxlIEVpbnRyYWVnZSBpbiBjb3VudAorLy8gcHJpdmF0ZSBpbnQgc3VtOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBpZiAob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSkgPT0gX19GSUxFX19bMC4uPDNdKQorICB7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9CVVlfT05MWV9QTEFOVFMsMSk7CisgIC8qCisgIHNldGV1aWQoZ2V0dWlkKCkpOyAvLyB3aXJkIHp1bSBzcGVpY2hlcm4gYmVu9nRpZ3QKKyAgaW50IHNpPXNpemVvZihjb3VudCk7CisgIC8vIGZ1ZXIgamVkZSBQbGFudElEIGVpbmVuIEVpbnRyYWcgYW5sZWdlbiwgZC5oLiB3ZW5uIGluIGNvdW50IG5vY2gKKyAgLy8gbmljaHQgZ2VudWcgdm9yaGFuZGVuIHNpbmQsIHdlcmRlbiBmZWhsZW5kZSBFaW50cmFlZ2UgZXJnYWVuenQuCisgIGlmIChzaTxQTEFOVENPVU5UKSAKKyAgICBjb3VudD1jb3VudCthbGxvY2F0ZShQTEFOVENPVU5ULXNpKTsKKyAgKi8KK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlX3N1cGVyKCkKK3sKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCitzdGF0aWMgc3RyaW5nIHNlbGxfb2JqX29ubHlfcGxhbnRzKG9iamVjdCBvYiwgaW50IHNob3J0KQoreworICAgaWYgKCFJU19QTEFOVChvYikpCisgICAgICByZXR1cm4gIlR1dCBtaXIgbGVpZCwgZGFtaXQga2FubiBpY2ggbmljaHRzIGFuZmFuZ2VuLiI7CisgICAvLyBlcyB3ZXJkZW4gbnVyIEtyYWV1dGVyIGFuZ2VrYXVmdCwgZGllIGxlZ2FsIGdlY2xvbnQgd3VyZGVuLAorICAgLy8gZC5oLiBpbSBlbnRzcHJlY2hlbmRlbiBNYXN0ZXIgb3JkZW50bGljaCBlaW5nZXRyYWdlbiB3dXJkZW4hCisgICBpZiAob2ItPlF1ZXJ5UGxhbnRJZCgpPD0wKQorICAgICAgcmV0dXJuIG9iLT5OYW1lKFdFUiwgMikrIiBpc3QgaWxsZWdhbCBhdWYgZGllIFdlbHQgZ2Vrb21tZW4uIEljaCBkYXJmICIKKyAgICAgICAgICAgICtvYi0+UXVlcnlQcm9ub3VuKFdFTikrIiBsZWlkZXIgbmljaHQgYW5uZWhtZW4uIjsKKyAgIHJldHVybiA6OnNlbGxfb2JqKG9iLCBzaG9ydCk7Cit9CisKK3N0YXRpYyBzdHJpbmcgc2VsbF9vYmoob2JqZWN0IG9iLCBpbnQgc2hvcnQpCit7CisgICAvLyBlcyB3ZXJkZW4gbnVyIEtyYWV1dGVyIGFuZ2VrYXVmdCwgZGllIGxlZ2FsIGdlY2xvbnQgd3VyZGVuLAorICAgLy8gZC5oLiBpbSBlbnRzcHJlY2hlbmRlbiBNYXN0ZXIgb3JkZW50bGljaCBlaW5nZXRyYWdlbiB3dXJkZW4hCisgIGlmIChJU19QTEFOVChvYikgJiYgb2ItPlF1ZXJ5UGxhbnRJZCgpPD0wKQorICAgIHJldHVybiAiSG0sICIrb2ItPk5hbWUoV0VSLCAyKSsiIHN0YW1tdCBhYmVyIGF1cyBlaW5lciBzZWhyIGR1Ymlvc2VuICIKKyAgICAgICJRdWVsbGUuIEljaCBrYW5uICIrb2ItPlF1ZXJ5UHJvbm91bihXRU4pKyIgbGVpZGVyIG5pY2h0IGFubmVobWVuLiI7CisgIGlmIChRdWVyeVByb3AoUF9CVVlfT05MWV9QTEFOVFMpKQorICAgIHJldHVybiBzZWxsX29ial9vbmx5X3BsYW50cyhvYiwgc2hvcnQpOworICByZXR1cm4gOjpzZWxsX29iaihvYixzaG9ydCk7Cit9CisKKy8qCit2b2lkIHJlc2V0KCkKK3sKKyAgOjpyZXNldCgpOworICAvLyBEYXRlbiBzaW5kIG5pY2h0IHNvb28gd2ljaHRpZywgYWxzIGRhcyBiZWkgamVkZXIgQWVuZGVydW5nCisgIC8vIGdlc2F2ZXQgd2VyZGVuIG11ZXNzdGUuIERhaGVyIG51biBpbSByZXNldCBzcGVpY2hlcm4uCisgIGlmIChuZWVkX3NhdmUpIHsKKyAgICAvLyBiYXNpc3ZhbHVlL1BMQU5UQ09VTlQ6IER1cmNoc2Nobml0dHN3ZXJ0IGVpbmVzIGVpbnplbG5lbiBLcmF1dHMKKyAgICAvLyBzdW0gKyBQTEFOVENPVU5UOiBHZXNhbXR6YWhsIHZlcmthdWZ0ZXIgcGx1cyBaYWhsIGV4aXN0aWVyZW5kZXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICBLcmFldXRlcgorICAgIC8vIFdlbm4gYWxzbyBkZXIgV2VydCBhbGwgZGllc2VyIEtyYWV1dGVyID4gMTBrIGlzdCwgd2lyZCBqZWRlcgorICAgIC8vIEVpbnplbHphZWhsZXIgYXVmIDkwJSBnZXN0dXR6dCwgZGFtaXQgZGllIFdlcnRlIG5pY2h0IGlucyBVZmVybG9zZQorICAgIC8vIHN0ZWlnZW4uCisgICAgaWYgKCgoc3VtK1BMQU5UQ09VTlQpKmJhc2lzdmFsdWUvUExBTlRDT1VOVCk+bWF4dmFsdWUpIHsKKyAgICAgIGludCBpLCBuZXdzdW07CisgICAgICBmb3IgKGk9c2l6ZW9mKGNvdW50KS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgY291bnRbaV0gPSBjb3VudFtpXSo5LzEwOworICAgICAgICBuZXdzdW0rPWNvdW50W2ldOworICAgICAgfQorICAgICAgc3VtPW5ld3N1bTsKKyAgICB9CisgICAgbmVlZF9zYXZlPTA7CisgIH0KK30KKworLy8gQWt0dWFsaXNpZXJ0IGRlbiBEYXRlbmJlc3RhbmQgYmVpbSBLYXVmZW4gb2RlciBWZXJrYXVmZW4gZWluZXMgT2JqZWt0cwordm9pZCBVcGRhdGVDb3VudGVyKG9iamVjdCBvYiwgaW50IG51bSkKK3sKKyAgIGludCBpZD1vYi0+UXVlcnlQbGFudElkKCk7CisgICBpZiAoaWQ+MCAmJiBpc19wbGFudChvYikpIHsKKyAgICAgIC8vIEthdWYgb2RlciBWZXJrYXVmIHZvbiBLcmFldXRlcm4sIHZlcmFlbmRlcnQgZGVuIFdlcnQgZGVyCisgICAgICAvLyBLcmFldXRlcgorICAgICAgLy8gWmFlaGxlciBpbiBkZXIgTGlzdGUgaG9jaHphZWhsZW4KKyAgICAgIGNvdW50W2lkXSs9bnVtOworICAgICAgaWYgKGNvdW50W2lkXTwwKSBjb3VudFtpZF09MDsgLy8gZGFyZiBhYmVyIGFuc2ljaCBuaWNoIHBhc3NpZXJlbgorICAgICAgLy8gR2VzYW10c3VtbWUgYWt0dWFsaXNpZXJlbgorICAgICAgc3VtKz1udW07CisgICAgICBuZWVkX3NhdmU9MTsKKyAgIH0KKyAgIDo6VXBkYXRlQ291bnRlcihvYiwgbnVtKTsKK30KKworLy8gRGllIFByZWlzZSBkaWUgaGllciBpbSBMYWJvciBmdWVyIEtyYWV1dGVyIGdlemFobHQgdW5kIHZlcmxhbmd0CisvLyB3ZXJkZW4sIHNpbmQgbmljaHQgZml4IHNvbmRlcm4gaGFlbmdlbiB2b24gQW5nZWJvdCB1bmQgTmFjaGZyYWdlIGFiLgorLy8gSGllciB3ZWlzcyBtYW4gdWViZXIgZGVuIHdhaHJlbiBXZXJ0IGRlciBlaW56ZWxuZW4gS3JhZXV0ZXIgYmVzY2hlaWQuCitzdGF0aWMgaW50IHJlYWxWYWx1ZShvYmplY3Qgb2IsIG9iamVjdCBwbGF5ZXIpCit7CisgICAvLyBQcmVpc2UgZnVlciBub3JtYWxlIEd1ZXRlciBnYW56IG5vcm1hbC4uLgorICAgaWYgKCFpc19wbGFudChvYikpCisgICAgICAgcmV0dXJuIG9iLT5RdWVyeVByb3AoUF9WQUxVRSk7CisKKyAgIC8vIGplZGUgS3JhZXV0ZXJrYXRlZ29yaWUgYmVrb21tdCBkZW4gZ2xlaWNoZW4gV2VydCB6dWdld2llc2VuLiAgIAorICAgLy8gdmFsIGVudHNwcmljaHQgZGVtIGFrdHVlbGxlbiAiRHVyY2hzY2huaXR0c3dlcnQiIGVpbmVzIEtyYXV0ZXMKKyAgIGludCB2YWw9KHN1bStQTEFOVENPVU5UKSpiYXNpc3ZhbHVlL1BMQU5UQ09VTlQ7CisKKyAgIC8vIGFiZXIgZGllc2VyIFdlcnQgdmVydGVpbHQgc2ljaCBhdWYgdW50ZXJzY2hpZWRsaWNoIHZpZWxlIEtyYWV1dGVyCisgICAvLyAoQU46IERpZXNlciBLb21tZW50YXIgZXJzY2hsaWVzc3Qgc2ljaCBtaXIgbmljaHQuKQorICAgaW50IGlkPW9iLT5RdWVyeVBsYW50SWQoKTsKKyAgIGlmIChpZDw9MCkgcmV0dXJuIDA7IC8vIGlsbGVnYWwgZ2VjbG9udCAtPiB3ZXJ0bG9zCisgICAvLyBnZ2YuIGRpZSBaYWVobGVybGlzdGUgdW0gZGllIGZlaGxlbmRlbiBFaW50cmFlZ2UgZXJ3ZWl0ZXJuLgorICAgaWYgKChpZC0xKT5zaXplb2YoY291bnQpKSAKKyAgICAgY291bnQ9Y291bnQrYWxsb2NhdGUoaWQtMS1zaXplb2YoY291bnQpKTsKKyAgIAorICAgLy8gIm1pdHRsZXJlbiBXZXJ0IiBkZXMgYWJnZWZyYWd0ZW4gS3JhdXRlcyBlcnJlY2huZW4gKERpdmlzaW9uIGR1cmNoCisgICAvLyBkZXNzZW4gdW1nZXNldHp0ZSBBbnphaGwpCisgICB2YWw9dmFsLyhjb3VudFtpZF0rMSk7CisgICAKKyAgIC8vIFdlcnQgcnVuZGVuIGF1ZiBuYWVjaHN0bmllZHJpZ2VyZW4gZ2xhdHQgZHVyY2ggMTAgdGVpbGJhcmVuIFdlcnQuCisgICByZXR1cm4gdmFsLXZhbCUxMDsgCit9CisKKy8vIGdpYnQgZGVuIFByZWlzIHp1cvxjaywgZGVyIHp1bSBBbmthdWYgZGVzIE9iamVrdGVzIHZlcndlbmRldCB3ZXJkZW4gc29sbAorc3RhdGljIHZhcmFyZ3MgaW50IFF1ZXJ5VmFsdWUob2JqZWN0IG9iLCBpbnQgdmFsdWUsIG9iamVjdCBwbGF5ZXIpCit7CisgICByZXR1cm4gOjpRdWVyeVZhbHVlKG9iLCByZWFsVmFsdWUob2IsIHBsYXllciksIHBsYXllcik7Cit9CisKKy8vIGdpYnQgZGVuIFByZWlzIGFuLCB6dSBkZW0gZGFzIE9iamVrdCB2ZXJrYXVmdCB3ZXJkZW4gc29sbC4KK3N0YXRpYyB2YXJhcmdzIGludCBRdWVyeUJ1eVZhbHVlKG1peGVkIG9iLCBvYmplY3QgcGxheWVyKQoreworICAgaWYgKG9iamVjdHAob2IpKQorICAgICAgcmV0dXJuIChyZWFsVmFsdWUob2IsIHBsYXllcikqUXVlcnlCdXlGYWN0KHBsYXllcikgKyA1MCkvMTAwOworICAgLy8gZml4ZWQgT2JqZWt0ZS4uLgorICAgcmV0dXJuIDo6UXVlcnlCdXlWYWx1ZShvYiwgcGxheWVyKTsKK30KKyovCg==