ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggMzlkNDRmYy4uNjc3YmJiMCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTIwLDcgKzIwLDcgQEAKIAogLlBIT05ZOiBjbGVhbiBkaXN0Y2xlYW4gYmFzZWxpbmUgYmxvYXRjaGVjayBpbnN0YWxsIGluc3RhbGxfZmxhdCBcCiAJdWluc3RhbGwgdW5pbnN0YWxsX2ZsYXQgdGVzdCB0ZXN0cyBoZWxwIHRveWJveF9zdHVmZiBjaGFuZ2UgXAotCXdvcmtpbmcgcGVuZGluZworCWxpc3QgbGlzdF93b3JraW5nIGxpc3RfcGVuZGluZwogCiBpbmNsdWRlIGtjb25maWcvTWFrZWZpbGUKIC1pbmNsdWRlIC5zaW5nbGVtYWtlCkBAIC02NiwxMiArNjYsMTQgQEAKIGhlbHA6OgogCUBlY2hvICAnICB0b3lib3ggICAgICAgICAgLSBCdWlsZCB0b3lib3guJwogCUBlY2hvICAnICBDT01NQU5ETkFNRSAgICAgLSBCdWlsZCBpbmRpdmlkdWFsIHRveWJveCBjb21tYW5kIGFzIGEgc3RhbmRhbG9uZSBiaW5hcnkuJwotCUBlY2hvICAnICB3b3JraW5nICAgICAgICAgLSBMaXN0IHdvcmtpbmcgQ09NTUFORE5BTUVzLicKLQlAZWNobyAgJyAgcGVuZGluZyAgICAgICAgIC0gTGlzdCBwZW5kaW5nICh1bmZpbmlzaGVkKSBDT01NQU5ETkFNRXMuJworCUBlY2hvICAnICBsaXN0ICAgICAgICAgICAgLSBMaXN0IENPTU1BTkROQU1FcyAoYWxzbyBsaXN0X3dvcmtpbmcgYW5kIGxpc3RfcGVuZGluZykuJwogCUBlY2hvICAnICBjaGFuZ2UgICAgICAgICAgLSBCdWlsZCBlYWNoIGNvbW1hbmQgc3RhbmRhbG9uZSB1bmRlciBjaGFuZ2UvLicKIAlAZWNobyAgJyAgYmFzZWxpbmUgICAgICAgIC0gQ3JlYXRlIHRveWJveF9vbGQgZm9yIHVzZSBieSBibG9hdGNoZWNrLicKIAlAZWNobyAgJyAgYmxvYXRjaGVjayAgICAgIC0gUmVwb3J0IHNpemUgZGlmZmVyZW5jZXMgYmV0d2VlbiBvbGQgYW5kIGN1cnJlbnQgdmVyc2lvbnMnCi0JQGVjaG8gICcgIHRlc3QgICAgICAgICAgICAtIFJ1biB0ZXN0IHN1aXRlIGFnYWluc3QgY29tcGlsZWQgY29tbWFuZHMuJworCUBlY2hvICAnICB0ZXN0X0NPTU1BTkQgICAgLSBSdW4gdGVzdHMgZm9yIENPTU1BTkQgKHRlc3RfcHMsIHRlc3RfY2F0LCBldGMuKQorCUBlY2hvICAnICB0ZXN0ICAgICAgICAgICAgLSBSdW4gdGVzdCBzdWl0ZSBhZ2FpbnN0IGFsbCBjb21waWxlZCBjb21tYW5kcy4nCisJQGVjaG8gICcgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBURVNUX0hPU1Q9MSB0byB0ZXN0IGhvc3QgY29tbWFuZCwgVkVSQk9TRT0xJworCUBlY2hvICAnICAgICAgICAgICAgICAgICAgICB0byBzaG93IGRpZmYsIFZFUkJPU0U9ZmFpbCB0byBzdG9wIGFmdGVyIGZpcnN0IGZhaWx1cmUuJwogCUBlY2hvICAnICBjbGVhbiAgICAgICAgICAgLSBEZWxldGUgdGVtcG9yYXJ5IGZpbGVzLicKIAlAZWNobyAgIiAgZGlzdGNsZWFuICAgICAgIC0gRGVsZXRlIGV2ZXJ5dGhpbmcgdGhhdCBpc24ndCBzaGlwcGVkLiIKIAlAZWNobyAgJyAgaW5zdGFsbF9mbGF0ICAgIC0gSW5zdGFsbCB0b3lib3ggaW50byAkJFBSRUZJWCBkaXJlY3RvcnkuJwpkaWZmIC0tZ2l0IGEvbGliL2xpYi5jIGIvbGliL2xpYi5jCmluZGV4IDY4MWQ0ZDIuLjQzZGIyZTMgMTAwNjQ0Ci0tLSBhL2xpYi9saWIuYworKysgYi9saWIvbGliLmMKQEAgLTQ3NSwxMiArNDc1LDEyIEBACiAgICAgcmJ1ZiA9IGJ1ZitybGVuOwogICAgIGxlbiAtPSBybGVuOwogICB9Ci0gICpwbGVuID0gbGVuID0gcmxlbisoYnVmLWlidWYpOworICAqcGxlbiA9IGxlbiA9IHJsZW4rKHJidWYtYnVmKTsKICAgY2xvc2UoZmQpOwogCiAgIGlmIChybGVuPDApIHsKICAgICBpZiAoaWJ1ZiAhPSBidWYpIGZyZWUoYnVmKTsKLSAgICBidWYgPSAgMDsKKyAgICBidWYgPSAwOwogICB9IGVsc2UgYnVmW2xlbl0gPSAwOwogCiAgIHJldHVybiBidWY7CkBAIC01MDgsOCArNTA4LDcgQEAKICAgY2hhciAqYyA9IHB0cjsKICAgaW50IGk7CiAKLSAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKSByZXQgfD0gKChpbnQ2NF90KWNbaV0pPDxpOwotCisgIGZvciAoaT0wOyBpPHNpemU7IGkrKykgcmV0IHw9ICgoaW50NjRfdCljW2ldKTw8KGkqOCk7CiAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTUxNyw5ICs1MTYsOSBAQAogewogICBpbnQ2NF90IHJldCA9IDA7CiAgIGNoYXIgKmMgPSBwdHI7CisgIGludCBpOwogCi0gIHdoaWxlIChzaXplLS0pIHJldCA9IChyZXQ8PDgpfGNbc2l6ZV07Ci0KKyAgZm9yIChpPTA7IGk8c2l6ZTsgaSsrKSByZXQgPSAocmV0PDw4KXwoY1tpXSYweGZmKTsKICAgcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL3BvcnRhYmlsaXR5LmggYi9saWIvcG9ydGFiaWxpdHkuaAppbmRleCA1M2IwODcwLi5kMGQwYmQ5IDEwMDY0NAotLS0gYS9saWIvcG9ydGFiaWxpdHkuaAorKysgYi9saWIvcG9ydGFiaWxpdHkuaApAQCAtNDEsNiArNDEsMTAgQEAKICNkZWZpbmUgQVRfUkVNT1ZFRElSIDB4MjAwCiAjZW5kaWYKIAorI2lmbmRlZiBSTElNSVRfUlRUSU1FCisjZGVmaW5lIFJMSU1JVF9SVFRJTUUgMTUKKyNlbmRpZgorCiAvLyBXZSBkb24ndCBkZWZpbmUgR05VX2RhbW1pdCBiZWNhdXNlIHdlJ3JlIG5vdCBwYXJ0IG9mIHRoZSBnbnUgcHJvamVjdCwgYW5kCiAvLyBkb24ndCB3YW50IHRvIGdldCBhbnkgRlNGIG9uIHVzLiBVbmZvcnR1bmF0ZWx5IGdsaWJjIChnbnUgbGliYykKIC8vIHdvbid0IGdpdmUgdXMgTGludXggc3lzY2FsbCB3cmFwcGVycyB3aXRob3V0IGNsYWltaW5nIHRvIGJlIHBhcnQgb2YgdGhlCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmNvbmZpZy5zaCBiL3NjcmlwdHMvZ2VuY29uZmlnLnNoCmluZGV4IGU1M2QzNjAuLjViMDcxNWYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvZ2VuY29uZmlnLnNoCisrKyBiL3NjcmlwdHMvZ2VuY29uZmlnLnNoCkBAIC0xMjMsNyArMTIzLDcgQEAKICMgRmluZCBuYW1lcyBvZiBjb21tYW5kcyB0aGF0IGNhbiBiZSBidWlsdCBzdGFuZGFsb25lIGluIHRoZXNlIEMgZmlsZXMKIHRveXMoKQogewotICBncmVwICdUT1koLiopJyAiJEAiIHwgZ3JlcCAtdiBUT1lGTEFHX05PRk9SSyB8IFwKKyAgZ3JlcCAnVE9ZKC4qKScgIiRAIiB8IGdyZXAgLXYgVE9ZRkxBR19OT0ZPUksgfCBncmVwIC12ICIwKSkiIHwgXAogICAgIHNlZCAtcm4gJ3MvKFteOl0qKTouKihPTER8TkVXKVRPWVwoICooW2EtekEtWl1bXixdKikgKiwuKi9cMTpcMy9wJwogfQogCkBAIC0xMzUsMTMgKzEzNSwxNiBAQAogICBbICIkTkFNRSIgPT0gaGVscCBdICYmIGNvbnRpbnVlCiAgIFsgIiROQU1FIiA9PSBpbnN0YWxsIF0gJiYgY29udGludWUKICAgZWNobyAtZSAiJE5BTUU6ICRGSUxFICouW2NoXSBsaWIvKi5bY2hdXG5cdHNjcmlwdHMvc2luZ2xlLnNoICROQU1FXG4iCisgIGVjaG8gLWUgInRlc3RfJE5BTUU6XG5cdHNjcmlwdHMvdGVzdC5zaCAkTkFNRVxuIgogICBbICIke0ZJTEUvcGVuZGluZy8vfSIgIT0gIiRGSUxFIiBdICYmCiAgICAgUEVORElORz0iJFBFTkRJTkcgJE5BTUUiIHx8CiAgICAgV09SS0lORz0iJFdPUktJTkcgJE5BTUUiCiBkb25lID4gLnNpbmdsZW1ha2UgJiYKIGVjaG8gLWUgImNsZWFuOjpcblx0cm0gLWYgJFdPUktJTkcgJFBFTkRJTkciID4+IC5zaW5nbGVtYWtlICYmCi1lY2hvIC1lICJ3b3JraW5nOlxuXHRAZWNobyAkKGVjaG8gJFdPUktJTkcgfCB0ciAnICcgJ1xuJyB8IHNvcnQgfCB4YXJncykiIFwKK2VjaG8gLWUgImxpc3Q6XG5cdEBlY2hvICQoZWNobyAkV09SS0lORyAkUEVORElORyB8IHRyICcgJyAnXG4nIHwgc29ydCB8IHhhcmdzKSJcCiAgID4+IC5zaW5nbGVtYWtlICYmCi1lY2hvIC1lICJwZW5kaW5nOlxuXHRAZWNobyAkKGVjaG8gJFBFTkRJTkcgfCB0ciAnICcgJ1xuJyB8IHNvcnQgfCB4YXJncykiIFwKK2VjaG8gLWUgImxpc3Rfd29ya2luZzpcblx0QGVjaG8gJChlY2hvICRXT1JLSU5HIHwgdHIgJyAnICdcbicgfCBzb3J0IHwgeGFyZ3MpIiBcCisgID4+IC5zaW5nbGVtYWtlICYmCitlY2hvIC1lICJsaXN0X3BlbmRpbmc6XG5cdEBlY2hvICQoZWNobyAkUEVORElORyB8IHRyICcgJyAnXG4nIHwgc29ydCB8IHhhcmdzKSIgXAogICA+PiAuc2luZ2xlbWFrZQogKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvdXRmOC9iYWQudHh0IGIvdGVzdHMvZmlsZXMvdXRmOC9iYWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTFlOGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy91dGY4L2JhZC50eHQKQEAgLTAsMCArMSBAQAorAcHvv78KZGlmZiAtLWdpdCBhL3Rlc3RzL3NlZC50ZXN0IGIvdGVzdHMvc2VkLnRlc3QKaW5kZXggZWZmMjMwNi4uYzYyZjljNCAxMDA3NTUKLS0tIGEvdGVzdHMvc2VkLnRlc3QKKysrIGIvdGVzdHMvc2VkLnRlc3QKQEAgLTEzMSwxMCArMTMxLDEzIEBACiAKIHRlc3RpbmcgIiIgInNlZCAtZSAnL3gvY1wnIC1lICd5JyIgJ3lcbicgJycgJ3hcbicKIHRlc3RpbmcgIiIgInNlZCAtZSAncy9hWyhbXSpiL1gvJyIgJ1gnICcnICdhWyhiJwordGVzdGluZyAiIiAic2VkICd5L2FcXGJjL2RlXGYvJyIgImRiXGYiICIiICJhYmMiCit0ZXN0aW5nICJzZWQgW2EtYV0gKGZvciBwZXJsKSIgInNlZCAnIidzL1woW15hLXpBLVowLTkuOl9cLVwvXVwpL1xcXDEvZyciJyIgXAorICAnaGVcIGxsbycgIiIgImhlIGxsbyIKIAogIyBZb3UgaGF2ZSB0byBtYXRjaCB0aGUgZmlyc3QgbGluZSBvZiBhIHJhbmdlIGluIG9yZGVyIHRvIGFjdGl2YXRlCiAjIHRoZSByYW5nZSwgbnVtZXJpYyBhbmQgYXNjaWkgd29yayB0aGUgc2FtZSB3YXkKLXRlc3RpbmcgInNraXAgc3RhcnQgb2YgcmFuZ2UiICJzZWQgLWUgbiAtZSAnMSwycy9iL2MvJyIgImFcbmJcbiIgIiIgImFcbmJcbiIKK3Rlc3RpbmcgInNlZCBza2lwIHN0YXJ0IG9mIHJhbmdlIiAic2VkIC1lIG4gLWUgJzEsMnMvYi9jLyciICJhXG5iXG4iICIiICJhXG5iXG4iCiAKICNlY2hvIG1lZXAgfCBzZWQvc2VkIC1lICcxYVwnIC1lICdodWgnCiAjZWNobyBibGFoIHwgc2VkL3NlZCAtZiA8KGVjaG8gLWUgIjFhXFxcXFxuYm9vbSIpCkBAIC0xNDYsNCArMTQ5LDUgQEAKICAgImhlbGxvXG5sIHhcbmFiXG5jXG4iICIiICJoZWxsb1xuIgogIyAtaSB3aXRoICQgbGFzdCBsaW5lIHRlc3QKIAorCiBleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzL3h4ZC50ZXN0IGIvdGVzdHMveHhkLnRlc3QKaW5kZXggZTAzNjg2NS4uNjhmNTJiZSAxMDA2NDQKLS0tIGEvdGVzdHMveHhkLnRlc3QKKysrIGIvdGVzdHMveHhkLnRlc3QKQEAgLTI1LDQgKzI1LDIzIEBACiB0ZXN0aW5nICJ4eGQgLWMgOCAtZyAzIGZpbGUxIiAieHhkIC1jIDggLWcgMyBmaWxlMSIgXAogICAgICIwMDAwMDAwMDogNzQ2ODY5IDczMjA2OSA3MzIwIHRoaXMgaXMgXG4wMDAwMDAwODogNzM2ZjZkIDY1MjA3NCA2NTc4IHNvbWUgdGV4XG4wMDAwMDAxMDogNzQwYSAgICAgICAgICAgICAgIHQuXG4iICIiICIiCiAKK3Rlc3RpbmcgInh4ZCAtcCIgInh4ZCAtcCBmaWxlMSIgIjc0Njg2OTczMjA2OTczMjA3MzZmNmQ2NTIwNzQ2NTc4NzQwYVxuIiAiIiAiIgorCit0ZXN0aW5nICJ4eGQgLXIiICJ4eGQgZmlsZTEgfCB4eGQgLXIiICJ0aGlzIGlzIHNvbWUgdGV4dFxuIiAiIiAiIgordGVzdGluZyAieHhkIC1yIC1wIiAieHhkIC1wIGZpbGUxIHwgeHhkIC1yIC1wIiAidGhpcyBpcyBzb21lIHRleHRcbiIgIiIgIiIKKwordGVzdGluZyAieHhkIC1yIGdhcmJhZ2UiICJlY2hvICcwMDAwOiA2OCA2NSA2YzZjIDZmeHh4eCcgfCB4eGQgLXIgLSIgImhlbGxvIiAiIiAiIgorCisjIC1yIHdpbGwgb25seSByZWFkIC1jIGJ5dGVzIChkZWZhdWx0IDE2KSBiZWZvcmUgc2tpcHBpbmcgdG8gdGhlIG5leHQgbGluZSwKKyMgaWdub3JpbmcgdGhlIHJlc3QuCit0ZXN0aW5nICJ4eGQgLXIgbG9uZyIgXAorICAgICJlY2hvICcwMDAwOiA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MCcgfCB4eGQgLXIgLSIgXAorICAgICJAQEBAQEBAQEBAQEBAQEBAIiAiIiAiIgorCisjIC1yIC1wIGlnbm9yZXMgdGhlIHVzdWFsIC1wIDMwLWJ5dGUvbGluZSBsaW1pdCAob3IgYW55IGxpbWl0IHNldCBieSAtYykgYW5kCisjIHdpbGwgdGFrZSBhcyBtYW55IGJ5dGVzIGFzIHlvdSBnaXZlIGl0LgordGVzdGluZyAieHhkIC1yIC1wIGxvbmciIFwKKyAgICAiZWNobyAnNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDA0MDQwNDAnIHwgeHhkIC1yIC1wIC0iIFwKKyAgICAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCIgIiIgIiIKKwogcm0gZmlsZTEgZmlsZTIKZGlmZiAtLWdpdCBhL3RveXMvYW5kcm9pZC9nZXRwcm9wLmMgYi90b3lzL2FuZHJvaWQvZ2V0cHJvcC5jCmluZGV4IDRhZmFjMWEuLmVmYjFlNDQgMTAwNjQ0Ci0tLSBhL3RveXMvYW5kcm9pZC9nZXRwcm9wLmMKKysrIGIvdG95cy9hbmRyb2lkL2dldHByb3AuYwpAQCAtMiw3ICsyLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKLVVTRV9HRVRQUk9QKE5FV1RPWShnZXRwcm9wLCAiPjIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQorVVNFX0dFVFBST1AoTkVXVE9ZKGdldHByb3AsICI+MloiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX1NCSU4pKQogCiBjb25maWcgR0VUUFJPUAogICBib29sICJnZXRwcm9wIgpAQCAtMjEsMzIgKzIxLDg1IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CisjaW5jbHVkZSA8c2VsaW51eC9sYWJlbC5oPgorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorCiBHTE9CQUxTKAogICBzaXplX3Qgc2l6ZTsKICAgY2hhciAqKm52OyAvLyBuYW1lL3ZhbHVlIHBhaXJzOiBldmVuPW5hbWUsIG9kZD12YWx1ZQorICBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmhhbmRsZTsKICkKIAorc3RhdGljIGNoYXIgKmdldF9wcm9wZXJ0eV9jb250ZXh0KGNoYXIgKnByb3BlcnR5KQoreworICBjaGFyICpjb250ZXh0ID0gTlVMTDsKKworICBpZiAoc2VsYWJlbF9sb29rdXAoVFQuaGFuZGxlLCAmY29udGV4dCwgcHJvcGVydHksIDEpKSB7CisgICAgcGVycm9yX2V4aXQoInVuYWJsZSB0byBsb29rdXAgbGFiZWwgZm9yIFwiJXNcIiIsIHByb3BlcnR5KTsKKyAgfQorICByZXR1cm4gY29udGV4dDsKK30KKwogc3RhdGljIHZvaWQgYWRkX3Byb3BlcnR5KGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCB2b2lkICp1bnVzZWQpCiB7CiAgIGlmICghKFRULnNpemUmMzEpKSBUVC5udiA9IHhyZWFsbG9jKFRULm52LCAoVFQuc2l6ZSszMikqMipzaXplb2YoY2hhciAqKSk7CiAKICAgVFQubnZbMipUVC5zaXplXSA9IHhzdHJkdXAobmFtZSk7Ci0gIFRULm52WzErMipUVC5zaXplKytdID0geHN0cmR1cCh2YWx1ZSk7CisgIGlmICh0b3lzLm9wdGZsYWdzICYgRkxBR19aKSB7CisgICAgVFQubnZbMSsyKlRULnNpemUrK10gPSBnZXRfcHJvcGVydHlfY29udGV4dChuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBUVC5udlsxKzIqVFQuc2l6ZSsrXSA9IHhzdHJkdXAodmFsdWUpOworICB9Cit9CisKKy8vIE5lZWRlZCB0byBzdXByZXNzIGV4dHJhbmVvdXMgIkxvYWRlZCBwcm9wZXJ0eV9jb250ZXh0cyBmcm9tIiBtZXNzYWdlCitpbnQgc2VsaW51eF9sb2dfY2FsbGJhY2soaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisKKyAgaWYgKHR5cGUgPT0gU0VMSU5VWF9JTkZPKSByZXR1cm4gMDsKKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIHZlcnJvcl9tc2coZm10LCAwLCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiAwOwogfQogCiB2b2lkIGdldHByb3BfbWFpbih2b2lkKQogeworICBpZiAodG95cy5vcHRmbGFncyAmIEZMQUdfWikgeworICAgIHVuaW9uIHNlbGludXhfY2FsbGJhY2sgY2I7CisKKyAgICBjYi5mdW5jX2xvZyA9IHNlbGludXhfbG9nX2NhbGxiYWNrOworICAgIHNlbGludXhfc2V0X2NhbGxiYWNrKFNFTElOVVhfQ0JfTE9HLCBjYik7CisgICAgVFQuaGFuZGxlID0gc2VsaW51eF9hbmRyb2lkX3Byb3BfY29udGV4dF9oYW5kbGUoKTsKKyAgICBpZiAoIVRULmhhbmRsZSkgZXJyb3JfZXhpdCgidW5hYmxlIHRvIGdldCBzZWxpbnV4IHByb3BlcnR5IGNvbnRleHQgaGFuZGxlIik7CisgIH0KKwogICBpZiAoKnRveXMub3B0YXJncykgewotICAgIHByb3BlcnR5X2dldCgqdG95cy5vcHRhcmdzLCB0b3lidWYsIHRveXMub3B0YXJnc1sxXSA/IHRveXMub3B0YXJnc1sxXSA6ICIiKTsKLSAgICBwdXRzKHRveWJ1Zik7CisgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX1opIHsKKyAgICAgIGNoYXIgKmNvbnRleHQgPSBnZXRfcHJvcGVydHlfY29udGV4dCgqdG95cy5vcHRhcmdzKTsKKworICAgICAgcHV0cyhjb250ZXh0KTsKKyAgICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoY29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3BlcnR5X2dldCgqdG95cy5vcHRhcmdzLCB0b3lidWYsIHRveXMub3B0YXJnc1sxXSA/IHRveXMub3B0YXJnc1sxXSA6ICIiKTsKKyAgICAgIHB1dHModG95YnVmKTsKKyAgICB9CiAgIH0gZWxzZSB7CiAgICAgc2l6ZV90IGk7CiAKICAgICBpZiAocHJvcGVydHlfbGlzdCgodm9pZCAqKWFkZF9wcm9wZXJ0eSwgMCkpIGVycm9yX2V4aXQoInByb3BlcnR5X2xpc3QiKTsKICAgICBxc29ydChUVC5udiwgVFQuc2l6ZSwgMipzaXplb2YoY2hhciAqKSwgcXN0cmNtcCk7CiAgICAgZm9yIChpID0gMDsgaTxUVC5zaXplOyBpKyspIHByaW50ZigiWyVzXTogWyVzXVxuIiwgVFQubnZbaSoyXSxUVC5udlsxK2kqMl0pOwotICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoVFQubnYpOworICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGk8VFQuc2l6ZTsgaSsrKSB7CisgICAgICAgIGZyZWUoVFQubnZbaSoyXSk7CisgICAgICAgIGZyZWUoVFQubnZbMStpKjJdKTsKKyAgICAgIH0KKyAgICAgIGZyZWUoVFQubnYpOworICAgIH0KICAgfQorICBpZiAoQ0ZHX1RPWUJPWF9GUkVFICYmICh0b3lzLm9wdGZsYWdzICYgRkxBR19aKSkgc2VsYWJlbF9jbG9zZShUVC5oYW5kbGUpOwogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvdG95cy9sc2IvbW91bnQuYyBiL3RveXMvbHNiL21vdW50LmMKaW5kZXggNzg5ZDlhNS4uOTUxMGM1ZSAxMDA2NDQKLS0tIGEvdG95cy9sc2IvbW91bnQuYworKysgYi90b3lzL2xzYi9tb3VudC5jCkBAIC05MSw2ICs5MSw3IEBACiAgICAgeyJub2V4ZWMiLCBNU19OT0VYRUN9LCB7ImV4ZWMiLCB+TVNfTk9FWEVDfSwKICAgICB7InN5bmMiLCBNU19TWU5DSFJPTk9VU30sIHsiYXN5bmMiLCB+TVNfU1lOQ0hST05PVVN9LAogICAgIHsibm9hdGltZSIsIE1TX05PQVRJTUV9LCB7ImF0aW1lIiwgfk1TX05PQVRJTUV9LAorICAgIHsibm9yZWxhdGltZSIsIH5NU19SRUxBVElNRX0sIHsicmVsYXRpbWUiLCBNU19SRUxBVElNRX0sCiAgICAgeyJub2RpcmF0aW1lIiwgTVNfTk9ESVJBVElNRX0sIHsiZGlyYXRpbWUiLCB+TVNfTk9ESVJBVElNRX0sCiAgICAgeyJsb3VkIiwgfk1TX1NJTEVOVH0sCiAgICAgeyJzaGFyZWQiLCBNU19TSEFSRUR9LCB7InJzaGFyZWQiLCBNU19TSEFSRUR8TVNfUkVDfSwKQEAgLTE5NSwxNiArMTk2LDIxIEBACiAgICAgICBwcmludGYoInRyeSAnJXMnIHR5cGUgJyVzJyBvbiAnJXMnXG4iLCBkZXYsIHR5cGUsIGRpcik7CiAgICAgZm9yICg7OykgewogICAgICAgcmMgPSBtb3VudChkZXYsIGRpciwgdHlwZSwgZmxhZ3MsIG9wdHMpOwotICAgICAgaWYgKChyYyAhPSBFQUNDRVMgJiYgcmMgIT0gRVJPRlMpIHx8IChmbGFncyAmIE1TX1JET05MWSkpIGJyZWFrOwotICAgICAgaWYgKHJjID09IEVST0ZTICYmIGZkID09IC0xKSB7CisgICAgICAvLyBEaWQgd2Ugc3VjY2VlZCwgZmFpbCB1bnJlY292ZXJhYmx5LCBvciBhbHJlYWR5IHRyeSByZWFkLW9ubHk/CisgICAgICBpZiAocmMgPT0gMCB8fCAoZXJybm8gIT0gRUFDQ0VTICYmIGVycm5vICE9IEVST0ZTKSB8fCAoZmxhZ3MmTVNfUkRPTkxZKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBJZiB3ZSBoYXZlbid0IGFscmVhZHkgdHJpZWQgaXQsIHVzZSB0aGUgQkxLUk9TRVQgaW9jdGwgdG8gZW5zdXJlCisgICAgICAvLyB0aGF0IHRoZSB1bmRlcmx5aW5nIGRldmljZSBpc24ndCByZWFkLW9ubHkuCisgICAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgaWYgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3YpCisgICAgICAgICAgcHJpbnRmKCJ0cnlpbmcgQkxLUk9TRVQgaW9jdGwgb24gJyVzJ1xuIiwgZGV2KTsKICAgICAgICAgaWYgKC0xICE9IChmZCA9IG9wZW4oZGV2LCBPX1JET05MWSkpKSB7Ci0gICAgICAgICAgaW9jdGwoZmQsIEJMS1JPU0VULCAmcm8pOworICAgICAgICAgIHJjID0gaW9jdGwoZmQsIEJMS1JPU0VULCAmcm8pOwogICAgICAgICAgIGNsb3NlKGZkKTsKLQotICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGlmIChyYyA9PSAwKSBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZnByaW50ZihzdGRlcnIsICInJXMnIGlzIHJlYWQtb25seSIsIGRldik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiclcycgaXMgcmVhZC1vbmx5XG4iLCBkZXYpOwogICAgICAgZmxhZ3MgfD0gTVNfUkRPTkxZOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdG95cy9vdGhlci9oZXhlZGl0LmMgYi90b3lzL290aGVyL2hleGVkaXQuYwppbmRleCBmZjEzYjUxLi5hOWQ5N2FhIDEwMDY0NAotLS0gYS90b3lzL290aGVyL2hleGVkaXQuYworKysgYi90b3lzL290aGVyL2hleGVkaXQuYwpAQCAtMTIsOSArMTIsMTYgQEAKICAgaGVscAogICAgIHVzYWdlOiBoZXhlZGl0IEZJTEVOQU1FCiAKLSAgICBIZXhhZGVjaW1hbCBmaWxlIGVkaXRvci4KKyAgICBIZXhhZGVjaW1hbCBmaWxlIGVkaXRvci4gQWxsIGNoYW5nZXMgYXJlIHdyaXR0ZW4gdG8gZGlzayBpbW1lZGlhdGVseS4KIAogICAgIC1yCVJlYWQgb25seSAoZGlzcGxheSBidXQgZG9uJ3QgZWRpdCkKKworICAgIEtleXM6CisgICAgQXJyb3dzICAgICAgICBNb3ZlIGxlZnQvcmlnaHQvdXAvZG93biBieSBvbmUgbGluZS9jb2x1bW4KKyAgICBQZyBVcC9QZyBEbiAgIE1vdmUgdXAvZG93biBieSBvbmUgcGFnZQorICAgIDAtOSwgYS1mICAgICAgQ2hhbmdlIGN1cnJlbnQgaGFsZi1ieXRlIHRvIGhleGFkZWNpbWFsIHZhbHVlCisgICAgdSAgICAgICAgICAgICBVbmRvCisgICAgcS9eYy9eZC88ZXNjPiBRdWl0CiAqLwogCiAjZGVmaW5lIEZPUl9oZXhlZGl0CmRpZmYgLS1naXQgYS90b3lzL290aGVyL2luc21vZC5jIGIvdG95cy9vdGhlci9pbnNtb2QuYwppbmRleCBjYjIyMmE1Li4wOThkMmNmIDEwMDY0NAotLS0gYS90b3lzL290aGVyL2luc21vZC5jCisrKyBiL3RveXMvb3RoZXIvaW5zbW9kLmMKQEAgLTE2LDMxICsxNiwzNSBAQAogI2luY2x1ZGUgInRveXMuaCIKIAogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jZGVmaW5lIGluaXRfbW9kdWxlKG1vZCwgbGVuLCBvcHRzKSBzeXNjYWxsKF9fTlJfaW5pdF9tb2R1bGUsIG1vZCwgbGVuLCBvcHRzKQorI2RlZmluZSBmaW5pdF9tb2R1bGUoZmQsIG9wdHMsIGZsYWdzKSBzeXNjYWxsKFNZU19maW5pdF9tb2R1bGUsIGZkLCBvcHRzLCBmbGFncykKKyNkZWZpbmUgaW5pdF9tb2R1bGUobW9kLCBsZW4sIG9wdHMpIHN5c2NhbGwoU1lTX2luaXRfbW9kdWxlLCBtb2QsIGxlbiwgb3B0cykKIAogdm9pZCBpbnNtb2RfbWFpbih2b2lkKQogewotICBjaGFyICogYnVmID0gTlVMTDsKLSAgaW50IGxlbiwgcmVzLCBpOwotICBpbnQgZmQgPSB4b3BlbigqdG95cy5vcHRhcmdzLCBPX1JET05MWSk7Ci0KLSAgbGVuID0gZmRsZW5ndGgoZmQpOwotICBidWYgPSB4bWFsbG9jKGxlbik7Ci0gIHhyZWFkYWxsKGZkLCBidWYsIGxlbik7CisgIGludCBmZCA9ICFzdHJjbXAoKnRveXMub3B0YXJncywgIi0iKSA/IDAgOiB4b3BlbigqdG95cy5vcHRhcmdzLCBPX1JET05MWSk7CisgIGludCBpLCByYzsKIAogICBpID0gMTsKLSAgd2hpbGUodG95cy5vcHRhcmdzW2ldICYmCisgIHdoaWxlICh0b3lzLm9wdGFyZ3NbaV0gJiYKICAgICBzdHJsZW4odG95YnVmKSArIHN0cmxlbih0b3lzLm9wdGFyZ3NbaV0pICsgMiA8IHNpemVvZih0b3lidWYpKQogICB7CiAgICAgc3RyY2F0KHRveWJ1ZiwgdG95cy5vcHRhcmdzW2krK10pOwogICAgIHN0cmNhdCh0b3lidWYsICIgIik7CiAgIH0KIAotICByZXMgPSBpbml0X21vZHVsZShidWYsIGxlbiwgdG95YnVmKTsKLSAgaWYgKENGR19UT1lCT1hfRlJFRSkgewotICAgIGlmIChidWYgIT0gdG95YnVmKSBmcmVlKGJ1Zik7Ci0gICAgY2xvc2UoZmQpOworICAvLyBmaW5pdF9tb2R1bGUgd2FzIG5ldyBpbiBMaW51eCAzLjgsIGFuZCBkb2Vzbid0IHdvcmsgb24gc3RkaW4sCisgIC8vIHNvIHdlIGZhbGwgYmFjayB0byBpbml0X21vZHVsZSBpZiBuZWNlc3NhcnkuCisgIHJjID0gZmluaXRfbW9kdWxlKGZkLCB0b3lidWYsIDApOworICBpZiAocmMgJiYgKGZkID09IDAgfHwgZXJybm8gPT0gRU5PU1lTKSkgeworICAgIG9mZl90IGxlbiA9IDA7CisgICAgY2hhciAqcGF0aCA9ICFzdHJjbXAoKnRveXMub3B0YXJncywgIi0iKSA/ICIvZGV2L3N0ZGluIiA6ICp0b3lzLm9wdGFyZ3M7CisgICAgY2hhciAqYnVmID0gcmVhZGZpbGVhdChBVF9GRENXRCwgcGF0aCwgTlVMTCwgJmxlbik7CisKKyAgICByYyA9IGluaXRfbW9kdWxlKGJ1ZiwgbGVuLCB0b3lidWYpOworICAgIGlmIChDRkdfVE9ZQk9YX0ZSRUUpIGZyZWUoYnVmKTsKICAgfQogCi0gIGlmIChyZXMpIHBlcnJvcl9leGl0KCJmYWlsZWQgdG8gbG9hZCAlcyIsIHRveXMub3B0YXJnc1swXSk7CisgIGlmIChyYykgcGVycm9yX2V4aXQoImZhaWxlZCB0byBsb2FkICVzIiwgdG95cy5vcHRhcmdzWzBdKTsKKworICBpZiAoQ0ZHX1RPWUJPWF9GUkVFKSBjbG9zZShmZCk7CiB9CmRpZmYgLS1naXQgYS90b3lzL290aGVyL3h4ZC5jIGIvdG95cy9vdGhlci94eGQuYwppbmRleCBlOWFkODM5Li4wMjUwZjhmIDEwMDY0NAotLS0gYS90b3lzL290aGVyL3h4ZC5jCisrKyBiL3RveXMvb3RoZXIveHhkLmMKQEAgLTgsMTMgKzgsMTMgQEAKICAqIFRPRE86IHN1cHBvcnQgZm9yIHJldmVyc2luZyBhIGhleGR1bXAgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCBkYXRhLgogICogVE9ETzogLXMgc2VlawogCi1VU0VfWFhEKE5FV1RPWSh4eGQsICI+MWMjPDE+NDA5Nj0xNmwjZyM8MT0yIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQorVVNFX1hYRChORVdUT1koeHhkLCAiPjFjIzwxPjQwOTY9MTZsI2cjPDE9MnByIiwgVE9ZRkxBR19VU1J8VE9ZRkxBR19CSU4pKQogCiBjb25maWcgWFhECiAgIGJvb2wgInh4ZCIKICAgZGVmYXVsdCB5CiAgIGhlbHAKLSAgICB1c2FnZTogeHhkIFstYyBuXSBbLWcgbl0gWy1sIG5dIFtmaWxlXQorICAgIHVzYWdlOiB4eGQgWy1jIG5dIFstZyBuXSBbLWwgbl0gWy1wXSBbLXJdIFtmaWxlXQogCiAgICAgSGV4ZHVtcCBhIGZpbGUgdG8gc3Rkb3V0LiAgSWYgbm8gZmlsZSBpcyBsaXN0ZWQsIGNvcHkgZnJvbSBzdGRpbi4KICAgICBGaWxlbmFtZSAiLSIgaXMgYSBzeW5vbnltIGZvciBzdGRpbi4KQEAgLTIyLDYgKzIyLDggQEAKICAgICAtYyBuCVNob3cgbiBieXRlcyBwZXIgbGluZSAoZGVmYXVsdCAxNikuCiAgICAgLWcgbglHcm91cCBieXRlcyBieSBhZGRpbmcgYSAnICcgZXZlcnkgbiBieXRlcyAoZGVmYXVsdCAyKS4KICAgICAtbCBuCUxpbWl0IG9mIG4gYnl0ZXMgYmVmb3JlIHN0b3BwaW5nIChkZWZhdWx0IGlzIG5vIGxpbWl0KS4KKyAgICAtcAlQbGFpbiBoZXhkdW1wICgzMCBieXRlcy9saW5lLCBubyBncm91cGluZykuCisgICAgLXIJUmV2ZXJzZSBvcGVyYXRpb246IHR1cm4gYSBoZXhkdW1wIGludG8gYSBiaW5hcnkgZmlsZS4KICovCiAKICNkZWZpbmUgRk9SX3h4ZApAQCAtMzksNyArNDEsNyBAQAogICBpbnQgaSwgbGVuLCBzcGFjZTsKIAogICB3aGlsZSAoMDwobGVuID0gcmVhZGFsbChmZCwgdG95YnVmLCAoVFQubCAmJiBUVC5sLXBvczxUVC5jKT9UVC5sLXBvczpUVC5jKSkpIHsKLSAgICBwcmludGYoIiUwOGxseDogIiwgcG9zKTsKKyAgICBpZiAoISh0b3lzLm9wdGZsYWdzJkZMQUdfcCkpIHByaW50ZigiJTA4bGx4OiAiLCBwb3MpOwogICAgIHBvcyArPSBsZW47CiAgICAgc3BhY2UgPSAyKlRULmMrVFQuYy9UVC5nKzE7CiAKQEAgLTUxLDE1ICs1Myw3OSBAQAogICAgICAgfQogICAgIH0KIAotICAgIHByaW50ZigiJSpzIiwgc3BhY2UsICIiKTsKLSAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykKLSAgICAgIHB1dGNoYXIoKHRveWJ1ZltpXT49JyAnICYmIHRveWJ1ZltpXTw9J34nKSA/IHRveWJ1ZltpXSA6ICcuJyk7CisgICAgaWYgKCEodG95cy5vcHRmbGFncyZGTEFHX3ApKSB7CisgICAgICBwcmludGYoIiUqcyIsIHNwYWNlLCAiIik7CisgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykKKyAgICAgICAgcHV0Y2hhcigodG95YnVmW2ldPj0nICcgJiYgdG95YnVmW2ldPD0nficpID8gdG95YnVmW2ldIDogJy4nKTsKKyAgICB9CiAgICAgcHV0Y2hhcignXG4nKTsKICAgfQogICBpZiAobGVuPDApIHBlcnJvcl9leGl0KCJyZWFkIik7CiB9CiAKK3N0YXRpYyBpbnQgZGVoZXgoY2hhciBjaCkKK3sKKyAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHJldHVybiBjaCAtICcwJzsKKyAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHJldHVybiBjaCAtICdhJyArIDEwOworICBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisgIHJldHVybiAoY2ggPT0gJ1xuJykgPyAtMiA6IC0xOworfQorCitzdGF0aWMgdm9pZCBkb194eGRfcmV2ZXJzZShpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIEZJTEUgKmZwID0geGZkb3BlbihmZCwgInIiKTsKKworICB3aGlsZSAoIWZlb2YoZnApKSB7CisgICAgaW50IGNvbCA9IDA7CisgICAgaW50IHRtcDsKKworICAgIC8vIEVhY2ggbGluZSBvZiBhIG5vbi1wbGFpbiBoZXhkdW1wIHN0YXJ0cyB3aXRoIGFuIG9mZnNldC9hZGRyZXNzLgorICAgIGlmICghKHRveXMub3B0ZmxhZ3MmRkxBR19wKSkgeworICAgICAgbG9uZyBsb25nIHBvczsKKworICAgICAgaWYgKGZzY2FuZihmcCwgIiVsbHg6ICIsICZwb3MpID09IDEpIHsKKyAgICAgICAgaWYgKGZzZWVrKHN0ZG91dCwgcG9zLCBTRUVLX1NFVCkgIT0gMCkgeworICAgICAgICAgIC8vIFRPRE86IGp1c3Qgd3JpdGUgb3V0IHplcm9zIGlmIG5vbi1zZWVrYWJsZT8KKyAgICAgICAgICBwZXJyb3JfZXhpdCgiJXM6IHNlZWsgZmFpbGVkIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBIHBsYWluIGhleGR1bXAgY2FuIGhhdmUgYXMgbWFueSBieXRlcyBwZXIgbGluZSBhcyB5b3UgbGlrZSwKKyAgICAvLyBidXQgYSBub24tcGxhaW4gaGV4ZHVtcCBhc3N1bWVzIGdhcmJhZ2UgYWZ0ZXIgaXQncyBzZWVuIHRoZQorICAgIC8vIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCisgICAgd2hpbGUgKHRveXMub3B0ZmxhZ3MmRkxBR19wIHx8IGNvbCA8IFRULmMpIHsKKyAgICAgIGludCBuMSwgbjI7CisKKyAgICAgIC8vIElmIHdlJ3JlIGF0IEVPRiBvciBFT0wgb3Igd2UgcmVhZCBzb21lIG5vbi1oZXguLi4KKyAgICAgIGlmICgobjEgPSBuMiA9IGRlaGV4KGZnZXRjKGZwKSkpIDwgMCB8fCAobjIgPSBkZWhleChmZ2V0YyhmcCkpKSA8IDApIHsKKyAgICAgICAgLy8gSWYgd2UncmUgYXQgRU9MLCBzdGFydCBvbiB0aGF0IGxpbmUuCisgICAgICAgIGlmIChuMSA9PSAtMiB8fCBuMiA9PSAtMikgY29udGludWU7CisgICAgICAgIC8vIE90aGVyd2lzZSwgc2tpcCB0byB0aGUgbmV4dCBsaW5lLgorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZnB1dGMoKG4xIDw8IDQpIHwgKG4yICYgMHhmKSwgc3Rkb3V0KTsKKyAgICAgIGNvbCsrOworCisgICAgICAvLyBJcyB0aGVyZSBhbnkgZ3JvdXBpbmcgZ29pbmcgb24/IElnbm9yZSBhIHNpbmdsZSBzcGFjZS4KKyAgICAgIHRtcCA9IGZnZXRjKGZwKTsKKyAgICAgIGlmICh0bXAgIT0gJyAnKSB1bmdldGModG1wLCBmcCk7CisgICAgfQorCisgICAgLy8gU2tpcCBhbnl0aGluZyBlbHNlIG9uIHRoaXMgbGluZSAoc3VjaCBhcyB0aGUgQVNDSUkgZHVtcCkuCisgICAgd2hpbGUgKCh0bXAgPSBmZ2V0YyhmcCkpICE9IEVPRiAmJiB0bXAgIT0gJ1xuJykKKyAgICAgIDsKKyAgfQorICBpZiAoZmVycm9yKGZwKSkgcGVycm9yX21zZ19yYXcobmFtZSk7CisKKyAgZmNsb3NlKGZwKTsKK30KKwogdm9pZCB4eGRfbWFpbih2b2lkKQogewotICBsb29wZmlsZXModG95cy5vcHRhcmdzLCBkb194eGQpOworICAvLyBQbGFpbiBzdHlsZSBpcyAzMCBieXRlcy9saW5lLCBubyBncm91cGluZy4KKyAgaWYgKHRveXMub3B0ZmxhZ3MmRkxBR19wKSBUVC5jID0gVFQuZyA9IDMwOworCisgIGxvb3BmaWxlcyh0b3lzLm9wdGFyZ3MsIHRveXMub3B0ZmxhZ3MmRkxBR19yID8gZG9feHhkX3JldmVyc2UgOiBkb194eGQpOwogfQpkaWZmIC0tZ2l0IGEvdG95cy9wZW5kaW5nL2ZpbGUuYyBiL3RveXMvcGVuZGluZy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwOTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3RveXMvcGVuZGluZy9maWxlLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qIGZpbGUuYyAtIGRlc2NyaWJlIGZpbGUgdHlwZQorICoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBTZWUgaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2ZpbGUuaHRtbAorICoKKyAqIFRPRE86IGFyCisKK1VTRV9GSUxFKE5FV1RPWShmaWxlLCAiPDEiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBGSUxFCisgIGJvb2wgImZpbGUiCisgIGRlZmF1bHQgbgorICBoZWxwCisgICAgdXNhZ2U6IGZpbGUgW2ZpbGUuLi5dCisKKyAgICBFeGFtaW5lIHRoZSBnaXZlbiBmaWxlcyBhbmQgZGVzY3JpYmUgdGhlaXIgY29udGVudCB0eXBlcy4KKyovCisKKyNkZWZpbmUgRk9SX2ZpbGUKKyNpbmNsdWRlICJ0b3lzLmgiCisKK0dMT0JBTFMoCisgIGludCBtYXhfbmFtZV9sZW47CispCisKKy8vIFdlIGRvbid0IHRydXN0IGVsZi5oIHRvIGJlIHRoZXJlLCBhbmQgdHdvIGNvZGVwYXRocyBmb3IgMzIvNjQgaXMgYXdrd2FyZAorLy8gYW55d2F5LCBzbyBjYWxjdWxhdGUgc3RydWN0IG9mZnNldHMgbWFudWFsbHkuIChJdCdzIGEgZml4ZWQgQUJJLikKK3N0YXRpYyB2b2lkIGRvX2VsZl9maWxlKGludCBmZCkKK3sKKyAgaW50IGVuZGlhbiA9IHRveWJ1Zls1XSwgYml0cyA9IHRveWJ1Zls0XSwgaSwgajsKKyAgaW50NjRfdCAoKmVsZl9pbnQpKHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkgPSBwZWVrX2xlOworICAvLyBWYWx1ZXMgZnJvbSBpbmNsdWRlL2xpbnV4L2VsZi1lbS5oIChwbHVzIGFyY2gvKi9pbmNsdWRlL2FzbS9lbGYuaCkKKyAgLy8gTmFtZXMgYXJlIGxpbnV4L2FyY2gvIGRpcmVjdG9yeSBuYW1lCisgIHN0cnVjdCB7aW50IHZhbDsgY2hhciAqbmFtZTt9IHR5cGVbXSA9IHt7MHg5MDI2LCAiYWxwaGEifSwKKyAgICB7NDAsICJhcm0ifSwgezE4MywgImFybSJ9LCB7MHgxOGFkLCAiYXZyMzIifSwgezEwNiwgImJsYWNrZmluIn0sCisgICAgezc2LCAiY3JpcyJ9LCB7MHg1NDQxLCAiZnJ2In0sIHs0NiwgImg4MzAwIn0sIHs1MCwgImlhNjQifSwvL2lhIGludGVsIGZ0YWdobgorICAgIHs4OCwgIm0zMnIifSwgezQsICJtNjhrIn0sIHsweGJhYWIsICJtaWNyb2JsYXplIn0sIHs4LCAibWlwcyJ9LAorICAgIHsxMCwgIm1pcHMifSwgezg5LCAibW4xMDMwMCJ9LCB7MTUsICJwYXJpc2MifSwgezIyLCAiczM5MCJ9LAorICAgIHsxMzUsICJzY29yZSJ9LCB7NDIsICJzaCJ9LCB7MiwgInNwYXJjIn0sIHsxOCwgInNwYXJjIn0sIHs0MywgInNwYXJjIn0sCisgICAgezE4NywgInRpbGUifSwgezE4OCwgInRpbGUifSwgezE5MSwgInRpbGUifSwgezMsICJ4ODYifSwgezYsICJ4ODYifSwKKyAgICB7NjIsICJ4ODYifSwgezk0LCAieHRlbnNhIn0sIHsweGFiYzcsICJ4dGVuc2EifX07CisKKyAgeHByaW50ZigiRUxGICIpOworCisgIC8vICI2NC1iaXQiCisgIGlmIChiaXRzID09IDEpIHhwcmludGYoIjMyLWJpdCAiKTsKKyAgZWxzZSBpZiAoYml0cyA9PSAyKSB4cHJpbnRmKCI2NC1iaXQgIik7CisgIGVsc2UgeworICAgIHhwcmludGYoIihiYWQgY2xhc3MgJWQpICIsIGJpdHMpOworICAgIGJpdHMgPSAwOworICB9CisKKyAgLy8gZV9tYWNoaW5lLCBhbGEgIng4NiIsIGZyb20gYmlnIHRhYmxlIGFib3ZlCisgIGogPSBlbGZfaW50KHRveWJ1ZisxOCwgMik7CisgIGZvciAoaSA9IDA7IGk8QVJSQVlfTEVOKHR5cGUpOyBpKyspIGlmIChqPT10eXBlW2ldLnZhbCkgYnJlYWs7CisgIGlmIChpPEFSUkFZX0xFTih0eXBlKSkgeHByaW50ZigiJXMgIiwgdHlwZVtpXS5uYW1lKTsKKyAgZWxzZSB4cHJpbnRmKCIodW5rbm93biBhcmNoICVkKSAiLCBqKTsKKworICAvLyAiTFNCIgorICBpZiAoZW5kaWFuID09IDEpIHhwcmludGYoIkxTQiAiKTsKKyAgZWxzZSBpZiAoZW5kaWFuID09IDIpIHsKKyAgICB4cHJpbnRmKCJNU0IgIik7CisgICAgZWxmX2ludCA9IHBlZWtfYmU7CisgIH0gZWxzZSB7CisgICAgeHByaW50ZigiKGJhZCBlbmRpYW4gJWQpXG4iLCBlbmRpYW4pOworICAgIGVuZGlhbiA9IDA7CisgIH0KKworICAvLyAiLCBleGVjdXRhYmxlIgorICBpID0gZWxmX2ludCh0b3lidWYrMTYsIDIpOworICBpZiAoaSA9PSAxKSB4cHJpbnRmKCJyZWxvY2F0YWJsZSIpOworICBlbHNlIGlmIChpID09IDIpIHhwcmludGYoImV4ZWN1dGFibGUiKTsKKyAgZWxzZSBpZiAoaSA9PSAzKSB4cHJpbnRmKCJzaGFyZWQgb2JqZWN0Iik7CisgIGVsc2UgaWYgKGkgPT0gNCkgeHByaW50ZigiY29yZSBkdW1wIik7CisgIGVsc2UgeHByaW50ZigiKGJhZCB0eXBlICVkKSIsIGkpOworCisgIGJpdHMtLTsKKyAgLy8gSWYgd2Uga25vdyBvdXIgYml0cyBhbmQgZW5kaWFubmVzcyBhbmQgcGhlbnRzaXplIGFncmVlcyBzaG93IGR5bmFtaWMgbGlua2VyCisgIGlmICgoYml0cyYxKT09Yml0cyAmJiBlbmRpYW4gJiYKKyAgICAgIChpID0gZWxmX2ludCh0b3lidWYrNDIrMTIqYml0cywgMikpID09IDMyKzI0KmJpdHMpCisgIHsKKyAgICBjaGFyICptYXAsICpwaGRyOworICAgIGludCBwaHNpemUgPSBpLCBwaG51bSA9IGVsZl9pbnQodG95YnVmKzQ0KzEyKmJpdHMsIDIpLAorICAgICAgICBwc3ogPSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpLCBsaWIgPSAwOworICAgIG9mZl90IHBob2ZmID0gZWxmX2ludCh0b3lidWYrMjgrNCpiaXRzLCA0KzQqYml0cyksCisgICAgICAgICAgbWFwb2ZmID0gcGhvZmZeKHBob2ZmJihwc3otMSkpOworCisgICAgLy8gbWFwIGVfcGhlbnRzaXplKmVfcGhudW0gYnl0ZXMgYXQgZV9waG9mZgorICAgIG1hcCA9IG1tYXAoMCwgcGhzaXplKnBobnVtLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCBtYXBvZmYpOworICAgIGlmIChtYXApIHsKKyAgICAgIC8vIEZpbmQgUFRfSU5URVJQIGVudHJ5LiAoTm90OiBmaWVsZHMgZ290IHJlb3JkZXJlZCBmb3IgNjQgYml0KQorICAgICAgZm9yIChpID0gMDsgaTxwaG51bTsgaSsrKSB7CisgICAgICAgIGxvbmcgbG9uZyBkbHBvcywgZGxsZW47CisKKyAgICAgICAgLy8gc2tpcCBub24tUFRfSU5URVJQIGVudHJpZXMKKyAgICAgICAgaiA9IGVsZl9pbnQocGhkciA9IG1hcCsocGhvZmYtbWFwb2ZmKStpKnBoc2l6ZSwgNCk7CisgICAgICAgIGlmIChqPT0yKSBsaWIrKzsKKyAgICAgICAgaWYgKGohPTMpIGNvbnRpbnVlOworCisgICAgICAgIC8vIFJlYWQgcF9vZmZzZXQgYW5kIHBfZmlsZXN6CisgICAgICAgIGogPSBiaXRzKzE7CisgICAgICAgIGRscG9zID0gZWxmX2ludChwaGRyKzQqaiwgNCpqKTsKKyAgICAgICAgZGxsZW4gPSBlbGZfaW50KHBoZHIrMTYqaiwgNCpqKTsKKyAgICAgICAgaWYgKGRsbGVuPDAgfHwgZGxsZW4+c2l6ZW9mKHRveWJ1ZiktMTI4CisgICAgICAgICAgICB8fCBkbHBvcyE9bHNlZWsoZmQsIGRscG9zLCBTRUVLX1NFVCkKKyAgICAgICAgICAgIHx8IGRsbGVuIT1yZWFkYWxsKGZkLCB0b3lidWYrMTI4LCBkbGxlbikpIGJyZWFrOworICAgICAgICBwcmludGYoIiwgZHluYW1pYyAoJS4qcykiLCAoaW50KWRsbGVuLCB0b3lidWYrMTI4KTsKKyAgICAgIH0KKyAgICAgIGlmICghbGliKSBwcmludGYoIiwgc3RhdGljIik7CisgICAgICBlbHNlIHByaW50ZigiLCBuZWVkcyAlZCBsaWIlcyIsIGxpYiwgbGliPjEgPyAicyIgOiAiIik7CisgICAgICBtdW5tYXAobWFwLCBwaHNpemUqcGhudW0pOworICAgIH0KKyAgfQorCisgIC8vIFRPRE86IHdlJ2QgbmVlZCB0byBhY3R1YWxseSBwYXJzZSB0aGUgRUxGIGZpbGUgdG8gcmVwb3J0IHRoZSByZXN0Li4uCisgIC8vICIsIGR5bmFtaWNhbGx5IGxpbmtlZCIKKyAgLy8gIiAodXNlcyBzaGFyZWQgbGlicykiCisgIC8vICIsIGZvciBMaW51eCAyLjYuMjQiCisgIC8vICIsIEJ1aWxkSURbc2hhMV09U0hBIgorICAvLyAiLCBzdHJpcHBlZCIKKyAgeHB1dGMoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3JlZ3VsYXJfZmlsZShpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKnM7CisgIGludCBsZW4gPSByZWFkKGZkLCBzID0gdG95YnVmLCBzaXplb2YodG95YnVmKS0yNTYpOworCisgIGlmIChsZW48MCkgcGVycm9yX21zZygiJXMiLCBuYW1lKTsKKworICBpZiAobGVuPjQwICYmIHN0cnN0YXJ0KCZzLCAiXDE3N0VMRiIpKSBkb19lbGZfZmlsZShmZCk7CisgIGVsc2UgaWYgKGxlbj4yOCAmJiBzdHJzdGFydCgmcywgIlx4ODlQTkdceDBkXHgwYVx4MWFceDBhIikpIHsKKyAgICAvLyBQTkcgaXMgYmlnLWVuZGlhbjogaHR0cHM6Ly93d3cudzMub3JnL1RSL1BORy8jN0ludGVnZXJzLWFuZC1ieXRlLW9yZGVyCisgICAgaW50IGNodW5rX2xlbmd0aCA9IHBlZWtfYmUocywgNCk7CisKKyAgICB4cHJpbnRmKCJQTkcgaW1hZ2UgZGF0YSIpOworCisgICAgLy8gVGhlIElIRFIgY2h1bmsgY29tZXMgZmlyc3Q6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9QTkcvIzExSUhEUgorICAgIHMgKz0gNDsKKyAgICBpZiAoY2h1bmtfbGVuZ3RoID09IDEzICYmIHN0cnN0YXJ0KCZzLCAiSUhEUiIpKSB7CisgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvUE5HLyM2Q29sb3VyLXZhbHVlcworICAgICAgY2hhciAqYyA9IDAsICpjb2xvcnNbXSA9IHsiZ3JheXNjYWxlIiwgMCwgImNvbG9yIFJHQiIsICJpbmRleGVkIGNvbG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYXlzY2FsZSB3aXRoIGFscGhhIiwgMCwgImNvbG9yIFJHQkEifTsKKworICAgICAgaWYgKHNbOV08QVJSQVlfTEVOKGNvbG9ycykpIGMgPSBjb2xvcnNbc1s5XV07CisgICAgICBpZiAoIWMpIGMgPSAidW5rbm93biI7CisKKyAgICAgIHhwcmludGYoIiwgJWQgeCAlZCwgJWQtYml0LyVzLCAlc2ludGVybGFjZWQiLCAoaW50KXBlZWtfYmUocywgNCksCisgICAgICAgIChpbnQpcGVla19iZShzKzQsIDQpLCBzWzhdLCBjLCBzWzEyXSA/ICIiIDogIm5vbi0iKTsKKyAgICB9CisKKyAgICB4cHV0YygnXG4nKTsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvR3JhcGhpY3MvR0lGL3NwZWMtZ2lmODlhLnR4dAorICB9IGVsc2UgaWYgKGxlbj4xNiAmJiAoc3Ryc3RhcnQoJnMsICJHSUY4N2EiKSB8fCBzdHJzdGFydCgmcywgIkdJRjg5YSIpKSkKKyAgICB4cHJpbnRmKCJHSUYgaW1hZ2UgZGF0YSwgJWQgeCAlZFxuIiwKKyAgICAgIChpbnQpcGVla19sZShzLCAyKSwgKGludClwZWVrX2xlKHMrOCwgMikpOworCisgIC8vIFRPRE86IHBhcnNpbmcgSlBFRyBmb3Igd2lkdGgvaGVpZ2h0IGlzIGhhcmRlciB0aGFuIEdJRiBvciBQTkcuCisgIGVsc2UgaWYgKGxlbj4zMiAmJiBtZW1jbXAodG95YnVmLCAiXHhmZlx4ZDgiLCAyKSA9PSAwKQorICAgIHhwcmludGYoIkpQRUcgaW1hZ2UgZGF0YVxuIik7CisKKyAgLy8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2p2bXMvc2U3L2h0bWwvanZtcy00Lmh0bWwKKyAgZWxzZSBpZiAobGVuPjggJiYgc3Ryc3RhcnQoJnMsICJceGNhXHhmZVx4YmFceGJlIikpCisgICAgeHByaW50ZigiSmF2YSBjbGFzcyBmaWxlLCB2ZXJzaW9uICVkLiVkXG4iLAorICAgICAgKGludClwZWVrX2JlKHMrNiwgMiksIChpbnQpcGVla19iZShzLCAyKSk7CisKKyAgICAvLyBUT0RPOiBjcGlvIGFyY2hpdmUuCisgICAgLy8gVE9ETzogdGFyIGFyY2hpdmUuCisgICAgLy8gVE9ETzogemlwL2phci9hcGsgYXJjaGl2ZS4KKyAgZWxzZSB7CisgICAgY2hhciAqd2hhdCA9IDA7CisgICAgaW50IGksIGJ5dGVzOworCisgICAgLy8gSWYgc2hlbGwgc2NyaXB0LCByZXBvcnQgd2hpY2ggaW50ZXJwcmV0ZXIKKyAgICBpZiAobGVuPjMgJiYgc3Ryc3RhcnQoJnMsICIjISIpKSB7CisgICAgICBmb3IgKHdoYXQgPSBzOyAocy10b3lidWYpPGxlbiAmJiAhaXNzcGFjZSgqcyk7IHMrKyk7CisgICAgICBzdHJjcHkocywgIiBzY3JpcHQiKTsKKworICAgIC8vIERpc3Rpbmd1aXNoIEFTQ0lJIHRleHQsIFVURi04IHRleHQsIG9yIGRhdGEKKyAgICB9IGVsc2UgZm9yIChpID0gMDsgaTxsZW47ICsraSkgeworICAgICAgaWYgKCEoaXNwcmludCh0b3lidWZbaV0pIHx8IGlzc3BhY2UodG95YnVmW2ldKSkpIHsKKyAgICAgICAgd2NoYXJfdCB3YzsKKyAgICAgICAgaWYgKChieXRlcyA9IG1icnRvd2MoJndjLCBzK2ksIGxlbi1pLCAwKSk+MCAmJiB3Y3dpZHRoKHdjKT49MCkgeworICAgICAgICAgIGkgKz0gYnl0ZXMtMTsKKyAgICAgICAgICBpZiAoIXdoYXQpIHdoYXQgPSAiVVRGLTggdGV4dCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd2hhdCA9ICJkYXRhIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB4cHV0cyh3aGF0ID8gd2hhdCA6ICJBU0NJSSB0ZXh0Iik7CisgIH0KK30KKworc3RhdGljIHZvaWQgZG9fZmlsZShpbnQgZmQsIGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCBzdGF0IHNiOworICBjaGFyICp3aGF0ID0gInVua25vd24iOworCisgIHhwcmludGYoIiVzOiAlKnMiLCBuYW1lLCAoaW50KShUVC5tYXhfbmFtZV9sZW4gLSBzdHJsZW4obmFtZSkpLCAiIik7CisKKyAgaWYgKCFmc3RhdChmZCwgJnNiKSkgd2hhdCA9ICJjYW5ub3Qgb3BlbiI7CisgIGlmIChTX0lTUkVHKHNiLnN0X21vZGUpKSB7CisgICAgaWYgKHNiLnN0X3NpemUgPT0gMCkgd2hhdCA9ICJlbXB0eSI7CisgICAgZWxzZSB7CisgICAgICBkb19yZWd1bGFyX2ZpbGUoZmQsIG5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmIChTX0lTQkxLKHNiLnN0X21vZGUpKSB3aGF0ID0gImJsb2NrIHNwZWNpYWwiOworICBlbHNlIGlmIChTX0lTQ0hSKHNiLnN0X21vZGUpKSB3aGF0ID0gImNoYXJhY3RlciBzcGVjaWFsIjsKKyAgZWxzZSBpZiAoU19JU0RJUihzYi5zdF9tb2RlKSkgd2hhdCA9ICJkaXJlY3RvcnkiOworICBlbHNlIGlmIChTX0lTRklGTyhzYi5zdF9tb2RlKSkgd2hhdCA9ICJmaWZvIjsKKyAgZWxzZSBpZiAoU19JU1NPQ0soc2Iuc3RfbW9kZSkpIHdoYXQgPSAic29ja2V0IjsKKyAgZWxzZSBpZiAoU19JU0xOSyhzYi5zdF9tb2RlKSkgd2hhdCA9ICJzeW1ib2xpYyBsaW5rIjsKKyAgeHB1dHMod2hhdCk7Cit9CisKK3ZvaWQgZmlsZV9tYWluKHZvaWQpCit7CisgIGNoYXIgKipuYW1lOworCisgIGZvciAobmFtZSA9IHRveXMub3B0YXJnczsgKm5hbWU7ICsrbmFtZSkgeworICAgIGludCBuYW1lX2xlbiA9IHN0cmxlbigqbmFtZSk7CisKKyAgICBpZiAobmFtZV9sZW4gPiBUVC5tYXhfbmFtZV9sZW4pIFRULm1heF9uYW1lX2xlbiA9IG5hbWVfbGVuOworICB9CisKKyAgbG9vcGZpbGVzKHRveXMub3B0YXJncywgZG9fZmlsZSk7Cit9CmRpZmYgLS1naXQgYS90b3lzL3Bvc2l4L3NlZC5jIGIvdG95cy9wb3NpeC9zZWQuYwppbmRleCAzMGQ4YTE1Li45YjVlNjY2IDEwMDY0NAotLS0gYS90b3lzL3Bvc2l4L3NlZC5jCisrKyBiL3RveXMvcG9zaXgvc2VkLmMKQEAgLTcwMSwxMSArNzAxLDExIEBACiAvLyByZXR1cm5zIHByb2Nlc3NlZCBjb3B5IG9mIHN0cmluZyAoMCBpZiBlcnJvciksICpwc3RyIGFkdmFuY2VzIHRvIG5leHQKIC8vIHVudXNlZCBjaGFyLiBpZiBkZWxpbSAob3IgKmRlbGltKSBpcyAwIHVzZXMvc2F2ZXMgc3RhcnRpbmcgY2hhciBhcyBkZWxpbWl0ZXIKIC8vIGlmIHJlZ3hleCwgaWdub3JlIGRlbGltaXRlciBpbiBbcmFuZ2VzXQotc3RhdGljIGNoYXIgKnVuZXNjYXBlX2RlbGltaXRlZF9zdHJpbmcoY2hhciAqKnBzdHIsIGNoYXIgKmRlbGltLCBpbnQgcmVnZXgpCitzdGF0aWMgY2hhciAqdW5lc2NhcGVfZGVsaW1pdGVkX3N0cmluZyhjaGFyICoqcHN0ciwgY2hhciAqZGVsaW0pCiB7CiAgIGNoYXIgKnRvLCAqZnJvbSwgbW9kZSA9IDAsIGQ7CiAKLSAgdG8gPSBmcm9tID0gKnBzdHI7CisgIGZyb20gPSAqcHN0cjsKICAgaWYgKCFkZWxpbSB8fCAhKmRlbGltKSB7CiAgICAgaWYgKCEoZCA9ICooZnJvbSsrKSkpIHJldHVybiAwOwogICAgIGlmIChkID09ICdcXCcpIGQgPSAqKGZyb20rKyk7CkBAIC03MjAsOSArNzIwLDE0IEBACiAgICAgLy8gZGVsaW1pdGVyIGluIHJlZ2V4IGNoYXJhY3RlciByYW5nZSBkb2Vzbid0IGNvdW50CiAgICAgaWYgKCFtb2RlICYmICpmcm9tID09ICdbJykgewogICAgICAgbW9kZSA9ICdbJzsKLSAgICAgIGlmIChmcm9tWzFdID09ICddJykgKih0bysrKSA9ICooZnJvbSsrKTsKKyAgICAgIGlmIChmcm9tWzFdPT0nLScgfHwgZnJvbVsxXT09J10nKSAqKHRvKyspID0gKihmcm9tKyspOwogICAgIH0gZWxzZSBpZiAobW9kZSAmJiAqZnJvbSA9PSAnXScpIG1vZGUgPSAwOwotICAgIGVsc2UgaWYgKCpmcm9tID09ICdcXCcpIHsKKyAgICAvLyBMZW5ndGggMSByYW5nZSAoWC1YIHdpdGggc2FtZSBYKSBpcyAidW5kZWZpbmVkIiBhbmQgbWFrZXMgcmVnY29tcCBlcnIsCisgICAgLy8gYnV0IHRoZSBwZXJsIGJ1aWxkIGRvZXMgaXQsIHNvIHdlIG5lZWQgdG8gZmlsdGVyIGl0IG91dC4KKyAgICBlbHNlIGlmIChtb2RlICYmICpmcm9tID09ICctJyAmJiBmcm9tWy0xXSA9PSBmcm9tWzFdKSB7CisgICAgICBmcm9tKz0yOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmICgqZnJvbSA9PSAnXFwnKSB7CiAgICAgICBpZiAoIWZyb21bMV0pIHJldHVybiAwOwogCiAgICAgICAvLyBDaGVjayBlc2NhcGVkIGVuZCBkZWxpbWl0ZXIgYmVmb3JlIHByaW50ZiBzdHlsZSBlc2NhcGVzLgpAQCAtNzM1LDcgKzc0MCw3IEBACiAgICAgICAgICAgKih0bysrKSA9IGM7CiAgICAgICAgICAgZnJvbSs9MjsKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlICoodG8rKykgPSAqKGZyb20rKyk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1vZGUpICoodG8rKykgPSAqKGZyb20rKyk7CiAgICAgICB9CiAgICAgfQogICAgICoodG8rKykgPSAqKGZyb20rKyk7CkBAIC04MDIsNyArODA3LDcgQEAKICAgICAgIH0gZWxzZSBpZiAoKmxpbmUgPT0gJy8nIHx8ICpsaW5lID09ICdcXCcpIHsKICAgICAgICAgY2hhciAqcyA9IGxpbmU7CiAKLSAgICAgICAgaWYgKCEocyA9IHVuZXNjYXBlX2RlbGltaXRlZF9zdHJpbmcoJmxpbmUsIDAsIDEpKSkgZ290byBicmFuZDsKKyAgICAgICAgaWYgKCEocyA9IHVuZXNjYXBlX2RlbGltaXRlZF9zdHJpbmcoJmxpbmUsIDApKSkgZ290byBicmFuZDsKICAgICAgICAgaWYgKCEqcykgY29yd2luLT5ybWF0Y2hbaV0gPSAwOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICB4cmVnY29tcCgodm9pZCAqKXJlZywgcywgKHRveXMub3B0ZmxhZ3MgJiBGTEFHX3IpKlJFR19FWFRFTkRFRCk7CkBAIC04NDQsNyArODQ5LDcgQEAKIAogICAgICAgLy8gZ2V0IHBhdHRlcm4gKGp1c3QgcmVjb3JkLCB3ZSBwYXJzZSBpdCBsYXRlcikKICAgICAgIGNvcndpbi0+YXJnMiA9IHJlZyAtIChjaGFyICopY29yd2luOwotICAgICAgaWYgKCEoVFQucmVtZW1iZXIgPSB1bmVzY2FwZV9kZWxpbWl0ZWRfc3RyaW5nKCZsaW5lLCAmZGVsaW0sIDEpKSkKKyAgICAgIGlmICghKFRULnJlbWVtYmVyID0gdW5lc2NhcGVfZGVsaW1pdGVkX3N0cmluZygmbGluZSwgJmRlbGltKSkpCiAgICAgICAgIGdvdG8gYnJhbmQ7CiAKICAgICAgIHJlZyArPSBzaXplb2YocmVnZXhfdCk7CkBAIC05NDAsMTMgKzk0NSwxMyBAQAogICAgICAgY2hhciAqcywgZGVsaW0gPSAwOwogICAgICAgaW50IGxlbjsKIAotICAgICAgaWYgKCEocyA9IHVuZXNjYXBlX2RlbGltaXRlZF9zdHJpbmcoJmxpbmUsICZkZWxpbSwgMCkpKSBnb3RvIGJyYW5kOworICAgICAgaWYgKCEocyA9IHVuZXNjYXBlX2RlbGltaXRlZF9zdHJpbmcoJmxpbmUsICZkZWxpbSkpKSBnb3RvIGJyYW5kOwogICAgICAgY29yd2luLT5hcmcxID0gcmVnLShjaGFyICopY29yd2luOwogICAgICAgbGVuID0gc3RybGVuKHMpOwogICAgICAgcmVnID0gZXh0ZW5kX3N0cmluZygodm9pZCAqKSZjb3J3aW4sIHMsIHJlZy0oY2hhciAqKWNvcndpbiwgbGVuKTsKICAgICAgIGZyZWUocyk7CiAgICAgICBjb3J3aW4tPmFyZzIgPSByZWctKGNoYXIgKiljb3J3aW47Ci0gICAgICBpZiAoIShzID0gdW5lc2NhcGVfZGVsaW1pdGVkX3N0cmluZygmbGluZSwgJmRlbGltLCAwKSkpIGdvdG8gYnJhbmQ7CisgICAgICBpZiAoIShzID0gdW5lc2NhcGVfZGVsaW1pdGVkX3N0cmluZygmbGluZSwgJmRlbGltKSkpIGdvdG8gYnJhbmQ7CiAgICAgICBpZiAobGVuICE9IHN0cmxlbihzKSkgZ290byBicmFuZDsKICAgICAgIHJlZyA9IGV4dGVuZF9zdHJpbmcoKHZvaWQgKikmY29yd2luLCBzLCByZWctKGNoYXIqKWNvcndpbiwgbGVuKTsKICAgICAgIGZyZWUocyk7CmRpZmYgLS1naXQgYS90b3lzL3Bvc2l4L3djLmMgYi90b3lzL3Bvc2l4L3djLmMKaW5kZXggNjJkMWY3YS4uZTdhZmM4MSAxMDA2NDQKLS0tIGEvdG95cy9wb3NpeC93Yy5jCisrKyBiL3RveXMvcG9zaXgvd2MuYwpAQCAtNTMsOCArNTMsOCBAQAogICBpZiAodG95cy5vcHRmbGFncyA9PSBGTEFHX2MpIHsKICAgICBzdHJ1Y3Qgc3RhdCBzdDsKIAotICAgIGZzdGF0KGZkLCAmc3QpOwotICAgIGlmIChTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisgICAgLy8gT24gTGludXgsIGZpbGVzIGluIC9wcm9jIG9mdGVuIHJlcG9ydCB0aGVpciBzaXplIGFzIDAuCisgICAgaWYgKCFmc3RhdChmZCwgJnN0KSAmJiBTX0lTUkVHKHN0LnN0X21vZGUpICYmIHN0LnN0X3NpemUgPiAwKSB7CiAgICAgICBsZW5ndGhzWzJdID0gc3Quc3Rfc2l6ZTsKICAgICAgIGdvdG8gc2hvdzsKICAgICB9CmRpZmYgLS1naXQgYS93d3cvZGVzaWduLmh0bWwgYi93d3cvZGVzaWduLmh0bWwKaW5kZXggNGE0Mjc1My4uMDUwYzk1MyAxMDA3NTUKLS0tIGEvd3d3L2Rlc2lnbi5odG1sCisrKyBiL3d3dy9kZXNpZ24uaHRtbApAQCAtMjk0LDI0ICsyOTQsNDAgQEAKIDxwPlRoZSByZWFzb24gdG8gcGljayAidW5zaWduZWQiIGlzIHRoYXQgd2F5IHdlJ3JlIDgtYml0IGNsZWFuIGJ5IGRlZmF1bHQuPC9wPgogCiA8cD48aDM+RXJyb3IgbWVzc2FnZXMgYW5kIGludGVybmF0aW9uYWxpemF0aW9uOjwvaDM+PC9wPgorCiA8cD5FcnJvciBtZXNzYWdlcyBhcmUgZXh0cmVtZWx5IHRlcnNlIG5vdCBqdXN0IHRvIHNhdmUgYnl0ZXMsIGJ1dCBiZWNhdXNlIHdlCi1kb24ndCB1c2UgYW55IHNvcnQgb2YgXygic3RyaW5nIikgdHJhbnNsYXRpb24gaW5mcmFzdHJ1Y3R1cmUuPC9wPgorZG9uJ3QgdXNlIGFueSBzb3J0IG9mIF8oInN0cmluZyIpIHRyYW5zbGF0aW9uIGluZnJhc3RydWN0dXJlLiAoV2UncmUgbm90Cit0cmFuc2xhdGluZyB0aGUgY29tbWFuZCBuYW1lcyB0aGVtc2VsdmVzLCBzbyB3ZSBtdXN0IGV4cGVjdCBhIG1pbmltdW0gYW1vdW50IG9mCitlbmdsaXNoIGtub3dsZWRnZSBmcm9tIG91ciB1c2VycywgYnV0IGxldCdzIGtlZXAgaXQgdG8gYSBtaW5pbXVtLik8L3A+CiAKIDxwPlRodXMgImJhZCAtQSAnJWMnIiBpcwogcHJlZmVyYWJsZSB0byAiVW5yZWNvZ25pemVkIGFkZHJlc3MgYmFzZSAnJWMnIiwgYmVjYXVzZSBhIG5vbi1lbmdsaXNoIHNwZWFrZXIKLWNhbiBzZWUgdGhhdCAtQSB3YXMgdGhlIHByb2JsZW0sIGFuZCB3aXRoIGEgfjIwIHdvcmQgZW5nbGlzaCB2b2NhYnVsYXJ5IGlzCi1tb3JlIGxpa2VseSB0byBrbm93IChvciBndWVzcykgImJhZCIgdGhhbiB0aGUgbG9uZ2VyIG1lc3NhZ2UuPC9wPgorY2FuIHNlZSB0aGF0IC1BIHdhcyB0aGUgcHJvYmxlbSAoZ2l2aW5nIGJhY2sgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCB0aGV5CitzdXBwbGllZCkuIEEgdXNlciB3aXRoIGEgfjIwIHdvcmQgZW5nbGlzaCB2b2NhYnVsYXJ5IGlzCittb3JlIGxpa2VseSB0byBrbm93IChvciBndWVzcykgImJhZCIgdGhhbiB0aGUgbG9uZ2VyIG1lc3NhZ2UsIGFuZCB5b3UgY2FuCit1c2UgImJhZCIgaW4gcGxhY2Ugb2YgImludmFsaWQiLCAiaW5hcHByb3ByaWF0ZSIsICJ1bnJlY29nbml6ZWQiLi4uCitTaW1pbGFybHkgd2hlbiBhdG9seF9yYW5nZSgpIGNvbXBsYWlucyBhYm91dCByYW5nZSBjb25zdHJhaW50cyB3aXRoCisiNCA8IDE3IiBvciAiMTIgPiA1IiwgaXQncyBpbnRlbnRpb25hbDogdGhvc2UgZG9uJ3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLjwvcD4KIAotPHA+VGhlIGhlbHAgdGV4dCBtaWdodCBzb21lZGF5IGhhdmUgdHJhbnNsYXRlZCB2ZXJzaW9ucywgYW5kIHN0cmVycm9yKCkKLW1lc3NhZ2VzIHByb2R1Y2VkIGJ5IHBlcnJvcl9leGl0KCkgYW5kIGZyaWVuZHMgY2FuIGJlIGV4cGVjdGVkIHRvIGJlCi1sb2NhbGl6ZWQgYnkgbGliYy4gT3VyIGVycm9yIGZ1bmN0aW9ucyBhbHNvIHByZXBlbmQgdGhlIGNvbW1hbmQgbmFtZSwKLXdoaWNoIG5vbi1lbmdsaXNoIHNwZWFrZXJzIGNhbiBwcmVzdW1hYmx5IHJlY29nbml6ZSBhbHJlYWR5LjwvcD4KKzxwPlRoZSBzdHJlcnJvcigpIG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IHBlcnJvcl9leGl0KCkgYW5kIGZyaWVuZHMgc2hvdWxkIGJlCitsb2NhbGl6ZWQgYnkgbGliYywgYW5kIG91ciBlcnJvciBmdW5jdGlvbnMgYWxzbyBwcmVwZW5kIHRoZSBjb21tYW5kIG5hbWUKKyh3aGljaCBub24tZW5nbGlzaCBzcGVha2VycyBjYW4gcHJlc3VtYWJseSByZWNvZ25pemUgYWxyZWFkeSkuIEtlZXAgdGhlCitleHBsYW5hdGlvbiBpbiBiZXR3ZWVuIHRvIGEgbWluaW11bSwgYW5kIHdoZXJlIHBvc3NpYmxlIGZlZWQgYmFjayB0aGUgdmFsdWVzCit0aGV5IHBhc3NlZCBpbiB0byBpZGVudGlmeSBfd2hhdF8gd2UgY291bGRuJ3QgcHJvY2Vzcy4KK0lmIHlvdSBzYXkgcGVycm9yX2V4aXQoInNldHNvY2tvcHQiKSwgeW91J3ZlIGlkZW50aWZpZWQgdGhlIGFjdGlvbiB5b3UKK3dlcmUgdHJ5aW5nIHRvIHRha2UsIGFuZCB0aGUgcGVycm9yIGdpdmVzIGEgdHJhbnNsYXRlZCBlcnJvciBtZXNzYWdlIChmcm9tIGxpYmMpCitleHBsYWluaW5nIF93aHlfIGl0IGNvdWxkbid0IGRvIGl0LCBzbyB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBhZGQgZW5nbGlzaAord29yZHMgbGlrZSAiZmFpbGVkIiBvciAiY291bGRuJ3QgYXNzaWduIi48L3A+CiAKLTxwPkFuIGVudmVudHVhbCBnb2FsIGlzIDxhIGhyZWY9aHR0cDovL3lhcmNoaXZlLm5ldC9jb21wL2xpbnV4L3V0ZjguaHRtbD5VVEYtODwvYT4gc3VwcG9ydCwgYWx0aG91Z2ggaXQgaXNuJ3QgYSBwcmlvcml0eSBmb3IgdGhlCi1maXJzdCBwYXNzIG9mIGVhY2ggY29tbWFuZC4gKEFsbCBjb21tYW5kcyBzaG91bGQgYXQgbGVhc3QgYmUgOC1iaXQgY2xlYW4uKTwvcD4KKzxwPkFsbCBjb21tYW5kcyBzaG91bGQgYmUgOC1iaXQgY2xlYW4sIHdpdGggZXhwbGljaXQKKzxhIGhyZWY9aHR0cDovL3lhcmNoaXZlLm5ldC9jb21wL2xpbnV4L3V0ZjguaHRtbD5VVEYtODwvYT4gc3VwcG9ydCB3aGVyZQorbmVjZXNzYXJ5LiBBc3N1bWUgYWxsIGlucHV0IGRhdGEgbWlnaHQgYmUgdXRmOCwgYW5kIGF0IGxlYXN0IHByZXNlcnZlCitpdCBhbmQgcGFzcyBpdCB0aHJvdWdoLiAoRm9yIHRoaXMgcmVhc29uLCBvdXIgYnVpbGQgaXMgLWZ1bnNpZ25lZC1jaGFyIG9uCithbGwgYXJjaGl0ZWN0dXJlczsgImNoYXIiIGlzIHVuc2lnbmVkIHVubGVzcyB5b3Ugc3RpY2sgInNpZ25lZCIgaW4gZnJvbnQKK29mIGl0Lik8L3A+CiAKLTxwPkxvY2FsZSBzdXBwb3J0IGlzbid0IGN1cnJlbnRseSBhIGdvYWw7IHRoYXQncyBhIHByZXNlbnRhdGlvbiBsYXllciBpc3N1ZSwKLVgxMSBvciBEYWx2aWsncyBwcm9ibGVtLjwvcD4KKzxwPkxvY2FsZSBzdXBwb3J0IGlzbid0IGN1cnJlbnRseSBhIGdvYWw7IHRoYXQncyBhIHByZXNlbnRhdGlvbiBsYXllciBpc3N1ZQorKEkuRS4gYSBHVUkgcHJvYmxlbSkuPC9wPgogCiA8YSBuYW1lPSJjb2Rlc3R5bGUiIC8+CiA8aDI+Q29kaW5nIHN0eWxlPC9oMj4KQEAgLTMyNyw2ICszNDMsMTcgQEAKIHlvdSBkbywgc29tZXRpbWVzIHR3byBzcGFjZXMgbG9va3MgYmV0dGVyLCBzb21ldGltZXMgaW5kZW50aW5nIHRvIHRoZQogY29udGVudHMgb2YgYSBwYXJlbnRoZXNlcyBsb29rcyBiZXR0ZXIuKTwvcD4KIAorPHA+SSdtIGF3YXJlIHRoaXMgaW5kZW50YXRpb24gc3R5bGUgY3JlZXBzIHNvbWUgcGVvcGxlIG91dCwgc28gaGVyZSdzCit0aGUgc2VkIGludm9jYXRpb24gdG8gY29udmVydCBncm91cHMgb2YgdHdvIGxlYWRpbmcgc3BhY2VzIHRvIHRhYnM6PC9wPgorPGJsb2NrcXVvdGU+PHByZT4KK3NlZCAtaSAnOmxvb3A7cy9eXCggKlwpICAvXDFcdC87dCBsb29wJyBmaWxlbmFtZQorPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5BbmQgaGVyZSdzIHRoZSBzZWQgaW52b2NhdGlvbiB0byBjb252ZXJ0IGxlYWRpbmcgdGFicyB0byB0d28gc3BhY2VzIGVhY2g6PC9wPgorPGJsb2NrcXVvdGU+PHByZT4KK3NlZCAtaSAnOmxvb3A7cy9eXCggKlwpXHQvXDEgIC87dCBsb29wJyBmaWxlbmFtZQorPC9wcmU+PC9ibG9ja3F1b3RlPgorCiA8cD5UaGVyZSdzIGEgc3BhY2UgYWZ0ZXIgQyBmbG93IGNvbnRyb2wgc3RhdGVtZW50cyB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbnMsIHNvCiAiaWYgKGJsYWgpIiBpbnN0ZWFkIG9mICJpZihibGFoKSIuIChOb3RlIHRoYXQgc2l6ZW9mIGlzIGFjdHVhbGx5IGFuCiBvcGVyYXRvciwgc28gd2UgZG9uJ3QgZ2l2ZSBpdCBhIHNwYWNlIGZvciB0aGUgc2FtZSByZWFzb24gKysgZG9lc24ndCBnZXQKQEAgLTMzNiw4ICszNjMsOCBAQAogc28gImludCB4ID0gMDsiLjwvcD4KIAogPHA+QmxhbmsgbGluZXMgKHZlcnRpY2FsIHdoaXRlc3BhY2UpIGdvIGJldHdlZW4gdGhvdWdodHMuICJXZSB3ZXJlIGRvaW5nIHRoYXQsCi1ub3cgd2UncmUgZG9pbmcgdGhpcy4gKE5vdCBhIGhhcmQgYW5kIGZhc3QgcnVsZSBhYm91dCBfd2hlcmVfIGl0IGdvZXMsCi1idXQgdGhlcmUgc2hvdWxkIGJlIHNvbWUuKSI8L3A+Citub3cgd2UncmUgZG9pbmcgdGhpcy4iIChOb3QgYSBoYXJkIGFuZCBmYXN0IHJ1bGUgYWJvdXQgX3doZXJlXyBpdCBnb2VzLAorYnV0IHRoZXJlIHNob3VsZCBiZSBzb21lIGZvciB0aGUgc2FtZSByZWFzb24gd3JpdGluZyBoYXMgcGFyYWdyYXBoIGJyZWFrcy4pPC9wPgogCiA8cD5WYXJpYWJsZSBkZWNsYXJhdGlvbnMgZ28gYXQgdGhlIHN0YXJ0IG9mIGJsb2Nrcywgd2l0aCBhIGJsYW5rIGxpbmUgYmV0d2VlbgogdGhlbSBhbmQgb3RoZXIgY29kZS4gWWVzLCBjOTkgYWxsb3dzIHlvdSB0byBwdXQgdGhlbSBhbnl3aGVyZSwgYnV0IHRoZXkncmUK