ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTQyNTAuLjAwMDAwMDAKLS0tIGEvQU5OT1VOQ0UKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1MaWJwbmcgMS42LjI0IC0gQXVndXN0IDQsIDIwMTYKLQotVGhpcyBpcyBhIHB1YmxpYyByZWxlYXNlIG9mIGxpYnBuZywgaW50ZW5kZWQgZm9yIHVzZSBpbiBwcm9kdWN0aW9uIGNvZGVzLgotCi1GaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkOgotCi1Tb3VyY2UgZmlsZXMgd2l0aCBMRiBsaW5lIGVuZGluZ3MgKGZvciBVbml4L0xpbnV4KSBhbmQgd2l0aCBhCi0iY29uZmlndXJlIiBzY3JpcHQKLQotICAgbGlicG5nLTEuNi4yNC50YXIueHogKExaTUEtY29tcHJlc3NlZCwgcmVjb21tZW5kZWQpCi0gICBsaWJwbmctMS42LjI0LnRhci5negotCi1Tb3VyY2UgZmlsZXMgd2l0aCBDUkxGIGxpbmUgZW5kaW5ncyAoZm9yIFdpbmRvd3MpLCB3aXRob3V0IHRoZQotImNvbmZpZ3VyZSIgc2NyaXB0Ci0KLSAgIGxwbmcxNjI0Ljd6ICAoTFpNQS1jb21wcmVzc2VkLCByZWNvbW1lbmRlZCkKLSAgIGxwbmcxNjI0LnppcAotCi1PdGhlciBpbmZvcm1hdGlvbjoKLQotICAgbGlicG5nLTEuNi4yNC1SRUFETUUudHh0Ci0gICBsaWJwbmctMS42LjI0LUxJQ0VOU0UudHh0Ci0gICBsaWJwbmctMS42LjI0LSouYXNjIChhcm1vcmVkIGRldGFjaGVkIEdQRyBzaWduYXR1cmVzKQotCi1DaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IHB1YmxpYyByZWxlYXNlICgxLjYuMjMpOgotICBBdm9pZCBwb3RlbnRpYWwgb3ZlcmZsb3cgb2YgdGhlIFBOR19JTUFHRV9TSVpFIG1hY3JvLiAgVGhpcyBtYWNybwotICAgIGlzIG5vdCB1c2VkIHdpdGhpbiBsaWJwbmcsIGJ1dCBpcyB1c2VkIGluIHNvbWUgb2YgdGhlIGV4YW1wbGVzLgotICBDb3JyZWN0IGZpbHRlciBoZXVyaXN0aWMgb3ZlcmZsb3cgaGFuZGxpbmcuIFRoaXMgd2FzIGJyb2tlbiB3aGVuIHRoZQotICAgIHdyaXRlIGZpbHRlciBjb2RlIHdhcyBtb3ZlZCBvdXQtb2YtbGluZTsgaWYgdGhlcmUgaXMgYSBzaW5nbGUgZmlsdGVyIGFuZAotICAgIHRoZSBoZXVyaXN0aWMgc3VtIG92ZXJmbG93cyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGZpbHRlcmVkIGxpbmUgaXMgbm90Ci0gICAgY29tcGxldGVkLiAgSW4gdmVyc2lvbnMgcHJpb3IgdG8gMS42IHRoZSBjb2RlIHdhcyBkdXBsaWNhdGVkIGluLWxpbmUKLSAgICBhbmQgdGhlIGNoZWNrIG5vdCBwZXJmb3JtZWQsIHNvIHRoZSBmaWx0ZXIgb3BlcmF0aW9uIGNvbXBsZXRlZDsgaG93ZXZlciwKLSAgICBpbiB0aGUgbXVsdGktZmlsdGVyIGNhc2Ugd2hlcmUgdGhlIHN1bSBpcyBwZXJmb3JtZWQgdGhlICdub25lJyBmaWx0ZXIgd291bGQKLSAgICBiZSBzZWxlY3RlZCBpZiBhbGwgdGhlIHN1bXMgb3ZlcmZsb3dlZCwgZXZlbiBpZiBpdCB3YXNuJ3QgaW4gdGhlIGZpbHRlcgotICAgIGxpc3QuICBUaGUgZml4IHRvIHRoZSBmaXJzdCBwcm9ibGVtIGlzIHNpbXBseSB0byBwcm92aWRlIFBOR19TSVpFX01BWCBhcwotICAgIHRoZSBjdXJyZW50IGxtaW5zIHN1bSB2YWx1ZTsgdGhpcyBtZWFucyB0aGUgc3VtIGNhbiBuZXZlciBleGNlZWQgaXQgYW5kCi0gICAgb3ZlcmZsb3dzIHNpbGVudGx5LiAgQSByZWFzb25hYmxlIGNvbXBpbGVyIHRoYXQgZG9lcyBjaG9vc2UgdG8gaW5saW5lCi0gICAgdGhlIGNvZGUgd2lsbCBzaW1wbHkgZWxpbWluYXRlIHRoZSBzdW0gY2hlY2suCi0gIFRoZSBmaXggdG8gdGhlIHNlY29uZCBwcm9ibGVtIGlzIHRvIHVzZSBoaWdoIHByZWNpc2lvbiBhcml0aG1ldGljICh0aGlzIGlzCi0gICAgaW1wbGVtZW50ZWQgaW4gMS43KSwgaG93ZXZlciBhIHNpbXBsZSBzYWZlIGZpeCBoZXJlIGlzIHRvIGNob3NlIHRoZSBsb3dlc3QKLSAgICBudW1iZXJlZCBmaWx0ZXIgaW4gdGhlIGxpc3QgZnJvbSBwbmdfc2V0X2ZpbHRlciAodGhpcyBvbmx5IHdvcmtzIGlmIHRoZQotICAgIGZpcnN0IHByb2JsZW0gaXMgYWxzbyBmaXhlZCkgKEpvaG4gQm93bGVyKS4KLSAgVXNlIGEgbW9yZSBlZmZpY2llbnQgYWJzb2x1dGUgdmFsdWUgY2FsY3VsYXRpb24gb24gU1NFMiAoTWF0dGhpZXUgRGFyYm9pcykuCi0gIEZpeGVkIHRoZSBjYXNlIHdoZXJlIFBOR19JTUFHRV9CVUZGRVJfU0laRSBjYW4gb3ZlcmZsb3cgaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgYXMgYSByZXN1bHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGFuIGluY3JlYXNlZCAncm93X3N0cmlkZSc7IHByZXZpb3VzbHkKLSAgICBwbmdfaW1hZ2VfZmluaXNoX3JlYWQgb25seSBjaGVja2VkIGZvciBvdmVyZmxvdyBvbiB0aGUgYmFzZSBjYWxjdWxhdGlvbiBvZgotICAgIGNvbXBvbmVudHMuICAoSS5lLiBpdCBjaGVja2VkIGZvciBvdmVyZmxvdyBvZiBhIDMyLWJpdCBudW1iZXIgb24gdGhlIHRvdGFsCi0gICAgbnVtYmVyIG9mIHBpeGVsIGNvbXBvbmVudHMgaW4gdGhlIG91dHB1dCBmb3JtYXQsIG5vdCB0aGUgcG9zc2libHkgcGFkZGVkIHJvdwotICAgIGxlbmd0aCBhbmQgbm90IHRoZSBudW1iZXIgb2YgYnl0ZXMsIHdoaWNoIGZvciBsaW5lYXIgZm9ybWF0cyBpcyB0d2ljZSB0aGUKLSAgICBudW1iZXIgb2YgY29tcG9uZW50cy4pCi0gIE1TVkMgZG9lcyBub3QgbGlrZSAnLSh1bnNpZ25lZCknLCBzbyByZXBsYWNlZCBpdCB3aXRoIDBVLSh1bnNpZ25lZCkKLSAgTVNWQyBkb2VzIG5vdCBsaWtlICh1SW50KSA9IC0odW5zaWduZWQpIChpLmUuIGFzIGFuIGluaXRpYWxpemVyKSwgdW5sZXNzCi0gICAgdGhlIGNvbnZlcnNpb24gaXMgZXhwbGljaXRseSBpbnZva2VkIGJ5IGEgY2FzdC4KLSAgUHV0IHRoZSBTS0lQIGRlZmluaXRpb24gaW4gdGhlIGNvcnJlY3QgcGxhY2UuIEl0IG5lZWRzIHRvIGNvbWUgYWZ0ZXIgdGhlCi0gICAgcG5nLmggaW5jbHVkZSAoc2VlIGFsbCB0aGUgb3RoZXIgLmMgZmlsZXMgaW4gY29udHJpYi9saWJ0ZXN0cykgYmVjYXVzZSBpdAotICAgIGRlcGVuZHMgb24gUE5HX0xJQlBOR19WRVIuCi0gIFJlbW92ZWQgdGhlIHRocmVlIGNvbXBpbGUgd2FybmluZyBvcHRpb25zIGZyb20gdGhlIGluZGl2aWR1YWwgcHJvamVjdAotICAgIGZpbGVzIGludG8gdGhlIHpsaWIucHJvcHMgZ2xvYmFscy4gIEl0IGluY3JlYXNlcyB0aGUgd2FybmluZyBsZXZlbCBmcm9tIDQKLSAgICB0byBBbGwgYW5kIGFkZHMgYSBsaXN0IG9mIHRoZSB3YXJuaW5ncyB0aGF0IG5lZWQgdG8gYmUgdHVybmVkIG9mZi4gIFRoaXMgaXMKLSAgICBzZW1pLWRvY3VtZW50YXJ5OyB0aGUgaW50ZW50IGlzIHRvIHRlbGwgbGlicG5nIHVzZXJzIHdoaWNoIHdhcm5pbmdzIGhhdmUKLSAgICBiZWVuIGV4YW1pbmVkIGFuZCBqdWRnZWQgbm9uLWZpeGFibGUgYXQgcHJlc2VudC4gIFRoZSB3YXJuaW5nIGFib3V0Ci0gICAgc3RydWN0dXJlIHBhZGRpbmcgaXMgZml4YWJsZSwgYnV0IGl0IHdvdWxkIGJlIGEgc2lnbmZpY2FudCBjaGFuZ2UgKG1vdmluZwotICAgIHN0cnVjdHVyZSBtZW1iZXJzIGFyb3VuZCkuCi0gIE9wdGltaXplZCBhYnNvbHV0ZSB2YWx1ZSBjYWxjdWxhdGlvbiBpbiBmaWx0ZXIgc2VsZWN0aW9uLCBzaW1pbGFyIHRvCi0gICAgY29kZSBpbiB0aGUgUEFFVEggZGVjb2RlciBpbiBwbmdydXRpbC5jLiBCdWlsZCB3aXRoIFBOR19VU0VfQUJTIHRvCi0gICAgdXNlIHRoaXMuCi0gIEFkZGVkIHBuZ2NwIHRvIHRoZSBidWlsZCB0b2dldGhlciB3aXRoIGEgcG5nY3AuZGZhIGNvbmZpZ3VyYXRpb24gdGVzdC4KLSAgQWRkZWQgaGlnaCByZXNvbHV0aW9uIHRpbWluZyB0byBwbmdjcC4KLSAgQWRkZWQgIkNvbW1vbiBsaW5raW5nIGZhaWx1cmVzIiBzZWN0aW9uIHRvIElOU1RBTEwuCi0gIFJlbG9jYXRlZCBtaXNwbGFjZWQgI2VuZGlmIGluIHBuZy5jIHNSR0IgcHJvZmlsZSBjaGVja2luZy4KLSAgRml4ZWQgdHdvIENvdmVyaXR5IGlzc3VlcyBpbiBwbmdjcC5jLgotICBBdm9pZCBmaWx0ZXItc2VsZWN0aW9uIGhldXJpc3RpYyBzdW0gY2FsY3VsYXRpb25zIGluIGNhc2VzIHdoZXJlIG9ubHkgb25lCi0gICAgZmlsdGVyIGlzIGEgY2FuZGlkYXRlIGZvciBzZWxlY3Rpb24uIFRoaXMgdHJhZGVzIG9mZiBjb2RlIHNpemUgKGFkZGVkCi0gICAgcHJpdmF0ZSBwbmdfc2V0dXBfKl9yb3dfb25seSgpIGZ1bmN0aW9ucykgZm9yIHNwZWVkLgotICBGaXhlZCBzb21lIGluZGVudGF0aW9uIHRvIGNvbXBseSB3aXRoIG91ciBjb2Rpbmcgc3R5bGUuCi0gIEFkZGVkIGNvbnRyaWIvdG9vbHMvcmVpbmRlbnQuCi0gIEVsaW1pbmF0ZWQgdW5uZWNlc3NhcnkgdGVzdHMgb2YgYm9vbGVhbiBwbmdfaXNhbGlnbmVkKCkgdnMgMC4KLSAgQ29uZGl0aW9uYWxseSBjb21waWxlIFNTRTIgaGVhZGVycyBpbiBjb250cmliL2ludGVsL2ludGVsX3NzZS5wYXRjaAotICBDb25kaXRpb25hbGx5IGNvbXBpbGUgcG5nX2RlY29tcHJlc3NfY2h1bmsoKS4KLSAgQ29uZGl0aW9uYWxseSBjb21waWxlIEFSTV9ORU9OIGhlYWRlcnMgaW4gcG5ncHJpdi5oCi0gIFVwZGF0ZWQgY29udHJpYi9pbnRlbC9pbnRlbF9zc2UucGF0Y2gKLQotKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKLWh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Ci10byBzdWJzY3JpYmUpCi1vciB0byBnbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotCi1HbGVubiBSLVAKZGlmZiAtLWdpdCBhL0JVSUxELmduIGIvQlVJTEQuZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjMTA4OQotLS0gL2Rldi9udWxsCisrKyBiL0JVSUxELmduCkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IDIwMTYgVGhlIEZ1Y2hzaWEgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2FybS5nbmkiKQorCitjb25maWcoImxpYnBuZ19jb25maWciKSB7CisgIGluY2x1ZGVfZGlycyA9IFsgIi4iIF0KKyAgZGVmaW5lcyA9IFtdCit9CisjIE11c3QgYmUgaW4gYSBjb25maWcgYmVjYXVzZSBvZiBob3cgR04gb3JkZXJzIGZsYWdzIChvdGhlcndpc2UgLVdhbGwgd2lsbAorIyBhcHBlYXIgYWZ0ZXIgdGhpcywgYW5kIHR1cm4gaXQgYmFjayBvbikuCitjb25maWcoImNsYW5nX3dhcm5pbmdzIikgeworICBpZiAoaXNfY2xhbmcpIHsKKyAgICBjZmxhZ3MgPSBbCisgICAgICAjIGxpYnBuZyBjaGVja3MgdGhhdCB0aGUgd2lkdGggaXMgbm90IGdyZWF0ZXIgdGhhbiBQTkdfU0laRV9NQVguCisgICAgICAjIE9uIHBsYXRmb3JtcyB3aGVyZSBzaXplX3QgaXMgNjQtYml0cywgdGhpcyBjb21wYXJpc29uIHdpbGwgYWx3YXlzCisgICAgICAjIGJlIGZhbHNlLgorICAgICAgIi1Xbm8tdGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlIiwKKyAgICBdCisgIH0KK30KKworc291cmNlX3NldCgibGlicG5nIikgeworICBzb3VyY2VzID0gWworICAgICJwbmcuYyIsCisgICAgInBuZy5oIiwKKyAgICAicG5nY29uZi5oIiwKKyAgICAicG5nZXJyb3IuYyIsCisgICAgInBuZ2dldC5jIiwKKyAgICAicG5naW5mby5oIiwKKyAgICAicG5nbGliY29uZi5oIiwKKyAgICAicG5nbWVtLmMiLAorICAgICJwbmdwcmVhZC5jIiwKKyAgICAicG5ncHJlZml4LmgiLAorICAgICJwbmdwcml2LmgiLAorICAgICJwbmdyZWFkLmMiLAorICAgICJwbmdyaW8uYyIsCisgICAgInBuZ3J0cmFuLmMiLAorICAgICJwbmdydXRpbC5jIiwKKyAgICAicG5nc2V0LmMiLAorICAgICJwbmdzdHJ1Y3QuaCIsCisgICAgInBuZ3RyYW5zLmMiLAorICAgICJwbmd3aW8uYyIsCisgICAgInBuZ3dyaXRlLmMiLAorICAgICJwbmd3dHJhbi5jIiwKKyAgICAicG5nd3V0aWwuYyIsCisgIF0KKyAgZGVmaW5lcyA9IFtdCisgIGNmbGFncyA9IFtdCisgIGlmIChjdXJyZW50X2NwdSA9PSAieDg2IiB8fCBjdXJyZW50X2NwdSA9PSAieDY0IikgeworICAgIHNvdXJjZXMgKz0gWworICAgICAgImNvbnRyaWIvaW50ZWwvZmlsdGVyX3NzZTJfaW50cmluc2ljcy5jIiwKKyAgICAgICJjb250cmliL2ludGVsL2ludGVsX2luaXQuYyIsCisgICAgXQorICAgIGRlZmluZXMgKz0gWyAiUE5HX0lOVEVMX1NTRV9PUFQ9MSIgXQorICB9IGVsc2UgaWYgKChjdXJyZW50X2NwdSA9PSAiYXJtIiB8fCBjdXJyZW50X2NwdSA9PSAiYXJtNjQiKSAmJiBhcm1fdXNlX25lb24pIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICJhcm0vYXJtX2luaXQuYyIsCisgICAgICAiYXJtL2ZpbHRlcl9uZW9uX2ludHJpbnNpY3MuYyIsCisgICAgXQorICAgIGRlZmluZXMgKz0gWworICAgICAgIlBOR19BUk1fTkVPTl9PUFQ9MiIsCisgICAgICAiUE5HX0FSTV9ORU9OX0lNUExFTUVOVEFUSU9OPTEiLAorICAgIF0KKyAgfQorCisgIHB1YmxpY19jb25maWdzID0gWyAiOmxpYnBuZ19jb25maWciIF0KKyAgcHVibGljX2RlcHMgPSBbCisgICAgIi8vdGhpcmRfcGFydHkvemxpYiIsCisgIF0KKyAgY29uZmlncyArPSBbICI6Y2xhbmdfd2FybmluZ3MiIF0KK30KZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGYwYzhiLi4wMDAwMDAwCi0tLSBhL0NIQU5HRVMKKysrIC9kZXYvbnVsbApAQCAtMSw1Njg1ICswLDAgQEAKLSNpZiAwCi1DSEFOR0VTIC0gY2hhbmdlcyBmb3IgbGlicG5nCi0KLXZlcnNpb24gMC4xIFtNYXJjaCAyOSwgMTk5NV0KLSAgaW5pdGlhbCB3b3JrLWluLXByb2dyZXNzIHJlbGVhc2UKLQotdmVyc2lvbiAwLjIgW0FwcmlsIDEsIDE5OTVdCi0gIGFkZGVkIHJlYWRlciBpbnRvIHBuZy5oCi0gIGZpeGVkIHNtYWxsIHByb2JsZW1zIGluIHN0dWIgZmlsZQotCi12ZXJzaW9uIDAuMyBbQXByaWwgOCwgMTk5NV0KLSAgYWRkZWQgcHVsbCByZWFkZXIKLSAgc3BsaXQgdXAgcG5nd3JpdGUuYyB0byBzZXZlcmFsIGZpbGVzCi0gIGFkZGVkIHBuZ2xpYi50eHQKLSAgYWRkZWQgZXhhbXBsZS5jCi0gIGNsZWFuZWQgdXAgd3JpdGVyLCBhZGRpbmcgYSBmZXcgbmV3IHRyYW5zZm9ybWF0aW9ucwotICBmaXhlZCBzb21lIGJ1Z3MgaW4gd3JpdGVyCi0gIGludGVyZmFjZWQgd2l0aCB6bGliIDAuNQotICBhZGRlZCBLJlIgc3VwcG9ydAotICBhZGRlZCBjaGVjayBmb3IgNjQgS0IgYmxvY2tzIGZvciAxNiBiaXQgbWFjaGluZXMKLQotdmVyc2lvbiAwLjQgW0FwcmlsIDI2LCAxOTk1XQotICBjbGVhbmVkIHVwIGNvZGUgYW5kIGNvbW1lbnRlZCBjb2RlCi0gIHNpbXBsaWZpZWQgdGltZSBoYW5kbGluZyBpbnRvIHBuZ190aW1lCi0gIGNyZWF0ZWQgcG5nX2NvbG9yXzE2IGFuZCBwbmdfY29sb3JfOCB0byBoYW5kbGUgY29sb3IgbmVlZHMKLSAgY2xlYW5lZCB1cCBjb2xvciB0eXBlIGRlZmluZXMKLSAgZml4ZWQgdmFyaW91cyBidWdzCi0gIG1hZGUgdmFyaW91cyBuYW1lcyBtb3JlIGNvbnNpc3RlbnQKLSAgaW50ZXJmYWNlZCB3aXRoIHpsaWIgMC43MQotICBjbGVhbmVkIHVwIHpUWHQgcmVhZGVyIGFuZCB3cml0ZXIgKHVzaW5nIHpsaWIncyBSZXNldCBmdW5jdGlvbnMpCi0gIHNwbGl0IHRyYW5zZm9ybWF0aW9ucyBpbnRvIHBuZ3J0cmFuLmMgYW5kIHBuZ3d0cmFuLmMKLQotdmVyc2lvbiAwLjUgW0FwcmlsIDMwLCAxOTk1XQotICBpbnRlcmZhY2VkIHdpdGggemxpYiAwLjgKLSAgZml4ZWQgbWFueSByZWFkaW5nIGFuZCB3cml0aW5nIGJ1Z3MKLSAgc2F2ZWQgdXNpbmcgMyBzcGFjZXMgaW5zdGVhZCBvZiB0YWJzCi0KLXZlcnNpb24gMC42IFtNYXkgMSwgMTk5NV0KLSAgZmlyc3QgYmV0YSByZWxlYXNlCi0gIGFkZGVkIHBuZ19sYXJnZV9tYWxsb2MoKSBhbmQgcG5nX2xhcmdlX2ZyZWUoKQotICBhZGRlZCBwbmdfc2l6ZV90Ci0gIGNsZWFuZWQgdXAgc29tZSBjb21waWxlciB3YXJuaW5ncwotICBhZGRlZCBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpCi0KLXZlcnNpb24gMC43IFtKdW5lIDI0LCAxOTk1XQotICBjbGVhbmVkIHVwIGxvdHMgb2YgYnVncwotICBmaW5pc2hlZCBkaXRoZXJpbmcgYW5kIG90aGVyIHN0dWZmCi0gIGFkZGVkIHRlc3QgcHJvZ3JhbQotICBjaGFuZ2VkIG5hbWUgZnJvbSBwbmdsaWIgdG8gbGlicG5nCi0KLXZlcnNpb24gMC43MSBbSnVuZSAyNiwgMTk5NV0KLSAgY2hhbmdlZCBwbmd0ZXN0LnBuZyBmb3IgemxpYiAwLjkzCi0gIGZpeGVkIGVycm9yIGluIGxpYnBuZy50eHQgYW5kIGV4YW1wbGUuYwotCi12ZXJzaW9uIDAuOCBbQXVndXN0IDIwLCAxOTk1XQotICBjbGVhbmVkIHVwIHNvbWUgYnVncwotICBhZGRlZCBwbmdfc2V0X2ZpbGxlcigpCi0gIHNwbGl0IHVwIHBuZ3N0dWIuYyBpbnRvIHBuZ21lbS5jLCBwbmdpby5jLCBhbmQgcG5nZXJyb3IuYwotICBhZGRlZCAjZGVmaW5lJ3MgdG8gcmVtb3ZlIHVud2FudGVkIGNvZGUKLSAgbW92ZWQgcG5nX2luZm9faW5pdCgpIHRvIHBuZy5jCi0gIGFkZGVkIG9sZF9zaXplIGludG8gcG5nX3JlYWxsb2MoKQotICBhZGRlZCBmdW5jdGlvbnMgdG8gbWFudWFsbHkgc2V0IGZpbHRlcmluZyBhbmQgY29tcHJlc3Npb24gaW5mbwotICBjaGFuZ2VkIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYmFzZWQgb24gaW1hZ2UgdHlwZQotICBvcHRpbWl6ZWQgZmlsdGVyIHNlbGVjdGlvbiBjb2RlCi0gIGFkZGVkIHZlcnNpb24gaW5mbwotICBjaGFuZ2VkIGV4dGVybmFsIGZ1bmN0aW9ucyBwYXNzaW5nIGZsb2F0cyB0byBkb3VibGVzIChrJnIgcHJvYmxlbXM/KQotICBwdXQgYWxsIHRoZSBjb25maWd1cmFibGUgc3R1ZmYgaW4gcG5nY29uZi5oCi0gIGVuYWJsZWQgcG5nX3NldF9zaGlmdCB0byB3b3JrIHdpdGggcGFsZXR0ZWQgaW1hZ2VzIG9uIHJlYWQKLSAgYWRkZWQgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSAtIHVwZGF0ZXMgaW5mbyBzdHJ1Y3R1cmUgd2l0aCB0cmFuc2Zvcm1hdGlvbnMKLQotVmVyc2lvbiAwLjgxIFtBdWd1c3QsIDE5OTVdCi0gIGluY29ycG9yYXRlZCBUaW0gV2VnbmVyJ3MgbWVkaXVtIG1vZGVsIGNvZGUgKHRoYW5rcywgVGltKQotCi1WZXJzaW9uIDAuODIgW1NlcHRlbWJlciwgMTk5NV0KLSAgW3Vuc3BlY2lmaWVkIGNoYW5nZXNdCi0KLVZlcnNpb24gMC44NSBbRGVjZW1iZXIsIDE5OTVdCi0gIGFkZGVkIG1vcmUgbWVkaXVtIG1vZGVsIGNvZGUgKGFsbW9zdCBldmVyeXRoaW5nJ3MgYSBmYXIpCi0gIGFkZGVkIGkvbywgZXJyb3IsIGFuZCBtZW1vcnkgY2FsbGJhY2sgZnVuY3Rpb25zCi0gIGZpeGVkIHNvbWUgYnVncyAoMTYtYml0LCA0LWJpdCBpbnRlcmxhY2VkLCBldGMuKQotICBhZGRlZCBmaXJzdCBydW4gcHJvZ3Jlc3NpdmUgcmVhZGVyIChiYXJlbHkgdGVzdGVkKQotCi1WZXJzaW9uIDAuODYgW0phbnVhcnksIDE5OTZdCi0gIGZpeGVkIGJ1Z3MKLSAgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbgotCi1WZXJzaW9uIDAuODcgW0phbnVhcnksIDE5OTZdCi0gIGZpeGVkIG1lZGl1bSBtb2RlbCBidWdzCi0gIGZpeGVkIG90aGVyIGJ1Z3MgaW50cm9kdWNlZCBpbiAwLjg1IGFuZCAwLjg2Ci0gIGFkZGVkIHNvbWUgbWlub3IgZG9jdW1lbnRhdGlvbgotCi1WZXJzaW9uIDAuODggW0phbnVhcnksIDE5OTZdCi0gIGZpeGVkIHByb2dyZXNzaXZlIGJ1Z3MKLSAgcmVwbGFjZWQgdGFicyB3aXRoIHNwYWNlcwotICBjbGVhbmVkIHVwIGRvY3VtZW50YXRpb24KLSAgYWRkZWQgY2FsbGJhY2tzIGZvciByZWFkL3dyaXRlIGFuZCB3YXJuaW5nL2Vycm9yIGZ1bmN0aW9ucwotCi1WZXJzaW9uIDAuODkgW0p1bmUgNSwgMTk5Nl0KLSAgQWRkZWQgbmV3IGluaXRpYWxpemF0aW9uIEFQSSB0byBtYWtlIGxpYnBuZyB3b3JrIGJldHRlciB3aXRoIHNoYXJlZCBsaWJzCi0gICAgd2Ugbm93IGhhdmUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpLCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpLAotICAgIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSwgYW5kCi0gICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCkgaW5zdGVhZCBvZiB0aGUgc2VwYXJhdGUgY2FsbHMgdG8KLSAgICBtYWxsb2MgYW5kIHBuZ19yZWFkX2luaXQoKSwgcG5nX2luZm9faW5pdCgpLCBhbmQgcG5nX3dyaXRlX2luaXQoKQotICBDaGFuZ2VkIHdhcm5pbmcvZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIGZpeCBidWcgLSB0aGlzIG1lYW5zIHlvdQotICAgIHNob3VsZCB1c2UgdGhlIG5ldyBpbml0aWFsaXphdGlvbiBBUEkgaWYgeW91IHdlcmUgdXNpbmcgdGhlIG9sZAotICAgIHBuZ19zZXRfbWVzc2FnZV9mbigpIGNhbGxzLCBhbmQgdGhhdCB0aGUgb2xkIEFQSSBubyBsb25nZXIgZXhpc3RzCi0gICAgc28gdGhhdCBwZW9wbGUgYXJlIGF3YXJlIHRoYXQgdGhleSBuZWVkIHRvIGNoYW5nZSB0aGVpciBjb2RlCi0gIENoYW5nZWQgZmlsdGVyIHNlbGVjdGlvbiBBUEkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIG11bHRpcGxlIGZpbHRlcnMKLSAgICBzaW5jZSBpdCBkaWRuJ3Qgd29yayBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBsaWJwbmcgYW55d2F5cwotICBPcHRpbWl6ZWQgZmlsdGVyIHNlbGVjdGlvbiBjb2RlCi0gIEZpeGVkIHBuZ19zZXRfYmFja2dyb3VuZCgpIHRvIGFsbG93IHVzaW5nIGFuIGFyYml0cmFyeSBSR0IgY29sb3IgZm9yCi0gICAgcGFsZXR0ZWQgaW1hZ2VzCi0gIEZpeGVkIGdhbW1hIGFuZCBiYWNrZ3JvdW5kIGNvcnJlY3Rpb24gZm9yIHBhbGV0dGVkIGltYWdlcywgc28KLSAgICBwbmdfY29ycmVjdF9wYWxldHRlIGlzIG5vdCBuZWVkZWQgdW5sZXNzIHlvdSBhcmUgY29ycmVjdGluZyBhbgotICAgIGV4dGVybmFsIHBhbGV0dGUgKHlvdSB3aWxsIG5lZWQgdG8gI2RlZmluZSBQTkdfQ09SUkVDVF9QQUxFVFRFX1NVUFBPUlRFRAotICAgIGluIHBuZ2NvbmYuaCkgLSBpZiBub2JvZHkgdXNlcyB0aGlzLCBpdCBtYXkgZGlzYXBwZWFyIGluIHRoZSBmdXR1cmUuCi0gIEZpeGVkIGJ1ZyB3aXRoIEJvcmxhbmQgNjRLIG1lbW9yeSBhbGxvY2F0aW9uIChBbGV4YW5kZXIgTGVobWFubikKLSAgRml4ZWQgYnVnIGluIGludGVybGFjZSBoYW5kbGluZyAoU21hcmFzZGVyYWdkLCBJIHRoaW5rKQotICBBZGRlZCBtb3JlIGVycm9yIGNoZWNraW5nIGZvciB3cml0aW5nIGFuZCBpbWFnZSB0byByZWR1Y2UgaW52YWxpZCBmaWxlcwotICBTZXBhcmF0ZWQgcmVhZCBhbmQgd3JpdGUgZnVuY3Rpb25zIHNvIHRoYXQgdGhleSB3b24ndCBib3RoIGJlIGxpbmtlZAotICAgIGludG8gYSBiaW5hcnkgd2hlbiBvbmx5IHJlYWRpbmcgb3Igd3JpdGluZyBmdW5jdGlvbmFsaXR5IGlzIHVzZWQKLSAgTmV3IHBuZ3Rlc3QgaW1hZ2UgYWxzbyBoYXMgaW50ZXJsYWNpbmcgYW5kIHpUWHQKLSAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgbmV3IEFQSQotCi1WZXJzaW9uIDAuODljIFtKdW5lIDE3LCAxOTk2XQotICBCdWcgZml4ZXMuCi0KLVZlcnNpb24gMC45MCBbSmFudWFyeSwgMTk5N10KLSAgTWFkZSBDUkMgZXJyb3JzL3dhcm5pbmdzIG9uIGNyaXRpY2FsIGFuZCBhbmNpbGxhcnkgY2h1bmtzIGNvbmZpZ3VyYWJsZQotICBsaWJwbmcgd2lsbCB1c2UgdGhlIHpsaWIgQ1JDIHJvdXRpbmVzIGJ5IChjb21waWxlLXRpbWUpIGRlZmF1bHQKLSAgQ2hhbmdlZCBET1Mgc21hbGwvbWVkaXVtIG1vZGVsIG1lbW9yeSBzdXBwb3J0IC0gbmVlZHMgemxpYiAxLjA0IChUaW0gV2VnbmVyKQotICBBZGRlZCBleHRlcm5hbCBDKysgd3JhcHBlciBzdGF0ZW1lbnRzIHRvIHBuZy5oIChHaWxsZXMgRGF1cGhpbikKLSAgQWxsb3cgUE5HIGZpbGUgdG8gYmUgcmVhZCB3aGVuIHNvbWUgb3IgYWxsIG9mIGZpbGUgc2lnbmF0dXJlIGhhcyBhbHJlYWR5Ci0gICAgYmVlbiByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLiAgKioqKlRoaXMgYWZmZWN0cyB0aGUgc2l6ZQotICAgIG9mIGluZm9fc3RydWN0IGFuZCBpbnZhbGlkYXRlcyBhbGwgcHJvZ3JhbXMgdGhhdCB1c2UgYSBzaGFyZWQgbGlicG5nKioqKgotICBGaXhlZCBwbmdfZmlsbGVyKCkgZGVjbGFyYXRpb25zCi0gIEZpeGVkPyBiYWNrZ3JvdW5kIGNvbG9yIGNvbnZlcnNpb25zCi0gIEZpeGVkIG9yZGVyIG9mIGVycm9yIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1hdGNoIGRvY3VtZW50YXRpb24KLSAgQ3VycmVudCBjaHVuayBuYW1lIGlzIG5vdyBhdmFpbGFibGUgaW4gcG5nX3N0cnVjdCB0byByZWR1Y2UgdGhlIG51bWJlcgotICAgIG9mIG5lYXJseSBpZGVudGljYWwgZXJyb3IgbWVzc2FnZXMgKHdpbGwgc2ltcGxpZnkgbXVsdGktbGluZ3VhbAotICAgIHN1cHBvcnQgd2hlbiBhdmFpbGFibGUpCi0gIFRyeSB0byBnZXQgcmVhZHkgZm9yIHVua25vd24tY2h1bmsgY2FsbGJhY2sgZnVuY3Rpb25zOgotICAgIC0gcHJldmlvdXNseSByZWFkIGNyaXRpY2FsIGNodW5rcyBhcmUgZmxhZ2dlZCwgc28gdGhlIGNodW5rIGhhbmRsaW5nCi0gICAgICByb3V0aW5lcyBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBjaHVuayBpcyBpbiB0aGUgcmlnaHQgcGxhY2UKLSAgICAtIGFsbCBjaHVuayBoYW5kbGluZyByb3V0aW5lcyBoYXZlIHRoZSBzYW1lIHByb3RvdHlwZXMsIHNvIHdlIHdpbGwKLSAgICAgIGJlIGFibGUgdG8gaGFuZGxlIGFsbCBjaHVua3MgdmlhIGEgY2FsbGJhY2sgbWVjaGFuaXNtCi0gIFRyeSB0byBmaXggTGludXggInNldGptcCIgYnVmZmVyIHNpemUgcHJvYmxlbXMKLSAgUmVtb3ZlZCBwbmdfbGFyZ2VfbWFsbG9jLCBwbmdfbGFyZ2VfZnJlZSwgYW5kIHBuZ19yZWFsbG9jIGZ1bmN0aW9ucy4KLQotVmVyc2lvbiAwLjk1IFtNYXJjaCwgMTk5N10KLSAgRml4ZWQgYnVnIGluIHBuZ3d1dGlsLmMgYWxsb2NhdGluZyAidXBfcm93IiB0d2ljZSBhbmQgImF2Z19yb3ciIG5ldmVyCi0gIEZpeGVkIGJ1ZyBpbiBQTkcgZmlsZSBzaWduYXR1cmUgY29tcGFyZXMgd2hlbiBzdGFydCAhPSAwCi0gIENoYW5nZWQgcGFyYW1ldGVyIHR5cGUgb2YgcG5nX3NldF9maWxsZXIoLi4uZmlsbGVyLi4uKSBmcm9tIHBuZ19ieXRlCi0gICAgdG8gcG5nX3VpbnRfMzIKLSAgQWRkZWQgdGVzdCBmb3IgTUFDT1MgdG8gZW5zdXJlIHRoYXQgYm90aCBtYXRoLmggYW5kIGZwLmggYXJlIG5vdCAjaW5jbHVkZWQKLSAgQWRkZWQgbWFjcm9zIGZvciBsaWJwbmcgdG8gYmUgY29tcGlsZWQgYXMgYSBXaW5kb3dzIERMTCAoQW5kcmVhcyBLdXByaWVzKQotICBBZGRlZCAicGFja3N3YXAiIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBjaGFuZ2VzIHRoZSBlbmRpYW5uZXNzIG9mCi0gICAgcGFja2VkLXBpeGVsIGJ5dGVzIChLZXZpbiBCcmFjZXkpCi0gIEFkZGVkICJzdHJpcF9hbHBoYSIgdHJhbnNmb3JtYXRpb24sIHdoaWNoIHJlbW92ZXMgdGhlIGFscGhhIGNoYW5uZWwgb2YKLSAgICBpbnB1dCBpbWFnZXMgd2l0aG91dCB1c2luZyBpdCAobm90IG5lY2Vzc2FyaWx5IGEgZ29vZCBpZGVhKQotICBBZGRlZCAic3dhcF9hbHBoYSIgdHJhbnNmb3JtYXRpb24sIHdoaWNoIHB1dHMgdGhlIGFscGhhIGNoYW5uZWwgaW4gZnJvbnQKLSAgICBvZiB0aGUgY29sb3IgYnl0ZXMgaW5zdGVhZCBvZiBhZnRlcgotICBSZW1vdmVkIGFsbCBpbXBsaWNpdCB2YXJpYWJsZSB0ZXN0cyB3aGljaCBhc3N1bWUgTlVMTCA9PSAwIChJIHRoaW5rKQotICBDaGFuZ2VkIHNldmVyYWwgdmFyaWFibGVzIHRvICJwbmdfc2l6ZV90IiB0byBzaG93IDE2LzMyLWJpdCBsaW1pdGF0aW9ucwotICBBZGRlZCBuZXcgcENBTCBjaHVuayByZWFkL3dyaXRlIHN1cHBvcnQKLSAgQWRkZWQgZXhwZXJpbWVudGFsIGZpbHRlciBzZWxlY3Rpb24gd2VpZ2h0aW5nIChHcmVnIFJvZWxvZnMpCi0gIFJlbW92ZWQgb2xkIHBuZ19zZXRfcmdieCgpIGFuZCBwbmdfc2V0X3hyZ2IoKSBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4KLSAgICBvYnNvbGV0ZSBmb3IgYWJvdXQgMiB5ZWFycyBub3cgKHVzZSBwbmdfc2V0X2ZpbGxlcigpIGluc3RlYWQpCi0gIEFkZGVkIG1hY3JvcyB0byByZWFkIDE2LSBhbmQgMzItYml0IGludHMgZGlyZWN0bHkgZnJvbSBidWZmZXIsIHRvIGJlCi0gICAgdXNlZCBvbmx5IG9uIHRob3NlIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0IChuYW1lbHkgUG93ZXJQQyBhbmQgNjgweDApCi0gICAgV2l0aCBzb21lIHRlc3RpbmcsIHRoaXMgbWF5IGJlY29tZSB0aGUgZGVmYXVsdCBmb3IgTUFDT1MvUFBDIHN5c3RlbXMuCi0gIE9ubHkgY2FsY3VsYXRlIENSQyBvbiBkYXRhIGlmIHdlIGFyZSBnb2luZyB0byB1c2UgaXQKLSAgQWRkZWQgbWFjcm9zIGZvciB6VFh0IGNvbXByZXNzaW9uIHR5cGUgUE5HX3pUWHRfQ09NUFJFU1NJT05fPz8/Ci0gIEFkZGVkIG1hY3JvcyBmb3Igc2ltcGxlIGxpYnBuZyBkZWJ1Z2dpbmcgb3V0cHV0IHNlbGVjdGFibGUgYXQgY29tcGlsZSB0aW1lCi0gIFJlbW92ZWQgUE5HX1JFQURfRU5EX01PREUgaW4gcHJvZ3Jlc3NpdmUgcmVhZGVyIChTbWFyYXNkZXJhZ2QpCi0gIE1vcmUgZGVzY3JpcHRpb24gb2YgaW5mb19zdHJ1Y3QgaW4gbGlicG5nLnR4dCBhbmQgcG5nLmgKLSAgTW9yZSBpbnN0cnVjdGlvbnMgaW4gZXhhbXBsZS5jCi0gIE1vcmUgY2h1bmsgdHlwZXMgdGVzdGVkIGluIHBuZ3Rlc3QuYwotICBSZW5hbWVkIHBuZ3JjYi5jIHRvIHBuZ3NldC5jLCBhbmQgYWxsIHBuZ19yZWFkXzxjaHVuaz4gZnVuY3Rpb25zIHRvIGJlCi0gICAgcG5nX3NldF88Y2h1bms+LiAgV2Ugbm93IGhhdmUgY29ycmVzcG9uZGluZyBwbmdfZ2V0XzxjaHVuaz4KLSAgICBmdW5jdGlvbnMgaW4gcG5nZ2V0LmMgdG8gZ2V0IGluZm9ybWF0aW9uIGluIGluZm9fcHRyLiAgVGhpcyBpc29sYXRlcwotICAgIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBvcmdhbml6YXRpb24gb2YgcG5nX2luZm9fc3RydWN0Ci0gICAgKGdvb2QgZm9yIHNoYXJlZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9ucykuCi0KLVZlcnNpb24gMC45NiBbTWF5LCAxOTk3XQotICBGaXhlZCBzZXJpb3VzIGJ1ZyB3aXRoIDwgOGJwcCBpbWFnZXMgaW50cm9kdWNlZCBpbiAwLjk1Ci0gIEZpeGVkIDI1Ni1jb2xvciB0cmFuc3BhcmVuY3kgYnVnIChHcmVnIFJvZWxvZnMpCi0gIEZpeGVkIHVwIGRvY3VtZW50YXRpb24gKEdyZWcgUm9lbG9mcywgTGFzemxvIE55dWwpCi0gIEZpeGVkICJlcnJvciIgaW4gcG5nY29uZi5oIGZvciBMaW51eCBzZXRqbXAoKSBiZWhhdmlvcgotICBGaXhlZCBET1MgbWVkaXVtIG1vZGVsIHN1cHBvcnQgKFRpbSBXZWduZXIpCi0gIEZpeGVkIHBuZ19jaGVja19rZXl3b3JkKCkgZm9yIGNhc2Ugd2l0aCBlcnJvciBpbiBzdGF0aWMgc3RyaW5nIHRleHQKLSAgQWRkZWQgcmVhZCBvZiBDUkMgYWZ0ZXIgSUVORCBjaHVuayBmb3IgZW1iZWRkZWQgUE5HcyAoTGFzemxvIE55dWwpCi0gIEFkZGVkIHR5cGVjYXN0cyB0byBxdWlldCBjb21waWxlciBlcnJvcnMKLSAgQWRkZWQgbW9yZSBkZWJ1Z2dpbmcgaW5mbwotCi1WZXJzaW9uIDAuOTcgW0phbnVhcnksIDE5OThdCi0gIFJlbW92ZWQgUE5HX1VTRV9PV05fQ1JDIGNhcGFiaWxpdHkKLSAgUmVsb2NhdGVkIHBuZ19zZXRfY3JjX2FjdGlvbiBmcm9tIHBuZ3J1dGlsLmMgdG8gcG5ncnRyYW4uYwotICBGaXhlZCB0eXBlY2FzdHMgb2YgIm5ld19rZXkiLCBldGMuIChBbmRyZWFzIERpbGdlcikKLSAgQWRkZWQgUkZDIDExNTIgW3NpY10gZGF0ZSBzdXBwb3J0Ci0gIEZpeGVkIGJ1ZyBpbiBnYW1tYSBoYW5kbGluZyBvZiA0LWJpdCBncmF5c2NhbGUKLSAgQWRkZWQgMi1iaXQgZ3JheXNjYWxlIGdhbW1hIGhhbmRsaW5nIChHbGVubiBSLVApCi0gIEFkZGVkIG1vcmUgdHlwZWNhc3RzLiA2NTUzNkwgYmVjb21lcyAocG5nX3VpbnRfMzIpNjU1MzZMLCBldGMuIChHbGVubiBSLVApCi0gIE1pbm9yIGNvcnJlY3Rpb25zIGluIGxpYnBuZy50eHQKLSAgQWRkZWQgc2ltcGxlIHNSR0Igc3VwcG9ydCAoR2xlbm4gUi1QKQotICBFYXNpZXIgY29uZGl0aW9uYWwgY29tcGlsaW5nLCBlLmcuLAotICAgIGRlZmluZSBQTkdfUkVBRC9XUklURV9OT1RfRlVMTFlfU1VQUE9SVEVEOwotICAgIGFsbCBjb25maWd1cmFibGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgZnJvbSBjb21tYW5kLWxpbmUgaW5zdGVhZAotICAgIG9mIGhhdmluZyB0byBlZGl0IHBuZ2NvbmYuaCAoR2xlbm4gUi1QKQotICBGaXhlZCBtZW1vcnkgbGVhayBpbiBwbmd3cml0ZS5jIChmcmVlIGluZm9fcHRyLT50ZXh0KSAoR2xlbm4gUi1QKQotICBBZGRlZCBtb3JlIGNvbmRpdGlvbnMgZm9yIHBuZ19kb19iYWNrZ3JvdW5kLCB0byBhdm9pZCBjaGFuZ2luZwotICAgIGJsYWNrIHBpeGVscyB0byBiYWNrZ3JvdW5kIHdoZW4gYSBiYWNrZ3JvdW5kIGlzIHN1cHBsaWVkIGFuZAotICAgIG5vIHBpeGVscyBhcmUgdHJhbnNwYXJlbnQKLSAgUmVwYWlyZWQgUE5HX05PX1NURElPIGJlaGF2aW9yCi0gIFRlc3RlZCBOT0RJViBzdXBwb3J0IGFuZCBtYWRlIGl0IGRlZmF1bHQgYmVoYXZpb3IgKEdyZWcgUm9lbG9mcykKLSAgQWRkZWQgIi1tIiBvcHRpb24gYW5kIFBOR1RFU1RfREVCVUdfTUVNT1JZIHRvIHBuZ3Rlc3QgKEpvaG4gQm93bGVyKQotICBSZWd1bGFyaXplZCB2ZXJzaW9uIG51bWJlcmluZyBzY2hlbWUgYW5kIGJ1bXBlZCBzaGFyZWQtbGlicmFyeSBtYWpvcgotICAgIHZlcnNpb24gbnVtYmVyIHRvIDIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBsaWJwbmcgMC44OSBhcHBzCi0gICAgKEdyZWcgUm9lbG9mcykKLQotVmVyc2lvbiAwLjk4IFtKYW51YXJ5LCAxOTk4XQotICBDbGVhbmVkIHVwIHNvbWUgdHlwb3MgaW4gbGlicG5nLnR4dCBhbmQgaW4gY29kZSBkb2N1bWVudGF0aW9uCi0gIEZpeGVkIG1lbW9yeSBsZWFrcyBpbiBwQ0FMIGNodW5rIHByb2Nlc3NpbmcgKEdsZW5uIFItUCBhbmQgSm9obiBCb3dsZXIpCi0gIENvc21ldGljIGNoYW5nZSAiZGlzcGxheV9nYW1tYSIgdG8gInNjcmVlbl9nYW1tYSIgaW4gcG5ncnRyYW4uYwotICBDaGFuZ2VkIHJlY29tbWVuZGF0aW9uIGFib3V0IGZpbGVfZ2FtbWEgZm9yIFBDIGltYWdlcyB0byAuNTEgZnJvbSAuNDUsCi0gICAgaW4gZXhhbXBsZS5jIGFuZCBsaWJwbmcudHh0LCBhZGRlZCBjb21tZW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCi0gICAgc2NyZWVuX2dhbW1hLCB2aWV3aW5nX2dhbW1hLCBhbmQgZGlzcGxheV9nYW1tYS4KLSAgQ2hhbmdlZCBhbGwgcmVmZXJlbmNlcyB0byBSRkMxMTUyIHRvIHJlYWQgUkZDMTEyMyBhbmQgY2hhbmdlZCB0aGUKLSAgICBQTkdfVElNRV9SRkMxMTUyX1NVUFBPUlRFRCBtYWNybyB0byBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRAotICBBZGRlZCBwbmdfaW52ZXJ0X2FscGhhIGNhcGFiaWxpdHkgKEdsZW5uIFItUCAtLSBzdWdnZXN0aW9uIGJ5IEpvbiBWaW5jZW50KQotICBDaGFuZ2VkIHNyZ2JfaW50ZW50IGZyb20gcG5nX2J5dGUgdG8gaW50IHRvIGF2b2lkIGNvbXBpbGVyIGJ1Z3MKLQotVmVyc2lvbiAwLjk5IFtKYW51YXJ5IDMwLCAxOTk4XQotICBGcmVlIGluZm9fcHRyLT50ZXh0IGluc3RlYWQgb2YgZW5kX2luZm9fcHRyLT50ZXh0IGluIHBuZ3JlYWQuYyAoSm9obiBCb3dsZXIpCi0gIEZpeGVkIGEgbG9uZ3N0YW5kaW5nICJwYWNrc3dhcCIgYnVnIGluIHBuZ3RyYW5zLmMKLSAgRml4ZWQgc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gcG5nY29uZi5oIHRoYXQgcHJldmVudGVkIGNvbXBpbGluZyB3aXRoCi0gICAgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEIGFuZCBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRCB1bmRlZmluZWQKLSAgRml4ZWQgc29tZSB0eXBvcyBhbmQgbWFkZSBvdGhlciBtaW5vciByZWFycmFuZ2VtZW50IG9mIGxpYnBuZy50eHQgKEFuZHJlYXMpCi0gIENoYW5nZWQgcmVjb21tZW5kYXRpb24gYWJvdXQgZmlsZV9nYW1tYSBmb3IgUEMgaW1hZ2VzIHRvIC41MCBmcm9tIC41MSBpbgotICAgIGV4YW1wbGUuYyBhbmQgbGlicG5nLnR4dCwgYW5kIGNoYW5nZWQgZmlsZV9nYW1tYSBmb3Igc1JHQiBpbWFnZXMgdG8gLjQ1Ci0gIEFkZGVkIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0byBhY2Nlc3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgcG5nIHN0cnVjdHVyZQotICAgIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KCksIGV0Yy4gKEdsZW5uIFItUCwgc3VnZ2VzdGlvbiBieSBCcmFkIFBldHRpdCkKLSAgQWRkZWQgVEFSR0VUX01BQ09TIHNpbWlsYXIgdG8gemxpYi0xLjAuOAotICBEZWZpbmUgUE5HX0FMV0FZU19FWFRFUk4gd2hlbiBfX01XRVJLU19fICYmIFdJTjMyIGFyZSBkZWZpbmVkCi0gIEFkZGVkIHR5cGUgY2FzdGluZyB0byBhbGwgcG5nX21hbGxvYygpIGZ1bmN0aW9uIGNhbGxzCi0KLVZlcnNpb24gMC45OWEgW0phbnVhcnkgMzEsIDE5OThdCi0gIEFkZGVkIHR5cGUgY2FzdHMgYW5kIHBhcmVudGhlc2VzIHRvIGFsbCByZXR1cm5zIHRoYXQgcmV0dXJuIGEgdmFsdWUuKFRpbSBXLikKLQotVmVyc2lvbiAwLjk5YiBbRmVicnVhcnkgNCwgMTk5OF0KLSAgQWRkZWQgdHlwZSBjYXN0IHBuZ191aW50XzMyIG9uIG1hbGxvYyBmdW5jdGlvbiBjYWxscyB3aGVyZSBuZWVkZWQuCi0gIENoYW5nZWQgdHlwZSBvZiBudW1faGlzdCBmcm9tIHBuZ191aW50XzMyIHRvIGludCAoc2FtZSBhcyBudW1fcGFsZXR0ZSkuCi0gIEFkZGVkIGNoZWNrcyBmb3Igcm93Ynl0ZXMgb3ZlcmZsb3csIGluIGNhc2UgcG5nX3NpemVfdCBpcyBsZXNzIHRoYW4gMzIgYml0cy4KLSAgUmVuYW1lZCBtYWtlZmlsZS5lbGYgdG8gbWFrZWZpbGUubG54LgotCi1WZXJzaW9uIDAuOTljIFtGZWJydWFyeSA3LCAxOTk4XQotICBNb3JlIHR5cGUgY2FzdGluZy4gIFJlbW92ZWQgZXJyb25lb3VzIG92ZXJmbG93IHRlc3QgaW4gcG5nbWVtLmMuCi0gIEFkZGVkIHBuZ19idWZmZXJlZF9tZW1jcHkoKSBhbmQgcG5nX2J1ZmZlcmVkX21lbXNldCgpLCBhcHBseSB0aGVtIHRvIHJvd2J5dGVzLgotICBBZGRlZCBVTklYIG1hbnVhbCBwYWdlcyBsaWJwbmcuMyAoaW5jb3Jwb3JhdGluZyBsaWJwbmcudHh0KSBhbmQgIHBuZy41LgotCi1WZXJzaW9uIDAuOTlkIFtGZWJydWFyeSAxMSwgMTk5OF0KLSAgUmVuYW1lZCAiZmFyX3RvX25lYXIoKSIgInBuZ19mYXJfdG9fbmVhcigpIgotICBSZXZpc2VkIGxpYnBuZy4zCi0gIFZlcnNpb24gOTljICJidWZmZXJlZCIgb3BlcmF0aW9ucyBkaWRuJ3Qgd29yayBhcyBpbnRlbmRlZC4gIFJlcGxhY2VkIHRoZW0KLSAgICB3aXRoIHBuZ19tZW1jcHlfY2hlY2soKSBhbmQgcG5nX21lbXNldF9jaGVjaygpLgotICBBZGRlZCBtYW55ICJpZiAocG5nX3B0ciA9PSBOVUxMKSByZXR1cm4iIHRvIHF1ZWxsIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0Ci0gICAgdW51c2VkIHBuZ19wdHIsIG1vc3RseSBpbiBwbmdnZXQuYyBhbmQgcG5nc2V0LmMuCi0gIENoZWNrIGZvciBvdmVybGVuZ3RoIHRSTlMgY2h1bmsgcHJlc2VudCB3aGVuIGluZGV4ZWQtY29sb3IgUExURSBpcyByZWFkLgotICBDbGVhbmVkIHVwIHNwZWxsaW5nIGVycm9ycyBpbiBsaWJwbmcuMy9saWJwbmcudHh0Ci0gIENvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCBwbmdfZ2V0X3RSTlMoKSB3aGljaCByZXR1cm5lZCB1bmRlZmluZWQgdHJhbnMgYXJyYXkKLQotVmVyc2lvbiAwLjk5ZSBbRmVicnVhcnkgMjgsIDE5OThdCi0gIENvcnJlY3RlZCBwbmdfZ2V0X3RSTlMoKSBhZ2Fpbi4KLSAgQWRkIHBhcmVudGhlc2VzIGZvciBlYXNpZXIgcmVhZGluZyBvZiBwbmdnZXQuYywgZml4ZWQgInx8IiBzaG91bGQgYmUgIiYmIi4KLSAgVG91Y2hlZCB1cCBleGFtcGxlLmMgdG8gbWFrZSBtb3JlIG9mIGl0IGNvbXBpbGVhYmxlLCBhbHRob3VnaCB0aGUgZW50aXJlCi0gICAgZmlsZSBzdGlsbCBjYW4ndCBiZSBjb21waWxlZCAoV2lsbGVtIHZhbiBTY2hhaWspCi0gIEZpeGVkIGEgYnVnIGluIHBuZ19kb19zaGlmdCgpIChCcnlhbiBUc2FpKQotICBBZGRlZCBhIHNwYWNlIGluIHBuZy5oIHByb3RvdHlwZSBmb3IgcG5nX3dyaXRlX2NodW5rX3N0YXJ0KCkKLSAgUmVwbGFjZWQgcG5ndGVzdC5wbmcgd2l0aCBvbmUgY3JlYXRlZCB3aXRoIHpsaWIgMS4xLjEKLSAgQ2hhbmdlZCBwbmd0ZXN0IHRvIHJlcG9ydCBQQVNTIGV2ZW4gd2hlbiBmaWxlIHNpemUgaXMgZGlmZmVyZW50IChKZWFuLWxvdXAgRy4pCi0gIENvcnJlY3RlZCBzb21lIGxvZ2ljIGVycm9ycyBpbiBwbmdfZG9faW52ZXJ0X2FscGhhKCkgKENocmlzIFBhdHRlcnNvbikKLQotVmVyc2lvbiAwLjk5ZiBbTWFyY2ggNSwgMTk5OF0KLSAgQ29ycmVjdGVkIGEgYnVnIGluIHBuZ3ByZWFkKCkgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDk5YyAoS2V2aW4gQnJhY2V5KQotICBNb3ZlZCBtYWtlZmlsZXMgaW50byBhICJzY3JpcHRzIiBkaXJlY3RvcnksIGFuZCBhZGRlZCBJTlNUQUxMIGluc3RydWN0aW9uIGZpbGUKLSAgQWRkZWQgbWFrZWZpbGUub3MyIGFuZCBwbmdvczIuZGVmIChBLiBaYWJvbG90bnkpIGFuZCBtYWtlZmlsZS5zMnggKFcuIFNlYm9rKQotICBBZGRlZCBwb2ludGVycyB0byAibm90ZSBvbiBsaWJwbmcgdmVyc2lvbnMiIGluIG1ha2VmaWxlLmxueCBhbmQgUkVBRE1FCi0gIEFkZGVkIHJvdyBjYWxsYmFjayBmZWF0dXJlIHdoZW4gcmVhZGluZyBhbmQgd3JpdGluZyBub25wcm9ncmVzc2l2ZSByb3dzCi0gICAgYW5kIGFkZGVkIGEgdGVzdCBvZiB0aGlzIGZlYXR1cmUgaW4gcG5ndGVzdC5jCi0gIEFkZGVkIHVzZXIgdHJhbnNmb3JtIGNhbGxiYWNrcywgd2l0aCB0ZXN0IG9mIHRoZSBmZWF0dXJlIGluIHBuZ3Rlc3QuYwotCi1WZXJzaW9uIDAuOTlnIFtNYXJjaCA2LCAxOTk4LCBtb3JuaW5nXQotICBNaW5vciBjaGFuZ2VzIHRvIHBuZ3Rlc3QuYyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5ncy4KLSAgUmVtb3ZlZCAiYmV0YSIgbGFuZ3VhZ2UgZnJvbSBkb2N1bWVudGF0aW9uLgotCi1WZXJzaW9uIDAuOTloIFtNYXJjaCA2LCAxOTk4LCBldmVuaW5nXQotICBNaW5vciBjaGFuZ2VzIHRvIHByZXZpb3VzIG1pbm9yIGNoYW5nZXMgdG8gcG5ndGVzdC5jCi0gIENoYW5nZWQgUE5HX1JFQURfTk9UX0ZVTExZX1NVUFBPUlRFRCB0byBQTkdfUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKLSAgICBhbmQgYWRkZWQgUE5HX1BST0dSRVNTSVZFX1JFQURfTk9UX1NVUFBPUlRFRCBtYWNybwotICBBZGRlZCB1c2VyIHRyYW5zZm9ybSBjYXBhYmlsaXR5Ci0KLVZlcnNpb24gMS4wMCBbTWFyY2ggNywgMTk5OF0KLSAgQ2hhbmdlZCBzZXZlcmFsIHR5cGVkZWZzIGluIHBuZ3J1dGlsLmMKLSAgQWRkZWQgbWFrZWZpbGUud2F0IChQYXdlbCBNcm9jaGVuKSwgdXBkYXRlZCBtYWtlZmlsZS50YzMgKFdpbGxlbSB2YW4gU2NoYWlrKQotICBSZXBsYWNlZCAid2hpbGUoMSkiIHdpdGggImZvcig7OykiCi0gIEFkZGVkIFBOR0FSRygpIHRvIHByb3RvdHlwZXMgaW4gcG5ndGVzdC5jIGFuZCByZW1vdmVkIHNvbWUgcHJvdG90eXBlcwotICBVcGRhdGVkIHNvbWUgb2YgdGhlIG1ha2VmaWxlcyAoVG9tIExhbmUpCi0gIENoYW5nZWQgc29tZSB0eXBlZGVmcyAoc19zdGFydCwgZXRjLikgaW4gcG5ncnV0aWwuYwotICBGaXhlZCBkaW1lbnNpb25zIG9mICJzaG9ydF9tb250aHMiIGFycmF5IGluIHBuZ3dyaXRlLmMKLSAgUmVwbGFjZWQgYW5zaTJrbnIuYyB3aXRoIHRoZSBvbmUgZnJvbSBqcGVnLXY2Ci0KLVZlcnNpb24gMS4wLjAgW01hcmNoIDgsIDE5OThdCi0gIENoYW5nZWQgbmFtZSBmcm9tIDEuMDAgdG8gMS4wLjAgKEFkYW0gQ29zdGVsbG8pCi0gIEFkZGVkIHNtYWtlZmlsZS5wcGMgKHdpdGggU0NPUFRJT05TLnBwYykgZm9yIEFtaWdhIFBQQyAoQW5kcmVhcyBLbGVpbmVydCkKLQotVmVyc2lvbiAxLjAuMGEgW01hcmNoIDksIDE5OThdCi0gIEZpeGVkIHRocmVlIGJ1Z3MgaW4gcG5ncnRyYW4uYyB0byBtYWtlIGdhbW1hK2JhY2tncm91bmQgaGFuZGxpbmcgY29uc2lzdGVudAotICAgIChHcmVnIFJvZWxvZnMpCi0gIENoYW5nZWQgZm9ybWF0IG9mIHRoZSBQTkdfTElCUE5HX1ZFUiBpbnRlZ2VyIHRvIHh5eXp6IGluc3RlYWQgb2YgeHl6Ci0gICAgZm9yIG1ham9yLCBtaW5vciwgYW5kIGJ1Z2ZpeCByZWxlYXNlcy4gIFRoaXMgaXMgMTAwMDEuIChBZGFtIENvc3RlbGxvLAotICAgIFRvbSBMYW5lKQotICBNYWtlIG1vbnRocyByYW5nZSBmcm9tIDEtMTIgaW4gcG5nX2NvbnZlcnRfdG9fcmZjMTEyMwotCi1WZXJzaW9uIDEuMC4wYiBbTWFyY2ggMTMsIDE5OThdCi0gIFF1aWV0ZWQgY29tcGlsZXIgY29tcGxhaW50cyBhYm91dCB0d28gZW1wdHkgImZvciIgbG9vcHMgaW4gcG5ncnV0aWwuYwotICBNaW5vciBjaGFuZ2VzIHRvIG1ha2VmaWxlLnMyeAotICBSZW1vdmVkICNpZmRlZi8jZW5kaWYgYXJvdW5kIGEgcG5nX2ZyZWUoKSBpbiBwbmdyZWFkLmMKLQotVmVyc2lvbiAxLjAuMSBbTWFyY2ggMTQsIDE5OThdCi0gIENoYW5nZWQgbWFrZWZpbGUuczJ4IHRvIHJlZHVjZSBzZWN1cml0eSByaXNrIG9mIHVzaW5nIGEgcmVsYXRpdmUgcGF0aG5hbWUKLSAgRml4ZWQgc29tZSB0eXBvcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoR3JlZykuCi0gIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHZhbHVlIG9mICJjaGFubmVscyIgcmV0dXJuZWQgYnkgcG5nX3JlYWRfdXBkYXRlX2luZm8oKQotCi1WZXJzaW9uIDEuMC4xYSBbQXByaWwgMjEsIDE5OThdCi0gIE9wdGltaXplZCBQYWV0aCBjYWxjdWxhdGlvbnMgYnkgcmVwbGFjaW5nIGFicygpIGZ1bmN0aW9uIGNhbGxzIHdpdGggaW50cmluc2ljcwotICBwbHVzIG90aGVyIGxvb3Agb3B0aW1pemF0aW9ucy4gSW1wcm92ZXMgYXZnIGRlY29kaW5nIHNwZWVkIGJ5IGFib3V0IDIwJS4KLSAgQ29tbWVudGVkIG91dCBpMzg2aXN0aWMgImFsaWduIiBjb21waWxlciBmbGFncyBpbiBtYWtlZmlsZS5sbnguCi0gIFJlZHVjZWQgdGhlIGRlZmF1bHQgd2FybmluZyBsZXZlbCBpbiBzb21lIG1ha2VmaWxlcywgdG8gbWFrZSB0aGVtIGNvbnNpc3RlbnQuCi0gIFJlbW92ZWQgcmVmZXJlbmNlcyB0byBJSkcgYW5kIEpQRUcgaW4gdGhlIGFuc2kya25yLmMgY29weXJpZ2h0IHN0YXRlbWVudC4KLSAgRml4ZWQgYSBidWcgaW4gcG5nX2RvX3N0cmlwX2ZpbGxlciB3aXRoIFhYUlJHR0JCID0+IFJSR0dCQiB0cmFuc2Zvcm1hdGlvbi4KLSAgQWRkZWQgZ3JheXNjYWxlIGFuZCAxNi1iaXQgY2FwYWJpbGl0eSB0byBwbmdfZG9fcmVhZF9maWxsZXIoKS4KLSAgRml4ZWQgYSBidWcgaW4gcG5nc2V0LmMsIGludHJvZHVjZWQgaW4gdmVyc2lvbiAwLjk5YywgdGhhdCBzZXRzIHJvd2J5dGVzCi0gICAgdG9vIGxhcmdlIHdoZW4gd3JpdGluZyBhbiBpbWFnZSB3aXRoIGJpdF9kZXB0aCA8IDggKEJvYiBEZWxsYWNhKS4KLSAgQ29ycmVjdGVkIHNvbWUgYnVncyBpbiB0aGUgZXhwZXJpbWVudGFsIHdlaWdodGVkIGZpbHRlcmluZyBoZXVyaXN0aWNzLgotICBNb3ZlZCBhIG1pc3BsYWNlZCBwbmdydXRpbCBjb2RlIGJsb2NrIHRoYXQgdHJ1bmNhdGVzIHRSTlMgaWYgaXQgaGFzIG1vcmUKLSAgICB0aGFuIG51bV9wYWxldHRlIGVudHJpZXMgLS0gdGVzdCB3YXMgZG9uZSBiZWZvcmUgbnVtX3BhbGV0dGUgd2FzIGRlZmluZWQuCi0gIEZpeGVkIGEgcG5nX2NvbnZlcnRfdG9fcmZjMTEyMygpIGJ1ZyB0aGF0IGNvbnZlcnRzIGRheSAzMSB0byAwIChTdGV2ZSBFZGRpbnMpLgotICBDaGFuZ2VkIGNvbXBpbGVyIGZsYWdzIGluIG1ha2VmaWxlLndhdCBmb3IgYmV0dGVyIG9wdGltaXphdGlvbgotICAgIChQYXdlbCBNcm9jaGVuKS4KLQotVmVyc2lvbiAxLjAuMWIgW01heSAyLCAxOTk4XQotICBSZWxvY2F0ZWQgcG5nX2RvX2dyYXlfdG9fcmdiKCkgd2l0aGluIHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucygpIChHcmVnKS4KLSAgUmVsb2NhdGVkIHRoZSBwbmdfY29tcG9zaXRlIG1hY3JvcyBmcm9tIHBuZ3J0cmFuLmMgdG8gcG5nLmggKEdyZWcpLgotICBBZGRlZCBtYWtlZmlsZS5zY28gKGNvbnRyaWJ1dGVkIGJ5IE1pa2UgSG9wa2lyaykuCi0gIEZpeGVkIHR3byBidWdzIChtaXNzaW5nIGRlZmluaXRpb25zIG9mICJpc3RvcCIpIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMC4xYS4KLSAgRml4ZWQgYSBidWcgaW4gcG5ncnRyYW4uYyB0aGF0IHdvdWxkIHNldCBjaGFubmVscz01IHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcy4KLSAgTW9yZSB3b3JrIG9uIHRoZSBQYWV0aC1maWx0ZXJpbmcsIGFjaGlldmluZyBpbXBlcmNlcHRpYmxlIHNwZWVkdXAKLSAgICAoQSBLbGVpbmVydCkuCi0gIE1vcmUgd29yayBvbiBsb29wIG9wdGltaXphdGlvbiB3aGljaCBtYXkgaGVscCB3aGVuIGNvbXBpbGVkIHdpdGggQysrCi0gICAgY29tcGlsZXJzLgotICBBZGRlZCB3YXJuaW5ncyB3aGVuIHBlb3BsZSB0cnkgdG8gdXNlIHRyYW5zZm9ybXMgdGhleSd2ZSBkZWZpbmVkIG91dC4KLSAgQ29sbGFwc2VkIDQgImkiIGFuZCAiYyIgbG9vcHMgaW50byBzaW5nbGUgImkiIGxvb3BzIGluIHBuZ3J0cmFuIGFuZCBwbmd3dHJhbi4KLSAgUmV2aXNlZCBwYXJhZ3JhcGggYWJvdXQgcG5nX3NldF9leHBhbmQoKSBpbiBsaWJwbmcudHh0IGFuZCBsaWJwbmcuMyAoR3JlZykKLQotVmVyc2lvbiAxLjAuMWMgW01heSAxMSwgMTk5OF0KLSAgRml4ZWQgYSBidWcgaW4gcG5ncnRyYW4uYyAoaW50cm9kdWNlZCBpbiBsaWJwbmctMS4wLjFhKSB3aGVyZSB0aGUgbWFza3MgZm9yCi0gICAgZmlsbGVyIGJ5dGVzIHNob3VsZCBoYXZlIGJlZW4gMHhmZiBpbnN0ZWFkIG9mIDB4Zi4KLSAgQWRkZWQgbWF4X3BpeGVsX2RlcHRoPTMyIGluIHBuZ3J1dGlsLmMgd2hlbiB1c2luZyBGSUxMRVIgd2l0aCBwYWxldHRlIGltYWdlcy4KLSAgTW92ZWQgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQgYW5kIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQKLSAgICBvdXQgb2YgdGhlIFBOR19XUklURV9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQgYmxvY2sgb2YgcG5nY29uZi5oCi0gIEFkZGVkICJQTkdfTk9fV1JJVEVfVFJBTlNGT1JNUyIgZXRjLiwgYXMgYWx0ZXJuYXRpdmVzIGZvciAqX05PVF9TVVBQT1JURUQsCi0gICAgZm9yIGNvbnNpc3RlbmN5LCBpbiBwbmdjb25mLmgKLSAgQWRkZWQgaW5kaXZpZHVhbCAiaWZuZGVmIFBOR19OT19bQ0FQQUJJTElUWV0iIGluIHBuZ2NvbmYuaCB0byBtYWtlIGl0IGVhc2llcgotICAgIHRvIHJlbW92ZSB1bndhbnRlZCBjYXBhYmlsaXRpZXMgdmlhIHRoZSBjb21waWxlIGxpbmUKLSAgTWFkZSBzb21lIGNvcnJlY3Rpb25zIHRvIGdyYW1tYXIgKHdoaWNoLCBpdCdzKSBpbiBkb2N1bWVudGF0aW9uIChHcmVnKS4KLSAgQ29ycmVjdGVkIGV4YW1wbGUuYywgdXNlIG9mIHJvd19wb2ludGVycyBpbiBwbmdfd3JpdGVfaW1hZ2UoKS4KLQotVmVyc2lvbiAxLjAuMWQgW01heSAyNCwgMTk5OF0KLSAgQ29ycmVjdGVkIHNldmVyYWwgc3RhdGVtZW50cyB0aGF0IHVzZWQgc2lkZSBlZmZlY3RzIGlsbGVnYWxseSBpbiBwbmdydXRpbC5jCi0gICAgYW5kIHBuZ3RyYW5zLmMsIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4wLjFiCi0gIFJldmlzZWQgcG5nX3JlYWRfcm93cygpIHRvIGF2b2lkIHJlcGVhdGVkIGlmLXRlc3RpbmcgZm9yIE5VTEwgKEEgS2xlaW5lcnQpCi0gIE1vcmUgY29ycmVjdGlvbnMgdG8gZXhhbXBsZS5jLCB1c2Ugb2Ygcm93X3BvaW50ZXJzIGluIHBuZ193cml0ZV9pbWFnZSgpCi0gICAgYW5kIHBuZ19yZWFkX3Jvd3MoKS4KLSAgQWRkZWQgcG5nZGxsLm1hayBhbmQgcG5nZGVmLnBhcyB0byBzY3JpcHRzIGRpcmVjdG9yeSwgY29udHJpYnV0ZWQgYnkKLSAgICBCb2IgRGVsbGFjYSwgdG8gbWFrZSBhIHBuZzMyYmQuZGxsIHdpdGggQm9ybGFuZCBDKysgNC41Ci0gIEZpeGVkIGVycm9yIGluIGV4YW1wbGUuYyB3aXRoIHBuZ19zZXRfdGV4dDogbnVtX3RleHQgaXMgMywgbm90IDIgKEd1aWRvIFYuKQotICBDaGFuZ2VkIHNldmVyYWwgbG9vcHMgZnJvbSBjb3VudC1kb3duIHRvIGNvdW50LXVwLCBmb3IgY29uc2lzdGVuY3kuCi0KLVZlcnNpb24gMS4wLjFlIFtKdW5lIDYsIDE5OThdCi0gIFJldmlzZWQgbGlicG5nLnR4dCBhbmQgbGlicG5nLjMgZGVzY3JpcHRpb24gb2YgcG5nX3NldF9yZWFkfHdyaXRlX2ZuKCksIGFuZAotICAgIGFkZGVkIHdhcm5pbmdzIHdoZW4gcGVvcGxlIHRyeSB0byBzZXQgcG5nX3JlYWRfZm4gYW5kIHBuZ193cml0ZV9mbiBpbgotICAgIHRoZSBzYW1lIHN0cnVjdHVyZS4KLSAgQWRkZWQgYSB0ZXN0IHN1Y2ggdGhhdCBwbmdfZG9fZ2FtbWEgd2lsbCBiZSBkb25lIHdoZW4gbnVtX3RyYW5zPT0wCi0gICAgZm9yIHRydWVjb2xvciBpbWFnZXMgdGhhdCBoYXZlIGRlZmluZWQgYSBiYWNrZ3JvdW5kLiAgVGhpcyBjb3JyZWN0cyBhbgotICAgIGVycm9yIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTAuOTAgdGhhdCBjYW4gY2F1c2UgZ2FtbWEgcHJvY2Vzc2luZwotICAgIHRvIGJlIHNraXBwZWQuCi0gIEFkZGVkIHRlc3RzIGluIHBuZy5oIHRvIGluY2x1ZGUgInRyYW5zIiBhbmQgInRyYW5zX3ZhbHVlcyIgaW4gc3RydWN0dXJlcwotICAgIHdoZW4gUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgb3IgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCBpcyBkZWZpbmVkLgotICBBZGQgcG5nX2ZyZWUocG5nX3B0ci0+dGltZV9idWZmZXIpIGluIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCkKLSAgTW92ZWQgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjMoKSBmcm9tIHBuZ3dyaXRlLmMgdG8gcG5nLmMKLSAgQWRkZWQgY2FwYWJpbGl0eSBmb3IgdXNlci1wcm92aWRlZCBtYWxsb2NfZm4oKSBhbmQgZnJlZV9mbigpIGZ1bmN0aW9ucywKLSAgICBhbmQgcmV2aXNlZCBwbmd0ZXN0LmMgdG8gZGVtb25zdHJhdGUgdGhlaXIgdXNlLCByZXBsYWNpbmcgdGhlCi0gICAgUE5HVEVTVF9ERUJVR19NRU0gZmVhdHVyZS4KLSAgQWRkZWQgbWFrZWZpbGUudzMyLCBmb3IgTWljcm9zb2Z0IEMrKyA0LjAgYW5kIGxhdGVyIChUaW0gV2VnbmVyKS4KLQotVmVyc2lvbiAxLjAuMiBbSnVuZSAxNCwgMTk5OF0KLSAgRml4ZWQgdHdvIGJ1Z3MgaW4gbWFrZWZpbGUuYm9yIC4KLQotVmVyc2lvbiAxLjAuMmEgW0RlY2VtYmVyIDMwLCAxOTk4XQotICBSZXBsYWNlZCBhbmQgZXh0ZW5kZWQgY29kZSB0aGF0IHdhcyByZW1vdmVkIGZyb20gcG5nX3NldF9maWxsZXIoKSBpbiAxLjAuMWEuCi0gIEZpeGVkIGEgYnVnIGluIHBuZ19kb19maWxsZXIoKSB0aGF0IG1hZGUgaXQgZmFpbCB0byB3cml0ZSBmaWxsZXIgYnl0ZXMgaW4KLSAgICB0aGUgbGVmdC1tb3N0IHBpeGVsIG9mIGVhY2ggcm93IChLZXZpbiBCcmFjZXkpLgotICBDaGFuZ2VkICJzdGF0aWMgcG5nY2hhcnAgdElNRV9zdHJpbmciIHRvICJzdGF0aWMgY2hhciB0SU1FX3N0cmluZ1szMF0iCi0gICAgaW4gcG5ndGVzdC5jIChEdW5jYW4gU2ltcHNvbikuCi0gIEZpeGVkIGEgYnVnIGluIHBuZ3Rlc3QuYyB0aGF0IGNhdXNlZCBwbmd0ZXN0IHRvIHRyeSB0byB3cml0ZSBhIHRJTUUgY2h1bmsKLSAgICBldmVuIHdoZW4gbm8gdElNRSBjaHVuayB3YXMgcHJlc2VudCBpbiB0aGUgc291cmNlIGZpbGUuCi0gIEZpeGVkIGEgcHJvYmxlbSBpbiBwbmdydXRpbC5jOiBncmF5X3RvX3JnYiBkaWRuJ3QgYWx3YXlzIHdvcmsgd2l0aCAxNi1iaXQuCi0gIEZpeGVkIGEgcHJvYmxlbSBpbiBwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3coKSwgd2hpY2ggd291bGQgbm90IHNraXAgc29tZQotICAgIHBhc3NlcyB0aGF0IGl0IHNob3VsZCBza2lwLCBmb3IgaW1hZ2VzIHRoYXQgYXJlIGxlc3MgdGhhbiAzIHBpeGVscyBoaWdoLgotICBJbnRlcmNoYW5nZWQgdGhlIG9yZGVyIG9mIGNhbGxzIHRvIHBuZ19kb19zd2FwKCkgYW5kIHBuZ19kb19zaGlmdCgpCi0gICAgaW4gcG5nd3RyYW4uYyAoSm9obiBDcm9tZXIpLgotICBBZGRlZCAjaWZkZWYgUE5HX0RFQlVHLyNlbmRpZiBzdXJyb3VuZGluZyB1c2Ugb2YgUE5HX0RFQlVHIGluIHBuZy5oIC4KLSAgQ2hhbmdlZCAiYmFkIGFkYXB0aXZlIGZpbHRlciB0eXBlIiBmcm9tIGVycm9yIHRvIHdhcm5pbmcgaW4gcG5ncnV0aWwuYyAuCi0gIEZpeGVkIGEgZG9jdW1lbnRhdGlvbiBlcnJvciBhYm91dCBkZWZhdWx0IGZpbHRlcmluZyB3aXRoIDgtYml0IGluZGV4ZWQtY29sb3IuCi0gIFNlcGFyYXRlZCB0aGUgUE5HX05PX1NURElPIG1hY3JvIGludG8gUE5HX05PX1NURElPIGFuZCBQTkdfTk9fQ09OU09MRV9JTwotICAgIChMLiBQZXRlciBEZXV0c2NoKS4KLSAgQWRkZWQgcG5nX3NldF9yZ2JfdG9fZ3JheSgpIGFuZCBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cygpIGZ1bmN0aW9ucy4KLSAgQWRkZWQgcG5nX2dldF9jb3B5cmlnaHQoKSBhbmQgcG5nX2dldF9oZWFkZXJfdmVyc2lvbigpIGZ1bmN0aW9ucy4KLSAgUmV2aXNlZCBjb21tZW50cyBvbiBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKSBpbiBsaWJwbmcudHh0IGFuZCBleGFtcGxlLmMKLSAgQWRkZWQgaW5mb3JtYXRpb24gYWJvdXQgZGVidWdnaW5nIGluIGxpYnBuZy50eHQgYW5kIGxpYnBuZy4zIC4KLSAgQ2hhbmdlZCAibG4gLXNmIiB0byAibG4gLXMgLWYiIGluIG1ha2VmaWxlLnMyeCwgbWFrZWZpbGUubG54LCBhbmQKLSAgICBtYWtlZmlsZS5zY28uCi0gIFJlbW92ZWQgbGluZXMgYWZ0ZXIgRHluYW1pYyBEZXBlbmRlbmNpZXMiIGluIG1ha2VmaWxlLmFjbyAuCi0gIFJldmlzZWQgbWFrZWZpbGUuZGVjIHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSAoSmVyZW1pZSBQZXRpdCkuCi0gIFJlbW92ZWQgdHJhaWxpbmcgYmxhbmtzIGZyb20gYWxsIGZpbGVzLgotCi1WZXJzaW9uIDEuMC4yYSBbSmFudWFyeSA2LCAxOTk5XQotICBSZW1vdmVkIG1pc3BsYWNlZCAjZW5kaWYgYW5kICNpZmRlZiBQTkdfTk9fRVhURVJOIG5lYXIgdGhlIGVuZCBvZiBwbmcuaAotICBBZGRlZCAiaWYiIHRlc3RzIHRvIHNpbGVuY2UgY29tcGxhaW50cyBhYm91dCB1bnVzZWQgcG5nX3B0ciBpbiBwbmcuaCBhbmQgcG5nLmMKLSAgQ2hhbmdlZCAiY2hlY2tfaWZfcG5nIiBmdW5jdGlvbiBpbiBleGFtcGxlLmMgdG8gcmV0dXJuIHRydWUgKG5vbnplcm8pIGlmIFBORy4KLSAgQ2hhbmdlZCBsaWJwbmcudHh0IHRvIGRlbW9uc3RyYXRlIHBuZ19zaWdfY21wKCkgaW5zdGVhZCBvZiBwbmdfY2hlY2tfc2lnKCkKLSAgICB3aGljaCBpcyBvYnNvbGV0ZS4KLQotVmVyc2lvbiAxLjAuMyBbSmFudWFyeSAxNCwgMTk5OV0KLSAgQWRkZWQgbWFrZWZpbGUuaHV4LCBmb3IgSGV3bGV0dCBQYWNrYXJkIEhQVVggMTAuMjAgYW5kIDExLjAwIChKaW0gUmljZSkKLSAgQWRkZWQgYSBzdGF0ZW1lbnQgb2YgWTJLIGNvbXBsaWFuY2UgaW4gcG5nLmgsIGxpYnBuZy4zLCBhbmQgWTJLSU5GTy4KLQotVmVyc2lvbiAxLjAuM2EgW0F1Z3VzdCAxMiwgMTk5OV0KLSAgQWRkZWQgY2hlY2sgZm9yIFBOR19SRUFEX0lOVEVSTEFDRV9TVVBQT1JURUQgaW4gcG5ncmVhZC5jOyBpc3N1ZSBhIHdhcm5pbmcKLSAgICBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhZCBhbiBpbnRlcmxhY2VkIGltYWdlIHdoZW4gaXQncyBub3Qgc3VwcG9ydGVkLgotICBBZGRlZCBjaGVjayBpZiBwbmdfcHRyLT50cmFucyBpcyBkZWZpbmVkIGJlZm9yZSBmcmVlaW5nIGl0IGluIHBuZ3JlYWQuYwotICBNb2RpZmllZCB0aGUgWTJLIHN0YXRlbWVudCB0byBpbmNsdWRlIHZlcnNpb25zIGJhY2sgdG8gdmVyc2lvbiAwLjcxCi0gIEZpeGVkIGEgYnVnIGluIHRoZSBjaGVjayBmb3IgdmFsaWQgSUhEUiBiaXRfZGVwdGgvY29sb3JfdHlwZXMgaW4gcG5ncnV0aWwuYwotICBNb2RpZmllZCBtYWtlZmlsZS53YXQgKGFkZGVkIC16cDggZmxhZywgIi5zeW1ib2xpYyIsIGNoYW5nZWQgc29tZSBjb21tZW50cykKLSAgUmVwbGFjZWQgbGVhZGluZyBibGFua3Mgd2l0aCB0YWIgY2hhcmFjdGVycyBpbiBtYWtlZmlsZS5odXgKLSAgQ2hhbmdlZCAiZHdvcmtpbi53dXN0bC5lZHUiIHRvICJjY3JjLnd1c3RsLmVkdSIgaW4gdmFyaW91cyBkb2N1bWVudHMuCi0gIENoYW5nZWQgKGZsb2F0KXJlZCBhbmQgKGZsb2F0KWdyZWVuIHRvIChkb3VibGUpcmVkLCAoZG91YmxlKWdyZWVuCi0gICAgaW4gcG5nX3NldF9yZ2JfdG9fZ3JheSgpIHRvIGF2b2lkICJwcm9tb3Rpb24iIHByb2JsZW1zIGluIEFJWC4KLSAgRml4ZWQgYSBidWcgaW4gcG5nY29uZi5oIHRoYXQgb21pdHRlZCA8c3RkaW8uaD4gd2hlbiBQTkdfREVCVUc9PTAgKEsgQnJhY2V5KS4KLSAgUmVmb3JtYXR0ZWQgbGlicG5nLjMgYW5kIGxpYnBuZ3BmLjMgd2l0aCBwcm9wZXIgZm9udHMgKHNjcmlwdCBieSBKLiB2YW5aYW5kdCkuCi0gIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byByZWZlciB0byB0aGUgUE5HLTEuMiBzcGVjaWZpY2F0aW9uLgotICBSZW1vdmVkIGFuc2kya25yLmMgYW5kIGxlZnQgcG9pbnRlcnMgdG8gdGhlIGxhdGVzdCBzb3VyY2UgZm9yIGFuc2kya25yLmMKLSAgICBpbiBtYWtlZmlsZS5rbnIsIElOU1RBTEwsIGFuZCBSRUFETUUgKEwuIFBldGVyIERldXRzY2gpCi0gIEZpeGVkIGJ1Z3MgaW4gY2FsY3VsYXRpb24gb2YgdGhlIGxlbmd0aCBvZiByb3dieXRlcyB3aGVuIGFkZGluZyBhbHBoYQotICAgIGNoYW5uZWxzIHRvIDE2LWJpdCBpbWFnZXMsIGluIHBuZ3J0cmFuLmMgKENocmlzIE5va2xlYmVyZykKLSAgQWRkZWQgZnVuY3Rpb24gcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKCkgdG8gc3RvcmUgdXNlcl90cmFuc2Zvcm1fcHRyLAotICAgIHVzZXJfZGVwdGgsIGFuZCB1c2VyX2NoYW5uZWxzIGludG8gdGhlIHBuZ19zdHJ1Y3QsIGFuZCBhIGZ1bmN0aW9uCi0gICAgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKSB0byByZXRyaWV2ZSB0aGUgcG9pbnRlciAoQ2hyaXMgTm9rbGViZXJnKQotICBBZGRlZCBmdW5jdGlvbiBwbmdfc2V0X2VtcHR5X3BsdGVfcGVybWl0dGVkKCkgdG8gbWFrZSBsaWJwbmcgdXNlYWJsZQotICAgIGluIE1ORyBhcHBsaWNhdGlvbnMuCi0gIENvcnJlY3RlZCB0aGUgdHlwZWRlZiBmb3IgcG5nX2ZyZWVfcHRyIGluIHBuZy5oIChKZXNzZSBKb25lcykuCi0gIENvcnJlY3QgZ2FtbWEgd2l0aCBzcmdiIGlzIDQ1NDU1IGluc3RlYWQgb2YgNDUwMDAgaW4gcG5ncnV0aWwuYywgdG8gYmUKLSAgICBjb25zaXN0ZW50IHdpdGggUE5HLTEuMiwgYW5kIGFsbG93IHZhcmlhbmNlIG9mIDUwMCBiZWZvcmUgY29tcGxhaW5pbmcuCi0gIEFkZGVkIGFzc2VtYmxlciBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEludGVsIGluIGZpbGUgcG5ndmNyZC5jIGFuZCBtb2RpZmllZAotICAgIG1ha2VmaWxlLnczMiB0byB1c2UgaXQgKE5pcmF2IENoaGF0cmFwYXRpLCBJTlRFTCBDb3Jwb3JhdGlvbiwKLSAgICBHaWxsZXMgVm9sbGFudCkKLSAgQ2hhbmdlZCAibG4gLXMgLWYiIHRvICJsbiAtZiAtcyIgaW4gdGhlIG1ha2VmaWxlcyB0byBtYWtlIFNvbGFyaXMgaGFwcHkuCi0gIEFkZGVkIHNvbWUgYWxpYXNlcyBmb3IgcG5nX3NldF9leHBhbmQoKSBpbiBwbmdydHJhbi5jLCBuYW1lbHkKLSAgICBwbmdfc2V0X2V4cGFuZF9QTFRFKCksIHBuZ19zZXRfZXhwYW5kX2RlcHRoKCksIGFuZCBwbmdfc2V0X2V4cGFuZF90Uk5TKCkKLSAgICAoR3JlZyBSb2Vsb2ZzLCBpbiAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSIpLgotICBBZGRlZCBtYWtlZmlsZS5iZW8gZm9yIEJFT1Mgb24gWDg2LCBjb250cmlidXRlZCBieSBTYW5kZXIgU3Rvay4KLQotVmVyc2lvbiAxLjAuM2IgW0F1Z3VzdCAyNiwgMTk5OV0KLSAgUmVwbGFjZWQgMjE0NzQ4MzY0N0wgc2V2ZXJhbCBwbGFjZXMgd2l0aCBQTkdfTUFYX1VJTlQgbWFjcm8sIGRlZmluZWQgaW4gcG5nLmgKLSAgQ2hhbmdlZCBsZWFkaW5nIGJsYW5rcyB0byB0YWJzIGluIGFsbCBtYWtlZmlsZXMuCi0gIERlZmluZSBQTkdfVVNFX1BOR1ZDUkQgaW4gbWFrZWZpbGUudzMyLCB0byBnZXQgTU1YIGFzc2VtYmxlciBjb2RlLgotICBNYWRlIGFsdGVybmF0ZSB2ZXJzaW9ucyBvZiAgcG5nX3NldF9leHBhbmQoKSBpbiBwbmdydHJhbi5jLCBuYW1lbHkKLSAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCwgcG5nX3NldF9wYWxldHRlX3RvX3JnYiwgYW5kIHBuZ19zZXRfdFJOU190b19hbHBoYQotICAgIChHcmVnIFJvZWxvZnMsIGluICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIikuICBEZWxldGVkIHRoZSAxLjAuM2EgYWxpYXNlcy4KLSAgUmVsb2NhdGVkIHN0YXJ0IG9mICdleHRlcm4gIkMiJyBibG9jayBpbiBwbmcuaCBzbyBpdCBkb2Vzbid0IGluY2x1ZGUgcG5nY29uZi5oCi0gIFJldmlzZWQgY2FsY3VsYXRpb24gb2YgbnVtX2Jsb2NrcyBpbiBwbmdtZW0uYyB0byBhdm9pZCBhIHBvdGVudGlhbGx5Ci0gICAgbmVnYXRpdmUgc2hpZnQgZGlzdGFuY2UsIHdob3NlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpbiB0aGUgQyBsYW5ndWFnZS4KLSAgQWRkZWQgYSBjaGVjayBpbiBwbmdzZXQuYyB0byBwcmV2ZW50IHdyaXRpbmcgbXVsdGlwbGUgdElNRSBjaHVua3MuCi0gIEFkZGVkIGEgY2hlY2sgaW4gcG5nd3JpdGUuYyB0byBkZXRlY3QgaW52YWxpZCBzbWFsbCB3aW5kb3dfYml0cyBzaXplcy4KLQotVmVyc2lvbiAxLjAuM2QgW1NlcHRlbWJlciA0LCAxOTk5XQotICBGaXhlZCB0eXBlIGNhc3Rpbmcgb2YgaWdhbW1hIGluIHBuZ3J1dGlsLmMKLSAgQWRkZWQgbmV3IHBuZ19leHBhbmQgZnVuY3Rpb25zIHRvIHNjcmlwdHMvcG5nZGVmLnBhcyBhbmQgcG5nb3MyLmRlZgotICBBZGRlZCBhIGRlbW8gcmVhZF91c2VyX3RyYW5zZm9ybV9mbiB0aGF0IGV4YW1pbmVzIHRoZSByb3cgZmlsdGVycyBpbiBwbmd0ZXN0LmMKLQotVmVyc2lvbiAxLjAuNCBbU2VwdGVtYmVyIDI0LCAxOTk5LCBub3QgZGlzdHJpYnV0ZWQgcHVibGljbHldCi0gIERlZmluZSBQTkdfQUxXQVlTX0VYVEVSTiBpbiBwbmdjb25mLmggaWYgX19TVERDX18gaXMgZGVmaW5lZAotICBEZWxldGUgI2RlZmluZSBQTkdfSU5URVJOQUwgYW5kIGluY2x1ZGUgInBuZy5oIiBmcm9tIHBuZ2FzbXJkLmgKLSAgTWFkZSBzZXZlcmFsIG1pbm9yIGNvcnJlY3Rpb25zIHRvIHBuZ3Rlc3QuYwotICBSZW5hbWVkIHRoZSBtYWtlZmlsZXMgd2l0aCBsb25nZXIgYnV0IG1vcmUgdXNlciBmcmllbmRseSBleHRlbnNpb25zLgotICBDb3BpZWQgdGhlIFBORyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgdG8gYSBzZXBhcmF0ZSBMSUNFTlNFIGZpbGUuCi0gIFJldmlzZWQgZG9jdW1lbnRhdGlvbiwgcG5nLmgsIGFuZCBleGFtcGxlLmMgdG8gcmVtb3ZlIHJlZmVyZW5jZSB0bwotICAgICJ2aWV3aW5nX2dhbW1hIiB3aGljaCBubyBsb25nZXIgYXBwZWFycyBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi0gIFJldmlzZWQgcG5ndmNyZC5jIHRvIHVzZSBNTVggY29kZSBmb3IgaW50ZXJsYWNpbmcgb25seSBvbiB0aGUgZmluYWwgcGFzcy4KLSAgVXBkYXRlZCBwbmd2Y3JkLmMgdG8gdXNlIHRoZSBmYXN0ZXIgQyBmaWx0ZXIgYWxnb3JpdGhtcyBmcm9tIGxpYnBuZy0xLjAuMWEKLSAgU3BsaXQgbWFrZWZpbGUud2luMzJ2YyBpbnRvIHR3byB2ZXJzaW9ucywgbWFrZWZpbGUudmNhd2luMzIgKHVzZXMgTU1YCi0gICAgYXNzZW1ibGVyIGNvZGUpIGFuZCBtYWtlZmlsZS52Y3dpbjMyIChkb2Vzbid0KS4KLSAgQWRkZWQgYSBDUFUgdGltaW5nIHJlcG9ydCB0byBwbmd0ZXN0LmMgKGVuYWJsZWQgYnkgZGVmaW5pbmcgUE5HVEVTVF9USU1JTkcpCi0gIEFkZGVkIGEgY29weSBvZiBwbmdub3cucG5nIHRvIHRoZSBkaXN0cmlidXRpb24uCi0KLVZlcnNpb24gMS4wLjRhIFtTZXB0ZW1iZXIgMjUsIDE5OTldCi0gIEluY3JlYXNlIG1heF9waXhlbF9kZXB0aCBpbiBwbmdydXRpbC5jIGlmIGEgdXNlciB0cmFuc2Zvcm0gbmVlZHMgaXQuCi0gIENoYW5nZWQgc2V2ZXJhbCBkaXZpc2lvbiBvcGVyYXRpb25zIHRvIHJpZ2h0LXNoaWZ0cyBpbiBwbmd2Y3JkLmMKLQotVmVyc2lvbiAxLjAuNGIgW1NlcHRlbWJlciAzMCwgMTk5OV0KLSAgQWRkZWQgcGFyZW50aGVzZXMgaW4gbGluZSAzNzMyIG9mIHBuZ3ZjcmQuYwotICBBZGRlZCBhIGNvbW1lbnQgaW4gbWFrZWZpbGUubGludXggd2FybmluZyBhYm91dCBidWdneSAtTzMgaW4gcGdjYyAyLjk1LjEKLQotVmVyc2lvbiAxLjAuNGMgW09jdG9iZXIgMSwgMTk5OV0KLSAgQWRkZWQgYSAicG5nX2NoZWNrX3ZlcnNpb24iIGZ1bmN0aW9uIGluIHBuZy5jIGFuZCBwbmd0ZXN0LmMgdGhhdCB3aWxsIGdlbmVyYXRlCi0gICAgYSBoZWxwZnVsIGNvbXBpbGVyIGVycm9yIGlmIGFuIG9sZCBwbmcuaCBpcyBmb3VuZCBpbiB0aGUgc2VhcmNoIHBhdGguCi0gIENoYW5nZWQgdHlwZSBvZiBwbmdfdXNlcl90cmFuc2Zvcm1fZGVwdGh8Y2hhbm5lbHMgZnJvbSBpbnQgdG8gcG5nX2J5dGUuCi0gIEFkZGVkICJMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZSIgc3RhdGVtZW50IHRvIHBuZy5oCi0KLVZlcnNpb24gMS4wLjRkIFtPY3RvYmVyIDYsIDE5OTldCi0gIENoYW5nZWQgMC40NSB0byAwLjQ1NDU1IGluIHBuZ19zZXRfc1JHQigpCi0gIFJlbW92ZWQgdW51c2VkIFBMVEUgZW50cmllcyBmcm9tIHBuZ25vdy5wbmcKLSAgUmUtZW5hYmxlZCBzb21lIHBhcnRzIG9mIHBuZ3ZjcmQuYyAocG5nX2NvbWJpbmVfcm93KSB0aGF0IHdvcmsgcHJvcGVybHkuCi0KLVZlcnNpb24gMS4wLjRlIFtPY3RvYmVyIDEwLCAxOTk5XQotICBGaXhlZCBzaWduIGVycm9yIGluIHBuZ3ZjcmQuYyAoR3JlZyBSb2Vsb2ZzKQotICBSZXBsYWNlZCBzb21lIGluc3RhbmNlcyBvZiBtZW1jcHkgd2l0aCBzaW1wbGUgYXNzaWdubWVudHMgaW4gcG5ndmNyZCAoR1ItUCkKLQotVmVyc2lvbiAxLjAuNGYgW09jdG9iZXIgMTUsIDE5OTldCi0gIFN1cnJvdW5kZWQgZXhhbXBsZS5jIGNvZGUgd2l0aCAjaWYgMCAuLiAjZW5kaWYgdG8gcHJldmVudCBwZW9wbGUgZnJvbQotICAgIGluYWR2ZXJ0ZW50bHkgdHJ5aW5nIHRvIGNvbXBpbGUgaXQuCi0gIENoYW5nZWQgcG5nX2dldF9oZWFkZXJfdmVyc2lvbigpIGZyb20gYSBmdW5jdGlvbiB0byBhIG1hY3JvIGluIHBuZy5oCi0gIEFkZGVkIHR5cGUgY2FzdGluZyBtb3N0bHkgaW4gcG5ncnRyYW4uYyBhbmQgcG5nd3RyYW4uYwotICBSZW1vdmVkIHNvbWUgcG9pbnRsZXNzICJwdHIgPSBOVUxMIiBpbiBwbmdtZW0uYwotICBBZGRlZCBhICJjb250cmliIiBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGNvZGUgZnJvbSBHcmVnJ3MgYm9vay4KLQotVmVyc2lvbiAxLjAuNSBbT2N0b2JlciAxNSwgMTk5OV0KLSAgTWlub3IgZWRpdGluZyBvZiB0aGUgSU5TVEFMTCBhbmQgUkVBRE1FIGZpbGVzLgotCi1WZXJzaW9uIDEuMC41YSBbT2N0b2JlciAyMywgMTk5OV0KLSAgQWRkZWQgY29udHJpYi9wbmdzdWl0ZSBhbmQgY29udHJpYi9wbmdtaW51cyAoV2lsbGVtIHZhbiBTY2hhaWspCi0gIEZpeGVkIGEgdHlwbyBpbiB0aGUgcG5nX3NldF9zUkdCKCkgZnVuY3Rpb24gY2FsbCBpbiBleGFtcGxlLmMgKEphbiBOaWp0bWFucykKLSAgRnVydGhlciBvcHRpbWl6YXRpb24gYW5kIGJ1Z2ZpeCBvZiBwbmd2Y3JkLmMKLSAgUmV2aXNlZCBwbmdzZXQuYyBzbyB0aGF0IGl0IGRvZXMgbm90IGFsbG9jYXRlIG9yIGZyZWUgbWVtb3J5IGluIHRoZSB1c2VyJ3MKLSAgICB0ZXh0X3B0ciBzdHJ1Y3R1cmUuICBJbnN0ZWFkLCBpdCBtYWtlcyBpdHMgb3duIGNvcHkuCi0gIENyZWF0ZWQgc2VwYXJhdGUgd3JpdGVfZW5kX2luZm9fc3RydWN0IGluIHBuZ3Rlc3QuYyBmb3IgYSBtb3JlIHNldmVyZSB0ZXN0LgotICBBZGRlZCBjb2RlIGluIHBuZ3dyaXRlLmMgdG8gZnJlZSBpbmZvX3B0ci0+dGV4dFtpXS5rZXkgdG8gc3RvcCBhIG1lbW9yeSBsZWFrLgotCi1WZXJzaW9uIDEuMC41YiBbTm92ZW1iZXIgMjMsIDE5OTldCi0gIE1vdmVkIFBOR19GTEFHX0hBVkVfQ0hVTktfSEVBREVSLCBQTkdfRkxBR19CQUNLR1JPVU5EX0lTX0dSQVkgYW5kCi0gICAgUE5HX0ZMQUdfV1JPVEVfdElNRSBmcm9tIGZsYWdzIHRvIG1vZGUuCi0gIEFkZGVkIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKCkgZnVuY3Rpb24uCi0gIEZpeGVkIHNvbWUgdHlwZWNhc3RpbmcgaW4gY29udHJpYi9ncmVnYm9vay8qLmMKLSAgVXBkYXRlZCBzY3JpcHRzL21ha2V2bXMuY29tIGFuZCBhZGRlZCBtYWtldm1zLmNvbSB0byBjb250cmliL2dyZWdib29rCi0gICAgYW5kIGNvbnRyaWIvcG5nbWludXMgKE1hcnRpbiBaaW5zZXIpCi0KLVZlcnNpb24gMS4wLjVjIFtOb3ZlbWJlciAyNiwgMTk5OV0KLSAgTW92ZWQgcG5nX2dldF9oZWFkZXJfdmVyc2lvbiBmcm9tIHBuZy5oIHRvIHBuZy5jLCB0byBhY2NvbW1vZGF0ZSBhbnNpMmtuci4KLSAgUmVtb3ZlZCBhbGwgZ2xvYmFsIGFycmF5cyAoYWNjb3JkaW5nIHRvIFBOR19OT19HTE9CQUxfQVJSQVlTIG1hY3JvKSwgdG8KLSAgICBhY2NvbW1vZGF0ZSBtYWtpbmcgRExMJ3M6IE1vdmVkIHVzcl9wbmdfdmVyIGZyb20gZ2xvYmFsIHZhcmlhYmxlIHRvIGZ1bmN0aW9uCi0gICAgcG5nX2dldF9oZWFkZXJfdmVyKCkgaW4gcG5nLmMuICBNb3ZlZCBwbmdfc2lnIHRvIHBuZ19zaWdfYnl0ZXMgaW4gcG5nLmMgYW5kCi0gICAgZWxpbWluYXRlZCB1c2Ugb2YgcG5nX3NpZyBpbiBwbmd3dXRpbC5jLiAgTW92ZWQgdGhlIHZhcmlvdXMgcG5nX0NITksgYXJyYXlzCi0gICAgaW50byBwbmd0eXBlcy5oLiAgRWxpbWluYXRlZCB1c2Ugb2YgZ2xvYmFsIHBuZ19wYXNzIGFycmF5cy4gIERlY2xhcmVkIHRoZQotICAgIHBuZ19DSE5LIGFuZCBwbmdfcGFzcyBhcnJheXMgdG8gYmUgImNvbnN0Ii4gIE1hZGUgdGhlIGdsb2JhbCBhcnJheXMKLSAgICBhdmFpbGFibGUgdG8gYXBwbGljYXRpb25zIChhbHRob3VnaCBub25lIGFyZSB1c2VkIGluIGxpYnBuZyBpdHNlbGYpIHdoZW4KLSAgICBQTkdfTk9fR0xPQkFMX0FSUkFZUyBpcyBub3QgZGVmaW5lZCBvciB3aGVuIFBOR19HTE9CQUxfQVJSQVlTIGlzIGRlZmluZWQuCi0gIFJlbW92ZWQgc29tZSBleHRyYW5lb3VzICItSSIgZnJvbSBjb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnN0ZAotICBDaGFuZ2VkIHRoZSBQTkdfc1JHQl9JTlRFTlQgbWFjcm9zIGluIHBuZy5oIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQTkctMS4yLgotICBDaGFuZ2UgUE5HX1NSR0JfSU5URU5UIHRvIFBOR19zUkdCX0lOVEVOVCBpbiBsaWJwbmcudHh0IGFuZCBsaWJwbmcuMwotCi1WZXJzaW9uIDEuMC41ZCBbTm92ZW1iZXIgMjksIDE5OTldCi0gIEFkZCB0eXBlIGNhc3QgKHBuZ19jb25zdF9jaGFycCkgdHdvIHBsYWNlcyBpbiBwbmcuYwotICBFbGltaW5hdGVkIHBuZ3R5cGVzLmg7IHVzZSBtYWNyb3MgaW5zdGVhZCB0byBkZWNsYXJlIFBOR19DSE5LIGFycmF5cy4KLSAgUmVuYW1lZCAiUE5HX0dMT0JBTF9BUlJBWVMiIHRvICJQTkdfVVNFX0dMT0JBTF9BUlJBWVMiIGFuZCBtYWRlIGF2YWlsYWJsZQotICAgIHRvIGFwcGxpY2F0aW9ucyBhIG1hY3JvICJQTkdfVVNFX0xPQ0FMX0FSUkFZUyIuCi0gIGNvbW1lbnQgb3V0ICh3aXRoICNpZmRlZikgYWxsIHRoZSBuZXcgZGVjbGFyYXRpb25zIHdoZW4KLSAgICBQTkdfVVNFX0dMT0JBTF9BUlJBWVMgaXMgZGVmaW5lZC4KLSAgQWRkZWQgUE5HX0VYUE9SVF9WQVIgbWFjcm8gdG8gYWNjb21tb2RhdGUgbWFraW5nIERMTCdzLgotCi1WZXJzaW9uIDEuMC41ZSBbTm92ZW1iZXIgMzAsIDE5OTldCi0gIEFkZGVkIGlDQ1AsIGlUWHQsIGFuZCBzUExUIHN1cHBvcnQ7IGFkZGVkICJsYW5nIiBtZW1iZXIgdG8gdGhlIHBuZ190ZXh0Ci0gICAgc3RydWN0dXJlOyByZWZhY3RvcmVkIHRoZSBpbmZsYXRlL2RlZmxhdGUgc3VwcG9ydCB0byBtYWtlIGFkZGluZyBuZXcgY2h1bmtzCi0gICAgd2l0aCB0cmFpbGluZyBjb21wcmVzc2VkIHBhcnRzIGVhc2llciBpbiB0aGUgZnV0dXJlLCBhbmQgYWRkZWQgbmV3IGZ1bmN0aW9ucwotICAgIHBuZ19mcmVlX2lDQ1AsIHBuZ19mcmVlX3BDQUwsIHBuZ19mcmVlX3NQTFQsIHBuZ19mcmVlX3RleHQsIHBuZ19nZXRfaUNDUCwKLSAgICBwbmdfZ2V0X3NwYWxldHRlcywgcG5nX3NldF9pQ0NQLCBwbmdfc2V0X3NwYWxldHRlcyAoRXJpYyBTLiBSYXltb25kKS4KLSAgTk9URTogQXBwbGljYXRpb25zIHRoYXQgd3JpdGUgdGV4dCBjaHVua3MgTVVTVCBkZWZpbmUgcG5nX3RleHQtPmxhbmcKLSAgICBiZWZvcmUgY2FsbGluZyBwbmdfc2V0X3RleHQoKS4gSXQgbXVzdCBiZSBzZXQgdG8gTlVMTCBpZiB5b3Ugd2FudCB0bwotICAgIHdyaXRlIHRFWHQgb3IgelRYdCBjaHVua3MuICBJZiB5b3Ugd2FudCB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIGFibGUgdG8KLSAgICBydW4gd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBsaWJwbmcsIHVzZQotCi0gICAgICAjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECi0gICAgICAgICBwbmdfdGV4dFtpXS5sYW5nID0gTlVMTDsKLSAgICAgICNlbmRpZgotCi0gIENoYW5nZWQgcG5nX2dldF9vRkZzKCkgYW5kIHBuZ19zZXRfb0ZGcygpIHRvIHVzZSBzaWduZWQgcmF0aGVyIHRoYW4gdW5zaWduZWQKLSAgICBvZmZzZXRzIChFcmljIFMuIFJheW1vbmQpLgotICBDb21iaW5lZCBQTkdfUkVBRF9jSE5LX1NVUFBPUlRFRCBhbmQgUE5HX1dSSVRFX2NITktfU1VQUE9SVEVEIG1hY3JvcyBpbnRvCi0gICAgUE5HX2NITktfU1VQUE9SVEVEIGFuZCBjb21iaW5lZCB0aGUgdGhyZWUgdHlwZXMgb2YgUE5HX3RleHRfU1VQUE9SVEVECi0gICAgbWFjcm9zLCBsZWF2aW5nIHRoZSBzZXBhcmF0ZSBtYWNyb3MgYWxzbyBhdmFpbGFibGUuCi0gIFJlbW92ZWQgY29tbWVudHMgb24gI2VuZGlmcyBhdCB0aGUgZW5kIG9mIG1hbnkgc2hvcnQsIG5vbi1uZXN0ZWQgI2lmLWJsb2Nrcy4KLQotVmVyc2lvbiAxLjAuNWYgW0RlY2VtYmVyIDYsIDE5OTldCi0gIENoYW5nZWQgbWFrZWZpbGUuc29sYXJpcyB0byBpc3N1ZSBhIHdhcm5pbmcgYWJvdXQgcG90ZW50aWFsIHByb2JsZW1zIHdoZW4KLSAgICB0aGUgdWNiICJsZCIgaXMgaW4gdGhlIHBhdGggYWhlYWQgb2YgdGhlIGNjcyAibGQiLgotICBSZW1vdmVkICItIFtkYXRlXSIgZnJvbSB0aGUgInN5bm9wc2lzIiBsaW5lIGluIGxpYnBuZy4zIGFuZCBsaWJwbmdwZi4zLgotICBBZGRlZCBzQ0FMIGNodW5rIHN1cHBvcnQgKEVyaWMgUy4gUmF5bW9uZCkuCi0KLVZlcnNpb24gMS4wLjVnIFtEZWNlbWJlciA3LCAxOTk5XQotICBGaXhlZCAicG5nX2ZyZWVfc3BhbGxldHRlcyIgdHlwbyBpbiBwbmcuaAotICBBZGRlZCBjb2RlIHRvIGhhbmRsZSBuZXcgY2h1bmtzIGluIHBuZ3ByZWFkLmMKLSAgTW92ZWQgUE5HX0NITksgc3RyaW5nIG1hY3JvIGRlZmluaXRpb25zIG91dHNpZGUgb2YgUE5HX05PX0VYVEVSTiBibG9jawotICBBZGRlZCAidHJhbnNsYXRlZF9rZXkiIHRvIHBuZ190ZXh0IHN0cnVjdHVyZSBhbmQgcG5nX3dyaXRlX2lUWHQoKS4KLSAgQWRkZWQgY29kZSBpbiBwbmd3cml0ZS5jIHRvIHdvcmsgYXJvdW5kIGEgbmV3bHkgZGlzY292ZXJlZCB6bGliIGJ1Zy4KLQotVmVyc2lvbiAxLjAuNWggW0RlY2VtYmVyIDEwLCAxOTk5XQotICBOT1RFOiByZWdhcmRpbmcgdGhlIG5vdGUgZm9yIHZlcnNpb24gMS4wLjVlLCB0aGUgZm9sbG93aW5nIG11c3QgYWxzbwotICAgIGJlIGluY2x1ZGVkIGluIHlvdXIgY29kZToKLSAgICAgICAgcG5nX3RleHRbaV0udHJhbnNsYXRlZF9rZXkgPSBOVUxMOwotICBVbmtub3duIGNodW5rIGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQuCi0gIE9wdGlvbiB0byBlbGltaW5hdGUgYWxsIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgd2FzIGFkZGVkLiAgU29tZSBuZXcKLSAgICBmaXhlZC1wb2ludCBmdW5jdGlvbnMgc3VjaCBhcyBwbmdfc2V0X2dBTUFfZml4ZWQoKSB3ZXJlIGFkZGVkLgotICBFeHBhbmRlZCB0YWJzIGFuZCByZW1vdmVkIHRyYWlsaW5nIGJsYW5rcyBpbiBzb3VyY2UgZmlsZXMuCi0KLVZlcnNpb24gMS4wLjVpIFtEZWNlbWJlciAxMywgMTk5OV0KLSAgQWRkZWQgc29tZSB0eXBlIGNhc3RzIHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuCi0gIFJlbmFtZWQgInBuZ19mcmVlX3NwYWxldHRlIiB0byAicG5nX2ZyZWVfc3BhbGV0dGVzIiBmb3IgY29uc2lzdGVuY3kuCi0gIFJlbW92ZWQgbGVhZGluZyBibGFua3MgZnJvbSBhICNkZWZpbmUgaW4gcG5ndmNyZC5jCi0gIEFkZGVkIHNvbWUgcGFyYW1ldGVycyB0byB0aGUgbmV3IHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIGZ1bmN0aW9uLgotICBBZGRlZCBhIHRlc3QgZm9yIHVwLT5sb2NhdGlvbiAhPSAwIGluIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB3cml0aW5nCi0gICAgdW5rbm93biBjaHVua3MgaW4gcG5nd3JpdGUuYwotICBDaGFuZ2VkICJudW0iIHRvICJpIiBpbiBwbmdfZnJlZV9zcGFsZXR0ZXMoKSBhbmQgcG5nX2ZyZWVfdW5rbm93bnMoKSB0bwotICAgIHByZXZlbnQgcmVjdXJzaW9uLgotICBBZGRlZCBwbmdfZnJlZV9oSVNUKCkgZnVuY3Rpb24uCi0gIFZhcmlvdXMgcGF0Y2hlcyB0byBmaXggYnVncyBpbiB0aGUgc0NBTCBhbmQgaW50ZWdlciBjSFJNIHByb2Nlc3NpbmcsCi0gICAgYW5kIHRvIGFkZCBzb21lIGNvbnZlbmllbmNlIG1hY3JvcyBmb3IgdXNlIHdpdGggc0NBTC4KLQotVmVyc2lvbiAxLjAuNWogW0RlY2VtYmVyIDIxLCAxOTk5XQotICBDaGFuZ2VkICJ1bml0IiBwYXJhbWV0ZXIgb2YgcG5nX3dyaXRlX3NDQUwgZnJvbSBwbmdfYnl0ZSB0byBpbnQsIHRvIHdvcmsKLSAgICBhcm91bmQgYnVnZ3kgY29tcGlsZXJzLgotICBBZGRlZCBuZXcgdHlwZSAicG5nX2ZpeGVkX3BvaW50IiBmb3IgaW50ZWdlcnMgdGhhdCBob2xkIGZsb2F0KjEwMDAwMCB2YWx1ZXMKLSAgUmVzdG9yZWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvZiB0RVh0L3pUWHQgY2h1bmsgcHJvY2Vzc2luZzoKLSAgICBSZXN0b3JlZCB0aGUgZmlyc3QgZm91ciBtZW1iZXJzIG9mIHBuZ190ZXh0IHRvIHRoZSBzYW1lIG9yZGVyIGFzIHYuMS4wLjVkLgotICAgIEFkZGVkIG1lbWJlcnMgImxhbmdfa2V5IiBhbmQgIml0eHRfbGVuZ3RoIiB0byBwbmdfdGV4dCBzdHJ1Y3QuICBTZXQKLSAgICB0ZXh0X2xlbmd0aD0wIHdoZW4gInRleHQiIGNvbnRhaW5zIGlUWHQgZGF0YS4gIFVzZSB0aGUgImNvbXByZXNzaW9uIgotICAgIG1lbWJlciB0byBkaXN0aW5ndWlzaCBhbW9uZyB0RVh0L3pUWHQvaVRYdCB0eXBlcy4gIEFkZGVkCi0gICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORSAoMSkgYW5kIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQoMikgbWFjcm9zLgotICAgIFRoZSAiTm90ZSIgYWJvdmUsIGFib3V0IGJhY2t3YXJkIGluY29tcGF0aWJpbGl0eSBvZiBsaWJwbmctMS4wLjVlLCBubwotICAgIGxvbmdlciBhcHBsaWVzLgotICBGaXhlZCBwbmdfcmVhZHx3cml0ZV9pVFh0KCkgdG8gcmVhZHx3cml0ZSBwYXJhbWV0ZXJzIGluIHRoZSByaWdodCBvcmRlciwKLSAgICBhbmQgdG8gd3JpdGUgdGhlIGlUWHQgY2h1bmsgYWZ0ZXIgSURBVCBpZiBpdCBhcHBlYXJzIGluIHRoZSBlbmRfcHRyLgotICBBZGRlZCBwbmdnY2NyZC5jLCB2ZXJzaW9uIG9mIHBuZ3ZjcmQuYyBJbnRlbCBhc3NlbWJsZXIgZm9yIGdjYyAoR3JlZyBSb2Vsb2ZzKQotICBSZXZlcnNlZCB0aGUgb3JkZXIgb2YgdHJ5aW5nIHRvIHdyaXRlIGZsb2F0aW5nLXBvaW50IGFuZCBmaXhlZC1wb2ludCBnQU1BLgotCi1WZXJzaW9uIDEuMC41ayBbRGVjZW1iZXIgMjcsIDE5OTldCi0gIEFkZGVkIG1hbnkgcGFyZW50aGVzZXMsIGUuZy4sICJpZiAoYSAmJiBiICYgYykiIGJlY29tZXMgImlmIChhICYmIChiICYgYykpIgotICBBZGRlZCBwbmdfaGFuZGxlX2FzX3Vua25vd24oKSBmdW5jdGlvbiAoR2xlbm4pCi0gIEFkZGVkIHBuZ19mcmVlX2NodW5rX2xpc3QoKSBmdW5jdGlvbiBhbmQgY2h1bmtfbGlzdCBhbmQgbnVtX2NodW5rX2xpc3QgbWVtYmVycwotICAgIG9mIHBuZ19wdHIuCi0gIEVsaW1pbmF0ZWQgZXJyb25lb3VzIHdhcm5pbmdzIGFib3V0IG11bHRpcGxlIHNQTFQgY2h1bmtzIGFuZCBzUExULWFmdGVyLVBMVEUuCi0gIEZpeGVkIGEgbGlicG5nLTEuMC41aCBidWcgaW4gcG5ncnV0aWwuYyB0aGF0IHdhcyBpc3N1aW5nIGVycm9uZW91cyB3YXJuaW5ncwotICAgIGFib3V0IGlnbm9yaW5nIGluY29ycmVjdCBnQU1BIHdpdGggc1JHQiAoZ0FNQSB3YXMgaW4gZmFjdCBub3QgaWdub3JlZCkKLSAgQWRkZWQgcG5nX2ZyZWVfdFJOUygpOyBwbmdfc2V0X3RSTlMoKSBub3cgbWFsbG9jJ3MgaXRzIG93biB0cmFucyBhcnJheSAoRVNSKS4KLSAgRGVmaW5lIHBuZ19nZXRfaW50XzMyIHdoZW4gb0ZGcyBjaHVuayBpcyBzdXBwb3J0ZWQgYXMgd2VsbCBhcyB3aGVuIHBDQUwgaXMuCi0gIENoYW5nZWQgdHlwZSBvZiBwcm9mbGVuIGZyb20gcG5nX2ludF8zMiB0byBwbmdfdWludF8zMiBpbiBwbmdfZ2V0X2lDQ1AoKS4KLQotVmVyc2lvbiAxLjAuNWwgW0phbnVhcnkgMSwgMjAwMF0KLSAgQWRkZWQgZnVuY3Rpb25zIHBuZ19zZXRfcmVhZF91c2VyX2NodW5rX2ZuKCkgYW5kIHBuZ19nZXRfdXNlcl9jaHVua19wdHIoKQotICAgIGZvciBzZXR0aW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHVua25vd24gY2h1bmtzIGFuZCBmb3IKLSAgICByZXRyaWV2aW5nIHRoZSBhc3NvY2lhdGVkIHVzZXIgcG9pbnRlciAoR2xlbm4pLgotCi1WZXJzaW9uIDEuMC41bSBbSmFudWFyeSA3LCAyMDAwXQotICBBZGRlZCBoaWdoLWxldmVsIGZ1bmN0aW9ucyBwbmdfcmVhZF9wbmcoKSwgcG5nX3dyaXRlX3BuZygpLCBwbmdfZnJlZV9waXhlbHMoKS4KLQotVmVyc2lvbiAxLjAuNW4gW0phbnVhcnkgOSwgMjAwMF0KLSAgQWRkZWQgcG5nX2ZyZWVfUExURSgpIGZ1bmN0aW9uLCBhbmQgbW9kaWZpZWQgcG5nX3NldF9QTFRFKCkgdG8gbWFsbG9jIGl0cwotICAgIG93biBtZW1vcnkgZm9yIGluZm9fcHRyLT5wYWxldHRlLiAgVGhpcyBtYWtlcyBpdCBzYWZlIGZvciB0aGUgY2FsbGluZwotICAgIGFwcGxpY2F0aW9uIHRvIGZyZWUgaXRzIGNvcHkgb2YgdGhlIHBhbGV0dGUgYW55IHRpbWUgYWZ0ZXIgaXQgY2FsbHMKLSAgICBwbmdfc2V0X1BMVEUoKS4KLQotVmVyc2lvbiAxLjAuNW8gW0phbnVhcnkgMjAsIDIwMDBdCi0gIENvc21ldGljIGNoYW5nZXMgb25seSAocmVtb3ZlZCBzb21lIHRyYWlsaW5nIGJsYW5rcyBhbmQgVEFCcykKLQotVmVyc2lvbiAxLjAuNXAgW0phbnVhcnkgMzEsIDIwMDBdCi0gIFJlbmFtZWQgcG5nZGxsLm1hayB0byBtYWtlZmlsZS5iZDMyCi0gIENvc21ldGljIGNoYW5nZXMgaW4gcG5ndGVzdC5jCi0KLVZlcnNpb24gMS4wLjVxIFtGZWJydWFyeSA1LCAyMDAwXQotICBSZWxvY2F0ZWQgdGhlIG1ha2VmaWxlLnNvbGFyaXMgd2FybmluZyBhYm91dCBQQVRIIHByb2JsZW1zLgotICBGaXhlZCBwbmd2Y3JkLmMgYnVnIGJ5IHB1c2hpbmcvcG9wcGluZyByZWdpc3RlcnMgaW4gbW14c3VwcG9ydCAoQnJ1Y2UgT2JlcmcpCi0gIFJldmlzZWQgbWFrZWZpbGUuZ2NtbXgKLSAgQWRkZWQgUE5HX1NFVEpNUF9TVVBQT1JURUQsIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwgYW5kIFBOR19BQk9SVCgpIG1hY3JvcwotCi1WZXJzaW9uIDEuMC41ciBbRmVicnVhcnkgNywgMjAwMF0KLSAgUmVtb3ZlZCBzdXBlcmZsdW91cyBwcm90b3R5cGUgZm9yIHBuZ19nZXRfaXR4dCBmcm9tIHBuZy5oCi0gIEZpeGVkIGEgYnVnIGluIHBuZ3J0cmFuLmMgdGhhdCBpbXByb3Blcmx5IGV4cGFuZGVkIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgotICBSZXR1cm4gKm51bV90ZXh0PTAgZnJvbSBwbmdfZ2V0X3RleHQoKSB3aGVuIGFwcHJvcHJpYXRlLCBhbmQgZml4IGRvY3VtZW50YXRpb24KLSAgICBvZiBwbmdfZ2V0X3RleHQoKSBpbiBsaWJwbmcudHh0L2xpYnBuZy4zLgotCi1WZXJzaW9uIDEuMC41cyBbRmVicnVhcnkgMTgsIDIwMDBdCi0gIEFkZGVkICJwbmdfam1wX2VudigpIiBtYWNybyB0byBwbmdjb25mLmgsIHRvIGhlbHAgcGVvcGxlIG1pZ3JhdGUgdG8gdGhlCi0gICAgbmV3IGVycm9yIGhhbmRsZXIgdGhhdCdzIHBsYW5uZWQgZm9yIHRoZSBuZXh0IGxpYnBuZyByZWxlYXNlLCBhbmQgY2hhbmdlZAotICAgIGV4YW1wbGUuYywgcG5ndGVzdC5jLCBhbmQgY29udHJpYiBwcm9ncmFtcyB0byB1c2UgdGhpcyBtYWNyby4KLSAgUmV2aXNlZCBzb21lIG9mIHRoZSBETEwtZXhwb3J0IG1hY3JvcyBpbiBwbmdjb25mLmggKEdyZWcgUm9lbG9mcykKLSAgRml4ZWQgYSBidWcgaW4gcG5nX3JlYWRfcG5nKCkgdGhhdCBjYXVzZWQgaXQgdG8gZmFpbCB0byBleHBhbmQgc29tZSBpbWFnZXMKLSAgICB0aGF0IGl0IHNob3VsZCBoYXZlIGV4cGFuZGVkLgotICBGaXhlZCBzb21lIG1pc3Rha2VzIGluIHRoZSB1bnVzZWQgYW5kIHVuZG9jdW1lbnRlZCBJTkNIX0NPTlZFUlNJT05TIGZ1bmN0aW9ucwotICAgIGluIHBuZ2dldC5jCi0gIENoYW5nZWQgdGhlIGFsbG9jYXRpb24gb2YgcGFsZXR0ZSwgaGlzdG9yeSwgYW5kIHRyYW5zIGFycmF5cyBiYWNrIHRvCi0gICAgdGhlIHZlcnNpb24gMS4wLjUgbWV0aG9kIChsaW5raW5nIGluc3RlYWQgb2YgY29weWluZykgd2hpY2ggcmVzdG9yZXMKLSAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiAxLjAuNS4gIEFkZGVkIHNvbWUgcmVtYXJrcyBhYm91dAotICAgIHRoYXQgaW4gZXhhbXBsZS5jLiAgQWRkZWQgImZyZWVfbWUiIG1lbWJlciB0byBpbmZvX3B0ciBhbmQgcG5nX3B0cgotICAgIGFuZCBhZGRlZCBwbmdfZnJlZV9kYXRhKCkgZnVuY3Rpb24uCi0gIFVwZGF0ZWQgbWFrZWZpbGUubGludXggYW5kIG1ha2VmaWxlLmdjY21teCB0byBtYWtlIGRpcmVjdG9yaWVzIGNvbmRpdGlvbmFsbHkuCi0gIE1hZGUgY29zbWV0aWMgY2hhbmdlcyB0byBwbmdhc21yZC5oCi0gIEFkZGVkIHBuZ19zZXRfcm93cygpIGFuZCBwbmdfZ2V0X3Jvd3MoKSwgZm9yIHVzZSB3aXRoIHBuZ19yZWFkfHdyaXRlX3BuZygpLgotICBNb2RpZmllZCBwbmdfcmVhZF9wbmcoKSB0byBhbGxvY2F0ZSBpbmZvX3B0ci0+cm93X3BvaW50ZXJzIG9ubHkgaWYgaXQKLSAgICBoYXNuJ3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4KLQotVmVyc2lvbiAxLjAuNXQgW01hcmNoIDQsIDIwMDBdCi0gIENoYW5nZWQgcG5nX2ptcF9lbnYoKSBtaWdyYXRpb24gYWlkaW5nIG1hY3JvIHRvIHBuZ19qbXBidWYoKS4KLSAgRml4ZWQgImludGVybGFjZSIgdHlwbyAoc2hvdWxkIGJlICJpbnRlcmxhY2VkIikgaW4gY29udHJpYi9ncmVnYm9vay9yZWFkMi14LmMKLSAgRml4ZWQgYnVnIHdpdGggdXNlIG9mIFBOR19CRUZPUkVfSUhEUiBiaXQgaW4gcG5nX3B0ci0+bW9kZSwgaW50cm9kdWNlZCB3aGVuCi0gICAgUE5HX0ZMQUdfSEFWRV9DSFVOS19IRUFERVIgd2FzIG1vdmVkIGludG8gcG5nX3B0ci0+bW9kZSBpbiB2ZXJzaW9uIDEuMC41YgotICBGaWxlcyBpbiBjb250cmliL2dyZWdib29rIHdlcmUgcmV2aXNlZCB0byB1c2UgcG5nX2ptcGJ1ZigpIGFuZCB0byBzZWxlY3QKLSAgICBhIDI0LWJpdCB2aXN1YWwgaWYgb25lIGlzIGF2YWlsYWJsZSwgYW5kIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnMuCi0gIEZpbGVzIGluIGNvbnRyaWIvcG5nbWludXMgd2VyZSByZXZpc2VkIHRvIHVzZSB0aGUgcG5nX2ptcGJ1ZigpIG1hY3JvLgotICBSZW1vdmVkIHNwYWNlcyBpbiBtYWtlZmlsZS5saW51eCBhbmQgbWFrZWZpbGUuZ2NtbXgsIGludHJvZHVjZWQgaW4gMS4wLjVzCi0KLVZlcnNpb24gMS4wLjV1IFtNYXJjaCA1LCAyMDAwXQotICBTaW1wbGlmaWVkIHRoZSBjb2RlIHRoYXQgZGV0ZWN0cyBvbGQgcG5nLmggaW4gcG5nLmMgYW5kIHBuZ3Rlc3QuYwotICBSZW5hbWVkIHBuZ19zcGFsZXR0ZSAoX3AsIF9wcCkgdG8gcG5nX3NQTFRfdCAoX3RwLCBfdHBwKQotICBJbmNyZWFzZWQgcHJlY2lzaW9uIG9mIHJnYl90b19ncmF5IGNhbGN1bGF0aW9ucyBmcm9tIDggdG8gMTUgYml0cyBhbmQKLSAgICBhZGRlZCBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkKCkgZnVuY3Rpb24uCi0gIEFkZGVkIG1ha2VmaWxlLmJjMzIgKDMyLWJpdCBCb3JsYW5kIEMrKywgQyBtb2RlKQotCi1WZXJzaW9uIDEuMC41diBbTWFyY2ggMTEsIDIwMDBdCi0gIEFkZGVkIHNvbWUgcGFyZW50aGVzZXMgdG8gdGhlIHBuZ19qbXBidWYgbWFjcm8gZGVmaW5pdGlvbi4KLSAgVXBkYXRlZCByZWZlcmVuY2VzIHRvIHRoZSB6bGliIGhvbWUgcGFnZSwgd2hpY2ggaGFzIG1vdmVkIHRvIGZyZWVzb2Z0d2FyZS5jb20uCi0gIENvcnJlY3RlZCBidWdzIGluIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIHBuZ19yZWFkX3JvdygpIGFuZCBwbmdfd3JpdGVfcm93KCkuCi0gIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBvZiBwbmdfcmdiX3RvX2dyYXkgY2FsY3VsYXRpb25zIGluIGxpYnBuZy4zL2xpYnBuZy50eHQuCi0gIFJlbmFtZWQgbWFrZWZpbGUuYm9ybGFuZCx0dXJib2MzIGJhY2sgdG8gbWFrZWZpbGUuYm9yLHRjMyBhcyBpbiB2ZXJzaW9uIDEuMC4zLAotICAgIHJldmlzZWQgYm9ybGFuZCBtYWtlZmlsZXM7IGFkZGVkIG1ha2VmaWxlLmlibXZhYzMgYW5kIG1ha2VmaWxlLmdjYyAoQ29zbWluKQotCi1WZXJzaW9uIDEuMC42IFtNYXJjaCAyMCwgMjAwMF0KLSAgTWlub3IgcmV2aXNpb25zIG9mIG1ha2VmaWxlLmJvciwgbGlicG5nLnR4dCwgYW5kIGdyZWdib29rL3JwbmcyLXdpbi5jCi0gIEFkZGVkIG1ha2VmaWxlLnNnZ2NjIChTR0kgSVJJWCB3aXRoIGdjYykKLQotVmVyc2lvbiAxLjAuNmQgW0FwcmlsIDcsIDIwMDBdCi0gIENoYW5nZWQgc3ByaW50ZigpIHRvIHN0cmNweSgpIGluIHBuZ193cml0ZV9zQ0FMX3MoKSB0byB3b3JrIHdpdGhvdXQgU1RESU8KLSAgQWRkZWQgZGF0YV9sZW5ndGggcGFyYW1ldGVyIHRvIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgZnVuY3Rpb24KLSAgUmV2aXNlZCBkb2N1bWVudGF0aW9uIHRvIHJlbW92ZSByZWZlcmVuY2UgdG8gYWJhbmRvbmVkIHBuZ19mcmVlX2NobmsgZnVuY3Rpb25zCi0gIEZpeGVkIGFuIGVycm9yIGluIHBuZ19yZ2JfdG9fZ3JheV9maXhlZCgpCi0gIFJldmlzZWQgZXhhbXBsZS5jLCB1c2FnZSBvZiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKS4KLSAgUmVuYW1lZCBtYWtlZmlsZS5pYm12YWMzIHRvIG1ha2VmaWxlLmlibWMsIGFkZGVkIGxpYnBuZy5pY2MgSUJNIHByb2plY3QgZmlsZQotICBBZGRlZCBhIGNoZWNrIGZvciBpbmZvX3B0ci0+ZnJlZV9tZSZQTkdfRlJFRV9URVhUIHdoZW4gZnJlZWluZyB0ZXh0IGluIHBuZy5jCi0gIFNpbXBsaWZ5IHBuZ19zaWdfYnl0ZXMoKSBmdW5jdGlvbiB0byByZW1vdmUgdXNlIG9mIG5vbi1JU08tQyBzdHJkdXAoKS4KLQotVmVyc2lvbiAxLjAuNmUgW0FwcmlsIDksIDIwMDBdCi0gIEFkZGVkIHBuZ19kYXRhX2ZyZWVyKCkgZnVuY3Rpb24uCi0gIEluIHRoZSBjb2RlIHRoYXQgY2hlY2tzIGZvciBvdmVyLWxlbmd0aCB0Uk5TIGNodW5rcywgYWRkZWQgY2hlY2sgb2YKLSAgICBpbmZvX3B0ci0+bnVtX3RyYW5zIGFzIHdlbGwgYXMgcG5nX3B0ci0+bnVtX3RyYW5zIChNYXR0aGlhcyBCZW5ja21hbm4pCi0gIE1pbm9yIHJldmlzaW9ucyBvZiBsaWJwbmcudHh0L2xpYnBuZy4zLgotICBDaGVjayBmb3IgZXhpc3RpbmcgZGF0YSBhbmQgZnJlZSBpdCBpZiB0aGUgZnJlZV9tZSBmbGFnIGlzIHNldCwgaW4gcG5nX3NldF8qKCkKLSAgICBhbmQgcG5nX2hhbmRsZV8qKCkuCi0gIE9ubHkgZGVmaW5lIFBOR19XRUlHSFRFRF9GSUxURVJTX1NVUFBPUlRFRCB3aGVuIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICBpcyBkZWZpbmVkLgotICBDaGFuZ2VkIHNldmVyYWwgaW5zdGFuY2VzIG9mIFBOR19OT19DT05TT0xFX0lEIHRvIFBOR19OT19TVERJTyBpbiBwbmdydXRpbC5jCi0gICAgYW5kIG1lbnRpb25lZCB0aGUgcHVycG9zZXMgb2YgdGhlIHR3byBtYWNyb3MgaW4gbGlicG5nLnR4dC9saWJwbmcuMy4KLQotVmVyc2lvbiAxLjAuNmYgW0FwcmlsIDE0LCAyMDAwXQotICBSZXZpc2VkIHBuZ19zZXRfaUNDUCgpIGFuZCBwbmdfc2V0X3Jvd3MoKSB0byBhdm9pZCBwcmVtYXR1cmVseSBmcmVlaW5nIGRhdGEuCi0gIEFkZCBjaGVja3MgaW4gcG5nX3NldF90ZXh0KCkgZm9yIE5VTEwgbWVtYmVycyBvZiB0aGUgaW5wdXQgdGV4dCBzdHJ1Y3R1cmUuCi0gIFJldmlzZWQgbGlicG5nLnR4dC9saWJwbmcuMy4KLSAgUmVtb3ZlZCBzdXBlcmZsdW91cyBwcm90b3R5cGUgZm9yIHBuZ19zZXRfaVRYdCBmcm9tIHBuZy5oCi0gIFJlbW92ZWQgImVsc2UiIGZyb20gcG5ncmVhZC5jLCBhZnRlciBwbmdfZXJyb3IoKSwgYW5kIGNoYW5nZWQgIjAiIHRvICJsZW5ndGgiLgotICBDaGFuZ2VkIHNldmVyYWwgcG5nX2Vycm9ycyBhYm91dCBtYWxmb3JtZWQgYW5jaWxsYXJ5IGNodW5rcyB0byBwbmdfd2FybmluZ3MuCi0KLVZlcnNpb24gMS4wLjZnIFtBcHJpbCAyNCwgMjAwMF0KLSAgQWRkZWQgcG5nX3Bhc3MtKiBhcnJheXMgdG8gcG5nZ2NjcmQuYyB3aGVuIFBOR19VU0VfTE9DQUxfQVJSQVlTIGlzIGRlZmluZWQuCi0gIFJlbG9jYXRlZCBwYXJhZ3JhcGggYWJvdXQgcG5nX3NldF9iYWNrZ3JvdW5kKCkgaW4gbGlicG5nLjMvbGlicG5nLnR4dAotICAgIGFuZCBvdGhlciByZXZpc2lvbnMgKE1hdHRoaWFzIEJlbmNrbWFubikKLSAgUmVsb2NhdGVkIGluZm9fcHRyLT5mcmVlX21lLCBwbmdfcHRyLT5mcmVlX21lLCBhbmQgb3RoZXIgaW5mb19wdHIgYW5kCi0gICAgcG5nX3B0ciBtZW1iZXJzIHRvIHJlc3RvcmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBsaWJwbmctMS4wLjUKLSAgICAoYnJlYWtzIGNvbXBhdGliaWxpdHkgd2l0aCBsaWJwbmctMS4wLjYpLgotCi1WZXJzaW9uIDEuMC42aCBbQXByaWwgMjQsIDIwMDBdCi0gIENoYW5nZWQgc2hhcmVkIGxpYnJhcnkgc28tbnVtYmVyIHBhdHRlcm4gZnJvbSAyLngueS56IHRvIHh5LnogKHRoaXMgYnVpbGRzCi0gICAgbGlicG5nLnNvLjEwICYgbGlicG5nLnNvLjEwLjZoIGluc3RlYWQgb2YgbGlicG5nLnNvLjIgJiBsaWJwbmcuc28uMi4xLjAuNmgpCi0gICAgVGhpcyBpcyBhIHRlbXBvcmFyeSBjaGFuZ2UgZm9yIHRlc3QgcHVycG9zZXMuCi0KLVZlcnNpb24gMS4wLjZpIFtNYXkgMiwgMjAwMF0KLSAgUmVhcnJhbmdlZCBzb21lIG1lbWJlcnMgYXQgdGhlIGVuZCBvZiBwbmdfaW5mbyBhbmQgcG5nX3N0cnVjdCwgdG8gcHV0Ci0gICAgdW5rbm93bl9jaHVua3NfbnVtIGFuZCBmcmVlX21lIHdpdGhpbiB0aGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgcG5nX3N0cnVjdHMKLSAgICBhbmQgZnJlZV9tZSwgcG5nX3JlYWRfdXNlcl9mbiwgYW5kIHBuZ19mcmVlX2ZuIHdpdGhpbiB0aGUgb3JpZ2luYWwgcG5nX2luZm8sCi0gICAgYmVjYXVzZSBzb21lIG9sZCBhcHBsaWNhdGlvbnMgYWxsb2NhdGUgdGhlIHN0cnVjdHMgZGlyZWN0bHkgaW5zdGVhZCBvZgotICAgIHVzaW5nIHBuZ19jcmVhdGVfKigpLgotICBBZGRlZCBkb2N1bWVudGF0aW9uIG9mIHVzZXIgbWVtb3J5IGZ1bmN0aW9ucyBpbiBsaWJwbmcudHh0L2xpYnBuZy4zCi0gIE1vZGlmaWVkIHBuZ19yZWFkX3BuZyBzbyB0aGF0IGl0IHdpbGwgdXNlIHVzZXJfYWxsb2NhdGVkIHJvd19wb2ludGVycwotICAgIGlmIHByZXNlbnQsIHVubGVzcyBmcmVlX21lIGRpcmVjdHMgdGhhdCBpdCBiZSBmcmVlZCwgYW5kIGFkZGVkIGRlc2NyaXB0aW9uCi0gICAgb2YgdGhlIHVzZSBvZiBwbmdfc2V0X3Jvd3MoKSBhbmQgcG5nX2dldF9yb3dzKCkgaW4gbGlicG5nLnR4dC9saWJwbmcuMy4KLSAgQWRkZWQgUE5HX0xFR0FDWV9TVVBQT1JURUQgbWFjcm8sIGFuZCAjaWZkZWYgb3V0IGFsbCBuZXcgKHNpbmNlIHZlcnNpb24KLSAgICAxLjAwKSBtZW1iZXJzIG9mIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvLCB0byByZWdhaW4gYmluYXJ5IGNvbXBhdGliaWxpdHkKLSAgICB3aGVuIHlvdSBkZWZpbmUgdGhpcyBtYWNyby4gIENhcGFiaWxpdGllcyBsb3N0IGluIHRoaXMgZXZlbnQKLSAgICBhcmUgdXNlciB0cmFuc2Zvcm1zIChuZXcgaW4gdmVyc2lvbiAxLjAuMCksdGhlIHVzZXIgdHJhbnNmb3JtIHBvaW50ZXIKLSAgICAobmV3IGluIHZlcnNpb24gMS4wLjIpLCByZ2JfdG9fZ3JheSAobmV3IGluIDEuMC41KSwgaUNDUCwgc0NBTCwgc1BMVCwKLSAgICB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UsIGFuZCB1bmtub3duIGNodW5rcyBzdXBwb3J0IChhbGwgbmV3IGluIDEuMC42KS4KLSAgICBUaGlzIHdhcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiBvbGQgYXBwbGljYXRpb25zIHRoYXQgYWxsb2NhdGUgdGhlIHN0cnVjdHMKLSAgICBkaXJlY3RseSBhcyBhdXRob3JzIHdlcmUgaW5zdHJ1Y3RlZCB0byBkbyBpbiBsaWJwbmctMC44OCBhbmQgZWFybGllciwKLSAgICBpbnN0ZWFkIG9mIHVzaW5nIHBuZ19jcmVhdGVfKigpLgotICBBZGRlZCBtb2RlcyBQTkdfQ1JFQVRFRF9SRUFEX1NUUlVDVCBhbmQgUE5HX0NSRUFURURfV1JJVEVfU1RSVUNUIHdoaWNoCi0gICAgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IGNvZGVzIHRoYXQgZGlyZWN0bHkgYWxsb2NhdGUgdGhlIHN0cnVjdHMsIGFuZAotICAgIGNvZGUgdG8gY2hlY2sgdGhlc2UgbW9kZXMgaW4gcG5nX3JlYWRfaW5pdCgpIGFuZCBwbmdfd3JpdGVfaW5pdCgpIGFuZAotICAgIGdlbmVyYXRlIGEgbGlicG5nIGVycm9yIGlmIHRoZSBtb2RlcyBhcmVuJ3Qgc2V0IGFuZCBQTkdfTEVHQUNZX1NVUFBPUlRFRAotICAgIHdhcyBub3QgZGVmaW5lZC4KLSAgQWRkZWQgbWFrZWZpbGUuaW50ZWwgYW5kIHVwZGF0ZWQgbWFrZWZpbGUud2F0Y29tIChQYXdlbCBNcm9jaGVuKQotCi1WZXJzaW9uIDEuMC42aiBbTWF5IDMsIDIwMDBdCi0gIE92ZXJsb2FkZWQgcG5nX3JlYWRfaW5pdCgpIGFuZCBwbmdfd3JpdGVfaW5pdCgpIHdpdGggbWFjcm9zIHRoYXQgY29udmVydAotICAgIGNhbGxzIHRvIHBuZ19yZWFkX2luaXRfMigpIG9yIHBuZ193cml0ZV9pbml0XzIoKSB0aGF0IGNoZWNrIHRoZSB2ZXJzaW9uCi0gICAgYW5kIHN0cnVjdHVyZSBzaXplcy4KLQotVmVyc2lvbiAxLjAuN2JldGExMSBbTWF5IDcsIDIwMDBdCi0gIFJlbW92ZWQgdGhlIG5ldyBQTkdfQ1JFQVRFRF9SRUFEX1NUUlVDVCBhbmQgUE5HX0NSRUFURURfV1JJVEVfU1RSVUNUIG1vZGVzCi0gICAgd2hpY2ggYXJlIG5vIGxvbmdlciB1c2VkLgotICBFbGltaW5hdGVkIHRoZSB0aHJlZSBuZXcgbWVtYmVycyBvZiBwbmdfdGV4dCB3aGVuIFBOR19MRUdBQ1lfU1VQUE9SVEVEIGlzCi0gICAgZGVmaW5lZCBvciB3aGVuIG5laXRoZXIgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQgbm9yIFBOR19XUklURV9pVFhUX1NVUFBPUlRFRAotICAgIGlzIGRlZmluZWQuCi0gIE1hZGUgUE5HX05PX1JFQUR8V1JJVEVfaVRYdCB0aGUgZGVmYXVsdCBzZXR0aW5nLCB0byBhdm9pZCBtZW1vcnkKLSAgICBvdmVycnVuIHdoZW4gb2xkIGFwcGxpY2F0aW9ucyBmaWxsIHRoZSBpbmZvX3B0ci0+dGV4dCBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0gIEFkZGVkIFBOR0FQSSBtYWNybywgYW5kIGFkZGVkIGl0IHRvIHRoZSBkZWZpbml0aW9ucyBvZiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zLgotICBSZWxvY2F0ZWQgdmVyc2lvbiBtYWNybyBkZWZpbml0aW9ucyBhaGVhZCBvZiB0aGUgaW5jbHVkZXMgb2YgemxpYi5oIGFuZAotICAgIHBuZ2NvbmYuaCBpbiBwbmcuaC4KLQotVmVyc2lvbiAxLjAuN2JldGExMiBbTWF5IDEyLCAyMDAwXQotICBSZXZpc2VkIHBuZ3NldC5jIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIGV4cGFuZGluZyB0aGUgcG5nX2RlYnVnIG1hY3JvLgotICBEZWxldGVkIHNvbWUgZXh0cmFuZW91cyBkZWZpbmVzIGZyb20gcG5nY29uZi5oCi0gIE1hZGUgUE5HX05PX0NPTlNPTEVfSU8gdGhlIGRlZmF1bHQgY29uZGl0aW9uIHdoZW4gUE5HX0JVSUxEX0RMTCBpcyBkZWZpbmVkLgotICBVc2UgTVNDIF9SUFRuIGRlYnVnZ2luZyBpbnN0ZWFkIG9mIGZwcmludGYgaWYgX01TQ19WRVIgaXMgZGVmaW5lZC4KLSAgQWRkZWQgcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcigpIGZ1bmN0aW9uLgotICBDaGVjayBmb3IgbWFzayZQTkdfRlJFRV9DSE5LIChmb3IgVEVYVCwgU0NBTCwgUENBTCkgaW4gcG5nX2ZyZWVfZGF0YSgpLgotICBFeHBhbmRlZCBsaWJwbmcuMy9saWJwbmcudHh0IGluZm9ybWF0aW9uIGFib3V0IHBuZ19kYXRhX2ZyZWVyKCkuCi0KLVZlcnNpb24gMS4wLjdiZXRhMTQgW01heSAxNywgMjAwMF0gKGJldGExMyB3YXMgbm90IHB1Ymxpc2hlZCkKLSAgQ2hhbmdlZCBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgdG8gaGFuZGxlIGJhZCBhZGFwdGl2ZSBmaWx0ZXIgdHlwZXMgYXMKLSAgICB3YXJuaW5ncyBpbnN0ZWFkIG9mIGVycm9ycywgYXMgcG5ncnV0aWwuYyBkb2VzLgotICBTZXQgdGhlIFBOR19JTkZPX0lEQVQgdmFsaWQgZmxhZyBpbiBwbmdfc2V0X3Jvd3MoKSBzbyBwbmdfd3JpdGVfcG5nKCkKLSAgICB3aWxsIGFjdHVhbGx5IHdyaXRlIElEQVRzLgotICBNYWRlIHRoZSBkZWZhdWx0IFBOR19VU0VfTE9DQUxfQVJSQVlTIGRlcGVuZCBvbiBQTkdfRExMIGluc3RlYWQgb2YgV0lOMzIuCi0gIE1ha2UgcG5nX2ZyZWVfZGF0YSgpIGlnbm9yZSBpdHMgZmluYWwgcGFyYW1ldGVyIGV4Y2VwdCB3aGVuIGZyZWVpbmcgZGF0YQotICAgIHRoYXQgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzICh0ZXh0LCBzUExULCB1bmtub3ducykuCi0gIEZpeGVkIGEgbmV3IGJ1ZyBpbiBwbmdfc2V0X3Jvd3MoKS4KLSAgUmVtb3ZlZCBpbmZvX3B0ci0+dmFsaWQgdGVzdHMgZnJvbSBwbmdfZnJlZV9kYXRhKCksIGFzIGluIHZlcnNpb24gMS4wLjUuCi0gIEFkZGVkIHBuZ19zZXRfaW52YWxpZCgpIGZ1bmN0aW9uLgotICBGaXhlZCBpbmNvcnJlY3QgaWxsdXN0cmF0aW9ucyBvZiBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKSBpbiBleGFtcGxlLmMuCi0KLVZlcnNpb24gMS4wLjdiZXRhMTUgW01heSAzMCwgMjAwMF0KLSAgUmV2aXNlZCB0aGUgZGVsaWJlcmF0ZWx5IGVycm9uZW91cyBMaW51eCBzZXRqbXAgY29kZSBpbiBwbmdjb25mLmggdG8gcHJvZHVjZQotICAgIGZld2VyIGVycm9yIG1lc3NhZ2VzLgotICBSZWFycmFuZ2VkIGNoZWNrcyBmb3IgWl9PSyB0byBjaGVjayB0aGUgbW9zdCBsaWtlbHkgcGF0aCBmaXJzdCBpbiBwbmdwcmVhZC5jCi0gICAgYW5kIHBuZ3d1dGlsLmMuCi0gIEFkZGVkIGNoZWNrcyBpbiBwbmd0ZXN0LmMgZm9yIHBuZ19jcmVhdGVfKigpIHJldHVybmluZyBOVUxMLCBhbmQgbWVudGlvbmVkCi0gICAgaW4gbGlicG5nLnR4dC9saWJwbmcuMyB0aGUgbmVlZCBmb3IgYXBwbGljYXRpb25zIHRvIGNoZWNrIHRoaXMuCi0gIENoYW5nZWQgbmFtZXMgb2YgcG5nX2RlZmF1bHRfKigpIGZ1bmN0aW9ucyBpbiBwbmd0ZXN0IHRvIHBuZ3Rlc3RfKigpLgotICBDaGFuZ2VkIHJldHVybiB0eXBlIG9mIHBuZ19nZXRfeHx5X29mZnNldF8qKCkgZnJvbSBwbmdfdWludF8zMiB0byBwbmdfaW50XzMyLgotICBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIHVudXNlZCBQTkdfSU5DSF9DT05WRVJTSU9OUyBmdW5jdGlvbnMgaW4gcG5nZ2V0LmMKLSAgU2V0IGVhY2ggcG9pbnRlciB0byBOVUxMIGFmdGVyIGZyZWVpbmcgaXQgaW4gcG5nX2ZyZWVfZGF0YSgpLgotICBXb3JrZWQgYXJvdW5kIGEgcHJvYmxlbSBpbiBwbmdjb25mLmg7IEFJWCdzIHN0cmluZ3MuaCBkZWZpbmVzIGFuICJpbmRleCIKLSAgICBtYWNybyB0aGF0IGNvbmZsaWN0cyB3aXRoIGxpYnBuZydzIHBuZ19jb2xvcl8xNi5pbmRleC4gKERpbWl0cmkKLSAgICBQYXBhZGFwb3Vsb3MpCi0gIEFkZGVkICJtc3ZjIiBkaXJlY3Rvcnkgd2l0aCBNU1ZDKysgcHJvamVjdCBmaWxlcyAoU2ltb24tUGllcnJlIENhZGlldXgpLgotCi1WZXJzaW9uIDEuMC43YmV0YTE2IFtKdW5lIDQsIDIwMDBdCi0gIFJldmlzZWQgdGhlIHdvcmthcm91bmQgb2YgQUlYIHN0cmluZy5oICJpbmRleCIgYnVnLgotICBBZGRlZCBhIGNoZWNrIGZvciBvdmVybGVuZ3RoIFBMVEUgY2h1bmsgaW4gcG5ncnV0aWwuYy4KLSAgQWRkZWQgUE5HX05PX1BPSU5URVJfSU5ERVhJTkcgbWFjcm8gdG8gdXNlIGFycmF5LWluZGV4aW5nIGluc3RlYWQgb2YgcG9pbnRlcgotICAgIGluZGV4aW5nIGluIHBuZ3J1dGlsLmMgYW5kIHBuZ3d1dGlsLmMgdG8gYWNjb21tb2RhdGUgYSBidWdneSBjb21waWxlci4KLSAgQWRkZWQgYSB3YXJuaW5nIGluIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLCBlLmcuCi0gICAgd2hlbiBpdCB0cmllcyB0byByZWFkIGFuIGVycm9uZW91cyBQaG90b1Nob3AgaUNDUCBjaHVuay4KLSAgQWRkZWQgUE5HX1VTRV9ETEwgbWFjcm8uCi0gIFJldmlzZWQgdGhlIGNvcHlyaWdodC9kaXNjbGFpbWVyL2xpY2Vuc2Ugbm90aWNlLgotICBBZGRlZCBjb250cmliL21zdmN0ZXN0IGRpcmVjdG9yeQotCi1WZXJzaW9uIDEuMC43cmMxIFtKdW5lIDksIDIwMDBdCi0gIENvcnJlY3RlZCB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgKDB4MDQwMCBub3QgMHgwMjAwKQotICBBZGRlZCBjb250cmliL3Zpc3VwbmcgZGlyZWN0b3J5IChXaWxsZW0gdmFuIFNjaGFpaykKLQotVmVyc2lvbiAxLjAuN2JldGExOCBbSnVuZSAyMywgMjAwMF0KLSAgUmV2aXNlZCBQTkdBUEkgZGVmaW5pdGlvbiwgYW5kIHBuZ3ZjcmQuYyB0byB3b3JrIHdpdGggX19HQ0NfXwotICAgIGFuZCBkbyBub3QgcmVkZWZpbmUgUE5HQVBJIGlmIGl0IGlzIHBhc3NlZCBpbiB2aWEgYSBjb21waWxlciBkaXJlY3RpdmUuCi0gIFJldmlzZWQgdmlzdXBuZy9QbmdGaWxlLmMgdG8gcmVtb3ZlIHJldHVybnMgZnJvbSB3aXRoaW4gdGhlIFRyeSBibG9jay4KLSAgUmVtb3ZlZCBsZWFkaW5nIHVuZGVyc2NvcmVzIGZyb20gIl9QTkdfSCIgYW5kICJfUE5HX1NBVkVfQlNEX1NPVVJDRSIgbWFjcm9zLgotICBVcGRhdGVkIGNvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggdG8gdmVyc2lvbiAxLjAuMC4KLSAgRml4ZWQgYnVncyBpbiBwbmd3cml0ZS5jIGFuZCBwbmd3dXRpbC5jIHRoYXQgcHJldmVudGVkIHdyaXRpbmcgaUNDUCBjaHVua3MuCi0KLVZlcnNpb24gMS4wLjdyYzIgW0p1bmUgMjgsIDIwMDBdCi0gIFVwZGF0ZWQgbGljZW5zZSB0byBpbmNsdWRlIGRpc2NsYWltZXJzIHJlcXVpcmVkIGJ5IFVDSVRBLgotICBGaXhlZCAiREpCUFAiIHR5cG8gaW4gcG5nZ2NjcmQuYyBpbnRyb2R1Y2VkIGluIGJldGExOC4KLQotVmVyc2lvbiAxLjAuNyBbSnVseSAxLCAyMDAwXQotICBSZXZpc2VkIHRoZSBkZWZpbml0aW9uIG9mICJ0cmFuc192YWx1ZXMiIGluIGxpYnBuZy4zL2xpYnBuZy50eHQKLQotVmVyc2lvbiAxLjAuOGJldGExIFtKdWx5IDgsIDIwMDBdCi0gIEFkZGVkIHBuZ19mcmVlKHBuZ19wdHIsIGtleSkgdHdvIHBsYWNlcyBpbiBwbmdwcmVhZC5jIHRvIHN0b3AgbWVtb3J5IGxlYWtzLgotICBDaGFuZ2VkIFBOR19OT19TVERJTyB0byBQTkdfTk9fQ09OU09MRV9JTywgc2V2ZXJhbCBwbGFjZXMgaW4gcG5ncnV0aWwuYyBhbmQKLSAgICBwbmd3dXRpbC5jLgotICBDaGFuZ2VkIFBOR19FWFBPUlRfVkFSIHRvIHVzZSBQTkdfSU1QRVhQLCBpbiBwbmdjb25mLmguCi0gIFJlbW92ZWQgdW51c2VkICIjaW5jbHVkZSA8YXNzZXJ0Lmg+IiBmcm9tIHBuZy5jCi0gIEFkZGVkIFdpbmRvd3NDRSBzdXBwb3J0LgotICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gd29yayB3aXRoIGdjYy0yLjk1LjIgYW5kIGluIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQuCi0KLVZlcnNpb24gMS4wLjhiZXRhMiBbSnVseSAxMCwgMjAwMF0KLSAgQWRkZWQgcHJvamVjdCBmaWxlcyB0byB0aGUgd2luY2UgZGlyZWN0b3J5IGFuZCBtYWRlIGZ1cnRoZXIgcmV2aXNpb25zCi0gICAgb2YgcG5ndGVzdC5jLCBwbmdyaW8uYywgYW5kIHBuZ3dpby5jIGluIHN1cHBvcnQgb2YgV2luZG93c0NFLgotCi1WZXJzaW9uIDEuMC44YmV0YTMgW0p1bHkgMTEsIDIwMDBdCi0gIE9ubHkgc2V0IHRoZSBQTkdfRkxBR19GUkVFX1RSTlMgb3IgUE5HX0ZSRUVfVFJOUyBmbGFnIGluIHBuZ19oYW5kbGVfdFJOUygpCi0gICAgZm9yIGluZGV4ZWQtY29sb3IgaW5wdXQgZmlsZXMgdG8gYXZvaWQgcG90ZW50aWFsIGRvdWJsZS1mcmVlaW5nIHRyYW5zIGFycmF5Ci0gICAgdW5kZXIgc29tZSB1bnVzdWFsIGNvbmRpdGlvbnM7IHByb2JsZW0gd2FzIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjAuNmYuCi0gIEZ1cnRoZXIgcmV2aXNpb25zIHRvIHBuZ3Rlc3QuYyBhbmQgZmlsZXMgaW4gdGhlIHdpbmNlIHN1YmRpcmVjdG9yeS4KLQotVmVyc2lvbiAxLjAuOGJldGE0IFtKdWx5IDE0LCAyMDAwXQotICBBZGRlZCB0aGUgZmlsZXMgcG5nYmFyLnBuZyBhbmQgcG5nYmFyLmpwZyB0byB0aGUgZGlzdHJpYnV0aW9uLgotICBBZGRlZCBtYWtlZmlsZS5jeWd3aW4sIGFuZCBjeWd3aW4gc3VwcG9ydCBpbiBwbmdjb25mLmgKLSAgQWRkZWQgUE5HX05PX1pBTExPQ19aRVJPIG1hY3JvIChtYWtlcyBwbmdfemFsbG9jIHNraXAgemVyb2luZyBtZW1vcnkpCi0KLVZlcnNpb24gMS4wLjhyYzEgW0p1bHkgMTYsIDIwMDBdCi0gIFJldmlzZWQgcG5nX2RlYnVnKCkgbWFjcm9zIGFuZCBzdGF0ZW1lbnRzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQotVmVyc2lvbiAxLjAuOCBbSnVseSAyNCwgMjAwMF0KLSAgQWRkZWQgcG5nX2ZsdXNoKCkgaW4gcG5nd3JpdGUuYywgYWZ0ZXIgcG5nX3dyaXRlX0lFTkQoKS4KLSAgVXBkYXRlZCBtYWtlZmlsZS5ocHV4IHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVZlcnNpb24gMS4wLjliZXRhMSBbTm92ZW1iZXIgMTAsIDIwMDBdCi0gIEZpeGVkIHR5cG8gaW4gc2NyaXB0cy9tYWtlZmlsZS5ocHV4Ci0gIFVwZGF0ZWQgbWFrZXZtcy5jb20gaW4gc2NyaXB0cyBhbmQgY29udHJpYi8qIGFuZCBjb250cmliLyogKE1hcnRpbiBaaW5zZXIpCi0gIEZpeGVkIHNlcWVuY2UtcG9pbnQgYnVnIGluIGNvbnRyaWIvcG5nbWludXMvcG5nMnBubSAoTWFydGluIFppbnNlcikKLSAgQ2hhbmdlZCAiY2Ryb20uY29tIiBpbiBkb2N1bWVudGF0aW9uIHRvICJsaWJwbmcub3JnIgotICBSZXZpc2VkIHBuZ2djY3JkLmMgdG8gZ2V0IGl0IGFsbCB3b3JraW5nLCBhbmQgdXBkYXRlZCBtYWtlZmlsZS5nY21teCAoR3JlZykuCi0gIENoYW5nZWQgdHlwZSBvZiAicGFyYW1zIiBmcm9tIHZvaWRwIHRvIHBuZ192b2lkcCBpbiBwbmdfcmVhZHx3cml0ZV9wbmcoKS4KLSAgTWFrZSBzdXJlIFBOR0FQSSBhbmQgUE5HX0lNUEVYUCBhcmUgZGVmaW5lZCBpbiBwbmdjb25mLmguCi0gIFJldmlzZWQgdGhlIDMgaW5zdGFuY2VzIG9mIFdSSVRFRklMRSBpbiBwbmd0ZXN0LmMuCi0gIFJlbG9jYXRlZCAibXN2YyIgYW5kICJ3aW5jZSIgcHJvamVjdCBzdWJkaXJlY3RvcmllcyBpbnRvICJkbGwiIHN1YmRpcmVjdG9yeS4KLSAgVXBkYXRlZCBwbmcucmMgaW4gZGxsL21zdmMgcHJvamVjdAotICBSZXZpc2VkIG1ha2VmaWxlLmRlYyB0byBkZWZpbmUgYW5kIHVzZSBMSUJQQVRIIGFuZCBJTkNQQVRICi0gIEluY3JlYXNlZCBzaXplIG9mIGdsb2JhbCBwbmdfbGlicG5nX3ZlcltdIGFycmF5IGZyb20gMTIgdG8gMTggY2hhcnMuCi0gIE1hZGUgZ2xvYmFsIHBuZ19saWJwbmdfdmVyW10sIHBuZ19zaWdbXSBhbmQgcG5nX3Bhc3NfKltdIGFycmF5cyBjb25zdC4KLSAgUmVtb3ZlZCBkdXBsaWNhdGUgcG5nX2NyY19maW5pc2goKSBmcm9tIHBuZ19oYW5kbGVfYktHRCgpIGZ1bmN0aW9uLgotICBBZGRlZCBhIHdhcm5pbmcgd2hlbiBhcHBsaWNhdGlvbiBjYWxscyBwbmdfcmVhZF91cGRhdGVfaW5mbygpIG11bHRpcGxlIHRpbWVzLgotICBSZXZpc2VkIG1ha2VmaWxlLmN5Z3dpbgotICBGaXhlZCBidWdzIGluIGlDQ1Agc3VwcG9ydCBpbiBwbmdydXRpbC5jIGFuZCBwbmd3dXRpbC5jLgotICBSZXBsYWNlZCBwbmdfc2V0X2VtcHR5X3BsdGVfcGVybWl0dGVkKCkgd2l0aCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpLgotCi1WZXJzaW9uIDEuMC45YmV0YTIgW05vdmVtYmVyIDE5LCAyMDAwXQotICBSZW5hbWVkIHRoZSAiZGxsIiBzdWJkaXJlY3RvcnkgInByb2plY3RzIi4KLSAgQWRkZWQgYm9ybGFuZCBwcm9qZWN0IGZpbGVzIHRvICJwcm9qZWN0cyIgc3ViZGlyZWN0b3J5LgotICBTZXQgVlNfRkZfUFJFUkVMRUFTRSBhbmQgVlNfRkZfUEFUQ0hFRCBmbGFncyBpbiBtc3ZjL3BuZy5yYyB3aGVuIGFwcHJvcHJpYXRlLgotICBBZGQgZXJyb3IgbWVzc2FnZSBpbiBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKCkgd2hlbiBtYWxsb2MgZmFpbHMuCi0KLVZlcnNpb24gMS4wLjliZXRhMyBbTm92ZW1iZXIgMjMsIDIwMDBdCi0gIFJldmlzZWQgUE5HX0xJQlBOR19CVUlMRF9UWVBFIG1hY3JvIGluIHBuZy5oLCB1c2VkIGluIHRoZSBtc3ZjIHByb2plY3QuCi0gIFJlbW92ZWQgdGhlIHBuZ19mbHVzaCgpIGluIHBuZ3dyaXRlLmMgdGhhdCBjcmFzaGVzIHNvbWUgYXBwbGljYXRpb25zCi0gICAgdGhhdCBkb24ndCBzZXQgcG5nX291dHB1dF9mbHVzaF9mbi4KLSAgQWRkZWQgbWFrZWZpbGUubWFjb3N4IGFuZCBtYWtlZmlsZS5haXggdG8gc2NyaXB0cyBkaXJlY3RvcnkuCi0KLVZlcnNpb24gMS4wLjliZXRhNCBbRGVjZW1iZXIgMSwgMjAwMF0KLSAgQ2hhbmdlIHBuZ19jaHVua193YXJuaW5nIHRvIHBuZ193YXJuaW5nIGluIHBuZ19jaGVja19rZXl3b3JkKCkuCi0gIEluY3JlYXNlZCB0aGUgZmlyc3QgcGFydCBvZiBtc2cgYnVmZmVyIGZyb20gMTYgdG8gMTggaW4gcG5nX2NodW5rX2Vycm9yKCkuCi0KLVZlcnNpb24gMS4wLjliZXRhNSBbRGVjZW1iZXIgMTUsIDIwMDBdCi0gIEFkZGVkIHN1cHBvcnQgZm9yIGZpbHRlciBtZXRob2QgNjQgKGZvciBQTkcgZGF0YXN0cmVhbXMgZW1iZWRkZWQgaW4gTU5HKS4KLQotVmVyc2lvbiAxLjAuOWJldGE2IFtEZWNlbWJlciAxOCwgMjAwMF0KLSAgUmV2aXNlZCBwbmdfc2V0X2ZpbHRlcigpIHRvIGFjY2VwdCBmaWx0ZXIgbWV0aG9kIDY0IHdoZW4gYXBwcm9wcmlhdGUuCi0gIEFkZGVkIG5ldyBQTkdfSEFWRV9QTkdfU0lHTkFUVVJFIGJpdCB0byBwbmdfcHRyLT5tb2RlIGFuZCB1c2UgaXQgdG8KLSAgICBoZWxwIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gdXNpbmcgTU5HIGZlYXR1cmVzIGluIFBORyBkYXRhc3RyZWFtcy4KLSAgQWRkZWQgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKSBmdW5jdGlvbi4KLSAgUmV2aXNlZCBsaWJwbmcuMy9saWJwbmcudHh0LiAgQ2hhbmdlZCAiZmlsdGVyIHR5cGUiIHRvICJmaWx0ZXIgbWV0aG9kIi4KLQotVmVyc2lvbiAxLjAuOXJjMSBbRGVjZW1iZXIgMjMsIDIwMDBdCi0gIFJldmlzZWQgdGVzdCBmb3IgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSBpbiBwbmdydXRpbC5jCi0gIEZpeGVkIGVycm9yIGhhbmRsaW5nIG9mIHVua25vd24gY29tcHJlc3Npb24gdHlwZSBpbiBwbmdfZGVjb21wcmVzc19jaHVuaygpLgotICBJbiBwbmdjb25mLmgsIGRlZmluZSBfX2NkZWNsIHdoZW4gX01TQ19WRVIgaXMgZGVmaW5lZC4KLQotVmVyc2lvbiAxLjAuOWJldGE3IFtEZWNlbWJlciAyOCwgMjAwMF0KLSAgQ2hhbmdlZCBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0IHRvIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0Ugc2V2ZXJhbCBwbGFjZXMuCi0gIFJldmlzZWQgbWVtb3J5IG1hbmFnZW1lbnQgaW4gcG5nX3NldF9oSVNUIGFuZCBwbmdfaGFuZGxlX2hJU1QgaW4gYSBiYWNrd2FyZAotICAgIGNvbXBhdGlibGUgbWFubmVyLiAgUExURSBhbmQgdFJOUyB3ZXJlIHJldmlzZWQgc2ltaWxhcmx5LgotICBSZXZpc2VkIHRoZSBpQ0NQIGNodW5rIHJlYWRlciB0byBpZ25vcmUgdHJhaWxpbmcgZ2FyYmFnZS4KLQotVmVyc2lvbiAxLjAuOWJldGE4IFtKYW51YXJ5IDEyLCAyMDAxXQotICBNb3ZlZCBwbmdhc21yZC5oIGludG8gcG5nY29uZi5oLgotICBJbXByb3ZlZCBoYW5kbGluZyBvZiBvdXQtb2Ytc3BlYyBnYXJiYWdlIGlDQ1AgY2h1bmtzIGdlbmVyYXRlZCBieSBQaG90b1Nob3AuCi0KLVZlcnNpb24gMS4wLjliZXRhOSBbSmFudWFyeSAxNSwgMjAwMV0KLSAgQWRkZWQgcG5nX3NldF9pbnZhbGlkLCBwbmdfcGVybWl0X21uZ19mZWF0dXJlcywgYW5kIHBuZ19tbXhfc3VwcG9ydGVkIHRvCi0gICAgd2luY2UgYW5kIG1zdmMgcHJvamVjdCBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlcy4KLSAgTWlub3IgcmV2aXNpb24gb2YgbWFrZWZpbGUuY3lnd2luLgotICBGaXhlZCBidWcgd2l0aCBwcm9ncmVzc2l2ZSByZWFkaW5nIG9mIG5hcnJvdyBpbnRlcmxhY2VkIGltYWdlcyBpbiBwbmdwcmVhZC5jCi0KLVZlcnNpb24gMS4wLjliZXRhMTAgW0phbnVhcnkgMTYsIDIwMDFdCi0gIERvIG5vdCB0eXBlZGVmIHBuZ19GSUxFX3AgaW4gcG5nY29uZi5oIHdoZW4gUE5HX05PX1NURElPIGlzIGRlZmluZWQuCi0gIEZpeGVkICJwbmdfbW14X3N1cHBvcnRlZCIgdHlwbyBpbiBwcm9qZWN0IGRlZmluaXRpb24gZmlsZXMuCi0KLVZlcnNpb24gMS4wLjliZXRhMTEgW0phbnVhcnkgMTksIDIwMDFdCi0gIFVwZGF0ZWQgbWFrZWZpbGUuc2dpIHRvIG1ha2Ugc2hhcmVkIGxpYnJhcnkuCi0gIFJlbW92ZWQgcG5nX21teF9zdXBwb3J0KCkgZnVuY3Rpb24gYW5kIGRpc2FibGVkIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECi0gICAgYnkgZGVmYXVsdCwgZm9yIHRoZSBiZW5lZml0IG9mIERMTCBmb3J3YXJkIGNvbXBhdGliaWxpdHkuICBUaGVzZSB3aWxsCi0gICAgYmUgcmUtZW5hYmxlZCBpbiB2ZXJzaW9uIDEuMi4wLgotCi1WZXJzaW9uIDEuMC45cmMyIFtKYW51YXJ5IDIyLCAyMDAxXQotICBSZXZpc2VkIGN5Z3dpbiBzdXBwb3J0LgotCi1WZXJzaW9uIDEuMC45IFtKYW51YXJ5IDMxLCAyMDAxXQotICBBZGRlZCBjaGVjayBvZiBjeWd3aW4ncyBBTExfU1RBVElDIGluIHBuZ2NvbmYuaAotICBBZGRlZCAiLW5vbW14IiBwYXJhbWV0ZXIgdG8gY29udHJpYi9ncmVnYm9vay9ycG5nMi13aW4gYW5kIHJwbmcyLXggZGVtb3MuCi0KLVZlcnNpb24gMS4wLjEwYmV0YTEgW01hcmNoIDE0LCAyMDAxXQotICBSZXZpc2VkIG1ha2VmaWxlLmRlYywgbWFrZWZpbGUuc2dpLCBhbmQgbWFrZWZpbGUuc2dnY2M7IGFkZGVkIG1ha2VmaWxlLmhwZ2NjLgotICBSZWZvcm1hdHRlZCBsaWJwbmcuMyB0byBlbGltaW5hdGUgYmFkIGxpbmUgYnJlYWtzLgotICBBZGRlZCBjaGVja3MgZm9yIF9tbXhfc3VwcG9ydGVkIGluIHRoZSByZWFkX2ZpbHRlcl9yb3cgZnVuY3Rpb24gb2YgcG5nZ2NjcmQuYwotICBBZGRlZCBwcm90b3R5cGUgZm9yIHBuZ19tbXhfc3VwcG9ydCgpIG5lYXIgdGhlIHRvcCBvZiBwbmdnY2NyZC5jCi0gIE1vdmVkIHNvbWUgZXJyb3IgY2hlY2tpbmcgZnJvbSBwbmdfaGFuZGxlX0lIRFIgdG8gcG5nX3NldF9JSERSLgotICBBZGRlZCBQTkdfTk9fUkVBRF9TVVBQT1JURUQgYW5kIFBOR19OT19XUklURV9TVVBQT1JURUQgbWFjcm9zLgotICBSZXZpc2VkIHBuZ19tbXhfc3VwcG9ydCgpIGZ1bmN0aW9uIGluIHBuZ2djY3JkLmMKLSAgUmVzdG9yZWQgdmVyc2lvbiAxLjAuOCBQTkdfV1JJVEVfRU1QVFlfUExURV9TVVBQT1JURUQgYmVoYXZpb3IgaW4gcG5nd3V0aWwuYwotICBGaXhlZCBtZW1vcnkgbGVhayBpbiBjb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jCi0gIEZpeGVkIGJ1Z3MgaW4gcG5nX2NvbWJpbmVfcm93KCkgaW4gcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jIChDIHZlcnNpb24pCi0gIEFkZGVkIHdhcm5pbmdzIHdoZW4gcmV0cmlldmluZyBvciBzZXR0aW5nIGdhbW1hPTAuCi0gIEluY3JlYXNlZCB0aGUgZmlyc3QgcGFydCBvZiBtc2cgYnVmZmVyIGZyb20gMTYgdG8gMTggaW4gcG5nX2NodW5rX3dhcm5pbmcoKS4KLQotVmVyc2lvbiAxLjAuMTByYzEgW01hcmNoIDIzLCAyMDAxXQotICBDaGFuZ2VkIGFsbCBpbnN0YW5jZXMgb2YgbWVtY3B5LCBzdHJjcHksIGFuZCBzdHJsZW4gdG8gcG5nX21lbWNweSwgcG5nX3N0cmNweSwKLSAgICBhbmQgcG5nX3N0cmxlbi4KLSAgUmV2aXNlZCBwbmdfbW14X3N1cHBvcnRlZCgpIGZ1bmN0aW9uIGluIHBuZ2djY3JkLmMgdG8gcmV0dXJuIHByb3BlciB2YWx1ZS4KLSAgRml4ZWQgYnVnIGluIHByb2dyZXNzaXZlIHJlYWRpbmcgKHBuZ3ByZWFkLmMpIHdpdGggc21hbGwgaW1hZ2VzIChoZWlnaHQgPCA4KS4KLQotVmVyc2lvbiAxLjAuMTAgW01hcmNoIDMwLCAyMDAxXQotICBEZWxldGVkIGV4dHJhbmVvdXMgc3BhY2UgKGludHJvZHVjZWQgaW4gMS4wLjkpIGZyb20gbGluZSA0MiBvZiBtYWtlZmlsZS5jeWd3aW4KLSAgQWRkZWQgYmVvcyBwcm9qZWN0IGZpbGVzIChDaHJpcyBIZXJib3J0aCkKLQotVmVyc2lvbiAxLjAuMTFiZXRhMSBbQXByaWwgMywgMjAwMV0KLSAgQWRkZWQgdHlwZSBjYXN0cyBvbiBzZXZlcmFsIHBuZ19tYWxsb2MoKSBjYWxscyAoRGltaXRyaSBQYXBhZGFwb3Vsb3MpLgotICBSZW1vdmVkIGEgbm8tbG9uZ2VyIG5lZWRlZCBBSVggd29yay1hcm91bmQgZnJvbSBwbmdjb25mLmgKLSAgQ2hhbmdlZCBzZXZlcmFsICIvLyIgc2luZ2xlLWxpbmUgY29tbWVudHMgdG8gQy1zdHlsZSBpbiBwbmdnY2NyZC5jCi0KLVZlcnNpb24gMS4wLjExYmV0YTIgW0FwcmlsIDExLCAyMDAxXQotICBSZW1vdmVkIFBOR0FQSSBmcm9tIHNldmVyYWwgZnVuY3Rpb25zIHdob3NlIHByb3RvdHlwZXMgZGlkIG5vdCBoYXZlIFBOR0FQSS4KLSAgVXBkYXRlZCBzY3JpcHRzL3BuZ29zMi5kZWYKLQotVmVyc2lvbiAxLjAuMTFiZXRhMyBbQXByaWwgMTQsIDIwMDFdCi0gIEFkZGVkIGNoZWNraW5nIHRoZSByZXN1bHRzIG9mIG1hbnkgaW5zdGFuY2VzIG9mIHBuZ19tYWxsb2MoKSBmb3IgTlVMTAotCi1WZXJzaW9uIDEuMC4xMWJldGE0IFtBcHJpbCAyMCwgMjAwMV0KLSAgVW5kaWQgdGhlIGNoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuMC4xMWJldGEzLiAgQWRkZWQgYSBjaGVjayBmb3IgTlVMTCByZXR1cm4KLSAgICBmcm9tIHVzZXIncyBtYWxsb2NfZm4oKS4KLSAgUmVtb3ZlZCBzb21lIHVzZWxlc3MgdHlwZSBjYXN0cyBvZiB0aGUgTlVMTCBwb2ludGVyLgotICBBZGRlZCBtYWtlZmlsZS5uZXRic2QKLQotVmVyc2lvbiAxLjAuMTEgW0FwcmlsIDI3LCAyMDAxXQotICBSZXZpc2VkIG1ha2VmaWxlLm5ldGJzZAotCi1WZXJzaW9uIDEuMC4xMmJldGExIFtNYXkgMTQsIDIwMDFdCi0gIFRlc3QgZm9yIFdpbmRvd3MgcGxhdGZvcm0gaW4gcG5nY29uZi5oIHdoZW4gaW5jbHVkaW5nIG1hbGxvYy5oIChFbW1hbnVlbCBCbG90KQotICBVcGRhdGVkIG1ha2VmaWxlLmN5Z3dpbiBhbmQgaGFuZGxpbmcgb2YgQ3lnd2luJ3MgQUxMX1NUQVRJQyBpbiBwbmdjb25mLmgKLSAgQWRkZWQgc29tZSBuZXZlci10by1iZS1leGVjdXRlZCBjb2RlIGluIHBuZ2djY3JkLmMgdG8gcXVpZXQgY29tcGlsZXIgd2FybmluZ3MuCi0gIEVsaW1pbmF0ZWQgdGhlIHBuZ19lcnJvciBhYm91dCBhcHBzIHVzaW5nIHBuZ19yZWFkfHdyaXRlX2luaXQoKS4gIEluc3RlYWQsCi0gICAgbGlicG5nIHdpbGwgcmVhbGxvY2F0ZSB0aGUgcG5nX3N0cnVjdCBhbmQgaW5mb19zdHJ1Y3QgaWYgdGhleSBhcmUgdG9vIHNtYWxsLgotICAgIFRoaXMgcmV0YWlucyBmdXR1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgZm9yIG9sZCBhcHBsaWNhdGlvbnMgd3JpdHRlbiBmb3IKLSAgICBsaWJwbmctMC44OCBhbmQgZWFybGllci4KLQotVmVyc2lvbiAxLjIuMGJldGExIFtNYXkgNiwgMjAwMV0KLSAgQnVtcGVkIERMTE5VTSB0byAyLgotICBSZS1lbmFibGVkIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEIGFuZCBlbmFibGVkIFBOR19BU1NFTUJMRVJfQ09ERV9TVVBQT1JURUQKLSAgICBieSBkZWZhdWx0LgotICBBZGRlZCBydW50aW1lIHNlbGVjdGlvbiBvZiBNTVggZmVhdHVyZXMuCi0gIEFkZGVkIHBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycyBmdW5jdGlvbiBhbmQgcmVsYXRlZCBtYWNyb3MuCi0KLVZlcnNpb24gMS4yLjBiZXRhMiBbTWF5IDcsIDIwMDFdCi0gIEZpbmlzaGVkIG1lcmdpbmcgMS4yLjBiZXRhMSB3aXRoIHZlcnNpb24gMS4wLjExCi0gIEFkZGVkIGEgY2hlY2sgZm9yIGF0dGVtcHRzIHRvIHJlYWQgb3Igd3JpdGUgUExURSBpbiBncmF5c2NhbGUgUE5HIGRhdGFzdHJlYW1zLgotCi1WZXJzaW9uIDEuMi4wYmV0YTMgW01heSAxNywgMjAwMV0KLSAgRW5hYmxlZCB1c2VyIG1lbW9yeSBmdW5jdGlvbiBieSBkZWZhdWx0LgotICBNb2RpZmllZCBwbmdfY3JlYXRlX3N0cnVjdCBzbyBpdCBwYXNzZXMgdXNlciBtZW1fcHRyIHRvIHVzZXIgbWVtb3J5IGFsbG9jYXRvci4KLSAgSW5jcmVhc2VkIHBuZ19tbmdfZmVhdHVyZXMgZmxhZyBmcm9tIHBuZ19ieXRlIHRvIHBuZ191aW50XzMyLgotICBCdW1wZWQgc2hhcmVkLWxpYnJhcnkgKHNvLW51bWJlcikgYW5kIGRsbC1udW1iZXIgdG8gMy4KLQotVmVyc2lvbiAxLjIuMGJldGE0IFtKdW5lIDIzLCAyMDAxXQotICBDaGVjayBmb3IgbWlzc2luZyBwcm9maWxlIGxlbmd0aCBmaWVsZCBpbiBpQ0NQIGNodW5rIGFuZCBmcmVlIGNodW5rX2RhdGEKLSAgICBpbiBjYXNlIG9mIHRydW5jYXRlZCBpQ0NQIGNodW5rLgotICBCdW1wZWQgc2hhcmVkLWxpYnJhcnkgbnVtYmVyIHRvIDMgaW4gbWFrZWZpbGUuc2dpIGFuZCBtYWtlZmlsZS5zZ2djYwotICBCdW1wZWQgZGxsLW51bWJlciBmcm9tIDIgdG8gMyBpbiBtYWtlZmlsZS5jeWd3aW4KLSAgUmV2aXNlZCBjb250cmliL2dyZWdib29rL3JwbmcqLXguYyB0byBhdm9pZCBhIG1lbW9yeSBsZWFrIGFuZCB0byBleGl0IGNsZWFubHkKLSAgICBpZiB1c2VyIGF0dGVtcHRzIHRvIHJ1biBpdCBvbiBhbiA4LWJpdCBkaXNwbGF5LgotICBVcGRhdGVkIGNvbnRyaWIvZ3JlZ2Jvb2sKLSAgVXNlIHBuZ19tYWxsb2MgaW5zdGVhZCBvZiBwbmdfemFsbG9jIHRvIGFsbG9jYXRlIHBhbGV0dGUgaW4gcG5nc2V0LmMKLSAgVXBkYXRlZCBtYWtlZmlsZS5pYm1jCi0gIEFkZGVkIHNvbWUgdHlwZWNhc3RzIHRvIGVsaW1pbmF0ZSBnY2MgMy4wIHdhcm5pbmdzLiAgQ2hhbmdlZCBwcm90b3R5cGVzCi0gICAgb2YgcG5nX3dyaXRlX29GRlMgd2lkdGggYW5kIGhlaWdodCBmcm9tIHBuZ191aW50XzMyIHRvIHBuZ19pbnRfMzIuCi0gIFVwZGF0ZWQgZXhhbXBsZS5jCi0gIFJldmlzZWQgcHJvdG90eXBlcyBmb3IgcG5nX2RlYnVnX21hbGxvYyBhbmQgcG5nX2RlYnVnX2ZyZWUgaW4gcG5ndGVzdC5jCi0KLVZlcnNpb24gMS4yLjBiZXRhNSBbQXVndXN0IDgsIDIwMDFdCi0gIFJldmlzZWQgY29udHJpYi9ncmVnYm9vawotICBSZXZpc2VkIG1ha2VmaWxlLmdjbW14Ci0gIFJldmlzZWQgcG5nZ2NjcmQuYyB0byBjb25kaXRpb25hbGx5IGNvbXBpbGUgc29tZSB0aHJlYWQtdW5zYWZlIGNvZGUgb25seQotICAgIHdoZW4gUE5HX1RIUkVBRF9VTlNBRkVfT0sgaXMgZGVmaW5lZC4KLSAgQWRkZWQgdGVzdHMgdG8gcHJldmVudCBwbmd3dXRpbC5jIGZyb20gd3JpdGluZyBhIGJLR0Qgb3IgdFJOUyBjaHVuayB3aXRoCi0gICAgdmFsdWUgZXhjZWVkaW5nIDJeYml0X2RlcHRoLTEKLSAgUmV2aXNlZCBtYWtlZmlsZS5zZ2kgYW5kIG1ha2VmaWxlLnNnZ2NjCi0gIFJlcGxhY2VkIGNhbGxzIHRvIGZwcmludGYoc3RkZXJyLC4uLikgd2l0aCBwbmdfd2FybmluZygpIGluIHBuZ2djY3JkLmMKLSAgUmVtb3ZlZCByZXN0cmljdGlvbiB0aGF0IGRvX2ludmVydF9tb25vIG9ubHkgb3BlcmF0ZSBvbiAxLWJpdCBvcGFxdWUgZmlsZXMKLQotVmVyc2lvbiAxLjIuMCBbU2VwdGVtYmVyIDEsIDIwMDFdCi0gIENoYW5nZWQgYSBwbmdfd2FybmluZygpIHRvIHBuZ19kZWJ1ZygpIGluIHBuZ2djY3JkLmMKLSAgRml4ZWQgY29udHJpYi9ncmVnYm9vay9ycG5nLXguYywgcnBuZzIteC5jIHRvIGF2b2lkIGNyYXNoIHdpdGggWEZyZWVHQygpLgotCi1WZXJzaW9uIDEuMi4xYmV0YTEgW09jdG9iZXIgMTksIDIwMDFdCi0gIFJldmlzZWQgbWFrZWZpbGUuc3RkIGluIGNvbnRyaWIvcG5nbWludXMKLSAgSW5jbHVkZSBiYWNrZ3JvdW5kXzEgaW4gcG5nX3N0cnVjdCByZWdhcmRsZXNzIG9mIGdhbW1hIHN1cHBvcnQuCi0gIFJldmlzZWQgbWFrZWZpbGUubmV0YnNkIGFuZCBtYWtlZmlsZS5tYWNvc3gsIGFkZGVkIG1ha2VmaWxlLmRhcndpbi4KLSAgUmV2aXNlZCBleGFtcGxlLmMgdG8gcHJvdmlkZSBtb3JlIGRldGFpbHMgYWJvdXQgdXNpbmcgcm93X2NhbGxiYWNrKCkuCi0KLVZlcnNpb24gMS4yLjFiZXRhMiBbT2N0b2JlciAyNSwgMjAwMV0KLSAgQWRkZWQgdHlwZSBjYXN0IHRvIGVhY2ggTlVMTCBhcHBlYXJpbmcgaW4gYSBmdW5jdGlvbiBjYWxsLCBleGNlcHQgZm9yCi0gICAgV0lOQ0UgZnVuY3Rpb25zLgotICBBZGRlZCBtYWtlZmlsZS5zbzkuCi0KLVZlcnNpb24gMS4yLjFiZXRhMyBbT2N0b2JlciAyNywgMjAwMV0KLSAgUmVtb3ZlZCB0eXBlIGNhc3RzIGZyb20gYWxsIE5VTExzLgotICBTaW1wbGlmaWVkIHBuZ19jcmVhdGVfc3RydWN0XzIoKS4KLQotVmVyc2lvbiAxLjIuMWJldGE0IFtOb3ZlbWJlciA3LCAyMDAxXQotICBSZXZpc2VkIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKSBhbmQgcG5nX2NyZWF0X3N0cnVjdF8yKCkuCi0gIEFkZGVkIGVycm9yIG1lc3NhZ2UgaWYgcG5nX3dyaXRlX2luZm8oKSB3YXMgb21pdHRlZC4KLSAgVHlwZSBjYXN0IE5VTExzIGFwcGVhcmluZyBpbiBmdW5jdGlvbiBjYWxscyB3aGVuIF9OT19QUk9UTyBvcgotICAgIFBOR19UWVBFQ0FTVF9OVUxMIGlzIGRlZmluZWQuCi0KLVZlcnNpb24gMS4yLjFyYzEgW05vdmVtYmVyIDI0LCAyMDAxXQotICBUeXBlIGNhc3QgTlVMTHMgYXBwZWFyaW5nIGluIGZ1bmN0aW9uIGNhbGxzIGV4Y2VwdCB3aGVuIFBOR19OT19UWVBFQ0FTVF9OVUxMCi0gICAgaXMgZGVmaW5lZC4KLSAgQ2hhbmdlZCB0eXBlY2FzdCBvZiAic2l6ZSIgYXJndW1lbnQgdG8gcG5nX3NpemVfdCBpbiBwbmdtZW0uYyBjYWxscyB0bwotICAgIHRoZSB1c2VyIG1hbGxvY19mbiwgdG8gYWdyZWUgd2l0aCB0aGUgcHJvdG90eXBlIGluIHBuZy5oCi0gIEFkZGVkIGEgcG9wL3B1c2ggb3BlcmF0aW9uIHRvIHBuZ2djY3JkLmMsIHRvIHByZXNlcnZlIEVmbGFnIChNYXhpbSBTb2JvbGV2KQotICBVcGRhdGVkIG1ha2VmaWxlLnNnaSB0byByZWNvZ25pemUgTElCUEFUSCBhbmQgSU5DUEFUSC4KLSAgVXBkYXRlZCB2YXJpb3VzIG1ha2VmaWxlcyBzbyAibWFrZSBjbGVhbiIgZG9lcyBub3QgcmVtb3ZlIHByZXZpb3VzIG1ham9yCi0gICAgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCi0KLVZlcnNpb24gMS4yLjFyYzIgW0RlY2VtYmVyIDQsIDIwMDFdCi0gIEFsd2F5cyBhbGxvY2F0ZSAyNTYtZW50cnkgaW50ZXJuYWwgcGFsZXR0ZSwgaGlzdCwgYW5kIHRyYW5zIGFycmF5cywgdG8KLSAgICBhdm9pZCBvdXQtb2YtYm91bmRzIG1lbW9yeSByZWZlcmVuY2UgY2F1c2VkIGJ5IGludmFsaWQgUE5HIGRhdGFzdHJlYW1zLgotICBBZGRlZCBhIGNoZWNrIGZvciBwcmVmaXhfbGVuZ3RoID4gZGF0YV9sZW5ndGggaW4gaUNDUCBjaHVuayBoYW5kbGVyLgotCi1WZXJzaW9uIDEuMi4xIFtEZWNlbWJlciA3LCAyMDAxXQotICBOb25lLgotCi1WZXJzaW9uIDEuMi4yYmV0YTEgW0ZlYnJ1YXJ5IDIyLCAyMDAyXQotICBGaXhlZCBhIGJ1ZyB3aXRoIHJlYWRpbmcgdGhlIGxlbmd0aCBvZiBpQ0NQIHByb2ZpbGVzIChMYXJyeSBSZWV2ZXMpLgotICBSZXZpc2VkIG1ha2VmaWxlLmxpbnV4LCBtYWtlZmlsZS5nY21teCwgYW5kIG1ha2VmaWxlLnNnaSB0byBnZW5lcmF0ZQotICAgIGxpYnBuZy5hLCBsaWJwbmcxMi5zbyAobm90IGxpYnBuZy5zby4zKSwgYW5kIGxpYnBuZzEyL3BuZy5oCi0gIFJldmlzZWQgbWFrZWZpbGUuZGFyd2luIHRvIHJlbW92ZSAiLXVuZGVmaW5lZCBzdXBwcmVzcyIgb3B0aW9uLgotICBBZGRlZCBjaGVja3MgZm9yIGdhbW1hIGFuZCBjaHJvbWF0aWNpdHkgdmFsdWVzIG92ZXIgMjE0NzQuODMsIHdoaWNoIGV4Y2VlZAotICAgIHRoZSBsaW1pdCBmb3IgUE5HIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycyB3aGVuIGVuY29kZWQuCi0gIFJldmlzZWQgY2FsbHMgdG8gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCgpIGFuZCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpCi0gICAgZm9yIHNpbXBsZXIgZGVidWdnaW5nLgotICBSZXZpc2VkIHBuZ196YWxsb2MoKSBzbyB6bGliIGhhbmRsZXMgZXJyb3JzICh1c2VzIFBOR19GTEFHX01BTExPQ19OVUxMX01FTV9PSykKLQotVmVyc2lvbiAxLjIuMmJldGEyIFtGZWJydWFyeSAyMywgMjAwMl0KLSAgQ2hlY2sgY2h1bmtfbGVuZ3RoIGFuZCBpZGF0X3NpemUgZm9yIGludmFsaWQgKG92ZXIgUE5HX01BWF9VSU5UKSBsZW5ndGhzLgotICBDaGVjayBmb3IgaW52YWxpZCBpbWFnZSBkaW1lbnNpb25zIGluIHBuZ19nZXRfSUhEUi4KLSAgQWRkZWQgbWlzc2luZyAiZmk7IiBpbiB0aGUgaW5zdGFsbCB0YXJnZXQgb2YgdGhlIFNHSSBtYWtlZmlsZXMuCi0gIEFkZGVkIGluc3RhbGwtc3RhdGljIHRvIGFsbCBtYWtlZmlsZXMgdGhhdCBtYWtlIHNoYXJlZCBsaWJyYXJpZXMuCi0gIEFsd2F5cyBkbyBnYW1tYSBjb21wZW5zYXRpb24gd2hlbiBpbWFnZSBpcyBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQuCi0KLVZlcnNpb24gMS4yLjJiZXRhMyBbTWFyY2ggNywgMjAwMl0KLSAgQ29tcHV0ZSBiYWNrZ3JvdW5kLmdyYXkgYW5kIGJhY2tncm91bmRfMS5ncmF5IGV2ZW4gd2hlbiBjb2xvcl90eXBlIGlzIFJHQgotICAgIGluIGNhc2UgaW1hZ2UgZ2V0cyByZWR1Y2VkIHRvIGdyYXkgbGF0ZXIuCi0gIE1vZGlmaWVkIHNoYXJlZC1saWJyYXJ5IG1ha2VmaWxlcyB0byBpbnN0YWxsIHBrZ2NvbmZpZy9saWJwbmdOTi5wYy4KLSAgRXhwb3J0ICh3aXRoIFBOR0FQSSkgcG5nX3phbGxvYywgcG5nX3pmcmVlLCBhbmQgcG5nX2hhbmRsZV9hc191bmtub3duCi0gIFJlbW92ZWQgdW51c2VkIHBuZ193cml0ZV9kZXN0cm95X2luZm8gcHJvdG90eXBlIGZyb20gcG5nLmgKLSAgRWxpbWluYXRlZCBpbmNvcnJlY3QgdXNlIG9mIHdpZHRoX21teCBmcm9tIHBuZ2djY3JkLmMgaW4gcGl4ZWxfYnl0ZXMgPT0gOCBjYXNlCi0gIEFkZGVkIGluc3RhbGwtc2hhcmVkIHRhcmdldCB0byBhbGwgbWFrZWZpbGVzIHRoYXQgbWFrZSBzaGFyZWQgbGlicmFyaWVzLgotICBTdG9wcGVkIGEgZG91YmxlIGZyZWUgb2YgcGFsZXR0ZSwgaGlzdCwgYW5kIHRyYW5zIHdoZW4gbm90IHVzaW5nIGZyZWVfbWUuCi0gIEFkZGVkIG1ha2VmaWxlLjMyc3VudSBmb3IgU3VuIFVsdHJhIDMyIGFuZCBtYWtlZmlsZS42NHN1bnUgZm9yIFN1biBVbHRyYSA2NC4KLQotVmVyc2lvbiAxLjIuMmJldGE0IFtNYXJjaCA4LCAyMDAyXQotICBDb21wdXRlIGJhY2tncm91bmQuZ3JheSBhbmQgYmFja2dyb3VuZF8xLmdyYXkgZXZlbiB3aGVuIGNvbG9yX3R5cGUgaXMgUkdCCi0gICAgaW4gY2FzZSBpbWFnZSBnZXRzIHJlZHVjZWQgdG8gZ3JheSBsYXRlciAoSmFzb24gU3VtbWVycykuCi0gIFJlbG9jYXRlZCBhIG1pc3BsYWNlZCAvYmluL3JtIGluIHRoZSAiaW5zdGFsbC1zaGFyZWQiIG1ha2VmaWxlIHRhcmdldHMKLSAgQWRkZWQgUE5HXzFfMF9YIG1hY3JvIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgMS4wLngtY29tcGF0aWJsZSBsaWJyYXJ5LgotCi1WZXJzaW9uIDEuMi4yYmV0YTUgW01hcmNoIDI2LCAyMDAyXQotICBBZGRlZCBtaXNzaW5nIFBOR0FQSSB0byBzZXZlcmFsIGZ1bmN0aW9uIGRlZmluaXRpb25zLgotICBDaGVjayBmb3IgaW52YWxpZCBiaXRfZGVwdGggb3IgY29sb3JfdHlwZSBpbiBwbmdfZ2V0X0lIRFIoKSwgYW5kCi0gICAgY2hlY2sgZm9yIG1pc3NpbmcgUExURSBvciBJSERSIGluIHBuZ19wdXNoX3JlYWRfY2h1bmsoKSAoTWF0dGhpYXMgQ2xhc2VuKS4KLSAgUmV2aXNlZCBpVFh0IHN1cHBvcnQgdG8gYWNjZXB0IE5VTEwgZm9yIGxhbmcgYW5kIGxhbmdfa2V5LgotICBDb21wdXRlIGdhbW1hIGZvciBjb2xvciBjb21wb25lbnRzIG9mIGJhY2tncm91bmQgZXZlbiB3aGVuIGNvbG9yX3R5cGUgaXMgZ3JheS4KLSAgQ2hhbmdlZCAiKCkiIHRvICJ7fSIgaW4gc2NyaXB0cy9saWJwbmcucGMuaW4uCi0gIFJldmlzZWQgbWFrZWZpbGVzIHRvIHB1dCBwbmcuaCBhbmQgcG5nY29uZi5oIG9ubHkgaW4gJHByZWZpeC9pbmNsdWRlL2xpYnBuZ05OCi0gIFJldmlzZWQgbWFrZWZpbGVzIHRvIG1ha2Ugc3ltbGluayB0byBsaWJwbmcuc28uTk4gaW4gYWRkaXRpb24gdG8gbGlicG5nTk4uc28KLQotVmVyc2lvbiAxLjIuMmJldGE2IFtNYXJjaCAzMSwgMjAwMl0KLQotVmVyc2lvbiAxLjAuMTNiZXRhMSBbTWFyY2ggMzEsIDIwMDJdCi0gIFByZXZlbnQgcG5nX3phbGxvYygpIGZyb20gdHJ5aW5nIHRvIG1lbXNldCBtZW1vcnkgdGhhdCBpdCBmYWlsZWQgdG8gYWNxdWlyZS4KLSAgQWRkIHR5cGVjYXN0cyBvZiBQTkdfTUFYX1VJTlQgaW4gcG5nc2V0X2NIUk1fZml4ZWQoKSAoTWF0dCBIb2xnYXRlKS4KLSAgRW5zdXJlIHRoYXQgdGhlIHJpZ2h0IGZ1bmN0aW9uICh1c2VyIG9yIGRlZmF1bHQpIGlzIHVzZWQgdG8gZnJlZSB0aGUKLSAgICBwbmdfc3RydWN0IGFmdGVyIGFuIGVycm9yIGluIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpLgotCi1WZXJzaW9uIDEuMi4ycmMxIFtBcHJpbCA3LCAyMDAyXQotCi1WZXJzaW9uIDEuMC4xM3JjMSBbQXByaWwgNywgMjAwMl0KLSAgU2F2ZSB0aGUgZWJ4IHJlZ2lzdGVyIGluIHBuZ2djY3JkLmMgKFNhbWkgRmFyaW4pCi0gIEFkZCAibWVtX3B0ciA9IHBuZ19wdHItPm1lbV9wdHIiIGluIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIChQYXVsIEdhcmRuZXIpLgotICBVcGRhdGVkIG1ha2VmaWxlcyB0byBwdXQgaGVhZGVycyBpbiBpbmNsdWRlL2xpYnBuZyBhbmQgcmVtb3ZlIG9sZCBpbmNsdWRlLyouaC4KLQotVmVyc2lvbiAxLjIuMiBbQXByaWwgMTUsIDIwMDJdCi0KLVZlcnNpb24gMS4wLjEzIFtBcHJpbCAxNSwgMjAwMl0KLSAgUmV2aXNlZCBkZXNjcmlwdGlvbiBvZiBwbmdfc2V0X2ZpbHRlcigpIGluIGxpYnBuZy4zL2xpYnBuZy50eHQuCi0gIFJldmlzZWQgbWFrZWZpbGUubmV0YnNkIGFuZCBhZGRlZCBtYWtlZmlsZS5uZU5OYnNkIGFuZCBtYWtlZmlsZS5mcmVlYnNkCi0KLVZlcnNpb24gMS4wLjEzcGF0Y2gwMSBbQXByaWwgMTcsIDIwMDJdCi0KLVZlcnNpb24gMS4yLjJwYXRjaDAxIFtBcHJpbCAxNywgMjAwMl0KLSAgQ2hhbmdlZCAke1BOR01BSn0uJHtQTkdWRVJ9IGJ1ZyB0byAke1BOR1ZFUn0gaW4gbWFrZWZpbGUuc2dpIGFuZAotICAgIG1ha2VmaWxlLnNnZ2NjCi0gIEZpeGVkIFZFUiAtPiBQTkdWRVIgdHlwbyBpbiBtYWtlZmlsZS5tYWNvc3ggYW5kIGFkZGVkIGluc3RhbGwtc3RhdGljIHRvCi0gICAgaW5zdGFsbAotICBBZGRlZCBpbnN0YWxsOiB0YXJnZXQgdG8gbWFrZWZpbGUuMzJzdW51IGFuZCBtYWtlZmlsZS42NHN1bnUKLQotVmVyc2lvbiAxLjAuMTNwYXRjaDAzIFtBcHJpbCAxOCwgMjAwMl0KLQotVmVyc2lvbiAxLjIuMnBhdGNoMDMgW0FwcmlsIDE4LCAyMDAyXQotICBSZXZpc2VkIDE1IG1ha2VmaWxlcyB0byBsaW5rIGxpYnBuZy5hIHRvIGxpYnBuZ05OLmEgYW5kIHRoZSBpbmNsdWRlIGxpYnBuZwotICBzdWJkaXJlY3RvcnkgdG8gbGlicG5nTk4gc3ViZGlyZWN0b3J5IHdpdGhvdXQgdGhlIGZ1bGwgcGF0aG5hbWUuCi0gIE1vdmVkIGdlbmVyYXRpb24gb2YgbGlicG5nLnBjIGZyb20gImluc3RhbGwiIHRvICJhbGwiIGluIDE1IG1ha2VmaWxlcy4KLQotVmVyc2lvbiAxLjIuM3JjMSBbQXByaWwgMjgsIDIwMDJdCi0gIEFkZGVkIGluc3RhbGwtbWFuIHRhcmdldCB0byAxNSBtYWtlZmlsZXMgKERpbWl0cmkgUGFwYWRvcG9sb3VzLU9yZmFub3MpLgotICBBZGRlZCAkKERFU1RESVIpIGZlYXR1cmUgdG8gMjQgbWFrZWZpbGVzIChUaW0gTW9vbmV5KQotICBGaXhlZCBidWcgd2l0aCAkcHJlZml4LCBzaG91bGQgYmUgJChwcmVmaXgpIGluIG1ha2VmaWxlLmhwdXguCi0gIFVwZGF0ZWQgY3lnd2luLXNwZWNpZmljIHBvcnRpb24gb2YgcG5nY29uZi5oIGFuZCByZXZpc2VkIG1ha2VmaWxlLmN5Z3dpbgotICBBZGRlZCBhIGxpbmsgZnJvbSBsaWJwbmdOTi5wYyB0byBsaWJwbmcucGMgaW4gMTUgbWFrZWZpbGVzLgotICBBZGRlZCBsaW5rcyBmcm9tIGluY2x1ZGUvbGlicG5nTk4vKi5oIHRvIGluY2x1ZGUvKi5oIGluIDI0IG1ha2VmaWxlcy4KLSAgUmV2aXNlZCBtYWtlZmlsZS5kYXJ3aW4gdG8gbWFrZSByZWxhdGl2ZSBsaW5rcyB3aXRob3V0IGZ1bGwgcGF0aG5hbWUuCi0gIEFkZGVkIHNldGptcCgpIGF0IHRoZSBlbmQgb2YgcG5nX2NyZWF0ZV8qX3N0cnVjdF8yKCkgaW4gY2FzZSB1c2VyIGZvcmdldHMKLSAgICB0byBwdXQgb25lIGluIHRoZWlyIGFwcGxpY2F0aW9uLgotICBSZXN0b3JlZCBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIHByb3RvdHlwZXMgdG8gdmVyc2lvbiAxLjIuMSBhbmQKLSAgICByZW1vdmVkIHRoZW0gZnJvbSBtb2R1bGUgZGVmaW5pdGlvbiBmaWxlcy4KLQotVmVyc2lvbiAxLjIuM3JjMiBbTWF5IDEsIDIwMDJdCi0gIEZpeGVkIGJ1ZyBpbiByZXBvcnRpbmcgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHBuZ2dldC5jIGFuZCBwbmdzZXQuYywKLSAgICB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4yLjJiZXRhNS4KLSAgRXhwb3J0ZWQgcG5nX3phbGxvYygpLCBwbmdfemZyZWUoKSwgcG5nX2RlZmF1bHRfcmVhZCgpLCBwbmdfZGVmYXVsdF93cml0ZSgpLAotICAgIHBuZ19kZWZhdWx0X2ZsdXNoKCksIGFuZCBwbmdfcHVzaF9maWxsX2J1ZmZlcigpIGFuZCBpbmNsdWRlZCB0aGVtIGluCi0gICAgbW9kdWxlIGRlZmluaXRpb24gZmlsZXMuCi0gIEFkZGVkICJsaWJwbmcucGMiIGRlcGVuZGVuY3kgdG8gdGhlICJpbnN0YWxsLXNoYXJlZCIgdGFyZ2V0IGluIDE1IG1ha2VmaWxlcy4KLQotVmVyc2lvbiAxLjIuM3JjMyBbTWF5IDEsIDIwMDJdCi0gIFJldmlzZWQgcHJvdG90eXBlIGZvciBwbmdfZGVmYXVsdF9mbHVzaCgpCi0gIFJlbW92ZSBvbGQgbGlicG5nLnBjIGFuZCBsaWJwbmdOTi5wYyBiZWZvcmUgaW5zdGFsbGluZyBuZXcgb25lcy4KLQotVmVyc2lvbiAxLjIuM3JjNCBbTWF5IDIsIDIwMDJdCi0gIFR5cG9zIGluICouZGVmIGZpbGVzIChwbmdfZGVmYXVsdF9yZWFkfHdyaXRlIC0+IHBuZ19kZWZhdWx0X3JlYWR8d3JpdGVfZGF0YSkKLSAgSW4gbWFrZWZpbGVzLCBjaGFuZ2VkIHJtIGxpYnBuZy5OTi5wYyB0byBybSBsaWJwbmdOTi5wYwotICBBZGRlZCBsaWJwbmctY29uZmlnIGFuZCBsaWJwbmdOTi1jb25maWcgYW5kIG1vZGlmaWVkIG1ha2VmaWxlcyB0byBpbnN0YWxsCi0gICAgdGhlbS4KLSAgQ2hhbmdlZCAkKE1BTlBBVEgpIHRvICQoREVTVERJUikkKE1BTlBBVEgpIGluIG1ha2VmaWxlcwotICBBZGRlZCAiV2luMzIgRExMIFZCIiBjb25maWd1cmF0aW9uIHRvIHByb2plY3RzL21zdmMvbGlicG5nLmRzcAotCi1WZXJzaW9uIDEuMi4zcmM1IFtNYXkgMTEsIDIwMDJdCi0gIENoYW5nZWQgImVycm9yIiBhbmQgIm1lc3NhZ2UiIGluIHByb3RvdHlwZXMgdG8gImVycm9yX21lc3NhZ2UiIGFuZAotICAgICJ3YXJuaW5nX21lc3NhZ2UiIHRvIGF2b2lkIG5hbWVzcGFjZSBjb25mbGljdC4KLSAgUmV2aXNlZCAxNSBtYWtlZmlsZXMgdG8gYnVpbGQgbGlicG5nLWNvbmZpZyBmcm9tIGxpYnBuZy1jb25maWctKi5pbgotICBPbmNlIG1vcmUgcmVzdG9yZWQgcG5nX3phbGxvYyBhbmQgcG5nX3pmcmVlIHRvIHJlZ3VsYXIgbm9uZXhwb3J0ZWQgZm9ybS4KLSAgUmVzdG9yZWQgcG5nX2RlZmF1bHRfcmVhZHx3cml0ZV9kYXRhLCBwbmdfZGVmYXVsdF9mbHVzaCwgcG5nX3JlYWRfZmlsbF9idWZmZXIKLSAgICB0byBub25leHBvcnRlZCBmb3JtLCBidXQgd2l0aCBQTkdBUEksIGFuZCByZW1vdmVkIHRoZW0gZnJvbSBtb2R1bGUgZGVmCi0gICAgZmlsZXMuCi0KLVZlcnNpb24gMS4yLjNyYzYgW01heSAxNCwgMjAwMl0KLSAgUmVtb3ZlZCAiUE5HQVBJIiBmcm9tIHBuZ196YWxsb2MoKSBhbmQgcG5nX3pmcmVlKCkgaW4gcG5nLmMKLSAgQ2hhbmdlZCAiR3oiIHRvICJHZCIgaW4gcHJvamVjdHMvbXN2Yy9saWJwbmcuZHNwIGFuZCB6bGliLmRzcC4KLSAgUmVtb3ZlZCBsZWZ0b3ZlciBsaWJwbmctY29uZmlnICJzZWQiIHNjcmlwdCBmcm9tIGZvdXIgbWFrZWZpbGVzLgotICBSZXZpc2VkIGxpYnBuZy1jb25maWcgY3JlYXRpbmcgc2NyaXB0IGluIDE2IG1ha2VmaWxlcy4KLQotVmVyc2lvbiAxLjIuMyBbTWF5IDIyLCAyMDAyXQotICBSZXZpc2VkIGxpYnBuZy1jb25maWcgdGFyZ2V0IGluIG1ha2VmaWxlLmN5Z3dpbi4KLSAgUmVtb3ZlZCBkZXNjcmlwdGlvbiBvZiBwbmdfc2V0X21lbV9mbigpIGZyb20gZG9jdW1lbnRhdGlvbi4KLSAgUmV2aXNlZCBtYWtlZmlsZS5mcmVlYnNkLgotICBNaW5vciBjb3NtZXRpYyBjaGFuZ2VzIHRvIDE1IG1ha2VmaWxlcywgZS5nLiwgJChESSkgPSAkKERFU1RESVIpLyQoSU5DRElSKS4KLSAgUmV2aXNlZCBwcm9qZWN0cy9tc3ZjL1JFQURNRS50eHQKLSAgQ2hhbmdlZCAtbHBuZyB0byAtbHBuZ05OIGluIExERkxBR1MgaW4gc2V2ZXJhbCBtYWtlZmlsZXMuCi0KLVZlcnNpb24gMS4yLjRiZXRhMSBbTWF5IDI0LCAyMDAyXQotICBBZGRlZCBsaWJwbmcucGMgYW5kIGxpYnBuZy1jb25maWcgdG8gImFsbDoiIHRhcmdldCBpbiAxNiBtYWtlZmlsZXMuCi0gIEZpeGVkIGJ1ZyBpbiAxNiBtYWtlZmlsZXM6ICQoREVTVERJUikvJChMSUJQQVRIKSB0byAkKERFU1RESVIpJChMSUJQQVRIKQotICBBZGRlZCBtaXNzaW5nICJcIiBiZWZvcmUgY2xvc2luZyBkb3VibGUgcXVvdGUgaW4gbWFrZWZpbGUuZ2NtbXguCi0gIFBsdWdnZWQgdmFyaW91cyBtZW1vcnkgbGVha3M7IGFkZGVkIHBuZ19tYWxsb2Nfd2FybigpIGFuZCBwbmdfc2V0X3RleHRfMigpCi0gICAgZnVuY3Rpb25zLgotCi1WZXJzaW9uIDEuMi40YmV0YTIgW0p1bmUgMjUsIDIwMDJdCi0gIFBsdWdnZWQgbWVtb3J5IGxlYWsgb2YgcG5nX3B0ci0+Y3VycmVudF90ZXh0IChNYXR0IEhvbGdhdGUpLgotICBDaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93IGJlZm9yZSByZWFkaW5nIENSQyBpbiBwbmdwcmVhZC5jIChXYXJ3aWNrIEFsbGlzb24pCi0gIEFkZGVkIC1zb25hbWUgdG8gdGhlIGxvYWRlciBmbGFncyBpbiBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLnNnaSwgYW5kCi0gICAgbWFrZWZpbGUuc2dnY2MuCi0gIEFkZGVkICJ0ZXN0LWluc3RhbGxlZCIgdGFyZ2V0IHRvIG1ha2VmaWxlLmxpbnV4LCBtYWtlZmlsZS5nY21teCwKLSAgICBtYWtlZmlsZS5zZ2ksIGFuZCBtYWtlZmlsZS5zZ2djYy4KLQotVmVyc2lvbiAxLjIuNGJldGEzIFtKdW5lIDI4LCAyMDAyXQotICBQbHVnZ2VkIG1lbW9yeSBsZWFrIG9mIHJvd19idWYgaW4gcG5ndGVzdC5jIHdoZW4gdGhlcmUgaXMgYSBwbmdfZXJyb3IoKS4KLSAgRGV0ZWN0IGJ1ZmZlciBvdmVyZmxvdyBpbiBwbmdwcmVhZC5jIHdoZW4gSURBVCBpcyBjb3JydXB0ZWQgd2l0aCBleHRyYSBkYXRhLgotICBBZGRlZCAidGVzdC1pbnN0YWxsZWQiIHRhcmdldCB0byBtYWtlZmlsZS4zMnN1bnUsIG1ha2VmaWxlLjY0c3VudSwKLSAgICBtYWtlZmlsZS5iZW9zLCBtYWtlZmlsZS5kYXJ3aW4sIG1ha2VmaWxlLmRlYywgbWFrZWZpbGUubWFjb3N4LAotICAgIG1ha2VmaWxlLnNvbGFyaXMsIG1ha2VmaWxlLmhwdXgsIG1ha2VmaWxlLmhwZ2NjLCBhbmQgbWFrZWZpbGUuc285LgotCi1WZXJzaW9uIDEuMi40cmMxIGFuZCAxLjAuMTRyYzEgW0p1bHkgMiwgMjAwMl0KLSAgQWRkZWQgInRlc3QtaW5zdGFsbGVkIiB0YXJnZXQgdG8gbWFrZWZpbGUuY3lnd2luIGFuZCBtYWtlZmlsZS5zY28uCi0gIFJldmlzZWQgcG5nZ2NjcmQuYyB0byBiZSBhYmxlIHRvIGJhY2sgb3V0IHZlcnNpb24gMS4wLnggdmlhIFBOR18xXzBfWCBtYWNyby4KLQotVmVyc2lvbiAxLjIuNCBhbmQgMS4wLjE0IFtKdWx5IDgsIDIwMDJdCi0gIENoYW5nZWQgcG5nX3dhcm5pbmcoKSB0byBwbmdfZXJyb3IoKSB3aGVuIHdpZHRoIGlzIHRvbyBsYXJnZSB0byBwcm9jZXNzLgotCi1WZXJzaW9uIDEuMi40cGF0Y2gwMSBbSnVseSAyMCwgMjAwMl0KLSAgUmV2aXNlZCBtYWtlZmlsZS5jeWd3aW4gdG8gdXNlIERMTCBudW1iZXIgMTIgaW5zdGVhZCBvZiAxMy4KLQotVmVyc2lvbiAxLjIuNWJldGExIFtBdWd1c3QgNiwgMjAwMl0KLSAgQWRkZWQgY29kZSB0byBjb250cmliL2dyZWdib29rL3JlYWRwbmcyLmMgdG8gaWdub3JlIHVudXNlZCBjaHVua3MuCi0gIFJlcGxhY2VkIHRvdWNhbi5wbmcgaW4gY29udHJpYi9ncmVnYm9vayAoaXQgaGFzIGJlZW4gY29ycnVwdCBzaW5jZSAxLjAuMTEpCi0gIFJlbW92ZWQgc29tZSBzdHJheSAqLm8gZmlsZXMgZnJvbSBjb250cmliL2dyZWdib29rLgotICBDaGFuZ2VkIHBuZ19lcnJvcigpIHRvIHBuZ193YXJuaW5nKCkgYWJvdXQgIlRvbyBtdWNoIGRhdGEiIGluIHBuZ3ByZWFkLmMKLSAgICBhbmQgYWJvdXQgIkV4dHJhIGNvbXByZXNzZWQgZGF0YSIgaW4gcG5ncnV0aWwuYy4KLSAgUHJldmVudCBwbmdfcHRyLT5wYXNzIGZyb20gZXhjZWVkaW5nIDcgaW4gcG5nX3B1c2hfZmluaXNoX3JvdygpLgotICBVcGRhdGVkIG1ha2VmaWxlLmhwZ2NjCi0gIFVwZGF0ZWQgcG5nLmMgYW5kIHBuZ2djY3JkLmMgaGFuZGxpbmcgb2YgcmV0dXJuIGZyb20gcG5nX21teF9zdXBwb3J0KCkKLQotVmVyc2lvbiAxLjIuNWJldGEyIFtBdWd1c3QgMTUsIDIwMDJdCi0gIE9ubHkgaXNzdWUgcG5nX3dhcm5pbmcoKSBhYm91dCAiVG9vIG11Y2ggZGF0YSIgaW4gcG5ncHJlYWQuYyB3aGVuIGF2YWlsX2luCi0gICAgaXMgbm9uemVyby4KLSAgVXBkYXRlZCBtYWtlZmlsZXMgdG8gaW5zdGFsbCBhIHNlcGFyYXRlIGxpYnBuZy5zby4zIHdpdGggaXRzIG93biBycGF0aC4KLQotVmVyc2lvbiAxLjIuNXJjMSBhbmQgMS4wLjE1cmMxIFtBdWd1c3QgMjQsIDIwMDJdCi0gIFJldmlzZWQgbWFrZWZpbGVzIHRvIG5vdCByZW1vdmUgcHJldmlvdXMgbWlub3IgdmVyc2lvbnMgb2Ygc2hhcmVkIGxpYnJhcmllcy4KLQotVmVyc2lvbiAxLjIuNXJjMiBhbmQgMS4wLjE1cmMyIFtTZXB0ZW1iZXIgMTYsIDIwMDJdCi0gIFJldmlzZWQgMTMgbWFrZWZpbGVzIHRvIHJlbW92ZSAiLWx6IiBhbmQgIi1MJChaTElCTElCKSIsIGV0Yy4sIGZyb20gc2hhcmVkCi0gICAgbGlicmFyeSBsb2FkZXIgZGlyZWN0aXZlLgotICBBZGRlZCBtaXNzaW5nICIkT0JKU0RMTCIgbGluZSB0byBtYWtlZmlsZS5nY21teC4KLSAgQWRkZWQgbWlzc2luZyAiOyBmaSIgdG8gbWFrZWZpbGUuMzJzdW51LgotCi1WZXJzaW9uIDEuMi41cmMzIGFuZCAxLjAuMTVyYzMgW1NlcHRlbWJlciAxOCwgMjAwMl0KLSAgUmV2aXNlZCBsaWJwbmctY29uZmlnIHNjcmlwdC4KLQotVmVyc2lvbiAxLjIuNSBhbmQgMS4wLjE1IFtPY3RvYmVyIDMsIDIwMDJdCi0gIFJldmlzZWQgbWFrZWZpbGUubWFjb3N4LCBtYWtlZmlsZS5kYXJ3aW4sIG1ha2VmaWxlLmhwZ2NjLCBhbmQgbWFrZWZpbGUuaHB1eCwKLSAgICBhbmQgbWFrZWZpbGUuYWl4LgotICBSZWxvY2F0ZWQgdHdvIG1pc3BsYWNlZCBQTkdBUEkgbGluZXMgaW4gcG5ndGVzdC5jCi0KLVZlcnNpb24gMS4yLjZiZXRhMSBbT2N0b2JlciAyMiwgMjAwMl0KLSAgQ29tbWVudGVkIG91dCB3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgbW14X3N1cHBvcnQgaW4gcG5nZ2NjcmQuYy4KLSAgQ2hhbmdlZCAiSUJNQ1BQX18iIGZsYWcgdG8gIl9fSUJNQ1BQX18iIGluIHBuZ2NvbmYuaC4KLSAgUmVsb2NhdGVkIHR3byBtb3JlIG1pc3BsYWNlZCBQTkdBUEkgbGluZXMgaW4gcG5ndGVzdC5jCi0gIEZpeGVkIG1lbW9yeSBvdmVycnVuIGJ1ZyBpbiBwbmdfZG9fcmVhZF9maWxsZXIoKSB3aXRoIDE2LWJpdCBkYXRhc3RyZWFtcywKLSAgICBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4wLjIuCi0gIFJldmlzZWQgbWFrZWZpbGUubWFjb3N4LCBtYWtlZmlsZS5kZWMsIG1ha2VmaWxlLmFpeCwgYW5kIG1ha2VmaWxlLjMyc3VudS4KLQotVmVyc2lvbiAxLjIuNmJldGEyIFtOb3ZlbWJlciAxLCAyMDAyXQotICBBZGRlZCBsaWJwbmctY29uZmlnICItLWxkb3B0cyIgb3V0cHV0LgotICBBZGRlZCAiQVI9YXIiIGFuZCAiQVJGTEFHUz1yYyIgYW5kIGNoYW5nZWQgImFyIHJjIiB0byAiJChBUikgJChBUkZMQUdTKSIKLSAgICBpbiBtYWtlZmlsZXMuCi0KLVZlcnNpb24gMS4yLjZiZXRhMyBbSnVseSAxOCwgMjAwNF0KLSAgUmV2ZXJ0ZWQgbWFrZWZpbGUgY2hhbmdlcyBmcm9tIHZlcnNpb24gMS4yLjZiZXRhMiBhbmQgc29tZSBvZiB0aGUgY2hhbmdlcwotICAgIGZyb20gdmVyc2lvbiAxLjIuNmJldGExOyB0aGVzZSB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCB2ZXJzaW9uIDEuMi43LgotICAgIFZlcnNpb24gMS4yLjYgaXMgZ29pbmcgdG8gYmUgYSBzaW1wbGUgYnVnZml4IHJlbGVhc2UuCi0gIENoYW5nZWQgdGhlIG9uZSBpbnN0YW5jZSBvZiAibG4gLXNmIiB0byAibG4gLWYgLXMiIGluIGVhY2ggU3VuIG1ha2VmaWxlLgotICBGaXhlZCBwb3RlbnRpYWwgb3ZlcnJ1biBpbiBwbmdlcnJvci5jIGJ5IHVzaW5nIHN0cm5jcHkgaW5zdGVhZCBvZiBtZW1jcHkuCi0gIEFkZGVkICIjIS9iaW4vc2giIGF0IHRoZSB0b3Agb2YgY29uZmlndXJlLCBmb3IgcmVjb2duaXRpb24gb2YgdGhlCi0gICAgJ3gnIGZsYWcgdW5kZXIgQ3lnd2luIChDb3NtaW4pLgotICBPcHRpbWl6ZWQgdmFjdW91cyB0ZXN0cyB0aGF0IHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MsIGluIHBuZy5jIChDb3NtaW4pLgotICBBZGRlZCBzdXBwb3J0IGZvciBQTkdfVVNFUl9DT05GSUcsIGluIHBuZ2NvbmYuaCAoQ29zbWluKS4KLSAgRml4ZWQgdGhlIHNwZWNpYWwgbWVtb3J5IGhhbmRsZXIgZm9yIEJvcmxhbmQgQyB1bmRlciBET1MsIGluIHBuZ21lbS5jCi0gICAgKENvc21pbikuCi0gIFJlbW92ZWQgc29tZSBzcHVyaW91cyBhc3NpZ25tZW50cyBpbiBwbmdydXRpbC5jIChDb3NtaW4pLgotICBSZXBsYWNlZCA2NTUzNiB3aXRoIDY1NTM2TCwgYW5kIDB4ZmZmZiB3aXRoIDB4ZmZmZkwsIHRvIHNpbGVuY2Ugd2FybmluZ3MKLSAgICBvbiAxNi1iaXQgcGxhdGZvcm1zIChDb3NtaW4pLgotICBFbmNsb3NlZCBzaGlmdCBvcCBleHByZXNzaW9ucyBpbiBwYXJlbnRoZXNlcywgdG8gc2lsZW5jZSB3YXJuaW5ncyAoQ29zbWluKS4KLSAgVXNlZCBwcm9wZXIgdHlwZSBwbmdfZml4ZWRfcG9pbnQsIHRvIGF2b2lkIHByb2JsZW1zIG9uIDE2LWJpdCBwbGF0Zm9ybXMsCi0gICAgaW4gcG5nX2hhbmRsZV9zUkdCKCkgKENvc21pbikuCi0gIEFkZGVkIGNvbXByZXNzaW9uX3R5cGUgdG8gcG5nX3N0cnVjdCwgYW5kIG9wdGltaXplZCB0aGUgd2luZG93IHNpemUKLSAgICBpbnNpZGUgdGhlIGRlZmxhdGUgc3RyZWFtIChDb3NtaW4pLgotICBGaXhlZCBkZWZpbml0aW9uIG9mIGlzbm9uYWxwaGEoKSwgaW4gcG5nZXJyb3IuYyBhbmQgcG5ncnV0aWwuYyAoQ29zbWluKS4KLSAgRml4ZWQgaGFuZGxpbmcgb2YgdW5rbm93biBjaHVua3MgdGhhdCBjb21lIGFmdGVyIElEQVQgKENvc21pbikuCi0gIEFsbG93ZWQgcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkgdG8gd29yayBldmVuIGlmIHBuZ19wdHIgPT0gTlVMTAotICAgIChDb3NtaW4pLgotICBSZXBsYWNlZCByb3dfaW5mby0+cm93Ynl0ZXMgd2l0aCByb3dfYnl0ZXMgaW4gcG5nX3dyaXRlX2ZpbmRfZmlsdGVyKCkKLSAgICAoQ29zbWluKS4KLSAgRml4ZWQgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX1ZFUl9ETExOVU0gKFNpbW9uLVBpZXJyZSkuCi0gIFVzZWQgUE5HX0xJQlBOR19WRVIgYW5kIFBOR19MSUJQTkdfVkVSX1NUUklORyBpbnN0ZWFkIG9mIHRoZSBoYXJkY29kZWQKLSAgICB2YWx1ZXMgaW4gcG5nLmMgKFNpbW9uLVBpZXJyZSwgQ29zbWluKS4KLSAgSW5pdGlhbGl6ZWQgcG5nX2xpYnBuZ192ZXJbXSB3aXRoIFBOR19MSUJQTkdfVkVSX1NUUklORyAoU2ltb24tUGllcnJlKS4KLSAgUmVwbGFjZWQgUE5HX0xJQlBOR19WRVJfTUFKT1Igd2l0aCBQTkdfTElCUE5HX1ZFUl9ETExOVU0gaW4gcG5nLnJjCi0gICAgKFNpbW9uLVBpZXJyZSkuCi0gIE1vdmVkIHRoZSBkZWZpbml0aW9uIG9mIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcgbmVhciB0aGUgZGVmaW5pdGlvbnMKLSAgICBvZiB0aGUgb3RoZXIgUE5HX0xJQlBOR19WRVJfLi4uIHN5bWJvbHMgaW4gcG5nLmggKENvc21pbikuCi0gIFJlbG9jYXRlZCAjaWZuZGVmIFBOR0FQSSBndWFyZHMgaW4gcG5nY29uZi5oIChTaW1vbi1QaWVycmUsIENvc21pbikuCi0gIFVwZGF0ZWQgc2NyaXB0cy9tYWtlZmlsZS52YyhhKXdpbjMyIChDb3NtaW4pLgotICBVcGRhdGVkIHRoZSBNU1ZDIHByb2plY3QgKFNpbW9uLVBpZXJyZSwgQ29zbWluKS4KLSAgVXBkYXRlZCB0aGUgQm9ybGFuZCBDKysgQnVpbGRlciBwcm9qZWN0IChDb3NtaW4pLgotICBBdm9pZGVkIGFjY2VzcyB0byBhc21fZmxhZ3MgaW4gcG5ndmNyZC5jLCBpZiBQTkdfMV8wX1ggaXMgZGVmaW5lZCAoQ29zbWluKS4KLSAgQ29tbWVudGVkIG91dCB3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgbW14X3N1cHBvcnQgaW4gcG5ndmNyZC5jIChDb3NtaW4pLgotICBSZW1vdmVkIHNjcmlwdHMvbWFrZWZpbGUuYmQzMiBhbmQgc2NyaXB0cy9wbmdkZWYucGFzIChDb3NtaW4pLgotICBBZGRlZCBleHRyYSBndWFyZCBhcm91bmQgaW5jbHVzaW9uIG9mIFR1cmJvIEMgbWVtb3J5IGhlYWRlcnMsIGluIHBuZ2NvbmYuaAotICAgIChDb3NtaW4pLgotICBSZW5hbWVkIHByb2plY3RzL21zdmMvIHRvIHByb2plY3RzL3Zpc3VhbGM2LywgYW5kIHByb2plY3RzL2JvcmxhbmQvIHRvCi0gICAgcHJvamVjdHMvY2J1aWxkZXI1LyAoQ29zbWluKS4KLSAgTW92ZWQgcHJvamVjdHMvdmlzdWFsYzYvcG5nMzJtcy5kZWYgdG8gc2NyaXB0cy9wbmd3MzIuZGVmLAotICAgIGFuZCBwcm9qZWN0cy92aXN1YWxjNi9wbmcucmMgdG8gc2NyaXB0cy9wbmd3MzIucmMgKENvc21pbikuCi0gIEFkZGVkIHByb2plY3RzL3Zpc3VhbGM2L3BuZ3Rlc3QuZHNwOyByZW1vdmVkIGNvbnRyaWIvbXN2Y3Rlc3QvIChDb3NtaW4pLgotICBDaGFuZ2VkIGxpbmUgZW5kaW5ncyB0byBET1Mgc3R5bGUgaW4gY2J1aWxkZXI1IGFuZCB2aXN1YWxjNiBmaWxlcywgZXZlbgotICAgIGluIHRoZSB0YXIuKiBkaXN0cmlidXRpb25zIChDb3NtaW4pLgotICBVcGRhdGVkIGNvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuZHNwIChDb3NtaW4pLgotICBVcGRhdGVkIGNvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggdG8gdmVyc2lvbiAyLjAuMCAoQ29zbWluKS4KLSAgQWRkZWQgYSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gd2l0aCAiY29uZmlndXJlIiBhbmQgc3VwcG9ydGluZyBmaWxlcyAoSnVuaWNoaSkuCi0KLVZlcnNpb24gMS4yLjZiZXRhNCBbSnVseSAyOCwgMjAwNF0KLSAgQWRkZWQgdXNlciBhYmlsaXR5IHRvIGNoYW5nZSBwbmdfc2l6ZV90IHZpYSBhIFBOR19TSVpFX1QgbWFjcm8uCi0gIEFkZGVkIHBuZ19zaXplb2YoKSBhbmQgcG5nX2NvbnZlcnRfc2l6ZSgpIGZ1bmN0aW9ucy4KLSAgQWRkZWQgUE5HX1NJWkVfTUFYIChtYXhpbXVtIHZhbHVlIG9mIGEgcG5nX3NpemVfdCB2YXJpYWJsZS4KLSAgQWRkZWQgY2hlY2sgaW4gcG5nX21hbGxvY19kZWZhdWx0KCkgZm9yIChzaXplX3Qpc2l6ZSAhPSAocG5nX3VpbnRfMzIpc2l6ZQotICAgIHdoaWNoIHdvdWxkIGluZGljYXRlIGFuIG92ZXJmbG93LgotICBDaGFuZ2VkIHNQTFQgZmFpbHVyZSBhY3Rpb24gZnJvbSBwbmdfZXJyb3IgdG8gcG5nX3dhcm5pbmcgYW5kIGFiYW5kb24gY2h1bmsuCi0gIENoYW5nZWQgc0NBTCBhbmQgaUNDUCBmYWlsdXJlcyBmcm9tIHBuZ19lcnJvciB0byBwbmdfd2FybmluZyBhbmQgYWJhbmRvbi4KLSAgQWRkZWQgcG5nX2dldF91aW50XzMxKHBuZ19wdHIsIGJ1ZikgZnVuY3Rpb24uCi0gIEFkZGVkIFBOR19VSU5UXzMyX01BWCBtYWNyby4KLSAgUmVuYW1lZCBQTkdfTUFYX1VJTlQgdG8gUE5HX1VJTlRfMzFfTUFYLgotICBNYWRlIHBuZ196YWxsb2MoKSBpc3N1ZSBhIHBuZ193YXJuaW5nIGFuZCByZXR1cm4gTlVMTCBvbiBwb3RlbnRpYWwKLSAgICBvdmVyZmxvdy4KLSAgVHVybiBvbiBQTkdfTk9fWkFMTE9DX1pFUk8gYnkgZGVmYXVsdCBpbiB2ZXJzaW9uIDEuMi54Ci0gIFJldmlzZWQgImNsb2JiZXIgbGlzdCIgaW4gcG5nZ2NjcmQuYyBzbyBpdCB3aWxsIGNvbXBpbGUgdW5kZXIgZ2NjLTMuNC4KLSAgUmV2aXNlZCBCb3JsYW5kIHBvcnRpb24gb2YgcG5nX21hbGxvYygpIHRvIHJldHVybiBOVUxMIG9yIGlzc3VlCi0gICAgcG5nX2Vycm9yKCkgYWNjb3JkaW5nIHRvIHNldHRpbmcgb2YgUE5HX0ZMQUdfTUFMTE9DX05VTExfTUVNX09LLgotICBBZGRlZCBQTkdfTk9fU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCBtYWNybyB0byBjb25kaXRpb25hbGx5IHJlbW92ZQotICAgIHNlcXVlbnRpYWwgcmVhZCBzdXBwb3J0LgotICBBZGRlZCBzb21lICIjaWYgUE5HX1dSSVRFX1NVUFBPUlRFRCIgYmxvY2tzLgotICBBZGRlZCAjaWZkZWYgdG8gcmVtb3ZlIHNvbWUgcmVkdW5kYW5jeSBpbiBwbmdfbWFsbG9jX2RlZmF1bHQoKS4KLSAgVXNlIHBuZ19tYWxsb2MgaW5zdGVhZCBvZiBwbmdfemFsbG9jIHRvIGFsbG9jYXRlIHRoZSBwYWxsZXRlLgotCi1WZXJzaW9uIDEuMC4xNnJjMSBhbmQgMS4yLjZyYzEgW0F1Z3VzdCA0LCAyMDA0XQotICBGaXhlZCBidWZmZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSAoQ1ZFLTIwMDQtMDU5NykgaW4gcG5nX2hhbmRsZV90Uk5TKCkuCi0gIEZpeGVkIE5VTEwgZGVyZWZlcmVuY2UgdnVsbmVyYWJpbGl0eSAoQ1ZFLTIwMDQtMDU5OCkgaW4gcG5nX2hhbmRsZV9pQ0NQKCkuCi0gIEZpeGVkIGludGVnZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0eSAoQ1ZFLTIwMDQtMDU5OSkgaW4gcG5nX3JlYWRfcG5nKCkuCi0gIEZpeGVkIHNvbWUgaGFybWxlc3MgYnVncyBpbiBwbmdfaGFuZGxlX3NCSVQsIGV0YywgdGhhdCB3b3VsZCBjYXVzZQotICAgIGR1cGxpY2F0ZSBjaHVuayB0eXBlcyB0byBnbyB1bmRldGVjdGVkLgotICBGaXhlZCBzb21lIHRpbWVzdGFtcHMgaW4gdGhlIC1jb25maWcgdmVyc2lvbgotICBSZWFycmFuZ2VkIG9yZGVyIG9mIHByb2Nlc3Npbmcgb2YgY29sb3IgdHlwZXMgaW4gcG5nX2hhbmRsZV90Uk5TKCkuCi0gIEFkZGVkIFJPV0JZVEVTIG1hY3JvIHRvIGNhbGN1bGF0ZSByb3dieXRlcyB3aXRob3V0IGludGVnZXIgb3ZlcmZsb3cuCi0gIFVwZGF0ZWQgbWFrZWZpbGUuZGFyd2luIGFuZCByZW1vdmVkIG1ha2VmaWxlLm1hY29zeCBmcm9tIHNjcmlwdHMgZGlyZWN0b3J5LgotICBJbXBvc2VkIGRlZmF1bHQgb25lIG1pbGxpb24gY29sdW1uLCBvbmUtbWlsbGlvbiByb3cgbGltaXRzIG9uIHRoZSBpbWFnZQotICAgIGRpbWVuc2lvbnMsIGFuZCBhZGRlZCBwbmdfc2V0X3VzZXJfbGltaXRzKCkgZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlbS4KLSAgUmV2aXNlZCB1c2Ugb2YgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQgbWFjcm8uCi0gIEZpeGVkIHdyb25nIGNhc3Qgb2YgcmV0dXJucyBmcm9tIHBuZ19nZXRfdXNlcl93aWR0aHxoZWlnaHRfbWF4KCkuCi0gIENoYW5nZWQgc29tZSAia2VlcCB0aGUgY29tcGlsZXIgaGFwcHkiIGZyb20gZW1wdHkgc3RhdGVtZW50cyB0byByZXR1cm5zLAotICBSZXZpc2VkIGxpYnBuZy50eHQgdG8gcmVtb3ZlIDEuMi54IHN0dWZmIGZyb20gdGhlIDEuMC54IGRpc3RyaWJ1dGlvbgotCi1WZXJzaW9uIDEuMC4xNnJjMiBhbmQgMS4yLjZyYzIgW0F1Z3VzdCA3LCAyMDA0XQotICBSZXZpc2VkIG1ha2VmaWxlLmRhcndpbiBhbmQgbWFrZWZpbGUuc29sYXJpcy4gIFJlbW92ZWQgbWFrZWZpbGUubWFjb3N4LgotICBSZXZpc2VkIHBuZ3Rlc3QncyBwbmdfZGVidWdfbWFsbG9jKCkgdG8gdXNlIHBuZ19tYWxsb2MoKSBpbnN0ZWFkIG9mCi0gICAgcG5nX21hbGxvY19kZWZhdWx0KCkgd2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIGV4cG9ydGVkLgotICBGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIG9uZSBvZiB0aGUgY29udmVyc2lvbnMgdG8gUE5HX1JPV0JZVEVTKCkgaW4KLSAgICBwbmdwcmVhZC5jLiAgQnVnIHdhcyBpbnRyb2R1Y2VkIGluIDEuMi42cmMxLgotICBGaXhlZCBidWcgaW4gUkdCIHRvIFJHQlggdHJhbnNmb3JtYXRpb24gaW50cm9kdWNlZCBpbiAxLjIuNnJjMS4KLSAgRml4ZWQgb2xkIGJ1ZyBpbiBSR0IgdG8gR3JheSB0cmFuc2Zvcm1hdGlvbi4KLSAgRml4ZWQgcHJvYmxlbSB3aXRoIDY0LWJpdCBjb21waWxlcnMgYnkgY2FzdGluZyBhcmd1bWVudHMgdG8gYWJzKCkKLSAgICB0byBwbmdfaW50XzMyLgotICBDaGFuZ2VkICJsbiAtc2YiIHRvICJsbiAtZiAtcyIgaW4gdGhyZWUgbWFrZWZpbGVzIChzb2xhcmlzLCBzY28sIHNvOSkuCi0gIENoYW5nZWQgIkhBTkRMRV9DSFVOS18qIiB0byAiUE5HX0hBTkRMRV9DSFVOS18qIiAoQ29zbWluKQotICBBZGRlZCAiLUAvYmluL3JtIC1mICQoREwpLyQoTElCTkFNRSkuc28uJChQTkdNQUopIiB0byAxNSAqTklYIG1ha2VmaWxlcy4KLSAgQWRkZWQgY29kZSB0byB1cGRhdGUgdGhlIHJvd19pbmZvLT5jb2xvcnR5cGUgaW4gcG5nX2RvX3JlYWRfZmlsbGVyKCkgKE1TQikuCi0KLVZlcnNpb24gMS4wLjE2cmMzIGFuZCAxLjIuNnJjMyBbQXVndXN0IDksIDIwMDRdCi0gIEVsaW1pbmF0ZWQgdXNlIG9mICJhYnMoKSIgaW4gdGVzdGluZyBjSFJNIGFuZCBnQU1BIHZhbHVlcywgdG8gYXZvaWQKLSAgICB0cm91YmxlIHdpdGggc29tZSA2NC1iaXQgY29tcGlsZXJzLiAgQ3JlYXRlZCBQTkdfT1VUX09GX1JBTkdFKCkgbWFjcm8uCi0gIFJldmlzZWQgZG9jdW1lbnRhdGlvbiBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKS4KLSAgQ2hlY2sgaGFuZGxlX2FzX3Vua25vd24gc3RhdHVzIGluIHBuZ3ByZWFkLmMsIGFzIGluIHBuZ3JlYWQuYyBwcmV2aW91c2x5LgotICBNb3ZlZCAgIlBOR19IQU5ETEVfQ0hVTktfKiIgbWFjcm9zIG91dCBvZiBQTkdfSU5URVJOQUwgc2VjdGlvbiBvZiBwbmcuaAotICBBZGRlZCAicmltIiBkZWZpbml0aW9ucyBmb3IgQ09OU1Q0IGFuZCBDT05TVDYgaW4gcG5nZ2NjcmQuYwotCi1WZXJzaW9uIDEuMC4xNnJjNCBhbmQgMS4yLjZyYzQgW0F1Z3VzdCAxMCwgMjAwNF0KLSAgRml4ZWQgbWlzdGFrZSBpbiBwbmd0ZXN0LmMgaW50cm9kdWNlZCBpbiAxLjIuNnJjMiAoZGVjbGFyYXRpb24gb2YKLSAgICAicGluZm8iIHdhcyBvdXQgb2YgcGxhY2UpLgotCi1WZXJzaW9uIDEuMC4xNnJjNSBhbmQgMS4yLjZyYzUgW0F1Z3VzdCAxMCwgMjAwNF0KLSAgTW92ZWQgICJQTkdfSEFORExFX0NIVU5LXyoiIG1hY3JvcyBvdXQgb2YgUE5HX0FTU0VNQkxFUl9DT0RFX1NVUFBPUlRFRAotICAgIHNlY3Rpb24gb2YgcG5nLmggd2hlcmUgdGhleSB3ZXJlIGluYWR2ZXJ0ZW50bHkgcGxhY2VkIGluIHZlcnNpb24gcmMzLgotCi1WZXJzaW9uIDEuMi42IGFuZCAxLjAuMTYgW0F1Z3VzdCAxNSwgMjAwNF0KLSAgUmV2aXNlZCBwbmd0ZXN0IHNvIG1lbW9yeSBhbGxvY2F0aW9uIHRlc3RpbmcgaXMgb25seSBkb25lIHdoZW4gUE5HX0RFQlVHPT0xLgotCi1WZXJzaW9uIDEuMi43YmV0YTEgW0F1Z3VzdCAyNiwgMjAwNF0KLSAgUmVtb3ZlZCB1bnVzZWQgcG5nYXNtcmQuaCBmaWxlLgotICBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gdXUubmV0IGZvciBhcmNoaXZlZCBmaWxlcy4gIEFkZGVkIHJlZmVyZW5jZXMgdG8KLSAgICBQTkcgU3BlYyAoc2Vjb25kIGVkaXRpb24pIGFuZCB0aGUgUE5HIElTTy9JRUMgU3RhbmRhcmQuCi0gIEFkZGVkICJ0ZXN0LWRkIiB0YXJnZXQgaW4gMTUgbWFrZWZpbGVzLCB0byBydW4gcG5ndGVzdCBpbiBERVNURElSLgotICBGaXhlZCBidWcgd2l0aCAib3B0aW1pemVkIHdpbmRvdyBzaXplIiBpbiB0aGUgSURBVCBkYXRhc3RyZWFtLCB0aGF0Ci0gICAgY2F1c2VzIGxpYnBuZyB0byB3cml0ZSBQTkcgZmlsZXMgd2l0aCBpbmNvcnJlY3QgemxpYiBoZWFkZXIgYnl0ZXMuCi0KLVZlcnNpb24gMS4yLjdiZXRhMiBbQXVndXN0IDI4LCAyMDA0XQotICBGaXhlZCBidWcgd2l0aCBzQ0FMIGNodW5rIGFuZCBiaWctZW5kaWFuIG1hY2hpbmVzIChEYXZpZCBNdW5ybykuCi0gIFVuZGlkIG5ldyBjb2RlIGFkZGVkIGluIDEuMi42cmMyIHRvIHVwZGF0ZSB0aGUgY29sb3JfdHlwZSBpbgotICAgIHBuZ19zZXRfZmlsbGVyKCkuCi0gIEFkZGVkIHBuZ19zZXRfYWRkX2FscGhhKCkgdGhhdCB1cGRhdGVzIGNvbG9yIHR5cGUuCi0KLVZlcnNpb24gMS4wLjE3cmMxIGFuZCAxLjIuN3JjMSBbU2VwdGVtYmVyIDQsIDIwMDRdCi0gIFJldmlzZWQgcG5nX3NldF9zdHJpcF9maWxsZXIoKSB0byBub3QgcmVtb3ZlIGFscGhhIGlmIGNvbG9yX3R5cGUgaGFzIGFscGhhLgotCi1WZXJzaW9uIDEuMi43IGFuZCAxLjAuMTcgW1NlcHRlbWJlciAxMiwgMjAwNF0KLSAgQWRkZWQgbWFrZWZpbGUuaHA2NAotICBDaGFuZ2VkIHByb2plY3RzL21zdmMvcG5nMzJtcy5kZWYgdG8gc2NyaXB0cy9wbmczMm1zLmRlZiBpbiBtYWtlZmlsZS5jeWd3aW4KLQotVmVyc2lvbiAxLjIuOGJldGExIFtOb3ZlbWJlciAxLCAyMDA0XQotICBGaXhlZCBidWcgaW4gcG5nX3RleHRfY29tcHJlc3MoKSB0aGF0IHdvdWxkIGZhaWwgdG8gY29tcGxldGUgYSBsYXJnZSBibG9jay4KLSAgRml4ZWQgYnVnLCBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuNywgdGhhdCBvdmVycnVucyBhIGJ1ZmZlciBkdXJpbmcKLSAgICBzdHJpcCBhbHBoYSBvcGVyYXRpb24gaW4gcG5nX2RvX3N0cmlwX2ZpbGxlcigpLgotICBBZGRlZCBQTkdfMV8yX1ggZGVmaW5pdGlvbiBpbiBwbmdjb25mLmgKLSAgVXNlICNpZmRlZiB0byBjb21tZW50IG91dCBwbmdfaW5mb19pbml0IGluIHBuZy5jIGFuZCBwbmdfcmVhZF9pbml0IGluCi0gICAgcG5ncmVhZC5jIChhcyBvZiAxLjMuMCkKLQotVmVyc2lvbiAxLjIuOGJldGEyIFtOb3ZlbWJlciAyLCAyMDA0XQotICBSZWR1Y2UgY29sb3JfdHlwZSB0byBhIG5vbmFscGhhIHR5cGUgYWZ0ZXIgc3RyaXAgYWxwaGEgb3BlcmF0aW9uIGluCi0gICAgcG5nX2RvX3N0cmlwX2ZpbGxlcigpLgotCi1WZXJzaW9uIDEuMi44YmV0YTMgW05vdmVtYmVyIDMsIDIwMDRdCi0gIFJldmlzZWQgZGVmaW5pdGlvbnMgb2YgUE5HX01BWF9VSU5UXzMyLCBQTkdfTUFYX1NJWkUsIGFuZCBQTkdfTUFYU1VNCi0KLVZlcnNpb24gMS4yLjhiZXRhNCBbTm92ZW1iZXIgMTIsIDIwMDRdCi0gIEZpeGVkIChhZ2FpbikgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX1ZFUl9ETExOVU0gaW4gcG5nLmggKENvc21pbikuCi0gIEFkZGVkIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURSBpbiBwbmcuaCAoQ29zbWluKS4KLSAgU2V0IHBuZ19wdHItPnpzdHJlYW0uZGF0YV90eXBlIHRvIFpfQklOQVJZLCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBkZXRlY3Rpb24KLSAgICBvZiBkYXRhIHR5cGUgaW4gZGVmbGF0ZSAoQ29zbWluKS4KLSAgRGVwcmVjYXRlZCBidXQgY29udGludWUgdG8gc3VwcG9ydCBTUEVDSUFMQlVJTEQgYW5kIFBSSVZBVEVCVUlMRCBpbiBmYXZvciBvZgotICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTF9TVFJJTkcgYW5kIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURV9TVFJJTkcuCi0KLVZlcnNpb24gMS4yLjhiZXRhNSBbTm92ZW1iZXIgMjAsIDIwMDRdCi0gIFVzZSBwbmdfcHRyLT5mbGFncyBpbnN0ZWFkIG9mIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyB0byBwYXNzCi0gICAgUE5HX1NUUklQX0FMUEhBIGluZm8gdG8gcG5nX2RvX3N0cmlwX2ZpbGxlcigpLCB0byBwcmVzZXJ2ZSBBQkkKLSAgICBjb21wYXRpYmlsaXR5LgotICBSZXZpc2VkIGhhbmRsaW5nIG9mIFNQRUNJQUxCVUlMRCwgUFJJVkFURUJVSUxELAotICAgIFBOR19MSUJQTkdfQlVJTERfU1BFQ0lBTF9TVFJJTkcgYW5kIFBOR19MSUJQTkdfQlVJTERfUFJJVkFURV9TVFJJTkcuCi0KLVZlcnNpb24gMS4yLjhyYzEgW05vdmVtYmVyIDI0LCAyMDA0XQotICBNb3ZlZCBoYW5kbGluZyBvZiBCVUlMRCBtYWNyb3MgZnJvbSBwbmdjb25mLmggdG8gcG5nLmgKLSAgQWRkZWQgZGVmaW5pdGlvbiBvZiBQTkdfTElCUE5HX0JBU0VfVFlQRSBpbiBwbmcuaCwgaW5hZHZlcnRlbnRseQotICAgIG9taXR0ZWQgZnJvbSBiZXRhNS4KLSAgUmV2aXNlZCBzY3JpcHRzL3BuZ3czMi5yYwotICBEZXNwYW1tZWQgbWFpbGluZyBhZGRyZXNzZXMgYnkgbWFza2luZyAiQCIgd2l0aCAiYXQiLgotICBJbmFkdmVydGVudGx5IGluc3RhbGxlZCBhIHN1cHBvc2VkbHkgZmFzdGVyIHRlc3QgdmVyc2lvbiBvZiBwbmdydXRpbC5jCi0KLVZlcnNpb24gMS4yLjhyYzIgW05vdmVtYmVyIDI2LCAyMDA0XQotICBBZGRlZCB0d28gbWlzc2luZyAiXCIgaW4gcG5nLmgKLSAgQ2hhbmdlIHRlc3RzIGluIHBuZ3JlYWQuYyBhbmQgcG5ncHJlYWQuYyB0bwotICAgIGlmIChwbmdfcHRyLT50cmFuc2Zvcm1hdGlvbnMgfHwgKHBuZ19wdHItPmZsYWdzJlBOR19GTEFHX1NUUklQX0FMUEhBKSkKLSAgICAgICBwbmdfZG9fcmVhZF90cmFuc2Zvcm1hdGlvbnMocG5nX3B0cik7Ci0KLVZlcnNpb24gMS4yLjhyYzMgW05vdmVtYmVyIDI4LCAyMDA0XQotICBSZXZlcnRlZCBwbmdydXRpbC5jIHRvIHZlcnNpb24gbGlicG5nLTEuMi44YmV0YTUuCi0gIEFkZGVkIHNjcmlwdHMvbWFrZWZpbGUuZWxmIHdpdGggc3VwcG9ydGluZyBjb2RlIGluIHBuZ2NvbmYuaCBmb3Igc3ltYm9sCi0gICAgdmVyc2lvbmluZyAoSm9obiBCb3dsZXIpLgotCi1WZXJzaW9uIDEuMi44cmM0IFtOb3ZlbWJlciAyOSwgMjAwNF0KLSAgQWRkZWQgcHJvamVjdHMvdmlzdWFsYzcgKFNpbW9uLXBpZXJyZSkuCi0KLVZlcnNpb24gMS4yLjhyYzUgW05vdmVtYmVyIDI5LCAyMDA0XQotICBGaXhlZCBuZXcgdHlwbyBpbiBzY3JpcHRzL3BuZ3czMi5yYwotCi1WZXJzaW9uIDEuMi44IFtEZWNlbWJlciAzLCAyMDA0XQotICBSZW1vdmVkIHByb2plY3RzL3Zpc3VhbGM3LCBhZGRlZCBwcm9qZWN0cy92aXN1YWxjNzEuCi0KLVZlcnNpb24gMS4yLjliZXRhMSBbRmVicnVhcnkgMjEsIDIwMDZdCi0gIEluaXRpYWxpemVkIHNvbWUgc3RydWN0dXJlIG1lbWJlcnMgaW4gcG5nd3V0aWwuYyB0byBhdm9pZCBnY2MtNC4wLjAgY29tcGxhaW50cwotICBSZXZpc2VkIG1hbiBwYWdlIGFuZCBsaWJwbmcudHh0IHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBvbmUgc2hvdWxkIG5vdCBjYWxsCi0gICAgcG5nX3JlYWRfZW5kIG9yIHBuZ193cml0ZV9lbmQgYWZ0ZXIgcG5nX3JlYWRfcG5nIG9yIHBuZ193cml0ZV9wbmcuCi0gIFVwZGF0ZWQgcmVmZXJlbmNlcyB0byBwbmctbW5nLWltcGxlbWVudCBtYWlsaW5nIGxpc3QuCi0gIEZpeGVkIGFuIGluY29ycmVjdCB0eXBlY2FzdCBpbiBwbmdydXRpbC5jCi0gIEFkZGVkIFBOR19OT19SRUFEX1NVUFBPUlRFRCBjb25kaXRpb25hbCBmb3IgbWFraW5nIGEgd3JpdGUtb25seSBsaWJyYXJ5LgotICBBZGRlZCBQTkdfTk9fV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVEIGNvbmRpdGlvbmFsLgotICBPcHRpbWl6ZWQgYWxwaGEtaW52ZXJzaW9uIGxvb3BzIGluIHBuZ3d0cmFuLmMKLSAgTW92ZWQgdGVzdCBmb3Igbm9uemVybyBnYW1tYSBvdXRzaWRlIG9mIHBuZ19idWlsZF9nYW1tYV90YWJsZSgpIGluIHBuZ3J0cmFuLmMKLSAgTWFrZSBzdXJlIG51bV90cmFucyBpcyA8PSAyNTYgYmVmb3JlIGNvcHlpbmcgZGF0YSBpbiBwbmdfc2V0X3RSTlMoKS4KLSAgTWFrZSBzdXJlIG51bV9wYWxldHRlIGlzIDw9IDI1NiBiZWZvcmUgY29weWluZyBkYXRhIGluIHBuZ19zZXRfUExURSgpLgotICBJbnRlcmNoYW5nZWQgb3JkZXIgb2Ygd3JpdGVfc3dhcF9hbHBoYSBhbmQgd3JpdGVfaW52ZXJ0X2FscGhhIHRyYW5zZm9ybXMuCi0gIEFkZGVkIHBhcmVudGhlc2VzIGluIHRoZSBkZWZpbml0aW9uIG9mIFBOR19MSUJQTkdfQlVJTERfVFlQRSAoQ29zbWluKS4KLSAgT3B0aW1pemVkIHpsaWIgd2luZG93IGZsYWcgKENJTkZPKSBpbiBjb250cmliL3BuZ3N1aXRlLyoucG5nIChDb3NtaW4pLgotICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUuYmMzMiBmb3IgQm9ybGFuZCBDKysgNS42IChDb3NtaW4pLgotICBFeHBvcnRlZCBwbmdfZ2V0X3VpbnRfMzIsIHBuZ19zYXZlX3VpbnRfMzIsIHBuZ19nZXRfdWludF8xNiwgcG5nX3NhdmVfdWludF8xNiwKLSAgICBwbmdfZ2V0X2ludF8zMiwgcG5nX3NhdmVfaW50XzMyLCBwbmdfZ2V0X3VpbnRfMzEgKENvc21pbikuCi0gIEFkZGVkIHR5cGUgY2FzdCAocG5nX2J5dGUpIGluIHBuZ193cml0ZV9zQ0FMKCkgKENvc21pbikuCi0gIEZpeGVkIHNjcmlwdHMvbWFrZWZpbGUuY3lnd2luIChDaHJpc3RpYW4gQmllc2luZ2VyLCBDb3NtaW4pLgotICBEZWZhdWx0IGlUWHQgc3VwcG9ydCB3YXMgaW5hZHZlcnRlbnRseSBlbmFibGVkLgotCi1WZXJzaW9uIDEuMi45YmV0YTIgW0ZlYnJ1YXJ5IDIxLCAyMDA2XQotICBDaGVjayBmb3IgcG5nX3JnYl90b19ncmF5IGFuZCBwbmdfZ3JheV90b19yZ2IgcmVhZCB0cmFuc2Zvcm1hdGlvbnMgYmVmb3JlCi0gICAgY2hlY2tpbmcgZm9yIHBuZ19yZWFkX2RpdGhlciBpbiBwbmdydHJhbi5jCi0gIFJldmlzZWQgY2hlY2tpbmcgb2YgY2hyb21hdGljaXR5IGxpbWl0cyB0byBhY2NvbW1vZGF0ZSBleHRlbmRlZCBSR0IKLSAgICBjb2xvcnNwYWNlIChKb2huIERlbmtlcikuCi0gIENoYW5nZWQgbGluZSBlbmRpbmdzIGluIHNvbWUgb2YgdGhlIHByb2plY3QgZmlsZXMgdG8gQ1JMRiwgZXZlbiBpbiB0aGUKLSAgICAiVW5peCIgdGFyIGRpc3RyaWJ1dGlvbnMgKENvc21pbikuCi0gIE1hZGUgcG5nX2dldF9pbnRfMzIgYW5kIHBuZ19zYXZlX2ludF8zMiBhbHdheXMgYXZhaWxhYmxlIChDb3NtaW4pLgotICBVcGRhdGVkIHNjcmlwdHMvcG5nb3MyLmRlZiwgc2NyaXB0cy9wbmd3MzIuZGVmIGFuZCBwcm9qZWN0cy93aW5jZS9wbmczMmNlLmRlZgotICAgIHdpdGggdGhlIG5ld2x5IGV4cG9ydGVkIGZ1bmN0aW9ucy4KLSAgRWxpbWluYXRlZCBkaXN0cmlidXRpb25zIHdpdGhvdXQgdGhlICJjb25maWd1cmUiIHNjcmlwdC4KLSAgVXBkYXRlZCBJTlNUQUxMIGluc3RydWN0aW9ucy4KLQotVmVyc2lvbiAxLjIuOWJldGEzIFtGZWJydWFyeSAyNCwgMjAwNl0KLSAgRml4ZWQgQ1JDUkxGIGxpbmUgZW5kaW5ncyBpbiBjb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcAotICBNYWRlIGxpYnBuZy5wYyByZXNwZWN0IEVYRUNfUFJFRklYIChELiBQLiBLcmVpbCwgSi4gQm93bGVyKQotICBSZW1vdmVkIHJlZmVyZW5jZSB0byBwbmdhc21yZC5oIGZyb20gTWFrZWZpbGUuYW0KLSAgUmVuYW1lZCBDSEFOR0VTIHRvIENoYW5nZUxvZy4KLSAgUmVuYW1lZCBMSUNFTlNFIHRvIENPUFlJTkcuCi0gIFJlbmFtZWQgQU5OT1VOQ0UgdG8gTkVXUy4KLSAgQ3JlYXRlZCBBVVRIT1JTIGZpbGUuCi0KLVZlcnNpb24gMS4yLjliZXRhNCBbTWFyY2ggMywgMjAwNl0KLSAgQ2hhbmdlZCBkZWZpbml0aW9uIG9mIFBLR0NPTkZJRyBmcm9tICRwcmVmaXgvbGliIHRvICRsaWJkaXIgaW4gY29uZmlndXJlLmFjCi0gIFJldmVydGVkIHRvIGZpbGVuYW1lcyBMSUNFTlNFIGFuZCBBTk5PVU5DRTsgcmVtb3ZlZCBBVVRIT1JTIGFuZCBDT1BZSU5HLgotICBSZW1vdmVkIG5ld2xpbmUgZnJvbSB0aGUgZW5kIG9mIHNvbWUgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMuCi0gIFJlbW92ZWQgdGVzdCBmb3Igc3FydCgpIGZyb20gY29uZmlndXJlLmFjIGFuZCBjb25maWd1cmUuCi0gIE1hZGUgc3dhcCB0YWJsZXMgaW4gcG5ndHJhbnMuYyBQTkdfQ09OU1QgKENhcmxvIEJyYW1peCkuCi0gIERpc2FibGVkIGRlZmF1bHQgaVRYdCBzdXBwb3J0IHRoYXQgd2FzIGluYWR2ZXJ0ZW50bHkgZW5hYmxlZCBpbgotICAgIGxpYnBuZy0xLjIuOWJldGExLgotICBBZGRlZCAiT1MyIiB0byBsaXN0IG9mIHN5c3RlbXMgdGhhdCBkb24ndCBuZWVkIHVuZGVyc2NvcmVzLCBpbiBwbmdnY2NyZC5jCi0gIFJlbW92ZWQgbGlicG5nIHZlcnNpb24gYW5kIGRhdGUgZnJvbSAqLmMgZmlsZXMuCi0KLVZlcnNpb24gMS4yLjliZXRhNSBbTWFyY2ggNCwgMjAwNl0KLSAgUmVtb3ZlZCB0cmFpbGluZyBibGFua3MgZnJvbSBzb3VyY2UgZmlsZXMuCi0gIFB1dCB2ZXJzaW9uIGFuZCBkYXRlIG9mIGxhdGVzdCBjaGFuZ2UgaW4gZWFjaCBzb3VyY2UgZmlsZSwgYW5kIGNoYW5nZWQKLSAgICBjb3B5cmlnaHQgeWVhciBhY2NvcmRpbmdseS4KLSAgTW9yZSBjbGVhbnVwIG9mIGNvbmZpZ3VyZS5hYywgTWFrZWZpbGUuYW0sIGFuZCBhc3NvY2lhdGVkIHNjcmlwdHMuCi0gIFJlc3RvcmVkIHNjcmlwdHMvbWFrZWZpbGUuZWxmIHdoaWNoIHdhcyBpbmFkdmVydGVudGx5IGRlbGV0ZWQuCi0KLVZlcnNpb24gMS4yLjliZXRhNiBbTWFyY2ggNiwgMjAwNl0KLSAgRml4ZWQgdHlwbyAoUkVMRUFTRSkgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4KLQotVmVyc2lvbiAxLjIuOWJldGE3IFtNYXJjaCA3LCAyMDA2XQotICBSZW1vdmVkIGxpYnBuZy52ZXJzIGFuZCBsaWJwbmcuc3ltIGZyb20gbGlicG5nMTJfbGFfU09VUkNFUyBpbiBNYWtlZmlsZS5hbQotICBGaXhlZCBpbmNvbnNpc3RlbnQgI2lmZGVmJ3MgYXJvdW5kIHBuZ19zaWdfYnl0ZXMoKSBhbmQgcG5nX3NldF9zQ0FMX3MoKQotICAgIGluIHBuZy5oLgotICBVcGRhdGVkIG1ha2VmaWxlLmVsZiBhcyBzdWdnZXN0ZWQgYnkgZGViaWFuLgotICBNYWRlIGNvc21ldGljIGNoYW5nZXMgdG8gc29tZSBtYWtlZmlsZXMsIGFkZGluZyBMTl9TRiBhbmQgb3RoZXIgbWFjcm9zLgotICBNYWRlIHNvbWUgbWFrZWZpbGVzIGFjY2VwdCAiZXhlY19wcmVmaXgiLgotCi1WZXJzaW9uIDEuMi45YmV0YTggW01hcmNoIDksIDIwMDZdCi0gIEZpeGVkIHNvbWUgIiNpZiBkZWZpbmVkICguLi4iIHdoaWNoIHNob3VsZCBiZSAiI2lmIGRlZmluZWQoLi4uIgotICAgIEJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuOC4KLSAgRml4ZWQgaW5jb25zaXN0ZW5jeSBpbiBkZWZpbml0aW9uIG9mIHBuZ19kZWZhdWx0X3JlYWRfZGF0YSgpCi0gIFJlc3RvcmVkIGJsYW5rIHRoYXQgd2FzIGxvc3QgZnJvbSBtYWtlZmlsZS5zZ2djYyAiY2xlYW4iIHRhcmdldCBpbiBiZXRhNy4KLSAgUmV2aXNlZCBjYWxjdWxhdGlvbiBvZiAiY3VycmVudCIgYW5kICJtYWpvciIgZm9yIGlyaXggaW4gbHRtYWluLnNoCi0gIENoYW5nZWQgIm1rZGlyIiB0byAiTUtESVJfUCIgaW4gc29tZSBtYWtlZmlsZXMuCi0gIFNlcGFyYXRlZCBQTkdfRVhQQU5EIGFuZCBQTkdfRVhQQU5EX3RSTlMuCi0gIEFkZGVkIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIGFuZCBkZXByZWNhdGVkCi0gICAgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB3aGljaCBhbHNvIGV4cGFuZHMgdFJOUyB0byBhbHBoYS4KLQotVmVyc2lvbiAxLjIuOWJldGE5IFtNYXJjaCAxMCwgMjAwNl0KLSAgSW5jbHVkZSAiY29uZmlnLmgiIGluIHBuZ2NvbmYuaCB3aGVuIGF2YWlsYWJsZS4KLSAgQWRkZWQgc29tZSBjaGVja3MgZm9yIE5VTEwgcG5nX3B0ciBvciBOVUxMIGluZm9fcHRyICh0aW1lbGVzcykKLQotVmVyc2lvbiAxLjIuOWJldGExMCBbTWFyY2ggMjAsIDIwMDZdCi0gIFJlbW92ZWQgZXh0cmEgQ1IgZnJvbSBjb250cmliL3Zpc3VhbHBuZy9WaXN1YWxQbmcuZHN3IChDb3NtaW4pCi0gIE1hZGUgcG5nZ2NjcmQuYyBQSUMtY29tcGxpYW50IChDaHJpc3RpYW4gQWljaGluZ2VyKS4KLSAgQWRkZWQgbWFrZWZpbGUubWluZ3cgKFdvbGZnYW5nIEdsYXMpLgotICBSZXZpc2VkIHBuZ2NvbmYuaCBNTVggY2hlY2tpbmcuCi0KLVZlcnNpb24gMS4yLjliZXRhMTEgW01hcmNoIDIyLCAyMDA2XQotICBGaXhlZCBvdXQtb2Ytb3JkZXIgZGVjbGFyYXRpb24gaW4gcG5nd3JpdGUuYyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIGJldGE5Ci0gIFNpbXBsaWZpZWQgc29tZSBtYWtlZmlsZXMgYnkgdXNpbmcgTElCU08sIExJQlNPTUFKLCBhbmQgTElCU09WRVIgbWFjcm9zLgotCi1WZXJzaW9uIDEuMi45cmMxIFtNYXJjaCAzMSwgMjAwNl0KLSAgRGVmaW5lZCBQTkdfVVNFUl9QUklWQVRFQlVJTEQgd2hlbiBpbmNsdWRpbmcgInBuZ3Vzci5oIiAoQ29zbWluKS4KLSAgUmVtb3ZlZCBub25zZW5zaWNhbCBhc3NlcnRpb24gY2hlY2sgZnJvbSBwbmd0ZXN0LmMgKENvc21pbikuCi0KLVZlcnNpb24gMS4yLjkgW0FwcmlsIDE0LCAyMDA2XQotICBSZXZpc2VkIG1ha2VmaWxlLmJlb3MgYW5kIGFkZGVkICJub25lIiBzZWxlY3RvciBpbiBsdG1haW4uc2gKLQotVmVyc2lvbiAxLjIuMTBiZXRhMSBbQXByaWwgMTUsIDIwMDZdCi0gIFJlbmFtZWQgImNvbmZpZy5oIiB0byAicG5nX2NvbmYuaCIgYW5kIHJldmlzZWQgTWFrZWZpbGUuYW0gdG8gYWRkCi0gICAgLURQTkdfQlVJTERJTkdfTElCUE5HIHRvIGNvbXBpbGUgZGlyZWN0aXZlLCBhbmQgbW9kaWZpZWQgcG5nY29uZi5oCi0gICAgdG8gaW5jbHVkZSBwbmdfY29uZi5oIG9ubHkgd2hlbiBQTkdfQlVJTERJTkdfTElCUE5HIGlzIGRlZmluZWQuCi0KLVZlcnNpb24gMS4yLjEwYmV0YTIgW0FwcmlsIDE1LCAyMDA2XQotICBNYW51YWxseSB1cGRhdGVkIE1ha2VmaWxlLmluIGFuZCBjb25maWd1cmUuICBDaGFuZ2VkIHBuZ19jb25mLmguaW4KLSAgICBiYWNrIHRvIGNvbmZpZy5oLgotCi1WZXJzaW9uIDEuMi4xMGJldGEzIFtBcHJpbCAxNSwgMjAwNl0KLSAgQ2hhbmdlIHBuZ19jb25mLmggYmFjayB0byBjb25maWcuaCBpbiBwbmdjb25mLmguCi0KLVZlcnNpb24gMS4yLjEwYmV0YTQgW0FwcmlsIDE2LCAyMDA2XQotICBDaGFuZ2UgUE5HX0JVSUxESU5HX0xJQlBORyB0byBQTkdfQ09ORklHVVJFX0xJQlBORyBpbiBjb25maWcvTWFrZWZpbGUqLgotCi1WZXJzaW9uIDEuMi4xMGJldGE1IFtBcHJpbCAxNiwgMjAwNl0KLSAgQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yIGNvbXBpbGluZyBhc3NlbWJsZXIgY29kZSBpbiBwbmdnY2NyZC5jCi0KLVZlcnNpb24gMS4yLjEwYmV0YTYgW0FwcmlsIDE3LCAyMDA2XQotICBSZXZpc2VkIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHBuZ2djY3JkLmMKLSAgTW92ZWQgLURQTkdfQ09ORklHVVJFX0xJQlBORyBpbnRvIEBMSUJQTkdfREVGSU5FU0AKLSAgQWRkZWQgQExJQlBOR19ERUZJTkVTQCB0byBhcmd1bWVudHMgd2hlbiBidWlsZGluZyBsaWJwbmcuc3ltCi0KLVZlcnNpb24gMS4yLjEwYmV0YTcgW0FwcmlsIDE4LCAyMDA2XQotICBDaGFuZ2UgImV4ZWNfcHJlZml4PSRwcmVmaXgiIHRvICJleGVjX3ByZWZpeD0kKHByZWZpeCkiIGluIG1ha2VmaWxlcy4KLQotVmVyc2lvbiAxLjIuMTByYzEgW0FwcmlsIDE5LCAyMDA2XQotICBFbnN1cmUgcG5nY29uZi5oIGRvZXNuJ3QgZGVmaW5lIGJvdGggUE5HX1VTRV9QTkdHQ0NSRCBhbmQgUE5HX1VTRV9QTkdWQ1JECi0gIEZpeGVkICJMTl9GUyIgdHlwbyBpbiBtYWtlZmlsZS5zY28gYW5kIG1ha2VmaWxlLnNvbGFyaXMuCi0KLVZlcnNpb24gMS4yLjEwcmMyIFtBcHJpbCAyMCwgMjAwNl0KLSAgQWRkZWQgYSBiYWNrc2xhc2ggYmV0d2VlbiAtRFBOR19DT05GSUdVUkVfTElCUE5HIGFuZCAtRFBOR19OT19BU1NFTUJMRVJfQ09ERQotICAgaW4gY29uZmlndXJlLmFjIGFuZCBjb25maWd1cmUKLSAgTWFkZSB0aGUgY29uZmlndXJlIHdhcm5pbmcgYWJvdXQgdmVyc2lvbmVkIHN5bWJvbHMgbGVzcyBhcnJvZ2FudC4KLQotVmVyc2lvbiAxLjIuMTByYzMgW0FwcmlsIDIxLCAyMDA2XQotICBBZGRlZCBhIG5vdGUgaW4gbGlicG5nLnR4dCB0aGF0IHBuZ19zZXRfc2lnX2J5dGVzKDgpIGNhbiBiZSB1c2VkIHdoZW4KLSAgICB3cml0aW5nIGFuIGVtYmVkZGVkIFBORyB3aXRob3V0IHRoZSA4LWJ5dGUgc2lnbmF0dXJlLgotICBSZXZpc2VkIG1ha2VmaWxlcyBhbmQgY29uZmlndXJlIHRvIGF2b2lkIG1ha2luZyBsaW5rcyB0byBsaWJwbmcuc28uKgotCi1WZXJzaW9uIDEuMi4xMCBbQXByaWwgMjMsIDIwMDZdCi0gIFJldmVydGVkIGNvbmZpZ3VyZSB0byAicmMyIiBzdGF0ZS4KLQotVmVyc2lvbiAxLjIuMTFiZXRhMSBbTWF5IDMxLCAyMDA2XQotICBzY3JpcHRzL2xpYnBuZy5wYy5pbiBjb250YWluZWQgImNvbmZpZ3VyZSIgc3R5bGUgdmVyc2lvbiBpbmZvIGFuZCB3b3VsZAotICAgIG5vdCB3b3JrIHdpdGggbWFrZWZpbGVzLgotICBUaGUgc2hhcmVkLWxpYnJhcnkgbWFrZWZpbGVzIHdlcmUgbGlua2luZyB0byBsaWJwbmcuc28uMCBpbnN0ZWFkIG9mCi0gICAgbGlicG5nLnNvLjMgY29tcGF0aWJpbGl0eSBhcyB0aGUgbGlicmFyeS4KLQotVmVyc2lvbiAxLjIuMTFiZXRhMiBbSnVuZSAyLCAyMDA2XQotICBJbmNyZWFzZWQgc3ByaW50ZiBidWZmZXIgZnJvbSA1MCB0byA1MiBjaGFycyBpbiBwbmdydXRpbC5jIHRvIGF2b2lkCi0gICAgYnVmZmVyIG92ZXJmbG93LgotICBGaXhlZCBidWcgaW4gZXhhbXBsZS5jIChwbmdfc2V0X3BhbGV0dGVfcmdiIC0+IHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IpCi0KLVZlcnNpb24gMS4yLjExYmV0YTMgW0p1bmUgNSwgMjAwNl0KLSAgUHJlcGVuZGVkICIjISAvYmluL3NoIiB0byBsdG1haWwuc2ggYW5kIGNvbnRyaWIvcG5nbWludXMvKi5zaCAoQ29zbWluKS4KLSAgUmVtb3ZlZCB0aGUgYWNjaWRlbnRhbCBsZWZ0b3ZlciBNYWtlZmlsZS5pbn4gKENvc21pbikuCi0gIEF2b2lkZWQgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBhbmQgb3B0aW1pemVkIGJ1ZmZlciBpbgotICAgIHBuZ193cml0ZV9zQ0FMKCksIHBuZ193cml0ZV9zQ0FMX3MoKSAoQ29zbWluKS4KLSAgUmVtb3ZlZCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQgbGlicmFyaWVzIGZyb20gQ0ZMQUdTIGFuZCBMREZMQUdTCi0gICAgaW4gc2NyaXB0cy9tYWtlZmlsZS5nY2MgKE5lbHNvbiBBLiBkZSBPbGl2ZWlyYSwgQ29zbWluKS4KLQotVmVyc2lvbiAxLjIuMTFiZXRhNCBbSnVuZSA2LCAyMDA2XQotICBBbGxvdyB6ZXJvLWxlbmd0aCBJREFUIGNodW5rcyBhZnRlciB0aGUgZW50aXJlIHpsaWIgZGF0YXN0cmVhbSwgYnV0IG5vdAotICAgIGFmdGVyIGFub3RoZXIgaW50ZXJ2ZW5pbmcgY2h1bmsgdHlwZS4KLQotVmVyc2lvbiAxLjAuMTlyYzEsIDEuMi4xMXJjMSBbSnVuZSAxMywgMjAwNl0KLSAgRGVsZXRlZCBleHRyYW5lb3VzIHNxdWFyZSBicmFja2V0cyBmcm9tIFtjb25maWcuaF0gaW4gY29uZmlndXJlLmFjCi0KLVZlcnNpb24gMS4wLjE5cmMyLCAxLjIuMTFyYzIgW0p1bmUgMTQsIDIwMDZdCi0gIEFkZGVkIHByb3RvdHlwZXMgZm9yIFBOR19JTkNIX0NPTlZFUlNJT05TIGZ1bmN0aW9ucyB0byBwbmcuaAotICBSZXZpc2VkIElOU1RBTEwgYW5kIGF1dG9nZW4uc2gKLSAgRml4ZWQgdHlwbyBpbiBzZXZlcmFsIG1ha2VmaWxlcyAoLVcxIHNob3VsZCBiZSAtV2wpCi0gIEFkZGVkIHR5cGVkZWYgZm9yIHBuZ19pbnRfMzIgYW5kIHBuZ191aW50XzMyIG9uIDY0LWJpdCBzeXN0ZW1zLgotCi1WZXJzaW9uIDEuMC4xOXJjMywgMS4yLjExcmMzIFtKdW5lIDE1LCAyMDA2XQotICBSZW1vdmVkIHRoZSBuZXcgdHlwZWRlZnMgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZWxheSB1bnRpbCB2ZXJzaW9uIDEuNC4wKQotICBBZGRlZCBvbmUgemVybyBlbGVtZW50IHRvIHBuZ19nYW1tYV9zaGlmdFtdIGFycmF5IGluIHBuZ3J0cmFuLmMgdG8gYXZvaWQKLSAgICByZWFkaW5nIG91dCBvZiBib3VuZHMuCi0KLVZlcnNpb24gMS4wLjE5cmM0LCAxLjIuMTFyYzQgW0p1bmUgMTUsIDIwMDZdCi0gIFJlYWxseSByZW1vdmVkIHRoZSBuZXcgdHlwZWRlZnMgZm9yIDY0LWJpdCBzeXN0ZW1zLgotCi1WZXJzaW9uIDEuMC4xOXJjNSwgMS4yLjExcmM1IFtKdW5lIDIyLCAyMDA2XQotICBSZW1vdmVkIHBuZ19zaWdfYnl0ZXMgZW50cnkgZnJvbSBzY3JpcHRzL3BuZ3czMi5kZWYKLQotVmVyc2lvbiAxLjAuMTksIDEuMi4xMSBbSnVuZSAyNiwgMjAwNl0KLSAgTm9uZS4KLQotVmVyc2lvbiAxLjAuMjAsIDEuMi4xMiBbSnVuZSAyNywgMjAwNl0KLSAgUmVhbGx5IGluY3JlYXNlZCBzcHJpbnRmIGJ1ZmZlciBmcm9tIDUwIHRvIDUyIGNoYXJzIGluIHBuZ3J1dGlsLmMgdG8gYXZvaWQKLSAgICBidWZmZXIgb3ZlcmZsb3cuCi0KLVZlcnNpb24gMS4yLjEzYmV0YTEgW09jdG9iZXIgMiwgMjAwNl0KLSAgUmVtb3ZlZCBBQ19GVU5DX01BTExPQyBmcm9tIGNvbmZpZ3VyZS5hYwotICBXb3JrIGFyb3VuZCBJbnRlbC1NYWMgY29tcGlsZXIgYnVnIGJ5IHNldHRpbmcgUE5HX05PX01NWF9DT0RFIGluIHBuZ2NvbmYuaAotICBDaGFuZ2UgImxvZ2ljYWwiIHRvICJiaXR3aXNlIiB0aHJvdWdob3V0IGRvY3VtZW50YXRpb24uCi0gIERldGVjdCBhbmQgZml4IGF0dGVtcHQgdG8gd3JpdGUgd3JvbmcgaUNDUCBwcm9maWxlIGxlbmd0aCAoQ1ZFLTIwMDYtNzI0NCkKLQotVmVyc2lvbiAxLjAuMjEsIDEuMi4xMyBbTm92ZW1iZXIgMTQsIDIwMDZdCi0gIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGluIHNQTFQgY2h1bmsgaGFuZGxlci4KLSAgRml4IE1ha2VmaWxlLmFtIHRvIG5vdCB0cnkgdG8gbGluayB0byBub2V4aXN0ZW50IGZpbGVzLgotICBDaGVjayBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIGZvciBOVUxMIHBuZ19wdHIuCi0KLVZlcnNpb24gMS4yLjE0YmV0YTEgW05vdmVtYmVyIDE3LCAyMDA2XQotICBSZWxvY2F0ZWQgdGhyZWUgbWlzcGxhY2VkIHRlc3RzIGZvciBOVUxMIHBuZ19wdHIuCi0gIEJ1aWx0IE1ha2VmaWxlLmluIHdpdGggYXV0b21ha2UtMS45LjYgaW5zdGVhZCBvZiAxLjkuMi4KLSAgQnVpbGQgY29uZmlndXJlIHdpdGggYXV0b2NvbmYtMi42MCBpbnN0ZWFkIG9mIDIuNTkKLQotVmVyc2lvbiAxLjIuMTRiZXRhMiBbTm92ZW1iZXIgMTcsIDIwMDZdCi0gIEFkZGVkIHNvbWUgdHlwZWNhc3RzIGluIHBuZ196YWxsb2MoKS4KLQotVmVyc2lvbiAxLjIuMTRyYzEgW05vdmVtYmVyIDIwLCAyMDA2XQotICBDaGFuZ2VkICJzdHJ0b2QiIHRvICJwbmdfc3RydG9kIiBpbiBwbmdydXRpbC5jCi0KLVZlcnNpb24gMS4wLjIyLCAxLjIuMTQgICAgW05vdmVtYmVyIDI3LCAyMDA2XQotICBBZGRlZCBtaXNzaW5nICIkKHNyY2RpcikiIGluIE1ha2VmaWxlLmFtIGFuZCBNYWtlZmlsZS5pbgotCi1WZXJzaW9uIDEuMi4xNWJldGExIFtEZWNlbWJlciAzLCAyMDA2XQotICBHZW5lcmF0ZWQgY29uZmlndXJlIHdpdGggYXV0b2NvbmYtMi42MSBpbnN0ZWFkIG9mIDIuNjAKLSAgUmV2aXNlZCBjb25maWd1cmUuYWMgdG8gdXBkYXRlIGxpYnBuZy5wYyBhbmQgbGlicG5nLWNvbmZpZy4KLQotVmVyc2lvbiAxLjIuMTViZXRhMiBbRGVjZW1iZXIgMywgMjAwNl0KLSAgQWx3YXlzIGV4cG9ydCBNTVggYXNtIGZ1bmN0aW9ucywganVzdCBzdHVicyBpZiBub3QgYnVpbGRpbmcgcG5nZ2NjcmQuYwotCi1WZXJzaW9uIDEuMi4xNWJldGEzIFtEZWNlbWJlciA0LCAyMDA2XQotICBBZGQgInBuZ19ieXRlcCIgdHlwZWNhc3QgdG8gcHJvZmlsZSB3aGlsZSBjYWxjdWxhdGluZyBsZW5ndGggaW4gcG5nd3V0aWwuYwotCi1WZXJzaW9uIDEuMi4xNWJldGE0IFtEZWNlbWJlciA3LCAyMDA2XQotICBBZGRlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0Ci0gIENoYW5nZWQgUE5HX05PX0FTU0VNQkxFUl9DT0RFIHRvIFBOR19OT19NTVhfQ09ERSBpbiBzY3JpcHRzLCBsaWtlIDEuNC4wYmV0YQotCi1WZXJzaW9uIDEuMi4xNWJldGE1IFtEZWNlbWJlciA3LCAyMDA2XQotICBDaGFuZ2VkIHNvbWUgaW5zdGFuY2VzIG9mIFBOR19BU1NFTUJMRVJfKiB0byBQTkdfTU1YXyogaW4gcG5nZ2NjcmQuYwotICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKLQotVmVyc2lvbiAxLjIuMTViZXRhNiBbRGVjZW1iZXIgMTMsIDIwMDZdCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dCBhbmQgY29uZmlndXJlLmFjCi0KLVZlcnNpb24gMS4yLjE1cmMxIFtEZWNlbWJlciAxOCwgMjAwNl0KLSAgUmV2aXNlZCBzY3JpcHRzL0NNYWtlTGlzdHMudHh0Ci0KLVZlcnNpb24gMS4yLjE1cmMyIFtEZWNlbWJlciAyMSwgMjAwNl0KLSAgQWRkZWQgY29uZGl0aW9uYWwgI3VuZGVmIGptcGJ1ZiBpbiBwbmd0ZXN0LmMgdG8gdW5kbyAjZGVmaW5lIGluIEFJWCBoZWFkZXJzLgotICBBZGRlZCBzY3JpcHRzL21ha2VmaWxlLm5vbW14Ci0KLVZlcnNpb24gMS4yLjE1cmMzIFtEZWNlbWJlciAyNSwgMjAwNl0KLSAgRml4ZWQgc2hhcmVkIGxpYnJhcnkgbnVtYmVyaW5nIGVycm9yIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gMS4yLjE1YmV0YTYuCi0KLVZlcnNpb24gMS4yLjE1cmM0IFtEZWNlbWJlciAyNywgMjAwNl0KLSAgRml4ZWQgaGFuZGxpbmcgb2YgcmdiX3RvX2dyYXkgd2hlbiBwbmdfcHRyLT5jb2xvci5ncmF5IGlzbid0IHNldC4KLQotVmVyc2lvbiAxLjIuMTVyYzUgW0RlY2VtYmVyIDMxLCAyMDA2XQotICBSZXZpc2VkIGhhbmRsaW5nIG9mIHJnYl90b19ncmF5LgotCi1WZXJzaW9uIDEuMi4xNSBbSmFudWFyeSA1LCAyMDA3XQotICBBZGRlZCBzb21lICh1bnNpZ25lZCBsb25nKSB0eXBlY2FzdHMgaW4gcG5ndGVzdC5jIHRvIGF2b2lkIHByaW50aW5nIGVycm9ycy4KLQotVmVyc2lvbiAxLjIuMTZiZXRhMSBbSmFudWFyeSA2LCAyMDA3XQotICBGaXggYnVncyBpbiBtYWtlZmlsZS5ub21teAotCi1WZXJzaW9uIDEuMi4xNmJldGEyIFtKYW51YXJ5IDE2LCAyMDA3XQotICBSZXZpc2VkIHNjcmlwdHMvQ01ha2VMaXN0cy50eHQKLQotVmVyc2lvbiAxLjIuMTYgW0phbnVhcnkgMzEsIDIwMDddCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS4yLjE3YmV0YTEgW01hcmNoIDYsIDIwMDddCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dCB0byBpbnN0YWxsIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLgotICBEZWxldGVkIGEgcmVkdW5kYW50IGxpbmUgZnJvbSBwbmdzZXQuYy4KLQotVmVyc2lvbiAxLjIuMTdiZXRhMiBbQXByaWwgMjYsIDIwMDddCi0gIFJlbG9jYXRlZCBtaXNwbGFjZWQgdGVzdCBmb3IgcG5nX3B0ciA9PSBOVUxMIGluIHBuZ3ByZWFkLmMKLSAgQ2hhbmdlICI9PSIgdG8gIiYiIGZvciB0ZXN0aW5nIFBOR19SR0JfVE9fR1JBWV9FUlIgJiBQTkdfUkdCX1RPX0dSQVlfV0FSTgotICAgIGZsYWdzLgotICBDaGFuZ2VkIHJlbWFpbmluZyBpbnN0YW5jZXMgb2YgUE5HX0FTU0VNQkxFUl8qIHRvIFBOR19NTVhfKgotICBBZGRlZCBwbmdlcnJvcigpIHdoZW4gd3JpdGVfSUhEUiBmYWlscyBpbiBkZWZsYXRlSW5pdDIoKS4KLSAgQWRkZWQgImNvbnN0IiB0byBzb21lIGFycmF5IGRlY2xhcmF0aW9ucy4KLSAgTWVudGlvbiBleGFtcGxlcyBvZiBsaWJwbmcgdXNhZ2UgaW4gdGhlIGxpYnBuZyoudHh0IGFuZCBsaWJwbmcuMyBkb2N1bWVudHMuCi0KLVZlcnNpb24gMS4yLjE3cmMxIFtNYXkgNCwgMjAwN10KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjIuMTdyYzIgW01heSA4LCAyMDA3XQotICBNb3ZlZCBzZXZlcmFsIFBOR19IQVZFXyogbWFjcm9zIG91dCBvZiBQTkdfSU5URVJOQUwgYmVjYXVzZSBhcHBsaWNhdGlvbnMKLSAgICBjYWxsaW5nIHNldF91bmtub3duX2NodW5rX2xvY2F0aW9uKCkgbmVlZCB0aGVtLgotICBDaGFuZ2VkIHRyYW5zZm9ybWF0aW9uIGZsYWcgZnJvbSBQTkdfRVhQQU5EX3RSTlMgdG8gUE5HX0VYUEFORCBpbgotICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpLgotICBBZGRlZCBwbmdfcHRyLT51bmtub3duX2NodW5rIHRvIGhvbGQgd29ya2luZyB1bmtub3duIGNodW5rIGRhdGEsIHNvIGl0Ci0gICAgY2FuIGJlIGZyZWUnZWQgaW4gY2FzZSBvZiBlcnJvci4gIFJldmlzZWQgdW5rbm93biBjaHVuayBoYW5kbGluZyBpbgotICAgIHBuZ3J1dGlsLmMgYW5kIHBuZ3ByZWFkLmMgdG8gdXNlIHRoaXMgc3RydWN0dXJlLgotCi1WZXJzaW9uIDEuMi4xN3JjMyBbTWF5IDgsIDIwMDddCi0gIFJldmlzZWQgc3ltYm9sLWhhbmRsaW5nIGluIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLVZlcnNpb24gMS4yLjE3cmM0IFtNYXkgMTAsIDIwMDddCi0gIFJldmlzZWQgdW5rbm93biBjaHVuayBoYW5kbGluZyB0byBhdm9pZCBzdG9yaW5nIHVua25vd24gY3JpdGljYWwgY2h1bmtzLgotCi1WZXJzaW9uIDEuMC4yNSBbTWF5IDE1LCAyMDA3XQotVmVyc2lvbiAxLjIuMTcgW01heSAxNSwgMjAwN10KLSAgQWRkZWQgInBuZ19wdHItPm51bV90cmFucz0wIiBiZWZvcmUgZXJyb3IgcmV0dXJuIGluIHBuZ19oYW5kbGVfdFJOUywKLSAgICB0byBlbGltaW5hdGUgYSB2dWxuZXJhYmlsaXR5IChDVkUtMjAwNy0yNDQ1LCBDRVJUIFZVIzY4NDY2NCkKLQotVmVyc2lvbiAxLjAuMjYgW01heSAxNSwgMjAwN10KLVZlcnNpb24gMS4yLjE4IFtNYXkgMTUsIDIwMDddCi0gIFJldmVydGVkIHRoZSBsaWJwbmctMS4yLjE3cmMzIGNoYW5nZSB0byBzeW1ib2wtaGFuZGxpbmcgaW4gY29uZmlndXJlIHNjcmlwdAotCi1WZXJzaW9uIDEuMi4xOWJldGExIFtNYXkgMTgsIDIwMDddCi0gIENoYW5nZWQgImNvbnN0IHN0YXRpYyIgdG8gInN0YXRpYyBQTkdfQ09OU1QiIGV2ZXJ5d2hlcmUsIG1vc3RseSB1bmRvaW5nCi0gICAgY2hhbmdlIG9mIGxpYnBuZy0xLjIuMTdiZXRhMi4gIENoYW5nZWQgb3RoZXIgImNvbnN0IiB0byAiUE5HX0NPTlNUIgotICBDaGFuZ2VkIHNvbWUgaGFuZGxpbmcgb2YgdW51c2VkIHBhcmFtZXRlcnMsIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotICAgICJpZiAodW51c2VkID09IE5VTEwpIHJldHVybjsiIGJlY29tZXMgInVudXNlZCA9IHVudXNlZCIuCi0KLVZlcnNpb24gMS4yLjE5YmV0YTIgW01heSAxOCwgMjAwN10KLSAgT25seSB1c2UgdGhlIHZhbGlkIGJpdHMgb2YgdFJOUyB2YWx1ZSBpbiBwbmdfZG9fZXhwYW5kKCkgKEJyaWFuIENhcnRpZXIpCi0KLVZlcnNpb24gMS4yLjE5YmV0YTMgW01heSAxOSwgMjAwN10KLSAgQWRkIHNvbWUgInBuZ19ieXRlIiB0eXBlY2FzdHMgaW4gcG5nX2NoZWNrX2tleXdvcmQoKSBhbmQgd3JpdGUgbmV3X2tleQotICBpbnN0ZWFkIG9mIGtleSBpbiB6VFh0IGNodW5rIChLZXZpbiBSeWRlKS4KLQotVmVyc2lvbiAxLjIuMTliZXRhNCBbTWF5IDIxLCAyMDA3XQotICBBZGQgcG5nX3NucHJpbnRmKCkgZnVuY3Rpb24gYW5kIHVzZSBpdCBpbiBwbGFjZSBvZiBzcHJpbnQoKSBmb3IgaW1wcm92ZWQKLSAgICBkZWZlbnNlIGFnYWluc3QgYnVmZmVyIG92ZXJmbG93cy4KLQotVmVyc2lvbiAxLjIuMTliZXRhNSBbTWF5IDIxLCAyMDA3XQotICBGaXhlZCBwbmdfaGFuZGxlX3RSTlMoKSB0byBvbmx5IHVzZSB0aGUgdmFsaWQgYml0cyBvZiB0Uk5TIHZhbHVlLgotICBDaGFuZ2VkIGhhbmRsaW5nIG9mIG1vcmUgdW51c2VkIHBhcmFtZXRlcnMsIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotICBSZW1vdmVkIHNvbWUgUE5HX0NPTlNUIGluIHBuZ3d1dGlsLmMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLVZlcnNpb24gMS4yLjE5YmV0YTYgW01heSAyMiwgMjAwN10KLSAgQWRkZWQgc29tZSAjaWZkZWYgUE5HX01NWF9DT0RFX1NVUFBPUlRFRCB3aGVyZSBuZWVkZWQgaW4gcG5ndmNyZC5jCi0gIEFkZGVkIGEgc3BlY2lhbCAiX01TQ19WRVIiIGNhc2UgdGhhdCBkZWZpbmVzIHBuZ19zbnByaW50ZiB0byBfc25wcmludGYKLQotVmVyc2lvbiAxLjIuMTliZXRhNyBbTWF5IDIyLCAyMDA3XQotICBTcXVlbGNoZWQgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSBpbiBwbmdnY2NyZC5jIGFuZCBhZGRlZAotICAgIGFuICNpZmRlZiBQTkdfTU1YX0NPREVfU1VQUE9SVEVEIGJsb2NrIGFyb3VuZCB0aGUgZGVjbGFyYXRpb25zIHRoYXQgY2F1c2VkCi0gICAgdGhlIHdhcm5pbmdzIHRoYXQgcG5nX3NxdWVsY2hfd2FybmluZ3Mgd2FzIHNxdWVsY2hpbmcuCi0KLVZlcnNpb24gMS4yLjE5YmV0YTggW01heSAyMiwgMjAwN10KLSAgUmVtb3ZlZCBfX01NWF9fIGZyb20gdGVzdCBpbiBwbmdjb25mLmguCi0KLVZlcnNpb24gMS4yLjE5YmV0YTkgW01heSAyMywgMjAwN10KLSAgTWFkZSBwbmdfc3F1ZWxjaF93YXJuaW5ncygpIGF2YWlsYWJsZSB2aWEgUE5HX1NRVUVMQ0hfV0FSTklOR1MgbWFjcm8uCi0gIFJldmlzZWQgcG5nX3NxdWVsY2hfd2FybmluZ3MoKSBzbyBpdCBtaWdodCB3b3JrLgotICBVcGRhdGVkIG1ha2VmaWxlLnNnY2MgYW5kIG1ha2VmaWxlLnNvbGFyaXM7IGFkZGVkIG1ha2VmaWxlLnNvbGFyaXMteDg2LgotCi1WZXJzaW9uIDEuMi4xOWJldGExMCBbTWF5IDI0LCAyMDA3XQotICBSZXNxdWVsY2hlZCBwbmdfc3F1ZWxjaF93YXJuaW5ncygpLCB1c2UgIl9fYXR0cmlidXRlX18oKHVzZWQpKSIgaW5zdGVhZC4KLQotVmVyc2lvbiAxLjQuMGJldGExIFtBcHJpbCAyMCwgMjAwNl0KLSAgRW5hYmxlZCBpVFh0IHN1cHBvcnQgKGNoYW5nZXMgcG5nX3N0cnVjdCwgdGh1cyByZXF1aXJlcyBzby1udW1iZXIgY2hhbmdlKS4KLSAgQ2xlYW5lZCB1cCBQTkdfQVNTRU1CTEVSX0NPREVfU1VQUE9SVEVEIHZzIFBOR19NTVhfQ09ERV9TVVBQT1JURUQKLSAgRWxpbWluYXRlZCBQTkdfMV8wX1ggYW5kIFBOR18xXzJfWCBtYWNyb3MuCi0gIFJlbW92ZWQgZGVwcmVjYXRlZCBmdW5jdGlvbnMgcG5nX3JlYWRfaW5pdCwgcG5nX3dyaXRlX2luaXQsIHBuZ19pbmZvX2luaXQsCi0gICAgcG5nX3Blcm1pdF9lbXB0eV9wbHRlLCBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCwgcG5nX2NoZWNrX3NpZywgYW5kCi0gICAgcmVtb3ZlZCB0aGUgZGVwcmVjYXRlZCBtYWNybyBQTkdfTUFYX1VJTlQuCi0gIE1vdmVkICJQTkdfSU5URVJOQUwiIHBhcnRzIG9mIHBuZy5oIGFuZCBwbmdjb25mLmggaW50byBwbmdpbnRybi5oCi0gIFJlbW92ZWQgbWFueSBXSU4zMl9XQ0UgI2lmZGVmcyAoQ29zbWluKS4KLSAgUmVkdWNlZCBkZXBlbmRlbmN5IG9uIEMtcnVudGltZSBsaWJyYXJ5IHdoZW4gb24gV2luZG93cyAoU2ltb24tUGllcnJlKQotICBSZXBsYWNlZCBzcHJpbnRmKCkgd2l0aCBwbmdfc3ByaW50ZigpIChTaW1vbi1QaWVycmUpCi0KLVZlcnNpb24gMS40LjBiZXRhMiBbQXByaWwgMjAsIDIwMDZdCi0gIFJldmlzZWQgbWFrZWZpbGVzIGFuZCBjb25maWd1cmUgdG8gYXZvaWQgbWFraW5nIGxpbmtzIHRvIGxpYnBuZy5zby4qCi0gIE1vdmVkIHNvbWUgbGVmdG92ZXIgTU1YLXJlbGF0ZWQgZGVmaW5lcyBmcm9tIHBuZ2NvbmYuaCB0byBwbmdpbnRybi5oCi0gIFVwZGF0ZWQgc2NyaXB0cy9wbmdvczIuZGVmLCBwbmd3MzIuZGVmLCBhbmQgcHJvamVjdHMvd2luY2UvcG5nMzJjZS5kZWYKLQotVmVyc2lvbiAxLjQuMGJldGEzIFtNYXkgMTAsIDIwMDZdCi0gIFVwZGF0ZWQgc2NyaXB0cy9wbmd3MzIuZGVmIHRvIGNvbW1lbnQgb3V0IE1NWCBmdW5jdGlvbnMuCi0gIEFkZGVkIFBOR19OT19HRVRfSU5UXzMyIGFuZCBQTkdfTk9fU0FWRV9JTlRfMzIgbWFjcm9zLgotICBTY3JpcHRzL2xpYnBuZy5wYy5pbiBjb250YWluZWQgImNvbmZpZ3VyZSIgc3R5bGUgdmVyc2lvbiBpbmZvIGFuZCB3b3VsZAotICAgIG5vdCB3b3JrIHdpdGggbWFrZWZpbGVzLgotICBSZXZpc2VkIHBuZ2NvbmYuaCBhbmQgYWRkZWQgcG5nY29uZi5oLmluLCBzbyBtYWtlZmlsZXMgYW5kIGNvbmZpZ3VyZSBjYW4KLSAgICBwYXNzIGRlZmluZXMgdG8gbGlicG5nIGFuZCBhcHBsaWNhdGlvbnMuCi0KLVZlcnNpb24gMS40LjBiZXRhNCBbTWF5IDExLCAyMDA2XQotICBSZXZpc2VkIGNvbmZpZ3VyZS5hYywgTWFrZWZpbGUuYW0sIGFuZCBtYW55IG9mIHRoZSBtYWtlZmlsZXMgdG8gd3JpdGUKLSAgICB0aGVpciBkZWZpbmVzIGluIHBuZ2NvbmYuaC4KLQotVmVyc2lvbiAxLjQuMGJldGE1IFtNYXkgMTUsIDIwMDZdCi0gIEFkZGVkIGEgbWlzc2luZyBzZW1pY29sb24gaW4gTWFrZWZpbGUuYW0gYW5kIE1ha2VmaWxlLmluCi0gIERlbGV0ZWQgZXh0cmFuZW91cyBzcXVhcmUgYnJhY2tldHMgZnJvbSBjb25maWd1cmUuYWMKLQotVmVyc2lvbiAxLjQuMGJldGE2IFtKdW5lIDIsIDIwMDZdCi0gIEluY3JlYXNlZCBzcHJpbnRmIGJ1ZmZlciBmcm9tIDUwIHRvIDUyIGNoYXJzIGluIHBuZ3J1dGlsLmMgdG8gYXZvaWQKLSAgICBidWZmZXIgb3ZlcmZsb3cuCi0gIENoYW5nZWQgc29udW0gZnJvbSAwIHRvIDEuCi0gIFJlbW92ZWQgdW51c2VkIHByb3RvdHlwZSBmb3IgcG5nX2NoZWNrX3NpZygpIGZyb20gcG5nLmgKLQotVmVyc2lvbiAxLjQuMGJldGE3IFtKdW5lIDE2LCAyMDA2XQotICBFeHBvcnRlZCBwbmdfd3JpdGVfc2lnIChDb3NtaW4pLgotICBPcHRpbWl6ZWQgYnVmZmVyIGluIHBuZ19oYW5kbGVfY0hSTSgpIChDb3NtaW4pLgotICBTZXQgcEhZcyA9IDI4MzUgeCAyODM1IHBpeGVscyBwZXIgbWV0ZXIsIGFuZCBhZGRlZAotICAgIHNDQUwgPSAwLjM1Mjc3OGUtMyB4IDAuMzUyNzc4ZS0zIG1ldGVycywgaW4gcG5ndGVzdC5wbmcgKENvc21pbikuCi0gIEFkZGVkIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpLCBwbmdfYmVuaWduX2Vycm9yKCksIHBuZ19jaHVua19iZW5pZ25fZXJyb3IoKS4KLSAgQWRkZWQgdHlwZWRlZiBmb3IgcG5nX2ludF8zMiBhbmQgcG5nX3VpbnRfMzIgb24gNjQtYml0IHN5c3RlbXMuCi0gIEFkZGVkICIodW5zaWduZWQgbG9uZykiIHR5cGVjYXN0IG9uIHBuZ191aW50XzMyIHZhcmlhYmxlcyBpbiBwcmludGYgbGlzdHMuCi0KLVZlcnNpb24gMS40LjBiZXRhOCBbSnVuZSAyMiwgMjAwNl0KLSAgQWRkZWQgZGVtb25zdHJhdGlvbiBvZiB1c2VyIGNodW5rIHN1cHBvcnQgaW4gcG5ndGVzdC5jLCB0byBzdXBwb3J0IHRoZQotICAgIHB1YmxpYyBzVEVSIGNodW5rIGFuZCBhIHByaXZhdGUgdnBBZyBjaHVuay4KLQotVmVyc2lvbiAxLjQuMGJldGE5IFtKdWx5IDMsIDIwMDZdCi0gIFJlbW92ZWQgb3JkaW5hbHMgZnJvbSBzY3JpcHRzL3BuZ3czMi5kZWYgYW5kIHJlbW92ZWQgcG5nX2luZm9faW50IGFuZAotICAgIHBuZ19zZXRfZ3JheV8xXzJfNF90b184IGVudHJpZXMuCi0gIElubGluZSBjYWxsIG9mIHBuZ19nZXRfdWludF8zMigpIGluIHBuZ19nZXRfdWludF8zMSgpLgotICBVc2UgcG5nX2dldF91aW50XzMxKCkgdG8gZ2V0IHZwQWcgd2lkdGggYW5kIGhlaWdodCBpbiBwbmd0ZXN0LmMKLSAgUmVtb3ZlZCBXSU5DRSBhbmQgTmV0d2FyZSBwcm9qZWN0cy4KLSAgUmVtb3ZlZCBzdGFuZGFsb25lIFkyS0lORk8gZmlsZS4KLQotVmVyc2lvbiAxLjQuMGJldGExMCBbSnVseSAxMiwgMjAwNl0KLSAgRWxpbWluYXRlZCBhdXRvbWF0aWMgY29weSBvZiBwbmdjb25mLmggdG8gcG5nY29uZi5oLmluIGZyb20gY29uZmlndXJlIGFuZAotICAgIHNvbWUgbWFrZWZpbGVzLCBiZWNhdXNlIGl0IHdhcyBub3Qgd29ya2luZyByZWxpYWJseS4gIEluc3RlYWQsIGRpc3RyaWJ1dGUKLSAgICBwbmdjb25mLmguaW4gYWxvbmcgd2l0aCBwbmdjb25mLmggYW5kIGNhdXNlIGNvbmZpZ3VyZSBhbmQgc29tZSBvZiB0aGUKLSAgICBtYWtlZmlsZXMgdG8gdXBkYXRlIHBuZ2NvbmYuaCBmcm9tIHBuZ2NvbmYuaC5pbi4KLSAgQWRkZWQgcG5nY29uZi5oIHRvIERFUEVOREVOQ0lFUyBpbiBNYWtlZmlsZS5hbQotCi1WZXJzaW9uIDEuNC4wYmV0YTExIFtBdWd1c3QgMTksIDIwMDZdCi0gIFJlbW92ZWQgQUNfRlVOQ19NQUxMT0MgZnJvbSBjb25maWd1cmUuYWMuCi0gIEFkZGVkIGEgd2FybmluZyB3aGVuIHdyaXRpbmcgaUNDUCBwcm9maWxlIHdpdGggbWlzbWF0Y2hlZCBwcm9maWxlIGxlbmd0aC4KLSAgUGF0Y2hlZCBwbmdnY2NyZC5jIHRvIGFzc2VtYmxlIG9uIHg4Nl82NCBwbGF0Zm9ybXMuCi0gIE1vdmVkIGNodW5rIGhlYWRlciByZWFkaW5nIGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiBwbmdfcmVhZF9jaHVua19oZWFkZXIoKQotICAgIGluIHBuZ3J1dGlsLmMuICBUaGUgY2h1bmsgaGVhZGVyIChsZW4rc2lnKSBpcyBub3cgc2VyaWFsaXplZCBpbiBhIHNpbmdsZQotICAgIG9wZXJhdGlvbiAoQ29zbWluKS4KLSAgSW1wbGVtZW50ZWQgc3VwcG9ydCBmb3IgSS9PIHN0YXRlcy4gQWRkZWQgcG5nX3B0ciBtZW1iZXIgaW9fc3RhdGUsIGFuZAotICAgIGZ1bmN0aW9ucyBwbmdfZ2V0X2lvX2NodW5rX25hbWUoKSBhbmQgcG5nX2dldF9pb19zdGF0ZSgpIGluIHBuZ2dldC5jCi0gICAgKENvc21pbikuCi0gIEFkZGVkIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSBhbmQgcG5nX2dldF9pb19zdGF0ZSB0byBzY3JpcHRzLyouZGVmIChDb3NtaW4pLgotICBSZW5hbWVkIHNjcmlwdHMvcG5ndzMyLiogdG8gc2NyaXB0cy9wbmd3aW4uKiAoQ29zbWluKS4KLSAgUmVtb3ZlZCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQgbGlicmFyaWVzIGZyb20gQ0ZMQUdTIGFuZCBMREZMQUdTCi0gICAgaW4gc2NyaXB0cy9tYWtlZmlsZS5nY2MgKENvc21pbikuCi0gIFVzZWQgcG5nX3NhdmVfdWludF8zMigpIHRvIHNldCB2cEFnIHdpZHRoIGFuZCBoZWlnaHQgaW4gcG5ndGVzdC5jIChDb3NtaW4pLgotICBDYXN0IHRvIHByb3BlciB0eXBlIHdoZW4gZ2V0dGluZy9zZXR0aW5nIHZwQWcgdW5pdHMgaW4gcG5ndGVzdC5jIChDb3NtaW4pLgotICBBZGRlZCBwbmdpbnRybi5oIHRvIHRoZSBWaXN1YWwgQysrIHByb2plY3RzIChDb3NtaW4pLgotICBSZW1vdmVkIHNjcmlwdHMvbGlzdCAoQ29zbWluKS4KLSAgVXBkYXRlZCBjb3B5cmlnaHQgeWVhciBpbiBzY3JpcHRzL3BuZ3dpbi5kZWYgKENvc21pbikuCi0gIFJlbW92ZWQgUE5HX1RZUEVDQVNUX05VTEwgYW5kIHVzZWQgc3RhbmRhcmQgTlVMTCBjb25zaXN0ZW50bHkgKENvc21pbikuCi0gIERpc2FsbG93ZWQgdGhlIHVzZXIgdG8gcmVkZWZpbmUgcG5nX3NpemVfdCwgYW5kIGVuZm9yY2VkIGEgY29uc2lzdGVudCB1c2UKLSAgICBvZiBwbmdfc2l6ZV90IGFjcm9zcyBsaWJwbmcgKENvc21pbikuCi0gIENoYW5nZWQgdGhlIHR5cGUgb2YgcG5nX3B0ci0+cm93Ynl0ZXMsIFBOR19ST1dCWVRFUygpIGFuZCBmcmllbmRzCi0gICAgdG8gcG5nX3NpemVfdCAoQ29zbWluKS4KLSAgUmVtb3ZlZCBwbmdfY29udmVydF9zaXplKCkgYW5kIHJlcGxhY2VkIHBuZ19zaXplb2Ygd2l0aCBzaXplb2YgKENvc21pbikuCi0gIFJlbW92ZWQgc29tZSB1bm5lY2Vzc2FyeSB0eXBlIGNhc3RzIChDb3NtaW4pLgotICBDaGFuZ2VkIHByb3RvdHlwZSBvZiBwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKCkgYW5kCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSgpIHRvIHdvcmsgd2l0aCBwbmdfc2l6ZV90IGluc3RlYWQgb2YKLSAgICBwbmdfdWludF8zMiAoQ29zbWluKS4KLSAgUmVtb3ZlZCBwbmdfbWVtY3B5X2NoZWNrKCkgYW5kIHBuZ19tZW1zZXRfY2hlY2soKSAoQ29zbWluKS4KLSAgRml4ZWQgYSB0eXBvIChwbmdfYnl0ZSAtLT4gcG5nX2J5dGVwKSBpbiBsaWJwbmcuMyBhbmQgbGlicG5nLnR4dCAoQ29zbWluKS4KLSAgQ2xhcmlmaWVkIHRoYXQgcG5nX3phbGxvYygpIGRvZXMgbm90IGNsZWFyIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LAotICAgIGFuZCBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIGNhbm5vdCBiZSBQTkdBUEkgKENvc21pbikuCi0gIFJlbmFtZWQgcG5nX21lbV9zaXplX3QgdG8gcG5nX2FsbG9jX3NpemVfdCwgZml4ZWQgaXRzIGRlZmluaXRpb24gaW4KLSAgICBwbmdjb25mLmgsIGFuZCB1c2VkIGl0IGluIGFsbCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgKENvc21pbikuCi0gIFJlbmFtZWQgcG5naW50cm4uaCB0byBwbmdwcml2LmgsIGFkZGVkIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlCi0gICAgbWVudGlvbmluZyB0aGF0IHRoZSBzeW1ib2xzIGRlY2xhcmVkIGluIHRoYXQgZmlsZSBhcmUgcHJpdmF0ZSwgYW5kCi0gICAgdXBkYXRlZCB0aGUgc2NyaXB0cyBhbmQgdGhlIFZpc3VhbCBDKysgcHJvamVjdHMgYWNjb3JkaW5nbHkgKENvc21pbikuCi0gIFJlbW92ZWQgY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIHBuZ2NvbmYuaCBhbmQgcG5nY29uZi5oLmluIGluCi0gICAgc2NyaXB0cy9tYWtlZmlsZS52Yyp3aW4zMiAoQ29zbWluKS4KLSAgUmVtb3ZpbmcgdHJhaWxpbmcgJy4nIGZyb20gdGhlIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIChDb3NtaW4pLgotICBBZGRlZCBwbmdkZWZzLmggdGhhdCBpcyBidWlsdCBieSBtYWtlZmlsZSBvciBjb25maWd1cmUsIGluc3RlYWQgb2YKLSAgICBwbmdjb25mLmguaW4gKEdsZW5uKS4KLSAgRGV0ZWN0IGFuZCBmaXggYXR0ZW1wdCB0byB3cml0ZSB3cm9uZyBpQ0NQIHByb2ZpbGUgbGVuZ3RoLgotCi1WZXJzaW9uIDEuNC4wYmV0YTEyIFtPY3RvYmVyIDE5LCAyMDA2XQotICBDaGFuZ2VkICJsb2dpY2FsIiB0byAiYml0d2lzZSIgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gIFdvcmsgYXJvdW5kIEludGVsLU1hYyBjb21waWxlciBidWcgYnkgc2V0dGluZyBQTkdfTk9fTU1YX0NPREUgaW4gcG5nY29uZi5oCi0gIEFkZCBhIHR5cGVjYXN0IHRvIHN0aWZsZSBjb21waWxlciB3YXJuaW5nIGluIHBuZ3J1dGlsLmMKLQotVmVyc2lvbiAxLjQuMGJldGExMyBbTm92ZW1iZXIgMTAsIDIwMDZdCi0gIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGluIHNQTFQgY2h1bmsgaGFuZGxlci4KLSAgRml4IE1ha2VmaWxlLmFtIHRvIG5vdCB0cnkgdG8gbGluayB0byBub2V4aXN0ZW50IGZpbGVzLgotCi1WZXJzaW9uIDEuNC4wYmV0YTE0IFtOb3ZlbWJlciAxNSwgMjAwNl0KLSAgQ2hlY2sgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgTlVMTCBwbmdfcHRyLgotCi1WZXJzaW9uIDEuNC4wYmV0YTE1IFtOb3ZlbWJlciAxNywgMjAwNl0KLSAgUmVsb2NhdGVkIHR3byBtaXNwbGFjZWQgdGVzdHMgZm9yIE5VTEwgcG5nX3B0ci4KLSAgQnVpbHQgTWFrZWZpbGUuaW4gd2l0aCBhdXRvbWFrZS0xLjkuNiBpbnN0ZWFkIG9mIDEuOS4yLgotICBCdWlsZCBjb25maWd1cmUgd2l0aCBhdXRvY29uZi0yLjYwIGluc3RlYWQgb2YgMi41OQotICBBZGQgImluc3RhbGw6IGFsbCIgaW4gTWFrZWZpbGUuYW0gc28gImNvbmZpZ3VyZTsgbWFrZSBpbnN0YWxsIiB3aWxsIHdvcmsuCi0KLVZlcnNpb24gMS40LjBiZXRhMTYgW05vdmVtYmVyIDE3LCAyMDA2XQotICBBZGRlZCBhIHR5cGVjYXN0IGluIHBuZ196YWxsb2MoKS4KLQotVmVyc2lvbiAxLjQuMGJldGExNyBbRGVjZW1iZXIgNCwgMjAwNl0KLSAgQ2hhbmdlZCAibmV3X2tleVs3OV0gPSAnXDAnOyIgdG8gIigqbmV3X2tleSlbNzldID0gJ1wwJzsiIGluIHBuZ3d1dGlsLmMKLSAgQWRkICJwbmdfYnl0ZXAiIHR5cGVjYXN0IHRvIHByb2ZpbGUgd2hpbGUgY2FsY3VsYXRpbmcgbGVuZ3RoIGluIHBuZ3d1dGlsLmMKLQotVmVyc2lvbiAxLjQuMGJldGExOCBbRGVjZW1iZXIgNywgMjAwNl0KLSAgQWRkZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAotCi1WZXJzaW9uIDEuNC4wYmV0YTE5IFtNYXkgMTYsIDIwMDddCi0gIFJldmlzZWQgc2NyaXB0cy9DTWFrZUxpc3RzLnR4dAotICBSZWJ1aWx0IGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4gd2l0aCBuZXdlciB0b29scy4KLSAgQWRkZWQgY29uZGl0aW9uYWwgI3VuZGVmIGptcGJ1ZiBpbiBwbmd0ZXN0LmMgdG8gdW5kbyAjZGVmaW5lIGluIEFJWCBoZWFkZXJzLgotICBBZGRlZCBzY3JpcHRzL21ha2VmaWxlLm5vbW14Ci0KLVZlcnNpb24gMS40LjBiZXRhMjAgW0p1bHkgOSwgMjAwOF0KLSAgTW92ZWQgc2V2ZXJhbCBQTkdfSEFWRV8qIG1hY3JvcyBmcm9tIHBuZ3ByaXYuaCB0byBwbmcuaCBiZWNhdXNlIGFwcGxpY2F0aW9ucwotICAgIGNhbGxpbmcgc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24oKSBuZWVkIHRoZW0uCi0gIE1vdmVkIHNldmVyYWwgbWFjcm8gZGVmaW5pdGlvbnMgZnJvbSBwbmdwcml2LmggdG8gcG5nY29uZi5oCi0gIE1lcmdlIHdpdGggY2hhbmdlcyB0byB0aGUgMS4yLlggYnJhbmNoLCBhcyBvZiAxLjIuMzBiZXRhMDQuCi0gIERlbGV0ZWQgYWxsIHVzZSBvZiB0aGUgTU1YIGFzc2VtYmxlciBjb2RlIGFuZCBJbnRlbC1saWNlbnNlZCBvcHRpbWl6YXRpb25zLgotICBSZXZpc2VkIG1ha2VmaWxlLm1pbmd3Ci0KLVZlcnNpb24gMS40LjBiZXRhMjEgW0p1bHkgMjEsIDIwMDhdCi0gIE1vdmVkIGxvY2FsIGFycmF5ICJjaHVua2RhdGEiIGZyb20gcG5ncnV0aWwuYyB0byB0aGUgcG5nX3N0cnVjdCwgc28KLSAgICBpdCB3aWxsIGJlIGZyZWVkIGJ5IHBuZ19yZWFkX2Rlc3Ryb3koKSBpbiBjYXNlIG9mIGEgcmVhZCBlcnJvciAoS3VydAotICAgIENocmlzdGVuc2VuKS4KLQotVmVyc2lvbiAxLjQuMGJldGEyMiBbSnVseSAyMSwgMjAwOF0KLSAgQ2hhbmdlICJwdXJwb3NlIiBhbmQgImJ1ZmZlciIgdG8gcG5nX3B0ci0+Y2h1bmtkYXRhIHRvIGF2b2lkIG1lbW9yeSBsZWFraW5nLgotCi1WZXJzaW9uIDEuNC4wYmV0YTIzIFtKdWx5IDIyLCAyMDA4XQotICBDaGFuZ2UgImNodW5rZGF0YSA9IE5VTEwiIHRvICJwbmdfcHRyLT5jaHVua2RhdGEgPSBOVUxMIiBzZXZlcmFsIHBsYWNlcyBpbgotICAgIHBuZ19kZWNvbXByZXNzX2NodW5rKCkuCi0KLVZlcnNpb24gMS40LjBiZXRhMjQgW0p1bHkgMjUsIDIwMDhdCi0gIENoYW5nZSBhbGwgcmVtYWluaW5nICJjaHVua2RhdGEiIHRvICJwbmdfcHRyLT5jaHVua2RhdGEiIGluCi0gICAgcG5nX2RlY29tcHJlc3NfY2h1bmsoKSwgYW5kIHJlbW92ZSAiY2h1bmtkYXRhIiBmcm9tIHBhcmFtZXRlciBsaXN0LgotICBQdXQgYSBjYWxsIHRvIHBuZ19jaGVja19jaHVua19uYW1lKCkgaW4gcG5nX3JlYWRfY2h1bmtfaGVhZGVyKCkuCi0gIFJldmlzZWQgcG5nX2NoZWNrX2NodW5rX25hbWUoKSB0byByZWplY3QgYSBuYW1lIHdpdGggYSBsb3dlcmNhc2UgM3JkIGJ5dGUuCi0gIFJlbW92ZWQgdHdvIGNhbGxzIHRvIHBuZ19jaGVja19jaHVua19uYW1lKCkgb2NjdXJyaW5nIGxhdGVyIGluIHRoZSBwcm9jZXNzLgotICBEZWZpbmUgUE5HX05PX0VSUk9SX05VTUJFUlMgYnkgZGVmYXVsdCBpbiBwbmdjb25mLmgKLQotVmVyc2lvbiAxLjQuMGJldGEyNSBbSnVseSAzMCwgMjAwOF0KLSAgQWRkZWQgYSBjYWxsIHRvIHBuZ19jaGVja19jaHVua19uYW1lKCkgaW4gcG5ncHJlYWQuYwotICBSZXZlcnRlZCBwbmdfY2hlY2tfY2h1bmtfbmFtZSgpIHRvIGFjY2VwdCBhIG5hbWUgd2l0aCBhIGxvd2VyY2FzZSAzcmQgYnl0ZS4KLSAgQWRkZWQgcG5nX3B1c2hfaGF2ZV9idWZmZXIoKSBmdW5jdGlvbiB0byBwbmdwcmVhZC5jCi0gIEVsaW1pbmF0ZWQgUE5HX0JJR19FTkRJQU5fU1VQUE9SVEVEIGFuZCBhc3NvY2lhdGVkIHBuZ19nZXRfKiBtYWNyb3MuCi0gIE1hZGUgaW5saW5lIGV4cGFuc2lvbiBvZiBwbmdfZ2V0XyooKSBvcHRpb25hbCB3aXRoIFBOR19VU0VfUkVBRF9NQUNST1MuCi0gIEVsaW1pbmF0ZWQgYWxsIFBOR19VU0VMRVNTX1RFU1RTIGFuZCBQTkdfQ09SUkVDVF9QQUxFVFRFX1NVUFBPUlRFRCBjb2RlLgotICBTeW5jZWQgY29udHJpYiBkaXJlY3RvcnkgYW5kIGNvbmZpZ3VyZSBmaWxlcyB3aXRoIGxpYnBuZy0xLjIuMzBiZXRhMDYuCi0gIEVsaW1pbmF0ZWQgbm8tbG9uZ2VyLXVzZWQgcG5nZGVmcy5oIChidXQgaXQncyBzdGlsbCBidWlsdCBpbiB0aGUgbWFrZWZpbGVzKQotICBSZWxvY2F0ZWQgYSBtaXNwbGFjZWQgIiNlbmRpZiAvKiBQTkdfTk9fV1JJVEVfRklMVEVSICovIiBpbiBwbmd3dXRpbC5jCi0KLVZlcnNpb24gMS40LjBiZXRhMjYgW0F1Z3VzdCA0LCAyMDA4XQotICBSZW1vdmVkIHBuZ19wdXNoX2hhdmVfYnVmZmVyKCkgZnVuY3Rpb24gaW4gcG5ncHJlYWQuYy4gIEl0IGluY3JlYXNlZCB0aGUKLSAgICBjb21waWxlZCBsaWJyYXJ5IHNpemUgc2xpZ2h0bHkuCi0gIENoYW5nZWQgIi1XYWxsIiB0byAiLVcgLVdhbGwiIGluIHRoZSBDRkxBR1MgaW4gYWxsIG1ha2VmaWxlcyAoQ29zbWluIFRydXRhKQotICBEZWNsYXJlZCBwbmdfcHRyICJ2b2xhdGlsZSIgaW4gcG5ncmVhZC5jIGFuZCBwbmd3cml0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzLgotICBVcGRhdGVkIGNvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggdG8gdmVyc2lvbiAyLjAuMQotICBBZGRlZCBQTkdfTElURVJBTF9DSEFSQUNURVIgbWFjcm9zIGZvciAjLCBbLCBhbmQgXS4KLQotVmVyc2lvbiAxLjQuMGJldGEyNyBbQXVndXN0IDUsIDIwMDhdCi0gIFJldmlzZWQgdXNhZ2Ugb2YgUE5HX0xJVEVSQUxfU0hBUlAgaW4gcG5nZXJyb3IuYy4KLSAgTW92ZWQgbmV3bGluZSBjaGFyYWN0ZXIgZnJvbSBpbmRpdmlkdWFsIHBuZ19kZWJ1ZyBtZXNzYWdlcyBpbnRvIHRoZQotICAgIHBuZ19kZWJ1ZyBtYWNyb3MuCi0gIEFsbG93IHVzZXIgdG8gI2RlZmluZSB0aGVpciBvd24gcG5nX2RlYnVnLCBwbmdfZGVidWcxLCBhbmQgcG5nX2RlYnVnMi4KLQotVmVyc2lvbiAxLjQuMGJldGEyOCBbQXVndXN0IDUsIDIwMDhdCi0gIFJldmlzZWQgdXNhZ2Ugb2YgUE5HX0xJVEVSQUxfU0hBUlAgaW4gcG5nZXJyb3IuYy4KLSAgQWRkZWQgUE5HX1NUUklOR19ORVdMSU5FIG1hY3JvCi0KLVZlcnNpb24gMS40LjBiZXRhMjkgW0F1Z3VzdCA5LCAyMDA4XQotICBSZXZpc2VkIHVzYWdlIG9mIFBOR19TVFJJTkdfTkVXTElORSB0byB3b3JrIG9uIG5vbi1JU08gY29tcGlsZXJzLgotICBBZGRlZCBQTkdfU1RSSU5HX0NPUFlSSUdIVCBtYWNyby4KLSAgQWRkZWQgbm9uLUlTTyB2ZXJzaW9ucyBvZiBwbmdfZGVidWcgbWFjcm9zLgotCi1WZXJzaW9uIDEuNC4wYmV0YTMwIFtBdWd1c3QgMTQsIDIwMDhdCi0gIEFkZGVkIHByZW11bHRpcGxpZWQgYWxwaGEgZmVhdHVyZSAoVm9sa2VyIFdpZW5kbCkuCi0KLVZlcnNpb24gMS40LjBiZXRhMzEgW0F1Z3VzdCAxOCwgMjAwOF0KLSAgTW92ZWQgcG5nX3NldF9wcmVtdWx0aXBseV9hbHBoYSBmcm9tIHBuZ3RyYW5zLmMgdG8gcG5ncnRyYW4uYwotICBSZW1vdmVkIGV4dHJhIGNyYyBjaGVjayBhdCB0aGUgZW5kIG9mIHBuZ19oYW5kbGVfY0hSTSgpLiAgQnVnIGludHJvZHVjZWQKLSAgICBpbiBsaWJwbmctMS40LjBiZXRhMjAuCi0KLVZlcnNpb24gMS40LjBiZXRhMzIgW0F1Z3VzdCAxOSwgMjAwOF0KLSAgQWRkZWQgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRCBibG9jayBhcm91bmQgbmV3IHBuZ19mbHVzaCgpIGNhbGwuCi0gIFJldmlzZWQgUE5HX05PX1NURElPIHZlcnNpb24gb2YgcG5nX3dyaXRlX2ZsdXNoKCkKLQotVmVyc2lvbiAxLjQuMGJldGEzMyBbQXVndXN0IDIwLCAyMDA4XQotICBBZGRlZCBwbmdfZ2V0fHNldF9jaHVua19jYWNoZV9tYXgoKSB0byBsaW1pdCB0aGUgdG90YWwgbnVtYmVyIG9mIHNQTFQsCi0gICAgdGV4dCwgYW5kIHVua25vd24gY2h1bmtzIHRoYXQgY2FuIGJlIHN0b3JlZC4KLQotVmVyc2lvbiAxLjQuMGJldGEzNCBbU2VwdGVtYmVyIDYsIDIwMDhdCi0gIFNob3J0ZW5lZCB0SU1FX3N0cmluZyB0byAyOSBieXRlcyBpbiBwbmd0ZXN0LmMKLSAgRml4ZWQgb2ZmLWJ5LW9uZSBlcnJvciBpbnRyb2R1Y2VkIGluIHBuZ19wdXNoX3JlYWRfelRYdCgpIGZ1bmN0aW9uIGluCi0gICAgbGlicG5nLTEuMi4zMGJldGEwNC9wbmdwcmVhZC5jIChIYXJhbGQgdmFuIERpamspCi0KLVZlcnNpb24gMS40LjBiZXRhMzUgW09jdG9iZXIgNiwgMjAwOF0KLSAgQ2hhbmdlZCAidHJhbnNfdmFsdWVzIiB0byAidHJhbnNfY29sb3IiLgotICBDaGFuZ2VkIHNvLW51bWJlciBmcm9tIDAgdG8gMTQuICBTb21lIE9TIGRvIG5vdCBsaWtlIDAuCi0gIFJldmlzZWQgbWFrZWZpbGUuZGFyd2luIHRvIGZpeCBzaGFyZWQgbGlicmFyeSBudW1iZXJpbmcuCi0gIENoYW5nZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIHRvIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpCi0gICAgaW4gZXhhbXBsZS5jIChkZWJpYW4gYnVnIHJlcG9ydCkKLQotVmVyc2lvbiAxLjQuMGJldGEzNiBbT2N0b2JlciAyNSwgMjAwOF0KLSAgU3luYyB3aXRoIHRFWHQgdnVsbmVyYWJpbGl0eSBmaXggaW4gbGlicG5nLTEuMi4zM3JjMDIuCi0KLVZlcnNpb24gMS40LjBiZXRhMzcgW05vdmVtYmVyIDEzLCAyMDA4XQotICBBZGRlZCBwbmdfY2hlY2tfY0hSTSBpbiBwbmcuYyBhbmQgbW92ZWQgY2hlY2tpbmcgZnJvbSBwbmdnZXQuYywgcG5ncnV0aWwuYywKLSAgICBhbmQgcG5nd3JpdGUuYwotCi1WZXJzaW9uIDEuNC4wYmV0YTM4IFtOb3ZlbWJlciAyMiwgMjAwOF0KLSAgQWRkZWQgY2hlY2sgZm9yIHplcm8tYXJlYSBSR0IgY0hSTSB0cmlhbmdsZSBpbiBwbmdfY2hlY2tfY0hSTSgpIGFuZAotICAgIHBuZ19jaGVja19jSFJNX2ZpeGVkKCkuCi0KLVZlcnNpb24gMS40LjBiZXRhMzkgW05vdmVtYmVyIDIzLCAyMDA4XQotICBSZXZpc2VkIHBuZ193YXJuaW5nKCkgdG8gd3JpdGUgaXRzIG1lc3NhZ2Ugb24gc3RhbmRhcmQgb3V0cHV0IGJ5IGRlZmF1bHQKLSAgICB3aGVuIHdhcm5pbmdfZm4gaXMgTlVMTC4KLQotVmVyc2lvbiAxLjQuMGJldGE0MCBbTm92ZW1iZXIgMjQsIDIwMDhdCi0gIEVsaW1pbmF0ZWQgcG5nX2NoZWNrX2NIUk0oKS4gIEluc3RlYWQsIGFsd2F5cyB1c2UgcG5nX2NoZWNrX2NIUk1fZml4ZWQoKS4KLSAgSW4gcG5nX2NoZWNrX2NIUk1fZml4ZWQoKSwgZW5zdXJlIHdoaXRlX3kgaXMgPiAwLCBhbmQgcmVtb3ZlZCByZWR1bmRhbnQKLSAgICBjaGVjayBmb3IgYWxsLXplcm8gY29vcmRpbmF0ZXMgdGhhdCBpcyBkZXRlY3RlZCBieSB0aGUgdHJpYW5nbGUgY2hlY2suCi0KLVZlcnNpb24gMS40LjBiZXRhNDEgW05vdmVtYmVyIDI2LCAyMDA4XQotICBGaXhlZCBzdHJpbmcgdnMgcG9pbnRlci10by1zdHJpbmcgZXJyb3IgaW4gcG5nX2NoZWNrX2tleXdvcmQoKS4KLSAgUmVhcnJhbmdlZCB0ZXN0IGV4cHJlc3Npb25zIGluIHBuZ19jaGVja19jSFJNX2ZpeGVkKCkgdG8gYXZvaWQgaW50ZXJuYWwKLSAgICBvdmVyZmxvd3MuCi0gIEFkZGVkIFBOR19OT19DSEVDS19jSFJNIGNvbmRpdGlvbmFsLgotCi1WZXJzaW9uIDEuNC4wYmV0YTQyLCA0MyBbRGVjZW1iZXIgMSwgMjAwOF0KLSAgTWVyZ2UgcG5nX2RlYnVnIHdpdGggdmVyc2lvbiAxLjIuMzRiZXRhMDQuCi0KLVZlcnNpb24gMS40LjBiZXRhNDQgW0RlY2VtYmVyIDYsIDIwMDhdCi0gIFJlbW92ZWQgcmVkdW5kYW50IGNoZWNrIGZvciBrZXk9PU5VTEwgYmVmb3JlIGNhbGxpbmcgcG5nX2NoZWNrX2tleXdvcmQoKQotICAgIHRvIGVuc3VyZSB0aGF0IG5ld19rZXkgZ2V0cyBpbml0aWFsaXplZCBhbmQgcmVtb3ZlZCBleHRyYSB3YXJuaW5nCi0gICAgKE1lcmdlIHdpdGggdmVyc2lvbiAxLjIuMzRiZXRhMDUgLS0gQXJ2YW4gUHJpdGNoYXJkKS4KLQotVmVyc2lvbiAxLjQuMGJldGE0NSBbRGVjZW1iZXIgOSwgMjAwOF0KLSAgSW4gcG5nX3dyaXRlX3BuZygpLCByZXNwZWN0IHRoZSBwbGFjZW1lbnQgb2YgdGhlIGZpbGxlciBieXRlcyBpbiBhbiBlYXJsaWVyCi0gICAgY2FsbCB0byBwbmdfc2V0X2ZpbGxlcigpIChKaW0gQmFycnkpLgotCi1WZXJzaW9uIDEuNC4wYmV0YTQ2IFtEZWNlbWJlciAxMCwgMjAwOF0KLSAgVW5kaWQgcHJldmlvdXMgY2hhbmdlIGFuZCBhZGRlZCBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9CRUZPUkUgYW5kCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQUZURVIgY29uZGl0aW9uYWxzIGFuZCBkZXByZWNhdGVkCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgKEppbSBCYXJyeSkuCi0KLVZlcnNpb24gMS40LjBiZXRhNDcgW0RlY2VtYmVyIDE1LCAyMDA4XQotICBTdXBwb3J0IGZvciBkaXRoZXJpbmcgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgaXQgaGFzIG5ldmVyCi0gICAgYmVlbiB3ZWxsIHRlc3RlZCBhbmQgZG9lc24ndCB3b3JrIHZlcnkgd2VsbC4gIFRoZSBjb2RlIGhhcyBub3QKLSAgICBiZWVuIHJlbW92ZWQsIGhvd2V2ZXIsIGFuZCBjYW4gYmUgZW5hYmxlZCBieSBidWlsZGluZyBsaWJwbmcgd2l0aAotICAgIFBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQgZGVmaW5lZC4KLQotVmVyc2lvbiAxLjQuMGJldGE0OCBbRmVicnVhcnkgMTQsIDIwMDldCi0gIEFkZGVkIG5ldyBleHBvcnRlZCBmdW5jdGlvbiBwbmdfY2FsbG9jKCkuCi0gIENvbWJpbmVkIHNldmVyYWwgaW5zdGFuY2VzIG9mIHBuZ19tYWxsb2MoKTsgcG5nX21lbXNldCgpIGludG8gcG5nX2NhbGxvYygpLgotICBSZW1vdmVkIHByb3RvdHlwZSBmb3IgcG5nX2ZyZWVwdHIoKSB0aGF0IHdhcyBhZGRlZCBpbiBsaWJwbmctMS40LjBiZXRhMjQKLSAgICBidXQgd2FzIG5ldmVyIGRlZmluZWQuCi0KLVZlcnNpb24gMS40LjBiZXRhNDkgW0ZlYnJ1YXJ5IDI4LCAyMDA5XQotICBBZGRlZCBwbmdfZmlsZW5vKCkgbWFjcm8gdG8gcG5nY29uZi5oLCB1c2VkIGluIHBuZ3dpby5jCi0gIENvcnJlY3RlZCBvcmRlciBvZiAjaWZkZWYncyBpbiBwbmdfZGVidWcgZGVmaW5pdGlvbiBpbiBwbmcuaAotICBGaXhlZCBidWcgaW50cm9kdWNlZCBpbiBsaWJwbmctMS40LjBiZXRhNDggd2l0aCB0aGUgbWVtc2V0IGFyZ3VtZW50cwotICAgIGZvciBwY2FsX3BhcmFtcy4KLSAgRml4ZWQgb3JkZXIgb2YgI2lmZGVmIGRpcmVjdGl2ZXMgaW4gdGhlIHBuZ19kZWJ1ZyBkZWZpbmVzIGluIHBuZy5oCi0gICAgKGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMzQvMS40LjBiZXRhMjkpLgotICBSZXZpc2VkIGNvbW1lbnRzIGluIHBuZ19zZXRfcmVhZF9mbigpIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkuCi0KLVZlcnNpb24gMS40LjBiZXRhNTAgW01hcmNoIDE4LCAyMDA5XQotICBVc2UgcG5nX2NhbGxvYygpIGluc3RlYWQgb2YgcG5nX21hbGxvYygpIHRvIGFsbG9jYXRlIGJpZ19yb3dfYnVmIHdoZW4KLSAgICByZWFkaW5nIGFuIGludGVybGFjZWQgZmlsZSwgdG8gYXZvaWQgYSBwb3NzaWJsZSBVTVIuCi0gIFVuZGlkIHJldmlzaW9uIG9mIFBOR19OT19TVERJTyB2ZXJzaW9uIG9mIHBuZ193cml0ZV9mbHVzaCgpLiAgVXNlcnMKLSAgICBoYXZpbmcgdHJvdWJsZSB3aXRoIGZmbHVzaCgpIGNhbiBidWlsZCB3aXRoIFBOR19OT19XUklURV9GTFVTSCBkZWZpbmVkCi0gICAgb3Igc3VwcGx5IHRoZWlyIG93biBmbHVzaF9mbigpIHJlcGxhY2VtZW50LgotICBSZXZpc2VkIGxpYnBuZyoudHh0IGFuZCBwbmcuaCBkb2N1bWVudGF0aW9uIGFib3V0IHVzZSBvZiBwbmdfd3JpdGVfZmx1c2goKQotICAgIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkuCi0gIFJlbW92ZWQgZmZsdXNoKCkgZnJvbSBwbmd0ZXN0LmMuCi0gIEFkZGVkICIjZGVmaW5lIFBOR19OT19XUklURV9GTFVTSCIgdG8gY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCi0KLVZlcnNpb24gMS40LjBiZXRhNTEgW01hcmNoIDIxLCAyMDA5XQotICBSZW1vdmVkIG5ldyBwbmdfZmlsZW5vKCkgbWFjcm8gZnJvbSBwbmdjb25mLmggLgotCi1WZXJzaW9uIDEuNC4wYmV0YTUyIFtNYXJjaCAyNywgMjAwOV0KLSAgUmVsb2NhdGVkIHBuZ19kb19jaG9wKCkgYWhlYWQgb2YgYnVpbGRpbmcgZ2FtbWEgdGFibGVzIGluIHBuZ3J0cmFuLmMKLSAgICBUaGlzIGF2b2lkcyBidWlsZGluZyAxNi1iaXQgZ2FtbWEgdGFibGVzIHVubmVjZXNzYXJpbHkuCi0gIFJlbW92ZWQgZmZsdXNoKCkgZnJvbSBwbmd0ZXN0LmMuCi0gIEFkZGVkICIjZGVmaW5lIFBOR19OT19XUklURV9GTFVTSCIgdG8gY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5oCi0gIEFkZGVkIGEgc2VjdGlvbiBvbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIDEuMC54IGFuZCAxLjIueCB0byBsaWJwbmcuMy9saWJwbmcudHh0Ci0KLVZlcnNpb24gMS40LjBiZXRhNTMgW0FwcmlsIDEsIDIwMDldCi0gIFJlbW92ZWQgc29tZSByZW1haW5pbmcgTU1YIG1hY3JvcyBmcm9tIHBuZ3ByaXYuaAotICBGaXhlZCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgb2YgIm5ld19uYW1lIiBpbiBwbmdfd3JpdGVfaUNDUCgpIChSYWxwaCBHaWxlcykKLQotVmVyc2lvbiAxLjQuMGJldGE1NCBbQXByaWwgMTMsIDIwMDldCi0gIEFkZGVkICJpZm5kZWYgUE5HX1NLSVBfU0VUSk1QX0NIRUNLIiBibG9jayBpbiBwbmdjb25mLmggdG8gYWxsb3cKLSAgICBhcHBsaWNhdGlvbiBjb2RlIHdyaXRlcnMgdG8gYnlwYXNzIHRoZSBjaGVjayBmb3IgbXVsdGlwbGUgaW5jbHVzaW9uCi0gICAgb2Ygc2V0am1wLmggd2hlbiB0aGV5IGtub3cgdGhhdCBpdCBpcyBzYWZlIHRvIGlnbm9yZSB0aGUgc2l0dWF0aW9uLgotICBFbGltaW5hdGVkIGludGVybmFsIHVzZSBvZiBzZXRqbXAoKSBpbiBwbmdyZWFkLmMgYW5kIHBuZ3dyaXRlLmMKLSAgUmVvcmRlcmVkIGFuY2lsbGFyeSBjaHVua3MgaW4gcG5ndGVzdC5wbmcgdG8gYmUgdGhlIHNhbWUgYXMgd2hhdAotICAgIHBuZ3Rlc3Qgbm93IHByb2R1Y2VzLCBhbmQgbWFkZSBzb21lIGNvc21ldGljIGNoYW5nZXMgdG8gcG5ndGVzdCBvdXRwdXQuCi0gIEVsaW1pbmF0ZWQgZGVwcmVjYXRlZCBwbmdfcmVhZF9pbml0XzMoKSBhbmQgcG5nX3dyaXRlX2luaXRfMygpIGZ1bmN0aW9ucy4KLQotVmVyc2lvbiAxLjQuMGJldGE1NSBbQXByaWwgMTUsIDIwMDldCi0gIFNpbXBsaWZpZWQgZXJyb3IgaGFuZGxpbmcgaW4gcG5ncmVhZC5jIGFuZCBwbmd3cml0ZS5jIGJ5IHB1dHRpbmcKLSAgICB0aGUgbmV3IHBuZ19yZWFkX2NsZWFudXAoKSBhbmQgcG5nX3dyaXRlX2NsZWFudXAoKSBmdW5jdGlvbnMgaW5saW5lLgotCi1WZXJzaW9uIDEuNC4wYmV0YTU2IFtBcHJpbCAyNSwgMjAwOV0KLSAgUmVuYW1lZCAidXNlcl9jaHVua19kYXRhIiB0byAibXlfdXNlcl9jaHVua19kYXRhIiBpbiBwbmd0ZXN0LmMgdG8gc3VwcHJlc3MKLSAgICAic2hhZG93ZWQgZGVjbGFyYXRpb24iIHdhcm5pbmcgZnJvbSBnY2MtNC4zLjMuCi0gIFJlbmFtZWQgImdhbW1hIiB0byAicG5nX2dhbW1hIiBpbiBwbmdzZXQuYyB0byBhdm9pZCAic2hhZG93ZWQgZGVjbGFyYXRpb24iCi0gICAgd2FybmluZyBhYm91dCBhIGdsb2JhbCAiZ2FtbWEiIHZhcmlhYmxlIGluIG1hdGguaCBvbiBzb21lIHBsYXRmb3Jtcy4KLQotVmVyc2lvbiAxLjQuMGJldGE1NyBbTWF5IDIsIDIwMDldCi0gIFJlbW92ZWQgcHJvdG90eXBlIGZvciBwbmdfZnJlZXB0cigpIHRoYXQgd2FzIGFkZGVkIGluIGxpYnBuZy0xLjQuMGJldGEyNAotICAgIGJ1dCB3YXMgbmV2ZXIgZGVmaW5lZCAoYWdhaW4pLgotICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b2NvbmYtMi42MyBpbnN0ZWFkIG9mIDIuNjIKLSAgUmVtb3ZlZCBwbmdwcmVmcy5oIGFuZCBNTVggZnJvbSBtYWtlZmlsZXMKLQotVmVyc2lvbiAxLjQuMGJldGE1OCBbTWF5IDE0LCAyMDA5XQotICBDaGFuZ2VkIHBuZ3czMi5kZWYgdG8gcG5nd2luLmRlZiBpbiBtYWtlZmlsZS5taW5ndyAodHlwbyB3YXMgaW50cm9kdWNlZAotICAgIGluIGJldGE1NykuCi0gIENsYXJpZmllZCB1c2FnZSBvZiBzaWdfYml0IHZlcnN1cyBzaWdfYml0X3AgaW4gZXhhbXBsZS5jIChWaW5jZW50IFRvcnJpKQotCi1WZXJzaW9uIDEuNC4wYmV0YTU5IFtNYXkgMTUsIDIwMDldCi0gIFJlZm9ybWF0ZWQgc291cmNlcyBpbiBsaWJwbmcgc3R5bGUgKDMtc3BhY2UgaW50ZW50YXRpb24sIGNvbW1lbnQgZm9ybWF0KQotICBGaXhlZCB0eXBvIGluIGxpYnBuZyBkb2NzIChQTkdfRklMVEVSX0FWRSBzaG91bGQgYmUgUE5HX0ZJTFRFUl9BVkcpCi0gIEFkZGVkIHNlY3Rpb25zIGFib3V0IHRoZSBnaXQgcmVwb3NpdG9yeSBhbmQgb3VyIGNvZGluZyBzdHlsZSB0byB0aGUKLSAgICBkb2N1bWVudGF0aW9uCi0gIFJlbG9jYXRlZCBtaXNwbGFjZWQgI2VuZGlmIGluIHBuZ3dyaXRlLmMsIHNDQUwgY2h1bmsgaGFuZGxlci4KLQotVmVyc2lvbiAxLjQuMGJldGE2MCBbTWF5IDE5LCAyMDA5XQotICBDb25kaXRpb25hbGx5IGNvbXBpbGUgcG5nX3JlYWRfZmluaXNoX3JvdygpIHdoaWNoIGlzIG5vdCB1c2VkIGJ5Ci0gICAgcHJvZ3Jlc3NpdmUgcmVhZGVycy4KLSAgQWRkZWQgY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyIHRvIGRlbW9uc3RyYXRlIGJ1aWxkaW5nIG1pbmltYWwgcHJvZ3Jlc3NpdmUKLSAgICBkZWNvZGVyLCBiYXNlZCBvbiBjb250cmliL2dyZWdib29rIHdpdGggZW1iZWRkZWQgbGlicG5nIGFuZCB6bGliLgotCi1WZXJzaW9uIDEuNC4wYmV0YTYxIFtNYXkgMjAsIDIwMDldCi0gIEluIGNvbnRyaWIvcG5nbWluaW0vKiwgcmVuYW1lZCAibWFrZWZpbGUuc3RkIiB0byAibWFrZWZpbGUiLCBzaW5jZSB0aGVyZQotICAgIGlzIG9ubHkgb25lIG1ha2VmaWxlIGluIHRob3NlIGRpcmVjdG9yaWVzLCBhbmQgcmV2aXNlZCB0aGUgUkVBRE1FIGZpbGVzCi0gICAgYWNjb3JkaW5nbHkuCi0gIE1vcmUgcmVmb3JtYXR0aW5nIG9mIGNvbW1lbnRzLCBtb3N0bHkgdG8gY2FwaXRhbGl6ZSBzZW50ZW5jZXMuCi0KLVZlcnNpb24gMS40LjBiZXRhNjIgW0p1bmUgMiwgMjAwOV0KLSAgQWRkZWQgIiNkZWZpbmUgUE5HX05PX1dSSVRFX1NXQVAiIHRvIGNvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaAotICAgIGFuZCAiZGVmaW5lIFBOR19OT19SRUFEX1NXQVAiIHRvIGRlY29kZXIvcG5ndXNyLmggYW5kIHByZWFkZXIvcG5ndXNyLmgKLSAgUmVmb3JtYXR0ZWQgc2V2ZXJhbCByZW1haW5pbmcgImVsc2Ugc3RhdGVtZW50IiBpbnRvIHR3byBsaW5lcy4KLSAgQWRkZWQgYSBzZWN0aW9uIHRvIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiBhYm91dCB1c2luZyBwbmdfZ2V0X2lvX3B0cigpCi0gICAgaW4gY29uZmlndXJlIHNjcmlwdHMgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBsaWJwbmcuCi0KLVZlcnNpb24gMS40LjBiZXRhNjMgW0p1bmUgMTUsIDIwMDldCi0gIFJldmlzZWQgbGlicG5nKi50eHQgYW5kIGxpYnBuZy4zIHRvIG1lbnRpb24gY2FsbGluZyBwbmdfc2V0X0lIRFIoKQotICAgIG11bHRpcGxlIHRpbWVzIGFuZCB0byBzcGVjaWZ5IHRoZSBzYW1wbGUgb3JkZXIgaW4gdGhlIHRSTlMgY2h1bmssCi0gICAgYmVjYXVzZSB0aGUgSVNPIFBORyBzcGVjaWZpY2F0aW9uIGhhcyBhIHR5cG8gaW4gdGhlIHRSTlMgdGFibGUuCi0gIENoYW5nZWQgc2V2ZXJhbCBQTkdfVU5LTk9XTl9DSFVOS19TVVBQT1JURUQgdG8KLSAgICBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVELCB0byBtYWtlIHRoZSBwbmdfc2V0X2tlZXAgbWVjaGFuaXNtCi0gICAgYXZhaWxhYmxlIGZvciBpZ25vcmluZyBrbm93biBjaHVua3MgZXZlbiB3aGVuIG5vdCBzYXZpbmcgdW5rbm93biBjaHVua3MuCi0gIEFkb3B0ZWQgcHJlZmVyZW5jZSBmb3IgY29uc2lzdGVudCB1c2Ugb2YgIiNpZmRlZiIgYW5kICIjaWZuZGVmIiB2ZXJzdXMKLSAgICAiI2lmIGRlZmluZWQoKSIgYW5kICJpZiAhZGVmaW5lZCgpIiB3aGVyZSBwb3NzaWJsZS4KLQotVmVyc2lvbiAxLjQuMGJldGE2NCBbSnVuZSAyNCwgMjAwOV0KLSAgRWxpbWluYXRlZCBQTkdfTEVHQUNZX1NVUFBPUlRFRCBjb2RlLgotICBNb3ZlZCB0aGUgdmFyaW91cyB1bmtub3duIGNodW5rIG1hY3JvIGRlZmluaXRpb25zIG91dHNpZGUgb2YgdGhlCi0gICAgUE5HX1JFQUR8V1JJVEVfQU5DSUxMQVJZX0NIVU5LX1NVUFBPUlRFRCBibG9ja3MuCi0KLVZlcnNpb24gMS40LjBiZXRhNjUgW0p1bmUgMjYsIDIwMDldCi0gIEFkZGVkIGEgcmVmZXJlbmNlIHRvIHRoZSBsaWJwbmcgbGljZW5zZSBpbiBlYWNoIGZpbGUuCi0KLVZlcnNpb24gMS40LjBiZXRhNjYgW0p1bmUgMjcsIDIwMDldCi0gIFJlZmVyIHRvIHRoZSBsaWJwbmcgbGljZW5zZSBpbnN0ZWFkIG9mIHRoZSBsaWJwbmcgbGljZW5zZSBpbiBlYWNoIGZpbGUuCi0KLVZlcnNpb24gMS40LjBiZXRhNjcgW0p1bHkgNiwgMjAwOV0KLSAgUmVsb2NhdGVkIElOVkVSVF9BTFBIQSB3aXRoaW4gcG5nX3JlYWRfcG5nKCkgYW5kIHBuZ193cml0ZV9wbmcoKS4KLSAgQWRkZWQgaGlnaC1sZXZlbCBBUEkgdHJhbnNmb3JtIFBOR19UUkFOU0ZPUk1fR1JBWV9UT19SR0IuCi0gIEFkZGVkIGFuICJ4Y29kZSIgcHJvamVjdCB0byB0aGUgcHJvamVjdHMgZGlyZWN0b3J5IChBbGFtIEFyaWFzKS4KLQotVmVyc2lvbiAxLjQuMGJldGE2OCBbSnVseSAxOSwgMjAwOV0KLSAgQXZvaWQgc29tZSB0ZXN0cyBpbiBmaWx0ZXIgc2VsZWN0aW9uIGluIHBuZ3d1dGlsLmMKLQotVmVyc2lvbiAxLjQuMGJldGE2OSBbSnVseSAyNSwgMjAwOV0KLSAgU2ltcGxpZmllZCB0aGUgbmV3IGZpbHRlci1zZWxlY3Rpb24gdGVzdC4gIFRoaXMgcnVucyBmYXN0ZXIgaW4gdGhlCi0gICAgY29tbW9uICJQTkdfQUxMX0ZJTFRFUlMiIGFuZCBQTkdfRklMVEVSX05PTkUgY2FzZXMuCi0gIFJlbW92ZWQgZXh0cmFuZW91cyBkZWNsYXJhdGlvbiBmcm9tIHRoZSBuZXcgY2FsbCB0byBwbmdfcmVhZF9ncmF5X3RvX3JnYigpCi0gICAgKGJ1ZyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjQuMGJldGE2NykuCi0gIEZpeGVkIHVwIHhjb2RlIHByb2plY3QgKEFsYW0gQXJpYXMpCi0gIEFkZGVkIGEgcHJvdG90eXBlIGZvciBwbmdfNjRiaXRfcHJvZHVjdCgpIGluIHBuZy5jCi0KLVZlcnNpb24gMS40LjBiZXRhNzAgW0p1bHkgMjcsIDIwMDldCi0gIEF2b2lkIGEgcG9zc2libGUgTlVMTCBkZXJlZmVyZW5jZSBpbiBkZWJ1ZyBidWlsZCwgaW4gcG5nX3NldF90ZXh0XzIoKS4KLSAgICAoYnVnIGludHJvZHVjZWQgaW4gbGlicG5nLTAuOTUsIGRpc2NvdmVyZWQgYnkgRXZhbiBSb3VhdWx0KQotCi1WZXJzaW9uIDEuNC4wYmV0YTcxIFtKdWx5IDI5LCAyMDA5XQotICBSZWJ1aWx0IGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b2NvbmYtMi42NC4KLQotVmVyc2lvbiAxLjQuMGJldGE3MiBbQXVndXN0IDEsIDIwMDldCi0gIFJlcGxhY2VkICoudGFyLmx6bWEgd2l0aCAqLnRhci54eiBpbiBkaXN0cmlidXRpb24uICBHZXQgdGhlIHh6IGNvZGVjCi0gICAgZnJvbSA8aHR0cDovL3R1a2Fhbmkub3JnL3h6Pi4KLQotVmVyc2lvbiAxLjQuMGJldGE3MyBbQXVndXN0IDEsIDIwMDldCi0gIFJlamVjdCBhdHRlbXB0IHRvIHdyaXRlIGlDQ1AgY2h1bmsgd2l0aCBuZWdhdGl2ZSBlbWJlZGRlZCBwcm9maWxlIGxlbmd0aAotICAgIChKRCBDaGVuKSAoQ1ZFLTIwMDktNTA2MykuCi0KLVZlcnNpb24gMS40LjBiZXRhNzQgW0F1Z3VzdCA4LCAyMDA5XQotICBDaGFuZ2VkIHBuZ19wdHIgYW5kIGluZm9fcHRyIG1lbWJlciAidHJhbnMiIHRvICJ0cmFuc19hbHBoYSIuCi0KLVZlcnNpb24gMS40LjBiZXRhNzUgW0F1Z3VzdCAyMSwgMjAwOV0KLSAgUmVtb3ZlZCBhbiBleHRyYSBwbmdfZGVidWcoKSByZWNlbnRseSBhZGRlZCB0byBwbmdfd3JpdGVfZmluZF9maWx0ZXIoKS4KLSAgRml4ZWQgaW5jb3JyZWN0ICNpZmRlZiBpbiBwbmdzZXQuYyByZWdhcmRpbmcgdW5rbm93biBjaHVuayBzdXBwb3J0LgotCi1WZXJzaW9uIDEuNC4wYmV0YTc2IFtBdWd1c3QgMjIsIDIwMDldCi0gIE1vdmVkIGFuIGluY29ycmVjdGx5IGxvY2F0ZWQgdGVzdCBpbiBwbmdfcmVhZF9yb3coKSBpbiBwbmdyZWFkLmMKLQotVmVyc2lvbiAxLjQuMGJldGE3NyBbQXVndXN0IDI3LCAyMDA5XQotICBSZW1vdmVkIGxwWFlaLnRhci5iejIgKHdpdGggQ1JMRiksIEtOT1dOQlVHLCBsaWJwbmcteC55LnotS05PV05CVUcudHh0LAotICAgIGFuZCB0aGUgIm5vY29uZmlnIiBmaWxlcyBmcm9tIHRoZSBkaXN0cmlidXRpb24uCi0gIE1vdmVkIENNYWtlTGlzdHMudHh0IGZyb20gc2NyaXB0cyBpbnRvIHRoZSBtYWluIGxpYnBuZyBkaXJlY3RvcnkuCi0gIFZhcmlvdXMgYnVnZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0byBDTWFrZUxpc3RzLnR4dCAoUGhpbGlwIExvd21hbikKLQotVmVyc2lvbiAxLjQuMGJldGE3OCBbQXVndXN0IDMxLCAyMDA5XQotICBDb252ZXJ0ZWQgYWxsIFBOR19OT18qIHRlc3RzIHRvIFBOR18qX1NVUFBPUlRFRCBldmVyeXdoZXJlIGV4Y2VwdCBwbmdjb25mLmgKLSAgRWxpbWluYXRlZCBQTkdfTk9fRlJFRV9NRSBhbmQgUE5HX0ZSRUVfTUVfU1VQUE9SVEVEIG1hY3Jvcy4KLSAgVXNlIHBuZ19tYWxsb2MgcGx1cyBhIGxvb3AgaW5zdGVhZCBvZiBwbmdfY2FsbG9jKCkgdG8gaW5pdGlhbGl6ZQotICAgIHJvd19wb2ludGVycyBpbiBwbmdfcmVhZF9wbmcoKS4KLQotVmVyc2lvbiAxLjQuMGJldGE3OSBbU2VwdGVtYmVyIDEsIDIwMDldCi0gIEVsaW1pbmF0ZWQgUE5HX0dMT0JBTF9BUlJBWVMgYW5kIFBOR19MT0NBTF9BUlJBWVM7IGFsd2F5cyB1c2UgbG9jYWwgYXJyYXlzLgotICBFbGltaW5hdGVkIFBOR19DQUxMT0NfU1VQUE9SVEVEIG1hY3JvIGFuZCBhbHdheXMgcHJvdmlkZSBwbmdfY2FsbG9jKCkuCi0KLVZlcnNpb24gMS40LjBiZXRhODAgW1NlcHRlbWJlciAxNywgMjAwOV0KLSAgUmVtb3ZlZCBzY3JpcHRzL2xpYnBuZy5pY2MKLSAgQ2hhbmdlZCB0eXBlY2FzdCBvZiBmaWxsZXIgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8xNiBpbiBwbmdfc2V0X2ZpbGxlcigpLgotICAgIChEZW5uaXMgR3VzdGFmc3NvbikKLSAgRml4ZWQgdHlwbyBpbnRyb2R1Y2VkIGluIGJldGE3OCBpbiBwbmd0ZXN0LmMgKCIjaWYgZGVmICIgc2hvdWxkIGJlICIjaWZkZWYgIikKLQotVmVyc2lvbiAxLjQuMGJldGE4MSBbU2VwdGVtYmVyIDIzLCAyMDA5XQotICBFbGltaW5hdGVkIHVudXNlZCBQTkdfRkxBR19GUkVFXyogZGVmaW5lcyBmcm9tIHBuZ3ByaXYuaAotICBFeHBhbmRlZCBUQUIgY2hhcmFjdGVycyBpbiBwbmdydHJhbi5jCi0gIFJlbW92ZWQgUE5HX0NPTlNUIGZyb20gYWxsICJQTkdfQ09OU1QgUE5HX0NITksiIGRlY2xhcmF0aW9ucyB0byBhdm9pZAotICAgIGNvbXBpbGVyIGNvbXBsYWludHMgYWJvdXQgZG91Ymx5IGRlY2xhcmluZyB0aGluZ3MgImNvbnN0Ii4KLSAgQ2hhbmdlZCBhbGwgIiNpZiBbIV1kZWZpbmVkKFgpIiB0byAiaWZbbl1kZWYgWCIgd2hlcmUgcG9zc2libGUuCi0gIEVsaW1pbmF0ZWQgdW51c2VkIHBuZ19wdHItPnJvd19idWZfc2l6ZQotCi1WZXJzaW9uIDEuNC4wYmV0YTgyIFtTZXB0ZW1iZXIgMjUsIDIwMDldCi0gIE1vdmVkIHJlZHVuZGFudCBJSERSIGNoZWNraW5nIGludG8gbmV3IHBuZ19jaGVja19JSERSKCkgaW4gcG5nLmMKLSAgICBhbmQgcmVwb3J0IGFsbCBlcnJvcnMgZm91bmQgaW4gdGhlIElIRFIgZGF0YS4KLSAgRWxpbWluYXRlZCB1c2VsZXNzIGNhbGwgdG8gcG5nX2NoZWNrX2NIUk0oKSBmcm9tIHBuZ3NldC5jCi0KLVZlcnNpb24gMS40LjBiZXRhODMgW1NlcHRlbWJlciAyNSwgMjAwOV0KLSAgUmV2aXNlZCBwbmdfY2hlY2tfSUhEUigpIHRvIGVsaW1pbmF0ZSBib2d1cyBjb21wbGFpbnQgYWJvdXQgZmlsdGVyX3R5cGUuCi0KLVZlcnNpb24gMS40LjBiZXRhODQgW1NlcHRlbWJlciAzMCwgMjAwOV0KLSAgRml4ZWQgc29tZSBpbmNvbnNpc3RlbnQgaW5kZW50YXRpb24gaW4gcG5nY29uZi5oCi0gIFJldmlzZWQgcG5nX2NoZWNrX0lIRFIoKSB0byBhZGQgYSB0ZXN0IGZvciB3aWR0aCB2YXJpYWJsZSBsZXNzIHRoYW4gMzItYml0LgotCi1WZXJzaW9uIDEuNC4wYmV0YTg1IFtPY3RvYmVyIDEsIDIwMDldCi0gIFJldmlzZWQgcG5nX2NoZWNrX0lIRFIoKSBhZ2FpbiwgdG8gY2hlY2sgaW5mb19wdHIgbWVtYmVycyBpbnN0ZWFkIG9mCi0gICAgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXR1cm5lZCBwYXJhbWV0ZXJzLgotCi1WZXJzaW9uIDEuNC4wYmV0YTg2IFtPY3RvYmVyIDksIDIwMDldCi0gIFVwZGF0ZWQgdGhlICJ4Y29kZSIgcHJvamVjdCAoQWxhbSBBcmlhcykuCi0gIEVsaW1pbmF0ZWQgYSBzaGFkb3dlZCBkZWNsYXJhdGlvbiBvZiAicHAiIGluIHBuZ19oYW5kbGVfc1BMVCgpLgotCi1WZXJzaW9uIDEuNC4wcmMwMSBbT2N0b2JlciAxOSwgMjAwOV0KLSAgVHJpdmlhbCBjb3NtZXRpYyBjaGFuZ2VzLgotCi1WZXJzaW9uIDEuNC4wYmV0YTg3IFtPY3RvYmVyIDMwLCAyMDA5XQotICBNb3ZlZCB2ZXJzaW9uIDEuNC4wIGJhY2sgaW50byBiZXRhLgotCi1WZXJzaW9uIDEuNC4wYmV0YTg4IFtPY3RvYmVyIDMwLCAyMDA5XQotICBSZXZpc2VkIGxpYnBuZyoudHh0IHNlY3Rpb24gYWJvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiAxLjIueCBhbmQgMS40LjAKLSAgICBiZWNhdXNlIG1vc3Qgb2YgdGhlIG5ldyBmZWF0dXJlcyBoYXZlIG5vdyBiZWVuIHBvcnRlZCBiYWNrIHRvIDEuMi40MQotCi1WZXJzaW9uIDEuNC4wYmV0YTg5IFtOb3ZlbWJlciAxLCAyMDA5XQotICBNb3JlIGJ1Z2ZpeGVzIGFuZCBpbXByb3ZlbWVudHMgdG8gQ01ha2VMaXN0cy50eHQgKFBoaWxpcCBMb3dtYW4pCi0gIFJlbW92ZWQgYSBoYXJtbGVzcyBleHRyYSBwbmdfc2V0X2ludmVydF9hbHBoYSgpIGZyb20gcG5nd3JpdGUuYwotICBBcHBseSBwbmdfdXNlcl9jaHVua19jYWNoZV9tYXggd2l0aGluIHBuZ19kZWNvbXByZXNzX2NodW5rKCkuCi0gIE1lcmdlZCBsaWJwbmctMS4yLjQxLnR4dCB3aXRoIGxpYnBuZy0xLjQuMC50eHQgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLVZlcnNpb24gMS40LjBiZXRhOTAgW05vdmVtYmVyIDIsIDIwMDldCi0gIFJlbW92ZWQgYWxsIHJlbWFpbmluZyBXSU4zMl9XQ0UgI2lmZGVmcyBleGNlcHQgdGhvc2UgaW52b2x2aW5nIHRoZQotICAgIHRpbWUuaCAidG0iIHN0cnVjdHVyZQotCi1WZXJzaW9uIDEuNC4wYmV0YTkxIFtOb3ZlbWJlciAzLCAyMDA5XQotICBVcGRhdGVkIHNjcmlwdHMvcG5ndzMyLmRlZiBhbmQgcHJvamVjdHMvd2luY2UvcG5nMzJjZS5kZWYKLSAgQ29waWVkIHByb2plY3RzL3dpbmNlL3BuZzMyY2UuZGVmIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeS4KLSAgQWRkZWQgc2NyaXB0cy9tYWtlZmlsZS53Y2UKLSAgUGF0Y2hlZCBsdG1haW4uc2ggZm9yIHdpbmNlIHN1cHBvcnQuCi0gIEFkZGVkIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVEIG1hY3JvLgotCi1WZXJzaW9uIDEuNC4wYmV0YTkyIFtOb3ZlbWJlciA0LCAyMDA5XQotICBNYWtlIGluY2x1c2lvbiBvZiB0aW1lLmggaW4gcG5nY29uZi5oIGRlcGVuZCBvbiBQTkdfQ09OVkVSVF90SU1FX1NVUFBPUlRFRAotICBNYWtlICNkZWZpbmUgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQgZGVwZW5kIG9uIFBOR19XUklURV90SU1FX1NVUFBPUlRFRAotICBSZXZpc2VkIGxpYnBuZyoudHh0IHRvIGRlc2NyaWJlIGRpZmZlcmVuY2VzIGZyb20gMS4yLjQwIHRvIDEuNC4wIChpbnN0ZWFkCi0gICAgb2YgZGlmZmVyZW5jZXMgZnJvbSAxLjIuNDEgdG8gMS40LjApCi0KLVZlcnNpb24gMS40LjBiZXRhOTMgW05vdmVtYmVyIDcsIDIwMDldCi0gIEFkZGVkIFBOR19ERVBTVFJVQ1QsIFBOR19ERVBSRUNBVEVELCBQTkdfVVNFX1JFU1VMVCwgUE5HX05PUkVUVVJOLCBhbmQKLSAgICBQTkdfQUxMT0NBVEVEIG1hY3JvcyB0byBkZXRlY3QgZGVwcmVjYXRlZCBkaXJlY3QgYWNjZXNzIHRvIHRoZQotICAgIHBuZ19zdHJ1Y3Qgb3IgaW5mb19zdHJ1Y3QgbWVtYmVycyBhbmQgb3RoZXIgZGVwcmVjYXRlZCB1c2FnZSBpbgotICAgIGFwcGxpY2F0aW9ucyAoSm9obiBCb3dsZXIpLgotICBVcGRhdGVkIHNjcmlwdHMvbWFrZWZpbGUqIHRvIGFkZCAiLURQTkdfQ09ORklHVVJFX0xJQlBORyIgdG8gQ0ZMQUdTLAotICAgIHRvIHByZXZlbnQgd2FybmluZ3MgYWJvdXQgZGlyZWN0IGFjY2VzcyB0byBwbmcgc3RydWN0cyBieSBsaWJwbmcKLSAgICBmdW5jdGlvbnMgd2hpbGUgYnVpbGRpbmcgbGlicG5nLiAgVGhleSBuZWVkIHRvIGJlIHRlc3RlZCwgZXNwZWNpYWxseQotICAgIHRob3NlIHVzaW5nIGNvbXBpbGVycyBvdGhlciB0aGFuIGdjYy4KLSAgVXBkYXRlZCBwcm9qZWN0cy92aXN1YWxjNiBhbmQgdmlzdWFsYzcxIHdpdGggIi9kIFBOR19DT05GSUdVUkVfTElCUE5HIi4KLSAgICBUaGV5IHNob3VsZCB3b3JrIGJ1dCBzdGlsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gcmVtb3ZlCi0gICAgcmVmZXJlbmNlcyB0byBwbmdnY2NyZC5jIG9yIHBuZ3ZjcmQuYyBhbmQgQVNNIGJ1aWxkaW5nLgotICBBZGRlZCBSRUFETUUudHh0IHRvIHRoZSBiZW9zLCBjYnVpbGRlcjUsIG5ldHdhcmUsIGFuZCB4Y29kZSBwcm9qZWN0cyB3YXJuaW5nCi0gICAgdGhhdCB0aGV5IG5lZWQgdG8gYmUgdXBkYXRlZCwgdG8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gcG5nZ2NjcmQuYyBhbmQKLSAgICBwbmd2Y3JkLmMgYW5kIHRvIGRlcGVuZCBvbiBwbmdwcml2LmgKLSAgUmVtb3ZlZCB0aHJlZSBkaXJlY3QgcmVmZXJlbmNlcyB0byByZWFkX2luZm9fcHRyIG1lbWJlcnMgaW4gcG5ndGVzdC5jCi0gICAgdGhhdCB3ZXJlIGRldGVjdGVkIGJ5IHRoZSBuZXcgUE5HX0RFUFNUUlVDVCBtYWNyby4KLSAgTW92ZWQgdGhlIHBuZ19kZWJ1ZyBtYWNybyBkZWZpbml0aW9ucyBhbmQgdGhlIHBuZ19yZWFkX2Rlc3Ryb3koKSwKLSAgICBwbmdfd3JpdGVfZGVzdHJveSgpIGFuZCBwbmdfZmFyX3RvX25lYXIoKSBwcm90b3R5cGVzIGZyb20gcG5nLmgKLSAgICB0byBwbmdwcml2LmggKEpvaG4gQm93bGVyKQotICBNb3ZlZCB0aGUgc3lub3BzaXMgbGluZXMgZm9yIHBuZ19yZWFkX2Rlc3Ryb3koKSwgcG5nX3dyaXRlX2Rlc3Ryb3koKQotICAgIHBuZ19kZWJ1ZygpLCBwbmdfZGVidWcxKCksIGFuZCBwbmdfZGVidWcyKCkgZnJvbSBsaWJwbmcuMyB0byBsaWJwbmdwZi4zLgotCi1WZXJzaW9uIDEuNC4wYmV0YTk0IFtOb3ZlbWJlciA5LCAyMDA5XQotICBSZW1vdmVkIHRoZSBvYnNvbGV0ZSwgdW51c2VkIHBuZ2djY3JkLmMgYW5kIHBuZ3ZjcmQuYyBmaWxlcy4KLSAgVXBkYXRlZCBDTWFrZUxpc3RzLnR4dCB0byBhZGQgIi1EUE5HX0NPTkZJR1VSRV9MSUJQTkciIHRvIHRoZSBkZWZpbml0aW9ucy4KLSAgUmVtb3ZlZCBkZXBlbmRlbmN5IG9mIHBuZ3Rlc3QubyBvbiBwbmdwcml2LmggaW4gdGhlIG1ha2VmaWxlcy4KLSAgT25seSAjZGVmaW5lIFBOR19ERVBTVFJVQ1QsIGV0Yy4gaW4gcG5nY29uZi5oIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0KLVZlcnNpb24gMS40LjBiZXRhOTUgW05vdmVtYmVyIDEwLCAyMDA5XQotICBDaGFuZ2VkIHBuZ19jaGVja19zaWcoKSB0byAhcG5nX3NpZ19jbXAoKSBpbiBjb250cmliIHByb2dyYW1zLgotICBBZGRlZCAtRFBOR19DT05GSUdVUkVfTElCUE5HIHRvIGNvbnRyaWIvcG5nbWlubS8qL21ha2VmaWxlCi0gIENoYW5nZWQgcG5nX2NoZWNrX3NpZygpIHRvICFwbmdfc2lnX2NtcCgpIGluIGNvbnRyaWIgcHJvZ3JhbXMuCi0gIENvcnJlY3RlZCB0aGUgcG5nX2dldF9JSERSKCkgY2FsbCBpbiBjb250cmliL2dyZWdib29rL3JlYWRwbmcyLmMKLSAgQ2hhbmdlZCBwbmdtaW5pbS8qL2dhdGhlci5zaCB0byBzdG9wIHRyeWluZyB0byByZW1vdmUgcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jCi0gIEFkZGVkIGRlcGVuZGVuY3kgb24gcG5ncHJpdi5oIGluIGNvbnRyaWIvcG5nbWluaW0vKi9tYWtlZmlsZQotCi1WZXJzaW9uIDEuNC4wYmV0YTk2IFtOb3ZlbWJlciAxMiwgMjAwOV0KLSAgUmVuYW1lZCBzY3JpcHRzL21ha2VmaWxlLndjZSB0byBzY3JpcHRzL21ha2VmaWxlLmNlZ2NjCi0gIFJldmlzZWQgTWFrZWZpbGUuYW0gdG8gdXNlIGxpYnBuZy5zeXMgd2hpbGUgYnVpbGRpbmcgbGlicG5nLnNvCi0gICAgc28gdGhhdCBvbmx5IFBOR19FWFBPUlQgZnVuY3Rpb25zIGFyZSBleHBvcnRlZC4KLSAgUmVtb3ZlZCB0aGUgZGVwcmVjYXRlZCBwbmdfY2hlY2tfc2lnKCkgZnVuY3Rpb24vbWFjcm8uCi0gIFJlbW92ZWQgcmVjZW50bHkgcmVtb3ZlZCBmdW5jdGlvbiBuYW1lcyBmcm9tIHNjcmlwdHMvKi5kZWYKLSAgUmV2aXNlZCBwbmd0ZXN0LnBuZyB0byBwdXQgY2h1bmtzIGluIHRoZSBzYW1lIG9yZGVyIHdyaXR0ZW4gYnkgcG5ndGVzdAotICAgIChldmlkZW50bHkgdGhlIHNhbWUgY2hhbmdlIG1hZGUgaW4gbGlicG5nLTEuMGJldGE1NCB3YXMgbG9zdCkuCi0gIEFkZGVkIFBOR19QUklWQVRFIG1hY3JvIGRlZmluaXRpb24gaW4gcG5nY29uZi5oIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlLgotCi1WZXJzaW9uIDEuNC4wYmV0YTk3IFtOb3ZlbWJlciAxMywgMjAwOV0KLSAgUmVzdG9yZWQgcG5ndGVzdC5wbmcgdG8gdGhlIGxpYnBuZy0xLjQuMGJldGE3IHZlcnNpb24uCi0gIFJlbW92ZWQgcHJvamVjdHMvYmVvcyBhbmQgbmV0d2FyZS50eHQ7IG5vIG9uZSBzZWVtcyB0byBiZSBzdXBwb3J0aW5nIHRoZW0uCi0gIFJldmlzZWQgTWFrZWZpbGUuaW4KLQotVmVyc2lvbiAxLjQuMGJldGE5OCBbTm92ZW1iZXIgMTMsIDIwMDldCi0gIEFkZGVkIHRoZSAieGNvZGUiIHByb2plY3QgdG8gemlwIGRpc3RyaWJ1dGlvbnMsCi0gIEZpeGVkIGEgdHlwbyBpbiBzY3JpcHRzL3BuZ3dpbi5kZWYgaW50cm9kdWNlZCBpbiBiZXRhOTcuCi0KLVZlcnNpb24gMS40LjBiZXRhOTkgW05vdmVtYmVyIDE0LCAyMDA5XQotICBNb3ZlZCBsaWJwbmctY29uZmlnLmluIGFuZCBsaWJwbmcucGMtY29uZmlndXJlLmluIG91dCBvZiB0aGUgc2NyaXB0cwotICAgIGRpcmVjdG9yeSwgdG8gbGlicG5nLWNvbmZpZy5pbiBhbmQgbGlicG5nLXBjLmluLCByZXNwZWN0aXZlbHksIGFuZAotICAgIG1vZGlmaWVkIE1ha2VmaWxlLmFtIGFuZCBjb25maWd1cmUuYWMgYWNjb3JkaW5nbHkuICBOb3cgImNvbmZpZ3VyZSIKLSAgICBuZWVkcyBub3RoaW5nIGZyb20gdGhlICJzY3JpcHRzIiBkaXJlY3RvcnkuCi0gIEF2b2lkIHJlZGVmaW5pbmcgUE5HX0NPTlNUIGluIHBuZ2NvbmYuaAotCi1WZXJzaW9uIDEuNC4wYmV0YTEwMCBbTm92ZW1iZXIgMTQsIDIwMDldCi0gIFJlbW92ZWQgQVNNIGJ1aWxkcyBmcm9tIHByb2plY3RzL3Zpc3VhbGM2IGFuZCBwcm9qZWN0cy92aXN1YWxjNzEKLSAgUmVtb3ZlZCBzY3JpcHRzL21ha2VmaWxlLm5vbW14IGFuZCBtYWtlZmlsZS52Y2F3aW4zMgotICBSZXZpc2VkIENNYWtlTGlzdHMudHh0IHRvIGFjY291bnQgZm9yIG5ldyBsb2NhdGlvbiBvZiBsaWJwbmctY29uZmlnLmluCi0gICAgYW5kIGxpYnBuZy1wYy5pbgotICBVcGRhdGVkIElOU1RBTEwgdG8gcmVmbGVjdCByZW1vdmFsIGFuZCByZWxvY2F0aW9uIG9mIGZpbGVzLgotCi1WZXJzaW9uIDEuNC4wYmV0YTEwMSBbTm92ZW1iZXIgMTQsIDIwMDldCi0gIFJlc3RvcmVkIHRoZSBiaW5hcnkgZmlsZXMgKCouanBnLCAqLnBuZywgc29tZSBwcm9qZWN0IGZpbGVzKSB0aGF0IHdlcmUKLSAgICBhY2NpZGVudGFsbHkgZGVsZXRlZCBmcm9tIHRoZSB6aXAgYW5kIDd6IGRpc3RyaWJ1dGlvbnMgd2hlbiB0aGUgeGNvZGUKLSAgICBwcm9qZWN0IHdhcyBhZGRlZC4KLQotVmVyc2lvbiAxLjQuMGJldGExMDIgW05vdmVtYmVyIDE4LCAyMDA5XQotICBBZGRlZCBsaWJwbmctY29uZmlnLmluIGFuZCBsaWJwbmctcGMuaW4gdG8gdGhlIHppcCBhbmQgN3ogZGlzdHJpYnV0aW9ucy4KLSAgRml4ZWQgYSB0eXBvIGluIHByb2plY3RzL3Zpc3VhbGM2L3BuZ3Rlc3QuZHNwLCBpbnRyb2R1Y2VkIGluIGJldGExMDAuCi0gIE1vdmVkIGRlc2NyaXB0aW9ucyBvZiBtYWtlZmlsZXMgYW5kIG90aGVyIHNjcmlwdHMgb3V0IG9mIElOU1RBTEwgaW50bwotICAgIHNjcmlwdHMvUkVBRE1FLnR4dAotICBVcGRhdGVkIHRoZSBjb3B5cmlnaHQgeWVhciBpbiBzY3JpcHRzL3BuZ3dpbi5yYyBmcm9tIDIwMDYgdG8gMjAwOS4KLQotVmVyc2lvbiAxLjQuMGJldGExMDMgW05vdmVtYmVyIDIxLCAyMDA5XQotICBSZW1vdmVkIG9ic29sZXRlIGNvbW1lbnRzIGFib3V0IEFTTSBmcm9tIHByb2plY3RzL3Zpc3VhbGM3MS9SRUFETUVfemxpYi50eHQKLSAgQWxpZ24gcm93X2J1ZiBvbiAxNi1ieXRlIGJvdW5kYXJ5IGluIG1lbW9yeS4KLSAgUmVzdG9yZWQgdGhlIFBOR19XUklURV9GTFVTSF9BRlRFUl9JRU5EX1NVUFBPUlRFRCBndWFyZCBhcm91bmQgdGhlIGNhbGwKLSAgICB0byBwbmdfZmx1c2goKSBhZnRlciBwbmdfd3JpdGVfSUVORCgpLiAgU2VlIDEuNC4wYmV0YTMyLCAxLjQuMGJldGE1MAotICAgIGNoYW5nZXMgYWJvdmUgYW5kIDEuMi4zMCwgMS4yLjMwcmMwMSBhbmQgcmMwMyBpbiAxLjIuNDEgQ0hBTkdFUy4gIFNvbWVvbmUKLSAgICBuZWVkcyB0aGlzIGZlYXR1cmUuCi0gIE1ha2UgdGhlICdwbmdfam1wYnVmJyBtYWNybyBleHBhbmQgdG8gYSBjYWxsIHRoYXQgcmVjb3JkcyB0aGUgY29ycmVjdAotICAgIGxvbmdqbXAgZnVuY3Rpb24gYXMgd2VsbCBhcyByZXR1cm5pbmcgYSBwb2ludGVyIHRvIHRoZSBzZXRqbXAKLSAgICBqbXBfYnVmIGJ1ZmZlciwgYW5kIG1hcmtlZCBkaXJlY3QgYWNjZXNzIHRvIGptcGJ1ZiAnZGVwcmVjYXRlZCcuCi0gICAgKEpvaG4gQm93bGVyKQotCi1WZXJzaW9uIDEuNC4wYmV0YTEwNCBbTm92ZW1iZXIgMjIsIDIwMDldCi0gIFJlbW92ZWQgcG5nX2xvbmdqbXBfcHRyIGZyb20gc2NyaXB0cy8qLmRlZiBhbmQgbGlicG5nLjMKLSAgUmVidWlsdCBjb25maWd1cmUgc2NyaXB0cyB3aXRoIGF1dG9jb25mLTIuNjUKLQotVmVyc2lvbiAxLjQuMGJldGExMDUgW05vdmVtYmVyIDI1LCAyMDA5XQotICBVc2UgZmFzdCBpbnRlZ2VyIFBOR19ESVZJREVfQllfMjU1KCkgb3IgUE5HX0RJVklERV9CWV82NTUzNSgpCi0gICAgdG8gYWNjb21wbGlzaCBhbHBoYSBwcmVtdWx0aXBsaWNhdGlvbiB3aGVuCi0gICAgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRCBpcyBkZWZpbmVkLgotICBDaGFuZ2VkICIvMjU1IiB0byAiLzI1NS4wIiBpbiBiYWNrZ3JvdW5kIGNhbGN1bGF0aW9ucyB0byBtYWtlIGl0IGNsZWFyCi0gICAgdGhhdCB0aGUgMjU1IGlzIHVzZWQgYXMgYSBkb3VibGUuCi0KLVZlcnNpb24gMS40LjBiZXRhMTA2IFtOb3ZlbWJlciAyNywgMjAwOV0KLSAgUmVtb3ZlZCBwcmVtdWx0aXBsaWVkIGFscGhhIGZlYXR1cmUuCi0KLVZlcnNpb24gMS40LjBiZXRhMTA3IFtEZWNlbWJlciA0LCAyMDA5XQotICBVcGRhdGVkIFJFQURNRQotICBBZGRlZCAiI2RlZmluZSBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MiIGluIHRoZSBsaWJwbmcgc291cmNlIGZpbGVzLgotICBSZW1vdmVkICItRFBOR19DT05GSUdVUkVfTElCUE5HIiBmcm9tIHRoZSBtYWtlZmlsZXMgYW5kIHByb2plY3RzLgotICBSZXZpc2VkIHNjcmlwdHMvbWFrZWZpbGUubmV0YnNkLCBtYWtlZmlsZS5vcGVuYnNkLCBhbmQgbWFrZWZpbGUuc2NvCi0gICAgdG8gcHV0IHBuZy5oIGFuZCBwbmdjb25mLmggaW4gJHByZWZpeC9pbmNsdWRlLCBsaWtlIHRoZSBvdGhlciBzY3JpcHRzLAotICAgIGluc3RlYWQgb2YgaW4gJHByZWZpeC9pbmNsdWRlL2xpYnBuZy4gIEFsc28gcmV2aXNlZCBtYWtlZmlsZS5zY28KLSAgICB0byBwdXQgdGhlbSBpbiAkcHJlZml4L2luY2x1ZGUvbGlicG5nMTUgaW5zdGVhZCBvZiBpbgotICAgICRwcmVmaXgvaW5jbHVkZS9saWJwbmcvbGlicG5nMTUuCi0KLVZlcnNpb24gMS40LjBiZXRhMTA4IFtEZWNlbWJlciAxMSwgMjAwOV0KLSAgUmVtb3ZlZCBsZWZ0b3ZlciAiLURQTkdfQ09ORklHVVJFX0xJQlBORyIgZnJvbSBjb250cmliL3BuZ21pbmltLyovbWFrZWZpbGUKLSAgUmVsb2NhdGVkIHBuZ19kb19jaG9wKCkgdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uIGluIHBuZ3J0cmFuLmM7IHRoZQotICAgIGNoYW5nZSBpbiB2ZXJzaW9uIDEuMi40MWJldGEwOCBjYXVzZWQgdHJhbnNwYXJlbmN5IHRvIGJlIGhhbmRsZWQgd3JvbmcKLSAgICBpbiBzb21lIDE2LWJpdCBkYXRhc3RyZWFtcyAoWXVzYWt1IFN1Z2FpKS4KLQotVmVyc2lvbiAxLjQuMGJldGExMDkgW0RlY2VtYmVyIDEzLCAyMDA5XQotICBBZGRlZCAiYml0X2RlcHRoIiBwYXJhbWV0ZXIgdG8gdGhlIHByaXZhdGUgcG5nX2J1aWxkX2dhbW1hX3RhYmxlKCkgZnVuY3Rpb24uCi0gIFBhc3MgYml0X2RlcHRoPTggdG8gcG5nX2J1aWxkX2dhbW1hX3RhYmxlKCkgd2hlbiBiaXRfZGVwdGggaXMgMTYgYnV0IHRoZQotICAgIFBOR18xNl9UT184IHRyYW5zZm9ybSBoYXMgYmVlbiBzZXQsIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJ1aWxkIG9mIDE2LWJpdAotICAgIHRhYmxlcy4KLQotVmVyc2lvbiAxLjQuMHJjMDIgW0RlY2VtYmVyIDIwLCAyMDA5XQotICBEZWNsYXJlZCBwbmdfY2xlYW51cF9uZWVkZWQgInZvbGF0aWxlIiBpbiBwbmdyZWFkLmMgYW5kIHBuZ3dyaXRlLmMKLQotVmVyc2lvbiAxLjQuMHJjMDMgW0RlY2VtYmVyIDIyLCAyMDA5XQotICBSZW5hbWVkIGxpYnBuZy1wYy5pbiBiYWNrIHRvIGxpYnBuZy5wYy5pbiBhbmQgcmV2aXNlZCBDTWFrZUxpc3RzLnR4dAotICAgIChyZXZpc2luZyB0aGUgY2hhbmdlIGluIDEuNC4wYmV0YTk5KQotCi1WZXJzaW9uIDEuNC4wcmMwNCBbRGVjZW1iZXIgMjUsIDIwMDldCi0gIFN3YXBwZWQgUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCBhbmQgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotICAgIGluIHBuZ3NldC5jIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBjaGFuZ2VzIGluIHZlcnNpb24gMS4yLjM4LgotCi1WZXJzaW9uIDEuNC4wcmMwNSBbRGVjZW1iZXIgMjUsIDIwMDldCi0gIENoYW5nZWQgImxpYnBuZy1wYy5pbiIgdG8gImxpYnBuZy5wYy5pbiIgaW4gY29uZmlndXJlLmFjLCBjb25maWd1cmUsIGFuZAotICAgIE1ha2VmaWxlLmluIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBjaGFuZ2VzIGluIGxpYnBuZy0xLjQuMHJjMDMKLQotVmVyc2lvbiAxLjQuMHJjMDYgW0RlY2VtYmVyIDI5LCAyMDA5XQotICBSZXZlcnRlZCB0aGUgZ2FtbWFfdGFibGUgY2hhbmdlcyBmcm9tIGxpYnBuZy0xLjQuMGJldGExMDkuCi0gIEZpeGVkIHNvbWUgaW5kZW50YXRpb24gZXJyb3JzLgotCi1WZXJzaW9uIDEuNC4wcmMwNyBbSmFudWFyeSAxLCAyMDEwXQotICBSZXZpc2VkIGxpYnBuZyoudHh0IGFuZCBsaWJwbmcuMyBhYm91dCAxLjIueC0+MS40LnggZGlmZmVyZW5jZXMuCi0gIFVzZSBwbmdfY2FsbG9jKCkgaW5zdGVhZCBvZiBwbmdfbWFsbG9jKCk7IHBuZ19tZW1zZXQoKSBpbiBwbmdydXRpbC5jCi0gIFVwZGF0ZSBjb3B5cmlnaHQgeWVhciB0byAyMDEwLgotCi1WZXJzaW9uIDEuNC4wcmMwOCBbSmFudWFyeSAyLCAyMDEwXQotICBBdm9pZCBkZXByZWNhdGVkIHJlZmVyZW5jZXMgdG8gcG5nX3B0ci1pb19wdHIgYW5kIHBuZ19wdHItPmVycm9yX3B0cgotICAgIGluIHBuZ3Rlc3QuYwotCi1WZXJzaW9uIDEuNC4wIFtKYW51YXJ5IDMsIDIwMTBdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS40LjFiZXRhMDEgW0phbnVhcnkgOCwgMjAxMF0KLSAgVXBkYXRlZCBDTWFrZUxpc3RzLnR4dCBmb3IgY29uc2lzdGVudCBpbmRlbnRhdGlvbiBhbmQgdG8gYXZvaWQgYW4KLSAgICB1bmNsb3NlZCBpZi1zdGF0ZW1lbnQgd2FybmluZyAoUGhpbGlwIExvd21hbikuCi0gIFJldmlzZWQgTWFrZWZpbGUuYW0gYW5kIE1ha2VmaWxlLmluIHRvIHJlbW92ZSByZWZlcmVuY2VzIHRvIFkyS0lORk8sCi0gICAgS05PV05CVUcsIGFuZCBsaWJwbmcubGEgKFJvYmVydCBTY2h3ZWJlbCkuCi0gIFJldmlzZWQgdGhlIG1ha2VmaWxlcyB0byBpbnN0YWxsIHRoZSBzYW1lIGZpbGVzIGFuZCBzeW1ib2xpYwotICAgIGxpbmtzIGFzIGNvbmZpZ3VyZSwgZXhjZXB0IGZvciBsaWJwbmcubGEgYW5kIGxpYnBuZzE0LmxhLgotICBNYWtlIHBuZ19zZXR8Z2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKCkgYXZhaWxhYmxlIGV2ZW4gd2hlbgotICAgIFBOR19XUklURV9TVVBQT1JURUQgaXMgbm90IGVuYWJsZWQuCi0gIFJldmlzZWQgTWFrZWZpbGUuYW0gYW5kIE1ha2VmaWxlLmluIHRvIHNpbXBsaWZ5IHRoZWlyIG1haW50ZW5hbmNlLgotICBSZXZpc2VkIHNjcmlwdHMvbWFrZWZpbGUubGludXggdG8gaW5zdGFsbCBhIGxpbmsgdG8gbGlicG5nMTQuc28uMTQuMQotCi1WZXJzaW9uIDEuNC4xYmV0YTAyIFtKYW51YXJ5IDksIDIwMTBdCi0gIFJldmlzZWQgdGhlIHJlc3Qgb2YgdGhlIG1ha2VmaWxlcyB0byBpbnN0YWxsIGEgbGluayB0byBsaWJwbmcxNC5zby4xNC4xCi0KLVZlcnNpb24gMS40LjFiZXRhMDMgW0phbnVhcnkgMTAsIDIwMTBdCi0gIFJlbW92ZWQgcG5nX3NldF9wcmVtdWx0aXBseV9hbHBoYSgpIGZyb20gc2NyaXB0cy8qLmRlZgotCi1WZXJzaW9uIDEuNC4xcmMwMSBbSmFudWFyeSAxNiwgMjAxMF0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjQuMWJldGEwNCBbSmFudWFyeSAyMywgMjAxMF0KLSAgUmV2aXNlZCBwbmdfZGVjb21wcmVzc19jaHVuaygpIHRvIGltcHJvdmUgc3BlZWQgYW5kIG1lbW9yeSB1c2FnZSB3aGVuCi0gICAgZGVjb2RpbmcgbGFyZ2UgY2h1bmtzLgotICBBZGRlZCBwbmdfc2V0fGdldF9jaHVua19tYWxsb2NfbWF4KCkgZnVuY3Rpb25zLgotCi1WZXJzaW9uIDEuNC4xYmV0YTA1IFtKYW51YXJ5IDI2LCAyMDEwXQotICBSZWxvY2F0ZWQgImludCBrIiBkZWNsYXJhdGlvbiBpbiBwbmd0ZXN0LmMgdG8gbWluaW1pemUgaXRzIHNjb3BlLgotCi1WZXJzaW9uIDEuNC4xYmV0YTA2IFtKYW51YXJ5IDI4LCAyMDEwXQotICBSZXZpc2VkIHBuZ19kZWNvbXByZXNzX2NodW5rKCkgdG8gdXNlIGEgdHdvLXBhc3MgbWV0aG9kIHN1Z2dlc3RlZCBieQotICAgIEpvaG4gQm93bGVyLgotCi1WZXJzaW9uIDEuNC4xYmV0YTA3IFtGZWJydWFyeSA2LCAyMDEwXQotICBGb2xkZWQgc29tZSBsb25nIGxpbmVzIGluIHRoZSBzb3VyY2UgZmlsZXMuCi0gIEFkZGVkIGRlZmluZWFibGUgUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYLCBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYLAotICAgIGFuZCBhIFBOR19VU0VSX0xJTUlUU19TVVBQT1JURUQgZmxhZy4KLSAgRWxpbWluYXRlZCB1c2Ugb2YgcG5nX3B0ci0+aXJvd2J5dGVzIGFuZCByZXVzZWQgdGhlIHNsb3QgaW4gcG5nX3B0ciBhcwotICAgIHBuZ19wdHItPnBuZ191c2VyX2NodW5rX21hbGxvY19tYXguCi0gIFJldmlzZWQgcG5nX3B1c2hfc2F2ZV9idWZmZXIoKSB0byBkbyBmZXdlciBidXQgbGFyZ2VyIHBuZ19tYWxsb2MoKSBjYWxscy4KLQotVmVyc2lvbiAxLjQuMWJldGEwOCBbRmVicnVhcnkgNiwgMjAxMF0KLSAgTWlub3IgY2xlYW51cCBhbmQgdXBkYXRpbmcgb2YgZGF0ZXMgYW5kIGNvcHlyaWdodCB5ZWFyLgotCi1WZXJzaW9uIDEuNS4wYmV0YTAxIFtGZWJydWFyeSA3LCAyMDEwXQotICBNb3ZlZCBkZWNsYXJhdGlvbiBvZiBwbmdfc3RydWN0IGludG8gcHJpdmF0ZSBwbmdzdHJ1Y3QuaCBhbmQgcG5nX2luZm8KLSAgICBpbnRvIHBuZ2luZm8uaAotCi1WZXJzaW9uIDEuNC4xYmV0YTA5IGFuZCAxLjUuMGJldGEwMiBbRmVicnVhcnkgNywgMjAxMF0KLSAgUmV2ZXJ0ZWQgdG8gb3JpZ2luYWwgcG5nX3B1c2hfc2F2ZV9idWZmZXIoKSBjb2RlLgotCi1WZXJzaW9uIDEuNC4xYmV0YTEwIGFuZCAxLjUuMGJldGEwMyBbRmVicnVhcnkgOCwgMjAxMF0KLSAgUmV0dXJuIGFsbG9jYXRlZCAib2xkX2J1ZmZlciIgaW4gcG5nX3B1c2hfc2F2ZV9idWZmZXIoKSBiZWZvcmUKLSAgICBjYWxsaW5nIHBuZ19lcnJvcigpLCB0byBhdm9pZCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4KLSAgVXBkYXRlZCBjb25maWd1cmUgc2NyaXB0IHRvIHVzZSBTTyBudW1iZXIgMTUuCi0KLVZlcnNpb24gMS41LjBiZXRhMDQgW0ZlYnJ1YXJ5IDksIDIwMTBdCi0gIFJlbW92ZWQgbWFsZm9ybWVkICJpbmNvbXBsZXRlIHN0cnVjdCBkZWNsYXJhdGlvbiIgb2YgcG5nX2luZm8gZnJvbSBwbmcuaAotCi1WZXJzaW9uIDEuNS4wYmV0YTA1IFtGZWJydWFyeSAxMiwgMjAxMF0KLSAgUmVtb3ZlZCBQTkdfREVQU1RSVUNUIG1hcmt1cCBpbiBwbmdzdHJ1Y3QuaCBhbmQgcG5naW5mby5oLCBhbmQgdW5kaWQgdGhlCi0gICAgbGluZXdyYXBwaW5nIHRoYXQgaXQgZW50YWlsZWQuCi0gIFJldmlzZWQgY29tbWVudHMgaW4gcG5nc3RydWN0LmggYW5kIHBuZ2luZm8uaCBhbmQgYWRkZWQgcG9pbnRlcnMgdG8KLSAgICB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gIENoYW5nZWQgUE5HX0lOVEVSTkFMIHRvIFBOR19FWFBPU0VfSU5URVJOQUxfU1RSVUNUVVJFUwotICBSZW1vdmVkIHRoZSBjYnVpbGRlcjUgcHJvamVjdCwgd2hpY2ggaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gMS40LjAuCi0KLVZlcnNpb24gMS40LjFiZXRhMTIgYW5kIDEuNS4wYmV0YTA2IFtGZWJydWFyeSAxNCwgMjAxMF0KLSAgRml4ZWQgdHlwZSBkZWNsYXJhdGlvbiBvZiBwbmdfZ2V0X2NodW5rX21hbGxvY19tYXgoKSBpbiBwbmdnZXQuYyAoRGFpc3VrZQotICAgIE5pc2hpa2F3YSkKLQotVmVyc2lvbiAxLjUuMGJldGEwNyBbb21pdHRlZF0KLQotVmVyc2lvbiAxLjUuMGJldGEwOCBbRmVicnVhcnkgMTksIDIwMTBdCi0gIENoYW5nZWQgI2lmZGVmIFBOR19OT19TVERJT19TVVBQT1JURUQgdG8gI2lmZGVmIFBOR19OT19DT05TT0xFX0lPX1NVUFBPUlRFRAotICAgIHdoZXJldmVyIHBuZ19zbnByaW50ZigpIGlzIHVzZWQgdG8gY29uc3RydWN0IGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgotICBOb3RlZCBpbiBzY3JpcHRzL21ha2VmaWxlLm1pbmd3IHRoYXQgaXQgZXhwZWN0cyB0byBiZSBydW4gdW5kZXIgTVNZUy4KLSAgUmVtb3ZlZCBvYnNvbGV0ZSB1bnVzZWQgTU1YLXF1ZXJ5aW5nIHN1cHBvcnQgZnJvbSBjb250cmliL2dyZWdib29rCi0gIEFkZGVkIGV4cG9ydGVkIHBuZ19sb25nam1wKCkgZnVuY3Rpb24uCi0gIFJlbW92ZWQgdGhlIEFJWCByZWRlZmluaXRpb24gb2Ygam1wYnVmIGluIHBuZy5oCi0gIEFkZGVkIC1EX0FMTFNPVVJDRSBpbiBjb25maWd1cmUuYWMsIG1ha2VmaWxlLmFpeCwgYW5kIENNYWtlTGlzdHMudHh0Ci0gICAgd2hlbiBidWlsZGluZyBvbiBBSVguCi0KLVZlcnNpb24gMS41LjBiZXRhMDkgW0ZlYnJ1YXJ5IDE5LCAyMDEwXQotICBSZW1vdmVkIC1EX0FMTFNPVVJDRSBmcm9tIGNvbmZpZ3VyZS5hYywgbWFrZWZpbGUuYWl4LCBhbmQgQ01ha2VMaXN0cy50eHQuCi0gIENoYW5nZWQgdGhlIG5hbWUgb2YgcG5nX3B0ci0+am1wYnVmIHRvIHBuZ19wdHItPnBuZ19qbXBidWYgaW4gcG5nc3RydWN0LmgKLQotVmVyc2lvbiAxLjUuMGJldGExMCBbRmVicnVhcnkgMjUsIDIwMTBdCi0gIFJlbW92ZWQgdW51c2VkIGd6aW8uYyBmcm9tIGNvbnRyaWIvcG5nbWluaW0gZ2F0aGVyIGFuZCBtYWtlZmlsZSBzY3JpcHRzCi0gIFJlbW92ZWQgcmVwbGFjZW1lbnQgZXJyb3IgaGFuZGxlcnMgZnJvbSBjb250cmliL2dyZWdib29rLiAgQmVjYXVzZSBvZgotICAgIHRoZSBuZXcgcG5nX2xvbmdqbXAoKSBmdW5jdGlvbiB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLgotCi1WZXJzaW9uIDEuNS4wYmV0YTExIFtNYXJjaCA2LCAyMDEwXQotICBSZW1vdmVkIGNoZWNraW5nIGZvciBhbHJlYWR5LWluY2x1ZGVkIHNldGptcC5oIGZyb20gcG5nY29uZi5oCi0gIEZpeGVkIGluY29uc2lzdGVudCBpbmRlbnRhdGlvbnMgYW5kIG1hZGUgbnVtZXJvdXMgY29zbWV0aWMgY2hhbmdlcy4KLSAgUmV2aXNlZCB0aGUgIlNFRSBBTFNPIiBzdHlsZSBvZiBsaWJwbmcuMywgbGlicG5ncGYuMywgYW5kIHBuZy41Ci0KLVZlcnNpb24gMS41LjBiZXRhMTIgW01hcmNoIDksIDIwMTBdCi0gIE1vdmVkICIjaW5jbHVkZSBwbmcuaCIgaW5zaWRlIHBuZ3ByaXYuaCBhbmQgcmVtb3ZlZCAiI2luY2x1ZGUgcG5nLmgiIGZyb20KLSAgICB0aGUgc291cmNlIGZpbGVzLCBhbG9uZyB3aXRoICIjZGVmaW5lIFBOR19FWFBPU0VfSU5URVJOQUxfU1RSVUNUVVJFUyIKLSAgICBhbmQgIiNkZWZpbmUgUE5HX05PX1BFREFOVElDX1dBUk5JTkdTIiAoSm9obiBCb3dsZXIpLgotICBDcmVhdGVkIG5ldyBwbmdkZWJ1Zy5oIGFuZCBtb3ZlZCBkZWJ1ZyBkZWZpbml0aW9ucyB0aGVyZS4KLQotVmVyc2lvbiAxLjUuMGJldGExMyBbTWFyY2ggMTAsIDIwMTBdCi0gIFByb3RlY3QgcG5nc3RydWN0LmgsIHBuZ2luZm8uaCwgYW5kIHBuZ2RlYnVnLmggZnJvbSBiZWluZyBpbmNsdWRlZCB0d2ljZS4KLSAgUmV2aXNlIHRoZSAiI2lmZGVmIiBibG9ja3MgaW4gcG5nX2luZmxhdGUoKSBzbyBpdCB3aWxsIGNvbXBpbGUgd2hlbiBuZWl0aGVyCi0gICAgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCBub3IgUE5HX1NFVF9DSFVOS19NQUxMT0NfTElNSVRfU1VQUE9SVEVECi0gICAgaXMgZGVmaW5lZC4KLSAgUmVtb3ZlZCB1bnVzZWQgcG5nX21lYXN1cmVfY29tcHJlc3NlZF9jaHVuaygpIGZyb20gcG5ncHJpdi5oIGFuZCBsaWJwbmdwZi4zCi0gIE1vdmVkIHRoZSAnY29uZmlnLmgnIHN1cHBvcnQgZnJvbSBwbmdjb25mLmggdG8gcG5ncHJpdi5oCi0gIFJlbW92ZWQgUE5HQVBJIGZyb20gdGhlIHBuZ19sb25nam1wX3B0ciB0eXBlZGVmLgotICBFbGltaW5hdGVkIGRlcGVuZGVuY2Ugb2YgcG5ndGVzdC5jIG9uIHRoZSBwcml2YXRlIHBuZ2RlYnVnLmggZmlsZS4KLSAgTWFrZSBhbGwgcG5nX2RlYnVnIG1hY3JvcyBpbnRvICp1bnRlcm1pbmF0ZWQqIHN0YXRlbWVudHMgb3IKLSAgICBleHByZXNzaW9ucyAoaS5lLiBhIHRyYWlsaW5nICc7JyBtdXN0IGFsd2F5cyBiZSBhZGRlZCkgYW5kIGNvcnJlY3QKLSAgICB0aGUgZm9ybWF0IHN0YXRlbWVudHMgaW4gdmFyaW91cyBwbmdfZGVidWcgbWVzc2FnZXMuCi0KLVZlcnNpb24gMS41LjBiZXRhMTQgW01hcmNoIDE0LCAyMDEwXQotICBSZW1vdmVkIGRpcmVjdCBhY2Nlc3MgdG8gcG5nX3B0ci0+aW9fcHRyIGZyb20gdGhlIFdpbmRvd3MgY29kZSBpbiBwbmd0ZXN0LmMKLSAgUmV2aXNlZCBNYWtlZmlsZS5hbSB0byBhY2NvdW50IGZvciByZWNlbnQgYWRkaXRpb25zIGFuZCByZXBsYWNlbWVudHMuCi0gIENvcnJlY3RlZCBDRSBhbmQgT1MvMiBERUYgZmlsZXMgKHNjcmlwdHMvcG5nKmRlZikgZm9yIHN5bWJvbHMgcmVtb3ZlZCBhbmQKLSAgICBhZGRlZCBvcmRpbmFsIG51bWJlcnMgdG8gdGhlIFdpbmRvd3MgREVGIGZpbGUgYW5kIGNvcnJlY3RlZCB0aGUgZHVwbGljYXRlZAotICAgIG9yZGluYWwgbnVtYmVycyBvbiBDRSBzeW1ib2xzIHRoYXQgYXJlIGNvbW1lbnRlZCBvdXQuCi0gIEFkZGVkIGJhY2sgaW4gZXhwb3J0IHN5bWJvbHMgdGhhdCBjYW4gYmUgcHJlc2VudCBpbiB0aGUgV2luZG93cyBidWlsZCBidXQKLSAgICBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4KLSAgUE5HX0VYUE9SVCBjaGFuZ2VkIHRvIGluY2x1ZGUgYW4gJ29yZGluYWwnIGZpZWxkIGZvciBERUYgZmlsZSBnZW5lcmF0aW9uLgotICAgIFBOR19DQUxMQkFDSyBhZGRlZCB0byBtYWtlIGNhbGxiYWNrIGRlZmluaXRpb25zIHVuaWZvcm0uICBQTkdBUEkgc3BsaXQKLSAgICBpbnRvIFBOR0NBUEkgKGJhc2UgQyBmb3JtKSwgUE5HQVBJIChleHBvcnRzKSBhbmQgUE5HQ0JBUEkgKGNhbGxiYWNrcyksCi0gICAgYW5kIGFwcHJvcHJpYXRlIGNoYW5nZXMgbWFkZSB0byBhbGwgZmlsZXMuICBDeWd3aW4gYnVpbGRzIHJlLWhpbmdlZCB0bwotICAgIGFsbG93IHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIGNoYW5nZXMgYW5kIHRvIHJlbW92ZSB0aGUgbmVlZCBmb3IgdGhlIERFRgotICAgIGZpbGUgKGZpeGVzIGJ1aWxkIG9uIEN5Z3dpbikuCi0gIEVuYWJsZWQgJ2F0dHJpYnV0ZScgd2FybmluZ3MgdGhhdCBhcmUgcmVsZXZhbnQgdG8gbGlicmFyeSBBUElzIGFuZCBjYWxsYmFja3MuCi0gIENoYW5nZWQgcnVsZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIHZhcmlvdXMgc3ltYm9sIGZpbGVzIGFuZCBhZGRlZCBhIG5ldwotICAgIHJ1bGUgZm9yIGEgREVGIGZpbGUgKHdoaWNoIGlzIGFsc28gYWRkZWQgdG8gdGhlIGRpc3RyaWJ1dGlvbikuCi0gIFVwZGF0ZWQgdGhlIHN5bWJvbCBmaWxlIGdlbmVyYXRpb24gdG8gc3RvcCBpdCBhZGRpbmcgc3B1cmlvdXMgc3BhY2VzCi0gICAgdG8gRU9MIChjb21pbmcgZnJvbSBwcmVwcm9jZXNzb3IgbWFjcm8gZXhwYW5zaW9uKS4gIEFkZGVkIGEgZmFjaWxpdHkKLSAgICB0byBqb2luIHRva2VucyBpbiB0aGUgb3V0cHV0IGFuZCByZXdyaXRlICouZGZuIHRvIHVzZSB0aGlzLgotICBFbGltaW5hdGVkIHNjcmlwdHMvKi5kZWYgaW4gZmF2b3Igb2YgbGlicG5nLmRlZjsgdXBkYXRlZCBwcm9qZWN0cy92aXN1YWxjNzEKLSAgICBhbmQgcmVtb3ZlZCBzY3JpcHRzL21ha2VmaWxlLmN5Z3dpbi4KLSAgTWFkZSBQTkdfQlVJTERfRExMIHNhZmU6IGl0IGNhbiBiZSBzZXQgd2hlbmV2ZXIgYSBETEwgaXMgYmVpbmcgYnVpbHQuCi0gIFJlbW92ZWQgdGhlIGluY2x1ZGUgb2Ygc3lzL3R5cGVzLmggLSBhcHBhcmVudGx5IHVubmVjZXNzYXJ5IG5vdyBvbiB0aGUKLSAgICBwbGF0Zm9ybXMgb24gd2hpY2ggaXQgaGFwcGVuZWQgKGFsbCBidXQgTWFjIE9TIGFuZCBSSVNDIE9TKS4KLSAgTW92ZWQgdGhlIE1hYyBPUyB0ZXN0IGludG8gcG5ncHJpdi5oICh0aGUgb25seSBwbGFjZSBpdCBpcyB1c2VkLikKLQotVmVyc2lvbiAxLjUuMGJldGExNSBbTWFyY2ggMTcsIDIwMTBdCi0gIEFkZGVkIHN5bWJvbHMuY2hrIHRhcmdldCB0byBNYWtlZmlsZS5hbSB0byB2YWxpZGF0ZSB0aGUgc3ltYm9scyBpbiBwbmcuaAotICAgIGFnYWluc3QgdGhlIG5ldyBERUYgZmlsZSBzY3JpcHRzL3N5bWJvbHMuZGVmLgotICBDaGFuZ2VkIHRoZSBkZWZhdWx0IERFRiBmaWxlIGJhY2sgdG8gcG5nd2luLmRlZi4KLSAgUmVtb3ZlZCBtYWtlZmlsZS5taW5ndy4KLSAgRWxpbWluYXRlZCBQTkdfTk9fRVhURVJOIGFuZCBQTkdfQUxMX0VYVEVSTgotCi1WZXJzaW9uIDEuNS4wYmV0YTE2IFtBcHJpbCAxLCAyMDEwXQotICBNYWtlIHBuZ190ZXh0X3N0cnVjdCBpbmRlcGVuZGVudCBvZiBQTkdfaVRYdF9TVVBQT1JURUQsIHNvIHRoYXQKLSAgICBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGluIGFsbCBjb25maWd1cmF0aW9ucy4gIFRoZSBSRUFEL1dSSVRFCi0gICAgbWFjcm9zIChQTkdfKFJFQUR8V1JJVEUpX2lUWHRfU1VQUE9SVEVEKSBzdGlsbCBmdW5jdGlvbiBhcwotICAgIGJlZm9yZSB0byBkaXNhYmxlIGNvZGUgdG8gYWN0dWFsbHkgcmVhZCBvciB3cml0ZSBpVFh0IGNodW5rcwotICAgIGFuZCBpVFh0X1NVUFBPUlRFRCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgcHJlc2VuY2Ugb2YgZWl0aGVyCi0gICAgcmVhZCBvciB3cml0ZSBzdXBwb3J0IChidXQgaXQgaXMgcHJvYmFibHkgYmV0dGVyIHRvIGNoZWNrIGZvcgotICAgIHRoZSBvbmUgYWN0dWFsbHkgcmVxdWlyZWQgLSByZWFkIG9yIHdyaXRlLikKLSAgQ29tYmluZWQgbXVsdGlwbGUgcG5nX3dhcm5pbmcoKSBjYWxscyBmb3IgYSBzaW5nbGUgZXJyb3IuCi0gIFJlc3RvcmVkIHRoZSBtYWNybyBkZWZpbml0aW9uIG9mIHBuZ19jaGVja19zaWcoKS4KLQotVmVyc2lvbiAxLjUuMGJldGExNyBbQXByaWwgMTcsIDIwMTBdCi0gIEFkZGVkIHNvbWUgIihsb25nKSIgdHlwZWNhc3RzIHRvIHByaW50ZiBjYWxscyBpbiBwbmdfaGFuZGxlX2NIUk0oKS4KLSAgRG9jdW1lbnRlZCB0aGUgZmFjdCB0aGF0IHBuZ19zZXRfZGl0aGVyKCkgd2FzIGRpc2FibGVkIHNpbmNlIGxpYnBuZy0xLjQuMC4KLSAgUmVlbmFibGVkIHBuZ19zZXRfZGl0aGVyKCkgYnV0IHJlbmFtZWQgaXQgdG8gcG5nX3NldF9xdWFudGl6ZSgpIHRvIHJlZmxlY3QKLSAgICBtb3JlIGFjY3VyYXRlbHkgd2hhdCBpdCBhY3R1YWxseSBkb2VzLiAgQXQgdGhlIHNhbWUgdGltZSwgcmVuYW1lZAotICAgIHRoZSBQTkdfRElUSEVSX1tSRUQsR1JFRU5fQkxVRV1fQklUUyBtYWNyb3MgdG8KLSAgICBQTkdfUVVBTlRJWkVfW1JFRCxHUkVFTixCTFVFXV9CSVRTLgotICBBZGRlZCBzb21lICIobG9uZykiIHR5cGVjYXN0cyB0byBwcmludGYgY2FsbHMgaW4gcG5nX2hhbmRsZV9jSFJNKCkuCi0gIEZyZWV6ZSBidWlsZC10aW1lIG9ubHkgY29uZmlndXJhdGlvbiBpbiB0aGUgYnVpbGQuCi0gICAgSW4gYWxsIHByaW9yIHZlcnNpb25zIG9mIGxpYnBuZyBtb3N0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotICAgIGNvbnRyb2xsZWQgYnkgY29tcGlsZXIgI2RlZmluZXMgaGFkIHRvIGJlIHJlcGVhdGVkIGJ5IHRoZQotICAgIGFwcGxpY2F0aW9uIGNvZGUgdGhhdCB1c2VkIGxpYnBuZy4gIFRoaXMgcGF0Y2ggY2hhbmdlcyB0aGlzCi0gICAgc28gdGhhdCBjb21waWxhdGlvbiBvcHRpb25zIHRoYXQgY2FuIG9ubHkgYmUgY2hhbmdlZCBhdCBidWlsZAotICAgIHRpbWUgYXJlIGZyb3plbiBpbiB0aGUgYnVpbGQuICBPcHRpb25zIHRoYXQgYXJlIGNvbXBpbGVyCi0gICAgZGVwZW5kZW50IChhbmQgdGhvc2UgdGhhdCBhcmUgc3lzdGVtIGRlcGVuZGVudCkgYXJlIGV2YWx1YXRlZAotICAgIGVhY2ggdGltZSAtIHBuZ2NvbmYuaCBob2xkcyB0aGVzZS4gIE9wdGlvbnMgdGhhdCBjYW4gYmUgY2hhbmdlZAotICAgIHBlci1maWxlIGluIHRoZSBhcHBsaWNhdGlvbiBhcmUgaW4gcG5nLmguICBGcm96ZW4gb3B0aW9ucyBhcmUKLSAgICBpbiB0aGUgbmV3IGluc3RhbGxlZCBoZWFkZXIgZmlsZSBwbmdsaWJjb25mLmggKEpvaG4gQm93bGVyKQotICBSZW1vdmVkIHRoZSB4Y29kZSBwcm9qZWN0IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gd29yawotICAgIHdpdGggbGlicG5nLTEuNS4wLgotICBSZW1vdmVkIHRoZSBhYmlsaXR5IHRvIGluY2x1ZGUgb3B0aW9uYWwgcG5ndXNyLmgKLQotVmVyc2lvbiAxLjUuMGJldGExOCBbQXByaWwgMTcsIDIwMTBdCi0gIFJlc3RvcmVkIHRoZSBhYmlsaXR5IHRvIGluY2x1ZGUgb3B0aW9uYWwgcG5ndXNyLmgKLSAgTW92ZWQgcmVwbGFjZW1lbnRzIGZvciBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKSBmcm9tIHRoZQotICAgIGNvbnRyaWIvcG5nbWluaW0gcHJvamVjdCB0byBwbmdlcnJvci5jLCBmb3IgdXNlIHdoZW4gd2FybmluZ3Mgb3IKLSAgICBlcnJvcnMgYXJlIGRpc2FibGVkIHZpYSBQTkdfTk9fV0FSTiBvciBQTkdfTk9fRVJST1JfVEVYVCwgdG8gYXZvaWQKLSAgICBzdG9yaW5nIHVubmVlZGVkIGVycm9yL3dhcm5pbmcgdGV4dC4KLSAgVXBkYXRlZCBjb250cmliL3BuZ21pbmltIHByb2plY3QgdG8gd29yayB3aXRoIHRoZSBuZXcgcG5nbGliY29uZi5oCi0gIEFkZGVkIHNvbWUgUE5HX05PXyogZGVmaW5lcyB0byBjb250cmliL3BuZ21pbmltLyovcG5ndXNyLmggdG8gc2F2ZSBzcGFjZS4KLQotVmVyc2lvbiAxLjUuMGJldGExOSBbQXByaWwgMjQsIDIwMTBdCi0gIEFkZGVkIFBOR197UkVBRCxXUklURX1fSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQuICBUaGlzIGFsbG93cyB0aGUgZnVuY3Rpb25zCi0gICAgdG8gcmVhZCBhbmQgd3JpdGUgaW50cyB0byBiZSBkaXNhYmxlZCBpbmRlcGVuZGVudGx5IG9mIFBOR19VU0VfUkVBRF9NQUNST1MsCi0gICAgd2hpY2ggYWxsb3dzIGxpYnBuZyB0byBiZSBidWlsdCB3aXRoIHRoZSBmdW5jdGlvbnMgZXZlbiB0aG91Z2ggdGhlIGRlZmF1bHQKLSAgICBpcyB0byB1c2UgdGhlIG1hY3JvcyAtIHRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBjaG9vc2UgYXQgYXBwIGJ1aWxkCi0gICAgdGltZSB3aGV0aGVyIG9yIG5vdCB0byB1c2UgbWFjcm9zIChwcmV2aW91c2x5IGltcG9zc2libGUgYmVjYXVzZSB0aGUKLSAgICBmdW5jdGlvbnMgd2VyZW4ndCBpbiB0aGUgZGVmYXVsdCBidWlsZC4pCi0gIENoYW5nZWQgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb24gYmFjayB0byBfX2NkZWNsIGZvciBBUEkgZnVuY3Rpb25zLgotICAgIEZvciBXaW5kb3dzL3g4NiBwbGF0Zm9ybXMgb25seToKLSAgICAgIF9fc3RkY2FsbCBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBWaXN1YWwgQmFzaWMsIHNvIGxpYnBuZy0xLjUuMCB1c2VzCi0gICAgICBfX2NkZWNsIHRocm91Z2hvdXQgKGJvdGggQVBJIGZ1bmN0aW9ucyBhbmQgY2FsbGJhY2tzKSBvbiBXaW5kb3dzL3g4NgotICAgICAgcGxhdGZvcm1zLgotICBSZXBsYWNlZCB2aXN1YWxjNiBhbmQgdmlzdWFsYzcxIHByb2plY3RzIHdpdGggbmV3IHZzdHVkaW8gcHJvamVjdAotICBSZWxheGVkIHRoZSBvdmVybHktcmVzdHJpY3RpdmUgcGVybWlzc2lvbnMgb2Ygc29tZSBmaWxlcy4KLQotVmVyc2lvbiAxLjUuMGJldGEyMCBbQXByaWwgMjQsIDIwMTBdCi0gIFJlbGF4ZWQgbW9yZSBvdmVybHktcmVzdHJpY3RpdmUgcGVybWlzc2lvbnMgb2Ygc29tZSBmaWxlcy4KLQotVmVyc2lvbiAxLjUuMGJldGEyMSBbQXByaWwgMjcsIDIwMTBdCi0gIFJlbW92ZWQgc29tZSB1bndhbnRlZCBiaW5hcnkgYnl0ZXMgYW5kIGNoYW5nZWQgQ1JMRiB0byBORVdMSU5FIGluIHRoZSBuZXcKLSAgICB2c3R1ZGlvIHByb2plY3QgZmlsZXMsIGFuZCBzb21lIHRyaXZpYWwgZWRpdGluZyBvZiBzb21lIGZpbGVzIGluIHRoZQotICAgIHNjcmlwdHMgZGlyZWN0b3J5LgotICBTZXQgUE5HX05PX1JFQURfQkdSLCBQTkdfTk9fSU9fU1RBVEUsIGFuZCBQTkdfTk9fVElNRV9SRkMxMTIzIGluCi0gICAgY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL3BuZ3Vzci5oIHRvIG1ha2UgYSBzbWFsbGVyIGRlY29kZXIgYXBwbGljYXRpb24uCi0KLVZlcnNpb24gMS41LjBiZXRhMjIgW0FwcmlsIDI4LCAyMDEwXQotICBGaXhlZCBkZXBlbmRlbmNpZXMgb2YgR0VUX0lOVF8zMiAtIGl0IGRvZXMgbm90IHJlcXVpcmUgUkVBRF9JTlRfRlVOQ1RJT05TCi0gICAgYmVjYXVzZSBpdCBoYXMgYSBtYWNybyBlcXVpdmFsZW50LgotICBJbXByb3ZlZCB0aGUgb3B0aW9ucy5hd2sgc2NyaXB0OyBhZGRlZCBhbiAiZXZlcnl0aGluZyBvZmYiIG9wdGlvbi4KLSAgUmV2aXNlZCBjb250cmliL3BuZ21pbmltIHRvIHVzZSB0aGUgImV2ZXJ5dGhpbmcgb2ZmIiBvcHRpb24gaW4gcG5ndXNyLmRmYS4KLQotVmVyc2lvbiAxLjUuMGJldGEyMyBbQXByaWwgMjksIDIwMTBdCi0gIENvcnJlY3RlZCBQTkdfUkVNT1ZFRCBtYWNybyB0byB0YWtlIGZpdmUgYXJndW1lbnRzLgotICAgIFRoZSBtYWNybyB3YXMgZG9jdW1lbnRlZCB3aXRoIHR3byBhcmd1bWVudHMgKG5hbWUsb3JkaW5hbCksIGhvd2V2ZXIKLSAgICB0aGUgc3ltYm9sIGNoZWNraW5nIC5kZm4gZmlsZXMgYXNzdW1lZCBmaXZlIGFyZ3VtZW50cy4gIFRoZSBmaXZlCi0gICAgYXJndW1lbnQgZm9ybSBzZWVtcyBtb3JlIHVzZWZ1bCBzbyBpdCBpcyBjaGFuZ2VkIHRvIHRoYXQuCi0gIENvcnJlY3RlZCBQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEIHRvIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgICBpbiBncmVnYm9vay9yZWFkcG5nMi5jCi0gIENvcnJlY3RlZCBwcm90ZWN0aW9uIG9mIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyLiBUaGUgQVBJIGRlY2xhcmF0aW9uIGluCi0gICAgcG5nLmggaXMgcmVtb3ZlZCBpZiBib3RoIFJFQUQgYW5kIFdSSVRFIFVTRVJfVFJBTlNGT1JNIGFyZSB0dXJuZWQgb2ZmCi0gICAgYnV0IHdhcyBsZWZ0IGRlZmluZWQgaW4gcG5ndHJhbnMuYwotICBBZGRlZCBsb2d1bnN1cHBvcnRlZD0xIHRvIGNhdXNlIHBuZ2xpYmNvbmYuaCB0byBkb2N1bWVudCBkaXNhYmxlZCBvcHRpb25zLgotICAgIFRoaXMgbWFrZXMgdGhlIGluc3RhbGxlZCBwbmdsaWJjb25mLmggbW9yZSByZWFkYWJsZSBidXQgY2F1c2VzIG5vCi0gICAgb3RoZXIgY2hhbmdlLiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHVzZXJzIG9mIGxpYnBuZyB3aWxsIGZpbmQgaXQKLSAgICBlYXNpZXIgdG8gdW5kZXJzdGFuZCBpZiBhbiBBUEkgdGhleSBuZWVkIGlzIG1pc3NpbmcuCi0gIEluY2x1ZGUgcG5nX3Jlc2V0X3pzdHJlYW0oKSBpbiBwbmcuYyBvbmx5IHdoZW4gUE5HX1JFQURfU1VQUE9SVEVEIGlzIGRlZmluZWQuCi0gIFJlbW92ZWQgZHVtbXlfaW5mbGF0ZS5jIGZyb20gY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyCi0gIFJlbW92ZWQgY29udHJpYi9wbmdtaW5pbS8qL2dhdGhlci5zaDsgZ2F0aGVyaW5nIGlzIG5vdyBkb25lIGluIHRoZSBtYWtlZmlsZS4KLQotVmVyc2lvbiAxLjUuMGJldGEyNCBbTWF5IDcsIDIwMTBdCi0gIFVzZSBiaXR3aXNlICImIiBpbnN0ZWFkIG9mIGFyaXRobWV0aWMgbW9kIGluIHBuZ3J1dGlsLmMgY2FsY3VsYXRpb24gb2YgdGhlCi0gICAgb2Zmc2V0IG9mIHRoZSBwbmdfcHRyLT5yb3didWYgcG9pbnRlciBpbnRvIHBuZ19wdHItPmJpZ19yb3dfYnVmLgotICBBZGRlZCBtb3JlIGJsYW5rIGxpbmVzIGZvciByZWFkYWJpbGl0eS4KLQotVmVyc2lvbiAxLjUuMGJldGEyNSBbSnVuZSAxOCwgMjAxMF0KLSAgSW4gcG5ncHJlYWQuYzogcG5nX3B1c2hfaGF2ZV9yb3coKSBhZGQgY2hlY2sgZm9yIG5ld19yb3cgPiBoZWlnaHQKLSAgUmVtb3ZlZCB0aGUgbm93LXJlZHVuZGFudCBjaGVjayBmb3Igb3V0LW9mLWJvdW5kcyBuZXdfcm93IGZyb20gZXhhbXBsZS5jCi0KLVZlcnNpb24gMS41LjBiZXRhMjYgW0p1bmUgMTgsIDIwMTBdCi0gIEluIHBuZ3ByZWFkLmM6IHBuZ19wdXNoX3Byb2Nlc3Nfcm93KCkgYWRkIGNoZWNrIGZvciB0b28gbWFueSByb3dzLgotCi1WZXJzaW9uIDEuNS4wYmV0YTI3IFtKdW5lIDE4LCAyMDEwXQotICBSZW1vdmVkIHRoZSBjaGVjayBhZGRlZCBpbiBiZXRhMjUgYXMgaXQgaXMgbm93IHJlZHVuZGFudC4KLQotVmVyc2lvbiAxLjUuMGJldGEyOCBbSnVuZSAyMCwgMjAxMF0KLSAgUmV3cm90ZSBwbmdfcHJvY2Vzc19JREFUX2RhdGEgdG8gY29uc2lzdGVudGx5IHRyZWF0IGV4dHJhIGRhdGEgYXMgd2FybmluZ3MKLSAgICBhbmQgaGFuZGxlIGVuZCBjb25kaXRpb25zIG1vcmUgY2xlYW5seS4KLSAgUmVtb3ZlZCB0aGUgbmV3IChiZXRhMjYpIGNoZWNrIGluIHBuZ19wdXNoX3Byb2Nlc3Nfcm93KCkuCi0KLVZlcnNpb24gMS41LjBiZXRhMjkgW0p1bmUgMjEsIDIwMTBdCi0gIFJldmlzZWQgc2NyaXB0cy9vcHRpb25zLmF3ayB0byB3b3JrIG9uIFN1bm9zIChidXQgc3RpbGwgZG9lc24ndCB3b3JrKQotICBBZGRlZCBjb21tZW50IHRvIG9wdGlvbnMuYXdrIGFuZCBjb250cmliL3BuZ21pbmltLyovbWFrZWZpbGUgdG8gdHJ5IG5hd2suCi0KLVZlcnNpb24gMS41LjBiZXRhMzAgW0p1bmUgMjIsIDIwMTBdCi0gIFN0b3AgbWVtb3J5IGxlYWsgd2hlbiByZWFkaW5nIGEgbWFsZm9ybWVkIHNDQUwgY2h1bmsuCi0KLVZlcnNpb24gMS41LjBiZXRhMzEgW0p1bmUgMjYsIDIwMTBdCi0gIFJldmlzZWQgcG5ncHJlYWQuYyBwYXRjaCBvZiBiZXRhMjggdG8gYXZvaWQgYW4gZW5kbGVzcyBsb29wLgotICBSZW1vdmVkIHNvbWUgdHJhaWxpbmcgYmxhbmtzLgotCi1WZXJzaW9uIDEuNS4wYmV0YTMyIFtKdW5lIDI2LCAyMDEwXQotICBSZW1vdmVkIGxlZnRvdmVyIHNjcmlwdHMvb3B0aW9ucy5wYXRjaCBhbmQgc2NyaXB0cy9vcHRpb25zLnJlagotCi1WZXJzaW9uIDEuNS4wYmV0YTMzIFtKdWx5IDYsIDMwMTBdCi0gIE1hZGUgRklYRUQgYW5kIEZMT0FUSU5HIG9wdGlvbnMgY29uc2lzdGVudCBpbiB0aGUgQVBJcyB0aGV5IGVuYWJsZSBhbmQKLSAgICBkaXNhYmxlLiAgQ29ycmVjdGVkIHNjcmlwdHMvb3B0aW9ucy5hd2sgdG8gaGFuZGxlIGJvdGggY29tbWFuZCBsaW5lCi0gICAgb3B0aW9ucyBhbmQgb3B0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIC5kZmEgZmlsZXMuCi0gIENoYW5nZWQgY2hhciAqbXNnIHRvIFBOR19DT05TVCBjaGFyICptc2cgaW4gcG5ncnV0aWwuYwotICBNYWtlIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNIHNldCB2YWx1ZXMgdXNpbmcgZWl0aGVyIHRoZSBmaXhlZCBvcgotICAgIGZsb2F0aW5nIHBvaW50IEFQSXMsIGJ1dCBub3QgYm90aC4KLSAgUmV2ZXJzZWQgcGF0Y2ggdG8gcmVtb3ZlIGVycm9yIGhhbmRsZXIgd2hlbiB0aGUgam1wX2J1ZiBpcyBzdG9yZWQgaW4gdGhlCi0gICAgbWFpbiBwcm9ncmFtIHN0cnVjdHVyZSwgbm90IHRoZSBwbmdfc3RydWN0LgotICAgIFRoZSBlcnJvciBoYW5kbGVyIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBkZWZhdWx0IGhhbmRsZXIgaW4gbGlicG5nIHdpbGwKLSAgICBhbHdheXMgdXNlIHRoZSBqbXBfYnVmIGluIHRoZSBsaWJyYXJ5IGNvbnRyb2wgc3RydWN0dXJlOyB0aGlzIGlzIG5ldmVyCi0gICAgc2V0LiAgVGhlIGdyZWdib29rIGNvZGUgaXMgYSB1c2VmdWwgZXhhbXBsZSBiZWNhdXNlLCBldmVuIHRob3VnaCBpdAotICAgIHVzZXMgc2V0am1wL2xvbmdqbXAsIGl0IHNob3dzIGhvdyBlcnJvciBoYW5kbGluZyBjYW4gYmUgaW1wbGVtZW50ZWQKLSAgICB1c2luZyBjb250cm9sIG1lY2hhbmlzbXMgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSBsaWJwbmcuICBUaGUKLSAgICB0ZWNobmlxdWUgd2lsbCB3b3JrIGNvcnJlY3RseSB3aXRoIG1lY2hhbmlzbXMgc3VjaCBhcyBNaWNyb3NvZnQKLSAgICBTdHJ1Y3R1cmUgRXhjZXB0aW9ucyBvciBDKysgZXhjZXB0aW9ucyAoY29tcGlsZXIgd2lsbGluZyAtIG5vdGUgdGhhdCBnY2MKLSAgICBkb2VzIG5vdCBieSBkZWZhdWx0IHN1cHBvcnQgaW50ZXJ3b3JraW5nIG9mIEMgYW5kIEMrKyBlcnJvciBoYW5kbGluZy4pCi0gIFJldmVydGVkIGNoYW5nZXMgdG8gY2FsbCBwbmdfbG9uZ2ptcCBpbiBjb250cmliL2dyZWdib29rIHdoZXJlIGl0IGlzIG5vdAotICAgIGFwcHJvcHJpYXRlLiAgSWYgbWFpbnByb2ctPmptcGJ1ZiBpcyB1c2VkIGJ5IHNldGptcCwgdGhlbiBwbmdfbG9uZ2ptcAotICAgIGNhbm5vdCBiZSB1c2VkLgotICBDaGFuZ2VkICJleHRlcm4gUE5HX0VYUE9SVCIgdG8gIlBOR19FWFBPUlQiIGluIHBuZy5oIChKYW4gTmlqdG1hbnMpCi0gIENoYW5nZWQgImV4dGVybiIgdG8gIlBOR19FWFRFUk4iIGluIHBuZ3ByaXYuaCAoZXhjZXB0IGZvciB0aGUgJ2V4dGVybiAiQyIgeycpCi0KLVZlcnNpb24gMS41LjBiZXRhMzQgW0p1bHkgMTIsIDIwMTBdCi0gIFB1dCAjaWZuZGVmIFBOR19FWFRFUk4sICNlbmRpZiBhcm91bmQgdGhlIGRlZmluZSBQTkdfRVhURVJOIGluIHBuZ3ByaXYuaAotCi1WZXJzaW9uIDEuNS4wYmV0YTM1IFtKdWx5IDI0LCAyMDEwXQotICBSZW1vdmVkIHNvbWUgbmV3bHktYWRkZWQgVEFCIGNoYXJhY3RlcnMuCi0gIEFkZGVkIC1ETk9fUE5HX1NOUFJJTlRGIHRvIENGTEFHUyBpbiBzY3JpcHRzL21ha2VmaWxlLmRqMgotICBNb3ZlZCB0aGUgZGVmaW5pdGlvbiBvZiBwbmdfc25wcmludGYoKSBvdXRzaWRlIG9mIHRoZSBlbmNsb3NpbmcKLSAgICAjaWZkZWYgYmxvY2tzIGluIHBuZ2NvbmYuaAotCi1WZXJzaW9uIDEuNS4wYmV0YTM2IFtKdWx5IDI5LCAyMDEwXQotICBQYXRjaGVzIGJ5IEpvaG4gQm93bGVyOgotICBGaXhlZCBwb2ludCBBUElzIGFyZSBub3cgc3VwcG9ydGVkIHRocm91Z2hvdXQgKG5vIG1pc3NpbmcgQVBJcykuCi0gIEludGVybmFsIGZpeGVkIHBvaW50IGFyaXRobWV0aWMgc3VwcG9ydCBleGlzdHMgZm9yIGFsbCBpbnRlcm5hbCBmbG9hdGluZwotICAgIHBvaW50IG9wZXJhdGlvbnMuCi0gIHNDQUwgdmFsaWRhdGVzIHRoZSBmbG9hdGluZyBwb2ludCBzdHJpbmdzIGl0IGlzIHBhc3NlZC4KLSAgU2FmZSwgYWxiZWl0IHJ1ZGltZW50YXJ5LCBXYXRjb20gc3VwcG9ydCBpcyBwcm92aWRlZCBieSBQTkdfQVBJX1JVTEU9PTIKLSAgVHdvIG5ldyBBUElzIGV4aXN0IHRvIGdldCB0aGUgbnVtYmVyIG9mIHBhc3NlcyB3aXRob3V0IHR1cm5pbmcgb24gdGhlCi0gICAgUE5HX0lOVEVSTEFDRSB0cmFuc2Zvcm0gYW5kIHRvIGdldCB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGN1cnJlbnQKLSAgICBwYXNzLgotICBBIG5ldyB0ZXN0IHByb2dyYW0sIHBuZ3ZhbGlkLmMsIHZhbGlkYXRlcyB0aGUgZ2FtbWEgY29kZS4KLSAgRXJyb3JzIGluIHRoZSAxNi1iaXQgZ2FtbWEgY29ycmVjdGlvbiAob3ZlcmZsb3dzKSBoYXZlIGJlZW4gY29ycmVjdGVkLgotICBjSFJNIGNodW5rIHRlc3RpbmcgaXMgZG9uZSBjb25zaXN0ZW50bHkgKHByZXZpb3VzbHkgdGhlIGZsb2F0aW5nIHBvaW50Ci0gICAgQVBJIGJ5cGFzc2VkIGl0LCBiZWNhdXNlIHRoZSB0ZXN0IHJlYWxseSBkaWRuJ3Qgd29yayBvbiBGUCwgbm93IHRoZSB0ZXN0Ci0gICAgaXMgcGVyZm9ybWVkIG9uIHRoZSBhY3R1YWwgdmFsdWVzIHRvIGJlIHN0b3JlZCBpbiB0aGUgUE5HIGZpbGUgc28gaXQKLSAgICB3b3JrcyBpbiB0aGUgRlAgY2FzZSB0b28uKQotICBNb3N0IGZsb2F0aW5nIHBvaW50IEFQSXMgbm93IHNpbXBseSBjYWxsIHRoZSBmaXhlZCBwb2ludCBBUElzIGFmdGVyCi0gICAgY29udmVydGluZyB0aGUgdmFsdWVzIHRvIHRoZSBmaXhlZCBwb2ludCBmb3JtIHVzZWQgaW4gdGhlIFBORyBmaWxlLgotICBUaGUgc3RhbmRhcmQgaGVhZGVycyBubyBsb25nZXIgaW5jbHVkZSB6bGliLmgsIHdoaWNoIGlzIGN1cnJlbnRseSBvbmx5Ci0gICAgcmVxdWlyZWQgZm9yIHBuZ3N0cnVjdC5oIGFuZCBjYW4gdGhlcmVmb3JlIGJlIGludGVybmFsLgotICBSZXZpc2VkIHBuZ19nZXRfaW50XzMyIHRvIHVuZG8gdGhlIFBORyB0d28ncyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uIG9mCi0gICAgbmVnYXRpdmUgbnVtYmVycy4KLQotVmVyc2lvbiAxLjUuMGJldGEzNyBbSnVseSAzMCwgMjAxMF0KLSAgQWRkZWQgYSB0eXBlY2FzdCBpbiBwbmdfZ2V0X2ludF8zMigpIGluIHBuZy5oIGFuZCBwbmdydXRpbC5oIHRvIGF2b2lkCi0gICAgYSBjb21waWxlciB3YXJuaW5nLgotICBSZXBsYWNlZCBvRkZzIDAsMCB3aXRoIG9GRnMgLTEwLDIwIGluIHBuZ3Rlc3QucG5nCi0KLVZlcnNpb24gMS41LjBiZXRhMzggW0p1bHkgMzEsIDIwMTBdCi0gIEltcGxlbWVudGVkIHJlbWFpbmluZyAiX2ZpeGVkIiBmdW5jdGlvbnMuCi0gIENvcnJlY3RlZCBhIG51bWJlciBvZiByZWNlbnRseSBpbnRyb2R1Y2VkIHdhcm5pbmdzIG1vc3RseSByZXN1bHRpbmcgZnJvbQotICAgIHNhZmUgYnV0IHVuY2FzdCBhc3NpZ25tZW50cyB0byBzaG9ydGVyIGludGVnZXJzLiAgQWxzbyBhZGRlZCBhIHpsaWIKLSAgICBWU3R1ZGlvIHJlbGVhc2UgbGlicmFyeSBwcm9qZWN0IGJlY2F1c2UgdGhlIGxhdGVzdCB6bGliIE9mZmljaWFsIFdpbmRvd3MKLSAgICBidWlsZCBkb2VzIG5vdCBpbmNsdWRlIHN1Y2ggYSB0aGluZy4KLSAgUmV2aXNlZCBwbmdfZ2V0X2ludF8xNigpIHRvIGJlIHNpbWlsYXIgdG8gcG5nX2dldF9pbnRfMzIoKS4KLSAgUmVzdG9yZWQgcHJvamVjdHMvdmlzdWFsYzcxLgotCi1WZXJzaW9uIDEuNS4wYmV0YTM5IFtBdWd1c3QgMiwgMjAxMF0KLSAgVmlzdWFsQy9HQ0Mgd2FybmluZyBmaXhlcywgVmlzdWFsQyBidWlsZCBmaXhlcwotICBUaGUgY2hhbmdlcyBpbmNsdWRlIHN1cHBvcnQgZm9yIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgaW4gVkMgaW4gYWRkaXRpb24gdG8KLSAgICB0aG9zZSBhbHJlYWR5IHByZXNlbnQgaW4gR0NDIC0gbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCB0aGVzZSBzb21lCi0gICAgd2FybmluZ3MgYXJlIHVuYXZvaWRhYmxlLiAgRml4ZXMgaW5jbHVkZSBzaWduZWQvdW5zaWduZWQgZml4ZXMgaW4KLSAgICBwbmd2YWxpZCBhbmQgY2hlY2tzIHdpdGggZ2NjIC1XYWxsIC1XZXh0cmEgLVd1bnVzZWQuCi0gIFZDIHJlcXVpcmVzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXMgd2VsbCBhcwotICAgIGRlY2xhcmF0aW9ucywgUE5HX0ZVTkNUSU9OIGhhcyBiZWVuIGFkZGVkIHRvIGVuYWJsZSB0aGlzIGFuZCB0aGUKLSAgICByZWxldmFudCBmdW5jdGlvbiBkZWZpbml0aW9ucyBjaGFuZ2VkLgotCi1WZXJzaW9uIDEuNS4wYmV0YTQwIFtBdWd1c3QgNiwgMjAxMF0KLSAgQ29ycmVjdCB1c2Ugb2YgX1dJTkRPV1NfIGluIHBuZ2NvbmYuaAotICBSZW1vdmVkIHBuZ19tZW1fICNkZWZpbmVzOyB0aGV5IGFyZSBubyBsb25nZXIgdXNlZC4KLSAgQWRkZWQgdGhlIHNSR0IgY2h1bmsgdG8gcG5ndGVzdC5wbmcKLQotVmVyc2lvbiAxLjUuMGJldGE0MSBbQXVndXN0IDExLCAyMDEwXQotICBBZGRlZCB0aGUgY0hSTSBjaHVuayB0byBwbmd0ZXN0LnBuZwotICBEb24ndCB0cnkgdG8gdXNlIHZlcnNpb24tc2NyaXB0IHdpdGggY3lnd2luL21pbmd3LgotICBSZXZpc2VkIGNvbnRyaWIvZ3JlZ2Jvb2sgdG8gd29yayB1bmRlciBjeWd3aW4vbWluZ3cuCi0KLVZlcnNpb24gMS41LjBiZXRhNDIgW0F1Z3VzdCAxOCwgMjAxMF0KLSAgQWRkIC5kbGwuYSB0byB0aGUgbGlzdCBvZiBleHRlbnNpb25zIHRvIGJlIHN5bWxpbmtlZCBieSBNYWtlZmlsZS5hbSAoWWFha292KQotICBNYWRlIGFsbCBBUEkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBjb25zdCBhcmd1bWVudHMgYW5kIGNvbnN0YW50IHN0cmluZwotICAgIGxpdGVyYWwgcG9pbnRlcnMgZGVjbGFyZSB0aGVtIChKb2huIEJvd2xlcikuCi0KLVZlcnNpb24gMS41LjBiZXRhNDMgW0F1Z3VzdCAyMCwgMjAxMF0KLSAgUmVtb3ZlZCBzcHVyaW91cyB0YWJzLCBzaG9ydGVuIGxvbmcgbGluZXMgKG5vIHNvdXJjZSBjaGFuZ2UpCi0gICAgQWxzbyBhZGRlZCBzY3JpcHRzL2Noa2ZtdCB0byB2YWxpZGF0ZSB0aGUgZm9ybWF0IG9mIGFsbCB0aGUgZmlsZXMgdGhhdCBjYW4KLSAgICByZWFzb25hYmx5IGJlIHZhbGlkYXRlZCAoaXQgaXMgc3VnZ2VzdGVkIHRvIHJ1biAibWFrZSBkaXN0Y2xlYW4iIGJlZm9yZQotICAgIGNoZWNraW5nLCBiZWNhdXNlIHNvbWUgbWFjaGluZSBnZW5lcmF0ZWQgZmlsZXMgaGF2ZSBsb25nIGxpbmVzLikKLSAgUmVmb3JtYXR0ZWQgdGhlIENIQU5HRVMgZmlsZSB0byBiZSBtb3JlIGNvbnNpc3RlbnQgdGhyb3VnaG91dC4KLSAgTWFkZSBjaGFuZ2VzIHRvIGFkZHJlc3MgdmFyaW91cyBpc3N1ZXMgaWRlbnRpZmllZCBieSBHQ0MsIG1vc3RseQotICAgIHNpZ25lZC91bnNpZ25lZCBhbmQgc2hvcnRlbmluZyBwcm9ibGVtcyBvbiBhc3NpZ25tZW50IGJ1dCBhbHNvIGEgZmV3Ci0gICAgZGlmZmljdWx0IHRvIG9wdGltaXplIChmb3IgR0NDKSBsb29wcy4KLSAgRml4ZWQgbm9uLUdDQyBmaXhlZCBwb2ludCBidWlsZHMuICBJbiBwbmcuYyBhIGRlY2xhcmF0aW9uIHdhcyBtaXNwbGFjZWQKLSAgICBpbiBhbiBlYXJsaWVyIHVwZGF0ZS4gIEZpeGVkIHRvIGRlY2xhcmUgdGhlIGF1dG8gdmFyaWFibGVzIGF0IHRoZSBoZWFkLgotICBVc2UgY2V4Y2VwdC5oIGluIHBuZ3ZhbGlkLmMuCi0KLVZlcnNpb24gMS41LjBiZXRhNDQgW0F1Z3VzdCAyNCwgMjAxMF0KLSAgVXBkYXRlZCBDTWFrZUxpc3RzLnR4dCB0byB1c2UgQ01BS0VfSU5TVEFMTF9MSUJESVIgdmFyaWFibGU7IHVzZWZ1bCBmb3IKLSAgICBpbnN0YWxsaW5nIGxpYnBuZyBpbiAvdXNyL2xpYjY0IChGdW5kYSBXYW5nKS4KLSAgUmV2aXNlZCBDTWFrZUxpc3RzLnR4dCB0byBwdXQgdGhlIG1hbiBwYWdlcyBpbiBzaGFyZS9tYW4vbWFuKiBub3QgbWFuL21hbioKLSAgUmV2aXNlZCBDTWFrZUxpc3RzLnR4dCB0byBtYWtlIHN5bWxpbmtzIGluc3RlYWQgb2YgY29waWVzIHdoZW4gaW5zdGFsbGluZy4KLSAgQ2hhbmdlZCBQTkdfTElCX05BTUUgZnJvbSBwbmdOTiB0byBsaWJwbmdOTiBpbiBDTWFrZUxpc3RzLnR4dCAoUGhpbGlwIExvd21hbikKLSAgSW1wbGVtZW50ZWQgbWVtb3J5IGNoZWNrcyB3aXRoaW4gcG5ndmFsaWQKLSAgUmVmb3JtYXR0ZWQvcmVhcnJhbmdlZCBwbmd2YWxpZC5jIHRvIGFzc2lzdCB1c2Ugb2YgcHJvZ3Jlc3NpdmUgcmVhZGVyLgotICBDaGVjayBpbnRlcmxhY2VkIGltYWdlcyBpbiBwbmd2YWxpZAotICBDbGFyaWZpZWQgcG5ndXNyLmggY29tbWVudHMgaW4gcG5nbGliY29uZi5kZmEKLSAgU2ltcGxpZmllZCB0aGUgcG5ndmFsaWQgZXJyb3ItaGFuZGxpbmcgY29kZSBub3cgdGhhdCBjZXhjZXB0LmggaXMgaW4gcGxhY2UuCi0gIEltcGxlbWVudGVkIHByb2dyZXNzaXZlIHJlYWRlciBpbiBwbmd2YWxpZC5jIGZvciBzdGFuZGFyZCB0ZXN0cwotICBJbXBsZW1lbnRlZCBwcm9ncmVzc2l2ZSByZWFkIGluIHBuZ3ZhbGlkLmMgZ2FtbWEgdGVzdHMKLSAgVHVybiBvbiBwcm9ncmVzc2l2ZSByZWFkZXIgaW4gcG5ndmFsaWQuYyBieSBkZWZhdWx0IGFuZCB0aWR5IGNvZGUuCi0KLVZlcnNpb24gMS41LjBiZXRhNDUgW0F1Z3VzdCAyNiwgMjAxMF0KLSAgQWRkZWQgYW4gZXhwbGljaXQgbWFrZSBzdGVwIHRvIHByb2plY3RzL3ZzdHVkaW8gZm9yIHBuZ2xpYmNvbmYuaAotICAgIEFsc28gY29ycmVjdGVkIHpsaWIudmN4cHJvaiBpbnRvIHdoaWNoIFZpc3VhbCBTdHVkaW8gaGFkIGludHJvZHVjZWQKLSAgICB3aGF0IGl0IGNhbGxzIGFuICJhdXRob3JpbmcgZXJyb3IiLiAgVGhlIGNoYW5nZSB0byBtYWtlIHBuZ2xpYmNvbmYuaAotICAgIHNpbXBseSBjb3BpZXMgdGhlIGZpbGU7IGluIHRoZSBmdXR1cmUgaXQgbWF5IGFjdHVhbGx5IGdlbmVyYXRlIHRoZQotICAgIGZpbGUgZnJvbSBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIGFzIHRoZSBvdGhlciBidWlsZCBzeXN0ZW1zIGRvLgotICBDaGFuZ2VkIHBuZ3ZhbGlkIHRvIHdvcmsgd2hlbiBmbG9hdGluZyBwb2ludCBBUElzIGFyZSBkaXNhYmxlZAotICBSZW5hbWVkIHRoZSBwcmVidWlsdCBzY3JpcHRzL3BuZ2xpYmNvbmYuaCB0byBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotICBTdXBwbHkgZGVmYXVsdCB2YWx1ZXMgZm9yIFBOR19VU0VSX1BSSVZBVEVCVUlMRCBhbmQgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWAotICAgIGluIHBuZ3ByaXYuaCBpbiBjYXNlIHRoZSB1c2VyIG5lZ2xlY3RlZCB0byBkZWZpbmUgdGhlbSBpbiB0aGVpciBwbmd1c3IuaAotCi1WZXJzaW9uIDEuNS4wYmV0YTQ2IFtBdWd1c3QgMjgsIDIwMTBdCi0gIEFkZGVkIG5ldyBwcml2YXRlIGhlYWRlciBmaWxlcyB0byBsaWJwbmdfc291cmNlcyBpbiBDTWFrZUxpc3RzLnR4dAotICBBZGRlZCBQTkdfUkVBRF8xNkJJVCwgUE5HX1dSSVRFXzE2QklULCBhbmQgUE5HXzE2QklUIG9wdGlvbnMuCi0gIEFkZGVkIHJlZmVyZW5jZSB0byBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCBpbiB0aGUgdmlzdWFsYzcxIHByb2plY3QuCi0KLVZlcnNpb24gMS41LjBiZXRhNDcgW1NlcHRlbWJlciAxMSwgMjAxMF0KLSAgRml4ZWQgYSBudW1iZXIgb2YgcHJvYmxlbXMgd2l0aCA2NC1iaXQgY29tcGlsYXRpb24gcmVwb3J0ZWQgYnkgVmlzdWFsCi0gICAgU3R1ZGlvIDIwMTAgKEpvaG4gQm93bGVyKS4KLQotVmVyc2lvbiAxLjUuMGJldGE0OCBbT2N0b2JlciA0LCAyMDEwXQotICBVcGRhdGVkIENNYWtlTGlzdHMudHh0IChQaGlsaXAgTG93bWFuKS4KLSAgUmV2aXNlZCBhdXRvZ2VuLnNoIHRvIHJlY29nbml6ZSBhbmQgdXNlICRBVVRPQ09ORiwgJEFVVE9NQUtFLCAkQVVUT0hFQURFUiwKLSAgICAkQVVUT1BPSU5ULCAkQUNMT0NBTCBhbmQgJExJQlRPT0xJWkUKLSAgRml4ZWQgcHJvYmxlbSB3aXRoIHN5bWJvbHMgY3JlYXRpb24gaW4gTWFrZWZpbGUuYW0gd2hpY2ggd2FzIGFzc3VtaW5nIHRoYXQKLSAgICBhbGwgdmVyc2lvbnMgb2YgY2NwIHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dCBieSBkZWZhdWx0IChNYXJ0aW4gQmFua3kpLiBUaGUKLSAgICBidWcgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuMi45YmV0YTUuCi0gIFJlbW92ZWQgdW51c2VkIG1raW5zdGFsbGRpcnMuCi0KLVZlcnNpb24gMS41LjBiZXRhNDkgW09jdG9iZXIgOCwgMjAxMF0KLSAgVW5kaWQgTWFrZWZpbGUuYW0gcmV2aXNpb24gb2YgMS41LjBiZXRhNDguCi0KLVZlcnNpb24gMS41LjBiZXRhNTAgW09jdG9iZXIgMTQsIDIwMTBdCi0gIFJldmlzZWQgTWFrZWZpbGUuaW4gdG8gYWNjb3VudCBmb3IgbWtpbnN0YWxsZGlycyBiZWluZyByZW1vdmVkLgotICBBZGRlZCBzb21lICIodW5zaWduZWQgbG9uZykiIHR5cGVjYXN0cyBpbiBwcmludGYgc3RhdGVtZW50cyBpbiBwbmd2YWxpZC5jLgotICBTdXBwcmVzc2VkIGEgY29tcGlsZXIgd2FybmluZyBpbiBwbmdfaGFuZGxlX3NQTFQoKS4KLSAgQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSB0ZXh0IGNvbXByZXNzaW9uIG1vZGUgaW4gcG5nX3NldF90ZXh0KCkuCi0KLVZlcnNpb24gMS41LjBiZXRhNTEgW09jdG9iZXIgMTUsIDIwMTBdCi0gIENoYW5nZWQgZW1iZWRkZWQgZGF0ZXMgdG8gIihQRU5ESU5HIFJFTEVBU0UpIGluIGJldGEgcmVsZWFzZXMgKGFuZCBmdXR1cmUKLSAgICByYyByZWxlYXNlcykgdG8gbWluaW1pemUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiByZWxlYXNlcy4KLQotVmVyc2lvbiAxLjUuMGJldGE1MiBbT2N0b2JlciAxNiwgMjAxMF0KLSAgUmVzdG9yZWQgc29tZSBvZiB0aGUgZW1iZWRkZWQgZGF0ZXMgKGluIHBuZy5oLCBwbmcuYywgZG9jdW1lbnRhdGlvbiwgZXRjLikKLQotVmVyc2lvbiAxLjUuMGJldGE1MyBbT2N0b2JlciAxOCwgMjAxMF0KLSAgVXBkYXRlZCBJTlNUQUxMIHRvIG1lbnRpb24gdXNpbmcgIm1ha2UgbWFpbnRhaW5lci1jbGVhbiIgYW5kIHRvIHJlbW92ZQotICAgIG9ic29sZXRlIHN0YXRlbWVudCBhYm91dCBhIGN1c3RvbSBsdG1haW4uc2gKLSAgRGlzYWJsZWQgImNvbG9yLXRlc3RzIiBieSBkZWZhdWx0IGluIE1ha2VmaWxlLmFtIHNvIGl0IHdpbGwgd29yayB3aXRoCi0gICAgYXV0b21ha2UgdmVyc2lvbnMgZWFybGllciB0aGFuIDEuMTEuMQotICBVc2UgZG9jdW1lbnQgbmFtZSAibGlicG5nLW1hbnVhbC50eHQiIGluc3RlYWQgb2YgImxpYnBuZy08dmVyc2lvbj4udHh0IgotICAgIHRvIHNpbXBsaWZ5IHZlcnNpb24gZGlmZmVyZW5jZXMuCi0gIFJlbW92ZWQgb2Jzb2xldGUgcmVtYXJrcyBhYm91dCBzZXRqbXAgaGFuZGxpbmcgZnJvbSBJTlNUQUxMLgotICBSZXZpc2VkIGFuZCByZW5hbWVkIHRoZSB0eXBlZGVmIGluIHBuZy5oIGFuZCBwbmcuYyB0aGF0IHdhcyBkZXNpZ25lZAotICAgIHRvIGNhdGNoIGxpYnJhcnkgYW5kIGhlYWRlciBtaXNtYXRjaC4KLQotVmVyc2lvbiAxLjUuMGJldGE1NCBbTm92ZW1iZXIgMTAsIDIwMTBdCi0gIFJlcXVpcmUgNDggYnl0ZXMsIG5vdCA2NCBieXRlcywgZm9yIGJpZ19yb3dfYnVmIGluIG92ZXJmbG93IGNoZWNrcy4KLSAgVXNlZCBhIGNvbnNpc3RlbnQgc3RydWN0dXJlIGZvciB0aGUgcG5nZ2V0LmMgZnVuY3Rpb25zLgotCi1WZXJzaW9uIDEuNS4wYmV0YTU1IFtOb3ZlbWJlciAyMSwgMjAxMF0KLSAgUmV2aXNlZCBwbmdfZ2V0X3VpbnRfMzIsIHBuZ19nZXRfaW50XzMyLCBwbmdfZ2V0X3VpbnRfMTYgKENvc21pbikKLSAgTW92ZWQgcmVhZGluZyBvZiBmaWxlIHNpZ25hdHVyZSBpbnRvIHBuZ19yZWFkX3NpZyAoQ29zbWluKQotICBGaXhlZCBhdG9taWNpdHkgb2YgY2h1bmsgaGVhZGVyIHNlcmlhbGl6YXRpb24gKENvc21pbikKLSAgQWRkZWQgdGVzdCBmb3IgaW9fc3RhdGUgaW4gcG5ndGVzdC5jIChDb3NtaW4pCi0gIEFkZGVkICIjIS9iaW4vc2giIGF0IHRoZSB0b3Agb2YgY29udHJpYi9wbmdtaW5pbS8qL2dhdGhlci5zaCBzY3JpcHRzLgotICBDaGFuZ2VzIHRvIHJlbW92ZSBnY2Mgd2FybmluZ3MgKEpvaG4gQm93bGVyKQotICAgIENlcnRhaW4gb3B0aW9uYWwgZ2NjIHdhcm5pbmcgZmxhZ3MgcmVzdWx0ZWQgaW4gd2FybmluZ3MgaW4gbGlicG5nIGNvZGUuCi0gICAgV2l0aCB0aGVzZSBjaGFuZ2VzIG9ubHkgLVdjb252ZXJzaW9uIGFuZCAtV2Nhc3QtcXVhbCBjYW5ub3QgYmUgdHVybmVkIG9uLgotICAgIENoYW5nZXMgYXJlIHRyaXZpYWwgcmVhcnJhbmdlbWVudHMgb2YgY29kZS4gIC1XY29udmVyc2lvbiBpcyBub3QgcG9zc2libGUKLSAgICBmb3IgcG5ncnV0aWwuYyAoYmVjYXVzZSBvZiB0aGUgd2lkZXNwcmVhZCB1c2Ugb2YgKz0gZXQgYWwgb24gdmFyaWFibGVzCi0gICAgc21hbGxlciB0aGFuIChpbnQpIG9yICh1bnNpZ25lZCBpbnQpKSBhbmQgLVdjYXN0LXF1YWwgaXMgbm90IHBvc3NpYmxlCi0gICAgd2l0aCBwbmd3aW8uYyBhbmQgcG5nd3V0aWwuYyBiZWNhdXNlIHRoZSAnd3JpdGUnIGNhbGxiYWNrIGFuZCB6bGliCi0gICAgY29tcHJlc3Npb24gYm90aCBmYWlsIHRvIGRlY2xhcmUgdGhlaXIgaW5wdXQgYnVmZmVycyB3aXRoICdjb25zdCcuCi0KLVZlcnNpb24gMS41LjBiZXRhNTYgW0RlY2VtYmVyIDcsIDIwMTBdCi0gIEFkZGVkIHRoZSBwcml2YXRlIFBOR19VTlVTRUQoKSBtYWNybyBkZWZpbml0aW9uIGluIHBuZ3ByaXYuaC4KLSAgQWRkZWQgc29tZSBjb21tZW50YXJ5IGFib3V0IFBOR19FWFBPUlQgaW4gcG5nLmggYW5kIHBuZ2NvbmYuaAotICBSZXZpc2VkIFBOR19FWFBPUlQoKSBtYWNybyBhbmQgYWRkZWQgUE5HX0VYUE9SVEEoKSBtYWNybywgd2l0aCB0aGUKLSAgICBvYmplY3RpdmUgb2Ygc2ltcGxpZnlpbmcgYW5kIGltcHJvdmluZyB0aGUgY29zbWV0aWMgYXBwZWFyYW5jZSBvZiBwbmcuaC4KLSAgRml4ZWQgc29tZSBpbmNvcnJlY3QgIj0iIG1hY3JvIG5hbWVzIGluIHBuZ2xpYmNvbmYuZGZhCi0gIEluY2x1ZGVkIGRvY3VtZW50YXRpb24gb2YgY2hhbmdlcyBpbiAxLjUuMCBmcm9tIDEuNC54IGluIGxpYnBuZy1tYW51YWwudHh0Ci0KLVZlcnNpb24gMS41LjBiZXRhNTcgW0RlY2VtYmVyIDksIDIwMTBdCi0gIERvY3VtZW50ZWQgdGhlIHBuZ3ZhbGlkIGdhbW1hIGVycm9yIHN1bW1hcnkgd2l0aCBhZGRpdGlvbmFsIGNvbW1lbnRzIGFuZAotICAgIHByaW50IHN0YXRlbWVudHMuCi0gIEltcHJvdmVkIG1pc3Npbmcgc3ltYm9sIGhhbmRsaW5nIGluIGNoZWNrc3ltLmF3azsgc3ltYm9scyBtaXNzaW5nIGluIGJvdGgKLSAgICB0aGUgb2xkIGFuZCBuZXcgZmlsZXMgY2FuIG5vdyBiZSBvcHRpb25hbGx5IGlnbm9yZWQsIHRyZWF0ZWQgYXMgZXJyb3JzCi0gICAgb3Igd2FybmluZ3MuCi0gIFJlbW92ZWQgcmVmZXJlbmNlcyB0byBwbmd2Y3JkLmMgYW5kIHBuZ2djY3JkLmMgZnJvbSB0aGUgdnN0dWRpbyBwcm9qZWN0LgotICBVcGRhdGVkICJsaWJwbmcxNCIgdG8gImxpYnBuZzE1IiBpbiB0aGUgdmlzdWFsYzcxIHByb2plY3QuCi0gIEVuYWJsZWQgdGhlIHN0cmlwMTYgdGVzdHMgaW4gcG5ndmFsaWQuYAotICBEb24ndCBkaXNwbGF5IHRlc3QgcmVzdWx0cyAoZXhjZXB0IFBBU1MvRkFJTCkgd2hlbiBydW5uaW5nICJtYWtlIHRlc3QiLgotICAgIEluc3RlYWQgcHV0IHRoZW0gaW4gcG5ndGVzdC1sb2cudHh0Ci0gIEFkZGVkICItLXdpdGgtenByZWZpeD08c3RyaW5nPiIgdG8gY29uZmlndXJlLmFjCi0gIFVwZGF0ZWQgdGhlIHByZWJ1aWx0IGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gYXV0b2NvbmYgdmVyc2lvbiAyLjY4Ci0KLVZlcnNpb24gMS41LjBiZXRhNTggW0RlY2VtYmVyIDE5LCAyMDEwXQotICBGaXhlZCBpbnRlcmxhY2UgaW1hZ2UgaGFuZGxpbmcgYW5kIGFkZCB0ZXN0IGNhc2VzIChKb2huIEJvd2xlcikKLSAgRml4ZWQgdGhlIGNsZWFuIHJ1bGUgaW4gTWFrZWZpbGUuYW0gdG8gcmVtb3ZlIHBuZ3Rlc3QtbG9nLnR4dAotICBNYWRlIG1pbm9yIGNoYW5nZXMgdG8gd29yayBhcm91bmQgd2FybmluZ3MgaW4gZ2NjIDMuNAotCi1WZXJzaW9uIDEuNS4wcmMwMSBbRGVjZW1iZXIgMjcsIDIwMTBdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS41LjByYzAyIFtEZWNlbWJlciAyNywgMjAxMF0KLSAgRWxpbWluYXRlZCByZWZlcmVuY2VzIHRvIHRoZSBzY3JpcHRzLyouZGVmIGZpbGVzIGluIHByb2plY3QvdmlzdWFsYzcxLgotCi1WZXJzaW9uIDEuNS4wcmMwMyBbRGVjZW1iZXIgMjgsIDIwMTBdCi0gIEVsaW1pbmF0ZWQgc2NyaXB0cy8qLmRlZiBhbmQgcmV2aXNlZCBNYWtlZmlsZS5hbSBhY2NvcmRpbmdseQotCi1WZXJzaW9uIDEuNS4wcmMwNCBbRGVjZW1iZXIgMjksIDIwMTBdCi0gIEZpeGVkIGJ1ZyBpbiBiYWNrZ3JvdW5kIHRyYW5zZm9ybWF0aW9uIGhhbmRsaW5nIGluIHBuZ3J0cmFuLmMgKGl0IHdhcwotICAgIGxvb2tpbmcgZm9yIHRoZSBmbGFnIGluIHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyBpbnN0ZWFkIG9mIGluCi0gICAgcG5nX3B0ci0+ZmxhZ3MpIChEYXZpZCBSYXltb25kKS4KLQotVmVyc2lvbiAxLjUuMHJjMDUgW0RlY2VtYmVyIDMxLCAyMDEwXQotICBGaXhlZCB0eXBvIGluIGEgY29tbWVudCBpbiBDTWFrZUxpc3RzLnR4dCAobGlicG5nMTQgPT4gbGlicG5nMTUpIChDb3NtaW4pCi0KLVZlcnNpb24gMS41LjByYzA2IFtKYW51YXJ5IDQsIDIwMTFdCi0gIENoYW5nZWQgdGhlIG5ldyBjb25maWd1cmUgb3B0aW9uICJ6cHJlZml4PXN0cmluZyIgdG8gInpsaWItcHJlZml4PXN0cmluZyIKLQotVmVyc2lvbiAxLjUuMHJjMDcgW0phbnVhcnkgNCwgMjAxMV0KLSAgVXBkYXRlZCBjb3B5cmlnaHQgeWVhci4KLQotVmVyc2lvbiAxLjUuMCBbSmFudWFyeSA2LCAyMDExXQotICBObyBjaGFuZ2VzLgotCi12ZXJzaW9uIDEuNS4xYmV0YTAxIFtKYW51YXJ5IDgsIDIwMTFdCi0gIEFkZGVkIGRlc2NyaXB0aW9uIG9mIHBuZ19zZXRfY3JjX2FjdGlvbigpIHRvIHRoZSBtYW51YWwuCi0gIEFkZGVkIGEgbm90ZSBpbiB0aGUgbWFudWFsIHRoYXQgdGhlIHR5cGUgb2YgdGhlIGlDQ1AgcHJvZmlsZSB3YXMgY2hhbmdlZAotICAgIGZyb20gcG5nX2NoYXJwcCB0byBwbmdfYnl0ZXBwIGluIHBuZ19nZXRfaUNDUCgpLiAgVGhpcyBjaGFuZ2UgaGFwcGVuZWQKLSAgICBpbiB2ZXJzaW9uIDEuNS4wYmV0YTM2IGJ1dCBpcyBub3Qgbm90ZWQgaW4gdGhlIENIQU5HRVMuICBTaW1pbGFybHksCi0gICAgaXQgd2FzIGNoYW5nZWQgZnJvbSBwbmdfY2hhcnBwIHRvIHBuZ19jb25zdF9ieXRlcHAgaW4gcG5nX3NldF9pQ0NQKCkuCi0gIEVuc3VyZSB0aGF0IHBuZ19yZ2JfdG9fZ3JheSBpZ25vcmVzIHBhbGV0dGUgbWFwcGVkIGltYWdlcywgaWYgbGlicG5nCi0gICAgaW50ZXJuYWxseSBoYXBwZW5zIHRvIGNhbGwgaXQgd2l0aCBvbmUsIGFuZCBmaXhlZCBhIGZhaWx1cmUgdG8gaGFuZGxlCi0gICAgcGFsZXR0ZSBtYXBwZWQgaW1hZ2VzIGNvcnJlY3RseS4gIFRoaXMgZml4ZXMgQ1ZFLTI2OTAuCi0KLVZlcnNpb24gMS41LjFiZXRhMDIgW0phbnVhcnkgMTQsIDIwMTFdCi0gIEZpeGVkIGEgYnVnIGluIGhhbmRsaW5nIG9mIGludGVybGFjZWQgaW1hZ2VzIChiZXJvIGF0IGFya2xpbnV4Lm9yZykuCi0gIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQgKENsaWZmb3JkIFlhcHApCi0KLVZlcnNpb24gMS41LjFiZXRhMDMgW0phbnVhcnkgMTQsIDIwMTFdCi0gIEZpeGVkIHR5cGVjYXN0aW5nIG9mIHNvbWUgcG5nX2RlYnVnKCkgc3RhdGVtZW50cyAoQ29zbWluKQotCi1WZXJzaW9uIDEuNS4xYmV0YTA0IFtKYW51YXJ5IDE2LCAyMDExXQotICBVcGRhdGVkIGRvY3VtZW50YXRpb24gb2YgcG5nX3NldHxnZXRfdFJOUygpIChUaG9tYXMgS2xhdXNuZXIpLgotICBNZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gdGhhdCBhcHBsaWNhdGlvbnMgbXVzdCAjaW5jbHVkZSAiemxpYi5oIgotICAgIGlmIHRoZXkgbmVlZCBhY2Nlc3MgdG8gYW55dGhpbmcgaW4gemxpYi5oLCBhbmQgdGhhdCBhIG51bWJlciBvZgotICAgIG1hY3JvcyBzdWNoIGFzIHBuZ19tZW1zZXQoKSBhcmUgbm8gbG9uZ2VyIGFjY2Vzc2libGUgYnkgYXBwbGljYXRpb25zLgotICBDb3JyZWN0ZWQgcG5ndmFsaWQgZ2FtbWEgdGVzdCAic2FtcGxlIiBmdW5jdGlvbiB0byBhY2Nlc3MgYWxsIG9mIHRoZSBjb2xvcgotICAgIHNhbXBsZXMgb2YgZWFjaCBwaXhlbCwgaW5zdGVhZCBvZiBzYW1wbGluZyB0aGUgcmVkIGNoYW5uZWwgdGhyZWUgdGltZXMuCi0gIFByZWZpeGVkIHZhcmlhYmxlIG5hbWVzIGluZGV4LCBkaXYsIGV4cCwgZ2FtbWEgd2l0aCAicG5nXyIgdG8gYXZvaWQgInNoYWRvdyIKLSAgICB3YXJuaW5ncywgYW5kIChtaXN0YWtlbmx5KSBjaGFuZ2VkIHBuZ19leHAoKSB0byBleHAoKS4KLQotVmVyc2lvbiAxLjUuMWJldGEwNSBbSmFudWFyeSAxNiwgMjAxMV0KLSAgQ2hhbmdlZCB2YXJpYWJsZSBuYW1lcyBwbmdfaW5kZXgsIHBuZ19kaXYsIHBuZ19leHAsIGFuZCBwbmdfZ2FtbWEgdG8KLSAgICBjaGFyX2luZGV4LCBkaXZpc29yLCBleHBfYjEwLCBhbmQgZ2FtbWFfdmFsLCByZXNwZWN0aXZlbHksIGFuZAotICAgIGNoYW5nZWQgZXhwKCkgYmFjayB0byBwbmdfZXhwKCkuCi0KLVZlcnNpb24gMS41LjFiZXRhMDYgW0phbnVhcnkgMjAsIDIwMTFdCi0gIFByZXZlbnQgcG5nX3B1c2hfY3JjX3NraXAoKSBmcm9tIGhhbmdpbmcgd2hpbGUgcmVhZGluZyBhbiB1bmtub3duIGNodW5rCi0gICAgb3IgYW4gb3Zlci1sYXJnZSBjb21wcmVzc2VkIHpUWHQgY2h1bmsgd2l0aCB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyLgotICBFbGltaW5hdGVkIG1vcmUgR0NDICJzaGFkb3ciIHdhcm5pbmdzLgotICBSZXZpc2VkIHBuZ19maXhlZCgpIGluIHBuZy5jIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgcmVhY2hpbmcgdGhlCi0gICAgZW5kIHdpdGhvdXQgcmV0dXJuaW5nIGFueXRoaW5nLgotCi1WZXJzaW9uIDEuNS4xYmV0YTA3IFtKYW51YXJ5IDIyLCAyMDExXQotICBJbiB0aGUgbWFudWFsLCBkZXNjcmliZSB0aGUgcG5nX2dldF9JSERSKCkgYXJndW1lbnRzIGluIHRoZSBjb3JyZWN0IG9yZGVyLgotICBBZGRlZCBjb25zdF9wbmdfc3RydWN0cCBhbmQgY29uc3RfcG5nX2luZm9wIHR5cGVzLCBhbmQgdXNlZCB0aGVtIGluCi0gICAgcHJvdG90eXBlcyBmb3IgbW9zdCBwbmdfZ2V0XyooKSBmdW5jdGlvbnMuCi0KLVZlcnNpb24gMS41LjFiZXRhMDggW0phbnVhcnkgMjMsIDIwMTFdCi0gIEFkZGVkIHBuZ19nZXRfaW9fY2h1bmtfdHlwZSgpIGFuZCBkZXByZWNhdGVkIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSgpCi0gIEFkZGVkIHN5bm9wc2VzIGZvciB0aGUgSU9fU1RBVEUgZnVuY3Rpb25zIGFuZCBvdGhlciBtaXNzaW5nIHN5bm9wc2VzCi0gICAgdG8gdGhlIG1hbnVhbC4gUmVtb3ZlZCB0aGUgc3lub3BzZXMgZnJvbSBsaWJwbmdwZi4zIGJlY2F1c2UgdGhleQotICAgIHdlcmUgb3V0IG9mIGRhdGUgYW5kIG5vIGxvbmdlciB1c2VmdWwuICBCZXR0ZXIgaW5mb3JtYXRpb24gY2FuIGJlCi0gICAgb2J0YWluZWQgYnkgcmVhZGluZyB0aGUgcHJvdG90eXBlcyBhbmQgY29tbWVudHMgaW4gcG5ncHJpdi5oCi0gIEF0dGVtcHRlZCB0byBmaXggY3BwIG9uIFNvbGFyaXMgd2l0aCBTLiBTdHVkaW8gMTIgY2MsIGZpeCBidWlsZAotICAgIEFkZGVkIGEgbWFrZSBtYWNybyBERk5DUFAgdGhhdCBpcyBhIENQUCB0aGF0IHdpbGwgYWNjZXB0IHRoZSB0b2tlbnMgaW4KLSAgICBhIC5kZm4gZmlsZSBhbmQgYWRkcyBjb25maWd1cmUgc3R1ZmYgdG8gdGVzdCBmb3Igc3VjaCBhIENQUC4gIC4vY29uZmlndXJlCi0gICAgc2hvdWxkIGZhaWwgaWYgb25lIGlzIG5vdCBhdmFpbGFibGUuCi0gIENvcnJlY3RlZCBjb25zdF9wbmdfIGluIHBuZy5oIHRvIHBuZ19jb25zdF8gdG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBuYW1lc3BhY2UuCi0gIEFkZGVkIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyIGFuZCBwbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIgZm9yIHRoZQotICAgIGJlbmVmaXQgb2YgdGhlIHVzZXIgdHJhbnNmb3JtIGNhbGxiYWNrLgotICBBZGRlZCBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlIGFuZCBwbmdfcHJvY2Vzc19kYXRhX3NraXAgZm9yIHRoZSBiZW5lZml0IG9mCi0gICAgcHJvZ3Jlc3NpdmUgcmVhZGVycyB0aGF0IG5lZWQgdG8gc3RvcCBkYXRhIHByb2Nlc3Npbmcgb3Igd2FudCB0byBvcHRpbWl6ZQotICAgIHNraXBwaW5nIG9mIHVucmVhZCBkYXRhIChlLmcuLCBpZiB0aGUgcmVhZGVyIG1hcmtzIGEgY2h1bmsgdG8gYmUgc2tpcHBlZC4pCi0KLVZlcnNpb24gMS41LjFiZXRhMDkgW0phbnVhcnkgMjQsIDIwMTFdCi0gIEVuaGFuY2VkIHBuZ3ZhbGlkLCBjb3JyZWN0ZWQgYW4gZXJyb3IgaW4gZ3JheV90b19yZ2IsIGNvcnJlY3RlZCBkb2MgZXJyb3IuCi0gICAgcG5ndmFsaWQgY29udGFpbnMgdGVzdHMgb2YgdHJhbnNmb3Jtcywgd2hpY2ggdGVzdHMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZAotICAgIGJlY2F1c2UgdGhleSBhcmUgaW5jb21wbGV0ZWx5IHRlc3RlZC4gIGdyYXlfdG9fcmdiIHdhcyBmYWlsaW5nIHRvIGV4cGFuZAotICAgIHRoZSBiaXQgZGVwdGggZm9yIHNtYWxsZXIgYml0IGRlcHRoIGltYWdlczsgdGhpcyBzZWVtcyB0byBiZSBhIGxvbmcKLSAgICBzdGFuZGluZyBlcnJvciBhbmQgcmVzdWx0ZWQsIGFwcGFyZW50bHksIGluIGludmFsaWQgb3V0cHV0Ci0gICAgKENWRS0yMDExLTA0MDgsIENFUlQgVlUjNjQzMTQwKS4gIFRoZSBkb2N1bWVudGF0aW9uIGRpZCBub3QgYWNjdXJhdGVseQotICAgIGRlc2NyaWJlIHdoYXQgbGlicG5nIHJlYWxseSBkb2VzIHdoZW4gY29udmVydGluZyBSR0IgdG8gZ3JheS4KLQotVmVyc2lvbiAxLjUuMWJldGExMCBbSmFudWFyeSAyNywgMjAxMF0KLSAgRml4ZWQgaW5jb3JyZWN0IGV4YW1wbGVzIG9mIGNhbGxiYWNrIHByb3RvdHlwZXMgaW4gdGhlIG1hbnVhbCwgdGhhdCB3ZXJlCi0gICAgaW50cm9kdWNlZCBpbiBsaWJwbmctMS4wLjAuCi0gIEluIGFkZGl0aW9uIHRoZSBvcmRlciBvZiB0aGUgcG5nX2dldF91aW50IG1hY3JvcyB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgcmVsZXZhbnQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaGFzIGJlZW4gcmV2ZXJzZWQuICBUaGlzIGhlbHBzIHRoZQotICAgIHByZXByb2Nlc3Npbmcgb2YgdGhlIHN5bWJvbCBmaWxlcyBiZSBtb3JlIHJvYnVzdC4gIEZ1cnRoZXJtb3JlLCB0aGUKLSAgICBzeW1ib2wgZmlsZSBwcmVwcm9jZXNzaW5nIG5vdyB1c2VzIC1EUE5HX05PX1VTRV9SRUFEX01BQ1JPUyBldmVuIHdoZW4KLSAgICB0aGUgbGlicmFyeSBtYXkgYWN0dWFsbHkgYmUgYnVpbHQgd2l0aCBQTkdfVVNFX1JFQURfTUFDUk9TOyB0aGlzIHN0b3BzCi0gICAgdGhlIHJlYWQgbWFjcm9zIGludGVyZmVyaW5nIHdpdGggdGhlIHN5bWJvbCBmaWxlIGZvcm1hdC4KLSAgTWFkZSB0aGUgbWFudWFsLCBzeW5vcHNlcywgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgdXNlIHRoZSBmdW5jdGlvbgotICAgIGFyZ3VtZW50IG5hbWVzIGZpbGVfZ2FtbWEsIGludF9maWxlX2dhbW1hLCBhbmQgc3JnYl9pbnRlbnQgY29uc2lzdGVudGx5LgotCi1WZXJzaW9uIDEuNS4xYmV0YTExIFtKYW51YXJ5IDI4LCAyMDExXQotICBDaGFuZ2VkIFBOR19VTlVTRUQgZnJvbSAicGFyYW09cGFyYW07IiB0byAie2lmKHBhcmFtKXt9fSIuCi0gIENvcnJlY3RlZCBsb2NhbCB2YXJpYWJsZSB0eXBlIGluIG5ldyBBUEkgcG5nX3Byb2Nlc3NfZGF0YV9za2lwKCkKLSAgICBUaGUgdHlwZSB3YXMgc2VsZi1ldmlkZW50bHkgaW5jb3JyZWN0IGJ1dCBvbmx5IGNhdXNlcyBwcm9ibGVtcyBvbiA2NC1iaXQKLSAgICBhcmNoaXRlY3R1cmVzLgotICBBZGRlZCB0cmFuc2Zvcm0gdGVzdHMgdG8gcG5ndmFsaWQgYW5kIHNpbXBsaWZpZWQgdGhlIGFyZ3VtZW50cy4KLQotVmVyc2lvbiAxLjUuMXJjMDEgW0phbnVhcnkgMjksIDIwMTFdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS41LjFyYzAyIFtKYW51YXJ5IDMxLCAyMDExXQotICBBZGRlZCBhIHJlcXVlc3QgaW4gdGhlIG1hbnVhbCB0aGF0IGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlICJwbmdfIiBvcgotICAgICJQTkdfIiB0byBiZWdpbiBhbnkgb2YgdGhlaXIgb3duIHN5bWJvbHMuCi0gIENoYW5nZWQgUE5HX1VOVVNFRCB0byAiKHZvaWQpcGFyYW07IiBhbmQgdXBkYXRlZCB0aGUgY29tbWVudGFyeSBpbiBwbmdwcml2LmgKLQotVmVyc2lvbiAxLjUuMSBbRmVicnVhcnkgMywgMjAxMV0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjUuMmJldGEwMSBbRmVicnVhcnkgMTMsIDIwMTFdCi0gIE1vcmUgLVdzaGFkb3cgZml4ZXMgZm9yIG9sZGVyIGdjYyBjb21waWxlcnMuICBPbGRlciBnY2MgdmVyc2lvbnMgYXBwYXJlbnRseQotICAgIGNoZWNrIGZvcm1hbCBwYXJhbWV0ZXJzIG5hbWVzIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAoYXMgd2VsbCBhcwotICAgIGRlZmluaXRpb25zKSB0byBzZWUgaWYgdGhleSBtYXRjaCBhIG5hbWUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0gIFJldmlzZWQgUE5HX0VYUE9SVEEgbWFjcm8gdG8gbm90IHVzZSBhbiBlbXB0eSBwYXJhbWV0ZXIsIHRvIGFjY29tbW9kYXRlIHRoZQotICAgIG9sZCBWaXN1YWxDKysgcHJlcHJvY2Vzc29yLgotICBUdXJuZWQgb24gaW50ZXJsYWNlIGhhbmRsaW5nIGluIHBuZ19yZWFkX3BuZygpLgotICBGaXhlZCBnY2MgcGVuZGFudGljIHdhcm5pbmdzLgotICBIYW5kbGUgbG9uZ2ptcCBpbiBDeWd3aW4uCi0gIEZpeGVkIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKCkgaW4gdGhlIGludGVybGFjZWQgY2FzZS4KLSAgQ2xlYW5lZCB1cCBBTFBIQSBmbGFncyBhbmQgdHJhbnNmb3JtYXRpb25zLgotICBJbXBsZW1lbnRlZCBleHBhbnNpb24gdG8gMTYgYml0cy4KLQotVmVyc2lvbiAxLjUuMmJldGEwMiBbRmVicnVhcnkgMTksIDIwMTFdCi0gIEZpeGVkIG1pc3Rha2UgaW4gdGhlIGRlc2NyaXB0aW9ucyBvZiB1c2VyIHJlYWRfdHJhbnNmb3JtIGFuZCB3cml0ZV90cmFuc2Zvcm0KLSAgICBmdW5jdGlvbiBwcm90b3R5cGVzIGluIHRoZSBtYW51YWwuICBUaGUgcm93X2luZm8gc3RydWN0IGlzIHBuZ19yb3dfaW5mb3AuCi0gIFJldmVydGVkIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKCkgdG8gcHJldmlvdXMgKDEuNS4yYmV0YTAxKSBiZWhhdmlvci4KLSAgQ29ycmVjdGVkIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyIGRvY3VtZW50YXRpb24KLSAgRml4ZWQgdGhlIHJlYWQvd3JpdGUgcm93IGNhbGxiYWNrIGRvY3VtZW50YXRpb24uCi0gICAgVGhpcyBkb2N1bWVudHMgdGhlIGN1cnJlbnQgYmVoYXZpb3IsIHdoZXJlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIKLSAgICBldmVyeSByb3cgd2l0aCBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIHRvIHRoZSBuZXh0IHJvdy4KLQotVmVyc2lvbiAxLjUuMmJldGEwMyBbTWFyY2ggMywgMjAxMV0KLSAgRml4ZWQgc2NyaXB0cy9tYWtlZmlsZS52Y3dpbjMyCi0gIFVwZGF0ZWQgY29udHJpYi9wbmdzdWl0ZS9SRUFETUUgdG8gYWRkIHRoZSB3b3JkICJtb2RpZnkiLgotICBEZWZpbmUgUE5HX0FMTE9DQVRFRCB0byBibGFuayB3aGVuIF9NU0NfVkVSPDEzMDAuCi0KLVZlcnNpb24gMS41LjJyYzAxIFtNYXJjaCAxOSwgMjAxMV0KLSAgRGVmaW5lIHJlbWFpbmluZyBhdHRyaWJ1dGVzIHRvIGJsYW5rIHdoZW4gTVNDX1ZFUjwxMzAwLgotICBpZmRlZiBvdXQgbWFzayBhcnJheXMgaW4gcG5ncmVhZC5jIHdoZW4gaW50ZXJsYWNpbmcgaXMgbm90IHN1cHBvcnRlZC4KLQotVmVyc2lvbiAxLjUuMnJjMDIgW01hcmNoIDIyLCAyMDExXQotICBBZGRlZCBhIGhpbnQgdG8gdHJ5IENQUD0vYmluL2NwcCBpZiAiY3BwIC1FIiBmYWlscyBpbiBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrCi0gICAgYW5kIGluIGNvbnRyaWIvcG5nbWluaW0vKi9tYWtlZmlsZSwgZWcuLCBvbiBTdW5PUyA1LjEwLCBhbmQgcmVtb3ZlZCAic3RyaXAiCi0gICAgZnJvbSB0aGUgbWFrZWZpbGVzLgotICBGaXhlZCBhIGJ1ZyAocHJlc2VudCBzaW5jZSBsaWJwbmctMS4wLjcpIHRoYXQgbWFrZXMgcG5nX2hhbmRsZV9zUExUKCkgZmFpbAotICAgIHRvIGNvbXBpbGUgd2hlbiBQTkdfTk9fUE9JTlRFUl9JTkRFWElORyBpcyBkZWZpbmVkIChDaHViYW5vdiBLaXJpbGwpCi0KLVZlcnNpb24gMS41LjJyYzAzIFtNYXJjaCAyNCwgMjAxMV0KLSAgRG9uJ3QgaW5jbHVkZSBzdGFuZGFyZCBoZWFkZXIgZmlsZXMgaW4gcG5nLmggd2hpbGUgYnVpbGRpbmcgdGhlIHN5bWJvbCB0YWJsZSwKLSAgICB0byBhdm9pZCBjcHAgZmFpbHVyZSBvbiBTdW5PUyAoaW50cm9kdWNlZCBQTkdfQlVJTERJTkdfU1lNQk9MX1RBQkxFIG1hY3JvKS4KLQotVmVyc2lvbiAxLjUuMiBbTWFyY2ggMzEsIDIwMTFdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS41LjNiZXRhMDEgW0FwcmlsIDEsIDIwMTFdCi0gIFJlLWluaXRpYWxpemUgdGhlIHpsaWIgY29tcHJlc3NvciBiZWZvcmUgY29tcHJlc3Npbmcgbm9uLUlEQVQgY2h1bmtzLgotICBBZGRlZCBBUEkgZnVuY3Rpb25zIChwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbGV2ZWwoKSBhbmQgZm91ciBvdGhlcnMpIHRvCi0gICAgc2V0IHBhcmFtZXRlcnMgZm9yIHpsaWIgY29tcHJlc3Npb24gb2Ygbm9uLUlEQVQgY2h1bmtzLgotCi1WZXJzaW9uIDEuNS4zYmV0YTAyIFtBcHJpbCAzLCAyMDExXQotICBVcGRhdGVkIHNjcmlwdHMvc3ltYm9scy5kZWYgd2l0aCBuZXcgQVBJIGZ1bmN0aW9ucy4KLSAgT25seSBjb21waWxlIHRoZSBuZXcgemxpYiByZS1pbml0aWFsaXppbmcgY29kZSB3aGVuIHRleHQgb3IgaUNDUCBpcwotICAgIHN1cHBvcnRlZCwgdXNpbmcgUE5HX1dSSVRFX0NPTVBSRVNTRURfVEVYVF9TVVBQT1JURUQgbWFjcm8uCi0gIEltcHJvdmVkIHRoZSBvcHRpbWl6YXRpb24gb2YgdGhlIHpsaWIgQ01GIGJ5dGUgKHNlZSBsaWJwbmctMS4yLjZiZXRhMDMpLgotICBPcHRpbWl6ZSB0aGUgemxpYiBDTUYgYnl0ZSBpbiBub24tSURBVCBjb21wcmVzc2VkIGNodW5rcwotCi1WZXJzaW9uIDEuNS4zYmV0YTAzIFtBcHJpbCAxNiwgMjAxMV0KLSAgRml4ZWQgZ2NjIC1hbnNpIC1wZWRhbnRpYyBjb21waWxlLiBBIHN0cmljdCBBTlNJIHN5c3RlbSBkb2VzIG5vdCBoYXZlCi0gICAgc25wcmludGYsIGFuZCB0aGUgIl9fU1RSSUNUX0FOU0lfXyIgZGV0ZWN0cyB0aGF0IGNvbmRpdGlvbiBtb3JlIHJlbGlhYmx5Ci0gICAgdGhhbiBfX1NURENfXyAoSm9obiBCb3dsZXIpLgotICBSZW1vdmVkIHRoZSBQTkdfUFRSX05PUkVUVVJOIGF0dHJpYnV0ZSBiZWNhdXNlIGl0IHRvbyBkYW5nZXJvdXMuIEl0IHRlbGxzCi0gICAgdGhlIGNvbXBpbGVyIHRoYXQgYSB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrICh0aGUgZXJyb3IgaGFuZGxlcikgZG9lcyBub3QKLSAgICByZXR1cm4sIHlldCB0aGVyZSBpcyBubyBndWFyYW50ZWUgaW4gcHJhY3RpY2UgdGhhdCB0aGUgYXBwbGljYXRpb24gY29kZQotICAgIHdpbGwgY29ycmVjdGx5IGltcGxlbWVudCB0aGUgZXJyb3IgaGFuZGxlciBiZWNhdXNlIHRoZSBjb21waWxlciBvbmx5Ci0gICAgaXNzdWVzIGEgd2FybmluZyBpZiB0aGVyZSBpcyBhIG1pc3Rha2UgKEpvaG4gQm93bGVyKS4KLSAgUmVtb3ZlZCB0aGUgbm8tbG9uZ2VyLXVzZWQgUE5HX0RFUFNUUlVDVCBtYWNyby4KLSAgVXBkYXRlZCB0aGUgemxpYiB2ZXJzaW9uIHRvIDEuMi41IGluIHRoZSBWU3R1ZGlvIHByb2plY3QuCi0gIEZpeGVkIDY0LWJpdCBidWlsZHMgd2hlcmUgcG5nX3VpbnRfMzIgaXMgc21hbGxlciB0aGFuIHBuZ19zaXplX3QgaW4KLSAgICBwbmd3dXRpbC5jIChKb2huIEJvd2xlcikuCi0gIEZpeGVkIGJ1ZyB3aXRoIHN0cmlwcGluZyB0aGUgZmlsbGVyIG9yIGFscGhhIGNoYW5uZWwgd2hlbiB3cml0aW5nLCB0aGF0Ci0gICAgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNS4yYmV0YTAxIChidWcgcmVwb3J0IGJ5IEFuZHJldyBDaHVyY2gpLgotCi1WZXJzaW9uIDEuNS4zYmV0YTA0IFtBcHJpbCAyNywgMjAxMV0KLSAgVXBkYXRlZCBwbmd0ZXN0LnBuZyB3aXRoIHRoZSBuZXcgemxpYiBDTUYgb3B0aW1pemF0aW9uLgotICBDbGVhbmVkIHVwIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNvZGUgYW5kIG9mIGJhY2tncm91bmQvZ2FtbWEgaGFuZGxpbmcKLSAgICBJbnRlcm5hbCBjaGFuZ2VzIG9ubHkgZXhjZXB0IGEgbmV3IG9wdGlvbiB0byBhdm9pZCBjb21waWxpbmcgdGhlCi0gICAgcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlIEFQSSAod2hpY2ggaXMgbm90IHVzZWQgYXQgYWxsIGludGVybmFsbHkuKQotICAgIFRoZSBtYWluIGNoYW5nZSBpcyB0byBtb3ZlIHRoZSB0cmFuc2Zvcm0gdGVzdHMgKFJFQURfVFJBTlNGT1JNUywKLSAgICBXUklURV9UUkFOU0ZPUk1TKSB1cCBvbmUgbGV2ZWwgdG8gdGhlIGNhbGxlciBvZiB0aGUgQVBJcy4gIFRoaXMgYXZvaWRzCi0gICAgY2FsbHMgdG8gc3B1cmlvdXMgZnVuY3Rpb25zIGlmIGFsbCB0cmFuc2Zvcm1zIGFyZSBkaXNhYmxlZCBhbmQgc2xpZ2h0bHkKLSAgICBzaW1wbGlmaWVzIHRob3NlIGZ1bmN0aW9ucy4gIFBuZ3ZhbGlkIG1vZGlmaWVkIHRvIGhhbmRsZSB0aGlzLgotICAgIEEgbWlub3IgY2hhbmdlIGlzIHRvIHN0b3AgdGhlIHN0cmlwXzE2IGFuZCBleHBhbmRfMTYgaW50ZXJmYWNlcyBmcm9tCi0gICAgZGlzYWJsaW5nIGVhY2ggb3RoZXI7IHRoaXMgYWxsb3dzIHRoZSBmdXR1cmUgYWxwaGEgcHJlbXVsdGlwbGljYXRpb24KLSAgICBjb2RlIHRvIHVzZSAxNi1iaXQgaW50ZXJtZWRpYXRlIHZhbHVlcyB3aGlsZSBzdGlsbCBwcm9kdWNpbmcgOC1iaXQgb3V0cHV0LgotICAgIHBuZ19kb19iYWNrZ3JvdW5kIGFuZCBwbmdfZG9fZ2FtbWEgaGF2ZSBiZWVuIHNpbXBsaWZpZWQgdG8gdGFrZSBhIHNpbmdsZQotICAgIHBvaW50ZXIgdG8gdGhlIHBuZ19zdHJ1Y3QgcmF0aGVyIHRoYW4gcG9pbnRlcnMgdG8gZXZlcnkgaXRlbSByZXF1aXJlZAotICAgIGZyb20gdGhlIHBuZ19zdHJ1Y3QuIFRoaXMgbWFrZXMgbm8gcHJhY3RpY2FsIGRpZmZlcmVuY2UgdG8gdGhlIGludGVybmFsCi0gICAgY29kZS4KLSAgQSBzZXJpb3VzIGJ1ZyBpbiB0aGUgcG5ndmFsaWQgaW50ZXJuYWwgcm91dGluZSAnc3RhbmRhcmRfZGlzcGxheV9pbml0JyBoYXMKLSAgICBiZWVuIGZpeGVkIC0gdGhpcyBmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmVkIGNoYW5uZWwgYW5kIGFjY2lkZW50YWxseQotICAgIGluaXRpYWxpemVkIHRoZSBhbHBoYSBjaGFubmVsIHR3aWNlLgotICBDaGFuZ2VkIHBuZ19zdHJ1Y3Qgam1wX2J1ZiBtZW1iZXIgbmFtZSBmcm9tIHBuZ19qbXBidWYgdG8gdG1wX2ptcGJ1ZiB0bwotICAgIGF2b2lkIGEgcG9zc2libGUgY2xhc2ggd2l0aCB0aGUgcG5nX2ptcGJ1ZiBtYWNybyBvbiBzb21lIHBsYXRmb3Jtcy4KLQotVmVyc2lvbiAxLjUuM2JldGEwNSBbTWF5IDYsIDIwMTFdCi0gIEFkZGVkIHRoZSAiX1BPU0lYX1NPVVJDRSIgZmVhdHVyZSB0ZXN0IG1hY3JvIHRvIGVuc3VyZSBsaWJwbmcgc2VlcyB0aGUKLSAgICBjb3JyZWN0IEFQSS4gX1BPU0lYX1NPVVJDRSBpcyBkZWZpbmVkIGluIHBuZ3ByaXYuaCwgcG5ndGVzdC5jIGFuZAotICAgIHBuZ3ZhbGlkLmMgdG8gZW5zdXJlIHRoYXQgUE9TSVggY29uZm9ybWFudCBzeXN0ZW1zIGRpc2FibGUgbm9uLVBPU0lYIEFQSXMuCi0gIFJlbW92ZWQgcG5nX3NucHJpbnRmIGFuZCBhZGRlZCBmb3JtYXR0ZWQgd2FybmluZyBtZXNzYWdlcy4gIFRoaXMgY2hhbmdlIGFkZHMKLSAgICBpbnRlcm5hbCBBUElzIHRvIGFsbG93IHBuZ193YXJuaW5nIG1lc3NhZ2VzIHRvIGhhdmUgcGFyYW1ldGVycyB3aXRob3V0Ci0gICAgcmVxdWlyaW5nIHRoZSBob3N0IE9TIHRvIGltcGxlbWVudCBzbnByaW50Zi4gIEFzIGEgc2lkZSBlZmZlY3QgdGhlCi0gICAgZGVwZW5kZW5jeSBvZiB0aGUgdElNRS1zdXBwb3J0aW5nIFJGQzExMzIgY29kZSBvbiBzdGRpbyBpcyByZW1vdmVkIGFuZAotICAgIFBOR19OT19XQVJOSU5HUyBkb2VzIGFjdHVhbGx5IHdvcmsgbm93LgotICBQYXNzICIiIGluc3RlYWQgb2YgJ1wwJyB0byBwbmdfZGVmYXVsdF9lcnJvcigpIGluIHBuZ19lcnIoKS4gIFRoaXMgbWlzdGFrZQotICAgIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjIuMjBiZXRhMDEuICBUaGlzIGZpeGVzIENWRS0yMDExLTI2OTEuCi0gIEFkZGVkIFBOR19XUklURV9PUFRJTUlaRV9DTUZfU1VQUE9SVEVEIG1hY3JvIHRvIG1ha2UgdGhlIHpsaWIgIkNNRiIgYnl0ZQotICAgIG9wdGltaXphdGlvbiBjb25maWd1cmVhYmxlLgotICBJREFUIGNvbXByZXNzaW9uIGZhaWxlZCBpZiBwcmVjZWRlZCBieSBhIGNvbXByZXNzZWQgdGV4dCBjaHVuayAoYnVnCi0gICAgaW50cm9kdWNlZCBpbiBsaWJwbmctMS41LjNiZXRhMDEtMDIpLiAgVGhpcyB3YXMgYmVjYXVzZSB0aGUgYXR0ZW1wdCB0bwotICAgIHJlc2V0IHRoZSB6bGliIHN0cmVhbSBpbiBwbmdfd3JpdGVfSURBVCBoYXBwZW5lZCBhZnRlciB0aGUgZmlyc3QgSURBVAotICAgIGNodW5rIGhhZCBiZWVuIGRlZmxhdGVkIC0gbXVjaCB0b28gbGF0ZS4gIEluIHRoaXMgY2hhbmdlIGludGVybmFsCi0gICAgZnVuY3Rpb25zIHdlcmUgYWRkZWQgdG8gY2xhaW0vcmVsZWFzZSB0aGUgel9zdHJlYW0gYW5kLCBob3BlZnVsbHksIG1ha2UKLSAgICB0aGUgY29kZSBtb3JlIHJvYnVzdC4gIEFsc28gZGVmbGF0ZUVuZCBjaGVja2luZyBpcyBhZGRlZCAtIHByZXZpb3VzbHkKLSAgICBsaWJwbmcgd291bGQgaWdub3JlIGFuIGVycm9yIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KLQotVmVyc2lvbiAxLjUuM2JldGEwNiBbTWF5IDgsIDIwMTFdCi0gIFJlbW92ZWQgdGhlIC1EX0FMTF9TT1VSQ0UgZnJvbSBkZWZpbml0aW9ucyBmb3IgQUlYIGluIENNYWtlTGlzdHMudHh0Ci0gIEltcGxlbWVudGVkIHByZW11bHRpcGxpZWQgYWxwaGEgc3VwcG9ydDogcG5nX3NldF9hbHBoYV9tb2RlIEFQSQotCi1WZXJzaW9uIDEuNS4zYmV0YTA3IFtNYXkgMTEsIDIwMTFdCi0gIEFkZGVkIGV4cGFuZF8xNiBzdXBwb3J0IHRvIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZS4KLSAgQWRkZWQgbmFtZWQgdmFsdWUgYW5kICdmbGFnJyBnYW1tYSBzdXBwb3J0IHRvIHBuZ19zZXRfZ2FtbWEuICBNYWRlIGEgbWlub3IKLSAgICBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgKHVucmVsZWFzZWQpIEFCSS9BUEkgdG8gaGlkZSB0aGUgZXhhY3QgdmFsdWUgdXNlZAotICAgIGZvciBNYWNzIC0gaXQncyBub3QgYSBnb29kIGlkZWEgdG8gZW1iZWQgdGhpcyBpbiB0aGUgQUJJIQotICBNb3ZlZCBtYWNybyBkZWZpbml0aW9ucyBmb3IgUE5HX0hBVkVfSUhEUiwgUE5HX0hBVkVfUExURSwgYW5kIFBOR19BRlRFUl9JREFUCi0gICAgZnJvbSBwbmdwcml2LmggdG8gcG5nLmggYmVjYXVzZSB0aGV5IG11c3QgYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICB0aGF0IGNhbGwgcG5nX3NldF91bmtub3duX2NodW5rcygpLgotICBDaGVjayBmb3IgdXAtPmxvY2F0aW9uICFQTkdfQUZURVJfSURBVCB3aGVuIHdyaXRpbmcgdW5rbm93biBjaHVua3MKLSAgICBiZWZvcmUgSURBVC4KLQotVmVyc2lvbiAxLjUuM2JldGEwOCBbTWF5IDE2LCAyMDExXQotICBJbXByb3ZlZCAicG5ndmFsaWQgLS1zcGVlZCIgdG8gZXhjbHVkZSBtb3JlIG9mIHBuZ3ZhbGlkIGZyb20gdGhlIHRpbWUuCi0gIERvY3VtZW50ZWQgcG5nX3NldF9hbHBoYV9tb2RlKCksIG90aGVyIGNoYW5nZXMgaW4gbGlicG5nLjMvbGlicG5nLW1hbnVhbC50eHQKLSAgVGhlIGNIUk0gY2h1bmsgbm93IHNldHMgdGhlIGRlZmF1bHRzIGZvciBwbmdfc2V0X3JnYl90b19ncmF5KCkgKHdoZW4gbmVnYXRpdmUKLSAgICBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCBieSB0aGUgY2FsbGVyKSwgd2hpbGUgaW4gdGhlIGFic2VuY2Ugb2YgY0hSTQotICAgIHNSR0IvUmVjIDcwOSB2YWx1ZXMgYXJlIHN0aWxsIHVzZWQuICBUaGlzIGludHJvZHVjZWQgYSBkaXZpZGUtYnktemVybwotICAgIGJ1ZyBpbiBwbmdfaGFuZGxlX2NIUk0oKS4KLSAgVGhlIGJLR0QgY2h1bmsgbm8gbG9uZ2VyIG92ZXJ3cml0ZXMgdGhlIGJhY2tncm91bmQgdmFsdWUgc2V0IGJ5Ci0gICAgcG5nX3NldF9iYWNrZ3JvdW5kKCksIGFsbG93aW5nIHRoZSBsYXR0ZXIgdG8gYmUgdXNlZCBiZWZvcmUgdGhlIGZpbGUKLSAgICBoZWFkZXIgaXMgcmVhZC4gSXQgbmV2ZXIgcGVyZm9ybWVkIGFueSB1c2VmdWwgZnVuY3Rpb24gdG8gb3ZlcnJpZGUKLSAgICB0aGUgZGVmYXVsdCBhbnl3YXkuCi0gIEFkZGVkIG1lbW9yeSBvdmVyd3JpdGUgYW5kIHBhbGV0dGUgaW1hZ2UgY2hlY2tzIHRvIHBuZ3ZhbGlkLmMKLSAgICBQcmV2aW91c2x5IHBhbGV0dGUgaW1hZ2UgY29kZSB3YXMgcG9vcmx5IGNoZWNrZWQuIFNpbmNlIHRoZSB0cmFuc2Zvcm1hdGlvbgotICAgIGNvZGUgaGFzIGEgc3BlY2lhbCBwYWxldHRlIHBhdGggaW4gbW9zdCBjYXNlcyB0aGlzIHdhcyBhIHNldmVyZSB3ZWFrbmVzcy4KLSAgTWlub3IgY2xlYW51cCBhbmQgc29tZSBleHRyYSBjaGVja2luZyBpbiBwbmdydXRpbC5jIGFuZCBwbmdydHJhbi5jLiBXaGVuCi0gICAgZXhwYW5kaW5nIGFuIGluZGV4ZWQgaW1hZ2UsIGFsd2F5cyBleHBhbmQgdG8gUkdCQSBpZiB0cmFuc3BhcmVuY3kgaXMKLSAgICBwcmVzZW50LgotCi1WZXJzaW9uIDEuNS4zYmV0YTA5IFtNYXkgMTcsIDIwMTFdCi0gIFJldmVyc2VkIGVhcmxpZXIgMS41LjMgY2hhbmdlIG9mIHRyYW5zZm9ybWF0aW9uIG9yZGVyOyBtb3ZlIHBuZ19leHBhbmRfMTYKLSAgICBiYWNrIHdoZXJlIGl0IHdhcy4gIFRoZSBjaGFuZ2UgZG9lc24ndCB3b3JrIGJlY2F1c2UgaXQgcmVxdWlyZXMgMTYtYml0Ci0gICAgZ2FtbWEgdGFibGVzIHdoZW4gdGhlIGNvZGUgb25seSBnZW5lcmF0ZXMgOC1iaXQgb25lcy4gIFRoaXMgZmFpbHMKLSAgICBzaWxlbnRseTsgdGhlIGxpYnBuZyBjb2RlIGp1c3QgZG9lc24ndCBkbyBhbnkgZ2FtbWEgY29ycmVjdGlvbi4gIE1vdmluZwotICAgIHRoZSB0ZXN0cyBiYWNrIGxlYXZlcyB0aGUgb2xkLCBpbmFjY3VyYXRlLCA4LWJpdCBnYW1tYSBjYWxjdWxhdGlvbnMsIGJ1dAotICAgIHRoZXNlIGFyZSBjbGVhcmx5IGJldHRlciB0aGFuIG5vbmUhCi0KLVZlcnNpb24gMS41LjNiZXRhMTAgW01heSAyMCwgMjAxMV0KLQotICBwbmdfc2V0X2JhY2tncm91bmQoKSBhbmQgcG5nX2V4cGFuZF8xNigpIGRpZCBub3Qgd29yayB0b2dldGhlciBjb3JyZWN0bHkuCi0gICAgVGhpcyBwcm9ibGVtIGlzIHByZXNlbnQgaW4gMS41LjI7IGlmIHBuZ19zZXRfYmFja2dyb3VuZCBpcyBjYWxsZWQgd2l0aAotICAgIG5lZWRfZXhwYW5kIGZhbHNlIGFuZCB0aGUgbWF0Y2hpbmcgMTYgYml0IGNvbG9yIGxpYnBuZyBlcnJvbmVvdXNseSBqdXN0Ci0gICAgdHJlYXRzIGl0IGFzIGFuIDgtYml0IGNvbG9yIGJlY2F1c2Ugb2Ygd2hlcmUgcG5nX2RvX2V4cGFuZF8xNiBpcyBpbiB0aGUKLSAgICB0cmFuc2Zvcm0gbGlzdC4gIFRoaXMgc2ltcGxlIGZpeCByZWR1Y2VzIHRoZSBzdXBwbGllZCBjb2xvdXIgdG8gOC1iaXRzLAotICAgIHNvIGl0IGdldHMgc21hc2hlZCwgYnV0IHRoaXMgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgYmVoYXZpb3IuCi0gIEFkZGVkIHRlc3RzIGZvciBleHBhbmQxNiwgbW9yZSBmaXhlcyBmb3IgcGFsZXR0ZSBpbWFnZSB0ZXN0cyB0byBwbmd2YWxpZC4KLSAgICBDb3JyZWN0cyB0aGUgY29kZSBmb3IgcGFsZXR0ZSBpbWFnZSB0ZXN0cyBhbmQgZGlzYWJsZXMgYXR0ZW1wdHMgdG8KLSAgICB2YWxpZGF0ZSBwYWxldHRlIGNvbG9ycy4KLQotVmVyc2lvbiAxLjUuM3JjMDEgW0p1bmUgMywgMjAxMV0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjUuM3JjMDIgW0p1bmUgOCwgMjAxMV0KLSAgRml4ZWQgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCBpbiBwbmdfZm9ybWF0X2J1ZmZlcigpIChCdWcgcmVwb3J0IGJ5Ci0gICAgRnJhbmsgQnVzc2UsIENWRS0yMDExLTI1MDEsIHJlbGF0ZWQgdG8gQ1ZFLTIwMDQtMDQyMSkuCi0KLVZlcnNpb24gMS41LjNiZXRhMTEgW0p1bmUgMTEsIDIwMTFdCi0gIEZpeGVkIHBuZ19oYW5kbGVfc0NBTCB3aGljaCBpcyBicm9rZW4gaW4gMS41LiBUaGlzIGZpeGVzIENWRSAyMDExLTI2OTIuCi0gIEFkZGVkIHNDQUwgdG8gcG5ndGVzdC5wbmcKLSAgUmV2aXNlZCBkb2N1bWVudGF0aW9uIGFib3V0IHBuZ19zZXRfdXNlcl9saW1pdHMoKSB0byBzYXkgdGhhdCBpdCBhbHNvIGFmZmVjdHMKLSAgICBwbmcgd3JpdGluZy4KLSAgUmV2aXNlZCBoYW5kbGluZyBvZiBwbmdfc2V0X3VzZXJfbGltaXRzKCkgc28gdGhhdCBpdCBjYW4gaW5jcmVhc2UgdGhlCi0gICAgbGltaXQgYmV5b25kIHRoZSBQTkdfVVNFUl9XSURUSHxIRUlHSFRfTUFYOyBwcmV2aW91c2x5IGl0IGNvdWxkIG9ubHkKLSAgICByZWR1Y2UgaXQuCi0gIE1ha2UgdGhlIDE2LXRvLTggc2NhbGluZyBhY2N1cmF0ZS4gRGl2aWRpbmcgYnkgMjU2IHdpdGggbm8gcm91bmRpbmcgaXMKLSAgICB3cm9uZyAoaGlnaCBieSBvbmUpIDI1JSBvZiB0aGUgdGltZS4gRGl2aWRpbmcgYnkgMjU3IHdpdGggcm91bmRpbmcgaXMKLSAgICB3cm9uZyBpbiAxMjggb3V0IG9mIDY1NTM2IGNhc2VzLiBHZXR0aW5nIHRoZSByaWdodCBhbnN3ZXIgYWxsIHRoZSB0aW1lCi0gICAgd2l0aG91dCBkaXZpc2lvbiBpcyBlYXN5LgotICBBZGRlZCAiX1NVUFBPUlRFRCIgdG8gdGhlIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTiBtYWNyby4KLSAgQWRkZWQgcHJvamVjdHMvb3dhdGNvbSwgYW4gSURFIHByb2plY3QgZm9yIE9wZW5XYXRjb20gdG8gcmVwbGFjZQotICAgIHNjcmlwdHMvbWFrZWZpbGUud2F0Y29tLiAgVGhpcyBwcm9qZWN0IHdvcmtzIHdpdGggT3BlbldhdGNvbSAxLjkuIFRoZQotICAgIElERSBhdXRvZ2VuZXJhdGVzIGFwcHJvcHJpYXRlIG1ha2VmaWxlcyAobGlicG5nLm1rKSBmb3IgYmF0Y2ggcHJvY2Vzc2luZy4KLSAgICBUaGUgcHJvamVjdCBpcyBjb25maWd1cmFibGUsIHVubGlrZSB0aGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0LCBzbyBsb25nCi0gICAgYXMgdGhlIGRldmVsb3BlciBoYXMgYW4gYXdrLgotICBDaGFuZ2VkIHBuZ19zZXRfZ0FNQSB0byBsaW1pdCB0aGUgZ2FtbWEgdmFsdWUgcmFuZ2Ugc28gdGhhdCB0aGUgaW52ZXJzZQotICAgIG9mIHRoZSBzdG9yZWQgdmFsdWUgY2Fubm90IG92ZXJmbG93IHRoZSBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiwKLSAgICBhbmQgY2hhbmdlZCBvdGhlciB0aGluZ3MgT3BlbldhdGNvbSB3YXJucyBhYm91dC4KLSAgUmV2aXNlZCBwbmd2YWxpZC5jIHRvIHRlc3QgUE5HX0FMUEhBX01PREVfU1VQUE9SVEVEIGNvcnJlY3RseS4gVGhpcyBhbGxvd3MKLSAgICBwbmd2YWxpZCB0byBidWlsZCB3aGVuIEFMUEhBX01PREUgaXMgbm90IHN1cHBvcnRlZCwgd2hpY2ggaXMgcmVxdWlyZWQgaWYKLSAgICBpdCBpcyB0byBidWlsZCBvbiBsaWJwbmcgMS40LgotICBSZW1vdmVkIHN0cmluZy9tZW1vcnkgbWFjcm9zIHRoYXQgYXJlIG5vIGxvbmdlciB1c2VkIGFuZCBhcmUgbm90Ci0gICAgbmVjZXNzYXJpbHkgZnVsbHkgc3VwcG9ydGFibGUsIHBhcnRpY3VsYXJseSBwbmdfc3RybmNweSBhbmQgcG5nX3NucHJpbnRmLgotICBBZGRlZCBsb2cgb3B0aW9uIHRvIHBuZ3ZhbGlkLmMgYW5kIGF0dGVtcHRlZCB0byBpbXByb3ZlIGdhbW1hIG1lc3NhZ2VzLgotCi1WZXJzaW9uIDEuNS4zIFtvbWl0dGVkXQotICBQZW9wbGUgZm91bmQgdGhlIHByZXNlbmNlIG9mIGEgYmV0YSByZWxlYXNlIGZvbGxvd2luZyBhbiByYyByZWxlYXNlCi0gICAgdG8gYmUgY29uZnVzaW5nOyB0aGVyZWZvcmUgd2UgYnVtcCB0aGUgdmVyc2lvbiB0byBsaWJwbmctMS41LjRiZXRhMDEKLSAgICBhbmQgdGhlcmUgd2lsbCBiZSBubyBsaWJwbmctMS41LjMgcmVsZWFzZS4KLQotVmVyc2lvbiAxLjUuNGJldGEwMSBbSnVuZSAxNCwgMjAxMV0KLSAgTWFkZSBpdCBwb3NzaWJsZSB0byB1bmRlZmluZSBQTkdfUkVBRF8xNl9UT184X0FDQ1VSQVRFX1NDQUxFX1NVUFBPUlRFRAotICAgIHRvIGdldCB0aGUgc2FtZSAoaW5hY2N1cmF0ZSkgb3V0cHV0IGFzIGxpYnBuZy0xLjUuMiBhbmQgZWFybGllci4KLSAgTW92ZWQgZGVmaW5pdGlvbnMgb2YgUE5HX0hBVkVfSUhEUiwgUE5HX0FGVEVSX0lEQVQsIGFuZCBQTkdfSEFWRV9QTFRFCi0gICAgb3V0c2lkZSBvZiBhbiB1bmtub3duLWNodW5rIGJsb2NrIGluIHBuZy5oIGJlY2F1c2UgdGhleSBhcmUgYWxzbwotICAgIG5lZWRlZCBmb3Igb3RoZXIgdXNlcy4KLQotVmVyc2lvbiAxLjUuNGJldGEwMiBbSnVuZSAxNCwgMjAxMV0KLSAgRml4ZWQgYW5kIGNsYXJpZmllZCBMRUdBQ1kgMTYtdG8tOCBzY2FsaW5nIGNvZGUuCi0gIEFkZGVkIHBuZ19zZXRfY2hvcF8xNigpIEFQSSwgdG8gbWF0Y2ggaW5hY2N1cmF0ZSByZXN1bHRzIGZyb20gcHJldmlvdXMKLSAgICBsaWJwbmcgdmVyc2lvbnMuCi0gIFJlbW92ZWQgdGhlIEFDQ1VSQVRFIGFuZCBMRUdBQ1kgb3B0aW9ucyAodGhleSBhcmUgbm8gbG9uZ2VyIHVzZWFibGUpCi0gIFVzZSB0aGUgb2xkIHNjYWxpbmcgbWV0aG9kIGZvciBiYWNrZ3JvdW5kIGlmIHBuZ19zZXRfY2hvcF8xNigpIHdhcwotICAgIGNhbGxlZC4KLSAgTWFkZSBwbmdfc2V0X2Nob3BfMTYoKSBBUEkgcmVtb3ZlYWJsZSBieSBkaXNhYmxpbmcgUE5HX0NIT1BfMTZfVE9fOF9TVVBQT1JURUQKLQotVmVyc2lvbiAxLjUuNGJldGEwMyBbSnVuZSAxNSwgMjAxMV0KLSAgRml4ZWQgYSBwcm9ibGVtIGluIHBuZ19kb19leHBhbmRfcGFsZXR0ZSgpIGV4cG9zZWQgYnkgb3B0aW1pemF0aW9uIGluCi0gICAgMS41LjNiZXRhMDYKLSAgQWxzbyByZW1vdmVkIGEgc3B1cmlvdXMgYW5kIGNvbmZ1c2luZyAidHJhbnMiIG1lbWJlciAoInRyYW5zIikgZnJvbSBwbmdfaW5mby4KLSAgVGhlIHBhbGV0dGUgZXhwYW5kIG9wdGltaXphdGlvbiBwcmV2ZW50ZWQgZXhwYW5zaW9uIHRvIGFuIGludGVybWVkaWF0ZSBSR0JBCi0gICAgZm9ybSBpZiB0Uk5TIHdhcyBwcmVzZW50IGJ1dCBhbHBoYSB3YXMgbWFya2VkIHRvIGJlIHN0cmlwcGVkOyB0aGlzIGV4cG9zZWQKLSAgICBhIGNoZWNrIGZvciB0Uk5TIGluIHBuZ19kb19leHBhbmRfcGFsZXR0ZSgpIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZQotICAgIGNvZGUgZWxzZXdoZXJlIGluIGxpYnBuZy4KLSAgQ29ycmVjdGlvbiB0byB0aGUgZXhwYW5kXzE2IGNvZGU7IHJlbW92ZWQgZXh0cmEgaW5zdGFuY2Ugb2YKLSAgICBwbmdfc2V0X3NjYWxlXzE2X3RvXzggZnJvbSBwbmdwcml2LmgKLQotVmVyc2lvbiAxLjUuNGJldGEwNCBbSnVuZSAxNiwgMjAxMV0KLSAgQWRkZWQgYSBtaXNzaW5nICIjaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQvI2VuZGlmIiBpbiBwbmdydHJhbi5jCi0gIEFkZGVkIFBOR19UUkFOU0ZPUk1fQ0hPUF8xNiB0byB0aGUgaGlnaC1sZXZlbCByZWFkIHRyYW5zZm9ybXMuCi0gIE1hZGUgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRSBjb25maWd1cmFibGUgYWdhaW4uICBJZiB0aGlzIGlzCi0gICAgbm90IGVuYWJsZWQsIHBuZ19zZXRfc3RyaXBfMTYoKSBhbmQgcG5nX2RvX3NjYWxlXzE2X3RvXzgoKSBhcmVuJ3QgYnVpbHQuCi0gIFJldmlzZWQgY29udHJpYi92aXN1cG5nLCBncmVnYm9vaywgYW5kIHBuZ21pbmltIHRvIGRlbW9uc3RyYXRlIGNob3BfMTZfdG9fOAotCi1WZXJzaW9uIDEuNS40YmV0YTA1IFtKdW5lIDE2LCAyMDExXQotICBSZW5hbWVkIHBuZ19zZXRfc3RyaXBfMTYoKSB0byBwbmdfc2V0X3NjYWxlXzE2KCkgYW5kIHJlbmFtZWQKLSAgICBwbmdfc2V0X2Nob3BfMTYoKSB0byBwbmdfc2V0X3N0cmlwKDE2KSBpbiBhbiBhdHRlbXB0IHRvIG1pbmltaXplIHRoZQotICAgIGJlaGF2aW9yIGNoYW5nZXMgYmV0d2VlbiBsaWJwbmcxNCBhbmQgbGlicG5nMTUuCi0KLVZlcnNpb24gMS41LjRiZXRhMDYgW0p1bmUgMTgsIDIwMTFdCi0gIEZpeGVkIG5ldyBidWcgdGhhdCB3YXMgY2F1c2luZyBib3RoIHN0cmlwXzE2IGFuZCBzY2FsZV8xNiB0byBiZSBhcHBsaWVkLgotCi1WZXJzaW9uIDEuNS40YmV0YTA3IFtKdW5lIDE5LCAyMDExXQotICBGaXhlZCBwbmd2YWxpZCwgc2ltcGxpZmllZCBtYWNyb3MsIGFkZGVkIGNoZWNraW5nIGZvciAwIGluIHNDQUwuCi0gICAgVGhlIEFDQ1VSQVRFIHNjYWxlIG1hY3JvIGlzIG5vIGxvbmdlciBkZWZpbmVkIGluIDEuNSAtIGNhbGwgdGhlCi0gICAgcG5nX3NjYWxlXzE2X3RvXzggQVBJLiAgTWFkZSBzdXJlIHRoYXQgUE5HX1JFQURfMTZfVE9fOCBpcyBzdGlsbCBkZWZpbmVkCi0gICAgaWYgdGhlIHBuZ19zdHJpcF8xNl90b184IEFQSSBpcyBwcmVzZW50LiAgcG5nX2NoZWNrX2ZwX251bWJlciBub3cKLSAgICBtYWludGFpbnMgc29tZSBzdGF0ZSBzbyB0aGF0IHBvc2l0aXZlLCBuZWdhdGl2ZSBhbmQgemVybyB2YWx1ZXMgYXJlCi0gICAgaWRlbnRpZmllZC4gIHNDQUwgdXNlcyB0aGVzZSB0byBiZSBzdHJpY3RseSBzcGVjIGNvbmZvcm1hbnQuCi0KLVZlcnNpb24gMS41LjRiZXRhMDggW0p1bmUgMjMsIDIwMTFdCi0gIEZpeGVkIHBuZ3ZhbGlkIGlmIEFDQ1VSQVRFX1NDQUxFIGlzIGRlZmluZWQuCi0gIFVwZGF0ZWQgc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQuCi0KLVZlcnNpb24gMS41LjRyYzAxIFtKdW5lIDMwLCAyMDExXQotICBEZWZpbmUgUE5HX0FMTE9DQVRFRCB0byAicmVzdHJpY3QiIG9ubHkgaWYgTVNDX1ZFUiA+PSAxNDAwLgotCi1WZXJzaW9uIDEuNS40IFtKdWx5IDcsIDIwMTFdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS41LjViZXRhMDEgW0p1bHkgMTMsIDIwMTFdCi0gIEZpeGVkIHNvbWUgdHlwb3MgYW5kIG1hZGUgb3RoZXIgbWlub3IgY2hhbmdlcyBpbiB0aGUgbWFudWFsLgotICBVcGRhdGVkIGNvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkIChTYW11bGkgU291bWluZW4pCi0KLVZlcnNpb24gMS41LjViZXRhMDIgW0p1bHkgMTQsIDIwMTFdCi0gIFJldmlzZWQgTWFrZWZpbGUuYW0gYW5kIE1ha2VmaWxlLmluIHRvIGxvb2sgaW4gdGhlIHJpZ2h0IGRpcmVjdG9yeSBmb3IKLSAgICBwbmdsaWJjb25mLmgucHJlYnVpbHQKLQotVmVyc2lvbiAxLjUuNWJldGEwMyBbSnVseSAyNywgMjAxMV0KLSAgRW5hYmxlZCBjb21waWxhdGlvbiB3aXRoIGcrKyBjb21waWxlci4gIFRoaXMgY29tcGlsZXIgZG9lcyBub3QgcmVjb2duaXplCi0gICAgdGhlIGZpbGUgZXh0ZW5zaW9uLCBzbyBpdCBhbHdheXMgY29tcGlsZXMgd2l0aCBDKysgcnVsZXMuICBNYWRlIG1pbm9yCi0gICAgY2hhbmdlcyB0byBwbmdydXRpbC5jIHRvIGNhc3QgcmVzdWx0cyB3aGVyZSBDKysgZXhwZWN0cyBpdCBidXQgQyBkb2VzIG5vdC4KLSAgTWlub3IgZWRpdGluZyBvZiBsaWJwbmcuMyBhbmQgbGlicG5nLW1hbnVhbC50eHQuCi0KLVZlcnNpb24gMS41LjViZXRhMDQgW0p1bHkgMjksIDIwMTFdCi0gIFJldmlzZWQgQ01ha2VMaXN0cy50eHQgKENsaWZmb3JkIFlhcHApCi0gIFVwZGF0ZWQgY29tbWVudGFyeSBhYm91dCB0aGUgcG5nX3JnYl90b19ncmF5KCkgZGVmYXVsdCBjb2VmZmljaWVudHMKLSAgICBpbiB0aGUgbWFudWFsIGFuZCBpbiBwbmdydHJhbi5jCi0KLVZlcnNpb24gMS41LjViZXRhMDUgW0F1Z3VzdCAxNywgMjAxMV0KLSAgUHJldmVudCB1bmV4cGVjdGVkIEFQSSBleHBvcnRzIGZyb20gbm9uLWxpYnBuZyBETExzIG9uIFdpbmRvd3MuICBUaGUgIl9ETEwiCi0gICAgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0ZXN0IG9mIHdoZXRoZXIgYSBETEwgaXMgYmVpbmcgYnVpbHQgKHRoaXMgZXJyb25lb3VzbHkKLSAgICBjYXVzZWQgdGhlIGxpYnBuZyBBUElzIHRvIGJlIG1hcmtlZCBhcyBETEwgZXhwb3J0cyBpbiBzdGF0aWMgYnVpbGRzIHVuZGVyCi0gICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8pLiAgQWxtb3N0IGFsbCBvZiB0aGUgbGlicG5nIGJ1aWxkaW5nIGNvbmZpZ3VyYXRpb24KLSAgICBpcyBtb3ZlZCBmcm9tIHBuZ2NvbmYuaCB0byBwbmdwcml2LmgsIGJ1dCBQTkdfRExMX0VYUE9SVCByZW1haW5zIGluCi0gICAgcG5nY29uZi5oLCB0aG91Z2gsIHNvIHRoYXQgaXQgaXMgY29sb2NhdGVkIHdpdGggdGhlIGltcG9ydCBkZWZpbml0aW9uIChpdAotICAgIGlzIG5vIGxvbmdlciB1c2VkIGFueXdoZXJlIGluIHRoZSBpbnN0YWxsZWQgaGVhZGVycykuICBUaGUgVlN0dWRpbyBwcm9qZWN0Ci0gICAgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIGNsZWFuZWQgdXA6ICJfVVNSRExMIiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlCi0gICAgc3RhdGljIGxpYnJhcnkgYnVpbGRzICh0aGlzIHdhcyBpbmNvcnJlY3QpLCBhbmQgUE5HX1VTRV9ETEwgaGFzIGJlZW4gYWRkZWQKLSAgICB0byBwbmd2YWxpZCB0byB0ZXN0IHRoZSBmdW5jdGlvbmFsaXR5IChwbmd0ZXN0IGRvZXMgbm90IHN1cHBseSBpdCwKLSAgICBkZWxpYmVyYXRlbHkpLiAgVGhlIHNwdXJpb3VzICJfRVhQT1JUUyIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQotICAgIGxpYnBuZyBidWlsZCAoYWxsIHRoZXNlIGVycm9ycyB3ZXJlIGEgcmVzdWx0IG9mIGNvcHkvcGFzdGUgYmV0d2VlbiBwcm9qZWN0Ci0gICAgY29uZmlndXJhdGlvbnMuKQotICBBZGRlZCBuZXcgdHlwZXMgYW5kIGludGVybmFsIGZ1bmN0aW9ucyBmb3IgQ0lFIFJHQiBlbmQgcG9pbnQgaGFuZGxpbmcgdG8KLSAgICBwbmdwcml2LmggKGZ1bmN0aW9ucyB5ZXQgdG8gYmUgaW1wbGVtZW50ZWQpLgotCi1WZXJzaW9uIDEuNS41YmV0YTA2IFtBdWd1c3QgMjYsIDIwMTFdCi0gIEVuc3VyZSB0aGUgQ01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZIGlzIHNldCBpbiBDTWFrZUxpc3RzLnR4dAotICAgIChDbGlmZm9yZCBZYXApCi0gIEZpeGVzIHRvIHJnYl90b19ncmF5IGFuZCBjSFJNIFhZWiBBUElzIChKb2huIEJvd2xlcik6Ci0gICAgVGhlIHJnYl90b19ncmF5IGNvZGUgaGFkIGVycm9ycyB3aGVuIGNvbWJpbmVkIHdpdGggZ2FtbWEgY29ycmVjdGlvbi4KLSAgICBTb21lIHBpeGVscyB3ZXJlIHRyZWF0ZWQgYXMgdHJ1ZSBncmV5IHdoZW4gdGhleSB3ZXJlbid0IGFuZCBzdWNoIHBpeGVscwotICAgIGFuZCB0cnVlIGdyZXkgb25lcyB3ZXJlIG5vdCBnYW1tYSBjb3JyZWN0ZWQgKHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUKLSAgICByZWQgY29tcG9uZW50IHdhcyB1c2VkIGluc3RlYWQpLiAgQVBJcyB0byBnZXQgYW5kIHNldCBjSFJNIHVzaW5nIGNvbG9yCi0gICAgc3BhY2UgZW5kIHBvaW50cyBoYXZlIGJlZW4gYWRkZWQgYW5kIHRoZSByZ2JfdG9fZ3JheSBjb2RlIHRoYXQgZGVmYXVsdHMKLSAgICBiYXNlZCBvbiBjSFJNLCBhbmQgdGhlIGRpdmlkZS1ieS16ZXJvIGJ1ZyBpbiBwbmdfaGFuZGxlX2NIUk0gKENFUlQKLSAgICBWVSM0NzcwNDYsIENWRS0yMDExLTMzMjgsIGludHJvZHVjZWQgaW4gMS41LjQpIGhhdmUgYmVlbiBjb3JyZWN0ZWQuCi0gIEEgY29uc2lkZXJhYmxlIG51bWJlciBvZiB0ZXN0cyBoYXMgYmVlbiBhZGRlZCB0byBwbmd2YWxpZCBmb3IgdGhlCi0gICAgcmdiX3RvX2dyYXkgdHJhbnNmb3JtLgotICBBcml0aG1ldGljIGVycm9ycyBpbiByZ2JfdG9fZ3JheSB3aGVyZWJ5IHRoZSBjYWxjdWxhdGVkIGdyYXkgdmFsdWUgd2FzCi0gICAgdHJ1bmNhdGVkIHRvIHRoZSBiaXQgZGVwdGggcmF0aGVyIHRoYW4gcm91bmRlZCBoYXZlIGJlZW4gZml4ZWQgZXhjZXB0IGluCi0gICAgdGhlIDgtYml0IG5vbi1nYW1tYS1jb3JyZWN0ZWQgY2FzZSAod2hlcmUgY29uc2lzdGVuY3kgc2VlbXMgbW9yZSBpbXBvcnRhbnQKLSAgICB0aGFuIGNvcnJlY3RuZXNzLikgIFRoZSBjb2RlIHN0aWxsIGhhcyBjb25zaWRlcmFibGUgaW5hY2N1cmFjaWVzIGluIHRoZQotICAgIDgtYml0IGNhc2UgYmVjYXVzZSA4LWJpdCBsaW5lYXIgYXJpdGhtZXRpYyBpcyB1c2VkLgotCi1WZXJzaW9uIDEuNS41YmV0YTA3IFtTZXB0ZW1iZXIgNywgMjAxMV0KLSAgQWRkZWQgIiQoQVJDSCkiIG9wdGlvbiB0byBtYWtlZmlsZS5kYXJ3aW4KLSAgQWRkZWQgU3VuT1Mgc3VwcG9ydCB0byBjb25maWd1cmUuYWMgYW5kIE1ha2VmaWxlLmFtCi0gIENoYW5nZWQgcG5nX2NodW5rX2Jlbmlnbl9lcnJvcigpIHRvIHBuZ193YXJuaW5nKCkgaW4gcG5nLmMsIGluCi0gICAgcG5nX1hZWl9mcm9tX3h5X2NoZWNrZWQoKS4KLQotVmVyc2lvbiAxLjUuNWJldGEwOCBbU2VwdGVtYmVyIDEwLCAyMDExXQotICBGaXhlZCA2NC1iaXQgY29tcGlsYXRpb24gZXJyb3JzIChnY2MpLiBUaGUgZXJyb3JzIGZpeGVkIHJlbGF0ZQotICAgIHRvIGNvbmRpdGlvbnMgd2hlcmUgdHlwZXMgdGhhdCBhcmUgMzIgYml0cyBpbiB0aGUgR0NDIDMyLWJpdAotICAgIHdvcmxkICh1TG9uZyBhbmQgcG5nX3NpemVfdCkgYmVjb21lIDY0IGJpdHMgaW4gdGhlIDY0LWJpdAotICAgIHdvcmxkLiAgVGhpcyBwcm9kdWNlcyBwb3RlbnRpYWwgdHJ1bmNhdGlvbiBlcnJvcnMgd2hpY2ggdGhlCi0gICAgY29tcGlsZXIgY29ycmVjdGx5IGZsYWdzLgotICBSZWxvY2F0ZWQgbmV3IEhBVkVfU09MQVJJU19MRCBkZWZpbml0aW9uIGluIGNvbmZpZ3VyZS5hYwotICBDb25zdGFudCBjaGFuZ2VzIGZvciA2NC1iaXQgY29tcGF0aWJpbGl0eSAocmVtb3ZhbCBvZiBMIHN1ZmZpeGVzKS4gVGhlCi0gICAgMTYtYml0IGNhc2VzIHN0aWxsIHVzZSAiTCIgYXMgd2UgZG9uJ3QgaGF2ZSBhIDE2LWJpdCB0ZXN0IHN5c3RlbS4KLQotVmVyc2lvbiAxLjUuNXJjMDEgW1NlcHRlbWJlciAxNSwgMjAxMV0KLSAgUmVtb3ZlZCAiTCIgc3VmZml4ZXMgaW4gcG5ncHJpdi5oCi0KLVZlcnNpb24gMS41LjUgW1NlcHRlbWJlciAyMiwgMjAxMV0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjUuNmJldGEwMSBbU2VwdGVtYmVyIDIyLCAyMDExXQotICBGaXhlZCBzb21lIDY0LWJpdCB0eXBlIGNvbnZlcnNpb24gd2FybmluZ3MgaW4gcG5ncnRyYW4uYwotICBNb3ZlZCByb3dfaW5mbyBmcm9tIHBuZ19zdHJ1Y3QgdG8gYSBsb2NhbCB2YXJpYWJsZS4KLSAgVGhlIHZhcmlvdXMgaW50ZXJsYWNlIG1hc2sgYXJyYXlzIGhhdmUgYmVlbiBtYWRlIGludG8gYXJyYXlzIG9mCi0gICAgYnl0ZXMgYW5kIG1hZGUgUE5HX0NPTlNUIGFuZCBzdGF0aWMgKHByZXZpb3VzbHkgc29tZSBhcnJheXMgd2VyZQotICAgIG1hcmtlZCBQTkdfQ09OU1QgYW5kIHNvbWUgd2VyZW4ndCkuCi0gIEFkZGl0aW9uYWwgY2hlY2tzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgdHJhbnNmb3JtIGNvZGUgdG8gdmFsaWRhdGUgdGhlCi0gICAgcGl4ZWwgZGVwdGhzIGFmdGVyIHRoZSB0cmFuc2Zvcm1zIG9uIGJvdGggcmVhZCBhbmQgd3JpdGUuCi0gIFJlbW92ZWQgc29tZSByZWR1bmRhbnQgY29kZSBmcm9tIHBuZ3dyaXRlLmMsIGluIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgotICBDaGFuZ2VkIGNodW5rIHJlYWRpbmcvd3JpdGluZyBjb2RlIHRvIHVzZSBwbmdfdWludF8zMiBpbnN0ZWFkIG9mIHBuZ19ieXRlWzRdLgotICAgIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCB0byBhbGxvY2F0ZSB0ZW1wb3Jhcnkgc3RyaW5ncyBmb3IgY2h1bmsgbmFtZXMgb24KLSAgICB0aGUgc3RhY2sgaW4gdGhlIHJlYWQvd3JpdGUgY29kZS4gIFVua25vd24gY2h1bmsgaGFuZGxpbmcgc3RpbGwgdXNlcyB0aGUKLSAgICBzdHJpbmcgZm9ybSBiZWNhdXNlIHRoaXMgaXMgZXhwb3NlZCBpbiB0aGUgQVBJLgotCi1WZXJzaW9uIDEuNS42YmV0YTAyIFtTZXB0ZW1iZXIgMjYsIDIwMTFdCi0gIEFkZGVkIGEgbm90ZSBpbiB0aGUgbWFudWFsIHRoZSBwbmdfcmVhZF91cGRhdGVfaW5mbygpIG11c3QgYmUgY2FsbGVkIG9ubHkKLSAgICBvbmNlIHdpdGggYSBwYXJ0aWN1bGFyIGluZm9fcHRyLgotICBGaXhlZCBhIHR5cG8gaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIG5ldyBQTkdfU1RSSU5HX0ZST01fQ0hVTksocyxjKSBtYWNyby4KLQotVmVyc2lvbiAxLjUuNmJldGEwMyBbU2VwdGVtYmVyIDI4LCAyMDExXQotICBSZXZpc2VkIHRlc3QtcG5ndGVzdC5zaCB0byByZXBvcnQgRkFJTCB3aGVuIHBuZ3Rlc3QgZmFpbHMuCi0gIEFkZGVkICItLXN0cmljdCIgb3B0aW9uIHRvIHBuZ3Rlc3QsIHRvIHJlcG9ydCBGQUlMIHdoZW4gdGhlIGZhaWx1cmUgaXMKLSAgICBvbmx5IGJlY2F1c2UgdGhlIHJlc3VsdGluZyB2YWxpZCBmaWxlcyBhcmUgZGlmZmVyZW50LgotICBSZXZpc2VkIENNYWtlTGlzdHMudHh0IHRvIHdvcmsgd2l0aCBtaW5ndyBhbmQgcmVtb3ZlZCBzb21lIG1hdGVyaWFsIGZyb20KLSAgICBDTWFrZUxpc3RzLnR4dCB0aGF0IGlzIG5vIGxvbmdlciB1c2VmdWwgaW4gbGlicG5nLTEuNS4KLQotVmVyc2lvbiAxLjUuNmJldGEwNCBbT2N0b2JlciA1LCAyMDExXQotICBGaXhlZCB0eXBvIGluIE1ha2VmaWxlLmluIGFuZCBNYWtlZmlsZS5hbSAoIi1NIFdsIiBzaG91bGQgYmUgIi1NIC1XbCIpLiIKLQotVmVyc2lvbiAxLjUuNmJldGEwNSBbT2N0b2JlciAxMiwgMjAxMV0KLSAgU3BlZWQgdXAgcG5nX2NvbWJpbmVfcm93KCkgZm9yIGludGVybGFjZWQgaW1hZ2VzLiBUaGlzIHJlZHVjZXMgdGhlIGdlbmVyYWxpdHkKLSAgICBvZiB0aGUgY29kZSwgYWxsb3dpbmcgaXQgdG8gYmUgb3B0aW1pemVkIGZvciBBZGFtNyBpbnRlcmxhY2UuICBUaGUgbWFza3MKLSAgICBwYXNzZWQgdG8gcG5nX2NvbWJpbmVfcm93KCkgYXJlIG5vdyBnZW5lcmF0ZWQgaW50ZXJuYWxseSwgYXZvaWRpbmcKLSAgICBzb21lIGNvZGUgZHVwbGljYXRpb24gYW5kIGxvY2FsaXppbmcgdGhlIGludGVybGFjZSBoYW5kbGluZyBzb21ld2hhdC4KLSAgQWxpZ24gcG5nX3N0cnVjdDo6cm93X2J1ZiAtIHByZXZpb3VzbHkgaXQgd2FzIGFsd2F5cyB1bmFsaWduZWQsIGNhdXNlZCBieQotICAgIGEgYnVnIGluIHRoZSBjb2RlIHRoYXQgYXR0ZW1wdGVkIHRvIGFsaWduIGl0OyB0aGUgY29kZSBuZWVkcyB0byBzdWJ0cmFjdAotICAgIG9uZSBmcm9tIHRoZSBwb2ludGVyIHRvIHRha2UgYWNjb3VudCBvZiB0aGUgZmlsdGVyIGJ5dGUgcHJlcGVuZGVkIHRvCi0gICAgZWFjaCByb3cuCi0gIE9wdGltaXplZCBwbmdfY29tYmluZV9yb3coKSB3aGVuIHJvd3MgYXJlIGFsaWduZWQuIFRoaXMgZ2FpbnMgYSBzbWFsbAotICAgIHBlcmNlbnRhZ2UgZm9yIDE2LWJpdCBhbmQgMzItYml0IHBpeGVscyBpbiB0aGUgdHlwaWNhbCBjYXNlIHdoZXJlIHRoZQotICAgIG91dHB1dCByb3cgYnVmZmVycyBhcmUgYXBwcm9wcmlhdGVseSBhbGlnbmVkLiBUaGUgb3B0aW1pemF0aW9uIHdhcyBub3QKLSAgICBwcmV2aW91c2x5IHBvc3NpYmxlIGJlY2F1c2UgdGhlIHBuZ19zdHJ1Y3QgYnVmZmVyIHdhcyBhbHdheXMgbWlzYWxpZ25lZC4KLSAgRml4ZWQgYnVnIGluIHBuZ193cml0ZV9jaHVua19oZWFkZXIoKSBkZWJ1ZyBwcmludCwgaW50cm9kdWNlZCBpbiAxLjUuNmJldGEwMS4KLQotVmVyc2lvbiAxLjUuNmJldGEwNiBbT2N0b2JlciAxNywgMjAxMV0KLSAgUmVtb3ZlZCB0d28gcmVkdW5kYW50IHRlc3RzIGZvciB1bml0aWFsaXplZCByb3cuCi0gIEZpeGVkIGEgcmVsYXRpdmVseSBoYXJtbGVzcyBtZW1vcnkgb3ZlcndyaXRlIGluIGNvbXByZXNzZWQgdGV4dCB3cml0aW5nCi0gICAgd2l0aCBhIDEgYnl0ZSB6bGliIGJ1ZmZlci4KLSAgQWRkIGFiaWxpdHkgdG8gY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbyBtdWx0aXBsZSB0aW1lcyB0byBwbmd2YWxpZC5jLgotICBGaXhlcyBmb3IgbXVsdGlwbGUgY2FsbHMgdG8gcG5nX3JlYWRfdXBkYXRlX2luZm8uIFRoZXNlIGZpeGVzIGF0dGVuZCB0bwotICAgIG1vc3Qgb2YgdGhlIGVycm9ycyByZXZlYWxlZCBpbiBwbmd2YWxpZCwgaG93ZXZlciBkb2luZyB0aGUgZ2FtbWEgd29yawotICAgIHR3aWNlIHJlc3VsdHMgaW4gaW5hY2N1cmFjaWVzIHRoYXQgY2FuJ3QgYmUgZWFzaWx5IGZpeGVkLiAgVGhlcmUgaXMgbm93Ci0gICAgYSB3YXJuaW5nIGluIHRoZSBjb2RlIGlmIHRoaXMgaXMgZ29pbmcgdG8gaGFwcGVuLgotICBUdXJuZWQgb24gbXVsdGlwbGUgcG5nX3JlYWRfdXBkYXRlX2luZm8gaW4gcG5ndmFsaWQgdHJhbnNmb3JtIHRlc3RzLgotICBQcmV2ZW50IGxpYnBuZyBmcm9tIG92ZXJ3cml0aW5nIHVudXNlZCBiaXRzIGF0IHRoZSBlbmQgb2YgdGhlIGltYWdlIHdoZW4KLSAgICBpdCBpcyBub3QgYnl0ZSBhbGlnbmVkLCB3aGlsZSByZWFkaW5nLiBQcmlvciB0byBsaWJwbmctMS41LjYgbGlicG5nIHdvdWxkCi0gICAgb3ZlcndyaXRlIHRoZSBwYXJ0aWFsIGJ5dGUgYXQgdGhlIGVuZCBvZiBlYWNoIHJvdyBpZiB0aGUgcm93IHdpZHRoIHdhcyBub3QKLSAgICBhbiBleGFjdCBtdWx0aXBsZSBvZiA4IGJpdHMgYW5kIHRoZSBpbWFnZSBpcyBub3QgaW50ZXJsYWNlZC4KLQotVmVyc2lvbiAxLjUuNmJldGEwNyBbT2N0b2JlciAyMSwgMjAxMV0KLSAgTWFkZSBwbmdfcHRyLT5wcmV2X3JvdyBhbiBhbGlnbmVkIHBvaW50ZXIgaW50byBwbmdfcHRyLT5iaWdfcHJldl9yb3cKLSAgICAoTWFucyBSdWxsZ2FyZCkuCi0KLVZlcnNpb24gMS41LjZyYzAxIFtPY3RvYmVyIDI2LCAyMDExXQotICBDaGFuZ2VkIG1pc2xlYWRpbmcgIk1pc3NpbmcgUExURSBiZWZvcmUgY0hSTSIgd2FybmluZyB0byAiT3V0IG9mIHBsYWNlIGNIUk0iCi0KLVZlcnNpb24gMS41LjZyYzAyIFtPY3RvYmVyIDI3LCAyMDExXQotICBBZGRlZCBMU1IoKSBtYWNybyB0byBkZWZlbmQgYWdhaW5zdCBidWdneSBjb21waWxlcnMgdGhhdCBldmFsdWF0ZSBub24tdGFrZW4KLSAgICBjb2RlIGJyYW5jaGVzIGFuZCBjb21wbGFpbiBhYm91dCBvdXQtb2YtcmFuZ2Ugc2hpZnRzLgotCi1WZXJzaW9uIDEuNS42cmMwMyBbT2N0b2JlciAyOCwgMjAxMV0KLSAgUmVuYW1lZCB0aGUgTFNSKCkgbWFjcm8gdG8gUE5HX0xTUigpIGFuZCBhZGRlZCBQTkdfTFNMKCkgbWFjcm8uCi0gIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggSW50ZWwgYW5kIE1TWVMgY29tcGlsZXJzLiBUaGUgbG9naWNhbCBzaGlmdAotICAgIGZpeCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDIGlzIHJlcXVpcmVkIGJ5IG90aGVyIGNvbXBpbGVycywgc28gdGhpcwotICAgIGVuYWJsZXMgdGhhdCBmaXggZm9yIGFsbCBjb21waWxlcnMgd2hlbiB1c2luZyBjb21waWxlLXRpbWUgY29uc3RhbnRzLgotICAgIFVuZGVyIE1TWVMgJ2J5dGUnIGlzIGEgbmFtZSBkZWNsYXJlZCBpbiBhIHN5c3RlbSBoZWFkZXIgZmlsZSwgc28gd2UKLSAgICBjaGFuZ2VkIHRoZSBuYW1lIG9mIGEgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQgdGhlIHdhcm5pbmdzIHRoYXQgcmVzdWx0LgotICBBZGRlZCAjZGVmaW5lIFBOR19BTElHTl9UWVBFIFBOR19BTElHTl9OT05FIHRvIGNvbnRyaWIvcG5nbWluaW0vKi9wbmd1c3IuaAotCi1WZXJzaW9uIDEuNS42IFtOb3ZlbWJlciAzLCAyMDExXQotICBObyBjaGFuZ2VzLgotCi1WZXJzaW9uIDEuNS43YmV0YTAxIFtOb3ZlbWJlciA0LCAyMDExXQotICBBZGRlZCBzdXBwb3J0IGZvciBBUk0gcHJvY2Vzc29yLCB3aGVuIGRlY29kaW5nIGFsbCBQTkcgdXAtZmlsdGVyZWQgcm93cwotICAgIGFuZCBhbnkgb3RoZXItZmlsdGVyZWQgcm93cyB3aXRoIDMgb3IgNCBieXRlcyBwZXIgcGl4ZWwgKE1hbnMgUnVsbGdhcmQpLgotICBGaXhlZCBidWcgaW4gcG5ndmFsaWQgb24gZWFybHkgYWxsb2NhdGlvbiBmYWlsdXJlOyBmaXhlZCB0eXBlIGNhc3QgaW4KLSAgICBwbmdtZW0uYzsgcG5ndmFsaWQgd291bGQgYXR0ZW1wdCB0byBjYWxsIHBuZ19lcnJvcigpIGlmIHRoZSBhbGxvY2F0aW9uCi0gICAgb2YgYSBwbmdfc3RydWN0IG9yIHBuZ19pbmZvIGZhaWxlZC4gVGhpcyB3b3VsZCBwcm9iYWJseSBoYXZlIGxlZCB0byBhCi0gICAgY3Jhc2guICBUaGUgcG5nbWVtLmMgaW1wbGVtZW50YXRpb24gb2YgcG5nX21hbGxvYygpIGluY2x1ZGVkIGEgY2FzdAotICAgIHRvIHBuZ19zaXplX3Qgd2hpY2ggd291bGQgZmFpbCBvbiBsYXJnZSBhbGxvY2F0aW9ucyBvbiAxNi1iaXQgc3lzdGVtcy4KLSAgRml4IGZvciB0aGUgcHJlcHJvY2Vzc29yIG9mIHRoZSBJbnRlbCBDIGNvbXBpbGVyLiBUaGUgcHJlcHJvY2Vzc29yCi0gICAgc3BsaXRzIGFkamFjZW50IEAgc2lnbnMgd2l0aCBhIHNwYWNlOyB0aGlzIGNoYW5nZXMgdGhlIGNvbmNhdGVudGF0aW9uCi0gICAgdG9rZW4gZnJvbSBALUAtQCB0byBQTkdfSk9JTjsgdGhhdCBzaG91bGQgd29yayB3aXRoIGFsbCBjb21waWxlcgotICAgIHByZXByb2Nlc3NvcnMuCi0gIFBhZXRoIGZpbHRlciBzcGVlZCBpbXByb3ZlbWVudHMgZnJvbSB3b3JrIGJ5IFNpYXJoZWkgU2lhbWFzaGthLiBUaGlzCi0gICAgY2hhbmdlcyB0aGUgJ1BhZXRoJyByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbiB0byBpbXByb3ZlIHRoZSBHQ0MgY29kZQotICAgIGdlbmVyYXRpb24gb24geDg2LiBUaGUgY2hhbmdlcyBhcmUgb25seSBwYXJ0IG9mIHRoZSBzdWdnZXN0ZWQgb25lczsKLSAgICBqdXN0IHRoZSBjaGFuZ2VzIHRoYXQgZGVmaW5pdGVseSBpbXByb3ZlIHNwZWVkIGFuZCByZW1haW4gc2ltcGxlLgotICAgIFRoZSBjaGFuZ2VzIGFsc28gc2xpZ2h0bHkgaW5jcmVhc2UgdGhlIGNsYXJpdHkgb2YgdGhlIGNvZGUuCi0KLVZlcnNpb24gMS41LjdiZXRhMDIgW05vdmVtYmVyIDExLCAyMDExXQotICBDaGVjayBjb21wcmVzc2lvbl90eXBlIHBhcmFtZXRlciBpbiBwbmdfZ2V0X2lDQ1AgYW5kIHJlbW92ZSBzcHVyaW91cwotICAgIGNhc3RzLiBUaGUgY29tcHJlc3Npb25fdHlwZSBwYXJhbWV0ZXIgaXMgYWx3YXlzIGFzc2lnbmVkIHRvLCBzbyBtdXN0Ci0gICAgYmUgbm9uLU5VTEwuIFRoZSBjYXN0IG9mIHRoZSBwcm9maWxlIGxlbmd0aCBwb3RlbnRpYWxseSB0cnVuY2F0ZWQgdGhlCi0gICAgdmFsdWUgdW5uZWNlc3NhcmlseSBvbiBhIDE2LWJpdCBpbnQgc3lzdGVtLCBzbyB0aGUgY2FzdCBvZiB0aGUgKGJ5dGUpCi0gICAgY29tcHJlc3Npb24gdHlwZSB0byAoaW50KSBpcyBzcGVjaWZpZWQgYnkgQU5TSS1DIGFueXdheS4KLSAgRml4ZWQgRlAgZGl2aXNpb24gYnkgemVybyBpbiBwbmd2YWxpZC5jOyB0aGUgJ3Rlc3RfcGl4ZWwnIGNvZGUgbGVmdAotICAgIHRoZSBzQklUIGZpZWxkcyBpbiB0aGUgdGVzdCBwaXhlbCBhcyAwLCB3aGljaCByZXN1bHRlZCBpbiBhIGZsb2F0aW5nCi0gICAgcG9pbnQgZGl2aXNpb24gYnkgemVybyB3aGljaCB3YXMgaXJyZWxldmFudCBidXQgY2F1c2VzIHN5c3RlbXMgd2hlcmUKLSAgICBGUCBleGNlcHRpb25zIGNhdXNlIGEgY3Jhc2guIEFkZGVkIGNvZGUgdG8gcG5ndmFsaWQgdG8gdHVybiBvbiBGUAotICAgIGV4Y2VwdGlvbnMgaWYgdGhlIGFwcHJvcHJpYXRlIGdsaWJjIHN1cHBvcnQgaXMgdGhlcmUgdG8gZW5zdXJlIHRoaXMgaXMKLSAgICB0ZXN0ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgVXBkYXRlZCBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGFuZCBzY3JpcHRzL21ha2VmaWxlLnN0ZCB0byBoYW5kbGUgdGhlCi0gICAgbmV3IFBOR19KT0lOIG1hY3JvLgotICBBZGRlZCB2ZXJzaW9uaW5nIHRvIHBuZ2xpYmNvbmYuaCBjb21tZW50cy4KLSAgU2ltcGxpZmllZCByZWFkL3dyaXRlIEFQSSBpbml0aWFsIHZlcnNpb247IGJhc2ljIHJlYWQvd3JpdGUgdGVzdGVkIG9uCi0gICAgYSB2YXJpZXR5IG9mIGltYWdlcywgbGltaXRlZCBkb2N1bWVudGF0aW9uIChpbiB0aGUgaGVhZGVyIGZpbGUuKQotICBJbnN0YWxsZWQgbW9yZSBhY2N1cmF0ZSBsaW5lYXIgdG8gc1JHQiBjb252ZXJzaW9uIHRhYmxlcy4gVGhlIHNsaWdodGx5Ci0gICAgbW9kaWZpZWQgdGFibGVzIHJlZHVjZSB0aGUgbnVtYmVyIG9mIDE2LWJpdCB2YWx1ZXMgdGhhdAotICAgIGNvbnZlcnQgdG8gYW4gb2ZmLWJ5LW9uZSA4LWJpdCB2YWx1ZS4gIFRoZSAibWFrZXNSR0IuYyIgY29kZSB0aGF0IHdhcyB1c2VkCi0gICAgdG8gZ2VuZXJhdGUgdGhlIHRhYmxlcyBpcyBub3cgaW4gYSBjb250cmliL3NSR0J0YWJsZXMgc3ViLWRpcmVjdG9yeS4KLQotVmVyc2lvbiAxLjUuN2JldGEwMyBbTm92ZW1iZXIgMTcsIDIwMTFdCi0gIFJlbW92ZWQgUE5HX0NPTlNUIGZyb20gdGhlIHNSR0IgdGFibGUgZGVjbGFyYXRpb25zIGluIHBuZ3ByaXYuaCBhbmQgcG5nLmMKLSAgQWRkZWQgcnVuLXRpbWUgZGV0ZWN0aW9uIG9mIE5FT04gc3VwcG9ydC4KLSAgQWRkZWQgY29udHJpYi9saWJ0ZXN0czsgaW5jbHVkZXMgc2ltcGxpZmllZCBBUEkgdGVzdCBhbmQgdGltaW5nIHRlc3QgYW5kCi0gICAgYSBjb2xvciBjb252ZXJzaW9uIHV0aWxpdHkgZm9yIHJhcGlkIGNoZWNraW5nIG9mIGZhaWxlZCAncG5nc3Rlc3QnIHJlc3VsdHMuCi0gIE11bHRpcGxlIHRyYW5zZm9ybSBidWcgZml4ZXMgcGx1cyBhIHdvcmstcm91bmQgZm9yIGRvdWJsZSBnYW1tYSBjb3JyZWN0aW9uLgotICAgIGxpYnBuZyBkb2VzIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgdHJhbnNmb3JtIHRoYXQgcmVxdWlyZXMgbGluZWFyIGRhdGEKLSAgICBhdCBvbmNlIC0gaWYgdGhpcyBpcyB0cmllZCB0eXBpY2FsbHkgdGhlIHJlc3VsdHMgaXMgZG91YmxlIGdhbW1hCi0gICAgY29ycmVjdGlvbi4gU2luY2UgdGhlIHNpbXBsaWZpZWQgQVBJcyBjYW4gbmVlZCByZ2IgdG8gZ3JheSBjb21iaW5lZCB3aXRoCi0gICAgYSBjb21wb3NlIG9wZXJhdGlvbiBpdCBpcyBuZWNlc3NhcnkgdG8gZG8gb25lIG9mIHRoZXNlIG91dHNpZGUgdGhlIG1haW4KLSAgICBsaWJwbmcgdHJhbnNmb3JtIGNvZGUuIFRoaXMgY2hlY2staW4gYWxzbyBjb250YWlucyBmaXhlcyB0byB2YXJpb3VzIGJ1Z3MKLSAgICBpbiB0aGUgc2ltcGxpZmllZCBBUElzIHRoZW1zZWx2ZXMgYW5kIHRvIHNvbWUgYnVncyBpbiBjb21wb3NlIGFuZCByZ2IgdG8KLSAgICBncmF5IChvbiBwYWxldHRlKSBpdHNlbGYuCi0gIEZpeGVzIGZvciBDKysgY29tcGlsYXRpb24gdXNpbmcgZysrIFdoZW4gbGlicG5nIHNvdXJjZSBpcyBjb21waWxlZAotICAgIHVzaW5nIGcrKy4gVGhlIGNvbXBpbGVyIGltcG9zZXMgQysrIHJ1bGVzIG9uIHRoZSBDIHNvdXJjZTsgdGh1cyBpdAotICAgIGlzIGRlc2lyZWFibGUgdG8gbWFrZSB0aGUgc291cmNlIHdvcmsgd2l0aCBlaXRoZXIgQyBvciBDKysgcnVsZXMKLSAgICB3aXRob3V0IHRocm93aW5nIGF3YXkgdXNlZnVsIGVycm9yIGluZm9ybWF0aW9uLiAgVGhpcyBjaGFuZ2UgYWRkcwotICAgIHBuZ192b2lkY2FzdCB0byBhbGxvdyBDIHNlbWFudGljICh2b2lkKikgY2FzZXMgb3IgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICBDKysgc3RhdGljX2Nhc3Qgb3BlcmF0aW9uLCBhcyBhcHByb3ByaWF0ZS4KLSAgQWRkZWQgLS1ub2V4ZWNzdGFjayB0byBhc3NlbWJsZXIgZmlsZSBjb21waWxhdGlvbi4gR0NDIGRvZXMgbm90IHNldAotICAgIHRoaXMgb24gYXNzZW1ibGVyIGNvbXBpbGF0aW9uLCBldmVuIHRob3VnaCBpdCBkb2VzIG9uIEMgY29tcGlsYXRpb24uCi0gICAgVGhpcyBjcmVhdGVzIHNlY3VyaXR5IGlzc3VlcyBpZiBhc3NlbWJsZXIgY29kZSBpcyBlbmFibGVkOyB0aGUKLSAgICB3b3JrLWFyb3VuZCBpcyB0byBzZXQgaXQgYnkgZGVmYXVsdCBpbiB0aGUgZmxhZ3MgZm9yICQoQ0NBUykKLSAgV29yayBhcm91bmQgY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBkZWNsYXJhdGlvbiBvZiBjb25zdCBkYXRhLiBTb21lCi0gICAgY29tcGlsZXJzIGZhdWx0ICdleHRlcm4gY29uc3QnIGRhdGEgZGVjbGFyYXRpb25zIChiZWNhdXNlIHRoZSBkYXRhIGlzCi0gICAgbm90IGluaXRpYWxpemVkKTsgdGhpcyB0dXJucyBvbiBjb25zdC1uZXNzIG9ubHkgZm9yIGNvbXBpbGVycyB3aGVyZQotICAgIHRoaXMgaXMga25vd24gdG8gd29yay4KLQotVmVyc2lvbiAxLjUuN2JldGEwNCBbTm92ZW1iZXIgMTcsIDIwMTFdCi0gIFNpbmNlIHRoZSBnY2MgZHJpdmVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgLS1ub2V4ZWNzdGFjayBmbGFnLCB3ZSBtdXN0Ci0gICAgdXNlIHRoZSAtV2EgcHJlZml4IHRvIGhhdmUgaXQgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGFzc2VtYmxlci4KLSAgICBBbHNvIHJlbW92ZWQgYSBkdXBsaWNhdGUgc2V0dGluZyBvZiB0aGlzIGZsYWcuCi0gIEFkZGVkIGZpbGVzIHRoYXQgd2VyZSBvbWl0dGVkIGZyb20gdGhlIGxpYnBuZy0xLjUuN2JldGEwMyB6aXAgZGlzdHJpYnV0aW9uLgotCi1WZXJzaW9uIDEuNS43YmV0YTA1IFtOb3ZlbWJlciAyNSwgMjAxMV0KLSAgUmVtb3ZlZCAielRYdCIgZnJvbSB3YXJuaW5nIGluIGdlbmVyaWMgY2h1bmsgZGVjb21wcmVzc2lvbiBmdW5jdGlvbi4KLSAgVmFsaWRhdGUgdGltZSBzZXR0aW5ncyBwYXNzZWQgdG8gcG5nX3NldF90SU1FKCkgYW5kIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMoKQotICAgIChGcmFuayBCdXNzZSkuIE5vdGU6IFRoaXMgcHJldmVudGVkIENWRS0yMDE1LTc5ODEgZnJvbSBhZmZlY3RpbmcKLSAgICBsaWJwbmctMS41LjcgYW5kIGxhdGVyLgotICBBZGRlZCBNSU5HVyBzdXBwb3J0IHRvIENNYWtlTGlzdHMudHh0Ci0gIFJlamVjdCBpbnZhbGlkIGNvbXByZXNzaW9uIGZsYWcgb3IgbWV0aG9kIHdoZW4gcmVhZGluZyB0aGUgaVRYdCBjaHVuay4KLSAgQmFja2VkIG91dCAnc2ltcGxpZmllZCcgQVBJIGNoYW5nZXMuIFRoZSBBUEkgc2VlbXMgdG9vIGNvbXBsZXggYW5kIHRoZXJlCi0gICAgaXMgYSBsYWNrIG9mIGNvbnNlbnN1cyBvciBlbnRodXNpYXNtIGZvciB0aGUgcHJvcG9zYWxzLiAgVGhlIEFQSSBhbHNvCi0gICAgcmV2ZWFscyBzaWduaWZpY2FudCBidWdzIGluc2lkZSBsaWJwbmcgKGRvdWJsZSBnYW1tYSBjb3JyZWN0aW9uIGFuZCB0aGUKLSAgICBrbm93biBidWcgb2YgYmVpbmcgdW5hYmxlIHRvIHJldHJpZXZlIGEgY29ycmVjdGVkIHBhbGV0dGUpLiBJdCBzZWVtcwotICAgIGJldHRlciB0byB3YWl0IHVudGlsIHRoZSBidWdzLCBhdCBsZWFzdCwgYXJlIGNvcnJlY3RlZC4KLSAgTW92ZWQgcG5ndmFsaWQuYyBpbnRvIGNvbnRyaWIvbGlidGVzdHMKLSAgUmVidWlsdCBNYWtlZmlsZS5pbiwgY29uZmlndXJlLCBldGMuLCB3aXRoIGF1dG9jb25mLTIuNjgKLQotVmVyc2lvbiAxLjUuN3JjMDEgW0RlY2VtYmVyIDEsIDIwMTFdCi0gIFJlcGxhY2VkIGFuICIjaWYiIHdpdGggIiNpZmRlZiIgaW4gcG5ncnRyYW4uYwotICBSZXZpc2VkICNpZiBQTkdfRE9fQkMgYmxvY2sgaW4gcG5nLmMgKHVzZSAjaWZkZWYgYW5kIGFkZCAjZWxzZSkKLQotVmVyc2lvbiAxLjUuN3JjMDIgW0RlY2VtYmVyIDUsIDIwMTFdCi0gIFJldmlzZWQgcHJvamVjdCBmaWxlcyBhbmQgY29udHJpYi9wbmd2YWxpZC9wbmd2YWxpZC5jIHRvIGFjY291bnQgZm9yCi0gICAgdGhlIHJlbG9jYXRpb24gb2YgcG5ndmFsaWQgaW50byBjb250cmliL2xpYnRlc3RzLgotICBSZXZpc2VkIHBuZ2NvbmYuaCB0byB1c2UgIiBfX2RlY2xzcGVjKHJlc3RyaWN0KSIgb25seSB3aGVuIE1TQ19WRVIgPj0gMTQwMCwKLSAgICBhcyBpbiBsaWJwbmctMS41LjQuCi0gIFB1dCBDUkxGIGxpbmUgZW5kaW5ncyBpbiB0aGUgb3dhdGNvbSBwcm9qZWN0IGZpbGVzLgotCi1WZXJzaW9uIDEuNS43cmMwMyBbRGVjZW1iZXIgNywgMjAxMV0KLSAgVXBkYXRlZCBDTWFrZUxpc3RzLnR4dCB0byBhY2NvdW50IGZvciB0aGUgcmVsb2NhdGlvbiBvZiBwbmd2YWxpZC5jCi0KLVZlcnNpb24gMS41LjcgW0RlY2VtYmVyIDE1LCAyMDExXQotICBNaW5vciBmaXhlcyB0byBwbmd2YWxpZC5jIGZvciBnY2MgNC42LjIgY29tcGF0aWJpbGl0eSB0byByZW1vdmUgd2FybmluZ3MKLSAgICByZXBvcnRlZCBieSBlYXJsaWVyIHZlcnNpb25zLgotICBGaXhlZCBtaW5vciBtZW1zZXQvc2l6ZW9mIGVycm9ycyBpbiBwbmd2YWxpZC5jLgotCi1WZXJzaW9uIDEuNi4wYmV0YTAxIFtEZWNlbWJlciAxNSwgMjAxMV0KLSAgUmVtb3ZlZCBtYWNoaW5lLWdlbmVyYXRlZCBjb25maWd1cmUgZmlsZXMgZnJvbSB0aGUgR0lUIHJlcG9zaXRvcnkgKHRoZXkgd2lsbAotICAgIGNvbnRpbnVlIHRvIGFwcGVhciBpbiB0aGUgdGFyYmFsbCBkaXN0cmlidXRpb25zIGFuZCBpbiB0aGUgbGlicG5nMTUgYW5kCi0gICAgZWFybGllciBHSVQgYnJhbmNoZXMpLgotICBSZXN0b3JlZCB0aGUgbmV3ICdzaW1wbGlmaWVkJyBBUEksIHdoaWNoIHdhcyBzdGFydGVkIGluIGxpYnBuZy0xLjUuN2JldGEwMgotICAgIGJ1dCBsYXRlciBkZWxldGVkIGZyb20gbGlicG5nLTEuNS43YmV0YTA1LgotICBBZGRlZCBleGFtcGxlIHByb2dyYW1zIGZvciB0aGUgbmV3ICdzaW1wbGlmaWVkJyBBUEkuCi0gIEFkZGVkIEFOU0ktQyAoQzkwKSBoZWFkZXJzIGFuZCByZXF1aXJlIHRoZW0sIGFuZCB0YWtlIGFkdmFudGFnZSBvZiB0aGUKLSAgICBjaGFuZ2UuIEFsc28gZml4ZWQgc29tZSBvZiB0aGUgcHJvamVjdHMvKiBhbmQgY29udHJpYi8qIGZpbGVzIHRoYXQgbmVlZGVkCi0gICAgdXBkYXRlcyBmb3IgbGlicG5nMTYgYW5kIHRoZSBtb3ZlIG9mIHBuZ3ZhbGlkLmMuCi0gICAgV2l0aCB0aGlzIGNoYW5nZSB0aGUgcmVxdWlyZWQgQU5TSS1DIGhlYWRlciBmaWxlcyBhcmUgYXNzdW1lZCB0byBleGlzdDogdGhlCi0gICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGZsb2F0LmgsIGxpbWl0cy5oLCBzdGRhcmcuaCBhbmQgc3RkZGVmLmggYW5kCi0gICAgbGlicG5nIHJlbGllcyBvbiBsaW1pdHMuaCBhbmQgc3RkZGVmLmggZXhpc3RpbmcgYW5kIGJlaGF2aW5nIGFzIGRlZmluZWQKLSAgICAodGhlIG90aGVyIHR3byByZXF1aXJlZCBoZWFkZXJzIGFyZW4ndCB1c2VkKS4gIE5vbi1BTlNJIHN5c3RlbXMgdGhhdCBkb24ndAotICAgIGhhdmUgc3RkZGVmLmggb3IgbGltaXRzLmggd2lsbCBoYXZlIHRvIHByb3ZpZGUgYW4gYXBwcm9wcmlhdGUgZmFrZQotICAgIGNvbnRhaW5pbmcgdGhlIHJlbGV2YW50IHR5cGVzIGFuZCAjZGVmaW5lcy4KLSAgRHJvcHBlZCBzdXBwb3J0IGZvciAxNi1iaXQgcGxhdGZvcm1zLiBUaGUgdXNlIG9mIEZBUi9mYXIgaGFzIGJlZW4gZWxpbWluYXRlZAotICAgIGFuZCB0aGUgZGVmaW5pdGlvbiBvZiBwbmdfYWxsb2Nfc2l6ZV90IGlzIG5vdyBjb250cm9sbGVkIGJ5IGEgZmxhZyBzbwotICAgIHRoYXQgJ3NtYWxsIHNpemVfdCcgc3lzdGVtcyBjYW4gc2VsZWN0IGl0IGlmIG5lY2Vzc2FyeS4gIExpYnBuZyAxLjYgbWF5Ci0gICAgbm90IGN1cnJlbnRseSB3b3JrIG9uIHN1Y2ggc3lzdGVtcyAtLSBpdCBzZWVtcyBsaWtlbHkgdGhhdCBpdCB3aWxsCi0gICAgYXNrICdtYWxsb2MnIGZvciBtb3JlIHRoYW4gNjU1MzUgYnl0ZXMgd2l0aCBhbnkgaW1hZ2UgdGhhdCBoYXMgYQotICAgIHN1ZmZpY2llbnRseSBsYXJnZSByb3cgc2l6ZSAocmF0aGVyIHRoYW4gc2ltcGx5IGZhaWxpbmcgdG8gcmVhZCBzdWNoCi0gICAgaW1hZ2VzKS4KLSAgTmV3IHRvb2xzIGRpcmVjdG9yeSBjb250YWluaW5nIHRvb2xzIHVzZWQgdG8gZ2VuZXJhdGUgbGlicG5nIGNvZGUuCi0gIEZpeGVkIHJhY2UgY29uZGl0aW9ucyBpbiBwYXJhbGxlbCBtYWtlIGJ1aWxkcy4gV2l0aCBoaWdoZXIgZGVncmVlcyBvZgotICAgIHBhcmFsbGVsaXNtIGR1cmluZyAnbWFrZScgdGhlIHVzZSBvZiB0aGUgc2FtZSB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBzdWNoCi0gICAgYXMgJ2RmbionIGNhbiByZXN1bHQgaW4gYSByYWNlIHdoZXJlIGEgdGVtcG9yYXJ5IGZpbGUgZnJvbSBvbmUgYXJtIG9mIHRoZQotICAgIGJ1aWxkIGlzIGRlbGV0ZWQgb3Igb3ZlcndyaXR0ZW4gaW4gYW5vdGhlciBhcm0uICBUaGlzIGNoYW5nZXMgdGhlCi0gICAgdGVtcG9yYXJ5IGZpbGVzIGZvciBzdWZmaXggcnVsZXMgdG8gYWx3YXlzIHVzZSAkKiBhbmQgZW5zdXJlcyB0aGF0IHRoZQotICAgIG5vbi1zdWZmaXggcnVsZXMgdXNlIHVuaXF1ZSBmaWxlIG5hbWVzLgotCi1WZXJzaW9uIDEuNi4wYmV0YTAyIFtEZWNlbWJlciAyMSwgMjAxMV0KLSAgQ29ycmVjdCBjb25maWd1cmUgYnVpbGRzIHdoZXJlIGJ1aWxkIGFuZCBzb3VyY2UgZGlyZWN0b3JpZXMgYXJlIHNlcGFyYXRlLgotICAgIFRoZSBpbmNsdWRlIHBhdGggb2YgJ2NvbmZpZy5oJyB3YXMgZXJyb25lb3VzbHkgbWFkZSByZWxhdGl2ZSBpbiBwbmd2YWxpZC5jCi0gICAgaW4gbGlicG5nIDEuNS43LgotCi1WZXJzaW9uIDEuNi4wYmV0YTAzIFtEZWNlbWJlciAyMiwgMjAxMV0KLSAgU3RhcnQtdXAgY29kZSBzaXplIGltcHJvdmVtZW50cywgZXJyb3IgaGFuZGxlciBmbGV4aWJpbGl0eS4gVGhlc2UgY2hhbmdlcwotICAgIGFsdGVyIGhvdyB0aGUgdHJpY2t5IGFsbG9jYXRpb24gb2YgdGhlIGluaXRpYWwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8KLSAgICBzdHJ1Y3R1cmVzIGFyZSBoYW5kbGVkLiBwbmdfaW5mbyBpcyBub3cgaGFuZGxlZCBpbiBwcmV0dHkgbXVjaCB0aGUgc2FtZQotICAgIHdheSBhcyBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCB0aGF0IHRoZSBhbGxvY2F0aW9ucyBoYW5kbGUgTlVMTCByZXR1cm4KLSAgICBzaWxlbnRseS4gIHBuZ19zdHJ1Y3QgaXMgY2hhbmdlZCBpbiBhIHNpbWlsYXIgd2F5IG9uIGFsbG9jYXRpb24gYW5kIG9uCi0gICAgZGVhbGxvY2F0aW9uIGEgJ3NhZmV0eScgZXJyb3IgaGFuZGxlciBpcyBwdXQgaW4gcGxhY2UgKHdoaWNoIHNob3VsZCBuZXZlcgotICAgIGJlIHJlcXVpcmVkKS4gIFRoZSBlcnJvciBoYW5kbGVyIGl0c2VsZiBpcyBjaGFuZ2VkIHRvIHBlcm1pdCBtaXNtYXRjaGVzCi0gICAgaW4gdGhlIGFwcGxpY2F0aW9uIGFuZCBsaWJwbmcgZXJyb3IgYnVmZmVyIHNpemU7IGhvd2V2ZXIsIHRoaXMgbWVhbnMgYQotICAgIHNpbGVudCBjaGFuZ2UgdG8gdGhlIEFQSSB0byByZXR1cm4gdGhlIGptcF9idWYgaWYgdGhlIHNpemUgZG9lc24ndCBtYXRjaAotICAgIHRoZSBzaXplIGZyb20gdGhlIGxpYnBuZyBjb21waWxhdGlvbjsgbGlicG5nIG5vdyBhbGxvY2F0ZXMgdGhlIG1lbW9yeSBhbmQKLSAgICB0aGlzIG1heSBmYWlsLiAgT3ZlcmFsbCB0aGVzZSBjaGFuZ2VzIHJlc3VsdCBpbiBzbGlnaHQgY29kZSBzaXplCi0gICAgcmVkdWN0aW9uczsgaG93ZXZlciwgdGhpcyBpcyBhIHJlZHVjdGlvbiBpbiBjb2RlIHRoYXQgaXMgYWx3YXlzIGV4ZWN1dGVkCi0gICAgc28gaXMgcGFydGljdWxhcmx5IHZhbHVhYmxlLiAgT3ZlcmFsbCBvbiBhIDY0LWJpdCBzeXN0ZW0gdGhlIGxpYnBuZyBETEwKLSAgICBkZWNyZWFzZXMgaW4gY29kZSBzaXplIGJ5IDE3MzMgYnl0ZXMuICBwbmdlcnJvci5vIGluY3JlYXNlcyBpbiBzaXplIGJ5Ci0gICAgYWJvdXQgNDY1IGJ5dGVzIGJlY2F1c2Ugb2YgdGhlIG5ldyBmdW5jdGlvbmFsaXR5LgotICBBZGRlZCBwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcigpIGFuZCBkZXByZWNhdGVkIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMoKQotICAgIHRvIGF2b2lkIGluY2x1ZGluZyBhIHNwdXJpb3VzIGJ1ZmZlciBpbiB0aGUgcG5nX3N0cnVjdC4KLQotVmVyc2lvbiAxLjYuMGJldGEwNCBbRGVjZW1iZXIgMzAsIDIwMTFdCi0gIFJlZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHRzIHdpdGggYXV0b21ha2UtMS4xMS4yCi0gIEVsaW1pbmF0ZWQgcG5nX2luZm9fZGVzdHJveSgpLiBJdCBpcyBub3cgdXNlZCBvbmx5IGluIHBuZy5jIGFuZCBvbmx5IGNhbGxzCi0gICAgb25lIG90aGVyIGludGVybmFsIGZ1bmN0aW9uIGFuZCBtZW1zZXQoKS4KLSAgRW5hYmxlZCBwbmdfZ2V0X3NDQUxfZml4ZWQoKSBpZiBmbG9hdGluZyBwb2ludCBBUElzIGFyZSBlbmFibGVkLiBQcmV2aW91c2x5Ci0gICAgaXQgd2FzIGRpc2FibGVkIHdoZW5ldmVyIGludGVybmFsIGZpeGVkIHBvaW50IGFyaXRobWV0aWMgd2FzIHNlbGVjdGVkLAotICAgIHdoaWNoIG1lYW50IGl0IGRpZG4ndCBleGlzdCBldmVuIG9uIHN5c3RlbXMgd2hlcmUgRlAgd2FzIGF2YWlsYWJsZSBidXQgbm90Ci0gICAgcHJlZmVycmVkLgotICBBZGRlZCBwbmd2YWxpZC5jIGNvbXBpbGUgdGltZSBjaGVja3MgZm9yIGNvbnN0IEFQSXMuCi0gIEltcGxlbWVudGVkICdyZXN0cmljdCcgZm9yIHBuZ19pbmZvIGFuZCBwbmdfc3RydWN0LiBCZWNhdXNlIG9mIHRoZSB3YXkKLSAgICBsaWJwbmcgd29ya3MgYm90aCBwbmdfaW5mbyBhbmQgcG5nX3N0cnVjdCBhcmUgYWx3YXlzIGFjY2Vzc2VkIHZpYSBhCi0gICAgc2luZ2xlIHBvaW50ZXIuICBUaGlzIG1lYW5zIGFkZGluZyBDOTkgJ3Jlc3RyaWN0JyB0byB0aGUgcG9pbnRlciBnaXZlcwotICAgIHRoZSBjb21waWxlciBzb21lIG9wcG9ydHVuaXR5IHRvIG9wdGltaXplIHRoZSBjb2RlLiAgVGhpcyBjaGFuZ2UgYWxsb3dzCi0gICAgdGhhdC4KLSAgTW92ZWQgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJyYXJpZXMgY2FuIGJlIHZlcnNpb25lZF0pIGxhdGVyIHRvIHRoZSBwcm9wZXIKLSAgICBsb2NhdGlvbiBpbiBjb25maWd1cmUuYWMgKEdpbGxlcyBFc3BpbmFzc2UpLgotICBDaGFuZ2VkIHBuZ19tZW1jcHkgdG8gQyBhc3NpZ25tZW50IHdoZXJlIGFwcHJvcHJpYXRlLiBDaGFuZ2VkIGFsbCB0aG9zZQotICAgIHVzZXMgb2YgcG5nX21lbWNweSB0aGF0IHdlcmUgZG9pbmcgYSBzaW1wbGUgYXNzaWdubWVudCB0byBhc3NpZ25tZW50cwotICAgIChhbGwgdGhvc2UgY2FzZXMgd2hlcmUgdGhlIHRoaW5nIGJlaW5nIGNvcGllZCBpcyBhIG5vbi1hcnJheSBDIEwtdmFsdWUpLgotICBBZGRlZCBzb21lIGVycm9yIGNoZWNraW5nIHRvIHBuZ19zZXRfKigpIHJvdXRpbmVzLgotICBSZW1vdmVkIHRoZSByZWZlcmVuY2UgdG8gdGhlIG5vbi1leHBvcnRlZCBmdW5jdGlvbiBwbmdfbWVtY3B5KCkgZnJvbQotICAgIGV4YW1wbGUuYy4KLSAgRml4ZWQgdGhlIFZpc3VhbCBDIDY0LWJpdCBidWlsZCAtIGl0IHJlcXVpcmVzIGptcF9idWYgdG8gYmUgYWxpZ25lZCwgYnV0Ci0gICAgaXQgaGFkIGJlY29tZSBtaXNhbGlnbmVkLgotICBSZXZpc2VkIGNvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5jIHRvIGF2b2lkIHdhcm5pbmdzIHdoZW4gcG5nX3VpbnRfMzIKLSAgICBhbmQgdW5zaWduZWQgbG9uZyBhcmUgb2YgZGlmZmVyZW50IHNpemVzLgotCi1WZXJzaW9uIDEuNi4wYmV0YTA1IFtKYW51YXJ5IDE1LCAyMDEyXQotICBVcGRhdGVkIG1hbnVhbCB3aXRoIGRlc2NyaXB0aW9uIG9mIHRoZSBzaW1wbGlmaWVkIEFQSSAoY29waWVkIGZyb20gcG5nLmgpCi0gIEZpeCBidWcgaW4gcG5nZXJyb3IuYzogc29tZSBsb25nIHdhcm5pbmdzIHdlcmUgYmVpbmcgaW1wcm9wZXJseSB0cnVuY2F0ZWQKLSAgICAoQ1ZFLTIwMTEtMzQ2NCwgYnVnIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNS4zYmV0YTA1KS4KLQotVmVyc2lvbiAxLjYuMGJldGEwNiBbSmFudWFyeSAyNCwgMjAxMl0KLSAgQWRkZWQgcGFsZXR0ZSBzdXBwb3J0IHRvIHRoZSBzaW1wbGlmaWVkIEFQSXMuIFRoaXMgY29tbWl0Ci0gICAgY2hhbmdlcyBzb21lIG9mIHRoZSBtYWNybyBkZWZpbml0aW9ucyBpbiBwbmcuaCwgYXBwIGNvZGUKLSAgICBtYXkgbmVlZCBjb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0gIEluY3JlYXNlZCB0aGUgZm9ybWF0dGVkIHdhcm5pbmcgYnVmZmVyIHRvIDE5MiBieXRlcy4KLSAgQWRkZWQgY29sb3ItbWFwIHN1cHBvcnQgdG8gc2ltcGxpZmllZCBBUEkuIFRoaXMgaXMgYW4gaW5pdGlhbCB2ZXJzaW9uIGZvcgotICAgIHJldmlldzsgdGhlIGRvY3VtZW50YXRpb24gaGFzIG5vdCB5ZXQgYmVlbiB1cGRhdGVkLgotICBGaXhlZCBNaW4vR1cgdW5pbnN0YWxsIHRvIHJlbW92ZSBsaWJwbmcuZGxsLmEKLQotVmVyc2lvbiAxLjYuMGJldGEwNyBbSmFudWFyeSAyOCwgMjAxMl0KLSAgRWxpbWluYXRlZCBJbnRlbCBpY2MvaWNsIGNvbXBpbGVyIHdhcm5pbmdzLiBUaGUgSW50ZWwgKEdDQyBkZXJpdmVkKQotICAgIGNvbXBpbGVyIGlzc3VlcyBzbGlnaHRseSBkaWZmZXJlbnQgd2FybmluZ3MgZnJvbSB0aG9zZSBpc3N1ZWQgYnkgdGhlCi0gICAgY3VycmVudCB2ZXNpb25zIG9mIEdDQy4gVGhpcyBlbGltaW5hdGVzIHRob3NlIHdhcm5pbmdzIGJ5Ci0gICAgYWRkaW5nL3JlbW92aW5nIGNhc3RzIGFuZCBzbWFsbCBjb2RlIHJld3JpdGVzLgotICBVcGRhdGVkIGNvbmZpZ3VyZS5hYyBmcm9tIGF1dG91cGRhdGU6IGFkZGVkIC0tZW5hYmxlLXdlcnJvciBvcHRpb24uCi0gICAgQWxzbyBzb21lIGxheW91dCByZWd1bGFyaXphdGlvbiBhbmQgcmVtb3ZhbCBvZiBpbnRyb2R1Y2VkIHRhYiBjaGFyYWN0ZXJzCi0gICAgKHJlcGxhY2VkIHdpdGggMy1jaGFyYWN0ZXIgaW5kZW50YXRpb24pLiAgT2Jzb2xldGUgbWFjcm9zIGlkZW50aWZpZWQgYnkKLSAgICBhdXRvdXBkYXRlIGhhdmUgYmVlbiByZW1vdmVkOyB0aGUgcmVwbGFjZW1lbnRzIGFyZSBhbGwgaW4gMi41OSBzbwotICAgIHRoZSBwcmUtcmVxIGhhc24ndCBiZWVuIGNoYW5nZWQuICAtLWVuYWJsZS13ZXJyb3IgY2hlY2tzIGZvciBzdXBwb3J0Ci0gICAgZm9yIC1XZXJyb3IgKG9yIHRoZSBnaXZlbiBhcmd1bWVudCkgaW4gdGhlIGNvbXBpbGVyLiAgVGhpcyBtaW1pY3MgdGhlCi0gICAgZ2NjIGNvbmZpZ3VyZSBvcHRpb24gYnkgYWxsb3dpbmcgLVdlcnJvciB0byBiZSB0dXJuZWQgb24gc2FmZWx5OyB3aXRob3V0Ci0gICAgdGhlIG9wdGlvbiB0aGUgdGVzdHMgd3JpdHRlbiBpbiBjb25maWd1cmUgaXRzZWxmIGZhaWwgY29tcGlsYXRpb24gYmVjYXVzZQotICAgIHRoZXkgY2F1c2UgY29tcGlsZXIgd2FybmluZ3MuCi0gIFJld3JvdGUgYXV0b2dlbi5zaCB0byBydW4gYXV0b3JlY29uZiBpbnN0ZWFkIG9mIHJ1bm5pbmcgdG9vbHMgb25lLWJ5LW9uZS4KLSAgQ29uZGl0aW9uYWxpemUgdGhlIGluc3RhbGwgcnVsZXMgZm9yIE1JTkdXIGFuZCBDWUdXSU4gaW4gQ01ha2VMaXN0cy50eHQgYW5kCi0gICAgc2V0IENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSB0byAibGliIiBvbiBhbGwgcGxhdGZvcm1zIChDLiBZYXBwKS4KLSAgRnJlZXplIGxpYnRvb2wgZmlsZXMgaW4gdGhlICdzY3JpcHRzJyBkaXJlY3RvcnkuIFRoaXMgdmVyc2lvbiBvZiBhdXRvZ2VuLnNoCi0gICAgYXR0ZW1wdHMgdG8gZGlzc3VhZGUgcGVvcGxlIGZyb20gcnVubmluZyBpdCB3aGVuIGl0IGlzIG5vdCwgb3Igc2hvdWxkIG5vdCwKLSAgICBiZSBuZWNlc3NhcnkuICBJbiBmYWN0LCBhdXRvZ2VuLnNoIGRvZXMgbm90IHdvcmsgd2hlbiBydW4gaW4gYSBsaWJwbmcKLSAgICBkaXJlY3RvcnkgZXh0cmFjdGVkIGZyb20gYSB0YXIgZGlzdHJpYnV0aW9uIGFueW1vcmUuIFlvdSBtdXN0IHJ1biBpdCBpbgotICAgIGEgR0lUIGNsb25lIGluc3RlYWQuCi0gIEFkZGVkIHR3byBpbWFnZXMgdG8gY29udHJpYi9wbmdzdWl0ZSAoMS1iaXQgYW5kIDItYml0IHRyYW5zcGFyZW50IGdyYXlzY2FsZSksCi0gICAgYW5kIHJlbmFtZWQgdGhyZWUgd2hvc2UgbmFtZXMgd2VyZSBpbmNvbnNpc3RlbnQgd2l0aCB0aG9zZSBpbgotICAgIHBuZ3N1aXRlL1JFQURNRS50eHQuCi0KLVZlcnNpb24gMS42LjBiZXRhMDggW0ZlYnJ1YXJ5IDEsIDIwMTJdCi0gIEZpeGVkIEltYWdlOjpjb2xvcm1hcCBtaXNhbGlnbm1lbnQgaW4gcG5nc3Rlc3QuYwotICBDaGVjayBsaWJ0b29sL2xpYnRvb2xpemUgdmVyc2lvbiBudW1iZXIgKDIuNC4yKSBpbiBjb25maWd1cmUuYWMKLSAgRGl2aWRlIHRlc3QtcG5nc3Rlc3Quc2ggaW50byBzZXBhcmF0ZSBwbmdzdGVzdCBydW5zIGZvciBiYXNpYyBhbmQKLSAgICB0cmFuc3BhcmVudCBpbWFnZXMuCi0gIE1vdmVkIGF1dG9tYWtlIG9wdGlvbnMgdG8gQU1fSU5JVF9BVVRPTUFLRSBpbiBjb25maWd1cmUuYWMKLSAgQWRkZWQgY29sb3ItdGVzdHMsIHNpbGVudC1ydWxlcyAoTm90IHlldCBpbXBsZW1lbnRlZCBpbiBNYWtlZmlsZS5hbSkgYW5kCi0gICAgdmVyc2lvbiBjaGVja2luZyB0byBjb25maWd1cmUuYWMKLSAgSW1wcm92ZWQgcG5nc3Rlc3Qgc3BlZWQgYnkgbm90IGRvaW5nIHJlZHVuZGFudCB0ZXN0cyBhbmQgYWRkIGNvbnN0IHRvCi0gICAgdGhlIGJhY2tncm91bmQgcGFyYW1ldGVyIG9mIHBuZ19pbWFnZV9maW5pc2hfcmVhZC4gVGhlIC0tYmFja2dyb3VuZAotICAgIG9wdGlvbiBpcyBub3cgZG9uZSBhdXRvbWFnaWNhbGx5IG9ubHkgd2hlbiByZXF1aXJlZCwgc28gdGhhdCBjb21tYW5kbGluZQotICAgIG9wdGlvbiBubyBsb25nZXIgZXhpc3RzLgotICBDbGVhbmVkIHVwIHBuZ3ByaXYuaCB0byBjb25zaXN0ZW50bHkgZGVjbGFyZSBhbGwgZnVuY3Rpb25zIGFuZCBkYXRhLgotICAgIEFsc28gZWxpbWluYXRlZCBQTkdfQ09OU1RfREFUQSwgd2hpY2ggaXMgYXBwYXJlbnRseSBub3QgbmVlZGVkIGJ1dCB3ZQotICAgIGNhbid0IGJlIHN1cmUgdW50aWwgaXQgaXMgZ29uZS4KLSAgQWRkZWQgc3ltYm9sIHByZWZpeGluZyB0aGF0IGFsbG93cyBhbGwgdGhlIGxpYnBuZyBleHRlcm5hbCBzeW1ib2xzCi0gICAgdG8gYmUgcHJlZml4ZWQgKHN1Z2dlc3RlZCBieSBSZXViZW4gSGF3a2lucykuCi0gIFVwZGF0ZWQgImZ0YmIqLnBuZyIgbGlzdCBpbiB0aGUgb3dhdGNvbSBhbmQgdnN0dWRpbyBwcm9qZWN0cy4KLSAgRml4ZWQgJ3ByZWZpeCcgYnVpbGRzIG9uIGNsZWFuIHN5c3RlbXMuIFRoZSBnZW5lcmF0aW9uIG9mIHBuZ3ByZWZpeC5oCi0gICAgc2hvdWxkIG5vdCByZXF1aXJlIGl0c2VsZi4KLSAgVXBkYXRlZCBJTlNUQUxMIHRvIGV4cGxhaW4gdGhhdCBhdXRvZ2VuLnNoIG11c3QgYmUgcnVuIGluIGEgR0lUIGNsb25lLAotICAgIG5vdCBpbiBhIGxpYnBuZyBkaXJlY3RvcnkgZXh0cmFjdGVkIGZyb20gYSB0YXIgZGlzdHJpYnV0aW9uLgotCi1WZXJzaW9uIDEuNi4wYmV0YTA5IFtGZWJydWFyeSAxLCAyMDEyXQotICBSZXZlcnRlZCB0aGUgcHJlYnVpbHQgY29uZmlndXJlIGZpbGVzIHRvIGxpYnBuZy0xLjYuMGJldGEwNSBjb25kaXRpb24uCi0KLVZlcnNpb24gMS42LjBiZXRhMTAgW0ZlYnJ1YXJ5IDMsIDIwMTJdCi0gIEFkZGVkIFpfU09MTyBmb3IgemxpYi0xLjIuNisgYW5kIGNvcnJlY3QgcG5nc3Rlc3QgdGVzdHMKLSAgVXBkYXRlZCBsaXN0IG9mIHRlc3QgaW1hZ2VzIGluIENNYWtlTGlzdHMudHh0Ci0gIFVwZGF0ZWQgdGhlIHByZWJ1aWx0IGNvbmZpZ3VyZSBmaWxlcyB0byBjdXJyZW50IGNvbmRpdGlvbi4KLSAgUmV2aXNlZCBJTlNUQUxMIGluZm9ybWF0aW9uIGFib3V0IGF1dG9nZW4uc2g7IGl0IHdvcmtzIGluIHRhciBkaXN0cmlidXRpb25zLgotCi1WZXJzaW9uIDEuNi4wYmV0YTExIFtGZWJydWFyeSAxNiwgMjAxMl0KLSAgRml4IGNoYXJhY3RlciBjb3VudCBpbiBwbmdzdGVzdCBjb21tYW5kIGluIHByb2plY3RzL293YXRjb20vcG5nc3Rlc3QudGd0Ci0gIFJldmlzZWQgdGVzdC1wbmdzdGVzdC5zaCB0byByZXBvcnQgUEFTUy9GQUlMIGZvciBlYWNoIGltYWdlLgotICBVcGRhdGVkIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHNpbXBsaWZpZWQgQVBJLgotICBDb3JyZWN0ZWQgZXN0aW1hdGUgb2YgZXJyb3IgaW4gbGlicG5nIHBuZ19zZXRfcmdiX3RvX2dyYXkgQVBJLiAgVGhlIEFQSSBpcwotICAgIGV4dHJlbWVseSBpbmFjY3VyYXRlIGZvciBzUkdCIGNvbnZlcnNpb25zIGJlY2F1c2UgaXQgdXNlcyBhbiA4LWJpdAotICAgIGludGVybWVkaWF0ZSBsaW5lYXIgdmFsdWUgYW5kIGl0IGRvZXMgbm90IHVzZSB0aGUgc1JHQiB0cmFuc2Zvcm0sIHNvIGl0Ci0gICAgc3VmZmVycyBmcm9tIHRoZSBrbm93biBpbnN0YWJpbGl0eSBpbiBnYW1tYSB0cmFuc2Zvcm1zIGZvciB2YWx1ZXMgY2xvc2UKLSAgICB0byAwIChzZWUgUG95bnRvbikuICBUaGUgbmV0IHJlc3VsdCBpcyB0aGF0IHRoZSBjYWxjdWxhdGlvbiBoYXMgYSBtYXhpbXVtCi0gICAgZXJyb3Igb2YgMTQuOTkvMjU1OyAwLjUvMjU1XigxLzIuMikuICBwbmdzdGVzdCBub3cgdXNlcyAxNSBmb3IgdGhlCi0gICAgcGVybWl0dGVkIDgtYml0IGVycm9yLiBUaGlzIG1heSBzdGlsbCBub3QgYmUgZW5vdWdoIGJlY2F1c2Ugb2YgYXJpdGhtZXRpYwotICAgIGVycm9yLgotICBSZW1vdmVkIHNvbWUgdW51c2VkIGFycmF5cyAod2l0aCAjaWZkZWYpIGZyb20gcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93KCkuCi0gIEZpeGVkIGEgbWVtb3J5IG92ZXJ3cml0ZSBidWcgaW4gc2ltcGxpZmllZCByZWFkIG9mIFJHQiBQTkcgd2l0aAotICAgIG5vbi1saW5lYXIgZ2FtbWEgQWxzbyBidWdzIGluIHRoZSBlcnJvciBjaGVja2luZyBpbiBwbmdyZWFkLmMgYW5kIGNoYW5nZWQKLSAgICBxdWl0ZSBhIGxvdCBvZiB0aGUgY2hlY2tzIGluIHBuZ3N0ZXN0LmMgdG8gYmUgY29ycmVjdDsgZWl0aGVyIGNvcnJlY3RseQotICAgIHdyaXR0ZW4gb3Igbm90IG92ZXItb3B0aW1pc3RpYy4gIFRoZSBwbmdzdGVzdCBjaGFuZ2VzIGFyZSBpbnN1ZmZpY2llbnQgdG8KLSAgICBhbGxvdyBhbGwgcG9zc2libGUgUkdCIHRyYW5zZm9ybXMgdG8gYmUgcGFzc2VkOyBwbmdzdGVzdCBjbXBwaXhlbCBuZWVkcwotICAgIHRvIGJlIHJld3JpdHRlbiB0byBtYWtlIGl0IGNsZWFyZXIgd2hpY2ggZXJyb3JzIGl0IGFsbG93cyBhbmQgdGhlbiBjaGFuZ2VkCi0gICAgdG8gcGVybWl0IGtub3duIGluYWNjdXJhY2llcy4KLSAgUmVtb3ZlZCB0ZXN0cyBmb3Igbm8tbG9uZ2VyLXVzZWQgKl9FTVBUWV9QTFRFX1NVUFBPUlRFRCBmcm9tIHBuZ3N0cnVjdC5oCi0gIEZpeGVkIGZpeGVkL2Zsb2F0IEFQSSBleHBvcnQgY29uZGl0aW9uYWxzLiAxKSBJZiBGSVhFRF9QT0lOVCBvcgotICAgIEZMT0FUSU5HX1BPSU5UIG9wdGlvbnMgd2VyZSBzd2l0Y2hlZCBvZmYsIHBuZy5oIGVuZGVkIHVwIHdpdGggbG9uZSAnOycKLSAgICBjaGFyYWN0ZXJzLiAgVGhpcyBpcyBub3QgdmFsaWQgQU5TSS1DIG91dHNpZGUgYSBmdW5jdGlvbi4gIFRoZSAnOycKLSAgICBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtb3ZlZCBpbnNpZGUgdGhlIGRlZmluaXRpb24gb2YgUE5HX0ZQX0VYUE9SVCBhbmQKLSAgICBQTkdfRklYRURfRVhQT1JULiAyKSBJZiBlaXRoZXIgb3B0aW9uIHdhcyBzd2l0Y2hlZCBvZmYsIHRoZSBkZWNsYXJhdGlvbgotICAgIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucyB3ZXJlIGNvbXBsZXRlbHkgb21pdHRlZCwgZXZlbiB0aG91Z2ggc29tZQotICAgIG9mIHRoZW0gYXJlIHN0aWxsIHVzZWQgaW50ZXJuYWxseS4gIFRoZSByZXN1bHQgaXMgc3RpbGwgdmFsaWQsIGJ1dAotICAgIHByb2R1Y2VzIHdhcm5pbmdzIGZyb20gZ2NjIHdpdGggc29tZSB3YXJuaW5nIG9wdGlvbnMgKGluY2x1ZGluZyAtV2FsbCkuIFRoZQotICAgIGZpeCBpcyB0byBjYXVzZSBwbmcuaCB0byBkZWNsYXJlIHRoZSBmdW5jdGlvbnMgd2l0aCBQTkdfSU5URVJOQUxfRlVOQ1RJT04KLSAgICB3aGVuIHBuZy5oIGlzIGluY2x1ZGVkIGZyb20gcG5ncHJpdi5oLgotICBDaGVjayBmb3IgaW52YWxpZCBwYWxldHRlIGluZGV4IHdoaWxlIHJlYWRpbmcgcGFsZXR0ZWQgUE5HLiAgV2hlbiBvbmUgaXMKLSAgICBmb3VuZCwgaXNzdWUgYSB3YXJuaW5nIGFuZCBpbmNyZWFzZSBwbmdfcHRyLT5udW1fcGFsZXR0ZSBhY2NvcmRpbmdseS4KLSAgICBBcHBzIGFyZSByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgdG8gc2VlIGlmIHRoYXQgaGFwcGVuZWQuCi0KLVZlcnNpb24gMS42LjBiZXRhMTIgW0ZlYnJ1YXJ5IDE4LCAyMDEyXQotICBEbyBub3QgaW5jcmVhc2UgbnVtX3BhbGV0dGUgb24gaW52YWxpZF9pbmRleC4KLSAgUmVsb2NhdGVkIGNoZWNrIGZvciBpbnZhbGlkIHBhbGV0dGUgaW5kZXggdG8gcG5ncnRyYW4uYywgYWZ0ZXIgdW5wYWNraW5nCi0gICAgdGhlIHN1Yi04LWJpdCBwaXhlbHMuCi0gIEZpeGVkIENWRS0yMDExLTMwMjYgYnVmZmVyIG92ZXJydW4gYnVnLiAgVGhpcyBidWcgd2FzIGludHJvZHVjZWQgd2hlbgotICAgIGlDQ1AgY2h1bmsgc3VwcG9ydCB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMC42LiBEZWFsIG1vcmUgY29ycmVjdGx5IHdpdGggdGhlCi0gICAgdGVzdCBvbiBpQ0NQIGNodW5rIGxlbmd0aC4gQWxzbyByZW1vdmVkIHNwdXJpb3VzIGNhc3RzIHRoYXQgbWF5IGhpZGUKLSAgICBwcm9ibGVtcyBvbiAxNi1iaXQgc3lzdGVtcy4KLQotVmVyc2lvbiAxLjYuMGJldGExMyBbRmVicnVhcnkgMjQsIDIwMTJdCi0gIEVsaW1pbmF0ZWQgcmVkdW5kYW50IHBuZ19wdXNoX3JlYWRfdEVYdHx6VFh0fGlUWHR8dW5rbm93biBjb2RlIGZyb20KLSAgICBwbmdwcmVhZC5jIGFuZCB1c2UgdGhlIHNlcXVlbnRpYWwgcG5nX2hhbmRsZV90RVh0LCBldGMuLCBpbiBwbmdydXRpbC5jOwotICAgIG5vdyB0aGF0IHBuZ19wdHItPmJ1ZmZlciBpcyBpbmFjY2Vzc2libGUgdG8gYXBwbGljYXRpb25zLCB0aGUgc3BlY2lhbAotICAgIGhhbmRsaW5nIGlzIG5vIGxvbmdlciB1c2VmdWwuCi0gIEFkZGVkIFBOR19TQUZFX0xJTUlUUyBmZWF0dXJlIHRvIHBuZ2xpYmNvbmYuZGZhLCBwbmdwcml2LmgsIGFuZCBuZXcKLSAgICBwbmd1c3IuZGZhIHRvIHJlc2V0IHRoZSB1c2VyIGxpbWl0cyB0byBzYWZlIG9uZXMgaWYgUE5HX1NBRkVfTElNSVRTIGlzCi0gICAgZGVmaW5lZC4gIFRvIGVuYWJsZSwgdXNlICJDUFBGTEFHUz0tRFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQ9MSIgb24gdGhlCi0gICAgY29uZmlndXJlIGNvbW1hbmQgb3IgcHV0ICNkZWZpbmUgUE5HX1NBRkVfTElNSVRTX1NVUFBPUlRFRCBpbgotICAgIHBuZ2xpYmNvbmYuaC5wcmVidWlsdCBhbmQgcG5nbGliY29uZi5oLgotCi1WZXJzaW9uIDEuNi4wYmV0YTE0IFtGZWJydWFyeSAyNywgMjAxMl0KLSAgQWRkZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBsaW1pdHMgaW4gdGhlIG1hbnVhbC4KLSAgVXBkYXRlZCBNYWtlZmlsZS5pbgotCi1WZXJzaW9uIDEuNi4wYmV0YTE1IFtNYXJjaCAyLCAyMDEyXQotICBSZW1vdmVkIHVudXNlZCAiY3VycmVudF90ZXh0IiBtZW1iZXJzIG9mIHBuZ19zdHJ1Y3QgYW5kIHRoZSBwbmdfZnJlZSgpCi0gICAgb2YgcG5nX3B0ci0+Y3VycmVudF90ZXh0IGZyb20gcG5ncmVhZC5jCi0gIFJld3JvdGUgcG5nc3Rlc3QuYyBmb3Igc3Vic3RhbnRpYWwgc3BlZWQgaW1wcm92ZW1lbnQuCi0gIEZpeGVkIHRyYW5zcGFyZW50IHBpeGVsIGFuZCAxNi1iaXQgcmdiIHRlc3RzIGluIHBuZ3N0ZXN0IGFuZCByZW1vdmVkIGEKLSAgICBzcHVyaW91cyBjaGVjayBpbiBwbmd3cml0ZS5jCi0gIEFkZGVkIFBOR19JTUFHRV9GTEFHX0ZBU1QgZm9yIHRoZSBiZW5lZml0IG9mIGFwcGxpY2F0aW9ucyB0aGF0IHN0b3JlCi0gICAgaW50ZXJtZWRpYXRlIGZpbGVzLCBvciBpbnRlcm1lZGlhdGUgaW4tbWVtb3J5IGRhdGEsIHdoaWxlIHByb2Nlc3NpbmcKLSAgICBpbWFnZSBkYXRhIHdpdGggdGhlIHNpbXBsaWZpZWQgQVBJLiAgVGhlIG9wdGlvbiBtYWtlcyB0aGUgZmlsZXMgbGFyZ2VyCi0gICAgYnV0IGZhc3RlciB0byB3cml0ZSBhbmQgcmVhZC4gIHBuZ3N0ZXN0IG5vdyB1c2VzIHRoaXMgYnkgZGVmYXVsdDsgdGhpcwotICAgIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSAtLXNsb3cgb3B0aW9uLgotICBJbXByb3ZlZCBwbmdzdGVzdCBmaW5lIHR1bmluZyBvZiBlcnJvciBudW1iZXJzLCBuZXcgdGVzdCBmaWxlIGdlbmVyYXRvci4KLSAgICBUaGUgZ2VuZXJhdG9yIGdlbmVyYXRlcyBpbWFnZXMgdGhhdCB0ZXN0IHRoZSBmdWxsIHJhbmdlIG9mIHNhbXBsZSB2YWx1ZXMsCi0gICAgYWxsb3cgdGhlIGVycm9yIG51bWJlcnMgaW4gcG5nc3Rlc3QgdG8gYmUgdHVuZWQgYW5kIGNoZWNrZWQuICBtYWtlcG5nCi0gICAgYWxzbyBhbGxvd3MgZ2VuZXJhdGlvbiBvZiBpbWFnZXMgd2l0aCBleHRyYSBjaHVua3MsIGFsdGhvdWdoIHRoaXMgaXMKLSAgICBzdGlsbCB3b3JrLWluLXByb2dyZXNzLgotICBBZGRlZCBjaGVjayBmb3IgaW52YWxpZCBwYWxldHRlIGluZGV4IHdoaWxlIHJlYWRpbmcuCi0gIEZpeGVkIHNvbWUgYnVncyBpbiBJQ0MgcHJvZmlsZSB3cml0aW5nLiBUaGUgY29kZSBzaG91bGQgbm93IGFjY2VwdAotICAgIGFsbCBwb3RlbnRpYWxseSB2YWxpZCBJQ0MgcHJvZmlsZXMgYW5kIHJlamVjdCBvYnZpb3VzbHkgaW52YWxpZCBvbmVzLgotICAgIEl0IG5vdyB1c2VzIHBuZ19lcnJvcigpIHRvIGRvIHNvIHJhdGhlciB0aGFuIGNhc3VhbGx5IHdyaXRpbmcgYSBQTkcKLSAgICB3aXRob3V0IHRoZSBuZWNlc3NhcnkgY29sb3IgZGF0YS4KLSAgUmVtb3ZlZCB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBsaW5lcyBpbiBhbGwgc291cmNlIGZpbGVzIGFuZCBzY3JpcHRzLgotCi1WZXJzaW9uIDEuNi4wYmV0YTE2IFtNYXJjaCA2LCAyMDEyXQotICBSZWxvY2F0ZWQgcGFsZXR0ZS1pbmRleCBjaGVja2luZyBmdW5jdGlvbiBmcm9tIHBuZ3J1dGlsLmMgdG8gcG5ndHJhbnMuYwotICBBZGRlZCBwYWxldHRlLWluZGV4IGNoZWNraW5nIHdoaWxlIHdyaXRpbmcuCi0gIENoYW5nZWQgcG5nX2luZmxhdGUoKSBhbmQgY2FsbGluZyByb3V0aW5lcyB0byBhdm9pZCBvdmVyZmxvdyBwcm9ibGVtcy4KLSAgICBUaGlzIGlzIGFuIGludGVybWVkaWF0ZSBjaGVjay1pbiB0aGF0IHNvbHZlcyB0aGUgaW1tZWRpYXRlIHByb2JsZW1zIGFuZAotICAgIGludHJvZHVjZXMgb25lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IChhdm9pZGluZyBhIGNvcHkgdmlhIHBuZ19wdHItPnpidWYuKQotICAgIEZ1cnRoZXIgY2hhbmdlcyB3aWxsIGJlIG1hZGUgdG8gbWFrZSBJQ0MgcHJvZmlsZSBoYW5kbGluZyBtb3JlIHNlY3VyZS4KLSAgRml4ZWQgYnVpbGQgd2FybmluZ3MgKE1TVkMsIEdDQywgR0NDIHYzKS4gQ3lnd2luIEdDQyB3aXRoIGRlZmF1bHQgb3B0aW9ucwotICAgIGRlY2xhcmVzICdpbmRleCcgYXMgYSBnbG9iYWwsIGNhdXNpbmcgYSB3YXJuaW5nIGlmIGl0IGlzIHVzZWQgYXMgYSBsb2NhbAotICAgIHZhcmlhYmxlLiAgR0NDIDY0LWJpdCB3YXJucyBhYm91dCBhc3NpZ25pbmcgYSAoc2l6ZV90KSAodW5zaWduZWQgNjQtYml0KQotICAgIHRvIGFuIChpbnQpIChzaWduZWQgMzItYml0KS4gIE1TVkMsIGhvd2V2ZXIsIHdhcm5zIGFib3V0IHVzaW5nIHRoZQotICAgIHVuYXJ5ICctJyBvcGVyYXRvciBvbiBhbiB1bnNpZ25lZCB2YWx1ZSAoZXZlbiB0aG91Z2ggaXQgaXMgd2VsbCBkZWZpbmVkCi0gICAgYnkgQU5TSS1DIHRvIGJlIH54KzEpLiAgVGhlIHBhZGRpbmcgY2FsY3VsYXRpb24gd2FzIGNoYW5nZWQgdG8gdXNlIGEKLSAgICBkaWZmZXJlbnQgbWV0aG9kLiAgUmVtb3ZlZCB0aGUgdGVzdHMgb24gcG5nX3B0ci0+cGFzcy4KLSAgQWRkZWQgY29udHJpYi9saWJ0ZXN0cy90YXJpdGguYyB0byB0ZXN0IGludGVybmFsIGFyaXRobWV0aWMgZnVuY3Rpb25zIGZyb20KLSAgICBwbmcuYy4gVGhpcyBpcyBhIGxpYnBuZyBtYWludGFpbmVyIHByb2dyYW0gdXNlZCB0byB2YWxpZGF0ZSBjaGFuZ2VzIHRvIHRoZQotICAgIGludGVybmFsIGFyaXRobWV0aWMgZnVuY3Rpb25zLgotICBNYWRlIHJlYWQgJ2luZmxhdGUnIGhhbmRsaW5nIGxpa2Ugd3JpdGUgJ2RlZmxhdGUnIGhhbmRsaW5nLiBUaGUgcmVhZAotICAgIGNvZGUgbm93IGNsYWltcyBhbmQgcmVsZWFzZXMgcG5nX3B0ci0+enN0cmVhbSwgbGlrZSB0aGUgd3JpdGUgY29kZS4KLSAgICBUaGUgYnVnIHdoZXJlYnkgdGhlIHByb2dyZXNzaXZlIHJlYWRlciBmYWlsZWQgdG8gcmVsZWFzZSB0aGUgenN0cmVhbQotICAgIGlzIG5vdyBmaXhlZCwgYWxsIGluaXRpYWxpemF0aW9uIGlzIGRlbGF5ZWQsIGFuZCB0aGUgY29kZSBjaGVja3MgZm9yCi0gICAgY2hhbmdlZCBwYXJhbWV0ZXJzIG9uIGRlZmxhdGUgcmF0aGVyIHRoYW4gYWx3YXlzIGNhbGxpbmcKLSAgICBkZWZsYXRlZEVuZC9kZWZsYXRlSW5pdC4KLSAgVmFsaWRhdGUgdGhlIHpUWHQgc3RyaW5ncyBpbiBwbmd2YWxpZC4KLSAgQWRkZWQgY29kZSB0byB2YWxpZGF0ZSB0aGUgd2luZG93Qml0cyB2YWx1ZSBwYXNzZWQgdG8gZGVmbGF0ZUluaXQyKCkuCi0gICAgSWYgdGhlIGNhbGwgdG8gZGVmbGF0ZUluaXQyKCkgaXMgd3JvbmcgYSBwbmdfd2FybmluZyB3aWxsIGJlIGlzc3VlZAotICAgIChpbiBmYWN0IHRoaXMgaXMgaGFybWxlc3MsIGJ1dCB0aGUgUE5HIGRhdGEgcHJvZHVjZWQgbWF5IGJlIHN1Yi1vcHRpbWFsKS4KLQotVmVyc2lvbiAxLjYuMGJldGExNyBbTWFyY2ggMTAsIDIwMTJdCi0gIEZpeGVkIFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFIGRlZmluaXRpb24uIAotICBSZWplY3QgYWxsIGlDQ1AgY2h1bmtzIGFmdGVyIHRoZSBmaXJzdCwgZXZlbiBpZiB0aGUgZmlyc3Qgb25lIGlzIGludmFsaWQuCi0gIERlZmxhdGUvaW5mbGF0ZSB3YXMgcmV3b3JrZWQgdG8gbW92ZSBjb21tb24gemxpYiBjYWxscyBpbnRvIHNpbmdsZQotICAgIGZ1bmN0aW9ucyBbcndddXRpbC5jLiAgQSBuZXcgc2hhcmVkIGtleXdvcmQgY2hlY2sgcm91dGluZSB3YXMgYWxzbyBhZGRlZAotICAgIGFuZCB0aGUgJ3pidWYnIGlzIG5vIGxvbmdlciBhbGxvY2F0ZWQgb24gcHJvZ3Jlc3NpdmUgcmVhZC4gIEl0IGlzIG5vdwotICAgIHBvc3NpYmxlIHRvIGNhbGwgcG5nX2luZmxhdGUoKSBpbmNyZW1lbnRhbGx5LiAgQSB3YXJuaW5nIGlzIG5vIGxvbmdlcgotICAgIGlzc3VlZCBpZiB0aGUgbGFuZ3VhZ2UgdGFnIG9yIHRyYW5zbGF0ZWQga2V5d29yZCBpbiB0aGUgaVRYdCBjaHVuawotICAgIGhhcyB6ZXJvIGxlbmd0aC4KLSAgSWYgYmVuaWduIGVycm9ycyBhcmUgZGlzYWJsZWQgdXNlIG1heGltdW0gd2luZG93IG9uIGFuY2lsbGlhcnkgaW5mbGF0ZS4KLSAgICBUaGlzIHdvcmtzIHJvdW5kIGEgYnVnIGludHJvZHVjZWQgaW4gMS41LjQgd2hlcmUgY29tcHJlc3NlZCBhbmNpbGxhcnkKLSAgICBjaHVua3MgY291bGQgZW5kIHVwIHdpdGggYSB0b28tc21hbGwgd2luZG93Qml0cyB2YWx1ZSBpbiB0aGUgZGVmbGF0ZQotICAgIGhlYWRlci4KLQotVmVyc2lvbiAxLjYuMGJldGExOCBbTWFyY2ggMTYsIDIwMTJdCi0gIElzc3VlIGEgcG5nX2Jlbmlnbl9lcnJvcigpIGluc3RlYWQgb2YgcG5nX3dhcm5pbmcoKSBhYm91dCBiYWQgcGFsZXR0ZSBpbmRleC4KLSAgSW4gcG5ndGVzdCwgdHJlYXQgYmVuaWduIGVycm9ycyBhcyBlcnJvcnMgaWYgIi1zdHJpY3QiIGlzIHByZXNlbnQuCi0gIEZpeGVkIGFuIG9mZi1ieS1vbmUgZXJyb3IgaW4gdGhlIHBhbGV0dGUgaW5kZXggY2hlY2tpbmcgZnVuY3Rpb24uCi0gIEZpeGVkIGEgY29tcGlsZXIgd2FybmluZyB1bmRlciBDeWd3aW4gKFdpbmRvd3MtNywgMzItYml0IHN5c3RlbSkKLSAgUmV2aXNlZCBleGFtcGxlLmMgdG8gcHV0IHRleHQgc3RyaW5ncyBpbiBhIHRlbXBvcmFyeSBjaGFyYWN0ZXIgYXJyYXkKLSAgICBpbnN0ZWFkIG9mIGRpcmVjdGx5IGFzc2lnbmluZyBzdHJpbmcgY29uc3RhbnRzIHRvIHBuZ190ZXh0cCBtZW1iZXJzLgotICAgIFRoaXMgYXZvaWRzIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gLVd3cml0ZS1zdHJpbmdzIGlzIGVuYWJsZWQuCi0gIEFkZGVkIG91dHB1dCBmbHVzaGluZyB0byBhaWQgZGVidWdnaW5nIHVuZGVyIFZpc3VhbCBTdHVkaW8uIFVuZm9ydHVuYXRlbHkKLSAgICB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBWUzIwMTAgb3V0cHV0IHdpbmRvdyBvdGhlcndpc2Ugc2ltcGx5IGxvc2VzCi0gICAgdGhlIGVycm9yIG1lc3NhZ2VzIG9uIGVycm9yICh0aGV5IHdlcmVuJ3QgZmx1c2hlZCB0byB0aGUgd2luZG93IGJlZm9yZQotICAgIHRoZSBwcm9jZXNzIGV4aXRlZCwgYXBwYXJlbnRseSEpCi0gIEFkZGVkIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCBmb3IgYmVuaWduIGVycm9ycyBhbmQgY2hhbmdlZCB0aGUgcmVhZAotICAgIGRlZmF1bHQuIEFsc28gY2hhbmdlZCBzb21lIHdhcm5pbmdzIGluIHRoZSBpQ0NQIGFuZCBzUkdCIGhhbmRsaW5nCi0gICAgZnJvbSB0byBiZW5pZ24gZXJyb3JzLiBDb25maWd1cmF0aW9uIG5vdyBtYWtlcyByZWFkIGJlbmlnbgotICAgIGVycm9ycyB3YXJuaW5ncyBhbmQgd3JpdGUgYmVuaWduIGVycm9ycyB0byBlcnJvcnMgYnkgZGVmYXVsdCAodGh1cwotICAgIGNoYW5naW5nIHRoZSBiZWhhdmlvciBvbiByZWFkKS4gIFRoZSBzaW1wbGlmaWVkIEFQSSBhbHdheXMgZm9yY2VzCi0gICAgcmVhZCBiZW5pZ24gZXJyb3JzIHRvIHdhcm5pbmdzIChyZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0gZGVmYXVsdCwgdW5sZXNzCi0gICAgdGhpcyBpcyBkaXNhYmxlZCBpbiB3aGljaCBjYXNlIHRoZSBzaW1wbGlmaWVkIEFQSSBjYW4ndCBiZSBidWlsdC4pCi0KLVZlcnNpb24gMS42LjBiZXRhMTkgW01hcmNoIDE4LCAyMDEyXQotICBXb3JrIGFyb3VuZCBmb3IgZHVwbGljYXRlIHJvdyBzdGFydCBjYWxsczsgYWRkZWQgd2FybmluZyBtZXNzYWdlcy4KLSAgICBUaGlzIHR1cm5zIG9uIFBOR19GTEFHX0RFVEVDVF9VTklOSVRJQUxJWkVEIHRvIGRldGVjdCBhcHAgY29kZSB0aGF0Ci0gICAgZmFpbHMgdG8gY2FsbCBvbmUgb2YgdGhlICdzdGFydCcgcm91dGluZXMgKG5vdCBlbmFibGVkIGluIGxpYnBuZy0xLjUKLSAgICBiZWNhdXNlIGl0IGlzIHRlY2huaWNhbGx5IGFuIEFQSSBjaGFuZ2UsIHNpbmNlIGl0IGRpZCBub3JtYWxseSB3b3JrCi0gICAgYmVmb3JlLikgIEl0IGFsc28gbWFrZXMgZHVwbGljYXRlIGNhbGxzIHRvIHBuZ19yZWFkX3N0YXJ0X3JvdyAoYW4KLSAgICBpbnRlcm5hbCBmdW5jdGlvbiBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbWFnZSByZWFkKSBiZW5pZ24sIGFzCi0gICAgdGhleSB3ZXJlIGJlZm9yZSBjaGFuZ2VzIHRvIHVzZSBwbmdfaW5mbGF0ZV9jbGFpbS4gU29tZWhvdyB3ZWJraXQgaXMKLSAgICBjYXVzaW5nIHRoaXMgdG8gaGFwcGVuOyB0aGlzIGlzIHByb2JhYmx5IGEgbWlzLWZlYXR1cmUgaW4gdGhlIHpsaWIKLSAgICBjaGFuZ2VzIHNvIHRoaXMgY29tbWl0IGlzIG9ubHkgYSB3b3JrLXJvdW5kLgotICBSZW1vdmVkIGVycm9uZW91cyBzZXR0aW5nIG9mIERFVEVDVF9VTklOSVRJQUxJWkVEIGFuZCBhZGRlZCBtb3JlCi0gICAgY2hlY2tzLiBUaGUgY29kZSBub3cgZG9lcyBhIHBuZ19lcnJvciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZG8gdGhlCi0gICAgcm93IGluaXRpYWxpemF0aW9uIHR3aWNlOyB0aGlzIGlzIGFuIGFwcGxpY2F0aW9uIGVycm9yIGFuZCBpdCBoYXMKLSAgICBzZXJpb3VzIGNvbnNlcXVlbmNlcyBiZWNhdXNlIHRoZSB0cmFuc2Zvcm0gZGF0YSBpbiBwbmdfc3RydWN0IGlzCi0gICAgY2hhbmdlZCBieSBlYWNoIGNhbGwuCi0gIEFkZGVkIGFwcGxpY2F0aW9uIGVycm9yIHJlcG9ydGluZyBhbmQgYWRkZWQgY2h1bmsgbmFtZXMgdG8gcmVhZAotICAgIGJlbmlnbiBlcnJvcnM7IGFsc28gYWRkZWQgLS1zdHJpY3QgdG8gcG5nc3Rlc3QgLSBub3QgZW5hYmxlZAotICAgIHlldCBiZWNhdXNlIGEgd2FybmluZyBpcyBwcm9kdWNlZC4KLSAgQXZvaWQgdGhlIGRvdWJsZSBnYW1tYSBjb3JyZWN0aW9uIHdhcm5pbmcgaW4gdGhlIHNpbXBsaWZpZWQgQVBJLgotICAgIFRoaXMgYWxsb3dzIHRoZSAtLXN0cmljdCBvcHRpb24gdG8gcGFzcyBpbiB0aGUgcG5nc3Rlc3QgY2hlY2tzCi0KLVZlcnNpb24gMS42LjBiZXRhMjAgW01hcmNoIDI5LCAyMDEyXQotICBDaGFuZ2VkIGNodW5rIGhhbmRsZXIgd2FybmluZ3MgaW50byBiZW5pZ24gZXJyb3JzLCBpbmNyZW1lbnRhbGx5IGxvYWQgaUNDUAotICBBZGRlZCBjaGVja3N1bS1pY2MuYyB0byBjb250cmliL3Rvb2xzCi0gIFByZXZlbnQgUE5HX0VYUEFORCtQTkdfU0hJRlQgZG9pbmcgdGhlIHNoaWZ0IHR3aWNlLgotICBSZWNvZ25pemUga25vd24gc1JHQiBJQ0MgcHJvZmlsZXMgd2hpbGUgcmVhZGluZzsgcHJlZmVyIHdyaXRpbmcgdGhlCi0gICAgaUNDUCBwcm9maWxlIG92ZXIgd3JpdGluZyB0aGUgc1JHQiBjaHVuaywgY29udHJvbGxlZCBieSB0aGUKLSAgICBQTkdfc1JHQl9QUk9GSUxFX0NIRUNLUyBvcHRpb24uCi0gIFJldmlzZWQgcG5nX3NldF90ZXh0XzIoKSB0byBhdm9pZCBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gKGZpeGVzCi0gICAgQ1ZFLTIwMTEtMzA0OCwgYWxzbyBrbm93biBhcyBDVkUtMjAxMi0zNDI1KS4KLQotVmVyc2lvbiAxLjYuMGJldGEyMSBbQXByaWwgMjcsIDIwMTJdCi0gIFJldmlzZWQgc2NyaXB0cy9tYWtlZmlsZS5kYXJ3aW46IHVzZSBzeXN0ZW0gemxpYjsgcmVtb3ZlIHF1b3RlcyBhcm91bmQKLSAgICBhcmNoaXRlY3R1cmUgbGlzdDsgYWRkIG1pc3NpbmcgcHBjIGFyY2hpdGVjdHVyZTsgYWRkIGFyY2hpdGVjdHVyZSBvcHRpb25zCi0gICAgdG8gc2hhcmVkIGxpYnJhcnkgbGluazsgZG9uJ3QgdHJ5IHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWIgYmFzZWQgb24gbWlzc2luZwotICAgIFJFTEVBU0UgdmFyaWFibGUuCi0gIEVuYWJsZSBwbmdfc2V0X2NoZWNrX2Zvcl9pbnZhbGlkX2luZGV4KCkgZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUuCi0gIFJlbW92ZWQgI2lmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQgaW4gcG5ncHJpdi5oIGFyb3VuZAotICAgIGRlY2xhcmF0aW9uIG9mIHBuZ19oYW5kbGVfdW5rbm93bigpLgotICBBZGRlZCAtbHNzcF9ub25zaGFyZWQgaW4gYSBjb21tZW50IGluIHNjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZAotICAgIGFuZCBjaGFuZ2VkIGRlcHJlY2F0ZWQgTk9PQkogYW5kIE5PUFJPRklMRSB0byBOT19PQkogYW5kIE5PX1BST0ZJTEUuCi0KLVZlcnNpb24gMS42LjBiZXRhMjIgW01heSAyMywgMjAxMl0KLSAgUmVtb3ZlZCBuZWVkIGZvciAtV25vLWNhc3QtYWxpZ24gd2l0aCBjbGFuZy4gIGNsYW5nIGNvcnJlY3RseSB3YXJucyBvbgotICAgIGFsaWdubWVudCBpbmNyZWFzaW5nIHBvaW50ZXIgY2FzdHMgd2hlbiAtV2Nhc3QtYWxpZ24gaXMgcGFzc2VkLiBUaGlzCi0gICAgZml4ZXMgdGhlIGNhc2VzIHRoYXQgY2xhbmcgd2FybnMgYWJvdXQgZWl0aGVyIGJ5IGVsaW1pbmF0aW5nIHRoZQotICAgIGNhc3RzIGZyb20gcG5nX2J5dGVwIHRvIHBuZ191aW50XzE2cCAocG5ncmVhZC5jKSwgb3IsIGZvciBwbmdydXRpbC5jCi0gICAgd2hlcmUgdGhlIGNhc3QgaXMgcHJldmlvdXNseSB2ZXJpZmllZCBvciBwbmdzdGVzdC5jIHdoZXJlIGl0IGlzIE9LLCBieQotICAgIGludHJvZHVjaW5nIG5ldyBwbmdfYWxpZ25jYXN0IG1hY3JvcyB0byBkbyB0aGUgY2FzdCBpbiBhIHdheSB0aGF0IGNsYW5nCi0gICAgYWNjZXB0cy4KLQotVmVyc2lvbiAxLjYuMGJldGEyMyBbSnVuZSA2LCAyMDEyXQotICBSZXZpc2VkIENNYWtlTGlzdHMudHh0IHRvIG5vdCBhdHRlbXB0IHRvIG1ha2UgYSBzeW1saW5rIHVuZGVyIG1pbmd3LgotICBNYWRlIGZpeGVzIGZvciBuZXcgb3B0aW1pemF0aW9uIHdhcm5pbmdzIGZyb20gZ2NjIDQuNy4wLiBUaGUgY29tcGlsZXIKLSAgICBwZXJmb3JtcyBhbiBvcHRpbWl6YXRpb24gd2hpY2ggaXMgc2FmZTsgaG93ZXZlciBpdCB0aGVuIHdhcm5zIGFib3V0IGl0LgotICAgIENoYW5naW5nIHRoZSB0eXBlIG9mICdwYWxldHRlX251bWJlcicgaW4gcG5ndmFsaWQuYyByZW1vdmVzIHRoZSB3YXJuaW5nLgotICBEbyBub3QgZGVwZW5kIHVwb24gYSBHQ0MgZmVhdHVyZSBtYWNybyBiZWluZyBhdmFpbGFibGUgZm9yIHVzZSBpbiBnZW5lcmF0aW5nCi0gICAgdGhlIGxpbmtlciBtYXBmaWxlIHN5bWJvbCBwcmVmaXguCi0gIEltcHJvdmVkIHBlcmZvcm1hbmNlIG9mIG5ldyBkb19jaGVja19wYWxldHRlX2luZGV4ZXMoKSBmdW5jdGlvbiAob25seQotICAgIHVwZGF0ZSB0aGUgdmFsdWUgd2hlbiBpdCBhY3R1YWxseSBpbmNyZWFzZXMsIG1vdmUgdGVzdCBmb3Igd2hldGhlcgotICAgIHRoZSBjaGVjayBpcyB3YW50ZWQgb3V0IG9mIHRoZSBmdW5jdGlvbi4KLQotVmVyc2lvbiAxLjYuMGJldGEyNCBbSnVuZSA3LCAyMDEyXQotICBEb24ndCBjaGVjayBwYWxldHRlIGluZGV4ZXMgaWYgbnVtX3BhbGV0dGUgaXMgMCAoYXMgaXQgY2FuIGJlIGluIE1ORyBmaWxlcykuCi0KLVZlcnNpb24gMS42LjBiZXRhMjUgW0p1bmUgMTYsIDIwMTJdCi0gIFJldmlzZWQgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgc28gbnVtX2NodW5rcyA8IDAgbWVhbnMgaWdub3JlIGFsbAotICAgIHVua25vd24gY2h1bmtzIGFuZCBhbGwga25vd24gY2h1bmtzIGV4Y2VwdCBmb3IgSUhEUiwgUExURSwgdFJOUywgSURBVCwKLSAgICBhbmQgSUVORC4gIFByZXZpb3VzbHkgaXQgb25seSBtZWFudCBpZ25vcmUgYWxsIHVua25vd24gY2h1bmtzLCB0aGUKLSAgICBzYW1lIGFzIG51bV9jaHVua3MgPT0gMC4gUmV2aXNlZCBwbmdfaW1hZ2Vfc2tpcF91bnVzZWRfY2h1bmtzKCkgdG8KLSAgICBwcm92aWRlIGEgbGlzdCBvZiBjaHVua3MgdG8gYmUgcHJvY2Vzc2VkIGluc3RlYWQgb2YgYSBsaXN0IG9mIGNodW5rcyB0bwotICAgIGlnbm9yZS4gIFJldmlzZWQgY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jIGFjY29yZGluZ2x5LgotCi1WZXJzaW9uIDEuNi4wYmV0YTI2IFtKdWx5IDEwLCAyMDEyXQotICBSZW1vdmVkIHNjcmlwdHMvbWFrZWZpbGUuY2VnY2MgZnJvbSB0aGUgKi56aXAgYW5kICouN3ogZGlzdHJpYnV0aW9uczsgaXQKLSAgICBkZXBlbmRzIG9uIGNvbmZpZ3VyZSwgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluIHRob3NlIGFyY2hpdmVzLgotICBNb3ZlZCBzY3JpcHRzL2Noa2ZtdCB0byBjb250cmliL3Rvb2xzLgotICBDaGFuZ2VkICJhK3ciIHRvICJ1K3ciIGluIE1ha2VmaWxlLmluIHRvIGZpeCBDVkUtMjAxMi0zMzg2LgotCi1WZXJzaW9uIDEuNi4wYmV0YTI3IFtBdWd1c3QgMTEsIDIwMTJdCi0gIERvIG5vdCBjb21waWxlIFBOR19ERVBSRUNBVEVELCBQTkdfQUxMT0MgYW5kIFBOR19QUklWQVRFIHdoZW4gX19HTlVDX18gPCAzLgotICBEbyBub3QgdXNlIF9fcmVzdHJpY3Qgd2hlbiBHTlVDIGlzIDw9IDMuMQotICBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gcG5nX3phbGxvYygpIGFuZCBwbmdfemZyZWUoKSBmcm9tIHRoZSBtYW51YWwuCi0gIEZpeGVkIGNvbmZpZ3VyYXRpb25zIHdoZXJlIGZsb2F0aW5nIHBvaW50IGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQuICBCZWNhdXNlCi0gICAgb2YgdGhlIGNoYW5nZXMgdG8gc3VwcG9ydCBzeW1ib2wgcHJlZml4aW5nIFBOR19JTlRFUk5BTF9GVU5DVElPTiBkZWNsYXJlcwotICAgIGZsb2F0aW5nIHBvaW50IEFQSXMgZHVyaW5nIGxpYnBuZyBidWlsZHMgZXZlbiBpZiB0aGV5IGFyZSBjb21wbGV0ZWx5Ci0gICAgZGlzYWJsZWQuIFRoaXMgcmVxdWlyZXMgdGhlIHBuZyBmbG9hdGluZyBwb2ludCB0eXBlcyAocG5nX2RvdWJsZSopIHRvIGJlCi0gICAgZGVjbGFyZWQgZXZlbiB0aG91Z2ggdGhlIGZ1bmN0aW9ucyBhcmUgbmV2ZXIgYWN0dWFsbHkgZGVmaW5lZC4gIFRoaXMKLSAgICBjaGFuZ2UgcHJvdmlkZXMgYSBkdW1teSBkZWZpbml0aW9uIHNvIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3b3JrLCB5ZXQgYW55Ci0gICAgaW1wbGVtZW50YXRpb24gd2lsbCBmYWlsIHRvIGNvbXBpbGUgYmVjYXVzZSBvZiBhbiBpbmNvbXBsZXRlIHR5cGUuCi0gIFJlLWVsaW1pbmF0ZWQgdGhlIHVzZSBvZiBzdHJjcHkoKSBpbiBwbmd0ZXN0LmMuICBBbiB1bm5jZXNzYXJ5IHVzZSBvZgotICAgIHN0cmNweSgpIHdhcyBhY2NpZGVudGFsbHkgcmUtaW50cm9kdWNlZCBpbiBsaWJwbmcxNjsgdGhpcyBjaGFuZ2UgcmVwbGFjZXMKLSAgICBpdCB3aXRoIHN0cm5jcHkoKS4KLSAgRWxpbWluYXRlZCB1c2Ugb2YgcG5nX3NpemVvZigpOyB1c2Ugc2l6ZW9mKCkgaW5zdGVhZC4KLSAgVXNlIGEgY29uc2lzdGVudCBzdHlsZSBmb3IgKHNpemVvZiB0eXBlKSBhbmQgKHNpemVvZiAoYXJyYXkpKQotICBDbGVhbnVwIG9mIHBuZ19zZXRfZmlsbGVyKCkuICBUaGlzIGZ1bmN0aW9uIGRvZXMgdmVyeSBkaWZmZXJlbnQgdGhpbmdzIG9uCi0gICAgcmVhZCBhbmQgd3JpdGUuICBJbiBsaWJwbmcgMS42IHRoZSB0d28gY2FzZXMgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgYW5kCi0gICAgY29uc2lkZXJhYmxlIGNvZGUgY2xlYW51cCwgYW5kIGV4dHJhIGVycm9yIGNoZWNraW5nLCBpcyBwb3NzaWJsZS4gIFRoaXMKLSAgICBtYWtlcyBjYWxscyBvbiB0aGUgd3JpdGUgc2lkZSB0aGF0IGhhdmUgbm8gZWZmZWN0IGJlIGlnbm9yZWQgd2l0aCBhCi0gICAgcG5nX2FwcF9lcnJvcigpLCB3aGljaCBjYW4gYmUgZGlzYWJsZWQgaW4gdGhlIGFwcCB1c2luZwotICAgIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpLCBhbmQgcmVtb3ZlcyB0aGUgc3B1cmlvdXMgdXNlIG9mIHVzcl9jaGFubmVscwotICAgIG9uIHRoZSByZWFkIHNpZGUuCi0gIEluc2lzdCBvbiBhdXRvdG9vbHMgMS4xMi4xIGZvciBnaXQgYnVpbGRzIGJlY2F1c2UgdGhlcmUgYXJlIHNlY3VyaXR5IGlzc3VlcwotICAgIHdpdGggMS4xMiBhbmQgaW5zaXN0aW5nIG9uIGFueXRoaW5nIGxlc3Mgd291bGQgYWxsb3cgMS4xMiB0byBiZSB1c2VkLgotICBSZW1vdmVkIGluZm9fcHRyLT5zaWduYXR1cmVbOF0gZnJvbSBXUklURS1vbmx5IGJ1aWxkcy4KLSAgQWRkIHNvbWUgY29uZGl0aW9ucyBmb3IgY29tcGlsaW5nIHBuZ19maXhlZCgpLiAgVGhpcyBpcyBhIHNtYWxsIGZ1bmN0aW9uCi0gICAgYnV0IGl0IHJlcXVpcmVzICItbG0iIG9uIHNvbWUgcGxhdGZvcm1zLgotICBDYXVzZSBwbmd0ZXN0IC0tc3RyaWN0IHRvIGZhaWwgb24gYW55IHdhcm5pbmcgZnJvbSBsaWJwbmcgKG5vdCBqdXN0IGVycm9ycykKLSAgICBhbmQgY2F1c2UgaXQgbm90IHRvIGZhaWwgYXQgdGhlIGNvbXBhcmlzb24gc3RlcCBpZiBsaWJwbmcgbGFja3Mgc3VwcG9ydAotICAgIGZvciB3cml0aW5nIGNodW5rcyB0aGF0IGl0IHJlYWRzIGZyb20gdGhlIGlucHV0IChjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZAotICAgIGZvciBjb21wcmVzc2VkIHRleHQgY2h1bmtzKS4KLSAgTWFrZSBhbGwgdGhyZWUgIm1ha2UgY2hlY2siIHRlc3QgcHJvZ3JhbXMgd29yayB3aXRob3V0IFJFQUQgb3IgV1JJVEUgc3VwcG9ydC4KLSAgICBOb3cgIm1ha2UgY2hlY2siIHdpbGwgc3VjY2VlZCBldmVuIGlmIGxpYnBuZyBpcyBjb21waWxlZCB3aXRoIC1EUE5HX05PX1JFQUQKLSAgICBvciAtRFBOR19OT19XUklURS4gIFRoZSB0ZXN0cyBwZXJmb3JtZWQgYXJlIHJlZHVjZWQsIGJ1dCB0aGUgYmFzaWMgcmVhZGluZwotICAgIGFuZCB3cml0aW5nIG9mIGEgUE5HIGZpbGUgaXMgYWx3YXlzIHRlc3RlZCBieSBvbmUgb3IgbW9yZSBvZiB0aGUgdGVzdHMuCi0gIENvbnNpc3RlbnRseSB1c2Ugc3RybGVuKCksIG1lbXNldCgpLCBtZW1jcHkoKSwgYW5kIG1lbWNtcCgpIGluc3RlYWQgb2YgdGhlCi0gICAgcG5nX3N0cmxlbigpLCBwbmdfbWVtc2V0KCksIHBuZ19tZW1jcHkoKSwgYW5kIHBuZ19tZW1jbXAoKSBtYWNyb3MuCi0gIFJlbW92ZWQgdGhlIHBuZ19zaXplb2YoKSwgcG5nX3N0cmxlbigpLCBwbmdfbWVtc2V0KCksIHBuZ19tZW1jcHkoKSwgYW5kCi0gICAgcG5nX21lbWNtcCgpIG1hY3Jvcy4KLSAgV29yayBhcm91bmQgZ2NjIDMueCBhbmQgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxMCBjb21wbGFpbnRzLiBCb3RoIG9iamVjdAotICAgIHRvIHRoZSBzcGxpdCBpbml0aWFsaXphdGlvbiBvZiBudW1fY2h1bmtzLgotCi1WZXJzaW9uIDEuNi4wYmV0YTI4IFtBdWd1c3QgMjksIDIwMTJdCi0gIFVua25vd24gaGFuZGxpbmcgZml4ZXMgYW5kIGNsZWFuIHVwLiBUaGlzIGFkZHMgbW9yZSBjb3JyZWN0IG9wdGlvbgotICAgIGNvbnRyb2wgb2YgdGhlIHVua25vd24gaGFuZGxpbmcsIGNvcnJlY3RzIHRoZSBwcmUtZXhpc3RpbmcgYnVnIHdoZXJlCi0gICAgdGhlIHBlci1jaHVuayAna2VlcCcgc2V0dGluZyBpcyBpZ25vcmVkIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byBza2lwCi0gICAgSURBVCBjaHVua3MgaW4gdGhlIHNlcXVlbnRpYWwgcmVhZGVyIChicm9rZW4gaW4gZWFybGllciAxLjYgdmVyc2lvbnMpLgotICAgIFRoZXJlIGlzIGEgbmV3IHRlc3QgcHJvZ3JhbSwgdGVzdC11bmtub3duLmMsIHdoaWNoIGlzIGEgd29yayBpbiBwcm9ncmVzcwotICAgIChub3QgY3VycmVudGx5IHBhcnQgb2YgdGhlIHRlc3Qgc3VpdGUpLiAgQ29tbWVudHMgaW4gdGhlIGhlYWRlciBmaWxlcyBub3cKLSAgICBleHBsYWluIGhvdyB0aGUgdW5rbm93biBoYW5kbGluZyB3b3Jrcy4KLSAgQWxsb3cgZmluZSBncmFpbiBjb250cm9sIG9mIHVua25vd24gY2h1bmsgQVBJcy4gVGhpcyBjaGFuZ2UgYWxsb3dzCi0gICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgdG8gYmUgdHVybmVkIG9mZiBpZiBub3QgcmVxdWlyZWQgYW5kIGNhdXNlcwotICAgIGJvdGggcmVhZCBhbmQgd3JpdGUgdG8gYmVoYXZlIGFwcHJvcHJpYXRlbHkgKG9uIHJlYWQgdGhpcyBpcyBvbmx5IHBvc3NpYmxlCi0gICAgaWYgdGhlIHVzZXIgY2FsbGJhY2sgaXMgdXNlZCB0byBoYW5kbGUgdW5rbm93biBjaHVua3MpLiAgVGhlIGNoYW5nZQotICAgIGFsc28gcmVtb3ZlcyB0aGUgc3VwcG9ydCBmb3Igc3RvcmluZyB1bmtub3duIGNodW5rcyBpbiB0aGUgaW5mb19zdHJ1Y3QKLSAgICBpZiB0aGUgb25seSB1bmtub3duIGhhbmRsaW5nIGVuYWJsZWQgaXMgdmlhIHRoZSBjYWxsYmFjaywgYWxsb3dpbmcgbGlicG5nCi0gICAgdG8gYmUgY29uZmlndXJlZCB3aXRoIGNhbGxiYWNrIHJlYWRpbmcgYW5kIG5vbmUgb2YgdGhlIHVubmVjZXNzYXJ5IGNvZGUuCi0gIENvcnJlY3RlZCBmaXggZm9yIHVua25vd24gaGFuZGxpbmcgaW4gcG5ndGVzdC4gVGhpcyByZWluc3RhdGVzIHRoZQotICAgIGxpYnBuZyBoYW5kbGluZyBvZiB1bmtub3duIGNodW5rcyBvdGhlciB0aGFuIHZwQWcgYW5kIHNURVIgKGluY2x1ZGluZwotICAgIHVuc2FmZS10by1jb3B5IGNodW5rcyB3aGljaCB3ZXJlIGRyb3BwZWQgYmVmb3JlKSBhbmQgZWxpbWluYXRlcyB0aGUKLSAgICByZXBvc2l0aW9uaW5nIG9mIHZwQWcgYW5kIHNURVIgaW4gcG5ndGVzdC5wbmcgYnkgY2hhbmdpbmcgcG5ndGVzdC5wbmcKLSAgICAoc28gdGhlIGNodW5rcyBhcmUgd2hlcmUgbGlicG5nIHdvdWxkIHB1dCB0aGVtKS4KLSAgQWRkZWQgInR1bmtub3duIiB0ZXN0IGFuZCBjb3JyZWN0ZWQgYSBsb2dpYyBlcnJvciBpbiBwbmdfaGFuZGxlX3Vua25vd24oKQotICAgIHdoZW4gU0FWRSBzdXBwb3J0IGlzIGFic2VudC4gIE1vdmVkIHRoZSBzaGVsbCB0ZXN0IHNjcmlwdHMgZm9yCi0gICAgY29udHJpYi9saWJ0ZXN0cyBmcm9tIHRoZSBsaWJwbmcgdG9wIGRpcmVjdG9yeSB0byBjb250cmliL2xpYnRlc3RzLgotICAgIHBuZ19oYW5kbGVfdW5rbm93bigpIG11c3QgYWx3YXlzIHJlYWQgb3Igc2tpcCB0aGUgY2h1bmssIGlmCi0gICAgU0FWRV9VTktOT1dOX0NIVU5LUyBpcyB0dXJuZWQgb2ZmICphbmQqIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzZXQKLSAgICBhIHVzZXIgY2FsbGJhY2sgYW4gdW5rbm93biBjaHVuayB3aWxsIG5vdCBiZSByZWFkLCBsZWFkaW5nIHRvIGEgcmVhZAotICAgIGVycm9yLCB3aGljaCB3YXMgcmV2ZWFsZWQgYnkgdGhlICJ0dW5rbm93biIgdGVzdC4KLSAgQ2xlYW5lZCB1cCBhbmQgY29ycmVjdGVkIElDQyBwcm9maWxlIGhhbmRsaW5nLgotICAgIGNvbnRyaWIvbGlidGVzdHMvbWFrZXBuZzogY29ycmVjdGVkICdyZ2InIGFuZCAnZ3JheScgY2FzZXMuICBwcm9maWxlX2Vycm9yCi0gICAgbWVzc2FnZXMgY291bGQgYmUgdHJ1bmNhdGVkOyBtYWRlIGEgY29ycmVjdCBidWZmZXIgc2l6ZSBjYWxjdWxhdGlvbiBhbmQKLSAgICBhZGp1c3RlZCBwbmdlcnJvci5jIGFwcHJvcHJpYXRlbHkuIHBuZ19pY2NfY2hlY2tfKiBjaGVja2luZyBpbXByb3ZlZDsKLSAgICBjaGFuZ2VkIHRoZSBmdW5jdGlvbnMgdG8gcmVjZWl2ZSB0aGUgY29ycmVjdCBjb2xvciB0eXBlIG9mIHRoZSBQTkcgb24gcmVhZAotICAgIG9yIHdyaXRlIGFuZCBjaGVjayB0aGF0IGl0IG1hdGNoZXMgdGhlIGNvbG9yIHNwYWNlIG9mIHRoZSBwcm9maWxlIChkZXNwaXRlCi0gICAgd2hhdCB0aGUgY29tbWVudHMgc2FpZCBiZWZvcmUsIHRoZXJlIGlzIGRhbmdlciBpbiBhc3N1bWluZyB0aGUgYXBwIHdpbGwKLSAgICBjb3BlIGNvcnJlY3RseSB3aXRoIGFuIFJHQiBwcm9maWxlIG9uIGEgZ3JheXNjYWxlIGltYWdlIGFuZCwgc2luY2UgaXQKLSAgICB2aW9sYXRlcyB0aGUgUE5HIHNwZWMsIGFsbG93aW5nIGl0IGlzIGNlcnRhaW4gdG8gcHJvZHVjZSBpbmNvbnNpc3RlbnQKLSAgICBhcHAgYmVoYXZpb3IgYW5kIG1pZ2h0IGV2ZW4gY2F1c2UgYXBwIGNyYXNoZXMuKSBDaGVjayB0aGF0IHByb2ZpbGVzCi0gICAgY29udGFpbiB0aGUgdGFncyBuZWVkZWQgdG8gcHJvY2VzcyB0aGUgUE5HICh0YWdzIGFsbCByZXF1aXJlZCBieSB0aGUgSUNDCi0gICAgc3BlYykuIFJlbW92ZWQgdW51c2VkIFBOR19TVEFUSUMgZnJvbSBwbmdwcml2LmguCi0KLVZlcnNpb24gMS42LjBiZXRhMjkgW1NlcHRlbWJlciA0LCAyMDEyXQotICBGaXhlZCB0aGUgc2ltcGxpZmllZCBBUEkgZXhhbXBsZSBwcm9ncmFtcyB0byBhZGQgdGhlICpjb2xvcm1hcCBwYXJhbWV0ZXIKLSAgICB0byBzZXZlcmFsIG9mIGhlIEFQSSBhbmQgaW1wcm92ZWQgdGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHZlcnNpb24gZmllbGQKLSAgICBpcyBub3Qgc2V0LgotICBBZGRlZCBjb250cmliL2V4YW1wbGVzLyogdG8gdGhlICouemlwIGFuZCAqLjd6IGRpc3RyaWJ1dGlvbnMuCi0gIFVwZGF0ZWQgc2ltcGxpZmllZCBBUEkgc3lub3BzZXMgYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBwbmdfaW1hZ2Ugc3RydWN0dXJlCi0gICAgaW4gdGhlIG1hbnVhbC4KLSAgTWFkZSBtYWtlcG5nIGFuZCBwbmd0ZXN0IHByb2R1Y2UgaWRlbnRpY2FsIFBOR3MsIGFkZCAiLS1yZWxheGVkIiBvcHRpb24KLSAgICB0byBwbmd0ZXN0LiBUaGUgIi0tcmVsYXhlZCIgb3B0aW9uIHR1cm5zIG9mZiB0aGUgYmVuaWduIGVycm9ycyB0aGF0IGFyZQotICAgIGVuYWJsZWQgYnkgZGVmYXVsdCBpbiBwcmUtUkMgYnVpbGRzLiBtYWtlcG5nIGNhbiBub3cgd3JpdGUgSUNDIHByb2ZpbGVzCi0gICAgd2hlcmUgdGhlIGxlbmd0aCBoYXMgbm90IGJlZW4gZXh0ZW5kZWQgdG8gYSBtdWx0aXBsZSBvZiA0LCBhbmQgcG5ndGVzdAotICAgIG5vdyBpbnRlcmNlcHRzIGFsbCBsaWJwbmcgZXJyb3JzLCBhbGxvd2luZyB0aGUgcHJldmlvdXNseS1pbnRyb2R1Y2VkCi0gICAgIi0tc3RyaWN0IHRlc3QiIG9uIG5vIHdhcm5pbmdzIHRvIGFjdHVhbGx5IHdvcmsuCi0gIEltcHJvdmVkIElDQyBwcm9maWxlIGhhbmRsaW5nIGluY2x1ZGluZyBjSFJNIGNodW5rIGdlbmVyYXRpb24gYW5kIGZpeGVkCi0gICAgQ3lnd2luK01TVkMgYnVpbGQgZXJyb3JzLiBUaGUgSUNDIHByb2ZpbGUgaGFuZGxpbmcgbm93IGluY2x1ZGVzIG1vcmUKLSAgICBjaGVja2luZy4gIFNldmVyYWwgZXJyb3JzIHRoYXQgY2F1c2VkIHJlamVjdGlvbiBvZiB0aGUgcHJvZmlsZSBhcmUgbm93Ci0gICAgaGFuZGxlZCB3aXRoIGEgd2FybmluZyBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGludmFsaWQgcHJvZmlsZXMgd2lsbCBiZQotICAgIHJlYWQgYnkgZGVmYXVsdCBpbiByZWxlYXNlIChidXQgbm90IHByZS1SQykgYnVpbGRzIGJ1dCB3aWxsIG5vdCBiZQotICAgIHdyaXR0ZW4gYnkgZGVmYXVsdC4gIFRoZSBlYXN5IHBhcnQgb2YgaGFuZGxpbmcgdGhlIGNIUk0gY2h1bmsgaXMgd3JpdHRlbiwKLSAgICB3aGVyZSB0aGUgSUNDIHByb2ZpbGUgY29udGFpbnMgdGhlIHJlcXVpcmVkIGRhdGEuICBUaGUgbW9yZSBkaWZmaWN1bHQKLSAgICBwYXJ0IHBsdXMgZ3Vlc3NpbmcgYSBnQU1BIHZhbHVlIHJlcXVpcmVzIGNvZGUgdG8gcGFzcyBzZWxlY3RlZCBSR0IgdmFsdWVzCi0gICAgdGhyb3VnaCB0aGUgcHJvZmlsZS4KLQotVmVyc2lvbiAxLjYuMGJldGEzMCBbT2N0b2JlciAyNCwgMjAxMl0KLSAgQ2hhbmdlZCBJQ0MgcHJvZmlsZSBtYXRyaXgvdmVjdG9yIHR5cGVzIHRvIG5vdCBkZXBlbmQgb24gYXJyYXkgdHlwZSBydWxlcy4KLSAgICBCeSB0aGUgQU5TSS1DIHN0YW5kYXJkIHRoZSBuZXcgdHlwZXMgc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMKLSAgICB2ZXJzaW9ucywgYW5kIGFsbCBrbm93biB2ZXJzaW9ucyBvZiBnY2MgdGVzdGVkIHdpdGggdGhlIHByZXZpb3VzIHZlcnNpb25zCi0gICAgZXhjZXB0IGZvciBHQ0MtNC4yLjEgd29yayB3aXRoIHRoaXMgdmVyc2lvbi4gIFRoZSBjaGFuZ2UgbWFrZXMgdGhlIEFOU0ktQwotICAgIHJ1bGUgdGhhdCBjb25zdCBhcHBsaWVkIHRvIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFwcGxpZXMgaW5zdGVhZCB0byB0aGUKLSAgICBlbGVtZW50cyBpbiB0aGUgYXJyYXkgbW9vdCBieSBleHBsaWNpdGx5IGFwcGx5aW5nIGNvbnN0IHRvIHRoZSBiYXNlCi0gICAgZWxlbWVudHMgb2YgdGhlIHBuZ19pY2NfbWF0cml4IGFuZCBwbmdfaWNjX3ZlY3RvciB0eXBlcy4gVGhlIGFjY2lkZW50YWwKLSAgICAoaGFybWxlc3MpICdjb25zdCcgcHJldmlvdXNseSBhcHBsaWVkIHRvIHRoZSBwYXJhbWV0ZXJzIG9mIHR3byBvZiB0aGUKLSAgICBmdW5jdGlvbnMgaGF2ZSBhbHNvIGJlZW4gcmVtb3ZlZC4KLSAgQWRkZWQgYSB3b3JrIGFyb3VuZCBmb3IgR0NDIDQuMiBvcHRpbWl6YXRpb24gYnVnLgotICBNYXJrZWQgdGhlIGJyb2tlbiAoYmFkIHdoaXRlIHBvaW50KSBvcmlnaW5hbCBIUCBzUkdCIHByb2ZpbGVzIGNvcnJlY3RseSBhbmQKLSAgICBjb3JyZWN0IGNvbW1lbnRzLgotICBBZGRlZCAtRFpfU09MTyB0byBjb250cmliL3BuZ21pbmltLyovbWFrZWZpbGUgdG8gd29yayB3aXRoIHpsaWItMS4yLjcKLSAgVXNlIC9NRGQgZm9yIHZzdHVkaW8gZGVidWcgYnVpbGRzLiBBbHNvIGFkZGVkIHBuZ3Vua293biB0byB0aGUgdnN0dWRpbwotICAgIGJ1aWxkcywgZml4ZWQgYnVpbGQgZXJyb3JzIGFuZCBjb3JyZWN0ZWQgYSBtaW5vciBleGl0IGNvZGUgZXJyb3IgaW4KLSAgICBwbmd2YWxpZCBpZiB0aGUgJ3RvdWNoJyBmaWxlIG5hbWUgaXMgaW52YWxpZC4KLSAgQWRkIHVwZGF0ZWQgV0FSTklORyBmaWxlIHRvIHByb2plY3RzL3ZzdHVkaW8gZnJvbSBsaWJwbmcgMS41L3ZzdHVkaW8KLSAgRml4ZWQgYnVpbGQgd2hlbiB1c2luZyAjZGVmaW5lIFBOR19OT19SRUFEX0dBTU1BIGluIHBuZ19kb19jb21wb3NlKCkgaW4KLSAgICBwbmdydHJhbi5jIChEb21hbmkgSGFubmVzKS4KLQotVmVyc2lvbiAxLjYuMGJldGEzMSBbTm92ZW1iZXIgMSwgMjAxMl0KLSAgVW5kaWQgdGhlIGVycm9uZW91cyBjaGFuZ2UgdG8gdnN0dWRpby9wbmd2YWxpZCBidWlsZCBpbiBsaWJwbmctMS42LjBiZXRhMzAuCi0gIE1hZGUgcG5ndmFsaWQgc28gdGhhdCBpdCB3aWxsIGJ1aWxkIG91dHNpZGUgdGhlIGxpYnBuZyBzb3VyY2UgdHJlZS4KLSAgTWFkZSBidWlsZHMgLURQTkdfTk9fUkVBRF9HQU1NQSBjb21waWxlICh0aGUgdW5pdCB0ZXN0cyBzdGlsbCBmYWlsKS4KLSAgTWFkZSBQTkdfTk9fUkVBRF9HQU1NQSBzd2l0Y2ggb2ZmIGludGVyZmFjZXMgdGhhdCBkZXBlbmQgb24gUkVBRF9HQU1NQS4KLSAgICBQcmlvciB0byAxLjYuMCBzd2l0Y2hpbmcgb2ZmIFJFQURfR0FNTUEgZGlkIHVucHJlZGljdGFibGUgdGhpbmdzIHRvIHRoZQotICAgIGludGVyZmFjZXMgdGhhdCB1c2UgaXQgKHNwZWNpZmljYWxseSwgcG5nX2RvX2JhY2tncm91bmQgaW4gMS40IHdvdWxkCi0gICAgc2ltcGx5IGRpc3BsYXkgY29tcG9zaXRlIGZvciBncmF5c2NhbGUgaW1hZ2VzIGJ1dCBkbyBjb21wb3NpdGlvbgotICAgIHdpdGggdGhlIGluY29ycmVjdCBhcml0aG1ldGljIGZvciBjb2xvciBvbmVzKS4gSW4gMS42IHRoZSBzZW1hbnRpYwotICAgIG9mIC1EUE5HX05PX1JFQURfR0FNTUEgaXMgY2hhbmdlZCB0byBzaW1wbHkgZGlzYWJsZSBhbnkgaW50ZXJmYWNlIHRoYXQKLSAgICBkZXBlbmRzIG9uIGl0OyB0aGlzIG9ibGlnZXMgcGVvcGxlIHdobyBzZXQgaXQgdG8gY29uc2lkZXIgd2hldGhlciB0aGV5Ci0gICAgcmVhbGx5IHdhbnQgaXQgb2ZmIGlmIHRoZXkgaGFwcGVuIHRvIHVzZSBhbnkgb2YgdGhlIGludGVyZmFjZXMgaW4KLSAgICBxdWVzdGlvbiAodHlwaWNhbGx5IG1vc3QgdXNlcnMgd2hvIGRpc2FibGUgaXQgd29uJ3QpLgotICBGaXhlZCBHVUlEcyBpbiBwcm9qZWN0cy92c3R1ZGlvLiBTb21lIHdlcmUgZHVwbGljYXRlZCBvciBtaXNzaW5nLAotICAgIHJlc3VsdGluZyBpbiBWUzIwMTAgaGF2aW5nIHRvIHVwZGF0ZSB0aGUgZmlsZXMuCi0gIFJlbW92ZWQgbm9uLXdvcmtpbmcgSUNDIHByb2ZpbGUgc3VwcG9ydCBjb2RlIHRoYXQgd2FzIG1vc3RseSBhZGRlZCB0bwotICAgIGxpYnBuZy0xLjYuMGJldGEyOSBhbmQgYmV0YTMwLiBUaGVyZSB3YXMgdG9vIG11Y2ggY29kZSBmb3IgdG9vIGxpdHRsZQotICAgIGdhaW47IGltcGxlbWVudGluZyBmdWxsIElDQyBjb2xvciBjb3JyZWN0aW9uIG1heSBiZSBkZXNpcmVhYmxlIGJ1dCBpcyBsZWZ0Ci0gICAgdXAgdG8gYXBwbGljYXRpb25zLgotCi1WZXJzaW9uIDEuNi4wYmV0YTMyIFtOb3ZlbWJlciAyNSwgMjAxMl0KLSAgRml4ZWQgYW4gaW50ZXJtaXR0ZW50IFNFR1YgaW4gcG5nc3Rlc3QgZHVlIHRvIGFuIHVuaW5pdGlhbGl6ZWQgYXJyYXkgZWxlbWVudC4KLSAgQWRkZWQgdGhlIGFiaWxpdHkgZm9yIGNvbnRyaWIvbGlidGVzdHMvbWFrZXBuZy5jIHRvIG1ha2UgYSBQTkcgd2l0aCBqdXN0IG9uZQotICAgIGNvbG9yLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHBuZ3N0ZXN0IGNvbG9yIGluYWNjdXJhY3kgcmVwb3J0cy4KLSAgRml4ZWQgZXJyb3IgY2hlY2tpbmcgaW4gdGhlIHNpbXBsaWZpZWQgd3JpdGUgQVBJIChPbGFmIHZhbiBkZXIgU3BlaykKLSAgTWFkZSBwbmdfdXNlcl92ZXJzaW9uX2NoZWNrKCkgb2sgdG8gdXNlIHdpdGggbGlicG5nIHZlcnNpb24gMS4xMC54IGFuZCBsYXRlci4KLQotVmVyc2lvbiAxLjYuMGJldGEzMyBbRGVjZW1iZXIgMTUsIDIwMTJdCi0gIEZpeGVkIHR5cG8gaW4gcG5nLmMgKFBOR19TRVRfQ0hVTktfTUFMTE9DX01BWCBzaG91bGQgYmUgUE5HX0NIVU5LX01BTExPQ19NQVgpCi0gICAgdGhhdCBjYXVzZXMgdGhlIE1BTExPQ19NQVggbGltaXQgbm90IHRvIHdvcmsgKEpvaG4gQm93bGVyKQotICBDaGFuZ2UgcG5nX3dhcm5pbmcoKSB0byBwbmdfYXBwX2Vycm9yKCkgaW4gcG5nd3JpdGUuYyBhbmQgY29tbWVudCB0aGUKLSAgICBmYWxsLXRocm91Z2ggY29uZGl0aW9uLgotICBDaGFuZ2UgcG5nX3dhcm5pbmcoKSB0byBwbmdfYXBwX3dhcm5pbmcoKSBpbiBwbmdfd3JpdGVfdFJOUygpLgotICBSZWFycmFuZ2VkIHRoZSBBUk0tTkVPTiBvcHRpbWl6YXRpb25zOiBJc29sYXRlZCB0aGUgbWFjaGluZSBzcGVjaWZpYyBjb2RlCi0gICAgdG8gdGhlIGhhcmR3YXJlIHN1YmRpcmVjdG9yeSBhbmQgYWRkZWQgY29tbWVudHMgdG8gcG5ncnV0aWwuYyBzbyB0aGF0Ci0gICAgaW1wbGVtZW50b3JzIG9mIG90aGVyIG9wdGltaXphdGlvbnMga25vdyB3aGF0IHRvIGRvLgotICBGaXhlZCBjYXNlcyBvZiB1bnF1b3RlZCBERVNURElSIGluIE1ha2VmaWxlLmFtCi0gIFJlYnVpbHQgTWFrZWZpbGUuaW4sIGV0Yy4sIHdpdGggYXV0b2NvbmYtMi42OSBhbmQgYXV0b21ha2UtMS4xMi41LgotCi1WZXJzaW9uIDEuNi4wYmV0YTM0IFtEZWNlbWJlciAxOSwgMjAxMl0KLSAgQ2xlYW5lZCB1cCB3aGl0ZXNwYWNlIGluIHRoZSBzeW5vcHNpcyBwb3J0aW9uIG9mIHRoZSBtYW5wYWdlICJsaWJwbmcuMyIKLSAgRGlzYXNzZW1ibGVkIHRoZSB2ZXJzaW9uIG51bWJlciBpbiBzY3JpcHRzL29wdGlvbnMuYXdrIChuZWNlc3NhcnkgZm9yCi0gICAgYnVpbGRpbmcgb24gU3VuT3MpLgotCi1WZXJzaW9uIDEuNi4wYmV0YTM1IFtEZWNlbWJlciAyMywgMjAxMl0KLSAgTWFkZSBkZWZhdWx0IFpsaWIgY29tcHJlc3Npb24gc2V0dGluZ3MgYmUgY29uZmlndXJhYmxlLiBUaGlzIGFkZHMgI2RlZmluZXMgdG8KLSAgICBwbmdsaWJjb25mLmggdG8gY29udHJvbCB0aGUgZGVmYXVsdHMuCi0gIEZpeGVkIFdpbmRvd3MgYnVpbGQgaXNzdWVzLCBlbmFibGVkIEFSTSBjb21waWxhdGlvbi4gVmFyaW91cyB3YXJuaW5ncyBpc3N1ZWQKLSAgICBieSBlYXJsaWVyIHZlcnNpb25zIG9mIEdDQyBmaXhlZCBmb3IgQ3lnd2luIGFuZCBNaW4vR1cgKHdoaWNoIGJvdGggdXNlIG9sZAotICAgIEdDQ3MuKSBBUk0gc3VwcG9ydCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gemxpYi5wcm9wcyAodW5zdXBwb3J0ZWQgYnkKLSAgICBNaWNyb3NvZnQpIGFuZCBBUk0gY29tcGlsYXRpb24gaXMgbWFkZSBwb3NzaWJsZSBieSBkZWxldGluZyB0aGUgY2hlY2sgZm9yCi0gICAgeDg2LiBUaGUgdGVzdCBwcm9ncmFtcyBjYW5ub3QgYmUgcnVuIGJlY2F1c2UgdGhleSBhcmUgbm90IHNpZ25lZC4KLQotVmVyc2lvbiAxLjYuMGJldGEzNiBbSmFudWFyeSAyLCAyMDEzXQotICBEaXNjb250aW51ZWQgZGlzdHJpYnV0aW5nIGxpYnBuZy0xLngueC50YXIuYnoyLgotICBEaXNjb250aW51ZWQgZGlzdHJpYnV0aW5nIGxpYnBuZy0xLjcuMC0xLjYuMC1kaWZmLnR4dCBhbmQgc2ltaWxhci4KLSAgUmVidWlsdCBjb25maWd1cmUgd2l0aCBhdXRvY29uZi0yLjY5IChpbmFkdmVydGVudGx5IG5vdCBkb25lIGluIGJldGEzMykKLSAgRml4ZWQgJ21ha2UgZGlzdGNoZWNrJyBvbiBTVU4gT1MgLSBsaWJwbmcuc28gd2FzIG5vdCBiZWluZyByZW1vdmVkCi0KLVZlcnNpb24gMS42LjBiZXRhMzcgW0phbnVhcnkgMTAsIDIwMTNdCi0gIEZpeGVkIGNvbmNlaXZhYmxlIGJ1dCBkaWZmaWN1bHQgdG8gcmVwcm8gb3ZlcmZsb3cuIEFsc28gYWRkZWQgdHdvIHRlc3QKLSAgICBwcm9ncmFtcyB0byBnZW5lcmF0ZSBhbmQgdGVzdCBhIFBORyB3aGljaCBzaG91bGQgaGF2ZSB0aGUgcHJvYmxlbS4KLQotVmVyc2lvbiAxLjYuMGJldGEzOSBbSmFudWFyeSAxOSwgMjAxM10KLSAgQWdhaW4gY29ycmVjdGVkIGF0dGVtcHQgYXQgb3ZlcmZsb3cgZGV0ZWN0aW9uIGluIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKQotICAoQ1ZFLTIwMTMtNzM1MykuICBBZGRlZCBvdmVyZmxvdyBkZXRlY3Rpb24gaW4gcG5nX3NldF9zUExUKCkgYW5kCi0gIHBuZ19zZXRfdGV4dF8yKCkgKENWRS0yMDEzLTczNTQpLgotCi1WZXJzaW9uIDEuNi4wYmV0YTQwIFtKYW51YXJ5IDIwLCAyMDEzXQotICBVc2UgY29uc2lzdGVudCBoYW5kbGluZyBvZiBvdmVyZmxvd3MgaW4gdGV4dCwgc1BMVCBhbmQgdW5rbm93biBwbmdfc2V0XyogQVBJcwotCi1WZXJzaW9uIDEuNi4wcmMwMSBbSmFudWFyeSAyNiwgMjAxM10KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMHJjMDIgW0ZlYnJ1YXJ5IDQsIDIwMTNdCi0gIEFkZGVkIHBuZ19nZXRfcGFsZXR0ZV9tYXgoKSBmdW5jdGlvbi4KLQotVmVyc2lvbiAxLjYuMHJjMDMgW0ZlYnJ1YXJ5IDUsIDIwMTNdCi0gIEZpeGVkIHRoZSBwbmdfZ2V0X3BhbGV0dGVfbWF4IEFQSS4KLQotVmVyc2lvbiAxLjYuMHJjMDQgW0ZlYnJ1YXJ5IDcsIDIwMTNdCi0gIFR1cm4gc2VyaWFsIHRlc3RzIGJhY2sgb24gKHJlY2VudGx5IHR1cm5lZCBvZmYgYnkgYXV0b3Rvb2xzIHVwZ3JhZGUpLgotCi1WZXJzaW9uIDEuNi4wcmMwNSBbRmVicnVhcnkgOCwgMjAxM10KLSAgVXBkYXRlIG1hbnVhbCBhYm91dCBwbmdfZ2V0X3BhbGV0dGVfbWF4KCkuCi0KLVZlcnNpb24gMS42LjByYzA2IFtGZWJydWFyeSA5LCAyMDEzXQotICBGaXhlZCBtaXNzaW5nIGRlcGVuZGVuY3kgaW4gLS1wcmVmaXggYnVpbGRzIFRoZSBpbnRlcm1lZGlhdGUKLSAgICBpbnRlcm5hbCAncHJlZml4LmgnIGZpbGUgY2FuIG9ubHkgYmUgZ2VuZXJhdGVkIGNvcnJlY3RseSBhZnRlcgotICAgIHBuZ2xpYmNvbmYuaCwgaG93ZXZlciB0aGUgZGVwZW5kZW5jeSB3YXMgbm90IGluIE1ha2VmaWxlLmFtLiAgVGhlCi0gICAgc3ltcHRvbXMgYXJlIHVucHJlZGljdGFibGUgZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBtYWtlIGNob29zZXMgdG8KLSAgICBidWlsZCBwbmdwcmVmaXguaCBhbmQgcG5nbGliY29uZi5oLCBvZnRlbiB0aGUgZXJyb3IgZ29lcyB1bm5vdGljZWQKLSAgICBiZWNhdXNlIHRoZXJlIGlzIGEgc3lzdGVtIHBuZ2xpYmNvbmYuaCB0byB1c2UgaW5zdGVhZC4KLQotVmVyc2lvbiAxLjYuMHJjMDcgW0ZlYnJ1YXJ5IDEwLCAyMDEzXQotICBFbmNsb3NlZCB0aGUgbmV3IHBuZ19nZXRfcGFsZXR0ZV9tYXggaW4gI2lmZGVmIFBOR19HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECi0gICAgYmxvY2ssIGFuZCByZXZpc2VkIHBuZ2xpYmNvbmYuaCBhbmQgcG5nbGliY29uZi5oLnByZWJ1aWx0IGFjY29yZGluZ2x5LgotCi1WZXJzaW9uIDEuNi4wcmMwOCBbRmVicnVhcnkgMTAsIDIwMTNdCi0gIEZpeCB0eXBvIGluIHBuZy5oICNpZmRlZgotCi1WZXJzaW9uIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMWJldGEwMSBbRmVicnVhcnkgMTYsIDIwMTNdCi0gIE1hZGUgc3ltYm9sIHByZWZpeGluZyB3b3JrIHdpdGggdGhlIEFSTSBuZW9uIG9wdGltaXphdGlvbnMuIEFsc28gYWxsb3cKLSAgICBwbmdwcml2LmggdG8gYmUgaW5jbHVkZWQgZm9yIHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBvbmx5LCBzbyBpdCBjYW4KLSAgICBiZSB1c2VkIGluIG5vbi1DL0MrKyBmaWxlcy4gQmFjayBwb3J0ZWQgZnJvbSBsaWJwbmcgMS43LgotICBNYWRlIHNSR0IgY2hlY2sgbnVtYmVycyBjb25zaXN0ZW50LgotICBQb3J0ZWQgbGlicG5nIDEuNSBvcHRpb25zLmF3ay9kZm4gZmlsZSBoYW5kbGluZyB0byAxLjYsIGZpeGVkIG9uZSBidWcuCi0gIFJlbW92ZWQgY2MgLUUgd29ya3JvdW5kLCBjb3JyZWN0ZWQgcG5nX2dldF9wYWxldHRlX21heCBBUEkgVGVzdGVkIG9uCi0gICAgU1VOIE9TIGNjIDUuOSwgd2hpY2ggZGVtb25zdHJhdGVzIHRoZSB0b2tlbml6YXRpb24gcHJvYmxlbSBwcmV2aW91c2x5Ci0gICAgYXZvaWRlZCBieSB1c2luZyAvbGliL2NwcC4gIFNpbmNlIGFsbCAuZGZuIG91dHB1dCBpcyBub3cgcHJvdGVjdGVkIGluCi0gICAgZG91YmxlIHF1b3RlcyB1bmxlc3MgaXQgaXMgdG8gYmUgbWFjcm8gc3Vic3RpdHV0ZWQgdGhlIGZpeCBzaG91bGQKLSAgICB3b3JrIGV2ZXJ5d2hlcmUuCi0gIEVuYWJsZWQgcGFyYWxsZWwgdGVzdHMgLSBiYWNrIHBvcnRlZCBmcm9tIGxpYnBuZy0xLjcuCi0gIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgZm9ybWF0dGluZyBpbXByb3ZlbWVudHMgYmFjayBwb3J0ZWQgZnJvbSBsaWJwbmcxNy4KLSAgRml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIGJ1aWxkICdzY3JpcHRzJyBkaXJlY3RvcnkKLSAgICB3aGlsZSBidWlsZGluZyB3aXRoIGEgcGFyYWxsZWwgbWFrZS4KLSAgVXNlIGFwcHJvdmVkL3N1cHBvcnRlZCBBbmRyb2lkIG1ldGhvZCB0byBjaGVjayBmb3IgTkVPTiwgdXNlIExpbnV4L1BPU0lYCi0gICAgMTAwMy4xIEFQSSB0byBjaGVjayAvcHJvYy9zZWxmL2F1eHYgYXZvaWRpbmcgYnVmZmVyIGFsbG9jYXRpb24gYW5kIG90aGVyCi0gICAgbGlicmFyeSBjYWxscyAocG9ydGVkIGZyb20gbGlicG5nMTUpLgotCi1WZXJzaW9uIDEuNi4xYmV0YTAyIFtGZWJydWFyeSAxOSwgMjAxM10KLSAgVXNlIHBhcmVudGhlc2VzIG1vcmUgY29uc2lzdGVudGx5IGluICIjaWYgZGVmaW5lZChNQUNSTykiIHRlc3RzLgotICBGb2xkZWQgbG9uZyBsaW5lcy4KLSAgUmVlbmFibGVkIGNvZGUgdG8gYWxsb3cgemVybyBsZW5ndGggUExURSBjaHVua3MgZm9yIE1ORy4KLQotVmVyc2lvbiAxLjYuMWJldGEwMyBbRmVicnVhcnkgMjIsIDIwMTNdCi0gIEZpeGVkIEFMSUdORURfTUVNT1JZIHN1cHBvcnQuCi0gIEFkZGVkIGEgbmV3IGNvbmZpZ3VyZSBvcHRpb246Ci0gICAgLS1lbmFibGUtYXJtLW5lb249YWx3YXlzIHdpbGwgc3RvcCB0aGUgcnVuLXRpbWUgY2hlY2tzLiBOZXcgY2hlY2tzCi0gICAgd2l0aGluIGFybS9hcm1faW5pdC5jIHdpbGwgY2F1c2UgdGhlIGNvZGUgbm90IHRvIGJlIGNvbXBpbGVkIHVubGVzcwotICAgIF9fQVJNX05FT05fXyBpcyBzZXQuIFRoaXMgc2hvdWxkIG1ha2UgaXQgZmFpbCBzYWZlIChpZiBzb21lb25lIGFza3MKLSAgICBmb3IgaXQgb24gdGhlbiB0aGUgYnVpbGQgd2lsbCBmYWlsIGlmIGl0IGNhbid0IGJlIGRvbmUuKQotICBVcGRhdGVkIHRoZSBJTlNUQUxMIGRvY3VtZW50LgotCi1WZXJzaW9uIDEuNi4xYmV0YTA0IFtGZWJydWFyeSAyNywgMjAxM10KLSAgUmV2aXNlZCBJTlNUQUxMIHRvIHJlY29tbWVuZCB1c2luZyBDUFBGTEFHUyBpbnN0ZWFkIG9mIElOQ0xVREVTLgotICBSZXZpc2VkIHNjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZCB0byByZXNwZWN0IFpMSUJMSUIgYW5kIFpMSUJJTkMuCi0gIFJldmlzZWQgc2NyaXB0cy9kZm4uYXdrIHRvIHdvcmsgd2l0aCB0aGUgYnVnZ3kgTVNZUyBhd2sgdGhhdCBoYXMgdHJvdWJsZQotICAgIHdpdGggQ1JMRiBsaW5lIGVuZGluZ3MuCi0KLVZlcnNpb24gMS42LjFiZXRhMDUgW01hcmNoIDEsIDIwMTNdCi0gIEF2b2lkIGEgcG9zc2libGUgbWVtb3J5IGxlYWsgaW4gY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmMKLQotVmVyc2lvbiAxLjYuMWJldGEwNiBbTWFyY2ggNCwgMjAxM10KLSAgQmV0dGVyIGRvY3VtZW50YXRpb24gb2YgdW5rbm93biBoYW5kbGluZyBBUEkgaW50ZXJhY3Rpb25zLgotICBDb3JyZWN0ZWQgQW5kcm9pZCBidWlsZHMgYW5kIGNvcnJlY3RlZCBsaWJwbmcudmVycyB3aXRoIHN5bWJvbAotICAgIHByZWZpeGluZy4gIEl0IGFsc28gbWFrZXMgdGhvc2UgdGVzdHMgY29tcGlsZSBhbmQgbGluayBvbiBBbmRyb2lkLgotICBBZGRlZCBhbiBBUEkgcG5nX3NldF9vcHRpb24oKSB0byBzZXQgb3B0aW1pemF0aW9uIG9wdGlvbnMgZXh0ZXJuYWxseSwKLSAgICBwcm92aWRpbmcgYW4gYWx0ZXJuYXRpdmUgYW5kIGdlbmVyYWwgc29sdXRpb24gZm9yIHRoZSBub24tcG9ydGFibGUKLSAgICBydW4tdGltZSB0ZXN0cyB1c2VkIGJ5IHRoZSBBUk0gTmVvbiBjb2RlLCB1c2luZyB0aGUgUE5HX0FSTV9ORU9OIG9wdGlvbi4KLSAgVGhlIG9yZGVyIG9mIHNldHRpbmdzIHZzIG9wdGlvbnMgaW4gcG5nbGliY29uZi5oIGlzIHJldmVyc2VkIHRvIGFsbG93Ci0gICAgc2V0dGluZ3MgdG8gZGVwZW5kIG9uIG9wdGlvbnMgYW5kIG9wdGlvbnMgY2FuIG5vdyBzZXQgKG9yIG92ZXJyaWRlKSB0aGUKLSAgICBkZWZhdWx0cyBmb3Igc2V0dGluZ3MuCi0KLVZlcnNpb24gMS42LjFiZXRhMDcgW01hcmNoIDcsIDIwMTNdCi0gIENvcnJlY3RlZCBzaW1wbGlmaWVkIEFQSSBkZWZhdWx0IGdhbW1hIGZvciBjb2xvci1tYXBwZWQgb3V0cHV0LCBhZGRlZAotICAgIGEgZmxhZyB0byBjaGFuZ2UgZGVmYXVsdC4gSW4gMS42LjAgd2hlbiB0aGUgc2ltcGxpZmllZCBBUEkgd2FzIHVzZWQKLSAgICB0byBwcm9kdWNlIGNvbG9yLW1hcHBlZCBvdXRwdXQgZnJvbSBhbiBpbnB1dCBpbWFnZSB3aXRoIG5vIGdhbW1hCi0gICAgaW5mb3JtYXRpb24gdGhlIGdhbW1hIGFzc3VtZWQgZm9yIHRoZSBpbnB1dCBjb3VsZCBiZSBkaWZmZXJlbnQgZnJvbQotICAgIHRoYXQgYXNzdW1lZCBmb3Igbm9uLWNvbG9yLW1hcHBlZCBvdXRwdXQuICBJbiBwYXJ0aWN1bGFyIDE2LWJpdCBkZXB0aAotICAgIGlucHV0IGZpbGVzIHdlcmUgYXNzdW1lZCB0byBiZSBzUkdCIGVuY29kZWQsIHdoZXJlYXMgaW4gdGhlICdkaXJlY3QnCi0gICAgY2FzZSB0aGV5IHdlcmUgYXNzdW1lZCB0byBoYXZlIGxpbmVhciBkYXRhLiAgVGhpcyB3YXMgYW4gZXJyb3IuICBUaGUKLSAgICBmaXggbWFrZXMgdGhlIHNpbXBsaWZpZWQgQVBJIHRyZWF0IGFsbCBpbnB1dCBmaWxlcyB0aGUgc2FtZSB3YXkgYW5kCi0gICAgYWRkcyBhIG5ldyBmbGFnIHRvIHRoZSBwbmdfaW1hZ2U6OmZsYWdzIG1lbWJlciB0byBhbGxvdyB0aGUKLSAgICBhcHBsaWNhdGlvbi91c2VyIHRvIHNwZWNpZnkgdGhhdCAxNi1iaXQgZmlsZXMgY29udGFpbiBzUkdCIGRhdGEKLSAgICByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBsaW5lYXIuCi0gIEZpeGVkIGJ1Z3MgaW4gdGhlIHBuZ3BpeGVsIGFuZCBtYWtlcG5nIHRlc3QgcHJvZ3JhbXMuCi0KLVZlcnNpb24gMS42LjFiZXRhMDggW01hcmNoIDcsIDIwMTNdCi0gIEZpeGVkIENNYWtlbGlzdHMudHh0IHRvIGFsbG93IGJ1aWxkaW5nIGEgc2luZ2xlIHZhcmlhbnQgb2YgdGhlIGxpYnJhcnkKLSAgICAoQ2xhdWRpbyBCbGV5KToKLSAgSW50cm9kdWNlZCBhIFBOR19MSUJfVEFSR0VUUyB2YXJpYWJsZSB0aGF0IGxpc3RzIGFsbCBhY3RpdmF0ZWQgbGlicmFyeQotICAgIHRhcmdldHMuICBJdCBpcyBhbiBlcnJvciBpZiB0aGlzIHZhcmlhYmxlIGVuZHMgdXAgZW1wdHksIGllLiB5b3UgaGF2ZQotICAgIHRvIGJ1aWxkIGF0IGxlYXN0IG9uZSBsaWJyYXJ5IHZhcmlhbnQuCi0gIE1hZGUgdGhlICpfQ09QWSB0YXJnZXRzIG9ubHkgZGVwZW5kIG9uIGxpYnJhcnkgdGFyZ2V0cyBhY3R1YWxseSBiZWluZyBidWlsZC4KLSAgVXNlIFBOR19MSUJfVEFSR0VUUyB0byB1bmlmeSBhIGNvZGUgcGF0aC4KLSAgQ2hhbmdlZCB0aGUgQ1JFQVRFX1NZTUxJTksgbWFjcm8gdG8gZXhwZWN0IHRoZSBmdWxsIHBhdGggdG8gYSBmaWxlIGFzIHRoZQotICAgIGZpcnN0IGFyZ3VtZW50LiBXaGVuIHN5bWxpbmtpbmcgdGhlIGZpbGVuYW1lIGNvbXBvbmVudCBvZiB0aGF0IHBhdGggaXMKLSAgICBkZXRlcm1pbmVkIGFuZCB1c2VkIGFzIHRoZSBsaW5rIHRhcmdldC4KLSAgVXNlIGNvcHlfaWZfZGlmZmVyZW50IGluIHRoZSBDUkVBVEVfU1lNTElOSyBtYWNyby4KLQotVmVyc2lvbiAxLjYuMWJldGEwOSBbTWFyY2ggMTMsIDIwMTNdCi0gIEVsaW1pbmF0ZWQgdHdvIHdhcm5pbmdzIGZyb20gdGhlIEludGVsIEMgY29tcGlsZXIuIFRoZSB3YXJuaW5ncyBhcmUKLSAgICB0ZWNobmljYWxseSB2YWxpZCwgYWx0aG91Z2ggYSByZWFzb25hYmxlIHRyZWF0bWVudCBvZiBkaXZpc2lvbiB3b3VsZAotICAgIHNob3cgaXQgdG8gYmUgaW5jb3JyZWN0LgotCi1WZXJzaW9uIDEuNi4xcmMwMSBbTWFyY2ggMjEsIDIwMTNdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjEgW01hcmNoIDI4LCAyMDEzXQotICBObyBjaGFuZ2VzLgotCi1WZXJzaW9uIDEuNi4yYmV0YTAxIFtBcHJpbCAxNCwgMjAxM10KLSAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIG9mIDEuNS54IHRvIDEuNi54IGNoYW5nZXMgaW4gaUNDUCBjaHVuayBoYW5kbGluZy4KLSAgRml4ZWQgaW5jb3JyZWN0IHdhcm5pbmcgb2YgZXhjZXNzIGRlZmxhdGUgZGF0YS4gRW5kIGNvbmRpdGlvbiAtIHRoZQotICAgIHdhcm5pbmcgd291bGQgYmUgcHJvZHVjZWQgaWYgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gd2Fzbid0IHJlYWQKLSAgICBpbiB0aGUgbGFzdCByb3cuICBUaGUgd2FybmluZyBpcyBoYXJtbGVzcy4KLSAgQ29ycmVjdGVkIHRoZSB0ZXN0IG9uIHVzZXIgdHJhbnNmb3JtIGNoYW5nZXMgb24gcmVhZC4gSXQgd2FzIGluIHRoZQotICAgIHBuZ19zZXQgb2YgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIgdW5sZXNzIHRoZQotICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBjaGFuZ2VzIHRoZSByb3didWYgc2l6ZSwgYW5kIHRoYXQgaXMgb25seSB2YWxpZCBpZgotICAgIHRyYW5zZm9ybV9pbmZvIGlzIGNhbGxlZC4KLSAgQ29ycmVjdGVkIGEgbWlzcGxhY2VkIGNsb3NpbmcgYnJhY2tldCBpbiBjb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLmMKLSAgICAoRmxhdmlvIE1lZGVpcm9zKS4KLSAgQ29ycmVjdGVkIGxlbmd0aCB3cml0dGVuIHRvIHVuY29tcHJlc3NlZCBpVFh0IGNodW5rcyAoU2FtdWxpIFN1b21pbmVuKS4KLSAgICBCdWcgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNi4wLgotCi1WZXJzaW9uIDEuNi4ycmMwMSBbQXByaWwgMTgsIDIwMTNdCi0gIEFkZGVkIGNvbnRyaWIvdG9vbHMvZml4aXR4dC5jLCB0byByZXBhaXIgdGhlIGVycm9uZW91cyBpVFh0IGNodW5rIGxlbmd0aAotICAgIHdyaXR0ZW4gYnkgbGlicG5nLTEuNi4wIGFuZCAxLjYuMS4KLSAgRGlzYWxsb3cgc3RvcmluZyBzUkdCIGluZm9ybWF0aW9uIHdoZW4gdGhlIHNSR0IgaXMgbm90IHN1cHBvcnRlZC4KLQotVmVyc2lvbiAxLjYuMnJjMDIgW0FwcmlsIDE4LCAyMDEzXQotICBNZXJnZSBwbmd0ZXN0LmMgd2l0aCBsaWJwbmctMS43LjAKLQotVmVyc2lvbiAxLjYuMnJjMDMgW0FwcmlsIDIyLCAyMDEzXQotICBUcml2aWFsIHNwZWxsaW5nIGNsZWFudXAuCi0KLVZlcnNpb24gMS42LjJyYzA0IGFuZCAxLjYuMnJjMDUgW29taXR0ZWRdCi0KLVZlcnNpb24gMS42LjJyYzA2IFtBcHJpbCAyNCwgMjAxM10KLSAgUmV2ZXJ0ZWQgdG8gdmVyc2lvbiAxLjYuMnJjMDMuICBSZWNlbnQgY2hhbmdlcyB0byBhcm0vbmVvbiBzdXBwb3J0Ci0gICAgaGF2ZSBiZWVuIHBvcnRlZCB0byBsaWJwbmctMS43LjBiZXRhMDkgYW5kIHdpbGwgcmVhcHBlYXIgaW4gdmVyc2lvbgotICAgIDEuNi4zYmV0YTAxLgotCi1WZXJzaW9uIDEuNi4yIFtBcHJpbCAyNSwgMjAxM10KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuM2JldGEwMSBbQXByaWwgMjUsIDIwMTNdCi0gIFJldmlzZWQgc3RhY2sgbWFya2luZyBpbiBhcm0vZmlsdGVyX25lb24uUyBhbmQgY29uZmlndXJlLmFjLgotICBFbnN1cmUgdGhhdCBORU9OIGZpbHRlciBzdHVmZiBpcyBjb21wbGV0ZWx5IGRpc2FibGVkIHdoZW4gc3dpdGNoZWQgJ29mZicuCi0gICAgUHJldmlvdXNseSB0aGUgQVJNIE5FT04gc3BlY2lmaWMgZmlsZXMgd2VyZSBzdGlsbCBidWlsdCBpZiB0aGUgb3B0aW9uCi0gICAgd2FzIHN3aXRjaGVkICdvZmYnIGFzIG9wcG9zZWQgdG8gYmVpbmcgZXhwbGljaXRseSBkaXNhYmxlZC4KLQotVmVyc2lvbiAxLjYuM2JldGEwMiBbQXByaWwgMjYsIDIwMTNdCi0gIFRlc3QgZm9yICdhcm0qJyBub3QganVzdCAnYXJtJyBpbiB0aGUgaG9zdF9jcHUgY29uZmlndXJlIHZhcmlhYmxlLgotICBSZWJ1aWx0IHRoZSBjb25maWd1cmUgc2NyaXB0cy4KLQotVmVyc2lvbiAxLjYuM2JldGEwMyBbQXByaWwgMzAsIDIwMTNdCi0gIEV4cGFuZGVkIG1hbnVhbCBwYXJhZ3JhcGggYWJvdXQgd3JpdGluZyBwcml2YXRlIGNodW5rcywgcGFydGljdWxhcmx5Ci0gICAgdGhlIG5lZWQgdG8gY2FsbCBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSB3aGVuIHdyaXRpbmcgdGhlbS4KLSAgQXZvaWQgZGVyZWZlcmVuY2luZyBOVUxMIHBvaW50ZXIgcG9zc2libHkgcmV0dXJuZWQgZnJvbQotICAgIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCkgKEFuZHJldyBDaHVyY2gpLgotCi1WZXJzaW9uIDEuNi4zYmV0YTA1IFtNYXkgOSwgMjAxM10KLSAgQ2FsY3VsYXRlIG91ciBvd24gemxpYiB3aW5kb3dCaXRzIHdoZW4gZGVjb2RpbmcgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlCi0gICAgQ01GIGJ5dGVzIGluIHRoZSBQTkcgZGF0YXN0cmVhbS4KLSAgQWRkZWQgYW4gb3B0aW9uIHRvIGZvcmNlIG1heGltdW0gd2luZG93IHNpemUgZm9yIGluZmxhdGluZywgd2hpY2ggd2FzCi0gICAgdGhlIGJlaGF2aW9yIG9mIGxpYnBuZzE1IGFuZCBlYXJsaWVyLCB2aWEgYSBuZXcgUE5HX01BWElNVU1fSU5GTEFURV9XSU5ET1cKLSAgICBvcHRpb24gZm9yIHBuZ19zZXRfb3B0aW9ucygpLgotICBBZGRlZCBwbmctZml4LWl0eHQgYW5kIHBuZy1maXgtdG9vLWZhci1iYWNrIHRvIHRoZSBidWlsdCBwcm9ncmFtcyBhbmQKLSAgICByZW1vdmVkIHdhcm5pbmdzIGZyb20gdGhlIHNvdXJjZSBjb2RlIGFuZCB0aW1lcG5nIHRoYXQgYXJlIHJldmVhbGVkIGFzCi0gICAgYSByZXN1bHQuCi0gIERldGVjdCB3cm9uZyBsaWJwbmcgdmVyc2lvbnMgbGlua2VkIHRvIHBuZy1maXgtdG9vLWZhci1iYWNrLCB3aGljaCBjdXJyZW50bHkKLSAgICBvbmx5IHdvcmtzIHdpdGggbGlicG5nIHZlcnNpb25zIHRoYXQgY2FuIGJlIG1hZGUgdG8gcmVsaWFibHkgZmFpbCB3aGVuCi0gICAgdGhlIGRlZmxhdGUgZGF0YSBjb250YWlucyBhbiBvdXQtb2Ytd2luZG93IHJlZmVyZW5jZS4gIFRoaXMgbWVhbnMgb25seQotICAgIDEuNiBhbmQgbGF0ZXIuCi0gIEZpeGVkIGdudSBpc3N1ZXM6IGcrKyBuZWVkcyBhIHN0YXRpY19jYXN0LCBnY2MgNC40LjcgaGFzIGEgYnJva2VuIHdhcm5pbmcKLSAgICBtZXNzYWdlIHdoaWNoIGl0IGlzIGVhc2llciB0byB3b3JrIHJvdW5kIHRoYW4gaWdub3JlLgotICBVcGRhdGVkIGNvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5jIChQYXVsIFN0ZXdhcnQpOgotICAgIENoZWNrIGZvciBFT0YKLSAgICBJZ25vcmUgIiMiIGRlbGltaXRlZCBjb21tZW50cyBpbiBpbnB1dCBmaWxlIHRvIHBubTJwbmcuYy4KLSAgICBGaXhlZCB3aGl0ZXNwYWNlIGhhbmRsaW5nCi0gICAgQWRkZWQgYSBjYWxsIHRvIHBuZ19zZXRfcGFja2luZygpCi0gICAgSW5pdGlhbGl6ZSBkaW1lbnNpb24gdmFsdWVzIHNvIGlmIHNzY2FuZiBmYWlscyBhdCBsZWFzdCB3ZSBoYXZlIGtub3duCi0gICAgICBpbnZhbGlkIHZhbHVlcy4KLSAgQXR0ZW1wdCB0byBkZXRlY3QgY29uZmlndXJhdGlvbiBpc3N1ZXMgd2l0aCBwbmctZml4LXRvby1mYXItYmFjaywgd2hpY2gKLSAgICByZXF1aXJlcyBib3RoIHRoZSBjb3JyZWN0IGxpYnBuZyBhbmQgdGhlIGNvcnJlY3QgemxpYiB0byBmdW5jdGlvbgotICAgIGNvcnJlY3RseS4KLSAgQ2hlY2sgWkxJQl9WRVJOVU0gZm9yIG1pc21hdGNoZXMsIGVuY2xvc2UgI2Vycm9yIGluIHF1b3RlcwotICBBZGRlZCBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhYm91dCBwcm9ibGVtcyB3aXRoIGFuZCBmaXhlcyBmb3IKLSAgICB0aGUgYmFkIENSQyBhbmQgYmFkIGlUWHQgY2h1bmsgc2l0dWF0aW9ucy4KLQotVmVyc2lvbiAxLjYuM2JldGEwNiBbTWF5IDEyLCAyMDEzXQotICBBbGxvdyBjb250cmliL3BuZ21pbnVzL3BubTJwbmcuYyB0byBjb21waWxlIHdpdGhvdXQgV1JJVEVfSU5WRVJUIGFuZAotICAgIFdSSVRFX1BBQ0sgc3VwcG9ydGVkICh3cml0ZXMgZXJyb3IgbWVzc2FnZSB0aGF0IGl0IGNhbid0IHJlYWQgUDEgb3IKLSAgICBQNCBQQk0gZmlsZXMpLgotICBJbXByb3ZlZCBwbmctZml4LXRvby1mYXItYmFjayB1c2FnZSBtZXNzYWdlLCBhZGRlZCAtLXN1ZmZpeCBvcHRpb24uCi0gIFJldmlzZWQgY29udHJpYi9wbmdtaW5pbS8qL21ha2VmaWxlIHRvIGdlbmVyYXRlIHBuZ2xpYmNvbmYuaCB3aXRoIHRoZQotICAgIHJpZ2h0IHpsaWIgaGVhZGVyIGZpbGVzLgotICBTZXBhcmF0ZWQgQ1BQRkxBR1MgYW5kIENGTEFHUyBpbiBjb250cmliL3BuZ21pbmltLyovbWFrZWZpbGUKLQotVmVyc2lvbiAxLjYuM2JldGEwNyBbSnVuZSA4LCAyMDEzXQotICBSZW1vdmVkIGEgcmVkdW5kYW50IHRlc3QgaW4gcG5nX3NldF9JSERSKCkuCi0gIEFkZGVkIHNldChDTUFLRV9DT05GSUdVUkFUSU9OX1RZUEVTIC4uLikgdG8gQ01ha2VMaXN0cy50eHQgKEFuZHJldyBIdW5kdCkKLSAgRGVsZXRlZCBzZXQoQ01BS0VfQlVJTERfVFlQRSkgYmxvY2sgZnJvbSBDTWFrZUxpc3RzLnR4dAotICBFbmNsb3NlIHRoZSBwcm90b3R5cGVzIGZvciB0aGUgc2ltcGxpZmllZCB3cml0ZSBBUEkgaW4KLSAgICAjaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRC8jZW5kaWYKLSAgTWFrZSBBUk0gTkVPTiBzdXBwb3J0IHdvcmsgYXQgY29tcGlsZSB0aW1lIChub3QganVzdCBjb25maWd1cmUgdGltZSkuCi0gICAgVGhpcyBtb3ZlcyB0aGUgdGVzdCBvbiBfX0FSTV9ORU9OX18gaW50byBwbmdjb25mLmggdG8gYXZvaWQgaXNzdWVzIHdoZW4KLSAgICB1c2luZyBhIGNvbXBpbGVyIHRoYXQgY29tcGlsZXMgZm9yIG11bHRpcGxlIGFyY2hpdGVjdHVyZXMgYXQgb25lIHRpbWUuCi0gIFJlbW92ZWQgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TIGFuZCBQTkdfQVJNX05FT05fU1VQUE9SVEVEIGZyb20KLSAgICBwbmdsaWJjb25mLmgsIGFsbG93aW5nIG1vcmUgb2YgdGhlIGRlY2lzaW9ucyB0byBiZSBtYWRlIGludGVybmFsbHkKLSAgICAocG5ncHJpdi5oKSBkdXJpbmcgdGhlIGNvbXBpbGUuICBXaXRob3V0IHRoaXMsIHN5bWJvbCBwcmVmaXhpbmcgaXMgYnJva2VuCi0gICAgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIG9uIEFSTSBwbGF0Zm9ybXMuICBOb3cgb25seSB0aGUgQVBJIHBhcnRzIG9mCi0gICAgdGhlIG9wdGltaXphdGlvbnMgKCdjaGVjaycgdnMgJ2FwaScpIGFyZSBleHBvc2VkIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGVzCi0gICAgZXhjZXB0IHRoYXQgdGhlIG5ldyBzZXR0aW5nIFBOR19BUk1fTkVPTl9PUFQgZG9jdW1lbnRzIGhvdyBsaWJwbmcgbWFrZXMgdGhlCi0gICAgZGVjaXNpb24gYWJvdXQgd2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBvcHRpbWl6YXRpb25zLgotICBQcm90ZWN0IHN5bWJvbCBwcmVmaXhpbmcgYWdhaW5zdCBDQy9DUFBGTEFHUy9DRkxBR1MgdXNlYWdlLgotICAgIFByZXZpb3VzIGlPUy9YY29kZSBmaXhlcyBmb3IgdGhlIEFSTSBORU9OIG9wdGltaXphdGlvbnMgbW92ZWQgdGhlIHRlc3QKLSAgICBvbiBfX0FSTV9ORU9OX18gZnJvbSBjb25maWd1cmUgdGltZSB0byBjb21waWxlIHRpbWUuICBUaGlzIGJyZWFrcyBzeW1ib2wKLSAgICBwcmVmaXhpbmcgYmVjYXVzZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3BlY2lhbCBwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zCi0gICAgY2FsbCB3YXMgaGlkZGVuIGF0IGNvbmZpZ3VyZSB0aW1lIGlmIHRoZSByZWxldmFudCBjb21waWxlciBhcmd1bWVudHMgYXJlCi0gICAgcGFzc2VkIGluIENGTEFHUyBhcyBvcHBvc2VkIHRvIENDLiAgVGhpcyBjaGFuZ2UgYXR0ZW1wdHMgdG8gYXZvaWQgYWxsCi0gICAgdGhlIGNvbmZ1c2lvbiB0aGF0IHdvdWxkIHJlc3VsdCBieSBkZWNsYXJpbmcgdGhlIGluaXQgZnVuY3Rpb24gZXZlbiB3aGVuCi0gICAgaXQgaXMgbm90IHVzZWQsIHNvIHRoYXQgaXQgd2lsbCBhbHdheXMgZ2V0IHByZWZpeGVkLgotCi1WZXJzaW9uIDEuNi4zYmV0YTA4IFtKdW5lIDE4LCAyMDEzXQotICBSZXZpc2VkIGxpYnBuZy4zIHNvIHRoYXQgImRvY2xpZnRlciIgY2FuIHByb2Nlc3MgaXQuCi0KLVZlcnNpb24gMS42LjNiZXRhMDkgW0p1bmUgMjcsIDIwMTNdCi0gIFJldmlzZWQgZXhhbXBsZS5jIHRvIGlsbHVzdHJhdGUgdXNlIG9mIFBOR19ERUZBVUxUX3NSR0IgYW5kIFBOR19HQU1NQV9NQUNfMTgKLSAgICBhcyBwYXJhbWV0ZXJzIGZvciBwbmdfc2V0X2dhbW1hKCkuICBUaGVzZSBoYXZlIGJlZW4gYXZhaWxhYmxlIHNpbmNlCi0gICAgbGlicG5nLTEuNS40LgotICBSZW5hbWVkIGNvbnRyaWIvdG9vbHMvcG5nLWZpeC10b28tZmFyLWJhY2suYyB0byBwbmdmaXguYyBhbmQgcmV2aXNlZCBpdAotICAgIHRvIGNoZWNrIGFsbCBjb21wcmVzc2VkIGNodW5rcyBrbm93biB0byBsaWJwbmcuCi0KLVZlcnNpb24gMS42LjNiZXRhMTAgW0p1bHkgNSwgMjAxM10KLSAgVXBkYXRlZCBkb2N1bWVudGF0aW9uIHRvIHNob3cgZGVmYXVsdCBiZWhhdmlvciBvZiBiZW5pZ24gZXJyb3JzIGNvcnJlY3RseS4KLSAgT25seSBjb21waWxlIEFSTSBjb2RlIHdoZW4gUE5HX1JFQURfU1VQUE9SVEVEIGlzIGRlZmluZWQuCi0gIEZpeGVkIHVuZGVmaW5lZCBiZWhhdmlvciBpbiBjb250cmliL3Rvb2xzL3BuZ2ZpeC5jIGFuZCBhZGRlZCBuZXcgc3RyaXAKLSAgICBvcHRpb24uIHBuZ2ZpeCByZWxpZWQgb24gdW5kZWZpbmVkIGJlaGF2aW9yIGFuZCBldmVuIGEgc2ltcGxlIGNoYW5nZSBmcm9tCi0gICAgZ2NjIHRvIGcrKyBjYXVzZWQgaXQgdG8gZmFpbC4gIFRoZSBuZXcgc3RyaXAgb3B0aW9uICd1bnNhZmUnIGhhcyBiZWVuCi0gICAgaW1wbGVtZW50ZWQgYW5kIGlzIHRoZSBkZWZhdWx0IGlmIC0tbWF4IGlzIGdpdmVuLiAgT3B0aW9uIG5hbWVzIGhhdmUKLSAgICBiZWVuIGNsYXJpZmllZCwgd2l0aCAtLXN0cmlwPXRyYW5zZm9ybSBub3cgc3RyaXBwaW5nIHRoZSBiS0dEIGNodW5rLAotICAgIHdoaWNoIHdhcyBzdHJpcHBlZCBwcmV2aW91c2x5IHdpdGggLS1zdHJpcD11bnVzZWQuCi0gIEFkZGVkIGFsbCBkb2N1bWVudGVkIGNodW5rIHR5cGVzIHRvIHBuZ3ByaXYuaAotICBVbmlmaWVkIHBuZ2ZpeC5jIHNvdXJjZSB3aXRoIGxpYnBuZzE3LgotCi1WZXJzaW9uIDEuNi4zcmMwMSBbSnVseSAxMSwgMjAxM10KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMyBbSnVseSAxOCwgMjAxM10KLSAgUmV2aXNlZCBtYW51YWwgYWJvdXQgY2hhbmdlcyBpbiBpVFh0IGNodW5rIGhhbmRsaW5nIG1hZGUgaW4gbGlicG5nLTEuNi4wLgotICBBZGRlZCAiLyogU0FGRSAqLyIgY29tbWVudHMgaW4gcG5ncnV0aWwuYyBhbmQgcG5ncnRyYW4uYyB3aGVyZSB3YXJuaW5ncwotICAgIG1heSBiZSBlcnJvbmVvdXNseSBpc3N1ZWQgYnkgY29kZS1jaGVja2luZyBhcHBsaWNhdGlvbnMuCi0KLVZlcnNpb24gMS42LjRiZXRhMDEgW0F1Z3VzdCAyMSwgMjAxM10KLSAgQWRkZWQgaW5mb3JtYXRpb24gYWJvdXQgcG5nX3NldF9vcHRpb25zKCkgdG8gdGhlIG1hbnVhbC4KLSAgRGVsYXkgY2FsbGluZyBwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zKCkgdW50aWwgYSByb3cgd2l0aCBub256ZXJvIGZpbHRlcgotICAgIGlzIGZvdW5kLgotCi1WZXJzaW9uIDEuNi40YmV0YTAyIFtBdWd1c3QgMzAsIDIwMTNdCi0gIEZpeGVkIGluY29uc2lzdGVudCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBvZiBwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZygpCi0gICAgcHJvdG90eXBlLCBkZWZpbml0aW9uLCBhbmQgdXNhZ2UuICBNYWRlIGl0IGRlcGVuZCBvbgotICAgIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQgZXZlcnl3aGVyZS4KLQotVmVyc2lvbiAxLjYuNHJjMDEgW1NlcHRlbWJlciA1LCAyMDEzXQotICBObyBjaGFuZ2VzLgotCi1WZXJzaW9uIDEuNi40IFtTZXB0ZW1iZXIgMTIsIDIwMTNdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjUgW1NlcHRlbWJlciAxNCwgMjAxM10KLSAgUmVtb3ZlZCB0d28gc3RyYXkgbGluZXMgb2YgY29kZSBmcm9tIGFybS9hcm1faW5pdC5jLgotCi1WZXJzaW9uIDEuNi42IFtTZXB0ZW1iZXIgMTYsIDIwMTNdCi0gIFJlbW92ZWQgdHdvIHN0cmF5IGxpbmVzIG9mIGNvZGUgZnJvbSBhcm0vYXJtX2luaXQuYywgYWdhaW4uCi0KLVZlcnNpb24gMS42LjdiZXRhMDEgW1NlcHRlbWJlciAzMCwgMjAxM10KLSAgUmV2aXNlZCB1bmtub3duIGNodW5rIGNvZGUgdG8gY29ycmVjdCBzZXZlcmFsIGJ1Z3MgaW4gdGhlIE5PX1NBVkVfL05PX1dSSVRFCi0gICAgY29tYmluYXRpb24KLSAgQWxsb3cgSEFORExFX0FTX1VOS05PV04gdG8gd29yayB3aGVuIG90aGVyIG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgb2ZmLiBBbHNvCi0gICAgZml4ZWQgdGhlIHBuZ21pbmltIG1ha2VmaWxlcyB0byB3b3JrIHdoZW4gJChNQUtFRkxBR1MpIGNvbnRhaW5zIHN0dWZmCi0gICAgd2hpY2ggdGVybWluYXRlcyB0aGUgbWFrZSBvcHRpb25zIChhcyBieSBkZWZhdWx0IGluIHJlY2VudCB2ZXJzaW9ucyBvZgotICAgIEdlbnRvbykuCi0gIEF2b2lkIHVwLWNhc3Qgd2FybmluZ3MgaW4gcG5ndmFsaWQuYy4gT24gQVJNIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mCi0gICAgcG5nX21vZGlmaWVyIGFyZSBncmVhdGVyIHRoYW4gdGhhdCBvZiBwbmdfc3RvcmUgYW5kIGFzIGEgY29uc2VxdWVuY2UKLSAgICBjb21waWxhdGlvbiBvZiBwbmd2YWxpZC5jIHJlc3VsdHMgaW4gYSB3YXJuaW5nIGFib3V0IGluY3JlYXNlZCBhbGlnbm1lbnQKLSAgICByZXF1aXJlbWVudHMgYmVjYXVzZSBvZiB0aGUgYmFyZSBjYXN0IHRvIChwbmdfbW9kaWZpZXIqKS4gVGhlIGNvZGUgaXMgc2FmZSwKLSAgICBiZWNhdXNlIHRoZSBwb2ludGVyIGlzIGtub3duIHRvIHBvaW50IHRvIGEgc3RhY2sgYWxsb2NhdGVkIHBuZ19tb2RpZmllciwKLSAgICBidXQgdGhpcyBjaGFuZ2UgYXZvaWRzIHRoZSB3YXJuaW5nLgotICBGaXhlZCBkZWZhdWx0IGJlaGF2aW9yIG9mIEFSTV9ORU9OX0FQSS4gSWYgdGhlIEFSTSBORU9OIEFQSSBvcHRpb24gd2FzCi0gICAgY29tcGlsZWQgd2l0aG91dCB0aGUgQ0hFQ0sgb3B0aW9uIGl0IGRlZmF1bHRlZCB0byBvbiwgbm90IG9mZi4KLSAgQ2hlY2sgdXNlciBjYWxsYmFjayBiZWhhdmlvciBpbiBwbmd1bmtub3duLmMuIFByZXZpb3VzIHZlcnNpb25zIGNvbXBpbGVkCi0gICAgaWYgU0FWRV9VTktOT1dOIHdhcyBub3QgYXZhaWxhYmxlIGJ1dCBkaWQgbm90aGluZyBzaW5jZSB0aGUgY2FsbGJhY2sKLSAgICB3YXMgbmV2ZXIgaW1wbGVtZW50ZWQuCi0gIE1lcmdlZCBwbmd1bmtub3duLmMgd2l0aCAxLjcgdmVyc2lvbiBhbmQgYmFjayBwb3J0ZWQgMS43IGltcHJvdmVtZW50cy9maXhlcwotCi1WZXJzaW9uIDEuNi43YmV0YTAyIFtPY3RvYmVyIDEyLCAyMDEzXQotICBNYWRlIGNoYW5nZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhdXRvbWFrZSAxLjE0OgotICAgIDEpIEFkZGVkIHRoZSAnY29tcGlsZScgcHJvZ3JhbSB0byB0aGUgbGlzdCBvZiBwcm9ncmFtcyB0aGF0IG11c3QgYmUgY2xlYW5lZAotICAgICAgIGluIGF1dG9nZW4uc2gKLSAgICAyKSBBZGRlZCAnc3ViZGlyLW9iamVjdHMnIHdoaWNoIGNhdXNlcyAuYyBmaWxlcyBpbiBzdWItZGlyZWN0b3JpZXMgdG8gYmUKLSAgICAgICBjb21waWxlZCBzdWNoIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgLm8gZmlsZXMgYXJlIGFsc28gaW4gdGhlCi0gICAgICAgc3ViLWRpcmVjdG9yeS4gIFRoaXMgaXMgYmVjYXVzZSBhdXRvbWFrZSAxLjE0IHdhcm5zIHRoYXQgdGhlCi0gICAgICAgY3VycmVudCBiZWhhdmlvciBvZiBjb21waWxpbmcgdG8gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgbWF5IGJlIHJlbW92ZWQKLSAgICAgICBpbiB0aGUgZnV0dXJlLgotICAgIDMpIFVwZGF0ZWQgZGVwZW5kZW5jaWVzIG9uIHBuZ2xpYmNvbmYuaCB0byBtYXRjaCB0aGUgbmV3IC5vIGxvY2F0aW9ucyBhbmQKLSAgICAgICBhZGRlZCBhbGwgdGhlIGZpbGVzIGluIGNvbnRyaWIvbGlidGVzdHMgYW5kIGNvbnRyaWIvdG9vbHMgdGhhdCBkZXBlbmQKLSAgICAgICBvbiBwbmdsaWJjb25mLmgKLSAgICA0KSBBZGRlZCAnQlVJTERfU09VUkNFUyA9IHBuZ2xpYmNvbmYuaCc7IHRoaXMgaXMgdGhlIGF1dG9tYWtlIHJlY29tbWVuZGVkCi0gICAgICAgd2F5IG9mIGhhbmRsaW5nIHRoZSBkZXBlbmRlbmNpZXMgb2Ygc291cmNlcyB0aGF0IGFyZSBtYWNoaW5lIGdlbmVyYXRlZDsKLSAgICAgICB1bmZvcnR1bmF0ZWx5IGl0IG9ubHkgd29ya3MgaWYgdGhlIHVzZXIgZG9lcyAnbWFrZSBhbGwnIG9yICdtYWtlIGNoZWNrJywKLSAgICAgICBzbyB0aGUgZGVwZW5kZW5jaWVzICgzKSBhcmUgc3RpbGwgcmVxdWlyZWQuCi0gIENsZWFuZWQgdXAgKGNoYXIqKSBjYXN0cyBvZiB6bGliIG1lc3NhZ2VzLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIEludGVsIEMKLSAgICBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgY2FzdGluZyBhIHN0cmluZyBsaXRlcmFsIGFzIChjaGFyKiksIHNvIGNvcGllZCB0aGUKLSAgICB0cmVhdG1lbnQgb2Ygel9jb25zdCBmcm9tIHRoZSBsaWJyYXJ5IGNvZGUgaW50byBwbmdmaXguYwotICBTaW1wbGlmaWVkIGVycm9yIG1lc3NhZ2UgY29kZSBpbiBwbmd1bmtub3duLiBUaGUgc2ltcGxpZmljYXRpb24gaGFzIHRoZQotICAgIHVzZWZ1bCBzaWRlIGVmZmVjdCBvZiBhdm9pZGluZyBhIGJvZ3VzIHdhcm5pbmcgZ2VuZXJhdGVkIGJ5IHRoZSBsYXRlc3QKLSAgICB2ZXJzaW9uIG9mIHRoZSBJbnRlbCBDIGNvbXBpbGVyIChpdCBvYmplY3RzIHRvCi0gICAgY29uZGl0aW9uID8gc3RyaW5nLWxpdGVyYWwgOiBzdHJpbmctbGl0ZXJhbCkuCi0gIE1ha2UgYXV0b2dlbi5zaCB3b3JrIHdpdGggYXV0b21ha2UgMS4xMyBhcyB3ZWxsIGFzIDEuMTQuIERvIHRoaXMgYnkgYWx3YXlzCi0gICAgcmVtb3ZpbmcgdGhlIDEuMTQgJ2NvbXBpbGUnIHNjcmlwdCBidXQgbmV2ZXIgY2hlY2tpbmcgZm9yIGl0LgotCi1WZXJzaW9uIDEuNi43YmV0YTAzIFtPY3RvYmVyIDE5LCAyMDEzXQotICBBZGRlZCBBUk12OCBzdXBwb3J0IChKYW1lcyBZdSA8amFtZXMueXUgYXQgbGluYXJvLm9yZz4pLiAgQWRkZWQgZmlsZQotICAgIGFybS9maWx0ZXJfbmVvbl9pbnRyaW5zaWNzLmM7IGVuYWJsZSB3aXRoIC1tZnB1PW5lb24uCi0gIFJldmlzZWQgcG5ndmFsaWQgdG8gZ2VuZXJhdGUgc2l6ZSBpbWFnZXMgd2l0aCBhcyBtYW55IGZpbHRlcnMgYXMgaXQgY2FuCi0gICAgbWFuYWdlLCBsaW1pdGVkIGJ5IHRoZSBudW1iZXIgb2Ygcm93cy4KLSAgQ2xlYW5lZCB1cCBBUk0gTkVPTiBjb21waWxhdGlvbiBoYW5kbGluZy4gVGhlIHRlc3RzIGFyZSBub3cgaW4gcG5ncHJpdi5oCi0gICAgYW5kIGRldGVjdCB0aGUgYnJva2VuIEdDQyBjb21waWxlcnMuCi0KLVZlcnNpb24gMS42LjdiZXRhMDQgW09jdG9iZXIgMjYsIDIwMTNdCi0gIEFsbG93IGNsYW5nIGRlcml2ZWQgZnJvbSBvbGRlciBHQ0MgdmVyc2lvbnMgdG8gdXNlIEFSTSBpbnRyaW5zaWNzLiBUaGlzCi0gICAgY2F1c2VzIGFsbCBjbGFuZyBidWlsZHMgdGhhdCB1c2UgLW1mcHU9bmVvbiB0byB1c2UgdGhlIGludHJpbnNpY3MgY29kZSwKLSAgICBub3QgdGhlIGFzc2VtYmxlciBjb2RlLiAgVGhpcyBoYXMgb25seSBiZWVuIHRlc3RlZCBvbiBpT1MgNy4gSXQgbWF5IGJlCi0gICAgbmVjZXNzYXJ5IHRvIGV4Y2x1ZGUgc29tZSBlYXJsaWVyIGNsYW5nIHZlcnNpb25zIGJ1dCB0aGlzIHNlZW1zIHVubGlrZWx5LgotICBDaGFuZ2VkIE5FT04gaW1wbGVtZW50YXRpb24gc2VsZWN0aW9uIG1lY2hhbmlzbS4gVGhpcyBhbGxvd3MgYXNzZW1ibGVyCi0gICAgb3IgaW50cmluc2ljcyB0byBiZSB0dXJuZWQgb24gYXQgY29tcGlsZSB0aW1lIGR1cmluZyB0aGUgYnVpbGQgYnkgZGVmaW5pbmcKLSAgICBQTkdfQVJNX05FT05fSU1QTEVNRU5UQVRJT04gdG8gdGhlIGNvcnJlY3QgdmFsdWUgKDIgb3IgMSkuICBUaGlzIG1hY3JvCi0gICAgaXMgdW5kZWZpbmVkIGJ5IGRlZmF1bHQgYW5kIHRoZSBidWlsZCB0eXBlIGlzIHNlbGVjdGVkIGluIHBuZ3ByaXYuaC4KLQotVmVyc2lvbiAxLjYuN3JjMDEgW05vdmVtYmVyIDIsIDIwMTNdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjdyYzAyIFtOb3ZlbWJlciA3LCAyMDEzXQotICBGaXhlZCAjaW5jbHVkZSBpbiBmaWx0ZXJfbmVvbl9pbnRyaW5zaWNzLmMgYW5kIGN0eXBlIG1hY3Jvcy4gVGhlIGN0eXBlIGNoYXIKLSAgICBjaGVja2luZyBtYWNyb3MgdGFrZSBhbiB1bnNpZ25lZCBjaGFyIGFyZ3VtZW50LCBub3QgYSBzaWduZWQgY2hhci4KLQotVmVyc2lvbiAxLjYuNyBbTm92ZW1iZXIgMTQsIDIwMTNdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjhiZXRhMDEgW05vdmVtYmVyIDI0LCAyMDEzXQotICBNb3ZlZCBwcm90b3R5cGUgZm9yIHBuZ19oYW5kbGVfdW5rbm93bigpIGluIHBuZ3ByaXYuaCBvdXRzaWRlIG9mCi0gICAgdGhlICNpZmRlZiBQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRC8jZW5kaWYgYmxvY2suCi0gIEFkZGVkICItV2FsbCIgdG8gQ0ZMQUdTIGluIGNvbnRyaWIvcG5nbWluaW0vKi9tYWtlZmlsZQotICBDb25kaXRpb25hbGx5IGNvbXBpbGUgc29tZSB1bnVzZWQgZnVuY3Rpb25zIHJlcG9ydGVkIGJ5IC1XYWxsIGluCi0gICAgcG5nbWluaW0uCi0gIEZpeGVkICdtaW5pbWFsJyBidWlsZHMuIFZhcmlvdXMgb2J2aW91c2x5IHVzZWZ1bCBtaW5pbWFsIGNvbmZpZ3VyYXRpb25zCi0gICAgZG9uJ3QgYnVpbGQgYmVjYXVzZSBvZiBtaXNzaW5nIGNvbnRyaWIvbGlidGVzdHMgdGVzdCBwcm9ncmFtcyBhbmQKLSAgICBvdmVybHkgY29tcGxleCBkZXBlbmRlbmNpZXMgaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gVGhpcyBjaGFuZ2UKLSAgICBhZGRzIGNvbnRyaWIvY29uZnRlc3QvKi5kZmEgZmlsZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhdXRvbWF0aWMgYnVpbGQKLSAgICBzY3JpcHRzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIGNvbmZpZ3VyYXRpb25zIGNvbnRpbnVlIHRvIGJ1aWxkLgotICBFbmFibGVkIFdSSVRFX0lOVkVSVCBhbmQgV1JJVEVfUEFDSyBpbiBjb250cmliL3BuZ21pbmltL2VuY29kZXIuCi0gIEZpeGVkIHBuZ3ZhbGlkICdmYWlsJyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvbiB0aGUgSW50ZWwgQyBDb21waWxlci4KLSAgICBUaGlzIHJldmVydHMgdG8gdGhlIHByZXZpb3VzICdzdGF0aWMnIGltcGxlbWVudGF0aW9uIGFuZCB3b3JrcyByb3VuZAotICAgIHRoZSAndW51c2VkIHN0YXRpYyBmdW5jdGlvbicgd2FybmluZyBieSB1c2luZyBQTkdfVU5VU0VEKCkuCi0KLVZlcnNpb24gMS42LjhiZXRhMDIgW05vdmVtYmVyIDMwLCAyMDEzXQotICBSZW1vdmVkIG9yIG1hcmtlZCBQTkdfVU5VU0VEIHNvbWUgaGFybWxlc3MgImRlYWQgYXNzaWdubWVudHMiIHJlcG9ydGVkCi0gICAgYnkgY2xhbmcgc2Nhbi1idWlsZC4KLSAgQ2hhbmdlZCB0YWJzIHRvIDMgc3BhY2VzIGluIHBuZ19kZWJ1ZyBtYWNyb3MgYW5kIGNoYW5nZWQgJyIlcyJtJwotICAgIHRvICciJXMiIG0nIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW1vbmcgY29tcGlsZXJzLgotICBDaGFuZ2VkIHBuZ19mcmVlX2RlZmF1bHQoKSB0byBmcmVlKCkgaW4gcG5ndGVzdC5jCi0KLVZlcnNpb24gMS42LjhyYzAxIFtEZWNlbWJlciAxMiwgMjAxM10KLSAgVGlkaWVkIHVwIHBuZ2ZpeCBpbml0cyBhbmQgZml4ZWQgcG5ndGVzdCBuby13cml0ZSBidWlsZHMuCi0KLVZlcnNpb24gMS42LjhyYzAyIFtEZWNlbWJlciAxNCwgMjAxM10KLSAgSGFuZGxlIHplcm8tbGVuZ3RoIFBMVEUgY2h1bmsgb3IgTlVMTCBwYWxldHRlIHdpdGggcG5nX2Vycm9yKCkKLSAgICBpbnN0ZWFkIG9mIHBuZ19jaHVua19yZXBvcnQoKSwgd2hpY2ggYnkgZGVmYXVsdCBpc3N1ZXMgYSB3YXJuaW5nCi0gICAgcmF0aGVyIHRoYW4gYW4gZXJyb3IsIGxlYWRpbmcgdG8gbGF0ZXIgcmVhZGluZyBmcm9tIGEgTlVMTCBwb2ludGVyCi0gICAgKHBuZ19wdHItPnBhbGV0dGUpIGluIHBuZ19kb19leHBhbmRfcGFsZXR0ZSgpLiBUaGlzIGlzIENWRS0yMDEzLTY5NTQKLSAgICBhbmQgVlUjNjUwMTQyLiAgTGlicG5nLTEuNi4xIHRocm91Z2ggMS42LjcgYXJlIHZ1bG5lcmFibGUuCi0gICAgTGlicG5nLTEuNi4wIGFuZCBlYXJsaWVyIGRvIG5vdCBoYXZlIHRoaXMgYnVnLgotCi1WZXJzaW9uIDEuNi44IFtEZWNlbWJlciAxOSwgMjAxM10KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuOWJldGEwMSBbRGVjZW1iZXIgMjYsIDIwMTNdCi0gIEJvb2trZWVwaW5nOiBNb3ZlZCBmdW5jdGlvbnMgYXJvdW5kIChubyBjaGFuZ2VzKS4gTW92ZWQgdHJhbnNmb3JtCi0gICAgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYmVmb3JlIHRoZSBwbGFjZSB3aGVyZSB0aGV5IGFyZSBjYWxsZWQgc28gdGhhdAotICAgIHRoZXkgY2FuIGJlIG1hZGUgc3RhdGljLiBNb3ZlIHRoZSBpbnRyYXBpeGVsIGZ1bmN0aW9ucyBhbmQgdGhlCi0gICAgZ3JheXNjYWxlIHBhbGV0dGUgYnVpbGRlciBvdXQgb2YgdGhlIHBuZz90cmFuLmMgZmlsZXMuIFRoZSBsYXR0ZXIKLSAgICBpc24ndCBhIHRyYW5zZm9ybSBmdW5jdGlvbiBhbmQgaXMgbm8gbG9uZ2VyIHVzZWQgaW50ZXJuYWxseSwgYW5kIHRoZQotICAgIGZvcm1lciBNTkcgc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBiZXR0ZXIgcGxhY2VkIGluIHBuZ3JlYWQvcG5nd3JpdGUuYwotICBNYWRlIHRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMgc3RhdGljLiBUaGlzIG1ha2VzIHRoZSBpbnRlcm5hbAotICAgIGZ1bmN0aW9ucyBjYWxsZWQgYnkgcG5nX2RvX3tyZWFkfHdyaXRlfV90cmFuc2Zvcm1hdGlvbnMgc3RhdGljLiBPbiBhbgotICAgIHg4Ni02NCBETEwgYnVpbGQgKEdlbnRvbyBMaW51eCkgdGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSB0ZXh0Ci0gICAgc2VnbWVudCBvZiB0aGUgRExMIGJ5IDEyMDggYnl0ZXMsIGFib3V0IDAuNiUuIEl0IGFsc28gc2ltcGxpZmllcwotICAgIG1haW50ZW5hbmNlIGJ5IHJlbW92aW5nIHRoZSBkZWNsYXJhdGlvbnMgZnJvbSBwbmdwcml2LmggYW5kIGFsbG93aW5nCi0gICAgZWFzaWVyIGNoYW5nZXMgdG8gdGhlIGludGVybmFsIGludGVyZmFjZXMuCi0gIFJlYnVpbHQgY29uZmlndXJlIHNjcmlwdHMgd2l0aCBhdXRvbWFrZS0xLjE0LjEgYW5kIGF1dG9jb25mLTIuNjkKLSAgICBpbiB0aGUgdGFyIGRpc3RyaWJ1dGlvbnMuCi0KLVZlcnNpb24gMS42LjliZXRhMDIgW0phbnVhcnkgMSwgMjAxNF0KLSAgQWRkZWQgY2hlY2tzIGZvciBsaWJwbmcgMS41IHRvIHBuZ3ZhbGlkLmMuICBUaGlzIHN1cHBvcnRzIHRoZSB1c2Ugb2YKLSAgICB0aGlzIHZlcnNpb24gb2YgcG5ndmFsaWQgaW4gbGlicG5nIDEuNQotICBNZXJnZWQgd2l0aCBwbmd2YWxpZC5jIGZyb20gbGlicG5nLTEuNyBjaGFuZ2VzIHRvIGNyZWF0ZSBhIHNpbmdsZQotICAgIHBuZ3ZhbGlkLmMKLSAgUmVtb3ZlZCAjZXJyb3IgbWFjcm8gZnJvbSBjb250cmliL3Rvb2xzL3BuZ2ZpeC5jIChUaG9tYXMgS2xhdXNuZXIpLgotICBNZXJnZWQgcG5ncmlvLmMsIHBuZ3RyYW5zLmMsIHBuZ3dpby5jLCBhbmQgcG5nZXJyb3IuYyB3aXRoIGxpYnBuZy0xLjcuMAotICBNZXJnZWQgbGlicG5nLTEuNy4wIGNoYW5nZXMgdG8gbWFrZSBuby1pbnRlcmxhY2UgY29uZmlndXJhdGlvbnMgd29yawotICAgIHdpdGggdGVzdCBwcm9ncmFtcy4KLSAgUmV2aXNlZCBwbmd2YWxpZC5jIHRvIHN1cHBvcnQgbGlicG5nIDEuNSwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCB0aGUKLSAgICBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVyBvcHRpb24sIHNvICNkZWZpbmUgaXQgb3V0IHdoZW4gYXBwcm9wcmlhdGUgaW4KLSAgICBwbmd2YWxpZC5jCi0gIEFsbG93IHVudmVyc2lvbmVkIGxpbmtzIGNyZWF0ZWQgb24gaW5zdGFsbCB0byBiZSBkaXNhYmxlZCBpbiBjb25maWd1cmUuCi0gICAgSW4gY29uZmlndXJlIGJ1aWxkcyAnbWFrZSBpbnN0YWxsJyBjaGFuZ2VzL2FkZHMgbGlua3MgbGlrZSBwbmcuaAotICAgIGFuZCBsaWJwbmcuYSB0byBwb2ludCB0byB0aGUgbmV3bHkgaW5zdGFsbGVkLCB2ZXJzaW9uZWQsIGZpbGVzIChlLmcuCi0gICAgbGlicG5nMTcvcG5nLmggYW5kIGxpYnBuZzE3LmEpLiBUaHJlZSBuZXcgY29uZmlndXJlIG9wdGlvbnMgYW5kIHNvbWUKLSAgICByZWFycmFuZ2VtZW50IG9mIE1ha2VmaWxlLmFtIGFsbG93IGNyZWF0aW9uIG9mIHRoZXNlIGxpbmtzIHRvIGJlIGRpc2FibGVkLgotCi1WZXJzaW9uIDEuNi45YmV0YTAzIFtKYW51YXJ5IDEwLCAyMDE0XQotICBSZW1vdmVkIHBvdGVudGlhbGx5IG1pc2xlYWRpbmcgd2FybmluZyBmcm9tIHBuZ19jaGVja19JSERSKCkuCi0KLVZlcnNpb24gMS42LjliZXRhMDQgW0phbnVhcnkgMjAsIDIwMTRdCi0gIFVwZGF0ZWQgc2NyaXB0cy9tYWtlZmlsZS4qIHRvIHVzZSBDUFBGTEFHUyAoQ29zbWluKS4KLSAgQWRkZWQgY2xhbmcgYXR0cmlidXRlIHN1cHBvcnQgKENvc21pbikuCi0KLVZlcnNpb24gMS42LjlyYzAxIFtKYW51YXJ5IDI4LCAyMDE0XQotICBObyBjaGFuZ2VzLgotCi1WZXJzaW9uIDEuNi45cmMwMiBbSmFudWFyeSAzMCwgMjAxNF0KLSAgUXVpZXQgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgd2FybmluZyBmcm9tIFZDMjAxMyBpbiBwbmdfZ2V0X3BuZygpLgotCi1WZXJzaW9uIDEuNi45IFtGZWJydWFyeSA2LCAyMDE0XQotCi1WZXJzaW9uIDEuNi4xMGJldGEwMSBbRmVicnVhcnkgOSwgMjAxNF0KLSAgQmFja3BvcnRlZCBjaGFuZ2VzIGZyb20gbGlicG5nLTEuNy4wYmV0YTMwIGFuZCBiZXRhMzE6Ci0gIEZpeGVkIGEgbGFyZ2UgbnVtYmVyIG9mIGluc3RhbmNlcyB3aGVyZSBQTkdDQkFQSSB3YXMgb21pdHRlZCBmcm9tCi0gICAgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCi0gIEFkZGVkIHBuZ2ltYWdlIHRlc3QgcHJvZ3JhbSBmb3IgcG5nX3JlYWRfcG5nKCkgYW5kIHBuZ193cml0ZV9wbmcoKQotICAgIHdpdGggdHdvIG5ldyB0ZXN0IHNjcmlwdHMuCi0gIFJlbW92ZWQgZGVwZW5kZW5jZSBvbiAhUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCBmb3IgY2FsbGluZwotICAgIHBuZ19zZXRfcGFja2luZygpIGluIHBuZ19yZWFkX3BuZygpLgotICBGaXhlZCBjb21iaW5hdGlvbiBvZiB+YWxwaGEgd2l0aCBzaGlmdC4gT24gcmVhZCBpbnZlcnQgYWxwaGEsIHByb2Nlc3NpbmcKLSAgICBvY2N1cnJlZCBhZnRlciBzaGlmdCBwcm9jZXNzaW5nLCB3aGljaCBjYXVzZXMgdGhlIGZpbmFsIHZhbHVlcyB0byBiZQotICAgIG91dHNpZGUgdGhlIHJhbmdlIHRoYXQgc2hvdWxkIGJlIHByb2R1Y2VkIGJ5IHRoZSBzaGlmdC4gUmV2ZXJzaW5nIHRoZQotICAgIG9yZGVyIG9uIHJlYWQgbWFrZXMgdGhlIHR3byB0cmFuc2Zvcm1zIHdvcmsgdG9nZXRoZXIgY29ycmVjdGx5IGFuZCBtaXJyb3JzCi0gICAgdGhlIG9yZGVyIHVzZWQgb24gd3JpdGUuCi0gIERvIG5vdCByZWFkIGludmFsaWQgc0JJVCBjaHVua3MuIFByZXZpb3VzbHkgbGlicG5nIG9ubHkgY2hlY2tlZCBzQklUCi0gICAgdmFsdWVzIG9uIHdyaXRlLCBzbyBhIG1hbGljaW91cyBQTkcgd3JpdGVyIGNvdWxkIHRoZXJlZm9yZSBjYXVzZQotICAgIHRoZSByZWFkIGNvZGUgdG8gcmV0dXJuIGFuIGludmFsaWQgc0JJVCBjaHVuaywgd2hpY2ggbWlnaHQgbGVhZCB0bwotICAgIGFwcGxpY2F0aW9uIGVycm9ycyBvciBjcmFzaGVzLiAgU3VjaCBjaHVua3MgYXJlIG5vdyBza2lwcGVkICh3aXRoCi0gICAgY2h1bmtfYmVuaWduX2Vycm9yKS4KLSAgTWFrZSBwbmdfcmVhZF9wbmcoKSBhbmQgcG5nX3dyaXRlX3BuZygpIHByb3RvdHlwZXMgaW4gcG5nLmggZGVwZW5kCi0gICAgdXBvbiBQTkdfUkVBRF9TVVBQT1JURUQgYW5kIFBOR19XUklURV9TVVBQT1JURUQuCi0gIFN1cHBvcnQgYnVpbGRzIHdpdGggdW5zdXBwb3J0ZWQgUE5HX1RSQU5TRk9STV8qIHZhbHVlcy4gIEFsbCBvZiB0aGUKLSAgICBQTkdfVFJBTlNGT1JNXyogdmFsdWVzIGFyZSBhbHdheXMgZGVmaW5lZCBpbiBwbmcuaCBhbmQsIGJlY2F1c2UgdGhleQotICAgIGFyZSB1c2VkIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlIGluIHNvbWUgY2FzZXMsIGl0IGlzIG5vdCByZWxpYWJsZQotICAgIHRvICNpZiBvdXQgb25lcyB0aGF0IGFyZSB0b3RhbGx5IHVuc3VwcG9ydGVkLiBUaGlzIGNoYW5nZSBhZGRzIGVycm9yCi0gICAgZGV0ZWN0aW9uIGluIHBuZ19yZWFkX2ltYWdlKCkgYW5kIHBuZ193cml0ZV9pbWFnZSgpIHRvIGRvIGEKLSAgICBwbmdfYXBwX2Vycm9yKCkgaWYgdGhlIGFwcCByZXF1ZXN0cyBzb21ldGhpbmcgdGhhdCBjYW5ub3QgYmUgZG9uZQotICAgIGFuZCBpdCBhZGRzIGNvcnJlc3BvbmRpbmcgY29kZSB0byBwbmdpbWFnZS5jIHRvIGhhbmRsZSBzdWNoIG9wdGlvbnMKLSAgICBieSBub3QgYXR0ZW1wdGluZyB0byB0ZXN0IHRoZW0uCi0KLVZlcnNpb24gMS42LjEwYmV0YTAyIFtGZWJydWFyeSAyMywgMjAxNF0KLSAgTW92ZWQgcmVkZWZpbmVzIG9mIHBuZ19lcnJvcigpLCBwbmdfd2FybmluZygpLCBwbmdfY2h1bmtfZXJyb3IoKSwKLSAgICBhbmQgcG5nX2NodW5rX3dhcm5pbmcoKSBmcm9tIHBuZ3ByaXYuaCB0byBwbmcuaCB0byBtYWtlIHRoZW0gdmlzaWJsZQotICAgIHRvIGxpYnBuZy1jYWxsaW5nIGFwcGxpY2F0aW9ucy4KLSAgTW92ZWQgT1MgZGVwZW5kZW50IGNvZGUgZnJvbSBhcm0vYXJtX2luaXQuYywgdG8gYWxsb3cgdGhlIGluY2x1ZGVkCi0gICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFSTSBORU9OIGRpc2NvdmVyeSBmdW5jdGlvbiB0byBiZSBzZXQgYXQKLSAgICBidWlsZC10aW1lIGFuZCBwcm92aWRlIHNhbXBsZSBpbXBsZW1lbnRhdGlvbnMgZnJvbSB0aGUgY3VycmVudCBjb2RlIGluIHRoZQotICAgIGNvbnRyaWIvYXJtLW5lb24gc3ViZGlyZWN0b3J5LiBUaGUgX19saW51eF9fIGNvZGUgaGFzIGFsc28gYmVlbiBjaGFuZ2VkIHRvCi0gICAgY29tcGlsZSBhbmQgbGluayBvbiBBbmRyb2lkIGJ5IHVzaW5nIC9wcm9jL2NwdWluZm8sIGFuZCB0aGUgb2xkIGxpbnV4IGNvZGUKLSAgICBpcyBpbiBjb250cmliL2FybS1uZW9uL2xpbnV4LWF1eHYuYy4gIFRoZSBuZXcgY29kZSBhdm9pZHMgUE9TSVggYW5kIExpbnV4Ci0gICAgZGVwZW5kZW5jaWVzIGFwYXJ0IGZyb20gb3BlbmluZyAvcHJvYy9jcHVpbmZvIGFuZCBpcyBDOTAgY29tcGxpYW50LgotICBDaGVjayBmb3IgaW5mb19wdHIgPT0gTlVMTCBlYXJseSBpbiBwbmdfcmVhZF9lbmQoKSBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgcnVuIGFsbCB0aGUgcG5nX2hhbmRsZV8qKCkgYW5kIGRlcGVuZCBvbiB0aGVtIHRvIHJldHVybiBpZiBpbmZvX3B0ciA9PSBOVUxMLgotICAgIFRoaXMgaW1wcm92ZXMgdGhlIHBlcmZvcm1hbmNlIG9mIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBOVUxMKSBhbmQgbWFrZXMKLSAgICBpdCBtb3JlIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSBwcm9ncmFtbWluZyBlcnJvcnMuCi0gIENoZWNrIGZvciBfX2hhc19leHRlbnNpb24gYmVmb3JlIHVzaW5nIGl0IGluIHBuZ2NvbmYuaCwgdG8KLSAgICBzdXBwb3J0IG9sZGVyIENsYW5nIHZlcnNpb25zIChKZXJlbXkgU2VxdW9pYSkuCi0gIFRyZWF0IENSQyBlcnJvciBoYW5kbGluZyB3aXRoIHBuZ19zZXRfY3JjX2FjdGlvbigpLCBpbnN0ZWFkIG9mIHdpdGgKLSAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSwgd2hpY2ggaGFzIGJlZW4gdGhlIGNhc2Ugc2luY2UgbGlicG5nLTEuNi4wYmV0YTE4LgotICBVc2UgYSB1c2VyIHdhcm5pbmcgaGFuZGxlciBpbiBjb250cmliL2dyZWdib29rL3JlYWRwbmcyLmMgaW5zdGVhZCBvZiBkZWZhdWx0LAotICAgIHNvIHdhcm5pbmdzIHdpbGwgYmUgcHV0IG9uIHN0ZGVyciBldmVuIGlmIGxpYnBuZyBoYXMgQ09OU09MRV9JTyBkaXNhYmxlZC4KLSAgQWRkZWQgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfSURBVF9NT0RFIGluIHBuZ19wdXNoX3JlYWRfY2h1bmsKLSAgICBhZnRlciByZWNvZ25pemluZyB0aGUgSURBVCBjaHVuaywgd2hpY2ggYXZvaWRzIGFuIGluZmluaXRlIGxvb3Agd2hpbGUKLSAgICByZWFkaW5nIGEgZGF0YXN0cmVhbSB3aG9zZSBmaXJzdCBJREFUIGNodW5rIGlzIG9mIHplcm8tbGVuZ3RoLgotICAgIFRoaXMgZml4ZXMgQ0VSVCBWVSM2ODQ0MTIgYW5kIENWRS0yMDE0LTAzMzMuCi0gIERvbid0IHJlY29nbml6ZSBrbm93biBzUkdCIHByb2ZpbGVzIGFzIHNSR0IgaWYgdGhleSBoYXZlIGJlZW4gaGFja2VkLAotICAgIGJ1dCBkb24ndCByZWplY3QgdGhlbSBhbmQgZG9uJ3QgaXNzdWUgYSBjb3B5cmlnaHQgdmlvbGF0aW9uIHdhcm5pbmcuCi0KLVZlcnNpb24gMS42LjEwYmV0YTAzIFtGZWJydWFyeSAyNSwgMjAxNF0KLSAgTW92ZWQgc29tZSBkb2N1bWVudGF0aW9uIGZyb20gcG5nLmggdG8gbGlicG5nLjMgYW5kIGxpYnBuZy1tYW51YWwudHh0Ci0gIE1pbm9yIGVkaXRpbmcgb2YgY29udHJpYi9hcm0tbmVvbi9SRUFETUUgYW5kIGNvbnRyaWIvZXhhbXBsZXMvKi5jCi0KLVZlcnNpb24gMS42LjEwcmMwMSBbRmVicnVhcnkgMjcsIDIwMTRdCi0gIEZpeGVkIHR5cG9zIGluIHRoZSBtYW51YWwgYW5kIGluIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgKENGTEFHUyAtPiBDUFBGTEFHUwotICAgIGFuZCBQTkdfVVNSX0NPTkZJRyAtPiBQTkdfVVNFUl9DT05GSUcpLgotCi1WZXJzaW9uIDEuNi4xMHJjMDIgW0ZlYnJ1YXJ5IDI4LCAyMDE0XQotICBSZW1vdmVkIHVucmVhY2hhYmxlIHJldHVybiBzdGF0ZW1lbnQgYWZ0ZXIgcG5nX2NodW5rX2Vycm9yKCkKLSAgICBpbiBwbmdydXRpbC5jCi0KLVZlcnNpb24gMS42LjEwcmMwMyBbTWFyY2ggNCwgMjAxNF0KLSAgVW4tZGVwcmVjYXRlZCBwbmdfZGF0YV9mcmVlcigpLgotCi1WZXJzaW9uIDEuNi4xMCBbTWFyY2ggNiwgMjAxNF0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMTFiZXRhMDEgW01hcmNoIDE3LCAyMDE0XQotICBVc2UgImlmICh2YWx1ZSAhPSAwKSIgaW5zdGVhZCBvZiAiaWYgKHZhbHVlKSIgY29uc2lzdGVudGx5LgotICBDaGFuZ2VkIFpsaWJTcmNEaXIgZnJvbSAxLjIuNSB0byAxLjIuOCBpbiBwcm9qZWN0cy92c3R1ZGlvLgotICBNb3ZlZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIG1hbnVhbCB0byB0aGUgSU5TVEFMTCBmaWxlLgotCi1WZXJzaW9uIDEuNi4xMWJldGEwMiBbQXByaWwgNiwgMjAxNF0KLSAgUmVtb3ZlZCAjaWYvI2Vsc2UvI2VuZGlmIGZyb20gaW5zaWRlIHR3byBwb3coKSBjYWxscyBpbiBwbmd2YWxpZC5jIGJlY2F1c2UKLSAgICB0aGV5IHdlcmUgaGFuZGxlZCBpbXByb3Blcmx5IGJ5IFBvcnRsYW5kIEdyb3VwJ3MgUEdJLTE0LjEgLSBQR0ktMTQuMwotICAgIHdoZW4gdXNpbmcgaXRzICJfX2J1aWx0aW5fcG93KCkiIGZ1bmN0aW9uLgotICBTaWxlbmNlICd1bnVzZWQgcGFyYW1ldGVyJyBidWlsZCB3YXJuaW5ncyAoQ29zbWluIFRydXRhKS4KLSAgJChDUCkgaXMgbm93IHVzZWQgYWxvbmdzaWRlICQoUk1fRikuICBBbHNvLCB1c2UgJ2NvcHknIGluc3RlYWQgb2YgJ2NwJwotICAgIHdoZXJlIGFwcGxpY2FibGUsIGFuZCBhcHBsaWVkIG90aGVyIG1pbm9yIG1ha2VmaWxlIGNoYW5nZXMgKENvc21pbikuCi0gIERvbid0IHdhcm4gYWJvdXQgaW52YWxpZCBkaW1lbnNpb25zIGV4Y2VlZGluZyB1c2VyIGxpbWl0cyAoQ29zbWluKS4KLSAgQWxsb3cgYW4gZWFzeSByZXBsYWNlbWVudCBvZiB0aGUgZGVmYXVsdCBwcmUtYnVpbHQgY29uZmlndXJhdGlvbgotICAgIGhlYWRlciB3aXRoIGEgY3VzdG9tIGhlYWRlciwgdmlhIHRoZSBtYWtlIFBOR0xJQkNPTkZfSF9QUkVCVUlMVAotICAgIG1hY3JvIChDb3NtaW4pLgotCi1WZXJzaW9uIDEuNi4xMWJldGEwMyBbQXByaWwgNiwgMjAxNF0KLSAgRml4ZWQgYSB0eXBvIGluIHBuZ3J1dGlsLmMsIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNS42LCB0aGF0IGludGVyZmVyZXMKLSAgICB3aXRoICJibG9ja3kiIGV4cGFuc2lvbiBvZiBzdWItOC1iaXQgaW50ZXJsYWNlZCBQTkcgZmlsZXMgKEVyaWMgSHVzcykuCi0gIE9wdGlvbmFsbHkgdXNlICBfX2J1aWx0aW5fYnN3YXAxNigpIGluIHBuZ19kb19zd2FwKCkuCi0KLVZlcnNpb24gMS42LjExYmV0YTA0IFtBcHJpbCAxOSwgMjAxNF0KLSAgTWFkZSBwcm9ncmVzc2l2ZSByZWFkaW5nIG9mIGludGVybGFjZWQgaW1hZ2VzIGNvbnNpc3RlbnQgd2l0aCB0aGUKLSAgICBiZWhhdmlvciBvZiB0aGUgc2VxdWVudGlhbCByZWFkZXIgYW5kIGNvbnNpc3RlbnQgd2l0aCB0aGUgbWFudWFsLCBieQotICAgIG1vdmluZyBzb21lIGNvZGUgb3V0IG9mIHRoZSBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgYmxvY2tzLiBUaGUKLSAgICByb3dfY2FsbGJhY2sgbm93IHJlY2VpdmVzIHRoZSBwcm9wZXIgcGFzcyBudW1iZXIgYW5kIHVuZXhwYW5kZWQgcm93cywgd2hlbgotICAgIHBuZ19jb21iaW5lX3JvdygpIGlzbid0IGJ1aWx0IG9yIHVzZWQsIGFuZCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpCi0gICAgaXMgbm90IGNhbGxlZC4KLSAgQWxsb3cgUE5HX3NSR0JfUFJPRklMRV9DSEVDS0lORyA9ICgtMSkgdG8gbWVhbiBubyBzUkdCIHByb2ZpbGUgY2hlY2tpbmcuCi0KLVZlcnNpb24gMS42LjExYmV0YTA1IFtBcHJpbCAyNiwgMjAxNF0KLSAgRG8gbm90IHJlamVjdCBJQ0MgVjIgcHJvZmlsZXMgdGhhdCBsYWNrIHBhZGRpbmcgKEthaS1Vd2UgQmVocm1hbm4pLgotICBSZWxvY2F0ZWQgY2xvc2luZyBicmFja2V0IG9mIHRoZSBzUkdCIHByb2ZpbGUgdGVzdCBsb29wIHRvIGF2b2lkIGdldHRpbmcKLSAgICAiTm90IHJlY29nbml6aW5nIGtub3duIHNSR0IgcHJvZmlsZSB0aGF0IGhhcyBiZWVuIGVkaXRlZCIgd2FybmluZyBmb3IKLSAgICBJQ0MgVjIgcHJvZmlsZXMgdGhhdCBsYWNrIHRoZSBNRDUgc2lnbmF0dXJlIGluIHRoZSBwcm9maWxlIGhlYWRlci4KLQotVmVyc2lvbiAxLjYuMTFiZXRhMDYgW01heSAxOSwgMjAxNF0KLSAgQWRkZWQgUE5HX1NLSVBfc1JHQl9DSEVDS19QUk9GSUxFIGNob2ljZSBmb3IgcG5nX3NldF9vcHRpb24oKS4KLQotVmVyc2lvbiAxLjYuMTFyYzAxIFtNYXkgMjcsIDIwMTRdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjExcmMwMiBbSnVuZSAzLCAyMDE0XQotICBUZXN0IFpMSUJfVkVSTlVNIGluc3RlYWQgb2YgUE5HX1pMSUJfVkVSTlVNIGluIGNvbnRyaWIvdG9vbHMvcG5nZml4LmMKLQotVmVyc2lvbiAxLjYuMTEgW0p1bmUgNSwgMjAxNF0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMTJyYzAxIFtKdW5lIDYsIDIwMTRdCi0gIFJlbG9jYXRlZCBuZXcgY29kZSBmcm9tIDEuNi4xMWJldGEwNiBpbiBwbmcuYyB0byBhIHBvaW50IGFmdGVyIHRoZQotICAgIGRlY2xhcmF0aW9ucyAoTWF4IFN0ZXBpbikuCi0KLVZlcnNpb24gMS42LjEycmMwMiBbSnVuZSA3LCAyMDE0XQotICBDaGFuZ2VkIGZpbGUgcGVybWlzc2lvbnMgb2YgY29udHJpYi90b29scy9pbnRnYW1tYS5zaCwKLSAgICB0ZXN0LWRyaXZlciwgYW5kIGNvbXBpbGUgZnJvbSAwNjQ0IHRvIDA3NTUgKENvc21pbikuCi0KLVZlcnNpb24gMS42LjEycmMwMyBbSnVuZSA4LCAyMDE0XQotICBFbnN1cmUgIl9faGFzX2F0dHJpYnV0ZSgpIiBtYWNybyBleGlzdHMgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQgd2l0aAotICAgIG9sZCBjbGFuZyBjb21waWxlcnMgKE1hY1BvcnRzIFRpY2tldCAjNDM5MzkpLgotCi1WZXJzaW9uIDEuNi4xMiBbSnVuZSAxMiwgMjAxNF0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMTNiZXRhMDEgW0p1bHkgNCwgMjAxNF0KLSAgUXVpZXRlZCAtV3NpZ24tY29tcGFyZSBhbmQgLVdjbG9iYmVyIGNvbXBpbGVyIHdhcm5pbmdzIGluCi0gICAgY29udHJpYi9wbmdtaW51cy8qLmMKLSAgQWRkZWQgIih2b2lkKSBwbmdfcHRyOyIgd2hlcmUgbmVlZGVkIGluIGNvbnRyaWIvZ3JlZ2Jvb2sgdG8gcXVpZXQKLSAgICBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IHVudXNlZCBwb2ludGVycy4KLSAgU3BsaXQgYSBsb25nIG91dHB1dCBzdHJpbmcgaW4gY29udHJpYi9ncmVnYm9vay9ycG5nMi14LmMuCi0gIEFkZGVkICJQTkdfU0VUX09QVElPTiIgcmVxdWlyZW1lbnQgZm9yIHNSR0IgY2h1bmsgc3VwcG9ydCB0byBwbmdsaWJjb25mLmRmYSwKLSAgICBOZWVkZWQgZm9yIHdyaXRlLW9ubHkgc3VwcG9ydCAoSm9obiBCb3dsZXIpLgotICBDaGFuZ2VkICJpZiBkZWZpbmVkKF9fQVJNX05FT05fXykiIHRvCi0gICAgImlmIChkZWZpbmVkKF9fQVJNX05FT05fXykgfHwgZGVmaW5lZChfX0FSTV9ORU9OKSkiIChKYW1lcyBXdSkuCi0gIEZpeGVkIGNsYW5nIG5vLXdhcm5pbmcgYnVpbGRzOiBwbmdfZGlnaXQgd2FzIGRlZmluZWQgYnV0IG5ldmVyIHVzZWQuCi0gICAgCi1WZXJzaW9uIDEuNi4xM2JldGEwMiBbSnVseSAyMSwgMjAxNF0KLSAgRml4ZWQgYW4gaW5jb3JyZWN0IHNlcGFyYXRvciAoIi8iIHNob3VsZCBiZSAiXCIpIGluIHNjcmlwdHMvbWFrZWZpbGUudmN3aW4zMgotICAgIChidWcgcmVwb3J0IGZyb20gV29sZmdhbmcgUy4gS2VjaGVsKS4gIEJ1ZyB3YXMgaW50cm9kdWNlZCBpbiBsaWJwbmctMS42LjExLgotICAgIEFsc28gZml4ZWQgbWFrZWZpbGUuYmMzMiwgbWFrZWZpbGUuYm9yLCBtYWtlZmlsZS5tc2MsIG1ha2VmaWxlLmludGVsLCBhbmQKLSAgICBtYWtlZmlsZS50YzMgc2ltaWxhcmx5LgotCi1WZXJzaW9uIDEuNi4xM2JldGEwMyBbQXVndXN0IDMsIDIwMTRdCi0gIFJlbW92ZWQgc2NyaXB0cy9tYWtlZmlsZS5lbGYuIEl0IGhhcyBub3Qgd29ya2VkIHNpbmNlIGxpYnBuZy0xLjUuMGJldGExNAotICAgIGR1ZSB0byBlbGltaW5hdGlvbiBvZiB0aGUgUE5HX0ZVTkNUSU9OX0VYUE9SVCBhbmQgUE5HX0RBVEFfRVhQT1JUCi0gICAgZGVmaW5pdGlvbnMgZnJvbSBwbmdjb25mLmguCi0gIEVuc3VyZSB0aGF0IENNYWtlTGlzdHMudHh0IG1ha2VzIHRoZSB0YXJnZXQgImxpYiIgZGlyZWN0b3J5IGJlZm9yZSBtYWtpbmcKLSAgICBzeW1ib2xpYyBsaW5rIGludG8gaXQgKFNvdXJjZUZvcmdlIGJ1ZyByZXBvcnQgIzIyNiBieSBSb2xmIFRpbW1lcm1hbnMpLgotCi1WZXJzaW9uIDEuNi4xM2JldGEwNCBbQXVndXN0IDgsIDIwMTRdCi0gIEFkZGVkIG9waW5pb24gdGhhdCB0aGUgRUNDTiAoRXhwb3J0IENvbnRyb2wgQ2xhc3NpZmljYXRpb24gTnVtYmVyKSBmb3IKLSAgICBsaWJwbmcgaXMgRUFSOTkgdG8gdGhlIFJFQURNRSBmaWxlLgotICBFbGltaW5hdGVkIHVzZSBvZiAiJDwiIGluIG1ha2VmaWxlIGV4cGxpY2l0IHJ1bGVzLCB3aGVuIGNvcHlpbmcKLSAgICAkUE5HTElCQ09ORl9IX1BSRUJVSUxULiAgVGhpcyBkb2VzIG5vdCB3b3JrIG9uIHNvbWUgdmVyc2lvbnMgb2YgbWFrZTsKLSAgICBidWcgaW50cm9kdWNlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTEuCi0KLVZlcnNpb24gMS42LjEzcmMwMSBbQXVndXN0IDE0LCAyMDE0XQotICBNYWRlICJjY29wdHMiIGFncmVlIHdpdGggIkNGTEFHUyIgaW4gc2NyaXB0cy9tYWtlZmlsZS5ocCogYW5kIG1ha2VmaWxlLipzdW51Ci0KLVZlcnNpb24gMS42LjEzIFtBdWd1c3QgMjEsIDIwMTRdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjE0YmV0YTAxIFtTZXB0ZW1iZXIgMTQsIDIwMTRdCi0gIEd1YXJkIHVzYWdlIG9mIHBuZ19wdHItPm9wdGlvbnMgd2l0aCAjaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVELgotICBEbyBub3QgYnVpbGQgY29udHJpYi90b29scy9wbmdmaXguYyB3aGVuIFBOR19TRVRKTVBfTk9UX1NVUFBPUlRFRCwKLSAgICB0byBhbGxvdyAibWFrZSIgdG8gY29tcGxldGUgd2l0aG91dCBzZXRqbXAgc3VwcG9ydCAoYnVnIHJlcG9ydCBieQotICAgIENsYXVkaW8gRm9udGFuYSkKLSAgQWRkICIjaW5jbHVkZSA8c2V0am1wLmg+IiB0byBjb250cmliL3Rvb2xzL3BuZ2ZpeC5jIChKb2huIEJvd2xlcikKLQotVmVyc2lvbiAxLjYuMTRiZXRhMDIgW1NlcHRlbWJlciAxOCwgMjAxNF0KLSAgVXNlIG5hbm9zbGVlcCgpIGluc3RlYWQgb2YgdXNsZWVwKCkgaW4gY29udHJpYi9ncmVnYm9vay9ycG5nMi14LmMKLSAgICBiZWNhdXNlIHVzbGVlcCgpIGlzIGRlcHJlY2F0ZWQuCi0gIERlZmluZSB1c2xlZXAoKSBpbiBjb250cmliL2dyZWdib29rL3JwbmcyLXguYyBpZiBub3QgYWxyZWFkeSBkZWZpbmVkCi0gICAgaW4gdW5pc3RkLmggYW5kIG5hbm9zbGVlcCgpIGlzIG5vdCBhdmFpbGFibGU7IGZpeGVzIGVycm9yIGludHJvZHVjZWQKLSAgICBpbiBsaWJwbmctMS42LjEzLgotICBEaXNhYmxlIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBwbmd2YWxpZC5jIHdoZW4KLSAgICBQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQyBpcyBub3Qgc3VwcG9ydGVkIChidWcgcmVwb3J0IGJ5ICJ6b290dXMKLSAgICBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiKS4KLQotVmVyc2lvbiAxLjYuMTRiZXRhMDMgW1NlcHRlbWJlciAxOSwgMjAxNF0KLSAgRGVmaW5lIEZFX0RJVkJZWkVSTywgRkVfSU5WQUxJRCwgYW5kIEZFX09WRVJGTE9XIGluIHBuZ3ZhbGlkLmMgaWYgbm90Ci0gICAgYWxyZWFkeSBkZWZpbmVkLiAgUmV2ZXJ0IGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBwbmd2YWxpZC5jCi0gICAgdG8gdmVyc2lvbiAxLjYuMTRiZXRhMDEgYmVoYXZpb3IuCi0KLVZlcnNpb24gMS42LjE0YmV0YTA0IFtTZXB0ZW1iZXIgMjcsIDIwMTRdCi0gIEZpeGVkIGluY29ycmVjdCBoYW5kbGluZyBvZiB0aGUgaVRYdCBjb21wcmVzc2lvbiBmbGFnIGluIHBuZ3J1dGlsLmMKLSAgICAoYnVnIHJlcG9ydCBieSBTaHVuc2FrdSBIaXJhdGEpLiAgQnVnIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjYuMC4KLQotVmVyc2lvbiAxLjYuMTRiZXRhMDUgW09jdG9iZXIgMSwgMjAxNF0KLSAgQWRkZWQgIm9wdGlvbiBSRUFEX2lDQ1AgZW5hYmxlcyBSRUFEX0NPTVBSRVNTRURfVEVYVCIgdG8gcG5nbGliY29uZi5kZmEKLQotVmVyc2lvbiAxLjYuMTRiZXRhMDYgW09jdG9iZXIgNSwgMjAxNF0KLSAgUmVtb3ZlZCB1bnVzZWQgInRleHRfbGVuIiBwYXJhbWV0ZXIgZnJvbSBwcml2YXRlIGZ1bmN0aW9uIHBuZ193cml0ZV96VFh0KCkuCi0gIENvbmRpdGlvbmFsbHkgY29tcGlsZSBzb21lIGNvZGUgaW4gcG5nX2RlZmxhdGVfY2xhaW0oKSwgd2hlbgotICAgIFBOR19XQVJOSU5HU19TVVBQT1JURUQgYW5kIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRCBhcmUgZGlzYWJsZWQuCi0gIFJlcGxhY2VkIHJlcGVhdGVkIGNvZGUgaW4gcG5ncHJlYWQuYyB3aXRoIFBOR19QVVNIX1NBVkVfQlVGRkVSX0lGX0ZVTEwuCi0gIEFkZGVkICJjaHVuayBpVFh0IGVuYWJsZXMgVEVYVCIgYW5kICJjaHVuayB6VFh0IGVuYWJsZXMgVEVYVCIKLSAgICB0byBwbmdsaWJjb25mLmRmYS4KLSAgUmVtb3ZlZCAib3B0aW9uIFJFQURfQ09NUFJFU1NFRF9URVhUIGVuYWJsZXMgUkVBRF9URVhUIiBmcm9tIHBuZ2xpYmNvbmYuZGZhLAotICAgIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gY29uZmlndXJlIGEgbGlicG5nIHRoYXQgc3VwcG9ydHMgaUNDUCBidXQgbm90IFRFWFQuCi0KLVZlcnNpb24gMS42LjE0YmV0YTA3IFtPY3RvYmVyIDcsIDIwMTRdCi0gIFJlbW92ZWQgIm9wdGlvbiBXUklURV9DT01QUkVTU0VEX1RFWFQgZW5hYmxlcyBXUklURV9URVhUIiBmcm9tIHBuZ2xpYmNvbmYuZGZhCi0gIE9ubHkgbWFyayB0ZXh0IGNodW5rcyBhcyB3cml0dGVuIGFmdGVyIHN1Y2Nlc3NmdWxseSB3cml0aW5nIHRoZW0uCi0KLVZlcnNpb24gMS42LjE0cmMwMSBbT2N0b2JlciAxNSwgMjAxNF0KLSAgRml4ZWQgc29tZSB0eXBvcyBpbiBjb21tZW50cy4KLQotVmVyc2lvbiAxLjYuMTRyYzAyIFtPY3RvYmVyIDE3LCAyMDE0XQotICBDaGFuZ2VkIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkgdG8gcG5nX2NvbnZlcnRfdG9fcmZjXzExMjNfYnVmZmVyKCkKLSAgICBpbiB0aGUgbWFudWFsLCB0byByZWZsZWN0IHRoZSBjaGFuZ2UgbWFkZSBpbiBsaWJwbmctMS42LjAuCi0gIFVwZGF0ZWQgUkVBRE1FIGZpbGUgdG8gZXhwbGFpbiB0aGF0IGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHBuZ19zdHJ1Y3QKLSAgICBhbmQgaW5mb19zdHJ1Y3QgbWVtYmVycyBoYXMgbm90IGJlZW4gcGVybWl0dGVkIHNpbmNlIGxpYnBuZy0xLjUuMC4KLQotVmVyc2lvbiAxLjYuMTQgW09jdG9iZXIgMjMsIDIwMTRdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjE1YmV0YTAxIFtPY3RvYmVyIDI5LCAyMDE0XQotICBDaGFuZ2VkICJpZiAoIXgpIiB0byAiaWYgKHggPT0gMCkiIGFuZCAiaWYgKHgpIiB0byAiaWYgKHggIT0gMCkiCi0gIFNpbXBsaWZpZWQgcG5nX2ZyZWVfZGF0YSgpLgotICBBZGRlZCBtaXNzaW5nICJwdHIgPSBOVUxMIiBhZnRlciBzb21lIGluc3RhbmNlcyBvZiBwbmdfZnJlZSgpLgotCi1WZXJzaW9uIDEuNi4xNWJldGEwMiBbTm92ZW1iZXIgMSwgMjAxNF0KLSAgQ2hhbmdlZCByZW1haW5pbmcgImlmICgheCkiIHRvICJpZiAoeCA9PSAwKSIgYW5kICJpZiAoeCkiIHRvICJpZiAoeCAhPSAwKSIKLQotVmVyc2lvbiAxLjYuMTViZXRhMDMgW05vdmVtYmVyIDMsIDIwMTRdCi0gIEFkZGVkIFBOR19VU0VfQVJNX05FT04gY29uZmlndXJhdGlvbiBmbGFnIChNYXJjaW4gSnVzemtpZXdpY3opLgotCi1WZXJzaW9uIDEuNi4xNWJldGEwNCBbTm92ZW1iZXIgNCwgMjAxNF0KLSAgUmVtb3ZlZCBuZXcgUE5HX1VTRV9BUk1fTkVPTiBjb25maWd1cmF0aW9uIGZsYWcgYW5kIG1hZGUgYSBvbmUtbGluZQotICAgIHJldmlzaW9uIHRvIGNvbmZpZ3VyZS5hYyB0byBzdXBwb3J0IEFSTSBvbiBhYXJjaDY0IGluc3RlYWQgKEpvaG4gQm93bGVyKS4KLQotVmVyc2lvbiAxLjYuMTViZXRhMDUgW05vdmVtYmVyIDUsIDIwMTRdCi0gIFVzZSBwbmdfZ2V0X2xpYnBuZ192ZXIoTlVMTCkgaW5zdGVhZCBvZiBQTkdfTElCUE5HX1ZFUl9TVFJJTkcgaW4KLSAgICBleGFtcGxlLmMsIHBuZ3Rlc3QuYywgYW5kIGFwcGxpY2F0aW9ucyBpbiB0aGUgY29udHJpYiBkaXJlY3RvcnkuCi0gIEZpeGVkIGFuIG91dC1vZi1yYW5nZSByZWFkIGluIHBuZ191c2VyX3ZlcnNpb25fY2hlY2soKSAoQnVnIHJlcG9ydCBmcm9tCi0gICAgUWl4dWUgWGlhbywgQ1ZFLTIwMTUtODU0MCkuCi0gIFNpbXBsaWZpZWQgYW5kIGZ1dHVyZS1wcm9vZmVkIHBuZ191c2VyX3ZlcnNpb25fY2hlY2soKS4KLSAgRml4ZWQgR0NDIHVuc2lnbmVkIGludC0+ZmxvYXQgd2FybmluZ3MuIFZhcmlvdXMgdmVyc2lvbnMgb2YgR0NDCi0gICAgc2VlbSB0byBnZW5lcmF0ZSB3YXJuaW5ncyB3aGVuIGFuIHVuc2lnbmVkIHZhbHVlIGlzIGltcGxpY2l0bHkKLSAgICBjb252ZXJ0ZWQgdG8gZG91YmxlLiBUaGlzIGlzIHByb2JhYmx5IGEgR0NDIGJ1ZyBidXQgdGhpcyBjaGFuZ2UKLSAgICBhdm9pZHMgdGhlIGlzc3VlIGJ5IGV4cGxpY2l0bHkgY29udmVydGluZyB0byAoaW50KSB3aGVyZSBzYWZlLgotICBGcmVlIGFsbCBhbGxvY2F0ZWQgbWVtb3J5IGluIHBuZ2ltYWdlLiBUaGUgZmlsZSBidWZmZXIgY2FjaGUgd2FzIGxlZnQKLSAgICBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSwgaGFybWxlc3MgYnV0IGl0IGNhdXNlcyBtZW1vcnkKLSAgICBsZWFrIHJlcG9ydHMgZnJvbSBjbGFuZy4KLSAgRml4ZWQgYXJyYXkgc2l6ZSBjYWxjdWxhdGlvbnMgdG8gYXZvaWQgd2FybmluZ3MuIEF0IHZhcmlvdXMgcG9pbnRzCi0gICAgaW4gdGhlIGNvZGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSBpcyBjYWxjdWxhdGVkIHVzaW5nCi0gICAgc2l6ZW9mLiAgVGhpcyBnZW5lcmF0ZXMgYSBjb21waWxlIHRpbWUgY29uc3RhbnQgb2YgdHlwZSAoc2l6ZV90KSB3aGljaAotICAgIGlzIHRoZW4gdHlwaWNhbGx5IGFzc2lnbmVkIHRvIGFuICh1bnNpZ25lZCBpbnQpIG9yIChpbnQpLiBTb21lIHZlcnNpb25zCi0gICAgb2YgR0NDIG9uIDY0LWJpdCBzeXN0ZW1zIHdhcm4gYWJvdXQgdGhlIGFwcGFyZW50IG5hcnJvd2luZywgZXZlbiB0aG91Z2gKLSAgICB0aGUgc2FtZSBjb21waWxlciBkb2VzIGFwcGFyZW50bHkgZ2VuZXJhdGUgdGhlIGNvcnJlY3QsIGluLXJhbmdlLAotICAgIG51bWVyaWMgY29uc3RhbnQuICBUaGlzIGFkZHMgYXBwcm9wcmlhdGUsIHNhZmUsIGNhc3RzIHRvIG1ha2UgdGhlCi0gICAgd2FybmluZ3MgZ28gYXdheS4KLQotVmVyc2lvbiAxLjYuMTViZXRhMDYgW05vdmVtYmVyIDYsIDIwMTRdCi0gIFJldmVydGVkIHVzZSBwbmdfZ2V0X2xpYnBuZ192ZXIoTlVMTCkgaW5zdGVhZCBvZiBQTkdfTElCUE5HX1ZFUl9TVFJJTkcKLSAgICBpbiB0aGUgbWFudWFsLCBleGFtcGxlLmMsIHBuZ3Rlc3QuYywgYW5kIGFwcGxpY2F0aW9ucyBpbiB0aGUgY29udHJpYgotICAgIGRpcmVjdG9yeS4gIEl0IHdhcyBpbmNvcnJlY3QgYWR2aWNlLgotCi1WZXJzaW9uIDEuNi4xNWJldGEwNyBbTm92ZW1iZXIgNywgMjAxNF0KLSAgUmVtb3ZlZCAjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRC8jZW5kaWYgYXJvdW5kIHBuZ19wcm9kdWN0MigpOyBpdCBpcwotICAgIG5lZWRlZCBieSBwbmdfcmVjaXByb2NhbDIoKS4KLSAgQWRkZWQgI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQvI2VuZGlmIGFyb3VuZCBwbmdfbG9nMTZiaXQoKSBhbmQKLSAgICBwbmdfZG9fc3dhcCgpLgotICBDaGFuZ2VkIGFsbCAiI2VuZGlmIC8qIFBOR19GRUFUVVJFX1NVUFBPUlRFRCAqLyIgdG8gIiNlbmRpZiAvKiBGRUFUVVJFICovIgotCi1WZXJzaW9uIDEuNi4xNWJldGEwOCBbTm92ZW1iZXIgOCwgMjAxNF0KLSAgTW9yZSBob3VzZWNsZWFuaW5nIGluICouaAotCi1WZXJzaW9uIDEuNi4xNXJjMDEgW05vdmVtYmVyIDEzLCAyMDE0XQotCi1WZXJzaW9uIDEuNi4xNXJjMDIgW05vdmVtYmVyIDE0LCAyMDE0XQotICBUaGUgbWFjcm9zIHBhc3NlZCBpbiB0aGUgY29tbWFuZCBsaW5lIHRvIEJvcmxhbmQgbWFrZSB3ZXJlIGlnbm9yZWQgaWYKLSAgICBzaW1pbGFybHktbmFtZWQgbWFjcm9zIHdlcmUgYWxyZWFkeSBkZWZpbmVkIGluIG1ha2VmaWxlcy4gVGhpcyBiZWhhdmlvcgotICAgIGlzIGRpZmZlcmVudCBmcm9tIFBPU0lYIG1ha2UgYW5kIG90aGVyIG1ha2UgcHJvZ3JhbXMuICBTdXJyb3VuZCB0aGUKLSAgICBtYWNybyBkZWZpbml0aW9ucyB3aXRoIGlmbmRlZiBndWFyZHMgKENvc21pbikuCi0KLVZlcnNpb24gMS42LjE1cmMwMyBbTm92ZW1iZXIgMTYsIDIwMTRdCi0gIEFkZGVkICItRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiB0byBDRkxBR1MgaW4gc2NyaXB0cy9tYWtlZmlsZS52Y3dpbjMyLgotICBSZW1vdmVkIHRoZSBvYnNvbGV0ZSAkQVJDSCB2YXJpYWJsZSBmcm9tIHNjcmlwdHMvbWFrZWZpbGUuZGFyd2luLgotCi1WZXJzaW9uIDEuNi4xNSBbTm92ZW1iZXIgMjAsIDIwMTRdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjE2YmV0YTAxIFtEZWNlbWJlciAxNCwgMjAxNF0KLSAgQWRkZWQgIi5hbGlnbiAyIiB0byBhcm0vZmlsdGVyX25lb24uUyB0byBzdXBwb3J0IG9sZCBHQVMgYXNzZW1ibGVycyB0aGF0Ci0gICAgZG9uJ3QgZG8gYWxpZ25tZW50IGNvcnJlY3RseS4KLSAgUmV2aXNlZCBNYWtlZmlsZS5hbSBhbmQgc2NyaXB0cy9zeW1ib2xzLmRmbiB0byB3b3JrIHdpdGggTWluR1cvTVNZUwotICAgIChCb2IgRnJpZXNlbmhhaG4pLgotCi1WZXJzaW9uIDEuNi4xNmJldGEwMiBbRGVjZW1iZXIgMTUsIDIwMTRdCi0gIFJldmlzZWQgTWFrZWZpbGUuYW0gYW5kIHNjcmlwdHMvKi5kZm4gYWdhaW4gdG8gd29yayB3aXRoIE1pbkdXL01TWVM7Ci0gICAgcmVuYW1lZCBzY3JpcHRzLyouZGZuIHRvIHNjcmlwdHMvKi5jIChKb2huIEJvd2xlcikuCi0KLVZlcnNpb24gMS42LjE2YmV0YTAzIFtEZWNlbWJlciAyMSwgMjAxNF0KLSAgUXVpZXQgYSAiY29tcGFyaXNvbiBhbHdheXMgdHJ1ZSIgd2FybmluZyBpbiBwbmdzdGVzdC5jIChKb2huIEJvd2xlcikuCi0KLVZlcnNpb24gMS42LjE2cmMwMSBbRGVjZW1iZXIgMjEsIDIwMTRdCi0gIFJlc3RvcmVkIGEgdGVzdCBvbiB3aWR0aCB0aGF0IHdhcyByZW1vdmVkIGZyb20gcG5nLmMgYXQgbGlicG5nLTEuNi45Ci0gICAgKEJ1ZyByZXBvcnQgYnkgQWxleCBFdWJhbmtzLCBDVkUtMjAxNS0wOTczKS4KLQotVmVyc2lvbiAxLjYuMTZyYzAyIFtEZWNlbWJlciAyMSwgMjAxNF0KLSAgVW5kaWQgdGhlIHVwZGF0ZSB0byBwbmdydXRpbC5jIGluIDEuNi4xNnJjMDEuCi0KLVZlcnNpb24gMS42LjE2cmMwMyBbRGVjZW1iZXIgMjEsIDIwMTRdCi0gIEZpeGVkIGFuIG92ZXJmbG93IGluIHBuZ19jb21iaW5lX3JvdygpIHdpdGggdmVyeSB3aWRlIGludGVybGFjZWQgaW1hZ2VzCi0gICAgKEJ1ZyByZXBvcnQgYW5kIGZpeCBieSBKb2huIEJvd2xlciwgQ1ZFLTIwMTQtOTQ5NSkuCi0KLVZlcnNpb24gMS42LjE2IFtEZWNlbWJlciAyMiwgMjAxNF0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMTdiZXRhMDEgW0phbnVhcnkgMjksIDIwMTVdCi0gIFJlbW92ZWQgZHVwbGljYXRlIFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQgaGFuZGxpbmcgZnJvbSBwbmdjb25mLmgKLSAgQ29ycmVjdGVkIHRoZSB3aWR0aCBsaW1pdCBjYWxjdWxhdGlvbiBpbiBwbmdfY2hlY2tfSUhEUigpLgotICBSZW1vdmVkIHVzZXIgbGltaXRzIGZyb20gcG5nZml4LiBBbHNvIHBhc3MgTlVMTCBwb2ludGVycyB0bwotICAgIHBuZ19yZWFkX3JvdyB0byBza2lwIHRoZSB1bm5lY2Vzc2FyeSByb3cgZGUtaW50ZXJsYWNlIHN0dWZmLgotICBBZGRlZCB0ZXN0aW5nIG9mIHBuZ19zZXRfcGFja2luZygpIHRvIHBuZ3ZhbGlkLmMKLSAgUmVnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdHMgaW4gdGhlICoudGFyIGRpc3RyaWJ1dGlvbnMgd2l0aCBsaWJ0b29sLTIuNC40Ci0gIEltcGxlbWVudCBwcmV2aW91c2x5IHVudGVzdGVkIGNhc2VzIG9mIGxpYnBuZyB0cmFuc2Zvcm1zIGluIHBuZ3ZhbGlkLmMKLSAgRml4ZWQgYnl0ZSBvcmRlciBpbiBwbmdfZG9fcmVhZF9maWxsZXIoKSB3aXRoIDE2LWJpdCBpbnB1dC4gUHJldmlvdXNseQotICAgIHRoZSBoaWdoIGFuZCBsb3cgYnl0ZXMgb2YgdGhlIGZpbGxlciwgZnJvbSBwbmdfc2V0X2ZpbGxlcigpIG9yIGZyb20KLSAgICBwbmdfc2V0X2FkZF9hbHBoYSgpLCB3ZXJlIHJlYWQgaW4gdGhlIHdyb25nIG9yZGVyLgotICBNYWRlIHRoZSBjaGVjayBmb3Igb3V0LW9mLXJhbmdlIHZhbHVlcyBpbiBwbmdfc2V0X3RSTlMoKSBkZXRlY3QKLSAgICB2YWx1ZXMgdGhhdCBhcmUgZXhhY3RseSAyXmJpdF9kZXB0aCwgYW5kIHdvcmsgb24gMTYtYml0IHBsYXRmb3Jtcy4KLSAgTWVyZ2VkIHNvbWUgcGFydHMgb2YgbGlicG5nLTEuNi4xN2JldGEwMSBhbmQgbGlicG5nLTEuNy4wYmV0YTQ3LgotICBBZGRlZCAjaWZuZGVmIF9fQ09WRVJJVFlfXyB3aGVyZSBuZWVkZWQgaW4gcG5nLmMsIHBuZ3J1dGlsLmMgYW5kCi0gICAgcG5nc2V0LmMgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgZGVhZCBjb2RlLgotICBBZGRlZCAiJiAweGZmIiB0byBtYW55IGluc3RhbmNlcyBvZiBleHByZXNzaW9ucyB0aGF0IGFyZSB0eXBlY2FzdAotICAgIHRvIChwbmdfYnl0ZSksIHRvIGF2b2lkIENvdmVyaXR5IHdhcm5pbmdzLgotCi1WZXJzaW9uIDEuNi4xN2JldGEwMiBbRmVicnVhcnkgNywgMjAxNV0KLSAgV29yayBhcm91bmQgb25lIG1vcmUgQ292ZXJpdHktc2NhbiBkZWFkLWNvZGUgd2FybmluZy4KLSAgRG8gbm90IGJ1aWxkIHBuZ19wcm9kdWN0MigpIHdoZW4gaXQgaXMgdW51c2VkLgotCi1WZXJzaW9uIDEuNi4xN2JldGEwMyBbRmVicnVhcnkgMTcsIDIwMTVdCi0gIERpc3BsYXkgdXNlciBsaW1pdHMgaW4gdGhlIG91dHB1dCBmcm9tIHBuZ3Rlc3QuCi0gIEVsaW1pbmF0ZWQgdGhlIFBOR19TQUZFX0xJTUlUUyBtYWNybyBhbmQgcmVzdG9yZWQgdGhlIDEtbWlsbGlvbi1jb2x1bW4KLSAgICBhbmQgMS1taWxsaW9uLXJvdyBkZWZhdWx0IGxpbWl0cyBpbiBwbmdsaWJjb25mLmRmYSwgdGhhdCBjYW4gYmUgcmVzZXQKLSAgICBieSB0aGUgdXNlciBhdCBidWlsZCB0aW1lIG9yIHJ1biB0aW1lLiAgVGhpcyBwcm92aWRlcyBhIG1vcmUgcm9idXN0Ci0gICAgZGVmZW5zZSBhZ2FpbnN0IERPUyBhbmQgYXMteWV0IHVuZGlzY292ZXJlZCBvdmVyZmxvd3MuCi0KLVZlcnNpb24gMS42LjE3YmV0YTA0IFtGZWJydWFyeSAyMSwgMjAxNV0KLSAgQWRkZWQgUE5HX1dSSVRFX0NVU1RPTUlaRV9DT01QUkVTU0lPTl9TVVBQT1JURUQgbWFjcm8sIG9uIGJ5IGRlZmF1bHQuCi0gIEFsbG93IHVzZXIgdG8gY2FsbCBwbmdfZ2V0X0lIRFIoKSB3aXRoIE5VTEwgYXJndW1lbnRzIChSZXViZW4gSGF3a2lucykuCi0gIFJlYnVpbHQgY29uZmlndXJlIHNjcmlwdHMgd2l0aCBhdXRvbWFrZS0xLjE1IGFuZCBsaWJ0b29sLTIuNC42Ci0KLVZlcnNpb24gMS42LjE3YmV0YTA1IFtGZWJydWFyeSAyNSwgMjAxNV0KLSAgUmVzdG9yZWQgY29tcGlsaW5nIG9mIHBuZ19yZWNpcHJvY2FsMiB3aXRoIFBOR19OT18xNkJJVC4KLQotVmVyc2lvbiAxLjYuMTdiZXRhMDYgW0ZlYnJ1YXJ5IDI3LCAyMDE1XQotICBNb3ZlZCBwbmdfc2V0X2ZpbHRlcigpIHByb3RvdHlwZSBpbnRvIGEgUE5HX1dSSVRFX1NVUFBPUlRFRCBibG9jawotICAgIG9mIHBuZy5oLgotICBBdm9pZCBydW50aW1lIGNoZWNrcyB3aGVuIGNvbnZlcnRpbmcgaW50ZWdlciB0byBwbmdfYnl0ZSB3aXRoCi0gICAgVmlzdWFsIFN0dWRpbyAoU2VyZ2V5IEtvc2FyZXZza3kpCi0KLVZlcnNpb24gMS42LjE3cmMwMSBbTWFyY2ggNCwgMjAxNV0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMTdyYzAyIFtNYXJjaCA5LCAyMDE1XQotICBSZW1vdmVkIHNvbWUgY29tbWVudHMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWQgbm90IGhhbmRsZQotICAgIHByb3Blcmx5IGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBhbmQgcG5nbGliY29uZi5oLnByZWJ1aWx0LgotICBGcmVlIHRoZSB1bmtub3duX2NodW5rcyBzdHJ1Y3R1cmUgZXZlbiB3aGVuIGl0IGNvbnRhaW5zIG5vIGRhdGEuCi0KLVZlcnNpb24gMS42LjE3cmMwMyBbTWFyY2ggMTIsIDIwMTVdCi0gIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQgdG8gYWRkIE9TWCBmcmFtZXdvcmssIGNoYW5nZSBZRVMvTk8gdG8gT04vT0ZGCi0gICAgZm9yIGNvbnNpc3RlbmN5LCBhbmQgcmVtb3ZlIHNvbWUgdXNlbGVzcyB0ZXN0cyAoQWxleGV5IFBldHJ1Y2hpaykuCi0KLVZlcnNpb24gMS42LjE3cmMwNCBbTWFyY2ggMTYsIDIwMTVdCi0gIFJlbW92ZSBwbmdsaWJjb25mLmgsIHBuZ2xpYmNvbmYuYywgYW5kIHBuZ2xpYmNvbmYub3V0IGluc3RlYWQgb2YKLSAgICBwbmdsaWJjb25mLiogaW4gIm1ha2UgY2xlYW4iIChDb3NtaW4pLgotICBGaXggYnVnIGluIGNhbGN1bGF0aW9uIG9mIG1heGJpdHMsIGluIHBuZ193cml0ZV9zQklULCBpbnRyb2R1Y2VkCi0gICAgaW4gbGlicG5nLTEuNi4xN2JldGEwMSAoSm9obiBCb3dsZXIpLgotCi1WZXJzaW9uIDEuNi4xN3JjMDUgW01hcmNoIDIxLCAyMDE1XQotICBEZWZpbmUgUE5HX0ZJTFRFUl8qIGFuZCBQTkdfRklMVEVSX1ZBTFVFXyogaW4gcG5nLmggZXZlbiB3aGVuIFdSSVRFCi0gICAgaXMgbm90IHN1cHBvcnRlZCAoSm9obiBCb3dsZXIpLiAgVGhpcyBmaXhlcyBhbiBlcnJvciBpbnRyb2R1Y2VkIGluCi0gICAgbGlicG5nLTEuNi4xN2JldGEwNi4KLSAgUmV2ZXJ0ZWQgIiYgMHhmZiIgYWRkaXRpb25zIG9mIHZlcnNpb24gMS42LjE3YmV0YTAxLiBMaWJwbmcgcGFzc2VzCi0gICAgdGhlIENvdmVyaXR5IHNjYW4gd2l0aG91dCB0aGVtLgotCi1WZXJzaW9uIDEuNi4xN3JjMDYgW01hcmNoIDIzLCAyMDE1XQotICBSZW1vdmUgcG5nbGliY29uZi5kZm4gYW5kIHBuZ2xpYmNvbmYucHJlIHdpdGggIm1ha2UgY2xlYW4iLgotICBSZWZvcm1hdHRlZCBzb21lICImMHhmZiIgaW5zdGFuY2VzIHRvICImIDB4ZmYiLgotICBGaXhlZCBzaW1wbGlmaWVkIDgtYml0LWxpbmVhciB0byBzUkdCIGFscGhhLiBUaGUgY2FsY3VsYXRlZCBhbHBoYQotICAgIHZhbHVlIHdhcyB3cm9uZy4gIEl0J3Mgbm90IGNsZWFyIGlmIHRoaXMgYWZmZWN0ZWQgdGhlIGZpbmFsIHN0b3JlZAotICAgIHZhbHVlOyBpbiB0aGUgb2J2aW91cyBjb2RlIHBhdGggdGhlIHVwcGVyIGFuZCBsb3dlciA4LWJpdHMgb2YgdGhlCi0gICAgYWxwaGEgdmFsdWUgd2VyZSBpZGVudGljYWwgYW5kIHRoZSBhbHBoYSB3YXMgdHJ1bmNhdGVkIHRvIDgtYml0cwotICAgIHJhdGhlciB0aGFuIGRpdmlkaW5nIGJ5IDI1NyAoSm9obiBCb3dsZXIpLgotCi1WZXJzaW9uIDEuNi4xNyBbTWFyY2ggMjYsIDIwMTVdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjE4YmV0YTAxIFtBcHJpbCAxLCAyMDE1XQotICBSZW1vdmVkIFBOR19TRVRfQ0hVTktfW0NBQ0hFfE1BTExPQ11fTElNSVRfU1VQUE9SVEVEIG1hY3Jvcy4gIFRoZXkKLSAgICBoYXZlIGJlZW4gY29tYmluZWQgd2l0aCBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRCAocmVzb2x2ZXMKLSAgICBidWcgcmVwb3J0IGJ5IEFuZHJldyBDaHVyY2gpLgotICBGaXhlZCByZ2JfdG9fZ3JheSBjaGVja3MgYW5kIGFkZGVkIHRSTlMgY2hlY2tzIHRvIHBuZ3ZhbGlkLmMuICBUaGlzCi0gICAgZml4ZXMgc29tZSBhcml0aG1ldGljIGVycm9ycyB0aGF0IGNhdXNlZCBzb21lIHRlc3RzIHRvIGZhaWwgb24KLSAgICBzb21lIDMyLWJpdCBwbGF0Zm9ybXMgKEJ1ZyByZXBvcnRzIGJ5IFBldGVyIEJyZWl0ZW5sb2huZXIgW2k2ODZdCi0gICAgYW5kIFBldHIgR2FqZG9zIFtpNTg2XSkuCi0KLVZlcnNpb24gMS42LjE4YmV0YTAyIFtBcHJpbCAyNiwgMjAxNV0KLSAgU3VwcHJlc3NlZCBzb21lIHdhcm5pbmdzIGZyb20gdGhlIEJvcmxhbmQgQysrIDUuNS4xLzUuODIgY29tcGlsZXIKLSAgICAoQnVnIHJlcG9ydCBieSBWaWt0b3IgU3pha2F0cykuCi0KLVZlcnNpb24gMS42LjE4YmV0YTAzIFtNYXkgNiwgMjAxNV0KLSAgUmVwbGFjZWQgInVuZXhwZWN0ZWQiIHdpdGggYW4gaW50ZWdlciAoMHhhYmFkY2ExMSkgaW4gcG5nc2V0LmMKLSAgICB3aGVyZSBhIGxvbmcgd2FzIGV4cGVjdGVkLCB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBQTkdfREVCVUcgPiAxLgotICBBZGRlZCBjb250cmliL2V4YW1wbGVzL3NpbXBsZW92ZXIuYywgdG8gZGVtb25zdHJhdGUgaG93IHRvIGhhbmRsZQotICAgIGFscGhhIGNvbXBvc2l0aW5nIG9mIG11bHRpcGxlIGltYWdlcywgdXNpbmcgdGhlICJzaW1wbGlmaWVkIEFQSSIKLSAgICBhbmQgYW4gZXhhbXBsZSBQTkcgZ2VuZXJhdGlvbiB0b29sLCBjb250cmliL2V4YW1wbGVzL2dlbnBuZy5jCi0gICAgKEpvaG4gQm93bGVyKS4KLQotVmVyc2lvbiAxLjYuMThiZXRhMDQgW01heSAyMCwgMjAxNV0KLSAgUE5HX1JFTEVBU0VfQlVJTEQgcmVwbGFjZXMgdGVzdHMgd2hlcmUgdGhlIGNvZGUgZGVwZW5kZWQgb24gdGhlIGJ1aWxkIGJhc2UKLSAgICB0eXBlIGFuZCBjYW4gYmUgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbGxvd2luZyB0ZXN0aW5nIGluIGJldGEKLSAgICBidWlsZHMgKEpvaG4gQm93bGVyKS4KLSAgQXZvaWQgQ292ZXJpdHkgaXNzdWUgODA4NTggKFJFVkVSU0UgTlVMTCkgaW4gcG5ndGVzdC5jIFBOR19ERUJVRyBidWlsZHMuCi0gIEF2b2lkIGEgaGFybWxlc3MgcG90ZW50aWFsIGludGVnZXIgb3ZlcmZsb3cgaW4gcG5nX1hZWl9mcm9tX3h5KCkgKEJ1ZwotICAgIHJlcG9ydCBmcm9tIENocmlzdG9waGVyIEZlcnJpcykuCi0KLVZlcnNpb24gMS42LjE4YmV0YTA1IFtNYXkgMzEsIDIwMTVdCi0gIEJhY2twb3J0IGZpbHRlciBzZWxlY3Rpb24gY29kZSBmcm9tIGxpYnBuZy0xLjcuMGJldGE1MSwgdG8gY29tYmluZQotICAgIHN1Yl9yb3csIHVwX3JvdywgYXZnX3JvdywgYW5kIHBhZXRoX3JvdyBpbnRvIHRyeV9yb3cgYW5kIHRzdF9yb3cuCi0gIENoYW5nZWQgcG5nX3ZvaWRjYXN0KCksIGV0Yy4sIHRvIHZvaWRjYXN0KCksIGV0Yy4sIGluIGNvbnRyaWIvdG9vbHMvcG5nZml4LmMKLSAgICB0byBhdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgbGlicG5nIHByaXZhdGUgbWFjcm9zLgotICBGaXhlZCBvbGQgY3V0JnBhc3RlIGJ1ZyBpbiB0aGUgd2VpZ2h0ZWQgZmlsdGVyIHNlbGVjdGlvbiBjb2RlIGluCi0gICAgcG5nd3V0aWwuYywgaW50cm9kdWNlZCBpbiBsaWJwbmctMC45NSwgTWFyY2ggMTk5Ny4KLQotVmVyc2lvbiAxLjYuMThiZXRhMDYgW0p1bmUgMSwgMjAxNV0KLSAgUmVtb3ZlZCBXUklURV9XRUlHSFRFRF9GSUxURVJFRCBjb2RlLCB0byBzYXZlIGEgZmV3IGtieXRlcyBvZiB0aGUKLSAgICBjb21waWxlZCBsaWJyYXJ5IHNpemUuIEl0IG5ldmVyIHdvcmtlZCBwcm9wZXJseSBhbmQgYXMgZmFyIGFzIHdlIGNhbgotICAgIHRlbGwsIG5vIG9uZSB1c2VzIGl0LiBUaGUgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcygpIGFuZAotICAgIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3NfZml4ZWQoKSBBUElzIGFyZSByZXRhaW5lZCBidXQgZGVwcmVjYXRlZAotICAgIGFuZCBkbyBub3RoaW5nLgotCi1WZXJzaW9uIDEuNi4xOGJldGEwNyBbSnVuZSA2LCAyMDE1XQotICBSZW1vdmVkIG5vbi13b3JraW5nIHByb2dyZXNzaXZlIHJlYWRlciAnc2tpcCcgZnVuY3Rpb24uIFRoaXMKLSAgICBmdW5jdGlvbiBoYXMgYXBwYXJlbnRseSBuZXZlciBiZWVuIHVzZWQuIEl0IHdhcyBpbXBsZW1lbnRlZAotICAgIHRvIHN1cHBvcnQgYmFjay1kb29yIG1vZGlmaWNhdGlvbiBvZiBwbmdfc3RydWN0IGluIGxpYnBuZy0xLjQueAotICAgIGJ1dCAoYmVjYXVzZSBpdCBkb2VzIG5vdGhpbmcgYW5kIGNhbm5vdCBkbyBhbnl0aGluZykgd2FzIGFwcGFyZW50bHkKLSAgICBuZXZlciB0ZXN0ZWQgKEpvaG4gQm93bGVyKS4KLSAgRml4ZWQgY2V4Y2VwdC5oIGluIHdoaWNoIEdDQyA1IG5vdyByZXBvcnRzIHRoYXQgb25lIG9mIHRoZSBhdXRvCi0gICAgdmFyaWFibGVzIGluIHRoZSBUcnkgbWFjcm8gbmVlZHMgdG8gYmUgdm9sYXRpbGUgdG8gcHJldmVudCB2YWx1ZQotICAgIGJlaW5nIGxvc3Qgb3ZlciB0aGUgc2V0am1wIChKb2huIEJvd2xlcikuCi0gIEZpeGVkIE5PX1dSSVRFX0ZJTFRFUiBhbmQgLVdjb252ZXJzaW9uIGJ1aWxkIGJyZWFrcyAoSm9obiBCb3dsZXIpLgotICBGaXggZysrIGJ1aWxkIGJyZWFrcyAoSm9obiBCb3dsZXIpLgotICBRdWlldGVkIHNvbWUgQ292ZXJpdHkgaXNzdWVzIGluIHBuZ2ZpeC5jLCBwbmctZml4LWl0eHQuYywgcG5ndmFsaWQuYywKLSAgICBwbmdzdGVzdC5jLCBhbmQgcG5naW1hZ2UuYy4gTW9zdCBzZWVtIGhhcm1sZXNzLCBidXQgcG5nLWZpeC1pdHh0Ci0gICAgd291bGQgb25seSB3b3JrIHdpdGggaVRYdCBjaHVua3Mgd2l0aCBsZW5ndGggMjU1IG9yIGxlc3MuCi0gIEFkZGVkICNpZmRlZidzIHRvIGNvbnRyaWIvZXhhbXBsZXMgcHJvZ3JhbXMgc28gcGVvcGxlIGRvbid0IHRyeQotICAgIHRvIGNvbXBpbGUgdGhlbSB3aXRob3V0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIHN1cHBvcnQgZW5hYmxlZAotICAgIChzdWdnZXN0ZWQgYnkgRmxhdmlvIE1lZGVpcm9zKS4KLQotVmVyc2lvbiAxLjYuMThiZXRhMDggW0p1bmUgMzAsIDIwMTVdCi0gIEVsaW1pbmF0ZWQgdGhlIGZpbmFsIHR3byBDb3Zlcml0eSBkZWZlY3RzIChpbnNlY3VyZSB0ZW1wb3JhcnkgZmlsZQotICAgIGhhbmRsaW5nIGluIGNvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QuYzsgcG9zc2libGUgb3ZlcmZsb3cgb2YKLSAgICB1bnNpZ25lZCBjaGFyIGluIGNvbnRyaWIvdG9vbHMvcG5nLWZpeC1pdHh0LmMpLiBUbyB1c2UgdGhlICJzZWN1cmUiCi0gICAgZmlsZSBoYW5kbGluZywgZGVmaW5lIFBOR19VU0VfTUtTVEVNUCwgb3RoZXJ3aXNlICJ0bXBmaWxlKCkiIHdpbGwKLSAgICBiZSB1c2VkLgotICBSZW1vdmVkIHNvbWUgdW51c2VkIFdFSUdIVEVEX0ZJTFRFUiBtYWNyb3MgZnJvbSBwbmcuaCBhbmQgcG5nc3RydWN0LmgKLQotVmVyc2lvbiAxLjYuMThiZXRhMDkgW0p1bHkgNSwgMjAxNV0KLSAgUmVtb3ZlZCBzb21lIHVzZWxlc3MgdHlwZWNhc3RzIGZyb20gY29udHJpYi90b29scy9wbmctZml4LWl0eHQuYwotICBGaXhlZCBhIG5ldyBzaWduZWQtdW5zaWduZWQgY29tcGFyaXNvbiBpbiBwbmdydHJhbi5jIChNYXggU3RlcGluKS4KLSAgUmVwbGFjZWQgYXJiaXRyYXJ5IHVzZSBvZiAnZXh0ZXJuJyB3aXRoICNkZWZpbmUgUE5HX0xJTktBR0VfKi4gIFRvCi0gICAgcHJlc2VydmUgQVBJIGNvbXBhdGliaWxpdHksIHRoZSBuZXcgZGVmaW5lcyBhbGwgZGVmYXVsdCB0byAiZXh0ZXJuIgotICAgIChyZXF1ZXN0ZWQgYnkgSmFuIE5panRtYW5zKS4KLQotVmVyc2lvbiAxLjYuMThyYzAxIFtKdWx5IDksIDIwMTVdCi0gIEJlbGF0ZWRseSBhZGRlZCBNYW5zIFJ1bGxnYXJkIGFuZCBKYW1lcyBZdSB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcKLSAgICBBdXRob3JzLgotCi1WZXJzaW9uIDEuNi4xOHJjMDIgW0p1bHkgMTIsIDIwMTVdCi0gIFJlc3RvcmVkIHVudXNlZCBGSUxURVJfSEVVUklTVElDIG1hY3JvcyByZW1vdmVkIGF0IGxpYnBuZy0xLjYuMThiZXRhMDgKLSAgICB0byBwbmcuaCB0byBhdm9pZCBjb21wYXRpYmlsaXR5IHdhcm5pbmdzLgotCi1WZXJzaW9uIDEuNi4xOHJjMDMgW0p1bHkgMTUsIDIwMTVdCi0gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIG1hbiBwYWdlCi0KLVZlcnNpb24gMS42LjE4IFtKdWx5IDIzLCAyMDE1XQotICBObyBjaGFuZ2VzLgotCi1WZXJzaW9uIDEuNi4xOWJldGEwMSBbSnVseSAzMCwgMjAxNV0KLSAgVXBkYXRlZCBvYnNvbGV0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2ltcGxpZmllZCBBUEkgbWFjcm9zIGluIHRoZQotICAgIG1hbnVhbCBwYWdlcyAoQnVnIHJlcG9ydCBieSBBcmMgUmlsZXkpLgotICBBdm9pZCBwb3RlbnRpYWxseSBkZXJlZmVyZW5jaW5nIE5VTEwgaW5mb19wdHIgaW4gcG5nX2luZm9faW5pdF8zKCkuCi0gIFJlYXJyYW5nZWQgcG5nLmggdG8gcHV0IHRoZSBtYWpvciBzZWN0aW9ucyBpbiB0aGUgc2FtZSBvcmRlciBhcwotICAgIGluIGxpYnBuZzE3LgotICBFbGltaW5hdGVkIHVudXNlZCBQTkdfQ09TVF9TSElGVCwgUE5HX1dFSUdIVF9TSElGVCwgUE5HX0NPU1RfRkFDVE9SLCBhbmQKLSAgICBQTkdfV0VJR0hUX0ZBQ1RPUiBtYWNyb3MuCi0gIFN1cHByZXNzZWQgc29tZSB3YXJuaW5ncyBmcm9tIHRoZSBCb3JsYW5kIEMrKyA1LjUuMS81LjgyIGNvbXBpbGVyCi0gICAgKEJ1ZyByZXBvcnQgYnkgVmlrdG9yIFN6YWthdHMpLiAgU2V2ZXJhbCB3YXJuaW5ncyByZW1haW4gYW5kIGFyZQotICAgIHVuYXZvaWRhYmxlLCB3aGVyZSB3ZSB0ZXN0IGZvciBvdmVyZmxvdy4KLSAgRml4ZWQgcG90ZW50aWFsIGxlYWsgb2YgcG5nX3BpeGVscyBpbiBjb250cmliL3BuZ21pbnVzL3BubTJwbmcuYwotICBGaXhlZCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGluIGNvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jCi0KLVZlcnNpb24gMS42LjE5YmV0YTAyIFtBdWd1c3QgMTksIDIwMTVdCi0gIE1vdmVkIGNvbmZpZy5oLmlufiBmcm9tIHRoZSAibGlicG5nX2F1dG90b29sc19maWxlcyIgbGlzdCB0byB0aGUKLSAgICAibGlicG5nX2F1dG90b29sc19leHRyYSIgbGlzdCBpbiBhdXRvZ2VuLnNoIGJlY2F1c2UgaXQgd2FzIGNhdXNpbmcgYQotICAgIGZhbHNlIHBvc2l0aXZlIGZvciBtaXNzaW5nIGZpbGVzIChidWcgcmVwb3J0IGJ5IFJvYmVydCBDLiBTZWFjb3JkKS4KLSAgUmVtb3ZlZCB1bnJlYWNoYWJsZSAiYnJlYWsiIHN0YXRlbWVudHMgaW4gcG5nLmMsIHBuZ3JlYWQuYywgYW5kIHBuZ3J0cmFuLmMKLSAgICB0byBzdXBwcmVzcyBjbGFuZyB3YXJuaW5ncyAoQnVnIHJlcG9ydCBieSBWaWt0b3IgU3pha2F0cykuCi0gIEZpeGVkIHNvbWUgYmFkIGxpbmtzIGluIHRoZSBtYW4gcGFnZS4KLSAgQ2hhbmdlZCAibiBiaXQiIHRvICJuLWJpdCIgaW4gY29tbWVudHMuCi0gIEFkZGVkIHNpZ25lZC91bnNpZ25lZCAxNi1iaXQgc2FmZXR5IG5ldC4gVGhpcyByZW1vdmVzIHRoZSBkdWJpb3VzCi0gICAgMHg4MDAwIGZsYWcgZGVmaW5pdGlvbnMgb24gMTYtYml0IHN5c3RlbXMuIFRoZXkgYXJlbid0IHN1cHBvcnRlZAotICAgIHlldCB0aGUgZGVmcyAqcHJvYmFibHkqIHdvcmssIGhvd2V2ZXIgaXQgc2VlbXMgbXVjaCBzYWZlciB0byBkbyB0aGlzCi0gICAgYW5kIGJlIGFkdmlzZWQgaWYgYW55b25lLCBjb250cmFyeSB0byBhZHZpY2UsIGlzIGJ1aWxkaW5nIGxpYnBuZyAxLjYKLSAgICBvbiBhIDE2LWJpdCBzeXN0ZW0uIEl0IGFsc28gYWRkcyBiYWNrIHZhcmlvdXMgc3dpdGNoIGRlZmF1bHQgY2xhdXNlcwotICAgIGZvciBHQ0M7IEdDQyBlcnJvcnMgb3V0IGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50ICh3aXRoIGFuIGFwcHJvcHJpYXRlbHkKLSAgICBoaWdoIGxldmVsIG9mIHdhcm5pbmdzKS4KLSAgU2FmZWx5IGNvbnZlcnQgbnVtX2J5dGVzIHRvIGEgcG5nX2J5dGUgaW4gcG5nX3NldF9zaWdfYnl0ZXMoKSAoUm9iZXJ0Ci0gICAgU2VhY29yZCkuCi0gIEZpeGVkIHRoZSByZWNlbnRseSByZXBvcnRlZCAxJ3MgY29tcGxlbWVudCBzZWN1cml0eSBpc3N1ZSBieSByZXBsYWNpbmcKLSAgICB0aGUgdmFsdWUgdGhhdCBpcyBpbGxlZ2FsIGluIHRoZSBQTkcgc3BlYywgaW4gYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkCi0gICAgdmFsdWVzLCB3aXRoIDAuIElsbGVnYWwgdW5zaWduZWQgdmFsdWVzIChhbnl0aGluZyBncmVhdGVyIHRoYW4gb3IgZXF1YWwKLSAgICB0byAgMHg4MDAwMDAwMCkgY2FuIHN0aWxsIHBhc3MgdGhyb3VnaCwgYnV0IHNpbmNlIHRoZXNlIGFyZSBub3QgaWxsZWdhbAotICAgIGluIEFOU0ktQyAodW5saWtlIDB4ODAwMDAwMDAgaW4gdGhlIHNpZ25lZCBjYXNlKSB0aGUgY2hlY2tpbmcgdGhhdAotICAgIG9jY3VycyBsYXRlciBjYW4gY2F0Y2ggdGhlbSAoSm9obiBCb3dsZXIpLgotCi1WZXJzaW9uIDEuNi4xOWJldGEwMyBbU2VwdGVtYmVyIDI2LCAyMDE1XQotICBGaXhlZCBwbmdfc2F2ZV9pbnRfMzIgd2hlbiBpbnQgaXMgbm90IDIncyBjb21wbGVtZW50IChKb2huIEJvd2xlcikuCi0gIFVwZGF0ZWQgbGlicG5nMTYgd2l0aCBhbGwgdGhlIHJlY2VudCB0ZXN0IGNoYW5nZXMgZnJvbSBsaWJwbmcxNywKLSAgICBpbmNsdWRpbmcgY2hhbmdlcyB0byBwbmd2YWxpZC5jIHRvIGVuc3VyZSB0aGF0IHRoZSBvcmlnaW5hbCwKLSAgICBkaXN0cmlidXRlZCwgdmVyc2lvbiBvZiBjb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oIGNhbiBiZSB1c2VkCi0gICAgKEpvaG4gQm93bGVyKS4KLSAgcG5ndmFsaWQgY29udGFpbnMgdGhlIGNvcnJlY3Rpb24gdG8gdGhlIHVzZSBvZiBTQVZFL1NUT1JFXwotICAgIFVOS05PV05fQ0hVTktTOyBhIGJ1ZyByZXZlYWxlZCBieSBjaGFuZ2VzIGluIGxpYnBuZyAxLjcuIE1vcmUKLSAgICB0ZXN0cyBjb250YWluIHRoZSAtLXN0cmljdCBvcHRpb24gdG8gZGV0ZWN0IHdhcm5pbmdzIGFuZCB0aGUKLSAgICBwbmd2YWxpZC1zdGFuZGFyZCB0ZXN0IGhhcyBiZWVuIGNvcnJlY3RlZCBzbyB0aGF0IGl0IGRvZXMgbm90Ci0gICAgdHVybiBvbiBwcm9ncmVzc2l2ZS1yZWFkLiBUaGVyZSBpcyBhIHNlcGFyYXRlIHRlc3Qgd2hpY2ggZG9lcwotICAgIHRoYXQuIChKb2huIEJvd2xlcikKLSAgQWxzbyBtYWRlIHNvbWUgc2lnbmVkL3Vuc2lnbmVkIGZpeGVzLgotICBNYWtlIHBuZ3N0ZXN0IGVycm9yIGxpbWl0cyB2ZXJzaW9uIHNwZWNpZmljLiBTcGxpdHRpbmcgdGhlIG1hY2hpbmUKLSAgICBnZW5lcmF0ZWQgZXJyb3Igc3RydWN0cyBvdXQgdG8gYSBmaWxlIGFsbG93cyB0aGUgdmFsdWVzIHRvIGJlIHVwZGF0ZWQKLSAgICB3aXRob3V0IGNoYW5naW5nIHBuZ3N0ZXN0LmMgaXRzZWxmLiBTaW5jZSBsaWJwbmcgMS42IGFuZCAxLjcgaGF2ZQotICAgIHNsaWdodGx5IGRpZmZlcmVudCBlcnJvciBsaW1pdHMgdGhpcyBzaW1wbGlmaWVzIG1haW50ZW5hbmNlLiBUaGUKLSAgICBtYWtlcG5ncy5zaCBzY3JpcHQgaGFzIGFsc28gYmVlbiB1cGRhdGVkIHRvIG1vcmUgYWNjdXJhdGVseSByZWZsZWN0Ci0gICAgY3VycmVudCBwcm9ibGVtcyBpbiBsaWJwbmcgMS43IChKb2huIEJvd2xlcikuCi0gIEluY29ycG9yYXRlZCBuZXcgdGVzdCBQTkcgZmlsZXMgaW50byBtYWtlIGNoZWNrLiAgdGVzdHMvcG5nc3Rlc3QtKgotICAgIGFyZSBjaGFuZ2VkIHNvIHRoYXQgdGhlIG5ldyB0ZXN0IGZpbGVzIGFyZSBkaXZpZGVkIGludG8gOCBncm91cHMgYnkKLSAgICBnYW1tYSBhbmQgYWxwaGEgY2hhbm5lbC4gIFRoZXNlIHRlc3RzIGhhdmUgY29uc2lkZXJhYmx5IGJldHRlciBjb2RlCi0gICAgYW5kIHBpeGVsLXZhbHVlIGNvdmVyYWdlIHRoYW4gY29udHJpYi9wbmdzdWl0ZTsgaG93ZXZlcixjb3ZlcmFnZSBpcwotICAgIHN0aWxsIGluY29tcGxldGUgKEpvaG4gQm93bGVyKS4KLSAgUmVtb3ZlZCB0aGUgJy0tc3RyaWN0JyBpbiAxLjYgYmVjYXVzZSBvZiB0aGUgZG91YmxlLWdhbW1hLWNvcnJlY3Rpb24KLSAgICB3YXJuaW5nLCB1cGRhdGVkIHBuZ3N0ZXN0LWVycm9ycy5oIGZvciB0aGUgZXJyb3JzIGRldGVjdGVkIHdpdGggdGhlCi0gICAgbmV3IGNvbnRyaWIvdGVzdHNwbmdzIFBORyB0ZXN0IGZpbGVzIChKb2huIEJvd2xlcikuCi0KLVZlcnNpb24gMS42LjE5YmV0YTA0IFtPY3RvYmVyIDE1LCAyMDE1XQotICBXb3JrZWQgYXJvdW5kIHJnYi10by1ncmF5IGlzc3VlcyBpbiBsaWJwbmcgMS42LiAgVGhlIHByZXZpb3VzCi0gICAgYXR0ZW1wdHMgdG8gaWdub3JlIHRoZSBlcnJvcnMgaW4gdGhlIGNvZGUgYXJlbid0IHF1aXRlIGVub3VnaCB0bwotICAgIGRlYWwgd2l0aCB0aGUgJ2NoYW5uZWwgc2VsZWN0aW9uJyBlbmNvZGluZyBhZGRlZCB0byBsaWJwbmcgMS43OyBhYm9ydC4KLSAgICBwbmd2YWxpZC5jIGlzIGNoYW5nZWQgdG8gZHJvcCB0aGlzIGVuY29kaW5nIGluIHByaW9yIHZlcnNpb25zLgotICBGaXhlZCAncG93JyBtYWNyb3MgaW4gcG5ndmFsaWQuYy4gSXQgaXMgbGVnYWwgZm9yICdwb3cnIHRvIGJlIGEKLSAgICBtYWNybywgdGhlcmVmb3JlIHRoZSBhcmd1bWVudCBsaXN0IGNhbm5vdCBjb250YWluIHByZXByb2Nlc3NpbmcKLSAgICBkaXJlY3RpdmVzLiAgTWFrZSBzdXJlIHBvdyBpcyBhIGZ1bmN0aW9uIHdoZXJlIHRoaXMgaGFwcGVucy4gVGhpcyBpcwotICAgIGEgbWluaW1hbCBzYWZlIGZpeCwgdGhlIGlzc3VlIG9ubHkgYXJpc2VzIGluIG5vbi1wZXJmb3JtYW5jZS1jcml0aWNhbAotICAgIGNvZGUgKGJ1ZyByZXBvcnQgYnkgQ3VydGlzIExlYWNoLCBmaXggYnkgSm9obiBCb3dsZXIpLgotICBBZGRlZCBzUExUIHN1cHBvcnQgdG8gcG5ndGVzdC5jCi0KLVZlcnNpb24gMS42LjE5cmMwMSBbT2N0b2JlciAyMywgMjAxNV0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMTlyYzAyIFtPY3RvYmVyIDMxLCAyMDE1XQotICBQcmV2ZW50IHNldHRpbmcgb3Igd3JpdGluZyBvdmVyLWxlbmd0aCBQTFRFIGNodW5rIChDb3NtaW4gVHJ1dGEpLgotICBTaWxlbnRseSB0cnVuY2F0ZSBvdmVyLWxlbmd0aCBQTFRFIGNodW5rIHdoaWxlIHJlYWRpbmcuCi0gIExpYnBuZyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIHRoZSBvdXRwdXQgcm93Ynl0ZXMgd2hlbiB0aGUgYXBwbGljYXRpb24KLSAgICBkZWNyZWFzZWQgZWl0aGVyIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgdGhlIGJpdCBkZXB0aCAob3IgYm90aCkgaW4KLSAgICBhIHVzZXIgdHJhbnNmb3JtLiAgVGhpcyB3YXMgc2FmZTsgbGlicG5nIG92ZXJhbGxvY2F0ZWQgYnVmZmVyIHNwYWNlCi0gICAocG90ZW50aWFsbHkgYnkgcXVpdGUgYSBsb3Q7IHVwIHRvIDQgdGltZXMgdGhlIGFtb3VudCByZXF1aXJlZCkgYnV0LAotICAgZnJvbSAxLjUuNCBvbiwgcmVzdWx0ZWQgaW4gYSBwbmdfZXJyb3IgKEpvaG4gQm93bGVyKS4KLQotVmVyc2lvbiAxLjYuMTlyYzAzIFtOb3ZlbWJlciAzLCAyMDE1XQotICBGaXhlZCBzb21lIGluY29uc2VxdWVudGlhbCBjdXQtYW5kLXBhc3RlIHR5cG9zIGluIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQoKS4KLSAgQ2xhcmlmaWVkIENPUFlSSUdIVCBpbmZvcm1hdGlvbiB0byBzdGF0ZSBleHBsaWNpdGx5IHRoYXQgdmVyc2lvbnMKLSAgICBhcmUgZGVyaXZlZCBmcm9tIHByZXZpb3VzIHZlcnNpb25zLgotICBSZW1vdmVkIG11Y2ggb2YgdGhlIGxvbmcgbGlzdCBvZiBwcmV2aW91cyB2ZXJzaW9ucyBmcm9tIHBuZy5oIGFuZAotICAgIGxpYnBuZy4zLgotCi1WZXJzaW9uIDEuNi4xOXJjMDQgW05vdmVtYmVyIDUsIDIwMTVdCi0gIEZpeGVkIG5ldyBidWcgd2l0aCBDUkMgZXJyb3IgYWZ0ZXIgcmVhZGluZyBhbiBvdmVyLWxlbmd0aCBwYWxldHRlCi0gICAgKGJ1ZyByZXBvcnQgYnkgQ29zbWluIFRydXRhKSAoQ1ZFLTIwMTUtODEyNikuCi0KLVZlcnNpb24gMS42LjE5IFtOb3ZlbWJlciAxMiwgMjAxNV0KLSAgQ2xlYW5lZCB1cCBjb2Rpbmcgc3R5bGUgaW4gcG5nX2hhbmRsZV9QTFRFKCkuCi0KLVZlcnNpb24gMS42LjIwYmV0YTAxIFtOb3ZlbWJlciAyMCwgMjAxNV0KLSAgQXZvaWQgcG90ZW50aWFsIHBvaW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93IGluIHBuZ19oYW5kbGVfc1BMVCgpIGFuZAotICAgIHBuZ19oYW5kbGVfcENBTCgpIChCdWcgcmVwb3J0IGJ5IEpvaG4gUmVnZWhyKS4KLQotVmVyc2lvbiAxLjYuMjBiZXRhMDIgW05vdmVtYmVyIDIzLCAyMDE1XQotICBGaXhlZCBpbmNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgcG5nX3NldF9QTFRFKCkgdGhhdCB1c2VzIHBuZ19wdHIKLSAgICBub3QgaW5mb19wdHIsIHRoYXQgbGVmdCBwbmdfc2V0X1BMVEUoKSBvcGVuIHRvIHRoZSBDVkUtMjAxNS04MTI2Ci0gICAgdnVsbmVyYWJpbGl0eS4gIEZpeGVzIENWRS0yMDE1LTg0NzIuCi0KLVZlcnNpb24gMS42LjIwYmV0YTAzIFtOb3ZlbWJlciAyNCwgMjAxNV0KLSAgQmFja3BvcnRlZCB0ZXN0cyBmcm9tIGxpYnBuZy0xLjcuMGJldGE2OS4KLQotVmVyc2lvbiAxLjYuMjByYzAxIFtOb3ZlbWJlciAyNiwgMjAxNV0KLSAgRml4ZWQgYW4gZXJyb3IgaW4gaGFuZGxpbmcgb2YgYmFkIHpsaWIgQ01JTkZPIGZpZWxkIGluIHBuZ2ZpeCwgZm91bmQgYnkKLSAgICBBbWVyaWNhbiBGdXp6eSBMb3AsIHJlcG9ydGVkIGJ5IEJyaWFuIENhcnBlbnRlci4gIGluZmxhdGUoKSBkb2Vzbid0Ci0gICAgaW1tZWRpYXRlbHkgZmF1bHQgYSBiYWQgQ01JTkZPIGZpZWxkOyBpbnN0ZWFkIGEgJ3RvbyBmYXIgYmFjaycgZXJyb3IKLSAgICBoYXBwZW5zIGxhdGVyIChhdCBsZWFzdCBzb21lIHRpbWVzKS4gIHBuZ2ZpeCBmYWlsZWQgdG8gbGltaXQgQ01JTkZPIHRvCi0gICAgdGhlIGFsbG93ZWQgdmFsdWVzIGJ1dCB0aGVuIGFzc3VtZWQgdGhhdCB3aW5kb3dfYml0cyB3YXMgaW4gcmFuZ2UsCi0gICAgdHJpZ2dlcmluZyBhbiBhc3NlcnQuIFRoZSBidWcgaXMgbW9zdGx5IGhhcm1sZXNzOyB0aGUgUE5HIGZpbGUgY2Fubm90Ci0gICAgYmUgZml4ZWQuCi0KLVZlcnNpb24gMS42LjIwcmMwMiBbTm92ZW1iZXIgMjksIDIwMTVdCi0gIEluIGxpYnBuZyAxLjYgemxpYiBpbml0aWFsaXphdGlvbiB3YXMgY2hhbmdlZCB0byB1c2UgdGhlIHdpbmRvdyBzaXplCi0gICAgaW4gdGhlIHpsaWIgc3RyZWFtLCBub3QgYSBmaXhlZCB2YWx1ZS4gVGhpcyBjYXVzZXMgc29tZSBpbnZhbGlkIGltYWdlcywKLSAgICB3aGVyZSBDSU5GTyBpcyB0b28gbGFyZ2UsIHRvIGRpc3BsYXkgJ2NvcnJlY3RseScgaWYgdGhlIHJlc3Qgb2YgdGhlCi0gICAgZGF0YSBpcyB2YWxpZC4gIFRoaXMgcHJvdmlkZXMgYSB3b3JrYXJvdW5kIGZvciB6bGliIHZlcnNpb25zIHdoZXJlIHRoZQotICAgIGVycm9yIGFyaXNlcyAob25lcyB0aGF0IHN1cHBvcnQgdGhlIEFQSSBjaGFuZ2UgdG8gdXNlIHRoZSB3aW5kb3cgc2l6ZQotICAgIGluIHRoZSBzdHJlYW0pLgotCi1WZXJzaW9uIDEuNi4yMCBbRGVjZW1iZXIgMywgMjAxNV0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMjFiZXRhMDEgW0RlY2VtYmVyIDExLCAyMDE1XQotICBGaXhlZCBzeW50YXggIiQoY29tbWFuZCkiIGluIHRlc3RzL3BuZ3N0ZXN0IHRoYXQgc29tZSBzaGVsbHMgb3RoZXIgdGhhbgotICAgIGJhc2ggY291bGQgbm90IHBhcnNlIChCdWcgcmVwb3J0IGJ5IE5lbHNvbiBCZWViZSkuIFVzZSBgY29tbWFuZGAgaW5zdGVhZC4KLQotVmVyc2lvbiAxLjYuMjFiZXRhMDIgW0RlY2VtYmVyIDE0LCAyMDE1XQotICBNb3ZlZCBwbmdfY2hlY2tfa2V5d29yZCgpIGZyb20gcG5nd3V0aWwuYyB0byBwbmdzZXQuYwotICBSZW1vdmVkIExFL0JFIGRlcGVuZGVuY2llcyBpbiBwbmd2YWxpZCwgdG8gJ2ZpeCcgdGhlIGN1cnJlbnQgcHJvYmxlbQotICAgIGluIHRoZSBCaWdFbmRpYW4gdGVzdHMgYnkgbm90IHRlc3RpbmcgaXQsIG1ha2luZyB0aGUgQkUgY29kZSB0aGUgc2FtZSAKLSAgICBhcyB0aGUgTEUgdmVyc2lvbi4KLSAgRml4ZXMgdG8gcG5ndmFsaWQgZm9yIHZhcmlvdXMgcmVkdWNlZCBidWlsZCBjb25maWd1cmF0aW9ucyAoZWxpbWluYXRlIHVudXNlZAotICAgIHN0YXRpY3MpIGFuZCBhIGZpeCBmb3IgdGhlIGNhc2UgaW4gcmdiX3RvX2dyYXkgd2hlbiB0aGUgZGlnaXRpemUgb3B0aW9uCi0gICAgcmVkdWNlcyBncmF5bG8gdG8gMCwgcHJvZHVjaW5nIGEgbGFyZ2UgZXJyb3IuCi0KLVZlcnNpb24gMS42LjIxYmV0YTAzIFtEZWNlbWJlciAxOCwgMjAxNV0KLSAgV2lkZW5lZCB0aGUgJ2xpbWl0JyBjaGVjayBvbiB0aGUgaW50ZXJuYWxseSBjYWxjdWxhdGVkIGVycm9yIGxpbWl0cyBpbgotICAgIHRoZSAnRElHSVRJWkUnIGNhc2UgKHRoZSBjb2RlIHVzZWQgcHJpb3IgdG8gMS43IGZvciByZ2JfdG9fZ3JheSBlcnJvcgotICAgIGNoZWNrcykgYW5kIGNoYW5nZWQgdGhlIGNoZWNrIHRvIG9ubHkgb3BlcmF0ZSBpbiBub24tcmVsZWFzZSBidWlsZHMKLSAgICAoYmFzZSBidWlsZCB0eXBlIG5vdCBSQyBvciBSRUxFQVNFLikKLSAgRml4ZWQgdW5kZWZpbmVkIGJlaGF2aW9yIGluIHBuZ3ZhbGlkLmMsIHVuZGVmaW5lZCBiZWNhdXNlCi0gICAgKHBuZ19ieXRlKSA8PCBzaGlmdCBpcyB1bmRlZmluZWQgaWYgaXQgY2hhbmdlcyB0aGUgc2lnbmVkIGJpdAotICAgIChiZWNhdXNlIHBuZ19ieXRlIGlzIHByb21vdGVkIHRvIGludCkuIFRoZSBsaWJwbmcgZXhwb3J0ZWQgZnVuY3Rpb25zCi0gICAgcG5nX2dldF91aW50XzMyIGFuZCBwbmdfZ2V0X3VpbnRfMTYgaGFuZGxlIHRoaXMuIChCdWcgcmVwb3J0ZWQgYnkKLSAgICBEYXZpZCBEcnlzZGFsZSBhcyBhIHJlc3VsdCBvZiByZXBvcnRzIGZyb20gVUJTQU4gaW4gY2xhbmcgMy44KS4KLSAgVGhpcyBjaGFuZ2VzIHBuZ3ZhbGlkIHRvIHVzZSBCRSByYW5kb20gbnVtYmVyczsgdGhpcyB1c2VkIHRvIHByb2R1Y2UKLSAgICBlcnJvcnMgYnV0IHRoZXNlIHNob3VsZCBub3QgYmUgZml4ZWQgYXMgYSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjIxcmMwMSBbSmFudWFyeSA0LCAyMDE2XQotICBJbiBwcm9qZWN0cy92c3R1ZGlvLCBjb21iaW5lZCByZWFkbWUudHh0IGFuZCBXQVJOSU5HIGludG8gUkVBRE1FLnR4dAotCi1WZXJzaW9uIDEuNi4yMXJjMDIgW0phbnVhcnkgNywgMjAxNl0KLSAgUmVsb2NhdGVkIGFzc2VydCgpIGluIGNvbnRyaWIvdG9vbHMvcG5nZml4LmMsIGJ1ZyBmb3VuZCBieSBBbWVyaWNhbgotICAgIEZ1enp5IExvcCwgcmVwb3J0ZWQgYnkgQnJpYW4gQ2FycGVudGVyLgotICBNYXJrZWQgJ2xpbWl0JyBVTlVTRUQgaW4gdHJhbnNmb3JtX3JhbmdlX2NoZWNrKCkuICBUaGlzIG9ubHkgYWZmZWN0cwotICAgIHJlbGVhc2UgYnVpbGRzLgotCi1WZXJzaW9uIDEuNi4yMSBbSmFudWFyeSAxNSwgMjAxNl0KLSAgV29ya2VkIGFyb3VuZCBhIGZhbHNlLXBvc2l0aXZlIENvdmVyaXR5IGlzc3VlIGluIHBuZ3ZhbGlkLmMuCi0KLVZlcnNpb24gMS42LjIyYmV0YTAxIFtKYW51YXJ5IDIzLCAyMDE2XQotICBDaGFuZ2VkIFBOR19VU0VfTUtTVEVNUCB0byBfX0NPVkVSSVRZX18gdG8gc2VsZWN0IGFsdGVybmF0ZQotICAgICJ0bXBmaWxlKCkiIGltcGxlbWVudGF0aW9uIGluIGNvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QuYwotICBGaXhlZCBOT19TVERJTyBidWlsZCBvZiBwbmd1bmtub3duLmMgdG8gc2tpcCBjYWxsaW5nIHBuZ19pbml0X2lvKCkKLSAgICBpZiB0aGVyZSBpcyBubyBzdGRpby5oIHN1cHBvcnQuCi0gIEFkZGVkIGEgcG5nX2ltYWdlX3dyaXRlX3RvX21lbW9yeSgpIEFQSSBhbmQgYSBudW1iZXIgb2YgYXNzaXN0IG1hY3JvcwotICAgIHRvIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgc2ltcGxpZmllZCBBUEkgd3JpdGUgdG8gYnlwYXNzCi0gICAgc3RkaW8gYW5kIHdyaXRlIGRpcmVjdGx5IHRvIG1lbW9yeS4KLSAgQWRkZWQgc29tZSB3YXJuaW5ncyAocG5nLmgpIGFuZCBzb21lIGNoZWNrIGNvZGUgdG8gZGV0ZWN0ICpwb3NzaWJsZSoKLSAgICBvdmVyZmxvdyBpbiB0aGUgUk9XX1NUUklERSBhbmQgc2ltcGxpZmllZCBpbWFnZSBTSVpFIG1hY3Jvcy4gIFRoaXMKLSAgICBkaXNhbGxvd3MgaW1hZ2Ugd2lkdGgvaGVpZ2h0L2Zvcm1hdCB0aGF0ICptaWdodCogb3ZlcmZsb3cuICBUaGlzIGlzCi0gICAgYSBxdWlldCBBUEkgY2hhbmdlIHRoYXQgbGltaXRzIGluLW1lbW9yeSBpbWFnZSBzaXplICh1bmNvbXByZXNzZWQpIHRvCi0gICAgbGVzcyB0aGFuIDRHQnl0ZSBhbmQgaW1hZ2Ugcm93IHNpemUgKHN0cmlkZSkgdG8gbGVzcyB0aGFuIDJHQnl0ZS4KLSAgUmV2aXNlZCB3b3JrYXJvdW5kIGZvciBmYWxzZS1wb3NpdGl2ZSBDb3Zlcml0eSBpc3N1ZSBpbiBwbmd2YWxpZC5jLgotCi1WZXJzaW9uIDEuNi4yMmJldGEwMiBbRmVicnVhcnkgOCwgMjAxNl0KLSAgT25seSB1c2UgZXhpdCg3NykgaW4gY29uZmlndXJlIGJ1aWxkcy4KLSAgQ29ycmVjdGVkIGVycm9yIGluIFBOR19JTUFHRV9QTkdfU0laRV9NQVguIFRoaXMgbmV3IG1hY3JvIHVuZGVycmVwb3J0ZWQKLSAgICB0aGUgcGFsZXR0ZSBzaXplIGJlY2F1c2UgaXQgZmFpbGVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlIG1lbW9yeQotICAgIHBhbGV0dGUgaGFzIHRvIGJlIGV4cGFuZGVkIHRvIGZ1bGwgUkdCIHdoZW4gaXQgaXMgd3JpdHRlbiB0byBQTkcuCi0gIFVwZGF0ZWQgQ01ha2VMaXN0cy50eHQsIGFkZGVkIHN1cHBvcnRpbmcgc2NyaXB0cy9nZW4qLmNtYWtlLmluCi0gICAgYW5kIHRlc3QuY21ha2UuaW4gKFJvZ2VyIExlaWdoKS4KLSAgUmVsYXhlZCBsaW1pdCBjaGVja3Mgb24gZ2FtbWEgdmFsdWVzIGluIHBuZ3J0cmFuLmMuIEFzIHN1Z2dlc3RlZCBpbgotICAgIHRoZSBjb21tZW50cyBnYW1tYSB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgY3VycmVudGx5IHBlcm1pdHRlZAotICAgIGJ5IHBuZ19zZXRfYWxwaGFfbW9kZSBhcmUgdXNlZnVsIGZvciBIRFIgZGF0YSBlbmNvZGluZy4gIFRoZXNlIHZhbHVlcwotICAgIGFyZSBhbHJlYWR5IHBlcm1pdHRlZCBieSBwbmdfc2V0X2dhbW1hIHNvIGl0IGlzIHJlYXNvbmFibGUgY2F1dGlvbiB0bwotICAgIGV4dGVuZCB0aGUgcG5nX3NldF9hbHBoYV9tb2RlIHJhbmdlIGFzIEhEUiBpbWFnaW5nIHN5c3RlbXMgYXJlIHN0YXJ0aW5nCi0gICAgdG8gZW1lcmdlLgotCi1WZXJzaW9uIDEuNi4yMmJldGEwMyBbTWFyY2ggOSwgMjAxNl0KLSAgQWRkZWQgYSBjb21tb24tbGF3IHRyYWRlbWFyayBub3RpY2UgYW5kIGV4cG9ydCBjb250cm9sIGluZm9ybWF0aW9uCi0gICAgdG8gdGhlIExJQ0VOU0UgZmlsZSwgcG5nLmgsIGFuZCB0aGUgbWFuIHBhZ2UuCi0gIFJlc3RvcmVkICImIDB4ZmYiIGluIHBuZ19zYXZlX3VpbnRfMTYoKSBhbmQgcG5nX3NhdmVfdWludF8zMigpIHRoYXQKLSAgICB3ZXJlIGFjY2lkZW50YWxseSByZW1vdmVkIGZyb20gbGlicG5nLTEuNi4xNy4gCi0gIENoYW5nZWQgUE5HX0lORk9fY0hOSyBhbmQgUE5HX0ZSRUVfY0hOSyBmcm9tIDB4bm5ubiB0byAweG5ubm5VIGluIHBuZy5oCi0gICAgKFJvYmVydCBDLiBTZWFjb3JkKS4KLSAgUmVtb3ZlZCBkdWJpb3VzICIjaWYgSU5UX01BWCIgdGVzdCBmcm9tIHBuZy5oIHRoYXQgd2FzIGFkZGVkIHRvCi0gICAgbGlicG5nLTEuNi4xOWJldGEwMiAoSm9obiBCb3dsZXIpLgotICBBZGQgJHtJTkNMVURFU30gaW4gc2NyaXB0cy9nZW5vdXQuY21ha2UuaW4gKEJ1ZyByZXBvcnQgYnkgTml4b24gS3dvaykuCi0gIFVwZGF0ZWQgTElDRU5TRSB0byBzYXkgZmlsZXMgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5IGFyZSBub3QKLSAgICBuZWNlc3NhcmlseSB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UsIGFuZCB0aGF0IHNvbWUgbWFrZWZpbGVzIGhhdmUKLSAgICBvdGhlciBjb3B5cmlnaHQgb3duZXJzLgotICBBZGRlZCBJTlRFTC1TU0UyIHN1cHBvcnQgKE1pa2UgS2xlaW4gYW5kIE1hdHQgU2FyZXR0LCBHb29nbGUsIEluYy4pLgotICBNYWRlIGNvbnRyaWIvbGlidGVzdHMvdGltZXBuZyBtb3JlIHJvYnVzdC4gIFRoZSBjb2RlIG5vIGxvbmdlciBnaXZlcwotICAgIHVwL2ZhaWxzIG9uIGludmFsaWQgUE5HIGRhdGEsIGl0IGp1c3Qgc2tpcHMgaXQgKHdpdGggZXJyb3IgbWVzc2FnZXMpLgotICAgIFRoZSBjb2RlIG5vIGxvbmdlciBmYWlscyBvbiBQTkcgZmlsZXMgd2l0aCBkYXRhIGJleW9uZCBJRU5ELiAgT3B0aW9ucwotICAgIGV4aXN0IHRvIHVzZSBwbmdfcmVhZF9wbmcgKHJlYWRpbmcgdGhlIHdob2xlIGltYWdlLCBub3QgYnkgcm93KSBhbmQsIGluCi0gICAgdGhhdCBjYXNlLCB0byBhcHBseSBhbnkgb2YgdGhlIHN1cHBvcnRlZCB0cmFuc2Zvcm1zLiAgVGhpcyBtYWtlcyBmb3IKLSAgICBtb3JlIHJlYWxpc3RpYyB0ZXN0aW5nOyB0aGUgZGVjb2RlZCBkYXRhIGFjdHVhbGx5IGdldHMgdXNlZCBpbiBhCi0gICAgbWVhbmluZ2Z1bCBmYXNoaW9uIChKb2huIEJvd2xlcikuCi0gIEZpeGVkIHNvbWUgbWlzbGVhZGluZyBpbmRlbnRhdGlvbiAoS3Jpc2huYXJhaiBCaGF0KS4KLQotVmVyc2lvbiAxLjYuMjJiZXRhMDQgW0FwcmlsIDUsIDIwMTZdCi0gIEZvcmNlIEdDQyBjb21waWxhdGlvbiB0byBDODkgaWYgbmVlZGVkIChEYWdvYmVydCBNaWNoZWxzZW4pLgotICBTU0UgZmlsdGVyIHNwZWVkIGltcHJvdmVtZW50cyBmb3IgYnBwPTM6Ci0gICAgbWVtY3B5LWZyZWUgaW1wbGVtZW50YXRpb25zIG9mIGxvYWQzKCkgLyBzdG9yZTMoKS4KLSAgICBjYWxsIGxvYWQzKCkgb25seSB3aGVuIG5lZWRlZCBhdCB0aGUgZW5kIG9mIGEgc2NhbmxpbmUuCi0KLVZlcnNpb24gMS42LjIyYmV0YTA1IFtBcHJpbCAyNywgMjAxNl0KLSAgQWRkZWQgUE5HX0ZBU1RfRklMVEVSUyBtYWNybyAoZGVmaW5lZCBhcwotICAgIFBOR19GSUxURVJfTk9ORXxQTkdfRklMVEVSX1NVQnxQTkdfRklMVEVSX1VQKS4KLSAgVmFyaW91cyBmaXhlcyBmb3IgY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nLmMKLSAgTW92ZWQgSU5URUwtU1NFIGNvZGUgZnJvbSBwbmdwcml2LmggaW50byBjb250cmliL2ludGVsL2ludGVsX3NzZS5wYXRjaC4KLSAgRml4ZWQgdHlwbyAobWlzc2luZyB1bmRlcnNjb3JlKSBpbiAjZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi0gICAgKEJ1ZyByZXBvcnQgYnkgWS5PaGFzaGlrKS4KLQotVmVyc2lvbiAxLjYuMjJiZXRhMDYgW01heSA1LCAyMDE2XQotICBSZWJhc2VkIGNvbnRyaWIvaW50ZWxfc3NlLnBhdGNoLgotICBRdWlldGVkIHR3byBDb3Zlcml0eSBpc3N1ZXMgaW4gY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nLmMuCi0gIEZpeGVkIGlzc3VlcyB3aXRoIHNjcmlwdHMvZ2Vub3V0LmNtYWtlLmluIChEYXZpZCBDYXBlbGxvLCBOaXhvbiBLd29rKToKLSAgICBBZGRlZCBzdXBwb3J0IHRvIHVzZSBtdWx0aXBsZSBkaXJlY3RvcmllcyBpbiBaTElCSU5DRElSIHZhcmlhYmxlLAotICAgIEZpeGVkIENNQUtFX0NfRkxBR1Mgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgd2hlbiBnZW5vdXQgaXMgY29tcGlsZWQgb24gTVNWQywKLSAgICBGaXhlZCBwbmdsaWJjb25mLmMgY29tcGlsYXRpb24gb24gT1MgWCBpbmNsdWRpbmcgdGhlIHN5c3Jvb3QgcGF0aC4KLQotVmVyc2lvbiAxLjYuMjJyYzAxIFtNYXkgMTQsIDIwMTZdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjIycmMwMiBbTWF5IDE2LCAyMDE2XQotICBSZW1vdmVkIGNvbnRyaWIvdGltZXBuZyBmcm9tIGRlZmF1bHQgYnVpbGQ7IGl0IGRvZXMgbm90IGJ1aWxkIG9uIHBsYXRmb3JtcwotICAgIHRoYXQgZG9uJ3Qgc3VwcGx5IGNsb2NrX2dldHRpbWUoKS4KLQotVmVyc2lvbiAxLjYuMjJyYzAzIFtNYXkgMTcsIDIwMTZdCi0gIFJlc3RvcmVkIGNvbnRyaWIvdGltZXBuZyB0byBkZWZhdWx0IGJ1aWxkIGJ1dCBjaGVjayBmb3IgdGhlIHByZXNlbmNlCi0gICAgb2YgY2xvY2tfZ2V0dGltZSgpIGluIGNvbmZpZ3VyZS5hYyBhbmQgTWFrZWZpbGUuYW0uCi0KLVZlcnNpb24gMS42LjIyIFtNYXkgMjYsIDIwMTZdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjIzYmV0YTAxIFtNYXkgMjksIDIwMTZdCi0gIFN0b3AgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgaW4gcG5nX3NldF90Uk5TKCkgKEJ1ZyByZXBvcnQgYnkgVGVkIFlpbmcpLgotICBGaXhlZCB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIHRvIGhhbmRsZSBlbXB0eSBmaXJzdCBJREFUIGNodW5rIHByb3Blcmx5Ci0gICAgKHBhdGNoIGJ5IFRpbW90aHkgTmlra2VsKS4gIFRoaXMgYnVnIHdhcyBpbnRyb2R1Y2VkIGluIGxpYnBuZy0xLjYuMCBhbmQKLSAgICBvbmx5IGFmZmVjdGVkIHRoZSBsaWJwbmcxNiBicmFuY2guCi0gIEFkZGVkIHRlc3RzIGluIHBuZ3ZhbGlkLmMgdG8gY2hlY2sgemVyby1sZW5ndGggSURBVCBjaHVua3MgaW4gdmFyaW91cwotICAgIHBvc2l0aW9ucy4gIEZpeGVkIHRoZSBzZXF1ZW50aWFsIHJlYWRlciB0byBoYW5kbGUgdGhlc2UgbW9yZSByb2J1c3RseQotICAgIChKb2huIEJvd2xlcikuCi0KLVZlcnNpb24gMS42LjIzcmMwMSBbSnVuZSAyLCAyMDE2XQotICBDb3JyZWN0ZWQgcHJvZ3Jlc3NpdmUgcmVhZCBpbnB1dCBidWZmZXIgaW4gcG5ndmFsaWQuYy4gVGhlIHByZXZpb3VzIHZlcnNpb24KLSAgICB0aGUgY29kZSBpbnZhcmlhYmx5IHBhc3NlZCBqdXN0IG9uZSBieXRlIGF0IGEgdGltZSB0byBsaWJwbmcuICBUaGUgaW50ZW50Ci0gICAgd2FzIHRvIHBhc3MgYSByYW5kb20gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByYW5nZSAwLi41MTEuCi0gIE1vdmVkIHNzZTIgcHJvdG90eXBlIGZyb20gcG5ncHJpdi5oIHRvIGNvbnRyaWIvaW50ZWwvaW50ZWxfc3NlLnBhdGNoLgotICBBZGRlZCBtaXNzaW5nICIpIiBpbiBwbmdlcnJvci5jIChNYXR0IFNhcnJldHQpLgotCi1WZXJzaW9uIDEuNi4yM3JjMDIgW0p1bmUgNCwgMjAxNl0KLSAgRml4ZWQgdW5kZWZpbmVkIGJlaGF2aW9yIGluIHBuZ19wdXNoX3NhdmVfYnVmZmVyKCkuIERvIG5vdCBjYWxsCi0gICAgbWVtY3B5KCkgd2l0aCBhIG51bGwgc291cmNlLCBldmVuIGlmIGNvdW50IGlzIHplcm8gKExlb24gU2Nyb2dnaW5zIElJSSkuCi0KLVZlcnNpb24gMS42LjIzIFtKdW5lIDksIDIwMTZdCi0gIEZpeGVkIGJhZCBsaW5rIHRvIFJGQzIwODMgaW4gcG5nLjUgKE5pa29sYSBGb3JybykuCi0KLVZlcnNpb24gMS42LjI0YmV0YTAxIFtKdW5lIDExLCAyMDE2XQotICBBdm9pZCBwb3RlbnRpYWwgb3ZlcmZsb3cgb2YgdGhlIFBOR19JTUFHRV9TSVpFIG1hY3JvLiAgVGhpcyBtYWNybwotICAgIGlzIG5vdCB1c2VkIHdpdGhpbiBsaWJwbmcsIGJ1dCBpcyB1c2VkIGluIHNvbWUgb2YgdGhlIGV4YW1wbGVzLgotCi1WZXJzaW9uIDEuNi4yNGJldGEwMiBbSnVuZSAyMywgMjAxNl0KLSAgQ29ycmVjdCBmaWx0ZXIgaGV1cmlzdGljIG92ZXJmbG93IGhhbmRsaW5nLiBUaGlzIHdhcyBicm9rZW4gd2hlbiB0aGUKLSAgICB3cml0ZSBmaWx0ZXIgY29kZSB3YXMgbW92ZWQgb3V0LW9mLWxpbmU7IGlmIHRoZXJlIGlzIGEgc2luZ2xlIGZpbHRlciBhbmQKLSAgICB0aGUgaGV1cmlzdGljIHN1bSBvdmVyZmxvd3MgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBsaW5lIGlzIG5vdAotICAgIGNvbXBsZXRlZC4gIEluIHZlcnNpb25zIHByaW9yIHRvIDEuNiB0aGUgY29kZSB3YXMgZHVwbGljYXRlZCBpbi1saW5lCi0gICAgYW5kIHRoZSBjaGVjayBub3QgcGVyZm9ybWVkLCBzbyB0aGUgZmlsdGVyIG9wZXJhdGlvbiBjb21wbGV0ZWQ7IGhvd2V2ZXIsCi0gICAgaW4gdGhlIG11bHRpLWZpbHRlciBjYXNlIHdoZXJlIHRoZSBzdW0gaXMgcGVyZm9ybWVkIHRoZSAnbm9uZScgZmlsdGVyIHdvdWxkCi0gICAgYmUgc2VsZWN0ZWQgaWYgYWxsIHRoZSBzdW1zIG92ZXJmbG93ZWQsIGV2ZW4gaWYgaXQgd2Fzbid0IGluIHRoZSBmaWx0ZXIKLSAgICBsaXN0LiAgVGhlIGZpeCB0byB0aGUgZmlyc3QgcHJvYmxlbSBpcyBzaW1wbHkgdG8gcHJvdmlkZSBQTkdfU0laRV9NQVggYXMKLSAgICB0aGUgY3VycmVudCBsbWlucyBzdW0gdmFsdWU7IHRoaXMgbWVhbnMgdGhlIHN1bSBjYW4gbmV2ZXIgZXhjZWVkIGl0IGFuZAotICAgIG92ZXJmbG93cyBzaWxlbnRseS4gIEEgcmVhc29uYWJsZSBjb21waWxlciB0aGF0IGRvZXMgY2hvb3NlIHRvIGlubGluZQotICAgIHRoZSBjb2RlIHdpbGwgc2ltcGx5IGVsaW1pbmF0ZSB0aGUgc3VtIGNoZWNrLgotICBUaGUgZml4IHRvIHRoZSBzZWNvbmQgcHJvYmxlbSBpcyB0byB1c2UgaGlnaCBwcmVjaXNpb24gYXJpdGhtZXRpYyAodGhpcyBpcwotICAgIGltcGxlbWVudGVkIGluIDEuNyksIGhvd2V2ZXIgYSBzaW1wbGUgc2FmZSBmaXggaGVyZSBpcyB0byBjaG9zZSB0aGUgbG93ZXN0Ci0gICAgbnVtYmVyZWQgZmlsdGVyIGluIHRoZSBsaXN0IGZyb20gcG5nX3NldF9maWx0ZXIgKHRoaXMgb25seSB3b3JrcyBpZiB0aGUKLSAgICBmaXJzdCBwcm9ibGVtIGlzIGFsc28gZml4ZWQpIChKb2huIEJvd2xlcikuCi0gIFVzZSBhIG1vcmUgZWZmaWNpZW50IGFic29sdXRlIHZhbHVlIGNhbGN1bGF0aW9uIG9uIFNTRTIgKE1hdHRoaWV1IERhcmJvaXMpLgotICBGaXhlZCB0aGUgY2FzZSB3aGVyZSBQTkdfSU1BR0VfQlVGRkVSX1NJWkUgY2FuIG92ZXJmbG93IGluIHRoZSBhcHBsaWNhdGlvbgotICAgIGFzIGEgcmVzdWx0IG9mIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBhbiBpbmNyZWFzZWQgJ3Jvd19zdHJpZGUnOyBwcmV2aW91c2x5Ci0gICAgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkIG9ubHkgY2hlY2tlZCBmb3Igb3ZlcmZsb3cgb24gdGhlIGJhc2UgY2FsY3VsYXRpb24gb2YKLSAgICBjb21wb25lbnRzLiAgKEkuZS4gaXQgY2hlY2tlZCBmb3Igb3ZlcmZsb3cgb2YgYSAzMi1iaXQgbnVtYmVyIG9uIHRoZSB0b3RhbAotICAgIG51bWJlciBvZiBwaXhlbCBjb21wb25lbnRzIGluIHRoZSBvdXRwdXQgZm9ybWF0LCBub3QgdGhlIHBvc3NpYmx5IHBhZGRlZCByb3cKLSAgICBsZW5ndGggYW5kIG5vdCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCB3aGljaCBmb3IgbGluZWFyIGZvcm1hdHMgaXMgdHdpY2UgdGhlCi0gICAgbnVtYmVyIG9mIGNvbXBvbmVudHMuKQotICBNU1ZDIGRvZXMgbm90IGxpa2UgJy0odW5zaWduZWQpJywgc28gcmVwbGFjZWQgaXQgd2l0aCAwVS0odW5zaWduZWQpCi0gIE1TVkMgZG9lcyBub3QgbGlrZSAodUludCkgPSAtKHVuc2lnbmVkKSAoaS5lLiBhcyBhbiBpbml0aWFsaXplciksIHVubGVzcwotICAgIHRoZSBjb252ZXJzaW9uIGlzIGV4cGxpY2l0bHkgaW52b2tlZCBieSBhIGNhc3QuCi0gIFB1dCB0aGUgU0tJUCBkZWZpbml0aW9uIGluIHRoZSBjb3JyZWN0IHBsYWNlLiBJdCBuZWVkcyB0byBjb21lIGFmdGVyIHRoZQotICAgIHBuZy5oIGluY2x1ZGUgKHNlZSBhbGwgdGhlIG90aGVyIC5jIGZpbGVzIGluIGNvbnRyaWIvbGlidGVzdHMpIGJlY2F1c2UgaXQKLSAgICBkZXBlbmRzIG9uIFBOR19MSUJQTkdfVkVSLgotICBSZW1vdmVkIHRoZSB0aHJlZSBjb21waWxlIHdhcm5pbmcgb3B0aW9ucyBmcm9tIHRoZSBpbmRpdmlkdWFsIHByb2plY3QKLSAgICBmaWxlcyBpbnRvIHRoZSB6bGliLnByb3BzIGdsb2JhbHMuICBJdCBpbmNyZWFzZXMgdGhlIHdhcm5pbmcgbGV2ZWwgZnJvbSA0Ci0gICAgdG8gQWxsIGFuZCBhZGRzIGEgbGlzdCBvZiB0aGUgd2FybmluZ3MgdGhhdCBuZWVkIHRvIGJlIHR1cm5lZCBvZmYuICBUaGlzIGlzCi0gICAgc2VtaS1kb2N1bWVudGFyeTsgdGhlIGludGVudCBpcyB0byB0ZWxsIGxpYnBuZyB1c2VycyB3aGljaCB3YXJuaW5ncyBoYXZlCi0gICAgYmVlbiBleGFtaW5lZCBhbmQganVkZ2VkIG5vbi1maXhhYmxlIGF0IHByZXNlbnQuICBUaGUgd2FybmluZyBhYm91dAotICAgIHN0cnVjdHVyZSBwYWRkaW5nIGlzIGZpeGFibGUsIGJ1dCBpdCB3b3VsZCBiZSBhIHNpZ25maWNhbnQgY2hhbmdlIChtb3ZpbmcKLSAgICBzdHJ1Y3R1cmUgbWVtYmVycyBhcm91bmQpLgotCi1WZXJzaW9uIDEuNi4yNGJldGEwMyBbSnVseSA0LCAyMDE2XQotICBPcHRpbWl6ZWQgYWJzb2x1dGUgdmFsdWUgY2FsY3VsYXRpb24gaW4gZmlsdGVyIHNlbGVjdGlvbiwgc2ltaWxhciB0bwotICAgIGNvZGUgaW4gdGhlIFBBRVRIIGRlY29kZXIgaW4gcG5ncnV0aWwuYy4gQnVpbGQgd2l0aCBQTkdfVVNFX0FCUyB0bwotICAgIHVzZSB0aGlzLgotICBBZGRlZCBwbmdjcCB0byB0aGUgYnVpbGQgdG9nZXRoZXIgd2l0aCBhIHBuZ2NwLmRmYSBjb25maWd1cmF0aW9uIHRlc3QuCi0gIEFkZGVkIGhpZ2ggcmVzb2x1dGlvbiB0aW1pbmcgdG8gcG5nY3AuCi0gIEFkZGVkICJDb21tb24gbGlua2luZyBmYWlsdXJlcyIgc2VjdGlvbiB0byBJTlNUQUxMLgotICBSZWxvY2F0ZWQgbWlzcGxhY2VkICNlbmRpZiBpbiBwbmcuYyBzUkdCIHByb2ZpbGUgY2hlY2tpbmcuCi0gIEZpeGVkIHR3byBDb3Zlcml0eSBpc3N1ZXMgaW4gcG5nY3AuYy4KLQotVmVyc2lvbiAxLjYuMjRiZXRhMDQgW0p1bHkgOCwgMjAxNl0KLSAgQXZvaWQgZmlsdGVyLXNlbGVjdGlvbiBoZXVyaXN0aWMgc3VtIGNhbGN1bGF0aW9ucyBpbiBjYXNlcyB3aGVyZSBvbmx5IG9uZQotICAgIGZpbHRlciBpcyBhIGNhbmRpZGF0ZSBmb3Igc2VsZWN0aW9uLiBUaGlzIHRyYWRlcyBvZmYgY29kZSBzaXplIChhZGRlZAotICAgIHByaXZhdGUgcG5nX3NldHVwXypfcm93X29ubHkoKSBmdW5jdGlvbnMpIGZvciBzcGVlZC4KLQotVmVyc2lvbiAxLjYuMjRiZXRhMDUgW0p1bHkgMTMsIDIwMTZdCi0gIEZpeGVkIHNvbWUgaW5kZW50YXRpb24gdG8gY29tcGx5IHdpdGggb3VyIGNvZGluZyBzdHlsZS4KLSAgQWRkZWQgY29udHJpYi90b29scy9yZWluZGVudC4KLQotVmVyc2lvbiAxLjYuMjRiZXRhMDYgW0p1bHkgMTgsIDIwMTZdCi0gIEZpeGVkIG1vcmUgaW5kZW50YXRpb24gdG8gY29tcGx5IHdpdGggb3VyIGNvZGluZyBzdHlsZS4KLSAgRWxpbWluYXRlZCB1bm5lY2Vzc2FyeSB0ZXN0cyBvZiBib29sZWFuIHBuZ19pc2FsaWduZWQoKSB2cyAwLgotCi1WZXJzaW9uIDEuNi4yNHJjMDEgW0p1bHkgMjUsIDIwMTZdCi0gIE5vIGNoYW5nZXMuCi0KLVZlcnNpb24gMS42LjI0cmMwMiBbQXVndXN0IDEsIDIwMTZdCi0gIENvbmRpdGlvbmFsbHkgY29tcGlsZSBTU0UyIGhlYWRlcnMgaW4gY29udHJpYi9pbnRlbC9pbnRlbF9zc2UucGF0Y2gKLSAgQ29uZGl0aW9uYWxseSBjb21waWxlIHBuZ19kZWNvbXByZXNzX2NodW5rKCkuCi0KLVZlcnNpb24gMS42LjI0cmMwMyBbQXVndXN0IDIsIDIwMTZdCi0gIENvbmRpdGlvbmFsbHkgY29tcGlsZSBBUk1fTkVPTiBoZWFkZXJzIGluIHBuZ3ByaXYuaAotICBVcGRhdGVkIGNvbnRyaWIvaW50ZWwvaW50ZWxfc3NlLnBhdGNoCi0KLVZlcnNpb24gMS42LjI0W0F1Z3VzdCA0LCAyMDE2XQotICBObyBjaGFuZ2VzLgotCi1TZW5kIGNvbW1lbnRzL2NvcnJlY3Rpb25zL2NvbW1lbmRhdGlvbnMgdG8gcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc2YubmV0Ci0oc3Vic2NyaXB0aW9uIHJlcXVpcmVkOyB2aXNpdAotaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vcG5nLW1uZy1pbXBsZW1lbnQKLXRvIHN1YnNjcmliZSkKLW9yIHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0Ci0KLUdsZW5uIFItUAotI2VuZGlmCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZiNjVhLi4wMDAwMDAwCi0tLSBhL0NNYWtlTGlzdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsODA0ICswLDAgQEAKLSMgQ01ha2VMaXN0cy50eHQKLQotIyBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOS0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBXcml0dGVuIGJ5IENocmlzdGlhbiBFaHJsaWNoZXIsIDIwMDcKLSMgUmV2aXNlZCBieSBSb2dlciBMb3dtYW4sIDIwMDktMjAxMAotIyBSZXZpc2VkIGJ5IENsaWZmb3JkIFlhcHAsIDIwMTEtMjAxMgotIyBSZXZpc2VkIGJ5IFJvZ2VyIExlaWdoLCAyMDE2Ci0KLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi1jbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjMpCi1jbWFrZV9wb2xpY3koVkVSU0lPTiAyLjguMykKLQotIyBTZXQgTWFjT1NYIEBycGF0aCB1c2FnZSBnbG9iYWxseS4KLWlmIChQT0xJQ1kgQ01QMDAyMCkKLSAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDIwIE5FVykKLWVuZGlmKFBPTElDWSBDTVAwMDIwKQotaWYgKFBPTElDWSBDTVAwMDQyKQotICBjbWFrZV9wb2xpY3koU0VUIENNUDAwNDIgTkVXKQotZW5kaWYoUE9MSUNZIENNUDAwNDIpCi0jIFVzZSBuZXcgdmFyaWFibGUgZXhwYW5zaW9uIHBvbGljeS4KLWlmIChQT0xJQ1kgQ01QMDA1MykKLSAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDUzIE5FVykKLWVuZGlmKFBPTElDWSBDTVAwMDUzKQotaWYgKFBPTElDWSBDTVAwMDU0KQotICBjbWFrZV9wb2xpY3koU0VUIENNUDAwNTQgTkVXKQotZW5kaWYoUE9MSUNZIENNUDAwNTQpCi0KLXNldChDTUFLRV9DT05GSUdVUkFUSU9OX1RZUEVTICJSZWxlYXNlO0RlYnVnO01pblNpemVSZWw7UmVsV2l0aERlYkluZm8iKQotCi1wcm9qZWN0KGxpYnBuZyBDKQotZW5hYmxlX3Rlc3RpbmcoKQotCi1zZXQoUE5HTElCX01BSk9SIDEpCi1zZXQoUE5HTElCX01JTk9SIDYpCi1zZXQoUE5HTElCX1JFTEVBU0UgMjQpCi1zZXQoUE5HTElCX05BTUUgbGlicG5nJHtQTkdMSUJfTUFKT1J9JHtQTkdMSUJfTUlOT1J9KQotc2V0KFBOR0xJQl9WRVJTSU9OICR7UE5HTElCX01BSk9SfS4ke1BOR0xJQl9NSU5PUn0uJHtQTkdMSUJfUkVMRUFTRX0pCi0KLSMgbmVlZGVkIHBhY2thZ2VzCi1maW5kX3BhY2thZ2UoWkxJQiBSRVFVSVJFRCkKLWluY2x1ZGVfZGlyZWN0b3JpZXMoJHtaTElCX0lOQ0xVREVfRElSfSkKLQotaWYoTk9UIFdJTjMyKQotICBmaW5kX2xpYnJhcnkoTV9MSUJSQVJZCi0gICAgTkFNRVMgbQotICAgIFBBVEhTIC91c3IvbGliIC91c3IvbG9jYWwvbGliCi0gICkKLSAgaWYoTk9UIE1fTElCUkFSWSkKLSAgICBtZXNzYWdlKFNUQVRVUyAibWF0aCBsaWIgJ2xpYm0nIG5vdCBmb3VuZDsgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBkaXNhYmxlZCIpCi0gIGVuZGlmKCkKLWVsc2UoKQotICAjIG5vdCBuZWVkZWQgb24gd2luZG93cwotICBzZXQoTV9MSUJSQVJZICIiKQotZW5kaWYoKQotCi0jIENPTU1BTkQgTElORSBPUFRJT05TCi1vcHRpb24oUE5HX1NIQVJFRCAiQnVpbGQgc2hhcmVkIGxpYiIgT04pCi1vcHRpb24oUE5HX1NUQVRJQyAiQnVpbGQgc3RhdGljIGxpYiIgT04pCi1vcHRpb24oUE5HX1RFU1RTICAiQnVpbGQgbGlicG5nIHRlc3RzIiBPTikKLQotIyBNYW55IG1vcmUgY29uZmlndXJhdGlvbiBvcHRpb25zIGNvdWxkIGJlIGFkZGVkIGhlcmUKLW9wdGlvbihQTkdfRlJBTUVXT1JLICJCdWlsZCBPUyBYIGZyYW1ld29yayIgT0ZGKQotb3B0aW9uKFBOR19ERUJVRyAgICAgIkJ1aWxkIHdpdGggZGVidWcgb3V0cHV0IiBPRkYpCi1vcHRpb24oUE5HQVJHICAgICAgICAiRGlzYWJsZSBBTlNJLUMgcHJvdG90eXBlcyIgT0ZGKQotCi1zZXQoUE5HX1BSRUZJWCAiIiBDQUNIRSBTVFJJTkcgIlByZWZpeCB0byBhZGQgdG8gdGhlIEFQSSBmdW5jdGlvbiBuYW1lcyIpCi1zZXQoREZBX1hUUkEgIiIgQ0FDSEUgRklMRVBBVEggIkZpbGUgY29udGFpbmluZyBleHRyYSBjb25maWd1cmF0aW9uIHNldHRpbmdzIikKLQotIyBTRVQgTElCTkFNRQotc2V0KFBOR19MSUJfTkFNRSBwbmcke1BOR0xJQl9NQUpPUn0ke1BOR0xJQl9NSU5PUn0pCi0KLSMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkZWJ1ZyBhbmQgcmVsZWFzZSBsaWIKLXNldChDTUFLRV9ERUJVR19QT1NURklYICJkIikKLQotaW5jbHVkZShDaGVja0NTb3VyY2VDb21waWxlcykKLW9wdGlvbihsZC12ZXJzaW9uLXNjcmlwdCAiRW5hYmxlIGxpbmtlciB2ZXJzaW9uIHNjcmlwdCIgT04pCi1pZihsZC12ZXJzaW9uLXNjcmlwdCBBTkQgTk9UIEFQUExFKQotICAjIENoZWNrIGlmIExEIHN1cHBvcnRzIGxpbmtlciBzY3JpcHRzLgotICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY29uZnRlc3QubWFwIiAiVkVSU18xIHsKLSAgICAgICAgZ2xvYmFsOiBzeW07Ci0gICAgICAgIGxvY2FsOiAqOwotfTsKLQotVkVSU18yIHsKLSAgICAgICAgZ2xvYmFsOiBzeW0yOwotICAgICAgICAgICAgICAgIG1haW47Ci19IFZFUlNfMTsKLSIpCi0gIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHU19TQVZFICR7Q01BS0VfUkVRVUlSRURfRkxBR1N9KQotICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9SRVFVSVJFRF9GTEFHU30gIi1XbCwtLXZlcnNpb24tc2NyaXB0PScke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY29uZnRlc3QubWFwJyIpCi0gIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCJ2b2lkIHN5bSh2b2lkKSB7fQotdm9pZCBzeW0yKHZvaWQpIHt9Ci1pbnQgbWFpbih2b2lkKSB7cmV0dXJuIDA7fQotIiBIQVZFX0xEX1ZFUlNJT05fU0NSSVBUKQotICBpZihOT1QgSEFWRV9MRF9WRVJTSU9OX1NDUklQVCkKLSAgICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9SRVFVSVJFRF9GTEFHU19TQVZFfSAiLVdsLC1NIC1XbCwke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY29uZnRlc3QubWFwIikKLSAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoInZvaWQgc3ltKHZvaWQpIHt9Ci12b2lkIHN5bTIodm9pZCkge30KLWludCBtYWluKHZvaWQpIHtyZXR1cm4gMDt9Ci0iIEhBVkVfU09MQVJJU19MRF9WRVJTSU9OX1NDUklQVCkKLSAgZW5kaWYoKQotICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9SRVFVSVJFRF9GTEFHU19TQVZFfSkKLSAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9jb25mdGVzdC5tYXAiKQotZW5kaWYoKQotCi0jIEZpbmQgc3ltYm9sIHByZWZpeC4gIExpa2VseSBvYnNvbGV0ZSBhbmQgdW5uZWNlc3Nhcnkgd2l0aCByZWNlbnQKLSMgdG9vbGNoYWlucyAoaXQncyBub3QgZG9uZSBpbiBtYW55IG90aGVyIHByb2plY3RzKS4KLWZ1bmN0aW9uKHN5bWJvbF9wcmVmaXgpCi0gIHNldChTWU1CT0xfUFJFRklYKQotCi0gIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke0NNQUtFX0NfQ09NUElMRVJ9IiAiLUUiICItIgotICAgICAgICAgICAgICAgICAgSU5QVVRfRklMRSAvZGV2L251bGwKLSAgICAgICAgICAgICAgICAgIE9VVFBVVF9WQVJJQUJMRSBPVVQKLSAgICAgICAgICAgICAgICAgIFJFU1VMVF9WQVJJQUJMRSBTVEFUVVMpCi0KLSAgaWYoQ1BQX0ZBSUwpCi0gICAgbWVzc2FnZShXQVJOSU5HICJGYWlsZWQgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIpCi0gIGVuZGlmKCkKLQotICBzdHJpbmcoUkVQTEFDRSAiXG4iICI7IiBPVVQgIiR7T1VUfSIpCi0gIGZvcmVhY2gobGluZSAke09VVH0pCi0gICAgc3RyaW5nKFJFR0VYIE1BVENIICJeUFJFRklYPSIgZm91bmRfbWF0Y2ggIiR7bGluZX0iKQotICAgIGlmKGZvdW5kX21hdGNoKQotICAgICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIl5QUkVGSVg9KC4qXCkiICJcXDEiIHByZWZpeCAiJHtsaW5lfSIpCi0gICAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIl9fVVNFUl9MQUJFTF9QUkVGSVhfXyIgZm91bmRfbWF0Y2ggIiR7cHJlZml4fSIpCi0gICAgICBpZihmb3VuZF9tYXRjaCkKLSAgICAgICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIiguKilfX1VTRVJfTEFCRUxfUFJFRklYX18oLiopIiAiXFwxXFwyIiBwcmVmaXggIiR7cHJlZml4fSIpCi0gICAgICBlbmRpZigpCi0gICAgICBzZXQoU1lNQk9MX1BSRUZJWCAiJHtwcmVmaXh9IikKLSAgICBlbmRpZigpCi0gIGVuZGZvcmVhY2goKQotCi0gICAgbWVzc2FnZShTVEFUVVMgIlN5bWJvbCBwcmVmaXg6ICR7U1lNQk9MX1BSRUZJWH0iKQotICAgIHNldChTWU1CT0xfUFJFRklYICIke1NZTUJPTF9QUkVGSVh9IiBQQVJFTlRfU0NPUEUpCi1lbmRmdW5jdGlvbigpCi0KLWlmKFVOSVgpCi0gIHN5bWJvbF9wcmVmaXgoKQotZW5kaWYoKQotCi1maW5kX3Byb2dyYW0oQVdLIE5BTUVTIGdhd2sgYXdrKQotCi1pbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKLQotaWYoTk9UIEFXSykKLSAgIyBObyBhd2sgYXZhaWxhYmxlIHRvIGdlbmVyYXRlIHNvdXJjZXM7IHVzZSBwcmUtYnVpbHQgcG5nbGliY29uZi5oCi0gIGNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcG5nbGliY29uZi5oKQotICBhZGRfY3VzdG9tX3RhcmdldChnZW5maWxlcykgIyBEdW1teQotZWxzZSgpCi0gIGluY2x1ZGUoQ01ha2VQYXJzZUFyZ3VtZW50cykKLSAgIyBHZW5lcmF0ZSAuY2hrIGZyb20gLm91dCB3aXRoIGF3awotICAjIGdlbmVyYXRlX2NoayhJTlBVVCBpbnB1dGZpbGUgT1VUUFVUIG91dHB1dGZpbGUgW0RFUEVORFMgZGVwMSBbZGVwMi4uLl1dKQotICBmdW5jdGlvbihnZW5lcmF0ZV9jaGspCi0gICAgc2V0KG9wdGlvbnMpCi0gICAgc2V0KG9uZVZhbHVlQXJncyBJTlBVVCBPVVRQVVQpCi0gICAgc2V0KG11bHRpVmFsdWVBcmdzIERFUEVORFMpCi0gICAgY21ha2VfcGFyc2VfYXJndW1lbnRzKF9HQyAiJHtvcHRpb25zfSIgIiR7b25lVmFsdWVBcmdzfSIgIiR7bXVsdGlWYWx1ZUFyZ3N9IiAke0FSR059KQotICAgIGlmIChOT1QgX0dDX0lOUFVUKQotICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiSW52YWxpZCBhcmd1bWVudHMuICBnZW5lcmF0ZV9vdXQgcmVxdWlyZXMgaW5wdXQuIikKLSAgICBlbmRpZigpCi0gICAgaWYgKE5PVCBfR0NfT1VUUFVUKQotICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiSW52YWxpZCBhcmd1bWVudHMuICBnZW5lcmF0ZV9vdXQgcmVxdWlyZXMgb3V0cHV0LiIpCi0gICAgZW5kaWYoKQotCi0gICAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAiJHtfR0NfT1VUUFVUfSIKLSAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORCAiJHtDTUFLRV9DT01NQU5EfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURJTlBVVD0ke19HQ19JTlBVVH0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1ET1VUUFVUPSR7X0dDX09VVFBVVH0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL2dlbmNoay5jbWFrZSIKLSAgICAgICAgICAgICAgICAgICAgICAgREVQRU5EUyAiJHtfR0NfSU5QVVR9IiAke19HQ19ERVBFTkRTfQotICAgICAgICAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKLSAgZW5kZnVuY3Rpb24oKQotCi0gICMgR2VuZXJhdGUgLm91dCBmcm9tIC5jIHdpdGggYXdrCi0gICMgZ2VuZXJhdGVfb3V0KElOUFVUIGlucHV0ZmlsZSBPVVRQVVQgb3V0cHV0ZmlsZSBbREVQRU5EUyBkZXAxIFtkZXAyLi4uXV0pCi0gIGZ1bmN0aW9uKGdlbmVyYXRlX291dCkKLSAgICBzZXQob3B0aW9ucykKLSAgICBzZXQob25lVmFsdWVBcmdzIElOUFVUIE9VVFBVVCkKLSAgICBzZXQobXVsdGlWYWx1ZUFyZ3MgREVQRU5EUykKLSAgICBjbWFrZV9wYXJzZV9hcmd1bWVudHMoX0dPICIke29wdGlvbnN9IiAiJHtvbmVWYWx1ZUFyZ3N9IiAiJHttdWx0aVZhbHVlQXJnc30iICR7QVJHTn0pCi0gICAgaWYgKE5PVCBfR09fSU5QVVQpCi0gICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJJbnZhbGlkIGFyZ3VtZW50cy4gIGdlbmVyYXRlX291dCByZXF1aXJlcyBpbnB1dC4iKQotICAgIGVuZGlmKCkKLSAgICBpZiAoTk9UIF9HT19PVVRQVVQpCi0gICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJJbnZhbGlkIGFyZ3VtZW50cy4gIGdlbmVyYXRlX291dCByZXF1aXJlcyBvdXRwdXQuIikKLSAgICBlbmRpZigpCi0KLSAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICIke19HT19PVVRQVVR9IgotICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICIke0NNQUtFX0NPTU1BTkR9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItRElOUFVUPSR7X0dPX0lOUFVUfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURPVVRQVVQ9JHtfR09fT1VUUFVUfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvZ2Vub3V0LmNtYWtlIgotICAgICAgICAgICAgICAgICAgICAgICBERVBFTkRTICIke19HT19JTlBVVH0iICR7X0dPX0RFUEVORFN9Ci0gICAgICAgICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQotICBlbmRmdW5jdGlvbigpCi0KLSAgIyBHZW5lcmF0ZSBzcGVjaWZpYyBzb3VyY2UgZmlsZSB3aXRoIGF3awotICAjIGdlbmVyYXRlX3NvdXJjZShPVVRQVVQgb3V0cHV0ZmlsZSBbREVQRU5EUyBkZXAxIFtkZXAyLi4uXV0pCi0gIGZ1bmN0aW9uKGdlbmVyYXRlX3NvdXJjZSkKLSAgICBzZXQob3B0aW9ucykKLSAgICBzZXQob25lVmFsdWVBcmdzIE9VVFBVVCkKLSAgICBzZXQobXVsdGlWYWx1ZUFyZ3MgREVQRU5EUykKLSAgICBjbWFrZV9wYXJzZV9hcmd1bWVudHMoX0dTTyAiJHtvcHRpb25zfSIgIiR7b25lVmFsdWVBcmdzfSIgIiR7bXVsdGlWYWx1ZUFyZ3N9IiAke0FSR059KQotICAgIGlmIChOT1QgX0dTT19PVVRQVVQpCi0gICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJJbnZhbGlkIGFyZ3VtZW50cy4gIGdlbmVyYXRlX3NvdXJjZSByZXF1aXJlcyBvdXRwdXQuIikKLSAgICBlbmRpZigpCi0KLSAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtfR1NPX09VVFBVVH0iCi0gICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgIiR7Q01BS0VfQ09NTUFORH0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1ET1VUUFVUPSR7X0dTT19PVVRQVVR9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2NyaXB0cy9nZW5zcmMuY21ha2UiCi0gICAgICAgICAgICAgICAgICAgICAgIERFUEVORFMgJHtfR1NPX0RFUEVORFN9Ci0gICAgICAgICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQotICBlbmRmdW5jdGlvbigpCi0KLSAgIyBDb3B5IGZpbGUKLSAgZnVuY3Rpb24oZ2VuZXJhdGVfY29weSBzb3VyY2UgZGVzdGluYXRpb24pCi0gICAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAiJHtkZXN0aW5hdGlvbn0iCi0gICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgIiR7Q01BS0VfQ09NTUFORH0iIC1FIHJlbW92ZSAiJHtkZXN0aW5hdGlvbn0iCi0gICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgIiR7Q01BS0VfQ09NTUFORH0iIC1FIGNvcHkgIiR7c291cmNlfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtkZXN0aW5hdGlvbn0iCi0gICAgICAgICAgICAgICAgICAgICAgIERFUEVORFMgIiR7c291cmNlfSIpCi0gIGVuZGZ1bmN0aW9uKCkKLQotICAjIEdlbmVyYXRlIHNjcmlwdHMvcG5nbGliY29uZi5oCi0gIGdlbmVyYXRlX3NvdXJjZShPVVRQVVQgInNjcmlwdHMvcG5nbGliY29uZi5jIgotICAgICAgICAgICAgICAgICAgREVQRU5EUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NjcmlwdHMvcG5nbGliY29uZi5kZmEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc2NyaXB0cy9vcHRpb25zLmF3ayIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9wbmdjb25mLmgiKQotCi0gICMgR2VuZXJhdGUgcG5nbGliY29uZi5jCi0gIGdlbmVyYXRlX3NvdXJjZShPVVRQVVQgInBuZ2xpYmNvbmYuYyIKLSAgICAgICAgICAgICAgICAgIERFUEVORFMgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NjcmlwdHMvb3B0aW9ucy5hd2siCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5nY29uZi5oIikKLQotICBpZihQTkdfUFJFRklYKQotICAgIHNldChQTkdMSUJDT05GX0hfRVhUUkFfREVQRU5EUwotICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvcHJlZml4Lm91dCIKLSAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zY3JpcHRzL21hY3JvLmxzdCIpCi0gICAgc2V0KFBOR1BSRUZJWF9IX0VYVFJBX0RFUEVORFMKLSAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL2ludHByZWZpeC5vdXQiKQotICBlbmRpZigpCi0KLSAgZ2VuZXJhdGVfb3V0KElOUFVUICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcG5nbGliY29uZi5jIgotICAgICAgICAgICAgICAgT1VUUFVUICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcG5nbGliY29uZi5vdXQiKQotCi0gICMgR2VuZXJhdGUgcG5nbGliY29uZi5oCi0gIGdlbmVyYXRlX3NvdXJjZShPVVRQVVQgInBuZ2xpYmNvbmYuaCIKLSAgICAgICAgICAgICAgICAgIERFUEVORFMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9wbmdsaWJjb25mLm91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJHtQTkdMSUJDT05GX0hfRVhUUkFfREVQRU5EU30pCi0KLSAgZ2VuZXJhdGVfb3V0KElOUFVUICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc2NyaXB0cy9pbnRwcmVmaXguYyIKLSAgICAgICAgICAgICAgIE9VVFBVVCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvaW50cHJlZml4Lm91dCIKLSAgICAgICAgICAgICAgIERFUEVORFMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9wbmdsaWJjb25mLmgiKQotCi0gIGdlbmVyYXRlX291dChJTlBVVCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NjcmlwdHMvcHJlZml4LmMiCi0gICAgICAgICAgICAgICBPVVRQVVQgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL3ByZWZpeC5vdXQiCi0gICAgICAgICAgICAgICBERVBFTkRTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5nLmgiCi0gICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5nY29uZi5oIgotICAgICAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BuZ2xpYmNvbmYub3V0IikKLQotICAjIEdlbmVyYXRlIHBuZ3ByZWZpeC5oCi0gIGdlbmVyYXRlX3NvdXJjZShPVVRQVVQgInBuZ3ByZWZpeC5oIgotICAgICAgICAgICAgICAgICAgREVQRU5EUyAke1BOR1BSRUZJWF9IX0VYVFJBX0RFUEVORFN9KQotCi0gIGdlbmVyYXRlX291dChJTlBVVCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NjcmlwdHMvc3ltLmMiCi0gICAgICAgICAgICAgICBPVVRQVVQgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL3N5bS5vdXQiCi0gICAgICAgICAgICAgICBERVBFTkRTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcG5nbGliY29uZi5oIikKLQotICBnZW5lcmF0ZV9vdXQoSU5QVVQgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zY3JpcHRzL3N5bWJvbHMuYyIKLSAgICAgICAgICAgICAgIE9VVFBVVCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvc3ltYm9scy5vdXQiCi0gICAgICAgICAgICAgICBERVBFTkRTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5nLmgiCi0gICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5nY29uZi5oIgotICAgICAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0IikKLQotICBnZW5lcmF0ZV9vdXQoSU5QVVQgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zY3JpcHRzL3ZlcnMuYyIKLSAgICAgICAgICAgICAgIE9VVFBVVCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvdmVycy5vdXQiCi0gICAgICAgICAgICAgICBERVBFTkRTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5nLmgiCi0gICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcG5nY29uZi5oIgotICAgICAgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BuZ2xpYmNvbmYuaCIpCi0KLSAgZ2VuZXJhdGVfY2hrKElOUFVUICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2NyaXB0cy9zeW1ib2xzLm91dCIKLSAgICAgICAgICAgICAgIE9VVFBVVCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvc3ltYm9scy5jaGsiCi0gICAgICAgICAgICAgICBERVBFTkRTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc2NyaXB0cy9jaGVja3N5bS5hd2siCi0gICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc2NyaXB0cy9zeW1ib2xzLmRlZiIpCi0KLSAgYWRkX2N1c3RvbV90YXJnZXQoc3ltYm9sLWNoZWNrIERFUEVORFMKLSAgICAgICAgICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL3N5bWJvbHMuY2hrIikKLQotICBnZW5lcmF0ZV9jb3B5KCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2NyaXB0cy9zeW0ub3V0IgotICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nLnN5bSIpCi0gIGdlbmVyYXRlX2NvcHkoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL3ZlcnMub3V0IgotICAgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nLnZlcnMiKQotCi0gIGFkZF9jdXN0b21fdGFyZ2V0KGdlbnZlcnMgREVQRU5EUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy52ZXJzIikKLSAgYWRkX2N1c3RvbV90YXJnZXQoZ2Vuc3ltIERFUEVORFMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJwbmcuc3ltIikKLQotICBhZGRfY3VzdG9tX3RhcmdldCgiZ2VucHJlYnVpbHQiCi0gICAgICAgICAgICAgICAgICAgIENPTU1BTkQgIiR7Q01BS0VfQ09NTUFORH0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1ET1VUUFVUPXNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2NyaXB0cy9nZW5zcmMuY21ha2UiCi0gICAgICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQotCi0gICMgQSBzaW5nbGUgdGFyZ2V0IGhhbmRsZXMgZ2VuZXJhdGlvbiBvZiBhbGwgZ2VuZXJhdGVkIGZpbGVzLiAgSWYKLSAgIyB0aGV5IGFyZSBkZXBlbmRlbmQgdXBvbiBzZXBhcmF0ZWx5IGJ5IG11bHRpcGxlIHRhcmdldHMsIHRoaXMKLSAgIyBjb25mdXNlcyBwYXJhbGxlbCBtYWtlIChpdCB3b3VsZCByZXF1aXJlIGEgc2VwYXJhdGUgdG9wLWxldmVsCi0gICMgdGFyZ2V0IGZvciBlYWNoIGZpbGUgdG8gdHJhY2sgdGhlIGRlcGVuZGVuY2llcyBwcm9wZXJseSkuCi0gIGFkZF9jdXN0b21fdGFyZ2V0KGdlbmZpbGVzIERFUEVORFMKLSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy5zeW0iCi0gICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJwbmcudmVycyIKLSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BuZ2xpYmNvbmYuYyIKLSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BuZ2xpYmNvbmYuaCIKLSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BuZ2xpYmNvbmYub3V0IgotICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcG5ncHJlZml4LmgiCi0gICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL2ludHByZWZpeC5vdXQiCi0gICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL3BuZ2xpYmNvbmYuYyIKLSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvcHJlZml4Lm91dCIKLSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvc3ltLm91dCIKLSAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvc3ltYm9scy5jaGsiCi0gICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL3N5bWJvbHMub3V0IgotICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2NyaXB0cy92ZXJzLm91dCIpCi1lbmRpZihOT1QgQVdLKQotCi0jIE9VUiBTT1VSQ0VTCi1zZXQobGlicG5nX3B1YmxpY19oZHJzCi0gIHBuZy5oCi0gIHBuZ2NvbmYuaAotICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BuZ2xpYmNvbmYuaCIKLSkKLXNldChsaWJwbmdfcHJpdmF0ZV9oZHJzCi0gIHBuZ3ByaXYuaAotICBwbmdkZWJ1Zy5oCi0gIHBuZ2luZm8uaAotICBwbmdzdHJ1Y3QuaAotKQotaWYoQVdLKQotICBsaXN0KEFQUEVORCBsaWJwbmdfcHJpdmF0ZV9oZHJzICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcG5ncHJlZml4LmgiKQotZW5kaWYoKQotc2V0KGxpYnBuZ19zb3VyY2VzCi0gICR7bGlicG5nX3B1YmxpY19oZHJzfQotICAke2xpYnBuZ19wcml2YXRlX2hkcnN9Ci0gIHBuZy5jCi0gIHBuZ2Vycm9yLmMKLSAgcG5nZ2V0LmMKLSAgcG5nbWVtLmMKLSAgcG5ncHJlYWQuYwotICBwbmdyZWFkLmMKLSAgcG5ncmlvLmMKLSAgcG5ncnRyYW4uYwotICBwbmdydXRpbC5jCi0gIHBuZ3NldC5jCi0gIHBuZ3RyYW5zLmMKLSAgcG5nd2lvLmMKLSAgcG5nd3JpdGUuYwotICBwbmd3dHJhbi5jCi0gIHBuZ3d1dGlsLmMKLSkKLXNldChwbmd0ZXN0X3NvdXJjZXMKLSAgcG5ndGVzdC5jCi0pCi1zZXQocG5ndmFsaWRfc291cmNlcwotICBjb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLmMKLSkKLXNldChwbmdzdGVzdF9zb3VyY2VzCi0gIGNvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QuYwotKQotc2V0KHBuZ3Vua25vd25fc291cmNlcwotICBjb250cmliL2xpYnRlc3RzL3BuZ3Vua25vd24uYwotKQotc2V0KHBuZ2ltYWdlX3NvdXJjZXMKLSAgY29udHJpYi9saWJ0ZXN0cy9wbmdpbWFnZS5jCi0pCi1zZXQocG5nZml4X3NvdXJjZXMKLSAgY29udHJpYi90b29scy9wbmdmaXguYwotKQotc2V0KHBuZ19maXhfaXR4dF9zb3VyY2VzCi0gIGNvbnRyaWIvdG9vbHMvcG5nLWZpeC1pdHh0LmMKLSkKLQotaWYoTVNWQykKLSAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKQotZW5kaWYoTVNWQykKLQotaWYoUE5HX0RFQlVHKQotICBhZGRfZGVmaW5pdGlvbnMoLURQTkdfREVCVUcpCi1lbmRpZigpCi0KLSMgTk9XIEJVSUxEIE9VUiBUQVJHRVQKLWluY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7WkxJQl9JTkNMVURFX0RJUn0pCi0KLXVuc2V0KFBOR19MSUJfVEFSR0VUUykKLQotaWYoUE5HX1NIQVJFRCkKLSAgYWRkX2xpYnJhcnkocG5nIFNIQVJFRCAke2xpYnBuZ19zb3VyY2VzfSkKLSAgc2V0KFBOR19MSUJfVEFSR0VUUyBwbmcpCi0gIHNldF90YXJnZXRfcHJvcGVydGllcyhwbmcgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSAke1BOR19MSUJfTkFNRX0pCi0gIGFkZF9kZXBlbmRlbmNpZXMocG5nIGdlbmZpbGVzKQotICBpZihNU1ZDKQotICAgICMgbXN2YyBkb2VzIG5vdCBhcHBlbmQgJ2xpYicgLSBkbyBpdCBoZXJlIHRvIGhhdmUgY29uc2lzdGVudCBuYW1lCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHBuZyBQUk9QRVJUSUVTIFBSRUZJWCAibGliIikKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMocG5nIFBST1BFUlRJRVMgSU1QT1JUX1BSRUZJWCAibGliIikKLSAgZW5kaWYoKQotICB0YXJnZXRfbGlua19saWJyYXJpZXMocG5nICR7WkxJQl9MSUJSQVJZfSAke01fTElCUkFSWX0pCi0KLSAgaWYoVU5JWCBBTkQgQVdLKQotICAgIGlmKEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQpCi0gICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMocG5nIFBST1BFUlRJRVMgTElOS19GTEFHUwotICAgICAgICAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JyR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJwbmcudmVycyciKQotICAgIGVsc2VpZihIQVZFX1NPTEFSSVNfTERfVkVSU0lPTl9TQ1JJUFQpCi0gICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMocG5nIFBST1BFUlRJRVMgTElOS19GTEFHUwotICAgICAgICAiLVdsLC1NIC1XbCwnJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy52ZXJzJyIpCi0gICAgZW5kaWYoKQotICBlbmRpZigpCi1lbmRpZigpCi0KLWlmKFBOR19TVEFUSUMpCi0gICMgZG9lcyBub3Qgd29yayB3aXRob3V0IGNoYW5naW5nIG5hbWUKLSAgc2V0KFBOR19MSUJfTkFNRV9TVEFUSUMgcG5nX3N0YXRpYykKLSAgYWRkX2xpYnJhcnkocG5nX3N0YXRpYyBTVEFUSUMgJHtsaWJwbmdfc291cmNlc30pCi0gIGFkZF9kZXBlbmRlbmNpZXMocG5nX3N0YXRpYyBnZW5maWxlcykKLSAgIyBNU1ZDIGRvZXNuJ3QgdXNlIGEgZGlmZmVyZW50IGZpbGUgZXh0ZW5zaW9uIGZvciBzaGFyZWQgdnMuIHN0YXRpYwotICAjIGxpYnMuICBXZSBhcmUgYWJsZSB0byBjaGFuZ2UgT1VUUFVUX05BTUUgdG8gcmVtb3ZlIHRoZSBfc3RhdGljCi0gICMgZm9yIGFsbCBvdGhlciBwbGF0Zm9ybXMuCi0gIGlmKE5PVCBNU1ZDKQotICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhwbmdfc3RhdGljIFBST1BFUlRJRVMKLSAgICAgIE9VVFBVVF9OQU1FICIke1BOR19MSUJfTkFNRX0iCi0gICAgICBDTEVBTl9ESVJFQ1RfT1VUUFVUIDEpCi0gIGVsc2UoKQotICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhwbmdfc3RhdGljIFBST1BFUlRJRVMKLSAgICAgIE9VVFBVVF9OQU1FICIke1BOR19MSUJfTkFNRX1fc3RhdGljIgotICAgICAgQ0xFQU5fRElSRUNUX09VVFBVVCAxKQotICBlbmRpZigpCi0gIGxpc3QoQVBQRU5EIFBOR19MSUJfVEFSR0VUUyBwbmdfc3RhdGljKQotICBpZihNU1ZDKQotICAgICMgbXN2YyBkb2VzIG5vdCBhcHBlbmQgJ2xpYicgLSBkbyBpdCBoZXJlIHRvIGhhdmUgY29uc2lzdGVudCBuYW1lCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHBuZ19zdGF0aWMgUFJPUEVSVElFUyBQUkVGSVggImxpYiIpCi0gIGVuZGlmKCkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBuZ19zdGF0aWMgJHtaTElCX0xJQlJBUll9ICR7TV9MSUJSQVJZfSkKLWVuZGlmKCkKLQotaWYoUE5HX0ZSQU1FV09SSykKLSAgc2V0KFBOR19MSUJfTkFNRV9GUkFNRVdPUksgcG5nX2ZyYW1ld29yaykKLSAgYWRkX2xpYnJhcnkocG5nX2ZyYW1ld29yayBTSEFSRUQgJHtsaWJwbmdfc291cmNlc30pCi0gIGFkZF9kZXBlbmRlbmNpZXMocG5nX2ZyYW1ld29yayBnZW5maWxlcykKLSAgbGlzdChBUFBFTkQgUE5HX0xJQl9UQVJHRVRTIHBuZ19mcmFtZXdvcmspCi0gIHNldF90YXJnZXRfcHJvcGVydGllcyhwbmdfZnJhbWV3b3JrIFBST1BFUlRJRVMKLSAgICBGUkFNRVdPUksgVFJVRQotICAgIEZSQU1FV09SS19WRVJTSU9OICR7UE5HTElCX1ZFUlNJT059Ci0gICAgTUFDT1NYX0ZSQU1FV09SS19TSE9SVF9WRVJTSU9OX1NUUklORyAke1BOR0xJQl9NQUpPUn0uJHtQTkdMSUJfTUlOT1J9Ci0gICAgTUFDT1NYX0ZSQU1FV09SS19CVU5ETEVfVkVSU0lPTiAke1BOR0xJQl9WRVJTSU9OfQotICAgIE1BQ09TWF9GUkFNRVdPUktfSURFTlRJRklFUiBvcmcubGlicG5nLmxpYnBuZwotICAgIFhDT0RFX0FUVFJJQlVURV9JTlNUQUxMX1BBVEggIkBycGF0aCIKLSAgICBQVUJMSUNfSEVBREVSICIke2xpYnBuZ19wdWJsaWNfaGRyc30iCi0gICAgT1VUUFVUX05BTUUgcG5nKQotICB0YXJnZXRfbGlua19saWJyYXJpZXMocG5nX2ZyYW1ld29yayAke1pMSUJfTElCUkFSWX0gJHtNX0xJQlJBUll9KQotZW5kaWYoKQotCi1pZihOT1QgUE5HX0xJQl9UQVJHRVRTKQotICBtZXNzYWdlKFNFTkRfRVJST1IKLSAgICAiTm8gbGlicmFyeSB2YXJpYW50IHNlbGVjdGVkIHRvIGJ1aWxkLiAiCi0gICAgIlBsZWFzZSBlbmFibGUgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogIgotICAgICIgUE5HX1NUQVRJQywgUE5HX1NIQVJFRCwgUE5HX0ZSQU1FV09SSyIpCi1lbmRpZigpCi0KLWlmKFBOR19TSEFSRUQgQU5EIFdJTjMyKQotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMocG5nIFBST1BFUlRJRVMgREVGSU5FX1NZTUJPTCBQTkdfQlVJTERfRExMKQotZW5kaWYoKQotCi1mdW5jdGlvbihwbmdfYWRkX3Rlc3QpCi0gIHNldChvcHRpb25zKQotICBzZXQob25lVmFsdWVBcmdzIE5BTUUgQ09NTUFORCkKLSAgc2V0KG11bHRpVmFsdWVBcmdzIE9QVElPTlMgRklMRVMpCi0gIGNtYWtlX3BhcnNlX2FyZ3VtZW50cyhfUEFUICIke29wdGlvbnN9IiAiJHtvbmVWYWx1ZUFyZ3N9IiAiJHttdWx0aVZhbHVlQXJnc30iICR7QVJHTn0pCi0KLSAgaWYgKE5PVCBfUEFUX05BTUUpCi0gICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiSW52YWxpZCBhcmd1bWVudHMuICBwbmdfYWRkX3Rlc3QgcmVxdWlyZXMgbmFtZS4iKQotICBlbmRpZigpCi0gIGlmIChOT1QgX1BBVF9DT01NQU5EKQotICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkludmFsaWQgYXJndW1lbnRzLiAgcG5nX2FkZF90ZXN0IHJlcXVpcmVzIGNvbW1hbmQuIikKLSAgZW5kaWYoKQotCi0gIHNldChURVNUX09QVElPTlMgIiR7X1BBVF9PUFRJT05TfSIpCi0gIHNldChURVNUX0ZJTEVTICIke19QQVRfRklMRVN9IikKLQotICBjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NjcmlwdHMvdGVzdC5jbWFrZS5pbiIKLSAgICAgICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90ZXN0cy8ke19QQVRfTkFNRX0uY21ha2UiIEBPTkxZKQotICBpZihDTUFLRV9NQUpPUl9WRVJTSU9OIEdSRUFURVIgMikgIyBoYXZlIGdlbmVyYXRvciBleHByZXNzaW9ucwotICAgIGFkZF90ZXN0KE5BTUUgIiR7X1BBVF9OQU1FfSIKLSAgICAgICAgICAgICBDT01NQU5EICIke0NNQUtFX0NPTU1BTkR9IgotICAgICAgICAgICAgICItRExJQlBORz0kPFRBUkdFVF9GSUxFOnBuZz4iCi0gICAgICAgICAgICAgIi1EVEVTVF9DT01NQU5EPSQ8VEFSR0VUX0ZJTEU6JHtfUEFUX0NPTU1BTkR9PiIKLSAgICAgICAgICAgICAtUCAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3RzLyR7X1BBVF9OQU1FfS5jbWFrZSIpCi0gIGVsc2UoKSAjIG9sZCAyLnggYWRkX3Rlc3Q7IGxpbWl0ZWQgYW5kIHdvbid0IHdvcmsgd2VsbCBvbiBXaW5kb3dzCi0gICAgIyBOb3RlIExJQlBORyBpcyBhIGR1bW15IHZhbHVlIGFzIHRoZXJlIGFyZSBubyBnZW5lcmF0b3IgZXhwcmVzc2lvbnMKLSAgICBhZGRfdGVzdCgiJHtfUEFUX05BTUV9IiAiJHtDTUFLRV9DT01NQU5EfSIKLSAgICAgICAgICAgICAiLURMSUJQTkc9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy5zbyIKLSAgICAgICAgICAgICAiLURURVNUX0NPTU1BTkQ9Li8ke19QQVRfQ09NTUFORH0iCi0gICAgICAgICAgICAgLVAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90ZXN0cy8ke19QQVRfTkFNRX0uY21ha2UiKQotICBlbmRpZigpCi1lbmRmdW5jdGlvbigpCi0KLWlmKFBOR19URVNUUyBBTkQgUE5HX1NIQVJFRCkKLSAgIyBGaW5kIHRlc3QgUE5HIGZpbGVzIGJ5IGdsb2JiaW5nLCBidXQgc29ydCBsaXN0cyB0byBlbnN1cmUKLSAgIyBjb25zaXN0ZW5jeSBiZXR3ZWVuIGRpZmZlcmVudCBmaWxlc3lzdGVtcy4KLSAgZmlsZShHTE9CIFBOR1NVSVRFX1BOR1MgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb250cmliL3BuZ3N1aXRlLyoucG5nIikKLSAgbGlzdChTT1JUIFBOR1NVSVRFX1BOR1MpCi0gIGZpbGUoR0xPQiBURVNUX1BOR1MgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb250cmliL3Rlc3RwbmdzLyoucG5nIikKLSAgbGlzdChTT1JUIFRFU1RfUE5HUykKLQotICBzZXQoUE5HVEVTVF9QTkcgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9wbmd0ZXN0LnBuZyIpCi0KLSAgYWRkX2V4ZWN1dGFibGUocG5ndGVzdCAke3BuZ3Rlc3Rfc291cmNlc30pCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbmd0ZXN0IHBuZykKLQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmd0ZXN0IENPTU1BTkQgcG5ndGVzdCBGSUxFUyAiJHtQTkdURVNUX1BOR30iKQotCi0gIGFkZF9leGVjdXRhYmxlKHBuZ3ZhbGlkICR7cG5ndmFsaWRfc291cmNlc30pCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbmd2YWxpZCBwbmcpCi0KLSAgcG5nX2FkZF90ZXN0KE5BTUUgcG5ndmFsaWQtZ2FtbWEtMTYtdG8tOAotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tZ2FtbWEtMTYtdG8tOCkKLSAgcG5nX2FkZF90ZXN0KE5BTUUgcG5ndmFsaWQtZ2FtbWEtYWxwaGEtbW9kZQotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tZ2FtbWEtYWxwaGEtbW9kZSkKLSAgcG5nX2FkZF90ZXN0KE5BTUUgcG5ndmFsaWQtZ2FtbWEtYmFja2dyb3VuZAotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tZ2FtbWEtYmFja2dyb3VuZCkKLSAgcG5nX2FkZF90ZXN0KE5BTUUgcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtYWxwaGEtbW9kZQotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tZ2FtbWEtYWxwaGEtbW9kZSAtLWV4cGFuZDE2KQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmd2YWxpZC1nYW1tYS1leHBhbmQxNi1iYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICBDT01NQU5EIHBuZ3ZhbGlkIE9QVElPTlMgLS1nYW1tYS1iYWNrZ3JvdW5kIC0tZXhwYW5kMTYpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LXRyYW5zZm9ybQotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tZ2FtbWEtdHJhbnNmb3JtIC0tZXhwYW5kMTYpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3ZhbGlkLWdhbW1hLXNiaXQKLSAgICAgICAgICAgICAgIENPTU1BTkQgcG5ndmFsaWQgT1BUSU9OUyAtLWdhbW1hLXNiaXQpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3ZhbGlkLWdhbW1hLXRocmVzaG9sZAotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tZ2FtbWEtdGhyZXNob2xkKQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmd2YWxpZC1nYW1tYS10cmFuc2Zvcm0KLSAgICAgICAgICAgICAgIENPTU1BTkQgcG5ndmFsaWQgT1BUSU9OUyAtLWdhbW1hLXRyYW5zZm9ybSkKLSAgcG5nX2FkZF90ZXN0KE5BTUUgcG5ndmFsaWQtcHJvZ3Jlc3NpdmUtaW50ZXJsYWNlLXN0YW5kYXJkCi0gICAgICAgICAgICAgICBDT01NQU5EIHBuZ3ZhbGlkIE9QVElPTlMgLS1zdGFuZGFyZCAtLXByb2dyZXNzaXZlLXJlYWQgLS1pbnRlcmxhY2UpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3ZhbGlkLXByb2dyZXNzaXZlLXNpemUKLSAgICAgICAgICAgICAgIENPTU1BTkQgcG5ndmFsaWQgT1BUSU9OUyAtLXNpemUgLS1wcm9ncmVzc2l2ZS1yZWFkKQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmd2YWxpZC1wcm9ncmVzc2l2ZS1zdGFuZGFyZAotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tc3RhbmRhcmQgLS1wcm9ncmVzc2l2ZS1yZWFkKQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmd2YWxpZC1zdGFuZGFyZAotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tc3RhbmRhcmQpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3ZhbGlkLXRyYW5zZm9ybQotICAgICAgICAgICAgICAgQ09NTUFORCBwbmd2YWxpZCBPUFRJT05TIC0tdHJhbnNmb3JtKQotCi0gIGFkZF9leGVjdXRhYmxlKHBuZ3N0ZXN0ICR7cG5nc3Rlc3Rfc291cmNlc30pCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbmdzdGVzdCBwbmcpCi0KLSAgZm9yZWFjaChnYW1tYV90eXBlIDEuOCBsaW5lYXIgbm9uZSBzUkdCKQotICAgIGZvcmVhY2goYWxwaGFfdHlwZSBub25lIGFscGhhKQotICAgICAgc2V0KFBOR1NURVNUX0ZJTEVTKQotICAgICAgZm9yZWFjaCh0ZXN0X3BuZyAke1RFU1RfUE5HU30pCi0gICAgICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiLiotbGluZWFyWy0uXS4qIiBURVNUX1BOR19MSU5FQVIgIiR7dGVzdF9wbmd9IikKLSAgICAgICAgc3RyaW5nKFJFR0VYIE1BVENIICIuKi1zUkdCWy0uXS4qIiBURVNUX1BOR19TUkdCICIke3Rlc3RfcG5nfSIpCi0gICAgICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiLiotMS44Wy0uXS4qIiBURVNUX1BOR19HMTggIiR7dGVzdF9wbmd9IikKLSAgICAgICAgc3RyaW5nKFJFR0VYIE1BVENIICIuKi1hbHBoYS0uKiIgVEVTVF9QTkdfQUxQSEEgIiR7dGVzdF9wbmd9IikKLQotICAgICAgICBzZXQoVEVTVF9QTkdfVkFMSUQgVFJVRSkKLQotICAgICAgICBpZihURVNUX1BOR19BTFBIQSkKLSAgICAgICAgICBpZiAoTk9UICIke2FscGhhX3R5cGV9IiBTVFJFUVVBTCAiYWxwaGEiKQotICAgICAgICAgICAgc2V0KFRFU1RfUE5HX1ZBTElEIEZBTFNFKQotICAgICAgICAgIGVuZGlmKCkKLSAgICAgICAgZWxzZSgpCi0gICAgICAgICAgaWYgKCIke2FscGhhX3R5cGV9IiBTVFJFUVVBTCAiYWxwaGEiKQotICAgICAgICAgICAgc2V0KFRFU1RfUE5HX1ZBTElEIEZBTFNFKQotICAgICAgICAgIGVuZGlmKCkKLSAgICAgICAgZW5kaWYoKQotCi0gICAgICAgIGlmKFRFU1RfUE5HX0xJTkVBUikKLSAgICAgICAgICBpZihOT1QgIiR7Z2FtbWFfdHlwZX0iIFNUUkVRVUFMICJsaW5lYXIiKQotICAgICAgICAgICAgc2V0KFRFU1RfUE5HX1ZBTElEIEZBTFNFKQotICAgICAgICAgIGVuZGlmKCkKLSAgICAgICAgZWxzZWlmKFRFU1RfUE5HX1NSR0IpCi0gICAgICAgICAgaWYoTk9UICIke2dhbW1hX3R5cGV9IiBTVFJFUVVBTCAic1JHQiIpCi0gICAgICAgICAgICBzZXQoVEVTVF9QTkdfVkFMSUQgRkFMU0UpCi0gICAgICAgICAgZW5kaWYoKQotICAgICAgICBlbHNlaWYoVEVTVF9QTkdfRzE4KQotICAgICAgICAgIGlmKE5PVCAiJHtnYW1tYV90eXBlfSIgU1RSRVFVQUwgIjEuOCIpCi0gICAgICAgICAgICBzZXQoVEVTVF9QTkdfVkFMSUQgRkFMU0UpCi0gICAgICAgICAgZW5kaWYoKQotICAgICAgICBlbHNlKCkKLSAgICAgICAgICBpZihOT1QgIiR7Z2FtbWFfdHlwZX0iIFNUUkVRVUFMICJub25lIikKLSAgICAgICAgICAgIHNldChURVNUX1BOR19WQUxJRCBGQUxTRSkKLSAgICAgICAgICBlbmRpZigpCi0gICAgICAgIGVuZGlmKCkKLQotICAgICAgICBpZihURVNUX1BOR19WQUxJRCkKLSAgICAgICAgICBsaXN0KEFQUEVORCBQTkdTVEVTVF9GSUxFUyAiJHt0ZXN0X3BuZ30iKQotICAgICAgICBlbmRpZigpCi0gICAgICBlbmRmb3JlYWNoKCkKLSAgICAgICMgU2hvdWxkIGFscmVhZHkgYmUgc29ydGVkLCBidXQgc29ydCBhbnl3YXkgdG8gYmUgY2VydGFpbi4KLSAgICAgIGxpc3QoU09SVCBQTkdTVEVTVF9GSUxFUykKLSAgICAgIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3N0ZXN0LSR7Z2FtbWFfdHlwZX0tJHthbHBoYV90eXBlfQotICAgICAgICAgICAgICAgICAgIENPTU1BTkQgcG5nc3Rlc3QKLSAgICAgICAgICAgICAgICAgICBPUFRJT05TIC0tdG1wZmlsZSAiJHtnYW1tYV90eXBlfS0ke2FscGhhX3R5cGV9LSIgLS1sb2cKLSAgICAgICAgICAgICAgICAgICBGSUxFUyAke1BOR1NURVNUX0ZJTEVTfSkKLSAgICBlbmRmb3JlYWNoKCkKLSAgZW5kZm9yZWFjaCgpCi0KLSAgYWRkX2V4ZWN1dGFibGUocG5ndW5rbm93biAke3BuZ3Vua25vd25fc291cmNlc30pCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbmd1bmtub3duIHBuZykKLQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmd1bmtub3duLWRpc2NhcmQgQ09NTUFORCBwbmd1bmtub3duIE9QVElPTlMgLS1zdHJpY3QgZGVmYXVsdD1kaXNjYXJkIEZJTEVTICIke1BOR1RFU1RfUE5HfSIpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3Vua25vd24tSURBVCBDT01NQU5EIHBuZ3Vua25vd24gT1BUSU9OUyAtLXN0cmljdCBkZWZhdWx0PWRpc2NhcmQgSURBVD1zYXZlIEZJTEVTICIke1BOR1RFU1RfUE5HfSIpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3Vua25vd24taWYtc2FmZSBDT01NQU5EIHBuZ3Vua25vd24gT1BUSU9OUyAtLXN0cmljdCBkZWZhdWx0PWlmLXNhZmUgRklMRVMgIiR7UE5HVEVTVF9QTkd9IikKLSAgcG5nX2FkZF90ZXN0KE5BTUUgcG5ndW5rbm93bi1zQVBJIENPTU1BTkQgcG5ndW5rbm93biBPUFRJT05TIC0tc3RyaWN0IGJLR0Q9c2F2ZSBjSFJNPXNhdmUgZ0FNQT1zYXZlIGFsbD1kaXNjYXJkIGlDQ1A9c2F2ZSBzQklUPXNhdmUgc1JHQj1zYXZlIEZJTEVTICIke1BOR1RFU1RfUE5HfSIpCi0gIHBuZ19hZGRfdGVzdChOQU1FIHBuZ3Vua25vd24tc2F2ZSBDT01NQU5EIHBuZ3Vua25vd24gT1BUSU9OUyAtLXN0cmljdCBkZWZhdWx0PXNhdmUgRklMRVMgIiR7UE5HVEVTVF9QTkd9IikKLSAgcG5nX2FkZF90ZXN0KE5BTUUgcG5ndW5rbm93bi1zVEVSIENPTU1BTkQgcG5ndW5rbm93biBPUFRJT05TIC0tc3RyaWN0IHNURVI9aWYtc2FmZSBGSUxFUyAiJHtQTkdURVNUX1BOR30iKQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmd1bmtub3duLXZwQWcgQ09NTUFORCBwbmd1bmtub3duIE9QVElPTlMgLS1zdHJpY3QgdnBBZz1pZi1zYWZlIEZJTEVTICIke1BOR1RFU1RfUE5HfSIpCi0KLSAgYWRkX2V4ZWN1dGFibGUocG5naW1hZ2UgJHtwbmdpbWFnZV9zb3VyY2VzfSkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBuZ2ltYWdlIHBuZykKLQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmdpbWFnZS1xdWljayBDT01NQU5EIHBuZ2ltYWdlIE9QVElPTlMgLS1saXN0LWNvbWJvcyAtLWxvZyBGSUxFUyAke1BOR1NVSVRFX1BOR1N9KQotICBwbmdfYWRkX3Rlc3QoTkFNRSBwbmdpbWFnZS1mdWxsIENPTU1BTkQgcG5naW1hZ2UgT1BUSU9OUyAtLWV4aGF1c3RpdmUgLS1saXN0LWNvbWJvcyAtLWxvZyBGSUxFUyAke1BOR1NVSVRFX1BOR1N9KQotZW5kaWYoKQotCi1pZihQTkdfU0hBUkVEKQotICBhZGRfZXhlY3V0YWJsZShwbmdmaXggJHtwbmdmaXhfc291cmNlc30pCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbmdmaXggcG5nKQotICBzZXQoUE5HX0JJTl9UQVJHRVRTIHBuZ2ZpeCkKLQotICBhZGRfZXhlY3V0YWJsZShwbmctZml4LWl0eHQgJHtwbmdfZml4X2l0eHRfc291cmNlc30pCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbmctZml4LWl0eHQgJHtaTElCX0xJQlJBUll9ICR7TV9MSUJSQVJZfSkKLSAgbGlzdChBUFBFTkQgUE5HX0JJTl9UQVJHRVRTIHBuZy1maXgtaXR4dCkKLWVuZGlmKCkKLQotIyBFbnN1cmUgdGhlIENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSBpcyBzZXQKLUlGKE5PVCBDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCi0gIFNFVChDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgImxpYiIpCi1FTkRJRihOT1QgQ01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQotCi0jIFNldCBhIHZhcmlhYmxlIHdpdGggQ01ha2UgY29kZSB3aGljaDoKLSMgQ3JlYXRlcyBhIHN5bWxpbmsgZnJvbSBzcmMgdG8gZGVzdCAoaWYgcG9zc2libGUpIG9yIGFsdGVybmF0aXZlbHkKLSMgY29waWVzIGlmIGRpZmZlcmVudC4KLW1hY3JvKENSRUFURV9TWU1MSU5LIFNSQ19GSUxFIERFU1RfRklMRSkKLSAgRklMRShSRU1PVkUgJHtDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll9LyR7REVTVF9GSUxFfSkKLSAgaWYoV0lOMzIgQU5EIE5PVCBDWUdXSU4gQU5EIE5PVCBNU1lTKQotICAgIEFERF9DVVNUT01fQ09NTUFORCgKLSAgICAgICAgT1VUUFVUICR7Q01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfS8ke0RFU1RfRklMRX0gICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtERVNUX0ZJTEV9Ci0gICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAgIiR7U1JDX0ZJTEV9IiAke0NNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWX0vJHtERVNUX0ZJTEV9Ci0gICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAgIiR7U1JDX0ZJTEV9IiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtERVNUX0ZJTEV9Ci0gICAgICAgIERFUEVORFMgJHtQTkdfTElCX1RBUkdFVFN9Ci0gICAgICAgICkKLSAgICBBRERfQ1VTVE9NX1RBUkdFVCgke0RFU1RfRklMRX1fQ09QWSBBTEwgREVQRU5EUyAke0NNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWX0vJHtERVNUX0ZJTEV9KQotICBlbHNlKFdJTjMyIEFORCBOT1QgQ1lHV0lOIEFORCBOT1QgTVNZUykKLSAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KExJTktfVEFSR0VUICIke1NSQ19GSUxFfSIgTkFNRSkKLSAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke0NNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWX0pCi0gICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjcmVhdGVfc3ltbGluayAiJHtMSU5LX1RBUkdFVH0iICR7Q01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfS8ke0RFU1RfRklMRX0gV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQotICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgIiR7TElOS19UQVJHRVR9IiAke0RFU1RfRklMRX0gV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQotICBlbmRpZihXSU4zMiBBTkQgTk9UIENZR1dJTiBBTkQgTk9UIE1TWVMpCi1lbmRtYWNybygpCi0KLSMgQ3JlYXRlIHNvdXJjZSBnZW5lcmF0aW9uIHNjcmlwdHMuCi1jb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc2NyaXB0cy9nZW5jaGsuY21ha2UuaW4KLSAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY3JpcHRzL2dlbmNoay5jbWFrZSBAT05MWSkKLWNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zY3JpcHRzL2dlbm91dC5jbWFrZS5pbgotICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjcmlwdHMvZ2Vub3V0LmNtYWtlIEBPTkxZKQotY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NjcmlwdHMvZ2Vuc3JjLmNtYWtlLmluCi0gICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2NyaXB0cy9nZW5zcmMuY21ha2UgQE9OTFkpCi0KLQotIyBsaWJwbmcgaXMgYSBsaWJyYXJ5IHNvIGRlZmF1bHQgdG8gJ2xpYicKLWlmKE5PVCBERUZJTkVEIENNQUtFX0lOU1RBTExfTElCRElSKQotICBzZXQoQ01BS0VfSU5TVEFMTF9MSUJESVIgbGliKQotZW5kaWYoTk9UIERFRklORUQgQ01BS0VfSU5TVEFMTF9MSUJESVIpCi0KLSMgQ1JFQVRFIFBLR0NPTkZJRyBGSUxFUwotIyB3ZSB1c2UgdGhlIHNhbWUgZmlsZXMgbGlrZSAuL2NvbmZpZ3VyZSwgc28gd2UgaGF2ZSB0byBzZXQgaXRzIHZhcnMKLSMgT25seSBkbyB0aGlzIG9uIFdpbmRvd3MgZm9yIEN5Z3dpbiAtIHRoZSBmaWxlcyBkb24ndCBtYWtlIG11Y2ggc2Vuc2Ugb3V0c2lkZQotIyBhIFVOSVggbG9vayBhbGlrZQotaWYoTk9UIFdJTjMyIE9SIENZR1dJTiBPUiBNSU5HVykKLSAgc2V0KHByZWZpeCAgICAgICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9KQotICBzZXQoZXhlY19wcmVmaXggJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0pCi0gIHNldChsaWJkaXIgICAgICAke0NNQUtFX0lOU1RBTExfUFJFRklYfS8ke0NNQUtFX0lOU1RBTExfTElCRElSfSkKLSAgc2V0KGluY2x1ZGVkaXIgICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2luY2x1ZGUpCi0gIHNldChMSUJTICAgICAgICAiLWx6IC1sbSIpCi0gIGNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWJwbmcucGMuaW4KLSAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtQTkdMSUJfTkFNRX0ucGMgQE9OTFkpCi0gIENSRUFURV9TWU1MSU5LKCR7UE5HTElCX05BTUV9LnBjIGxpYnBuZy5wYykKLQotICBjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGlicG5nLWNvbmZpZy5pbgotICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke1BOR0xJQl9OQU1FfS1jb25maWcgQE9OTFkpCi0gIENSRUFURV9TWU1MSU5LKCR7UE5HTElCX05BTUV9LWNvbmZpZyBsaWJwbmctY29uZmlnKQotZW5kaWYoTk9UIFdJTjMyIE9SIENZR1dJTiBPUiBNSU5HVykKLQotIyBTRVQgVVAgTElOS1MKLWlmKFBOR19TSEFSRUQpCi0gIHNldF90YXJnZXRfcHJvcGVydGllcyhwbmcgUFJPUEVSVElFUwotIyAgIFZFUlNJT04gMTYuJHtQTkdMSUJfUkVMRUFTRX0uMS42LjI0Ci0gICAgVkVSU0lPTiAxNi4ke1BOR0xJQl9SRUxFQVNFfS4wCi0gICAgU09WRVJTSU9OIDE2Ci0gICAgQ0xFQU5fRElSRUNUX09VVFBVVCAxKQotZW5kaWYoKQotCi0jIElmIENNYWtlID4gMi40LngsIHdlIHNldCBhIHZhcmlhYmxlIHVzZWQgYmVsb3cgdG8gZXhwb3J0Ci0jIHRhcmdldHMgdG8gYW4gZXhwb3J0IGZpbGUuCi0jIFRPRE86IFVzZSBWRVJTSU9OX0dSRUFURVIgYWZ0ZXIgb3VyIGNtYWtlX21pbmltdW1fcmVxdWlyZWQgPj0gMi42LjIKLWlmKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiAxIEFORCBDTUFLRV9NSU5PUl9WRVJTSU9OIEdSRUFURVIgNCkKLSAgc2V0KFBOR19FWFBPUlRfUlVMRSBFWFBPUlQgbGlicG5nKQotZWxzZWlmKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiAyKSAjIGZ1dHVyZSBwcm9vZgotICBzZXQoUE5HX0VYUE9SVF9SVUxFIEVYUE9SVCBsaWJwbmcpCi1lbmRpZigpCi0KLSMgSU5TVEFMTAotaWYoTk9UIFNLSVBfSU5TVEFMTF9MSUJSQVJJRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKLSAgaW5zdGFsbChUQVJHRVRTICR7UE5HX0xJQl9UQVJHRVRTfQotICAgICAgJHtQTkdfRVhQT1JUX1JVTEV9Ci0gICAgICBSVU5USU1FIERFU1RJTkFUSU9OIGJpbgotICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQotICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfQotICAgICAgRlJBTUVXT1JLIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQotCi0gIGlmKFBOR19TSEFSRUQpCi0gICAgIyBDcmVhdGUgYSBzeW1saW5rIGZvciBsaWJwbmcuZGxsLmEgPT4gbGlicG5nMTYuZGxsLmEgb24gQ3lnd2luCi0gICAgaWYoQ1lHV0lOIE9SIE1JTkdXKQotICAgICAgIGdldF90YXJnZXRfcHJvcGVydHkoQlVJTERfVEFSR0VUX0xPQ0FUSU9OIHBuZyBMT0NBVElPTl8ke0NNQUtFX0JVSUxEX1RZUEV9KQotICAgICAgIENSRUFURV9TWU1MSU5LKCR7QlVJTERfVEFSR0VUX0xPQ0FUSU9OfSBsaWJwbmcke0NNQUtFX0lNUE9SVF9MSUJSQVJZX1NVRkZJWH0pCi0gICAgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nJHtDTUFLRV9JTVBPUlRfTElCUkFSWV9TVUZGSVh9Ci0gICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKLSAgICBlbmRpZihDWUdXSU4gT1IgTUlOR1cpCi0KLSAgICBpZihOT1QgV0lOMzIpCi0gICAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5KEJVSUxEX1RBUkdFVF9MT0NBVElPTiBwbmcgTE9DQVRJT05fJHtDTUFLRV9CVUlMRF9UWVBFfSkKLSAgICAgIENSRUFURV9TWU1MSU5LKCR7QlVJTERfVEFSR0VUX0xPQ0FUSU9OfSBsaWJwbmcke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0pCi0gICAgICBpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJwbmcke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0KLSAgICAgICAgIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQotICAgIGVuZGlmKE5PVCBXSU4zMikKLSAgZW5kaWYoUE5HX1NIQVJFRCkKLQotICBpZihQTkdfU1RBVElDKQotICAgIGlmKE5PVCBXSU4zMiBPUiBDWUdXSU4gT1IgTUlOR1cpCi0gICAgICBnZXRfdGFyZ2V0X3Byb3BlcnR5KEJVSUxEX1RBUkdFVF9MT0NBVElPTiBwbmdfc3RhdGljIExPQ0FUSU9OXyR7Q01BS0VfQlVJTERfVFlQRX0pCi0gICAgICBDUkVBVEVfU1lNTElOSygke0JVSUxEX1RBUkdFVF9MT0NBVElPTn0gbGlicG5nJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9KQotICAgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlicG5nJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9Ci0gICAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSkKLSAgICBlbmRpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQotIGVuZGlmKCkKLWVuZGlmKCkKLQotaWYoTk9UIFNLSVBfSU5TVEFMTF9IRUFERVJTIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCApCi0gIGluc3RhbGwoRklMRVMgJHtsaWJwbmdfcHVibGljX2hkcnN9ICAgREVTVElOQVRJT04gaW5jbHVkZSkKLSAgaW5zdGFsbChGSUxFUyAke2xpYnBuZ19wdWJsaWNfaGRyc30gICBERVNUSU5BVElPTiBpbmNsdWRlLyR7UE5HTElCX05BTUV9KQotZW5kaWYoKQotaWYoTk9UIFNLSVBfSU5TVEFMTF9FWEVDVVRBQkxFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQotICBpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQotICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy1jb25maWcgREVTVElOQVRJT04gYmluKQotICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LWNvbmZpZwotICAgICAgICAgICAgREVTVElOQVRJT04gYmluKQotICBlbmRpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQotZW5kaWYoKQotCi1pZihOT1QgU0tJUF9JTlNUQUxMX1BST0dSQU1TIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCApCi0gIGluc3RhbGwoVEFSR0VUUyAke1BOR19CSU5fVEFSR0VUU30KLSAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQotZW5kaWYoKQotCi1pZihOT1QgU0tJUF9JTlNUQUxMX0ZJTEVTIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCApCi0gICMgSW5zdGFsbCBtYW4gcGFnZXMKLSAgaWYoTk9UIFBOR19NQU5fRElSKQotICAgIHNldChQTkdfTUFOX0RJUiAic2hhcmUvbWFuIikKLSAgZW5kaWYoKQotICBpbnN0YWxsKEZJTEVTIGxpYnBuZy4zIGxpYnBuZ3BmLjMgICAgICBERVNUSU5BVElPTiAke1BOR19NQU5fRElSfS9tYW4zKQotICBpbnN0YWxsKEZJTEVTIHBuZy41ICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTiAke1BOR19NQU5fRElSfS9tYW41KQotICAjIEluc3RhbGwgcGtnLWNvbmZpZyBmaWxlcwotICBpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQotICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy5wYwotICAgICAgICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0vcGtnY29uZmlnKQotICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYnBuZy1jb25maWcKLSAgICAgICAgICAgIERFU1RJTkFUSU9OIGJpbikKLSAgICBpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke1BOR0xJQl9OQU1FfS5wYwotICAgICAgICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0vcGtnY29uZmlnKQotICAgIGluc3RhbGwoUFJPR1JBTVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7UE5HTElCX05BTUV9LWNvbmZpZwotICAgICAgICAgICAgREVTVElOQVRJT04gYmluKQotICBlbmRpZihOT1QgV0lOMzIgT1IgQ1lHV0lOIE9SIE1JTkdXKQotZW5kaWYoKQotCi0jIE9uIHZlcnNpb25zIG9mIENNYWtlIHRoYXQgc3VwcG9ydCBpdCwgY3JlYXRlIGFuIGV4cG9ydCBmaWxlIENNYWtlCi0jIHVzZXJzIGNhbiBpbmNsdWRlKCkgdG8gaW1wb3J0IG91ciB0YXJnZXRzCi1pZihQTkdfRVhQT1JUX1JVTEUgQU5EIE5PVCBTS0lQX0lOU1RBTExfRVhQT1JUIEFORCBOT1QgU0tJUF9JTlNUQUxMX0FMTCApCi0gIGluc3RhbGwoRVhQT1JUIGxpYnBuZyBERVNUSU5BVElPTiBsaWIvbGlicG5nIEZJTEUgbGliJHtQTkdfTElCX05BTUV9LmNtYWtlKQotZW5kaWYoKQotCi0jIHdoYXQncyB3aXRoIGxpYnBuZy1tYW51YWwudHh0IGFuZCBhbGwgdGhlIGV4dHJhIGZpbGVzPwotCi0jIFVOSU5TVEFMTAotIyBkbyB3ZSBuZWVkIHRoaXM/Ci0KLSMgRElTVAotIyBkbyB3ZSBuZWVkIHRoaXM/Ci0KLSMgdG8gY3JlYXRlIG1zdmMgaW1wb3J0IGxpYiBmb3IgbWluZ3cgY29tcGlsZWQgc2hhcmVkIGxpYgotIyBwZXhwb3J0cyBsaWJwbmcuZGxsID4gbGlicG5nLmRlZgotIyBsaWIgL2RlZjpsaWJwbmcuZGVmIC9tYWNoaW5lOng4NgotCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkNGRjOC4uMDAwMDAwMAotLS0gYS9JTlNUQUxMCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLQotSW5zdGFsbGluZyBsaWJwbmcKLQotQ29udGVudHMKLQotICAgSS4gU2ltcGxlIGluc3RhbGxhdGlvbgotICBJSS4gUmVidWlsZGluZyB0aGUgY29uZmlndXJlIHNjcmlwdHMKLSBJSUkuIFVzaW5nIHNjcmlwdHMvbWFrZWZpbGUqCi0gIElWLiBVc2luZyBjbWFrZQotICAgVi4gRGlyZWN0b3J5IHN0cnVjdHVyZQotICBWSS4gQnVpbGRpbmcgd2l0aCBwcm9qZWN0IGZpbGVzCi0gVklJLiBCdWlsZGluZyB3aXRoIG1ha2VmaWxlcwotVklJSS4gQ29uZmlndXJpbmcgbGlicG5nIGZvciAxNi1iaXQgcGxhdGZvcm1zCi0gIElYLiBDb25maWd1cmluZyBmb3IgRE9TCi0gICBYLiBDb25maWd1cmluZyBmb3IgTWVkaXVtIE1vZGVsCi0gIFhJLiBQcmVwZW5kaW5nIGEgcHJlZml4IHRvIGV4cG9ydGVkIHN5bWJvbHMKLSBYSUkuIENvbmZpZ3VyaW5nIGZvciBjb21waWxlciB4eHg6Ci1YSUlJLiBSZW1vdmluZyB1bndhbnRlZCBvYmplY3QgY29kZQotIFhJVi4gQ2hhbmdlcyB0byB0aGUgYnVpbGQgYW5kIGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nIGluIGxpYnBuZy0xLjUueAotICBYVi4gU2V0am1wL2xvbmdqbXAgaXNzdWVzCi0gWFZJLiBDb21tb24gbGlua2luZyBmYWlsdXJlcwotWFZJSS4gT3RoZXIgc291cmNlcyBvZiBpbmZvcm1hdGlvbiBhYm91dCBsaWJwbmcKLQotSS4gU2ltcGxlIGluc3RhbGxhdGlvbgotCi1PbiBVbml4L0xpbnV4IGFuZCBzaW1pbGFyIHN5c3RlbXMsIHlvdSBjYW4gc2ltcGx5IHR5cGUKLQotICAgIC4vY29uZmlndXJlIFstLXByZWZpeD0vcGF0aF0KLSAgICBtYWtlIGNoZWNrCi0gICAgbWFrZSBpbnN0YWxsCi0KLWFuZCBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudC4gICIvcGF0aCIgaXMgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeQotd2hlcmUgeW91IHdhbnQgdG8gaW5zdGFsbCB0aGUgbGlicG5nICJsaWIiLCAiaW5jbHVkZSIsIGFuZCAiYmluIgotc3ViZGlyZWN0b3JpZXMuCi0KLUlmIHlvdSBkb3dubG9hZGVkIGEgR0lUIGNsb25lLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biAuL2F1dG9nZW4uc2ggYmVmb3JlCi1ydW5uaW5nIC4vY29uZmlndXJlLCB0byBjcmVhdGUgImNvbmZpZ3VyZSIgYW5kICJNYWtlZmlsZS5pbiIgd2hpY2ggYXJlCi1ub3QgaW5jbHVkZWQgaW4gdGhlIEdJVCByZXBvc2l0b3J5LgotCi1Ob3RlIHRoYXQgImNvbmZpZ3VyZSIgaXMgb25seSBpbmNsdWRlZCBpbiB0aGUgIioudGFyIiBkaXN0cmlidXRpb25zIGFuZCBub3QKLWluIHRoZSAiKi56aXAiIG9yICIqLjd6IiBkaXN0cmlidXRpb25zLiBJZiB5b3UgZG93bmxvYWRlZCBvbmUgb2YgdGhvc2UKLWRpc3RyaWJ1dGlvbnMsIHNlZSAiQnVpbGRpbmcgd2l0aCBwcm9qZWN0IGZpbGVzIiBvciAiQnVpbGRpbmcgd2l0aCBtYWtlZmlsZXMiLAotYmVsb3cuCi0KLUlJLiBSZWJ1aWxkaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0cwotCi1JZiBjb25maWd1cmUgZG9lcyBub3Qgd29yayBvbiB5b3VyIHN5c3RlbSwgb3IgaWYgeW91IGhhdmUgYSBuZWVkIHRvCi1jaGFuZ2UgY29uZmlndXJlLmFjIG9yIE1ha2VmaWxlLmFtLCBhbmQgeW91IGhhdmUgYSByZWFzb25hYmx5Ci11cC10by1kYXRlIHNldCBvZiB0b29scywgcnVubmluZyAuL2F1dG9nZW4uc2ggaW4gYSBnaXQgY2xvbmUgYmVmb3JlCi1ydW5uaW5nIC4vY29uZmlndXJlIG1heSBmaXggdGhlIHByb2JsZW0uICBUbyBiZSByZWFsbHkgc3VyZSB0aGF0IHlvdQotYXJlbid0IHVzaW5nIGFueSBvZiB0aGUgaW5jbHVkZWQgcHJlLWJ1aWx0IHNjcmlwdHMsIGVzcGVjaWFsbHkgaWYgeW91Ci1hcmUgYnVpbGRpbmcgZnJvbSBhIHRhciBkaXN0cmlidXRpb24gaW5zdGVhZCBvZiBhIGdpdCBkaXN0cmlidXRpb24sCi1kbyB0aGlzOgotCi0gICAgLi9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCi0gICAgbWFrZSBtYWludGFpbmVyLWNsZWFuCi0gICAgLi9hdXRvZ2VuLnNoIC0tbWFpbnRhaW5lciAtLWNsZWFuCi0gICAgLi9hdXRvZ2VuLnNoIC0tbWFpbnRhaW5lcgotICAgIC4vY29uZmlndXJlIFstLXByZWZpeD0vcGF0aF0gW290aGVyIG9wdGlvbnNdCi0gICAgbWFrZQotICAgIG1ha2UgaW5zdGFsbAotICAgIG1ha2UgY2hlY2sKLQotSUlJLiBVc2luZyBzY3JpcHRzL21ha2VmaWxlKgotCi1JbnN0ZWFkLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGN1c3RvbS1idWlsdCBtYWtlZmlsZXMgaW4gdGhlCi0ic2NyaXB0cyIgZGlyZWN0b3J5Ci0KLSAgICBjcCBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCBwbmdsaWJjb25mLmgKLSAgICBjcCBzY3JpcHRzL21ha2VmaWxlLnN5c3RlbSBtYWtlZmlsZQotICAgIG1ha2UgdGVzdAotICAgIG1ha2UgaW5zdGFsbAotCi1UaGUgZmlsZXMgdGhhdCBhcmUgcHJlc2VudGx5IGF2YWlsYWJsZSBpbiB0aGUgc2NyaXB0cyBkaXJlY3RvcnkKLWFyZSBsaXN0ZWQgYW5kIGRlc2NyaWJlZCBpbiBzY3JpcHRzL1JFQURNRS50eHQuCi0KLU9yIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgInByb2plY3RzIiBpbiB0aGUgInByb2plY3RzIiBkaXJlY3RvcnkuCi0KLUJlZm9yZSBpbnN0YWxsaW5nIGxpYnBuZywgeW91IG11c3QgZmlyc3QgaW5zdGFsbCB6bGliLCBpZiBpdAotaXMgbm90IGFscmVhZHkgb24geW91ciBzeXN0ZW0uICB6bGliIGNhbiB1c3VhbGx5IGJlIGZvdW5kCi13aGVyZXZlciB5b3UgZ290IGxpYnBuZzsgb3RoZXJ3aXNlIGdvIHRvIGh0dHA6Ly96bGliLm5ldC4gIFlvdSBjYW4gcGxhY2UKLXpsaWIgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGxpYnBuZyBvciBpbiBhbm90aGVyIGRpcmVjdG9yeS4KLQotSWYgeW91ciBzeXN0ZW0gYWxyZWFkeSBoYXMgYSBwcmVpbnN0YWxsZWQgemxpYiB5b3Ugd2lsbCBzdGlsbCBuZWVkCi10byBoYXZlIGFjY2VzcyB0byB0aGUgemxpYi5oIGFuZCB6Y29uZi5oIGluY2x1ZGUgZmlsZXMgdGhhdAotY29ycmVzcG9uZCB0byB0aGUgdmVyc2lvbiBvZiB6bGliIHRoYXQncyBpbnN0YWxsZWQuCi0KLUlmIHlvdSB3aXNoIHRvIHRlc3Qgd2l0aCBhIHBhcnRpY3VsYXIgemxpYiB0aGF0IGlzIG5vdCBmaXJzdCBpbiB0aGUKLXN0YW5kYXJkIGxpYnJhcnkgc2VhcmNoIHBhdGgsIHB1dCBaTElCTElCLCBaTElCSU5DLCBDUFBGTEFHUywgTERGTEFHUywKLWFuZCBMRF9MSUJSQVJZX1BBVEggaW4geW91ciBlbnZpcm9ubWVudCBiZWZvcmUgcnVubmluZyAibWFrZSB0ZXN0Igotb3IgIm1ha2UgZGlzdGNoZWNrIjoKLQotWkxJQkxJQj0vcGF0aC90by9saWIgZXhwb3J0IFpMSUJMSUIKLVpMSUJJTkM9L3BhdGgvdG8vaW5jbHVkZSBleHBvcnQgWkxJQklOQwotQ1BQRkxBR1M9Ii1JJFpMSUJJTkMiIGV4cG9ydCBDUFBGTEFHUwotTERGTEFHUz0iLUwkWkxJQkxJQiIgZXhwb3J0IExERkxBR1MKLUxEX0xJQlJBUllfUEFUSD0iJFpMSUJMSUI6JExEX0xJQlJBUllfUEFUSCIgZXhwb3J0IExEX0xJQlJBUllfUEFUSAotCi1JZiB5b3UgYXJlIHVzaW5nIG9uZSBvZiB0aGUgbWFrZWZpbGUgc2NyaXB0cywgcHV0IFpMSUJMSUIgYW5kIFpMSUJJTkMKLWluIHlvdXIgZW52aXJvbm1lbnQgYW5kIHR5cGUgIm1ha2UgWkxJQkxJQj0kWkxJQkxJQiBaTElCSU5DPSRaTElCSU5DIHRlc3QiLgotCi1JVi4gVXNpbmcgY21ha2UKLQotSWYgeW91IHdhbnQgdG8gdXNlICJjbWFrZSIgKHNlZSB3d3cuY21ha2Uub3JnKSwgdHlwZQotCi0gICBjbWFrZSAuIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9L3BhdGgKLSAgIG1ha2UKLSAgIG1ha2UgaW5zdGFsbAotCi1BcyB3aGVuIHVzaW5nIHRoZSBzaW1wbGUgY29uZmlndXJlIG1ldGhvZCBkZXNjcmliZWQgYWJvdmUsICIvcGF0aCIgcG9pbnRzIHRvCi10aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB3aGVyZSB5b3Ugd2FudCB0byBwdXQgdGhlIGxpYnBuZyAibGliIiwgImluY2x1ZGUiLAotYW5kICJiaW4iIHN1YmRpcmVjdG9yaWVzLgotCi1WLiBEaXJlY3Rvcnkgc3RydWN0dXJlCi0KLVlvdSBjYW4gcmVuYW1lIHRoZSBkaXJlY3RvcmllcyB0aGF0IHlvdSBkb3dubG9hZGVkICh0aGV5Ci1taWdodCBiZSBjYWxsZWQgImxpYnBuZy14LnkueiIgb3IgImxpYnBuZ05OIiBhbmQgInpsaWItMS4yLjgiCi1vciAiemxpYjEyOCIpIHNvIHRoYXQgeW91IGhhdmUgZGlyZWN0b3JpZXMgY2FsbGVkICJ6bGliIiBhbmQgImxpYnBuZyIuCi0KLVlvdXIgZGlyZWN0b3J5IHN0cnVjdHVyZSBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0KLSAgIC4uICh0aGUgcGFyZW50IGRpcmVjdG9yeSkKLSAgICAgIGxpYnBuZyAodGhpcyBkaXJlY3RvcnkpCi0gICAgICAgICAgSU5TVEFMTCAodGhpcyBmaWxlKQotICAgICAgICAgIFJFQURNRQotICAgICAgICAgICouaCwgKi5jICA9PiBsaWJwbmcgc291cmNlIGZpbGVzCi0gICAgICAgICAgQ01ha2VMaXN0cy50eHQgICAgPT4gICJjbWFrZSIgc2NyaXB0Ci0gICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlczoKLSAgICAgICAgICAgICBjb25maWd1cmUuYWMsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuYW0sIE1ha2VmaWxlLmluLAotICAgICAgICAgICAgIGF1dG9nZW4uc2gsIGNvbmZpZy5ndWVzcywgbHRtYWluLnNoLCBtaXNzaW5nLCBsaWJwbmcucGMuaW4sCi0gICAgICAgICAgICAgbGlicG5nLWNvbmZpZy5pbiwgYWNsb2NhbC5tNCwgY29uZmlnLmguaW4sIGNvbmZpZy5zdWIsCi0gICAgICAgICAgICAgZGVwY29tcCwgaW5zdGFsbC1zaCwgbWtpbnN0YWxsZGlycywgdGVzdC1wbmd0ZXN0LnNoCi0gICAgICAgICAgY29udHJpYgotICAgICAgICAgICAgIGFybS1uZW9uLCBjb25mdGVzdCwgZXhhbXBsZXMsIGdyZWdib29rLCBsaWJ0ZXN0cywgcG5nbWluaW0sCi0gICAgICAgICAgICAgcG5nbWludXMsIHBuZ3N1aXRlLCB0b29scywgdmlzdXBuZwotICAgICAgICAgIHByb2plY3RzCi0gICAgICAgICAgICAgY2J1aWxkZXI1LCBvd2F0Y29tLCB2aXN1YWxjNzEsIHZzdHVkaW8sIHhjb2RlCi0gICAgICAgICAgc2NyaXB0cwotICAgICAgICAgICAgIG1ha2VmaWxlLioKLSAgICAgICAgICAgICAqLmRlZiAobW9kdWxlIGRlZmluaXRpb24gZmlsZXMpCi0gICAgICAgICAgICAgZXRjLgotICAgICAgICAgIHBuZ3Rlc3QucG5nCi0gICAgICAgICAgZXRjLgotICAgICAgemxpYgotICAgICAgICAgIFJFQURNRSwgKi5oLCAqLmMgY29udHJpYiwgZXRjLgotCi1JZiB0aGUgbGluZSBlbmRpbmdzIGluIHRoZSBmaWxlcyBsb29rIGZ1bm55LCB5b3UgbWF5IHdpc2ggdG8gZ2V0IHRoZSBvdGhlcgotZGlzdHJpYnV0aW9uIG9mIGxpYnBuZy4gIEl0IGlzIGF2YWlsYWJsZSBpbiBib3RoIHRhci5neiAoVU5JWCBzdHlsZSBsaW5lCi1lbmRpbmdzKSBhbmQgemlwIChET1Mgc3R5bGUgbGluZSBlbmRpbmdzKSBmb3JtYXRzLgotCi1WSS4gQnVpbGRpbmcgd2l0aCBwcm9qZWN0IGZpbGVzCi0KLUlmIHlvdSBhcmUgYnVpbGRpbmcgbGlicG5nIHdpdGggTVNWQywgeW91IGNhbiBlbnRlciB0aGUKLWxpYnBuZyBwcm9qZWN0c1x2aXN1YWxjNzEgb3IgdnN0dWRpbyBkaXJlY3RvcnkgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCi1pbiBSRUFETUUudHh0LgotCi1PdGhlcndpc2UgZW50ZXIgdGhlIHpsaWIgZGlyZWN0b3J5IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB6bGliL1JFQURNRSwKLXRoZW4gY29tZSBiYWNrIGhlcmUgYW5kIHJ1biAiY29uZmlndXJlIiBvciBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlCi1tYWtlZmlsZS5zeXMgaW4gdGhlIHNjcmlwdHMgZGlyZWN0b3J5LgotCi1WSUkuIEJ1aWxkaW5nIHdpdGggbWFrZWZpbGVzCi0KLUNvcHkgdGhlIGZpbGUgKG9yIGZpbGVzKSB0aGF0IHlvdSBuZWVkIGZyb20gdGhlCi1zY3JpcHRzIGRpcmVjdG9yeSBpbnRvIHRoaXMgZGlyZWN0b3J5LCBmb3IgZXhhbXBsZQotCi0gICBNU0RPUyBleGFtcGxlOiBjb3B5IHNjcmlwdHNcbWFrZWZpbGUubXNjIG1ha2VmaWxlCi0gICAgICAgICAgICAgICAgICBjb3B5IHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0IHBuZ2xpYmNvbmYuaAotICAgVU5JWCBleGFtcGxlOiAgY3Agc2NyaXB0cy9tYWtlZmlsZS5zdGQgbWFrZWZpbGUKLSAgICAgICAgICAgICAgICAgIGNwIHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0IHBuZ2xpYmNvbmYuaAotCi1SZWFkIHRoZSBtYWtlZmlsZSB0byBzZWUgaWYgeW91IG5lZWQgdG8gY2hhbmdlIGFueSBzb3VyY2Ugb3IKLXRhcmdldCBkaXJlY3RvcmllcyB0byBtYXRjaCB5b3VyIHByZWZlcmVuY2VzLgotCi1UaGVuIHJlYWQgcG5nbGliY29uZi5kZmEgdG8gc2VlIGlmIHlvdSB3YW50IHRvIG1ha2UgYW55IGNvbmZpZ3VyYXRpb24KLWNoYW5nZXMuCi0KLVRoZW4ganVzdCBydW4gIm1ha2UiIHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBsaWJwbmcgbGlicmFyeSBpbgotdGhpcyBkaXJlY3RvcnkgYW5kICJtYWtlIHRlc3QiIHdoaWNoIHdpbGwgcnVuIGEgcXVpY2sgdGVzdCB0aGF0IHJlYWRzCi10aGUgInBuZ3Rlc3QucG5nIiBmaWxlIGFuZCB3cml0ZXMgYSAicG5nb3V0LnBuZyIgZmlsZSB0aGF0IHNob3VsZCBiZQotaWRlbnRpY2FsIHRvIGl0LiAgTG9vayBmb3IgIjk3ODIgemVybyBzYW1wbGVzIiBpbiB0aGUgb3V0cHV0IG9mIHRoZQotdGVzdC4gIEZvciBtb3JlIGNvbmZpZGVuY2UsIHlvdSBjYW4gcnVuIGFub3RoZXIgdGVzdCBieSB0eXBpbmcKLSJwbmd0ZXN0IHBuZ25vdy5wbmciIGFuZCBsb29raW5nIGZvciAiMjg5IHplcm8gc2FtcGxlcyIgaW4gdGhlIG91dHB1dC4KLUFsc28sIHlvdSBjYW4gcnVuICJwbmd0ZXN0IC1tIGNvbnRyaWIvcG5nc3VpdGUvKi5wbmciIGFuZCBjb21wYXJlCi15b3VyIG91dHB1dCB3aXRoIHRoZSByZXN1bHQgc2hvd24gaW4gY29udHJpYi9wbmdzdWl0ZS9SRUFETUUuCi0KLU1vc3Qgb2YgdGhlIG1ha2VmaWxlcyB3aWxsIGFsbG93IHlvdSB0byBydW4gIm1ha2UgaW5zdGFsbCIgdG8KLXB1dCB0aGUgbGlicmFyeSBpbiBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoaWYgeW91IHdhbnQgdG8KLWRvIHRoYXQsIHJ1biAibWFrZSBpbnN0YWxsIiBpbiB0aGUgemxpYiBkaXJlY3RvcnkgZmlyc3QgaWYgbmVjZXNzYXJ5KS4KLVNvbWUgYWxzbyBhbGxvdyB5b3UgdG8gcnVuICJtYWtlIHRlc3QtaW5zdGFsbGVkIiBhZnRlciB5b3UgaGF2ZQotcnVuICJtYWtlIGluc3RhbGwiLgotCi1WSUlJLiBDb25maWd1cmluZyBsaWJwbmcgZm9yIDE2LWJpdCBwbGF0Zm9ybXMKLQotWW91IHdpbGwgd2FudCB0byBsb29rIGludG8gemNvbmYuaCB0byB0ZWxsIHpsaWIgKGFuZCB0aHVzIGxpYnBuZykgdGhhdAotaXQgY2Fubm90IGFsbG9jYXRlIG1vcmUgdGhhbiA2NEsgYXQgYSB0aW1lLiAgRXZlbiBpZiB5b3UgY2FuLCB0aGUgbWVtb3J5Ci13b24ndCBiZSBhY2Nlc3NpYmxlLiAgU28gbGltaXQgemxpYiBhbmQgbGlicG5nIHRvIDY0SyBieSBkZWZpbmluZyBNQVhTRUdfNjRLLgotCi1JWC4gQ29uZmlndXJpbmcgZm9yIERPUwotCi1Gb3IgRE9TIHVzZXJzIHdobyBvbmx5IGhhdmUgYWNjZXNzIHRvIHRoZSBsb3dlciA2NDBLLCB5b3Ugd2lsbAotaGF2ZSB0byBsaW1pdCB6bGliJ3MgbWVtb3J5IHVzYWdlIHZpYSBhIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKCkKLWNhbGwuICBTZWUgemxpYi5oIG9yIHpjb25mLmggaW4gdGhlIHpsaWIgbGlicmFyeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotWC4gQ29uZmlndXJpbmcgZm9yIE1lZGl1bSBNb2RlbAotCi1MaWJwbmcncyBzdXBwb3J0IGZvciBtZWRpdW0gbW9kZWwgaGFzIGJlZW4gdGVzdGVkIG9uIG1vc3Qgb2YgdGhlIHBvcHVsYXIKLWNvbXBpbGVycy4gIE1ha2Ugc3VyZSBNQVhTRUdfNjRLIGdldHMgZGVmaW5lZCwgVVNFX0ZBUl9LRVlXT1JEIGdldHMKLWRlZmluZWQsIGFuZCBGQVIgZ2V0cyBkZWZpbmVkIHRvIGZhciBpbiBwbmdjb25mLmgsIGFuZCB5b3Ugc2hvdWxkIGJlCi1hbGwgc2V0LiAgRXZlcnl0aGluZyBpbiB0aGUgbGlicmFyeSAoZXhjZXB0IGZvciB6bGliJ3Mgc3RydWN0dXJlKSBpcwotZXhwZWN0aW5nIGZhciBkYXRhLiAgWW91IG11c3QgdXNlIHRoZSB0eXBlZGVmcyB3aXRoIHRoZSBwIG9yIHBwIG9uCi10aGUgZW5kIGZvciBwb2ludGVycyAob3IgYXQgbGVhc3QgbG9vayBhdCB0aGVtIGFuZCBiZSBjYXJlZnVsKS4gIE1ha2UKLW5vdGUgdGhhdCB0aGUgcm93cyBvZiBkYXRhIGFyZSBkZWZpbmVkIGFzIHBuZ19ieXRlcHAsIHdoaWNoIGlzCi1hbiAidW5zaWduZWQgY2hhciBmYXIgKiBmYXIgKiIuCi0KLVhJLiBQcmVwZW5kaW5nIGEgcHJlZml4IHRvIGV4cG9ydGVkIHN5bWJvbHMKLQotU3RhcnRpbmcgd2l0aCBsaWJwbmctMS42LjAsIHlvdSBjYW4gY29uZmlndXJlIGxpYnBuZyAod2hlbiB1c2luZyB0aGUKLSJjb25maWd1cmUiIHNjcmlwdCkgdG8gcHJlZml4IGFsbCBleHBvcnRlZCBzeW1ib2xzIGJ5IG1lYW5zIG9mIHRoZQotY29uZmlndXJhdGlvbiBvcHRpb24gIi0td2l0aC1saWJwbmctcHJlZml4PUZPT18iLCB3aGVyZSBGT09fIGNhbiBiZSBhbnkKLXN0cmluZyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbmluZyBvbmx5IHVwcGVyY2FzZQotYW5kIGxvd2VyY2FzZSBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB0aGUgdW5kZXJzY29yZSAoaS5lLiwgYSBDIGxhbmd1YWdlCi1pZGVudGlmaWVyKS4gIFRoaXMgY3JlYXRlcyBhIHNldCBvZiBtYWNyb3MgaW4gcG5nbGliY29uZi5oLCBzbyB0aGlzIGlzCi10cmFuc3BhcmVudCB0byBhcHBsaWNhdGlvbnM7IHRoZWlyIGZ1bmN0aW9uIGNhbGxzIGdldCB0cmFuc2Zvcm1lZCBieQotdGhlIG1hY3JvcyB0byB1c2UgdGhlIG1vZGlmaWVkIG5hbWVzLgotCi1YSUkuIENvbmZpZ3VyaW5nIGZvciBjb21waWxlciB4eHg6Ci0KLUFsbCBpbmNsdWRlcyBmb3IgbGlicG5nIGFyZSBpbiBwbmdjb25mLmguICBJZiB5b3UgbmVlZCB0byBhZGQsIGNoYW5nZQotb3IgZGVsZXRlIGFuIGluY2x1ZGUsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgotVGhlIGluY2x1ZGVzIHRoYXQgYXJlIG5vdCBuZWVkZWQgb3V0c2lkZSBsaWJwbmcgYXJlIHBsYWNlZCBpbiBwbmdwcml2LmgsCi13aGljaCBpcyBvbmx5IHVzZWQgYnkgdGhlIHJvdXRpbmVzIGluc2lkZSBsaWJwbmcgaXRzZWxmLgotVGhlIGZpbGVzIGluIGxpYnBuZyBwcm9wZXIgb25seSBpbmNsdWRlIHBuZ3ByaXYuaCBhbmQgcG5nLmgsIHdoaWNoCi1pbiB0dXJuIGluY2x1ZGVzIHBuZ2NvbmYuaCBhbmQsIGFzIG9mIGxpYnBuZy0xLjUuMCwgcG5nbGliY29uZi5oLgotQXMgb2YgbGlicG5nLTEuNS4wLCBwbmdwcml2LmggYWxzbyBpbmNsdWRlcyB0aHJlZSBvdGhlciBwcml2YXRlIGhlYWRlcgotZmlsZXMsIHBuZ3N0cnVjdC5oLCBwbmdpbmZvLmgsIGFuZCBwbmdkZWJ1Zy5oLCB3aGljaCBjb250YWluIG1hdGVyaWFsCi10aGF0IHByZXZpb3VzbHkgYXBwZWFyZWQgaW4gdGhlIHB1YmxpYyBoZWFkZXJzLgotCi1YSUlJLiBSZW1vdmluZyB1bndhbnRlZCBvYmplY3QgY29kZQotCi1UaGVyZSBhcmUgYSBidW5jaCBvZiAjZGVmaW5lJ3MgaW4gcG5nY29uZi5oIHRoYXQgY29udHJvbCB3aGF0IHBhcnRzIG9mCi1saWJwbmcgYXJlIGNvbXBpbGVkLiAgQWxsIHRoZSBkZWZpbmVzIGVuZCBpbiBfU1VQUE9SVEVELiAgSWYgeW91IGFyZQotbmV2ZXIgZ29pbmcgdG8gdXNlIGEgY2FwYWJpbGl0eSwgeW91IGNhbiBjaGFuZ2UgdGhlICNkZWZpbmUgdG8gI3VuZGVmCi1iZWZvcmUgcmVjb21waWxpbmcgbGlicG5nIGFuZCBzYXZlIHlvdXJzZWxmIGNvZGUgYW5kIGRhdGEgc3BhY2UsIG9yCi15b3UgY2FuIHR1cm4gb2ZmIGluZGl2aWR1YWwgY2FwYWJpbGl0aWVzIHdpdGggZGVmaW5lcyB0aGF0IGJlZ2luIHdpdGgKLVBOR19OT18uCi0KLUluIGxpYnBuZy0xLjUuMCBhbmQgbGF0ZXIsIHRoZSAjZGVmaW5lJ3MgYXJlIGluIHBuZ2xpYmNvbmYuaCBpbnN0ZWFkLgotCi1Zb3UgY2FuIGFsc28gdHVybiBhbGwgb2YgdGhlIHRyYW5zZm9ybXMgYW5kIGFuY2lsbGFyeSBjaHVuayBjYXBhYmlsaXRpZXMKLW9mZiBlbiBtYXNzZSB3aXRoIGNvbXBpbGVyIGRpcmVjdGl2ZXMgdGhhdCBkZWZpbmUKLVBOR19OT19SRUFEW29yIFdSSVRFXV9UUkFOU0ZPUk1TLCBvciBQTkdfTk9fUkVBRFtvciBXUklURV1fQU5DSUxMQVJZX0NIVU5LUywKLW9yIGFsbCBmb3VyLCBhbG9uZyB3aXRoIGRpcmVjdGl2ZXMgdG8gdHVybiBvbiBhbnkgb2YgdGhlIGNhcGFiaWxpdGllcyB0aGF0Ci15b3UgZG8gd2FudC4gIFRoZSBQTkdfTk9fUkVBRFtvciBXUklURV1fVFJBTlNGT1JNUyBkaXJlY3RpdmVzIGRpc2FibGUgdGhlCi1leHRyYSB0cmFuc2Zvcm1hdGlvbnMgYnV0IHN0aWxsIGxlYXZlIHRoZSBsaWJyYXJ5IGZ1bGx5IGNhcGFibGUgb2YgcmVhZGluZwotYW5kIHdyaXRpbmcgUE5HIGZpbGVzIHdpdGggYWxsIGtub3duIHB1YmxpYyBjaHVua3MuIFVzZSBvZiB0aGUKLVBOR19OT19SRUFEW29yIFdSSVRFXV9BTkNJTExBUllfQ0hVTktTIGRpcmVjdGl2ZSBwcm9kdWNlcyBhIGxpYnJhcnkKLXRoYXQgaXMgaW5jYXBhYmxlIG9mIHJlYWRpbmcgb3Igd3JpdGluZyBhbmNpbGxhcnkgY2h1bmtzLiAgSWYgeW91IGFyZQotbm90IHVzaW5nIHRoZSBwcm9ncmVzc2l2ZSByZWFkaW5nIGNhcGFiaWxpdHksIHlvdSBjYW4gdHVybiB0aGF0IG9mZgotd2l0aCBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRCAoZG9uJ3QgY29uZnVzZSB0aGlzIHdpdGggdGhlIElOVEVSTEFDSU5HCi1jYXBhYmlsaXR5LCB3aGljaCB5b3UnbGwgc3RpbGwgaGF2ZSkuCi0KLUFsbCB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBzcGVjaWZpYyBjb2RlIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcywgc28gdGhlCi1saW5rZXIgc2hvdWxkIG9ubHkgZ3JhYiB0aGUgZmlsZXMgaXQgbmVlZHMuICBIb3dldmVyLCBpZiB5b3Ugd2FudCB0bwotbWFrZSBzdXJlLCBvciBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgc3RhbmQgYWxvbmUgbGlicmFyeSwgYWxsIHRoZQotcmVhZGluZyBmaWxlcyBzdGFydCB3aXRoICJwbmdyIiBhbmQgYWxsIHRoZSB3cml0aW5nIGZpbGVzIHN0YXJ0IHdpdGggInBuZ3ciLgotVGhlIGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggZWl0aGVyIChsaWtlIHBuZy5jLCBwbmd0cmFucy5jLCBldGMuKQotYXJlIHVzZWQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZywgYW5kIGFsd2F5cyBuZWVkIHRvIGJlIGluY2x1ZGVkLgotVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBpbiBwbmdwcmVhZC5jCi0KLUlmIHlvdSBhcmUgY3JlYXRpbmcgb3IgZGlzdHJpYnV0aW5nIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKGEgLnNvCi1vciBETEwgZmlsZSksIHlvdSBzaG91bGQgbm90IHJlbW92ZSBvciBkaXNhYmxlIGFueSBwYXJ0cyBvZiB0aGUgbGlicmFyeSwKLWFzIHRoaXMgd2lsbCBjYXVzZSBhcHBsaWNhdGlvbnMgbGlua2VkIHdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZQotbGlicmFyeSB0byBmYWlsIGlmIHRoZXkgY2FsbCBmdW5jdGlvbnMgbm90IGF2YWlsYWJsZSBpbiB5b3VyIGxpYnJhcnkuCi1UaGUgc2l6ZSBvZiB0aGUgbGlicmFyeSBpdHNlbGYgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSwgYmVjYXVzZSBvbmx5Ci10aG9zZSBzZWN0aW9ucyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIHdpbGwgYmUgbG9hZGVkIGludG8gbWVtb3J5LgotCi1YSVYuIENoYW5nZXMgdG8gdGhlIGJ1aWxkIGFuZCBjb25maWd1cmF0aW9uIG9mIGxpYnBuZyBpbiBsaWJwbmctMS41LngKLQotRGV0YWlscyBvZiBpbnRlcm5hbCBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGNvZGUgY2FuIGJlIGZvdW5kIGluIHRoZSBDSEFOR0VTCi1maWxlIGFuZCBpbiB0aGUgR0lUIHJlcG9zaXRvcnkgbG9ncy4gIFRoZXNlIHdpbGwgYmUgb2Ygbm8gY29uY2VybiB0byB0aGUgdmFzdAotbWFqb3JpdHkgb2YgbGlicmFyeSB1c2VycyBvciBidWlsZGVyczsgaG93ZXZlciwgdGhlIGZldyB3aG8gY29uZmlndXJlIGxpYnBuZwotdG8gYSBub24tZGVmYXVsdCBmZWF0dXJlIHNldCBtYXkgbmVlZCB0byBjaGFuZ2UgaG93IHRoaXMgaXMgZG9uZS4KLQotVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgZm9yIGxpYnJhcnkgYnVpbGRlcnMgdG8gYWx0ZXIgYnVpbGQgc2NyaXB0cyBpZgotdGhlc2UgdXNlIHRoZSBkaXN0cmlidXRlZCBidWlsZCBzdXBwb3J0IC0gY29uZmlndXJlIG9yIHRoZSBtYWtlZmlsZXMgLQotaG93ZXZlciwgdXNlcnMgb2YgdGhlIG1ha2VmaWxlcyBtYXkgY2FyZSB0byB1cGRhdGUgdGhlaXIgYnVpbGQgc2NyaXB0cwotdG8gYnVpbGQgcG5nbGliY29uZi5oIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIG1ha2VmaWxlIGRvZXMgbm90IGRvIHNvLgotCi1CdWlsZGluZyBsaWJwbmcgd2l0aCBhIG5vbi1kZWZhdWx0IGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQgY29tcGxldGVseS4KLVRoZSBvbGQgbWV0aG9kIHVzaW5nIHBuZ3Vzci5oIHNob3VsZCBzdGlsbCB3b3JrIGNvcnJlY3RseSBldmVuIHRob3VnaCB0aGUKLXdheSBwbmd1c3IuaCBpcyB1c2VkIGluIHRoZSBidWlsZCBoYXMgYmVlbiBjaGFuZ2VkOyBob3dldmVyLCBsaWJyYXJ5Ci1idWlsZGVycyB3aWxsIHByb2JhYmx5IHdhbnQgdG8gZXhhbWluZSB0aGUgY2hhbmdlcyB0byB0YWtlIGFkdmFudGFnZSBvZgotbmV3IGNhcGFiaWxpdGllcyBhbmQgdG8gc2ltcGxpZnkgdGhlaXIgYnVpbGQgc3lzdGVtLgotCi1BLiBTcGVjaWZpYyBjaGFuZ2VzIHRvIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjYXBhYmlsaXRpZXMKLQotVGhlIGV4YWN0IG1lY2hhbmlzbSB1c2VkIHRvIGNvbnRyb2wgYXR0cmlidXRlcyBvZiBBUEkgZnVuY3Rpb25zIGhhcwotY2hhbmdlZC4gIEEgc2luZ2xlIHNldCBvZiBvcGVyYXRpbmcgc3lzdGVtIGluZGVwZW5kZW50IG1hY3JvIGRlZmluaXRpb25zCi1pcyB1c2VkIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljIGRpcmVjdGl2ZXMgYXJlIGRlZmluZWQgaW4KLXBuZ2xpYmNvbmYuaAotCi1BcyBwYXJ0IG9mIHRoaXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIGNob29zZSBwcm9jZWR1cmUgY2FsbCBzdGFuZGFyZHMgb24KLXRob3NlIHN5c3RlbXMgdGhhdCBhbGxvdyBhIGNob2ljZSBoYXMgYmVlbiBjaGFuZ2VkLiAgQXQgcHJlc2VudCB0aGlzIG9ubHkKLWFmZmVjdHMgY2VydGFpbiBNaWNyb3NvZnQgKERPUywgV2luZG93cykgYW5kIElCTSAoT1MvMikgb3BlcmF0aW5nIHN5c3RlbXMKLXJ1bm5pbmcgb24gSW50ZWwgcHJvY2Vzc29ycy4gIEFzIGJlZm9yZSwgUE5HQVBJIGlzIGRlZmluZWQgd2hlcmUgcmVxdWlyZWQKLXRvIGNvbnRyb2wgdGhlIGV4cG9ydGVkIEFQSSBmdW5jdGlvbnM7IGhvd2V2ZXIsIHR3byBuZXcgbWFjcm9zLCBQTkdDQkFQSQotYW5kIFBOR0NBUEksIGFyZSB1c2VkIGluc3RlYWQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9ucyAoUE5HQ0JBUEkpIGFuZAotKFBOR0NBUEkpIGZvciBmdW5jdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGEgQyBsaWJyYXJ5IHByb3RvdHlwZSAoY3VycmVudGx5Ci1vbmx5IHBuZ19sb25nam1wX3B0ciwgd2hpY2ggbXVzdCBtYXRjaCB0aGUgQyBsb25nam1wIGZ1bmN0aW9uLikgIFRoZSBuZXcKLWFwcHJvYWNoIGlzIGRvY3VtZW50ZWQgaW4gcG5nY29uZi5oCi0KLURlc3BpdGUgdGhlc2UgY2hhbmdlcywgbGlicG5nIDEuNS4wIG9ubHkgc3VwcG9ydHMgdGhlIG5hdGl2ZSBDIGZ1bmN0aW9uCi1jYWxsaW5nIHN0YW5kYXJkIG9uIHRob3NlIHBsYXRmb3JtcyB0ZXN0ZWQgc28gZmFyIChfX2NkZWNsIG9uIE1pY3Jvc29mdAotV2luZG93cykuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHN1cHBvcnQgcmVxdWlyZW1lbnRzIGZvciBhbHRlcm5hdGl2ZQotY2FsbGluZyBjb252ZW50aW9ucyBzZWVtIHRvIG5vIGxvbmdlciBleGlzdC4gIERldmVsb3BlcnMgd2hvIGZpbmQgaXQKLW5lY2Vzc2FyeSB0byBzZXQgUE5HX0FQSV9SVUxFIHRvIDEgc2hvdWxkIGFkdmlzZSB0aGUgbWFpbGluZyBsaXN0Ci0ocG5nLW1uZy1pbXBsZW1lbnQpIG9mIHRoaXMgYW5kIGxpYnJhcnkgYnVpbGRlcnMgd2hvIHVzZSBPcGVud2F0Y29tIGFuZAotdGhlcmVmb3JlIHNldCBQTkdfQVBJX1JVTEUgdG8gMiBzaG91bGQgYWxzbyBjb250YWN0IHRoZSBtYWlsaW5nIGxpc3QuCi0KLUIuIENoYW5nZXMgdG8gdGhlIGNvbmZpZ3VyYXRpb24gbWVjaGFuaXNtCi0KLVByaW9yIHRvIGxpYnBuZy0xLjUuMCBsaWJyYXJ5IGJ1aWxkZXJzIHdobyBuZWVkZWQgdG8gY29uZmlndXJlIGxpYnBuZwotaGFkIGVpdGhlciB0byBtb2RpZnkgdGhlIGV4cG9ydGVkIHBuZ2NvbmYuaCBoZWFkZXIgZmlsZSB0byBhZGQgc3lzdGVtCi1zcGVjaWZpYyBjb25maWd1cmF0aW9uIG9yIGhhZCB0byB3cml0ZSBmZWF0dXJlIHNlbGVjdGlvbiBtYWNyb3MgaW50bwotcG5ndXNyLmggYW5kIGNhdXNlIHRoaXMgdG8gYmUgaW5jbHVkZWQgaW50byBwbmdjb25mLmggYnkgZGVmaW5pbmcKLVBOR19VU0VSX0NPTkZJRy4gVGhlIGxhdHRlciBtZWNoYW5pc20gaGFkIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCBhbgotYXBwbGljYXRpb24gYnVpbHQgd2l0aG91dCBQTkdfVVNFUl9DT05GSUcgZGVmaW5lZCB3b3VsZCBzZWUgdGhlCi11bm1vZGlmaWVkLCBkZWZhdWx0LCBsaWJwbmcgQVBJIGFuZCB0aHVzIHdvdWxkIHByb2JhYmx5IGZhaWwgdG8gbGluay4KLQotVGhlc2UgbWVjaGFuaXNtcyBzdGlsbCB3b3JrIGluIHRoZSBjb25maWd1cmUgYnVpbGQgYW5kIGluIGFueSBtYWtlZmlsZQotYnVpbGQgdGhhdCBidWlsZHMgcG5nbGliY29uZi5oLCBhbHRob3VnaCB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gbWFjcm9zCi1oYXZlIGNoYW5nZWQgc29tZXdoYXQgYXMgZGVzY3JpYmVkIGFib3ZlLiAgSW4gMS41LjAsIGhvd2V2ZXIsIHBuZ3Vzci5oIGlzCi1wcm9jZXNzZWQgb25seSBvbmNlLCBhdCB0aGUgdGltZSB0aGUgZXhwb3J0ZWQgaGVhZGVyIGZpbGUgcG5nbGliY29uZi5oIGlzCi1idWlsdC4gIHBuZ2NvbmYuaCBubyBsb25nZXIgaW5jbHVkZXMgcG5ndXNyLmg7IHRoZXJlZm9yZSwgcG5ndXNyLmggaXMgaWdub3JlZAotYWZ0ZXIgdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaCBhbmQgaXQgaXMgbmV2ZXIgaW5jbHVkZWQgaW4gYW4gYXBwbGljYXRpb24KLWJ1aWxkLgotCi1UaGUgZm9ybWVybHkgdXNlZCBhbHRlcm5hdGl2ZSBvZiBhZGRpbmcgYSBsaXN0IG9mIGZlYXR1cmUgbWFjcm9zIHRvIHRoZQotQ1BQRkxBR1Mgc2V0dGluZyBpbiB0aGUgYnVpbGQgYWxzbyBzdGlsbCB3b3JrczsgaG93ZXZlciwgdGhlIG1hY3JvcyB3aWxsIGJlCi1jb3BpZWQgdG8gcG5nbGliY29uZi5oIGFuZCB0aGlzIG1heSBwcm9kdWNlIG1hY3JvIHJlZGVmaW5pdGlvbiB3YXJuaW5ncwotd2hlbiB0aGUgaW5kaXZpZHVhbCBDIGZpbGVzIGFyZSBjb21waWxlZC4KLQotQWxsIGNvbmZpZ3VyYXRpb24gbm93IG9ubHkgd29ya3MgaWYgcG5nbGliY29uZi5oIGlzIGJ1aWx0IGZyb20KLXNjcmlwdHMvcG5nbGliY29uZi5kZmEuICBUaGlzIHJlcXVpcmVzIHRoZSBwcm9ncmFtIGF3ay4gIEJyaWFuIEtlcm5pZ2hhbgotKHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgYXdrKSBtYWludGFpbnMgQyBzb3VyY2UgY29kZSBvZiB0aGF0IGF3ayBhbmQgdGhpcwotYW5kIGFsbCBrbm93biBsYXRlciBpbXBsZW1lbnRhdGlvbnMgKG9mdGVuIGNhbGxlZCBieSBzdWJ0bHkgZGlmZmVyZW50Ci1uYW1lcyAtIG5hd2sgYW5kIGdhd2sgZm9yIGV4YW1wbGUpIGFyZSBhZGVxdWF0ZSB0byBidWlsZCBwbmdsaWJjb25mLmguCi1UaGUgU3VuIE1pY3Jvc3lzdGVtcyAobm93IE9yYWNsZSkgcHJvZ3JhbSAnYXdrJyBpcyBhbiBlYXJsaWVyIHZlcnNpb24KLWFuZCBkb2VzIG5vdCB3b3JrOyB0aGlzIG1heSBhbHNvIGFwcGx5IHRvIG90aGVyIHN5c3RlbXMgdGhhdCBoYXZlIGEKLWZ1bmN0aW9uaW5nIGF3ayBjYWxsZWQgJ25hd2snLgotCi1Db25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIG5vdyBkb2N1bWVudGVkIGluIHNjcmlwdHMvcG5nbGliY29uZi5kZmEuICBUaGlzCi1maWxlIGFsc28gaW5jbHVkZXMgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB0aGF0IGVuc3VyZXMgYSBjb25maWd1cmF0aW9uIGlzCi1jb25zaXN0ZW50OyB0aGF0IGlzLCBpZiBhIGZlYXR1cmUgaXMgc3dpdGNoZWQgb2ZmLCBkZXBlbmRlbnQgZmVhdHVyZXMgYXJlCi1hbHNvIHN3aXRjaGVkIG9mZi4gIEFzIGEgcmVjb21tZW5kZWQgYWx0ZXJuYXRpdmUgdG8gdXNpbmcgZmVhdHVyZSBtYWNyb3MgaW4KLXBuZ3Vzci5oIGEgc3lzdGVtIGJ1aWxkZXIgbWF5IGFsc28gZGVmaW5lIGVxdWl2YWxlbnQgb3B0aW9ucyBpbiBwbmd1c3IuZGZhCi0ob3IsIGluZGVlZCwgYW55IGZpbGUpIGFuZCBhZGQgdGhhdCB0byB0aGUgY29uZmlndXJhdGlvbiBieSBzZXR0aW5nCi1ERkFfWFRSQSB0byB0aGUgZmlsZSBuYW1lLiAgVGhlIG1ha2VmaWxlcyBpbiBjb250cmliL3BuZ21pbmltIGlsbHVzdHJhdGUKLWhvdyB0byBkbyB0aGlzLCBhbmQgYWxzbyBpbGx1c3RyYXRlIGEgY2FzZSB3aGVyZSBwbmd1c3IuaCBpcyBzdGlsbCByZXF1aXJlZC4KLQotQWZ0ZXIgeW91IGhhdmUgYnVpbHQgbGlicG5nLCB0aGUgZGVmaW5pdGlvbnMgdGhhdCB3ZXJlIHJlY29yZGVkIGluCi1wbmdsaWJjb25mLmggYXJlIGF2YWlsYWJsZSB0byB5b3VyIGFwcGxpY2F0aW9uIChwbmdsaWJjb25mLmggaXMgaW5jbHVkZWQKLWluIHBuZy5oIGFuZCBnZXRzIGluc3RhbGxlZCBhbG9uZ3NpZGUgcG5nLmggYW5kIHBuZ2NvbmYuaCBpbiB5b3VyCi0kUFJFRklYL2luY2x1ZGUgZGlyZWN0b3J5KS4gIERvIG5vdCBlZGl0IHBuZ2xpYmNvbmYuaCBhZnRlciB5b3UgaGF2ZSBidWlsdAotbGlicG5nLCBiZWNhdXNlIHRoYW4gdGhlIHNldHRpbmdzIHdvdWxkIG5vdCBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIHNldHRpbmdzCi10aGF0IHdlcmUgdXNlZCB0byBidWlsZCBsaWJwbmcuCi0KLVhWLiBTZXRqbXAvbG9uZ2ptcCBpc3N1ZXMKLQotTGlicG5nIHVzZXMgc2V0am1wKCkvbG9uZ2ptcCgpIGZvciBlcnJvciBoYW5kbGluZy4gIFVuZm9ydHVuYXRlbHkgc2V0am1wKCkKLWlzIGtub3duIHRvIGJlIG5vdCB0aHJlYWQtc2FmZSBvbiBzb21lIHBsYXRmb3JtcyBhbmQgd2UgZG9uJ3Qga25vdyBvZgotYW55IHBsYXRmb3JtIHdoZXJlIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhyZWFkLXNhZmUuICBUaGVyZWZvcmUsIGlmCi15b3VyIGFwcGxpY2F0aW9uIGlzIGdvaW5nIHRvIGJlIHVzaW5nIG11bHRpcGxlIHRocmVhZHMsIHlvdSBzaG91bGQKLWNvbmZpZ3VyZSBsaWJwbmcgd2l0aCBQTkdfTk9fU0VUSk1QIGluIHlvdXIgcG5ndXNyLmRmYSBmaWxlLCB3aXRoCi0tRFBOR19OT19TRVRKTVAgb24geW91ciBjb21waWxlIGxpbmUsIG9yIHdpdGgKLQotICAjdW5kZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLQotaW4geW91ciBwbmdsaWJjb25mLmggb3IgcG5ndXNyLmguCi0KLVN0YXJ0aW5nIHdpdGggbGlicG5nLTEuNi4wLCB0aGUgbGlicmFyeSBpbmNsdWRlZCBhICJzaW1wbGlmaWVkIEFQSSIuCi1UaGlzIHJlcXVpcmVzIHNldGptcC9sb25nam1wLCBzbyB5b3UgbXVzdCBlaXRoZXIgYnVpbGQgdGhlIGxpYnJhcnkKLXdpdGggUE5HX1NFVEpNUF9TVVBQT1JURUQgZGVmaW5lZCwgb3Igd2l0aCBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRAotYW5kIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCB1bmRlZmluZWQuCi0KLVhWSS4gQ29tbW9uIGxpbmtpbmcgZmFpbHVyZXMKLQotSWYgeW91ciBhcHBsaWNhdGlvbiBmYWlscyB0byBmaW5kIGxpYnBuZyBvciB6bGliIGVudHJpZXMgd2hpbGUgbGlua2luZzoKLQotICBCZSBzdXJlICItbHoiIGFwcGVhcnMgYWZ0ZXIgIi1scG5nIiBvbiB5b3VyIGxpbmtpbmcgY29tbWFuZC4KLQotICBCZSBzdXJlIHlvdSBoYXZlIGJ1aWx0IGxpYnBuZywgemxpYiwgYW5kIHlvdXIgYXBwbGljYXRpb24gZm9yIHRoZQotICBzYW1lIHBsYXRmb3JtIChlLmcuLCAzMi1iaXQgb3IgNjQtYml0KS4KLQotICBJZiB5b3UgYXJlIHVzaW5nIHRoZSB2c3R1ZGlvIHByb2plY3QsIG9ic2VydmUgdGhlIFdBUk5JTkcgaW4KLSAgcHJvamVjdC92c3R1ZGlvL1JFQURNRS50eHQuCi0KLVhWSUkuIE90aGVyIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gYWJvdXQgbGlicG5nOgotCi1GdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgUkVBRE1FIGFuZCBsaWJwbmctbWFudWFsLnR4dAotZmlsZXMsIGluIHRoZSBpbmRpdmlkdWFsIG1ha2VmaWxlcywgaW4gcG5nLmgsIGFuZCB0aGUgbWFudWFsIHBhZ2VzCi1saWJwbmcuMyBhbmQgcG5nLjUuCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWU5YmRlLi4wMDAwMDAwCi0tLSBhL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLSMgTWFrZWZpbGUuYW0sIHRoZSBzb3VyY2UgZmlsZSBmb3IgTWFrZWZpbGUuaW4gKGFuZCBoZW5jZSBNYWtlZmlsZSksIGlzCi0jCi0jIENvcHlyaWdodCAoYykgMjAwNC0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMiBbKFBFTkRJTkcgUkVMRUFTRSldCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotUE5HTElCX0JBU0VOQU1FPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JACi0KLUFDTE9DQUxfQU1GTEFHUyA9IC1JIHNjcmlwdHMKLQotIyB0ZXN0IHByb2dyYW1zIC0gcnVuIG9uIG1ha2UgY2hlY2ssIG1ha2UgZGlzdGNoZWNrCi1jaGVja19QUk9HUkFNUz0gcG5ndGVzdCBwbmd1bmtub3duIHBuZ3N0ZXN0IHBuZ3ZhbGlkIHBuZ2ltYWdlCi1pZiBIQVZFX0NMT0NLX0dFVFRJTUUKLWNoZWNrX1BST0dSQU1TICs9IHRpbWVwbmcKLWVuZGlmCi0KLSMgVXRpbGl0aWVzIC0gaW5zdGFsbGVkCi1iaW5fUFJPR1JBTVM9IHBuZ2NwIHBuZ2ZpeCBwbmctZml4LWl0eHQKLQotIyBUaGlzIGVuc3VyZXMgdGhhdCBwbmdsaWJjb25mLmggZ2V0cyBidWlsdCBhdCB0aGUgc3RhcnQgb2YgJ21ha2UgYWxsJyBvcgotIyAnbWFrZSBjaGVjaycsIGJ1dCBpdCBkb2VzIG5vdCBhZGQgZGVwZW5kZW5jaWVzIHRvIHRoZSBpbmRpdmlkdWFsIHByb2dyYW1zLAotIyB0aGlzIGlzIGRvbmUgYmVsb3cuCi0jCi0jIElNUE9SVEFOVDogYWx3YXlzIGFkZCB0aGUgb2JqZWN0IG1vZHVsZXMgb2YgbmV3IHByb2dyYW1zIHRvIHRoZSBsaXN0IGJlbG93Ci0jIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBzZXF1ZW5jZSAnY29uZmlndXJlOyBtYWtlIG5ldy1wcm9ncmFtJyB3aWxsICpzb21ldGltZXMqCi0jIHJlc3VsdCBpbiB0aGUgaW5zdGFsbGVkIChzeXN0ZW0pIHBuZ2xpYmNvbmYuaCBiZWluZyB1c2VkIGFuZCB0aGUgcmVzdWx0IGlzCi0jIGFsd2F5cyB3cm9uZyBhbmQgYWx3YXlzIHZlcnkgY29uZnVzaW5nLgotQlVJTFRfU09VUkNFUyA9IHBuZ2xpYmNvbmYuaAotCi1wbmd0ZXN0X1NPVVJDRVMgPSBwbmd0ZXN0LmMKLXBuZ3Rlc3RfTERBREQgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALmxhCi0KLXBuZ3ZhbGlkX1NPVVJDRVMgPSBjb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLmMKLXBuZ3ZhbGlkX0xEQUREID0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5sYQotCi1wbmdzdGVzdF9TT1VSQ0VTID0gY29udHJpYi9saWJ0ZXN0cy9wbmdzdGVzdC5jCi1wbmdzdGVzdF9MREFERCA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKLQotcG5ndW5rbm93bl9TT1VSQ0VTID0gY29udHJpYi9saWJ0ZXN0cy9wbmd1bmtub3duLmMKLXBuZ3Vua25vd25fTERBREQgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALmxhCi0KLXBuZ2ltYWdlX1NPVVJDRVMgPSBjb250cmliL2xpYnRlc3RzL3BuZ2ltYWdlLmMKLXBuZ2ltYWdlX0xEQUREID0gbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5sYQotCi10aW1lcG5nX1NPVVJDRVMgPSBjb250cmliL2xpYnRlc3RzL3RpbWVwbmcuYwotdGltZXBuZ19MREFERCA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKLQotcG5nZml4X1NPVVJDRVMgPSBjb250cmliL3Rvb2xzL3BuZ2ZpeC5jCi1wbmdmaXhfTERBREQgPSBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JALmxhCi0KLXBuZ19maXhfaXR4dF9TT1VSQ0VTID0gY29udHJpYi90b29scy9wbmctZml4LWl0eHQuYwotCi1wbmdjcF9TT1VSQ0VTID0gY29udHJpYi90b29scy9wbmdjcC5jCi1wbmdjcF9MREFERCA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAubGEKLQotIyBHZW5lcmFsbHkgdGhlc2UgYXJlIHNpbmdsZSBsaW5lIHNoZWxsIHNjcmlwdHMgdG8gcnVuIGEgdGVzdCB3aXRoIGEgcGFydGljdWxhcgotIyBzZXQgb2YgcGFyYW1ldGVyczoKLVRFU1RTID1cCi0gICB0ZXN0cy9wbmd0ZXN0XAotICAgdGVzdHMvcG5ndmFsaWQtZ2FtbWEtMTYtdG8tOCB0ZXN0cy9wbmd2YWxpZC1nYW1tYS1hbHBoYS1tb2RlXAotICAgdGVzdHMvcG5ndmFsaWQtZ2FtbWEtYmFja2dyb3VuZCB0ZXN0cy9wbmd2YWxpZC1nYW1tYS1leHBhbmQxNi1hbHBoYS1tb2RlXAotICAgdGVzdHMvcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtYmFja2dyb3VuZFwKLSAgIHRlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LXRyYW5zZm9ybSB0ZXN0cy9wbmd2YWxpZC1nYW1tYS1zYml0XAotICAgdGVzdHMvcG5ndmFsaWQtZ2FtbWEtdGhyZXNob2xkIHRlc3RzL3BuZ3ZhbGlkLWdhbW1hLXRyYW5zZm9ybVwKLSAgIHRlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLXNpemVcCi0gICB0ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1pbnRlcmxhY2Utc3RhbmRhcmRcCi0gICB0ZXN0cy9wbmd2YWxpZC10cmFuc2Zvcm1cCi0gICB0ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1zdGFuZGFyZCB0ZXN0cy9wbmd2YWxpZC1zdGFuZGFyZFwKLSAgIHRlc3RzL3BuZ3N0ZXN0LTEuOCB0ZXN0cy9wbmdzdGVzdC0xLjgtYWxwaGEgdGVzdHMvcG5nc3Rlc3QtbGluZWFyXAotICAgdGVzdHMvcG5nc3Rlc3QtbGluZWFyLWFscGhhIHRlc3RzL3BuZ3N0ZXN0LW5vbmUgdGVzdHMvcG5nc3Rlc3Qtbm9uZS1hbHBoYVwKLSAgIHRlc3RzL3BuZ3N0ZXN0LXNSR0IgdGVzdHMvcG5nc3Rlc3Qtc1JHQi1hbHBoYSB0ZXN0cy9wbmd1bmtub3duLUlEQVRcCi0gICB0ZXN0cy9wbmd1bmtub3duLWRpc2NhcmQgdGVzdHMvcG5ndW5rbm93bi1pZi1zYWZlIHRlc3RzL3BuZ3Vua25vd24tc0FQSVwKLSAgIHRlc3RzL3BuZ3Vua25vd24tc1RFUiB0ZXN0cy9wbmd1bmtub3duLXNhdmUgdGVzdHMvcG5ndW5rbm93bi12cEFnXAotICAgdGVzdHMvcG5naW1hZ2UtcXVpY2sgdGVzdHMvcG5naW1hZ2UtZnVsbAotCi0jIG1hbiBwYWdlcwotZGlzdF9tYW5fTUFOUz0gbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCi0jIGdlbmVyYXRlIHRoZSAtY29uZmlnIHNjcmlwdHMgaWYgcmVxdWlyZWQKLWJpbmNvbmZpZ3M9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAtY29uZmlnCi1FWFRSQV9TQ1JJUFRTPSBsaWJwbmctY29uZmlnIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAtY29uZmlnCi1iaW5fU0NSSVBUUz0gQGJpbmNvbmZpZ3NACi0KLSMgcnVsZXMgdG8gYnVpbGQgbGlicG5nLCBvbmx5IGJ1aWxkIHRoZSBvbGQgbGlicmFyeSBvbiByZXF1ZXN0Ci1saWJfTFRMSUJSQVJJRVM9bGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5sYQotIyBFWFRSQV9MVExJQlJBUklFUz0gbGlicG5nLmxhCi1saWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX1NPVVJDRVMgPSBwbmcuYyBwbmdlcnJvci5jXAotCXBuZ2dldC5jIHBuZ21lbS5jIHBuZ3ByZWFkLmMgcG5ncmVhZC5jIHBuZ3Jpby5jIHBuZ3J0cmFuLmMgcG5ncnV0aWwuY1wKLQlwbmdzZXQuYyBwbmd0cmFucy5jIHBuZ3dpby5jIHBuZ3dyaXRlLmMgcG5nd3RyYW4uYyBwbmd3dXRpbC5jXAotCXBuZy5oIHBuZ2NvbmYuaCBwbmdkZWJ1Zy5oIHBuZ2luZm8uaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5ndXNyLmRmYQotCi1pZiBQTkdfQVJNX05FT04KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfU09VUkNFUyArPSBhcm0vYXJtX2luaXQuY1wKLQlhcm0vZmlsdGVyX25lb24uUyBhcm0vZmlsdGVyX25lb25faW50cmluc2ljcy5jCi1lbmRpZgotCi1ub2Rpc3RfbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9TT1VSQ0VTID0gcG5nbGliY29uZi5oCi0KLWxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLWV4cG9ydC1keW5hbWljIFwKLQktdmVyc2lvbi1udW1iZXIgQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQDpAUE5HTElCX1JFTEVBU0VAOjAKLQotaWYgSEFWRV9MRF9WRVJTSU9OX1NDUklQVAotIyAgIFZlcnNpb25lZCBzeW1ib2xzIGFuZCByZXN0cmljdGVkIGV4cG9ydHMKLWlmIEhBVkVfU09MQVJJU19MRAotICBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0xERkxBR1MgKz0gLVdsLC1NIC1XbCxsaWJwbmcudmVycwotZWxzZQotICBsaWJwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAX2xhX0xERkxBR1MgKz0gLVdsLC0tdmVyc2lvbi1zY3JpcHQ9bGlicG5nLnZlcnMKLWVuZGlmCi0KLSAgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9ERVBFTkRFTkNJRVMgPSBsaWJwbmcudmVycwotZWxzZQotIyAgIE9ubHkgcmVzdHJpY3RlZCBleHBvcnRzIHdoZW4gcG9zc2libGUKLSAgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9MREZMQUdTICs9IC1leHBvcnQtc3ltYm9scyBsaWJwbmcuc3ltCi0gIGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfbGFfREVQRU5ERU5DSUVTID0gbGlicG5nLnN5bQotZW5kaWYKLQotI2Rpc3RyaWJ1dGUgaGVhZGVycyBpbiAvdXNyL2luY2x1ZGUvbGlicG5nLyoKLXBrZ2luY2x1ZGVkaXI9ICQoaW5jbHVkZWRpcikvJChQTkdMSUJfQkFTRU5BTUUpCi1wa2dpbmNsdWRlX0hFQURFUlM9IHBuZy5oIHBuZ2NvbmYuaAotbm9kaXN0X3BrZ2luY2x1ZGVfSEVBREVSUz0gcG5nbGliY29uZi5oCi0KLSMgcGtnLWNvbmZpZyBzdHVmZiwgbm90ZSB0aGF0IGxpYnBuZy5wYyBpcyBhbHdheXMgcmVxdWlyZWQgaW4gb3JkZXIKLSMgdG8gZ2V0IHRoZSBjb3JyZWN0IGxpYnJhcnkKLXBrZ2NvbmZpZ2RpciA9IEBwa2djb25maWdkaXJACi1wa2djb25maWdfREFUQSA9IGxpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAucGMKLQotIyBFeHRyYSBzb3VyY2UgZGlzdHJpYnV0aW9uIGZpbGVzLCAnJHtzcmNkaXJ9JyBpcyB1c2VkIGJlbG93IHRvIHN0b3AgYnVpbGQgZmlsZXMKLSMgZnJvbSB0aG9zZSBkaXJlY3RvcmllcyBiZWluZyBpbmNsdWRlZC4gIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgY29uZmlndXJlIGlzCi0jIG5vdCBkb25lIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IQotRVhUUkFfRElTVD0gXAotCUFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBMSUNFTlNFIFJFQURNRSBUT0RPIFwKLQlwbmd0ZXN0LnBuZyBwbmdiYXIucG5nIHBuZ25vdy5wbmcgcG5nYmFyLmpwZyBhdXRvZ2VuLnNoIFwKLQkke3NyY2Rpcn0vY29udHJpYiAke3NyY2Rpcn0vcHJvamVjdHMgJHtzcmNkaXJ9L3NjcmlwdHMgXAotCSQoVEVTVFMpICQoWEZBSUxfVEVTVFMpIHRlc3RzL3BuZ3N0ZXN0IFwKLQlDTWFrZUxpc3RzLnR4dCBleGFtcGxlLmMgbGlicG5nLW1hbnVhbC50eHQKLQotU0NSSVBUX0NMRUFORklMRVM9c2NyaXB0cy8qLm91dCBzY3JpcHRzLyouY2hrCi0KLUNMRUFORklMRVM9ICoudGY/IHBuZ291dC5wbmcgbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC5wYyBcCi0JbGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQC1jb25maWcgbGlicG5nLnZlcnMgbGlicG5nLnN5bSBcCi0JY2hlY2submV3IHBuZ2xpYmNvbmYuaCBwbmdwcmVmaXguaCBzeW1ib2xzLm5ldyBwbmd0ZXN0LWxvZy50eHQgXAotCXBuZ2xpYmNvbmYub3V0IHBuZ2xpYmNvbmYuYyBwbmdsaWJjb25mLnByZSBwbmdsaWJjb25mLmRmbiBcCi0JJChTQ1JJUFRfQ0xFQU5GSUxFUykKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbiBhY2xvY2FsLm00IGNvbmZpZy5ndWVzcyBjb25maWcuaC5pbiBcCi1jb25maWcuc3ViIGNvbmZpZ3VyZSBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcKLQotIyBQTkdfQ09QVFMgZ2l2ZSBleHRyYSBvcHRpb25zIGZvciB0aGUgQyBjb21waWxlciB0byBiZSB1c2VkIG9uIGFsbCBjb21waWxhdGlvbgotIyBzdGVwcyAodW5sZXNzIHRhcmdlX0NGTEFHUyBpcyBzcGVjaWZpZWQ7IHRoYXQgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlcgotIyBBTV9DRkxBR1MpCi1QTkdfQ09QVFMgPSBAUE5HX0NPUFRTQAotQU1fQ0ZMQUdTID0gJHtQTkdfQ09QVFN9Ci0KLSMgREZOQ1BQIGlzIG5vcm1hbGx5IGp1c3QgQ1BQIC0gdGhlIEMgcHJlcHJvY2Vzc29yIC0gYnV0IG9uIFNvbGFyaXMgYW5kIG1heWJlCi0jIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIChOZVhUPykgdGhlIEMgcHJlcHJvY2Vzc29yIHNlbGVjdGVkIGJ5IGNvbmZpZ3VyZQotIyBjaGVja3MgaW5wdXQgdG9rZW5zIGZvciB2YWxpZGl0eSAtIGVmZmVjdGl2ZWx5IGl0IHBlcmZvcm1zIHBhcnQgb2YgdGhlIEFOU0ktQwotIyBwYXJzaW5nIC0gYW5kIHRoZXJlZm9yZSBmYWlscyB3aXRoIHRoZSAuZGYgZmlsZXMuICBjb25maWd1cmUuYWMgaGFzIHNwZWNpYWwKLSMgY2hlY2tzIGZvciB0aGlzIGFuZCBzZXRzIERGTkNQUCBhcHByb3ByaWF0ZWx5LgotREZOQ1BQID0gQERGTkNQUEAKLQotU1VGRklYRVMgPSAuY2hrIC5vdXQKLQotJChQTkdMSUJfQkFTRU5BTUUpLnBjOiBsaWJwbmcucGMKLQljcCBsaWJwbmcucGMgJEAKLQotJChQTkdMSUJfQkFTRU5BTUUpLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJEAKLQotc2NyaXB0cy9zeW0ub3V0IHNjcmlwdHMvdmVycy5vdXQ6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLXNjcmlwdHMvcHJlZml4Lm91dDogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYub3V0Ci1zY3JpcHRzL3N5bWJvbHMub3V0OiBwbmcuaCBwbmdjb25mLmggJChzcmNkaXIpL3NjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci1zY3JpcHRzL2ludHByZWZpeC5vdXQ6IHBuZ2xpYmNvbmYuaAotCi1saWJwbmcuc3ltOiBzY3JpcHRzL3N5bS5vdXQKLQlybSAtZiAkQAotCWNwICQ/ICRACi1saWJwbmcudmVyczogc2NyaXB0cy92ZXJzLm91dAotCXJtIC1mICRACi0JY3AgJD8gJEAKLQotaWYgRE9fUE5HX1BSRUZJWAotIyBSZW5hbWUgZnVuY3Rpb25zIGluIHNjcmlwdHMvcHJlZml4Lm91dCB3aXRoIGEgUE5HX1BSRUZJWCBwcmVmaXguCi0jIFJlbmFtZSBtYWNyb3MgaW4gc2NyaXB0cy9tYWNyby5sc3QgZnJvbSBQTkdfUFJFRklYcG5nXyB0byBQTkdfICh0aGUgYWN0dWFsCi0jIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtYWNybykuCi1wbmdsaWJjb25mLmg6IHBuZ2xpYmNvbmYub3V0IHNjcmlwdHMvcHJlZml4Lm91dCBzY3JpcHRzL21hY3JvLmxzdAotCXJtIC1mICRACi0JJChBV0spICdzPT0wICYmIE5SPjF7cHJpbnQgcHJldn1cCi0JICAgcz09MHtwcmV2PSQkMH1cCi0JICAgcz09MXtwcmludCAiI2RlZmluZSIsICQkMSwgIkBQTkdfUFJFRklYQCIgJCQxfVwKLQkgICBzPT0ye3ByaW50ICIjZGVmaW5lIEBQTkdfUFJFRklYQHBuZ18iICQkMSwgIlBOR18iICQkMX1cCi0JICAgRU5Ee3ByaW50IHByZXZ9JyBzPTAgcG5nbGliY29uZi5vdXQgcz0xIHNjcmlwdHMvcHJlZml4Lm91dFwKLQkgICBzPTIgJHtzcmNkaXJ9L3NjcmlwdHMvbWFjcm8ubHN0ID5wbmdsaWJjb25mLnRmOAotCW12IHBuZ2xpYmNvbmYudGY4ICRACi0KLXBuZ3ByZWZpeC5oOiBzY3JpcHRzL2ludHByZWZpeC5vdXQKLQlybSAtZiBwbmdwcmVmaXgudGYxCi0JJChBV0spICd7cHJpbnQgIiNkZWZpbmUiLCAkJDEsICJAUE5HX1BSRUZJWEAiICQkMX0nICQ/ID5wbmdwcmVmaXgudGYxCi0JbXYgcG5ncHJlZml4LnRmMSAkQAotZWxzZQotcG5nbGliY29uZi5oOiBwbmdsaWJjb25mLm91dAotCXJtIC1mICRACi0JY3AgJD8gJEAKLQotcG5ncHJlZml4Lmg6ICMgaXMgZW1wdHkKLQk6PiRACi1lbmRpZgotCi0kKHNyY2Rpcikvc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQ6Ci0JQGVjaG8gIkF0dGVtcHRpbmcgdG8gYnVpbGQgJEAiID4mMgotCUBlY2hvICJUaGlzIGlzIGEgbWFjaGluZSBnZW5lcmF0ZWQgZmlsZSwgYnV0IGlmIHlvdSB3YW50IHRvIG1ha2UiID4mMgotCUBlY2hvICJhIG5ldyBvbmUgc2ltcGx5IG1ha2UgJ3NjcmlwdHMvcG5nbGliY29uZi5vdXQnLCBjb3B5IHRoYXQiID4mMgotCUBlY2hvICJBTkQgc2V0IFBOR19aTElCX1ZFUk5VTSB0byAwICh5b3UgTVVTVCBkbyB0aGlzKSIgPiYyCi0JQGV4aXQgMQotCi0jIFRoZSBmb2xsb3dpbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBsb2NhbCBwbmdsaWJjb25mLmggaXMgdXNlZCwgbm90Ci0jIGFuIGluc3RhbGxlZCBvbmUgKHRoaXMgY2FuIGhhcHBlbiBpbW1lZGlhdGVseSBhZnRlciBvbiBhIGNsZWFuIHN5c3RlbSBpZgotIyAnbWFrZSB0ZXN0JyBpcyB0aGUgZmlyc3QgdGhpbmcgdGhlIHVzZXIgZG9lcy4pICBPbmx5IGZpbGVzIHdoaWNoIGluY2x1ZGUKLSMgb25lIG9mIHRoZSBwbmcgc291cmNlIGZpbGVzICh0eXBpY2FsbHkgcG5nLmggb3IgcG5ncHJpdi5oKSBuZWVkIHRvIGJlIGxpc3RlZAotIyBoZXJlOgotcG5ndGVzdC5vOiBwbmdsaWJjb25mLmgKLQotY29udHJpYi9saWJ0ZXN0cy9tYWtlcG5nLm86IHBuZ2xpYmNvbmYuaAotY29udHJpYi9saWJ0ZXN0cy9wbmdzdGVzdC5vOiBwbmdsaWJjb25mLmgKLWNvbnRyaWIvbGlidGVzdHMvcG5ndW5rbm93bi5vOiBwbmdsaWJjb25mLmgKLWNvbnRyaWIvbGlidGVzdHMvcG5naW1hZ2UubzogcG5nbGliY29uZi5oCi1jb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLm86IHBuZ2xpYmNvbmYuaAotY29udHJpYi9saWJ0ZXN0cy9yZWFkcG5nLm86IHBuZ2xpYmNvbmYuaAotY29udHJpYi9saWJ0ZXN0cy90YXJpdGgubzogcG5nbGliY29uZi5oCi1jb250cmliL2xpYnRlc3RzL3RpbWVwbmcubzogcG5nbGliY29uZi5oCi0KLWNvbnRyaWIvdG9vbHMvbWFrZXNSR0IubzogcG5nbGliY29uZi5oCi1jb250cmliL3Rvb2xzL3BuZ2ZpeC5vOiBwbmdsaWJjb25mLmgKLWNvbnRyaWIvdG9vbHMvcG5nY3AubzogcG5nbGliY29uZi5oCi0KLSMgV2UgbXVzdCB1c2UgLURQTkdfTk9fVVNFX1JFQURfTUFDUk9TIGhlcmUgZXZlbiB3aGVuIHRoZSBsaWJyYXJ5IG1heSBhY3R1YWxseQotIyBiZSBidWlsdCB3aXRoIFBOR19VU0VfUkVBRF9NQUNST1M7IHRoaXMgcHJldmVudHMgdGhlIHJlYWQgbWFjcm9zIGZyb20KLSMgaW50ZXJmZXJpbmcgd2l0aCB0aGUgc3ltYm9sIGZpbGUgZm9ybWF0LgotU1lNQk9MX0NGTEFHUyA9IC1EUE5HTElCX0xJQk5BTUU9J1BOR0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkBfMCdcCi0JCS1EUE5HTElCX1ZFUlNJT049J0BQTkdMSUJfVkVSU0lPTkAnXAotCQktRFNZTUJPTF9QUkVGSVg9JyQoU1lNQk9MX1BSRUZJWCknXAotCQktRFBOR19OT19VU0VfUkVBRF9NQUNST1MgLURQTkdfQlVJTERJTkdfU1lNQk9MX1RBQkxFCi0KLWlmIERPX1BOR19QUkVGSVgKLVNZTUJPTF9DRkxBR1MgKz0gLURQTkdfUFJFRklYPSdAUE5HX1BSRUZJWEAnCi1lbmRpZgotCi0uYy5vdXQ6Ci0Jcm0gLWYgJEAgJCoudGZbMTJdCi0JdGVzdCAtZCBzY3JpcHRzIHx8IG1rZGlyIHNjcmlwdHMgfHwgdGVzdCAtZCBzY3JpcHRzCi0JJChERk5DUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKVwKLQkgICAgJChDUFBGTEFHUykgJChTWU1CT0xfQ0ZMQUdTKSAkPCA+ICQqLnRmMQotCSQoQVdLKSAtZiAiJHtzcmNkaXJ9L3NjcmlwdHMvZGZuLmF3ayIgb3V0PSIkKi50ZjIiICQqLnRmMSAxPiYyCi0Jcm0gLWYgJCoudGYxCi0JbXYgJCoudGYyICRACi0KLSMgVGhlIC5jIGZpbGUgZm9yIHBuZ2xpYmNvbmYuaCBpcyBtYWNoaW5lIGdlbmVyYXRlZAotcG5nbGliY29uZi5jOiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHNjcmlwdHMvb3B0aW9ucy5hd2sgcG5nY29uZi5oIHBuZ3Vzci5kZmEgJChERkFfWFRSQSkKLQlybSAtZiAkQCAkKi50Zls0NV0KLQkkKEFXSykgLWYgJHtzcmNkaXJ9L3NjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PSQqLnRmNCB2ZXJzaW9uPXNlYXJjaFwKLQkgICAgJHtzcmNkaXJ9L3BuZ2NvbmYuaCAke3NyY2Rpcn0vc2NyaXB0cy9wbmdsaWJjb25mLmRmYVwKLQkgICAgJHtzcmNkaXJ9L3BuZ3Vzci5kZmEgJChERkFfWFRSQSkgMT4mMgotCSQoQVdLKSAtZiAke3NyY2Rpcn0vc2NyaXB0cy9vcHRpb25zLmF3ayBvdXQ9JCoudGY1ICQqLnRmNCAxPiYyCi0Jcm0gJCoudGY0Ci0JbXYgJCoudGY1ICRACi0KLSMgU3ltYm9sIGNoZWNrcyAoLmRlZiBhbmQgLm91dCBmaWxlcyBzaG91bGQgbWF0Y2gpCi1zY3JpcHRzL3N5bWJvbHMuY2hrOiBzY3JpcHRzL2NoZWNrc3ltLmF3ayBzY3JpcHRzL3N5bWJvbHMuZGVmIHNjcmlwdHMvc3ltYm9scy5vdXQKLQotLm91dC5jaGs6Ci0Jcm0gLWYgJEAgJCoubmV3Ci0JJChBV0spIC1mICR7c3JjZGlyfS9zY3JpcHRzL2NoZWNrc3ltLmF3ayAke3NyY2Rpcn0vc2NyaXB0cy8keypGfS5kZWZcCi0JICAgIG9mPSIkKi5uZXciICQ8ID4mMgotCW12ICQqLm5ldyAkQAotCi0jIHVzZWQgb24gZGVtYW5kIHRvIHJlZ2VuZXJhdGUgdGhlIHN0YW5kYXJkIGhlYWRlciwgQ1BQRkxBR1Mgc2hvdWxkCi0jIGJlIGVtcHR5IC0gbm8gbm9uLXN0YW5kYXJkIGRlZmluZXMKLXNjcmlwdHMvcG5nbGliY29uZi5jOiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHNjcmlwdHMvb3B0aW9ucy5hd2sgcG5nY29uZi5oCi0Jcm0gLWYgJEAgcG5nbGliY29uZi50Zls2N10KLQl0ZXN0IC16ICIkKENQUEZMQUdTKSIKLQllY2hvICJjb20gQFBOR0xJQl9WRVJTSU9OQCBTVEFOREFSRCBBUEkgREVGSU5JVElPTiIgfFwKLQkkKEFXSykgLWYgJHtzcmNkaXJ9L3NjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PXBuZ2xpYmNvbmYudGY2XAotCSAgICBsb2d1bnN1cHBvcnRlZD0xIHZlcnNpb249c2VhcmNoICR7c3JjZGlyfS9wbmdjb25mLmggLVwKLQkgICAgJHtzcmNkaXJ9L3NjcmlwdHMvcG5nbGliY29uZi5kZmEgMT4mMgotCSQoQVdLKSAtZiAke3NyY2Rpcn0vc2NyaXB0cy9vcHRpb25zLmF3ayBvdXQ9cG5nbGliY29uZi50ZjdcCi0JICAgIHBuZ2xpYmNvbmYudGY2IDE+JjIKLQlybSBwbmdsaWJjb25mLnRmNgotCW12IHBuZ2xpYmNvbmYudGY3ICRACi0KLSQobGlicG5nQFBOR0xJQl9NQUpPUkBAUE5HTElCX01JTk9SQF9sYV9PQkpFQ1RTKTogcG5nLmggcG5nY29uZi5oIFwKLQlwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ2RlYnVnLmggcG5naW5mby5oIHBuZ3N0cnVjdC5oIHBuZ3ByZWZpeC5oCi0KLXRlc3Q6IGNoZWNrLWFtCi0KLSMgRXh0cmEgY2hlY2tzCi1jaGVjazogc2NyaXB0cy9zeW1ib2xzLmNoawotCi0jIERvbid0IGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBzY3JpcHQgZmlsZXMKLWRpc3QtaG9vazoKLQljZCAnJCh0b3BfZGlzdGRpciknOyBybSAtZiAkKFNDUklQVF9DTEVBTkZJTEVTKQotCi0jIE1ha2UgbGlua3MgYmV0d2VlbiBpbnN0YWxsZWQgZmlsZXMgd2l0aCByZWxlYXNlLXNwZWNpZmljIG5hbWVzIGFuZCB0aGUgZ2VuZXJpYwotIyBmaWxlIG5hbWVzLiAgSWYgdGhpcyBpbnN0YWxsIHJ1bGUgaXMgcnVuIHRoZSBnZW5lcmljIG5hbWVzIHdpbGwgYmUgZGVsZXRlZCBhbmQKLSMgcmVjcmVhdGVkIC0gdGhpcyBoYXMgb2J2aW91cyBpc3N1ZXMgZm9yIHN5c3RlbXMgd2l0aCBtdWx0aXBsZSBpbnN0YWxsYXRpb25zLgotCi1pbnN0YWxsLWhlYWRlci1saW5rczoKLQlAc2V0IC1leDsgY2QgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJzsgZm9yIGYgaW4gJChIRUFERVJTKTsgZG8gXAotCSAgIHJtIC1mICIkJGYiOyAkKExOX1MpICIkKFBOR0xJQl9CQVNFTkFNRSkvJCRmIiAiJCRmIjsgZG9uZQotCi11bmluc3RhbGwtaGVhZGVyLWxpbmtzOgotCWNkICckKERFU1RESVIpJChpbmNsdWRlZGlyKSc7IHJtIC1mICQoSEVBREVSUykKLQotaW5zdGFsbC1saWJwbmctcGM6Ci0JQHNldCAtZXg7IGNkICckKERFU1RESVIpJChwa2djb25maWdkaXIpJzsgcm0gLWYgbGlicG5nLnBjOyBcCi0JICAgJChMTl9TKSAnJChQTkdMSUJfQkFTRU5BTUUpLnBjJyBsaWJwbmcucGMKLQotdW5pbnN0YWxsLWxpYnBuZy1wYzoKLQlybSAtZiAnJChERVNURElSKSQocGtnY29uZmlnZGlyKS9saWJwbmcucGMnCi0KLSMgRVhUX0xJU1QgaXMgYSBsaXN0IG9mIHRoZSBwb3NzaWJseSBsaWJyYXJ5IGRpcmVjdG9yeSBleHRlbnNpb25zLCB0aGlzIGV4aXN0cwotIyBiZWNhdXNlIHdlIGNhbid0IGZpbmQgYSBnb29kIHdheSBvZiBkaXNjb3ZlcmluZyB0aGUgZmlsZSBleHRlbnNpb25zIHRoYXQgYXJlCi0jIGFjdHVhbGx5IGluc3RhbGxlZCBvbiBhIGdpdmVuIHN5c3RlbSwgc28gaW5zdGVhZCB3ZSBjaGVjayBmb3IgZXZlcnkgZXh0ZW5zaW9uCi0jIHdlIGhhdmUgc2Vlbi4KLQotRVhUX0xJU1QgPSBhIGRsbC5hIHNvIHNvLkBQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAuQFBOR0xJQl9SRUxFQVNFQCBsYSBzbCBkeWxpYgotCi1pbnN0YWxsLWxpYnJhcnktbGlua3M6Ci0JQHNldCAteDsgY2QgJyQoREVTVERJUikkKGxpYmRpciknO1wKLQlmb3IgZXh0IGluICQoRVhUX0xJU1QpOyBkb1wKLQkgICBybSAtZiAibGlicG5nLiQkZXh0IjtcCi0gICAgICAgICAgIGlmIHRlc3QgLWYgIiQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dCI7IHRoZW5cCi0gICAgICAgICAgICAgICQoTE5fUykgIiQoUE5HTElCX0JBU0VOQU1FKS4kJGV4dCIgImxpYnBuZy4kJGV4dCIgfHwgZXhpdCAxO1wKLSAgICAgICAgICAgZmk7XAotCWRvbmUKLQotdW5pbnN0YWxsLWxpYnJhcnktbGlua3M6Ci0JQHNldCAteDsgY2QgJyQoREVTVERJUikkKGxpYmRpciknOyBmb3IgZXh0IGluICQoRVhUX0xJU1QpOyBkb1wKLQkgICBybSAtZiAibGlicG5nLiQkZXh0IjsgZG9uZQotCi1pbnN0YWxsLWxpYnBuZy1jb25maWc6Ci0JQHNldCAtZXg7IGNkICckKERFU1RESVIpJChiaW5kaXIpJzsgcm0gLWYgbGlicG5nLWNvbmZpZzsgXAotCSAgICQoTE5fUykgJyQoUE5HTElCX0JBU0VOQU1FKS1jb25maWcnIGxpYnBuZy1jb25maWcKLQotdW5pbnN0YWxsLWxpYnBuZy1jb25maWc6Ci0Jcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvbGlicG5nLWNvbmZpZycKLQotaWYgRE9fSU5TVEFMTF9MSU5LUwotIyBJZiAtLWVuYWJsZS11bnZlcnNpb25lZC1saW5rcyBpcyBzcGVjaWZpZWQgdGhlIGhlYWRlciBhbmQgbGliIGZpbGUgbGlua3MKLSMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hZGUgb24gYSAnbWFrZSBpbnN0YWxsJzoKLQotaW5zdGFsbC1kYXRhLWhvb2s6IGluc3RhbGwtaGVhZGVyLWxpbmtzCi11bmluc3RhbGwtaG9vazogdW5pbnN0YWxsLWhlYWRlci1saW5rcwotaW5zdGFsbC1leGVjLWhvb2s6IGluc3RhbGwtbGlicmFyeS1saW5rcwotdW5pbnN0YWxsLWhvb2s6IHVuaW5zdGFsbC1saWJyYXJ5LWxpbmtzCi1lbmRpZgotCi1pZiBET19JTlNUQUxMX0xJQlBOR19QQwotIyBMaWtld2lzZSwgLS1pbnN0YWxsLXBjIGNhdXNlcyBsaWJwbmcucGMgdG8gYmUgY29uc3RydWN0ZWQ6Ci0KLWluc3RhbGwtZGF0YS1ob29rOiBpbnN0YWxsLWxpYnBuZy1wYwotdW5pbnN0YWxsLWhvb2s6IHVuaW5zdGFsbC1saWJwbmctcGMKLWVuZGlmCi0KLWlmIERPX0lOU1RBTExfTElCUE5HX0NPTkZJRwotIyBBbmQgLS1pbnN0YWxsLWNvbmZpZzoKLQotaW5zdGFsbC1leGVjLWhvb2s6IGluc3RhbGwtbGlicG5nLWNvbmZpZwotdW5pbnN0YWxsLWhvb2s6IHVuaW5zdGFsbC1saWJwbmctY29uZmlnCi1lbmRpZgotCi0jIFRoZSBmb2xsb3dpbmcgYWRkaXRpb24gZW5zdXJlcyB0aGF0ICdtYWtlIGFsbCcgYWx3YXlzIGJ1aWxkcyB0aGUgdGVzdCBwcm9ncmFtcwotIyB0b28uICBJdCB1c2VkIHRvLCBidXQgc29tZSBjaGFuZ2UgZWl0aGVyIGluIGxpYnBuZyBvciBjb25maWd1cmUgc3RvcHBlZCB0aGlzCi0jIHdvcmtpbmcuCi1hbGwtYW06ICQoY2hlY2tfUFJPR1JBTVMpCmRpZmYgLS1naXQgYS9SRUFETUUuZnVjaHNpYSBiL1JFQURNRS5mdWNoc2lhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTBhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuZnVjaHNpYQpAQCAtMCwwICsxLDI0IEBACitOYW1lOiBsaWJwbmcKK1VSTDogaHR0cDovL2xpYnBuZy5vcmcvCitWZXJzaW9uOiAxLjYuMjQKK1NlY3VyaXR5IENyaXRpY2FsOiB5ZXMKK0xpY2Vuc2U6IGxpYnBuZyBsaWNlbnNlCitMaWNlbnNlIEFuZHJvaWQgQ29tcGF0aWJsZTogeWVzCitEZXNjcmlwdGlvbjoKK1VwZGF0ZWQgdG8gMS42LjI0LCBzdHJpcHBlZCBhbGwgdW5uZWVkZWQgZmlsZXMuCisKKy0gVHVybiBvbiBTU0Ugb3B0aW1pemF0aW9ucyBmb3IgSW50ZWwgcGxhdGZvcm1zIGJ5IHJ1bm5pbmc6CisgICJwYXRjaCAtaSBjb250cmliL2ludGVsL2ludGVsX3NzZS5wYXRjaCAtcDEiCistIFN0cmlwIGFsbCB1bm5lZWRlZCBmaWxlcworICBtdiBjb250cmliL2ludGVsIGNvbnRyaWJfaW50ZWxfdGVtcCAjIE1vdmUgY29udHJpYi9pbnRlbCB0ZW1wb3JhcmlseS4KKyAgcm0gLXIgcHJvamVjdHMgc2NyaXB0cyB0ZXN0cyBcCisgICAgICAgIEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBUT0RPIGF1dG9nZW4uc2ggY29uZmlndXJlLmFjIENNYWtlTGlzdHMudHh0IE1ha2VmaWxlLmFtIFwKKyAgICAgICAgKi5pbiAqLjMgKi41ICoucG5nICouanBnICouZGZhIGxpYnBuZy1tYW51YWwudHh0IFwKKyAgICAgICAgY29udHJpYi8qCisgIG12IGNvbnRyaWJfaW50ZWxfdGVtcCBjb250cmliL2ludGVsICMgTW92ZSBjb250cmliL2ludGVsIGJhY2suCisKKy0gVXNlIGN1c3RvbSBjb25maWd1cmF0aW9uIGZpbGUgcG5nbGliY29uZi5oLCB3aGljaCB0dXJucyBvZmYgYWxsIGZlYXR1cmVzIHRoYXQKKyAgYXJlIG5vdCBpbiB1c2UuCistIFVzZSBjdXN0b20gcHJlZml4IGZpbGUgcG5ncHJlZml4LmgsIHdoaWNoIGF2b2lkcyBuYW1lc3BhY2UgY29uZmxpY3RzIHdpdGgKKyAgcGRmaXVtJ3MgY29weSBvZiBsaWJwbmcuCistIENvbmZpZ3VyZXMgY3VzdG9tIHBuZyBjaHVuayB1c2VyIGxpbWl0cyAoY3JidWcuY29tLzExNzM2OSkgaW4gcG5nbGliY29uZi5oLgpkaWZmIC0tZ2l0IGEvVE9ETyBiL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiM2I2NTEuLjAwMDAwMDAKLS0tIGEvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi1UT0RPIC0gbGlzdCBvZiB0aGluZ3MgdG8gZG8gZm9yIGxpYnBuZzoKLQotRmluYWwgYnVnIGZpeGVzLgotQmV0dGVyIEMrKyB3cmFwcGVyL2Z1bGwgQysrIGltcGxlbWVudGF0aW9uPwotRml4IHByb2JsZW0gd2l0aCBDKysgYW5kIEVYVEVSTiAiQyIuCi1jSFJNIHRyYW5zZm9ybWF0aW9uLgotUmVtb3ZlIHNldGptcC9sb25nam1wIHVzYWdlIGluIGZhdm9yIG9mIHJldHVybmluZyBlcnJvciBjb2Rlcy4KLVBhbGV0dGUgY3JlYXRpb24uCi1BZGQgImdyYXlzY2FsZS0+cGFsZXR0ZSIgdHJhbnNmb3JtYXRpb24gYW5kICJwYWxldHRlLT5ncmF5c2NhbGUiIGRldGVjdGlvbi4KLUltcHJvdmVkIGRpdGhlcmluZy4KLU11bHRpLWxpbmd1YWwgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZSBzdXBwb3J0LgotQ29tcGxldGUgc1JHQiB0cmFuc2Zvcm1hdGlvbiAocHJlc2VudGx5IGl0IHNpbXBseSB1c2VzIGdhbW1hPTAuNDU0NTUpLgotTWFuIHBhZ2VzIGZvciBmdW5jdGlvbiBjYWxscy4KLUJldHRlciBkb2N1bWVudGF0aW9uLgotQmV0dGVyIGZpbHRlciBzZWxlY3Rpb24KLSAgIChjb3VudGluZyBodWZmbWFuIGJpdHMvcHJlY29tcHJlc3Npb24/ICBmaWx0ZXIgaW5lcnRpYT8gIGZpbHRlciBjb3N0cz8pLgotSGlzdG9ncmFtIGNyZWF0aW9uLgotVGV4dCBjb252ZXJzaW9uIGJldHdlZW4gZGlmZmVyZW50IGNvZGUgcGFnZXMgKExhdGluLTEgLT4gTWFjIGFuZCBET1MpLgotQXZvaWQgYnVpbGRpbmcgZ2FtbWEgdGFibGVzIHdoZW5ldmVyIHBvc3NpYmxlLgotVXNlIGdyZWF0ZXIgcHJlY2lzaW9uIHdoZW4gY2hhbmdpbmcgdG8gbGluZWFyIGdhbW1hIGZvciBjb21wb3NpdGluZyBhZ2FpbnN0Ci0gIGJhY2tncm91bmQgYW5kIGRvaW5nIHJnYi10by1ncmF5IHRyYW5zZm9ybWF0aW9uLgotSW52ZXN0aWdhdGUgcHJlLWluY3JlbWVudGVkIGxvb3AgY291bnRlcnMgYW5kIG90aGVyIGxvb3AgY29uc3RydWN0aW9ucy4KLUFkZCBpbnRlcnBvbGF0ZWQgbWV0aG9kIG9mIGhhbmRsaW5nIGludGVybGFjaW5nLgotU3dpdGNoIHRvIHRoZSBzaW1wbGVyIHpsaWIgKHpsaWIvbGlicG5nKSBsaWNlbnNlIGlmIGxlZ2FsbHkgcG9zc2libGUuCi1FeHRlbmQgcG5ndmFsaWQuYyB0byB2YWxpZGF0ZSBtb3JlIG9mIHRoZSBsaWJwbmcgdHJhbnNmb3JtYXRpb25zLgotCi0qLwpkaWZmIC0tZ2l0IGEvYXV0b2dlbi5zaCBiL2F1dG9nZW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNjA3MTcuLjAwMDAwMDAKLS0tIGEvYXV0b2dlbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0jISAvYmluL3NoCi0jCi0jIFJ1biAnYXV0b3JlY29uZicgdG8gYnVpbGQgJ2NvbmZpZ3VyZScsICdNYWtlZmlsZS5pbicgYW5kIG90aGVyIGNvbmZpZ3VyZQotIyBjb250cm9sIGZpbGVzLgotIwotIyBUaGUgZmlyc3QgdGltZSB0aGlzIGlzIHJ1biBvbiBhIEdJVCBjaGVja291dCB0aGUgb25seSBmaWxlcyB0aGF0IGV4aXN0IGFyZQotIyBjb25maWd1cmUuYWMgYW5kIE1ha2VmaWxlLmFtOyBhbGwgb2YgdGhlIGF1dG90b29scyBzdXBwb3J0IHNjcmlwdHMgYXJlCi0jIG1pc3NpbmcuICBUaGV5IGFyZSBpbnN0YW50aWF0ZWQgd2l0aCBhdXRvcmVjb25mIC0tZm9yY2UgLS1pbnN0YWxsLgotIwotIyBGb3IgcmVndWxhciAoInRhcmJhbGwiKSBkaXN0cmlidXRpb25zIGFsbCB0aGUgZmlsZXMgc2hvdWxkIGV4aXN0LiAgV2UgZG8gbm90Ci0jIHdhbnQgdGhlbSB0byBiZSB1cGRhdGVkICp1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcyouICBJdCBzaG91bGQgbmV2ZXIgYmUKLSMgbmVjZXNzYXJ5IHRvIHJ1biBhdXRvZ2VuLnNoIGJlY2F1c2UgLi9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIHNheXMKLSMgd2hhdCB0byBkbyBpZiBNYWtlZmlsZS5hbSBvciBjb25maWd1cmUuYWMgYXJlIGNoYW5nZWQuCi0jCi0jIEl0IGlzICpwcm9iYWJseSogT0sgdG8gdXBkYXRlIHRoZSBmaWxlcyBvbiBhIEdJVCBjaGVja291dCwgYmVjYXVzZSB0aGV5IGhhdmUKLSMgY29tZSBmcm9tIHRoZSBsb2NhbCB0b29scywgYnV0IGxlYXZlIHRoYXQgdG8gdGhlIHVzZXIgd2hvIGlzIGFzc3VtZWQgdG8ga25vdwotIyB3aGV0aGVyIGl0IGlzIG9rIG9yIHJlcXVpcmVkLgotIwotIyBUaGlzIHNjcmlwdCBpcyBpbnRlbmRlZCB0byB3b3JrIHdpdGhvdXQgYXJndW1lbnRzLCB0aGVyZSBhcmUsIGhvd2V2ZXIsIGhpZGRlbgotIyBhcmd1bWVudHMgKGEpIGZvciB1c2Ugd2hpbGUgdGVzdGluZyB0aGUgc2NyaXB0IGFuZCAoYikgdG8gZml4IHVwIHN5c3RlbXMgdGhhdAotIyBoYXZlIGJlZW4gYnJva2VuLiAgSWYgKGIpIGlzIHJlcXVpcmVkIHRoZSBzY3JpcHQgcHJvbXB0cyBmb3IgdGhlIGNvcnJlY3QKLSMgb3B0aW9ucy4gIEZvciB0aGlzIHJlYXNvbiB0aGUgb3B0aW9ucyBhcmUgKk5PVCogZG9jdW1lbnRlZCBpbiB0aGUgaGVscDsgdGhpcwotIyBpcyBkZWxpYmVyYXRlOyBVVFNMLgotIwotY2xlYW49Ci1tYWludGFpbmVyPQotd2hpbGUgdGVzdCAkIyAtZ3QgMAotZG8KLSAgIGNhc2UgIiQxIiBpbgotICAgICAgLS1tYWludGFpbmVyKQotICAgICAgICAgbWFpbnRhaW5lcj0xOzsKLQotICAgICAgLS1jbGVhbikKLSAgICAgICAgIGNsZWFuPTE7OwotCi0gICAgICAqKQotICAgICAgICAgZXhlYyA+JjIKLSAgICAgICAgIGVjaG8gIiQwOiB1c2FnZTogLi9hdXRvZ2VuLnNoIgotICAgICAgICAgaWYgdGVzdCAtZCAuZ2l0Ci0gICAgICAgICB0aGVuCi0gICAgICAgICAgICBlY2hvICIgIC4vYXV0b2dlbi5zaCBnZW5lcmF0ZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIgotICAgICAgICAgICAgZWNobyAiICBNYWtlZmlsZS5pbiwgb3IgcmVmcmVzaGVzIHRoZW0gYWZ0ZXIgY2hhbmdlcyB0byBNYWtlZmlsZS5hbSIKLSAgICAgICAgICAgIGVjaG8gIiAgb3IgY29uZmlndXJlLmFjLiAgWW91IG1heSBwcmVmZXIgdG8ganVzdCBydW4gYXV0b3JlY29uZi4iCi0gICAgICAgICBlbGlmIHRlc3QgLXogIiRtYWludGFpbmVyIgotICAgICAgICAgdGhlbgotICAgICAgICAgICAgZWNobyAiICBETyBOT1QgUlVOIFRISVMgU0NSSVBULiIKLSAgICAgICAgICAgIGVjaG8gIiAgSWYgeW91IG5lZWQgdG8gY2hhbmdlIE1ha2VmaWxlLmFtIG9yIGNvbmZpZ3VyZS5hYyB0aGVuIHlvdSIKLSAgICAgICAgICAgIGVjaG8gIiAgYWxzbyBuZWVkIHRvIHJ1biAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgYW5kIgotICAgICAgICAgICAgZWNobyAiICB1c2UgdGhlIGFwcHJvcHJpYXRlIGF1dG90b29scywgKk5PVCogdGhpcyBzY3JpcHQsIHRvIHVwZGF0ZSIKLSAgICAgICAgICAgIGVjaG8gIiAgZXZlcnl0aGluZywgcGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIG9mIGF1dG9yZWNvbmYuIgotICAgICAgICAgICAgZWNobyAiICBXQVJOSU5HOiBsaWJwbmcgaXMgaW50ZW50aW9uYWxseSBnZW5lcmF0ZWQgd2l0aCBhIGtub3duLCIKLSAgICAgICAgICAgIGVjaG8gIiAgZml4ZWQsIHNldCBvZiBhdXRvdG9vbHMuICBJdCBpcyBrbm93biAqTk9UKiB0byB3b3JrIHdpdGgiCi0gICAgICAgICAgICBlY2hvICIgIHRoZSBjb2xsZWN0aW9uIG9mIGF1dG90b29scyBkaXN0cmlidXRlZCBvbiBoaWdobHkgcmVwdXRhYmxlIgotICAgICAgICAgICAgZWNobyAiICBvcGVyYXRpbmcgc3lzdGVtcy4iCi0gICAgICAgICAgICBlY2hvICIgIFJlbWVtYmVyOiBhdXRvdG9vbHMgaXMgR05VIHNvZnR3YXJlLCB5b3UgYXJlIGV4cGVjdGVkIHRvIgotICAgICAgICAgICAgZWNobyAiICBwYXkgZm9yIHN1cHBvcnQuIgotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiICBZb3UgaGF2ZSBydW4gYXV0b2dlbi5zaCB3aXRoIC0tbWFpbnRhaW5lciBlbmFibGVkIGFuZCB5b3UiCi0gICAgICAgICAgICBlY2hvICIgIGFyZSBub3QgdXNpbmcgYSBHSVQgZGlzdHJpYnV0aW9uLCB0aGVuIHlvdSBoYXZlIGdpdmVuIGFuIgotICAgICAgICAgICAgZWNobyAiICB1bnJlY29nbml6ZWQgYXJndW1lbnQuICBUaGlzIGlzIG5vdCBnb29kLiAtLW1haW50YWluZXIiCi0gICAgICAgICAgICBlY2hvICIgIHN3aXRjaGVzIG9mZiBhbnkgYXNzdW1wdGlvbnMgdGhhdCB5b3UgbWlnaHQgbm90IGtub3cgd2hhdCIKLSAgICAgICAgICAgIGVjaG8gIiAgeW91IGFyZSBkb2luZy4iCi0gICAgICAgICBmaQotICAgICAgICAgZXhpdCAxOzsKLSAgIGVzYWMKLQotICAgc2hpZnQKLWRvbmUKLSMKLSMgRmlyc3QgY2hlY2sgZm9yIGEgc2V0IG9mIHRoZSBhdXRvdG9vbHMgZmlsZXM7IGlmIGFic2VudCB0aGVuIHRoaXMgaXMgYXNzdW1lZAotIyB0byBiZSBhIEdJVCB2ZXJzaW9uIGFuZCB0aGUgbG9jYWwgYXV0b3Rvb2xzIG11c3QgYmUgdXNlZC4gIElmIHByZXNlbnQgdGhpcwotIyBpcyBhIHRhcmJhbGwgZGlzdHJpYnV0aW9uIGFuZCB0aGUgc2NyaXB0IHNob3VsZCBub3QgYmUgdXNlZC4gIElmIHBhcnRpYWxseQotIyBwcmVzZW50IGJhZCB0aGluZ3MgYXJlIGhhcHBlbmluZy4KLSMKLSMgVGhlIGF1dG90b29scyBnZW5lcmF0ZWQgZmlsZXM6Ci1saWJwbmdfYXV0b3Rvb2xzX2ZpbGVzPSJNYWtlZmlsZS5pbiBhY2xvY2FsLm00IGNvbmZpZy5ndWVzcyBjb25maWcuaC5pbgotICAgY29uZmlnLnN1YiBjb25maWd1cmUgZGVwY29tcCBpbnN0YWxsLXNoIGx0bWFpbi5zaCBtaXNzaW5nXAotICAgdGVzdC1kcml2ZXIiCi0jCi0jIEZpbGVzIGdlbmVyYXRlZCBieSB2ZXJzaW9ucyBvZiBjb25maWd1ZSA+Mi42OCBvciBhdXRvbWFrZSA+MS4xMyAoaS5lLiBsYXRlcgotIyB2ZXJzaW9ucyB0aGFuIHRob3NlIHJlcXVpcmVkIGJ5IGNvbmZpZ3VyZS5hYyk6Ci1saWJwbmdfYXV0b3Rvb2xzX2V4dHJhPSJjb21waWxlIGNvbmZpZy5oLmlufiIKLSMKLSMgVGhlc2UgYXJlIHNlcGFyYXRlIGJlY2F1c2UgJ21haW50YWluZXItY2xlYW4nIGRvZXMgbm90IHJlbW92ZSB0aGVtLgotbGlicG5nX2xpYnRvb2xfZmlsZXM9InNjcmlwdHMvbGlidG9vbC5tNCBzY3JpcHRzL2x0b3B0aW9ucy5tNFwKLSAgIHNjcmlwdHMvbHRzdWdhci5tNCBzY3JpcHRzL2x0dmVyc2lvbi5tNCBzY3JpcHRzL2x0fm9ic29sZXRlLm00IgotCi1saWJwbmdfYXV0b3Rvb2xzX2RpcnM9ImF1dG9tNHRlLmNhY2hlIiAjIG5vdCByZXF1aXJlZAotIwotIyBUaGUgY29uZmlndXJlIGdlbmVyYXRlZCBmaWxlczoKLWxpYnBuZ19jb25maWd1cmVfZmlsZXM9Ik1ha2VmaWxlIGNvbmZpZy5oIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1c1wKLSAgIGxpYnBuZy1jb25maWcgbGlicG5nLnBjIGxpYnRvb2wgc3RhbXAtaDEiCi0KLWxpYnBuZ19jb25maWd1cmVfZGlycz0iLmRlcHMiCi0jCi0jIFdlIG11c3QgcmVtb3ZlIHRoZSBjb25maWd1cmUgZ2VuZXJhdGVkIGZpbGVzIGFzIHdlbGwgYXMgdGhlIGF1dG90b29scwotIyBnZW5lcmF0ZWQgZmlsZXMgaWYgYXV0b3Rvb2xzIGFyZSByZWdlbmVyYXRlZCBiZWNhdXNlIG90aGVyd2lzZSBpZiBjb25maWd1cmUKLSMgaGFzIGJlZW4gcnVuIHdpdGhvdXQgIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSIgbWFrZSBjYW4gZG8gYSBwYXJ0aWFsIHVwZGF0ZQotIyBvZiBNYWtlZmlsZS4gIFRoZXNlIGZ1bmN0aW9ucyBkbyB0aGUgdHdvIGJpdHMgb2YgY2xlYW5pbmcuCi1jbGVhbl9hdXRvdG9vbHMoKXsKLSAgIHJtIC1yZiAkbGlicG5nX2F1dG90b29sc19maWxlcyAkbGlicG5nX2xpYnRvb2xfZmlsZXMgJGxpYnBuZ19hdXRvdG9vbHNfZGlycwotICAgcm0gLXJmICRsaWJwbmdfYXV0b3Rvb2xzX2V4dHJhCi19Ci0KLWNsZWFuX2NvbmZpZ3VyZSgpewotICAgcm0gLXJmICRsaWJwbmdfY29uZmlndXJlX2ZpbGVzICRsaWJwbmdfY29uZmlndXJlX2RpcnMKLX0KLSMKLSMgQ2xlYW46IHJlbW92ZSBldmVyeXRoaW5nICh0aGlzIGlzIHRvIGhlbHAgd2l0aCB0ZXN0aW5nKQotaWYgdGVzdCAtbiAiJGNsZWFuIgotdGhlbgotICAgY2xlYW5fY29uZmlndXJlCi0gICBpZiB0ZXN0IC1uICIkbWFpbnRhaW5lciIKLSAgIHRoZW4KLSAgICAgIGNsZWFuX2F1dG90b29scwotICAgZmkKLQotICAgZXhpdCAwCi1maQotIwotIyBWYWxpZGF0ZSB0aGUgZGlzdHJpYnV0aW9uLgotbGlicG5nX2F1dG90b29sc19maWxlX2ZvdW5kPQotbGlicG5nX2F1dG90b29sc19maWxlX21pc3Npbmc9Ci1mb3IgZmlsZSBpbiAkbGlicG5nX2F1dG90b29sc19maWxlcwotZG8KLSAgIGlmIHRlc3QgLWYgICIkZmlsZSIKLSAgIHRoZW4KLSAgICAgIGxpYnBuZ19hdXRvdG9vbHNfZmlsZV9mb3VuZD0xCi0gICBlbHNlCi0gICAgICBsaWJwbmdfYXV0b3Rvb2xzX2ZpbGVfbWlzc2luZz0xCi0gICBmaQotZG9uZQotIwotIyBQcmVzZW5jZSBvZiBvbmUgb2YgdGhlc2UgZG9lcyBub3QgKmludmFsaWRhdGUqIG1pc3NpbmcsIGJ1dCBhYnNlbmNlCi0jIGludmFsaWRhdGVzIGZvdW5kLgotZm9yIGZpbGUgaW4gJGxpYnBuZ19saWJ0b29sX2ZpbGVzCi1kbwotICAgaWYgdGVzdCAhIC1mICIkZmlsZSIKLSAgIHRoZW4KLSAgICAgIGxpYnBuZ19hdXRvdG9vbHNfZmlsZV9taXNzaW5nPTEKLSAgIGZpCi1kb25lCi0jCi0jIFRoZSBjYWNoZSBkaXJlY3RvcnkgZG9lc24ndCBtYXR0ZXIgLSBpdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGFuZCBkb2VzIG5vdCBleGlzdAotIyBhbnl3YXkgaW4gYSB0YXJiYWxsLgotIwotIyBFaXRoZXIgZXZlcnl0aGluZyBpcyBtaXNzaW5nIG9yIGV2ZXJ5dGhpbmcgaXMgdGhlcmUsIHRoZSAtLW1haW50YWluZXIgb3B0aW9uCi0jIGp1c3QgY2hhbmdlcyB0aGlzIHNvIHRoYXQgdGhlIG1vZGUgaXMgc2V0IHRvIGdlbmVyYXRlIGFsbCB0aGUgZmlsZXMuCi1tb2RlPQotaWYgdGVzdCAteiAiJGxpYnBuZ19hdXRvdG9vbHNfZmlsZV9mb3VuZCIgLW8gLW4gIiRtYWludGFpbmVyIgotdGhlbgotICAgbW9kZT0iYXV0b3JlY29uZiIKLWVsc2UKLSAgIGlmIHRlc3QgLW4gIiRsaWJwbmdfYXV0b3Rvb2xzX2ZpbGVfbWlzc2luZyIKLSAgIHRoZW4KLSAgICAgIG1vZGU9ImJyb2tlbiIKLSAgIGVsc2UKLSAgICAgIG1vZGU9ImNvbmZpZ3VyZSIKLSAgIGZpCi1maQotIwotIyBTbzoKLWNhc2UgIiRtb2RlIiBpbgotICAgYXV0b3JlY29uZikKLSAgICAgICMgQ2xlYW4gaW4gY2FzZSBjb25maWd1cmUgZmlsZXMgZXhpc3QKLSAgICAgIGNsZWFuX2NvbmZpZ3VyZQotICAgICAgY2xlYW5fYXV0b3Rvb2xzCi0gICAgICAjIEV2ZXJ5dGhpbmcgbXVzdCBiZSBpbml0aWFsaXplZCwgc28gdXNlIC0tZm9yY2UKLSAgICAgIGlmIGF1dG9yZWNvbmYgLS13YXJuaW5ncz1hbGwgLS1mb3JjZSAtLWluc3RhbGwKLSAgICAgIHRoZW4KLSAgICAgICAgIG1pc3Npbmc9Ci0gICAgICAgICBmb3IgZmlsZSBpbiAkbGlicG5nX2F1dG90b29sc19maWxlcwotICAgICAgICAgZG8KLSAgICAgICAgICAgIHRlc3QgLWYgIiRmaWxlIiB8fCBtaXNzaW5nPTEKLSAgICAgICAgIGRvbmUKLSAgICAgICAgICMgaWdub3JlIHRoZSBjYWNoZSBkaXJlY3RvcnkKLSAgICAgICAgIHRlc3QgLXogIiRtaXNzaW5nIiB8fCB7Ci0gICAgICAgICAgICBleGVjID4mMgotICAgICAgICAgICAgZWNobyAiYXV0b3JlY29uZiB3YXMgcnVuLCBidXQgZGlkIG5vdCBwcm9kdWNlIGFsbCB0aGUgZXhwZWN0ZWQiCi0gICAgICAgICAgICBlY2hvICJmaWxlcy4gIEl0IGlzIGxpa2VseSB0aGF0IHlvdXIgYXV0b3Rvb2xzIGluc3RhbGxhdGlvbiBpcyIKLSAgICAgICAgICAgIGVjaG8gIm5vdCBjb21wYXRpYmxlIHdpdGggdGhhdCBleHBlY3RlZCBieSBsaWJwbmcuIgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBleGVjID4mMgotICAgICAgICAgZWNobyAiYXV0b3JlY29uZiBmYWlsZWQ6IHlvdXIgdmVyc2lvbiBvZiBhdXRvdG9vbHMgaXMgaW5jb21wYXRpYmxlIgotICAgICAgICAgZWNobyAid2l0aCB0aGlzIGxpYnBuZyB2ZXJzaW9uLiAgUGxlYXNlIHVzZSBhIGRpc3RyaWJ1dGVkIGFyY2hpdmUiCi0gICAgICAgICBlY2hvICIod2hpY2ggaW5jbHVkZXMgdGhlIGF1dG90b29scyBnZW5lcmF0ZWQgZmlsZXMpIGFuZCBydW4gY29uZmlndXJlIgotICAgICAgICAgZWNobyAiaW5zdGVhZC4iCi0gICAgICAgICBleGl0IDEKLSAgICAgIGZpOzsKLQotICAgY29uZmlndXJlKQotICAgICAgaWYgdGVzdCAtZCAuZ2l0Ci0gICAgICB0aGVuCi0gICAgICAgICBleGVjID4mMgotICAgICAgICAgZWNobyAiRVJST1I6IHJ1bm5pbmcgYXV0b3JlY29uZiBvbiBhbiBpbml0aWFsaXplZCBzeXRlbSIKLSAgICAgICAgIGVjaG8gIiAgVGhpcyBpcyBub3QgbmVjZXNzYXJ5OyBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byByZW1ha2UgdGhlIgotICAgICAgICAgZWNobyAiICBhdXRvdG9vbHMgZ2VuZXJhdGVkIGZpbGVzIGlmIE1ha2VmaWxlLmFtIG9yIGNvbmZpZ3VyZS5hYyIKLSAgICAgICAgIGVjaG8gIiAgY2hhbmdlIGFuZCBtYWtlIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIHdpdGg6IgotICAgICAgICAgZWNobwotICAgICAgICAgZWNobyAiICAgICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuIgotICAgICAgICAgZWNobwotICAgICAgICAgZWNobyAiICBZb3UgY2FuIHJ1biBhdXRvcmVjb25mIHlvdXJzZWxmIGlmIHlvdSBkb24ndCBsaWtlIG1haW50YWluZXIiCi0gICAgICAgICBlY2hvICIgIG1vZGUgYW5kIHlvdSBjYW4gYWxzbyBqdXN0IHJ1biBhdXRvcmVjb25mIC1mIC1pIHRvIGluaXRpYWxpemUiCi0gICAgICAgICBlY2hvICIgIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpcnN0IHBsYWNlOyB0aGlzIHNjcmlwdCBpcyBvbmx5IGZvciIKLSAgICAgICAgIGVjaG8gIiAgY29tcGF0aWJpbGl0eSB3aXRoIHByaW9yIHJlbGVhc2VzLiIKLSAgICAgICAgIGV4aXQgMQotICAgICAgZWxzZQotICAgICAgICAgZXhlYyA+JjIKLSAgICAgICAgIGVjaG8gImF1dG9nZW4uc2ggaXMgaW50ZW5kZWQgb25seSB0byBnZW5lcmF0ZSAnY29uZmlndXJlJyBvbiBzeXN0ZW1zIgotICAgICAgICAgZWNobyAidGhhdCBkbyBub3QgaGF2ZSBpdC4gIFlvdSBoYXZlIGEgY29tcGxldGUgJ2NvbmZpZ3VyZScsIGlmIHlvdSIKLSAgICAgICAgIGVjaG8gIm5lZWQgdG8gY2hhbmdlIE1ha2VmaWxlLmFtIG9yIGNvbmZpZ3VyZS5hYyB5b3UgYWxzbyBuZWVkIHRvIgotICAgICAgICAgZWNobyAicnVuIGNvbmZpZ3VyZSB3aXRoIHRoZSAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uLiIKLSAgICAgICAgIGV4aXQgMQotICAgICAgZmk7OwotCi0gICBicm9rZW4pCi0gICAgICBleGVjID4mMgotICAgICAgZWNobyAiWW91ciBzeXN0ZW0gaGFzIGEgcGFydGlhbCBzZXQgb2YgYXV0b3Rvb2xzIGdlbmVyYXRlZCBmaWxlcy4iCi0gICAgICBlY2hvICJhdXRvZ2VuLnNoIGlzIHVuYWJsZSB0byBwcm9jZWVkLiAgVGhlIGZ1bGwgc2V0IG9mIGZpbGVzIGlzIgotICAgICAgZWNobyAiY29udGFpbmVkIGluIHRoZSBsaWJwbmcgJ3RhcicgZGlzdHJpYnV0aW9uIGFyY2hpdmUgYW5kIHlvdSBkbyIKLSAgICAgIGVjaG8gIm5vdCBuZWVkIHRvIHJ1biBhdXRvZ2VuLnNoIGlmIHlvdSB1c2UgaXQuIgotICAgICAgZXhpdCAxOzsKLWVzYWMKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzZDIwOC4uMDAwMDAwMAotLS0gYS9jb25maWd1cmUuYWMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotIyBjb25maWd1cmUuYWMKLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjIgW01heSAyNiwgMjAxNl0KLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1kbmwgTWlub3IgdXBncmFkZXMgKGNvbXBhdGlibGUgQUJJKTogaW5jcmVtZW50IHRoZSBwYWNrYWdlIHZlcnNpb24KLWRubCAodGhpcmQgZmllbGQgaW4gdHdvIHBsYWNlcyBiZWxvdykgYW5kIHNldCB0aGUgUE5HTElCX1JFTEVBU0UKLWRubCB2YXJpYWJsZS4KLWRubAotZG5sIE1ham9yIHVwZ3JhZGVzIChpbmNvbXBhdGlibGUgQUJJKTogaW5jcmVtZW50IHRoZSBwYWNrYWdlIG1ham9yCi1kbmwgdmVyc2lvbiAoc2Vjb25kIGZpZWxkLCBvciBmaXJzdCBpZiBkZXNpcmVkKSwgc2V0IHRoZSBtaW5vcgotZG5sIHRvIDAsIHNldCBQTkdMSUJfTUFKT1IgYmVsb3cgKmFuZCogZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4KLWRubCBNYWtlZmlsZS5hbSB0byB1cGdyYWRlIHRoZSBwYWNrYWdlIG5hbWUuCi0KLWRubCBUaGlzIGlzIGhlcmUgdG8gcHJldmVudCBlYXJsaWVyIGF1dG9jb25mIGZyb20gYmVpbmcgdXNlZCwgaXQKLWRubCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byByZWdlbmVyYXRlIGNvbmZpZ3VyZSBpZiB0aGUgdGltZQotZG5sIHN0YW1wcyBhcmUgY29ycmVjdAotQUNfUFJFUkVRKFsyLjY4XSkKLQotZG5sIFZlcnNpb24gbnVtYmVyIHN0dWZmIGhlcmU6Ci0KLUFDX0lOSVQoW2xpYnBuZ10sWzEuNi4yNF0sW3BuZy1tbmctaW1wbGVtZW50QGxpc3RzLnNvdXJjZWZvcmdlLm5ldF0pCi1BQ19DT05GSUdfTUFDUk9fRElSKFtzY3JpcHRzXSkKLQotIyBsaWJwbmcgZG9lcyBub3QgZm9sbG93IEdOVSBmaWxlIG5hbWUgY29udmVudGlvbnMgKGhlbmNlICdmb3JlaWduJykKLSMgY29sb3ItdGVzdHMgcmVxdWlyZXMgYXV0b21ha2UgMS4xMSBvciBsYXRlcgotIyBzaWxlbnQtcnVsZXMgcmVxdWlyZXMgYXV0b21ha2UgMS4xMSBvciBsYXRlcgotIyBkaXN0LXh6IHJlcXVpcmVzIGF1dG9tYWtlIDEuMTEgb3IgbGF0ZXIKLSMgMS4xMi4yIGZpeGVzIGEgc2VjdXJpdHkgaXNzdWUgaW4gMS4xMS4yIGFuZCAxLjEyLjEKLSMgMS4xMyBpcyByZXF1aXJlZCBmb3IgcGFyYWxsZWwgdGVzdHMKLUFNX0lOSVRfQVVUT01BS0UoWzEuMTMgZm9yZWlnbiBkaXN0LXh6IGNvbG9yLXRlc3RzIHNpbGVudC1ydWxlcyBzdWJkaXItb2JqZWN0c10pCi0jIFRoZSBmb2xsb3dpbmcgbGluZSBjYXVzZXMgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB0byBiZSB0aGUgZGVmYXVsdCB0bwotIyBjb25maWd1cmUuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgbGlicG5nIGRpc3RyaWJ1dGlvbnMgY2Fubm90IHJlbHkgb24gdGhlCi0jIHRpbWUgc3RhbXBzIG9mIHRoZSBhdXRvdG9vbHMgZ2VuZXJhdGVkIGZpbGVzIGJlaW5nIGNvcnJlY3QKLUFNX01BSU5UQUlORVJfTU9ERQotCi1kbmwgY29uZmlndXJlLmFjIGFuZCBNYWtlZmlsZS5hbSBleHBlY3QgYXV0b21ha2UgMS4xMS4yIG9yIGEgY29tcGF0aWJsZSBsYXRlcgotZG5sIHZlcnNpb247IGFjbG9jYWwubTQgd2lsbCBnZW5lcmF0ZSBhIGZhaWx1cmUgaWYgeW91IHVzZSBhIHByaW9yIHZlcnNpb24gb2YKLWRubCBhdXRvbWFrZSwgc28gdGhlIGZvbGxvd2luZyBpcyBub3QgbmVjZXNzYXJ5IChhbmQgaXMgbm90IGRlZmluZWQgYW55d2F5KToKLWRubCBBTV9QUkVSRVEoWzEuMTEuMl0pCi1kbmwgc3RvcCBjb25maWd1cmUgZnJvbSBhdXRvbWFnaWNhbGx5IHJ1bm5pbmcgYXV0b21ha2UKLQotUE5HTElCX1ZFUlNJT049MS42LjI0Ci1QTkdMSUJfTUFKT1I9MQotUE5HTElCX01JTk9SPTYKLVBOR0xJQl9SRUxFQVNFPTI0Ci0KLWRubCBFbmQgb2YgdmVyc2lvbiBudW1iZXIgc3R1ZmYKLQotQUNfQ09ORklHX1NSQ0RJUihbcG5nZ2V0LmNdKQotQUNfQ09ORklHX0hFQURFUlMoW2NvbmZpZy5oXSkKLQotIyBDaGVja3MgZm9yIHByb2dyYW1zLgotQUNfTEFORyhbQ10pCi1BQ19QUk9HX0NDCi1BTV9QUk9HX0FTCi1MVF9QQVRIX0xECi1BQ19QUk9HX0NQUAotQUNfUFJPR19BV0sKLUFDX1BST0dfSU5TVEFMTAotQUNfUFJPR19MTl9TCi1BQ19QUk9HX01BS0VfU0VUCi0KLWRubCBsaWJ0b29sL2xpYnRvb2xpemU7IHZlcnNpb24gMi40LjIgaXMgdGhlIHRlc3RlZCB2ZXJzaW9uLiBUaGlzIG9yIGFueQotZG5sIGNvbXBhdGlibGUgbGF0ZXIgdmVyc2lvbiBtYXkgYmUgdXNlZAotTFRfSU5JVChbd2luMzItZGxsXSkKLUxUX1BSRVJFUShbMi40LjJdKQotCi0jIFNvbWUgYXdrcyBjcmFzaCB3aGVuIGNvbmZyb250ZWQgd2l0aCBwbmdsaWJjb25mLmRmYSwgZG8gYSB0ZXN0IHJ1biBub3cKLSMgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24ndCBoYXBwZW4KLUFDX01TR19DSEVDS0lORyhbdGhhdCBBV0sgd29ya3NdKQotaWYgJHtBV0t9IC1mICR7c3JjZGlyfS9zY3JpcHRzL29wdGlvbnMuYXdrIG91dD0iL2Rldi9udWxsIiB2ZXJzaW9uPXNlYXJjaFwKLSAgICR7c3JjZGlyfS9wbmdjb25mLmggJHtzcmNkaXJ9L3NjcmlwdHMvcG5nbGliY29uZi5kZmFcCi0gICAke3NyY2Rpcn0vcG5ndXNyLmRmYSAxPiYyCi10aGVuCi0gICBBQ19NU0dfUkVTVUxUKFtva10pCi1lbHNlCi0gICBBQ19NU0dfRkFJTFVSRShbZmFpbGVkXSwgMSkKLWZpCi0KLSMgVGhpcyBpcyBhIHJlbW5hbnQgb2YgdGhlIG9sZCBjYyAtRSB2YWxpZGF0aW9uLCB3aGVyZSBpdCBtYXkgaGF2ZSBiZWVuCi0jIG5lY2Vzc2FyeSB0byB1c2UgYSBkaWZmZXJlbnQgcHJlcHJvY2Vzc29yIGZvciAuZGZuIGZpbGVzCi1ERk5DUFA9IiRDUFAiCi1BQ19TVUJTVChERk5DUFApCi0KLSMgLVdlcnJvciBjYW5ub3QgYmUgcGFzc2VkIHRvIEdDQyBpbiBDRkxBR1MgYmVjYXVzZSBjb25maWd1cmUgd2lsbCBmYWlsIChpdAotIyBjaGVja3MgdGhlIGNvbXBpbGVyIHdpdGggYSBwcm9ncmFtIHRoYXQgZ2VuZXJhdGVzIGEgd2FybmluZyksIGFkZCB0aGUKLSMgZm9sbG93aW5nIG9wdGlvbiB0byBkZWFsIHdpdGggdGhpcwotQUNfQVJHX1ZBUihQTkdfQ09QVFMsCi0gICBbYWRkaXRpb25hbCBmbGFncyBmb3IgdGhlIEMgY29tcGlsZXIsIHVzZSB0aGlzIGZvciBvcHRpb25zIHRoYXQgd291bGRdCi0gICBbY2F1c2UgY29uZmlndXJlIGl0c2VsZiB0byBmYWlsXSkKLUFDX0FSR19FTkFCTEUod2Vycm9yLAotICAgQVNfSEVMUF9TVFJJTkcoW1tbLS1lbmFibGUtd2Vycm9yWz1PUFRdXV1dLAotICAgICAgW1Bhc3MgLVdlcnJvciBvciB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyIGlmIGl0IGlzIHN1cHBvcnRlZF0pLAotICAgW3Rlc3QgIiRlbmFibGVfd2Vycm9yIiA9ICJ5ZXMiICYmIGVuYWJsZV93ZXJyb3I9Ii1XZXJyb3IiCi0gICAgaWYgdGVzdCAiJGVuYWJsZV93ZXJyb3IiICE9ICJubyI7IHRoZW4KLSAgICAgIHNhdl9DRkxBR1M9IiRDRkxBR1MiCi0gICAgICBDRkxBR1M9IiRlbmFibGVfd2Vycm9yICRDRkxBR1MiCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHRoZSBjb21waWxlciBhbGxvd3MgJGVuYWJsZV93ZXJyb3JdKQotICAgICAgQUNfQ09NUElMRV9JRkVMU0UoCi0gICAgICAgICBbQUNfTEFOR19TT1VSQ0UoWwotICAgICAgICAgICAgW2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndil7XQotICAgICAgICAgICAgW3JldHVybiBhcmd2W2FyZ2MtMV1bMF07XQotICAgICAgICAgICAgW31dXSldLAotICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gICAgICAgICBQTkdfQ09QVFM9IiRQTkdfQ09QVFMgJGVuYWJsZV93ZXJyb3IiLAotICAgICAgICAgQUNfTVNHX1JFU1VMVChubykpCi0gICAgICBDRkxBR1M9IiRzYXZfQ0ZMQUdTIgotICAgIGZpXSwpCi0KLSMgRm9yIEdDQyA1IHRoZSBkZWZhdWx0IG1vZGUgZm9yIEMgaXMgLXN0ZD1nbnUxMSBpbnN0ZWFkIG9mIC1zdGQ9Z251ODkKLSMgSW4gcG5ncHJpdi5oIHdlIHJlcXVlc3QganVzdCB0aGUgUE9TSVggMTAwMy4xIGFuZCBDODkgQVBJcyBieSBkZWZpbmluZyBfUE9TSVhfU09VUkNFIHRvIDEKLSMgVGhpcyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbmV3IGRlZmF1bHQgbW9kZSwgc28gd2UgdGVzdCBmb3IgdGhhdCBhbmQgZm9yY2UgdGhlIAotIyAiLXN0ZD1jODkiIGNvbXBpbGVyIG9wdGlvbjoKLUFDX01TR19DSEVDS0lORyhbaWYgd2UgbmVlZCB0byBmb3JjZSBiYWNrIEMgc3RhbmRhcmQgdG8gQzg5XSkKLUFDX0NPTVBJTEVfSUZFTFNFKAotICAgW0FDX0xBTkdfUFJPR1JBTShbCi0gICAgICBbI2RlZmluZSBfUE9TSVhfU09VUkNFIDFdCi0gICAgICBbI2luY2x1ZGUgPHN0ZGlvLmg+XQotICAgXSldLAotICAgQUNfTVNHX1JFU1VMVChubyksWwotICAgICAgaWYgdGVzdCAieCRHQ0MiICE9ICJ4eWVzIjsgdGhlbgotICAgICAgICAgQUNfTVNHX0VSUk9SKAotICAgICAgICAgICAgW0ZvcmNpbmcgYmFjayB0byBDODkgaXMgcmVxdWlyZWQgYnV0IHRoZSBmbGFncyBhcmUgb25seSBrbm93biBmb3IgR0NDXSkKLSAgICAgIGZpCi0gICBBQ19NU0dfUkVTVUxUKHllcykKLSAgIENGTEFHUz0iJENGTEFHUyAtc3RkPWM4OSIKLV0pCi0KLSMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCi1BQ19IRUFERVJfU1REQwotCi0jIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCi1BQ19DX0NPTlNUCi1BQ19UWVBFX1NJWkVfVAotQUNfU1RSVUNUX1RNCi1BQ19DX1JFU1RSSUNUCi0KLSMgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KLUFDX0ZVTkNfU1RSVE9ECi1BQ19DSEVDS19GVU5DUyhbbWVtc2V0XSwgLCBBQ19NU0dfRVJST1IobWVtc2V0IG5vdCBmb3VuZCBpbiBsaWJjKSkKLUFDX0NIRUNLX0ZVTkNTKFtwb3ddLCAsIEFDX0NIRUNLX0xJQihtLCBwb3csICwgQUNfTVNHX0VSUk9SKGNhbm5vdCBmaW5kIHBvdykpICkKLQotIyBTb21lIGxhdGVyIFBPU0lYIDEwMDMuMSBmdW5jdGlvbnMgYXJlIHJlcXVpcmVkIGZvciB0ZXN0IHByb2dyYW1zLCBmYWlsdXJlIGhlcmUKLSMgaXMgc29mdCAodGhlIGNvcnJlc3BvbmRpbmcgdGVzdCBwcm9ncmFtIGlzIG5vdCBidWlsdCkuCi1BQ19DSEVDS19GVU5DKFtjbG9ja19nZXR0aW1lXSwsW0FDX01TR19XQVJOKFtub3QgYnVpbGRpbmcgdGltZXBuZ10pXSkKLUFNX0NPTkRJVElPTkFMKFtIQVZFX0NMT0NLX0dFVFRJTUVdLCBbdGVzdCAiJGFjX2N2X2Z1bmNfY2xvY2tfZ2V0dGltZSIgPSAieWVzIl0pCi0KLUFDX0FSR19XSVRIKHpsaWItcHJlZml4LAotICAgQVNfSEVMUF9TVFJJTkcoW1tbLS13aXRoLXpsaWItcHJlZml4XV1dLAotICAgICAgW3ByZWZpeCB0aGF0IG1heSBoYXZlIGJlZW4gdXNlZCBpbiBpbnN0YWxsZWQgemxpYl0pLAotICAgICAgW1pQUkVGSVg9JHt3aXRodmFsfV0sCi0gICAgICBbWlBSRUZJWD0nel8nXSkKLUFDX0NIRUNLX0xJQih6LCB6bGliVmVyc2lvbiwgLAotICAgIEFDX0NIRUNLX0xJQih6LCAke1pQUkVGSVh9emxpYlZlcnNpb24sICwgQUNfTVNHX0VSUk9SKHpsaWIgbm90IGluc3RhbGxlZCkpKQotCi0jIFRoZSBmb2xsb3dpbmcgaXMgZm9yIHBuZ3ZhbGlkLCB0byBlbnN1cmUgaXQgY2F0Y2hlcyBGUCBlcnJvcnMgZXZlbiBvbgotIyBwbGF0Zm9ybXMgdGhhdCBkb24ndCBlbmFibGUgRlAgZXhjZXB0aW9ucywgdGhlIGZ1bmN0aW9uIGFwcGVhcnMgaW4gdGhlIG1hdGgKLSMgbGlicmFyeSAodHlwaWNhbGx5KSwgaXQncyBub3QgYW4gZXJyb3IgaWYgaXQgaXMgbm90IGZvdW5kLgotQUNfQ0hFQ0tfTElCKFttXSwgW2ZlZW5hYmxlZXhjZXB0XSkKLUFDX0NIRUNLX0ZVTkNTKFtmZWVuYWJsZWV4Y2VwdF0pCi0KLUFDX01TR19DSEVDS0lORyhbaWYgdXNpbmcgU29sYXJpcyBsaW5rZXJdKQotU0xEPWAkTEQgLS12ZXJzaW9uIDI+JjEgfCBncmVwIFNvbGFyaXNgCi1pZiB0ZXN0ICIkU0xEIjsgdGhlbgotICAgIGhhdmVfc29sYXJpc19sZD15ZXMKLSAgICBBQ19NU0dfUkVTVUxUKHllcykKLWVsc2UKLSAgICBoYXZlX3NvbGFyaXNfbGQ9bm8KLSAgICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFNX0NPTkRJVElPTkFMKEhBVkVfU09MQVJJU19MRCwgdGVzdCAiJGhhdmVfc29sYXJpc19sZCIgPSAieWVzIikKLQotQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJyYXJpZXMgY2FuIGJlIHZlcnNpb25lZF0pCi0jIFNwZWNpYWwgY2FzZSBmb3IgUEUvQ09GRiBwbGF0Zm9ybXM6IGxkIHJlcG9ydHMKLSMgc3VwcG9ydCBmb3IgdmVyc2lvbi1zY3JpcHQsIGJ1dCBkb2Vzbid0IGFjdHVhbGx5Ci0jIERPIGFueXRoaW5nIHdpdGggaXQuCi1jYXNlICRob3N0IGluCi0qY3lnd2luKiB8ICptaW5ndzMyKiB8ICppbnRlcml4KiApCi0gICAgaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD1ubwotICAgIEFDX01TR19SRVNVTFQobm8pCi07OwotKiApCi0KLWlmIHRlc3QgIiRoYXZlX3NvbGFyaXNfbGQiID0gInllcyI7IHRoZW4KLSAgICBHTEQ9YCRMRCAtLWhlbHAgPCAvZGV2L251bGwgMj4mMSB8IGdyZXAgJ00gbWFwZmlsZSdgCi1lbHNlCi0gICAgR0xEPWAkTEQgLS1oZWxwIDwgL2Rldi9udWxsIDI+L2Rldi9udWxsIHwgZ3JlcCB2ZXJzaW9uLXNjcmlwdGAKLWZpCi0KLWlmIHRlc3QgIiRHTEQiOyB0aGVuCi0gICAgaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdD15ZXMKLSAgICBBQ19NU0dfUkVTVUxUKHllcykKLWVsc2UKLSAgICBoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PW5vCi0gICAgQUNfTVNHX1JFU1VMVChubykKLSAgICBBQ19NU0dfV0FSTigqKiogWW91IGhhdmUgbm90IGVuYWJsZWQgdmVyc2lvbmVkIHN5bWJvbHMuKQotZmkKLTs7Ci1lc2FjCi0KLUFNX0NPTkRJVElPTkFMKEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQsIHRlc3QgIiRoYXZlX2xkX3ZlcnNpb25fc2NyaXB0IiA9ICJ5ZXMiKQotCi1pZiB0ZXN0ICIkaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCIgPSAieWVzIjsgdGhlbgotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHN5bWJvbCBwcmVmaXhdKQotICAgIFNZTUJPTF9QUkVGSVg9YGVjaG8gIlBSRUZJWD1fX1VTRVJfTEFCRUxfUFJFRklYX18iIFwKLSAgICAgICAgICAgICAgICAgIHwgJHtDUFAtJHtDQy1nY2N9IC1FfSAtIDI+JjEgXAotICAgICAgICAgICAgICAgICAgfCAke0VHUkVQLWdyZXB9ICJeUFJFRklYPSIgXAotICAgICAgICAgICAgICAgICAgfCAke1NFRC1zZWR9IC1lICJzOl5QUkVGSVg9OjoiIC1lICJzOl9fVVNFUl9MQUJFTF9QUkVGSVhfXzo6ImAKLSAgICBBQ19TVUJTVChTWU1CT0xfUFJFRklYKQotICAgIEFDX01TR19SRVNVTFQoJFNZTUJPTF9QUkVGSVgpCi1maQotCi0jIFN1YnN0aXR1dGlvbnMgZm9yIC5pbiBmaWxlcwotQUNfU1VCU1QoUE5HTElCX1ZFUlNJT04pCi1BQ19TVUJTVChQTkdMSUJfTUFKT1IpCi1BQ19TVUJTVChQTkdMSUJfTUlOT1IpCi1BQ19TVUJTVChQTkdMSUJfUkVMRUFTRSkKLQotIyBBZGRpdGlvbmFsIGFyZ3VtZW50cyAoYW5kIHN1YnN0aXR1dGlvbnMpCi0jIEFsbG93IHRoZSBwa2ctY29uZmlnIGRpcmVjdG9yeSB0byBiZSBzZXQKLUFDX0FSR19XSVRIKHBrZ2NvbmZpZ2RpciwKLSAgIEFTX0hFTFBfU1RSSU5HKFtbWy0td2l0aC1wa2djb25maWdkaXJdXV0sCi0gICAgICBbVXNlIHRoZSBzcGVjaWZpZWQgcGtnY29uZmlnIGRpciAoZGVmYXVsdCBpcyBsaWJkaXIvcGtnY29uZmlnKV0pLAotICAgW3BrZ2NvbmZpZ2Rpcj0ke3dpdGh2YWx9XSwKLSAgIFtwa2djb25maWdkaXI9JyR7bGliZGlyfS9wa2djb25maWcnXSkKLQotQUNfU1VCU1QoW3BrZ2NvbmZpZ2Rpcl0pCi1BQ19NU0dfTk9USUNFKFtbcGtnY29uZmlnIGRpcmVjdG9yeSBpcyAke3BrZ2NvbmZpZ2Rpcn1dXSkKLQotIyBNYWtlIHRoZSAqLWNvbmZpZyBiaW5hcnkgY29uZmlnIHNjcmlwdHMgb3B0aW9uYWwKLUFDX0FSR19XSVRIKGJpbmNvbmZpZ3MsCi0gICBBU19IRUxQX1NUUklORyhbW1stLXdpdGgtYmluY29uZmlnc11dXSwKLSAgICAgIFtHZW5lcmF0ZSBzaGVsbCBsaWJwbmctY29uZmlnIHNjcmlwdHMgYXMgd2VsbCBhcyBwa2ctY29uZmlnIGRhdGFdCi0gICAgICBbQDw6QGRlZmF1bHQ9eWVzQDo+QF0pLAotICAgW2lmIHRlc3QgIiR7d2l0aHZhbH0iID0gbm87IHRoZW4KLSAgICAgIGJpbmNvbmZpZ3M9Ci0gICAgICBBQ19NU0dfTk9USUNFKFtbbGlicG5nLWNvbmZpZyBzY3JpcHRzIHdpbGwgbm90IGJlIGJ1aWx0XV0pCi0gICAgZWxzZQotICAgICAgYmluY29uZmlncz0nJHtiaW5jb25maWdzfScKLSAgICBmaV0sCi0gICBbYmluY29uZmlncz0nJHtiaW5jb25maWdzfSddKQotQUNfU1VCU1QoW2JpbmNvbmZpZ3NdKQotCi0jIFN1cHBvcnQgZm9yIHByZWZpeGVzIHRvIHRoZSBBUEkgZnVuY3Rpb24gbmFtZXM7IHRoaXMgd2lsbCBnZW5lcmF0ZSBkZWZpbmVzCi0jIGF0IHRoZSBzdGFydCBvZiB0aGUgYnVpbGQgdG8gcmVuYW1lIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zCi1BQ19BUkdfV0lUSChsaWJwbmctcHJlZml4LAotICAgQVNfSEVMUF9TVFJJTkcoW1tbLS13aXRoLWxpYnBuZy1wcmVmaXhdXV0sCi0gICAgICBbcHJlZml4IGxpYnBuZyBleHBvcnRlZCBmdW5jdGlvbiAoQVBJKSBuYW1lcyB3aXRoIHRoZSBnaXZlbiB2YWx1ZV0pLAotICAgW2lmIHRlc3QgIiR7d2l0aHZhbDotbm99IiAhPSAibm8iOyB0aGVuCi0gICAgICBBQ19TVUJTVChbUE5HX1BSRUZJWF0sIFske3dpdGh2YWx9XSkKLSAgICBmaV0pCi1BTV9DT05ESVRJT05BTChbRE9fUE5HX1BSRUZJWF0sIFt0ZXN0ICIke3dpdGhfbGlicG5nX3ByZWZpeDotbm99IiAhPSAibm8iXSkKLQotIyBDb250cm9sIG92ZXIgd2hhdCBsaW5rcyBhcmUgbWFkZSBmb3IgaW5zdGFsbGVkIGZpbGVzLiAgVmVyc2lvbmVkIGZpbGVzIGFyZQotIyBhbHdheXMgaW5zdGFsbGVkLCB3aGVuIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgdHVybmVkIG9uIGNvcnJlc3BvbmRpbmcKLSMgdW52ZXJzaW9uZWQgbGlua3MgYXJlIGFsc28gY3JlYXRlZCAobm9ybWFsbHkgYXMgc3ltYm9saWMgbGlua3MpOgotQUNfQVJHX0VOQUJMRShbdW52ZXJzaW9uZWQtbGlua3NdLAotICAgQVNfSEVMUF9TVFJJTkcoW1tbLS1lbmFibGUtdW52ZXJzaW9uZWQtbGlua3NdXV0sCi0gICAgICBbSW5zdGFsbGVkIGxpYnBuZyBoZWFkZXIgZmlsZXMgYXJlIHBsYWNlZCBpbiBhIHZlcnNpb25lZCBzdWJkaXJlY3RvcnldCi0gICAgICBbYW5kIGluc3RhbGxlZCBsaWJwbmcgbGlicmFyeSAoaW5jbHVkaW5nIERMTCkgZmlsZXMgYXJlIHZlcnNpb25lZC5dCi0gICAgICBbSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCB1bnZlcnNpb25lZCBsaW5rcyB3aWxsIGJlIGNyZWF0ZWQgcG9pbnRpbmcgdG9dCi0gICAgICBbdGhlIGNvcnJlc3BvbmRpbmcgaW5zdGFsbGVkIGZpbGVzLiAgSWYgeW91IHVzZSBsaWJwbmcucGMgb3JdCi0gICAgICBbbGlicG5nLWNvbmZpZyBmb3IgYWxsIGJ1aWxkcyB5b3UgZG8gbm90IG5lZWQgdGhlc2UgbGlua3MsIGJ1dCBpZiB5b3VdCi0gICAgICBbY29tcGlsZSBwcm9ncmFtcyBkaXJlY3RseSB0aGV5IHdpbGwgdHlwaWNhbGx5ICNpbmNsdWRlIDxwbmcuaD4gYW5kXQotICAgICAgW2xpbmsgd2l0aCAtbHBuZzsgaW4gdGhhdCBjYXNlIHlvdSBuZWVkIHRoZSBsaW5rcy5dCi0gICAgICBbVGhlIGxpbmtzIGNhbiBiZSBpbnN0YWxsZWQgbWFudWFsbHkgdXNpbmcgJ21ha2UgaW5zdGFsbC1oZWFkZXItbGlua3MnXQotICAgICAgW2FuZCAnbWFrZSBpbnN0YWxsLWxpYnJhcnktbGlua3MnIGFuZCBjYW4gYmUgcmVtb3ZlZCB1c2luZyB0aGVdCi0gICAgICBbY29ycmVzcG9uZGluZyB1bmluc3RhbGwtIHRhcmdldHMuICBJZiB5b3UgZG8gZW5hYmxlIHRoaXMgb3B0aW9uIGV2ZXJ5XQotICAgICAgW2xpYnBuZyAnbWFrZSBpbnN0YWxsJyB3aWxsIHJlY3JlYXRlIHRoZSBsaW5rcyB0byBwb2ludCB0byB0aGUganVzdF0KLSAgICAgIFtpbnN0YWxsZWQgdmVyc2lvbiBvZiBsaWJwbmcuICBUaGUgZGVmYXVsdCBpcyB0byBjcmVhdGUgdGhlIGxpbmtzO10KLSAgICAgIFt1c2UgLS1kaXNhYmxlLXVudmVyc2lvbmVkLWxpbmtzIHRvIGNoYW5nZSB0aGlzXSkpCi0KLSMgVGhlIEFNX0NPTkRJVElPTkFMIHRlc3QgaXMgd3JpdHRlbiBzbyB0aGF0IHRoZSBkZWZhdWx0IGlzIGVuYWJsZWQ7Ci0jIC0tZGlzYWJsZS11bnZlcnNpb25lZC1saW5rcyBtdXN0IGJlIGdpdmVuIHRvIHR1cm4gdGhlIG9wdGlvbiBvZmYuCi1BTV9DT05ESVRJT05BTChbRE9fSU5TVEFMTF9MSU5LU10sW3Rlc3QgIiRlbmFibGVfdW52ZXJzaW9uZWRfbGlua3MiICE9ICJubyJdKQotCi1BQ19BUkdfRU5BQkxFKFt1bnZlcnNpb25lZC1saWJwbmctcGNdLAotICAgQVNfSEVMUF9TVFJJTkcoW1tbLS1lbmFibGUtdW52ZXJzaW9uZWQtbGlicG5nLXBjXV1dLAotICAgICAgW0luc3RhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAnbGlicG5nLnBjJyBhcyBhIGxpbmsgdG8gdGhlIHZlcnNpb25lZF0KLSAgICAgIFt2ZXJzaW9uLiAgVGhpcyBpcyBkb25lIGJ5IGRlZmF1bHQgLSB1c2UgLS1kaXNhYmxlLXVudmVyc2lvbmVkLWxpYnBuZy1wY10KLSAgICAgIFt0byBjaGFuZ2UgdGhpcy5dKSkKLUFNX0NPTkRJVElPTkFMKFtET19JTlNUQUxMX0xJQlBOR19QQ10sCi0gICBbdGVzdCAiJGVuYWJsZV91bnZlcnNpb25lZF9saWJwbmdfcGMiICE9ICJubyJdKQotCi1BQ19BUkdfRU5BQkxFKFt1bnZlcnNpb25lZC1saWJwbmctY29uZmlnXSwKLSAgIEFTX0hFTFBfU1RSSU5HKFtbWy0tZW5hYmxlLXVudmVyc2lvbmVkLWxpYnBuZy1jb25maWddXV0sCi0gICAgICBbSW5zdGFsbCB0aGUgY29uZmlndXJhdGlvbiBmaWxlICdsaWJwbmctY29uZmlnJyBhcyBhIGxpbmsgdG8gdGhlXQotICAgICAgW3ZlcnNpb25lZCB2ZXJzaW9uLiAgVGhpcyBpcyBkb25lIGJ5IGRlZmF1bHQgLSB1c2VdCi0gICAgICBbLS1kaXNhYmxlLXVudmVyc2lvbmVkLWxpYnBuZy1jb25maWcgdG8gY2hhbmdlIHRoaXMuXSkpCi1BTV9DT05ESVRJT05BTChbRE9fSU5TVEFMTF9MSUJQTkdfQ09ORklHXSwKLSAgIFt0ZXN0ICIkZW5hYmxlX3VudmVyc2lvbmVkX2xpYnBuZ19jb25maWciICE9ICJubyJdKQotCi0jIEhPU1QgU1BFQ0lGSUMgT1BUSU9OUwotIyA9PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgQVJNCi0jID09PQotIwotIyBBUk0gTkVPTiAoU0lNRCkgc3VwcG9ydC4KLQotQUNfQVJHX0VOQUJMRShbYXJtLW5lb25dLAotICAgQVNfSEVMUF9TVFJJTkcoW1tbLS1lbmFibGUtYXJtLW5lb25dXV0sCi0gICAgICBbRW5hYmxlIEFSTSBORU9OIG9wdGltaXphdGlvbnM6ID1uby9vZmYsIGNoZWNrLCBhcGksIHllcy9vbjpdCi0gICAgICBbbm8vb2ZmOiBkaXNhYmxlIHRoZSBvcHRpbWl6YXRpb25zOyBjaGVjazogdXNlIGludGVybmFsIGNoZWNraW5nIGNvZGVdCi0gICAgICBbKGRlcHJlY2F0ZWQgYW5kIHBvb3JseSBzdXBwb3J0ZWQpOyBhcGk6IGRpc2FibGUgYnkgZGVmYXVsdCwgZW5hYmxlIGJ5XQotICAgICAgW2EgY2FsbCB0byBwbmdfc2V0X29wdGlvbjsgeWVzL29uOiB0dXJuIG9uIHVuY29uZGl0aW9uYWxseS5dCi0gICAgICBbSWYgbm90IHNwZWNpZmllZDogZGV0ZXJtaW5lZCBieSB0aGUgY29tcGlsZXIuXSksCi0gICBbY2FzZSAiJGVuYWJsZXZhbCIgaW4KLSAgICAgIG5vfG9mZikKLSAgICAgICAgICMgZGlzYWJsZSB0aGUgZGVmYXVsdCBlbmFibGluZyBvbiBfX0FSTV9ORU9OX18gc3lzdGVtczoKLSAgICAgICAgIEFDX0RFRklORShbUE5HX0FSTV9ORU9OX09QVF0sIFswXSwKLSAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBBUk0gTmVvbiBvcHRpbWl6YXRpb25zXSkKLSAgICAgICAgICMgUHJldmVudCBpbmNsdXNpb24gb2YgdGhlIGFzc2VtYmxlciBmaWxlcyBiZWxvdzoKLSAgICAgICAgIGVuYWJsZV9hcm1fbmVvbj1ubzs7Ci0gICAgICBjaGVjaykKLSAgICAgICAgIEFDX0RFRklORShbUE5HX0FSTV9ORU9OX0NIRUNLX1NVUFBPUlRFRF0sIFtdLAotICAgICAgICAgICAgICAgICAgIFtDaGVjayBmb3IgQVJNIE5lb24gc3VwcG9ydCBhdCBydW4tdGltZV0pOzsKLSAgICAgIGFwaSkKLSAgICAgICAgIEFDX0RFRklORShbUE5HX0FSTV9ORU9OX0FQSV9TVVBQT1JURURdLCBbXSwKLSAgICAgICAgICAgICAgICAgICBbVHVybiBvbiBBUk0gTmVvbiBvcHRpbWl6YXRpb25zIGF0IHJ1bi10aW1lXSk7OwotICAgICAgeWVzfG9uKQotICAgICAgICAgQUNfREVGSU5FKFtQTkdfQVJNX05FT05fT1BUXSwgWzJdLAotICAgICAgICAgICAgICAgICAgIFtFbmFibGUgQVJNIE5lb24gb3B0aW1pemF0aW9uc10pCi0gICAgICAgICBBQ19NU0dfV0FSTihbLS1lbmFibGUtYXJtLW5lb246IHBsZWFzZSBzcGVjaWZ5ICdjaGVjaycgb3IgJ2FwaScsIGlmXQotICAgICAgICAgICAgW3lvdSB3YW50IHRoZSBvcHRpbWl6YXRpb25zIHVuY29uZGl0aW9uYWxseSBwYXNzIC1tZnB1PW5lb25dCi0gICAgICAgICAgICBbdG8gdGhlIGNvbXBpbGVyLl0pOzsKLSAgICAgICopCi0gICAgICAgICBBQ19NU0dfRVJST1IoWy0tZW5hYmxlLWFybS1uZW9uPSR7ZW5hYmxlX2FybV9uZW9ufTogaW52YWxpZCB2YWx1ZV0pCi0gICBlc2FjXSkKLQotIyBBZGQgQVJNIHNwZWNpZmljIGZpbGVzIHRvIGFsbCBidWlsZHMgd2hlcmUgdGhlIGhvc3RfY3B1IGlzIGFybSAoJ2FybSonKSBvcgotIyB3aGVyZSBBUk0gb3B0aW1pemF0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkICh0aGlzIGFsbG93cyBhIGZhbGxiYWNrIGlmIGEKLSMgZnV0dXJlIGhvc3QgQ1BVIGRvZXMgbm90IG1hdGNoICdhcm0qJykKLQotQU1fQ09ORElUSU9OQUwoW1BOR19BUk1fTkVPTl0sCi0gICBbdGVzdCAiJGVuYWJsZV9hcm1fbmVvbiIgIT0gJ25vJyAmJgotICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgICAgIGFybSp8YWFyY2g2NCopIDo7OwotICAgICAgKikgICAgdGVzdCAiJGVuYWJsZV9hcm1fbmVvbiIgIT0gJyc7OwotICAgIGVzYWNdKQotCi1BQ19NU0dfTk9USUNFKFtbRXh0cmEgb3B0aW9ucyBmb3IgY29tcGlsZXI6ICRQTkdfQ09QVFNdXSkKLQotIyBDb25maWcgZmlsZXMsIHN1YnN0aXR1dGluZyBhcyBhYm92ZQotQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBsaWJwbmcucGM6bGlicG5nLnBjLmluXSkKLUFDX0NPTkZJR19GSUxFUyhbbGlicG5nLWNvbmZpZzpsaWJwbmctY29uZmlnLmluXSwKLSAgIFtjaG1vZCAreCBsaWJwbmctY29uZmlnXSkKLQotQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9jb250cmliL1JFQURNRS50eHQgYi9jb250cmliL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTYzYzYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0KLVRoaXMgImNvbnRyaWIiIGRpcmVjdG9yeSBjb250YWlucyBjb250cmlidXRpb25zIHdoaWNoIGFyZSBub3QgbmVjZXNzYXJpbHkgdW5kZXIKLXRoZSBsaWJwbmcgbGljZW5zZSwgYWx0aG91Z2ggYWxsIGFyZSBvcGVuIHNvdXJjZS4gIFRoZXkgYXJlIG5vdCBwYXJ0IG9mCi1saWJwbmcgcHJvcGVyIGFuZCBhcmUgbm90IHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LCBhbHRob3VnaCBzb21lIGFyZSB1c2VkCi1mb3IgdGVzdGluZyB0aGUgbGlicmFyeSB2aWEgIm1ha2UgY2hlY2siLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9hcm0tbmVvbi9SRUFETUUgYi9jb250cmliL2FybS1uZW9uL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyNDhjZi4uMDAwMDAwMAotLS0gYS9jb250cmliL2FybS1uZW9uL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLU9QRVJBVElORyBTWVNURU0gU1BFQ0lGSUMgQVJNIE5FT04gREVURUNUSU9OCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1EZXRlY3Rpb24gb2YgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBBUk0gTkVPTiBvbiBhbiBBUk0gcHJvY2Vzc29yIHJlcXVpcmVzCi1vcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnQuICAoVGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gdXNlciBtb2RlLikKLQotSE9XIFRPIFVTRSBUSElTCi0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgQyBjb2RlIGZyYWdtZW50cyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhcm0vYXJtX2luaXQuYwotYnkgc2V0dGluZyB0aGUgbWFjcm8gUE5HX0FSTV9ORU9OX0ZJTEUgdG8gdGhlIGZpbGUgbmFtZSBpbiAiIiBvciA8PiBhdCBidWlsZAotdGltZS4gIFRoaXMgc2V0dGluZyBpcyBub3QgcmVjb3JkZWQgaW4gcG5nbGliY29uZi5oIGFuZCBjYW4gYmUgY2hhbmdlZCBzaW1wbHkgYnkKLXJlYnVpbGRpbmcgYXJtL2FybV9pbml0Lm8gd2l0aCB0aGUgcmVxdWlyZWQgbWFjcm8gZGVmaW5pdGlvbi4KLQotRm9yIGFueSBvZiB0aGlzIGNvZGUgdG8gYmUgdXNlZCB0aGUgQVJNIE5FT04gY29kZSBtdXN0IGJlIGVuYWJsZWQgYW5kIHJ1biB0aW1lCi1jaGVja3MgbXVzdCBiZSBzdXBwb3J0ZWQuICBJLmUuOgotCi0jaWYgUE5HX0FSTV9ORU9OX09QVCA+IDAKLSNpZmRlZiBQTkdfQVJNX05FT05fQ0hFQ0tfU1VQUE9SVEVECi0KLVRoaXMgaXMgZG9uZSBpbiBhICdjb25maWd1cmUnIGJ1aWxkIGJ5IHBhc3NpbmcgY29uZmlndXJlIHRoZSBhcmd1bWVudDoKLQotICAgLS1lbmFibGUtYXJtLW5lb249Y2hlY2sKLQotQXBhcnQgZnJvbSB0aGUgYmFzaWMgTGludXggaW1wbGVtZW50YXRpb24gaW4gY29udHJpYi9hcm0tbmVvbi9saW51eC5jIHRoaXMgY29kZQotaXMgdW5zdXBwb3J0ZWQuICBUaGF0IG1lYW5zIHRoYXQgaXQgaXMgbm90IGV2ZW4gY29tcGlsZWQgb24gYSByZWd1bGFyIGJhc2lzIGFuZAotbWF5IGJlIGJyb2tlbiBpbiBhbnkgZ2l2ZW4gbWlub3IgcmVsZWFzZS4KLQotRklMRSBGT1JNQVQKLS0tLS0tLS0tLS0tCi0KLUVhY2ggZmlsZSBkb2N1bWVudHMgaXRzIHRlc3Rpbmcgc3RhdHVzIGFzIG9mIHRoZSBsYXN0IHRpbWUgaXQgd2FzIHRlc3RlZCAod2hpY2gKLW1heSBoYXZlIGJlZW4gYSBsb25nIHRpbWUgYWdvKToKLQotU1RBVFVTOiBvbmUgb2Y6Ci0gICBTVVBQT1JURUQ6IFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbGUgaXMgaW5jbHVkZWQgaW4gdGhlIHJlZ3VsYXJseQotICAgICAgICAgcGVyZm9ybWVkIHRlc3QgYnVpbGRzIGFuZCBidWdzIGFyZSBmaXhlZCB3aGVuIGRpc2NvdmVyZWQuCi0gICBDT01QSUxFRDogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29kZSBkaWQgY29tcGlsZSBhdCBsZWFzdCBvbmNlLiAgU2VlIHRoZQotICAgICAgICAgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBmb3IgdGhlIGV4dGVudCB0byB3aGljaCB0aGUgcmVzdWx0IHdhcwotICAgICAgICAgc3VjY2Vzc2Z1bC4KLSAgIFRFU1RFRDogVGhpcyBtZWFucyB0aGUgY29kZSB3YXMgZnVsbHkgY29tcGlsZWQgaW50byB0aGUgbGlicG5nIHRlc3QgcHJvZ3JhbXMKLSAgICAgICAgIGFuZCB0aGVzZSB3ZXJlIHJ1biBhdCBsZWFzdCBvbmNlLgotCi1CVUcgUkVQT1JUUzogYW4gZW1haWwgYWRkcmVzcyB0byB3aGljaCB0byBzZW5kIHJlcG9ydHMgb2YgcHJvYmxlbXMKLQotVGhlIGZpbGUgaXMgYSBmcmFnbWVudCBvZiBDIGNvZGUuIEl0IHNob3VsZCBub3QgZGVmaW5lIGFueSAnZXh0ZXJuJyBzeW1ib2xzOwotZXZlcnl0aGluZyBzaG91bGQgYmUgc3RhdGljLiAgSXQgbXVzdCBkZWZpbmUgdGhlIGZ1bmN0aW9uOgotCi1zdGF0aWMgaW50IHBuZ19oYXZlX25lb24ocG5nX3N0cnVjdHAgcG5nX3B0cik7Ci0KLVRoYXQgZnVuY3Rpb24gbXVzdCByZXR1cm4gMSBpZiBBUk0gTkVPTiBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBpZiBub3QuCi1JdCBtdXN0IG5vdCBleGVjdXRlIHBuZ19lcnJvciB1bmxlc3MgaXQgZGV0ZWN0cyBhIGJ1Zy4gIEEgcG5nX2Vycm9yIHdpbGwgcHJldmVudAotdGhlIHJlYWRpbmcgb2YgdGhlIFBORyBhbmQgaW4gdGhlIGZ1dHVyZSwgd3JpdGluZyB0b28uCi0KLUJVRyBSRVBPUlRTCi0tLS0tLS0tLS0tLQotCi1JZiB5b3UgbWFpbCBhIGJ1ZyByZXBvcnQgZm9yIGFueSBmaWxlIHRoYXQgaXMgbm90IFNVUFBPUlRFRCB0aGVyZSBtYXkgb25seSBiZQotbGltaXRlZCByZXNwb25zZS4gIENvbnNpZGVyIGZpeGluZyBpdCBhbmQgc2VuZGluZyBhIHBhdGNoIHRvIGZpeCB0aGUgcHJvYmxlbSAtCi10aGlzIGlzIG1vcmUgbGlrZWx5IHRvIHJlc3VsdCBpbiBhY3Rpb24uCi0KLUNPTlRSSUJVVElPTlMKLS0tLS0tLS0tLS0tLS0KLQotWW91IG1heSBzZW5kIGNvbnRyaWJ1dGlvbnMgb2YgbmV3IGltcGxlbWVudGF0aW9ucyB0bwotcG5nLW1uZy1pbXBsZW1lbnRAc291cmNlZm9yZ2UubmV0LiAgUGxlYXNlIHdyaXRlIGNvZGUgaW4gc3RyaWN0IEM5MCBDIHdoZXJlCi1wb3NzaWJsZS4gIE9idmlvdXNseSBPUyBkZXBlbmRlbmNpZXMgYXJlIHRvIGJlIGV4cGVjdGVkLiAgSWYgeW91IHN1Ym1pdCBjb2RlIHlvdQotbXVzdCBoYXZlIHRoZSBhdXRob3JzIHBlcm1pc3Npb24gYW5kIGl0IG11c3QgaGF2ZSBhIGxpY2Vuc2UgdGhhdCBpcyBhY2NlcHRhYmxlCi10byB0aGUgY3VycmVudCBtYWludGFpbmVyOyBpbiBwYXJ0aWN1bGFyIHRoYXQgbGljZW5zZSBtdXN0IHBlcm1pdCBtb2RpZmljYXRpb24KLWFuZCByZWRpc3RyaWJ1dGlvbi4KLQotUGxlYXNlIHRyeSB0byBtYWtlIHRoZSBjb250cmlidXRpb24gYSBzaW5nbGUgZmlsZSBhbmQgZ2l2ZSB0aGUgZmlsZSBhIGNsZWFyIGFuZAotdW5hbWJpZ3VvdXMgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhlIHRhcmdldCBPUy4gIElmIG11bHRpcGxlIGZpbGVzIHJlYWxseSBhcmUKLXJlcXVpcmVkIHB1dCB0aGVtIGFsbCBpbiBhIHN1Yi1kaXJlY3RvcnkuCi0KLVlvdSBtdXN0IGFsc28gYmUgcHJlcGFyZWQgdG8gaGFuZGxlIGJ1ZyByZXBvcnRzIGZyb20gdXNlcnMgb2YgdGhlIGNvZGUsIGVpdGhlcgotYnkgam9pbmluZyB0aGUgcG5nLW1uZy1pbXBsZW1lbnQgbWFpbGluZyBsaXN0IG9yIGJ5IHByb3ZpZGluZyBhbiBlbWFpbCBmb3IgdGhlCi0iQlVHIFJFUE9SVFMiIGVudHJ5IG9yIGJvdGguICBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGhlYWRlciBvZiB0aGUgZmlsZQotY29udGFpbnMgdGhlIFNUQVRVUyBhbmQgQlVHIFJFUE9SVFMgZmllbGRzIGFzIGFib3ZlLgotCi1QbGVhc2UgbGlzdCB0aGUgT1MgcmVxdWlyZW1lbnRzIGFzIHByZWNpc2VseSBhcyBwb3NzaWJsZS4gIElkZWFsbHkgeW91IHNob3VsZAotYWxzbyBsaXN0IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgYW5kIGNlcnRhaW5seSBsaXN0Ci1hbnkgZW52aXJvbm1lbnRzIHdoZXJlIHlvdSBzdXNwZWN0IGl0IG1pZ2h0IG5vdCB3b3JrLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9hcm0tbmVvbi9hbmRyb2lkLW5kay5jIGIvY29udHJpYi9hcm0tbmVvbi9hbmRyb2lkLW5kay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQwMTIzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvYXJtLW5lb24vYW5kcm9pZC1uZGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIGNvbnRyaWIvYXJtLW5lb24vYW5kcm9pZC1uZGsuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIFdyaXR0ZW4gYnkgSm9obiBCb3dsZXIsIDIwMTQuCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xMCBbTWFyY2ggNiwgMjAxNF0KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBTRUUgY29udHJpYi9hcm0tbmVvbi9SRUFETUUgYmVmb3JlIHJlcG9ydGluZyBidWdzCi0gKgotICogU1RBVFVTOiBDT01QSUxFRCwgVU5URVNURUQKLSAqIEJVRyBSRVBPUlRTOiBwbmctbW5nLWltcGxlbWVudEBzb3VyY2Vmb3JnZS5uZXQKLSAqCi0gKiBwbmdfaGF2ZV9uZW9uIGltcGxlbWVudGVkIGZvciB0aGUgQW5kcm9pZCBOREssIHNlZToKLSAqCi0gKiBEb2N1bWVudGF0aW9uOgotICogICAgaHR0cDovL3d3dy5rYW5kcm9pZC5vcmcvbmRrL2RvY3MvQ1BVLUFSTS1ORU9OLmh0bWwKLSAqICAgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9NDkwNjUKLSAqCi0gKiBOT1RFOiB0aGlzIHJlcXVpcmVzIHRoYXQgbGlicG5nIGlzIGJ1aWx0IGFnYWluc3QgdGhlIEFuZHJvaWQgTkRLIGFuZCBsaW5rZWQKLSAqIHdpdGggYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFuZHJvaWQgQVJNICdjcHUtZmVhdHVyZXMnIGxpYnJhcnkuICBUaGUgY29kZQotICogaGFzIGJlZW4gY29tcGlsZWQgb25seSwgbm90IGxpbmtlZDogbm8gdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBoYXMgYmVlbiBmb3VuZCwKLSAqIG9ubHkgdGhlIGhlYWRlciBmaWxlcyBleGlzdCBpbiB0aGUgTkRLLgotICovCi0jaW5jbHVkZSA8Y3B1LWZlYXR1cmVzLmg+Ci0KLXN0YXRpYyBpbnQKLXBuZ19oYXZlX25lb24ocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIC8qIFRoaXMgaXMgYSB3aG9sZSBsb3QgZWFzaWVyIHRoYW4gdGhlIGxpbnV4IGNvZGUsIGhvd2V2ZXIgaXQgaXMgcHJvYmFibHkKLSAgICAqIGltcGxlbWVudGVkIGFzIGJlbG93LCB0aGVyZWZvcmUgaXQgaXMgYmV0dGVyIHRvIGNhY2hlIHRoZSByZXN1bHQgKHRoZXNlCi0gICAgKiBmdW5jdGlvbiBjYWxscyBtYXkgYmUgc2xvdyEpCi0gICAgKi8KLSAgIFBOR19VTlVTRUQocG5nX3B0cikKLSAgIHJldHVybiBhbmRyb2lkX2dldENwdUZhbWlseSgpID09IEFORFJPSURfQ1BVX0ZBTUlMWV9BUk0gJiYKLSAgICAgIChhbmRyb2lkX2dldENwdUZlYXR1cmVzKCkgJiBBTkRST0lEX0NQVV9BUk1fRkVBVFVSRV9ORU9OKSAhPSAwOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hcm0tbmVvbi9saW51eC1hdXh2LmMgYi9jb250cmliL2FybS1uZW9uL2xpbnV4LWF1eHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyNmJkMy4uMDAwMDAwMAotLS0gYS9jb250cmliL2FybS1uZW9uL2xpbnV4LWF1eHYuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBjb250cmliL2FybS1uZW9uL2xpbnV4LWF1eHYuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIFdyaXR0ZW4gYnkgTWFucyBSdWxsZ2FyZCwgMjAxMS4KLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjEwIFtNYXJjaCA2LCAyMDE0XQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFNFRSBjb250cmliL2FybS1uZW9uL1JFQURNRSBiZWZvcmUgcmVwb3J0aW5nIGJ1Z3MKLSAqCi0gKiBTVEFUVVM6IENPTVBJTEVELCBURVNURUQKLSAqIEJVRyBSRVBPUlRTOiBwbmctbW5nLWltcGxlbWVudEBzb3VyY2Vmb3JnZS5uZXQKLSAqCi0gKiBwbmdfaGF2ZV9uZW9uIGltcGxlbWVudGVkIGZvciBMaW51eCB2ZXJzaW9ucyB3aGljaCBhbGxvdyBhY2Nlc3MgdG8KLSAqIC9wcm9jL3NlbGYvYXV4di4gIFRoaXMgaXMgcHJvYmFibHkgZmFzdGVyLCBjbGVhbmVyIGFuZCBzYWZlciB0aGFuIHRoZSBjb2RlIHRvCi0gKiByZWFkIC9wcm9jL2NwdWluZm8gaW4gY29udHJpYi9hcm0tbmVvbi9saW51eCwgaG93ZXZlciBpdCBpcyB5ZXQgYW5vdGhlciBwaWVjZQotICogb2YgcG90ZW50aWFsbHkgdW50ZXN0ZWQgY29kZSBhbmQgaGFzIG1vcmUgY29tcGxleCBkZXBlbmRlbmNpZXMgdGhhbiB0aGUgY29kZQotICogdG8gcmVhZCBjcHVpbmZvLgotICoKLSAqIFRoaXMgZ2VuZXJpYyBfX2xpbnV4X18gaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgcmVhZGluZyAvcHJvYy9zZWxmL2F1eHYgYW5kCi0gKiBsb29raW5nIGF0IGVhY2ggZWxlbWVudCBmb3Igb25lIHRoYXQgcmVjb3JkcyBORU9OIGNhcGFiaWxpdGllcy4KLSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPiAvKiBmb3IgUE9TSVggMTAwMy4xICovCi0jaW5jbHVkZSA8ZXJybm8uaD4gIC8qIGZvciBFSU5UUiAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPGFzbS9od2NhcC5oPgotCi0vKiBBIHJlYWQgY2FsbCBtYXkgYmUgaW50ZXJydXB0ZWQsIGluIHdoaWNoIGNhc2UgaXQgcmV0dXJucyAtMSBhbmQgc2V0cyBlcnJubyB0bwotICogRUlOVFIgaWYgbm90aGluZyB3YXMgZG9uZSwgb3RoZXJ3aXNlIChpZiBzb21ldGhpbmcgd2FzIGRvbmUpIGEgcGFydGlhbCByZWFkCi0gKiBtYXkgcmVzdWx0LgotICovCi1zdGF0aWMgc2l6ZV90Ci1zYWZlX3JlYWQocG5nX3N0cnVjdHAgcG5nX3B0ciwgaW50IGZkLCB2b2lkICpidWZmZXJfaW4sIHNpemVfdCBuYnl0ZXMpCi17Ci0gICBzaXplX3QgbnRvdGFsID0gMDsKLSAgIGNoYXIgKmJ1ZmZlciA9IHBuZ192b2lkY2FzdChjaGFyKiwgYnVmZmVyX2luKTsKLQotICAgd2hpbGUgKG5ieXRlcyA+IDApCi0gICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbnJlYWQ7Ci0gICAgICBpbnQgaXJlYWQ7Ci0KLSAgICAgIC8qIFBhc3NpbmcgbnJlYWQgPiBJTlRfTUFYIHRvIHJlYWQgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBpbiBQT1NJWAotICAgICAgICogMTAwMy4xLCB0aGVyZWZvcmUgZGVzcGl0ZSB0aGUgdW5zaWduZWQgYXJndW1lbnQgcG9ydGFibGUgY29kZSBtdXN0Ci0gICAgICAgKiBsaW1pdCB0aGUgdmFsdWUgdG8gSU5UX01BWCEKLSAgICAgICAqLwotICAgICAgaWYgKG5ieXRlcyA+IElOVF9NQVgpCi0gICAgICAgICBucmVhZCA9IElOVF9NQVg7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG5yZWFkID0gKHVuc2lnbmVkIGludCkvKlNBRkUqL25ieXRlczsKLQotICAgICAgaXJlYWQgPSByZWFkKGZkLCBidWZmZXIsIG5yZWFkKTsKLQotICAgICAgaWYgKGlyZWFkID09IC0xKQotICAgICAgewotICAgICAgICAgLyogVGhpcyBpcyB0aGUgZGV2aWwgaW4gdGhlIGRldGFpbHMsIGEgcmVhZCBjYW4gdGVybWluYXRlIGVhcmx5IHdpdGggMAotICAgICAgICAgICogYnl0ZXMgcmVhZCBiZWNhdXNlIG9mIEVJTlRSLCB5ZXQgaXQgc3RpbGwgcmV0dXJucyAtMSBvdGhlcndpc2UgZW5kCi0gICAgICAgICAgKiBvZiBmaWxlIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiL3Byb2MgcmVhZCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiAwOyAvKiBJLmUuLCBhIHBlcm1hbmVudCBmYWlsdXJlICovCi0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGlyZWFkIDwgMCkKLSAgICAgIHsKLSAgICAgICAgIC8qIE5vdCBhIHZhbGlkICdyZWFkJyByZXN1bHQ6ICovCi0gICAgICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiT1MgL3Byb2MgcmVhZCBidWciKTsKLSAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChpcmVhZCA+IDApCi0gICAgICB7Ci0gICAgICAgICAvKiBDb250aW51ZSByZWFkaW5nIHVudGlsIGEgcGVybWFuZW50IGZhaWx1cmUsIG9yIEVPRiAqLwotICAgICAgICAgYnVmZmVyICs9IGlyZWFkOwotICAgICAgICAgbmJ5dGVzIC09ICh1bnNpZ25lZCBpbnQpLypTQUZFKi9pcmVhZDsKLSAgICAgICAgIG50b3RhbCArPSAodW5zaWduZWQgaW50KS8qU0FGRSovaXJlYWQ7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBudG90YWw7Ci0gICB9Ci0KLSAgIHJldHVybiBudG90YWw7IC8qIG5ieXRlcyA9PSAwICovCi19Ci0KLXN0YXRpYyBpbnQKLXBuZ19oYXZlX25lb24ocG5nX3N0cnVjdHAgcG5nX3B0cikKLXsKLSAgIGludCBmZCA9IG9wZW4oIi9wcm9jL3NlbGYvYXV4diIsIE9fUkRPTkxZKTsKLSAgIEVsZjMyX2F1eHZfdCBhdXg7Ci0KLSAgIC8qIEZhaWxzYWZlOiBmYWlsdXJlIHRvIG9wZW4gbWVhbnMgbm8gTkVPTiAqLwotICAgaWYgKGZkID09IC0xKQotICAgewotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgIi9wcm9jL3NlbGYvYXV4diBvcGVuIGZhaWxlZCIpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIHdoaWxlIChzYWZlX3JlYWQocG5nX3B0ciwgZmQsICZhdXgsIHNpemVvZiBhdXgpID09IHNpemVvZiBhdXgpCi0gICB7Ci0gICAgICBpZiAoYXV4LmFfdHlwZSA9PSBBVF9IV0NBUCAmJiAoYXV4LmFfdW4uYV92YWwgJiBIV0NBUF9ORU9OKSAhPSAwKQotICAgICAgewotICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGNsb3NlKGZkKTsKLSAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hcm0tbmVvbi9saW51eC5jIGIvY29udHJpYi9hcm0tbmVvbi9saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGY5YmIxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvYXJtLW5lb24vbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiBjb250cmliL2FybS1uZW9uL2xpbnV4LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiBXcml0dGVuIGJ5IEpvaG4gQm93bGVyLCAyMDE0LgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFNFRSBjb250cmliL2FybS1uZW9uL1JFQURNRSBiZWZvcmUgcmVwb3J0aW5nIGJ1Z3MKLSAqCi0gKiBTVEFUVVM6IFNVUFBPUlRFRAotICogQlVHIFJFUE9SVFM6IHBuZy1tbmctaW1wbGVtZW50QHNvdXJjZWZvcmdlLm5ldAotICoKLSAqIHBuZ19oYXZlX25lb24gaW1wbGVtZW50ZWQgZm9yIExpbnV4IGJ5IHJlYWRpbmcgdGhlIHdpZGVseSBhdmFpbGFibGUKLSAqIHBzZXVkby1maWxlIC9wcm9jL2NwdWluZm8uCi0gKgotICogVGhpcyBjb2RlIGlzIHN0cmljdCBBTlNJLUMgYW5kIGlzIHByb2JhYmx5IG1vZGVyYXRlbHkgcG9ydGFibGU7IGl0IGRvZXMKLSAqIGhvd2V2ZXIgdXNlIDxzdGRpby5oPiBhbmQgaXQgYXNzdW1lcyB0aGF0IC9wcm9jL2NwdWluZm8gaXMgbmV2ZXIgbG9jYWxpemVkLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotc3RhdGljIGludAotcG5nX2hhdmVfbmVvbihwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgRklMRSAqZiA9IGZvcGVuKCIvcHJvYy9jcHVpbmZvIiwgInJiIik7Ci0KLSAgIGlmIChmICE9IE5VTEwpCi0gICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgc2ltcGxlIHN0YXRlIG1hY2hpbmUgd2hpY2ggcmVhZHMgdGhlIGlucHV0IGJ5dGUtYnktYnl0ZSB1bnRpbAotICAgICAgICogaXQgZ2V0cyBhIG1hdGNoIG9uIHRoZSAnbmVvbicgZmVhdHVyZSBvciByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KLSAgICAgICAqLwotICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hfZmVhdHVyZVtdID0geyA3MCwgNjksIDY1LCA4NCwgODUsIDgyLCA2OSwgODMgfTsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoX25lb25bXSA9IHsgNzgsIDY5LCA3OSwgNzggfTsKLQotICAgICAgZW51bQotICAgICAgewotICAgICAgICAgU3RhcnRMaW5lLCBGZWF0dXJlLCBDb2xvbiwgU3RhcnRUYWcsIE5lb24sIEhhdmVOZW9uLCBTa2lwVGFnLCBTa2lwTGluZQotICAgICAgfSAgc3RhdGU7Ci0gICAgICBpbnQgY291bnRlcjsKLQotICAgICAgZm9yIChzdGF0ZT1TdGFydExpbmUsIGNvdW50ZXI9MDs7KQotICAgICAgewotICAgICAgICAgaW50IGNoID0gZmdldGMoZik7Ci0KLSAgICAgICAgIGlmIChjaCA9PSBFT0YpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBFT0YgbWVhbnMgZXJyb3Igb3IgZW5kLW9mLWZpbGUsIHJldHVybiBmYWxzZTsgbmVvbiBhdCBFT0YgaXMKLSAgICAgICAgICAgICAqIGFzc3VtZWQgdG8gYmUgYSBtaXN0YWtlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmY2xvc2UoZik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgIH0KLQotICAgICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgU3RhcnRMaW5lOgotICAgICAgICAgICAgICAgLyogTWF0Y2ggc3BhY2VzIGF0IHRoZSBzdGFydCBvZiBsaW5lICovCi0gICAgICAgICAgICAgICBpZiAoY2ggPD0gMzIpIC8qIHNraXAgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBzcGFjZSAqLwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgIGNvdW50ZXI9MDsKLSAgICAgICAgICAgICAgIHN0YXRlID0gRmVhdHVyZTsKLSAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgICAgICAgICBjYXNlIEZlYXR1cmU6Ci0gICAgICAgICAgICAgICAvKiBNYXRjaCAnRkVBVFVSRScsIEFTQ0lJIGNhc2UgaW5zZW5zaXRpdmUuICovCi0gICAgICAgICAgICAgICBpZiAoKGNoICYgfjB4MjApID09IGNoX2ZlYXR1cmVbY291bnRlcl0pCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKytjb3VudGVyID09IChzaXplb2YgY2hfZmVhdHVyZSkpCi0gICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENvbG9uOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIC8qIGRpZCBub3QgbWF0Y2ggJ2ZlYXR1cmUnICovCi0gICAgICAgICAgICAgICBzdGF0ZSA9IFNraXBMaW5lOwotICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICAgICAgICAgIGNhc2UgU2tpcExpbmU6Ci0gICAgICAgICAgICBza2lwTGluZToKLSAgICAgICAgICAgICAgIC8qIFNraXAgZXZlcnl0aGluZyB1bnRpbCB3ZSBzZWUgbGluZWZlZWQgb3IgY2FycmlhZ2UgcmV0dXJuICovCi0gICAgICAgICAgICAgICBpZiAoY2ggIT0gMTAgJiYgY2ggIT0gMTMpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgc3RhdGUgPSBTdGFydExpbmU7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBDb2xvbjoKLSAgICAgICAgICAgICAgIC8qIE1hdGNoIGFueSBudW1iZXIgb2Ygc3BhY2Ugb3IgdGFiIGZvbGxvd2VkIGJ5ICc6JyAqLwotICAgICAgICAgICAgICAgaWYgKGNoID09IDMyIHx8IGNoID09IDkpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgaWYgKGNoID09IDU4KSAvKiBpLmUuICc6JyAqLwotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGFydFRhZzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAvKiBFaXRoZXIgYSBiYWQgbGluZSBmb3JtYXQgb3IgYSAnZmVhdHVyZScgcHJlZml4IGZvbGxvd2VkIGJ5Ci0gICAgICAgICAgICAgICAgKiBvdGhlciBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBzdGF0ZSA9IFNraXBMaW5lOwotICAgICAgICAgICAgICAgZ290byBza2lwTGluZTsKLQotICAgICAgICAgICAgY2FzZSBTdGFydFRhZzoKLSAgICAgICAgICAgICAgIC8qIFNraXAgc3BhY2UgY2hhcmFjdGVycyBiZWZvcmUgYSB0YWcgKi8KLSAgICAgICAgICAgICAgIGlmIChjaCA9PSAzMiB8fCBjaCA9PSA5KQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgIHN0YXRlID0gTmVvbjsKLSAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwOwotICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICAgICAgICAgIGNhc2UgTmVvbjoKLSAgICAgICAgICAgICAgIC8qIExvb2sgZm9yICduZW9uJyB0YWcgKi8KLSAgICAgICAgICAgICAgIGlmICgoY2ggJiB+MHgyMCkgPT0gY2hfbmVvbltjb3VudGVyXSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ZXIgPT0gKHNpemVvZiBjaF9uZW9uKSkKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSGF2ZU5lb247Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgc3RhdGUgPSBTa2lwVGFnOwotICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICAgICAgICAgIGNhc2UgU2tpcFRhZzoKLSAgICAgICAgICAgICAgIC8qIFNraXAgbm9uLXNwYWNlIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgICAgIGlmIChjaCA9PSAxMCB8fCBjaCA9PSAxMykKLSAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhcnRMaW5lOwotCi0gICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAzMiB8fCBjaCA9PSA5KQotICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGFydFRhZzsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEhhdmVOZW9uOgotICAgICAgICAgICAgICAgLyogSGF2ZSBzZWVuIGEgJ25lb24nIHByZWZpeCwgYnV0IHRoZXJlIG11c3QgYmUgYSBzcGFjZSBvciBuZXcKLSAgICAgICAgICAgICAgICAqIGxpbmUgY2hhcmFjdGVyIHRvIHRlcm1pbmF0ZSBpdC4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgaWYgKGNoID09IDEwIHx8IGNoID09IDEzIHx8IGNoID09IDMyIHx8IGNoID09IDkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmY2xvc2UoZik7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgc3RhdGUgPSBTa2lwVGFnOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ19oYXZlX25lb246IGludGVybmFsIGVycm9yIChidWcpIik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECi0gICBlbHNlCi0gICAgICBwbmdfd2FybmluZyhwbmdfcHRyLCAiL3Byb2MvY3B1aW5mbyBvcGVuIGZhaWxlZCIpOwotI2VuZGlmCi0KLSAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb25mdGVzdC9SRUFETUUgYi9jb250cmliL2NvbmZ0ZXN0L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0NzI3OS4uMDAwMDAwMAotLS0gYS9jb250cmliL2NvbmZ0ZXN0L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRlc3QgY29uZmlndXJhdGlvbiBmaWxlcywgY3VycmVudGx5IGFsd2F5cyAnLmRmYScgZmlsZXMKLWludGVuZGVkIHRvIGJlIHVzZWQgaW4gdGhlIGJ1aWxkIGJ5IHNldHRpbmcgdGhlIG1ha2UgbWFjcm8gREZBX1hUUkEgdG8gdGhlIG5hbWUKLW9mIHRoZSBmaWxlLgotCi1UaGVzZSBmaWxlcyBhcmUgdXNlZCBpbiByZWxlYXNlIHZhbGlkYXRpb24gb2YgdGhlICdjb25maWd1cmUnIGJ1aWxkcyBvZiBsaWJwbmcKLWJ5IGJ1aWxkaW5nICdtYWtlIGNoZWNrJywgb3IgJ21ha2UgYWxsLWFtJyBmb3IgY3Jvc3MtYnVpbGRzLCB3aXRoIGVhY2ggLmRmYQotZmlsZS4KLQotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IG1heSBjaGFuZ2UgYmV0d2VlbiBtaW5vciByZWxlYXNlcywgaG93ZXZlcgotY29udHJpYnV0aW9ucyBkZXNjcmliaW5nIHNwZWNpZmljIGJ1aWxkcyBvZiBsaWJwbmcgYXJlIHdlbGNvbWVkLiAgVGhlcmUgaXMgbm8KLWd1YXJhbnRlZSB0aGF0IGxpYnBuZyB3aWxsIGNvbnRpbnVlIHRvIGJ1aWxkIHdpdGggc3VjaCBjb25maWd1cmF0aW9uczsgc3VwcG9ydAotZm9yIGdpdmVuIGNvbmZpZ3VyYXRpb25zIGNhbiBiZSwgYW5kIGhhcyBiZWVuLCBkcm9wcGVkIGJldHdlZW4gc3VjY2Vzc2l2ZSBtaW5vcgotcmVsZWFzZXMuICBIb3dldmVyIGlmIGEgLmRmYSBmaWxlIGRlc2NyaWJpbmcgYSBjb25maWd1cmF0aW9uIGlzIG5vdCBpbiB0aGlzCi1kaXJlY3RvcnkgaXQgaXMgdmVyeSB1bmxpa2VseSB0aGF0IGl0IHdpbGwgYmUgdGVzdGVkIGJlZm9yZSBhIG1pbm9yIHJlbGVhc2UhCi0KLVlvdSBjYW4gdXNlIHRoZXNlIC5kZmEgZmlsZXMgYXMgdGhlIGJhc2lzIG9mIG5ldyBjb25maWd1cmF0aW9ucy4gIEZpbGVzIGluIHRoaXMKLWRpcmVjdG9yeSBzaG91bGQgbm90IGhhdmUgYW55IHVzZSByZXN0cmljdGlvbnMgb3IgcmVzdHJpY3RpdmUgbGljZW5zZXMuCi0KLVRoaXMgZGlyZWN0b3J5IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgLnppcCBhbmQgLjd6IGRpc3RyaWJ1dGlvbnMsIHdoaWNoIGRvCi1ub3QgY29udGFpbiAnY29uZmlndXJlJyBzY3JpcHRzLgotCi1ET0NVTUVOVEFUSU9OCi09PT09PT09PT09PT09Ci0KLUV4YW1wbGVzOgotICAgJHtzcmNkaXJ9L3BuZ3Vzci5kZmEKLSAgICR7c3JjZGlyfS9jb250cmliL3BuZ21pbmltLyovcG5ndXNyLmRmYQotCi1Eb2N1bWVudGF0aW9uIG9mIHRoZSBvcHRpb25zOgotICAgJHtzcmNkaXJ9L3NjcmlwdHMvcG5nbGliY29uZi5kZmEKLQotRG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlsZSBmb3JtYXQ6Ci0gICAke3NyY2Rpcn0vc2NyaXB0cy9vcHRpb25zLmF3awotCi1GSUxFIE5BTUlORwotPT09PT09PT09PT0KLQotRmlsZSBuYW1lcyBpbiB0aGlzIGRpcmVjdG9yeSBtYXkgTk9UIGNvbnRhaW4gYW55IG9mIHRoZSBmaXZlIGNoYXJhY3RlcnM6Ci0KLSAgIC0gLCArICogPwotCi1OZWl0aGVyIG1heSB0aGV5IGNvbnRhaW4gYW55IHNwYWNlIGNoYXJhY3Rlci4KLQotV2hpbGUgb3RoZXIgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBpdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCBmaWxlIG5hbWVzIGJlCi1saW1pdGVkIHRvIGxvd2VyIGNhc2UgTGF0aWluIGFscGhhYmV0aWMgY2hhcmFjdGVycyAoYS16KSwgZGlnaXRzICgwLTkpIGFuZCwgaWYKLW5lY2Vzc2FyeSB0aGUgdW5kZXJzY29yZSAoXykgY2hhcmFjdGVyLiAgRmlsZSBuYW1lcyBzaG91bGQgYmUgYWJvdXQgOCBjaGFyYWN0ZXJzCi1sb25nIChleGNsdWRpbmcgdGhlIC5kZmEgZXh0ZW5zaW9uKS4gIFN1Ym1pdHRlZCAuZGZhIGZpbGVzIHNob3VsZCBoYXZlIG5hbWVzCi1iZXR3ZWVuIDcgYW5kIDE2IGNoYXJhY3RlcnMgbG9uZywgc2hvcnRlciBuYW1lcyAoNiBjaGFyYWN0ZXJzIG9yIGxlc3MpIGFyZQotcmVzZXJ2ZWQgZm9yIHN0YW5kYXJkIHRlc3RzLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb25mdGVzdC9wbmdjcC5kZmEgYi9jb250cmliL2NvbmZ0ZXN0L3BuZ2NwLmRmYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhODU2ZS4uMDAwMDAwMAotLS0gYS9jb250cmliL2NvbmZ0ZXN0L3BuZ2NwLmRmYQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMgcG5nY3AuZGZhCi0jICBCdWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nCi0jCi0jIEF1dGhvcjogSm9obiBCb3dsZXIKLSMgQ29weXJpZ2h0OiAoYykgSm9obiBCb3dsZXIsIDIwMTYKLSMgVXNhZ2UgcmlnaHRzOgotIyAgVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAotIyAgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotIyAgVW5pdGVkIFN0YXRlcy4KLSMKLSMgQnVpbGQgbGlicG5nIHdpdGggc3VwcG9ydCBmb3IgcG5nY3AuICBUaGlzIG1lYW5zIGp1c3QgcG5nX3JlYWRfcG5nLAotIyBwbmdfd3JpdGVfcG5nIGFuZCBzbWFsbCBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KLSMKLWV2ZXJ5dGhpbmcgPSBvZmYKLQotIyBUaGlzIG9wdGlvbiBpcyBzcGVjaWZpYyB0byB0aGlzIGNvbmZpZ3VyYXRpb247IGl0IGFkZHMgYSAjZGVmaW5lIHRvIHRoZQotIyBnZW5lcmF0ZWQgcG5nbGliY29uZi5oIHdoaWNoIHR1cm5zIG9uIHRoZSAobm90IHBvcnRhYmxlKSB0aW1pbmcgb3B0aW9uIGZvcgotIyBwbmdjcC4gIE5vdGUgdGhhdCBhbnkgb3B0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcHJlY2VkZWQgYnkgUE5HXzsgdGhlcmUgaXMgbm8KLSMgd2F5IHJvdW5kIHRoaXMgYW5kIHRoaXMgaXMgZGVsaWJlcmF0ZS4KLW9wdGlvbiBQTkdDUF9USU1JTkcKLQotIyBCZWNhdXNlIG9mIHRoZSBldmVyeXRoaW5nIG9mZiBhYm92ZSB0aGUgb3B0aW9uIG11c3QgYWxzbyBiZSB0dXJuZWQgb24uICBUaGlzCi0jIG1heSBub3QgYmUgZG9uZSBpbiBvbmUgc3RlcCBiZWNhdXNlIGl0IGlzIHNhZmVyIGFuZCBhdm9pZHMgbWlzLXNwZWxsZWQgb3B0aW9ucwotIyBpbiB1c2VyIC5kZmEgZmlsZXMgdG8gZXJyb3Igb3V0IGlmIGFuIHVucmVjb2duaXplZCBvcHRpb24gaXMgdHVybmVkIG9uLgotb3B0aW9uIFBOR0NQX1RJTUlORyBvbgotCi0jIE9wdGlvbnMgdG8gdHVybiBvbiBwbmdfcmVhZF9wbmcgYW5kIHBuZ193cml0ZV9wbmc6Ci1vcHRpb24gSU5GT19JTUFHRSBvbgotb3B0aW9uIFNFUVVFTlRJQUxfUkVBRCBvbgotb3B0aW9uIEVBU1lfQUNDRVNTIG9uCi1vcHRpb24gV1JJVEUgb24KLW9wdGlvbiBXUklURV8xNkJJVCBvbgotb3B0aW9uIFdSSVRFX0ZJTFRFUiBvbgotCi0jIHBuZ2NwIG5lZWRzIHRoaXMgdG8gcHJlc2VydmUgdW5rbm93biBjaHVua3MsIHN3aXRjaGluZyBhbGwgdGhlc2Ugb24gbWVhbnMgdGhhdAotIyBwbmdjcCBjYW4gd29yayB3aXRob3V0IGV4cGxpY2l0IGtub3duIGNodW5rIHJlYWRpbmcgc3VwcHBvcnQKLW9wdGlvbiBVTktOT1dOX0NIVU5LUyBvbgotb3B0aW9uIFNFVF9VTktOT1dOX0NIVU5LUyBvbgotb3B0aW9uIEhBTkRMRV9BU19VTktOT1dOIG9uCi1vcHRpb24gU0FWRV9VTktOT1dOX0NIVU5LUyBvbgotb3B0aW9uIFdSSVRFX1VOS05PV05fQ0hVTktTIG9uCi0KLSMgcG5nY3AgbmVlZHMgdGhpcyB0byBoYW5kbGUgcGFsZXR0ZSBmaWxlcyB3aXRoIGludmFsaWQgaW5kaWNlczoKLW9wdGlvbiBDSEVDS19GT1JfSU5WQUxJRF9JTkRFWCBvbgotb3B0aW9uIEdFVF9QQUxFVFRFX01BWCBvbgotCi0jIFByZS1saWJwbmcgMS43IHBuZ2NwIGhhcyB0byBzdGFzaCB0ZXh0IGNodW5rcyBtYW51YWxseSwgcG9zdCAxLjcgd2l0aG91dCB0aGlzCi0jIHRleHQgY2h1bmtzIHNob3VsZCBiZSBoYW5kbGVkIGFzIHVua25vd24gb2suCi1vcHRpb24gVEVYVCBvbgotCi0jIHRoaXMgaXMgdXNlZCB0byB0dXJuIG9mZiBsaW1pdHM6Ci1vcHRpb24gVVNFUl9MSU1JVFMgb24KLW9wdGlvbiBTRVRfVVNFUl9MSU1JVFMgb24KLQotIyB0aGVzZSBhcmUgYXJlIGp1c3QgcmVxdWlyZWQgZm9yIHNwZWNpZmljIGN1c3RvbWl6YXRpb25zCi1vcHRpb24gV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT04gb24KLW9wdGlvbiBXUklURV9DVVNUT01JWkVfQ09NUFJFU1NJT04gb24KZGlmZiAtLWdpdCBhL2NvbnRyaWIvY29uZnRlc3QvcmVhZC5kZmEgYi9jb250cmliL2NvbmZ0ZXN0L3JlYWQuZGZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWU4OGQwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY29uZnRlc3QvcmVhZC5kZmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jIHJlYWQuZGZhCi0jICBCdWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nCi0jCi0jIEF1dGhvcjogSm9obiBCb3dsZXIKLSMgQ29weXJpZ2h0OiAoYykgSm9obiBCb3dsZXIsIDIwMTMKLSMgVXNhZ2UgcmlnaHRzOgotIyAgVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAotIyAgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotIyAgVW5pdGVkIFN0YXRlcy4KLSMKLSMgQnVpbGQgbGlicG5nIHdpdGggYmFzaWMgcmVhZCBzdXBwb3J0LiAgVGhpcyBlbmFibGVzIHRoZSBsb3dlc3QgbGV2ZWwgbGlicG5nCi0jIHJlYWQgQVBJIC0gdGhlIG9uZSB3aGVyZSB0aGUgY2FsbGluZyBjb2RlIGhhcyB0byB1c2UgYSBsb29wIHRvIHJlYWQgZWFjaCByb3cuCi0jIEF0IHByZXNlbnQgdGhpcyBpcyB0aGUgQVBJIHVzZWQgYnkgbW9zdCBwcm9ncmFtcy4KLSMKLSMgU3VwcG9ydCBpcyBlbmFibGVkIG9ubHkgZm9yIHRob3NlIGNodW5rcyBhbmQgdHJhbnNmb3JtYXRpb25zIHRoYXQgYXJlCi0jIHR5cGljYWxseSByZXF1aXJlZCAtIG90aGVycyBjYW4gYmUgYWRkZWQgZWFzaWx5LgotIwotCi1ldmVyeXRoaW5nID0gb2ZmCi0KLSMgVGhlIHNlcXVlbnRpYWwgcmVhZCBjb2RlIGlzIGVuYWJsZWQgaGVyZTsgdGhlIHByb2dyZXNzaXZlIGNvZGUgY2FuIGJlIHVzZWQKLSMgaW5zdGVhZCBidXQgdGhlcmUgaXMgbm8gcG9pbnQgZW5hYmxpbmcgYm90aC4KLQotb3B0aW9uIFNFUVVFTlRJQUxfUkVBRCBvbgotCi0jIExpa2V3aXNlIGl0IGlzIHBvaW50bGVzcyBlbmFibGluZyBib3RoIGZpeGVkIGFuZCBmbG9hdGluZyBwb2ludCBBUElzLiAgQ2hvb3NlCi0jIG9uZSBvciB0aGUgb3RoZXIgZm9yIGJvdGggdGhlIEFQSSBhbmQgdGhlIGludGVybmFsIG1hdGguCi0KLSNGaXhlZCBwb2ludDoKLSNvcHRpb24gRklYRURfUE9JTlQgb24KLSNvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvZmYKLQotI0Zsb2F0aW5nIHBvaW50Ogotb3B0aW9uIEZMT0FUSU5HX1BPSU5UIG9uCi1vcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvbgotCi0jIEJhc2ljIGVycm9yIGhhbmRsaW5nLCBJTyBhbmQgdXNlciBtZW1vcnkgc3VwcG9ydC4gIFRoZSBsYXR0ZXIgYWxsb3dzIHRoZQotIyBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIHByb3ZpZGUgaXRzIG93biBpbXBsZW1lbnRhdGlvbnMgb2YgJ21hbGxvYycgYW5kICdmcmVlJy4KLW9wdGlvbiBTRVRKTVAgb24KLW9wdGlvbiBTVERJTyBvbgotb3B0aW9uIFVTRVJfTUVNIG9uCi0KLSMgVG8gcmVhZCB0aGUgZnVsbCBzZXQgb2YgUE5HIGltYWdlcyBjb3JyZWN0bHkgaW50ZXJsYWNlLCB0cmFuc3BhcmVuY3kgYW5kCi0jIDE2LWJpdCBzdXBwb3J0IGlzIHJlcXVpcmVkLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBpbXBsZW1lbnQgaW50ZXJsYWNlIGl0c2VsZiwKLSMgYnV0IHZlcnkgZmV3IGRvIGFuZCBpdCdzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBkaXNhYmxlIGl0IHdoZW4gUkVBRCBpcwotIyBlbmFibGVkLgotb3B0aW9uIFJFQURfdFJOUyBvbgotb3B0aW9uIFJFQURfMTZCSVQgb24KLQotIyBFdmVyeXRoaW5nIGVsc2UgaXMgYXBwbGljYXRpb24gZGVwZW5kZW50LiAgVGhpcyBmaWxlIGFzc3VtZXMgdGhlIGFwcCBoYW5kbGVzCi0jIGFsbCB0aGUgbmF0aXZlIFBORyBiaXQgbGF5b3V0cywgc28gaXQgZG9lc24ndCBuZWVkIGFueSBvZiBsYXlvdXQgY2hhbmdlCi0jIHRyYW5zZm9ybXMsIGJ1dCBuZWVkcyBsaWJwbmcgdG8gcGVyZm9ybSBnYW1tYSBjb3JyZWN0aW9uLiAgSXQgZG9lc24ndCBkbyBhbnkKLSMgY29sb3JzcGFjZSBzdHVmZiBhbmQgaWdub3JlcyB0aGUgJ3NpZ25pZmljYW50IGJpdCcgaW5mb3JtYXRpb24uCi0jCi0jIElmIHlvdXIgYXBwIGFsd2F5cyBleHBhbmRzIHRoZSBpbWFnZSB0byBhIGxpbWl0ZWQgc2V0IG9mIGJpdCBsYXlvdXRzIHlvdQotIyBwcm9iYWJseSB3YW50IHRvIGNvbnNpZGVyIHVzaW5nIHRoZSBzaW1wbGlmaWVkIEFQSSBpbnN0ZWFkIG9mIHRoZSBsb3cgbGV2ZWwKLSMgb25lIC0gc2VlIHBuZy5oIGFuZCBzX3JlYWQuZGZhLgotb3B0aW9uIFJFQURfR0FNTUEgb24KZGlmZiAtLWdpdCBhL2NvbnRyaWIvY29uZnRlc3Qvc19yZWFkLmRmYSBiL2NvbnRyaWIvY29uZnRlc3Qvc19yZWFkLmRmYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxY2UwYi4uMDAwMDAwMAotLS0gYS9jb250cmliL2NvbmZ0ZXN0L3NfcmVhZC5kZmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIHNfcmVhZC5kZmEKLSMgIEJ1aWxkIHRpbWUgY29uZmlndXJhdGlvbiBvZiBsaWJwbmcKLSMKLSMgQXV0aG9yOiBKb2huIEJvd2xlcgotIyBDb3B5cmlnaHQ6IChjKSBKb2huIEJvd2xlciwgMjAxMwotIyBVc2FnZSByaWdodHM6Ci0jICBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCi0jICByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206Ci0jICBVbml0ZWQgU3RhdGVzLgotIwotIyBCdWlsZCBsaWJwbmcgd2l0aCBzaW1wbGlmaWVkIHJlYWQgc3VwcG9ydCAob25seSkuICBUaGlzIGJ1aWxkcyBhIG1pbmltYWwKLSMgbGlicG5nIGFibGUgdG8gcmVhZCBhbGwgUE5HIGZvcm1hdHMgYW5kIGNvbnZlcnQgdGhlbSBpbnRvIGEgc21hbGwgbnVtYmVyIG9mCi0jIHdlbGwgdW5kZXJzdG9vZCBtZW1vcnkgZm9ybWF0cy4KLSMKLQotZXZlcnl0aGluZyA9IG9mZgotCi1vcHRpb24gU0lNUExJRklFRF9SRUFEIG9uCi0KLSMgSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNob3NlIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IGZvciB0aGUgQVBJcyBiZWNhdXNlIHRoZQotIyBzaW1wbGlmaWVkIEFQSSBkb2Vzbid0IG5lZWQgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIEl0IGlzIG5lY2Vzc2FyeQotIyB0byBjaG9zZSBhbiBpbnRlcm5hbCBtYXRoIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlZmF1bHQgKGJlY2F1c2Ugb2YgJ2V2ZXJ5dGhpbmcKLSMgPSBvZmYnKSBpcyBmaXhlZCBwb2ludCAtIHR1cm4gdGhlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uIG9uIGlmIHlvdSBoYXZlCi0jIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IG9yIHByZWZlciB5b3VyIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uLgotb3B0aW9uIEZMT0FUSU5HX0FSSVRITUVUSUMgb24KLQotIyBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCB3aXRob3V0IGl0IHRoZSBtZXNzYWdlIHN0cmluZ3MgaW4gdGhlIEFQSQotIyB3aWxsIG5vdCBiZSBmaWxsZWQgaW4KLW9wdGlvbiBFUlJPUl9URVhUIG9uCi0KLSMgU3dpdGNoaW5nIHRoZXNlIG9wdGlvbnMgb24gZW5hYmxlcyB0aGUgJ0FGSVJTVCcgYW5kICdCR1InIGZvcm1hdHMgLSB5b3UgZG9uJ3QKLSMgbmVlZCB0aGlzIGlmIHlvdSBkb24ndCB1c2UgdGhlbSwgdGhleSBqdXN0IGFsbG93IHRoZSBpbi1tZW1vcnkgbGF5b3V0IHRvIGJlCi0jIGNoYW5nZWQgdG8gbWF0Y2ggY29tbW9uIGhhcmR3YXJlIGZvcm1hdHMuCi1vcHRpb24gU0lNUExJRklFRF9SRUFEX0FGSVJTVCBvbgotb3B0aW9uIFNJTVBMSUZJRURfUkVBRF9CR1Igb24KZGlmZiAtLWdpdCBhL2NvbnRyaWIvY29uZnRlc3Qvc193cml0ZS5kZmEgYi9jb250cmliL2NvbmZ0ZXN0L3Nfd3JpdGUuZGZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTQwYTQ2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY29uZnRlc3Qvc193cml0ZS5kZmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIHNfd3JpdGUuZGZhCi0jICBCdWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nCi0jCi0jIEF1dGhvcjogSm9obiBCb3dsZXIKLSMgQ29weXJpZ2h0OiAoYykgSm9obiBCb3dsZXIsIDIwMTMKLSMgVXNhZ2UgcmlnaHRzOgotIyAgVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAotIyAgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotIyAgVW5pdGVkIFN0YXRlcy4KLSMKLSMgQnVpbGQgbGlicG5nIHdpdGggKGp1c3QpIHNpbXBsaWZpZWQgd3JpdGUgc3VwcG9ydAotIwotCi1ldmVyeXRoaW5nID0gb2ZmCi0KLW9wdGlvbiBTSU1QTElGSUVEX1dSSVRFIG9uCi0KLSMgSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNob3NlIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IGZvciB0aGUgQVBJcyBiZWNhdXNlIHRoZQotIyBzaW1wbGlmaWVkIEFQSSBkb2Vzbid0IG5lZWQgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIEl0IGlzIG5lY2Vzc2FyeQotIyB0byBjaG9zZSBhbiBpbnRlcm5hbCBtYXRoIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlZmF1bHQgKGJlY2F1c2Ugb2YgJ2V2ZXJ5dGhpbmcKLSMgPSBvZmYnKSBpcyBmaXhlZCBwb2ludCAtIHR1cm4gdGhlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uIG9uIGlmIHlvdSBoYXZlCi0jIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IG9yIHByZWZlciB5b3VyIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uLgotb3B0aW9uIEZMT0FUSU5HX0FSSVRITUVUSUMgb24KLQotIyBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCB3aXRob3V0IGl0IHRoZSBtZXNzYWdlIHN0cmluZ3MgaW4gdGhlIEFQSQotIyB3aWxsIG5vdCBiZSBmaWxsZWQgaW4KLW9wdGlvbiBFUlJPUl9URVhUIG9uCi0KLSMgU3dpdGNoaW5nIHRoZXNlIG9wdGlvbnMgb24gZW5hYmxlcyB0aGUgJ0FGSVJTVCcgYW5kICdCR1InIGZvcm1hdHMgLSB5b3UgZG9uJ3QKLSMgbmVlZCB0aGlzIGlmIHlvdSBkb24ndCB1c2UgdGhlbSwgdGhleSBqdXN0IGFsbG93IHRoZSBpbi1tZW1vcnkgbGF5b3V0IHRvIGJlCi0jIGNoYW5nZWQgdG8gbWF0Y2ggY29tbW9uIGhhcmR3YXJlIGZvcm1hdHMuCi1vcHRpb24gU0lNUExJRklFRF9XUklURV9BRklSU1Qgb24KLW9wdGlvbiBTSU1QTElGSUVEX1dSSVRFX0JHUiBvbgpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb25mdGVzdC9zaW1wbGUuZGZhIGIvY29udHJpYi9jb25mdGVzdC9zaW1wbGUuZGZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE5MzMzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY29uZnRlc3Qvc2ltcGxlLmRmYQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgc2ltcGxlLmRmYQotIyAgQnVpbGQgdGltZSBjb25maWd1cmF0aW9uIG9mIGxpYnBuZwotIwotIyBBdXRob3I6IEpvaG4gQm93bGVyCi0jIENvcHlyaWdodDogKGMpIEpvaG4gQm93bGVyLCAyMDEzCi0jIFVzYWdlIHJpZ2h0czoKLSMgIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKLSMgIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKLSMgIFVuaXRlZCBTdGF0ZXMuCi0jCi0jIEJ1aWxkIGxpYnBuZyB3aXRoIGp1c3QgdGhlIHNpbXBsaWZpZWQgQVBJcyAocmVhZCBhbmQgd3JpdGUpLgotIwotCi1ldmVyeXRoaW5nID0gb2ZmCi0KLW9wdGlvbiBTSU1QTElGSUVEX1dSSVRFIG9uCi1vcHRpb24gU0lNUExJRklFRF9SRUFEIG9uCi0KLSMgSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNob3NlIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IGZvciB0aGUgQVBJcyBiZWNhdXNlIHRoZQotIyBzaW1wbGlmaWVkIEFQSSBkb2Vzbid0IG5lZWQgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIEl0IGlzIG5lY2Vzc2FyeQotIyB0byBjaG9zZSBhbiBpbnRlcm5hbCBtYXRoIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlZmF1bHQgKGJlY2F1c2Ugb2YgJ2V2ZXJ5dGhpbmcKLSMgPSBvZmYnKSBpcyBmaXhlZCBwb2ludCAtIHR1cm4gdGhlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uIG9uIGlmIHlvdSBoYXZlCi0jIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IG9yIHByZWZlciB5b3VyIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uLgotb3B0aW9uIEZMT0FUSU5HX0FSSVRITUVUSUMgb24KLQotIyBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCB3aXRob3V0IGl0IHRoZSBtZXNzYWdlIHN0cmluZ3MgaW4gdGhlIEFQSQotIyB3aWxsIG5vdCBiZSBmaWxsZWQgaW4KLW9wdGlvbiBFUlJPUl9URVhUIG9uCi0KLSMgU3dpdGNoaW5nIHRoZXNlIG9wdGlvbnMgb24gZW5hYmxlcyB0aGUgJ0FGSVJTVCcgYW5kICdCR1InIGZvcm1hdHMgLSB5b3UgZG9uJ3QKLSMgbmVlZCB0aGlzIGlmIHlvdSBkb24ndCB1c2UgdGhlbSwgdGhleSBqdXN0IGFsbG93IHRoZSBpbi1tZW1vcnkgbGF5b3V0IHRvIGJlCi0jIGNoYW5nZWQgdG8gbWF0Y2ggY29tbW9uIGhhcmR3YXJlIGZvcm1hdHMuCi1vcHRpb24gU0lNUExJRklFRF9SRUFEX0FGSVJTVCBvbgotb3B0aW9uIFNJTVBMSUZJRURfUkVBRF9CR1Igb24KLW9wdGlvbiBTSU1QTElGSUVEX1dSSVRFX0FGSVJTVCBvbgotb3B0aW9uIFNJTVBMSUZJRURfV1JJVEVfQkdSIG9uCmRpZmYgLS1naXQgYS9jb250cmliL2NvbmZ0ZXN0L3dyaXRlLmRmYSBiL2NvbnRyaWIvY29uZnRlc3Qvd3JpdGUuZGZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE5YWFiLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY29uZnRlc3Qvd3JpdGUuZGZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyB3cml0ZS5kZmEKLSMgIEJ1aWxkIHRpbWUgY29uZmlndXJhdGlvbiBvZiBsaWJwbmcKLSMKLSMgQXV0aG9yOiBKb2huIEJvd2xlcgotIyBDb3B5cmlnaHQ6IChjKSBKb2huIEJvd2xlciwgMjAxMwotIyBVc2FnZSByaWdodHM6Ci0jICBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCi0jICByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206Ci0jICBVbml0ZWQgU3RhdGVzLgotIwotIyBCdWlsZCBsaWJwbmcgd2l0aCBubyByZWFkIHN1cHBvcnQgYW5kIG1pbmltYWwgd3JpdGUgc3VwcG9ydC4KLSMKLQotZXZlcnl0aGluZyA9IG9mZgotCi0jIFN3aXRjaCBvbiB0aGUgd3JpdGUgY29kZSAtIHRoaXMgbWFrZXMgYSBtaW5pbWFsaXN0IGVuY29kZXIKLQotb3B0aW9uIFdSSVRFIG9uCi0KLSMgQ2hvb3NlIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IEFQSXMgYW5kIGFyaXRobWV0aWMuICBUaGUgY2hvaWNlcyBhcmUKLSMgaW5kZXBlbmRlbnQgYnV0IG5vcm1hbGx5IHRoZXkgd2lsbCBtYXRjaC4gIEl0IGlzIHR5cGljYWxseSBiZXR0ZXIgdG8gdXNlIHRoZQotIyBmbG9hdGluZyBwb2ludCBpZiB5b3UgaGF2ZSBmbG9hdGluZyBwb2ludCBoYXJkd2FyZS4gIElmIHlvdSBkb24ndCBrbm93LCBvcgotIyAocGVyaGFwcykgdG8gbWFrZSBsaWJwbmcgc21hbGxlciB1c2VkIGZpeGVkIHBvaW50IHRocm91Z2hvdXQuCi0KLSNGaXhlZCBwb2ludDoKLSNvcHRpb24gRklYRURfUE9JTlQgb24KLSNvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvZmYKLQotI0Zsb2F0aW5nIHBvaW50Ogotb3B0aW9uIEZMT0FUSU5HX1BPSU5UIG9uCi1vcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvbgotCi0jIEJhc2ljIGVycm9yIGhhbmRsaW5nLCBJTyBhbmQgdXNlciBtZW1vcnkgc3VwcG9ydC4gIFRoZSBsYXR0ZXIgYWxsb3dzIHRoZQotIyBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIHByb3ZpZGUgaXRzIG93biBpbXBsZW1lbnRhdGlvbnMgb2YgJ21hbGxvYycgYW5kICdmcmVlJy4KLW9wdGlvbiBTRVRKTVAgb24KLW9wdGlvbiBTVERJTyBvbgotb3B0aW9uIFVTRVJfTUVNIG9uCi0KLSMgRXZlcnl0aGluZyBlbHNlIGlzIG9wdGlvbmFsLiAgVW5saWtlIHRoZSByZWFkIGNvZGUgaW4gbGlicG5nIHRoZSB3cml0ZSBjb2RlCi0jIGRvZXMgbm90IG5lZWQgdG8gZGVhbCB3aXRoIGFyYml0cmFyeSBmb3JtYXRzLCBzbyBvbmx5IGFkZCBzdXBwb3J0IGZvciB0aGluZ3MKLSMgeW91IHJlYWxseSBkbyB3cml0ZSEgIEZvciBleGFtcGxlIHlvdSBtaWdodCBvbmx5IHdyaXRlIHNSR0IgaW1hZ2VzLCBzb21ldGltZXMKLSMgd2l0aCB0cmFuc3BhcmVuY3kgYW5kIG5ldmVyIHdyaXRlIDE2IGJpdCBpbWFnZXMsIHNvOgotb3B0aW9uIFdSSVRFX3NSR0Igb24KLW9wdGlvbiBXUklURV90Uk5TIG9uCi0jb3B0aW9uIFdSSVRFXzE2QklUIG9mZiAodGhpcyBpcyB0aGUgZGVmYXVsdCB3aXRoICdldmVyeXRoaW5nID0gb2ZmJykKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvUkVBRE1FLnR4dCBiL2NvbnRyaWIvZXhhbXBsZXMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyNWM5ZC4uMDAwMDAwMAotLS0gYS9jb250cmliL2V4YW1wbGVzL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0KLVRoaXMgZGlyZWN0b3J5IChjb250cmliL2V4YW1wbGVzKSBjb250YWlucyBleGFtcGxlcyBvZiBsaWJwbmcgdXNhZ2UuCi0KLU5PIENPUFlSSUdIVCBSSUdIVFMgQVJFIENMQUlNRUQgVE8gQU5ZIE9GIFRIRSBGSUxFUyBJTiBUSElTIERJUkVDVE9SWS4KLQotVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3JzIGhhdmUgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCi1yZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206Ci1Vbml0ZWQgU3RhdGVzLgotCi1UaGUgZmlsZXMgbWF5IGJlIHVzZWQgZnJlZWx5IGluIGFueSB3YXkuICBUaGUgaW50ZW50aW9uIGlzIHRoYXQgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBmaWxlcyBiZSB1c2VkIGluIG90aGVyIGxpYnBuZy11c2luZyBwcm9ncmFtcyB3aXRob3V0IGFueSBuZWVkIGZvcgotdGhlIGF1dGhvcnMgb2YgdGhlIHVzaW5nIGNvZGUgdG8gc2VlayBjb3B5cmlnaHQgb3IgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbAotYXV0aG9ycy4KLQotVGhlIHNvdXJjZSBjb2RlIGFuZCBjb21tZW50cyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgdGhlIG9yaWdpbmFsIHdvcmsgb2YgdGhlCi1wZW9wbGUgbmFtZWQgYmVsb3cuICBObyBvdGhlciBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGhhcyBtYWRlIGNvbnRyaWJ1dGlvbnMgdG8KLXRoZSB3b3JrIGluIHRoaXMgZGlyZWN0b3J5LgotCi1PUklHSU5BTCBBVVRIT1JTCi0gICAgVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY29kZSBpbiB0aGlzIGRpcmVjdG9yeS4gIE5vbmUKLSAgICBvZiB0aGUgcGVvcGxlIGJlbG93IGNsYWltIGFueSByaWdodHMgd2l0aCByZWdhcmQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMKLSAgICBkaXJlY3RvcnkuCi0KLSAgICBKb2huIEJvd2xlciA8amJvd2xlckBhY20ub3JnPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9pY2Nmcm9tcG5nLmMgYi9jb250cmliL2V4YW1wbGVzL2ljY2Zyb21wbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzMDM3ZS4uMDAwMDAwMAotLS0gYS9jb250cmliL2V4YW1wbGVzL2ljY2Zyb21wbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKi0gaWNjZnJvbXBuZwotICoKLSAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDExLgotICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAotICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotICogVW5pdGVkIFN0YXRlcy4KLSAqCi0gKiBFeHRyYWN0IGFueSBpY2MgcHJvZmlsZXMgZm91bmQgaW4gdGhlIGdpdmVuIFBORyBmaWxlcy4gIFRoaXMgaXMgYSBzaW1wbGUKLSAqIGV4YW1wbGUgb2YgYSBwcm9ncmFtIHRoYXQgZXh0cmFjdHMgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGVhZGVyIG9mIGEgUE5HIGZpbGUKLSAqIHdpdGhvdXQgcHJvY2Vzc2luZyB0aGUgaW1hZ2UuICBOb3RpY2UgdGhhdCBzb21lIGhlYWRlciBpbmZvcm1hdGlvbiBtYXkgb2NjdXIKLSAqIGFmdGVyIHRoZSBpbWFnZSBkYXRhLiBUZXh0dWFsIGRhdGEgYW5kIGNvbW1lbnRzIGFyZSBhbiBleGFtcGxlOyB0aGUgYXBwcm9hY2gKLSAqIGluIHRoaXMgZmlsZSB3b24ndCB3b3JrIHJlbGlhYmx5IGZvciBzdWNoIGRhdGEgYmVjYXVzZSBpdCBvbmx5IGxvb2tzIGZvciB0aGUKLSAqIGluZm9ybWF0aW9uIGluIHRoZSBzZWN0aW9uIG9mIHRoZSBmaWxlIHRoYXQgcHJlY2VlZHMgdGhlIGltYWdlIGRhdGEuCi0gKgotICogQ29tcGlsZSBhbmQgbGluayBhZ2FpbnN0IGxpYnBuZyBhbmQgemxpYiwgcGx1cyBhbnl0aGluZyBlbHNlIHJlcXVpcmVkIG9uIHRoZQotICogc3lzdGVtIHlvdSB1c2UuCi0gKgotICogVG8gdXNlIHN1cHBseSBhIGxpc3Qgb2YgUE5HIGZpbGVzIGNvbnRhaW5pbmcgaUNDUCBjaHVua3MsIHRoZSBjaHVua3Mgd2lsbCBiZQotICogZXh0cmFjdGVkIHRvIGEgc2ltaWxhcmx5IG5hbWVkIGZpbGUgd2l0aCB0aGUgZXh0ZW5zaW9uIHJlcGxhY2VkIGJ5ICdpY2MnLAotICogd2hpY2ggd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRob3V0IHdhcm5pbmcuCi0gKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8cG5nLmg+Ci0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfU1RESU9fU1VQUE9SVEVEKSAmJiBcCi0gICAgZGVmaW5lZCAoUE5HX2lDQ1BfU1VQUE9SVEVEKQotCi0KLXN0YXRpYyBpbnQgdmVyYm9zZSA9IDE7Ci1zdGF0aWMgcG5nX2J5dGUgbm9fcHJvZmlsZVtdID0gIm5vIHByb2ZpbGUiOwotCi1zdGF0aWMgcG5nX2J5dGVwCi1leHRyYWN0KEZJTEUgKmZwLCBwbmdfdWludF8zMiAqcHJvZmxlbikKLXsKLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywwLDAsMCk7Ci0gICBwbmdfaW5mb3AgaW5mb19wdHIgPSBOVUxMOwotICAgcG5nX2J5dGVwIHJlc3VsdCA9IE5VTEw7Ci0KLSAgIC8qIEluaXRpYWxpemUgZm9yIGVycm9yIG9yIG5vIHByb2ZpbGU6ICovCi0gICAqcHJvZmxlbiA9IDA7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgImljY2Zyb21wbmc6IHZlcnNpb24gbGlicmFyeSBtaXNtYXRjaD9cbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICB7Ci0gICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7Ci0KLSAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyBpbmZvIHN0cnVjdHVyZSIpOwotCi0gICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgewotICAgICAgcG5nX2NoYXJwIG5hbWU7Ci0gICAgICBpbnQgY29tcHJlc3Npb25fdHlwZTsKLSAgICAgIHBuZ19ieXRlcCBwcm9maWxlOwotCi0gICAgICBpZiAocG5nX2dldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCAmbmFtZSwgJmNvbXByZXNzaW9uX3R5cGUsICZwcm9maWxlLAotICAgICAgICAgcHJvZmxlbikgJiBQTkdfSU5GT19pQ0NQKQotICAgICAgewotICAgICAgICAgcmVzdWx0ID0gbWFsbG9jKCpwcm9mbGVuKTsKLSAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICAgICAgICAgIG1lbWNweShyZXN1bHQsIHByb2ZpbGUsICpwcm9mbGVuKTsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyBwcm9maWxlIGJ1ZmZlciIpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0JcmVzdWx0ID0gbm9fcHJvZmlsZTsKLSAgIH0KLQotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X29uZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgaW50IHJlc3VsdCA9IDA7Ci0gICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLQotICAgaWYgKGZwICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBwcm9mbGVuID0gMDsKLSAgICAgIHBuZ19ieXRlcCBwcm9maWxlID0gZXh0cmFjdChmcCwgJnByb2ZsZW4pOwotCi0gICAgICBpZiAocHJvZmlsZSAhPSBOVUxMICYmIHByb2ZpbGUgIT0gbm9fcHJvZmlsZSkKLSAgICAgIHsKLSAgICAgICAgIHNpemVfdCBsZW47Ci0gICAgICAgICBjaGFyICpvdXRwdXQ7Ci0KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVwID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKLQotICAgICAgICAgICAgaWYgKGVwICE9IE5VTEwpCi0gICAgICAgICAgICAgICBsZW4gPSBlcC1maWxlbmFtZTsKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgb3V0cHV0ID0gbWFsbG9jKGxlbiArIDUpOwotICAgICAgICAgaWYgKG91dHB1dCAhPSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgRklMRSAqb2Y7Ci0KLSAgICAgICAgICAgIG1lbWNweShvdXRwdXQsIGZpbGVuYW1lLCBsZW4pOwotICAgICAgICAgICAgc3RyY3B5KG91dHB1dCtsZW4sICIuaWNjIik7Ci0KLSAgICAgICAgICAgIG9mID0gZm9wZW4ob3V0cHV0LCAid2IiKTsKLSAgICAgICAgICAgIGlmIChvZiAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShwcm9maWxlLCBwcm9mbGVuLCAxLCBvZikgPT0gMSAmJgotICAgICAgICAgICAgICAgICAgZmZsdXNoKG9mKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICBmY2xvc2Uob2YpID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgLT4gJXNcbiIsIGZpbGVuYW1lLCBvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgLyogU3VjY2VzcyByZXR1cm4gKi8KLSAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIHdyaXRpbmcgcHJvZmlsZVxuIiwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmUob3V0cHV0KSkKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCByZW1vdmUgZmlsZVxuIiwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGVcbiIsIG91dHB1dCk7Ci0KLSAgICAgICAgICAgIGZyZWUob3V0cHV0KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogT09NIGFsbG9jYXRpbmcgc3RyaW5nIVxuIiwgZmlsZW5hbWUpOwotCi0gICAgICAgICBmcmVlKHByb2ZpbGUpOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmICh2ZXJib3NlICYmIHByb2ZpbGUgPT0gbm9fcHJvZmlsZSkKLQlwcmludGYoIiVzIGhhcyBubyBwcm9maWxlXG4iLCBmaWxlbmFtZSk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBvcGVuIGZpbGVcbiIsIGZpbGVuYW1lKTsKLQotICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgIGludCBpOwotICAgaW50IGV4dHJhY3RlZCA9IDA7Ci0KLSAgIGZvciAoaT0xOyBpPGFyZ2M7ICsraSkKLSAgIHsKLSAgICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1xIikgPT0gMCkKLSAgICAgICAgIHZlcmJvc2UgPSAwOwotCi0gICAgICBlbHNlIGlmIChleHRyYWN0X29uZV9maWxlKGFyZ3ZbaV0pKQotICAgICAgICAgZXh0cmFjdGVkID0gMTsKLSAgIH0KLQotICAgLyogRXhpdCBjb2RlIGlzIHRydWUgaWYgYW55IGV4dHJhY3Qgc3VjY2VlZHMgKi8KLSAgIHJldHVybiBleHRyYWN0ZWQgPT0gMDsKLX0KLSNlbmRpZiAvKiBSRUFEICYmIFNURElPICYmIGlDQ1AgKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZXhhbXBsZXMvcG5ncGl4ZWwuYyBiL2NvbnRyaWIvZXhhbXBsZXMvcG5ncGl4ZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2MjM3OS4uMDAwMDAwMAotLS0gYS9jb250cmliL2V4YW1wbGVzL3BuZ3BpeGVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyotIHBuZ3BpeGVsCi0gKgotICogQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTEuCi0gKiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCi0gKiByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206Ci0gKiBVbml0ZWQgU3RhdGVzLgotICoKLSAqIFJlYWQgYSBzaW5nbGUgcGl4ZWwgdmFsdWUgZnJvbSBhIFBORyBmaWxlLgotICoKLSAqIFRoaXMgY29kZSBpbGx1c3RyYXRlcyBiYXNpYyAnYnktcm93JyByZWFkaW5nIG9mIGEgUE5HIGZpbGUgdXNpbmcgbGlicG5nLgotICogUm93cyBhcmUgcmVhZCB1bnRpbCBhIHBhcnRpY3VsYXIgcGl4ZWwgaXMgZm91bmQ7IHRoZSB2YWx1ZSBvZiB0aGlzIHBpeGVsIGlzCi0gKiB0aGVuIHByaW50ZWQgb24gc3Rkb3V0LgotICoKLSAqIFRoZSBjb2RlIGlsbHVzdHJhdGVzIGhvdyB0byBkbyB0aGlzIG9uIGludGVybGFjZWQgYXMgd2VsbCBhcyBub24taW50ZXJsYWNlZAotICogaW1hZ2VzLiAgTm9ybWFsbHkgeW91IHdvdWxkIGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSB0byBoYXZlIGxpYnBuZwotICogZGVhbCB3aXRoIHRoZSBpbnRlcmxhY2UgZm9yIHlvdSwgYnV0IHRoYXQgb2JsaWdlcyB5b3UgdG8gYnVmZmVyIGhhbGYgb2YgdGhlCi0gKiBpbWFnZSB0byBhc3NlbWJsZSB0aGUgaW50ZXJsYWNlZCByb3dzLiAgSW4gdGhpcyBjb2RlCi0gKiBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIGlzIG5vdCBjYWxsZWQgYW5kLCBpbnN0ZWFkLCB0aGUgY29kZSBoYW5kbGVzIHRoZQotICogaW50ZXJsYWNlIHBhc3NlcyBkaXJlY3RseSBsb29raW5nIGZvciB0aGUgcmVxdWlyZWQgcGl4ZWwuCi0gKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNldGptcC5oPiAvKiByZXF1aXJlZCBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KLQotLyogTm9ybWFsbHkgdXNlIDxwbmcuaD4gaGVyZSB0byBnZXQgdGhlIGluc3RhbGxlZCBsaWJwbmcsIGJ1dCB0aGlzIGlzIGRvbmUgdG8KLSAqIGVuc3VyZSB0aGUgY29kZSBwaWNrcyB1cCB0aGUgbG9jYWwgbGlicG5nIGltcGxlbWVudGF0aW9uOgotICovCi0jaW5jbHVkZSAiLi4vLi4vcG5nLmgiCi0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRCkKLQotLyogUmV0dXJuIGNvbXBvbmVudCAnYycgb2YgcGl4ZWwgJ3gnIGZyb20gdGhlIGdpdmVuIHJvdy4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvbXBvbmVudChwbmdfY29uc3RfYnl0ZXAgcm93LCBwbmdfdWludF8zMiB4LCB1bnNpZ25lZCBpbnQgYywKLSAgIHVuc2lnbmVkIGludCBiaXRfZGVwdGgsIHVuc2lnbmVkIGludCBjaGFubmVscykKLXsKLSAgIC8qIFBORyBpbWFnZXMgY2FuIGJlIHVwIHRvIDJeMzEgcGl4ZWxzIHdpZGUsIGJ1dCB0aGlzIG1lYW5zIHRoZXkgY2FuIGJlIHVwIHRvCi0gICAgKiAyXjM3IGJpdHMgd2lkZSAoZm9yIGEgNjQtYml0IHBpeGVsIC0gdGhlIGxhcmdlc3QgcG9zc2libGUpIGFuZCBoZW5jZSAyXjM0Ci0gICAgKiBieXRlcyB3aWRlLiAgU2luY2UgdGhlIHJvdyBmaXR0ZWQgaW50byBtZW1vcnksIGhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbXVzdAotICAgICogd29yazoKLSAgICAqLwotICAgcG5nX3VpbnRfMzIgYml0X29mZnNldF9oaSA9IGJpdF9kZXB0aCAqICgoeCA+PiA2KSAqIGNoYW5uZWxzKTsKLSAgIHBuZ191aW50XzMyIGJpdF9vZmZzZXRfbG8gPSBiaXRfZGVwdGggKiAoKHggJiAweDNmKSAqIGNoYW5uZWxzICsgYyk7Ci0KLSAgIHJvdyA9IChwbmdfY29uc3RfYnl0ZXApKCgoUE5HX0NPTlNUIHBuZ19ieXRlICgqKVs4XSlyb3cpICsgYml0X29mZnNldF9oaSk7Ci0gICByb3cgKz0gYml0X29mZnNldF9sbyA+PiAzOwotICAgYml0X29mZnNldF9sbyAmPSAweDA3OwotCi0gICAvKiBQTkcgcGl4ZWxzIGFyZSBwYWNrZWQgaW50byBieXRlcyB0byBwdXQgdGhlIGZpcnN0IHBpeGVsIGluIHRoZSBoaWdoZXN0Ci0gICAgKiBiaXRzIG9mIHRoZSBieXRlIGFuZCBpbnRvIHR3byBieXRlcyBmb3IgMTYtYml0IHZhbHVlcyB3aXRoIHRoZSBoaWdoIDggYml0cwotICAgICogZmlyc3QsIHNvOgotICAgICovCi0gICBzd2l0Y2ggKGJpdF9kZXB0aCkKLSAgIHsKLSAgICAgIGNhc2UgMTogcmV0dXJuIChyb3dbMF0gPj4gKDctYml0X29mZnNldF9sbykpICYgMHgwMTsKLSAgICAgIGNhc2UgMjogcmV0dXJuIChyb3dbMF0gPj4gKDYtYml0X29mZnNldF9sbykpICYgMHgwMzsKLSAgICAgIGNhc2UgNDogcmV0dXJuIChyb3dbMF0gPj4gKDQtYml0X29mZnNldF9sbykpICYgMHgwZjsKLSAgICAgIGNhc2UgODogcmV0dXJuIHJvd1swXTsKLSAgICAgIGNhc2UgMTY6IHJldHVybiAocm93WzBdIDw8IDgpICsgcm93WzFdOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgYnVnIGluIHRoaXMgcHJvZ3JhbSBvciBpbgotICAgICAgICAgICogbGlicG5nIGl0c2VsZjoKLSAgICAgICAgICAqLwotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmdwaXhlbDogaW52YWxpZCBiaXQgZGVwdGggJXVcbiIsIGJpdF9kZXB0aCk7Ci0gICAgICAgICBleGl0KDEpOwotICAgfQotfQotCi0vKiBQcmludCBhIHBpeGVsIGZyb20gYSByb3cgcmV0dXJuZWQgYnkgbGlicG5nOyBkZXRlcm1pbmUgdGhlIHJvdyBmb3JtYXQsIGZpbmQKLSAqIHRoZSBwaXhlbCwgYW5kIHByaW50IHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiB0byBzdGRvdXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1wcmludF9waXhlbChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ19jb25zdF9ieXRlcCByb3csCi0gICBwbmdfdWludF8zMiB4KQotewotICAgUE5HX0NPTlNUIHVuc2lnbmVkIGludCBiaXRfZGVwdGggPSBwbmdfZ2V0X2JpdF9kZXB0aChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgIHN3aXRjaCAocG5nX2dldF9jb2xvcl90eXBlKHBuZ19wdHIsIGluZm9fcHRyKSkKLSAgIHsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToKLSAgICAgICAgIHByaW50ZigiR1JBWSAldVxuIiwgY29tcG9uZW50KHJvdywgeCwgMCwgYml0X2RlcHRoLCAxKSk7Ci0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8qIFRoZSBwYWxldHRlIGNhc2UgaXMgc2xpZ2h0bHkgbW9yZSBkaWZmaWN1bHQgLSB0aGUgcGFsZXR0ZSBhbmQsIGlmCi0gICAgICAgKiBwcmVzZW50LCB0aGUgdFJOUyAoJ3RyYW5zcGFyZW5jeScsIHRob3VnaCB0aGUgdmFsdWVzIGFyZSByZWFsbHkKLSAgICAgICAqIG9wYWNpdHkpIGRhdGEgbXVzdCBiZSByZWFkIHRvIGdpdmUgdGhlIGZ1bGwgcGljdHVyZToKLSAgICAgICAqLwotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOgotICAgICAgICAgewotICAgICAgICAgICAgUE5HX0NPTlNUIGludCBpbmRleCA9IGNvbXBvbmVudChyb3csIHgsIDAsIGJpdF9kZXB0aCwgMSk7Ci0gICAgICAgICAgICBwbmdfY29sb3JwIHBhbGV0dGUgPSBOVUxMOwotICAgICAgICAgICAgaW50IG51bV9wYWxldHRlID0gMDsKLQotICAgICAgICAgICAgaWYgKChwbmdfZ2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsICZwYWxldHRlLCAmbnVtX3BhbGV0dGUpICYKLSAgICAgICAgICAgICAgIFBOR19JTkZPX1BMVEUpICYmIG51bV9wYWxldHRlID4gMCAmJiBwYWxldHRlICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfYnl0ZXAgdHJhbnNfYWxwaGEgPSBOVUxMOwotICAgICAgICAgICAgICAgaW50IG51bV90cmFucyA9IDA7Ci0gICAgICAgICAgICAgICBpZiAoKHBuZ19nZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgJnRyYW5zX2FscGhhLCAmbnVtX3RyYW5zLAotICAgICAgICAgICAgICAgICAgTlVMTCkgJiBQTkdfSU5GT190Uk5TKSAmJiBudW1fdHJhbnMgPiAwICYmCi0gICAgICAgICAgICAgICAgICB0cmFuc19hbHBoYSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJTkRFWEVEICV1ID0gJWQgJWQgJWQgJWRcbiIsIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpbmRleF0ucmVkLCBwYWxldHRlW2luZGV4XS5ncmVlbiwKLSAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaW5kZXhdLmJsdWUsCi0gICAgICAgICAgICAgICAgICAgICBpbmRleCA8IG51bV90cmFucyA/IHRyYW5zX2FscGhhW2luZGV4XSA6IDI1NSk7Ci0KLSAgICAgICAgICAgICAgIGVsc2UgLyogbm8gdHJhbnNwYXJlbmN5ICovCi0gICAgICAgICAgICAgICAgICBwcmludGYoIklOREVYRUQgJXUgPSAlZCAlZCAlZFxuIiwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBwYWxldHRlW2luZGV4XS5yZWQsIHBhbGV0dGVbaW5kZXhdLmdyZWVuLAotICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpbmRleF0uYmx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHByaW50ZigiSU5ERVhFRCAldSA9IGludmFsaWQgaW5kZXhcbiIsIGluZGV4KTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybjsKLQotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6Ci0gICAgICAgICBwcmludGYoIlJHQiAldSAldSAldVxuIiwgY29tcG9uZW50KHJvdywgeCwgMCwgYml0X2RlcHRoLCAzKSwKLSAgICAgICAgICAgIGNvbXBvbmVudChyb3csIHgsIDEsIGJpdF9kZXB0aCwgMyksCi0gICAgICAgICAgICBjb21wb25lbnQocm93LCB4LCAyLCBiaXRfZGVwdGgsIDMpKTsKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOgotICAgICAgICAgcHJpbnRmKCJHUkFZK0FMUEhBICV1ICV1XG4iLCBjb21wb25lbnQocm93LCB4LCAwLCBiaXRfZGVwdGgsIDIpLAotICAgICAgICAgICAgY29tcG9uZW50KHJvdywgeCwgMSwgYml0X2RlcHRoLCAyKSk7Ci0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOgotICAgICAgICAgcHJpbnRmKCJSR0JBICV1ICV1ICV1ICV1XG4iLCBjb21wb25lbnQocm93LCB4LCAwLCBiaXRfZGVwdGgsIDQpLAotICAgICAgICAgICAgY29tcG9uZW50KHJvdywgeCwgMSwgYml0X2RlcHRoLCA0KSwKLSAgICAgICAgICAgIGNvbXBvbmVudChyb3csIHgsIDIsIGJpdF9kZXB0aCwgNCksCi0gICAgICAgICAgICBjb21wb25lbnQocm93LCB4LCAzLCBiaXRfZGVwdGgsIDQpKTsKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5ncGl4ZWw6IGludmFsaWQgY29sb3IgdHlwZSIpOwotICAgfQotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCi17Ci0gICAvKiBUaGlzIHByb2dyYW0gdXNlcyB0aGUgZGVmYXVsdCwgPHNldGptcC5oPiBiYXNlZCwgbGlicG5nIGVycm9yIGhhbmRsaW5nCi0gICAgKiBtZWNoYW5pc20sIHRoZXJlZm9yZSBhbnkgbG9jYWwgdmFyaWFibGUgdGhhdCBleGlzdHMgYmVmb3JlIHRoZSBjYWxsIHRvCi0gICAgKiBzZXRqbXAgYW5kIGlzIGNoYW5nZWQgYWZ0ZXIgdGhlIGNhbGwgdG8gc2V0am1wIHJldHVybnMgc3VjY2Vzc2Z1bGx5IG11c3QKLSAgICAqIGJlIGRlY2xhcmVkIHdpdGggJ3ZvbGF0aWxlJyB0byBlbnN1cmUgdGhhdCB0aGVpciB2YWx1ZXMgZG9uJ3QgZ2V0Ci0gICAgKiBkZXN0cm95ZWQgYnkgbG9uZ2ptcDoKLSAgICAqLwotICAgdm9sYXRpbGUgaW50IHJlc3VsdCA9IDEvKmZhaWwqLzsKLQotICAgaWYgKGFyZ2MgPT0gNCkKLSAgIHsKLSAgICAgIGxvbmcgeCA9IGF0b2woYXJndlsxXSk7Ci0gICAgICBsb25nIHkgPSBhdG9sKGFyZ3ZbMl0pOwotICAgICAgRklMRSAqZiA9IGZvcGVuKGFyZ3ZbM10sICJyYiIpOwotICAgICAgdm9sYXRpbGUgcG5nX2J5dGVwIHJvdyA9IE5VTEw7Ci0KLSAgICAgIGlmIChmICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAvKiBsaWJwbmcgcmVxdWlyZXMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgZXJyb3JzOyB0aGlzCi0gICAgICAgICAgKiBjYWxsYmFjayBtdXN0IG5vdCByZXR1cm4uICBUaGUgZGVmYXVsdCBjYWxsYmFjayBmdW5jdGlvbiB1c2VzIGEKLSAgICAgICAgICAqIHN0b3JlZCA8c2V0am1wLmg+IHN0eWxlIGptcF9idWYgd2hpY2ggaXMgaGVsZCBpbiBhIHBuZ19zdHJ1Y3QgYW5kCi0gICAgICAgICAgKiB3cml0ZXMgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLiAgQ3JlYXRpbmcgdGhlIHBuZ19zdHJ1Y3QgaXMgYQotICAgICAgICAgICogbGl0dGxlIHRyaWNreTsganVzdCBjb3B5IHRoZSBmb2xsb3dpbmcgY29kZS4KLSAgICAgICAgICAqLwotICAgICAgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLSAgICAgICAgIGlmIChwbmdfcHRyICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotCi0gICAgICAgICAgICBpZiAoaW5mb19wdHIgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIERlY2xhcmUgc3RhY2sgdmFyaWFibGVzIHRvIGhvbGQgcG9pbnRlcnMgdG8gbG9jYWxseSBhbGxvY2F0ZWQKLSAgICAgICAgICAgICAgICAqIGRhdGEuCi0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZXJyb3IgY29udHJvbCBidWZmZXI6ICovCi0gICAgICAgICAgICAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX21ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uX21ldGhvZCwgZmlsdGVyX21ldGhvZDsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCByb3dfdG1wOwotCi0gICAgICAgICAgICAgICAgICAvKiBOb3cgYXNzb2NpYXRlIHRoZSByZWNlbnRseSBvcGVuZWQgKEZJTEUqKSB3aXRoIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgKiBsaWJwbmcgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLiAgU29tZXRpbWVzIGxpYnBuZyBpcwotICAgICAgICAgICAgICAgICAgICogY29tcGlsZWQgd2l0aG91dCBzdGRpbyBzdXBwb3J0IChpdCBjYW4gYmUgZGlmZmljdWx0IHRvIGRvCi0gICAgICAgICAgICAgICAgICAgKiBpbiBzb21lIGVudmlyb25tZW50cyk7IGluIHRoYXQgY2FzZSB5b3Ugd2lsbCBoYXZlIHRvIHdyaXRlCi0gICAgICAgICAgICAgICAgICAgKiB5b3VyIG93biByZWFkIGNhbGxiYWNrIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSAoRklMRSopLgotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmKTsKLQotICAgICAgICAgICAgICAgICAgLyogQW5kIHJlYWQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFBORyBmaWxlIC0gdGhlIGhlYWRlciBhbmQKLSAgICAgICAgICAgICAgICAgICAqIGFsbCB0aGUgaW5mb3JtYXRpb24gdXAgdG8gdGhlIGZpcnN0IHBpeGVsLgotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgICAgICAgICAgICAgICAgLyogVGhpcyBmaWxscyBpbiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gdGVsbCB1cyB0aGUgd2lkdGggb2YKLSAgICAgICAgICAgICAgICAgICAqIGVhY2ggcm93IGluIGJ5dGVzLCBhbGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgYW1vdW50IG9mCi0gICAgICAgICAgICAgICAgICAgKiBzcGFjZS4gIEluIHRoaXMgY2FzZSBwbmdfbWFsbG9jIGlzIHVzZWQgLSBpdCB3aWxsIG5vdAotICAgICAgICAgICAgICAgICAgICogcmV0dXJuIGlmIG1lbW9yeSBpc24ndCBhdmFpbGFibGUuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIHJvdyA9IHBuZ19tYWxsb2MocG5nX3B0ciwgcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpKTsKLQotICAgICAgICAgICAgICAgICAgLyogVG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIHVzaW5nIGEgdm9sYXRpbGUgYXV0byBjb3B5IHJvd190bXAKLSAgICAgICAgICAgICAgICAgICAqIHRvIGEgbG9jYWwgaGVyZSAtIGp1c3QgdXNlIHJvdyBmb3IgdGhlIHBuZ19mcmVlIGJlbG93LgotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICByb3dfdG1wID0gcm93OwotCi0gICAgICAgICAgICAgICAgICAvKiBBbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgaXMgaW4gdGhlIGhlYWRlciBpcyByZXR1cm5lZCBieQotICAgICAgICAgICAgICAgICAgICogcG5nX2dldF9JSERSLCBpZiB0aGlzIGZhaWxzIHdlIGNhbiBub3cgdXNlICdwbmdfZXJyb3InIHRvCi0gICAgICAgICAgICAgICAgICAgKiBzaWduYWwgdGhlIGVycm9yIGFuZCByZXR1cm4gY29udHJvbCB0byB0aGUgc2V0am1wIGFib3ZlLgotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICBpZiAocG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZV9tZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25fbWV0aG9kLCAmZmlsdGVyX21ldGhvZCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpbnQgcGFzc2VzLCBwYXNzOwotCi0gICAgICAgICAgICAgICAgICAgICAvKiBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAqIHBhc3NlcyByZXF1aXJlZCBhcyB3ZWxsIGFzIHR1cm5pbmcgb24gbGlicG5nJ3MKLSAgICAgICAgICAgICAgICAgICAgICAqIGhhbmRsaW5nLCBidXQgc2luY2Ugd2UgZG8gaXQgb3Vyc2VsdmVzIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAqIG5lY2Vzc2FyeToKLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnRlcmxhY2VfbWV0aG9kKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQTkdfSU5URVJMQUNFX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZXMgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlcyA9IFBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ3BpeGVsOiB1bmtub3duIGludGVybGFjZSIpOwotICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAvKiBOb3cgcmVhZCB0aGUgcGl4ZWxzLCBwYXNzLWJ5LXBhc3MsIHJvdy1ieS1yb3c6ICovCi0gICAgICAgICAgICAgICAgICAgICBwbmdfc3RhcnRfcmVhZF9pbWFnZShwbmdfcHRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzPTA7IHBhc3M8cGFzc2VzOyArK3Bhc3MpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiB5c3RhcnQsIHhzdGFydCwgeXN0ZXAsIHhzdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcHk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmxhY2VfbWV0aG9kID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb21ldGltZXMgdGhlIHdob2xlIHBhc3MgaXMgZW1wdHkgYmVjYXVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGltYWdlIGlzIHRvbyBuYXJyb3cgb3IgdG9vIHNob3J0LiAgbGlicG5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBleHBlY3RzIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCByb3cgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcHJlc2VudCBpbiB0aGUgcGFzcywgc28gaXQgbWF5IGJlIG5lY2Vzc2FyeSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2tpcCB0aGUgbG9vcCBiZWxvdyAob3ZlciBweSkgaWYgdGhlIGltYWdlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0b28gbmFycm93LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRoZSBzdGFydGluZyBwaXhlbCBhbmQgdGhlIG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmV0d2VlbiBlYWNoIHBpeGVsIGluIHRoaXMgcGFzczsgdXNlIHRoZSBtYWNyb3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIHBuZy5oOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RlcCA9IFBOR19QQVNTX0NPTF9PRkZTRVQocGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RlcCA9IFBOR19QQVNTX1JPV19PRkZTRVQocGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IHhzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RlcCA9IHhzdGVwID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogVG8gZmluZCB0aGUgcGl4ZWwsIGxvb3Agb3ZlciAncHknIGZvciBlYWNoIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWRpbmcgYSByb3cgYW5kIHRoZW4gY2hlY2tpbmcgdG8gc2VlIGlmIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBjb250YWlucyB0aGUgcGl4ZWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHkgPSB5c3RhcnQ7IHB5IDwgaGVpZ2h0OyBweSArPSB5c3RlcCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHB4LCBwcHg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBuZ19yZWFkX3JvdyB0YWtlcyB0d28gcG9pbnRlcnMuICBXaGVuIGxpYnBuZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGFuZGxlcyB0aGUgaW50ZXJsYWNlIHRoZSBmaXJzdCBpcyBmaWxsZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBpeGVsLWJ5LXBpeGVsLCBhbmQgdGhlIHNlY29uZCByZWNlaXZlcyB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGl4ZWxzIGJ1dCB0aGV5IGFyZSByZXBsaWNhdGVkIGFjcm9zcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVud3JpdHRlbiBwaXhlbHMgc28gZmFyIGZvciBlYWNoIHBhc3MuICBXaGVuIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkbyB0aGUgaW50ZXJsYWNlLCBob3dldmVyLCB0aGV5IGp1c3QgY29udGFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBpeGVscyBmcm9tIHRoZSBpbnRlcmxhY2UgcGFzcyAtIGdpdmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYm90aCBpcyB3YXN0ZWZ1bCBhbmQgcG9pbnRsZXNzLCBzbyB3ZSBwYXNzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5VTEwgcG9pbnRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJvd190bXAsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3cgZmluZCB0aGUgcGl4ZWwgaWYgaXQgaXMgaW4gdGhpcyByb3c7IHRoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUsIG9mIGNvdXJzZSwgbXVjaCBiZXR0ZXIgd2F5cyBvZiBkb2luZyB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGFuIHVzaW5nIGEgZm9yIGxvb3A6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID09IHB5KSBmb3IgKHB4ID0geHN0YXJ0LCBwcHggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHggPCB3aWR0aDsgcHggKz0geHN0ZXAsICsrcHB4KSBpZiAoeCA9PSBweCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICdwcHgnIGlzIHRoZSBpbmRleCBvZiB0aGUgcGl4ZWwgaW4gdGhlIHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9waXhlbChwbmdfcHRyLCBpbmZvX3B0ciwgcm93X3RtcCwgcHB4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm93IHRlcm1pbmF0ZSB0aGUgbG9vcHMgZWFybHkgLSB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb3VuZCBhbmQgaGFuZGxlZCB0aGUgcmVxdWlyZWQgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBwYXNzX2xvb3BfZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiB4IGxvb3AgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogeSBsb29wICovCi0gICAgICAgICAgICAgICAgICAgICB9IC8qIHBhc3MgbG9vcCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAvKiBGaW5hbGx5IGZyZWUgdGhlIHRlbXBvcmFyeSBidWZmZXI6ICovCi0gICAgICAgICAgICAgICAgICBwYXNzX2xvb3BfZW5kOgotICAgICAgICAgICAgICAgICAgICAgcm93ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19mcmVlKHBuZ19wdHIsIHJvd190bXApOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgInBuZ3BpeGVsOiBwbmdfZ2V0X0lIRFIgZmFpbGVkIik7Ci0KLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogRWxzZSBsaWJwbmcgaGFzIHJhaXNlZCBhbiBlcnJvci4gIEFuIGVycm9yIG1lc3NhZ2UgaGFzCi0gICAgICAgICAgICAgICAgICAgKiBhbHJlYWR5IGJlZW4gb3V0cHV0LCBzbyBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBjbGVhbiB1cAotICAgICAgICAgICAgICAgICAgICogbG9jYWxseSBhbGxvY2F0ZWQgZGF0YToKLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgaWYgKHJvdyAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcG5nX2ZyZWUgbmV2ZXIgZXJyb3JzIG91dAotICAgICAgICAgICAgICAgICAgICAgICogKGl0IGp1c3QgY3Jhc2hlcyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyksIGJ1dCB0aGUgc2FmZQotICAgICAgICAgICAgICAgICAgICAgICogd2F5IG9mIHVzaW5nIGl0IGlzIHN0aWxsIHRvIGNsZWFyICdyb3cnIGJlZm9yZSBjYWxsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgKiBwbmdfZnJlZToKLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIHJvd190bXAgPSByb3c7Ci0gICAgICAgICAgICAgICAgICAgICByb3cgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgcG5nX2ZyZWUocG5nX3B0ciwgcm93X3RtcCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIHBuZ19kZXN0cm95X2luZm9fc3RydWN0KHBuZ19wdHIsICZpbmZvX3B0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ncGl4ZWw6IG91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBwbmdfaW5mb1xuIik7Ci0KLSAgICAgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmdwaXhlbDogb3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHBuZ19zdHJ1Y3RcbiIpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3BpeGVsOiAlczogY291bGQgbm90IG9wZW4gZmlsZVxuIiwgYXJndlszXSk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIC8qIFdyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKi8KLSAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ncGl4ZWw6IHVzYWdlOiBwbmdwaXhlbCB4IHkgcG5nLWZpbGVcbiIpOwotCi0gICByZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmIC8qIFJFQUQgJiYgU0VRVUVOVElBTF9SRUFEICovCmRpZmYgLS1naXQgYS9jb250cmliL2V4YW1wbGVzL3BuZ3RvcG5nLmMgYi9jb250cmliL2V4YW1wbGVzL3BuZ3RvcG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhY2Y2YjMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9leGFtcGxlcy9wbmd0b3BuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyotIHBuZ3RvcG5nCi0gKgotICogQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTEuCi0gKiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCi0gKiByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206Ci0gKiBVbml0ZWQgU3RhdGVzLgotICoKLSAqIFJlYWQgYSBQTkcgYW5kIHdyaXRlIGl0IG91dCBpbiBhIGZpeGVkIGZvcm1hdCwgdXNpbmcgdGhlICdzaW1wbGlmaWVkIEFQSScKLSAqIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNi4wLgotICoKLSAqIFRoaXMgc2FtcGxlIGNvZGUgaXMganVzdCB0aGUgY29kZSBmcm9tIHRoZSB0b3Agb2YgJ2V4YW1wbGUuYycgd2l0aCBzb21lIGVycm9yCi0gKiBoYW5kbGluZyBhZGRlZC4gIFNlZSBleGFtcGxlLmMgZm9yIG1vcmUgY29tbWVudHMuCi0gKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBOb3JtYWxseSB1c2UgPHBuZy5oPiBoZXJlIHRvIGdldCB0aGUgaW5zdGFsbGVkIGxpYnBuZywgYnV0IHRoaXMgaXMgZG9uZSB0bwotICogZW5zdXJlIHRoZSBjb2RlIHBpY2tzIHVwIHRoZSBsb2NhbCBsaWJwbmcgaW1wbGVtZW50YXRpb246Ci0gKi8KLSNpbmNsdWRlICIuLi8uLi9wbmcuaCIKLSNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSAmJiBcCi0gICAgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpCi0KLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKLXsKLSAgIGludCByZXN1bHQgPSAxOwotCi0gICBpZiAoYXJnYyA9PSAzKQotICAgewotICAgICAgcG5nX2ltYWdlIGltYWdlOwotCi0gICAgICAvKiBPbmx5IHRoZSBpbWFnZSBzdHJ1Y3R1cmUgdmVyc2lvbiBudW1iZXIgbmVlZHMgdG8gYmUgc2V0LiAqLwotICAgICAgbWVtc2V0KCZpbWFnZSwgMCwgc2l6ZW9mIGltYWdlKTsKLSAgICAgIGltYWdlLnZlcnNpb24gPSBQTkdfSU1BR0VfVkVSU0lPTjsKLQotICAgICAgaWYgKHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSgmaW1hZ2UsIGFyZ3ZbMV0pKQotICAgICAgewotICAgICAgICAgcG5nX2J5dGVwIGJ1ZmZlcjsKLQotICAgICAgICAgLyogQ2hhbmdlIHRoaXMgdG8gdHJ5IGRpZmZlcmVudCBmb3JtYXRzISAgSWYgeW91IHNldCBhIGNvbG9ybWFwIGZvcm1hdAotICAgICAgICAgICogdGhlbiB5b3UgbXVzdCBhbHNvIHN1cHBseSBhIGNvbG9ybWFwIGJlbG93LgotICAgICAgICAgICovCi0gICAgICAgICBpbWFnZS5mb3JtYXQgPSBQTkdfRk9STUFUX1JHQkE7Ci0KLSAgICAgICAgIGJ1ZmZlciA9IG1hbGxvYyhQTkdfSU1BR0VfU0laRShpbWFnZSkpOwotCi0gICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCZpbWFnZSwgTlVMTC8qYmFja2dyb3VuZCovLCBidWZmZXIsCi0gICAgICAgICAgICAgICAwLypyb3dfc3RyaWRlKi8sIE5VTEwvKmNvbG9ybWFwIGZvciBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVAgKi8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKHBuZ19pbWFnZV93cml0ZV90b19maWxlKCZpbWFnZSwgYXJndlsyXSwKLSAgICAgICAgICAgICAgICAgIDAvKmNvbnZlcnRfdG9fOGJpdCovLCBidWZmZXIsIDAvKnJvd19zdHJpZGUqLywKLSAgICAgICAgICAgICAgICAgIE5VTEwvKmNvbG9ybWFwKi8pKQotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd0b3BuZzogd3JpdGUgJXM6ICVzXG4iLCBhcmd2WzJdLAotICAgICAgICAgICAgICAgICAgICAgIGltYWdlLm1lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndG9wbmc6IHJlYWQgJXM6ICVzXG4iLCBhcmd2WzFdLAotICAgICAgICAgICAgICAgICAgIGltYWdlLm1lc3NhZ2UpOwotCi0gICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIGEgJ2ZyZWUnIGlzIHJlcXVpcmVkOyBsaWJwbmcgZG9lcwotICAgICAgICAgICAgICAgICogdGhlIGNsZWFudXAgb24gZXJyb3IgYW5kIHN1Y2Nlc3MsIGJ1dCBpbiB0aGlzIGNhc2Ugd2UgY291bGRuJ3QKLSAgICAgICAgICAgICAgICAqIGNvbXBsZXRlIHRoZSByZWFkIGJlY2F1c2Ugb2YgcnVubmluZyBvdXQgb2YgbWVtb3J5LgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBwbmdfaW1hZ2VfZnJlZSgmaW1hZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3RvcG5nOiBvdXQgb2YgbWVtb3J5OiAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylQTkdfSU1BR0VfU0laRShpbWFnZSkpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICAvKiBGYWlsZWQgdG8gcmVhZCB0aGUgZmlyc3QgYXJndW1lbnQ6ICovCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3RvcG5nOiAlczogJXNcbiIsIGFyZ3ZbMV0sIGltYWdlLm1lc3NhZ2UpOwotICAgfQotCi0gICBlbHNlCi0gICAgICAvKiBXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICovCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3RvcG5nOiB1c2FnZTogcG5ndG9wbmcgaW5wdXQtZmlsZSBvdXRwdXQtZmlsZVxuIik7Ci0KLSAgIHJldHVybiByZXN1bHQ7Ci19Ci0jZW5kaWYgLyogUkVBRCAmJiBXUklURSAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi9leGFtcGxlcy9zaW1wbGVvdmVyLmMgYi9jb250cmliL2V4YW1wbGVzL3NpbXBsZW92ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkZDMxMy4uMDAwMDAwMAotLS0gYS9jb250cmliL2V4YW1wbGVzL3NpbXBsZW92ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKi0gc2ltcGxlb3ZlcgotICoKLSAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDE1LgotICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAotICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotICogVW5pdGVkIFN0YXRlcy4KLSAqCi0gKiBSZWFkIHNldmVyYWwgUE5HIGZpbGVzLCB3aGljaCBzaG91bGQgaGF2ZSBhbiBhbHBoYSBjaGFubmVsIG9yIHRyYW5zcGFyZW5jeQotICogaW5mb3JtYXRpb24sIGFuZCBjb21wb3NpdGUgdGhlbSB0b2dldGhlciB0byBwcm9kdWNlIG9uZSBvciBtb3JlIDE2LWJpdCBsaW5lYXIKLSAqIFJHQkEgaW50ZXJtZWRpYXRlcy4gIFRoaXMgaW52b2x2ZXMgZG9pbmcgdGhlIGNvcnJlY3QgJ292ZXInIGNvbXBvc2l0aW9uIHRvCi0gKiBjb21iaW5lIHRoZSBhbHBoYSBjaGFubmVscyBhbmQgY29ycmVzcG9uZGluZyBkYXRhLgotICoKLSAqIEZpbmFsbHkgcmVhZCBhbiBvdXRwdXQgKGJhY2tncm91bmQpIFBORyB1c2luZyB0aGUgMjQtYml0IFJHQiBmb3JtYXQgKHRoZQotICogUE5HIHdpbGwgYmUgY29tcG9zaXRlZCBvbiBncmVlbiAoIzAwZmYwMCkgYnkgZGVmYXVsdCBpZiBpdCBoYXMgYW4gYWxwaGEKLSAqIGNoYW5uZWwpLCBhbmQgYXBwbHkgdGhlIGludGVybWVkaWF0ZSBpbWFnZSBnZW5lcmF0ZWQgYWJvdmUgdG8gc3BlY2lmaWVkCi0gKiBsb2NhdGlvbnMgaW4gdGhlIGltYWdlLgotICoKLSAqIFRoZSBjb21tYW5kIGxpbmUgaGFzIHRoZSBnZW5lcmFsIGZvcm1hdDoKLSAqCi0gKiAgICBzaW1wbGVvdmVyIDxiYWNrZ3JvdW5kLnBuZz4gW291dHB1dC5wbmddCi0gKiAgICAgICAgey0tc3ByaXRlPXdpZHRoLGhlaWdodCxuYW1lIHtbLS1hdD14LHldIHtzcHJpdGUucG5nfX19Ci0gKiAgICAgICAgey0tYWRkPW5hbWUge3gseX19Ci0gKgotICogVGhlIC0tc3ByaXRlIGFuZCAtLWFkZCBvcHRpb25zIG1heSBvY2N1ciBtdWx0aXBsZSB0aW1lcy4gVGhleSBhcmUgZXhlY3V0ZWQKLSAqIGluIG9yZGVyLiAgLS1hZGQgbWF5IHJlZmVyIHRvIGFueSBzcHJpdGUgYWxyZWFkeSByZWFkLgotICoKLSAqIFRoaXMgY29kZSBpcyBpbnRlbmRlZCB0byBzaG93IGhvdyB0byBjb21wb3NpdGUgbXVsdGlwbGUgaW1hZ2VzIHRvZ2V0aGVyCi0gKiBjb3JyZWN0bHkuICBBcGFydCBmcm9tIHRoZSBsaWJwbmcgU2ltcGxpZmllZCBBUEkgdGhlIG9ubHkgd29yayBkb25lIGluIGhlcmUKLSAqIGlzIHRvIGNvbWJpbmUgbXVsdGlwbGUgaW5wdXQgUE5HIGltYWdlcyBpbnRvIGEgc2luZ2xlIHNwcml0ZTsgdGhpcyBpbnZvbHZlcwotICogYSBQb3J0ZXItRHVmZiAnb3Zlcicgb3BlcmF0aW9uIGFuZCB0aGUgaW5wdXQgUE5HIGltYWdlcyBtYXksIGFzIGEgcmVzdWx0LAotICogYmUgcmVnYXJkZWQgYXMgYmVpbmcgbGF5ZXJlZCBvbmUgb24gdG9wIG9mIHRoZSBvdGhlciB3aXRoIHRoZSBmaXJzdCAobGVmdG1vc3QKLSAqIG9uIHRoZSBjb21tYW5kIGxpbmUpIGJlaW5nIGF0IHRoZSBib3R0b20gYW5kIHRoZSBsYXN0IG9uIHRoZSB0b3AuCi0gKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLS8qIE5vcm1hbGx5IHVzZSA8cG5nLmg+IGhlcmUgdG8gZ2V0IHRoZSBpbnN0YWxsZWQgbGlicG5nLCBidXQgdGhpcyBpcyBkb25lIHRvCi0gKiBlbnN1cmUgdGhlIGNvZGUgcGlja3MgdXAgdGhlIGxvY2FsIGxpYnBuZyBpbXBsZW1lbnRhdGlvbiwgc28gbG9uZyBhcyB0aGlzCi0gKiBmaWxlIGlzIGxpbmtlZCBhZ2FpbnN0IGEgc3VmZmljaWVudGx5IHJlY2VudCBsaWJwbmcgKDEuNispIGl0IGlzIG9rIHRvCi0gKiBjaGFuZ2UgdGhpcyB0byA8cG5nLmg+OgotICovCi0jaW5jbHVkZSAiLi4vLi4vcG5nLmgiCi0KLSNpZmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRAotCi0jZGVmaW5lIHNwcml0ZV9uYW1lX2NoYXJzIDE1Ci1zdHJ1Y3Qgc3ByaXRlIHsKLSAgIEZJTEUgICAgICAgICAqZmlsZTsKLSAgIHBuZ191aW50XzE2cCAgYnVmZmVyOwotICAgdW5zaWduZWQgaW50ICB3aWR0aDsKLSAgIHVuc2lnbmVkIGludCAgaGVpZ2h0OwotICAgY2hhciAgICAgICAgICBuYW1lW3Nwcml0ZV9uYW1lX2NoYXJzKzFdOwotfTsKLQotI2lmIDAgLyogZGl2IGJ5IDY1NTM1IHRlc3QgcHJvZ3JhbSAqLwotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgbWFpbih2b2lkKSB7Ci0gICBkb3VibGUgZXJyID0gMDsKLSAgIHVuc2lnbmVkIGludCB4ZXJyID0gMDsKLSAgIHVuc2lnbmVkIGludCByID0gMzI3Njk7Ci0gICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgeCA9IDA7Ci0KLSAgICAgIGRvIHsKLSAgICAgICAgIHVuc2lnbmVkIGludCB0ID0geCArICh4ID4+IDE2KSAvKisgKHggPj4gMzEpKi8gKyByOwotICAgICAgICAgZG91YmxlIHYgPSB4LCBlcnJ0ZXN0OwotCi0gICAgICAgICBpZiAodCA8IHgpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAib3ZlcmZsb3c6ICV1KyV1IC0+ICV1XG4iLCB4LCByLCB0KTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgfQotCi0gICAgICAgICB2IC89IDY1NTM1OwotICAgICAgICAgZXJydGVzdCA9IHY7Ci0gICAgICAgICB0ID4+PSAxNjsKLSAgICAgICAgIGVycnRlc3QgLT0gdDsKLQotICAgICAgICAgaWYgKGVycnRlc3QgPiBlcnIpIHsKLSAgICAgICAgICAgIGVyciA9IGVycnRlc3Q7Ci0gICAgICAgICAgICB4ZXJyID0geDsKLQotICAgICAgICAgICAgaWYgKGVycnRlc3QgPj0gLjUpIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICV1LzY1NTM1ID0gJWYsIG5vdCAldSwgZXJyb3IgJWZcbiIsCi0gICAgICAgICAgICAgICAgICAgICB4LCB2LCB0LCBlcnJ0ZXN0KTsKLSAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfSB3aGlsZSAoKyt4IDw9IDY1NTM1VSo2NTUzNVUpOwotICAgfQotCi0gICBwcmludGYoImVycm9yICVmIEAgJXVcbiIsIGVyciwgeGVycik7Ci0KLSAgIHJldHVybiAwOwotfQotI2VuZGlmIC8qIGRpdiBieSA2NTUzNSB0ZXN0IHByb2dyYW0gKi8KLQotc3RhdGljIHZvaWQKLXNwcml0ZV9vcChjb25zdCBzdHJ1Y3Qgc3ByaXRlICpzcHJpdGUsIGludCB4X29mZnNldCwgaW50IHlfb2Zmc2V0LAotICAgcG5nX2ltYWdlcCBpbWFnZSwgY29uc3QgcG5nX3VpbnRfMTYgKmJ1ZmZlcikKLXsKLSAgIC8qIFRoaXMgaXMgd2hlcmUgdGhlIFBvcnRlci1EdWZmICdPdmVyJyBvcGVyYXRvciBpcyBldmFsdWF0ZWQ7IGNoYW5nZSB0aGlzCi0gICAgKiBjb2RlIHRvIGNoYW5nZSB0aGUgb3BlcmF0b3IgKHRoaXMgY291bGQgYmUgcGFyYW1ldGVyaXplZCkuICBBbnkgb3RoZXIKLSAgICAqIGltYWdlIHByb2Nlc3Npbmcgb3BlcmF0aW9uIGNvdWxkIGJlIHVzZWQgaGVyZS4KLSAgICAqLwotCi0KLSAgIC8qIENoZWNrIGZvciBhbiB4IG9yIHkgb2Zmc2V0IHRoYXQgcHVzaGVzIGFueSBwYXJ0IG9mIHRoZSBpbWFnZSBiZXlvbmQgdGhlCi0gICAgKiByaWdodCBvciBib3R0b20gb2YgdGhlIHNwcml0ZToKLSAgICAqLwotICAgaWYgKCh5X29mZnNldCA8IDAgfHwgKHVuc2lnbmVkKS8qU0FGRSoveV9vZmZzZXQgPCBzcHJpdGUtPmhlaWdodCkgJiYKLSAgICAgICAoeF9vZmZzZXQgPCAwIHx8ICh1bnNpZ25lZCkvKlNBRkUqL3hfb2Zmc2V0IDwgc3ByaXRlLT53aWR0aCkpCi0gICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgeSA9IDA7Ci0KLSAgICAgIGlmICh5X29mZnNldCA8IDApCi0gICAgICAgICB5ID0gLXlfb2Zmc2V0OyAvKiBTa2lwIHRvIGZpcnN0IHZpc2libGUgcm93ICovCi0KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICB1bnNpZ25lZCBpbnQgeCA9IDA7Ci0KLSAgICAgICAgIGlmICh4X29mZnNldCA8IDApCi0gICAgICAgICAgICB4ID0gLXhfb2Zmc2V0OwotCi0gICAgICAgICBkbwotICAgICAgICAgewotICAgICAgICAgICAgLyogSW4gYW5kIG91dCBhcmUgUkdCQSB2YWx1ZXMsIHNvOiAqLwotICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMTYgKmluX3BpeGVsID0gYnVmZmVyICsgKHkgKiBpbWFnZS0+d2lkdGggKyB4KSo0OwotICAgICAgICAgICAgcG5nX3VpbnRfMzIgaW5fYWxwaGEgPSBpbl9waXhlbFszXTsKLQotICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgb3B0aW1pemVkIFBvcnRlci1EdWZmICdPdmVyJyBvcGVyYXRpb24sIHdoZW4gdGhlCi0gICAgICAgICAgICAgKiBpbnB1dCBhbHBoYSBpcyAwIHRoZSBvdXRwdXQgaXMgbm90IGNoYW5nZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChpbl9hbHBoYSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfdWludF8xNiAqb3V0X3BpeGVsID0gc3ByaXRlLT5idWZmZXIgKwotICAgICAgICAgICAgICAgICAgKCh5K3lfb2Zmc2V0KSAqIHNwcml0ZS0+d2lkdGggKyAoeCt4X29mZnNldCkpKjQ7Ci0KLSAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHdlaWdodCB0byBhcHBseSB0byB0aGUgb3V0cHV0OiAqLwotICAgICAgICAgICAgICAgaW5fYWxwaGEgPSA2NTUzNS1pbl9hbHBoYTsKLQotICAgICAgICAgICAgICAgaWYgKGluX2FscGhhID4gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIFRoZSBpbnB1dCBtdXN0IGJlIGNvbXBvc2VkIG9udG8gdGhlIG91dHB1dC4gVGhpcyBtZWFucwotICAgICAgICAgICAgICAgICAgICogbXVsdGlwbHlpbmcgdGhlIGN1cnJlbnQgb3V0cHV0IHBpeGVsIHZhbHVlIGJ5IHRoZSBpbnZlcnNlCi0gICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgaW5wdXQgYWxwaGEgKDEtYWxwaGEpLiBBIGRpdmlzaW9uIGlzIHJlcXVpcmVkIGJ1dAotICAgICAgICAgICAgICAgICAgICogaXQgaXMgYnkgdGhlIGNvbnN0YW50IDY1NTM1LiAgQXBwcm94aW1hdGUgdGhpcyBhczoKLSAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgKiAgICAgKHggKyAoeCA+PiAxNikgKyAzMjc2OSkgPj4gMTY7Ci0gICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBleGFjdCAoYW5kIGRvZXMgbm90IG92ZXJmbG93KSBmb3IgYWxsIHZhbHVlcyBvZgotICAgICAgICAgICAgICAgICAgICogeCBpbiB0aGUgcmFuZ2UgMC4uNjU1MzUqNjU1MzUuICAoTm90ZSB0aGF0IHRoZSBjYWxjdWxhdGlvbgotICAgICAgICAgICAgICAgICAgICogcHJvZHVjZXMgdGhlIGNsb3Nlc3QgaW50ZWdlcjsgdGhlIG1heGltdW0gZXJyb3IgaXMgPDAuNSkuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHRtcDsKLQotIyAgICAgICAgICAgICAgICAgZGVmaW5lIGNvbXBvc2UoYylcCi0gICAgICAgICAgICAgICAgICAgICB0bXAgPSBvdXRfcGl4ZWxbY10gKiBpbl9hbHBoYTtcCi0gICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wICsgKHRtcCA+PiAxNikgKyAzMjc2OSkgPj4gMTY7XAotICAgICAgICAgICAgICAgICAgICAgb3V0X3BpeGVsW2NdID0gdG1wICsgaW5fcGl4ZWxbY10KLQotICAgICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBpcyB2ZXJ5IHZlY3Rvcml6YWJsZS4uLiAqLwotICAgICAgICAgICAgICAgICAgY29tcG9zZSgwKTsKLSAgICAgICAgICAgICAgICAgIGNvbXBvc2UoMSk7Ci0gICAgICAgICAgICAgICAgICBjb21wb3NlKDIpOwotICAgICAgICAgICAgICAgICAgY29tcG9zZSgzKTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgb3V0X3BpeGVsWzBdID0gaW5fcGl4ZWxbMF0sCi0gICAgICAgICAgICAgICAgICBvdXRfcGl4ZWxbMV0gPSBpbl9waXhlbFsxXSwKLSAgICAgICAgICAgICAgICAgIG91dF9waXhlbFsyXSA9IGluX3BpeGVsWzJdLAotICAgICAgICAgICAgICAgICAgb3V0X3BpeGVsWzNdID0gaW5fcGl4ZWxbM107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICB3aGlsZSAoKyt4IDwgaW1hZ2UtPndpZHRoKTsKLSAgICAgIH0KLSAgICAgIHdoaWxlICgrK3kgPCBpbWFnZS0+aGVpZ2h0KTsKLSAgIH0KLX0KLQotc3RhdGljIGludAotY3JlYXRlX3Nwcml0ZShzdHJ1Y3Qgc3ByaXRlICpzcHJpdGUsIGludCAqYXJnYywgY29uc3QgY2hhciAqKiphcmd2KQotewotICAgLyogUmVhZCB0aGUgYXJndW1lbnRzIGFuZCBjcmVhdGUgdGhpcyBzcHJpdGUuIFRoZSBzcHJpdGUgYnVmZmVyIGhhcyBhbHJlYWR5Ci0gICAgKiBiZWVuIGFsbG9jYXRlZC4gVGhpcyByZWFkcyB0aGUgaW5wdXQgUE5HcyBvbmUgYnkgb25lIGluIGxpbmVhciBmb3JtYXQsCi0gICAgKiBjb21wb3NlcyB0aGVtIG9udG8gdGhlIHNwcml0ZSBidWZmZXIgKHRoZSBjb2RlIGluIHRoZSBmdW5jdGlvbiBhYm92ZSkKLSAgICAqIHRoZW4gc2F2ZXMgdGhlIHJlc3VsdCwgY29udmVydGluZyBpdCBvbiB0aGUgZmx5IHRvIFBORyBSR0JBIDgtYml0IGZvcm1hdC4KLSAgICAqLwotICAgd2hpbGUgKCphcmdjID4gMCkKLSAgIHsKLSAgICAgIGNoYXIgdG9tYnN0b25lOwotICAgICAgaW50IHggPSAwLCB5ID0gMDsKLQotICAgICAgaWYgKCgqYXJndilbMF1bMF0gPT0gJy0nICYmICgqYXJndilbMF1bMV0gPT0gJy0nKQotICAgICAgewotICAgICAgICAgLyogVGhlIG9ubHkgc3VwcG9ydGVkIG9wdGlvbiBpcyAtLWF0LiAqLwotICAgICAgICAgaWYgKHNzY2FuZigoKmFyZ3YpWzBdLCAiLS1hdD0lZCwlZCVjIiwgJngsICZ5LCAmdG9tYnN0b25lKSAhPSAyKQotICAgICAgICAgICAgYnJlYWs7IC8qIHN1Y2Nlc3M7IGNhbGxlciB3aWxsIHBhcnNlIHRoaXMgb3B0aW9uICovCi0KLSAgICAgICAgICsrKmFyZ3YsIC0tKmFyZ2M7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoZSBhcmd1bWVudCBoYXMgdG8gYmUgYSBmaWxlIG5hbWUgKi8KLSAgICAgICAgIHBuZ19pbWFnZSBpbWFnZTsKLQotICAgICAgICAgaW1hZ2UudmVyc2lvbiA9IFBOR19JTUFHRV9WRVJTSU9OOwotICAgICAgICAgaW1hZ2Uub3BhcXVlID0gTlVMTDsKLQotICAgICAgICAgaWYgKHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSgmaW1hZ2UsICgqYXJndilbMF0pKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMTZwIGJ1ZmZlcjsKLQotICAgICAgICAgICAgaW1hZ2UuZm9ybWF0ID0gUE5HX0ZPUk1BVF9MSU5FQVJfUkdCX0FMUEhBOwotCi0gICAgICAgICAgICBidWZmZXIgPSBtYWxsb2MoUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKLQotICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKHBuZ19pbWFnZV9maW5pc2hfcmVhZCgmaW1hZ2UsIE5VTEwvKmJhY2tncm91bmQqLywgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgMC8qcm93X3N0cmlkZSovLAotICAgICAgICAgICAgICAgICAgTlVMTC8qY29sb3JtYXAgZm9yIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCovKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHRoZSBQb3J0ZXItRHVmZiAnT3Zlcicgb3BlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAqIG5lZWRzIHRvIGJlIGRvbmUgYnkgdGhpcyBjb2RlLiAgSW4gZmFjdCwgYW55IGltYWdlCi0gICAgICAgICAgICAgICAgICAgKiBwcm9jZXNzaW5nIHJlcXVpcmVkIGNhbiBiZSBkb25lIGhlcmU7IHRoZSBkYXRhIGlzIGluCi0gICAgICAgICAgICAgICAgICAgKiB0aGUgY29ycmVjdCBmb3JtYXQgKGxpbmVhciwgMTYtYml0KSBhbmQgc291cmNlIGFuZAotICAgICAgICAgICAgICAgICAgICogZGVzdGluYXRpb24gYXJlIGluIG1lbW9yeS4KLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgc3ByaXRlX29wKHNwcml0ZSwgeCwgeSwgJmltYWdlLCBidWZmZXIpOwotICAgICAgICAgICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgICAgICAgICAgICAgKysqYXJndiwgLS0qYXJnYzsKLSAgICAgICAgICAgICAgICAgIC8qIEFuZCBjb250aW51ZSB0byB0aGUgbmV4dCBhcmd1bWVudCAqLwotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogcmVhZCAlczogJXNcbiIsICgqYXJndilbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UubWVzc2FnZSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3Zlcjogb3V0IG9mIG1lbW9yeTogJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKLQotICAgICAgICAgICAgICAgLyogcG5nX2ltYWdlX2ZyZWUgbXVzdCBiZSBjYWxsZWQgaWYgd2UgYWJvcnQgdGhlIFNpbXBsaWZpZWQgQVBJCi0gICAgICAgICAgICAgICAgKiByZWFkIGJlY2F1c2Ugb2YgYSBwcm9ibGVtIGRldGVjdGVkIGluIHRoaXMgY29kZS4gIElmIHByb2JsZW1zCi0gICAgICAgICAgICAgICAgKiBhcmUgZGV0ZWN0ZWQgaW4gdGhlIFNpbXBsaWZpZWQgQVBJIGl0IGNsZWFucyB1cCBpdHNlbGYuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHBuZ19pbWFnZV9mcmVlKCZpbWFnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZhaWxlZCB0byByZWFkIHRoZSBmaXJzdCBhcmd1bWVudDogKi8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogJXM6ICVzXG4iLCAoKmFyZ3YpWzBdLCBpbWFnZS5tZXNzYWdlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcmV0dXJuIDA7IC8qIGZhaWx1cmUgKi8KLSAgICAgIH0KLSAgIH0KLQotICAgLyogQWxsIHRoZSBzcHJpdGUgb3BlcmF0aW9ucyBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIFNhdmUgdGhlIFJHQkEKLSAgICAqIGJ1ZmZlciBhcyBhIFBORyB1c2luZyB0aGUgc2ltcGxpZmllZCB3cml0ZSBBUEkuCi0gICAgKi8KLSAgIHNwcml0ZS0+ZmlsZSA9IHRtcGZpbGUoKTsKLQotICAgaWYgKHNwcml0ZS0+ZmlsZSAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2ltYWdlIHNhdmU7Ci0KLSAgICAgIG1lbXNldCgmc2F2ZSwgMCwgc2l6ZW9mIHNhdmUpOwotICAgICAgc2F2ZS52ZXJzaW9uID0gUE5HX0lNQUdFX1ZFUlNJT047Ci0gICAgICBzYXZlLm9wYXF1ZSA9IE5VTEw7Ci0gICAgICBzYXZlLndpZHRoID0gc3ByaXRlLT53aWR0aDsKLSAgICAgIHNhdmUuaGVpZ2h0ID0gc3ByaXRlLT5oZWlnaHQ7Ci0gICAgICBzYXZlLmZvcm1hdCA9IFBOR19GT1JNQVRfTElORUFSX1JHQl9BTFBIQTsKLSAgICAgIHNhdmUuZmxhZ3MgPSBQTkdfSU1BR0VfRkxBR19GQVNUOwotICAgICAgc2F2ZS5jb2xvcm1hcF9lbnRyaWVzID0gMDsKLQotICAgICAgaWYgKHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygmc2F2ZSwgc3ByaXRlLT5maWxlLCAxLypjb252ZXJ0X3RvXzhfYml0Ki8sCi0gICAgICAgICAgc3ByaXRlLT5idWZmZXIsIDAvKnJvd19zdHJpZGUqLywgTlVMTC8qY29sb3JtYXAqLykpCi0gICAgICB7Ci0gICAgICAgICAvKiBTdWNjZXNzOyB0aGUgYnVmZmVyIGlzIG5vIGxvbmdlciBuZWVkZWQ6ICovCi0gICAgICAgICBmcmVlKHNwcml0ZS0+YnVmZmVyKTsKLSAgICAgICAgIHNwcml0ZS0+YnVmZmVyID0gTlVMTDsKLSAgICAgICAgIHJldHVybiAxOyAvKiBvayAqLwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6IHdyaXRlIHNwcml0ZSAlczogJXNcbiIsIHNwcml0ZS0+bmFtZSwKLSAgICAgICAgICAgIHNhdmUubWVzc2FnZSk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3Zlcjogc3ByaXRlICVzOiBjb3VsZCBub3QgYWxsb2NhdGUgdG1wZmlsZTogJXNcbiIsCi0gICAgICAgICBzcHJpdGUtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgIHJldHVybiAwOyAvKiBmYWlsICovCi19Ci0KLXN0YXRpYyBpbnQKLWFkZF9zcHJpdGUocG5nX2ltYWdlcCBvdXRwdXQsIHBuZ19ieXRlcCBvdXRfYnVmLCBzdHJ1Y3Qgc3ByaXRlICpzcHJpdGUsCi0gICBpbnQgKmFyZ2MsIGNvbnN0IGNoYXIgKioqYXJndikKLXsKLSAgIC8qIEdpdmVuIGEgLS1hZGQgYXJndW1lbnQgbmFtaW5nIHRoaXMgc3ByaXRlLCBwZXJmb3JtIHRoZSBvcGVyYXRpb25zIGxpc3RlZAotICAgICogaW4gdGhlIGZvbGxvd2luZyBhcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBmb3JtCi0gICAgKiAoeCx5KSwgd2hpY2ggaXMganVzdCBhbiBvZmZzZXQgYXQgd2hpY2ggdG8gYWRkIHRoZSBzcHJpdGUgdG8gdGhlCi0gICAgKiBvdXRwdXQuCi0gICAgKi8KLSAgIHdoaWxlICgqYXJnYyA+IDApCi0gICB7Ci0gICAgICBjaGFyIHRvbWJzdG9uZTsKLSAgICAgIGludCB4LCB5OwotCi0gICAgICBpZiAoKCphcmd2KVswXVswXSA9PSAnLScgJiYgKCphcmd2KVswXVsxXSA9PSAnLScpCi0gICAgICAgICByZXR1cm4gMTsgLyogc3VjY2VzcyAqLwotCi0gICAgICBpZiAoc3NjYW5mKCgqYXJndilbMF0sICIlZCwlZCVjIiwgJngsICZ5LCAmdG9tYnN0b25lKSA9PSAyKQotICAgICAgewotICAgICAgICAgLyogTm93IGFkZCB0aGUgbmV3IGltYWdlIGludG8gdGhlIHNwcml0ZSBkYXRhLCBidXQgb25seSBpZiBpdAotICAgICAgICAgICogd2lsbCBmaXQuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fAotICAgICAgICAgICAgICh1bnNpZ25lZCkvKlNBRkUqL3ggPj0gb3V0cHV0LT53aWR0aCB8fAotICAgICAgICAgICAgICh1bnNpZ25lZCkvKlNBRkUqL3kgPj0gb3V0cHV0LT5oZWlnaHQgfHwKLSAgICAgICAgICAgICBzcHJpdGUtPndpZHRoID4gb3V0cHV0LT53aWR0aC14IHx8Ci0gICAgICAgICAgICAgc3ByaXRlLT5oZWlnaHQgPiBvdXRwdXQtPmhlaWdodC15KQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiBzcHJpdGUgJXMgQCAoJWQsJWQpIG91dHNpZGUgaW1hZ2VcbiIsCi0gICAgICAgICAgICAgICBzcHJpdGUtPm5hbWUsIHgsIHkpOwotICAgICAgICAgICAgLyogQ291bGQganVzdCBza2lwIHRoaXMsIGJ1dCBmb3IgdGhlIG1vbWVudCBpdCBpcyBhbiBlcnJvciAqLwotICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGVycm9yICovCi0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNpbmNlIHdlIGtub3cgdGhlIHNwcml0ZSBmaXRzIHdlIGNhbiBqdXN0IHJlYWQgaXQgaW50byB0aGUKLSAgICAgICAgICAgICAqIG91dHB1dCB1c2luZyB0aGUgc2ltcGxpZmllZCBBUEkuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBuZ19pbWFnZSBpbjsKLQotICAgICAgICAgICAgaW4udmVyc2lvbiA9IFBOR19JTUFHRV9WRVJTSU9OOwotICAgICAgICAgICAgcmV3aW5kKHNwcml0ZS0+ZmlsZSk7Ci0KLSAgICAgICAgICAgIGlmIChwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvKCZpbiwgc3ByaXRlLT5maWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGluLmZvcm1hdCA9IFBOR19GT1JNQVRfUkdCOyAvKiBmb3JjZSBjb21wb3NlICovCi0KLSAgICAgICAgICAgICAgIGlmIChwbmdfaW1hZ2VfZmluaXNoX3JlYWQoJmluLCBOVUxMLypiYWNrZ3JvdW5kKi8sCi0gICAgICAgICAgICAgICAgICBvdXRfYnVmICsgKHkqb3V0cHV0LT53aWR0aCArIHgpKjMvKlJHQiovLAotICAgICAgICAgICAgICAgICAgb3V0cHV0LT53aWR0aCozLypyb3dfc3RyaWRlKi8sCi0gICAgICAgICAgICAgICAgICBOVUxMLypjb2xvcm1hcCBmb3IgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKi8pKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKysqYXJndiwgLS0qYXJnYzsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBUaGUgcmVhZCBmYWlsZWQ6ICovCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6IGFkZCBzcHJpdGUgJXM6ICVzXG4iLCBzcHJpdGUtPm5hbWUsCi0gICAgICAgICAgICAgICAgaW4ubWVzc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsgLyogZXJyb3IgKi8KLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAtLWFkZD0nJXMnOiBpbnZhbGlkIHBvc2l0aW9uICVzXG4iLAotICAgICAgICAgICAgICAgc3ByaXRlLT5uYW1lLCAoKmFyZ3YpWzBdKTsKLSAgICAgICAgIHJldHVybiAwOyAvKiBlcnJvciAqLwotICAgICAgfQotICAgfQotCi0gICByZXR1cm4gMTsgLyogb2sgKi8KLX0KLQotc3RhdGljIGludAotc2ltcGxlb3Zlcl9wcm9jZXNzKHBuZ19pbWFnZXAgb3V0cHV0LCBwbmdfYnl0ZXAgb3V0X2J1ZiwgaW50IGFyZ2MsCi0gICBjb25zdCBjaGFyICoqYXJndikKLXsKLSAgIGludCByZXN1bHQgPSAxOyAvKiBzdWNjZXNzICovCi0jICBkZWZpbmUgY3Nwcml0ZXMgMTAvKmxpbWl0Ki8KLSMgIGRlZmluZSBzdHIoYSkgI2EKLSAgIGludCBuc3ByaXRlcyA9IDA7Ci0gICBzdHJ1Y3Qgc3ByaXRlIHNwcml0ZXNbY3Nwcml0ZXNdOwotCi0gICB3aGlsZSAoYXJnYyA+IDApCi0gICB7Ci0gICAgICByZXN1bHQgPSAwOyAvKiBmYWlsICovCi0KLSAgICAgIGlmIChzdHJuY21wKGFyZ3ZbMF0sICItLXNwcml0ZT0iLCA5KSA9PSAwKQotICAgICAgewotICAgICAgICAgY2hhciB0b21ic3RvbmU7Ci0KLSAgICAgICAgIGlmIChuc3ByaXRlcyA8IGNzcHJpdGVzKQotICAgICAgICAgewotICAgICAgICAgICAgaW50IG47Ci0KLSAgICAgICAgICAgIHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoID0gc3ByaXRlc1tuc3ByaXRlc10uaGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIHNwcml0ZXNbbnNwcml0ZXNdLm5hbWVbMF0gPSAwOwotCi0gICAgICAgICAgICBuID0gc3NjYW5mKGFyZ3ZbMF0sICItLXNwcml0ZT0ldSwldSwlIiBzdHIoc3ByaXRlX25hbWVfY2hhcnMpICJzJWMiLAotICAgICAgICAgICAgICAgICZzcHJpdGVzW25zcHJpdGVzXS53aWR0aCwgJnNwcml0ZXNbbnNwcml0ZXNdLmhlaWdodCwKLSAgICAgICAgICAgICAgICBzcHJpdGVzW25zcHJpdGVzXS5uYW1lLCAmdG9tYnN0b25lKTsKLQotICAgICAgICAgICAgaWYgKChuID09IDIgfHwgbiA9PSAzKSAmJgotICAgICAgICAgICAgICAgIHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoID4gMCAmJiBzcHJpdGVzW25zcHJpdGVzXS5oZWlnaHQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zl9zaXplLCB0bXA7Ci0KLSAgICAgICAgICAgICAgIC8qIERlZmF1bHQgYSBuYW1lIGlmIG5vdCBnaXZlbi4gKi8KLSAgICAgICAgICAgICAgIGlmIChzcHJpdGVzW25zcHJpdGVzXS5uYW1lWzBdID09IDApCi0gICAgICAgICAgICAgICAgICBzcHJpbnRmKHNwcml0ZXNbbnNwcml0ZXNdLm5hbWUsICJzcHJpdGUtJWQiLCBuc3ByaXRlcysxKTsKLQotICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBzcHJpdGUgYW5kIGNhbGN1bGF0ZSB0aGUgYnVmZmVyCi0gICAgICAgICAgICAgICAgKiBzaXplOgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBidWZfc2l6ZSA9IHNpemVvZiAocG5nX3VpbnRfMTYgWzRdKTsKLSAgICAgICAgICAgICAgIGJ1Zl9zaXplICo9IHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoOwotICAgICAgICAgICAgICAgYnVmX3NpemUgKj0gc3ByaXRlc1tuc3ByaXRlc10uaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAvKiBUaGlzIGNhbiBvdmVyZmxvdyBhIChzaXplX3QpOyBjaGVjayBmb3IgdGhpczogKi8KLSAgICAgICAgICAgICAgIHRtcCA9IGJ1Zl9zaXplOwotICAgICAgICAgICAgICAgdG1wIC89IHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoOwotICAgICAgICAgICAgICAgdG1wIC89IHNwcml0ZXNbbnNwcml0ZXNdLmhlaWdodDsKLQotICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBzaXplb2YgKHBuZ191aW50XzE2IFs0XSkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzcHJpdGVzW25zcHJpdGVzXS5idWZmZXIgPSBtYWxsb2MoYnVmX3NpemUpOwotICAgICAgICAgICAgICAgICAgLyogVGhpcyBidWZmZXIgbXVzdCBiZSBpbml0aWFsaXplZCB0byB0cmFuc3BhcmVudDogKi8KLSAgICAgICAgICAgICAgICAgIG1lbXNldChzcHJpdGVzW25zcHJpdGVzXS5idWZmZXIsIDAsIGJ1Zl9zaXplKTsKLQotICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZXNbbnNwcml0ZXNdLmJ1ZmZlciAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3ByaXRlc1tuc3ByaXRlc10uZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICArK2FyZ3YsIC0tYXJnYzsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZV9zcHJpdGUoc3ByaXRlcytuc3ByaXRlcysrLCAmYXJnYywgJmFyZ3YpKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsgLyogc3RpbGwgb2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgLyogT3ZlcmZsb3csIG9yIE9PTSAqLwotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAlczogc3ByaXRlIHRvbyBsYXJnZVxuIiwgYXJndlswXSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAlczogaW52YWxpZCBzcHJpdGUgKCV1LCV1KVxuIiwKLSAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIHNwcml0ZXNbbnNwcml0ZXNdLndpZHRoLCBzcHJpdGVzW25zcHJpdGVzXS5oZWlnaHQpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogJXM6IHRvbyBtYW55IHNwcml0ZXNcbiIsIGFyZ3ZbMF0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAoYXJndlswXSwgIi0tYWRkPSIsIDYpID09IDApCi0gICAgICB7Ci0gICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gYXJndlswXSs2OwotICAgICAgICAgaW50IGlzcHJpdGUgPSBuc3ByaXRlczsKLQotICAgICAgICAgKythcmd2LCAtLWFyZ2M7Ci0KLSAgICAgICAgIHdoaWxlICgtLWlzcHJpdGUgPj0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAoc3ByaXRlc1tpc3ByaXRlXS5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKCFhZGRfc3ByaXRlKG91dHB1dCwgb3V0X2J1Ziwgc3ByaXRlcytpc3ByaXRlLCAmYXJnYywgJmFyZ3YpKQotICAgICAgICAgICAgICAgICAgZ290byBvdXQ7IC8qIGVycm9yIGluIGFkZF9zcHJpdGUgKi8KLQotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChpc3ByaXRlIDwgMCkgLyogc3ByaXRlIG5vdCBmb3VuZCAqLwotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiAtLWFkZD0nJXMnOiBzcHJpdGUgbm90IGZvdW5kXG4iLCBuYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6ICVzOiB1bnJlY29nbml6ZWQgb3BlcmF0aW9uXG4iLCBhcmd2WzBdKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICByZXN1bHQgPSAxOyAvKiBvayAgKi8KLSAgIH0KLQotICAgLyogQ2xlYW4gdXAgdGhlIGNhY2hlIG9mIHNwcml0ZXM6ICovCi1vdXQ6Ci0gICB3aGlsZSAoLS1uc3ByaXRlcyA+PSAwKQotICAgewotICAgICAgaWYgKHNwcml0ZXNbbnNwcml0ZXNdLmJ1ZmZlciAhPSBOVUxMKQotICAgICAgICAgZnJlZShzcHJpdGVzW25zcHJpdGVzXS5idWZmZXIpOwotCi0gICAgICBpZiAoc3ByaXRlc1tuc3ByaXRlc10uZmlsZSAhPSBOVUxMKQotICAgICAgICAgKHZvaWQpZmNsb3NlKHNwcml0ZXNbbnNwcml0ZXNdLmZpbGUpOwotICAgfQotCi0gICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCi17Ci0gICBpbnQgcmVzdWx0ID0gMTsgLyogZGVmYXVsdCB0byBmYWlsICovCi0KLSAgIGlmIChhcmdjID49IDIpCi0gICB7Ci0gICAgICBpbnQgYXJnaSA9IDI7Ci0gICAgICBjb25zdCBjaGFyICpvdXRwdXQgPSBOVUxMOwotICAgICAgcG5nX2ltYWdlIGltYWdlOwotCi0gICAgICBpZiAoYXJnYyA+IDIgJiYgYXJndlsyXVswXSAhPSAnLScvKmFuIG9wZXJhdGlvbiovKQotICAgICAgewotICAgICAgICAgb3V0cHV0ID0gYXJndlsyXTsKLSAgICAgICAgIGFyZ2kgPSAzOwotICAgICAgfQotCi0gICAgICBpbWFnZS52ZXJzaW9uID0gUE5HX0lNQUdFX1ZFUlNJT047Ci0gICAgICBpbWFnZS5vcGFxdWUgPSBOVUxMOwotCi0gICAgICBpZiAocG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlKCZpbWFnZSwgYXJndlsxXSkpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgYnVmZmVyOwotCi0gICAgICAgICBpbWFnZS5mb3JtYXQgPSBQTkdfRk9STUFUX1JHQjsgLyogMjQtYml0IFJHQiAqLwotCi0gICAgICAgICBidWZmZXIgPSBtYWxsb2MoUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKLQotICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2NvbG9yIGJhY2tncm91bmQgPSB7MCwgMHhmZiwgMH07IC8qIGZ1bGx5IHNhdHVyYXRlZCBncmVlbiAqLwotCi0gICAgICAgICAgICBpZiAocG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCZpbWFnZSwgJmJhY2tncm91bmQsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgIDAvKnJvd19zdHJpZGUqLywgTlVMTC8qY29sb3JtYXAgZm9yIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCAqLykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBBdCB0aGlzIHBvaW50IHBuZ19pbWFnZV9maW5pc2hfcmVhZCBoYXMgY2xlYW5lZCB1cCB0aGUKLSAgICAgICAgICAgICAgICAqIGFsbG9jYXRlZCBkYXRhIGluIHBuZ19pbWFnZSwgYW5kIG9ubHkgdGhlIGJ1ZmZlciBuZWVkcyB0byBiZQotICAgICAgICAgICAgICAgICogZnJlZWQuCi0gICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgcmVtYWluaW5nIG9wZXJhdGlvbnM6Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGlmIChzaW1wbGVvdmVyX3Byb2Nlc3MoJmltYWdlLCBidWZmZXIsIGFyZ2MtYXJnaSwgYXJndithcmdpKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIHRoZSBvdXRwdXQ6ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKG91dHB1dCAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbWFnZV93cml0ZV90b19maWxlKCZpbWFnZSwgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgMC8qY29udmVydF90b184Yml0Ki8sIGJ1ZmZlciwgMC8qcm93X3N0cmlkZSovLAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qY29sb3JtYXAqLykpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKG91dHB1dCA9PSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygmaW1hZ2UsIHN0ZG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAvKmNvbnZlcnRfdG9fOGJpdCovLCBidWZmZXIsIDAvKnJvd19zdHJpZGUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKmNvbG9ybWFwKi8pKSkKLSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3Zlcjogd3JpdGUgJXM6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID09IE5VTEwgPyAic3Rkb3V0IiA6IG91dHB1dCwgaW1hZ2UubWVzc2FnZSk7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIC8qIGVsc2Ugc2ltcGxlb3Zlcl9wcm9jZXNzIHdyaXRlcyBhbiBlcnJvciBtZXNzYWdlICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2ltcGxlb3ZlcjogcmVhZCAlczogJXNcbiIsIGFyZ3ZbMV0sCi0gICAgICAgICAgICAgICAgICAgaW1hZ2UubWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzaW1wbGVvdmVyOiBvdXQgb2YgbWVtb3J5OiAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylQTkdfSU1BR0VfU0laRShpbWFnZSkpOwotCi0gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIGEgJ2ZyZWUnIGlzIHJlcXVpcmVkOyBsaWJwbmcgZG9lcwotICAgICAgICAgICAgICogdGhlIGNsZWFudXAgb24gZXJyb3IgYW5kIHN1Y2Nlc3MsIGJ1dCBpbiB0aGlzIGNhc2Ugd2UgY291bGRuJ3QKLSAgICAgICAgICAgICAqIGNvbXBsZXRlIHRoZSByZWFkIGJlY2F1c2Ugb2YgcnVubmluZyBvdXQgb2YgbWVtb3J5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwbmdfaW1hZ2VfZnJlZSgmaW1hZ2UpOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvKiBGYWlsZWQgdG8gcmVhZCB0aGUgZmlyc3QgYXJndW1lbnQ6ICovCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNpbXBsZW92ZXI6ICVzOiAlc1xuIiwgYXJndlsxXSwgaW1hZ2UubWVzc2FnZSk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIC8qIFVzYWdlIG1lc3NhZ2UgKi8KLSAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgInNpbXBsZW92ZXI6IHVzYWdlOiBzaW1wbGVvdmVyIGJhY2tncm91bmQucG5nIFtvdXRwdXQucG5nXVxuIgotICAgICAgICAgIiAgT3V0cHV0ICdiYWNrZ3JvdW5kLnBuZycgYXMgYSAyNC1iaXQgUkdCIFBORyBmaWxlIGluICdvdXRwdXQucG5nJ1xuIgotICAgICAgICAgIiAgIG9yLCBpZiBub3QgZ2l2ZW4sIHN0ZG91dC4gICdiYWNrZ3JvdW5kLnBuZycgd2lsbCBiZSBjb21wb3NpdGVkXG4iCi0gICAgICAgICAiICAgb24gZnVsbHkgc2F0dXJhdGVkIGdyZWVuLlxuIgotICAgICAgICAgIlxuIgotICAgICAgICAgIiAgT3B0aW9uYWxseSwgYmVmb3JlIG91dHB1dCwgcHJvY2VzcyBhZGRpdGlvbmFsIFBORyBmaWxlczpcbiIKLSAgICAgICAgICJcbiIKLSAgICAgICAgICIgICAtLXNwcml0ZT13aWR0aCxoZWlnaHQsbmFtZSB7Wy0tYXQ9eCx5XSB7c3ByaXRlLnBuZ319XG4iCi0gICAgICAgICAiICAgIFByb2R1Y2UgYSB0cmFuc3BhcmVudCBzcHJpdGUgb2Ygc2l6ZSAod2lkdGgsaGVpZ2h0KSBhbmQgd2l0aFxuIgotICAgICAgICAgIiAgICAgbmFtZSAnbmFtZScuXG4iCi0gICAgICAgICAiICAgIEZvciBlYWNoIHNwcml0ZS5wbmcgY29tcG9zaXRlIGl0IHVzaW5nIGEgUG9ydGVyLUR1ZmYgJ092ZXInXG4iCi0gICAgICAgICAiICAgICBvcGVyYXRpb24gYXQgb2Zmc2V0ICh4LHkpIGluIHRoZSBzcHJpdGUgKGRlZmF1bHRpbmcgdG8gKDAsMCkpLlxuIgotICAgICAgICAgIiAgICAgSW5wdXQgUE5HcyB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgYXJlYSBvZiB0aGUgc3ByaXRlLlxuIgotICAgICAgICAgIlxuIgotICAgICAgICAgIiAgIC0tYWRkPSduYW1lJyB7eCx5fVxuIgotICAgICAgICAgIiAgICBPcHRpb25hbGx5LCBiZWZvcmUgb3V0cHV0LCBjb21wb3NpdGUgYSBzcHJpdGUsICduYW1lJywgd2hpY2hcbiIKLSAgICAgICAgICIgICAgIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcHJvZHVjZWQgdXNpbmcgLS1zcHJpdGUsIGF0IGVhY2hcbiIKLSAgICAgICAgICIgICAgIG9mZnNldCAoeCx5KSBpbiB0aGUgb3V0cHV0IGltYWdlLiAgRWFjaCBzcHJpdGUgbXVzdCBmaXRcbiIKLSAgICAgICAgICIgICAgIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBvdXRwdXQgaW1hZ2UuXG4iCi0gICAgICAgICAiXG4iCi0gICAgICAgICAiICBQTkcgZmlsZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIgdGhleSBvY2N1ciBvbiB0aGUgY29tbWFuZFxuIgotICAgICAgICAgIiAgbGluZSBhbmQgdGh1cyB0aGUgZmlyc3QgUE5HIHByb2Nlc3NlZCBhcHBlYXJzIGFzIHRoZSBib3R0b21tb3N0XG4iCi0gICAgICAgICAiICBpbiB0aGUgb3V0cHV0IGltYWdlLlxuIik7Ci0gICB9Ci0KLSAgIHJldHVybiByZXN1bHQ7Ci19Ci0jZW5kaWYgLyogU0lNUExJRklFRF9SRUFEICovCmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL0NPUFlJTkcgYi9jb250cmliL2dyZWdib29rL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZTk3NzQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9ncmVnYm9vay9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLSAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9ncmVnYm9vay9MSUNFTlNFIGIvY29udHJpYi9ncmVnYm9vay9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU2NzE3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5taW5ndzMyIGIvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS5taW5ndzMyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTNmZjYwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUubWluZ3czMgorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0jIFNhbXBsZSBtYWtlZmlsZSBmb3IgcnBuZy13aW4gLyBycG5nMi13aW4gLyB3cG5nIHVzaW5nIG1pbmd3MzItZ2NjIGFuZCBtYWtlLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDIgSnVuZSAyMDA3Ci0jCi0jCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCi0jCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCi0jCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBXZWxsLCBPSywgaXQncyBub3QKLSMJZ2VuZXJhbGx5IGZvciBzYWxlIGFueW1vcmUsIGJ1dCBpdCdzIHRoZSB0aG91Z2h0IHRoYXQgY291bnRzLAotIwlyaWdodD8gIChIaW50OiAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay8gKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgRE9TLXByb21wdCB3aW5kb3cgdmlhOgotIwotIwltYWtlIC1mIE1ha2VmaWxlLm1pbmd3MzIKLSMKLSMgVGhpcyBtYWtlZmlsZSBhc3N1bWVzIGxpYnBuZyBhbmQgemxpYiBoYXZlIGFscmVhZHkgYmVlbiBidWlsdCBvciBkb3dubG9hZGVkCi0jIGFuZCBhcmUgaW4gc3ViZGlyZWN0b3JpZXMgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIGN1cnJlbnQgc3ViZGlyZWN0b3J5Ci0jIChhcyBpbmRpY2F0ZWQgYnkgdGhlIFBOR0RJUiBhbmQgWkRJUiBtYWNyb3MgYmVsb3cpLiAgSXQgbWFrZXMgbm8gYXNzdW1wdGlvbnMKLSMgYXQgYWxsIGFib3V0IHRoZSBtaW5ndzMyIGluc3RhbGxhdGlvbiB0cmVlIChXMzJESVIpLiAgRWRpdCBhcyBhcHByb3ByaWF0ZS4KLSMKLSMgTm90ZSB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBhbmQgc3RhdGljIGxpYnBuZyBhbmQgemxpYiBsaWJyYXJpZXMKLSMgdXNlZCBiZWxvdyBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuICBUaGlzIG1ha2VmaWxlCi0jIGJ1aWxkcyBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcyBieSBkZWZhdWx0LgotIyAoWW91IG5lZWQgb25seSBvbmUgc2V0LCBidXQgZm9yIHRlc3RpbmcgaXQgY2FuIGJlIGhhbmR5IHRvIGhhdmUgYm90aC4pCi0KLQotIyBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI1BOR0RJUiA9IC4uLy4uIwkJZm9yIGxpYnBuZy14Lnkuei9jb250cmliL2dyZWdib29rIGJ1aWxkcwotUE5HRElSID0gLi4vbGlicG5nLXdpbjMyCi1QTkdJTkMgPSAtSSQoUE5HRElSKQotUE5HTElCZCA9ICQoUE5HRElSKS9saWJwbmcuZGxsLmEJIyBkeW5hbWljYWxseSBsaW5rZWQKLVBOR0xJQnMgPSAkKFBOR0RJUikvbGlicG5nLmEJCSMgc3RhdGljYWxseSBsaW5rZWQsIGxvY2FsIGxpYnBuZwotCi0jWkRJUiA9IC4uLy4uLy4uL3psaWItd2luMzIjCWZvciBsaWJwbmcteC55LnovY29udHJpYi9ncmVnYm9vayBidWlsZHMKLVpESVIgPSAuLi96bGliLXdpbjMyCi1aSU5DID0gLUkkKFpESVIpCi1aTElCZCA9ICQoWkRJUikvbGliemRsbC5hCi1aTElCcyA9ICQoWkRJUikvbGliei5hCi0KLSMgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIHBhdGggd2hlcmUgbWluZ3czMiBpbnN0YWxscyBpdHMgc3R1ZmY6Ci1XMzJESVIgPQotI1czMkRJUiA9IC91c3IvbG9jYWwvY3Jvc3MtdG9vbHMvaTM4Ni1taW5ndzMybXN2YwotVzMySU5DID0gLUkkKFczMkRJUikvaW5jbHVkZQotVzMyTElCID0gJChXMzJESVIpL2xpYi9saWJ1c2VyMzIuYSAkKFczMkRJUikvbGliL2xpYmdkaTMyLmEKLQotQ0MgPSBnY2MKLSNDQyA9IGkzODYtbWluZ3czMm1zdmMtZ2NjICMJZS5nLiwgTGludXggLT4gV2luMzIgY3Jvc3MtY29tcGlsYXRpb24KLUxEID0gJChDQykKLVJNID0gcm0gLWYKLUNQUEZMQUdTID0gJChJTkNTKQotQ0ZMQUdTID0gLU8gLVdhbGwgJChNSU5HV19DQ0ZMQUdTKQotIyBbbm90ZSB0aGF0IC1XYWxsIGlzIGEgZ2NjLXNwZWNpZmljIGNvbXBpbGF0aW9uIGZsYWcgKCJtb3N0IHdhcm5pbmdzIG9uIildCi0jIFstYW5zaSwgLXBlZGFudGljIGFuZCAtVyBjYW4gYWxzbyBiZSB1c2VkXQotTERGTEFHUyA9ICQoTUlOR1dfTERGTEFHUykKLU8gPSAubwotRSA9IC5leGUKLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoVzMySU5DKQotUkxJQlNkID0gJChQTkdMSUJkKSAkKFpMSUJkKSAkKFczMkxJQikgLWxtCi1STElCU3MgPSAkKFBOR0xJQnMpICQoWkxJQnMpICQoVzMyTElCKSAtbG0KLVdMSUJTZCA9ICQoUE5HTElCZCkgJChaTElCZCkKLVdMSUJTcyA9ICQoUE5HTElCcykgJChaTElCcykKLQotUlBORyAgID0gcnBuZy13aW4KLVJQTkcyICA9IHJwbmcyLXdpbgotV1BORyAgID0gd3BuZwotCi1ST0JKU2QgID0gJChSUE5HKSQoTykgcmVhZHBuZy5waWMkKE8pCi1ST0JKUzJkID0gJChSUE5HMikkKE8pIHJlYWRwbmcyLnBpYyQoTykKLVdPQkpTZCAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZy5waWMkKE8pCi0KLVJQTkdzICA9ICQoUlBORyktc3RhdGljCi1SUE5HMnMgPSAkKFJQTkcyKS1zdGF0aWMKLVdQTkdzICA9ICQoV1BORyktc3RhdGljCi0KLVJPQkpTcyAgPSAkKFJQTkcpJChPKSByZWFkcG5nJChPKQotUk9CSlMycyA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKLVdPQkpTcyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKLQotU1RBVElDX0VYRVMgID0gJChSUE5HcykkKEUpICQoUlBORzJzKSQoRSkgJChXUE5HcykkKEUpCi1EWU5BTUlDX0VYRVMgPSAkKFJQTkcpJChFKSAkKFJQTkcyKSQoRSkgJChXUE5HKSQoRSkKLQotRVhFUyA9ICQoU1RBVElDX0VYRVMpICQoRFlOQU1JQ19FWEVTKQotCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKLQotJS5waWMkKE8pOiAlLmMKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLURQTkdfQlVJTERfRExMIC1vICRAICQ8Ci0KLQotIyBkZXBlbmRlbmNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAgJChFWEVTKQotCi0kKFJQTkdzKSQoRSk6ICQoUk9CSlNzKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKU3MpICQoUkxJQlNzKQotCi0kKFJQTkcpJChFKTogJChST0JKU2QpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFJPQkpTZCkgJChSTElCU2QpCi0KLSQoUlBORzJzKSQoRSk6ICQoUk9CSlMycykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMycykgJChSTElCU3MpCi0KLSQoUlBORzIpJChFKTogJChST0JKUzJkKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzJkKSAkKFJMSUJTZCkKLQotJChXUE5HcykkKEUpOiAkKFdPQkpTcykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoV09CSlNzKSAkKFdMSUJTcykKLQotJChXUE5HKSQoRSk6ICQoV09CSlNkKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChXT0JKU2QpICQoV0xJQlNkKQotCi0kKFJQTkcpJChPKToJJChSUE5HKS5jIHJlYWRwbmcuaAotJChSUE5HMikkKE8pOgkkKFJQTkcyKS5jIHJlYWRwbmcyLmgKLSQoV1BORykkKE8pOgkkKFdQTkcpLmMgd3JpdGVwbmcuaAotCi1yZWFkcG5nJChPKSByZWFkcG5nLnBpYyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKLXJlYWRwbmcyJChPKSByZWFkcG5nMi5waWMkKE8pOglyZWFkcG5nMi5jIHJlYWRwbmcyLmgKLXdyaXRlcG5nJChPKSB3cml0ZXBuZy5waWMkKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKLQotCi0jIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGVhbjoKLQkkKFJNKSAkKEVYRVMpCi0JJChSTSkgJChST0JKU3MpICQoUk9CSlMycykgJChXT0JKU3MpCi0JJChSTSkgJChST0JKU2QpICQoUk9CSlMyZCkgJChXT0JKU2QpCmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnNnaSBiL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUuc2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ2MWI0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUuc2dpCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLSMgU2FtcGxlIG1ha2VmaWxlIGZvciBycG5nLXggLyBycG5nMi14IC8gd3BuZyBmb3IgU0dJIHVzaW5nIGNjIGFuZCBtYWtlLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDcgTWFyY2ggMjAwMgotIwotIwlUaGUgcHJvZ3JhbXMgYnVpbHQgYnkgdGhpcyBtYWtlZmlsZSBhcmUgZGVzY3JpYmVkIGluIHRoZSBib29rLAotIwkiUE5HOiAgVGhlIERlZmluaXRpdmUgR3VpZGUsIiBieSBHcmVnIFJvZWxvZnMgKE8nUmVpbGx5IGFuZAotIwlBc3NvY2lhdGVzLCAxOTk5KS4gIEdvIGJ1eSBhIGNvcHksIGVoPyAgQnV5IHNvbWUgZm9yIGZyaWVuZHMKLSMJYW5kIGZhbWlseSwgdG9vLiAgKE5vdCB0aGF0IHRoaXMgaXMgYSBibGF0YW50IHBsdWcgb3IgYW55dGhpbmcuKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgc2hlbGwgcHJvbXB0IGluIHRoZSB1c3VhbCB3YXk7IGZvciBleGFtcGxlOgotIwotIwltYWtlIC1mIE1ha2VmaWxlLnNnaQotIwotIyBUaGlzIG1ha2VmaWxlIGFzc3VtZXMgbGlicG5nIGFuZCB6bGliIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0IG9yIGRvd25sb2FkZWQKLSMgYW5kIGFyZSBib3RoIGluc3RhbGxlZCBpbiAvdXNyL2xvY2FsL3tpbmNsdWRlLGxpYn0gKGFzIGluZGljYXRlZCBieSB0aGUKLSMgUE5HKiBhbmQgWiogbWFjcm9zIGJlbG93KS4gIEVkaXQgYXMgYXBwcm9wcmlhdGUtLWNob29zZSBvbmx5IE9ORSBlYWNoIG9mCi0jIHRoZSBQTkdJTkMsIFBOR0xJQiwgWklOQyBhbmQgWkxJQiBsaW5lcy4KLSMKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzIChhZ2FpbnN0IGxpYnBuZyBhbmQgemxpYiwKLSMgdGhhdCBpcyksIGJ1dCB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHVuY29tbWVudGluZyB0aGUgYXBwcm9wcmlhdGUgUE5HTElCIGFuZAotIyBaTElCIGxpbmVzLgotCi0KLSMgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBOR0lOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlL2xpYnBuZzE2Ci1QTkdMSUIgPSAtTC91c3IvbG9jYWwvbGliIC1scG5nMTYJICAjIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYnBuZwotI1BOR0xJQiA9IC91c3IvbG9jYWwvbGliL2xpYnBuZzE2LmEgIyBzdGF0aWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYnBuZwotIyBvcjoKLSNQTkdJTkMgPSAtSS4uLy4uCi0jUE5HTElCID0gLUwuLi8uLiAtbHBuZwotI1BOR0xJQiA9IC4uLy4uL2xpYnBuZy5hCi0KLVpJTkMgPSAtSS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQiA9IC1ML3Vzci9sb2NhbC9saWIgLWx6CQkjIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IHpsaWIKLSNaTElCID0gL3Vzci9sb2NhbC9saWIvbGliei5hCQkjIHN0YXRpY2FsbHkgbGlua2VkIGFnYWluc3QgemxpYgotI1pJTkMgPSAtSS4uL3psaWIKLSNaTElCID0gLUwuLi96bGliIC1segotI1pMSUIgPSAuLi8uLi8uLi96bGliL2xpYnouYQotCi1YSU5DID0gLUkvdXNyL2luY2x1ZGUvWDExCQkjIG9sZC1zdHlsZSwgc3RvY2sgWCBkaXN0cmlidXRpb25zCi1YTElCID0gLUwvdXNyL2xpYi9YMTEgLWxYMTEKLSNYSU5DID0gLUkvdXNyL29wZW53aW4vaW5jbHVkZSAgICAJIyBTdW4gd29ya3N0YXRpb25zIChPcGVuV2luZG93cykKLSNYTElCID0gLUwvdXNyL29wZW53aW4vbGliIC1sWDExCi0jWElOQyA9IC1JL3Vzci9YMTFSNi9pbmNsdWRlCQkjIG5ldyBYIGRpc3RyaWJ1dGlvbnMgKFhGcmVlODYsIGV0Yy4pCi0jWExJQiA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEKLQotSU5DUyA9ICQoUE5HSU5DKSAkKFpJTkMpICQoWElOQykKLVJMSUJTID0gJChQTkdMSUIpICQoWkxJQikgJChYTElCKSAtbG0KLVdMSUJTID0gJChQTkdMSUIpICQoWkxJQikKLQotQ0MgPSBjYwotTEQgPSBjYwotUk0gPSBybSAtZgotIyBBQkkgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGF0IHVzZWQgdG8gYnVpbGQgbGlicG5nLgotQUJJID0KLUNQUEZMQUdTID0KLUNGTEFHUyA9ICQoQUJJKSAtTyAtZnVsbHdhcm4gJChJTkNTKQotTERGTEFHUyA9ICQoQUJJKQotTyA9IC5vCi1FID0KLQotUlBORyAgPSBycG5nLXgKLVJQTkcyID0gcnBuZzIteAotV1BORyAgPSB3cG5nCi0KLVJPQkpTICA9ICQoUlBORykkKE8pIHJlYWRwbmckKE8pCi1ST0JKUzIgPSAkKFJQTkcyKSQoTykgcmVhZHBuZzIkKE8pCi1XT0JKUyAgPSAkKFdQTkcpJChPKSB3cml0ZXBuZyQoTykKLQotRVhFUyA9ICQoUlBORykkKEUpICQoUlBORzIpJChFKSAkKFdQTkcpJChFKQotCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKLQotCi0jIGRlcGVuZGVuY2llcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hbGw6ICAkKEVYRVMpCi0KLSQoUlBORykkKEUpOiAkKFJPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUykgJChSTElCUykKLQotJChSUE5HMikkKEUpOiAkKFJPQkpTMikKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoUk9CSlMyKSAkKFJMSUJTKQotCi0kKFdQTkcpJChFKTogJChXT0JKUykKLQkkKExEKSAkKExERkxBR1MpIC1vICRAICQoV09CSlMpICQoV0xJQlMpCi0KLSQoUlBORykkKE8pOgkkKFJQTkcpLmMgcmVhZHBuZy5oCi0kKFJQTkcyKSQoTyk6CSQoUlBORzIpLmMgcmVhZHBuZzIuaAotJChXUE5HKSQoTyk6CSQoV1BORykuYyB3cml0ZXBuZy5oCi0KLXJlYWRwbmckKE8pOglyZWFkcG5nLmMgcmVhZHBuZy5oCi1yZWFkcG5nMiQoTyk6CXJlYWRwbmcyLmMgcmVhZHBuZzIuaAotd3JpdGVwbmckKE8pOgl3cml0ZXBuZy5jIHdyaXRlcG5nLmgKLQotCi0jIG1haW50ZW5hbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGVhbjoKLQkkKFJNKSAkKEVYRVMpICQoUk9CSlMpICQoUk9CSlMyKSAkKFdPQkpTKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9ncmVnYm9vay9NYWtlZmlsZS51bnggYi9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnVueApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3M2UwMy4uMDAwMDAwMAotLS0gYS9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnVueAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0jIFNhbXBsZSBtYWtlZmlsZSBmb3IgcnBuZy14IC8gcnBuZzIteCAvIHdwbmcgdXNpbmcgZ2NjIGFuZCBtYWtlLgotIyBHcmVnIFJvZWxvZnMKLSMgTGFzdCBtb2RpZmllZDogIDIgSnVuZSAyMDA3Ci0jCi0jCVRoZSBwcm9ncmFtcyBidWlsdCBieSB0aGlzIG1ha2VmaWxlIGFyZSBkZXNjcmliZWQgaW4gdGhlIGJvb2ssCi0jCSJQTkc6ICBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiIGJ5IEdyZWcgUm9lbG9mcyAoTydSZWlsbHkgYW5kCi0jCUFzc29jaWF0ZXMsIDE5OTkpLiAgR28gYnV5IGEgY29weSwgZWg/ICBXZWxsLCBPSywgaXQncyBub3QKLSMJZ2VuZXJhbGx5IGZvciBzYWxlIGFueW1vcmUsIGJ1dCBpdCdzIHRoZSB0aG91Z2h0IHRoYXQgY291bnRzLAotIwlyaWdodD8gIChIaW50OiAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvYm9vay8gKQotIwotIyBJbnZva2UgdGhpcyBtYWtlZmlsZSBmcm9tIGEgc2hlbGwgcHJvbXB0IGluIHRoZSB1c3VhbCB3YXk7IGZvciBleGFtcGxlOgotIwotIwltYWtlIC1mIE1ha2VmaWxlLnVueAotIwotIyBUaGlzIG1ha2VmaWxlIGFzc3VtZXMgbGlicG5nIGFuZCB6bGliIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0IG9yIGRvd25sb2FkZWQKLSMgYW5kIGFyZSBpbnN0YWxsZWQgaW4gL3Vzci9sb2NhbC97aW5jbHVkZSxsaWJ9IG9yIGFzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYnkKLSMgdGhlIFBORyogYW5kIFoqIG1hY3JvcyBiZWxvdy4gIEVkaXQgYXMgYXBwcm9wcmlhdGUtLWNob29zZSBvbmx5IE9ORSBlYWNoIG9mCi0jIHRoZSBQTkdJTkMsIFBOR0xJQmQsIFBOR0xJQnMsIFpJTkMsIFpMSUJkIGFuZCBaTElCcyBsaW5lcy4KLSMKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBkeW5hbWljYWxseSBhbmQgc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMKLSMgKGFnYWluc3QgbGlicG5nIGFuZCB6bGliLCB0aGF0IGlzKSwgYnV0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgbW9kaWZ5aW5nCi0jIHRoZSAiRVhFUyA9IiBsaW5lLiAgKFlvdSBuZWVkIG9ubHkgb25lIHNldCwgYnV0IGZvciB0ZXN0aW5nIGl0IGNhbiBiZSBoYW5keQotIyB0byBoYXZlIGJvdGguKQotCi0KLSMgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNQTkdESVIgPSAvdXNyL2xvY2FsL2xpYgotI1BOR0lOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlL2xpYnBuZzE2Ci0jUE5HTElCZCA9IC1MJChQTkdESVIpIC1scG5nMTYgIyBkeW5hbWljYWxseSBsaW5rZWQsIGluc3RhbGxlZCBsaWJwbmcKLSNQTkdMSUJzID0gJChQTkdESVIpL2xpYnBuZzE2LmEgIyBzdGF0aWNhbGx5IGxpbmtlZCwgaW5zdGFsbGVkIGxpYnBuZwotIyBvcjoKLVBOR0RJUiA9IC4uLy4uIwl0aGlzIG9uZSBpcyBmb3IgbGlicG5nLXgueS56L2NvbnRyaWIvZ3JlZ2Jvb2sgYnVpbGRzCi0jUE5HRElSID0gLi4vbGlicG5nCi1QTkdJTkMgPSAtSSQoUE5HRElSKQotUE5HTElCZCA9IC1XbCwtcnBhdGgsJChQTkdESVIpIC1MJChQTkdESVIpIC1scG5nMTYJIyBkeW5hbWljYWxseSBsaW5rZWQKLVBOR0xJQnMgPSAkKFBOR0RJUikvbGlicG5nLmEJCSMgc3RhdGljYWxseSBsaW5rZWQsIGxvY2FsIGxpYnBuZwotCi1aRElSID0gL3Vzci9sb2NhbC9saWIKLSNaRElSID0gL3Vzci9saWI2NAotWklOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCZCA9IC1MJChaRElSKSAtbHoJCQkjIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IHpsaWIKLVpMSUJzID0gJChaRElSKS9saWJ6LmEJCQkjIHN0YXRpY2FsbHkgbGlua2VkIGFnYWluc3QgemxpYgotIyBvcjoKLSNaRElSID0gLi4vemxpYgotI1pJTkMgPSAtSSQoWkRJUikKLSNaTElCZCA9IC1XbCwtcnBhdGgsJChaRElSKSAtTCQoWkRJUikgLWx6ICAjIC1ycGF0aCBhbGxvd3MgaW4tcGxhY2UgdGVzdGluZwotI1pMSUJzID0gJChaRElSKS9saWJ6LmEKLQotI1hJTkMgPSAtSS91c3IvaW5jbHVkZQkJCSMgb2xkLXN0eWxlLCBzdG9jayBYIGRpc3RyaWJ1dGlvbnMKLSNYTElCID0gLUwvdXNyL2xpYi9YMTEgLWxYMTEJCSMgIChpbmNsdWRpbmcgU0dJIElSSVgpCi0jWElOQyA9IC1JL3Vzci9vcGVud2luL2luY2x1ZGUJCSMgU3VuIHdvcmtzdGF0aW9ucyAoT3BlbldpbmRvd3MpCi0jWExJQiA9IC1ML3Vzci9vcGVud2luL2xpYiAtbFgxMQotWElOQyA9IC1JL3Vzci9YMTFSNi9pbmNsdWRlCQkjIG5ldyBYIGRpc3RyaWJ1dGlvbnMgKFgub3JnLCBldGMuKQotWExJQiA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEKLSNYTElCID0gLUwvdXNyL1gxMVI2L2xpYjY0IC1sWDExCSMgZS5nLiwgUmVkIEhhdCBvbiBBTUQ2NAotCi1JTkNTID0gJChQTkdJTkMpICQoWklOQykgJChYSU5DKQotUkxJQlNkID0gJChQTkdMSUJkKSAkKFpMSUJkKSAkKFhMSUIpIC1sbQotUkxJQlNzID0gJChQTkdMSUJzKSAkKFpMSUJzKSAkKFhMSUIpIC1sbQotV0xJQlNkID0gJChQTkdMSUJkKSAkKFpMSUJkKSAtbG0KLVdMSUJTcyA9ICQoUE5HTElCcykgJChaTElCcykgLWxtCi0KLUNDID0gZ2NjCi1MRCA9IGdjYwotUk0gPSBybSAtZgotQ1BQRkxBR1MgPSAkKElOQ1MpIC1ERkVBVFVSRV9MT09QCi1DRkxBR1MgPSAtTyAtV2FsbAotI0NGTEFHUyA9IC1PIC1XIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljIC1hbnNpCi0jIFtub3RlIHRoYXQgLVdhbGwgaXMgYSBnY2Mtc3BlY2lmaWMgY29tcGlsYXRpb24gZmxhZyAoIm1vc3Qgd2FybmluZ3Mgb24iKV0KLSMgWy1hbnNpLCAtcGVkYW50aWMsIC1XZXh0cmEsIGFuZCAtVyBjYW4gYWxzbyBiZSB1c2VkXQotTERGTEFHUyA9Ci1PID0gLm8KLUUgPQotCi1SUE5HICAgPSBycG5nLXgKLVJQTkcyICA9IHJwbmcyLXgKLVdQTkcgICA9IHdwbmcKLQotUlBOR3MgID0gJChSUE5HKS1zdGF0aWMKLVJQTkcycyA9ICQoUlBORzIpLXN0YXRpYwotV1BOR3MgID0gJChXUE5HKS1zdGF0aWMKLQotUk9CSlMgID0gJChSUE5HKSQoTykgcmVhZHBuZyQoTykKLVJPQkpTMiA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKLVdPQkpTICA9ICQoV1BORykkKE8pIHdyaXRlcG5nJChPKQotCi1TVEFUSUNfRVhFUyAgPSAkKFJQTkdzKSQoRSkgJChSUE5HMnMpJChFKSAkKFdQTkdzKSQoRSkKLURZTkFNSUNfRVhFUyA9ICQoUlBORykkKEUpICQoUlBORzIpJChFKSAkKFdQTkcpJChFKQotCi1FWEVTID0gJChTVEFUSUNfRVhFUykgJChEWU5BTUlDX0VYRVMpCi0KLQotIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLmMkKE8pOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAotCi0KLSMgZGVwZW5kZW5jaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbDogICQoRVhFUykKLQotJChSUE5HcykkKEUpOiAkKFJPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUykgJChSTElCU3MpCi0KLSQoUlBORykkKEUpOiAkKFJPQkpTKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUykgJChSTElCU2QpCi0KLSQoUlBORzJzKSQoRSk6ICQoUk9CSlMyKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzIpICQoUkxJQlNzKQotCi0kKFJQTkcyKSQoRSk6ICQoUk9CSlMyKQotCSQoTEQpICQoTERGTEFHUykgLW8gJEAgJChST0JKUzIpICQoUkxJQlNkKQotCi0kKFdQTkdzKSQoRSk6ICQoV09CSlMpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFdPQkpTKSAkKFdMSUJTcykKLQotJChXUE5HKSQoRSk6ICQoV09CSlMpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKFdPQkpTKSAkKFdMSUJTZCkKLQotJChSUE5HKSQoTyk6CSQoUlBORykuYyByZWFkcG5nLmgKLSQoUlBORzIpJChPKToJJChSUE5HMikuYyByZWFkcG5nMi5oCi0kKFdQTkcpJChPKToJJChXUE5HKS5jIHdyaXRlcG5nLmgKLQotcmVhZHBuZyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKLXJlYWRwbmcyJChPKToJcmVhZHBuZzIuYyByZWFkcG5nMi5oCi13cml0ZXBuZyQoTyk6CXdyaXRlcG5nLmMgd3JpdGVwbmcuaAotCi0KLSMgbWFpbnRlbmFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsZWFuOgotCSQoUk0pICQoRVhFUykgJChST0JKUykgJChST0JKUzIpICQoV09CSlMpCmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL01ha2VmaWxlLnczMiBiL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudzMyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdkY2Y3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svTWFrZWZpbGUudzMyCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgU2FtcGxlIG1ha2VmaWxlIGZvciBycG5nLXdpbiAvIHJwbmcyLXdpbiAvIHdwbmcgdXNpbmcgTVNWQyBhbmQgTk1BS0UuCi0jIEdyZWcgUm9lbG9mcwotIyBMYXN0IG1vZGlmaWVkOiAgMiBKdW5lIDIwMDcKLSMKLSMJVGhlIHByb2dyYW1zIGJ1aWx0IGJ5IHRoaXMgbWFrZWZpbGUgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYm9vaywKLSMJIlBORzogIFRoZSBEZWZpbml0aXZlIEd1aWRlLCIgYnkgR3JlZyBSb2Vsb2ZzIChPJ1JlaWxseSBhbmQKLSMJQXNzb2NpYXRlcywgMTk5OSkuICBHbyBidXkgYSBjb3B5LCBlaD8gIFdlbGwsIE9LLCBpdCdzIG5vdAotIwlnZW5lcmFsbHkgZm9yIHNhbGUgYW55bW9yZSwgYnV0IGl0J3MgdGhlIHRob3VnaHQgdGhhdCBjb3VudHMsCi0jCXJpZ2h0PyAgKEhpbnQ6ICBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9ib29rLyApCi0jCi0jIEludm9rZSB0aGlzIG1ha2VmaWxlIGZyb20gYSBET1MgcHJvbXB0IHdpbmRvdyB2aWE6Ci0jCi0jCSVkZXZzdHVkaW8lXHZjXGJpblx2Y3ZhcnMzMi5iYXQKLSMJbm1ha2UgLW5vbG9nbyAtZiBNYWtlZmlsZS53MzIKLSMKLSMgd2hlcmUgJWRldnN0dWRpbyUgaXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIE1TVkMgLyBEZXZTdHVkaW8uICBJZgotIyB5b3UgZ2V0ICJlbnZpcm9ubWVudCBvdXQgb2Ygc3BhY2UiIGVycm9ycywgY3JlYXRlIGEgZGVza3RvcCBzaG9ydGN1dCB3aXRoCi0jICJjOlx3aW5kb3dzXGNvbW1hbmQuY29tIC9lOjQwOTYiIGFzIHRoZSBwcm9ncmFtIGNvbW1hbmQgbGluZSBhbmQgc2V0IHRoZQotIyB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGlzIGRpcmVjdG9yeS4gIFRoZW4gZG91YmxlLWNsaWNrIHRvIG9wZW4gdGhlIG5ldwotIyBET1MtcHJvbXB0IHdpbmRvdyB3aXRoIGEgYmlnZ2VyIGVudmlyb25tZW50IGFuZCByZXRyeSB0aGUgY29tbWFuZHMgYWJvdmUuCi0jCi0jIFRoaXMgbWFrZWZpbGUgYXNzdW1lcyBsaWJwbmcgYW5kIHpsaWIgaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQgb3IgZG93bmxvYWRlZAotIyBhbmQgYXJlIGluIHN1YmRpcmVjdG9yaWVzIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBjdXJyZW50IHN1YmRpcmVjdG9yeQotIyAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBQTkdQQVRIIGFuZCBaUEFUSCBtYWNyb3MgYmVsb3cpLiAgRWRpdCBhcyBhcHByb3ByaWF0ZS4KLSMKLSMgTm90ZSB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBhbmQgc3RhdGljIGxpYnBuZyBhbmQgemxpYiBsaWJyYXJpZXMKLSMgdXNlZCBiZWxvdyBtYXkgY2hhbmdlIGluIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJpZXMuICBUaGlzIG1ha2VmaWxlCi0jIGJ1aWxkcyBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcywgYnV0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdW5jb20tCi0jIG1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlIFBOR0xJQiBhbmQgWkxJQiBsaW5lcy4KLQotIWluY2x1ZGUgPG50d2luMzIubWFrPgotCi0KLSMgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBOR1BBVEggPSAuLi9saWJwbmcKLVBOR0lOQyA9IC1JJChQTkdQQVRIKQotI1BOR0xJQiA9ICQoUE5HUEFUSCkvcG5nZGxsLmxpYgotUE5HTElCID0gJChQTkdQQVRIKS9saWJwbmcubGliCi0KLVpQQVRIID0gLi4vemxpYgotWklOQyA9IC1JJChaUEFUSCkKLSNaTElCID0gJChaUEFUSCkvemxpYmRsbC5saWIKLVpMSUIgPSAkKFpQQVRIKS96bGlic3RhdC5saWIKLQotV0lOTElCUyA9IC1kZWZhdWx0bGliOnVzZXIzMi5saWIgZ2RpMzIubGliCi0jIFsicmVhbCIgYXBwcyBtYXkgYWxzbyBuZWVkIGNvbWN0bDMyLmxpYiwgY29tZGxnMzIubGliLCB3aW5tbS5saWIsIGV0Yy5dCi0KLUlOQ1MgPSAkKFBOR0lOQykgJChaSU5DKQotUkxJQlMgPSAkKFBOR0xJQikgJChaTElCKSAkKFdJTkxJQlMpCi1XTElCUyA9ICQoUE5HTElCKSAkKFpMSUIpCi0KLUNDID0gY2wKLUxEID0gbGluawotUk0gPSBkZWwKLUNQUEZMQUdTID0gJChJTkNTKQotQ0ZMQUdTID0gLW5vbG9nbyAtTyAtVzMgJChjdmFycykKLSMgW25vdGUgdGhhdCAtVzMgaXMgYW4gTVNWQy1zcGVjaWZpYyBjb21waWxhdGlvbiBmbGFnICgiYWxsIHdhcm5pbmdzIG9uIildCi0jIFtzZWUgJWRldnN0dWRpbyVcdmNcaW5jbHVkZVx3aW4zMi5tYWsgZm9yIGN2YXJzIG1hY3JvIGRlZmluaXRpb25dCi1PID0gLm9iagotRSA9IC5leGUKLQotUkxERkxBR1MgPSAtbm9sb2dvIC1zdWJzeXN0ZW06d2luZG93cwotV0xERkxBR1MgPSAtbm9sb2dvCi0KLVJQTkcgID0gcnBuZy13aW4KLVJQTkcyID0gcnBuZzItd2luCi1XUE5HICA9IHdwbmcKLQotUk9CSlMgID0gJChSUE5HKSQoTykgcmVhZHBuZyQoTykKLVJPQkpTMiA9ICQoUlBORzIpJChPKSByZWFkcG5nMiQoTykKLVdPQkpTICA9ICQoV1BORykkKE8pIHdyaXRlcG5nJChPKQotCi1FWEVTID0gJChSUE5HKSQoRSkgJChSUE5HMikkKEUpICQoV1BORykkKEUpCi0KLQotIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLmMkKE8pOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAotCi0KLSMgZGVwZW5kZW5jaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbDogICQoRVhFUykKLQotJChSUE5HKSQoRSk6ICQoUk9CSlMpCi0JJChMRCkgJChSTERGTEFHUykgLW91dDokQCAkKFJPQkpTKSAkKFJMSUJTKQotCi0kKFJQTkcyKSQoRSk6ICQoUk9CSlMyKQotCSQoTEQpICQoUkxERkxBR1MpIC1vdXQ6JEAgJChST0JKUzIpICQoUkxJQlMpCi0KLSQoV1BORykkKEUpOiAkKFdPQkpTKQotCSQoTEQpICQoV0xERkxBR1MpIC1vdXQ6JEAgJChXT0JKUykgJChXTElCUykKLQotJChSUE5HKSQoTyk6CSQoUlBORykuYyByZWFkcG5nLmgKLSQoUlBORzIpJChPKToJJChSUE5HMikuYyByZWFkcG5nMi5oCi0kKFdQTkcpJChPKToJJChXUE5HKS5jIHdyaXRlcG5nLmgKLQotcmVhZHBuZyQoTyk6CXJlYWRwbmcuYyByZWFkcG5nLmgKLXJlYWRwbmcyJChPKToJcmVhZHBuZzIuYyByZWFkcG5nMi5oCi13cml0ZXBuZyQoTyk6CXdyaXRlcG5nLmMgd3JpdGVwbmcuaAotCi0KLSMgbWFpbnRlbmFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsZWFuOgotIwlpZGVhbGx5IHdlIGNvdWxkIGp1c3QgZG8gdGhpczoKLSMJJChSTSkgJChFWEVTKSAkKFJPQkpTKSAkKFJPQkpTMikgJChXT0JKUykKLSMJLi4uYnV0IHRoZSBXaW5kb3dzICJERUwiIGNvbW1hbmQgaXMgbm9uZSB0b28gYnJpZ2h0LCBzbzoKLQkkKFJNKSByKiQoRSkKLQkkKFJNKSB3KiQoRSkKLQkkKFJNKSByKiQoTykKLQkkKFJNKSB3KiQoTykKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ3JlZ2Jvb2svUkVBRE1FIGIvY29udHJpYi9ncmVnYm9vay9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMWY2YTMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9ncmVnYm9vay9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZQotICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIENvZGUKLQotQ2hhcHRlcnMgMTMsIDE0IGFuZCAxNSBvZiAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSIgZGlzY3VzcyB0aHJlZSBmcmVlLAotY3Jvc3MtcGxhdGZvcm0gZGVtbyBwcm9ncmFtcyB0aGF0IHNob3cgaG93IHRvIHVzZSB0aGUgbGlicG5nIHJlZmVyZW5jZQotbGlicmFyeTogIHJwbmcsIHJwbmcyIGFuZCB3cG5nLiAgcnBuZyBhbmQgcnBuZzIgYXJlIHZpZXdlcnM7IHRoZSBmaXJzdCBpcwotYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIHRoYXQgdGhhdCBzaG93cyBob3cgYSBzdGFuZGFyZCBmaWxlLXZpZXdlciBtaWdodCB1c2UKLWxpYnBuZywgd2hpbGUgdGhlIHNlY29uZCBpcyBkZXNpZ25lZCB0byBwcm9jZXNzIHN0cmVhbWluZyBkYXRhIGFuZCBzaG93cwotaG93IGEgd2ViIGJyb3dzZXIgbWlnaHQgYmUgd3JpdHRlbi4gIHdwbmcgaXMgYSBzaW1wbGUgY29tbWFuZC1saW5lIHByb2dyYW0KLXRoYXQgcmVhZHMgYmluYXJ5IFBHTSBhbmQgUFBNIGZpbGVzICh0aGUgYGByYXcnJyBncmF5c2NhbGUgYW5kIFJHQiBzdWJzZXRzCi1vZiBQQk1QTFVTL05ldFBCTSkgYW5kIGNvbnZlcnRzIHRoZW0gdG8gUE5HLgotCi1UaGUgc291cmNlIGNvZGUgZm9yIGFsbCB0aHJlZSBkZW1vIHByb2dyYW1zIGN1cnJlbnRseSBjb21waWxlcyB1bmRlcgotVW5peCwgT3BlblZNUywgYW5kIDMyLWJpdCBXaW5kb3dzLiAgKFNwZWNpYWwgdGhhbmtzIHRvIE1hcnRpbiBaaW5zZXIsCi16aW5zZXJAZGVjdXMuZGUsIGZvciBtYWtpbmcgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIGZvciBPcGVuVk1TIGFuZCBmb3IKLXByb3ZpZGluZyBhbiBhcHByb3ByaWF0ZSBidWlsZCBzY3JpcHQuKSAgQnVpbGQgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBmb3VuZAotYmVsb3cuCi0KLUZpbGVzOgotCi0gICBSRUFETUUgICAgICAgICAgICAgdGhpcyBmaWxlCi0gICBMSUNFTlNFICAgICAgICAgICAgdGVybXMgb2YgZGlzdHJpYnV0aW9uIGFuZCByZXVzZSAoQlNELWxpa2Ugb3IgR05VIEdQTCkKLSAgIENPUFlJTkcgICAgICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKQotCi0gICBNYWtlZmlsZS51bnggICAgICAgVW5peCBtYWtlZmlsZQotICAgTWFrZWZpbGUudzMyICAgICAgIFdpbmRvd3MgKE1TVkMpIG1ha2VmaWxlCi0gICBtYWtldm1zLmNvbSAgICAgICAgT3BlblZNUyBidWlsZCBzY3JpcHQKLQotICAgcnBuZy13aW4uYyAgICAgICAgIFdpbmRvd3MgZnJvbnQgZW5kIGZvciB0aGUgYmFzaWMgdmlld2VyCi0gICBycG5nLXguYyAgICAgICAgICAgWCBXaW5kb3cgU3lzdGVtIChVbml4LCBPcGVuVk1TKSBmcm9udCBlbmQKLSAgIHJlYWRwbmcuYyAgICAgICAgICBnZW5lcmljIGJhY2sgZW5kIGZvciB0aGUgYmFzaWMgdmlld2VyCi0gICByZWFkcG5nLmggICAgICAgICAgaGVhZGVyIGZpbGUgZm9yIHRoZSBiYXNpYyB2aWV3ZXIKLQotICAgcnBuZzItd2luLmMgICAgICAgIFdpbmRvd3MgZnJvbnQgZW5kIGZvciB0aGUgcHJvZ3Jlc3NpdmUgdmlld2VyCi0gICBycG5nMi14LmMgICAgICAgICAgWCBmcm9udCBlbmQgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKLSAgIHJlYWRwbmcyLmMgICAgICAgICBnZW5lcmljIGJhY2sgZW5kIGZvciB0aGUgcHJvZ3Jlc3NpdmUgdmlld2VyCi0gICByZWFkcG5nMi5oICAgICAgICAgaGVhZGVyIGZpbGUgZm9yIHRoZSBwcm9ncmVzc2l2ZSB2aWV3ZXIKLQotICAgd3BuZy5jICAgICAgICAgICAgIGdlbmVyaWMgKHRleHQpIGZyb250IGVuZCBmb3IgdGhlIGNvbnZlcnRlcgotICAgd3JpdGVwbmcuYyAgICAgICAgIGdlbmVyaWMgYmFjayBlbmQgZm9yIHRoZSBjb252ZXJ0ZXIKLSAgIHdyaXRlcG5nLmggICAgICAgICBoZWFkZXIgZmlsZSBmb3IgdGhlIGNvbnZlcnRlcgotCi0gICB0b3VjYW4ucG5nICAgICAgICAgdHJhbnNwYXJlbnQgUE5HIGZvciB0ZXN0aW5nIChieSBTdGVmYW4gU2NobmVpZGVyKQotCi1Ob3RlIHRoYXQsIGFsdGhvdWdoIHRoZSBwcm9ncmFtcyBhcmUgZGVzaWduZWQgdG8gYmUgZnVuY3Rpb25hbCwgdGhlaXIKLXByaW1hcnkgcHVycG9zZSBpcyB0byBpbGx1c3RyYXRlIGhvdyB0byB1c2UgbGlicG5nIHRvIGFkZCBQTkcgc3VwcG9ydCB0bwotb3RoZXIgcHJvZ3JhbXMuICBBcyBzdWNoLCB0aGVpciB1c2VyIGludGVyZmFjZXMgYXJlIGNydWRlIGFuZCBkZWZpbml0ZWx5Ci1hcmUgbm90IGludGVuZGVkIGZvciBldmVyeWRheSB1c2UuCi0KLVBsZWFzZSBzZWUgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvcG5nYm9vay5odG1sIGZvciBmdXJ0aGVyIGluZm9yLQotbWF0aW9uIGFuZCBsaW5rcyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBhbmQgQ2hhcHRlcnMKLTEzLTE1IG9mIHRoZSBib29rIGZvciBkZXRhaWxlZCBkaXNjdXNzaW9uIG9mIHRoZSB0aHJlZSBwcm9ncmFtcy4KLQotR3JlZyBSb2Vsb2ZzCi1odHRwOi8vcG9ib3guY29tL35uZXd0L2dyZWdfY29udGFjdC5odG1sCi0xNiBNYXJjaCAyMDA4Ci0KLQotQlVJTEQgSU5TVFJVQ1RJT05TCi0KLSAtIFByZXJlcXVpc2l0ZXMgKGluIG9yZGVyIG9mIGNvbXBpbGF0aW9uKToKLQotICAgICAgLSB6bGliICAgICAgICAgICAgaHR0cDovL3psaWIubmV0LwotICAgICAgLSBsaWJwbmcgICAgICAgICAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvbGlicG5nLmh0bWwKLSAgICAgIC0gcG5nYm9vayAgICAgICAgIGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL2Jvb2svc291cmNlcy5odG1sCi0KLSAgICAgVGhlIHBuZ2Jvb2sgZGVtbyBwcm9ncmFtcyBhcmUgZXhwbGljaXRseSBkZXNpZ25lZCB0byBkZW1vbnN0cmF0ZSBwcm9wZXIKLSAgICAgY29kaW5nIHRlY2huaXF1ZXMgZm9yIHVzaW5nIHRoZSBsaWJwbmcgcmVmZXJlbmNlIGxpYnJhcnkuICBBcyBhIHJlc3VsdCwKLSAgICAgeW91IG5lZWQgdG8gZG93bmxvYWQgYW5kIGJ1aWxkIGJvdGggemxpYiAob24gd2hpY2ggbGlicG5nIGRlcGVuZHMpIGFuZAotICAgICBsaWJwbmcuICBBIGNvbW1vbiBidWlsZCBzZXR1cCBpcyB0byBwbGFjZSB0aGUgemxpYiwgbGlicG5nIGFuZCBwbmdib29rCi0gICAgIHN1YmRpcmVjdG9yeSB0cmVlcyAoImZvbGRlcnMiKSBpbiB0aGUgc2FtZSBwYXJlbnQgZGlyZWN0b3J5LiAgVGhlbiB0aGUKLSAgICAgbGlicG5nIGJ1aWxkIGNhbiByZWZlciB0byBmaWxlcyBpbiAuLi96bGliIChvciAuLlx6bGliIG9yIFstLnpsaWJdKSwKLSAgICAgYW5kIHNpbWlsYXJseSBmb3IgdGhlIHBuZ2Jvb2sgYnVpbGQuCi0KLSAgICAgTm90ZSB0aGF0IGFsbCB0aHJlZSBwYWNrYWdlcyBhcmUgZGVzaWduZWQgdG8gYmUgYnVpbHQgZnJvbSBhIGNvbW1hbmQKLSAgICAgbGluZSBieSBkZWZhdWx0OyB0aG9zZSB3aG8gd2lzaCB0byB1c2UgYSBncmFwaGljYWwgb3Igb3RoZXIgaW50ZWdyYXRlZAotICAgICBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgYXJlIG9uIHRoZWlyIG93bi4KLQotCi0gLSBVbml4OgotCi0gICAgIFVucGFjayB0aGUgbGF0ZXN0IHBuZ2Jvb2sgc291cmNlcyAod2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhpcwotICAgICBSRUFETUUgZmlsZSkgaW50byBhIGRpcmVjdG9yeSBhbmQgY2hhbmdlIGludG8gdGhhdCBkaXJlY3RvcnkuCi0KLSAgICAgQ29weSBNYWtlZmlsZS51bnggdG8gTWFrZWZpbGUgYW5kIGVkaXQgdGhlIFBORyogYW5kIFoqIHZhcmlhYmxlcwotICAgICBhcHByb3ByaWF0ZWx5IChwb3NzaWJseSBhbHNvIHRoZSBYKiB2YXJpYWJsZXMgaWYgbmVjZXNzYXJ5KS4KLQotICAgICBtYWtlCi0KLSAgICAgVGhlcmUgaXMgbm8gImluc3RhbGwiIHRhcmdldCwgc28gY29weSB0aGUgdGhyZWUgZXhlY3V0YWJsZXMgc29tZXdoZXJlCi0gICAgIGluIHlvdXIgcGF0aCBvciBydW4gdGhlbSBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEFsbCB0aHJlZSB3aWxsCi0gICAgIHByaW50IGEgYmFzaWMgdXNhZ2Ugc2NyZWVuIHdoZW4gcnVuIHdpdGhvdXQgYW55IGNvbW1hbmQtbGluZSBhcmd1bWVudHM7Ci0gICAgIHNlZSB0aGUgYm9vayBmb3IgbW9yZSBkZXRhaWxzLgotCi0KLSAtIFdpbmRvd3M6Ci0KLSAgICAgVW5wYWNrIHRoZSBsYXRlc3QgcG5nYm9vayBzb3VyY2VzICh3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byB0aGlzCi0gICAgIFJFQURNRSBmaWxlKSBpbnRvIGEgZm9sZGVyLCBvcGVuIGEgIkRPUyBzaGVsbCIgb3IgImNvbW1hbmQgcHJvbXB0IgotICAgICBvciBlcXVpdmFsZW50IGNvbW1hbmQtbGluZSB3aW5kb3csIGFuZCBjZCBpbnRvIHRoZSBmb2xkZXIgd2hlcmUgeW91Ci0gICAgIHVucGFja2VkIHRoZSBzb3VyY2UgY29kZS4KLQotICAgICBGb3IgTVNWQywgc2V0IHVwIHRoZSBuZWNlc3NhcnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJ5IGludm9raW5nCi0KLSAgICAgICAgJWRldnN0dWRpbyVcdmNcYmluXHZjdmFyczMyLmJhdAotCi0gICAgIHdoZXJlIHdoZXJlICVkZXZzdHVkaW8lIGlzIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBNU1ZDIC8KLSAgICAgRGV2U3R1ZGlvLiAgSWYgeW91IGdldCAiZW52aXJvbm1lbnQgb3V0IG9mIHNwYWNlIiBlcnJvcnMgdW5kZXIgOTUvOTgsCi0gICAgIGNyZWF0ZSBhIGRlc2t0b3Agc2hvcnRjdXQgd2l0aCAiYzpcd2luZG93c1xjb21tYW5kLmNvbSAvZTo0MDk2IiBhcwotICAgICB0aGUgcHJvZ3JhbSBjb21tYW5kIGxpbmUgYW5kIHNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHBuZ2Jvb2sKLSAgICAgZGlyZWN0b3J5LiAgVGhlbiBkb3VibGUtY2xpY2sgdG8gb3BlbiB0aGUgbmV3IERPUy1wcm9tcHQgd2luZG93IHdpdGgKLSAgICAgYSBiaWdnZXIgZW52aXJvbm1lbnQgYW5kIHJldHJ5IHRoZSBjb21tYW5kcyBhYm92ZS4KLQotICAgICBDb3B5IE1ha2VmaWxlLnczMiB0byBNYWtlZmlsZSBhbmQgZWRpdCB0aGUgUE5HUEFUSCBhbmQgWlBBVEggdmFyaWFibGVzCi0gICAgIGFwcHJvcHJpYXRlbHkgKHBvc3NpYmx5IGFsc28gdGhlICJJTkMiIGFuZCAiTElCIiB2YXJpYWJsZXMgaWYgbmVlZGVkKS4KLSAgICAgTm90ZSB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBhbmQgc3RhdGljIGxpYnBuZyBhbmQgemxpYiBsaWJyYXJpZXMKLSAgICAgdXNlZCBpbiB0aGUgbWFrZWZpbGUgbWF5IGNoYW5nZSBpbiBsYXRlciByZWxlYXNlcyBvZiB0aGUgbGlicmFyaWVzLgotICAgICBBbHNvIG5vdGUgdGhhdCwgYXMgb2YgbGlicG5nIHZlcnNpb24gMS4wLjUsIE1TVkMgRExMIGJ1aWxkcyBkbyBub3Qgd29yay4KLSAgICAgVGhpcyBtYWtlZmlsZSB0aGVyZWZvcmUgYnVpbGRzIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLCBidXQgaWYKLSAgICAgdGhlIERMTCBwcm9ibGVtcyBldmVyIGdldCBmaXhlZCwgdW5jb21tZW50aW5nIHRoZSBhcHByb3ByaWF0ZSBQTkdMSUIKLSAgICAgYW5kIFpMSUIgbGluZXMgd2lsbCBidWlsZCBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMgaW5zdGVhZC4KLQotICAgICBEbyB0aGUgYnVpbGQgYnkgdHlwaW5nCi0KLSAgICAgICAgbm1ha2UKLQotICAgICBUaGUgcmVzdWx0IHNob3VsZCBiZSB0aHJlZSBleGVjdXRhYmxlczogIHJwbmctd2luLmV4ZSwgcnBuZzItd2luLmV4ZSwKLSAgICAgYW5kIHdwbmcuZXhlLiAgQ29weSB0aGVtIHNvbWV3aGVyZSBpbiB5b3VyIFBBVEggb3IgcnVuIHRoZW0gZnJvbSB0aGUKLSAgICAgY3VycmVudCBmb2xkZXIuICBMaWtlIHRoZSBVbml4IHZlcnNpb25zLCB0aGUgdHdvIHdpbmRvd2VkIHByb2dyYW1zCi0gICAgIChycG5nIGFuZCBycG5nMikgbm93IGRpc3BsYXkgYSB1c2FnZSBzY3JlZW4gaW4gYSBjb25zb2xlIHdpbmRvdyB3aGVuCi0gICAgIGludm9rZWQgd2l0aG91dCBjb21tYW5kLWxpbmUgYXJndW1lbnRzOyB0aGlzIGlzIG5ldyBiZWhhdmlvciBhcyBvZgotICAgICB0aGUgSnVuZSAyMDAxIHJlbGVhc2UuICBOb3RlIHRoYXQgdGhlIHByb2dyYW1zIHVzZSB0aGUgVW5peC1zdHlsZSAiLSIKLSAgICAgY2hhcmFjdGVyIHRvIHNwZWNpZnkgb3B0aW9ucywgaW5zdGVhZCBvZiB0aGUgbW9yZSBjb21tb24gRE9TL1dpbmRvd3MKLSAgICAgIi8iIGNoYXJhY3Rlci4gIChGb3IgZXhhbXBsZTogICJycG5nMi13aW4gLWJncGF0IDQgZm9vLnBuZyIsIG5vdAotICAgICAicnBuZzItd2luIC9iZ3BhdCA0IGZvby5wbmciKQotCi0KLSAtIE9wZW5WTVM6Ci0KLSAgICAgVW5wYWNrIHRoZSBwbmdib29rIHNvdXJjZXMgaW50byBhIHN1YmRpcmVjdG9yeSBhbmQgY2hhbmdlIGludG8gdGhhdAotICAgICBzdWJkaXJlY3RvcnkuCi0KLSAgICAgRWRpdCBtYWtldm1zLmNvbSBhcHByb3ByaWF0ZWx5LCBzcGVjaWZpY2FsbHkgdGhlIHpwYXRoIGFuZCBwbmdwYXRoCi0gICAgIHZhcmlhYmxlcy4KLQotICAgICBAbWFrZXZtcwotCi0gICAgIFRvIHJ1biB0aGUgcHJvZ3JhbXMsIHRoZXkgcHJvYmFibHkgZmlyc3QgbmVlZCB0byBiZSBzZXQgdXAgYXMgImZvcmVpZ24KLSAgICAgc3ltYm9scywiIHdpdGggImRpc2siIGFuZCAiZGlyIiBzZXQgYXBwcm9wcmlhdGVseToKLQotICAgICAkIHJwbmcgID09ICIkZGlzazpbZGlyXXJwbmcteC5leGUiCi0gICAgICQgcnBuZzIgPT0gIiRkaXNrOltkaXJdcnBuZzIteC5leGUiCi0gICAgICQgd3BuZyAgPT0gIiRkaXNrOltkaXJdd3BuZy5leGUiCi0KLSAgICAgQWxsIHRocmVlIHdpbGwgcHJpbnQgYSBiYXNpYyB1c2FnZSBzY3JlZW4gd2hlbiBydW4gd2l0aG91dCBhbnkgY29tbWFuZC0KLSAgICAgbGluZSBhcmd1bWVudHM7IHNlZSB0aGUgYm9vayBmb3IgbW9yZSBkZXRhaWxzLiAgTm90ZSB0aGF0IHRoZSBvcHRpb25zCi0gICAgIHN0eWxlIGlzIFVuaXgtbGlrZSwgaS5lLiwgcHJlY2VkZWQgYnkgIi0iIHJhdGhlciB0aGFuICIvIi4KLQotCi1SVU5OSU5HIFRIRSBQUk9HUkFNUzogIChWRVJZKSBCUklFRiBJTlRSTwotCi0gICAgIHJwbmcgaXMgYSBzaW1wbGUgUE5HIHZpZXdlciB0aGF0IGNhbiBkaXNwbGF5IHRyYW5zcGFyZW50IFBOR3Mgd2l0aCBhCi0gICAgIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yOyBmb3IgZXhhbXBsZSwKLQotICAgICAgICBycG5nIC1iZ2NvbG9yIFwjZmYwMDAwIHRvdWNhbi5wbmcKLQotICAgICB3b3VsZCBkaXNwbGF5IHRoZSBpbWFnZSB3aXRoIGEgcmVkIGJhY2tncm91bmQuICBycG5nMiBpcyBhIHByb2dyZXNzaXZlCi0gICAgIHZpZXdlciB0aGF0IHNpbXVsYXRlcyBhIHdlYiBicm93c2VyIGluIHNvbWUgcmVzcGVjdHM7IGl0IGNhbiBkaXNwbGF5Ci0gICAgIGltYWdlcyBhZ2FpbnN0IGVpdGhlciBhIGJhY2tncm91bmQgY29sb3Igb3IgYSBkeW5hbWljYWxseSBnZW5lcmF0ZWQKLSAgICAgYmFja2dyb3VuZCBpbWFnZS4gIEZvciBleGFtcGxlOgotCi0gICAgICAgIHJwbmcyIC1iZ3BhdCAxNiB0b3VjYW4ucG5nCi0KLSAgICAgd3BuZyBpcyBhIHB1cmVseSBjb21tYW5kLWxpbmUgaW1hZ2UgY29udmVydGVyIGZyb20gYmluYXJ5IFBCTVBMVVMvTmV0UEJNCi0gICAgIGZvcm1hdCAoLnBnbSBvciAucHBtKSB0byBQTkc7IGZvciBleGFtcGxlLAotCi0gICAgICAgIHdwbmcgLXRpbWUgPCB0b3VjYW4tbm90cmFucy5wcG0gPiB0b3VjYW4tbm90cmFucy5wbmcKLQotICAgICB3b3VsZCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgUFBNIGZpbGUgKHVzaW5nIHJlZGlyZWN0aW9uKSB0byBQTkcsIGF1dG8tCi0gICAgIG1hdGljYWxseSBzZXR0aW5nIHRoZSBQTkcgbW9kaWZpY2F0aW9uLXRpbWUgY2h1bmsuCi0KLSAgICAgQWxsIG9wdGlvbnMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIHRoZSBzaG9ydGVzdCB1bmlxdWUgdmFsdWU7IGZvciBleGFtcGxlLAotICAgICAiLWJnYyIgZm9yIC1iZ2NvbG9yICh2ZXJzdXMgIi1iZ3AiIGZvciAtYmdwYXQpLCBvciAiLWciIGZvciAtZ2FtbWEuCmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL21ha2V2bXMuY29tIGIvY29udHJpYi9ncmVnYm9vay9tYWtldm1zLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyYmNhYi4uMDAwMDAwMAotLS0gYS9jb250cmliL2dyZWdib29rL21ha2V2bXMuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0kISBtYWtlICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlIiBkZW1vIHByb2dyYW1zIChmb3IgWCkgdW5kZXIgT3BlblZNUwotJCEKLSQhIFNjcmlwdCBjcmVhdGVkIGJ5IE1hcnRpbiBaaW5zZXIgZm9yIGxpYnBuZzsgbW9kaWZpZWQgYnkgR3JlZyBSb2Vsb2ZzCi0kISBmb3Igc3RhbmRhbG9uZSBwbmdib29rIHNvdXJjZSBkaXN0cmlidXRpb24uCi0kIQotJCEKLSQhICAgIFNldCBsb2NhdGlvbnMgd2hlcmUgemxpYiBhbmQgbGlicG5nIHNvdXJjZXMgbGl2ZS4KLSQhCi0kIHpwYXRoICAgPSAiIgotJCBwbmdwYXRoID0gIiIKLSQhCi0kIGlmIGYkc2VhcmNoKCJbLS0tLnpsaWJdemxpYi5oIikubmVzLiIiIHRoZW4genBhdGggPSAiWy0tLS56bGliXSIKLSQgaWYgZiRzZWFyY2goIlstLV1wbmcuaCIpLm5lcy4iIiB0aGVuIHBuZ3BhdGggPSAiWy0tXSIKLSQhCi0kIGlmIGYkc2VhcmNoKCJbLS56bGliXXpsaWIuaCIpLm5lcy4iIiB0aGVuIHpwYXRoID0gIlstLnpsaWJdIgotJCBpZiBmJHNlYXJjaCgiWy0ubGlicG5nXXBuZy5oIikubmVzLiIiIHRoZW4gcG5ncGF0aCA9ICJbLS5saWJwbmddIgotJCEKLSQgaWYgenBhdGggLmVxcy4gIiIKLSQgdGhlbgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgInpsaWIgaW5jbHVkZSBub3QgZm91bmQuIEV4aXRpbmcuLi4iCi0kICAgZXhpdCAyCi0kIGVuZGlmCi0kIQotJCBpZiBwbmdwYXRoIC5lcXMuICIiCi0kIHRoZW4KLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJsaWJwbmcgaW5jbHVkZSBub3QgZm91bmQuIEV4aXRpbmcuLi4iCi0kICAgZXhpdCAyCi0kIGVuZGlmCi0kIQotJCEgICAgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQuCi0kIQotJCBjY29wdD0iL2luY2x1ZGU9KCcnenBhdGgnLCcncG5ncGF0aCcpIgotJCBpZiBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0Ci0kIHRoZW4KLSQgIGNjb3B0ID0gIi9wcmVmaXg9YWxsIitjY29wdAotJCAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgotJCBlbHNlCi0kICBpZiBmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpLmVxcy4iIgotJCAgIHRoZW4KLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kICAgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOlZBWEMuRVhFIikuZXFzLiIiCi0kICAgICB0aGVuCi0kICAgICAgY29tcCAgPSAiX19nY2NfXz0xIgotJCAgICAgIENDIDo9PSBHQ0MKLSQgICAgIGVsc2UKLSQgICAgICBjb21wID0gIl9fdmF4Y19fPTEiCi0kICAgICBlbmRpZgotJCAgIGVsc2UKLSQgICAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgZGVjYyRsaWJyYXJ5X2luY2x1ZGU6Ci0kICAgIGNjb3B0ID0gIi9kZWNjL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICAgIGNvbXAgID0gIl9fZGVjY19fPTEiCi0kICBlbmRpZgotJCBlbmRpZgotJCBvcGVuL3dyaXRlIGxvcHQgbGliLm9wdAotJCB3cml0ZSBsb3B0ICInJ3BuZ3BhdGgnbGlicG5nLm9sYi9saWIiCi0kIHdyaXRlIGxvcHQgIicnenBhdGgnbGliei5vbGIvbGliIgotJCBjbG9zZSBsb3B0Ci0kIG9wZW4vd3JpdGUgeG9wdCB4MTEub3B0Ci0kIHdyaXRlIHhvcHQgInN5cyRsaWJyYXJ5OmRlY3ckeGxpYnNoci5leGUvc2hhcmUiCi0kIGNsb3NlIHhvcHQKLSQhCi0kISAgICBCdWlsZCAnZW0uCi0kIQotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgUE5HIGJvb2sgcHJvZ3JhbXMgLi4uIgotJCAgIENBTEwgTUFLRSByZWFkcG5nLk9CSiAiY2MgJydDQ09QVCcgcmVhZHBuZyIgLQotCXJlYWRwbmcuYyByZWFkcG5nLmgKLSQgICBDQUxMIE1BS0UgcmVhZHBuZzIuT0JKICJjYyAnJ0NDT1BUJyByZWFkcG5nMiIgLQotCXJlYWRwbmcyLmMgcmVhZHBuZzIuaAotJCAgIENBTEwgTUFLRSB3cml0ZXBuZy5PQkogImNjICcnQ0NPUFQnIHdyaXRlcG5nIiAtCi0Jd3JpdGVwbmcuYyB3cml0ZXBuZy5oCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgcnBuZy14Li4uIgotJCAgIENBTEwgTUFLRSBycG5nLXguT0JKICJjYyAnJ0NDT1BUJyBycG5nLXgiIC0KLQlycG5nLXguYyByZWFkcG5nLmgKLSQgICBjYWxsIG1ha2UgcnBuZy14LmV4ZSAtCi0JIkxJTksgcnBuZy14LHJlYWRwbmcsbGliLm9wdC9vcHQseDExLm9wdC9vcHQiIC0KLQlycG5nLXgub2JqIHJlYWRwbmcub2JqCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgcnBuZzIteC4uLiIKLSQgICBDQUxMIE1BS0UgcnBuZzIteC5PQkogImNjICcnQ0NPUFQnIHJwbmcyLXgiIC0KLQlycG5nMi14LmMgcmVhZHBuZzIuaAotJCAgIGNhbGwgbWFrZSBycG5nMi14LmV4ZSAtCi0JIkxJTksgcnBuZzIteCxyZWFkcG5nMixsaWIub3B0L29wdCx4MTEub3B0L29wdCIgLQotCXJwbmcyLXgub2JqIHJlYWRwbmcyLm9iagotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHdwbmcuLi4iCi0kICAgQ0FMTCBNQUtFIHdwbmcuT0JKICJjYyAnJ0NDT1BUJyB3cG5nIiAtCi0Jd3BuZy5jIHdyaXRlcG5nLmgKLSQgICBjYWxsIG1ha2Ugd3BuZy5leGUgLQotCSJMSU5LIHdwbmcsd3JpdGVwbmcsbGliLm9wdC9vcHQiIC0KLQl3cG5nLm9iaiB3cml0ZXBuZy5vYmoKLSQgZXhpdAotJCEKLSQhCi0kTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUwotJCBWID0gJ0YkVmVyaWZ5KDApCi0kISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCi0kISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAotJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCi0kCi0kIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0Ci0kIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQotJGFyZz0zCi0kTG9vcDoKLSQgICAgICAgQXJndW1lbnQgPSBQJ2FyZwotJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAotJCAgICAgICBFbD0wCi0kTG9vcDI6Ci0kICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQotJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAotJCAgICAgICBBRmlsZSA9ICIiCi0kTG9vcDM6Ci0kICAgICAgIE9GaWxlID0gQUZpbGUKLSQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQotJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKLSQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0Ci0kICAgICAgIEdvdG8gTG9vcDMKLSROZXh0RUw6Ci0kICAgICAgIEVsID0gRWwgKyAxCi0kICAgICAgIEdvdG8gTG9vcDIKLSRFbmRMOgotJCBhcmc9YXJnKzEKLSQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAotJCBHb3RvIEV4aXQKLSQKLSRNYWtlaXQ6Ci0kIFZWPUYkVkVSSUZZKDApCi0kIHdyaXRlIHN5cyRvdXRwdXQgUDIKLSQgJ1AyCi0kIFZWPSdGJFZlcmlmeShWVikKLSRFeGl0OgotJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQotJEVORFNVQlJPVVRJTkUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5jIGIvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjc0MDMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHBuZy5jCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHpsaWIuaD4KLQotI2luY2x1ZGUgInBuZy5oIiAgICAgICAgLyogbGlicG5nIGhlYWRlciAqLwotI2luY2x1ZGUgInJlYWRwbmcuaCIgICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHB1YmxpYyBwcm90b3R5cGVzICovCi0KLS8qIGZ1dHVyZSB2ZXJzaW9ucyBvZiBsaWJwbmcgd2lsbCBwcm92aWRlIHRoaXMgbWFjcm86ICovCi0jaWZuZGVmIHBuZ19qbXBidWYKLSMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpICAgKChwbmdfcHRyKS0+am1wYnVmKQotI2VuZGlmCi0KLQotc3RhdGljIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOwotc3RhdGljIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7Ci0KLXBuZ191aW50XzMyICB3aWR0aCwgaGVpZ2h0OwotaW50ICBiaXRfZGVwdGgsIGNvbG9yX3R5cGU7Ci11Y2ggICppbWFnZV9kYXRhID0gTlVMTDsKLQotCi12b2lkIHJlYWRwbmdfdmVyc2lvbl9pbmZvKHZvaWQpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICBDb21waWxlZCB3aXRoIGxpYnBuZyAlczsgdXNpbmcgbGlicG5nICVzLlxuIiwKLSAgICAgIFBOR19MSUJQTkdfVkVSX1NUUklORywgcG5nX2xpYnBuZ192ZXIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCB6bGliICVzOyB1c2luZyB6bGliICVzLlxuIiwKLSAgICAgIFpMSUJfVkVSU0lPTiwgemxpYl92ZXJzaW9uKTsKLX0KLQotCi0vKiByZXR1cm4gdmFsdWUgPSAwIGZvciBzdWNjZXNzLCAxIGZvciBiYWQgc2lnLCAyIGZvciBiYWQgSUhEUiwgNCBmb3Igbm8gbWVtICovCi0KLWludCByZWFkcG5nX2luaXQoRklMRSAqaW5maWxlLCB1bGcgKnBXaWR0aCwgdWxnICpwSGVpZ2h0KQotewotICAgIHVjaCBzaWdbOF07Ci0KLQotICAgIC8qIGZpcnN0IGRvIGEgcXVpY2sgY2hlY2sgdGhhdCB0aGUgZmlsZSByZWFsbHkgaXMgYSBQTkcgaW1hZ2U7IGNvdWxkCi0gICAgICogaGF2ZSB1c2VkIHNsaWdodGx5IG1vcmUgZ2VuZXJhbCBwbmdfc2lnX2NtcCgpIGZ1bmN0aW9uIGluc3RlYWQgKi8KLQotICAgIGZyZWFkKHNpZywgMSwgOCwgaW5maWxlKTsKLSAgICBpZiAocG5nX3NpZ19jbXAoc2lnLCAwLCA4KSkKLSAgICAgICAgcmV0dXJuIDE7ICAgLyogYmFkIHNpZ25hdHVyZSAqLwotCi0KLSAgICAvKiBjb3VsZCBwYXNzIHBvaW50ZXJzIHRvIHVzZXItZGVmaW5lZCBlcnJvciBoYW5kbGVycyBpbnN0ZWFkIG9mIE5VTExzOiAqLwotCi0gICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QocG5nX2dldF9saWJwbmdfdmVyKE5VTEwpLCBOVUxMLCBOVUxMLAotICAgICAgICBOVUxMKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiA0OyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KLQotICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotICAgIH0KLQotCi0gICAgLyogd2UgY291bGQgY3JlYXRlIGEgc2Vjb25kIGluZm8gc3RydWN0IGhlcmUgKGVuZF9pbmZvKSwgYnV0IGl0J3Mgb25seQotICAgICAqIHVzZWZ1bCBpZiB3ZSB3YW50IHRvIGtlZXAgcHJlLSBhbmQgcG9zdC1JREFUIGNodW5rIGluZm8gc2VwYXJhdGVkCi0gICAgICogKG1haW5seSBmb3IgUE5HLWF3YXJlIGltYWdlIGVkaXRvcnMgYW5kIGNvbnZlcnRlcnMpICovCi0KLQotICAgIC8qIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBQTkctcmVhZGluZwotICAgICAqIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBpbmZpbGUpOwotICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOyAgLyogd2UgYWxyZWFkeSByZWFkIHRoZSA4IHNpZ25hdHVyZSBieXRlcyAqLwotCi0gICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7ICAvKiByZWFkIGFsbCBQTkcgaW5mbyB1cCB0byBpbWFnZSBkYXRhICovCi0KLQotICAgIC8qIGFsdGVybmF0aXZlbHksIGNvdWxkIG1ha2Ugc2VwYXJhdGUgY2FsbHMgdG8gcG5nX2dldF9pbWFnZV93aWR0aCgpLAotICAgICAqIGV0Yy4sIGJ1dCB3YW50IGJpdF9kZXB0aCBhbmQgY29sb3JfdHlwZSBmb3IgbGF0ZXIgW2Rvbid0IGNhcmUgYWJvdXQKLSAgICAgKiBjb21wcmVzc2lvbl90eXBlIGFuZCBmaWx0ZXJfdHlwZSA9PiBOVUxMc10gKi8KLQotICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKLSAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICpwV2lkdGggPSB3aWR0aDsKLSAgICAqcEhlaWdodCA9IGhlaWdodDsKLQotCi0gICAgLyogT0ssIHRoYXQncyBhbGwgd2UgbmVlZCBmb3Igbm93OyByZXR1cm4gaGFwcHkgKi8KLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0vKiByZXR1cm5zIDAgaWYgc3VjY2VlZHMsIDEgaWYgZmFpbHMgZHVlIHRvIG5vIGJLR0QgY2h1bmssIDIgaWYgbGlicG5nIGVycm9yOwotICogc2NhbGVzIHZhbHVlcyB0byA4LWJpdCBpZiBuZWNlc3NhcnkgKi8KLQotaW50IHJlYWRwbmdfZ2V0X2JnY29sb3IodWNoICpyZWQsIHVjaCAqZ3JlZW4sIHVjaCAqYmx1ZSkKLXsKLSAgICBwbmdfY29sb3JfMTZwIHBCYWNrZ3JvdW5kOwotCi0KLSAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcKLSAgICAgKiBsaWJwbmcgZnVuY3Rpb24gKi8KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotCi0gICAgaWYgKCFwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT19iS0dEKSkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAvKiBpdCBpcyBub3Qgb2J2aW91cyBmcm9tIHRoZSBsaWJwbmcgZG9jdW1lbnRhdGlvbiwgYnV0IHRoaXMgZnVuY3Rpb24KLSAgICAgKiB0YWtlcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyLCBhbmQgaXQgYWx3YXlzIHJldHVybnMgdmFsaWQgcmVkLCBncmVlbgotICAgICAqIGFuZCBibHVlIHZhbHVlcywgcmVnYXJkbGVzcyBvZiBjb2xvcl90eXBlOiAqLwotCi0gICAgcG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmcEJhY2tncm91bmQpOwotCi0KLSAgICAvKiBob3dldmVyLCBpdCBhbHdheXMgcmV0dXJucyB0aGUgcmF3IGJLR0QgZGF0YSwgcmVnYXJkbGVzcyBvZiBhbnkKLSAgICAgKiBiaXQtZGVwdGggdHJhbnNmb3JtYXRpb25zLCBzbyBjaGVjayBkZXB0aCBhbmQgYWRqdXN0IGlmIG5lY2Vzc2FyeSAqLwotCi0gICAgaWYgKGJpdF9kZXB0aCA9PSAxNikgewotICAgICAgICAqcmVkICAgPSBwQmFja2dyb3VuZC0+cmVkICAgPj4gODsKLSAgICAgICAgKmdyZWVuID0gcEJhY2tncm91bmQtPmdyZWVuID4+IDg7Ci0gICAgICAgICpibHVlICA9IHBCYWNrZ3JvdW5kLT5ibHVlICA+PiA4OwotICAgIH0gZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpIHsKLSAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxKQotICAgICAgICAgICAgKnJlZCA9ICpncmVlbiA9ICpibHVlID0gcEJhY2tncm91bmQtPmdyYXk/IDI1NSA6IDA7Ci0gICAgICAgIGVsc2UgaWYgKGJpdF9kZXB0aCA9PSAyKQotICAgICAgICAgICAgKnJlZCA9ICpncmVlbiA9ICpibHVlID0gKDI1NS8zKSAqIHBCYWNrZ3JvdW5kLT5ncmF5OwotICAgICAgICBlbHNlIC8qIGJpdF9kZXB0aCA9PSA0ICovCi0gICAgICAgICAgICAqcmVkID0gKmdyZWVuID0gKmJsdWUgPSAoMjU1LzE1KSAqIHBCYWNrZ3JvdW5kLT5ncmF5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpyZWQgICA9ICh1Y2gpcEJhY2tncm91bmQtPnJlZDsKLSAgICAgICAgKmdyZWVuID0gKHVjaClwQmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICpibHVlICA9ICh1Y2gpcEJhY2tncm91bmQtPmJsdWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLS8qIGRpc3BsYXlfZXhwb25lbnQgPT0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50ICovCi0KLXVjaCAqcmVhZHBuZ19nZXRfaW1hZ2UoZG91YmxlIGRpc3BsYXlfZXhwb25lbnQsIGludCAqcENoYW5uZWxzLCB1bGcgKnBSb3dieXRlcykKLXsKLSAgICBkb3VibGUgIGdhbW1hOwotICAgIHBuZ191aW50XzMyICBpLCByb3dieXRlczsKLSAgICBwbmdfYnl0ZXBwICByb3dfcG9pbnRlcnMgPSBOVUxMOwotCi0KLSAgICAvKiBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEgUE5HLXJlYWRpbmcKLSAgICAgKiBsaWJwbmcgZnVuY3Rpb24gKi8KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgICAgIGZyZWUocm93X3BvaW50ZXJzKTsKLSAgICAgICAgcm93X3BvaW50ZXJzID0gTlVMTDsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gICAgLyogZXhwYW5kIHBhbGV0dGUgaW1hZ2VzIHRvIFJHQiwgbG93LWJpdC1kZXB0aCBncmF5c2NhbGUgaW1hZ2VzIHRvIDggYml0cywKLSAgICAgKiB0cmFuc3BhcmVuY3kgY2h1bmtzIHRvIGZ1bGwgYWxwaGEgY2hhbm5lbDsgc3RyaXAgMTYtYml0LXBlci1zYW1wbGUKLSAgICAgKiBpbWFnZXMgdG8gOCBiaXRzIHBlciBzYW1wbGU7IGFuZCBjb252ZXJ0IGdyYXlzY2FsZSB0byBSR0JbQV0gKi8KLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgYml0X2RlcHRoIDwgOCkKLSAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKQotICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLSNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAotICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCi0jICBpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAotICAgICAgICBwbmdfc2V0X3NjYWxlXzE2KHBuZ19wdHIpOwotIyAgZWxzZQotICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotIyAgZW5kaWYKLSNlbmRpZgotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOwotCi0KLSAgICAvKiB1bmxpa2UgdGhlIGV4YW1wbGUgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB3ZSBoYXZlICpubyogaWRlYSB3aGVyZQotICAgICAqIHRoaXMgZmlsZSBtYXkgaGF2ZSBjb21lIGZyb20tLXNvIGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIGZpbGUgZ2FtbWEsIGRvbid0Ci0gICAgICogZG8gYW55IGNvcnJlY3Rpb24gKCJkbyBubyBoYXJtIikgKi8KLQotICAgIGlmIChwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZnYW1tYSkpCi0gICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZGlzcGxheV9leHBvbmVudCwgZ2FtbWEpOwotCi0KLSAgICAvKiBhbGwgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiByZWdpc3RlcmVkOyBub3cgdXBkYXRlIGluZm9fcHRyIGRhdGEsCi0gICAgICogZ2V0IHJvd2J5dGVzIGFuZCBjaGFubmVscywgYW5kIGFsbG9jYXRlIGltYWdlIG1lbW9yeSAqLwotCi0gICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgKnBSb3dieXRlcyA9IHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgKnBDaGFubmVscyA9IChpbnQpcG5nX2dldF9jaGFubmVscyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICBpZiAoKGltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzKmhlaWdodCkpID09IE5VTEwpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoKHJvd19wb2ludGVycyA9IChwbmdfYnl0ZXBwKW1hbGxvYyhoZWlnaHQqc2l6ZW9mKHBuZ19ieXRlcCkpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgICBmcmVlKGltYWdlX2RhdGEpOwotICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVHJhY2UoKHN0ZGVyciwgInJlYWRwbmdfZ2V0X2ltYWdlOiAgY2hhbm5lbHMgPSAlZCwgcm93Ynl0ZXMgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwKLSAgICAgICAgKnBDaGFubmVscywgcm93Ynl0ZXMsIGhlaWdodCkpOwotCi0KLSAgICAvKiBzZXQgdGhlIGluZGl2aWR1YWwgcm93X3BvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMgKi8KLQotICAgIGZvciAoaSA9IDA7ICBpIDwgaGVpZ2h0OyAgKytpKQotICAgICAgICByb3dfcG9pbnRlcnNbaV0gPSBpbWFnZV9kYXRhICsgaSpyb3dieXRlczsKLQotCi0gICAgLyogbm93IHdlIGNhbiBnbyBhaGVhZCBhbmQganVzdCByZWFkIHRoZSB3aG9sZSBpbWFnZSAqLwotCi0gICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotCi0gICAgLyogYW5kIHdlJ3JlIGRvbmUhICAocG5nX3JlYWRfZW5kKCkgY2FuIGJlIG9taXR0ZWQgaWYgbm8gcHJvY2Vzc2luZyBvZgotICAgICAqIHBvc3QtSURBVCB0ZXh0L3RpbWUvZXRjLiBpcyBkZXNpcmVkKSAqLwotCi0gICAgZnJlZShyb3dfcG9pbnRlcnMpOwotICAgIHJvd19wb2ludGVycyA9IE5VTEw7Ci0KLSAgICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgTlVMTCk7Ci0KLSAgICByZXR1cm4gaW1hZ2VfZGF0YTsKLX0KLQotCi12b2lkIHJlYWRwbmdfY2xlYW51cChpbnQgZnJlZV9pbWFnZV9kYXRhKQotewotICAgIGlmIChmcmVlX2ltYWdlX2RhdGEgJiYgaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKGltYWdlX2RhdGEpOwotICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAocG5nX3B0ciAmJiBpbmZvX3B0cikgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgcG5nX3B0ciA9IE5VTEw7Ci0gICAgICAgIGluZm9fcHRyID0gTlVMTDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL3JlYWRwbmcuaCBiL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQ5ZmUzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZy5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHBuZy5oCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgVFJVRQotIyAgZGVmaW5lIFRSVUUgMQotIyAgZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICAoKGEpID4gKGIpPyAoYSkgOiAoYikpCi0jICBkZWZpbmUgTUlOKGEsYikgICgoYSkgPCAoYik/IChhKSA6IChiKSkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSMgIGRlZmluZSBUcmFjZSh4KSAge2ZwcmludGYgeCA7IGZmbHVzaChzdGRlcnIpOyBmZmx1c2goc3Rkb3V0KTt9Ci0jZWxzZQotIyAgZGVmaW5lIFRyYWNlKHgpICA7Ci0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWNoOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdXNoOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWxnOwotCi0KLS8qIHByb3RvdHlwZXMgZm9yIHB1YmxpYyBmdW5jdGlvbnMgaW4gcmVhZHBuZy5jICovCi0KLXZvaWQgcmVhZHBuZ192ZXJzaW9uX2luZm8odm9pZCk7Ci0KLWludCByZWFkcG5nX2luaXQoRklMRSAqaW5maWxlLCB1bGcgKnBXaWR0aCwgdWxnICpwSGVpZ2h0KTsKLQotaW50IHJlYWRwbmdfZ2V0X2JnY29sb3IodWNoICpiZ19yZWQsIHVjaCAqYmdfZ3JlZW4sIHVjaCAqYmdfYmx1ZSk7Ci0KLXVjaCAqcmVhZHBuZ19nZXRfaW1hZ2UoZG91YmxlIGRpc3BsYXlfZXhwb25lbnQsIGludCAqcENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICB1bGcgKnBSb3dieXRlcyk7Ci0KLXZvaWQgcmVhZHBuZ19jbGVhbnVwKGludCBmcmVlX2ltYWdlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jIGIvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDVlMzhmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBuZzIuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nMiAtIHByb2dyZXNzaXZlLW1vZGVsIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgIHJlYWRwbmcyLmMKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENoYW5nZWxvZzoKLSAgICAgMjAxNS0xMS0xMiAtIENoZWNrIHJldHVybiB2YWx1ZSBvZiBwbmdfZ2V0X2JLR0QoKSAoR2xlbm4gUi1QKQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgLyogZm9yIGV4aXQoKSBwcm90b3R5cGUgKi8KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2luY2x1ZGUgPHpsaWIuaD4KLSNpbmNsdWRlICJwbmcuaCIgICAgICAgIC8qIGxpYnBuZyBoZWFkZXIgZnJvbSB0aGUgbG9jYWwgZGlyZWN0b3J5ICovCi0jaW5jbHVkZSAicmVhZHBuZzIuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcHVibGljIHByb3RvdHlwZXMgKi8KLQotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB2b2lkIHJlYWRwbmcyX2luZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKTsKLXN0YXRpYyB2b2lkIHJlYWRwbmcyX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgbmV3X3JvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKTsKLXN0YXRpYyB2b2lkIHJlYWRwbmcyX2VuZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpOwotc3RhdGljIHZvaWQgcmVhZHBuZzJfZXJyb3JfaGFuZGxlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKTsKLXN0YXRpYyB2b2lkIHJlYWRwbmcyX3dhcm5pbmdfaGFuZGxlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKTsKLQotCi0KLQotdm9pZCByZWFkcG5nMl92ZXJzaW9uX2luZm8odm9pZCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIENvbXBpbGVkIHdpdGggbGlicG5nICVzOyB1c2luZyBsaWJwbmcgJXNcbiIsCi0gICAgICBQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBuZ19saWJwbmdfdmVyKTsKLQotICAgIGZwcmludGYoc3RkZXJyLCAiICAgYW5kIHdpdGggemxpYiAlczsgdXNpbmcgemxpYiAlcy5cbiIsCi0gICAgICBaTElCX1ZFUlNJT04sIHpsaWJfdmVyc2lvbik7Ci19Ci0KLQotCi0KLWludCByZWFkcG5nMl9jaGVja19zaWcodWNoICpzaWcsIGludCBudW0pCi17Ci0gICAgcmV0dXJuICFwbmdfc2lnX2NtcChzaWcsIDAsIG51bSk7Ci19Ci0KLQotCi0KLS8qIHJldHVybnMgMCBmb3Igc3VjY2VzcywgMiBmb3IgbGlicG5nIHByb2JsZW0sIDQgZm9yIG91dCBvZiBtZW1vcnkgKi8KLQotaW50IHJlYWRwbmcyX2luaXQobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKQotewotICAgIHBuZ19zdHJ1Y3RwICBwbmdfcHRyOyAgICAgICAvKiBub3RlOiAgdGVtcG9yYXJ5IHZhcmlhYmxlcyEgKi8KLSAgICBwbmdfaW5mb3AgIGluZm9fcHRyOwotCi0KLSAgICAvKiBjb3VsZCBhbHNvIHJlcGxhY2UgbGlicG5nIHdhcm5pbmctaGFuZGxlciAoZmluYWwgTlVMTCksIGJ1dCBubyBuZWVkOiAqLwotCi0gICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QocG5nX2dldF9saWJwbmdfdmVyKE5VTEwpLCBtYWlucHJvZ19wdHIsCi0gICAgICByZWFkcG5nMl9lcnJvcl9oYW5kbGVyLCByZWFkcG5nMl93YXJuaW5nX2hhbmRsZXIpOwotICAgIGlmICghcG5nX3B0cikKLSAgICAgICAgcmV0dXJuIDQ7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotCi0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOwotICAgICAgICByZXR1cm4gNDsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0gICAgfQotCi0KLSAgICAvKiB3ZSBjb3VsZCBjcmVhdGUgYSBzZWNvbmQgaW5mbyBzdHJ1Y3QgaGVyZSAoZW5kX2luZm8pLCBidXQgaXQncyBvbmx5Ci0gICAgICogdXNlZnVsIGlmIHdlIHdhbnQgdG8ga2VlcCBwcmUtIGFuZCBwb3N0LUlEQVQgY2h1bmsgaW5mbyBzZXBhcmF0ZWQKLSAgICAgKiAobWFpbmx5IGZvciBQTkctYXdhcmUgaW1hZ2UgZWRpdG9ycyBhbmQgY29udmVydGVycykgKi8KLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uLCB1bmxlc3MgYW4gYWx0ZXJuYXRlIGVycm9yIGhhbmRsZXIgd2FzIGluc3RhbGxlZC0tCi0gICAgICogYnV0IGNvbXBhdGlibGUgZXJyb3IgaGFuZGxlcnMgbXVzdCBlaXRoZXIgdXNlIGxvbmdqbXAoKSB0aGVtc2VsdmVzCi0gICAgICogKGFzIGluIHRoaXMgcHJvZ3JhbSkgb3IgZXhpdCBpbW1lZGlhdGVseSwgc28gaGVyZSB3ZSBhcmU6ICovCi0KLSAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSNpZmRlZiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVECi0gICAgLyogcHJlcGFyZSB0aGUgcmVhZGVyIHRvIGlnbm9yZSBhbGwgcmVjb2duaXplZCBjaHVua3Mgd2hvc2UgZGF0YSB3b24ndCBiZQotICAgICAqIHVzZWQsIGkuZS4sIGFsbCBjaHVua3MgcmVjb2duaXplZCBieSBsaWJwbmcgZXhjZXB0IGZvciBJSERSLCBQTFRFLCBJREFULAotICAgICAqIElFTkQsIHRSTlMsIGJLR0QsIGdBTUEsIGFuZCBzUkdCIChzbWFsbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCkgKi8KLSAgICB7Ci0gICAgICAgIC8qIFRoZXNlIGJ5dGUgc3RyaW5ncyB3ZXJlIGNvcGllZCBmcm9tIHBuZy5oLiAgSWYgYSBmdXR1cmUgdmVyc2lvbgotICAgICAgICAgKiBvZiByZWFkcG5nMi5jIHJlY29nbml6ZXMgbW9yZSBjaHVua3MsIGFkZCB0aGVtIHRvIHRoaXMgbGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBQTkdfQ09OU1QgcG5nX2J5dGUgY2h1bmtzX3RvX3Byb2Nlc3NbXSA9IHsKLSAgICAgICAgICAgIDk4LCAgNzUsICA3MSwgIDY4LCAnXDAnLCAgLyogYktHRCAqLwotICAgICAgICAgICAxMDMsICA2NSwgIDc3LCAgNjUsICdcMCcsICAvKiBnQU1BICovCi0gICAgICAgICAgIDExNSwgIDgyLCAgNzEsICA2NiwgJ1wwJywgIC8qIHNSR0IgKi8KLSAgICAgICAgICAgfTsKLQotICAgICAgIC8qIElnbm9yZSBhbGwgY2h1bmtzIGV4Y2VwdCBmb3IgSUhEUiwgUExURSwgdFJOUywgSURBVCwgYW5kIElFTkQgKi8KLSAgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nX3B0ciwgLTEgLyogUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAqLywKLSAgICAgICAgICBOVUxMLCAtMSk7Ci0KLSAgICAgICAvKiBCdXQgZG8gbm90IGlnbm9yZSBjaHVua3MgaW4gdGhlICJjaHVua3NfdG9fcHJvY2VzcyIgbGlzdCAqLwotICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLAotICAgICAgICAgIDAgLyogUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUICovLCBjaHVua3NfdG9fcHJvY2VzcywKLSAgICAgICAgICBzaXplb2YoY2h1bmtzX3RvX3Byb2Nlc3MpLzUpOwotICAgIH0KLSNlbmRpZiAvKiBQTkdfSEFORExFX0FTX1VOS05PV05fU1VQUE9SVEVEICovCi0KLQotICAgIC8qIGluc3RlYWQgb2YgZG9pbmcgcG5nX2luaXRfaW8oKSBoZXJlLCBub3cgd2Ugc2V0IHVwIG91ciBjYWxsYmFjawotICAgICAqIGZ1bmN0aW9ucyBmb3IgcHJvZ3Jlc3NpdmUgZGVjb2RpbmcgKi8KLQotICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwbmdfcHRyLCBtYWlucHJvZ19wdHIsCi0gICAgICByZWFkcG5nMl9pbmZvX2NhbGxiYWNrLCByZWFkcG5nMl9yb3dfY2FsbGJhY2ssIHJlYWRwbmcyX2VuZF9jYWxsYmFjayk7Ci0KLQotICAgIC8qIG1ha2Ugc3VyZSB3ZSBzYXZlIG91ciBwb2ludGVycyBmb3IgdXNlIGluIHJlYWRwbmcyX2RlY29kZV9kYXRhKCkgKi8KLQotICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IHBuZ19wdHI7Ci0gICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IGluZm9fcHRyOwotCi0KLSAgICAvKiBhbmQgdGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpbml0aWFsaXphdGlvbiAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLS8qIHJldHVybnMgMCBmb3Igc3VjY2VzcywgMiBmb3IgbGlicG5nIChsb25nam1wKSBwcm9ibGVtICovCi0KLWludCByZWFkcG5nMl9kZWNvZGVfZGF0YShtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIsIHVjaCAqcmF3YnVmLCB1bGcgbGVuZ3RoKQotewotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOwotICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKLQotCi0gICAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nCi0gICAgICogbGlicG5nIGZ1bmN0aW9uICovCi0KLSAgICBpZiAoc2V0am1wKG1haW5wcm9nX3B0ci0+am1wYnVmKSkgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotCi0gICAgLyogaGFuZCBvZmYgdGhlIG5leHQgY2h1bmsgb2YgaW5wdXQgZGF0YSB0byBsaWJwbmcgZm9yIGRlY29kaW5nICovCi0KLSAgICBwbmdfcHJvY2Vzc19kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCByYXdidWYsIGxlbmd0aCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQgcmVhZHBuZzJfaW5mb19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIpCi17Ci0gICAgbWFpbnByb2dfaW5mbyAgKm1haW5wcm9nX3B0cjsKLSAgICBpbnQgIGNvbG9yX3R5cGUsIGJpdF9kZXB0aDsKLSAgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OwotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICBkb3VibGUgIGdhbW1hOwotI2Vsc2UKLSAgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWE7Ci0jZW5kaWYKLQotCi0gICAgLyogc2V0am1wKCkgZG9lc24ndCBtYWtlIHNlbnNlIGhlcmUsIGJlY2F1c2Ugd2UnZCBlaXRoZXIgaGF2ZSB0byBleGl0KCksCi0gICAgICogbG9uZ2ptcCgpIG91cnNlbHZlcywgb3IgcmV0dXJuIGNvbnRyb2wgdG8gbGlicG5nLCB3aGljaCBkb2Vzbid0IHdhbnQKLSAgICAgKiB0byBzZWUgdXMgYWdhaW4uICBCeSBub3QgZG9pbmcgYW55dGhpbmcgaGVyZSwgbGlicG5nIHdpbGwgaW5zdGVhZCBqdW1wCi0gICAgICogdG8gcmVhZHBuZzJfZGVjb2RlX2RhdGEoKSwgd2hpY2ggY2FuIHJldHVybiBhbiBlcnJvciB2YWx1ZSB0byB0aGUgbWFpbgotICAgICAqIHByb2dyYW0uICovCi0KLQotICAgIC8qIHJldHJpZXZlIHRoZSBwb2ludGVyIHRvIG91ciBzcGVjaWFsLXB1cnBvc2Ugc3RydWN0LCB1c2luZyB0aGUgcG5nX3B0cgotICAgICAqIHRoYXQgbGlicG5nIHBhc3NlZCBiYWNrIHRvIHVzIChpLmUuLCBub3QgYSBnbG9iYWwgdGhpcyB0aW1lLS10aGVyZSdzCi0gICAgICogbm8gcmVhbCBkaWZmZXJlbmNlIGZvciBhIHNpbmdsZSBpbWFnZSwgYnV0IGZvciBhIG11bHRpdGhyZWFkZWQgYnJvd3NlcgotICAgICAqIGRlY29kaW5nIHNldmVyYWwgUE5HIGltYWdlcyBhdCB0aGUgc2FtZSB0aW1lLCBvbmUgbmVlZHMgdG8gYXZvaWQgbWl4aW5nCi0gICAgICogdXAgZGlmZmVyZW50IGltYWdlcycgc3RydWN0cykgKi8KLQotICAgIG1haW5wcm9nX3B0ciA9IHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOwotCi0gICAgaWYgKG1haW5wcm9nX3B0ciA9PSBOVUxMKSB7ICAgICAgICAgLyogd2UgYmUgaG9zZWQgKi8KLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgInJlYWRwbmcyIGVycm9yOiAgbWFpbiBzdHJ1Y3Qgbm90IHJlY292ZXJhYmxlIGluIGluZm9fY2FsbGJhY2suXG4iKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgLyoKLSAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgd2UgY291bGQgY2FsbCBvdXIgZXJyb3ItaGFuZGxlciBqdXN0IGxpa2UgbGlicG5nCi0gICAgICAgICAqIGRvZXMsIHdoaWNoIHdvdWxkIGVmZmVjdGl2ZWx5IHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4gIFNpbmNlIHRoaXMKLSAgICAgICAgICogY2FuIG9ubHkgaGFwcGVuIGlmIHBuZ19wdHIgZ2V0cyByZWRpcmVjdGVkIHNvbWV3aGVyZSBvZGQgb3IgdGhlCi0gICAgICAgICAqIG1haW4gUE5HIHN0cnVjdCBnZXRzIHdpcGVkLCB3ZSdyZSBwcm9iYWJseSB0b2FzdCBhbnl3YXkuICAoSWYKLSAgICAgICAgICogcG5nX3B0ciBpdHNlbGYgaXMgTlVMTCwgd2Ugd291bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQuKQotICAgICAgICAgKi8KLSAgICB9Ci0KLQotICAgIC8qIHRoaXMgaXMganVzdCBsaWtlIGluIHRoZSBub24tcHJvZ3Jlc3NpdmUgY2FzZSAqLwotCi0gICAgcG5nX2dldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAotICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIG1haW5wcm9nX3B0ci0+d2lkdGggPSAodWxnKXdpZHRoOwotICAgIG1haW5wcm9nX3B0ci0+aGVpZ2h0ID0gKHVsZyloZWlnaHQ7Ci0KLQotICAgIC8qIHNpbmNlIHdlIGtub3cgd2UndmUgcmVhZCBhbGwgb2YgdGhlIFBORyBmaWxlJ3MgImhlYWRlciIgKGkuZS4sIHVwCi0gICAgICogdG8gSURBVCksIHdlIGNhbiBjaGVjayBmb3IgYSBiYWNrZ3JvdW5kIGNvbG9yIGhlcmUgKi8KLQotICAgIGlmIChtYWlucHJvZ19wdHItPm5lZWRfYmdjb2xvcikKLSAgICB7Ci0gICAgICAgIHBuZ19jb2xvcl8xNnAgcEJhY2tncm91bmQ7Ci0KLSAgICAgICAgLyogaXQgaXMgbm90IG9idmlvdXMgZnJvbSB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIGJ1dCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAqIHRha2VzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIsIGFuZCBpdCBhbHdheXMgcmV0dXJucyB2YWxpZCByZWQsCi0gICAgICAgICAqIGdyZWVuIGFuZCBibHVlIHZhbHVlcywgcmVnYXJkbGVzcyBvZiBjb2xvcl90eXBlOiAqLwotICAgICAgICBpZiAocG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmcEJhY2tncm91bmQpKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgLyogaG93ZXZlciwgaXQgYWx3YXlzIHJldHVybnMgdGhlIHJhdyBiS0dEIGRhdGEsIHJlZ2FyZGxlc3Mgb2YgYW55Ci0gICAgICAgICAgICAqIGJpdC1kZXB0aCB0cmFuc2Zvcm1hdGlvbnMsIHNvIGNoZWNrIGRlcHRoIGFuZCBhZGp1c3QgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICBpZiAoYml0X2RlcHRoID09IDE2KSB7Ci0gICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCAgID0gcEJhY2tncm91bmQtPnJlZCAgID4+IDg7Ci0gICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2dyZWVuID0gcEJhY2tncm91bmQtPmdyZWVuID4+IDg7Ci0gICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2JsdWUgID0gcEJhY2tncm91bmQtPmJsdWUgID4+IDg7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpIHsKLSAgICAgICAgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMSkKLSAgICAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPQotICAgICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlID0gcEJhY2tncm91bmQtPmdyYXk/IDI1NSA6IDA7Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChiaXRfZGVwdGggPT0gMikKLSAgICAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX3JlZCA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPQotICAgICAgICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19ibHVlID0gKDI1NS8zKSAqIHBCYWNrZ3JvdW5kLT5ncmF5OwotICAgICAgICAgICAgICAgZWxzZSAvKiBiaXRfZGVwdGggPT0gNCAqLwotICAgICAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfcmVkID0gbWFpbnByb2dfcHRyLT5iZ19ncmVlbiA9Ci0gICAgICAgICAgICAgICAgICAgICBtYWlucHJvZ19wdHItPmJnX2JsdWUgPSAoMjU1LzE1KSAqIHBCYWNrZ3JvdW5kLT5ncmF5OwotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgbWFpbnByb2dfcHRyLT5iZ19yZWQgICA9ICh1Y2gpcEJhY2tncm91bmQtPnJlZDsKLSAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfZ3JlZW4gPSAodWNoKXBCYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgICAgICAgIG1haW5wcm9nX3B0ci0+YmdfYmx1ZSAgPSAodWNoKXBCYWNrZ3JvdW5kLT5ibHVlOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qIGFzIGJlZm9yZSwgbGV0IGxpYnBuZyBleHBhbmQgcGFsZXR0ZSBpbWFnZXMgdG8gUkdCLCBsb3ctYml0LWRlcHRoCi0gICAgICogZ3JheXNjYWxlIGltYWdlcyB0byA4IGJpdHMsIHRyYW5zcGFyZW5jeSBjaHVua3MgdG8gZnVsbCBhbHBoYSBjaGFubmVsOwotICAgICAqIHN0cmlwIDE2LWJpdC1wZXItc2FtcGxlIGltYWdlcyB0byA4IGJpdHMgcGVyIHNhbXBsZTsgYW5kIGNvbnZlcnQKLSAgICAgKiBncmF5c2NhbGUgdG8gUkdCW0FdICovCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpCi0gICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0jaWZkZWYgUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQKLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotIyAgaWZkZWYgUE5HX1JFQURfU0NBTEVfMTZfVE9fOF9TVVBQT1JURUQKLSAgICAgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKLSMgIGVsc2UKLSAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKLSMgIGVuZGlmCi0jZW5kaWYKLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKLQotCi0gICAgLyogVW5saWtlIHRoZSBiYXNpYyB2aWV3ZXIsIHdoaWNoIHdhcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIGxvY2FsIGZpbGVzLAotICAgICAqIHRoaXMgcHJvZ3JhbSBpcyBpbnRlbmRlZCB0byBzaW11bGF0ZSBhIHdlYiBicm93c2VyLS1ldmVuIHRob3VnaCB3ZQotICAgICAqIGFjdHVhbGx5IHJlYWQgZnJvbSBhIGxvY2FsIGZpbGUsIHRvby4gIEJ1dCBiZWNhdXNlIHdlIGFyZSBwcmV0ZW5kaW5nCi0gICAgICogdGhhdCBtb3N0IG9mIHRoZSBpbWFnZXMgb3JpZ2luYXRlIG9uIHRoZSBJbnRlcm5ldCwgd2UgZm9sbG93IHRoZSByZWNvbS0KLSAgICAgKiBtZW5kYXRpb24gb2YgdGhlIHNSR0IgcHJvcG9zYWwgYW5kIHRyZWF0IHVubGFiZWxsZWQgaW1hZ2VzIChubyBnQU1BCi0gICAgICogY2h1bmspIGFzIGV4aXN0aW5nIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLiAgVGhhdCBpcywgd2UgYXNzdW1lIHRoYXQKLSAgICAgKiBzdWNoIGltYWdlcyBoYXZlIGEgZmlsZSBnYW1tYSBvZiAwLjQ1NDU1LCB3aGljaCBjb3JyZXNwb25kcyB0byBhIFBDLWxpa2UKLSAgICAgKiBkaXNwbGF5IHN5c3RlbS4gIFRoaXMgY2hhbmdlIGluIGFzc3VtcHRpb25zIHdpbGwgaGF2ZSBubyBlZmZlY3Qgb24gYQotICAgICAqIFBDLWxpa2Ugc3lzdGVtLCBidXQgb24gYSBNYWMsIFNHSSwgTmVYVCBvciBvdGhlciBzeXN0ZW0gd2l0aCBhIG5vbi0KLSAgICAgKiBpZGVudGl0eSBsb29rdXAgdGFibGUsIGl0IHdpbGwgZGFya2VuIHVubGFiZWxsZWQgaW1hZ2VzLCB3aGljaCBlZmZlYy0KLSAgICAgKiB0aXZlbHkgZmF2b3JzIGltYWdlcyBmcm9tIFBDLWxpa2Ugc3lzdGVtcyBvdmVyIHRob3NlIG9yaWdpbmF0aW5nIG9uCi0gICAgICogdGhlIGxvY2FsIHBsYXRmb3JtLiAgTm90ZSB0aGF0IG1haW5wcm9nX3B0ci0+ZGlzcGxheV9leHBvbmVudCBpcyB0aGUKLSAgICAgKiAiZ2FtbWEiIHZhbHVlIGZvciB0aGUgZW50aXJlIGRpc3BsYXkgc3lzdGVtLCBpLmUuLCB0aGUgcHJvZHVjdCBvZgotICAgICAqIExVVF9leHBvbmVudCBhbmQgQ1JUX2V4cG9uZW50LiAqLwotCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgIGlmIChwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZnYW1tYSkpCi0gICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgbWFpbnByb2dfcHRyLT5kaXNwbGF5X2V4cG9uZW50LCBnYW1tYSk7Ci0gICAgZWxzZQotICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+ZGlzcGxheV9leHBvbmVudCwgMC40NTQ1NSk7Ci0jZWxzZQotICAgIGlmIChwbmdfZ2V0X2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsICZnYW1tYSkpCi0gICAgICAgIHBuZ19zZXRfZ2FtbWFfZml4ZWQocG5nX3B0ciwKLSAgICAgICAgICAgIChwbmdfZml4ZWRfcG9pbnQpKDEwMDAwMCptYWlucHJvZ19wdHItPmRpc3BsYXlfZXhwb25lbnQrLjUpLCBnYW1tYSk7Ci0gICAgZWxzZQotICAgICAgICBwbmdfc2V0X2dhbW1hX2ZpeGVkKHBuZ19wdHIsCi0gICAgICAgICAgICAocG5nX2ZpeGVkX3BvaW50KSgxMDAwMDAqbWFpbnByb2dfcHRyLT5kaXNwbGF5X2V4cG9uZW50Ky41KSwgNDU0NTUpOwotI2VuZGlmCi0KLSAgICAvKiB3ZSdsbCBsZXQgbGlicG5nIGV4cGFuZCBpbnRlcmxhY2VkIGltYWdlcywgdG9vICovCi0KLSAgICBtYWlucHJvZ19wdHItPnBhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi0KLSAgICAvKiBhbGwgdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiByZWdpc3RlcmVkOyBub3cgdXBkYXRlIGluZm9fcHRyIGRhdGEgYW5kCi0gICAgICogdGhlbiBnZXQgcm93Ynl0ZXMgYW5kIGNoYW5uZWxzICovCi0KLSAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICBtYWlucHJvZ19wdHItPnJvd2J5dGVzID0gKGludClwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICBtYWlucHJvZ19wdHItPmNoYW5uZWxzID0gcG5nX2dldF9jaGFubmVscyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLQotICAgIC8qIENhbGwgdGhlIG1haW4gcHJvZ3JhbSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbWFnZSBidWZmZXIgYW5kCi0gICAgICogaW5pdGlhbGl6ZSB3aW5kb3dzIGFuZCB3aGF0bm90LiAgKFRoZSBvbGQtc3R5bGUgZnVuY3Rpb24tcG9pbnRlcgotICAgICAqIGludm9jYXRpb24gaXMgdXNlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgZmV3IHN1cHBvc2VkbHkgQU5TSQotICAgICAqIGNvbXBpbGVycyB0aGF0IG5ldmVydGhlbGVzcyBiYXJmIG9uICJmbl9wdHIoKSItc3R5bGUgc3ludGF4LikgKi8KLQotICAgICgqbWFpbnByb2dfcHRyLT5tYWlucHJvZ19pbml0KSgpOwotCi0KLSAgICAvKiBhbmQgdGhhdCB0YWtlcyBjYXJlIG9mIGluaXRpYWxpemF0aW9uICovCi0KLSAgICByZXR1cm47Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcmVhZHBuZzJfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKQotewotICAgIG1haW5wcm9nX2luZm8gICptYWlucHJvZ19wdHI7Ci0KLQotICAgIC8qIGZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlIHJvdyBkaWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIHBhc3M7IGlmIG5vdCwKLSAgICAgKiBub3RoaW5nIHRvIGNvbWJpbmUgb3IgZGlzcGxheSAqLwotCi0gICAgaWYgKCFuZXdfcm93KQotICAgICAgICByZXR1cm47Ci0KLQotICAgIC8qIHJldHJpZXZlIHRoZSBwb2ludGVyIHRvIG91ciBzcGVjaWFsLXB1cnBvc2Ugc3RydWN0IHNvIHdlIGNhbiBhY2Nlc3MKLSAgICAgKiB0aGUgb2xkIHJvd3MgYW5kIGltYWdlLWRpc3BsYXkgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQotICAgIG1haW5wcm9nX3B0ciA9IHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOwotCi0KLSAgICAvKiBzYXZlIHRoZSBwYXNzIG51bWJlciBmb3Igb3B0aW9uYWwgdXNlIGJ5IHRoZSBmcm9udCBlbmQgKi8KLQotICAgIG1haW5wcm9nX3B0ci0+cGFzcyA9IHBhc3M7Ci0KLQotICAgIC8qIGhhdmUgbGlicG5nIGVpdGhlciBjb21iaW5lIHRoZSBuZXcgcm93IGRhdGEgd2l0aCB0aGUgZXhpc3Rpbmcgcm93IGRhdGEKLSAgICAgKiBmcm9tIHByZXZpb3VzIHBhc3NlcyAoaWYgaW50ZXJsYWNlZCkgb3IgZWxzZSBqdXN0IGNvcHkgdGhlIG5ldyByb3cKLSAgICAgKiBpbnRvIHRoZSBtYWluIHByb2dyYW0ncyBpbWFnZSBidWZmZXIgKi8KLQotICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBtYWlucHJvZ19wdHItPnJvd19wb2ludGVyc1tyb3dfbnVtXSwKLSAgICAgIG5ld19yb3cpOwotCi0KLSAgICAvKiBmaW5hbGx5LCBjYWxsIHRoZSBkaXNwbGF5IHJvdXRpbmUgaW4gdGhlIG1haW4gcHJvZ3JhbSB3aXRoIHRoZSBudW1iZXIKLSAgICAgKiBvZiB0aGUgcm93IHdlIGp1c3QgdXBkYXRlZCAqLwotCi0gICAgKCptYWlucHJvZ19wdHItPm1haW5wcm9nX2Rpc3BsYXlfcm93KShyb3dfbnVtKTsKLQotCi0gICAgLyogYW5kIHdlJ3JlIHJlYWR5IGZvciBtb3JlICovCi0KLSAgICByZXR1cm47Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcmVhZHBuZzJfZW5kX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgICBtYWlucHJvZ19pbmZvICAqbWFpbnByb2dfcHRyOwotCi0KLSAgICAvKiByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byBvdXIgc3BlY2lhbC1wdXJwb3NlIHN0cnVjdCAqLwotCi0gICAgbWFpbnByb2dfcHRyID0gcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7Ci0KLQotICAgIC8qIGxldCB0aGUgbWFpbiBwcm9ncmFtIGtub3cgdGhhdCBpdCBzaG91bGQgZmx1c2ggYW55IGJ1ZmZlcmVkIGltYWdlCi0gICAgICogZGF0YSB0byB0aGUgZGlzcGxheSBub3cgYW5kIHNldCBhICJkb25lIiBmbGFnIG9yIHdoYXRldmVyLCBidXQgbm90ZQotICAgICAqIHRoYXQgaXQgU0hPVUxEIE5PVCBERVNUUk9ZIFRIRSBQTkcgU1RSVUNUUyBZRVQtLWluIG90aGVyIHdvcmRzLCBkbwotICAgICAqIE5PVCBjYWxsIHJlYWRwbmcyX2NsZWFudXAoKSBlaXRoZXIgaGVyZSBvciBpbiB0aGUgZmluaXNoX2Rpc3BsYXkoKQotICAgICAqIHJvdXRpbmU7IHdhaXQgdW50aWwgY29udHJvbCByZXR1cm5zIHRvIHRoZSBtYWluIHByb2dyYW0gdmlhCi0gICAgICogcmVhZHBuZzJfZGVjb2RlX2RhdGEoKSAqLwotCi0gICAgKCptYWlucHJvZ19wdHItPm1haW5wcm9nX2ZpbmlzaF9kaXNwbGF5KSgpOwotCi0KLSAgICAvKiBhbGwgZG9uZSAqLwotCi0gICAgKHZvaWQpaW5mb19wdHI7IC8qIFVudXNlZCAqLwotCi0gICAgcmV0dXJuOwotfQotCi0KLQotCi0KLXZvaWQgcmVhZHBuZzJfY2xlYW51cChtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0gICAgaWYgKHBuZ19wdHIgJiYgaW5mb19wdHIpCi0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotCi0gICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKLSAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLX0KLQotCi1zdGF0aWMgdm9pZCByZWFkcG5nMl93YXJuaW5nX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZykKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInJlYWRwbmcyIGxpYnBuZyB3YXJuaW5nOiAlc1xuIiwgbXNnKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAodm9pZClwbmdfcHRyOyAvKiBVbnVzZWQgKi8KLX0KLQotCi1zdGF0aWMgdm9pZCByZWFkcG5nMl9lcnJvcl9oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCi17Ci0gICAgbWFpbnByb2dfaW5mbyAgKm1haW5wcm9nX3B0cjsKLQotICAgIC8qIFRoaXMgZnVuY3Rpb24sIGFzaWRlIGZyb20gdGhlIGV4dHJhIHN0ZXAgb2YgcmV0cmlldmluZyB0aGUgImVycm9yCi0gICAgICogcG9pbnRlciIgKGJlbG93KSBhbmQgdGhlIGZhY3QgdGhhdCBpdCBleGlzdHMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIHJhdGhlciB0aGFuIHdpdGhpbiBsaWJwbmcsIGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBsaWJwbmcncwotICAgICAqIGRlZmF1bHQgZXJyb3IgaGFuZGxlci4gIFRoZSBzZWNvbmQgcG9pbnQgaXMgY3JpdGljYWw6ICBzaW5jZSBib3RoCi0gICAgICogc2V0am1wKCkgYW5kIGxvbmdqbXAoKSBhcmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgY29kZSwgdGhleSBhcmUKLSAgICAgKiBndWFyYW50ZWVkIHRvIGhhdmUgY29tcGF0aWJsZSBub3Rpb25zIG9mIGhvdyBiaWcgYSBqbXBfYnVmIGlzLAotICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBfQlNEX1NPVVJDRSBvciBhbnl0aGluZyBlbHNlIGhhcyAob3IgaGFzIG5vdCkKLSAgICAgKiBiZWVuIGRlZmluZWQuICovCi0KLSAgICBmcHJpbnRmKHN0ZGVyciwgInJlYWRwbmcyIGxpYnBuZyBlcnJvcjogJXNcbiIsIG1zZyk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICBtYWlucHJvZ19wdHIgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKLSAgICBpZiAobWFpbnByb2dfcHRyID09IE5VTEwpIHsgICAgICAgICAvKiB3ZSBhcmUgY29tcGxldGVseSBob3NlZCBub3cgKi8KLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgInJlYWRwbmcyIHNldmVyZSBlcnJvcjogIGptcGJ1ZiBub3QgcmVjb3ZlcmFibGU7IHRlcm1pbmF0aW5nLlxuIik7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICBleGl0KDk5KTsKLSAgICB9Ci0KLSAgICAvKiBOb3cgd2UgaGF2ZSBvdXIgZGF0YSBzdHJ1Y3R1cmUgd2UgY2FuIHVzZSB0aGUgaW5mb3JtYXRpb24gaW4gaXQKLSAgICAgKiB0byByZXR1cm4gY29udHJvbCB0byBvdXIgb3duIGhpZ2hlciBsZXZlbCBjb2RlIChhbGwgdGhlIHBvaW50cwotICAgICAqIHdoZXJlICdzZXRqbXAnIGlzIGNhbGxlZCBpbiB0aGlzIGZpbGUuKSAgVGhpcyB3aWxsIHdvcmsgd2l0aCBvdGhlcgotICAgICAqIGVycm9yIGhhbmRsaW5nIG1lY2hhbmlzbXMgYXMgd2VsbCAtIGxpYnBuZyBhbHdheXMgY2FsbHMgcG5nX2Vycm9yCi0gICAgICogd2hlbiBpdCBjYW4gcHJvY2VlZCBubyBmdXJ0aGVyLCB0aHVzLCBzbyBsb25nIGFzIHRoZSBlcnJvciBoYW5kbGVyCi0gICAgICogaXMgaW50ZXJjZXB0ZWQsIGFwcGxpY2F0aW9uIGNvZGUgY2FuIGRvIGl0cyBvd24gZXJyb3IgcmVjb3ZlcnkuCi0gICAgICovCi0gICAgbG9uZ2ptcChtYWlucHJvZ19wdHItPmptcGJ1ZiwgMSk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL3JlYWRwbmcyLmggYi9jb250cmliL2dyZWdib29rL3JlYWRwbmcyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMzY2MGQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9ncmVnYm9vay9yZWFkcG5nMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgcmVhZHBuZzIuaAotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFRSVUUKLSMgIGRlZmluZSBUUlVFIDEKLSMgIGRlZmluZSBGQUxTRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVgKLSMgIGRlZmluZSBNQVgoYSxiKSAgKChhKSA+IChiKT8gKGEpIDogKGIpKQotIyAgZGVmaW5lIE1JTihhLGIpICAoKGEpIDwgKGIpPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0jICBkZWZpbmUgVHJhY2UoeCkgIHtmcHJpbnRmIHggOyBmZmx1c2goc3RkZXJyKTsgZmZsdXNoKHN0ZG91dCk7fQotI2Vsc2UKLSMgIGRlZmluZSBUcmFjZSh4KSAgOwotI2VuZGlmCi0KLWVudW0gcnBuZzJfc3RhdGVzIHsKLSAgICBrUHJlSW5pdCA9IDAsCi0gICAga1dpbmRvd0luaXQsCi0gICAga0RvbmUKLX07Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVjaDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVzaDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVsZzsKLQotdHlwZWRlZiBzdHJ1Y3QgX21haW5wcm9nX2luZm8gewotICAgIGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50OwotICAgIHVsZyB3aWR0aDsKLSAgICB1bGcgaGVpZ2h0OwotICAgIHZvaWQgKnBuZ19wdHI7Ci0gICAgdm9pZCAqaW5mb19wdHI7Ci0gICAgdm9pZCAoKm1haW5wcm9nX2luaXQpKHZvaWQpOwotICAgIHZvaWQgKCptYWlucHJvZ19kaXNwbGF5X3JvdykodWxnIHJvd19udW0pOwotICAgIHZvaWQgKCptYWlucHJvZ19maW5pc2hfZGlzcGxheSkodm9pZCk7Ci0gICAgdWNoICppbWFnZV9kYXRhOwotICAgIHVjaCAqKnJvd19wb2ludGVyczsKLSAgICBqbXBfYnVmIGptcGJ1ZjsKLSAgICBpbnQgcGFzc2VzOyAgICAgICAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICBpbnQgcGFzczsKLSAgICBpbnQgcm93Ynl0ZXM7Ci0gICAgaW50IGNoYW5uZWxzOwotICAgIGludCBuZWVkX2JnY29sb3I7Ci0gICAgaW50IHN0YXRlOwotICAgIHVjaCBiZ19yZWQ7Ci0gICAgdWNoIGJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlOwotfSBtYWlucHJvZ19pbmZvOwotCi0KLS8qIHByb3RvdHlwZXMgZm9yIHB1YmxpYyBmdW5jdGlvbnMgaW4gcmVhZHBuZzIuYyAqLwotCi12b2lkIHJlYWRwbmcyX3ZlcnNpb25faW5mbyh2b2lkKTsKLQotaW50IHJlYWRwbmcyX2NoZWNrX3NpZyh1Y2ggKnNpZywgaW50IG51bSk7Ci0KLWludCByZWFkcG5nMl9pbml0KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7Ci0KLWludCByZWFkcG5nMl9kZWNvZGVfZGF0YShtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIsIHVjaCAqcmF3YnVmLCB1bGcgbGVuZ3RoKTsKLQotdm9pZCByZWFkcG5nMl9jbGVhbnVwKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7CmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL3JlYWRwcG0uYyBiL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBwbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmVmYzM5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svcmVhZHBwbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHJwbmcgLSBzaW1wbGUgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRwcG0uYwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBUaGlzIGlzIGEgc3BlY2lhbC1wdXJwb3NlIHJlcGxhY2VtZW50IGZvciByZWFkcG5nLmMgdGhhdCBhbGxvd3MgYmluYXJ5Ci0gICBQUE0gZmlsZXMgdG8gYmUgdXNlZCBpbiBwbGFjZSBvZiBQTkcgaW1hZ2VzLgotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBHcmVnIFJvZWxvZnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCi0gICAgICBleHByZXNzIG9yIGltcGxpZWQuICBJbiBubyBldmVudCBzaGFsbCB0aGUgYXV0aG9yIG9yIGNvbnRyaWJ1dG9ycwotICAgICAgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgaW4gYW55IHdheSBmcm9tIHRoZSB1c2Ugb2YKLSAgICAgIHRoaXMgc29mdHdhcmUuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIERVQUwtTElDRU5TRUQuICBZb3UgbWF5IG1vZGlmeSBhbmQvb3IKLSAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQotICAgICAgZm9sbG93aW5nIHR3byBsaWNlbnNlcyAoYXQgeW91ciBvcHRpb24pOgotCi0KLSAgICAgIExJQ0VOU0UgMSAoIkJTRC1saWtlIHdpdGggYWR2ZXJ0aXNpbmcgY2xhdXNlIik6Ci0KLSAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICAgICAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZQotICAgICAgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMuCi0gICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgICAgbm90aWNlLCBkaXNjbGFpbWVyLCBhbmQgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgaW4gdGhlIGRvY3VtZW50YS0KLSAgICAgICAgIHRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAgICAgICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotCi0gICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwotICAgICAgICAgICAgYW5kIGNvbnRyaWJ1dG9ycyBmb3IgdGhlIGJvb2ssICJQTkc6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCIKLSAgICAgICAgICAgIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBhbmQgQXNzb2NpYXRlcy4KLQotCi0gICAgICBMSUNFTlNFIDIgKEdOVSBHUEwgdjIgb3IgbGF0ZXIpOgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgICAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgInJlYWRwbmcuaCIgICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHB1YmxpYyBwcm90b3R5cGVzICovCi0KLQotdWxnICB3aWR0aCwgaGVpZ2h0OwotaW50ICBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsIGNoYW5uZWxzOwotdWNoICAqaW1hZ2VfZGF0YSA9IE5VTEw7Ci1GSUxFICpzYXZlZF9pbmZpbGU7Ci0KLQotdm9pZCByZWFkcG5nX3ZlcnNpb25faW5mbygpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICBDb21waWxlZCB3aXRob3V0IGxpYnBuZywgemxpYiBvciBQQk1QTFVTL05ldFBCTS5cbiIpOwotfQotCi0KLS8qIHJldHVybiB2YWx1ZSA9IDAgZm9yIHN1Y2Nlc3MsIDEgZm9yIGJhZCBzaWcsIDIgZm9yIGJhZCBJSERSLCA0IGZvciBubyBtZW0gKi8KLQotaW50IHJlYWRwbmdfaW5pdChGSUxFICppbmZpbGUsIHVsZyAqcFdpZHRoLCB1bGcgKnBIZWlnaHQpCi17Ci0gICAgc3RhdGljIHVjaCBwcG1saW5lWzI1Nl07Ci0gICAgaW50IG1heHZhbDsKLQotCi0gICAgc2F2ZWRfaW5maWxlID0gaW5maWxlOwotCi0gICAgZmdldHMocHBtbGluZSwgMjU2LCBpbmZpbGUpOwotICAgIGlmIChwcG1saW5lWzBdICE9ICdQJyB8fCBwcG1saW5lWzFdICE9ICc2JykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAgbm90IGEgUFBNIGZpbGVcbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgLyogcG9zc2libGUgY29sb3IgdHlwZXM6ICBQNSA9IGdyYXlzY2FsZSAoMCksIFA2ID0gUkdCICgyKSwgUDggPSBSR0JBICg2KSAqLwotICAgIGlmIChwcG1saW5lWzFdID09ICc2JykgewotICAgICAgICBjb2xvcl90eXBlID0gMjsKLSAgICAgICAgY2hhbm5lbHMgPSAzOwotICAgIH0gZWxzZSBpZiAocHBtbGluZVsxXSA9PSAnOCcpIHsKLSAgICAgICAgY29sb3JfdHlwZSA9IDY7Ci0gICAgICAgIGNoYW5uZWxzID0gNDsKLSAgICB9IGVsc2UgLyogaWYgKHBwbWxpbmVbMV0gPT0gJzUnKSAqLyB7Ci0gICAgICAgIGNvbG9yX3R5cGUgPSAwOwotICAgICAgICBjaGFubmVscyA9IDE7Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgICBmZ2V0cyhwcG1saW5lLCAyNTYsIGluZmlsZSk7Ci0gICAgfSB3aGlsZSAocHBtbGluZVswXSA9PSAnIycpOwotICAgIHNzY2FuZihwcG1saW5lLCAiJWx1ICVsdSIsICZ3aWR0aCwgJmhlaWdodCk7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGZnZXRzKHBwbWxpbmUsIDI1NiwgaW5maWxlKTsKLSAgICB9IHdoaWxlIChwcG1saW5lWzBdID09ICcjJyk7Ci0gICAgc3NjYW5mKHBwbWxpbmUsICIlZCIsICZtYXh2YWwpOwotICAgIGlmIChtYXh2YWwgIT0gMjU1KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6ICBtYXh2YWwgPSAlZFxuIiwgbWF4dmFsKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGJpdF9kZXB0aCA9IDg7Ci0KLSAgICAqcFdpZHRoID0gd2lkdGg7Ci0gICAgKnBIZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotLyogcmV0dXJucyAwIGlmIHN1Y2NlZWRzLCAxIGlmIGZhaWxzIGR1ZSB0byBubyBiS0dEIGNodW5rLCAyIGlmIGxpYnBuZyBlcnJvcjsKLSAqIHNjYWxlcyB2YWx1ZXMgdG8gOC1iaXQgaWYgbmVjZXNzYXJ5ICovCi0KLWludCByZWFkcG5nX2dldF9iZ2NvbG9yKHVjaCAqcmVkLCB1Y2ggKmdyZWVuLCB1Y2ggKmJsdWUpCi17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLQotCi0KLS8qIGRpc3BsYXlfZXhwb25lbnQgPT0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50ICovCi0KLXVjaCAqcmVhZHBuZ19nZXRfaW1hZ2UoZG91YmxlIGRpc3BsYXlfZXhwb25lbnQsIGludCAqcENoYW5uZWxzLCB1bGcgKnBSb3dieXRlcykKLXsKLSAgICB1bGcgIHJvd2J5dGVzOwotCi0KLSAgICAvKiBleHBhbmQgcGFsZXR0ZSBpbWFnZXMgdG8gUkdCLCBsb3ctYml0LWRlcHRoIGdyYXlzY2FsZSBpbWFnZXMgdG8gOCBiaXRzLAotICAgICAqIHRyYW5zcGFyZW5jeSBjaHVua3MgdG8gZnVsbCBhbHBoYSBjaGFubmVsOyBzdHJpcCAxNi1iaXQtcGVyLXNhbXBsZQotICAgICAqIGltYWdlcyB0byA4IGJpdHMgcGVyIHNhbXBsZTsgYW5kIGNvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQltBXSAqLwotCi0gICAgLyogR1JSIFdBUk5JTkc6ICBncmF5c2NhbGUgbmVlZHMgdG8gYmUgZXhwYW5kZWQgYW5kIGNoYW5uZWxzIHJlc2V0ISAqLwotCi0gICAgKnBSb3dieXRlcyA9IHJvd2J5dGVzID0gY2hhbm5lbHMqd2lkdGg7Ci0gICAgKnBDaGFubmVscyA9IGNoYW5uZWxzOwotCi0gICAgaWYgKChpbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhyb3dieXRlcypoZWlnaHQpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJyZWFkcG5nX2dldF9pbWFnZTogIHJvd2J5dGVzID0gJWxkLCBoZWlnaHQgPSAlbGRcbiIsIHJvd2J5dGVzLCBoZWlnaHQpKTsKLQotCi0gICAgLyogbm93IHdlIGNhbiBnbyBhaGVhZCBhbmQganVzdCByZWFkIHRoZSB3aG9sZSBpbWFnZSAqLwotCi0gICAgaWYgKGZyZWFkKGltYWdlX2RhdGEsIDFMLCByb3dieXRlcypoZWlnaHQsIHNhdmVkX2luZmlsZSkgPAotICAgICAgIHJvd2J5dGVzKmhlaWdodCkgewotICAgICAgICBmcmVlIChpbWFnZV9kYXRhKTsKLSAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBpbWFnZV9kYXRhOwotfQotCi0KLXZvaWQgcmVhZHBuZ19jbGVhbnVwKGludCBmcmVlX2ltYWdlX2RhdGEpCi17Ci0gICAgaWYgKGZyZWVfaW1hZ2VfZGF0YSAmJiBpbWFnZV9kYXRhKSB7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGltYWdlX2RhdGEgPSBOVUxMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZy13aW4uYyBiL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZy13aW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzZGRjOC4uMDAwMDAwMAotLS0gYS9jb250cmliL2dyZWdib29rL3Jwbmctd2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgcnBuZyAtIHNpbXBsZSBQTkcgZGlzcGxheSBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycG5nLXdpbi5jCi0KLSAgIFRoaXMgcHJvZ3JhbSBkZWNvZGVzIGFuZCBkaXNwbGF5cyBQTkcgaW1hZ2VzLCB3aXRoIGdhbW1hIGNvcnJlY3Rpb24gYW5kCi0gICBvcHRpb25hbGx5IHdpdGggYSB1c2VyLXNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChpbiBjYXNlIHRoZSBpbWFnZSBoYXMKLSAgIHRyYW5zcGFyZW5jeSkuICBJdCBpcyB2ZXJ5IG5lYXJseSB0aGUgbW9zdCBiYXNpYyBQTkcgdmlld2VyIHBvc3NpYmxlLgotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAzMi1iaXQgV2luZG93czsgaXQgbWF5IGNvbXBpbGUgdW5kZXIgMTYtYml0IFdpbmRvd3MKLSAgIHdpdGggYSBsaXR0bGUgdHdlYWtpbmcgKG9yIG1heWJlIG5vdCkuCi0KLSAgIHRvIGRvOgotICAgIC0gaGFuZGxlIHF1b3RlZCBjb21tYW5kLWxpbmUgYXJncyAoZXNwZWNpYWxseSBmaWxlbmFtZXMgd2l0aCBzcGFjZXMpCi0gICAgLSBoYXZlIG1pbmltdW0gd2luZG93IHdpZHRoOiAgb2ggd2VsbAotICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBDaGFuZ2Vsb2c6Ci0gICAgLSAxLjAwOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQotICAgIC0gMS4wMTogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnM7IGZpeGVkIGxvbmcvdWxvbmcgbWlzLQotICAgICAgICAgICAgICBtYXRjaDsgc3dpdGNoZWQgdG8gcG5nX2ptcGJ1ZigpIG1hY3JvCi0gICAgLSAxLjAyOiAgYWRkZWQgZXh0cmEgc2V0IG9mIHBhcmVudGhlc2VzIHRvIHBuZ19qbXBidWYoKSBtYWNybzsgZml4ZWQKLSAgICAgICAgICAgICAgY29tbWFuZC1saW5lIHBhcnNpbmcgYnVnCi0gICAgLSAxLjEwOiAgZW5hYmxlZCAibWVzc2FnZSB3aW5kb3ciL2NvbnNvbGUgKHRoYW5rcyB0byBEYXZpZCBHZWxkcmVpY2gpCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLSAgICAtIDIuMDE6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3IocykKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgInJwbmctd2luIgotI2RlZmluZSBMT05HTkFNRSAgIlNpbXBsZSBQTkcgVmlld2VyIGZvciBXaW5kb3dzIgotI2RlZmluZSBWRVJTSU9OICAgIjIuMDEgb2YgMTYgTWFyY2ggMjAwOCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpZmRlZiBfX0NZR1dJTl9fCi0vKiBnZXRjaCByZXBsYWNlbWVudC4gVHVybnMgb3V0LCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0aGlzLAotICogYnV0IGxlYXZlIGl0IGhlcmUgaWYgd2UgZXZlciBlbmFibGUgYW55IG9mIHRoZSB1c2VzIG9mCi0gKiBfZ2V0Y2ggaW4gdGhlIG1haW4gY29kZQotICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGVybWlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci1pbnQgcmVwbF9nZXRjaCggdm9pZCApCi17Ci0gIGNoYXIgY2g7Ci0gIGludCBmZCA9IGZpbGVubyhzdGRpbik7Ci0gIHN0cnVjdCB0ZXJtaW8gb2xkX3R0eSwgbmV3X3R0eTsKLQotICBpb2N0bChmZCwgVENHRVRBLCAmb2xkX3R0eSk7Ci0gIG5ld190dHkgPSBvbGRfdHR5OwotICBuZXdfdHR5LmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgSVNJRyk7Ci0gIGlvY3RsKGZkLCBUQ1NFVEEsICZuZXdfdHR5KTsKLSAgZnJlYWQoJmNoLCAxLCBzaXplb2YoY2gpLCBzdGRpbik7Ci0gIGlvY3RsKGZkLCBUQ1NFVEEsICZvbGRfdHR5KTsKLQotICByZXR1cm4gY2g7Ci19Ci0jZGVmaW5lIF9nZXRjaCByZXBsX2dldGNoCi0jZWxzZQotI2luY2x1ZGUgPGNvbmlvLmg+ICAgICAgLyogb25seSBmb3IgX2dldGNoKCkgKi8KLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHICA6ICB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCi0KLSNpbmNsdWRlICJyZWFkcG5nLmgiICAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCByZWFkcG5nIHByb3RvdHlwZXMgKi8KLQotCi0vKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwotICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAotICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KLQotI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAotICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAotICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAotfQotCi0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgICAgICAgIHJwbmdfd2luX2NyZWF0ZV93aW5kb3coSElOU1RBTkNFIGhJbnN0LCBpbnQgc2hvd21vZGUpOwotc3RhdGljIGludCAgICAgICAgcnBuZ193aW5fZGlzcGxheV9pbWFnZSh2b2lkKTsKLXN0YXRpYyB2b2lkICAgICAgIHJwbmdfd2luX2NsZWFudXAodm9pZCk7Ci1MUkVTVUxUIENBTExCQUNLICBycG5nX3dpbl93bmRwcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLQotCi1zdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XTsKLXN0YXRpYyBjaGFyICpwcm9nbmFtZSA9IFBST0dOQU1FOwotc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBGSUxFICppbmZpbGU7Ci0KLXN0YXRpYyBjaGFyICpiZ3N0cjsKLXN0YXRpYyB1Y2ggYmdfcmVkPTAsIGJnX2dyZWVuPTAsIGJnX2JsdWU9MDsKLQotc3RhdGljIGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50OwotCi1zdGF0aWMgdWxnIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIGltYWdlX3Jvd2J5dGVzOwotc3RhdGljIGludCBpbWFnZV9jaGFubmVsczsKLXN0YXRpYyB1Y2ggKmltYWdlX2RhdGE7Ci0KLS8qIFdpbmRvd3Mtc3BlY2lmaWMgdmFyaWFibGVzICovCi1zdGF0aWMgdWxnIHdpbWFnZV9yb3dieXRlczsKLXN0YXRpYyB1Y2ggKmRpYjsKLXN0YXRpYyB1Y2ggKndpbWFnZV9kYXRhOwotc3RhdGljIEJJVE1BUElORk9IRUFERVIgKmJtaWg7Ci0KLXN0YXRpYyBIV05EIGdsb2JhbF9od25kOwotCi0KLQotCi1pbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXZJbnN0LCBQU1RSIGNtZCwgaW50IHNob3dtb2RlKQotewotICAgIGNoYXIgKmFyZ3NbMTAyNF07ICAgICAgICAgICAgICAgICAvKiBhcmJpdHJhcnkgbGltaXQsIGJ1dCBzaG91bGQgc3VmZmljZSAqLwotICAgIGNoYXIgKnAsICpxLCAqKmFyZ3YgPSBhcmdzOwotICAgIGludCBhcmdjID0gMDsKLSAgICBpbnQgcmMsIGFsZW4sIGZsZW47Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwotICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KLSAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwotICAgIE1TRyBtc2c7Ci0KLQotICAgIGZpbGVuYW1lID0gKGNoYXIgKilOVUxMOwotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAvKiBGaXJzdCByZWVuYWJsZSBjb25zb2xlIG91dHB1dCwgd2hpY2ggbm9ybWFsbHkgZ29lcyB0byB0aGUgYml0IGJ1Y2tldAotICAgICAqIGZvciB3aW5kb3dlZCBhcHBzLiAgQ2xvc2luZyB0aGUgY29uc29sZSB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgdGhlCi0gICAgICogYXBwLiAgVGhhbmtzIHRvIERhdmlkLkdlbGRyZWljaEByZWFsdml6LmNvbSBmb3Igc3VwcGx5aW5nIHRoZSBtYWdpY2FsCi0gICAgICogaW5jYW50YXRpb24uICovCi0KLSAgICBBbGxvY0NvbnNvbGUoKTsKLSAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRlcnIpOwotICAgIGZyZW9wZW4oIkNPTk9VVCQiLCAiYSIsIHN0ZG91dCk7Ci0jZW5kaWYKLQotCi0gICAgLyogTmV4dCBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwKLSAgICAgKiB0aGUgcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCi0gICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAotICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAgQW5kCi0gICAgICogeWVzLCB0aGVzZSBpZmRlZnMgYXJlIGNvbXBsZXRlbHkgd2FzdGVkIGluIGEgV2luZG93cyBwcm9ncmFtLi4uICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0byBnZXQgdGhlCi0gICAgICogImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwotICAgIGVsc2UKLSAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKLQotCi0gICAgLyogV2luZG93cyByZWFsbHkgaGF0ZXMgY29tbWFuZCBsaW5lcywgc28gd2UgaGF2ZSB0byBzZXQgdXAgb3VyIG93biBhcmd2LgotICAgICAqIE5vdGUgdGhhdCB3ZSBkbyBOT1QgYm90aGVyIHdpdGggcXVvdGVkIGFyZ3VtZW50cyBoZXJlLCBzbyBkb24ndCB1c2UKLSAgICAgKiBmaWxlbmFtZXMgd2l0aCBzcGFjZXMgaW4gJ2VtISAqLwotCi0gICAgYXJndlthcmdjKytdID0gUFJPR05BTUU7Ci0gICAgcCA9IGNtZDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICgqcCA9PSAnICcpCi0gICAgICAgICAgICB3aGlsZSAoKisrcCA9PSAnICcpCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAvKiBub3cgcCBwb2ludHMgYXQgdGhlIGZpcnN0IG5vbi1zcGFjZSBhZnRlciBzb21lIHNwYWNlcyAqLwotICAgICAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICAgICAgIGJyZWFrOyAgICAvKiBub3RoaW5nIGFmdGVyIHRoZSBzcGFjZXM6ICBkb25lICovCi0gICAgICAgIGFyZ3ZbYXJnYysrXSA9IHEgPSBwOwotICAgICAgICB3aGlsZSAoKnEgJiYgKnEgIT0gJyAnKQotICAgICAgICAgICAgKytxOwotICAgICAgICAvKiBub3cgcSBwb2ludHMgYXQgYSBzcGFjZSBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KLSAgICAgICAgaWYgKCpxID09ICdcMCcpCi0gICAgICAgICAgICBicmVhazsgICAgLyogbGFzdCBhcmd2IGFscmVhZHkgdGVybWluYXRlZDsgcXVpdCAqLwotICAgICAgICAqcSA9ICdcMCc7ICAgIC8qIGNoYW5nZSBzcGFjZSB0byB0ZXJtaW5hdG9yICovCi0gICAgICAgIHAgPSBxICsgMTsKLSAgICB9Ci0gICAgYXJndlthcmdjXSA9IE5VTEw7ICAgLyogdGVybWluYXRlIHRoZSBhcmd2IGFycmF5IGl0c2VsZiAqLwotCi0KLSAgICAvKiBOb3cgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBmb3Igb3B0aW9ucyBhbmQgdGhlIFBORyBmaWxlbmFtZS4gKi8KLQotICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewotICAgICAgICBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlfZXhwb25lbnQgPD0gMC4wKQotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJnY29sb3IiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBiZ3N0ciA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYmdzdHIpICE9IDcgfHwgYmdzdHJbMF0gIT0gJyMnKQotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3ZbMV0pICAgLyogc2hvdWxkbid0IGJlIGFueSBtb3JlIGFyZ3MgYWZ0ZXIgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICsrZXJyb3I7ICAgLyogbm90IGV4cGVjdGluZyBhbnkgb3RoZXIgb3B0aW9ucyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmaWxlbmFtZSkKLSAgICAgICAgKytlcnJvcjsKLQotCi0gICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwotCi0gICAgaWYgKGVycm9yKSB7Ci0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgaW50IGNoOwotI2VuZGlmCi0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcblxuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotICAgICAgICByZWFkcG5nX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJVc2FnZTogICVzIFstZ2FtbWEgZXhwXSBbLWJnY29sb3IgYmddIGZpbGUucG5nXG4iCi0gICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgZGlzcGxheVxuIgotICAgICAgICAgICJcdFx0ICBzeXN0ZW0gaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IChlLmcuLCBgYCUuMWYnJyk7IGVxdWFsXG4iCi0gICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIKLSAgICAgICAgICAiXHRcdCAgYW5kIHRoZSBDUlQgZXhwb25lbnQgKHVzdWFsbHkgMi4yKTsgbXVzdCBiZSBwb3NpdGl2ZVxuIgotICAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0XG4iCi0gICAgICAgICAgIlx0XHQgIChlLmcuLCBgYCNmZjc3MDAnJyBmb3Igb3JhbmdlOiAgc2FtZSBhcyBIVE1MIGNvbG9ycyk7XG4iCi0gICAgICAgICAgIlx0XHQgIHVzZWQgd2l0aCB0cmFuc3BhcmVudCBpbWFnZXNcbiIKLSAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgYWZ0ZXIgaW1hZ2UgaXMgZGlzcGxheWVkIHRvIHF1aXQuXG4iCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgICAiUHJlc3MgUSBvciBFc2MgdG8gcXVpdCB0aGlzIHVzYWdlIHNjcmVlbi5cbiIKLSNlbmRpZgotICAgICAgICAgICJcbiIsIFBST0dOQU1FLCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQpOwotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGRvCi0gICAgICAgICAgICBjaCA9IF9nZXRjaCgpOwotICAgICAgICB3aGlsZSAoY2ggIT0gJ3EnICYmIGNoICE9ICdRJyAmJiBjaCAhPSAweDFCKTsKLSNlbmRpZgotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotCi0gICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOwotICAgICAgICArK2Vycm9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgocmMgPSByZWFkcG5nX2luaXQoaW5maWxlLCAmaW1hZ2Vfd2lkdGgsICZpbWFnZV9oZWlnaHQpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nX2luaXQoKSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKLSAgICB9Ci0KLQotICAgIGlmIChlcnJvcikgewotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGludCBjaDsKLSNlbmRpZgotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgICBkbwotICAgICAgICAgICAgY2ggPSBfZ2V0Y2goKTsKLSAgICAgICAgd2hpbGUgKGNoICE9ICdxJyAmJiBjaCAhPSAnUScgJiYgY2ggIT0gMHgxQik7Ci0jZW5kaWYKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJcbiAgIFtjb25zb2xlIHdpbmRvdzogIGNsb3NpbmcgdGhpcyB3aW5kb3cgd2lsbCB0ZXJtaW5hdGUgJXNdXG5cbiIsCi0gICAgICAgICAgUFJPR05BTUUpOwotI2VuZGlmCi0gICAgfQotCi0KLSAgICAvKiBzZXQgdGhlIHRpdGxlLWJhciBzdHJpbmcsIGJ1dCBtYWtlIHN1cmUgYnVmZmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KLQotICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7Ci0gICAgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7Ci0gICAgaWYgKGFsZW4gKyBmbGVuICsgMyA+IDEwMjMpCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKLSAgICBlbHNlCi0gICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogICVzIiwgYXBwbmFtZSwgZmlsZW5hbWUpOwotCi0KLSAgICAvKiBpZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIGJhY2tncm91bmQgY29sb3Igb24gdGhlIGNvbW1hbmQgbGluZSwKLSAgICAgKiBjaGVjayBmb3Igb25lIGluIHRoZSBQTkcgZmlsZS0taWYgbm90LCB0aGUgaW5pdGlhbGl6ZWQgdmFsdWVzIG9mIDAKLSAgICAgKiAoYmxhY2spIHdpbGwgYmUgdXNlZCAqLwotCi0gICAgaWYgKGhhdmVfYmcpIHsKLSAgICAgICAgdW5zaWduZWQgciwgZywgYjsgICAvKiB0aGlzIGFwcHJvYWNoIHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7Ci0gICAgICAgIGJnX3JlZCAgID0gKHVjaClyOwotICAgICAgICBiZ19ncmVlbiA9ICh1Y2gpZzsKLSAgICAgICAgYmdfYmx1ZSAgPSAodWNoKWI7Ci0gICAgfSBlbHNlIGlmIChyZWFkcG5nX2dldF9iZ2NvbG9yKCZiZ19yZWQsICZiZ19ncmVlbiwgJmJnX2JsdWUpID4gMSkgewotICAgICAgICByZWFkcG5nX2NsZWFudXAoVFJVRSk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICI6ICBsaWJwbmcgZXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGJhY2tncm91bmQgY29sb3JcbiIpOwotICAgICAgICBleGl0KDIpOwotICAgIH0KLQotCi0gICAgLyogZG8gdGhlIGJhc2ljIFdpbmRvd3MgaW5pdGlhbGl6YXRpb24gc3R1ZmYsIG1ha2UgdGhlIHdpbmRvdyBhbmQgZmlsbCBpdAotICAgICAqIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KLQotICAgIGlmIChycG5nX3dpbl9jcmVhdGVfd2luZG93KGhJbnN0LCBzaG93bW9kZSkpCi0gICAgICAgIGV4aXQoMik7Ci0KLQotICAgIC8qIGRlY29kZSB0aGUgaW1hZ2UsIGFsbCBhdCBvbmNlICovCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyByZWFkcG5nX2dldF9pbWFnZSgpXG4iKSkKLSAgICBpbWFnZV9kYXRhID0gcmVhZHBuZ19nZXRfaW1hZ2UoZGlzcGxheV9leHBvbmVudCwgJmltYWdlX2NoYW5uZWxzLAotICAgICAgJmltYWdlX3Jvd2J5dGVzKTsKLSAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSB3aXRoIHJlYWRwbmdfZ2V0X2ltYWdlKClcbiIpKQotCi0KLSAgICAvKiBkb25lIHdpdGggUE5HIGZpbGUsIHNvIGNsZWFuIHVwIHRvIG1pbmltaXplIG1lbW9yeSB1c2FnZSAoYnV0IGRvIE5PVAotICAgICAqIG51a2UgaW1hZ2VfZGF0YSEpICovCi0KLSAgICByZWFkcG5nX2NsZWFudXAoRkFMU0UpOwotICAgIGZjbG9zZShpbmZpbGUpOwotCi0gICAgaWYgKCFpbWFnZV9kYXRhKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgdW5hYmxlIHRvIGRlY29kZSBQTkcgaW1hZ2VcbiIpOwotICAgICAgICBleGl0KDMpOwotICAgIH0KLQotCi0gICAgLyogZGlzcGxheSBpbWFnZSAoY29tcG9zaXRlIHdpdGggYmFja2dyb3VuZCBpZiByZXF1ZXN0ZWQpICovCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBycG5nX3dpbl9kaXNwbGF5X2ltYWdlKClcbiIpKQotICAgIGlmIChycG5nX3dpbl9kaXNwbGF5X2ltYWdlKCkpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgZXhpdCg0KTsKLSAgICB9Ci0gICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCBycG5nX3dpbl9kaXNwbGF5X2ltYWdlKClcbiIpKQotCi0KLSAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwotCi0gICAgcHJpbnRmKAotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIKLSNlbHNlCi0gICAgICAiRG9uZS4gIFByZXNzIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIgotI2VuZGlmCi0gICAgKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgIHdoaWxlIChHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApKSB7Ci0gICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7Ci0gICAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLSAgICB9Ci0KLQotICAgIC8qIE9LLCB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBXaW5kb3dzIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwotCi0gICAgcnBuZ193aW5fY2xlYW51cCgpOwotCi0gICAgcmV0dXJuIG1zZy53UGFyYW07Ci19Ci0KLQotCi0KLQotc3RhdGljIGludCBycG5nX3dpbl9jcmVhdGVfd2luZG93KEhJTlNUQU5DRSBoSW5zdCwgaW50IHNob3dtb2RlKQotewotICAgIHVjaCAqZGVzdDsKLSAgICBpbnQgZXh0cmFfd2lkdGgsIGV4dHJhX2hlaWdodDsKLSAgICB1bGcgaSwgajsKLSAgICBXTkRDTEFTU0VYIHduZGNsYXNzOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZSAocm91bmQgdXAKLSAgICB0byBtdWx0aXBsZSBvZiA0IGZvciBXaW5kb3dzIERJQikuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB3aW1hZ2Vfcm93Ynl0ZXMgPSAoKDMqaW1hZ2Vfd2lkdGggKyAzTCkgPj4gMikgPDwgMjsKLQotICAgIGlmICghKGRpYiA9ICh1Y2ggKiltYWxsb2Moc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbWFnZV9yb3dieXRlcyppbWFnZV9oZWlnaHQpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiA0OyAgIC8qIGZhaWwgKi8KLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgSW5pdGlhbGl6ZSB0aGUgRElCLiAgTmVnYXRpdmUgaGVpZ2h0IG1lYW5zIHRvIHVzZSB0b3AtZG93biBCTVAgb3JkZXJpbmcKLSAgICAobXVzdCBiZSB1bmNvbXByZXNzZWQsIGJ1dCB0aGF0J3Mgd2hhdCB3ZSB3YW50KS4gIEJpdCBjb3VudCBvZiAxLCA0IG9yIDgKLSAgICBpbXBsaWVzIGEgY29sb3JtYXAgb2YgUkdCWCBxdWFkcywgYnV0IDI0LWJpdCBCTVBzIGp1c3QgdXNlIEIsRyxSIHZhbHVlcwotICAgIGRpcmVjdGx5ID0+IHdpbWFnZV9kYXRhIGJlZ2lucyBpbW1lZGlhdGVseSBhZnRlciBCTVAgaGVhZGVyLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgbWVtc2V0KGRpYiwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKLSAgICBibWloID0gKEJJVE1BUElORk9IRUFERVIgKilkaWI7Ci0gICAgYm1paC0+YmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIGJtaWgtPmJpV2lkdGggPSBpbWFnZV93aWR0aDsKLSAgICBibWloLT5iaUhlaWdodCA9IC0oKGxvbmcpaW1hZ2VfaGVpZ2h0KTsKLSAgICBibWloLT5iaVBsYW5lcyA9IDE7Ci0gICAgYm1paC0+YmlCaXRDb3VudCA9IDI0OwotICAgIGJtaWgtPmJpQ29tcHJlc3Npb24gPSAwOwotICAgIHdpbWFnZV9kYXRhID0gZGliICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgaW4gYmFja2dyb3VuZCBjb2xvciAoYmxhY2sgYnkgZGVmYXVsdCk7IGRhdGEgYXJlIGluIEJHUiBvcmRlci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGZvciAoaiA9IDA7ICBqIDwgaW1hZ2VfaGVpZ2h0OyAgKytqKSB7Ci0gICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIGoqd2ltYWdlX3Jvd2J5dGVzOwotICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICpkZXN0KysgPSBiZ19yZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU2V0IHRoZSB3aW5kb3cgcGFyYW1ldGVycy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIG1lbXNldCgmd25kY2xhc3MsIDAsIHNpemVvZih3bmRjbGFzcykpOwotCi0gICAgd25kY2xhc3MuY2JTaXplID0gc2l6ZW9mKHduZGNsYXNzKTsKLSAgICB3bmRjbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotICAgIHduZGNsYXNzLmxwZm5XbmRQcm9jID0gcnBuZ193aW5fd25kcHJvYzsKLSAgICB3bmRjbGFzcy5oSW5zdGFuY2UgPSBoSW5zdDsKLSAgICB3bmRjbGFzcy5oSWNvbiA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7Ci0gICAgd25kY2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKLSAgICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSClHZXRTdG9ja09iamVjdChES0dSQVlfQlJVU0gpOwotICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7Ci0gICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHByb2duYW1lOwotICAgIHduZGNsYXNzLmhJY29uU20gPSBMb2FkSWNvbihOVUxMLCBJRElfQVBQTElDQVRJT04pOwotCi0gICAgUmVnaXN0ZXJDbGFzc0V4KCZ3bmRjbGFzcyk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRmluYWxseSwgY3JlYXRlIHRoZSB3aW5kb3cuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBleHRyYV93aWR0aCAgPSAyKihHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWERMR0ZSQU1FKSk7Ci0gICAgZXh0cmFfaGVpZ2h0ID0gMiooR2V0U3lzdGVtTWV0cmljcyhTTV9DWUJPUkRFUikgKwotICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lETEdGUkFNRSkpICsKLSAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTik7Ci0KLSAgICBnbG9iYWxfaHduZCA9IENyZWF0ZVdpbmRvdyhwcm9nbmFtZSwgdGl0bGViYXIsIFdTX09WRVJMQVBQRURXSU5ET1csCi0gICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBpbWFnZV93aWR0aCtleHRyYV93aWR0aCwKLSAgICAgIGltYWdlX2hlaWdodCtleHRyYV9oZWlnaHQsIE5VTEwsIE5VTEwsIGhJbnN0LCBOVUxMKTsKLQotICAgIFNob3dXaW5kb3coZ2xvYmFsX2h3bmQsIHNob3dtb2RlKTsKLSAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOwotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmdfd2luX2NyZWF0ZV93aW5kb3coKSAqLwotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZ193aW5fZGlzcGxheV9pbWFnZSgpCi17Ci0gICAgdWNoICpzcmMsICpkZXN0OwotICAgIHVjaCByLCBnLCBiLCBhOwotICAgIHVsZyBpLCByb3csIGxhc3Ryb3c7Ci0gICAgUkVDVCByZWN0OwotCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAotICAgICAgaW1hZ2VfY2hhbm5lbHMpKQotICAgIFRyYWNlKChzdGRlcnIsICIod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWxkLCB3aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCi0gICAgICBpbWFnZV93aWR0aCwgaW1hZ2Vfcm93Ynl0ZXMsIHdpbWFnZV9yb3dieXRlcykpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBCbGFzdCBpbWFnZSBkYXRhIHRvIGJ1ZmZlci4gIFRoaXMgd2hvbGUgcm91dGluZSB0YWtlcyBwbGFjZSBiZWZvcmUgdGhlCi0gICAgbWVzc2FnZSBsb29wIGJlZ2lucywgc28gdGhlcmUncyBubyByZWFsIHBvaW50IGluIGFueSBwc2V1ZG8tcHJvZ3Jlc3NpdmUKLSAgICBkaXNwbGF5Li4uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgc3JjID0gaW1hZ2VfZGF0YSArIHJvdyppbWFnZV9yb3dieXRlczsKLSAgICAgICAgZGVzdCA9IHdpbWFnZV9kYXRhICsgcm93KndpbWFnZV9yb3dieXRlczsKLSAgICAgICAgaWYgKGltYWdlX2NoYW5uZWxzID09IDMpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IGltYWdlX3dpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzsgICAvKiBub3RlIHJldmVyc2Ugb3JkZXIgKi8KLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIC8qIGlmIChpbWFnZV9jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGI7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGNvcGllZCBmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogcmVzdWx0IGludG8gdGhlIGZpcnN0IGFyZ3VtZW50OyB0aGVyZSBhcmUgbm8KLSAgICAgICAgICAgICAgICAgICAgICogc2lkZSBlZmZlY3RzIHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZSgqZGVzdCsrLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKCpkZXN0KyssIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKCpkZXN0KyssIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KLSAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7Ci0gICAgICAgICAgICByZWN0LmxlZnQgPSAwTDsKLSAgICAgICAgICAgIHJlY3QudG9wID0gKExPTkcpbGFzdHJvdzsKLSAgICAgICAgICAgIHJlY3QucmlnaHQgPSAoTE9ORylpbWFnZV93aWR0aDsgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICAgICAgcmVjdC5ib3R0b20gPSAoTE9ORylsYXN0cm93ICsgMTZMOyAgIC8qIHBvc3NpYmx5IG9mZiBieSBvbmU/ICovCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdChnbG9iYWxfaHduZCwgJnJlY3QsIEZBTFNFKTsKLSAgICAgICAgICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7ICAgICAvKiBzaW1pbGFyIHRvIFhGbHVzaCgpICovCi0gICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIGltYWdlLWZsdXNoIHJvdXRpbmVcbiIpKQotICAgIGlmIChsYXN0cm93IDwgaW1hZ2VfaGVpZ2h0KSB7Ci0gICAgICAgIHJlY3QubGVmdCA9IDBMOwotICAgICAgICByZWN0LnRvcCA9IChMT05HKWxhc3Ryb3c7Ci0gICAgICAgIHJlY3QucmlnaHQgPSAoTE9ORylpbWFnZV93aWR0aDsgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICByZWN0LmJvdHRvbSA9IChMT05HKWltYWdlX2hlaWdodDsgICAgLyogcG9zc2libHkgb2ZmIGJ5IG9uZT8gKi8KLSAgICAgICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7ICAgICAvKiBzaW1pbGFyIHRvIFhGbHVzaCgpICovCi0gICAgfQotCi0vKgotICAgIGxhc3QgcGFyYW0gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBiYWNrZ3JvdW5kIGlzIHdpcGVkIGJlZm9yZSBwYWludAotICAgIEludmFsaWRhdGVSZWN0KGdsb2JhbF9od25kLCBOVUxMLCBUUlVFKTsKLSAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOwotICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nX3dpbl9jbGVhbnVwKCkKLXsKLSAgICBpZiAoaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKGltYWdlX2RhdGEpOwotICAgICAgICBpbWFnZV9kYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoZGliKSB7Ci0gICAgICAgIGZyZWUoZGliKTsKLSAgICAgICAgZGliID0gTlVMTDsKLSAgICB9Ci19Ci0KLQotCi0KLQotTFJFU1VMVCBDQUxMQkFDSyBycG5nX3dpbl93bmRwcm9jKEhXTkQgaHduZCwgVUlOVCBpTXNnLCBXUEFSQU0gd1AsIExQQVJBTSBsUCkKLXsKLSAgICBIREMgICAgICAgICBoZGM7Ci0gICAgUEFJTlRTVFJVQ1QgcHM7Ci0gICAgaW50IHJjOwotCi0gICAgc3dpdGNoIChpTXNnKSB7Ci0gICAgICAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgICAgICAgLyogb25lLXRpbWUgcHJvY2Vzc2luZyBoZXJlLCBpZiBhbnkgKi8KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgV01fUEFJTlQ6Ci0gICAgICAgICAgICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7Ci0gICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmMgPSBTdHJldGNoRElCaXRzKGhkYywgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ltYWdlX2RhdGEsIChCSVRNQVBJTkZPICopYm1paCwKLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIGlVc2FnZTogbm8gY2x1ZSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTUkNDT1BZKTsKLSAgICAgICAgICAgIEVuZFBhaW50KGh3bmQsICZwcyk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwotICAgICAgICBjYXNlIFdNX0NIQVI6Ci0gICAgICAgICAgICBzd2l0Y2ggKHdQKSB7ICAgICAgLyogb25seSBuZWVkIG9uZSwgc28gaWdub3JlIHJlcGVhdCBjb3VudCAqLwotICAgICAgICAgICAgICAgIGNhc2UgJ3EnOgotICAgICAgICAgICAgICAgIGNhc2UgJ1EnOgotICAgICAgICAgICAgICAgIGNhc2UgMHgxQjogICAgIC8qIEVzYyBrZXkgKi8KLSAgICAgICAgICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogICAvKiBhbm90aGVyIHdheSBvZiBxdWl0dGluZyAqLwotICAgICAgICBjYXNlIFdNX0RFU1RST1k6Ci0gICAgICAgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBpTXNnLCB3UCwgbFApOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9ncmVnYm9vay9ycG5nLXguYyBiL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZy14LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDdjNTguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9ncmVnYm9vay9ycG5nLXguYworKysgL2Rldi9udWxsCkBAIC0xLDkxMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nIC0gc2ltcGxlIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBuZy14LmMKLQotICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBpbWFnZXMsIHdpdGggZ2FtbWEgY29ycmVjdGlvbiBhbmQKLSAgIG9wdGlvbmFsbHkgd2l0aCBhIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgKGluIGNhc2UgdGhlIGltYWdlIGhhcwotICAgdHJhbnNwYXJlbmN5KS4gIEl0IGlzIHZlcnkgbmVhcmx5IHRoZSBtb3N0IGJhc2ljIFBORyB2aWV3ZXIgcG9zc2libGUuCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0gKHRlc3RlZCBieSBhdXRob3IgdW5kZXIgVW5peCBhbmQKLSAgIGJ5IE1hcnRpbiBaaW5zZXIgdW5kZXIgT3BlblZNUzsgbWF5IHdvcmsgdW5kZXIgT1MvMiB3aXRoIHNvbWUgdHdlYWtpbmcpLgotCi0gICB0byBkbzoKLSAgICAtIDgtYml0IChjb2xvcm1hcHBlZCkgWCBzdXBwb3J0Ci0gICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/Ci0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENoYW5nZWxvZzoKLSAgICAtIDEuMDE6ICBpbml0aWFsIHB1YmxpYyByZWxlYXNlCi0gICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgbG9uZy91bG9uZyBtaXMtCi0gICAgICAgICAgICAgIG1hdGNoOyBzd2l0Y2hlZCB0byBwbmdfam1wYnVmKCkgbWFjcm8KLSAgICAtIDEuMTA6ICBhZGRlZCBzdXBwb3J0IGZvciBub24tZGVmYXVsdCB2aXN1YWxzOyBmaXhlZCBYIHBpeGVsLWNvbnZlcnNpb24KLSAgICAtIDEuMTE6ICBhZGRlZCBleHRyYSBzZXQgb2YgcGFyZW50aGVzZXMgdG8gcG5nX2ptcGJ1ZigpIG1hY3JvOyBmaXhlZAotICAgICAgICAgICAgICBjb21tYW5kLWxpbmUgcGFyc2luZyBidWcKLSAgICAtIDEuMTI6ICBmaXhlZCBzb21lIHNtYWxsIFggbWVtb3J5IGxlYWtzICh0aGFua3MgdG8gRnJhbudvaXMgUGV0aXRqZWFuKQotICAgIC0gMS4xMzogIGZpeGVkIFhGcmVlR0MoKSBjcmFzaCBidWcgKHRoYW5rcyB0byBQYXRyaWNrIFdlbGNoZSkKLSAgICAtIDEuMTQ6ICBhZGRlZCBzdXBwb3J0IGZvciBYIHJlc291cmNlcyAodGhhbmtzIHRvIEdlcmhhcmQgTmlrbGFzY2gpCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLSAgICAtIDIuMDE6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3IocykKLSAgICAtIDIuMDI6ICBBZGRlZCAidm9pZChhcmdjKTsiIHN0YXRlbWVudCB0byBxdWlldCBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncwotICAgICAgICAgICAgIGFib3V0IHVudXNlZCB2YXJpYWJsZSAoR1ItUCkKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgInJwbmcteCIKLSNkZWZpbmUgTE9OR05BTUUgICJTaW1wbGUgUE5HIFZpZXdlciBmb3IgWCIKLSNkZWZpbmUgVkVSU0lPTiAgICIyLjAyIG9mIDE1IEp1bmUgMjAxNCIKLSNkZWZpbmUgUkVTTkFNRSAgICJycG5nIiAgICAgICAgLyogb3VyIFggcmVzb3VyY2UgYXBwbGljYXRpb24gbmFtZSAqLwotI2RlZmluZSBSRVNDTEFTUyAgIlJwbmciICAgICAgICAvKiBvdXIgWCByZXNvdXJjZSBjbGFzcyBuYW1lICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotI2luY2x1ZGUgPFgxMS9Yb3MuaD4KLSNpbmNsdWRlIDxYMTEva2V5c3ltLmg+Ci0KLS8qICNkZWZpbmUgREVCVUcgIDogIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KLQotI2luY2x1ZGUgInJlYWRwbmcuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZyBwcm90b3R5cGVzICovCi0KLQotLyogY291bGQganVzdCBpbmNsdWRlIHBuZy5oLCBidXQgdGhpcyBtYWNybyBpcyB0aGUgb25seSB0aGluZyB3ZSBuZWVkCi0gKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKLSAqIG9ubHkgaGFwcGVuIHdpdGggYWxwaGEgKHdoaWNoIGNvdWxkIGVhc2lseSBiZSBhdm9pZGVkIHdpdGgKLSAqICJ1c2ggYWNvcHkgPSAoYWxwaGEpOyIpICovCi0KLSNkZWZpbmUgYWxwaGFfY29tcG9zaXRlKGNvbXBvc2l0ZSwgZmcsIGFscGhhLCBiZykgeyAgICAgICAgICAgICAgIFwKLSAgICB1c2ggdGVtcCA9ICgodXNoKShmZykqKHVzaCkoYWxwaGEpICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKLSAgICAoY29tcG9zaXRlKSA9ICh1Y2gpKCh0ZW1wICsgKHRlbXAgPj4gOCkpID4+IDgpOyAgICAgICAgICAgICAgIFwKLX0KLQotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50ICBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKTsKLXN0YXRpYyBpbnQgIHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpOwotc3RhdGljIHZvaWQgcnBuZ194X2NsZWFudXAodm9pZCk7Ci1zdGF0aWMgaW50ICBycG5nX3hfbXNiKHVsZyB1MzJ2YWwpOwotCi0KLXN0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdLCAqd2luZG93X25hbWUgPSB0aXRsZWJhcjsKLXN0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7Ci1zdGF0aWMgY2hhciAqaWNvbl9uYW1lID0gUFJPR05BTUU7Ci1zdGF0aWMgY2hhciAqcmVzX25hbWUgPSBSRVNOQU1FOwotc3RhdGljIGNoYXIgKnJlc19jbGFzcyA9IFJFU0NMQVNTOwotc3RhdGljIGNoYXIgKmZpbGVuYW1lOwotc3RhdGljIEZJTEUgKmluZmlsZTsKLQotc3RhdGljIGNoYXIgKmJnc3RyOwotc3RhdGljIHVjaCBiZ19yZWQ9MCwgYmdfZ3JlZW49MCwgYmdfYmx1ZT0wOwotCi1zdGF0aWMgZG91YmxlIGRpc3BsYXlfZXhwb25lbnQ7Ci0KLXN0YXRpYyB1bGcgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCwgaW1hZ2Vfcm93Ynl0ZXM7Ci1zdGF0aWMgaW50IGltYWdlX2NoYW5uZWxzOwotc3RhdGljIHVjaCAqaW1hZ2VfZGF0YTsKLQotLyogWC1zcGVjaWZpYyB2YXJpYWJsZXMgKi8KLXN0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKLXN0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKLXN0YXRpYyBEaXNwbGF5ICpkaXNwbGF5Owotc3RhdGljIGludCBkZXB0aDsKLXN0YXRpYyBWaXN1YWwgKnZpc3VhbDsKLXN0YXRpYyBYVmlzdWFsSW5mbyAqdmlzdWFsX2xpc3Q7Ci1zdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7Ci1zdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7Ci1zdGF0aWMgV2luZG93IHdpbmRvdzsKLXN0YXRpYyBHQyBnYzsKLXN0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKLQotc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7Ci1zdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV93aW5kb3cgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOwotLyoKLXVsZyBudW1jb2xvcnM9MCwgcGl4ZWxzWzI1Nl07Ci11c2ggcmVkc1syNTZdLCBncmVlbnNbMjU2XSwgYmx1ZXNbMjU2XTsKLSAqLwotCi0KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0jaWZkZWYgc2dpCi0gICAgY2hhciB0bXBsaW5lWzgwXTsKLSNlbmRpZgotICAgIGNoYXIgKnA7Ci0gICAgaW50IHJjLCBhbGVuLCBmbGVuOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgaW50IGhhdmVfYmcgPSBGQUxTRTsKLSAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLwotICAgIGRvdWJsZSBDUlRfZXhwb25lbnQgPSAyLjI7ICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KLSAgICBYRXZlbnQgZTsKLSAgICBLZXlTeW0gazsKLQotCi0gICAgZGlzcGxheW5hbWUgPSAoY2hhciAqKU5VTEw7Ci0gICAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7Ci0KLQotICAgIC8qIEZpcnN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLAotICAgICAqIHRoZSBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KLSAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCi0gICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0byBnZXQgdGhlCi0gICAgICogImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwotICAgIGVsc2UKLSAgICAgICAgZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKLQotCi0gICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCi0KLSAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWRpc3BsYXkiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzcGxheW5hbWUgPSAqYXJndjsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1nYW1tYSIsIDIpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAoZGlzcGxheV9leHBvbmVudCA8PSAwLjApCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDIpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBoYXZlX2JnID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgqKmFyZ3YgIT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWZpbGVuYW1lKQotICAgICAgICArK2Vycm9yOwotCi0KLSAgICAvKiBwcmludCB1c2FnZSBzY3JlZW4gaWYgYW55IGVycm9ycyB1cCB0byB0aGlzIHBvaW50ICovCi0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKLSAgICAgICAgcmVhZHBuZ192ZXJzaW9uX2luZm8oKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKLSAgICAgICAgICAiVXNhZ2U6ICAlcyBbLWRpc3BsYXkgeGRweV0gWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZ10gZmlsZS5wbmdcbiIKLSAgICAgICAgICAiICAgIHhkcHlcdG5hbWUgb2YgdGhlIHRhcmdldCBYIGRpc3BsYXkgKGUuZy4sIGBgaG9zdG5hbWU6MCcnKVxuIgotICAgICAgICAgICIgICAgZXhwIFx0dHJhbnNmZXItZnVuY3Rpb24gZXhwb25lbnQgKGBgZ2FtbWEnJykgb2YgdGhlIGRpc3BsYXlcbiIKLSAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIiwKLSAgICAgICAgICBQUk9HTkFNRSwgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50KTsKLQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJcdFx0ICB0byB0aGUgcHJvZHVjdCBvZiB0aGUgbG9va3VwLXRhYmxlIGV4cG9uZW50ICh2YXJpZXMpXG4iCi0gICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKLSAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgotICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgotICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzXG4iCi0gICAgICAgICAgIlxuUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93LCBhZnRlciBpbWFnZVxuIgotICAgICAgICAgICJpcyBkaXNwbGF5ZWQpIHRvIHF1aXQuXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLQotICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgKytlcnJvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKHJjID0gcmVhZHBuZ19pbml0KGluZmlsZSwgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0KSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoIChyYykgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaXMgbm90IGEgUE5HIGZpbGU6IGluY29ycmVjdCBzaWduYXR1cmVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGhhcyBiYWQgSUhEUiAobGlicG5nIGxvbmdqbXApXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gcmVhZHBuZ19pbml0KCkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaXNwbGF5ID0gWE9wZW5EaXNwbGF5KGRpc3BsYXluYW1lKTsKLSAgICAgICAgICAgIGlmICghZGlzcGxheSkgewotICAgICAgICAgICAgICAgIHJlYWRwbmdfY2xlYW51cChUUlVFKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gWCBkaXNwbGF5IFslc11cbiIsCi0gICAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZT8gZGlzcGxheW5hbWUgOiAiZGVmYXVsdCIpOwotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOwotICAgICAgICBleGl0KDIpOwotICAgIH0KLQotCi0gICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCi0KLSAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwotICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7Ci0gICAgZWxzZQotICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKLQotCi0gICAgLyogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBiYWNrZ3JvdW5kIGNvbG9yIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0gICAgICogY2hlY2sgZm9yIG9uZSBpbiB0aGUgUE5HIGZpbGUtLWlmIG5vdCwgdGhlIGluaXRpYWxpemVkIHZhbHVlcyBvZiAwCi0gICAgICogKGJsYWNrKSB3aWxsIGJlIHVzZWQgKi8KLQotICAgIGlmIChoYXZlX2JnKSB7Ci0gICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KLQotICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOwotICAgICAgICBiZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgYmdfZ3JlZW4gPSAodWNoKWc7Ci0gICAgICAgIGJnX2JsdWUgID0gKHVjaCliOwotICAgIH0gZWxzZSBpZiAocmVhZHBuZ19nZXRfYmdjb2xvcigmYmdfcmVkLCAmYmdfZ3JlZW4sICZiZ19ibHVlKSA+IDEpIHsKLSAgICAgICAgcmVhZHBuZ19jbGVhbnVwKFRSVUUpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBiYWNrZ3JvdW5kIGNvbG9yXG4iKTsKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9Ci0KLQotICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3cgYW5kIGZpbGwgaXQKLSAgICAgKiB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICovCi0KLSAgICBpZiAocnBuZ194X2NyZWF0ZV93aW5kb3coKSkKLSAgICAgICAgZXhpdCgyKTsKLQotCi0gICAgLyogZGVjb2RlIHRoZSBpbWFnZSwgYWxsIGF0IG9uY2UgKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJlYWRwbmdfZ2V0X2ltYWdlKClcbiIpKQotICAgIGltYWdlX2RhdGEgPSByZWFkcG5nX2dldF9pbWFnZShkaXNwbGF5X2V4cG9uZW50LCAmaW1hZ2VfY2hhbm5lbHMsCi0gICAgICAmaW1hZ2Vfcm93Ynl0ZXMpOwotICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCi0KLQotICAgIC8qIGRvbmUgd2l0aCBQTkcgZmlsZSwgc28gY2xlYW4gdXAgdG8gbWluaW1pemUgbWVtb3J5IHVzYWdlIChidXQgZG8gTk9UCi0gICAgICogbnVrZSBpbWFnZV9kYXRhISkgKi8KLQotICAgIHJlYWRwbmdfY2xlYW51cChGQUxTRSk7Ci0gICAgZmNsb3NlKGluZmlsZSk7Ci0KLSAgICBpZiAoIWltYWdlX2RhdGEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gZGVjb2RlIFBORyBpbWFnZVxuIik7Ci0gICAgICAgIGV4aXQoMyk7Ci0gICAgfQotCi0KLSAgICAvKiBkaXNwbGF5IGltYWdlIChjb21wb3NpdGUgd2l0aCBiYWNrZ3JvdW5kIGlmIHJlcXVlc3RlZCkgKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJwbmdfeF9kaXNwbGF5X2ltYWdlKClcbiIpKQotICAgIGlmIChycG5nX3hfZGlzcGxheV9pbWFnZSgpKSB7Ci0gICAgICAgIGZyZWUoaW1hZ2VfZGF0YSk7Ci0gICAgICAgIGV4aXQoNCk7Ci0gICAgfQotICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKVxuIikpCi0KLQotICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCi0KLSAgICBwcmludGYoCi0gICAgICAiRG9uZS4gIFByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgZG8KLSAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7Ci0gICAgd2hpbGUgKCEoZS50eXBlID09IEJ1dHRvblByZXNzICYmIGUueGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uMSkgJiYKLSAgICAgICAgICAgIShlLnR5cGUgPT0gS2V5UHJlc3MgJiYgICAgLyogIHYtLS0gb3IgMSBmb3Igc2hpZnRlZCBrZXlzICovCi0gICAgICAgICAgICAgKChrID0gWExvb2t1cEtleXN5bSgmZS54a2V5LCAwKSkgPT0gWEtfcSB8fCBrID09IFhLX0VzY2FwZSkgKSk7Ci0KLQotICAgIC8qIE9LLCB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwotCi0gICAgcnBuZ194X2NsZWFudXAoKTsKLQotICAgICh2b2lkKWFyZ2M7IC8qIFVudXNlZCAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotc3RhdGljIGludCBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKQotewotICAgIHVjaCAqeGRhdGE7Ci0gICAgaW50IG5lZWRfY29sb3JtYXAgPSBGQUxTRTsKLSAgICBpbnQgc2NyZWVuLCBwYWQ7Ci0gICAgdWxnIGJnX3BpeGVsID0gMEw7Ci0gICAgdWxnIGF0dHJtYXNrOwotICAgIFdpbmRvdyByb290OwotICAgIFhFdmVudCBlOwotICAgIFhHQ1ZhbHVlcyBnY3ZhbHVlczsKLSAgICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOwotICAgIFhUZXh0UHJvcGVydHkgd2luZG93TmFtZSwgKnBXaW5kb3dOYW1lID0gJndpbmRvd05hbWU7Ci0gICAgWFRleHRQcm9wZXJ0eSBpY29uTmFtZSwgKnBJY29uTmFtZSA9ICZpY29uTmFtZTsKLSAgICBYVmlzdWFsSW5mbyB2aXN1YWxfaW5mbzsKLSAgICBYU2l6ZUhpbnRzICpzaXplX2hpbnRzOwotICAgIFhXTUhpbnRzICp3bV9oaW50czsKLSAgICBYQ2xhc3NIaW50ICpjbGFzc19oaW50czsKLQotCi0gICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkaXNwbGF5KTsKLSAgICBkZXB0aCA9IERpc3BsYXlQbGFuZXMoZGlzcGxheSwgc2NyZWVuKTsKLSAgICByb290ID0gUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pOwotCi0jaWZkZWYgREVCVUcKLSAgICBYU3luY2hyb25pemUoZGlzcGxheSwgVHJ1ZSk7Ci0jZW5kaWYKLQotI2lmIDAKLS8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0gICAgaWYgKC8qIGRlcHRoICE9IDggJiYgKi8gZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgInNjcmVlbiBkZXB0aCAlZCBub3Qgc3VwcG9ydGVkIChvbmx5IDE2LSwgMjQtIG9yIDMyLWJpdCBUcnVlQ29sb3IpXG4iLAotICAgICAgICAgIGRlcHRoKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgWE1hdGNoVmlzdWFsSW5mbyhkaXNwbGF5LCBzY3JlZW4sIGRlcHRoLAotICAgICAgKGRlcHRoID09IDgpPyBQc2V1ZG9Db2xvciA6IFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKLSAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7Ci0jZWxzZQotICAgIGlmIChkZXB0aCAhPSAxNiAmJiBkZXB0aCAhPSAyNCAmJiBkZXB0aCAhPSAzMikgewotICAgICAgICBpbnQgdmlzdWFsc19tYXRjaGVkID0gMDsKLQotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZGVmYXVsdCBkZXB0aCBpcyAlZDogIGNoZWNraW5nIG90aGVyIHZpc3VhbHNcbiIsCi0gICAgICAgICAgZGVwdGgpKQotCi0gICAgICAgIC8qIDI0LWJpdCBmaXJzdCAqLwotICAgICAgICB2aXN1YWxfaW5mby5zY3JlZW4gPSBzY3JlZW47Ci0gICAgICAgIHZpc3VhbF9pbmZvLmRlcHRoID0gMjQ7Ci0gICAgICAgIHZpc3VhbF9saXN0ID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwKLSAgICAgICAgICBWaXN1YWxTY3JlZW5NYXNrIHwgVmlzdWFsRGVwdGhNYXNrLCAmdmlzdWFsX2luZm8sICZ2aXN1YWxzX21hdGNoZWQpOwotICAgICAgICBpZiAodmlzdWFsc19tYXRjaGVkID09IDApIHsKLS8qIEdSUjogIGFkZCAxNS0sIDE2LSBhbmQgMzItYml0IFRydWVDb2xvciB2aXN1YWxzIChhbHNvIERpcmVjdENvbG9yPykgKi8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmYXVsdCBzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCwgYW5kIG5vIgotICAgICAgICAgICAgICAiIDI0LWJpdCB2aXN1YWxzIGZvdW5kXG4iLCBkZXB0aCk7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiWEdldFZpc3VhbEluZm8oKSByZXR1cm5lZCAlZCAyNC1iaXQgdmlzdWFsc1xuIiwKLSAgICAgICAgICB2aXN1YWxzX21hdGNoZWQpKQotICAgICAgICB2aXN1YWwgPSB2aXN1YWxfbGlzdFswXS52aXN1YWw7Ci0gICAgICAgIGRlcHRoID0gdmlzdWFsX2xpc3RbMF0uZGVwdGg7Ci0vKgotICAgICAgICBjb2xvcm1hcF9zaXplID0gdmlzdWFsX2xpc3RbMF0uY29sb3JtYXBfc2l6ZTsKLSAgICAgICAgdmlzdWFsX2NsYXNzID0gdmlzdWFsLT5jbGFzczsKLSAgICAgICAgdmlzdWFsSUQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKHZpc3VhbCk7Ci0gKi8KLSAgICAgICAgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IFRSVUU7Ci0gICAgICAgIG5lZWRfY29sb3JtYXAgPSBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFhNYXRjaFZpc3VhbEluZm8oZGlzcGxheSwgc2NyZWVuLCBkZXB0aCwgVHJ1ZUNvbG9yLCAmdmlzdWFsX2luZm8pOwotICAgICAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBSTWFzayA9IHZpc3VhbC0+cmVkX21hc2s7Ci0gICAgR01hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7Ci0gICAgQk1hc2sgPSB2aXN1YWwtPmJsdWVfbWFzazsKLQotLyogR1JSOiAgYWRkL2NoZWNrIDgtYml0IHN1cHBvcnQgKi8KLSAgICBpZiAoZGVwdGggPT0gOCB8fCBuZWVkX2NvbG9ybWFwKSB7Ci0gICAgICAgIGNvbG9ybWFwID0gWENyZWF0ZUNvbG9ybWFwKGRpc3BsYXksIHJvb3QsIHZpc3VhbCwgQWxsb2NOb25lKTsKLSAgICAgICAgaWYgKCFjb2xvcm1hcCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlQ29sb3JtYXAoKSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgaGF2ZV9jb2xvcm1hcCA9IFRSVUU7Ci0gICAgfQotICAgIGlmIChkZXB0aCA9PSAxNSB8fCBkZXB0aCA9PSAxNikgewotICAgICAgICBSU2hpZnQgPSAxNSAtIHJwbmdfeF9tc2IoUk1hc2spOyAgICAvKiB0aGVzZSBhcmUgcmlnaHQtc2hpZnRzICovCi0gICAgICAgIEdTaGlmdCA9IDE1IC0gcnBuZ194X21zYihHTWFzayk7Ci0gICAgICAgIEJTaGlmdCA9IDE1IC0gcnBuZ194X21zYihCTWFzayk7Ci0gICAgfSBlbHNlIGlmIChkZXB0aCA+IDE2KSB7Ci0jZGVmaW5lIE5PXzI0QklUX01BU0tTCi0jaWZkZWYgTk9fMjRCSVRfTUFTS1MKLSAgICAgICAgUlNoaWZ0ID0gcnBuZ194X21zYihSTWFzaykgLSA3OyAgICAgLyogdGhlc2UgYXJlIGxlZnQtc2hpZnRzICovCi0gICAgICAgIEdTaGlmdCA9IHJwbmdfeF9tc2IoR01hc2spIC0gNzsKLSAgICAgICAgQlNoaWZ0ID0gcnBuZ194X21zYihCTWFzaykgLSA3OwotI2Vsc2UKLSAgICAgICAgUlNoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoUk1hc2spOyAgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cywgdG9vICovCi0gICAgICAgIEdTaGlmdCA9IDcgLSBycG5nX3hfbXNiKEdNYXNrKTsKLSAgICAgICAgQlNoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoQk1hc2spOwotI2VuZGlmCi0gICAgfQotICAgIGlmIChkZXB0aCA+PSAxNSAmJiAoUlNoaWZ0IDwgMCB8fCBHU2hpZnQgPCAwIHx8IEJTaGlmdCA8IDApKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAicnBuZyBpbnRlcm5hbCBsb2dpYyBlcnJvcjogIG5lZ2F0aXZlIFggc2hpZnQocykhXG4iKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgYXR0ci5iYWNraW5nX3N0b3JlID0gQWx3YXlzOwotICAgIGF0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzazsKLSAgICBhdHRybWFzayA9IENXQmFja2luZ1N0b3JlIHwgQ1dFdmVudE1hc2s7Ci0gICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpIHsKLSAgICAgICAgYXR0ci5jb2xvcm1hcCA9IGNvbG9ybWFwOwotICAgICAgICBhdHRyLmJhY2tncm91bmRfcGl4ZWwgPSAwOwotICAgICAgICBhdHRyLmJvcmRlcl9waXhlbCA9IDE7Ci0gICAgICAgIGF0dHJtYXNrIHw9IENXQ29sb3JtYXAgfCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWw7Ci0gICAgfQotCi0gICAgd2luZG93ID0gWENyZWF0ZVdpbmRvdyhkaXNwbGF5LCByb290LCAwLCAwLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCAwLAotICAgICAgZGVwdGgsIElucHV0T3V0cHV0LCB2aXN1YWwsIGF0dHJtYXNrLCAmYXR0cik7Ci0KLSAgICBpZiAod2luZG93ID09IE5vbmUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlV2luZG93KCkgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfSBlbHNlCi0gICAgICAgIGhhdmVfd2luZG93ID0gVFJVRTsKLQotICAgIGlmIChkZXB0aCA9PSA4KQotICAgICAgICBYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSwgd2luZG93LCBjb2xvcm1hcCk7Ci0KLSAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJndpbmRvd19uYW1lLCAxLCBwV2luZG93TmFtZSkpCi0gICAgICAgIHBXaW5kb3dOYW1lID0gTlVMTDsKLSAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJmljb25fbmFtZSwgMSwgcEljb25OYW1lKSkKLSAgICAgICAgcEljb25OYW1lID0gTlVMTDsKLQotICAgIC8qIE9LIGlmIGFueSBoaW50cyBhbGxvY2F0aW9uIGZhaWxzOyBYU2V0V01Qcm9wZXJ0aWVzKCkgYWxsb3dzIE5VTExzICovCi0KLSAgICBpZiAoKHNpemVfaGludHMgPSBYQWxsb2NTaXplSGludHMoKSkgIT0gTlVMTCkgewotICAgICAgICAvKiB3aW5kb3cgd2lsbCBub3QgYmUgcmVzaXphYmxlICovCi0gICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gUE1pblNpemUgfCBQTWF4U2l6ZTsKLSAgICAgICAgc2l6ZV9oaW50cy0+bWluX3dpZHRoID0gc2l6ZV9oaW50cy0+bWF4X3dpZHRoID0gKGludClpbWFnZV93aWR0aDsKLSAgICAgICAgc2l6ZV9oaW50cy0+bWluX2hlaWdodCA9IHNpemVfaGludHMtPm1heF9oZWlnaHQgPSAoaW50KWltYWdlX2hlaWdodDsKLSAgICB9Ci0KLSAgICBpZiAoKHdtX2hpbnRzID0gWEFsbG9jV01IaW50cygpKSAhPSBOVUxMKSB7Ci0gICAgICAgIHdtX2hpbnRzLT5pbml0aWFsX3N0YXRlID0gTm9ybWFsU3RhdGU7Ci0gICAgICAgIHdtX2hpbnRzLT5pbnB1dCA9IFRydWU7Ci0gICAgIC8qIHdtX2hpbnRzLT5pY29uX3BpeG1hcCA9IGljb25fcGl4bWFwOyAqLwotICAgICAgICB3bV9oaW50cy0+ZmxhZ3MgPSBTdGF0ZUhpbnQgfCBJbnB1dEhpbnQgIC8qIHwgSWNvblBpeG1hcEhpbnQgKi8gOwotICAgIH0KLQotICAgIGlmICgoY2xhc3NfaGludHMgPSBYQWxsb2NDbGFzc0hpbnQoKSkgIT0gTlVMTCkgewotICAgICAgICBjbGFzc19oaW50cy0+cmVzX25hbWUgPSByZXNfbmFtZTsKLSAgICAgICAgY2xhc3NfaGludHMtPnJlc19jbGFzcyA9IHJlc19jbGFzczsKLSAgICB9Ci0KLSAgICBYU2V0V01Qcm9wZXJ0aWVzKGRpc3BsYXksIHdpbmRvdywgcFdpbmRvd05hbWUsIHBJY29uTmFtZSwgTlVMTCwgMCwKLSAgICAgIHNpemVfaGludHMsIHdtX2hpbnRzLCBjbGFzc19oaW50cyk7Ci0KLSAgICAvKiB2YXJpb3VzIHByb3BlcnRpZXMgYW5kIGhpbnRzIG5vIGxvbmdlciBuZWVkZWQ7IGZyZWUgbWVtb3J5ICovCi0gICAgaWYgKHBXaW5kb3dOYW1lKQotICAgICAgIFhGcmVlKHBXaW5kb3dOYW1lLT52YWx1ZSk7Ci0gICAgaWYgKHBJY29uTmFtZSkKLSAgICAgICBYRnJlZShwSWNvbk5hbWUtPnZhbHVlKTsKLSAgICBpZiAoc2l6ZV9oaW50cykKLSAgICAgICAgWEZyZWUoc2l6ZV9oaW50cyk7Ci0gICAgaWYgKHdtX2hpbnRzKQotICAgICAgIFhGcmVlKHdtX2hpbnRzKTsKLSAgICBpZiAoY2xhc3NfaGludHMpCi0gICAgICAgWEZyZWUoY2xhc3NfaGludHMpOwotCi0gICAgWE1hcFdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOwotCi0gICAgZ2MgPSBYQ3JlYXRlR0MoZGlzcGxheSwgd2luZG93LCAwLCAmZ2N2YWx1ZXMpOwotICAgIGhhdmVfZ2MgPSBUUlVFOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7Ci0gICAgICAgIGJnX3BpeGVsID0gKCh1bGcpYmdfcmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgKCh1bGcpYmdfZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgKCh1bGcpYmdfYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7Ci0gICAgICAgIGJnX3BpeGVsID0gKCgoKHVsZyliZ19yZWQgICA8PCA4KSA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAoKCgodWxnKWJnX2dyZWVuIDw8IDgpID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICgoKCh1bGcpYmdfYmx1ZSAgPDwgOCkgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgIH0KLQotICAgIFhTZXRGb3JlZ3JvdW5kKGRpc3BsYXksIGdjLCBiZ19waXhlbCk7Ci0gICAgWEZpbGxSZWN0YW5nbGUoZGlzcGxheSwgd2luZG93LCBnYywgMCwgMCwgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgV2FpdCBmb3IgZmlyc3QgRXhwb3NlIGV2ZW50IHRvIGRvIGFueSBkcmF3aW5nLCB0aGVuIGZsdXNoLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgZG8KLSAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7Ci0gICAgd2hpbGUgKGUudHlwZSAhPSBFeHBvc2UgfHwgZS54ZXhwb3NlLmNvdW50KTsKLQotICAgIFhGbHVzaChkaXNwbGF5KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBYLSBhbmQgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoNCppbWFnZV93aWR0aCppbWFnZV9oZWlnaHQpOwotICAgICAgICBwYWQgPSAzMjsKLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7Ci0gICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYygyKmltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7Ci0gICAgICAgIHBhZCA9IDE2OwotICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKGltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7Ci0gICAgICAgIHBhZCA9IDg7Ci0gICAgfQotCi0gICAgaWYgKCF4ZGF0YSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBpbWFnZSBtZW1vcnlcbiIpOwotICAgICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgICB4aW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoZGlzcGxheSwgdmlzdWFsLCBkZXB0aCwgWlBpeG1hcCwgMCwKLSAgICAgIChjaGFyICopeGRhdGEsIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIHBhZCwgMCk7Ci0KLSAgICBpZiAoIXhpbWFnZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIFhDcmVhdGVJbWFnZSgpIGZhaWxlZFxuIik7Ci0gICAgICAgIGZyZWUoeGRhdGEpOwotICAgICAgICByZXR1cm4gMzsKLSAgICB9Ci0KLSAgICAvKiB0byBhdm9pZCB0ZXN0aW5nIHRoZSBieXRlIG9yZGVyIGV2ZXJ5IHBpeGVsIChvciBkb3VibGluZyB0aGUgc2l6ZSBvZgotICAgICAqIHRoZSBkcmF3aW5nIHJvdXRpbmUgd2l0aCBhIGdpYW50IGlmLXRlc3QpLCB3ZSBhcmJpdHJhcmlseSBzZXQgdGhlIGJ5dGUKLSAgICAgKiBvcmRlciB0byBNU0JGaXJzdCBhbmQgbGV0IFhsaWIgd29ycnkgYWJvdXQgaW52ZXJ0aW5nIHRoaW5ncyBvbiBsaXR0bGUtCi0gICAgICogZW5kaWFuIG1hY2hpbmVzIChsaWtlIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlIG1vc3QKLSAgICAgKiBlZmZpY2llbnQgYXBwcm9hY2ggKHRoZSBnaWFudCBpZi10ZXN0IHdvdWxkIGJlIGJldHRlciksIGJ1dCBpbiB0aGUKLSAgICAgKiBpbnRlcmVzdCBvZiBjbGFyaXR5LCB3ZSB0YWtlIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8KLQotICAgIHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OwotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmdfeF9jcmVhdGVfd2luZG93KCkgKi8KLQotCi0KLQotCi1zdGF0aWMgaW50IHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpCi17Ci0gICAgdWNoICpzcmM7Ci0gICAgY2hhciAqZGVzdDsKLSAgICB1Y2ggciwgZywgYiwgYTsKLSAgICB1bGcgaSwgcm93LCBsYXN0cm93ID0gMDsKLSAgICB1bGcgcGl4ZWw7Ci0gICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0vKiAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7ICAqLwotCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAotICAgICAgaW1hZ2VfY2hhbm5lbHMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWxkLCB4aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCi0gICAgICBpbWFnZV93aWR0aCwgaW1hZ2Vfcm93Ynl0ZXMsIHhpbWFnZV9yb3dieXRlcykpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgIChicHAgPSAlZClcbiIsIHhpbWFnZS0+Yml0c19wZXJfcGl4ZWwpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnl0ZV9vcmRlciA9ICVzKVxuIiwgeGltYWdlLT5ieXRlX29yZGVyID09IE1TQkZpcnN0PwotICAgICAgIk1TQkZpcnN0IiA6ICh4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTFNCRmlyc3Q/ICJMU0JGaXJzdCIgOiAidW5rbm93biIpKSkKLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKLQotICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwotI2lmZGVmIE5PXzI0QklUX01BU0tTCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICB0aGlzIGFzc3VtZXMgYnBwID09IDMyLCBidXQgbWF5IGJlIDI0OiAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKEJTaGlmdCA8IDApPyBibHVlICA8PCAoLUJTaGlmdCkgOiBibHVlICA+PiBCU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOwotICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgLyogaWYgKGltYWdlX2NoYW5uZWxzID09IDQpICovIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwotICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAotICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgMTYpOwotICAgICAgICAgICAgICAgIFhGbHVzaChkaXNwbGF5KTsKLSAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKLQotICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHNyYyA9IGltYWdlX2RhdGEgKyByb3cqaW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICArK3NyYzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpbWFnZV9jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpYmdfcmVkICAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bwotICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IGFyZ3VtZW50ICg9PSBmZyBieXRlIGhlcmU6ICBzYWZlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGIsIGIsIGEsIGJnX2JsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCi0gICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKLSAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIGltYWdlX3dpZHRoLCAxNik7Ci0gICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwotICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKLSAgICBpZiAobGFzdHJvdyA8IGltYWdlX2hlaWdodCkgewotICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LWxhc3Ryb3cpOwotICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmdfeF9jbGVhbnVwKHZvaWQpCi17Ci0gICAgaWYgKGltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZShpbWFnZV9kYXRhKTsKLSAgICAgICAgaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHhpbWFnZSkgewotICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7Ci0gICAgICAgICAgICBmcmVlKHhpbWFnZS0+ZGF0YSk7ICAgICAgICAgICAvKiB3ZSBhbGxvY2F0ZWQgaXQsIHNvIHdlIGZyZWUgaXQgKi8KLSAgICAgICAgICAgIHhpbWFnZS0+ZGF0YSA9IChjaGFyICopTlVMTDsgIC8qICBpbnN0ZWFkIG9mIFhEZXN0cm95SW1hZ2UoKSAqLwotICAgICAgICB9Ci0gICAgICAgIFhEZXN0cm95SW1hZ2UoeGltYWdlKTsKLSAgICAgICAgeGltYWdlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV9nYykKLSAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7Ci0KLSAgICBpZiAoaGF2ZV93aW5kb3cpCi0gICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7Ci0KLSAgICBpZiAoaGF2ZV9jb2xvcm1hcCkKLSAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7Ci0KLSAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkKLSAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZ194X21zYih1bGcgdTMydmFsKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMzE7ICBpID49IDA7ICAtLWkpIHsKLSAgICAgICAgaWYgKHUzMnZhbCAmIDB4ODAwMDAwMDBMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHUzMnZhbCA8PD0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL3JwbmcyLXdpbi5jIGIvY29udHJpYi9ncmVnYm9vay9ycG5nMi13aW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiOWRmYS4uMDAwMDAwMAotLS0gYS9jb250cmliL2dyZWdib29rL3JwbmcyLXdpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nMiAtIHByb2dyZXNzaXZlLW1vZGVsIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgcnBuZzItd2luLmMKLQotICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5LCBhcyBpZiBpdCB3ZXJlCi0gICBhIHdlYiBicm93c2VyICh0aG91Z2ggdGhlIGZyb250IGVuZCBpcyBvbmx5IHNldCB1cCB0byByZWFkIGZyb20gZmlsZXMpLgotICAgSXQgc3VwcG9ydHMgZ2FtbWEgY29ycmVjdGlvbiwgdXNlci1zcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvcnMsIGFuZCB1c2VyLQotICAgc3BlY2lmaWVkIGJhY2tncm91bmQgcGF0dGVybnMgKGZvciB0cmFuc3BhcmVudCBpbWFnZXMpLiAgVGhpcyB2ZXJzaW9uIGlzCi0gICBmb3IgMzItYml0IFdpbmRvd3M7IGl0IG1heSBjb21waWxlIHVuZGVyIDE2LWJpdCBXaW5kb3dzIHdpdGggYSBsaXR0bGUKLSAgIHR3ZWFraW5nIChvciBtYXliZSBub3QpLiAgVGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8gYW5kIFBpZXRlciBTLiB2YW4gZGVyCi0gICBNZXVsZW4gZm9yIHRoZSAiZGlhbW9uZCIgYW5kICJyYWRpYWwgd2F2ZXMiIHBhdHRlcm5zLCByZXNwZWN0aXZlbHkuCi0KLSAgIHRvIGRvIChzb21lZGF5LCBtYXliZSk6Ci0gICAgLSBoYW5kbGUgcXVvdGVkIGNvbW1hbmQtbGluZSBhcmdzIChlc3BlY2lhbGx5IGZpbGVuYW1lcyB3aXRoIHNwYWNlcykKLSAgICAtIGZpbmlzaCByZXNpemFibGUgY2hlY2tlcmJvYXJkLWdyYWRpZW50IChzaXplcyA0LTEyOD8pCi0gICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/Ci0gICAgLSBoYXZlIG1pbmltdW0gd2luZG93IHdpZHRoOiAgb2ggd2VsbAotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBDaGFuZ2Vsb2c6Ci0gICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQotICAgIC0gMS4wMjogIGZpeGVkIGN1dC1hbmQtcGFzdGUgZXJyb3IgaW4gdXNhZ2Ugc2NyZWVuIChvb3BzLi4uKQotICAgIC0gMS4wMzogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnMKLSAgICAtIDEuMDQ6ICByZW1vdmVkIGJvZ3VzIGV4dHJhIGFyZ3VtZW50IGZyb20gdXNhZ2UgZnByaW50ZigpIFtHbGVubiBSLVA/XTsKLSAgICAgICAgICAgICAgZml4ZWQgY29tbWFuZC1saW5lIHBhcnNpbmcgYnVnCi0gICAgLSAxLjEwOiAgZW5hYmxlZCAibWVzc2FnZSB3aW5kb3ciL2NvbnNvbGUgKHRoYW5rcyB0byBEYXZpZCBHZWxkcmVpY2gpCi0gICAgLSAxLjIwOiAgYWRkZWQgcnVudGltZSBNTVgtZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBuZXcgLW1teCogb3B0aW9ucwotICAgIC0gMS4yMTogIG1hZGUgbWlub3IgdHdlYWsgdG8gdXNhZ2Ugc2NyZWVuIHRvIGZpdCB3aXRoaW4gMjUtbGluZSBjb25zb2xlCi0gICAgLSAxLjIyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXykKLSAgICAtIDIuMDA6ICBkdWFsLWxpY2Vuc2VkIChhZGRlZCBHTlUgR1BMKQotICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmMKLSAgICAtIDIuMDI6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3Iocyk7IGZpeGVkCi0gICAgICAgICAgICAgIHVuZXhwZWN0ZWQtRU9GIGFuZCBmaWxlLXJlYWQtZXJyb3IgY2FzZXMKLSAgICAtIDIuMDM6ICByZW1vdmVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgb2Jzb2xldGUgLW1teCogb3B0aW9ucwotICAgIC0gMi4wNDoKLSAgICAgICAgICAgICAoR1ItUCkKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgInJwbmcyLXdpbiIKLSNkZWZpbmUgTE9OR05BTUUgICJQcm9ncmVzc2l2ZSBQTkcgVmlld2VyIGZvciBXaW5kb3dzIgotI2RlZmluZSBWRVJTSU9OICAgIjIuMDIgb2YgMTYgTWFyY2ggMjAwOCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+ICAgIC8qIGZvciBqbXBidWYgZGVjbGFyYXRpb24gaW4gcmVhZHBuZzIuaCAqLwotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+ICAgICAgLyogb25seSBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGUgKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaWZkZWYgX19DWUdXSU5fXwotLyogZ2V0Y2ggcmVwbGFjZW1lbnQuIFR1cm5zIG91dCwgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhpcywKLSAqIGJ1dCBsZWF2ZSBpdCBoZXJlIGlmIHdlIGV2ZXIgZW5hYmxlIGFueSBvZiB0aGUgdXNlcyBvZgotICogX2dldGNoIGluIHRoZSBtYWluIGNvZGUKLSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHRlcm1pby5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotaW50IHJlcGxfZ2V0Y2goIHZvaWQgKQotewotICBjaGFyIGNoOwotICBpbnQgZmQgPSBmaWxlbm8oc3RkaW4pOwotICBzdHJ1Y3QgdGVybWlvIG9sZF90dHksIG5ld190dHk7Ci0KLSAgaW9jdGwoZmQsIFRDR0VUQSwgJm9sZF90dHkpOwotICBuZXdfdHR5ID0gb2xkX3R0eTsKLSAgbmV3X3R0eS5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IElTSUcpOwotICBpb2N0bChmZCwgVENTRVRBLCAmbmV3X3R0eSk7Ci0gIGZyZWFkKCZjaCwgMSwgc2l6ZW9mKGNoKSwgc3RkaW4pOwotICBpb2N0bChmZCwgVENTRVRBLCAmb2xkX3R0eSk7Ci0KLSAgcmV0dXJuIGNoOwotfQotI2RlZmluZSBfZ2V0Y2ggcmVwbF9nZXRjaAotI2Vsc2UKLSNpbmNsdWRlIDxjb25pby5oPiAgICAgLyogb25seSBmb3IgX2dldGNoKCkgKi8KLSNlbmRpZgotCi0vKiBhbGwgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlOiAqLwotI2lmbmRlZiBQSQotIyAgZGVmaW5lIFBJICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4Ci0jZW5kaWYKLSNkZWZpbmUgUElfMiAgICAgICAgICAgICAoUEkqMC41KQotI2RlZmluZSBJTlZfUElfMzYwICAgICAgICgzNjAuMCAvIFBJKQotI2RlZmluZSBNQVgoYSxiKSAgICAgICAgIChhPmI/YTpiKQotI2RlZmluZSBNSU4oYSxiKSAgICAgICAgIChhPGI/YTpiKQotI2RlZmluZSBDTElQKGEsbWluLG1heCkgIE1BWChtaW4sTUlOKChhKSxtYXgpKQotI2RlZmluZSBBQlMoYSkgICAgICAgICAgICgoYSk8MD8tKGEpOihhKSkKLSNkZWZpbmUgQ0xJUDhQKGMpICAgICAgICBNQVgoMCwoTUlOKChjKSwyNTUpKSkgICAvKiA4LWJpdCBwb3MuIGludGVnZXIgKHVjaCkgKi8KLSNkZWZpbmUgUk9VTkRGKGYpICAgICAgICAoKGludCkoZiArIDAuNSkpCi0KLSNkZWZpbmUgcmdiMV9tYXggICBiZ19mcmVxCi0jZGVmaW5lIHJnYjFfbWluICAgYmdfZ3JheQotI2RlZmluZSByZ2IyX21heCAgIGJnX2JzYXQKLSNkZWZpbmUgcmdiMl9taW4gICBiZ19icm90Ci0KLS8qICNkZWZpbmUgREVCVUcgKi8gICAgIC8qIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KLQotI2luY2x1ZGUgInJlYWRwbmcyLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHJlYWRwbmcyIHByb3RvdHlwZXMgKi8KLQotCi0vKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwotICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAotICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KLQotI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAotICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAotICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAotfQotCi0KLSNkZWZpbmUgSU5CVUZTSVpFIDQwOTYgICAvKiB3aXRoIHBzZXVkby10aW1pbmcgb24gKDEgc2VjIGRlbGF5L2Jsb2NrKSwgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAqICBibG9jayBzaXplIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gYSBkb3dubG9hZAotICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzcGVlZCAxMCUgZmFzdGVyIHRoYW4gdGhlb3JldGljYWwgMzMuNksgbWF4aW11bQotICAgICAgICAgICAgICAgICAgICAgICAgICAqICAoYXNzdW1pbmcgOCBkYXRhIGJpdHMsIDEgc3RvcCBiaXQgYW5kIG5vIG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIG92ZXJoZWFkKSAqLwotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5faW5pdCh2b2lkKTsKLXN0YXRpYyBpbnQgICAgICAgIHJwbmcyX3dpbl9jcmVhdGVfd2luZG93KHZvaWQpOwotc3RhdGljIGludCAgICAgICAgcnBuZzJfd2luX2xvYWRfYmdfaW1hZ2Uodm9pZCk7Ci1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5fZGlzcGxheV9yb3codWxnIHJvdyk7Ci1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5fZmluaXNoX2Rpc3BsYXkodm9pZCk7Ci1zdGF0aWMgdm9pZCAgICAgICBycG5nMl93aW5fY2xlYW51cCh2b2lkKTsKLUxSRVNVTFQgQ0FMTEJBQ0sgIHJwbmcyX3dpbl93bmRwcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLQotCi1zdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XTsKLXN0YXRpYyBjaGFyICpwcm9nbmFtZSA9IFBST0dOQU1FOwotc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBGSUxFICppbmZpbGU7Ci0KLXN0YXRpYyBtYWlucHJvZ19pbmZvIHJwbmcyX2luZm87Ci0KLXN0YXRpYyB1Y2ggaW5idWZbSU5CVUZTSVpFXTsKLXN0YXRpYyBpbnQgaW5jb3VudDsKLQotc3RhdGljIGludCBwYXQgPSA2OyAgICAgICAgIC8qIG11c3QgYmUgbGVzcyB0aGFuIG51bV9iZ3BhdCAqLwotc3RhdGljIGludCBiZ19pbWFnZSA9IDA7Ci1zdGF0aWMgaW50IGJnc2NhbGUgPSAxNjsKLXN0YXRpYyB1bGcgYmdfcm93Ynl0ZXM7Ci1zdGF0aWMgdWNoICpiZ19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHJnYl9jb2xvciB7Ci0gICAgdWNoIHIsIGcsIGI7Ci19IHJnYltdID0gewotICAgIHsgIDAsICAgMCwgICAwfSwgICAgLyogIDA6ICBibGFjayAqLwotICAgIHsyNTUsIDI1NSwgMjU1fSwgICAgLyogIDE6ICB3aGl0ZSAqLwotICAgIHsxNzMsIDEzMiwgIDU3fSwgICAgLyogIDI6ICB0YW4gKi8KLSAgICB7IDY0LCAxMzIsICAgMH0sICAgIC8qICAzOiAgbWVkaXVtIGdyZWVuICovCi0gICAgezE4OSwgMTE3LCAgIDF9LCAgICAvKiAgNDogIGdvbGQgKi8KLSAgICB7MjUzLCAyNDksICAgMX0sICAgIC8qICA1OiAgeWVsbG93ICovCi0gICAgeyAgMCwgICAwLCAyNTV9LCAgICAvKiAgNjogIGJsdWUgKi8KLSAgICB7ICAwLCAgIDAsIDEyMH0sICAgIC8qICA3OiAgbWVkaXVtIGJsdWUgKi8KLSAgICB7MjU1LCAgIDAsIDI1NX0sICAgIC8qICA4OiAgbWFnZW50YSAqLwotICAgIHsgNjQsICAgMCwgIDY0fSwgICAgLyogIDk6ICBkYXJrIG1hZ2VudGEgKi8KLSAgICB7MjU1LCAgIDAsICAgMH0sICAgIC8qIDEwOiAgcmVkICovCi0gICAgeyA2NCwgICAwLCAgIDB9LCAgICAvKiAxMTogIGRhcmsgcmVkICovCi0gICAgezI1NSwgMTI3LCAgIDB9LCAgICAvKiAxMjogIG9yYW5nZSAqLwotICAgIHsxOTIsICA5NiwgICAwfSwgICAgLyogMTM6ICBkYXJrZXIgb3JhbmdlICovCi0gICAgeyAyNCwgIDYwLCAgIDB9LCAgICAvKiAxNDogIGRhcmsgZ3JlZW4teWVsbG93ICovCi0gICAgeyA4NSwgMTI1LCAyMDB9ICAgICAvKiAxNTogIGljZSBibHVlICovCi19OwotLyogbm90IHVzZWQgZm9yIG5vdywgYnV0IHNob3VsZCBiZSBmb3IgZXJyb3ItY2hlY2tpbmc6Ci1zdGF0aWMgaW50IG51bV9yZ2IgPSBzaXplb2YocmdiKSAvIHNpemVvZihzdHJ1Y3QgcmdiX2NvbG9yKTsKLSAqLwotCi0vKgotICAgIFRoaXMgd2hvbGUgc3RydWN0IGlzIGEgZmFpcmx5IGNoZWVzeSB3YXkgdG8ga2VlcCB0aGUgbnVtYmVyIG9mCi0gICAgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBtaW5pbXVtLiAgVGhlIHJhZGlhbC13YXZlcyBiYWNrZ3JvdW5kCi0gICAgdHlwZSBpcyBhIHBhcnRpY3VsYXJseSBwb29yIGZpdCB0byB0aGUgaW50ZWdlciBlbGVtZW50cyBvZiB0aGUKLSAgICBzdHJ1Y3QuLi5idXQgYSBmZXcgbWFjcm9zIGFuZCBhIGxpdHRsZSBmaXhlZC1wb2ludCBtYXRoIHdpbGwgZG8KLSAgICB3b25kZXJzIGZvciB5YS4KLQotICAgIHR5cGUgYml0czoKLSAgICAgICBGIEUgRCBDIEIgQSA5IDggNyA2IDUgNCAzIDIgMSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8IHwgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgKy0rLSstLSAwID0gc2hhcnAtZWRnZWQgY2hlY2tlcmJvYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDEgPSBzb2Z0IGRpYW1vbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDIgPSByYWRpYWwgd2F2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgIDMtNyA9IHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICstLSBncmFkaWVudCAjMiBpbnZlcnRlZD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tIGFsdGVybmF0aW5nIGNvbHVtbnMgaW52ZXJ0ZWQ/Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuIHsKLSAgICB1c2ggdHlwZTsKLSAgICBpbnQgcmdiMV9tYXgsIHJnYjFfbWluOyAgICAgLyogb3IgYmdfZnJlcSwgYmdfZ3JheSAqLwotICAgIGludCByZ2IyX21heCwgcmdiMl9taW47ICAgICAvKiBvciBiZ19ic2F0LCBiZ19icm90IChib3RoIHNjYWxlZCBieSAxMCkqLwotfSBiZ1tdID0gewotICAgIHswKzgsICAgMiwwLCAgMSwxNX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2ljZSBibHVlICovCi0gICAgezArMjQsICAyLDAsICAxLDB9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIHRhbi9ibGFjayB2cy4gd2hpdGUvYmxhY2sgKi8KLSAgICB7MCs4LCAgIDQsNSwgIDAsMn0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZ29sZC95ZWxsb3cgdnMuIGJsYWNrL3RhbiAqLwotICAgIHswKzgsICAgNCw1LCAgMCw2fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svYmx1ZSAqLwotICAgIHswLCAgICAgNywwLCAgOCw5fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBkZWVwIGJsdWUvYmxhY2sgdnMuIG1hZ2VudGEgKi8KLSAgICB7MCs4LCAgMTMsMCwgIDUsMTR9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiB5ZWxsb3cgKi8KLSAgICB7MCs4LCAgMTIsMCwgMTAsMTF9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiByZWQgKi8KLSAgICB7MSwgICAgIDcsMCwgIDgsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBkZWVwIGJsdWUvYmxhY2sgdnMuIG1hZ2VudGEgKi8KLSAgICB7MSwgICAgMTIsMCwgMTEsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBvcmFuZ2UgdnMuIGRhcmsgcmVkICovCi0gICAgezEsICAgIDEwLDAsICA3LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgcmVkIHZzLiBtZWRpdW0gYmx1ZSAqLwotICAgIHsxLCAgICAgNCwwLCAgNSwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGdvbGQgdnMuIHllbGxvdyAqLwotICAgIHsxLCAgICAgMywwLCAgMCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIG1lZGl1bSBncmVlbiB2cy4gYmxhY2sgKi8KLSAgICB7MiwgICAgMTYsIDEwMCwgIDIwLCAgIDB9LCAgLyogcmFkaWFsOiAgfmhhcmQgcmFkaWFsIGNvbG9yLWJlYW1zICovCi0gICAgezIsICAgIDE4LCAxMDAsICAxMCwgICAyfSwgIC8qIHJhZGlhbDogIHNvZnQsIGN1cnZlZCByYWRpYWwgY29sb3ItYmVhbXMgKi8KLSAgICB7MiwgICAgMTYsIDI1NiwgMTAwLCAyNTB9LCAgLyogcmFkaWFsOiAgdmVyeSB0aWdodCBzcGlyYWwgKi8KLSAgICB7MiwgMTAwMDAsIDI1NiwgIDExLCAgIDB9ICAgLyogcmFkaWFsOiAgZGlwb2xlLW1vaXJlJyAoYWxtb3N0IGZyYWN0YWwpICovCi19Owotc3RhdGljIGludCBudW1fYmdwYXQgPSBzaXplb2YoYmcpIC8gc2l6ZW9mKHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4pOwotCi0KLS8qIFdpbmRvd3Mtc3BlY2lmaWMgZ2xvYmFsIHZhcmlhYmxlcyAoY291bGQgZ28gaW4gc3RydWN0LCBidXQgbWVzc3kuLi4pICovCi1zdGF0aWMgdWxnIHdpbWFnZV9yb3dieXRlczsKLXN0YXRpYyB1Y2ggKmRpYjsKLXN0YXRpYyB1Y2ggKndpbWFnZV9kYXRhOwotc3RhdGljIEJJVE1BUElORk9IRUFERVIgKmJtaWg7Ci0KLXN0YXRpYyBIV05EIGdsb2JhbF9od25kOwotc3RhdGljIEhJTlNUQU5DRSBnbG9iYWxfaEluc3Q7Ci1zdGF0aWMgaW50IGdsb2JhbF9zaG93bW9kZTsKLQotCi0KLQotaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdCwgSElOU1RBTkNFIGhQcmV2SW5zdCwgUFNUUiBjbWQsIGludCBzaG93bW9kZSkKLXsKLSAgICBjaGFyICphcmdzWzEwMjRdOyAgICAgICAgICAgICAgICAgLyogYXJiaXRyYXJ5IGxpbWl0LCBidXQgc2hvdWxkIHN1ZmZpY2UgKi8KLSAgICBjaGFyICoqYXJndiA9IGFyZ3M7Ci0gICAgY2hhciAqcCwgKnEsICpiZ3N0ciA9IE5VTEw7Ci0gICAgaW50IGFyZ2MgPSAwOwotICAgIGludCByYywgYWxlbiwgZmxlbjsKLSAgICBpbnQgZXJyb3IgPSAwOwotICAgIGludCB0aW1pbmcgPSBGQUxTRTsKLSAgICBpbnQgaGF2ZV9iZyA9IEZBTFNFOwotICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KLSAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAvKiB3aG9sZSBkaXNwbGF5IHN5c3RlbSAqLwotICAgIE1TRyBtc2c7Ci0KLQotICAgIC8qIEZpcnN0IGluaXRpYWxpemUgYSBmZXcgdGhpbmdzLCBqdXN0IHRvIGJlIHN1cmUtLW1lbXNldCB0YWtlcyBjYXJlIG9mCi0gICAgICogZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIChibGFjayksIGJvb2xlYW5zIChGQUxTRSksIHBvaW50ZXJzIChOVUxMKSwKLSAgICAgKiBldGMuICovCi0KLSAgICBnbG9iYWxfaEluc3QgPSBoSW5zdDsKLSAgICBnbG9iYWxfc2hvd21vZGUgPSBzaG93bW9kZTsKLSAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKLSAgICBtZW1zZXQoJnJwbmcyX2luZm8sIDAsIHNpemVvZihtYWlucHJvZ19pbmZvKSk7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotICAgIC8qIE5leHQgcmVlbmFibGUgY29uc29sZSBvdXRwdXQsIHdoaWNoIG5vcm1hbGx5IGdvZXMgdG8gdGhlIGJpdCBidWNrZXQKLSAgICAgKiBmb3Igd2luZG93ZWQgYXBwcy4gIENsb3NpbmcgdGhlIGNvbnNvbGUgd2luZG93IHdpbGwgdGVybWluYXRlIHRoZQotICAgICAqIGFwcC4gIFRoYW5rcyB0byBEYXZpZC5HZWxkcmVpY2hAcmVhbHZpei5jb20gZm9yIHN1cHBseWluZyB0aGUgbWFnaWNhbAotICAgICAqIGluY2FudGF0aW9uLiAqLwotCi0gICAgQWxsb2NDb25zb2xlKCk7Ci0gICAgZnJlb3BlbigiQ09OT1VUJCIsICJhIiwgc3RkZXJyKTsKLSAgICBmcmVvcGVuKCJDT05PVVQkIiwgImEiLCBzdGRvdXQpOwotI2VuZGlmCi0KLSAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwgdGhlCi0gICAgICogcHJvZHVjdCBvZiB0aGUgQ1JUIGV4cG9uZW50IGFuZCB0aGUgZXhwb25lbnQgY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCi0gICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAotICAgICAqIG9uZXMpLCBidXQgaXQgc2hvdWxkIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAgQW5kCi0gICAgICogeWVzLCB0aGVzZSBpZmRlZnMgYXJlIGNvbXBsZXRlbHkgd2FzdGVkIGluIGEgV2luZG93cyBwcm9ncmFtLi4uICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgLyogdGhpcmQtcGFydHkgdXRpbGl0aWVzIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgTFVUIGV4cG9uZW50ICovCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0bwotICAgICAqIGdldCB0aGUgImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGF0b2YocCk7Ci0gICAgZWxzZQotICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7Ci0KLQotICAgIC8qIFdpbmRvd3MgcmVhbGx5IGhhdGVzIGNvbW1hbmQgbGluZXMsIHNvIHdlIGhhdmUgdG8gc2V0IHVwIG91ciBvd24gYXJndi4KLSAgICAgKiBOb3RlIHRoYXQgd2UgZG8gTk9UIGJvdGhlciB3aXRoIHF1b3RlZCBhcmd1bWVudHMgaGVyZSwgc28gZG9uJ3QgdXNlCi0gICAgICogZmlsZW5hbWVzIHdpdGggc3BhY2VzIGluICdlbSEgKi8KLQotICAgIGFyZ3ZbYXJnYysrXSA9IFBST0dOQU1FOwotICAgIHAgPSBjbWQ7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKnAgPT0gJyAnKQotICAgICAgICAgICAgd2hpbGUgKCorK3AgPT0gJyAnKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgLyogbm93IHAgcG9pbnRzIGF0IHRoZSBmaXJzdCBub24tc3BhY2UgYWZ0ZXIgc29tZSBzcGFjZXMgKi8KLSAgICAgICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAgICAgICBicmVhazsgICAgLyogbm90aGluZyBhZnRlciB0aGUgc3BhY2VzOiAgZG9uZSAqLwotICAgICAgICBhcmd2W2FyZ2MrK10gPSBxID0gcDsKLSAgICAgICAgd2hpbGUgKCpxICYmICpxICE9ICcgJykKLSAgICAgICAgICAgICsrcTsKLSAgICAgICAgLyogbm93IHEgcG9pbnRzIGF0IGEgc3BhY2Ugb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCi0gICAgICAgIGlmICgqcSA9PSAnXDAnKQotICAgICAgICAgICAgYnJlYWs7ICAgIC8qIGxhc3QgYXJndiBhbHJlYWR5IHRlcm1pbmF0ZWQ7IHF1aXQgKi8KLSAgICAgICAgKnEgPSAnXDAnOyAgICAvKiBjaGFuZ2Ugc3BhY2UgdG8gdGVybWluYXRvciAqLwotICAgICAgICBwID0gcSArIDE7Ci0gICAgfQotICAgIGFyZ3ZbYXJnY10gPSBOVUxMOyAgIC8qIHRlcm1pbmF0ZSB0aGUgYXJndiBhcnJheSBpdHNlbGYgKi8KLQotCi0gICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCi0KLSAgICB3aGlsZSAoKisrYXJndiAmJiAhZXJyb3IpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA8PSAwLjApCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJnc3RyID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmxlbihiZ3N0cikgIT0gNyB8fCBiZ3N0clswXSAhPSAnIycpCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ3BhdCIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoISorK2FyZ3YpCi0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBhdCA9IGF0b2koKmFyZ3YpIC0gMTsKLSAgICAgICAgICAgICAgICBpZiAocGF0IDwgMCB8fCBwYXQgPj0gbnVtX2JncGF0KQotICAgICAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItdGltaW5nIiwgMikpIHsKLSAgICAgICAgICAgIHRpbWluZyA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3ZbMV0pICAgLyogc2hvdWxkbid0IGJlIGFueSBtb3JlIGFyZ3MgYWZ0ZXIgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICsrZXJyb3I7ICAgLyogbm90IGV4cGVjdGluZyBhbnkgb3RoZXIgb3B0aW9ucyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmaWxlbmFtZSkKLSAgICAgICAgKytlcnJvcjsKLQotCi0gICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwotCi0gICAgaWYgKGVycm9yKSB7Ci0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgaW50IGNoOwotI2VuZGlmCi0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcblxuIiwgUFJPR05BTUUsIFZFUlNJT04sIGFwcG5hbWUpOwotICAgICAgICByZWFkcG5nMl92ZXJzaW9uX2luZm8oKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIKLSAgICAgICAgICAiVXNhZ2U6ICAlcyBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnIHwgLWJncGF0IHBhdF0gWy10aW1pbmddXG4iCi0gICAgICAgICAgIiAgICAgICAgJSpzIGZpbGUucG5nXG5cbiIKLSAgICAgICAgICAiICAgIGV4cCBcdHRyYW5zZmVyLWZ1bmN0aW9uIGV4cG9uZW50IChgYGdhbW1hJycpIG9mIHRoZSBkaXNwbGF5XG4iCi0gICAgICAgICAgIlx0XHQgIHN5c3RlbSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGUuZy4sIGBgJS4xZicnKTsgZXF1YWxcbiIKLSAgICAgICAgICAiXHRcdCAgdG8gdGhlIHByb2R1Y3Qgb2YgdGhlIGxvb2t1cC10YWJsZSBleHBvbmVudCAodmFyaWVzKVxuIgotICAgICAgICAgICJcdFx0ICBhbmQgdGhlIENSVCBleHBvbmVudCAodXN1YWxseSAyLjIpOyBtdXN0IGJlIHBvc2l0aXZlXG4iCi0gICAgICAgICAgIiAgICBiZyAgXHRkZXNpcmVkIGJhY2tncm91bmQgY29sb3IgaW4gNy1jaGFyYWN0ZXIgaGV4IFJHQiBmb3JtYXRcbiIKLSAgICAgICAgICAiXHRcdCAgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6ICBzYW1lIGFzIEhUTUwgY29sb3JzKTtcbiIKLSAgICAgICAgICAiXHRcdCAgdXNlZCB3aXRoIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ3BhdCBvcHRpb25cbiIKLSAgICAgICAgICAiICAgIHBhdCBcdGRlc2lyZWQgYmFja2dyb3VuZCBwYXR0ZXJuIG51bWJlciAoMS0lZCk7IHVzZWQgd2l0aFxuIgotICAgICAgICAgICJcdFx0ICB0cmFuc3BhcmVudCBpbWFnZXM7IG92ZXJyaWRlcyAtYmdjb2xvciBvcHRpb25cbiIKLSAgICAgICAgICAiICAgIC10aW1pbmdcdGVuYWJsZXMgZGVsYXkgZm9yIGV2ZXJ5IGJsb2NrIHJlYWQsIHRvIHNpbXVsYXRlIG1vZGVtXG4iCi0gICAgICAgICAgIlx0XHQgIGRvd25sb2FkIG9mIGltYWdlICh+MzYgS2JwcylcbiIKLSAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgYWZ0ZXIgaW1hZ2UgaXMgZGlzcGxheWVkIHRvIHF1aXQuXG4iCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgICAiUHJlc3MgUSBvciBFc2MgdG8gcXVpdCB0aGlzIHVzYWdlIHNjcmVlbi4gIiwKLSNlbHNlCi0gICAgICAgICAgLAotI2VuZGlmCi0gICAgICAgICAgUFJPR05BTUUsCi0jaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkgJiYgXAotICAgICEoZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKLSAgICAgICAgICAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIiwKLSNlbmRpZgotICAgICAgICAgIChpbnQpc3RybGVuKFBST0dOQU1FKSwgIiAiLCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQsIG51bV9iZ3BhdCk7Ci0gICAgICAgIGZmbHVzaChzdGRlcnIpOwotI2lmbmRlZiBfX0NZR1dJTl9fCi0gICAgICAgIGRvCi0gICAgICAgICAgICBjaCA9IF9nZXRjaCgpOwotICAgICAgICB3aGlsZSAoY2ggIT0gJ3EnICYmIGNoICE9ICdRJyAmJiBjaCAhPSAweDFCKTsKLSNlbmRpZgotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotCi0gICAgaWYgKCEoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOwotICAgICAgICArK2Vycm9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOwotICAgICAgICBpZiAoaW5jb3VudCA8IDggfHwgIXJlYWRwbmcyX2NoZWNrX3NpZyhpbmJ1ZiwgOCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKLSAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfSBlbHNlIGlmICgocmMgPSByZWFkcG5nMl9pbml0KCZycG5nMl9pbmZvKSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoIChyYykgewotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biByZWFkcG5nMl9pbml0KCkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZXJyb3IpIHsKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgICBpbnQgY2g7Ci0jZW5kaWYKLQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGFib3J0aW5nLlxuIik7Ci0jaWZuZGVmIF9fQ1lHV0lOX18KLSAgICAgICAgZG8KLSAgICAgICAgICAgIGNoID0gX2dldGNoKCk7Ci0gICAgICAgIHdoaWxlIChjaCAhPSAncScgJiYgY2ggIT0gJ1EnICYmIGNoICE9IDB4MUIpOwotI2VuZGlmCi0gICAgICAgIGV4aXQoMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAiXG4gICBbY29uc29sZSB3aW5kb3c6ICBjbG9zaW5nIHRoaXMgd2luZG93IHdpbGwgdGVybWluYXRlICVzXVxuXG4iLAotICAgICAgICAgIFBST0dOQU1FKTsKLSNlbmRpZgotICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICB9Ci0KLQotICAgIC8qIHNldCB0aGUgdGl0bGUtYmFyIHN0cmluZywgYnV0IG1ha2Ugc3VyZSBidWZmZXIgZG9lc24ndCBvdmVyZmxvdyAqLwotCi0gICAgYWxlbiA9IHN0cmxlbihhcHBuYW1lKTsKLSAgICBmbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKLSAgICBpZiAoYWxlbiArIGZsZW4gKyAzID4gMTAyMykKLSAgICAgICAgc3ByaW50Zih0aXRsZWJhciwgIiVzOiAgLi4uJXMiLCBhcHBuYW1lLCBmaWxlbmFtZSsoYWxlbitmbGVuKzYtMTAyMykpOwotICAgIGVsc2UKLSAgICAgICAgc3ByaW50Zih0aXRsZWJhciwgIiVzOiAgJXMiLCBhcHBuYW1lLCBmaWxlbmFtZSk7Ci0KLQotICAgIC8qIHNldCBzb21lIGZpbmFsIHJwbmcyX2luZm8gdmFyaWFibGVzIGJlZm9yZSBlbnRlcmluZyBtYWluIGRhdGEgbG9vcCAqLwotCi0gICAgaWYgKGhhdmVfYmcpIHsKLSAgICAgICAgdW5zaWduZWQgciwgZywgYjsgICAvKiB0aGlzIGFwcHJvYWNoIHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7Ci0gICAgICAgIHJwbmcyX2luZm8uYmdfcmVkICAgPSAodWNoKXI7Ci0gICAgICAgIHJwbmcyX2luZm8uYmdfZ3JlZW4gPSAodWNoKWc7Ci0gICAgICAgIHJwbmcyX2luZm8uYmdfYmx1ZSAgPSAodWNoKWI7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJwbmcyX2luZm8ubmVlZF9iZ2NvbG9yID0gVFJVRTsKLQotICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrUHJlSW5pdDsKLSAgICBycG5nMl9pbmZvLm1haW5wcm9nX2luaXQgPSBycG5nMl93aW5faW5pdDsKLSAgICBycG5nMl9pbmZvLm1haW5wcm9nX2Rpc3BsYXlfcm93ID0gcnBuZzJfd2luX2Rpc3BsYXlfcm93OwotICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZmluaXNoX2Rpc3BsYXkgPSBycG5nMl93aW5fZmluaXNoX2Rpc3BsYXk7Ci0KLQotICAgIC8qIE9LLCB0aGlzIGlzIHRoZSBmdW4gcGFydDogIGNhbGwgcmVhZHBuZzJfZGVjb2RlX2RhdGEoKSBhdCB0aGUgc3RhcnQgb2YKLSAgICAgKiB0aGUgbG9vcCB0byBkZWFsIHdpdGggb3VyIGZpcnN0IGJ1ZmZlciBvZiBkYXRhIChyZWFkIGluIGFib3ZlIHRvIHZlcmlmeQotICAgICAqIHRoYXQgdGhlIGZpbGUgaXMgYSBQTkcgaW1hZ2UpLCB0aGVuIGxvb3AgdGhyb3VnaCB0aGUgZmlsZSBhbmQgY29udGludWUKLSAgICAgKiBjYWxsaW5nIHRoZSBzYW1lIHJvdXRpbmUgdG8gaGFuZGxlIGVhY2ggY2h1bmsgb2YgZGF0YS4gIEl0IGluIHR1cm4KLSAgICAgKiBwYXNzZXMgdGhlIGRhdGEgdG8gbGlicG5nLCB3aGljaCB3aWxsIGludm9rZSBvbmUgb3IgbW9yZSBvZiBvdXIgY2FsbC0KLSAgICAgKiBiYWNrcyBhcyBkZWNvZGVkIGRhdGEgYmVjb21lIGF2YWlsYWJsZS4gIFdlIG9wdGlvbmFsbHkgY2FsbCBTbGVlcCgpIGZvcgotICAgICAqIG9uZSBzZWNvbmQgcGVyIGl0ZXJhdGlvbiB0byBzaW11bGF0ZSBkb3dubG9hZGluZyB0aGUgaW1hZ2UgdmlhIGFuIGFuYWxvZwotICAgICAqIG1vZGVtLiAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpXG4iKSkKLSAgICAgICAgaWYgKHJlYWRwbmcyX2RlY29kZV9kYXRhKCZycG5nMl9pbmZvLCBpbmJ1ZiwgaW5jb3VudCkpCi0gICAgICAgICAgICArK2Vycm9yOwotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSB3aXRoIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQotCi0gICAgICAgIGlmIChlcnJvciB8fCBpbmNvdW50ICE9IElOQlVGU0laRSB8fCBycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7Ci0gICAgICAgICAgICBpZiAocnBuZzJfaW5mby5zdGF0ZSA9PSBrRG9uZSkgewotICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIGRlY29kaW5nIFBORyBpbWFnZVxuIikpCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGZlcnJvcihpbmZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgZXJyb3Igd2hpbGUgcmVhZGluZyBQTkcgaW1hZ2UgZmlsZVxuIik7Ci0gICAgICAgICAgICAgICAgZXhpdCgzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVvZihpbmZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBlbmQgb2YgZmlsZSByZWFjaGVkICIKLSAgICAgICAgICAgICAgICAgICIodW5leHBlY3RlZGx5KSB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDMpOwotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChlcnJvcikgKi8gewotICAgICAgICAgICAgICAgIC8qIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBiZWxvdyAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGltaW5nKQotICAgICAgICAgICAgU2xlZXAoMTAwMEwpOwotCi0gICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOwotICAgIH0KLQotCi0gICAgLyogY2xlYW4gdXAgUE5HIHN0dWZmIGFuZCByZXBvcnQgYW55IGRlY29kaW5nIGVycm9ycyAqLwotCi0gICAgZmNsb3NlKGluZmlsZSk7Ci0gICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfY2xlYW51cCgpXG4iKSkKLSAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGxpYnBuZyBlcnJvciB3aGlsZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpOwotICAgICAgICBleGl0KDMpOwotICAgIH0KLQotCi0gICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KLQotICAgIHdoaWxlIChHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApKSB7Ci0gICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7Ci0gICAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLSAgICB9Ci0KLQotICAgIC8qIHdlJ3JlIGRvbmU6ICBjbGVhbiB1cCBhbGwgaW1hZ2UgYW5kIFdpbmRvd3MgcmVzb3VyY2VzIGFuZCBnbyBhd2F5ICovCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCBycG5nMl93aW5fY2xlYW51cCgpXG4iKSkKLSAgICBycG5nMl93aW5fY2xlYW51cCgpOwotCi0gICAgcmV0dXJuIG1zZy53UGFyYW07Ci19Ci0KLQotCi0KLQotLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcmVhZHBuZzJfaW5mb19jYWxsYmFjaygpIGluIHJlYWRwbmcyLmMsIHdoaWNoCi0gKiBpbiB0dXJuIGlzIGNhbGxlZCBieSBsaWJwbmcgYWZ0ZXIgYWxsIG9mIHRoZSBwcmUtSURBVCBjaHVua3MgaGF2ZSBiZWVuCi0gKiByZWFkIGFuZCBwcm9jZXNzZWQtLWkuZS4sIHdlIG5vdyBoYXZlIGVub3VnaCBpbmZvIHRvIGZpbmlzaCBpbml0aWFsaXppbmcgKi8KLQotc3RhdGljIHZvaWQgcnBuZzJfd2luX2luaXQoKQotewotICAgIHVsZyBpOwotICAgIHVsZyByb3dieXRlcyA9IHJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3dpbl9pbml0KClcbiIpKQotICAgIFRyYWNlKChzdGRlcnIsICIgIHJvd2J5dGVzID0gJWRcbiIsIHJwbmcyX2luZm8ucm93Ynl0ZXMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgIHdpZHRoICA9ICVsZFxuIiwgcnBuZzJfaW5mby53aWR0aCkpCi0gICAgVHJhY2UoKHN0ZGVyciwgIiAgaGVpZ2h0ID0gJWxkXG4iLCBycG5nMl9pbmZvLmhlaWdodCkpCi0KLSAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOwotICAgIGlmICghcnBuZzJfaW5mby5pbWFnZV9kYXRhKSB7Ci0gICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSAodWNoICoqKW1hbGxvYyhycG5nMl9pbmZvLmhlaWdodCAqIHNpemVvZih1Y2ggKikpOwotICAgIGlmICghcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpIHsKLSAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOwotICAgICAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSBOVUxMOwotICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK2kpCi0gICAgICAgIHJwbmcyX2luZm8ucm93X3BvaW50ZXJzW2ldID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgaSpyb3dieXRlczsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBEbyB0aGUgYmFzaWMgV2luZG93cyBpbml0aWFsaXphdGlvbiBzdHVmZiwgbWFrZSB0aGUgd2luZG93LCBhbmQgZmlsbCBpdAotICAgIHdpdGggdGhlIHVzZXItc3BlY2lmaWVkLCBmaWxlLXNwZWNpZmllZCBvciBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAocnBuZzJfd2luX2NyZWF0ZV93aW5kb3coKSkgewotICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrV2luZG93SW5pdDsKLX0KLQotCi0KLQotCi1zdGF0aWMgaW50IHJwbmcyX3dpbl9jcmVhdGVfd2luZG93KCkKLXsKLSAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKLSAgICB1Y2ggKmRlc3Q7Ci0gICAgaW50IGV4dHJhX3dpZHRoLCBleHRyYV9oZWlnaHQ7Ci0gICAgdWxnIGksIGo7Ci0gICAgV05EQ0xBU1NFWCB3bmRjbGFzczsKLSAgICBSRUNUIHJlY3Q7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBkaXNwbGF5LXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGltYWdlIChyb3VuZCB1cAotICAgIHRvIG11bHRpcGxlIG9mIDQgZm9yIFdpbmRvd3MgRElCKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIHdpbWFnZV9yb3dieXRlcyA9ICgoMypycG5nMl9pbmZvLndpZHRoICsgM0wpID4+IDIpIDw8IDI7Ci0KLSAgICBpZiAoIShkaWIgPSAodWNoICopbWFsbG9jKHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW1hZ2Vfcm93Ynl0ZXMqcnBuZzJfaW5mby5oZWlnaHQpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiA0OyAgIC8qIGZhaWwgKi8KLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgSW5pdGlhbGl6ZSB0aGUgRElCLiAgTmVnYXRpdmUgaGVpZ2h0IG1lYW5zIHRvIHVzZSB0b3AtZG93biBCTVAgb3JkZXJpbmcKLSAgICAobXVzdCBiZSB1bmNvbXByZXNzZWQsIGJ1dCB0aGF0J3Mgd2hhdCB3ZSB3YW50KS4gIEJpdCBjb3VudCBvZiAxLCA0IG9yIDgKLSAgICBpbXBsaWVzIGEgY29sb3JtYXAgb2YgUkdCWCBxdWFkcywgYnV0IDI0LWJpdCBCTVBzIGp1c3QgdXNlIEIsRyxSIHZhbHVlcwotICAgIGRpcmVjdGx5ID0+IHdpbWFnZV9kYXRhIGJlZ2lucyBpbW1lZGlhdGVseSBhZnRlciBCTVAgaGVhZGVyLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgbWVtc2V0KGRpYiwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKLSAgICBibWloID0gKEJJVE1BUElORk9IRUFERVIgKilkaWI7Ci0gICAgYm1paC0+YmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIGJtaWgtPmJpV2lkdGggPSBycG5nMl9pbmZvLndpZHRoOwotICAgIGJtaWgtPmJpSGVpZ2h0ID0gLSgobG9uZylycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgYm1paC0+YmlQbGFuZXMgPSAxOwotICAgIGJtaWgtPmJpQml0Q291bnQgPSAyNDsKLSAgICBibWloLT5iaUNvbXByZXNzaW9uID0gMDsKLSAgICB3aW1hZ2VfZGF0YSA9IGRpYiArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaWxsIHdpbmRvdyB3aXRoIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciAoZGVmYXVsdCBpcyBibGFjayksIGJ1dAotICAgIGRlZmVyIGxvYWRpbmcgZmFrZWQgImJhY2tncm91bmQgaW1hZ2UiIHVudGlsIHdpbmRvdyBpcyBkaXNwbGF5ZWQgKG1heSBiZQotICAgIHNsb3cgdG8gY29tcHV0ZSkuICBEYXRhIGFyZSBpbiBCR1Igb3JkZXIuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoYmdfaW1hZ2UpIHsgICAvKiBqdXN0IGZpbGwgd2l0aCBibGFjayBmb3Igbm93ICovCi0gICAgICAgIG1lbXNldCh3aW1hZ2VfZGF0YSwgMCwgd2ltYWdlX3Jvd2J5dGVzKnJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGogPSAwOyAgaiA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytqKSB7Ci0gICAgICAgICAgICBkZXN0ID0gd2ltYWdlX2RhdGEgKyBqKndpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19ncmVlbjsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfcmVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNldCB0aGUgd2luZG93IHBhcmFtZXRlcnMuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBtZW1zZXQoJnduZGNsYXNzLCAwLCBzaXplb2Yod25kY2xhc3MpKTsKLQotICAgIHduZGNsYXNzLmNiU2l6ZSA9IHNpemVvZih3bmRjbGFzcyk7Ci0gICAgd25kY2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKLSAgICB3bmRjbGFzcy5scGZuV25kUHJvYyA9IHJwbmcyX3dpbl93bmRwcm9jOwotICAgIHduZGNsYXNzLmhJbnN0YW5jZSA9IGdsb2JhbF9oSW5zdDsKLSAgICB3bmRjbGFzcy5oSWNvbiA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7Ci0gICAgd25kY2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsKLSAgICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSClHZXRTdG9ja09iamVjdChES0dSQVlfQlJVU0gpOwotICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7Ci0gICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHByb2duYW1lOwotICAgIHduZGNsYXNzLmhJY29uU20gPSBMb2FkSWNvbihOVUxMLCBJRElfQVBQTElDQVRJT04pOwotCi0gICAgUmVnaXN0ZXJDbGFzc0V4KCZ3bmRjbGFzcyk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRmluYWxseSwgY3JlYXRlIHRoZSB3aW5kb3cuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBleHRyYV93aWR0aCAgPSAyKihHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWERMR0ZSQU1FKSk7Ci0gICAgZXh0cmFfaGVpZ2h0ID0gMiooR2V0U3lzdGVtTWV0cmljcyhTTV9DWUJPUkRFUikgKwotICAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lETEdGUkFNRSkpICsKLSAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTik7Ci0KLSAgICBnbG9iYWxfaHduZCA9IENyZWF0ZVdpbmRvdyhwcm9nbmFtZSwgdGl0bGViYXIsIFdTX09WRVJMQVBQRURXSU5ET1csCi0gICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCBycG5nMl9pbmZvLndpZHRoK2V4dHJhX3dpZHRoLAotICAgICAgcnBuZzJfaW5mby5oZWlnaHQrZXh0cmFfaGVpZ2h0LCBOVUxMLCBOVUxMLCBnbG9iYWxfaEluc3QsIE5VTEwpOwotCi0gICAgU2hvd1dpbmRvdyhnbG9iYWxfaHduZCwgZ2xvYmFsX3Nob3dtb2RlKTsKLSAgICBVcGRhdGVXaW5kb3coZ2xvYmFsX2h3bmQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIE5vdyBjb21wdXRlIHRoZSBiYWNrZ3JvdW5kIGltYWdlIGFuZCBkaXNwbGF5IGl0LiAgSWYgaXQgZmFpbHMgKG1lbW9yeQotICAgIGFsbG9jYXRpb24pLCByZXZlcnQgdG8gYSBwbGFpbiBiYWNrZ3JvdW5kIGNvbG9yLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGJnX2ltYWdlKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICptc2cgPSAiQ29tcHV0aW5nIGJhY2tncm91bmQgaW1hZ2UuLi4iOwotICAgICAgICBpbnQgeCwgeSwgbGVuID0gc3RybGVuKG1zZyk7Ci0gICAgICAgIEhEQyBoZGMgPSBHZXREQyhnbG9iYWxfaHduZCk7Ci0gICAgICAgIFRFWFRNRVRSSUMgdG07Ci0KLSAgICAgICAgR2V0VGV4dE1ldHJpY3MoaGRjLCAmdG0pOwotICAgICAgICB4ID0gKHJwbmcyX2luZm8ud2lkdGggLSBsZW4qdG0udG1BdmVDaGFyV2lkdGgpLzI7Ci0gICAgICAgIHkgPSAocnBuZzJfaW5mby5oZWlnaHQgLSB0bS50bUhlaWdodCkvMjsKLSAgICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOwotICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBHZXRTeXNDb2xvcihDT0xPUl9ISUdITElHSFRURVhUKSk7Ci0gICAgICAgIC8qIHRoaXMgY2FuIHN0aWxsIGJlZ2luIG91dCBvZiBib3VuZHMgZXZlbiBpZiB4IGlzIHBvc2l0aXZlICg/Pz8pOiAqLwotICAgICAgICBUZXh0T3V0KGhkYywgKCh4IDwgMCk/IDAgOiB4KSwgKCh5IDwgMCk/IDAgOiB5KSwgbXNnLCBsZW4pOwotICAgICAgICBSZWxlYXNlREMoZ2xvYmFsX2h3bmQsIGhkYyk7Ci0KLSAgICAgICAgcnBuZzJfd2luX2xvYWRfYmdfaW1hZ2UoKTsgICAvKiByZXNldHMgYmdfaW1hZ2UgaWYgZmFpbHMgKi8KLSAgICB9Ci0KLSAgICBpZiAoIWJnX2ltYWdlKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7ICBqIDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK2opIHsKLSAgICAgICAgICAgIGRlc3QgPSB3aW1hZ2VfZGF0YSArIGoqd2ltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2JsdWU7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiZ19yZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZWN0LmxlZnQgPSAwTDsKLSAgICByZWN0LnRvcCA9IDBMOwotICAgIHJlY3QucmlnaHQgPSAoTE9ORylycG5nMl9pbmZvLndpZHRoOyAgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgIHJlY3QuYm90dG9tID0gKExPTkcpcnBuZzJfaW5mby5oZWlnaHQ7ICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgIEludmFsaWRhdGVSZWN0KGdsb2JhbF9od25kLCAmcmVjdCwgRkFMU0UpOwotICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7ICAgICAgICAgICAgICAgICAvKiBzaW1pbGFyIHRvIFhGbHVzaCgpICovCi0KLSAgICByZXR1cm4gMDsKLQotfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfd2luX2NyZWF0ZV93aW5kb3coKSAqLwotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZzJfd2luX2xvYWRfYmdfaW1hZ2UoKQotewotICAgIHVjaCAqc3JjLCAqZGVzdDsKLSAgICB1Y2ggcjEsIHIyLCBnMSwgZzIsIGIxLCBiMjsKLSAgICB1Y2ggcjFfaW52LCByMl9pbnYsIGcxX2ludiwgZzJfaW52LCBiMV9pbnYsIGIyX2ludjsKLSAgICBpbnQgaywgaG1heCwgbWF4OwotICAgIGludCB4aWR4LCB5aWR4LCB5aWR4X21heCA9IChiZ3NjYWxlLTEpOwotICAgIGludCBldmVuX29kZF92ZXJ0LCBldmVuX29kZF9ob3JpeiwgZXZlbl9vZGQ7Ci0gICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7Ci0gICAgaW50IGludmVydF9jb2x1bW47Ci0gICAgdWxnIGksIHJvdzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBbGxvY2F0ZSBidWZmZXIgZm9yIGZha2UgYmFja2dyb3VuZCBpbWFnZSB0byBiZSB1c2VkIHdpdGggdHJhbnNwYXJlbnQKLSAgICBpbWFnZXM7IGlmIHRoaXMgZmFpbHMsIHJldmVydCB0byBwbGFpbiBiYWNrZ3JvdW5kIGNvbG9yLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgYmdfcm93Ynl0ZXMgPSAzICogcnBuZzJfaW5mby53aWR0aDsKLSAgICBiZ19kYXRhID0gKHVjaCAqKW1hbGxvYyhiZ19yb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICBpZiAoIWJnX2RhdGEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJhY2tncm91bmQgaW1hZ2VcbiIpOwotICAgICAgICBiZ19pbWFnZSA9IDA7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBWZXJ0aWNhbCBncmFkaWVudHMgKHJhbXBzKSBpbiBOeE4gc3F1YXJlcywgYWx0ZXJuYXRpbmcgZGlyZWN0aW9uIGFuZAotICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgewotICAgICAgICB1Y2ggcjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5yOwotICAgICAgICB1Y2ggZzFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5nOwotICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOwotICAgICAgICB1Y2ggcjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5yOwotICAgICAgICB1Y2ggZzJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5nOwotICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOwotICAgICAgICBpbnQgcjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yIC0gcjFfbWluOwotICAgICAgICBpbnQgZzFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nIC0gZzFfbWluOwotICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOwotICAgICAgICBpbnQgcjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yIC0gcjJfbWluOwotICAgICAgICBpbnQgZzJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nIC0gZzJfbWluOwotICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSByb3cgJSBiZ3NjYWxlOwotICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChyb3cgLyBiZ3NjYWxlKSAmIDE7Ci0KLSAgICAgICAgICAgIHIxID0gcjFfbWluICsgKHIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzEgPSBnMV9taW4gKyAoZzFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMSA9IGIxX21pbiArIChiMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIHIxX2ludiA9IHIxX21pbiArIChyMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzFfaW52ID0gZzFfbWluICsgKGcxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMV9pbnYgPSBiMV9taW4gKyAoYjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLQotICAgICAgICAgICAgcjIgPSByMl9taW4gKyAocjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMiA9IGcyX21pbiArIChnMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIyID0gYjJfbWluICsgKGIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgcjJfaW52ID0gcjJfbWluICsgKHIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBnMl9pbnYgPSBnMl9taW4gKyAoZzJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGIyX2ludiA9IGIyX21pbiArIChiMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotCi0gICAgICAgICAgICBkZXN0ID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGkgLyBiZ3NjYWxlKSAmIDE7Ci0gICAgICAgICAgICAgICAgZXZlbl9vZGQgPSBldmVuX29kZF92ZXJ0IF4gZXZlbl9vZGRfaG9yaXo7Ci0gICAgICAgICAgICAgICAgaW52ZXJ0X2NvbHVtbiA9Ci0gICAgICAgICAgICAgICAgICAoZXZlbl9vZGRfaG9yaXogJiYgKGJnW3BhdF0udHlwZSAmIDB4MTApKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbl9vZGQgPT0gMCkgeyAgICAgICAgIC8qIGdyYWRpZW50ICMxICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoaW52ZXJ0X2NvbHVtbiAmJiBpbnZlcnRfZ3JhZGllbnQyKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnZlcnRfY29sdW1uICYmICFpbnZlcnRfZ3JhZGllbnQyKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyOyAgICAgICAgLyogbm90IGludmVydGVkIG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzI7ICAgICAgICAvKiAgZG91Ymx5IGludmVydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjJfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAgLyogc2luZ2x5IGludmVydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjJfaW52OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU29mdCBncmFkaWVudC1kaWFtb25kcyB3aXRoIHNjYWxlID0gYmdzY2FsZS4gIENvZGUgY29udHJpYnV0ZWQgYnkgQWRhbQotICAgIE0uIENvc3RlbGxvLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgewotCi0gICAgICAgIGhtYXggPSAoYmdzY2FsZS0xKS8yOyAgIC8qIGhhbGYgdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLwotICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0KLSAgICAgICAgcjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0ucjsKLSAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKLSAgICAgICAgYjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uYjsKLSAgICAgICAgcjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0ucjsKLSAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKLSAgICAgICAgYjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uYjsKLQotICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICB5aWR4ID0gcm93ICUgYmdzY2FsZTsKLSAgICAgICAgICAgIGlmICh5aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKLSAgICAgICAgICAgIGRlc3QgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgeGlkeCA9IGkgJSBiZ3NjYWxlOwotICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICAgICAgeGlkeCA9IGJnc2NhbGUtMSAtIHhpZHg7Ci0gICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypnMSArIChtYXgtaykqZzIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUmFkaWFsICJzdGFyYnVyc3QiIHdpdGggYXppbXV0aGFsIHNpbnVzb2lkczsgW2V2ZW50dWFsbHkgbnVtYmVyIG9mIHNpbnUtCi0gICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KLSAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKLSAgICAgICAgdWNoIGNoOwotICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7Ci0gICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7Ci0gICAgICAgIGRvdWJsZSBhbmdsZT0wLjAsIGFvZmZzZXQ9MC4wLCBtYXhEaXN0LCBkaXN0OwotICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBjb21wdXRpbmcgcmFkaWFsIGJhY2tncm91bmQuLi4iLAotICAgICAgICAgIFBST0dOQU1FKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICAgICAgaGggPSBycG5nMl9pbmZvLmhlaWdodCAvIDI7Ci0gICAgICAgIGh3ID0gcnBuZzJfaW5mby53aWR0aCAvIDI7Ci0KLSAgICAgICAgLyogdmFyaWFibGVzIGZvciByYWRpYWwgd2F2ZXM6Ci0gICAgICAgICAqICAgYW9mZnNldDogIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSBodWUgW0NVUlJFTlRMWSBOT1QgVVNFRF0KLSAgICAgICAgICogICBmcmVxOiAgbnVtYmVyIG9mIGNvbG9yIGJlYW1zIG9yaWdpbmF0aW5nIGZyb20gdGhlIGNlbnRlcgotICAgICAgICAgKiAgIGdyYXlzcG90OiAgc2l6ZSBvZiB0aGUgZ3JheWluZyBjZW50ZXIgYXJlYSAoYW50aS1hbGlhcykKLSAgICAgICAgICogICByb3RhdGU6ICByb3RhdGlvbiBvZiB0aGUgYmVhbXMgYXMgYSBmdW5jdGlvbiBvZiByYWRpdXMKLSAgICAgICAgICogICBzYXR1cmF0ZTogIHNhdHVyYXRpb24gb2YgYmVhbXMnIHNoYXBlIGF6aW11dGhhbGx5Ci0gICAgICAgICAqLwotICAgICAgICBhbmdsZSA9IENMSVAoYW5nbGUsIDAuMCwgMzYwLjApOwotICAgICAgICBncmF5c3BvdCA9IENMSVAoYmdbcGF0XS5iZ19ncmF5LCAxLCAoaGggKyBodykpOwotICAgICAgICBmcmVxID0gTUFYKChkb3VibGUpYmdbcGF0XS5iZ19mcmVxLCAwLjApOwotICAgICAgICBzYXR1cmF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19ic2F0ICogMC4xOwotICAgICAgICByb3RhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnJvdCAqIDAuMTsKLSAgICAgICAgZ3JheSA9IDAuMDsKLSAgICAgICAgaW50ZW5zaXR5ID0gMC4wOwotICAgICAgICBtYXhEaXN0ID0gKGRvdWJsZSkoKGh3Kmh3KSArIChoaCpoaCkpOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHkgPSByb3cgLSBoaDsKLSAgICAgICAgICAgIGRlc3QgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgeCA9IGkgLSBodzsKLSAgICAgICAgICAgICAgICBhbmdsZSA9ICh4ID09IDApPyBQSV8yIDogYXRhbigoZG91YmxlKXkgLyAoZG91YmxlKXgpOwotICAgICAgICAgICAgICAgIGdyYXkgPSAoZG91YmxlKU1BWChBQlMoeSksIEFCUyh4KSkgLyBncmF5c3BvdDsKLSAgICAgICAgICAgICAgICBncmF5ID0gTUlOKDEuMCwgZ3JheSk7Ci0gICAgICAgICAgICAgICAgZGlzdCA9IChkb3VibGUpKCh4KngpICsgKHkqeSkpIC8gbWF4RGlzdDsKLSAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSBjb3MoKGFuZ2xlKyhyb3RhdGUqZGlzdCpQSSkpICogZnJlcSkgKgotICAgICAgICAgICAgICAgICAgZ3JheSAqIHNhdHVyYXRlOwotICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IChNQVgoTUlOKGludGVuc2l0eSwxLjApLC0xLjApICsgMS4wKSAqIDAuNTsKLSAgICAgICAgICAgICAgICBodWUgPSAoYW5nbGUgKyBQSSkgKiBJTlZfUElfMzYwICsgYW9mZnNldDsKLSAgICAgICAgICAgICAgICBzID0gZ3JheSAqICgoZG91YmxlKShBQlMoeCkrQUJTKHkpKSAvIChkb3VibGUpKGh3ICsgaGgpKTsKLSAgICAgICAgICAgICAgICBzID0gTUlOKE1BWChzLDAuMCksIDEuMCk7Ci0gICAgICAgICAgICAgICAgdiA9IE1JTihNQVgoaW50ZW5zaXR5LDAuMCksIDEuMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocyA9PSAwLjApIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSAodWNoKSh2ICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoaHVlIDwgMC4wKSB8fCAoaHVlID49IDM2MC4wKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGh1ZSAtPSAoKChpbnQpKGh1ZSAvIDM2MC4wKSkgKiAzNjAuMCk7Ci0gICAgICAgICAgICAgICAgICAgIGh1ZSAvPSA2MC4wOwotICAgICAgICAgICAgICAgICAgICBpaSA9IChpbnQpaHVlOwotICAgICAgICAgICAgICAgICAgICBmID0gaHVlIC0gKGRvdWJsZSlpaTsKLSAgICAgICAgICAgICAgICAgICAgcCA9ICgxLjAgLSBzKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIHEgPSAoMS4wIC0gKHMgKiBmKSkgKiB2OwotICAgICAgICAgICAgICAgICAgICB0ID0gKDEuMCAtIChzICogKDEuMCAtIGYpKSkgKiB2OwotICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpaSA9PSAwKSB7IHJlZCA9IHY7IGdyZWVuID0gdDsgYmx1ZSA9IHA7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMSkgeyByZWQgPSBxOyBncmVlbiA9IHY7IGJsdWUgPSBwOyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDIpIHsgcmVkID0gcDsgZ3JlZW4gPSB2OyBibHVlID0gdDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAzKSB7IHJlZCA9IHA7IGdyZWVuID0gcTsgYmx1ZSA9IHY7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNCkgeyByZWQgPSB0OyBncmVlbiA9IHA7IGJsdWUgPSB2OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDUpIHsgcmVkID0gdjsgZ3JlZW4gPSBwOyBibHVlID0gcTsgfQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkocmVkICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoZ3JlZW4gKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShibHVlICogMjU1LjApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvbmUuXG4iKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEJsYXN0IGJhY2tncm91bmQgaW1hZ2UgdG8gZGlzcGxheSBidWZmZXIgYmVmb3JlIGJlZ2lubmluZyBQTkcgZGVjb2RlOwotICAgIGNhbGxpbmcgZnVuY3Rpb24gd2lsbCBoYW5kbGUgaW52YWxpZGF0aW9uIGFuZCBVcGRhdGVXaW5kb3coKSBjYWxsLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICBzcmMgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICBkZXN0ID0gd2ltYWdlX2RhdGEgKyByb3cqd2ltYWdlX3Jvd2J5dGVzOwotICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgIHIxID0gKnNyYysrOwotICAgICAgICAgICAgZzEgPSAqc3JjKys7Ci0gICAgICAgICAgICBiMSA9ICpzcmMrKzsKLSAgICAgICAgICAgICpkZXN0KysgPSBiMTsKLSAgICAgICAgICAgICpkZXN0KysgPSBnMTsgICAvKiBub3RlIHJldmVyc2Ugb3JkZXIgKi8KLSAgICAgICAgICAgICpkZXN0KysgPSByMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl93aW5fbG9hZF9iZ19pbWFnZSgpICovCi0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfd2luX2Rpc3BsYXlfcm93KHVsZyByb3cpCi17Ci0gICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7Ci0gICAgdWNoIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKLSAgICB1Y2ggYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7Ci0gICAgdWNoICpzcmMsICpzcmMyPU5VTEwsICpkZXN0OwotICAgIHVjaCByLCBnLCBiLCBhOwotICAgIHVsZyBpOwotICAgIHN0YXRpYyBpbnQgcm93cz0wOwotICAgIHN0YXRpYyB1bGcgZmlyc3Ryb3c7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcm93cyBhbmQgZmlyc3Ryb3cgc2ltcGx5IHRyYWNrIGhvdyBtYW55IHJvd3MgKGFuZCB3aGljaCBvbmVzKSBoYXZlIG5vdAotICAgIHlldCBiZWVuIGRpc3BsYXllZDsgYWx0ZXJuYXRpdmVseSwgd2UgY291bGQgY2FsbCBJbnZhbGlkYXRlUmVjdCgpIGZvcgotICAgIGV2ZXJ5IHJvdyBhbmQgbm90IGJvdGhlciB3aXRoIHRoZSByZWNvcmRzLWtlZXBpbmcuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3dpbl9kaXNwbGF5X3JvdygpXG4iKSkKLQotICAgIGlmIChyb3dzID09IDApCi0gICAgICAgIGZpcnN0cm93ID0gcm93OyAgIC8qIGZpcnN0IHJvdyBub3QgeWV0IGRpc3BsYXllZCAqLwotCi0gICAgKytyb3dzOyAgIC8qIGNvdW50IG9mIHJvd3MgcmVjZWl2ZWQgYnV0IG5vdCB5ZXQgZGlzcGxheWVkICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQXNpZGUgZnJvbSB0aGUgdXNlIG9mIHRoZSBycG5nMl9pbmZvIHN0cnVjdCBhbmQgdGhlIGxhY2sgb2YgYW4gb3V0ZXIKLSAgICBsb29wIChvdmVyIHJvd3MpLCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIHRvIHJwbmdfd2luX2Rpc3BsYXlfaW1hZ2UoKQotICAgIGluIHRoZSBub24tcHJvZ3Jlc3NpdmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIHNyYyA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIHJvdypycG5nMl9pbmZvLnJvd2J5dGVzOwotICAgIGlmIChiZ19pbWFnZSkKLSAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgZGVzdCA9IHdpbWFnZV9kYXRhICsgcm93KndpbWFnZV9yb3dieXRlczsKLQotICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKLSAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgZyA9ICpzcmMrKzsKLSAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAqZGVzdCsrID0gYjsKLSAgICAgICAgICAgICpkZXN0KysgPSBnOyAgIC8qIG5vdGUgcmV2ZXJzZSBvcmRlciAqLwotICAgICAgICAgICAgKmRlc3QrKyA9IHI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewotICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwotICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0KysgPSBiOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSBnOwotICAgICAgICAgICAgICAgICpkZXN0KysgPSByOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gYmdfZ3JlZW47Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IGJnX3JlZDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoY29waWVkIGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlCi0gICAgICAgICAgICAgICAgICogZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlCi0gICAgICAgICAgICAgICAgICogcmVzdWx0IGludG8gdGhlIGZpcnN0IGFyZ3VtZW50OyB0aGVyZSBhcmUgbm8KLSAgICAgICAgICAgICAgICAgKiBzaWRlIGVmZmVjdHMgd2l0aCB0aGUgZmlyc3QgYXJndW1lbnQgKi8KLSAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoKmRlc3QrKywgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKCpkZXN0KyssIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoKmRlc3QrKywgciwgYSwgYmdfcmVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBEaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IHJvd3Mgb3Igd2hlbiBvbiBsYXN0IHJvdy4gIChSZWdpb24gbWF5IGluY2x1ZGUKLSAgICBwcmV2aW91c2x5IGRpc3BsYXllZCBsaW5lcyBkdWUgdG8gaW50ZXJsYWNpbmctLWkuZS4sIG5vdCBjb250aWd1b3VzLikKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmICgocm93cyAmIDB4ZikgPT0gMCB8fCByb3cgPT0gcnBuZzJfaW5mby5oZWlnaHQtMSkgewotICAgICAgICBSRUNUIHJlY3Q7Ci0KLSAgICAgICAgcmVjdC5sZWZ0ID0gMEw7Ci0gICAgICAgIHJlY3QudG9wID0gKExPTkcpZmlyc3Ryb3c7Ci0gICAgICAgIHJlY3QucmlnaHQgPSAoTE9ORylycG5nMl9pbmZvLndpZHRoOyAgICAgICAvKiBwb3NzaWJseSBvZmYgYnkgb25lPyAqLwotICAgICAgICByZWN0LmJvdHRvbSA9IChMT05HKXJvdyArIDFMOyAgICAgICAgICAgICAgLyogcG9zc2libHkgb2ZmIGJ5IG9uZT8gKi8KLSAgICAgICAgSW52YWxpZGF0ZVJlY3QoZ2xvYmFsX2h3bmQsICZyZWN0LCBGQUxTRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhnbG9iYWxfaHduZCk7ICAgICAgICAgICAgICAgICAvKiBzaW1pbGFyIHRvIFhGbHVzaCgpICovCi0gICAgICAgIHJvd3MgPSAwOwotICAgIH0KLQotfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfd2luX2Rpc3BsYXlfcm93KCkgKi8KLQotCi0KLQotCi1zdGF0aWMgdm9pZCBycG5nMl93aW5fZmluaXNoX2Rpc3BsYXkoKQotewotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfd2luX2ZpbmlzaF9kaXNwbGF5KClcbiIpKQotCi0gICAgLyogbGFzdCByb3cgaGFzIGFscmVhZHkgYmVlbiBkaXNwbGF5ZWQgYnkgcnBuZzJfd2luX2Rpc3BsYXlfcm93KCksIHNvCi0gICAgICogd2UgaGF2ZSBub3RoaW5nIHRvIGRvIGhlcmUgZXhjZXB0IHNldCBhIGZsYWcgYW5kIGxldCB0aGUgdXNlciBrbm93Ci0gICAgICogdGhhdCB0aGUgaW1hZ2UgaXMgZG9uZSAqLwotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtEb25lOwotICAgIHByaW50ZigKLSNpZm5kZWYgX19DWUdXSU5fXwotICAgICAgIkRvbmUuICBQcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3cpIHRvIHF1aXQuXG4iCi0jZWxzZQotICAgICAgIkRvbmUuICBQcmVzcyBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdykgdG8gcXVpdC5cbiIKLSNlbmRpZgotICAgICk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfd2luX2NsZWFudXAoKQotewotICAgIGlmIChiZ19pbWFnZSAmJiBiZ19kYXRhKSB7Ci0gICAgICAgIGZyZWUoYmdfZGF0YSk7Ci0gICAgICAgIGJnX2RhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOwotICAgICAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChycG5nMl9pbmZvLnJvd19wb2ludGVycykgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKTsKLSAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChkaWIpIHsKLSAgICAgICAgZnJlZShkaWIpOwotICAgICAgICBkaWIgPSBOVUxMOwotICAgIH0KLX0KLQotCi0KLQotCi1MUkVTVUxUIENBTExCQUNLIHJwbmcyX3dpbl93bmRwcm9jKEhXTkQgaHduZCwgVUlOVCBpTXNnLCBXUEFSQU0gd1AsIExQQVJBTSBsUCkKLXsKLSAgICBIREMgICAgICAgICBoZGM7Ci0gICAgUEFJTlRTVFJVQ1QgcHM7Ci0gICAgaW50IHJjOwotCi0gICAgc3dpdGNoIChpTXNnKSB7Ci0gICAgICAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgICAgICAgLyogb25lLXRpbWUgcHJvY2Vzc2luZyBoZXJlLCBpZiBhbnkgKi8KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgV01fUEFJTlQ6Ci0gICAgICAgICAgICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7Ci0gICAgICAgICAgICByYyA9IFN0cmV0Y2hESUJpdHMoaGRjLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ltYWdlX2RhdGEsIChCSVRNQVBJTkZPICopYm1paCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNSQ0NPUFkpOwotICAgICAgICAgICAgRW5kUGFpbnQoaHduZCwgJnBzKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8qIHdhaXQgZm9yIHRoZSB1c2VyIHRvIHRlbGwgdXMgd2hlbiB0byBxdWl0ICovCi0gICAgICAgIGNhc2UgV01fQ0hBUjoKLSAgICAgICAgICAgIHN3aXRjaCAod1ApIHsgICAgICAgLyogb25seSBuZWVkIG9uZSwgc28gaWdub3JlIHJlcGVhdCBjb3VudCAqLwotICAgICAgICAgICAgICAgIGNhc2UgJ3EnOgotICAgICAgICAgICAgICAgIGNhc2UgJ1EnOgotICAgICAgICAgICAgICAgIGNhc2UgMHgxQjogICAgICAvKiBFc2Mga2V5ICovCi0gICAgICAgICAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgV01fTEJVVFRPTkRPV046ICAgIC8qIGFub3RoZXIgd2F5IG9mIHF1aXR0aW5nICovCi0gICAgICAgIGNhc2UgV01fREVTVFJPWToKLSAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIGlNc2csIHdQLCBsUCk7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL2dyZWdib29rL3JwbmcyLXguYyBiL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzhkZGViLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svcnBuZzIteC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBycG5nMiAtIHByb2dyZXNzaXZlLW1vZGVsIFBORyBkaXNwbGF5IHByb2dyYW0gICAgICAgICAgICAgICAgICBycG5nMi14LmMKLQotICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5LCBhcyBpZiBpdCB3ZXJlCi0gICBhIHdlYiBicm93c2VyICh0aG91Z2ggdGhlIGZyb250IGVuZCBpcyBvbmx5IHNldCB1cCB0byByZWFkIGZyb20gZmlsZXMpLgotICAgSXQgc3VwcG9ydHMgZ2FtbWEgY29ycmVjdGlvbiwgdXNlci1zcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvcnMsIGFuZCB1c2VyLQotICAgc3BlY2lmaWVkIGJhY2tncm91bmQgcGF0dGVybnMgKGZvciB0cmFuc3BhcmVudCBpbWFnZXMpLiAgVGhpcyB2ZXJzaW9uIGlzCi0gICBmb3IgdGhlIFggV2luZG93IFN5c3RlbSAodGVzdGVkIGJ5IHRoZSBhdXRob3IgdW5kZXIgVW5peCBhbmQgYnkgTWFydGluCi0gICBaaW5zZXIgdW5kZXIgT3BlblZNUzsgbWF5IHdvcmsgdW5kZXIgT1MvMiB3aXRoIGEgbGl0dGxlIHR3ZWFraW5nKS4KLQotICAgVGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8gYW5kIFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiBmb3IgdGhlICJkaWFtb25kIgotICAgYW5kICJyYWRpYWwgd2F2ZXMiIHBhdHRlcm5zLCByZXNwZWN0aXZlbHkuCi0KLSAgIHRvIGRvIChzb21lZGF5LCBtYXliZSk6Ci0gICAgLSBmaXggZXhwb3NlL3JlZHJhdyBjb2RlOiAgZG9uJ3QgZHJhdyBlbnRpcmUgcm93IGlmIG9ubHkgcGFydCBleHBvc2VkCi0gICAgLSA4LWJpdCAoY29sb3JtYXBwZWQpIFggc3VwcG9ydAotICAgIC0gZmluaXNoIHJlc2l6YWJsZSBjaGVja2VyYm9hcmQtZ3JhZGllbnQgKHNpemVzIDQtMTI4PykKLSAgICAtIHVzZSAlLjEwMjNzIHRvIHNpbXBsaWZ5IHRydW5jYXRpb24gb2YgdGl0bGUtYmFyIHN0cmluZz8KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ2hhbmdlbG9nOgotICAgIC0gMS4wMTogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKLSAgICAtIDEuMDI6ICBtb2RpZmllZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zOyBmaXhlZCBjaGFyL3VjaGFyIG1pc21hdGNoCi0gICAgLSAxLjEwOiAgYWRkZWQgc3VwcG9ydCBmb3Igbm9uLWRlZmF1bHQgdmlzdWFsczsgZml4ZWQgWCBwaXhlbC1jb252ZXJzaW9uCi0gICAgLSAxLjExOiAgYWRkZWQgLXVzbGVlcCBvcHRpb24gZm9yIGRlbW9zOyBmaXhlZCBjb21tYW5kLWxpbmUgcGFyc2luZyBidWcKLSAgICAtIDEuMTI6ICBhZGRlZCAtcGF1c2Ugb3B0aW9uIGZvciBkZW1vcyBhbmQgdGVzdGluZwotICAgIC0gMS4yMDogIGFkZGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgbmV3IC1tbXgqIG9wdGlvbnMKLSAgICAtIDEuMjE6ICBmaXhlZCBzb21lIHNtYWxsIFggbWVtb3J5IGxlYWtzICh0aGFua3MgdG8gRnJhbudvaXMgUGV0aXRqZWFuKQotICAgIC0gMS4yMjogIGZpeGVkIFhGcmVlR0MoKSBjcmFzaCBidWcgKHRoYW5rcyB0byBQYXRyaWNrIFdlbGNoZSkKLSAgICAtIDEuMjM6ICBhZGRlZCAtYmdwYXQgMCBtb2RlIChzdGQgd2hpdGUvZ3JheSBjaGVja2VyYm9hcmQsIDh4OCBzcXVhcmVzKQotICAgIC0gMS4zMDogIGFkZGVkIC1sb29wIG9wdGlvbiBmb3IgLWJncGF0IChpZmRlZiBGRUFUVVJFX0xPT1ApOyBmaXhlZCBicHAgPQotICAgICAgICAgICAgICAyNDsgYWRkZWQgc3VwcG9ydCBmb3IgWCByZXNvdXJjZXMgKHRoYW5rcyB0byBHZXJoYXJkIE5pa2xhc2NoKQotICAgIC0gMS4zMTogIGFkZGVkIGNvZGUgdG8gc2tpcCB1bnVzZWQgY2h1bmtzICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQotICAgIC0gMS4zMjogIGFkZGVkIEFNRDY0L0VNNjRUIHN1cHBvcnQgKF9feDg2XzY0X18pOyBhZGRlZCBiYXNpYyBleHBvc2UvcmVkcmF3Ci0gICAgICAgICAgICAgIGhhbmRsaW5nCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLSAgICAtIDIuMDE6ICBmaXhlZCA2NC1iaXQgdHlwbyBpbiByZWFkcG5nMi5jOyBmaXhlZCAtcGF1c2UgdXNhZ2UgZGVzY3JpcHRpb24KLSAgICAtIDIuMDI6ICBmaXhlZCBpbXByb3BlciBkaXNwbGF5IG9mIHVzYWdlIHNjcmVlbiBvbiBQTkcgZXJyb3Iocyk7IGZpeGVkCi0gICAgICAgICAgICAgIHVuZXhwZWN0ZWQtRU9GIGFuZCBmaWxlLXJlYWQtZXJyb3IgY2FzZXM7IGZpeGVkIFRyYWNlKCkgY3V0LWFuZC0KLSAgICAgICAgICAgICAgcGFzdGUgYnVncwotICAgIC0gMi4wMzogIGRlbGV0ZWQgcnVudGltZSBNTVgtZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBvYnNvbGV0ZSAtbW14KiBvcHRpb25zCi0gICAgLSAyLjA0OiAgQWRkZWQgInZvaWQoZm9vKTsiIHN0YXRlbWVudHMgdG8gcXVpZXQgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3MKLSAgICAgICAgICAgICBhYm91dCB1bnVzZWQgdmFyaWFibGVzIChHUi1QKQotICAgIC0gMi4wNTogIFVzZSBuYW5vc2xlZXAoKSBpbnN0ZWFkIG9mIHVzbGVlcCgpLCB3aGljaCBpcyBkZXByZWNhdGVkIChHUi1QKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDEwLCAyMDE0LTIwMTUgR3JlZyBSb2Vsb2ZzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLAotICAgICAgZXhwcmVzcyBvciBpbXBsaWVkLiAgSW4gbm8gZXZlbnQgc2hhbGwgdGhlIGF1dGhvciBvciBjb250cmlidXRvcnMKLSAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCi0gICAgICB0aGlzIHNvZnR3YXJlLgotCi0gICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCi0gICAgICByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIG9uZSBvZiB0aGUKLSAgICAgIGZvbGxvd2luZyB0d28gbGljZW5zZXMgKGF0IHlvdXIgb3B0aW9uKToKLQotCi0gICAgICBMSUNFTlNFIDEgKCJCU0QtbGlrZSB3aXRoIGFkdmVydGlzaW5nIGNsYXVzZSIpOgotCi0gICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgICAgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUKLSAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgotICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGluIHRoZSBkb2N1bWVudGEtCi0gICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gICAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLQotICAgICAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBHcmVnIFJvZWxvZnMKLSAgICAgICAgICAgIGFuZCBjb250cmlidXRvcnMgZm9yIHRoZSBib29rLCAiUE5HOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwiCi0gICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCi0KLQotICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICAgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgInJwbmcyLXgiCi0jZGVmaW5lIExPTkdOQU1FICAiUHJvZ3Jlc3NpdmUgUE5HIFZpZXdlciBmb3IgWCIKLSNkZWZpbmUgVkVSU0lPTiAgICIyLjA0IG9mIDE1IEp1bmUgMjAxNCIKLSNkZWZpbmUgUkVTTkFNRSAgICJycG5nMiIgICAgICAgLyogb3VyIFggcmVzb3VyY2UgYXBwbGljYXRpb24gbmFtZSAqLwotI2RlZmluZSBSRVNDTEFTUyAgIlJwbmciICAgICAgIC8qIG91ciBYIHJlc291cmNlIGNsYXNzIG5hbWUgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgLyogZm9yIGptcGJ1ZiBkZWNsYXJhdGlvbiBpbiByZWFkcG5nMi5oICovCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAvKiBvbmx5IGZvciBQdmRNIGJhY2tncm91bmQgY29kZSAqLwotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSA8WDExL1h1dGlsLmg+Ci0jaW5jbHVkZSA8WDExL1hvcy5oPgotI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4gICAvKiBkZWZpbmVzIFhLXyogbWFjcm9zICovCi0KLSNpZiBfUE9TSVhfQ19TT1VSQ0UgPj0gMTk5MzA5TCAvKiBoYXZlIG5hbm9zbGVlcCgpICovCi0jIHVuZGVmIHVzbGVlcAotIyBkZWZpbmUgdXNsZWVwKHVzZWMpIHsgICAgICAgIFwKLSAgIHN0cnVjdCB0aW1lc3BlYyB0czsgICAgICAgICBcCi0gICB0cy50dl9zZWMgPSAwOyAgICAgICAgICAgICAgXAotICAgdHMudHZfbnNlYyA9ICh1c2VjKSAqIDEwMDA7IFwKLSAgIG5hbm9zbGVlcCgmdHMsIE5VTEwpOyB9Ci0jICBlbmRpZgotCi0jaWZuZGVmIHVzbGVlcCAvKiBoYXZlIG5laXRoZXIgbmFub3NsZWVwKCkgbm9yIHVzbGVlcCgpICovCi0jICBkZWZpbmUgdXNsZWVwKHgpIHNsZWVwKCgoeCkrNDk5OTk5KS8xMDAwMDAwKQotI2VuZGlmCi0KLSNpZmRlZiBWTVMKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLS8qIGFsbCBmb3IgUHZkTSBiYWNrZ3JvdW5kIGNvZGU6ICovCi0jaWZuZGVmIFBJCi0jICBkZWZpbmUgUEkgICAgICAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzgKLSNlbmRpZgotI2RlZmluZSBQSV8yICAgICAgICAgICAgIChQSSowLjUpCi0jZGVmaW5lIElOVl9QSV8zNjAgICAgICAgKDM2MC4wIC8gUEkpCi0jZGVmaW5lIE1BWChhLGIpICAgICAgICAgKGE+Yj9hOmIpCi0jZGVmaW5lIE1JTihhLGIpICAgICAgICAgKGE8Yj9hOmIpCi0jZGVmaW5lIENMSVAoYSxtaW4sbWF4KSAgTUFYKG1pbixNSU4oKGEpLG1heCkpCi0jZGVmaW5lIEFCUyhhKSAgICAgICAgICAgKChhKTwwPy0oYSk6KGEpKQotI2RlZmluZSBDTElQOFAoYykgICAgICAgIE1BWCgwLChNSU4oKGMpLDI1NSkpKSAgIC8qIDgtYml0IHBvcy4gaW50ZWdlciAodWNoKSAqLwotI2RlZmluZSBST1VOREYoZikgICAgICAgICgoaW50KShmICsgMC41KSkKLQotI2RlZmluZSBRVUlUKGUsaykgKChlLnR5cGUgPT0gQnV0dG9uUHJlc3MgJiYgZS54YnV0dG9uLmJ1dHRvbiA9PSBCdXR0b24xKSB8fCAgXAotICAgICAgICAgICAgICAgICAgKGUudHlwZSA9PSBLZXlQcmVzcyAmJiAgIC8qICB2LS0tIG9yIDEgZm9yIHNoaWZ0ZWQga2V5cyAqLyAgXAotICAgICAgICAgICAgICAgICAgKChrID0gWExvb2t1cEtleXN5bSgmZS54a2V5LCAwKSkgPT0gWEtfcSB8fCBrID09IFhLX0VzY2FwZSkpKQotCi0jZGVmaW5lIE5PXzI0QklUX01BU0tTIC8qIHVuZGVmIGNhc2Ugbm90IGZ1bGx5IHdyaXR0ZW4tLW9ubHkgZm9yIHJlZGlzcGxheSgpICovCi0KLSNkZWZpbmUgcmdiMV9tYXggICBiZ19mcmVxCi0jZGVmaW5lIHJnYjFfbWluICAgYmdfZ3JheQotI2RlZmluZSByZ2IyX21heCAgIGJnX2JzYXQKLSNkZWZpbmUgcmdiMl9taW4gICBiZ19icm90Ci0KLS8qICNkZWZpbmUgREVCVUcgKi8gICAgIC8qIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KLQotI2luY2x1ZGUgInJlYWRwbmcyLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHJlYWRwbmcyIHByb3RvdHlwZXMgKi8KLQotCi0vKiBjb3VsZCBqdXN0IGluY2x1ZGUgcG5nLmgsIGJ1dCB0aGlzIG1hY3JvIGlzIHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAqIChuYW1lIGFuZCB0eXBlZGVmcyBjaGFuZ2VkIHRvIGxvY2FsIHZlcnNpb25zKTsgbm90ZSB0aGF0IHNpZGUgZWZmZWN0cwotICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAotICogInVzaCBhY29weSA9IChhbHBoYSk7IikgKi8KLQotI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAotICAgIHVzaCB0ZW1wID0gKCh1c2gpKGZnKSoodXNoKShhbHBoYSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICh1c2gpKGJnKSoodXNoKSgyNTUgLSAodXNoKShhbHBoYSkpICsgKHVzaCkxMjgpOyAgXAotICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAotfQotCi0KLSNkZWZpbmUgSU5CVUZTSVpFIDQwOTYgICAvKiB3aXRoIHBzZXVkby10aW1pbmcgb24gKDEgc2VjIGRlbGF5L2Jsb2NrKSwgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAqICBibG9jayBzaXplIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gYSBkb3dubG9hZAotICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzcGVlZCAxMCUgZmFzdGVyIHRoYW4gdGhlb3JldGljYWwgMzMuNksgbWF4aW11bQotICAgICAgICAgICAgICAgICAgICAgICAgICAqICAoYXNzdW1pbmcgOCBkYXRhIGJpdHMsIDEgc3RvcCBiaXQgYW5kIG5vIG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogIG92ZXJoZWFkKSAqLwotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBycG5nMl94X2luaXQgKHZvaWQpOwotc3RhdGljIGludCAgcnBuZzJfeF9jcmVhdGVfd2luZG93ICh2b2lkKTsKLXN0YXRpYyBpbnQgIHJwbmcyX3hfbG9hZF9iZ19pbWFnZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBycG5nMl94X2Rpc3BsYXlfcm93ICh1bGcgcm93KTsKLXN0YXRpYyB2b2lkIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkgKHZvaWQpOwotc3RhdGljIHZvaWQgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UgKHVsZyBzdGFydGNvbCwgdWxnIHN0YXJ0cm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsZyB3aWR0aCwgdWxnIGhlaWdodCk7Ci0jaWZkZWYgRkVBVFVSRV9MT09QCi1zdGF0aWMgdm9pZCBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSAodm9pZCk7Ci1zdGF0aWMgaW50ICBpc19udW1iZXIgKGNoYXIgKnApOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBycG5nMl94X2NsZWFudXAgKHZvaWQpOwotc3RhdGljIGludCAgcnBuZzJfeF9tc2IgKHVsZyB1MzJ2YWwpOwotCi0KLXN0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdLCAqd2luZG93X25hbWUgPSB0aXRsZWJhcjsKLXN0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7Ci1zdGF0aWMgY2hhciAqaWNvbl9uYW1lID0gUFJPR05BTUU7Ci1zdGF0aWMgY2hhciAqcmVzX25hbWUgPSBSRVNOQU1FOwotc3RhdGljIGNoYXIgKnJlc19jbGFzcyA9IFJFU0NMQVNTOwotc3RhdGljIGNoYXIgKmZpbGVuYW1lOwotc3RhdGljIEZJTEUgKmluZmlsZTsKLQotc3RhdGljIG1haW5wcm9nX2luZm8gcnBuZzJfaW5mbzsKLQotc3RhdGljIHVjaCBpbmJ1ZltJTkJVRlNJWkVdOwotc3RhdGljIGludCBpbmNvdW50OwotCi1zdGF0aWMgaW50IHBhdCA9IDY7ICAgICAgICAvKiBtdXN0IGJlIGxlc3MgdGhhbiBudW1fYmdwYXQgKi8KLXN0YXRpYyBpbnQgYmdfaW1hZ2UgPSAwOwotc3RhdGljIGludCBiZ3NjYWxlLCBiZ3NjYWxlX2RlZmF1bHQgPSAxNjsKLXN0YXRpYyB1bGcgYmdfcm93Ynl0ZXM7Ci1zdGF0aWMgdWNoICpiZ19kYXRhOwotCi1pbnQgcGF1c2VfYWZ0ZXJfcGFzcyA9IEZBTFNFOwotaW50IGRlbW9fdGltaW5nID0gRkFMU0U7Ci11bGcgdXNsZWVwX2R1cmF0aW9uID0gMEw7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmdiX2NvbG9yIHsKLSAgICB1Y2ggciwgZywgYjsKLX0gcmdiW10gPSB7Ci0gICAgeyAgMCwgICAwLCAgIDB9LCAgICAvKiAgMDogIGJsYWNrICovCi0gICAgezI1NSwgMjU1LCAyNTV9LCAgICAvKiAgMTogIHdoaXRlICovCi0gICAgezE3MywgMTMyLCAgNTd9LCAgICAvKiAgMjogIHRhbiAqLwotICAgIHsgNjQsIDEzMiwgICAwfSwgICAgLyogIDM6ICBtZWRpdW0gZ3JlZW4gKi8KLSAgICB7MTg5LCAxMTcsICAgMX0sICAgIC8qICA0OiAgZ29sZCAqLwotICAgIHsyNTMsIDI0OSwgICAxfSwgICAgLyogIDU6ICB5ZWxsb3cgKi8KLSAgICB7ICAwLCAgIDAsIDI1NX0sICAgIC8qICA2OiAgYmx1ZSAqLwotICAgIHsgIDAsICAgMCwgMTIwfSwgICAgLyogIDc6ICBtZWRpdW0gYmx1ZSAqLwotICAgIHsyNTUsICAgMCwgMjU1fSwgICAgLyogIDg6ICBtYWdlbnRhICovCi0gICAgeyA2NCwgICAwLCAgNjR9LCAgICAvKiAgOTogIGRhcmsgbWFnZW50YSAqLwotICAgIHsyNTUsICAgMCwgICAwfSwgICAgLyogMTA6ICByZWQgKi8KLSAgICB7IDY0LCAgIDAsICAgMH0sICAgIC8qIDExOiAgZGFyayByZWQgKi8KLSAgICB7MjU1LCAxMjcsICAgMH0sICAgIC8qIDEyOiAgb3JhbmdlICovCi0gICAgezE5MiwgIDk2LCAgIDB9LCAgICAvKiAxMzogIGRhcmtlciBvcmFuZ2UgKi8KLSAgICB7IDI0LCAgNjAsICAgMH0sICAgIC8qIDE0OiAgZGFyayBncmVlbi15ZWxsb3cgKi8KLSAgICB7IDg1LCAxMjUsIDIwMH0sICAgIC8qIDE1OiAgaWNlIGJsdWUgKi8KLSAgICB7MTkyLCAxOTIsIDE5Mn0gICAgIC8qIDE2OiAgTmV0c2NhcGUvTW9zYWljIGdyYXkgKi8KLX07Ci0vKiBub3QgdXNlZCBmb3Igbm93LCBidXQgc2hvdWxkIGJlIGZvciBlcnJvci1jaGVja2luZzoKLXN0YXRpYyBpbnQgbnVtX3JnYiA9IHNpemVvZihyZ2IpIC8gc2l6ZW9mKHN0cnVjdCByZ2JfY29sb3IpOwotICovCi0KLS8qCi0gICAgVGhpcyB3aG9sZSBzdHJ1Y3QgaXMgYSBmYWlybHkgY2hlZXN5IHdheSB0byBrZWVwIHRoZSBudW1iZXIgb2YKLSAgICBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIG1pbmltdW0uICBUaGUgcmFkaWFsLXdhdmVzIGJhY2tncm91bmQKLSAgICB0eXBlIGlzIGEgcGFydGljdWxhcmx5IHBvb3IgZml0IHRvIHRoZSBpbnRlZ2VyIGVsZW1lbnRzIG9mIHRoZQotICAgIHN0cnVjdC4uLmJ1dCBhIGZldyBtYWNyb3MgYW5kIGEgbGl0dGxlIGZpeGVkLXBvaW50IG1hdGggd2lsbCBkbwotICAgIHdvbmRlcnMgZm9yIHlhLgotCi0gICAgdHlwZSBiaXRzOgotICAgICAgIEYgRSBEIEMgQiBBIDkgOCA3IDYgNSA0IDMgMiAxIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCArLSstKy0tIDAgPSBzaGFycC1lZGdlZCBjaGVja2VyYm9hcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMSA9IHNvZnQgZGlhbW9uZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAgICAgICAgMiA9IHJhZGlhbCB3YXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgMy03ID0gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKy0tIGdyYWRpZW50ICMyIGludmVydGVkPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0gYWx0ZXJuYXRpbmcgY29sdW1ucyBpbnZlcnRlZD8KLSAqLwotc3RhdGljIHN0cnVjdCBiYWNrZ3JvdW5kX3BhdHRlcm4gewotICAgIHVzaCB0eXBlOwotICAgIGludCByZ2IxX21heCwgcmdiMV9taW47ICAgICAvKiBvciBiZ19mcmVxLCBiZ19ncmF5ICovCi0gICAgaW50IHJnYjJfbWF4LCByZ2IyX21pbjsgICAgIC8qIG9yIGJnX2JzYXQsIGJnX2Jyb3QgKGJvdGggc2NhbGVkIGJ5IDEwKSovCi19IGJnW10gPSB7Ci0gICAgezAsICAgICAxLDEsIDE2LDE2fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHdoaXRlIHZzLiBsaWdodCBncmF5IChiYXNpYykgKi8KLSAgICB7MCs4LCAgIDIsMCwgIDEsMTV9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgdGFuL2JsYWNrIHZzLiB3aGl0ZS9pY2UgYmx1ZSAqLwotICAgIHswKzI0LCAgMiwwLCAgMSwwfSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2JsYWNrICovCi0gICAgezArOCwgICA0LDUsICAwLDJ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay90YW4gKi8KLSAgICB7MCs4LCAgIDQsNSwgIDAsNn0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZ29sZC95ZWxsb3cgdnMuIGJsYWNrL2JsdWUgKi8KLSAgICB7MCwgICAgIDcsMCwgIDgsOX0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgZGVlcCBibHVlL2JsYWNrIHZzLiBtYWdlbnRhICovCi0gICAgezArOCwgIDEzLDAsICA1LDE0fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIG9yYW5nZS9ibGFjayB2cy4geWVsbG93ICovCi0gICAgezArOCwgIDEyLDAsIDEwLDExfSwgICAgICAgIC8qIGNoZWNrZXJlZDogIG9yYW5nZS9ibGFjayB2cy4gcmVkICovCi0gICAgezEsICAgICA3LDAsICA4LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZGVlcCBibHVlL2JsYWNrIHZzLiBtYWdlbnRhICovCi0gICAgezEsICAgIDEyLDAsIDExLDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgb3JhbmdlIHZzLiBkYXJrIHJlZCAqLwotICAgIHsxLCAgICAxMCwwLCAgNywwfSwgICAgICAgICAvKiBkaWFtb25kczogIHJlZCB2cy4gbWVkaXVtIGJsdWUgKi8KLSAgICB7MSwgICAgIDQsMCwgIDUsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBnb2xkIHZzLiB5ZWxsb3cgKi8KLSAgICB7MSwgICAgIDMsMCwgIDAsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBtZWRpdW0gZ3JlZW4gdnMuIGJsYWNrICovCi0gICAgezIsICAgIDE2LCAxMDAsICAyMCwgICAwfSwgIC8qIHJhZGlhbDogIH5oYXJkIHJhZGlhbCBjb2xvci1iZWFtcyAqLwotICAgIHsyLCAgICAxOCwgMTAwLCAgMTAsICAgMn0sICAvKiByYWRpYWw6ICBzb2Z0LCBjdXJ2ZWQgcmFkaWFsIGNvbG9yLWJlYW1zICovCi0gICAgezIsICAgIDE2LCAyNTYsIDEwMCwgMjUwfSwgIC8qIHJhZGlhbDogIHZlcnkgdGlnaHQgc3BpcmFsICovCi0gICAgezIsIDEwMDAwLCAyNTYsICAxMSwgICAwfSAgIC8qIHJhZGlhbDogIGRpcG9sZS1tb2lyZScgKGFsbW9zdCBmcmFjdGFsKSAqLwotfTsKLXN0YXRpYyBpbnQgbnVtX2JncGF0ID0gc2l6ZW9mKGJnKSAvIHNpemVvZihzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuKTsKLQotCi0vKiBYLXNwZWNpZmljIHZhcmlhYmxlcyAqLwotc3RhdGljIGNoYXIgKmRpc3BsYXluYW1lOwotc3RhdGljIFhJbWFnZSAqeGltYWdlOwotc3RhdGljIERpc3BsYXkgKmRpc3BsYXk7Ci1zdGF0aWMgaW50IGRlcHRoOwotc3RhdGljIFZpc3VhbCAqdmlzdWFsOwotc3RhdGljIFhWaXN1YWxJbmZvICp2aXN1YWxfbGlzdDsKLXN0YXRpYyBpbnQgUlNoaWZ0LCBHU2hpZnQsIEJTaGlmdDsKLXN0YXRpYyB1bGcgUk1hc2ssIEdNYXNrLCBCTWFzazsKLXN0YXRpYyBXaW5kb3cgd2luZG93Owotc3RhdGljIEdDIGdjOwotc3RhdGljIENvbG9ybWFwIGNvbG9ybWFwOwotCi1zdGF0aWMgaW50IGhhdmVfbm9uZGVmYXVsdF92aXN1YWwgPSBGQUxTRTsKLXN0YXRpYyBpbnQgaGF2ZV9jb2xvcm1hcCA9IEZBTFNFOwotc3RhdGljIGludCBoYXZlX3dpbmRvdyA9IEZBTFNFOwotc3RhdGljIGludCBoYXZlX2djID0gRkFMU0U7Ci0KLQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSNpZmRlZiBzZ2kKLSAgICBjaGFyIHRtcGxpbmVbODBdOwotI2VuZGlmCi0gICAgY2hhciAqcCwgKmJnc3RyID0gTlVMTDsKLSAgICBpbnQgcmMsIGFsZW4sIGZsZW47Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICBpbnQgdGltaW5nID0gRkFMU0U7Ci0gICAgaW50IGhhdmVfYmcgPSBGQUxTRTsKLSNpZmRlZiBGRUFUVVJFX0xPT1AKLSAgICBpbnQgbG9vcCA9IEZBTFNFOwotICAgIGxvbmcgbG9vcF9pbnRlcnZhbCA9IC0xOyAgICAgICAgICAgIC8qIHNlY29uZHMgKDEwMCwwMDAgbWF4KSAqLwotI2VuZGlmCi0gICAgZG91YmxlIExVVF9leHBvbmVudDsgICAgICAgICAgICAgICAgLyoganVzdCB0aGUgbG9va3VwIHRhYmxlICovCi0gICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwotICAgIGRvdWJsZSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7ICAgIC8qIHdob2xlIGRpc3BsYXkgc3lzdGVtICovCi0gICAgWEV2ZW50IGU7Ci0gICAgS2V5U3ltIGs7Ci0KLQotICAgIC8qIEZpcnN0IGluaXRpYWxpemUgYSBmZXcgdGhpbmdzLCBqdXN0IHRvIGJlIHN1cmUtLW1lbXNldCB0YWtlcyBjYXJlIG9mCi0gICAgICogZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIChibGFjayksIGJvb2xlYW5zIChGQUxTRSksIHBvaW50ZXJzIChOVUxMKSwKLSAgICAgKiBldGMuICovCi0KLSAgICBkaXNwbGF5bmFtZSA9IChjaGFyICopTlVMTDsKLSAgICBmaWxlbmFtZSA9IChjaGFyICopTlVMTDsKLSAgICBtZW1zZXQoJnJwbmcyX2luZm8sIDAsIHNpemVvZihtYWlucHJvZ19pbmZvKSk7Ci0KLQotICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLCB0aGUKLSAgICAgKiBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgVGhpcyBpcyBub3QgYW4KLSAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCi0gICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICovCi0KLSNpZiBkZWZpbmVkKE5lWFQpCi0gICAgLyogdGhpcmQtcGFydHkgdXRpbGl0aWVzIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgTFVUIGV4cG9uZW50ICovCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwotICAgIC8qCi0gICAgaWYgKHNvbWVfbmV4dF9mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm5leHRfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwotICAgICAqLwotI2VsaWYgZGVmaW5lZChzZ2kpCi0gICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwotICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0bwotICAgICAqIGdldCB0aGUgImdhbW1hIiB2YWx1ZSwgc28gd2UgZG8gaXQgdGhlIGhhcmQgd2F5ICovCi0gICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKLSAgICBpZiAoaW5maWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7Ci0gICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwotICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQotICAgICAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gc2dpX2dhbW1hOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQotICAgIExVVF9leHBvbmVudCA9IDEuOCAvIDIuNjE7Ci0gICAgLyoKLSAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQotICAgICAgICBMVVRfZXhwb25lbnQgPSBtYWNfZ2FtbWEgLyAyLjYxOwotICAgICAqLwotI2Vsc2UKLSAgICBMVVRfZXhwb25lbnQgPSAxLjA7ICAgLyogYXNzdW1lIG5vIExVVDogIG1vc3QgUENzICovCi0jZW5kaWYKLQotICAgIC8qIHRoZSBkZWZhdWx0cyBhYm92ZSBnaXZlIDEuMCwgMS4zLCAxLjUgYW5kIDIuMiwgcmVzcGVjdGl2ZWx5OiAqLwotICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKLQotCi0gICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAotICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCi0gICAgICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdlIGp1c3QgY2FsY3VsYXRlZC4gIEVpdGhlciB3YXksIHRoZSB1c2VyIG1heQotICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KLQotICAgIGlmICgocCA9IGdldGVudigiU0NSRUVOX0dBTU1BIikpICE9IE5VTEwpCi0gICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGF0b2YocCk7Ci0gICAgZWxzZQotICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7Ci0KLQotICAgIC8qIE5vdyBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBvcHRpb25zIGFuZCB0aGUgUE5HIGZpbGVuYW1lLiAqLwotCi0gICAgd2hpbGUgKCorK2FyZ3YgJiYgIWVycm9yKSB7Ci0gICAgICAgIGlmICghc3RybmNtcCgqYXJndiwgIi1kaXNwbGF5IiwgMikpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lID0gKmFyZ3Y7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAocnBuZzJfaW5mby5kaXNwbGF5X2V4cG9uZW50IDw9IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2ltYWdlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWJncGF0IiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGF0ID0gYXRvaSgqYXJndik7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdCA+PSAwICYmIHBhdCA8IG51bV9iZ3BhdCkgewotICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi11c2xlZXAiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB1c2xlZXBfZHVyYXRpb24gPSAodWxnKWF0b2woKmFyZ3YpOwotICAgICAgICAgICAgICAgIGRlbW9fdGltaW5nID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1wYXVzZSIsIDIpKSB7Ci0gICAgICAgICAgICBwYXVzZV9hZnRlcl9wYXNzID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10aW1pbmciLCAyKSkgewotICAgICAgICAgICAgdGltaW5nID0gVFJVRTsKLSNpZmRlZiBGRUFUVVJFX0xPT1AKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1sb29wIiwgMikpIHsKLSAgICAgICAgICAgIGxvb3AgPSBUUlVFOwotICAgICAgICAgICAgaWYgKCFhcmd2WzFdIHx8ICFpc19udW1iZXIoYXJndlsxXSkpCi0gICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDI7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICArK2FyZ3Y7Ci0gICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IGF0b2woKmFyZ3YpOwotICAgICAgICAgICAgICAgIGlmIChsb29wX2ludGVydmFsIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobG9vcF9pbnRlcnZhbCA+IDEwMDAwMCkgICAvKiBiaXQgbW9yZSB0aGFuIG9uZSBkYXkgKi8KLSAgICAgICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDEwMDAwMDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZmlsZW5hbWUpCi0gICAgICAgICsrZXJyb3I7Ci0KLQotICAgIC8qIHByaW50IHVzYWdlIHNjcmVlbiBpZiBhbnkgZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQgKi8KLQotICAgIGlmIChlcnJvcikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXMgJXM6ICAlc1xuXG4iLCBQUk9HTkFNRSwgVkVSU0lPTiwgYXBwbmFtZSk7Ci0gICAgICAgIHJlYWRwbmcyX3ZlcnNpb25faW5mbygpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgotICAgICAgICAgICJVc2FnZTogICAiKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIiVzIFstZGlzcGxheSB4ZHB5XSBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnIHwgLWJncGF0IHBhdF1cbiIKLSAgICAgICAgICAiICAgICAgICAlKnMgWy11c2xlZXAgZHVyIHwgLXRpbWluZ10gWy1wYXVzZV1cbiIsCi0gICAgICAgICAgUFJPR05BTUUsIChpbnQpc3RybGVuKFBST0dOQU1FKSwgIiAiKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0jaWZkZWYgRkVBVFVSRV9MT09QCi0gICAgICAgICAgIiAgICAgICAgWy1sb29wIFtzZWNdXSIKLSNlbmRpZgotICAgICAgICAgICIgZmlsZS5wbmdcblxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICIgICAgeGRweVx0bmFtZSBvZiB0aGUgdGFyZ2V0IFggZGlzcGxheSAoZS5nLiwgYGBob3N0bmFtZTowJycpXG4iCi0gICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgZGlzcGxheVxuIgotICAgICAgICAgICJcdFx0ICBzeXN0ZW0gaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IChlLmcuLCBgYCUuMWYnJyk7IGVxdWFsXG4iCi0gICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIsCi0gICAgICAgICAgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50KTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKLSAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgotICAgICAgICAgICJcdFx0ICAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTogIHNhbWUgYXMgSFRNTCBjb2xvcnMpO1xuIgotICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0XG4iCi0gICAgICAgICAgIiAgICBwYXQgXHRkZXNpcmVkIGJhY2tncm91bmQgcGF0dGVybiBudW1iZXIgKDAtJWQpOyB1c2VkIHdpdGhcbiIKLSAgICAgICAgICAiXHRcdCAgdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJnY29sb3JcbiIsCi0gICAgICAgICAgbnVtX2JncGF0LTEpOwotI2lmZGVmIEZFQVRVUkVfTE9PUAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAiICAgIC1sb29wXHRsb29wcyB0aHJvdWdoIGJhY2tncm91bmQgaW1hZ2VzIGFmdGVyIGluaXRpYWwgZGlzcGxheVxuIgotICAgICAgICAgICJcdFx0ICBpcyBjb21wbGV0ZSAoZGVwZW5kcyBvbiAtYmdwYXQpXG4iCi0gICAgICAgICAgIiAgICBzZWMgXHRzZWNvbmRzIHRvIGRpc3BsYXkgZWFjaCBiYWNrZ3JvdW5kIGltYWdlIChkZWZhdWx0ID0gMilcbiIpOwotI2VuZGlmCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICIgICAgZHVyIFx0ZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzIHRvIHdhaXQgYWZ0ZXIgZGlzcGxheWluZyBlYWNoXG4iCi0gICAgICAgICAgIlx0XHQgIHJvdyAoZm9yIGRlbW8gcHVycG9zZXMpXG4iCi0gICAgICAgICAgIiAgICAtdGltaW5nXHRlbmFibGVzIGRlbGF5IGZvciBldmVyeSBibG9jayByZWFkLCB0byBzaW11bGF0ZSBtb2RlbVxuIgotICAgICAgICAgICJcdFx0ICBkb3dubG9hZCBvZiBpbWFnZSAofjM2IEticHMpXG4iCi0gICAgICAgICAgIiAgICAtcGF1c2VcdHBhdXNlcyBhZnRlciBkaXNwbGF5aW5nIGVhY2ggcGFzcyB1bnRpbCBtb3VzZSBjbGlja2VkXG4iCi0gICAgICAgICAgIlxuUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93LCBhZnRlciBpbWFnZVxuIgotICAgICAgICAgICJpcyBkaXNwbGF5ZWQpIHRvIHF1aXQuXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAoIShpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBQTkcgZmlsZSBbJXNdXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICsrZXJyb3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7Ci0gICAgICAgIGlmIChpbmNvdW50IDwgOCB8fCAhcmVhZHBuZzJfY2hlY2tfc2lnKGluYnVmLCA4KSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICI6ICBbJXNdIGlzIG5vdCBhIFBORyBmaWxlOiBpbmNvcnJlY3Qgc2lnbmF0dXJlXG4iLAotICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICArK2Vycm9yOwotICAgICAgICB9IGVsc2UgaWYgKChyYyA9IHJlYWRwbmcyX2luaXQoJnJwbmcyX2luZm8pKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBoYXMgYmFkIElIRFIgKGxpYnBuZyBsb25nam1wKVxuIiwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgICAgICI6ICB1bmtub3duIHJlYWRwbmcyX2luaXQoKSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIFhPcGVuRGlzcGxheSgpXG4iKSkKLSAgICAgICAgICAgIGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheW5hbWUpOwotICAgICAgICAgICAgaWYgKCFkaXNwbGF5KSB7Ci0gICAgICAgICAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFggZGlzcGxheSBbJXNdXG4iLAotICAgICAgICAgICAgICAgICAgZGlzcGxheW5hbWU/IGRpc3BsYXluYW1lIDogImRlZmF1bHQiKTsKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvcikKLSAgICAgICAgICAgIGZjbG9zZShpbmZpbGUpOwotICAgIH0KLQotCi0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKLSAgICAgICAgZXhpdCgyKTsKLSAgICB9Ci0KLQotICAgIC8qIHNldCB0aGUgdGl0bGUtYmFyIHN0cmluZywgYnV0IG1ha2Ugc3VyZSBidWZmZXIgZG9lc24ndCBvdmVyZmxvdyAqLwotCi0gICAgYWxlbiA9IHN0cmxlbihhcHBuYW1lKTsKLSAgICBmbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKLSAgICBpZiAoYWxlbiArIGZsZW4gKyAzID4gMTAyMykKLSAgICAgICAgc3ByaW50Zih0aXRsZWJhciwgIiVzOiAgLi4uJXMiLCBhcHBuYW1lLCBmaWxlbmFtZSsoYWxlbitmbGVuKzYtMTAyMykpOwotICAgIGVsc2UKLSAgICAgICAgc3ByaW50Zih0aXRsZWJhciwgIiVzOiAgJXMiLCBhcHBuYW1lLCBmaWxlbmFtZSk7Ci0KLQotICAgIC8qIHNldCBzb21lIGZpbmFsIHJwbmcyX2luZm8gdmFyaWFibGVzIGJlZm9yZSBlbnRlcmluZyBtYWluIGRhdGEgbG9vcCAqLwotCi0gICAgaWYgKGhhdmVfYmcpIHsKLSAgICAgICAgdW5zaWduZWQgciwgZywgYjsgICAvKiB0aGlzIGFwcHJvYWNoIHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7Ci0gICAgICAgIHJwbmcyX2luZm8uYmdfcmVkICAgPSAodWNoKXI7Ci0gICAgICAgIHJwbmcyX2luZm8uYmdfZ3JlZW4gPSAodWNoKWc7Ci0gICAgICAgIHJwbmcyX2luZm8uYmdfYmx1ZSAgPSAodWNoKWI7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJwbmcyX2luZm8ubmVlZF9iZ2NvbG9yID0gVFJVRTsKLQotICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrUHJlSW5pdDsKLSAgICBycG5nMl9pbmZvLm1haW5wcm9nX2luaXQgPSBycG5nMl94X2luaXQ7Ci0gICAgcnBuZzJfaW5mby5tYWlucHJvZ19kaXNwbGF5X3JvdyA9IHJwbmcyX3hfZGlzcGxheV9yb3c7Ci0gICAgcnBuZzJfaW5mby5tYWlucHJvZ19maW5pc2hfZGlzcGxheSA9IHJwbmcyX3hfZmluaXNoX2Rpc3BsYXk7Ci0KLQotICAgIC8qIE9LLCB0aGlzIGlzIHRoZSBmdW4gcGFydDogIGNhbGwgcmVhZHBuZzJfZGVjb2RlX2RhdGEoKSBhdCB0aGUgc3RhcnQgb2YKLSAgICAgKiB0aGUgbG9vcCB0byBkZWFsIHdpdGggb3VyIGZpcnN0IGJ1ZmZlciBvZiBkYXRhIChyZWFkIGluIGFib3ZlIHRvIHZlcmlmeQotICAgICAqIHRoYXQgdGhlIGZpbGUgaXMgYSBQTkcgaW1hZ2UpLCB0aGVuIGxvb3AgdGhyb3VnaCB0aGUgZmlsZSBhbmQgY29udGludWUKLSAgICAgKiBjYWxsaW5nIHRoZSBzYW1lIHJvdXRpbmUgdG8gaGFuZGxlIGVhY2ggY2h1bmsgb2YgZGF0YS4gIEl0IGluIHR1cm4KLSAgICAgKiBwYXNzZXMgdGhlIGRhdGEgdG8gbGlicG5nLCB3aGljaCB3aWxsIGludm9rZSBvbmUgb3IgbW9yZSBvZiBvdXIgY2FsbC0KLSAgICAgKiBiYWNrcyBhcyBkZWNvZGVkIGRhdGEgYmVjb21lIGF2YWlsYWJsZS4gIFdlIG9wdGlvbmFsbHkgY2FsbCBzbGVlcCgpIGZvcgotICAgICAqIG9uZSBzZWNvbmQgcGVyIGl0ZXJhdGlvbiB0byBzaW11bGF0ZSBkb3dubG9hZGluZyB0aGUgaW1hZ2UgdmlhIGFuIGFuYWxvZwotICAgICAqIG1vZGVtLiAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpXG4iKSkKLSAgICAgICAgaWYgKHJlYWRwbmcyX2RlY29kZV9kYXRhKCZycG5nMl9pbmZvLCBpbmJ1ZiwgaW5jb3VudCkpCi0gICAgICAgICAgICArK2Vycm9yOwotICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSB3aXRoIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQotCi0gICAgICAgIGlmIChlcnJvciB8fCBpbmNvdW50ICE9IElOQlVGU0laRSB8fCBycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7Ci0gICAgICAgICAgICBpZiAocnBuZzJfaW5mby5zdGF0ZSA9PSBrRG9uZSkgewotICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIGRlY29kaW5nIFBORyBpbWFnZVxuIikpCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGZlcnJvcihpbmZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgZXJyb3Igd2hpbGUgcmVhZGluZyBQTkcgaW1hZ2UgZmlsZVxuIik7Ci0gICAgICAgICAgICAgICAgZXhpdCgzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVvZihpbmZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBlbmQgb2YgZmlsZSByZWFjaGVkICIKLSAgICAgICAgICAgICAgICAgICIodW5leHBlY3RlZGx5KSB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDMpOwotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChlcnJvcikgKi8gewotICAgICAgICAgICAgICAgIC8qIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBiZWxvdyAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGltaW5nKQotICAgICAgICAgICAgc2xlZXAoMSk7Ci0KLSAgICAgICAgaW5jb3VudCA9IGZyZWFkKGluYnVmLCAxLCBJTkJVRlNJWkUsIGluZmlsZSk7Ci0gICAgfQotCi0KLSAgICAvKiBjbGVhbiB1cCBQTkcgc3R1ZmYgYW5kIHJlcG9ydCBhbnkgZGVjb2RpbmcgZXJyb3JzICovCi0KLSAgICBmY2xvc2UoaW5maWxlKTsKLSAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9jbGVhbnVwKClcbiIpKQotICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwotCi0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBpbWFnZVxuIik7Ci0gICAgICAgIGV4aXQoMyk7Ci0gICAgfQotCi0KLSNpZmRlZiBGRUFUVVJFX0xPT1AKLQotICAgIGlmIChsb29wICYmIGJnX2ltYWdlKSB7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJlbnRlcmluZyAtbG9vcCBsb29wIChGRUFUVVJFX0xPT1ApXG4iKSkKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgaW50IGksIHVzZV9zbGVlcDsKLSAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIG5vdywgdGhlbjsKLQotICAgICAgICAgICAgLyogZ2V0IGN1cnJlbnQgdGltZSBhbmQgYWRkIGxvb3BfaW50ZXJ2YWwgdG8gZ2V0IHRhcmdldCB0aW1lICovCi0gICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0aGVuLCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhlbi50dl9zZWMgKz0gbG9vcF9pbnRlcnZhbDsKLSAgICAgICAgICAgICAgICB1c2Vfc2xlZXAgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHVzZV9zbGVlcCA9IFRSVUU7Ci0KLSAgICAgICAgICAgIC8qIGRvIHF1aWNrIGNoZWNrIGZvciBhIHF1aXQgZXZlbnQgYnV0IGRvbid0IHdhaXQgZm9yIGl0ICovCi0gICAgICAgICAgICAvKiBHUlIgQlVHOiAgc2hvdWxkIGFsc28gY2hlY2sgZm9yIEV4cG9zZSBldmVudHMgYW5kIHJlZHJhdy4uLiAqLwotICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2ssICZlKSkKLSAgICAgICAgICAgICAgICBpZiAoUVVJVChlLGspKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogZ2VuZXJhdGUgbmV4dCBiYWNrZ3JvdW5kIGltYWdlICovCi0gICAgICAgICAgICBpZiAoKytwYXQgPj0gbnVtX2JncGF0KQotICAgICAgICAgICAgICAgIHBhdCA9IDA7Ci0gICAgICAgICAgICBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSgpOwotCi0gICAgICAgICAgICAvKiB3YWl0IGZvciB0aW1lb3V0LCB1c2luZyB3aGF0ZXZlciBtZWFucyBhcmUgYXZhaWxhYmxlICovCi0gICAgICAgICAgICBpZiAodXNlX3NsZWVwIHx8IGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gbG9vcF9pbnRlcnZhbDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHOiAgYWxzbyBuZWVkIHRvIGNoZWNrIGZvciBFeHBvc2UgKGFuZCByZWRyYXchKSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoWENoZWNrTWFza0V2ZW50KGRpc3BsYXksIEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICZlKSAmJiBRVUlUKGUsaykpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIFkyMDM4IEJVRyEgKi8KLSAgICAgICAgICAgICAgICBpZiAobm93LnR2X3NlYyA8IHRoZW4udHZfc2VjIHx8Ci0gICAgICAgICAgICAgICAgICAgIChub3cudHZfc2VjID09IHRoZW4udHZfc2VjICYmIG5vdy50dl91c2VjIDwgdGhlbi50dl91c2VjKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBxdWl0ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vjb25kc190b19nbyA9IHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYzsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB1c2xlZXBfdXNlYzsKLQotICAgICAgICAgICAgICAgICAgICAvKiBiYXNpY2FsbHkgY2hldyB1cCBtb3N0IG9mIHJlbWFpbmluZyBsb29wLWludGVydmFsIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICogIGNhbGxzIHRvIHNsZWVwKDEpIGludGVybGVhdmVkIHdpdGggY2hlY2tzIGZvciBxdWl0Ci0gICAgICAgICAgICAgICAgICAgICAqICBldmVudHMsIGJ1dCBhbHNvIHJlY2FsYyB0aW1lLXRvLWdvIHBlcmlvZGljYWxseTsgd2hlbgotICAgICAgICAgICAgICAgICAgICAgKiAgZG9uZSwgY2xlYW4gdXAgYW55IHJlbWFpbmluZyB0aW1lIHdpdGggdXNsZWVwKCkgY2FsbAotICAgICAgICAgICAgICAgICAgICAgKiAgKGNvdWxkIGFsc28gdXNlIFNJR0FMUk0sIGJ1dCBzaWduYWxzIGFyZSBhIHBhaW4uLi4pICovCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZWNvbmRzX3RvX2dvLS0gPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vjb25kc19kb25lID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gc2Vjb25kc190b19nbzsgIGkgPiAwICYmICFxdWl0OyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRzogIG5lZWQgdG8gY2hlY2sgZm9yIEV4cG9zZSBhbmQgcmVkcmF3ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25QcmVzc01hc2ssICZlKSAmJiBRVUlUKGUsaykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlY29uZHNfZG9uZSA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8qIHRpbWUgdG8gcmVkbyBzZWNvbmRzX3RvX2dvIG1lYXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogT0ssIG1vcmUgdGhhbiAxMDAwIHNlY29uZHMgc2luY2UgbGFzdCBjaGVjazoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqICBjb3JyZWN0IHRoZSB0aW1lLXRvLWdvIG1lYXN1cmVtZW50IGZvciBkcmlmdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdy50dl9zZWMgPj0gdGhlbi50dl9zZWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNfdG9fZ28gPSB0aGVuLnR2X3NlYyAtIG5vdy50dl9zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3NlY29uZHNfdG9fZ287ICAvKiByZXN0b3JlIHdoYXQgd2Ugc3VidHJhY3RlZCAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdWl0KQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLyogYnJlYWtzIG91dGVyIGRvLWxvb3AsIHNraXBzIHJlZGlzcGxheSAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNpbmNlIGRpZmZlcmVuY2UgYmV0d2VlbiAibm93IiBhbmQgInRoZW4iIGlzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICogIGVhdGVuIHVwIHRvIHdpdGhpbiBhIGNvdXBsZSBvZiBzZWNvbmRzLCBkb24ndCBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAqICB3b3JyeSBhYm91dCBvdmVyZmxvdy0tYnV0IG1pZ2h0IGhhdmUgb3ZlcnNob3QgKG5lZy4pICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwX3VzZWMgPSAxMDAwMDAwTCoodGhlbi50dl9zZWMgLSBub3cudHZfc2VjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4udHZfdXNlYyAtIG5vdy50dl91c2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzbGVlcF91c2VjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoKHVsZyl1c2xlZXBfdXNlYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGNvbXBvc2l0ZSBpbWFnZSBhZ2FpbnN0IG5ldyBiYWNrZ3JvdW5kIGFuZCBkaXNwbGF5IChub3RlIHRoYXQKLSAgICAgICAgICAgICAqICB3ZSBkbyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIHRpbWUgc3BlbnQgZG9pbmcgdGhpcy4uLikgKi8KLSAgICAgICAgICAgIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlICgwLCAwLCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSAvKiBGQUxMIFRIUk9VR0ggYW5kIGRvIHRoZSBub3JtYWwgdGhpbmcgKi8KLQotI2VuZGlmIC8qIEZFQVRVUkVfTE9PUCAqLwotCi0gICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KLQotICAgIGlmIChycG5nMl9pbmZvLnN0YXRlID49IGtXaW5kb3dJbml0KSB7Ci0gICAgICAgIFRyYWNlKChzdGRlcnIsICJlbnRlcmluZyBmaW5hbCB3YWl0LWZvci1xdWl0LWV2ZW50IGxvb3BcbiIpKQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKLSAgICAgICAgICAgIGlmIChlLnR5cGUgPT0gRXhwb3NlKSB7Ci0gICAgICAgICAgICAgICAgWEV4cG9zZUV2ZW50ICpleCA9IChYRXhwb3NlRXZlbnQgKikmZTsKLSAgICAgICAgICAgICAgICBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAoZXgtPngsIGV4LT55LCBleC0+d2lkdGgsIGV4LT5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghUVVJVChlLGspKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluaXQgY2FsbGJhY2sgbmV2ZXIgY2FsbGVkOiAgcHJvYmFibGUgIgotICAgICAgICAgICJsaWJwbmcgZXJyb3Igd2hpbGUgZGVjb2RpbmcgUE5HIG1ldGFkYXRhXG4iKTsKLSAgICAgICAgZXhpdCg0KTsKLSAgICB9Ci0KLQotICAgIC8qIHdlJ3JlIGRvbmU6ICBjbGVhbiB1cCBhbGwgaW1hZ2UgYW5kIFggcmVzb3VyY2VzIGFuZCBnbyBhd2F5ICovCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCBycG5nMl94X2NsZWFudXAoKVxuIikpCi0gICAgcnBuZzJfeF9jbGVhbnVwKCk7Ci0KLSAgICAodm9pZClhcmdjOyAvKiBVbnVzZWQgKi8KLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHJlYWRwbmcyX2luZm9fY2FsbGJhY2soKSBpbiByZWFkcG5nMi5jLCB3aGljaAotICogaW4gdHVybiBpcyBjYWxsZWQgYnkgbGlicG5nIGFmdGVyIGFsbCBvZiB0aGUgcHJlLUlEQVQgY2h1bmtzIGhhdmUgYmVlbgotICogcmVhZCBhbmQgcHJvY2Vzc2VkLS1pLmUuLCB3ZSBub3cgaGF2ZSBlbm91Z2ggaW5mbyB0byBmaW5pc2ggaW5pdGlhbGl6aW5nICovCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3hfaW5pdCh2b2lkKQotewotICAgIHVsZyBpOwotICAgIHVsZyByb3dieXRlcyA9IHJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfaW5pdCgpXG4iKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICByb3dieXRlcyA9ICVkXG4iLCBycG5nMl9pbmZvLnJvd2J5dGVzKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICB3aWR0aCAgPSAlbGRcbiIsIHJwbmcyX2luZm8ud2lkdGgpKQotICAgIFRyYWNlKChzdGRlcnIsICIgIGhlaWdodCA9ICVsZFxuIiwgcnBuZzJfaW5mby5oZWlnaHQpKQotCi0gICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gKHVjaCAqKW1hbGxvYyhyb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICBpZiAoIXJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgewotICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJwbmcyX2luZm8ucm93X3BvaW50ZXJzID0gKHVjaCAqKiltYWxsb2MocnBuZzJfaW5mby5oZWlnaHQgKiBzaXplb2YodWNoICopKTsKLSAgICBpZiAoIXJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7Ci0gICAgICAgIGZyZWUocnBuZzJfaW5mby5pbWFnZV9kYXRhKTsKLSAgICAgICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKLSAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytpKQotICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tpXSA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIGkqcm93Ynl0ZXM7Ci0KLQotICAgIC8qIGRvIHRoZSBiYXNpYyBYIGluaXRpYWxpemF0aW9uIHN0dWZmLCBtYWtlIHRoZSB3aW5kb3csIGFuZCBmaWxsIGl0IHdpdGgKLSAgICAgKiB0aGUgdXNlci1zcGVjaWZpZWQsIGZpbGUtc3BlY2lmaWVkIG9yIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvcgotICAgICAqIHBhdHRlcm4gKi8KLQotICAgIGlmIChycG5nMl94X2NyZWF0ZV93aW5kb3coKSkgewotCi0gICAgICAgIC8qIEdSUiBURU1QT1JBUlkgSEFDSzogIHRoaXMgaXMgZnVuZGFtZW50YWxseSBubyBkaWZmZXJlbnQgZnJvbSBjYXNlcwotICAgICAgICAgKiBhYm92ZTsgbGlicG5nIHNob3VsZCBjYWxsIG91ciBlcnJvciBoYW5kbGVyIHRvIGxvbmdqbXAoKSBiYWNrIHRvIHVzCi0gICAgICAgICAqIHdoZW4gcG5nX3B0ciBnb2VzIGF3YXkuICBJZiB3ZS9pdCBzZWdmYXVsdCBpbnN0ZWFkLCBzZWVtcyBsaWtlIGEKLSAgICAgICAgICogbGlicG5nIGJ1Zy4uLiAqLwotCi0gICAgICAgIC8qIHdlJ3JlIGhlcmUgdmlhIGxpYnBuZyBjYWxsYmFjaywgc28gaWYgd2luZG93IGZhaWxzLCBjbGVhbiBhbmQgYmFpbCAqLwotICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKLSAgICAgICAgcnBuZzJfeF9jbGVhbnVwKCk7Ci0gICAgICAgIGV4aXQoMik7Ci0gICAgfQotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtXaW5kb3dJbml0OwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZzJfeF9jcmVhdGVfd2luZG93KHZvaWQpCi17Ci0gICAgdWxnIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7Ci0gICAgdWxnIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKLSAgICB1bGcgYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7Ci0gICAgdWxnIGJnX3BpeGVsID0gMEw7Ci0gICAgdWxnIGF0dHJtYXNrOwotICAgIGludCBuZWVkX2NvbG9ybWFwID0gRkFMU0U7Ci0gICAgaW50IHNjcmVlbiwgcGFkOwotICAgIHVjaCAqeGRhdGE7Ci0gICAgV2luZG93IHJvb3Q7Ci0gICAgWEV2ZW50IGU7Ci0gICAgWEdDVmFsdWVzIGdjdmFsdWVzOwotICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0gICAgWFRleHRQcm9wZXJ0eSB3aW5kb3dOYW1lLCAqcFdpbmRvd05hbWUgPSAmd2luZG93TmFtZTsKLSAgICBYVGV4dFByb3BlcnR5IGljb25OYW1lLCAqcEljb25OYW1lID0gJmljb25OYW1lOwotICAgIFhWaXN1YWxJbmZvIHZpc3VhbF9pbmZvOwotICAgIFhTaXplSGludHMgKnNpemVfaGludHM7Ci0gICAgWFdNSGludHMgKndtX2hpbnRzOwotICAgIFhDbGFzc0hpbnQgKmNsYXNzX2hpbnRzOwotCi0KLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpXG4iKSkKLQotICAgIHNjcmVlbiA9IERlZmF1bHRTY3JlZW4oZGlzcGxheSk7Ci0gICAgZGVwdGggPSBEaXNwbGF5UGxhbmVzKGRpc3BsYXksIHNjcmVlbik7Ci0gICAgcm9vdCA9IFJvb3RXaW5kb3coZGlzcGxheSwgc2NyZWVuKTsKLQotI2lmZGVmIERFQlVHCi0gICAgWFN5bmNocm9uaXplKGRpc3BsYXksIFRydWUpOwotI2VuZGlmCi0KLSAgICBpZiAoZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKLSAgICAgICAgaW50IHZpc3VhbHNfbWF0Y2hlZCA9IDA7Ci0KLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRlZmF1bHQgZGVwdGggaXMgJWQ6ICBjaGVja2luZyBvdGhlciB2aXN1YWxzXG4iLAotICAgICAgICAgIGRlcHRoKSkKLQotICAgICAgICAvKiAyNC1iaXQgZmlyc3QgKi8KLSAgICAgICAgdmlzdWFsX2luZm8uc2NyZWVuID0gc2NyZWVuOwotICAgICAgICB2aXN1YWxfaW5mby5kZXB0aCA9IDI0OwotICAgICAgICB2aXN1YWxfbGlzdCA9IFhHZXRWaXN1YWxJbmZvKGRpc3BsYXksCi0gICAgICAgICAgVmlzdWFsU2NyZWVuTWFzayB8IFZpc3VhbERlcHRoTWFzaywgJnZpc3VhbF9pbmZvLCAmdmlzdWFsc19tYXRjaGVkKTsKLSAgICAgICAgaWYgKHZpc3VhbHNfbWF0Y2hlZCA9PSAwKSB7Ci0vKiBHUlI6ICBhZGQgMTUtLCAxNi0gYW5kIDMyLWJpdCBUcnVlQ29sb3IgdmlzdWFscyAoYWxzbyBEaXJlY3RDb2xvcj8pICovCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmF1bHQgc2NyZWVuIGRlcHRoICVkIG5vdCBzdXBwb3J0ZWQsIGFuZCBubyIKLSAgICAgICAgICAgICAgIiAyNC1iaXQgdmlzdWFscyBmb3VuZFxuIiwgZGVwdGgpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgVHJhY2UoKHN0ZGVyciwgIlhHZXRWaXN1YWxJbmZvKCkgcmV0dXJuZWQgJWQgMjQtYml0IHZpc3VhbHNcbiIsCi0gICAgICAgICAgdmlzdWFsc19tYXRjaGVkKSkKLSAgICAgICAgdmlzdWFsID0gdmlzdWFsX2xpc3RbMF0udmlzdWFsOwotICAgICAgICBkZXB0aCA9IHZpc3VhbF9saXN0WzBdLmRlcHRoOwotLyoKLSAgICAgICAgY29sb3JtYXBfc2l6ZSA9IHZpc3VhbF9saXN0WzBdLmNvbG9ybWFwX3NpemU7Ci0gICAgICAgIHZpc3VhbF9jbGFzcyA9IHZpc3VhbC0+Y2xhc3M7Ci0gICAgICAgIHZpc3VhbElEID0gWFZpc3VhbElERnJvbVZpc3VhbCh2aXN1YWwpOwotICovCi0gICAgICAgIGhhdmVfbm9uZGVmYXVsdF92aXN1YWwgPSBUUlVFOwotICAgICAgICBuZWVkX2NvbG9ybWFwID0gVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICBYTWF0Y2hWaXN1YWxJbmZvKGRpc3BsYXksIHNjcmVlbiwgZGVwdGgsIFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKLSAgICAgICAgdmlzdWFsID0gdmlzdWFsX2luZm8udmlzdWFsOwotICAgIH0KLQotICAgIFJNYXNrID0gdmlzdWFsLT5yZWRfbWFzazsKLSAgICBHTWFzayA9IHZpc3VhbC0+Z3JlZW5fbWFzazsKLSAgICBCTWFzayA9IHZpc3VhbC0+Ymx1ZV9tYXNrOwotCi0vKiBHUlI6ICBhZGQvY2hlY2sgOC1iaXQgc3VwcG9ydCAqLwotICAgIGlmIChkZXB0aCA9PSA4IHx8IG5lZWRfY29sb3JtYXApIHsKLSAgICAgICAgY29sb3JtYXAgPSBYQ3JlYXRlQ29sb3JtYXAoZGlzcGxheSwgcm9vdCwgdmlzdWFsLCBBbGxvY05vbmUpOwotICAgICAgICBpZiAoIWNvbG9ybWFwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVDb2xvcm1hcCgpIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBoYXZlX2NvbG9ybWFwID0gVFJVRTsKLSAgICAgICAgaWYgKGRlcHRoID09IDgpCi0gICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOyAgIC8qIGdyYWRpZW50IGp1c3Qgd2FzdGVzIHBhbGV0dGUgZW50cmllcyAqLwotICAgIH0KLSAgICBpZiAoZGVwdGggPT0gMTUgfHwgZGVwdGggPT0gMTYpIHsKLSAgICAgICAgUlNoaWZ0ID0gMTUgLSBycG5nMl94X21zYihSTWFzayk7ICAgIC8qIHRoZXNlIGFyZSByaWdodC1zaGlmdHMgKi8KLSAgICAgICAgR1NoaWZ0ID0gMTUgLSBycG5nMl94X21zYihHTWFzayk7Ci0gICAgICAgIEJTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoQk1hc2spOwotICAgIH0gZWxzZSBpZiAoZGVwdGggPiAxNikgewotICAgICAgICBSU2hpZnQgPSBycG5nMl94X21zYihSTWFzaykgLSA3OyAgICAgLyogdGhlc2UgYXJlIGxlZnQtc2hpZnRzICovCi0gICAgICAgIEdTaGlmdCA9IHJwbmcyX3hfbXNiKEdNYXNrKSAtIDc7Ci0gICAgICAgIEJTaGlmdCA9IHJwbmcyX3hfbXNiKEJNYXNrKSAtIDc7Ci0gICAgfQotICAgIGlmIChkZXB0aCA+PSAxNSAmJiAoUlNoaWZ0IDwgMCB8fCBHU2hpZnQgPCAwIHx8IEJTaGlmdCA8IDApKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAicnBuZzIgaW50ZXJuYWwgbG9naWMgZXJyb3I6ICBuZWdhdGl2ZSBYIHNoaWZ0KHMpIVxuIik7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGF0dHIuYmFja2luZ19zdG9yZSA9IEFsd2F5czsKLSAgICBhdHRyLmV2ZW50X21hc2sgPSBFeHBvc3VyZU1hc2sgfCBLZXlQcmVzc01hc2sgfCBCdXR0b25QcmVzc01hc2s7Ci0gICAgYXR0cm1hc2sgPSBDV0JhY2tpbmdTdG9yZSB8IENXRXZlbnRNYXNrOwotICAgIGlmIChoYXZlX25vbmRlZmF1bHRfdmlzdWFsKSB7Ci0gICAgICAgIGF0dHIuY29sb3JtYXAgPSBjb2xvcm1hcDsKLSAgICAgICAgYXR0ci5iYWNrZ3JvdW5kX3BpeGVsID0gMDsKLSAgICAgICAgYXR0ci5ib3JkZXJfcGl4ZWwgPSAxOwotICAgICAgICBhdHRybWFzayB8PSBDV0NvbG9ybWFwIHwgQ1dCYWNrUGl4ZWwgfCBDV0JvcmRlclBpeGVsOwotICAgIH0KLQotICAgIHdpbmRvdyA9IFhDcmVhdGVXaW5kb3coZGlzcGxheSwgcm9vdCwgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKLSAgICAgIHJwbmcyX2luZm8uaGVpZ2h0LCAwLCBkZXB0aCwgSW5wdXRPdXRwdXQsIHZpc3VhbCwgYXR0cm1hc2ssICZhdHRyKTsKLQotICAgIGlmICh3aW5kb3cgPT0gTm9uZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVXaW5kb3coKSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMjsKLSAgICB9IGVsc2UKLSAgICAgICAgaGF2ZV93aW5kb3cgPSBUUlVFOwotCi0gICAgaWYgKGRlcHRoID09IDgpCi0gICAgICAgIFhTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LCB3aW5kb3csIGNvbG9ybWFwKTsKLQotICAgIGlmICghWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmd2luZG93X25hbWUsIDEsIHBXaW5kb3dOYW1lKSkKLSAgICAgICAgcFdpbmRvd05hbWUgPSBOVUxMOwotICAgIGlmICghWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmaWNvbl9uYW1lLCAxLCBwSWNvbk5hbWUpKQotICAgICAgICBwSWNvbk5hbWUgPSBOVUxMOwotCi0gICAgLyogT0sgaWYgZWl0aGVyIGhpbnRzIGFsbG9jYXRpb24gZmFpbHM7IFhTZXRXTVByb3BlcnRpZXMoKSBhbGxvd3MgTlVMTHMgKi8KLQotICAgIGlmICgoc2l6ZV9oaW50cyA9IFhBbGxvY1NpemVIaW50cygpKSAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIHdpbmRvdyB3aWxsIG5vdCBiZSByZXNpemFibGUgKi8KLSAgICAgICAgc2l6ZV9oaW50cy0+ZmxhZ3MgPSBQTWluU2l6ZSB8IFBNYXhTaXplOwotICAgICAgICBzaXplX2hpbnRzLT5taW5fd2lkdGggPSBzaXplX2hpbnRzLT5tYXhfd2lkdGggPSAoaW50KXJwbmcyX2luZm8ud2lkdGg7Ci0gICAgICAgIHNpemVfaGludHMtPm1pbl9oZWlnaHQgPSBzaXplX2hpbnRzLT5tYXhfaGVpZ2h0ID0KLSAgICAgICAgICAoaW50KXJwbmcyX2luZm8uaGVpZ2h0OwotICAgIH0KLQotICAgIGlmICgod21faGludHMgPSBYQWxsb2NXTUhpbnRzKCkpICE9IE5VTEwpIHsKLSAgICAgICAgd21faGludHMtPmluaXRpYWxfc3RhdGUgPSBOb3JtYWxTdGF0ZTsKLSAgICAgICAgd21faGludHMtPmlucHV0ID0gVHJ1ZTsKLSAgICAgLyogd21faGludHMtPmljb25fcGl4bWFwID0gaWNvbl9waXhtYXA7ICovCi0gICAgICAgIHdtX2hpbnRzLT5mbGFncyA9IFN0YXRlSGludCB8IElucHV0SGludCAgLyogfCBJY29uUGl4bWFwSGludCAqLyA7Ci0gICAgfQotCi0gICAgaWYgKChjbGFzc19oaW50cyA9IFhBbGxvY0NsYXNzSGludCgpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfbmFtZSA9IHJlc19uYW1lOwotICAgICAgICBjbGFzc19oaW50cy0+cmVzX2NsYXNzID0gcmVzX2NsYXNzOwotICAgIH0KLQotICAgIFhTZXRXTVByb3BlcnRpZXMoZGlzcGxheSwgd2luZG93LCBwV2luZG93TmFtZSwgcEljb25OYW1lLCBOVUxMLCAwLAotICAgICAgc2l6ZV9oaW50cywgd21faGludHMsIGNsYXNzX2hpbnRzKTsKLQotICAgIC8qIHZhcmlvdXMgcHJvcGVydGllcyBhbmQgaGludHMgbm8gbG9uZ2VyIG5lZWRlZDsgZnJlZSBtZW1vcnkgKi8KLSAgICBpZiAocFdpbmRvd05hbWUpCi0gICAgICAgWEZyZWUocFdpbmRvd05hbWUtPnZhbHVlKTsKLSAgICBpZiAocEljb25OYW1lKQotICAgICAgIFhGcmVlKHBJY29uTmFtZS0+dmFsdWUpOwotICAgIGlmIChzaXplX2hpbnRzKQotICAgICAgICBYRnJlZShzaXplX2hpbnRzKTsKLSAgICBpZiAod21faGludHMpCi0gICAgICAgWEZyZWUod21faGludHMpOwotICAgIGlmIChjbGFzc19oaW50cykKLSAgICAgICBYRnJlZShjbGFzc19oaW50cyk7Ci0KLSAgICBYTWFwV2luZG93KGRpc3BsYXksIHdpbmRvdyk7Ci0KLSAgICBnYyA9IFhDcmVhdGVHQyhkaXNwbGF5LCB3aW5kb3csIDAsICZnY3ZhbHVlcyk7Ci0gICAgaGF2ZV9nYyA9IFRSVUU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgWC0gYW5kIGRpc3BsYXktc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDQqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgICAgIHBhZCA9IDMyOwotICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDIqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgICAgIHBhZCA9IDE2OwotICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLSAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKHJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOwotICAgICAgICBwYWQgPSA4OwotICAgIH0KLQotICAgIGlmICgheGRhdGEpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgaW1hZ2UgbWVtb3J5XG4iKTsKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gICAgeGltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIHZpc3VhbCwgZGVwdGgsIFpQaXhtYXAsIDAsCi0gICAgICAoY2hhciAqKXhkYXRhLCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodCwgcGFkLCAwKTsKLQotICAgIGlmICgheGltYWdlKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgWENyZWF0ZUltYWdlKCkgZmFpbGVkXG4iKTsKLSAgICAgICAgZnJlZSh4ZGF0YSk7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0KLQotICAgIC8qIHRvIGF2b2lkIHRlc3RpbmcgdGhlIGJ5dGUgb3JkZXIgZXZlcnkgcGl4ZWwgKG9yIGRvdWJsaW5nIHRoZSBzaXplIG9mCi0gICAgICogdGhlIGRyYXdpbmcgcm91dGluZSB3aXRoIGEgZ2lhbnQgaWYtdGVzdCksIHdlIGFyYml0cmFyaWx5IHNldCB0aGUgYnl0ZQotICAgICAqIG9yZGVyIHRvIE1TQkZpcnN0IGFuZCBsZXQgWGxpYiB3b3JyeSBhYm91dCBpbnZlcnRpbmcgdGhpbmdzIG9uIGxpdHRsZS0KLSAgICAgKiBlbmRpYW4gbWFjaGluZXMgKGUuZy4sIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlCi0gICAgICogbW9zdCBlZmZpY2llbnQgYXBwcm9hY2ggKHRoZSBnaWFudCBpZi10ZXN0IHdvdWxkIGJlIGJldHRlciksIGJ1dCBpbgotICAgICAqIHRoZSBpbnRlcmVzdCBvZiBjbGFyaXR5LCB3ZSdsbCB0YWtlIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8KLQotICAgIHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0IGlzIGJsYWNrKSBvcgotICAgIGZha2VkICJiYWNrZ3JvdW5kIGltYWdlIiAoYnV0IGxhdHRlciBpcyBkaXNhYmxlZCBpZiA4LWJpdDsgZ3JhZGllbnRzCi0gICAganVzdCB3YXN0ZSBwYWxldHRlIGVudHJpZXMpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGJnX2ltYWdlKQotICAgICAgICBycG5nMl94X2xvYWRfYmdfaW1hZ2UoKTsgICAgLyogcmVzZXRzIGJnX2ltYWdlIGlmIGZhaWxzICovCi0KLSAgICBpZiAoIWJnX2ltYWdlKSB7Ci0gICAgICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICAgICAgYmdfcGl4ZWwgPSAoYmdfcmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChiZ19ncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKGJnX2JsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgICAgIGJnX3BpeGVsID0gKCgoYmdfcmVkICAgPDwgOCkgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICgoKGJnX2dyZWVuIDw8IDgpID4+IEdTaGlmdCkgJiBHTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAoKChiZ19ibHVlICA8PCA4KSA+PiBCU2hpZnQpICYgQk1hc2spOwotICAgICAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0KLSAgICAgICAgfQotICAgICAgICBYU2V0Rm9yZWdyb3VuZChkaXNwbGF5LCBnYywgYmdfcGl4ZWwpOwotICAgICAgICBYRmlsbFJlY3RhbmdsZShkaXNwbGF5LCB3aW5kb3csIGdjLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAotICAgICAgICAgIHJwbmcyX2luZm8uaGVpZ2h0KTsKLSAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgV2FpdCBmb3IgZmlyc3QgRXhwb3NlIGV2ZW50IHRvIGRvIGFueSBkcmF3aW5nLCB0aGVuIGZsdXNoIGFuZCByZXR1cm4uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBkbwotICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKLSAgICB3aGlsZSAoZS50eXBlICE9IEV4cG9zZSB8fCBlLnhleHBvc2UuY291bnQpOwotCi0gICAgWEZsdXNoKGRpc3BsYXkpOwotCi0gICAgcmV0dXJuIDA7Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpICovCi0KLQotCi0KLQotc3RhdGljIGludCBycG5nMl94X2xvYWRfYmdfaW1hZ2Uodm9pZCkKLXsKLSAgICB1Y2ggKnNyYzsKLSAgICBjaGFyICpkZXN0OwotICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwotICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OwotICAgIGludCBrLCBobWF4LCBtYXg7Ci0gICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4OwotICAgIGludCBldmVuX29kZF92ZXJ0LCBldmVuX29kZF9ob3JpeiwgZXZlbl9vZGQ7Ci0gICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7Ci0gICAgaW50IGludmVydF9jb2x1bW47Ci0gICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0gICAgdWxnIGksIHJvdzsKLSAgICB1bGcgcGl4ZWw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQWxsb2NhdGUgYnVmZmVyIGZvciBmYWtlIGJhY2tncm91bmQgaW1hZ2UgdG8gYmUgdXNlZCB3aXRoIHRyYW5zcGFyZW50Ci0gICAgaW1hZ2VzOyBpZiB0aGlzIGZhaWxzLCByZXZlcnQgdG8gcGxhaW4gYmFja2dyb3VuZCBjb2xvci4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGJnX3Jvd2J5dGVzID0gMyAqIHJwbmcyX2luZm8ud2lkdGg7Ci0gICAgYmdfZGF0YSA9ICh1Y2ggKiltYWxsb2MoYmdfcm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7Ci0gICAgaWYgKCFiZ19kYXRhKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBiYWNrZ3JvdW5kIGltYWdlXG4iKTsKLSAgICAgICAgYmdfaW1hZ2UgPSAwOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKLSAgICB5aWR4X21heCA9IGJnc2NhbGUgLSAxOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCi0gICAgY29sb3JzIChOID09IGJnc2NhbGUpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7Ci0gICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7Ci0gICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7Ci0gICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7Ci0gICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7Ci0gICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7Ci0gICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7Ci0gICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47Ci0gICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47Ci0gICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47Ci0gICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47Ci0gICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47Ci0gICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwotICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwotCi0gICAgICAgICAgICByMSA9IHIxX21pbiArIChyMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjEgPSBiMV9taW4gKyAoYjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICByMV9pbnYgPSByMV9taW4gKyAocjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjFfaW52ID0gYjFfbWluICsgKGIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0KLSAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzIgPSBnMl9taW4gKyAoZzJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMiA9IGIyX21pbiArIChiMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzJfaW52ID0gZzJfbWluICsgKGcyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMl9pbnYgPSBiMl9taW4gKyAoYjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLQotICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwotICAgICAgICAgICAgICAgIGV2ZW5fb2RkID0gZXZlbl9vZGRfdmVydCBeIGV2ZW5fb2RkX2hvcml6OwotICAgICAgICAgICAgICAgIGludmVydF9jb2x1bW4gPQotICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW5fb2RkID09IDApIHsgICAgICAgIC8qIGdyYWRpZW50ICMxICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyOyAgICAgICAvKiAgZG91Ymx5IGludmVydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjJfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCi0gICAgTS4gQ29zdGVsbG8uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7Ci0KLSAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0gICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KLQotICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOwotICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwotICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwotICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOwotICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwotICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKLSAgICAgICAgICAgIGlmICh5aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKLSAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4aWR4ID0gKGludCkoaSAlIGJnc2NhbGUpOwotICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICAgICAgeGlkeCA9IGJnc2NhbGUtMSAtIHhpZHg7Ci0gICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypnMSArIChtYXgtaykqZzIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUmFkaWFsICJzdGFyYnVyc3QiIHdpdGggYXppbXV0aGFsIHNpbnVzb2lkczsgW2V2ZW50dWFsbHkgbnVtYmVyIG9mIHNpbnUtCi0gICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KLSAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKLSAgICAgICAgdWNoIGNoOwotICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7Ci0gICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7Ci0gICAgICAgIGRvdWJsZSBhbmdsZT0wLjAsIGFvZmZzZXQ9MC4wLCBtYXhEaXN0LCBkaXN0OwotICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBjb21wdXRpbmcgcmFkaWFsIGJhY2tncm91bmQuLi4iLAotICAgICAgICAgIFBST0dOQU1FKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICAgICAgaGggPSAoaW50KShycG5nMl9pbmZvLmhlaWdodCAvIDIpOwotICAgICAgICBodyA9IChpbnQpKHJwbmcyX2luZm8ud2lkdGggLyAyKTsKLQotICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKLSAgICAgICAgICogICBhb2Zmc2V0OiAgbnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIGh1ZSBbQ1VSUkVOVExZIE5PVCBVU0VEXQotICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCi0gICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQotICAgICAgICAgKiAgIHJvdGF0ZTogIHJvdGF0aW9uIG9mIHRoZSBiZWFtcyBhcyBhIGZ1bmN0aW9uIG9mIHJhZGl1cwotICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKLSAgICAgICAgICovCi0gICAgICAgIGFuZ2xlID0gQ0xJUChhbmdsZSwgMC4wLCAzNjAuMCk7Ci0gICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7Ci0gICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7Ci0gICAgICAgIHNhdHVyYXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2JzYXQgKiAwLjE7Ci0gICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOwotICAgICAgICBncmF5ID0gMC4wOwotICAgICAgICBpbnRlbnNpdHkgPSAwLjA7Ci0gICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeSA9IChpbnQpKHJvdyAtIGhoKTsKLSAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4ID0gKGludCkoaSAtIGh3KTsKLSAgICAgICAgICAgICAgICBhbmdsZSA9ICh4ID09IDApPyBQSV8yIDogYXRhbigoZG91YmxlKXkgLyAoZG91YmxlKXgpOwotICAgICAgICAgICAgICAgIGdyYXkgPSAoZG91YmxlKU1BWChBQlMoeSksIEFCUyh4KSkgLyBncmF5c3BvdDsKLSAgICAgICAgICAgICAgICBncmF5ID0gTUlOKDEuMCwgZ3JheSk7Ci0gICAgICAgICAgICAgICAgZGlzdCA9IChkb3VibGUpKCh4KngpICsgKHkqeSkpIC8gbWF4RGlzdDsKLSAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSBjb3MoKGFuZ2xlKyhyb3RhdGUqZGlzdCpQSSkpICogZnJlcSkgKgotICAgICAgICAgICAgICAgICAgZ3JheSAqIHNhdHVyYXRlOwotICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IChNQVgoTUlOKGludGVuc2l0eSwxLjApLC0xLjApICsgMS4wKSAqIDAuNTsKLSAgICAgICAgICAgICAgICBodWUgPSAoYW5nbGUgKyBQSSkgKiBJTlZfUElfMzYwICsgYW9mZnNldDsKLSAgICAgICAgICAgICAgICBzID0gZ3JheSAqICgoZG91YmxlKShBQlMoeCkrQUJTKHkpKSAvIChkb3VibGUpKGh3ICsgaGgpKTsKLSAgICAgICAgICAgICAgICBzID0gTUlOKE1BWChzLDAuMCksIDEuMCk7Ci0gICAgICAgICAgICAgICAgdiA9IE1JTihNQVgoaW50ZW5zaXR5LDAuMCksIDEuMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocyA9PSAwLjApIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSAodWNoKSh2ICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoaHVlIDwgMC4wKSB8fCAoaHVlID49IDM2MC4wKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGh1ZSAtPSAoKChpbnQpKGh1ZSAvIDM2MC4wKSkgKiAzNjAuMCk7Ci0gICAgICAgICAgICAgICAgICAgIGh1ZSAvPSA2MC4wOwotICAgICAgICAgICAgICAgICAgICBpaSA9IChpbnQpaHVlOwotICAgICAgICAgICAgICAgICAgICBmID0gaHVlIC0gKGRvdWJsZSlpaTsKLSAgICAgICAgICAgICAgICAgICAgcCA9ICgxLjAgLSBzKSAqIHY7Ci0gICAgICAgICAgICAgICAgICAgIHEgPSAoMS4wIC0gKHMgKiBmKSkgKiB2OwotICAgICAgICAgICAgICAgICAgICB0ID0gKDEuMCAtIChzICogKDEuMCAtIGYpKSkgKiB2OwotICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpaSA9PSAwKSB7IHJlZCA9IHY7IGdyZWVuID0gdDsgYmx1ZSA9IHA7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMSkgeyByZWQgPSBxOyBncmVlbiA9IHY7IGJsdWUgPSBwOyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDIpIHsgcmVkID0gcDsgZ3JlZW4gPSB2OyBibHVlID0gdDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAzKSB7IHJlZCA9IHA7IGdyZWVuID0gcTsgYmx1ZSA9IHY7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNCkgeyByZWQgPSB0OyBncmVlbiA9IHA7IGJsdWUgPSB2OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDUpIHsgcmVkID0gdjsgZ3JlZW4gPSBwOyBibHVlID0gcTsgfQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkocmVkICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoZ3JlZW4gKiAyNTUuMCk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShibHVlICogMjU1LjApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvbmUuXG4iKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEJsYXN0IGJhY2tncm91bmQgaW1hZ2UgdG8gZGlzcGxheSBidWZmZXIgYmVmb3JlIGJlZ2lubmluZyBQTkcgZGVjb2RlLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7Ci0gICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwotICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKLQotICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7Ci0gICAgICAgICAgICBzcmMgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7ICAgIC8qIHNsaWdodGx5IG9wdGltaXplZCB2ZXJzaW9uICovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7Ci0gICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7Ci0gICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKLSAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOwotICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKLQotICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwotCi0gICAgfQotCi0gICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgMCwgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKLSAgICAgIHJwbmcyX2luZm8uaGVpZ2h0KTsKLQotICAgIHJldHVybiAwOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X2xvYWRfYmdfaW1hZ2UoKSAqLwotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3hfZGlzcGxheV9yb3codWxnIHJvdykKLXsKLSAgICB1Y2ggYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKLSAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwotICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKLSAgICB1Y2ggKnNyYywgKnNyYzI9TlVMTDsKLSAgICBjaGFyICpkZXN0OwotICAgIHVjaCByLCBnLCBiLCBhOwotICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwotICAgIHVsZyBpLCBwaXhlbDsKLSAgICBzdGF0aWMgaW50IHJvd3M9MCwgcHJldnBhc3M9KC0xKTsKLSAgICBzdGF0aWMgdWxnIGZpcnN0cm93OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHJvd3MgYW5kIGZpcnN0cm93IHNpbXBseSB0cmFjayBob3cgbWFueSByb3dzIChhbmQgd2hpY2ggb25lcykgaGF2ZSBub3QKLSAgICB5ZXQgYmVlbiBkaXNwbGF5ZWQ7IGFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGNhbGwgWFB1dEltYWdlKCkgZm9yIGV2ZXJ5Ci0gICAgcm93IGFuZCBub3QgYm90aGVyIHdpdGggdGhlIHJlY29yZHMta2VlcGluZy4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9kaXNwbGF5X3JvdygpXG4iKSkKLQotICAgIGlmIChycG5nMl9pbmZvLnBhc3MgIT0gcHJldnBhc3MpIHsKLSAgICAgICAgaWYgKHBhdXNlX2FmdGVyX3Bhc3MgJiYgcnBuZzJfaW5mby5wYXNzID4gMCkgewotICAgICAgICAgICAgWEV2ZW50IGU7Ci0gICAgICAgICAgICBLZXlTeW0gazsKLQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICIlczogIGVuZCBvZiBwYXNzICVkIG9mIDc7IGNsaWNrIGluIGltYWdlIHdpbmRvdyB0byBjb250aW51ZVxuIiwKLSAgICAgICAgICAgICAgUFJPR05BTUUsIHByZXZwYXNzICsgMSk7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwotICAgICAgICAgICAgd2hpbGUgKCFRVUlUKGUsaykpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBwYXNzICVkIG9mIDdcciIsIFBST0dOQU1FLCBycG5nMl9pbmZvLnBhc3MgKyAxKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgIHByZXZwYXNzID0gcnBuZzJfaW5mby5wYXNzOwotICAgIH0KLQotICAgIGlmIChyb3dzID09IDApCi0gICAgICAgIGZpcnN0cm93ID0gcm93OyAgIC8qIGZpcnN0IHJvdyB0aGF0IGlzIG5vdCB5ZXQgZGlzcGxheWVkICovCi0KLSAgICArK3Jvd3M7ICAgLyogY291bnQgb2Ygcm93cyByZWNlaXZlZCBidXQgbm90IHlldCBkaXNwbGF5ZWQgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0LCB0aGUgbGFjayBvZiBhbiBvdXRlciBsb29wCi0gICAgKG92ZXIgcm93cykgYW5kIG1vdmluZyB0aGUgWFB1dEltYWdlKCkgY2FsbCBvdXRzaWRlIHRoZSAiaWYgKGRlcHRoKSIKLSAgICB0ZXN0cywgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCB0byBycG5nX3hfZGlzcGxheV9pbWFnZSgpIGluIHRoZSBub24tCi0gICAgcHJvZ3Jlc3NpdmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKLSAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7Ci0KLSAgICAgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0gICAgICAgIGlmIChiZ19pbWFnZSkKLSAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKLSAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewotICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9IGI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gYmdfZ3JlZW47Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyZWQsICAgciwgYSwgYmdfcmVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewotICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKLQotICAgICAgICBzcmMgPSBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tyb3ddOwotICAgICAgICBpZiAoYmdfaW1hZ2UpCi0gICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7Ci0gICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCi0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewotICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKLSAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWJnX2JsdWUgIDw8IDgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgYmFjayBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShnLCBnLCBhLCBiZ19ncmVlbik7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKLSAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewotCi0gICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCi0KLSAgICB9Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBEaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IHJvd3Mgb3Igd2hlbiBvbiBvbmUgb2YgbGFzdCB0d28gcm93cy4gIChSZWdpb24KLSAgICBtYXkgaW5jbHVkZSBwcmV2aW91c2x5IGRpc3BsYXllZCBsaW5lcyBkdWUgdG8gaW50ZXJsYWNpbmctLWkuZS4sIG5vdAotICAgIGNvbnRpZ3VvdXMuICBBbHNvLCBzZWNvbmQtdG8tbGFzdCByb3cgaXMgZmluYWwgb25lIGluIGludGVybGFjZWQgaW1hZ2VzCi0gICAgd2l0aCBvZGQgbnVtYmVyIG9mIHJvd3MuKSAgRm9yIGRlbW9zLCBmbHVzaCAoYW5kIGRlbGF5KSBhZnRlciBldmVyeSAxNnRoCi0gICAgcm93IHNvICJzcGFyc2UiIHBhc3NlcyBkb24ndCBnbyB0d2ljZSBhcyBmYXN0LgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKGRlbW9fdGltaW5nICYmIChyb3cgLSBmaXJzdHJvdyA+PSAxNiB8fCByb3cgPj0gcnBuZzJfaW5mby5oZWlnaHQtMikpIHsKLSAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClmaXJzdHJvdywgMCwKLSAgICAgICAgICAoaW50KWZpcnN0cm93LCBycG5nMl9pbmZvLndpZHRoLCByb3cgLSBmaXJzdHJvdyArIDEpOwotICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgIHJvd3MgPSAwOwotICAgICAgICB1c2xlZXAodXNsZWVwX2R1cmF0aW9uKTsKLSAgICB9IGVsc2UKLSAgICBpZiAoIWRlbW9fdGltaW5nICYmICgocm93cyAmIDB4ZikgPT0gMCB8fCByb3cgPj0gcnBuZzJfaW5mby5oZWlnaHQtMikpIHsKLSAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClmaXJzdHJvdywgMCwKLSAgICAgICAgICAoaW50KWZpcnN0cm93LCBycG5nMl9pbmZvLndpZHRoLCByb3cgLSBmaXJzdHJvdyArIDEpOwotICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgIHJvd3MgPSAwOwotICAgIH0KLQotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkodm9pZCkKLXsKLSAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkoKVxuIikpCi0KLSAgICAvKiBsYXN0IHJvdyBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBycG5nMl94X2Rpc3BsYXlfcm93KCksIHNvIHdlCi0gICAgICogaGF2ZSBub3RoaW5nIHRvIGRvIGhlcmUgZXhjZXB0IHNldCBhIGZsYWcgYW5kIGxldCB0aGUgdXNlciBrbm93IHRoYXQKLSAgICAgKiB0aGUgaW1hZ2UgaXMgZG9uZSAqLwotCi0gICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtEb25lOwotICAgIHByaW50ZigKLSAgICAgICJEb25lLiAgUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UodWxnIHN0YXJ0Y29sLCB1bGcgc3RhcnRyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGcgd2lkdGgsIHVsZyBoZWlnaHQpCi17Ci0gICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7Ci0gICAgdWNoIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKLSAgICB1Y2ggYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7Ci0gICAgdWNoICpzcmMsICpzcmMyPU5VTEw7Ci0gICAgY2hhciAqZGVzdDsKLSAgICB1Y2ggciwgZywgYiwgYTsKLSAgICB1bGcgaSwgcm93LCBsYXN0cm93ID0gMDsKLSAgICB1bGcgcGl4ZWw7Ci0gICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7Ci0KLQotICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgZGlzcGxheSBsb29wIChpbWFnZV9jaGFubmVscyA9PSAlZClcbiIsCi0gICAgICBycG5nMl9pbmZvLmNoYW5uZWxzKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICAgKHdpZHRoID0gJWxkLCByb3dieXRlcyA9ICVkLCB4aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCi0gICAgICBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLnJvd2J5dGVzLCB4aW1hZ2Vfcm93Ynl0ZXMpKQotICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnBwID0gJWQpXG4iLCB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsKSkKLSAgICBUcmFjZSgoc3RkZXJyLCAiICAgKGJ5dGVfb3JkZXIgPSAlcylcbiIsIHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBNU0JGaXJzdD8KLSAgICAgICJNU0JGaXJzdCIgOiAoeGltYWdlLT5ieXRlX29yZGVyID09IExTQkZpcnN0PyAiTFNCRmlyc3QiIDogInVua25vd24iKSkpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgQXNpZGUgZnJvbSB0aGUgdXNlIG9mIHRoZSBycG5nMl9pbmZvIHN0cnVjdCBhbmQgb2Ygc3JjMiAoZm9yIGJhY2tncm91bmQKLSAgICBpbWFnZSksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKSBpbiB0aGUgbm9uLQotICAgIHByb2dyZXNzaXZlIHZlcnNpb24gb2YgdGhlIHByb2dyYW0tLWZvciB0aGUgc2ltcGxlIHJlYXNvbiB0aGF0IHJlZGlzcGxheQotICAgIG9mIHRoZSBpbWFnZSBhZ2FpbnN0IGEgbmV3IGJhY2tncm91bmQgaGFwcGVucyBhZnRlciB0aGUgaW1hZ2UgaXMgZnVsbHkKLSAgICBkZWNvZGVkIGFuZCB0aGVyZWZvcmUgaXMsIGJ5IGRlZmluaXRpb24sIG5vbi1wcm9ncmVzc2l2ZS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewotICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKLSAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7Ci0KLSAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gc3RhcnRyb3c7ICByb3cgPCBzdGFydHJvdytoZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7Ci0gICAgICAgICAgICBpZiAoYmdfaW1hZ2UpCi0gICAgICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKLSAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwotICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKLSNpZmRlZiBOT18yNEJJVF9NQVNLUwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoUlNoaWZ0IDwgMCk/IHJlZCAgIDw8ICgtUlNoaWZ0KSA6IHJlZCAgID4+IFJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoQlNoaWZ0IDwgMCk/IGJsdWUgIDw8ICgtQlNoaWZ0KSA6IGJsdWUgID4+IEJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICYgUk1hc2spIHwgKGdyZWVuICYgR01hc2spIHwgKGJsdWUgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBOT18yNEJJVF9NQVNLUwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoUlNoaWZ0IDwgMCk/IHJlZCAgIDw8ICgtUlNoaWZ0KSA6IHJlZCAgID4+IFJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoQlNoaWZ0IDwgMCk/IGJsdWUgIDw8ICgtQlNoaWZ0KSA6IGJsdWUgID4+IEJTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICYgUk1hc2spIHwgKGdyZWVuICYgR01hc2spIHwgKGJsdWUgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCi0gICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKLSAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIDE2KTsKLSAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKLSAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7Ci0KLSAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gc3RhcnRyb3c7ICByb3cgPCBzdGFydHJvdytoZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgc3JjID0gcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbcm93XTsKLSAgICAgICAgICAgIGlmIChiZ19pbWFnZSkKLSAgICAgICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwotICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewotICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICArK3NyYzsKLSAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICsrc3JjOwotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKLSAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19yZWQgICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYmdfYmx1ZSAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBiYWNrIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGcsIGcsIGEsIGJnX2dyZWVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwotICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAotICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCAxNik7Ci0gICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwotICAgICAgICAgICAgICAgIGxhc3Ryb3cgPSByb3cgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7Ci0KLSAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KLQotICAgIH0KLQotICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKLSAgICBpZiAobGFzdHJvdyA8IHN0YXJ0cm93K2hlaWdodCkgewotICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCi0gICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodC1sYXN0cm93KTsKLSAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwotICAgIH0KLQotICAgICh2b2lkKXN0YXJ0Y29sOwotICAgICh2b2lkKXdpZHRoOwotCi19IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlZGlzcGxheV9pbWFnZSgpICovCi0KLQotCi0KLQotI2lmZGVmIEZFQVRVUkVfTE9PUAotCi1zdGF0aWMgdm9pZCBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSh2b2lkKQotewotICAgIGNoYXIgKmRlc3Q7Ci0gICAgdWNoIHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7Ci0gICAgdWNoIHIxX2ludiwgcjJfaW52LCBnMV9pbnYsIGcyX2ludiwgYjFfaW52LCBiMl9pbnY7Ci0gICAgaW50IGssIGhtYXgsIG1heDsKLSAgICBpbnQgeGlkeCwgeWlkeCwgeWlkeF9tYXg7Ci0gICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKLSAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKLSAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKLSAgICB1bGcgaSwgcm93OwotCi0KLSAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKLSAgICB5aWR4X21heCA9IGJnc2NhbGUgLSAxOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCi0gICAgY29sb3JzIChOID09IGJnc2NhbGUpLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7Ci0gICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7Ci0gICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7Ci0gICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7Ci0gICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7Ci0gICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7Ci0gICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7Ci0gICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47Ci0gICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47Ci0gICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47Ci0gICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47Ci0gICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47Ci0gICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47Ci0KLSAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewotICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwotICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwotCi0gICAgICAgICAgICByMSA9IHIxX21pbiArIChyMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjEgPSBiMV9taW4gKyAoYjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICByMV9pbnYgPSByMV9taW4gKyAocjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgYjFfaW52ID0gYjFfbWluICsgKGIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0KLSAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzIgPSBnMl9taW4gKyAoZzJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMiA9IGIyX21pbiArIChiMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKLSAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwotICAgICAgICAgICAgZzJfaW52ID0gZzJfbWluICsgKGcyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7Ci0gICAgICAgICAgICBiMl9pbnYgPSBiMl9taW4gKyAoYjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKLQotICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewotICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwotICAgICAgICAgICAgICAgIGV2ZW5fb2RkID0gZXZlbl9vZGRfdmVydCBeIGV2ZW5fb2RkX2hvcml6OwotICAgICAgICAgICAgICAgIGludmVydF9jb2x1bW4gPQotICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW5fb2RkID09IDApIHsgICAgICAgIC8qIGdyYWRpZW50ICMxICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxX2ludjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyOyAgICAgICAvKiAgZG91Ymx5IGludmVydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjJfaW52OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCi0gICAgTS4gQ29zdGVsbG8uCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7Ci0KLSAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCi0gICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KLQotICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOwotICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwotICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwotICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOwotICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwotICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKLSAgICAgICAgICAgIGlmICh5aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKLSAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKLSAgICAgICAgICAgICAgICB4aWR4ID0gKGludCkoaSAlIGJnc2NhbGUpOwotICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKLSAgICAgICAgICAgICAgICAgICAgeGlkeCA9IGJnc2NhbGUtMSAtIHhpZHg7Ci0gICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypnMSArIChtYXgtaykqZzIpIC8gbWF4OwotICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUmFkaWFsICJzdGFyYnVyc3QiIHdpdGggYXppbXV0aGFsIHNpbnVzb2lkczsgW2V2ZW50dWFsbHkgbnVtYmVyIG9mIHNpbnUtCi0gICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KLSAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKLSAgICAgICAgdWNoIGNoOwotICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7Ci0gICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7Ci0gICAgICAgIGRvdWJsZSBhbmdsZT0wLjAsIGFvZmZzZXQ9MC4wLCBtYXhEaXN0LCBkaXN0OwotICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwotCi0gICAgICAgIGhoID0gKGludCkocnBuZzJfaW5mby5oZWlnaHQgLyAyKTsKLSAgICAgICAgaHcgPSAoaW50KShycG5nMl9pbmZvLndpZHRoIC8gMik7Ci0KLSAgICAgICAgLyogdmFyaWFibGVzIGZvciByYWRpYWwgd2F2ZXM6Ci0gICAgICAgICAqICAgYW9mZnNldDogIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSBodWUgW0NVUlJFTlRMWSBOT1QgVVNFRF0KLSAgICAgICAgICogICBmcmVxOiAgbnVtYmVyIG9mIGNvbG9yIGJlYW1zIG9yaWdpbmF0aW5nIGZyb20gdGhlIGNlbnRlcgotICAgICAgICAgKiAgIGdyYXlzcG90OiAgc2l6ZSBvZiB0aGUgZ3JheWluZyBjZW50ZXIgYXJlYSAoYW50aS1hbGlhcykKLSAgICAgICAgICogICByb3RhdGU6ICByb3RhdGlvbiBvZiB0aGUgYmVhbXMgYXMgYSBmdW5jdGlvbiBvZiByYWRpdXMKLSAgICAgICAgICogICBzYXR1cmF0ZTogIHNhdHVyYXRpb24gb2YgYmVhbXMnIHNoYXBlIGF6aW11dGhhbGx5Ci0gICAgICAgICAqLwotICAgICAgICBhbmdsZSA9IENMSVAoYW5nbGUsIDAuMCwgMzYwLjApOwotICAgICAgICBncmF5c3BvdCA9IENMSVAoYmdbcGF0XS5iZ19ncmF5LCAxLCAoaGggKyBodykpOwotICAgICAgICBmcmVxID0gTUFYKChkb3VibGUpYmdbcGF0XS5iZ19mcmVxLCAwLjApOwotICAgICAgICBzYXR1cmF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19ic2F0ICogMC4xOwotICAgICAgICByb3RhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnJvdCAqIDAuMTsKLSAgICAgICAgZ3JheSA9IDAuMDsKLSAgICAgICAgaW50ZW5zaXR5ID0gMC4wOwotICAgICAgICBtYXhEaXN0ID0gKGRvdWJsZSkoKGh3Kmh3KSArIChoaCpoaCkpOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKLSAgICAgICAgICAgIHkgPSAoaW50KShyb3cgLSBoaCk7Ci0gICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7Ci0gICAgICAgICAgICAgICAgeCA9IChpbnQpKGkgLSBodyk7Ci0gICAgICAgICAgICAgICAgYW5nbGUgPSAoeCA9PSAwKT8gUElfMiA6IGF0YW4oKGRvdWJsZSl5IC8gKGRvdWJsZSl4KTsKLSAgICAgICAgICAgICAgICBncmF5ID0gKGRvdWJsZSlNQVgoQUJTKHkpLCBBQlMoeCkpIC8gZ3JheXNwb3Q7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IE1JTigxLjAsIGdyYXkpOwotICAgICAgICAgICAgICAgIGRpc3QgPSAoZG91YmxlKSgoeCp4KSArICh5KnkpKSAvIG1heERpc3Q7Ci0gICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gY29zKChhbmdsZSsocm90YXRlKmRpc3QqUEkpKSAqIGZyZXEpICoKLSAgICAgICAgICAgICAgICAgIGdyYXkgKiBzYXR1cmF0ZTsKLSAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSAoTUFYKE1JTihpbnRlbnNpdHksMS4wKSwtMS4wKSArIDEuMCkgKiAwLjU7Ci0gICAgICAgICAgICAgICAgaHVlID0gKGFuZ2xlICsgUEkpICogSU5WX1BJXzM2MCArIGFvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcyA9IGdyYXkgKiAoKGRvdWJsZSkoQUJTKHgpK0FCUyh5KSkgLyAoZG91YmxlKShodyArIGhoKSk7Ci0gICAgICAgICAgICAgICAgcyA9IE1JTihNQVgocywwLjApLCAxLjApOwotICAgICAgICAgICAgICAgIHYgPSBNSU4oTUFYKGludGVuc2l0eSwwLjApLCAxLjApOwotCi0gICAgICAgICAgICAgICAgaWYgKHMgPT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gKHVjaCkodiAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGh1ZSA8IDAuMCkgfHwgKGh1ZSA+PSAzNjAuMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBodWUgLT0gKCgoaW50KShodWUgLyAzNjAuMCkpICogMzYwLjApOwotICAgICAgICAgICAgICAgICAgICBodWUgLz0gNjAuMDsKLSAgICAgICAgICAgICAgICAgICAgaWkgPSAoaW50KWh1ZTsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGh1ZSAtIChkb3VibGUpaWk7Ci0gICAgICAgICAgICAgICAgICAgIHAgPSAoMS4wIC0gcykgKiB2OwotICAgICAgICAgICAgICAgICAgICBxID0gKDEuMCAtIChzICogZikpICogdjsKLSAgICAgICAgICAgICAgICAgICAgdCA9ICgxLjAgLSAocyAqICgxLjAgLSBmKSkpICogdjsKLSAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoaWkgPT0gMCkgeyByZWQgPSB2OyBncmVlbiA9IHQ7IGJsdWUgPSBwOyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDEpIHsgcmVkID0gcTsgZ3JlZW4gPSB2OyBibHVlID0gcDsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAyKSB7IHJlZCA9IHA7IGdyZWVuID0gdjsgYmx1ZSA9IHQ7IH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMykgeyByZWQgPSBwOyBncmVlbiA9IHE7IGJsdWUgPSB2OyB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDQpIHsgcmVkID0gdDsgZ3JlZW4gPSBwOyBibHVlID0gdjsgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA1KSB7IHJlZCA9IHY7IGdyZWVuID0gcDsgYmx1ZSA9IHE7IH0KLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKHJlZCAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGdyZWVuICogMjU1LjApOwotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoYmx1ZSAqIDI1NS4wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlKCkgKi8KLQotCi0KLQotCi1zdGF0aWMgaW50IGlzX251bWJlcihjaGFyICpwKQotewotICAgIHdoaWxlICgqcCkgewotICAgICAgICBpZiAoIWlzZGlnaXQoKnApKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICArK3A7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLyogRkVBVFVSRV9MT09QICovCi0KLQotCi0KLQotc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwKHZvaWQpCi17Ci0gICAgaWYgKGJnX2ltYWdlICYmIGJnX2RhdGEpIHsKLSAgICAgICAgZnJlZShiZ19kYXRhKTsKLSAgICAgICAgYmdfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgewotICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7Ci0gICAgICAgIGZyZWUocnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpOwotICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHhpbWFnZSkgewotICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7Ci0gICAgICAgICAgICBmcmVlKHhpbWFnZS0+ZGF0YSk7ICAgICAgICAgICAvKiB3ZSBhbGxvY2F0ZWQgaXQsIHNvIHdlIGZyZWUgaXQgKi8KLSAgICAgICAgICAgIHhpbWFnZS0+ZGF0YSA9IChjaGFyICopTlVMTDsgIC8qICBpbnN0ZWFkIG9mIFhEZXN0cm95SW1hZ2UoKSAqLwotICAgICAgICB9Ci0gICAgICAgIFhEZXN0cm95SW1hZ2UoeGltYWdlKTsKLSAgICAgICAgeGltYWdlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV9nYykKLSAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7Ci0KLSAgICBpZiAoaGF2ZV93aW5kb3cpCi0gICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7Ci0KLSAgICBpZiAoaGF2ZV9jb2xvcm1hcCkKLSAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7Ci0KLSAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkKLSAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgcnBuZzJfeF9tc2IodWxnIHUzMnZhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDMxOyAgaSA+PSAwOyAgLS1pKSB7Ci0gICAgICAgIGlmICh1MzJ2YWwgJiAweDgwMDAwMDAwTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB1MzJ2YWwgPDw9IDE7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9ncmVnYm9vay90b3VjYW4ucG5nIGIvY29udHJpYi9ncmVnYm9vay90b3VjYW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzk2MGQ0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZ3JlZ2Jvb2svdG91Y2FuLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ3JlZ2Jvb2svd3BuZy5jIGIvY29udHJpYi9ncmVnYm9vay93cG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmUzNTIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9ncmVnYm9vay93cG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgd3BuZyAtIHNpbXBsZSBQTkctd3JpdGluZyBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BuZy5jCi0KLSAgIFRoaXMgcHJvZ3JhbSBjb252ZXJ0cyBjZXJ0YWluIE5ldFBCTSBiaW5hcnkgZmlsZXMgKGdyYXlzY2FsZSBhbmQgUkdCLAotICAgbWF4dmFsID0gMjU1KSB0byBQTkcuICBOb24taW50ZXJsYWNlZCBQTkdzIGFyZSB3cml0dGVuIHByb2dyZXNzaXZlbHk7Ci0gICBpbnRlcmxhY2VkIFBOR3MgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gaW4gb25lIG1lbW9yeS1pbnRlbnNpdmUgYmxhc3QuCi0KLSAgIFRoYW5rcyB0byBKZWFuLWxvdXAgR2FpbGx5IGZvciBwcm92aWRpbmcgdGhlIG5lY2Vzc2FyeSB0cmljayB0byByZWFkCi0gICBpbnRlcmFjdGl2ZSB0ZXh0IGZyb20gdGhlIGtleWJvYXJkIHdoaWxlIHN0ZGluIGlzIHJlZGlyZWN0ZWQuICBUaGFua3MKLSAgIHRvIENvc21pbiBUcnV0YSBmb3IgQ3lnd2luIGZpeGVzLgotCi0gICBOT1RFOiAgaW5jbHVkZXMgcHJvdmlzaW9uYWwgc3VwcG9ydCBmb3IgUE5NIHR5cGUgIjgiIChwb3J0YWJsZSBhbHBoYW1hcCkKLSAgICAgICAgICBpbWFnZXMsIHByZXN1bWVkIHRvIGJlIGEgMzItYml0IGludGVybGVhdmVkIFJHQkEgZm9ybWF0OyBubyBwcm8tCi0gICAgICAgICAgdmlzaW9uIGZvciBwb3NzaWJsZSBpbnRlcmxlYXZlZCBncmF5c2NhbGUrYWxwaGEgKDE2LWJpdCkgZm9ybWF0LgotICAgICAgICAgIFRISVMgSVMgVU5MSUtFTFkgVE8gQkVDT01FIEFOIE9GRklDSUFMIE5FVFBCTSBBTFBIQSBGT1JNQVQhCi0KLSAgIHRvIGRvOgotICAgIC0gZGVsZXRlIG91dHB1dCBmaWxlIGlmIHF1aXQgYmVmb3JlIGNhbGxpbmcgYW55IHdyaXRlcG5nIHJvdXRpbmVzCi0gICAgLSBwcm9jZXNzIGJhY2tzcGFjZSB3aXRoIC10ZXh0IG9wdGlvbiB1bmRlciBET1MvV2luPyAoY3VycmVudGx5IGdldCBeSCkKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ2hhbmdlbG9nOgotICAgIC0gMS4wMTogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKLSAgICAtIDEuMDI6ICBtb2RpZmllZCB0byBhbGxvdyBhYmJyZXZpYXRlZCBvcHRpb25zCi0gICAgLSAxLjAzOiAgcmVtb3ZlZCBleHRyYW5lb3VzIGNoYXJhY3RlciBmcm9tIHVzYWdlIHNjcmVlbjsgZml4ZWQgYnVnIGluCi0gICAgICAgICAgICAgIGNvbW1hbmQtbGluZSBwYXJzaW5nCi0gICAgLSAxLjA0OiAgZml4ZWQgRE9TL09TMi9XaW4zMiBkZXRlY3Rpb24sIGluY2x1ZGluZyBwYXJ0aWFsIEN5Z3dpbiBmaXgKLSAgICAgICAgICAgICAgKHNlZSBodHRwOi8vaG9tZS5hdHQubmV0L35wZXJsc3BpbnIvZGlmZnMvR3JlZ0Jvb2tfY3lnd2luLmRpZmYpCi0gICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKLQotICAgICAgICBbUkVQT1JURUQgQlVHICh3aW4zMiBvbmx5KTogICJjb250cmliL2dyZWdib29rL3dwbmcuYyAtIGNtZCBsaW5lCi0gICAgICAgICBkb3NlIG5vdCB3b3JrISAgSW4gb3JkZXIgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bCBJIG5lZWRlZCB0byByZWRpcmVjdAotICAgICAgICAgYm90aCBpbnB1dCBhbmQgb3V0cHV0LCB3aXRoIGN5Z3dpbiBhbmQgd2l0aCBiY2MzMiBhcyB3ZWxsLiAgVW5kZXIKLSAgICAgICAgIExpbnV4LCB0aGUgc2FtZSB3cG5nIGFwcGVhcnMgdG8gd29yayBmaW5lLiAgSSBkb24ndCBrbm93IHdoYXQgaXMKLSAgICAgICAgIHRoZSBwcm9ibGVtLiJdCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUFJPR05BTUUgICJ3cG5nIgotI2RlZmluZSBWRVJTSU9OICAgIjIuMDAgb2YgMiBKdW5lIDIwMDciCi0jZGVmaW5lIEFQUE5BTUUgICAiU2ltcGxlIFBHTS9QUE0vUEFNIHRvIFBORyBDb252ZXJ0ZXIiCi0KLSNpZiBkZWZpbmVkKF9fTVNET1NfXykgfHwgZGVmaW5lZChfX09TMl9fKQotIyAgZGVmaW5lIERPU19PUzJfVzMyCi0jZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0jICBpZm5kZWYgX19HTlVDX18gICAvKiB0cmVhdCBXaW4zMiBuYXRpdmUgcG9ydHMgb2YgZ2NjIGFzIFVuaXggZW52aXJvbm1lbnRzICovCi0jICAgIGRlZmluZSBET1NfT1MyX1czMgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4gICAgIC8qIGZvciBqbXBidWYgZGVjbGFyYXRpb24gaW4gd3JpdGVwbmcuaCAqLwotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmZGVmIERPU19PUzJfVzMyCi0jICBpbmNsdWRlIDxpby5oPiAgICAgICAvKiBmb3IgaXNhdHR5KCksIHNldG1vZGUoKSBwcm90b3R5cGVzICovCi0jICBpbmNsdWRlIDxmY250bC5oPiAgICAvKiBPX0JJTkFSWSBmb3IgZmRvcGVuKCkgd2l0aG91dCB0ZXh0IHRyYW5zbGF0aW9uICovCi0jICBpZmRlZiBfX0VNWF9fCi0jICAgIGlmbmRlZiBnZXRjaAotIyAgICAgIGRlZmluZSBnZXRjaCgpIF9yZWFkX2tiZCgwLCAxLCAwKSAgICAvKiBuZWVkIGdldGNoZSgpICovCi0jICAgIGVuZGlmCi0jICBlbHNlIC8qICFfX0VNWF9fICovCi0jICAgIGlmZGVmIF9fR08zMl9fCi0jICAgICAgaW5jbHVkZSA8cGMuaD4KLSMgICAgICBkZWZpbmUgZ2V0Y2goKSBnZXRrZXkoKSAgLyogR1JSOiAgbmVlZCBnZXRjaGUoKSAqLwotIyAgICBlbHNlCi0jICAgICAgaW5jbHVkZSA8Y29uaW8uaD4gICAgICAgIC8qIGZvciBnZXRjaGUoKSBjb25zb2xlIGlucHV0ICovCi0jICAgIGVuZGlmCi0jICBlbmRpZiAvKiA/X19FTVhfXyAqLwotIyAgZGVmaW5lIEZHRVRTKGJ1ZixsZW4sc3RyZWFtKSAgZG9zX2tiZF9nZXRzKGJ1ZixsZW4pCi0jZWxzZQotIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAvKiBmb3IgaXNhdHR5KCkgcHJvdG90eXBlICovCi0jICBkZWZpbmUgRkdFVFMgZmdldHMKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHICA6ICB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCi0KLS8qICNkZWZpbmUgRk9SQklEX0xBVElOMV9DVFJMICA6ICB0aGlzIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHJlLWVudGVyIGFueQotICAgdGV4dCB0aGF0IGluY2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycyBkaXNjb3VyYWdlZCBieSB0aGUgUE5HIHNwZWM7IHRleHQKLSAgIHRoYXQgaW5jbHVkZXMgYW4gZXNjYXBlIGNoYXJhY3RlciAoMjcpIG11c3QgYmUgcmUtZW50ZXJlZCByZWdhcmRsZXNzICovCi0KLSNpbmNsdWRlICJ3cml0ZXBuZy5oIiAgIC8qIHR5cGVkZWZzLCBjb21tb24gbWFjcm9zLCB3cml0ZXBuZyBwcm90b3R5cGVzICovCi0KLQotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyBpbnQgIHdwbmdfaXN2YWxpZF9sYXRpbjEodWNoICpwLCBpbnQgbGVuKTsKLXN0YXRpYyB2b2lkIHdwbmdfY2xlYW51cCh2b2lkKTsKLQotI2lmZGVmIERPU19PUzJfVzMyCi0gICBzdGF0aWMgY2hhciAqZG9zX2tiZF9nZXRzKGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci0jZW5kaWYKLQotCi0KLXN0YXRpYyBtYWlucHJvZ19pbmZvIHdwbmdfaW5mbzsgICAvKiBsb25lIGdsb2JhbCAqLwotCi0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotI2lmbmRlZiBET1NfT1MyX1czMgotICAgIEZJTEUgKmtleWJkOwotI2VuZGlmCi0jaWZkZWYgc2dpCi0gICAgRklMRSAqdG1wZmlsZTsgICAgICAvKiBvciB3ZSBjb3VsZCBqdXN0IHVzZSBrZXliZCwgc2luY2Ugbm8gb3ZlcmxhcCAqLwotICAgIGNoYXIgdG1wbGluZVs4MF07Ci0jZW5kaWYKLSAgICBjaGFyICppbm5hbWUgPSBOVUxMLCBvdXRuYW1lWzI1Nl07Ci0gICAgY2hhciAqcCwgcG5tY2hhciwgcG5tbGluZVsyNTZdOwotICAgIGNoYXIgKmJnc3RyLCAqdGV4dGJ1ZiA9IE5VTEw7Ci0gICAgdWxnIHJvd2J5dGVzOwotICAgIGludCByYywgbGVuID0gMDsKLSAgICBpbnQgZXJyb3IgPSAwOwotICAgIGludCB0ZXh0ID0gRkFMU0U7Ci0gICAgaW50IG1heHZhbDsKLSAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgICAvKiBqdXN0IHRoZSBsb29rdXAgdGFibGUgKi8KLSAgICBkb3VibGUgQ1JUX2V4cG9uZW50ID0gMi4yOyAgICAgICAgICAvKiBqdXN0IHRoZSBtb25pdG9yICovCi0gICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgICAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KLSAgICBkb3VibGUgZGVmYXVsdF9nYW1tYSA9IDAuMDsKLQotCi0gICAgd3BuZ19pbmZvLmluZmlsZSA9IE5VTEw7Ci0gICAgd3BuZ19pbmZvLm91dGZpbGUgPSBOVUxMOwotICAgIHdwbmdfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKLSAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzID0gTlVMTDsKLSAgICB3cG5nX2luZm8uZmlsdGVyID0gRkFMU0U7Ci0gICAgd3BuZ19pbmZvLmludGVybGFjZWQgPSBGQUxTRTsKLSAgICB3cG5nX2luZm8uaGF2ZV9iZyA9IEZBTFNFOwotICAgIHdwbmdfaW5mby5oYXZlX3RpbWUgPSBGQUxTRTsKLSAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ID0gMDsKLSAgICB3cG5nX2luZm8uZ2FtbWEgPSAwLjA7Ci0KLQotICAgIC8qIEZpcnN0IGdldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLAotICAgICAqIHRoZSBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogdGhlIGZyYW1lLWJ1ZmZlcidzIGxvb2t1cCB0YWJsZSAoTFVUKSwgaWYgYW55LiAgSWYgdGhlIFBOTSBpbWFnZQotICAgICAqIGxvb2tzIGNvcnJlY3Qgb24gdGhlIHVzZXIncyBkaXNwbGF5IHN5c3RlbSwgaXRzIGZpbGUgZ2FtbWEgaXMgdGhlCi0gICAgICogaW52ZXJzZSBvZiB0aGlzIHZhbHVlLiAgKE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QKLSAgICAgKiBvZiBMVVQgdmFsdWVzLS1lLmcuLCBPcGVuU3RlcCBoYXMgYSBsb3Qgb2Ygd2VpcmQgb25lcy0tYnV0IGl0IHNob3VsZAotICAgICAqIGNvdmVyIDk5JSBvZiB0aGUgY3VycmVudCBwb3NzaWJpbGl0aWVzLiAgVGhpcyBzZWN0aW9uIG11c3QgZW5zdXJlCi0gICAgICogdGhhdCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgaXMgcG9zaXRpdmUuKSAqLwotCi0jaWYgZGVmaW5lZChOZVhUKQotICAgIC8qIHRoaXJkLXBhcnR5IHV0aWxpdGllcyBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IExVVCBleHBvbmVudCAqLwotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKLSAgICAvKgotICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKLSAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKLSAgICAgKi8KLSNlbGlmIGRlZmluZWQoc2dpKQotICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKLSAgICAvKiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IGRvY3VtZW50ZWQgZnVuY3Rpb24gdG8KLSAgICAgKiBnZXQgdGhlICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwotICAgIHRtcGZpbGUgPSBmb3BlbigiL2V0Yy9jb25maWcvc3lzdGVtLmdsR2FtbWFWYWwiLCAiciIpOwotICAgIGlmICh0bXBmaWxlKSB7Ci0gICAgICAgIGRvdWJsZSBzZ2lfZ2FtbWE7Ci0KLSAgICAgICAgZmdldHModG1wbGluZSwgODAsIHRtcGZpbGUpOwotICAgICAgICBmY2xvc2UodG1wZmlsZSk7Ci0gICAgICAgIHNnaV9nYW1tYSA9IGF0b2YodG1wbGluZSk7Ci0gICAgICAgIGlmIChzZ2lfZ2FtbWEgPiAwLjApCi0gICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChNYWNpbnRvc2gpCi0gICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKLSAgICAvKgotICAgIGlmIChzb21lX21hY19mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm1hY19nYW1tYSkpCi0gICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7Ci0gICAgICovCi0jZWxzZQotICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KLSNlbmRpZgotCi0gICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCi0gICAgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50ID0gTFVUX2V4cG9uZW50ICogQ1JUX2V4cG9uZW50OwotCi0KLSAgICAvKiBJZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBTQ1JFRU5fR0FNTUEgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgc3VnZ2VzdGVkCi0gICAgICogKHNvbWV3aGF0IGltcHJlY2lzZWx5KSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHVzZSB0aGF0OyBvdGhlcndpc2UKLSAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5Ci0gICAgICogb3ZlcnJpZGUgdGhpcyB2aWEgYSBjb21tYW5kLWxpbmUgb3B0aW9uLiAqLwotCi0gICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkgewotICAgICAgICBkb3VibGUgZXhwb25lbnQgPSBhdG9mKHApOwotCi0gICAgICAgIGlmIChleHBvbmVudCA+IDAuMCkKLSAgICAgICAgICAgIGRlZmF1bHRfZ2FtbWEgPSAxLjAgLyBleHBvbmVudDsKLSAgICB9Ci0KLSAgICBpZiAoZGVmYXVsdF9nYW1tYSA9PSAwLjApCi0gICAgICAgIGRlZmF1bHRfZ2FtbWEgPSAxLjAgLyBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7Ci0KLQotICAgIC8qIE5vdyBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBvcHRpb25zIGFuZCB0aGUgUE5NIGZpbGVuYW1lLiAqLwotCi0gICAgd2hpbGUgKCorK2FyZ3YgJiYgIWVycm9yKSB7Ci0gICAgICAgIGlmICghc3RybmNtcCgqYXJndiwgIi1pIiwgMikpIHsKLSAgICAgICAgICAgIHdwbmdfaW5mby5pbnRlcmxhY2VkID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi10aW1lIiwgMykpIHsKLSAgICAgICAgICAgIHdwbmdfaW5mby5tb2R0aW1lID0gdGltZShOVUxMKTsKLSAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RpbWUgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXRleHQiLCAzKSkgewotICAgICAgICAgICAgdGV4dCA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewotICAgICAgICAgICAgaWYgKCEqKythcmd2KQotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uZ2FtbWEgPSBhdG9mKCphcmd2KTsKLSAgICAgICAgICAgICAgICBpZiAod3BuZ19pbmZvLmdhbW1hIDw9IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICh3cG5nX2luZm8uZ2FtbWEgPiAxLjAxKQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAiIHdhcm5pbmc6ICBmaWxlIGdhbW1hcyBhcmUgdXN1YWxseSBsZXNzIHRoYW4gMS4wXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ2NvbG9yIiwgNCkpIHsKLSAgICAgICAgICAgIGlmICghKisrYXJndikKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKLSAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGJnc3RyKSAhPSA3IHx8IGJnc3RyWzBdICE9ICcjJykKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgciwgZywgYjsgIC8qIHRoaXMgd2F5IHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICAgICAgICAgICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7Ci0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5iZ19yZWQgICA9ICh1Y2gpcjsKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmJnX2dyZWVuID0gKHVjaClnOwotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uYmdfYmx1ZSAgPSAodWNoKWI7Ci0gICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX2JnID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewotICAgICAgICAgICAgICAgIGlubmFtZSA9ICphcmd2OwotICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogb3BlbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcywgb3IgcmVnaXN0ZXIgYW4gZXJyb3IgYW5kIGFib3J0ICovCi0KLSAgICBpZiAoIWlubmFtZSkgewotICAgICAgICBpZiAoaXNhdHR5KDApKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgIjogIG11c3QgZ2l2ZSBpbnB1dCBmaWxlbmFtZSBvciBwcm92aWRlIGltYWdlIGRhdGEgdmlhIHN0ZGluXG4iKTsKLSAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgRE9TX09TMl9XMzIKLSAgICAgICAgICAgIC8qIHNvbWUgYnVnZ3kgQyBsaWJyYXJpZXMgcmVxdWlyZSBCT1RIIHNldG1vZGUoKSBhbmQgZmRvcGVuKGJpbikgKi8KLSAgICAgICAgICAgIHNldG1vZGUoZmlsZW5vKHN0ZGluKSwgT19CSU5BUlkpOwotICAgICAgICAgICAgc2V0bW9kZShmaWxlbm8oc3Rkb3V0KSwgT19CSU5BUlkpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoKHdwbmdfaW5mby5pbmZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgInJiIikpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICB1bmFibGUgdG8gcmVvcGVuIHN0ZGluIGluIGJpbmFyeSBtb2RlXG4iKTsKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoKHdwbmdfaW5mby5vdXRmaWxlID0gZmRvcGVuKGZpbGVubyhzdGRvdXQpLCAid2IiKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIHVuYWJsZSB0byByZW9wZW4gc3Rkb3V0IGluIGJpbmFyeSBtb2RlXG4iKTsKLSAgICAgICAgICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLmluZmlsZSk7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5maWx0ZXIgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgobGVuID0gc3RybGVuKGlubmFtZSkpID4gMjUwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5wdXQgZmlsZW5hbWUgaXMgdG9vIGxvbmcgWyVkIGNoYXJzXVxuIiwKLSAgICAgICAgICBsZW4pOwotICAgICAgICArK2Vycm9yOwotICAgIH0gZWxzZSBpZiAoISh3cG5nX2luZm8uaW5maWxlID0gZm9wZW4oaW5uYW1lLCAicmIiKSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIGlucHV0IGZpbGUgWyVzXVxuIiwgaW5uYW1lKTsKLSAgICAgICAgKytlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoIWVycm9yKSB7Ci0gICAgICAgIGZnZXRzKHBubWxpbmUsIDI1Niwgd3BuZ19pbmZvLmluZmlsZSk7Ci0gICAgICAgIGlmIChwbm1saW5lWzBdICE9ICdQJyB8fCAoKHBubWNoYXIgPSBwbm1saW5lWzFdKSAhPSAnNScgJiYKLSAgICAgICAgICAgIHBubWNoYXIgIT0gJzYnICYmIHBubWNoYXIgIT0gJzgnKSkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICI6ICBpbnB1dCBmaWxlIFslc10gaXMgbm90IGEgYmluYXJ5IFBHTSwgUFBNIG9yIFBBTSBmaWxlXG4iLAotICAgICAgICAgICAgICBpbm5hbWUpOwotICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdwbmdfaW5mby5wbm10eXBlID0gKGludCkocG5tY2hhciAtICcwJyk7Ci0gICAgICAgICAgICBpZiAod3BuZ19pbmZvLnBubXR5cGUgIT0gOCkKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV9iZyA9IEZBTFNFOyAgLyogbm8gbmVlZCBmb3IgYmcgaWYgb3BhcXVlICovCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZmdldHMocG5tbGluZSwgMjU2LCB3cG5nX2luZm8uaW5maWxlKTsgIC8qIGxvc2UgYW55IGNvbW1lbnRzICovCi0gICAgICAgICAgICB9IHdoaWxlIChwbm1saW5lWzBdID09ICcjJyk7Ci0gICAgICAgICAgICBzc2NhbmYocG5tbGluZSwgIiVsZCAlbGQiLCAmd3BuZ19pbmZvLndpZHRoLCAmd3BuZ19pbmZvLmhlaWdodCk7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZmdldHMocG5tbGluZSwgMjU2LCB3cG5nX2luZm8uaW5maWxlKTsgIC8qIG1vcmUgY29tbWVudCBsaW5lcyAqLwotICAgICAgICAgICAgfSB3aGlsZSAocG5tbGluZVswXSA9PSAnIycpOwotICAgICAgICAgICAgc3NjYW5mKHBubWxpbmUsICIlZCIsICZtYXh2YWwpOwotICAgICAgICAgICAgaWYgKHdwbmdfaW5mby53aWR0aCA8PSAwTCB8fCB3cG5nX2luZm8uaGVpZ2h0IDw9IDBMIHx8Ci0gICAgICAgICAgICAgICAgbWF4dmFsICE9IDI1NSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgICAgICI6ICBvbmx5IHBvc2l0aXZlIHdpZHRoL2hlaWdodCwgbWF4dmFsID09IDI1NSBhbGxvd2VkIFxuIik7Ci0gICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdwbmdfaW5mby5zYW1wbGVfZGVwdGggPSA4OyAgLyogPD09PiBtYXh2YWwgMjU1ICovCi0KLSAgICAgICAgICAgIGlmICghd3BuZ19pbmZvLmZpbHRlcikgewotICAgICAgICAgICAgICAgIC8qIG1ha2Ugb3V0bmFtZSBmcm9tIGlubmFtZSAqLwotICAgICAgICAgICAgICAgIGlmICgocCA9IHN0cnJjaHIoaW5uYW1lLCAnLicpKSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgIChwIC0gaW5uYW1lKSAhPSAobGVuIC0gNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJjcHkob3V0bmFtZSwgaW5uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KG91dG5hbWUrbGVuLCAiLnBuZyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSA0OwotICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KG91dG5hbWUsIGlubmFtZSwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KG91dG5hbWUrbGVuLCAiLnBuZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBvdXRuYW1lIGFscmVhZHkgZXhpc3RzOyBpZiBub3QsIG9wZW4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKHdwbmdfaW5mby5vdXRmaWxlID0gZm9wZW4ob3V0bmFtZSwgInJiIikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBvdXRwdXQgZmlsZSBleGlzdHMgWyVzXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5vdXRmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEod3BuZ19pbmZvLm91dGZpbGUgPSBmb3BlbihvdXRuYW1lLCAid2IiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIG91dHB1dCBmaWxlIFslc11cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0bmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICAgICAgd3BuZ19pbmZvLmluZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAod3BuZ19pbmZvLmZpbHRlcikgewotICAgICAgICAgICAgICAgIGZjbG9zZSh3cG5nX2luZm8ub3V0ZmlsZSk7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLm91dGZpbGUgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiBpZiB3ZSBoYWQgYW55IGVycm9ycywgcHJpbnQgdXNhZ2UgYW5kIGRpZSBob3JyaWJsZSBkZWF0aC4uLmFycnIhICovCi0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBBUFBOQU1FKTsKLSAgICAgICAgd3JpdGVwbmdfdmVyc2lvbl9pbmZvKCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCi0iVXNhZ2U6ICAlcyBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnXSBbLXRleHRdIFstdGltZV0gWy1pbnRlcmxhY2VdIHBubWZpbGVcbiIKLSJvcjogLi4uIHwgJXMgWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZ10gWy10ZXh0XSBbLXRpbWVdIFstaW50ZXJsYWNlXSB8IC4uLlxuIgotICAgICAgICAgIiAgICBleHAgXHR0cmFuc2Zlci1mdW5jdGlvbiBleHBvbmVudCAoYGBnYW1tYScnKSBvZiB0aGUgaW1hZ2UgaW5cbiIKLSAgICAgICAgICJcdFx0ICBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGUuZy4sIGBgJS41ZicnKTsgaWYgaW1hZ2UgbG9va3NcbiIKLSAgICAgICAgICJcdFx0ICBjb3JyZWN0IG9uIGdpdmVuIGRpc3BsYXkgc3lzdGVtLCBpbWFnZSBnYW1tYSBpcyBlcXVhbCB0b1xuIgotICAgICAgICAgIlx0XHQgIGludmVyc2Ugb2YgZGlzcGxheS1zeXN0ZW0gZXhwb25lbnQsIGkuZS4sIDEgLyAoTFVUICogQ1JUKVxuIgotICAgICAgICAgIlx0XHQgICh3aGVyZSBMVVQgPSBsb29rdXAtdGFibGUgZXhwb25lbnQgYW5kIENSVCA9IENSVCBleHBvbmVudDtcbiIKLSAgICAgICAgICJcdFx0ICBmaXJzdCB2YXJpZXMsIHNlY29uZCBpcyB1c3VhbGx5IDIuMiwgYWxsIGFyZSBwb3NpdGl2ZSlcbiIKLSAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBhbHBoYS1jaGFubmVsIGltYWdlcywgaW5cbiIKLSAgICAgICAgICJcdFx0ICA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdCAoZS5nLiwgYGAjZmY3NzAwJycgZm9yIG9yYW5nZTpcbiIKLSAgICAgICAgICJcdFx0ICBzYW1lIGFzIEhUTUwgY29sb3JzKVxuIgotICAgICAgICAgIiAgICAtdGV4dFx0cHJvbXB0IGludGVyYWN0aXZlbHkgZm9yIHRleHQgaW5mbyAodEVYdCBjaHVua3MpXG4iCi0gICAgICAgICAiICAgIC10aW1lXHRpbmNsdWRlIGEgdElNRSBjaHVuayAobGFzdCBtb2RpZmljYXRpb24gdGltZSlcbiIKLSAgICAgICAgICIgICAgLWludGVybGFjZVx0d3JpdGUgaW50ZXJsYWNlZCBQTkcgaW1hZ2VcbiIKLSAgICAgICAgICJcbiIKLSJwbm1maWxlIG9yIHN0ZGluIG11c3QgYmUgYSBiaW5hcnkgUEdNIChgUDUnKSwgUFBNIChgUDYnKSBvciAoZXh0cmVtZWx5XG4iCi0idW5vZmZpY2lhbCBhbmQgdW5zdXBwb3J0ZWQhKSBQQU0gKGBQOCcpIGZpbGUuICBDdXJyZW50bHkgaXQgaXMgcmVxdWlyZWRcbiIKLSJ0byBoYXZlIG1heHZhbCA9PSAyNTUgKGkuZS4sIG5vIHNjYWxpbmcpLiAgSWYgcG5tZmlsZSBpcyBzcGVjaWZpZWQsIGl0XG4iCi0iaXMgY29udmVydGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIFBORyBmaWxlIHdpdGggdGhlIHNhbWUgYmFzZSBuYW1lIGJ1dCBhXG4iCi0iYGAucG5nJycgZXh0ZW5zaW9uOyBmaWxlcyByZWFkIGZyb20gc3RkaW4gYXJlIGNvbnZlcnRlZCBhbmQgc2VudCB0byBzdGRvdXQuXG4iCi0iVGhlIGNvbnZlcnNpb24gaXMgcHJvZ3Jlc3NpdmUgKGxvdyBtZW1vcnkgdXNhZ2UpIHVubGVzcyBpbnRlcmxhY2luZyBpc1xuIgotInJlcXVlc3RlZDsgaW4gdGhhdCBjYXNlIHRoZSB3aG9sZSBpbWFnZSB3aWxsIGJlIGJ1ZmZlcmVkIGluIG1lbW9yeSBhbmRcbiIKLSJ3cml0dGVuIGluIG9uZSBjYWxsLlxuIgotICAgICAgICAgIlxuIiwgUFJPR05BTUUsIFBST0dOQU1FLCBkZWZhdWx0X2dhbW1hKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLQotICAgIC8qIHByZXBhcmUgdGhlIHRleHQgYnVmZmVycyBmb3IgbGlicG5nJ3MgdXNlOyBub3RlIHRoYXQgZXZlbiB0aG91Z2gKLSAgICAgKiBQTkcncyBwbmdfdGV4dCBzdHJ1Y3QgaW5jbHVkZXMgYSBsZW5ndGggZmllbGQsIHdlIGRvbid0IGhhdmUgdG8gZmlsbAotICAgICAqIGl0IG91dCAqLwotCi0gICAgaWYgKHRleHQgJiYKLSNpZm5kZWYgRE9TX09TMl9XMzIKLSAgICAgICAgKGtleWJkID0gZmRvcGVuKGZpbGVubyhzdGRlcnIpLCAiciIpKSAhPSBOVUxMICYmCi0jZW5kaWYKLSAgICAgICAgKHRleHRidWYgPSAoY2hhciAqKW1hbGxvYygoNSArIDkpKjc1KSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGludCBpLCB2YWxpZCwgcmVzdWx0OwotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJFbnRlciB0ZXh0IGluZm8gKG5vIG1vcmUgdGhhbiA3MiBjaGFyYWN0ZXJzIHBlciBsaW5lKTtcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvIHNraXAgYSBmaWVsZCwgaGl0IHRoZSA8RW50ZXI+IGtleS5cbiIpOwotICAgICAgICAvKiBub3RlOiAganVzdCA8RW50ZXI+IGxlYXZlcyBsZW4gPT0gMSAqLwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9USVRMRV9PRkZTRVQ7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgVGl0bGU6ICIpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgcFstLWxlbl0gPSAnXDAnOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby50aXRsZSA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX1RJVExFOwotICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgotICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX1RJVExFOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX1RJVExFOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9BVVRIT1JfT0ZGU0VUOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIEF1dGhvcjogIik7Ci0gICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChwW2xlbi0xXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICBwWy0tbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmF1dGhvciA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX0FVVEhPUjsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9BVVRIT1I7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfQVVUSE9SOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9ERVNDX09GRlNFVDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBEZXNjcmlwdGlvbiAodXAgdG8gOSBsaW5lcyk6XG4iKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7ICBpIDwgMTA7ICArK2kpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBbJWRdICIsIGkpOwotICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkKLSAgICAgICAgICAgICAgICAgICAgcCArPSBsZW47ICAgLyogbm93IHBvaW50cyBhdCBOVUxMOyBjaGFyIGJlZm9yZSBpcyBuZXdsaW5lICovCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobGVuID0gcCAtICh0ZXh0YnVmICsgVEVYVF9ERVNDX09GRlNFVCkpID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChwWy0xXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBbLTFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgLS1sZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5kZXNjID0gdGV4dGJ1ZiArIFRFWFRfREVTQ19PRkZTRVQ7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX0RFU0M7Ci0gICAgICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX0RFU0NfT0ZGU0VUOwotICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgotICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0RFU0M7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfREVTQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIXZhbGlkKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2YWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICBwID0gdGV4dGJ1ZiArIFRFWFRfQ09QWV9PRkZTRVQ7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgQ29weXJpZ2h0OiAiKTsKLSAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgICAgICAgaWYgKEZHRVRTKHAsIDc0LCBrZXliZCkgJiYgKGxlbiA9IHN0cmxlbihwKSkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBbbGVuLTFdID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgIHBbLS1sZW5dID0gJ1wwJzsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uY29weXJpZ2h0ID0gcDsKLSAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0IHw9IFRFWFRfQ09QWTsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9DT1BZOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0NPUFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCF2YWxpZCk7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgdmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgcCA9IHRleHRidWYgKyBURVhUX0VNQUlMX09GRlNFVDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBFLW1haWw6ICIpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICAgICBpZiAoRkdFVFMocCwgNzQsIGtleWJkKSAmJiAobGVuID0gc3RybGVuKHApKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFtsZW4tMV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgcFstLWxlbl0gPSAnXDAnOwotICAgICAgICAgICAgICAgIHdwbmdfaW5mby5lbWFpbCA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX0VNQUlMOwotICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ID0gd3BuZ19pc3ZhbGlkX2xhdGluMSgodWNoICopcCwgbGVuKSkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAiIFBST0dOQU1FICIgd2FybmluZzogIGNoYXJhY3RlciBjb2RlIgotICAgICAgICAgICAgICAgICAgICAgICIgJXUgaXMgJXNkaXNjb3VyYWdlZCBieSB0aGUgUE5HXG4gICAgc3BlY2lmaWNhdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIltmaXJzdCBvY2N1cnJlbmNlIHdhcyBhdCBjaGFyYWN0ZXIgcG9zaXRpb24gIyVkXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcFtyZXN1bHRdLCAocFtyZXN1bHRdID09IDI3KT8gInN0cm9uZ2x5ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRlcnIpOwotI2lmZGVmIEZPUkJJRF9MQVRJTjFfQ1RSTAotICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0VNQUlMOwotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBbcmVzdWx0XSA9PSAyNykgeyAgICAvKiBlc2NhcGUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGF2ZV90ZXh0ICY9IH5URVhUX0VNQUlMOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIHAgPSB0ZXh0YnVmICsgVEVYVF9VUkxfT0ZGU0VUOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgIFVSTDogIik7Ci0gICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICAgIGlmIChGR0VUUyhwLCA3NCwga2V5YmQpICYmIChsZW4gPSBzdHJsZW4ocCkpID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChwW2xlbi0xXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICBwWy0tbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLnVybCA9IHA7Ci0gICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCB8PSBURVhUX1VSTDsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCA9IHdwbmdfaXN2YWxpZF9sYXRpbjEoKHVjaCAqKXAsIGxlbikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgIiBQUk9HTkFNRSAiIHdhcm5pbmc6ICBjaGFyYWN0ZXIgY29kZSIKLSAgICAgICAgICAgICAgICAgICAgICAiICV1IGlzICVzZGlzY291cmFnZWQgYnkgdGhlIFBOR1xuICAgIHNwZWNpZmljYXRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICJbZmlyc3Qgb2NjdXJyZW5jZSB3YXMgYXQgY2hhcmFjdGVyIHBvc2l0aW9uICMlZF1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXBbcmVzdWx0XSwgKHBbcmVzdWx0XSA9PSAyNyk/ICJzdHJvbmdseSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KzEpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSNpZmRlZiBGT1JCSURfTEFUSU4xX0NUUkwKLSAgICAgICAgICAgICAgICAgICAgd3BuZ19pbmZvLmhhdmVfdGV4dCAmPSB+VEVYVF9VUkw7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gRkFMU0U7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocFtyZXN1bHRdID09IDI3KSB7ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgJj0gflRFWFRfVVJMOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghdmFsaWQpOwotCi0jaWZuZGVmIERPU19PUzJfVzMyCi0gICAgICAgIGZjbG9zZShrZXliZCk7Ci0jZW5kaWYKLQotICAgIH0gZWxzZSBpZiAodGV4dCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRleHRcbiIpOwotICAgICAgICB0ZXh0ID0gRkFMU0U7Ci0gICAgICAgIHdwbmdfaW5mby5oYXZlX3RleHQgPSAwOwotICAgIH0KLQotCi0gICAgLyogYWxsb2NhdGUgbGlicG5nIHN0dWZmLCBpbml0aWFsaXplIHRyYW5zZm9ybWF0aW9ucywgd3JpdGUgcHJlLUlEQVQgZGF0YSAqLwotCi0gICAgaWYgKChyYyA9IHdyaXRlcG5nX2luaXQoJndwbmdfaW5mbykpICE9IDApIHsKLSAgICAgICAgc3dpdGNoIChyYykgewotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIGxpYnBuZyBpbml0aWFsaXphdGlvbiBwcm9ibGVtIChsb25nam1wKVxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgaW50ZXJuYWwgbG9naWMgZXJyb3IgKHVuZXhwZWN0ZWQgUE5NIHR5cGUpXG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgdW5rbm93biB3cml0ZXBuZ19pbml0KCkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGV4aXQocmMpOwotICAgIH0KLQotCi0gICAgLyogZnJlZSB0ZXh0YnVmLCBzaW5jZSBpdCdzIGEgY29tcGxldGVseSBsb2NhbCB2YXJpYWJsZSBhbmQgYWxsIHRleHQgaW5mbwotICAgICAqIGhhcyBqdXN0IGJlZW4gd3JpdHRlbiB0byB0aGUgUE5HIGZpbGUgKi8KLQotICAgIGlmICh0ZXh0ICYmIHRleHRidWYpIHsKLSAgICAgICAgZnJlZSh0ZXh0YnVmKTsKLSAgICAgICAgdGV4dGJ1ZiA9IE5VTEw7Ci0gICAgfQotCi0KLSAgICAvKiBjYWxjdWxhdGUgcm93Ynl0ZXMgb24gYmFzaXMgb2YgaW1hZ2UgdHlwZTsgbm90ZSB0aGF0IHRoaXMgYmVjb21lcyBtdWNoCi0gICAgICogbW9yZSBjb21wbGljYXRlZCBpZiB3ZSBjaG9vc2UgdG8gc3VwcG9ydCBQQk0gdHlwZSwgQVNDSUkgUE5NIHR5cGVzLCBvcgotICAgICAqIDE2LWJpdC1wZXItc2FtcGxlIGJpbmFyeSBkYXRhIFtjdXJyZW50bHkgbm90IGFuIG9mZmljaWFsIE5ldFBCTSB0eXBlXSAqLwotCi0gICAgaWYgKHdwbmdfaW5mby5wbm10eXBlID09IDUpCi0gICAgICAgIHJvd2J5dGVzID0gd3BuZ19pbmZvLndpZHRoOwotICAgIGVsc2UgaWYgKHdwbmdfaW5mby5wbm10eXBlID09IDYpCi0gICAgICAgIHJvd2J5dGVzID0gd3BuZ19pbmZvLndpZHRoICogMzsKLSAgICBlbHNlIC8qIGlmICh3cG5nX2luZm8ucG5tdHlwZSA9PSA4KSAqLwotICAgICAgICByb3dieXRlcyA9IHdwbmdfaW5mby53aWR0aCAqIDQ7Ci0KLQotICAgIC8qIHJlYWQgYW5kIHdyaXRlIHRoZSBpbWFnZSwgZWl0aGVyIGluIGl0cyBlbnRpcmV0eSAoaWYgd3JpdGluZyBpbnRlcmxhY2VkCi0gICAgICogUE5HKSBvciByb3cgYnkgcm93IChpZiBub24taW50ZXJsYWNlZCkgKi8KLQotICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RpbmcgaW1hZ2UgZGF0YS4uLlxuIik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICBpZiAod3BuZ19pbmZvLmludGVybGFjZWQpIHsKLSAgICAgICAgbG9uZyBpOwotICAgICAgICB1bGcgYnl0ZXM7Ci0gICAgICAgIHVsZyBpbWFnZV9ieXRlcyA9IHJvd2J5dGVzICogd3BuZ19pbmZvLmhlaWdodDsgICAvKiBvdmVyZmxvdz8gKi8KLQotICAgICAgICB3cG5nX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2MoaW1hZ2VfYnl0ZXMpOwotICAgICAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzID0gKHVjaCAqKiltYWxsb2Mod3BuZ19pbmZvLmhlaWdodCpzaXplb2YodWNoICopKTsKLSAgICAgICAgaWYgKHdwbmdfaW5mby5pbWFnZV9kYXRhID09IE5VTEwgfHwgd3BuZ19pbmZvLnJvd19wb2ludGVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnkgZm9yIGltYWdlIGRhdGFcbiIpOwotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCg1KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHdwbmdfaW5mby5oZWlnaHQ7ICArK2kpCi0gICAgICAgICAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzW2ldID0gd3BuZ19pbmZvLmltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOwotICAgICAgICBieXRlcyA9IGZyZWFkKHdwbmdfaW5mby5pbWFnZV9kYXRhLCAxLCBpbWFnZV9ieXRlcywgd3BuZ19pbmZvLmluZmlsZSk7Ci0gICAgICAgIGlmIChieXRlcyAhPSBpbWFnZV9ieXRlcykgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBleHBlY3RlZCAlbHUgYnl0ZXMsIGdvdCAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIGltYWdlX2J5dGVzLCBieXRlcyk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgKGNvbnRpbnVpbmcgYW55d2F5KVxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlcG5nX2VuY29kZV9pbWFnZSgmd3BuZ19pbmZvKSAhPSAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKLSAgICAgICAgICAgICAgIjogIGxpYnBuZyBwcm9ibGVtIChsb25nam1wKSB3aGlsZSB3cml0aW5nIGltYWdlIGRhdGFcbiIpOwotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIC8qIG5vdCBpbnRlcmxhY2VkOiAgd3JpdGUgcHJvZ3Jlc3NpdmVseSAocm93IGJ5IHJvdykgKi8gewotICAgICAgICBsb25nIGo7Ci0gICAgICAgIHVsZyBieXRlczsKLQotICAgICAgICB3cG5nX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMpOwotICAgICAgICBpZiAod3BuZ19pbmZvLmltYWdlX2RhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciByb3cgZGF0YVxuIik7Ci0gICAgICAgICAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOwotICAgICAgICAgICAgd3BuZ19jbGVhbnVwKCk7Ci0gICAgICAgICAgICBleGl0KDUpOwotICAgICAgICB9Ci0gICAgICAgIGVycm9yID0gMDsKLSAgICAgICAgZm9yIChqID0gd3BuZ19pbmZvLmhlaWdodDsgIGogPiAwTDsgIC0taikgewotICAgICAgICAgICAgYnl0ZXMgPSBmcmVhZCh3cG5nX2luZm8uaW1hZ2VfZGF0YSwgMSwgcm93Ynl0ZXMsIHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICAgICAgaWYgKGJ5dGVzICE9IHJvd2J5dGVzKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCi0gICAgICAgICAgICAgICAgICAiOiAgZXhwZWN0ZWQgJWx1IGJ5dGVzLCBnb3QgJWx1IGJ5dGVzIChyb3cgJWxkKVxuIiwgcm93Ynl0ZXMsCi0gICAgICAgICAgICAgICAgICBieXRlcywgd3BuZ19pbmZvLmhlaWdodC1qKTsKLSAgICAgICAgICAgICAgICArK2Vycm9yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdyaXRlcG5nX2VuY29kZV9yb3coJndwbmdfaW5mbykgIT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQotICAgICAgICAgICAgICAgICAgIjogIGxpYnBuZyBwcm9ibGVtIChsb25nam1wKSB3aGlsZSB3cml0aW5nIHJvdyAlbGRcbiIsCi0gICAgICAgICAgICAgICAgICB3cG5nX2luZm8uaGVpZ2h0LWopOwotICAgICAgICAgICAgICAgICsrZXJyb3I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICB3cml0ZXBuZ19jbGVhbnVwKCZ3cG5nX2luZm8pOwotICAgICAgICAgICAgd3BuZ19jbGVhbnVwKCk7Ci0gICAgICAgICAgICBleGl0KDIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZXBuZ19lbmNvZGVfZmluaXNoKCZ3cG5nX2luZm8pICE9IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgZXJyb3Igb24gZmluYWwgbGlicG5nIGNhbGxcbiIpOwotICAgICAgICAgICAgd3JpdGVwbmdfY2xlYW51cCgmd3BuZ19pbmZvKTsKLSAgICAgICAgICAgIHdwbmdfY2xlYW51cCgpOwotICAgICAgICAgICAgZXhpdCgyKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogT0ssIHdlJ3JlIGRvbmUgKHN1Y2Nlc3NmdWxseSk6ICBjbGVhbiB1cCBhbGwgcmVzb3VyY2VzIGFuZCBxdWl0ICovCi0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIkRvbmUuXG4iKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgIHdyaXRlcG5nX2NsZWFudXAoJndwbmdfaW5mbyk7Ci0gICAgd3BuZ19jbGVhbnVwKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi1zdGF0aWMgaW50IHdwbmdfaXN2YWxpZF9sYXRpbjEodWNoICpwLCBpbnQgbGVuKQotewotICAgIGludCBpLCByZXN1bHQgPSAtMTsKLQotICAgIGZvciAoaSA9IDA7ICBpIDwgbGVuOyAgKytpKSB7Ci0gICAgICAgIGlmIChwW2ldID09IDEwIHx8IChwW2ldID4gMzEgJiYgcFtpXSA8IDEyNykgfHwgcFtpXSA+IDE2MCkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogY2hhcmFjdGVyIGlzIGNvbXBsZXRlbHkgT0sgKi8KLSAgICAgICAgaWYgKHJlc3VsdCA8IDAgfHwgKHBbcmVzdWx0XSAhPSAyNyAmJiBwW2ldID09IDI3KSkKLSAgICAgICAgICAgIHJlc3VsdCA9IGk7ICAgICAgICAgLyogbWFyayBsb2NhdGlvbiBvZiBmaXJzdCBxdWVzdGlvbmFibGUgb25lICovCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBvciBvZiBmaXJzdCBlc2NhcGUgY2hhcmFjdGVyIChiYWQpICovCi0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHdwbmdfY2xlYW51cCh2b2lkKQotewotICAgIGlmICh3cG5nX2luZm8ub3V0ZmlsZSkgewotICAgICAgICBmY2xvc2Uod3BuZ19pbmZvLm91dGZpbGUpOwotICAgICAgICB3cG5nX2luZm8ub3V0ZmlsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHdwbmdfaW5mby5pbmZpbGUpIHsKLSAgICAgICAgZmNsb3NlKHdwbmdfaW5mby5pbmZpbGUpOwotICAgICAgICB3cG5nX2luZm8uaW5maWxlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAod3BuZ19pbmZvLmltYWdlX2RhdGEpIHsKLSAgICAgICAgZnJlZSh3cG5nX2luZm8uaW1hZ2VfZGF0YSk7Ci0gICAgICAgIHdwbmdfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAod3BuZ19pbmZvLnJvd19wb2ludGVycykgewotICAgICAgICBmcmVlKHdwbmdfaW5mby5yb3dfcG9pbnRlcnMpOwotICAgICAgICB3cG5nX2luZm8ucm93X3BvaW50ZXJzID0gTlVMTDsKLSAgICB9Ci19Ci0KLQotCi0KLSNpZmRlZiBET1NfT1MyX1czMgotCi1zdGF0aWMgY2hhciAqZG9zX2tiZF9nZXRzKGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLSAgICBpbnQgY2gsIGNvdW50PTA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGJ1Zltjb3VudCsrXSA9IGNoID0gZ2V0Y2hlKCk7Ci0gICAgfSB3aGlsZSAoY2ggIT0gJ1xyJyAmJiBjb3VudCA8IGxlbi0xKTsKLQotICAgIGJ1Zltjb3VudC0tXSA9ICdcMCc7ICAgICAgICAvKiB0ZXJtaW5hdGUgc3RyaW5nICovCi0gICAgaWYgKGJ1Zltjb3VudF0gPT0gJ1xyJykgICAgIC8qIEVudGVyIGtleSBtYWtlcyBDUiwgc28gY2hhbmdlIHRvIG5ld2xpbmUgKi8KLSAgICAgICAgYnVmW2NvdW50XSA9ICdcbic7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7ICAgICAgLyogRW50ZXIga2V5IGRvZXMgKm5vdCogY2F1c2UgYSBuZXdsaW5lICovCi0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICByZXR1cm4gYnVmOwotfQotCi0jZW5kaWYgLyogRE9TX09TMl9XMzIgKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuYyBiL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjOTUzNC4uMDAwMDAwMAotLS0gYS9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgd3BuZyAtIHNpbXBsZSBQTkctd3JpdGluZyBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXBuZy5jCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgLyogZm9yIGV4aXQoKSBwcm90b3R5cGUgKi8KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLSNpbmNsdWRlICJwbmcuaCIgICAgICAgIC8qIGxpYnBuZyBoZWFkZXIsIGluY2x1ZGVzIHNldGptcC5oICovCi0jaW5jbHVkZSAid3JpdGVwbmcuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcHVibGljIHByb3RvdHlwZXMgKi8KLQotCi0vKiBsb2NhbCBwcm90b3R5cGUgKi8KLQotc3RhdGljIHZvaWQgd3JpdGVwbmdfZXJyb3JfaGFuZGxlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbXNnKTsKLQotCi0KLXZvaWQgd3JpdGVwbmdfdmVyc2lvbl9pbmZvKHZvaWQpCi17Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCBsaWJwbmcgJXM7IHVzaW5nIGxpYnBuZyAlcy5cbiIsCi0gICAgUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBwbmdfbGlicG5nX3Zlcik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgQ29tcGlsZWQgd2l0aCB6bGliICVzOyB1c2luZyB6bGliICVzLlxuIiwKLSAgICBaTElCX1ZFUlNJT04sIHpsaWJfdmVyc2lvbik7Ci19Ci0KLQotCi0KLS8qIHJldHVybnMgMCBmb3Igc3VjY2VzcywgMiBmb3IgbGlicG5nIHByb2JsZW0sIDQgZm9yIG91dCBvZiBtZW1vcnksIDExIGZvcgotICogIHVuZXhwZWN0ZWQgcG5tdHlwZTsgbm90ZSB0aGF0IG91dGZpbGUgbWlnaHQgYmUgc3Rkb3V0ICovCi0KLWludCB3cml0ZXBuZ19pbml0KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikKLXsKLSAgICBwbmdfc3RydWN0cCAgcG5nX3B0cjsgICAgICAgLyogbm90ZTogIHRlbXBvcmFyeSB2YXJpYWJsZXMhICovCi0gICAgcG5nX2luZm9wICBpbmZvX3B0cjsKLSAgICBpbnQgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGU7Ci0KLQotICAgIC8qIGNvdWxkIGFsc28gcmVwbGFjZSBsaWJwbmcgd2FybmluZy1oYW5kbGVyIChmaW5hbCBOVUxMKSwgYnV0IG5vIG5lZWQ6ICovCi0KLSAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QocG5nX2dldF9saWJwbmdfdmVyKE5VTEwpLCBtYWlucHJvZ19wdHIsCi0gICAgICB3cml0ZXBuZ19lcnJvcl9oYW5kbGVyLCBOVUxMKTsKLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiA0OyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KLQotICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICBpZiAoIWluZm9fcHRyKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCk7Ci0gICAgICAgIHJldHVybiA0OyAgIC8qIG91dCBvZiBtZW1vcnkgKi8KLSAgICB9Ci0KLQotICAgIC8qIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBQTkctd3JpdGluZwotICAgICAqIGxpYnBuZyBmdW5jdGlvbiwgdW5sZXNzIGFuIGFsdGVybmF0ZSBlcnJvciBoYW5kbGVyIHdhcyBpbnN0YWxsZWQtLQotICAgICAqIGJ1dCBjb21wYXRpYmxlIGVycm9yIGhhbmRsZXJzIG11c3QgZWl0aGVyIHVzZSBsb25nam1wKCkgdGhlbXNlbHZlcwotICAgICAqIChhcyBpbiB0aGlzIHByb2dyYW0pIG9yIHNvbWUgb3RoZXIgbWV0aG9kIHRvIHJldHVybiBjb250cm9sIHRvCi0gICAgICogYXBwbGljYXRpb24gY29kZSwgc28gaGVyZSB3ZSBnbzogKi8KLQotICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBtYWtlIHN1cmUgb3V0ZmlsZSBpcyAocmUpb3BlbmVkIGluIEJJTkFSWSBtb2RlICovCi0KLSAgICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBtYWlucHJvZ19wdHItPm91dGZpbGUpOwotCi0KLSAgICAvKiBzZXQgdGhlIGNvbXByZXNzaW9uIGxldmVscy0taW4gZ2VuZXJhbCwgYWx3YXlzIHdhbnQgdG8gbGVhdmUgZmlsdGVyaW5nCi0gICAgICogdHVybmVkIG9uIChleGNlcHQgZm9yIHBhbGV0dGUgaW1hZ2VzKSBhbmQgYWxsb3cgYWxsIG9mIHRoZSBmaWx0ZXJzLAotICAgICAqIHdoaWNoIGlzIHRoZSBkZWZhdWx0OyB3YW50IDMySyB6bGliIHdpbmRvdywgdW5sZXNzIGVudGlyZSBpbWFnZSBidWZmZXIKLSAgICAgKiBpcyAxNksgb3Igc21hbGxlciAodW5rbm93biBoZXJlKS0tYWxzbyB0aGUgZGVmYXVsdDsgdXN1YWxseSB3YW50IG1heAotICAgICAqIGNvbXByZXNzaW9uIChOT1QgdGhlIGRlZmF1bHQpOyBhbmQgcmVtYWluaW5nIGNvbXByZXNzaW9uIGZsYWdzIHNob3VsZAotICAgICAqIGJlIGxlZnQgYWxvbmUgKi8KLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLS8qCi0gICAgPj4gdGhpcyBpcyBkZWZhdWx0IGZvciBubyBmaWx0ZXJpbmc7IFpfRklMVEVSRUQgaXMgZGVmYXVsdCBvdGhlcndpc2U6Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLCBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgID4+IHRoZXNlIGFyZSBhbGwgZGVmYXVsdHM6Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgOCk7Ci0gKi8KLQotCi0gICAgLyogc2V0IHRoZSBpbWFnZSBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlbHkgKi8KLQotICAgIGlmIChtYWlucHJvZ19wdHItPnBubXR5cGUgPT0gNSkKLSAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7Ci0gICAgZWxzZSBpZiAobWFpbnByb2dfcHRyLT5wbm10eXBlID09IDYpCi0gICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7Ci0gICAgZWxzZSBpZiAobWFpbnByb2dfcHRyLT5wbm10eXBlID09IDgpCi0gICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICAgcmV0dXJuIDExOwotICAgIH0KLQotICAgIGludGVybGFjZV90eXBlID0gbWFpbnByb2dfcHRyLT5pbnRlcmxhY2VkPyBQTkdfSU5URVJMQUNFX0FEQU03IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FOwotCi0gICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCBtYWlucHJvZ19wdHItPndpZHRoLCBtYWlucHJvZ19wdHItPmhlaWdodCwKLSAgICAgIG1haW5wcm9nX3B0ci0+c2FtcGxlX2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKLQotICAgIGlmIChtYWlucHJvZ19wdHItPmdhbW1hID4gMC4wKQotICAgICAgICBwbmdfc2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIG1haW5wcm9nX3B0ci0+Z2FtbWEpOwotCi0gICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV9iZykgeyAgIC8qIHdlIGtub3cgaXQncyBSR0JBLCBub3QgZ3JheSthbHBoYSAqLwotICAgICAgICBwbmdfY29sb3JfMTYgIGJhY2tncm91bmQ7Ci0KLSAgICAgICAgYmFja2dyb3VuZC5yZWQgPSBtYWlucHJvZ19wdHItPmJnX3JlZDsKLSAgICAgICAgYmFja2dyb3VuZC5ncmVlbiA9IG1haW5wcm9nX3B0ci0+YmdfZ3JlZW47Ci0gICAgICAgIGJhY2tncm91bmQuYmx1ZSA9IG1haW5wcm9nX3B0ci0+YmdfYmx1ZTsKLSAgICAgICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmYmFja2dyb3VuZCk7Ci0gICAgfQotCi0gICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90aW1lKSB7Ci0gICAgICAgIHBuZ190aW1lICBtb2R0aW1lOwotCi0gICAgICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCZtb2R0aW1lLCBtYWlucHJvZ19wdHItPm1vZHRpbWUpOwotICAgICAgICBwbmdfc2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2R0aW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQpIHsKLSAgICAgICAgcG5nX3RleHQgIHRleHRbNl07Ci0gICAgICAgIGludCAgbnVtX3RleHQgPSAwOwotCi0gICAgICAgIGlmIChtYWlucHJvZ19wdHItPmhhdmVfdGV4dCAmIFRFWFRfVElUTEUpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJUaXRsZSI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT50aXRsZTsKLSAgICAgICAgICAgICsrbnVtX3RleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1haW5wcm9nX3B0ci0+aGF2ZV90ZXh0ICYgVEVYVF9BVVRIT1IpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJBdXRob3IiOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+YXV0aG9yOwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX0RFU0MpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJEZXNjcmlwdGlvbiI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT5kZXNjOwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX0NPUFkpIHsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmNvbXByZXNzaW9uID0gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORTsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLmtleSA9ICJDb3B5cmlnaHQiOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0udGV4dCA9IG1haW5wcm9nX3B0ci0+Y29weXJpZ2h0OwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX0VNQUlMKSB7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS5rZXkgPSAiRS1tYWlsIjsKLSAgICAgICAgICAgIHRleHRbbnVtX3RleHRdLnRleHQgPSBtYWlucHJvZ19wdHItPmVtYWlsOwotICAgICAgICAgICAgKytudW1fdGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbnByb2dfcHRyLT5oYXZlX3RleHQgJiBURVhUX1VSTCkgewotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgICAgICAgICAgdGV4dFtudW1fdGV4dF0ua2V5ID0gIlVSTCI7Ci0gICAgICAgICAgICB0ZXh0W251bV90ZXh0XS50ZXh0ID0gbWFpbnByb2dfcHRyLT51cmw7Ci0gICAgICAgICAgICArK251bV90ZXh0OwotICAgICAgICB9Ci0gICAgICAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dCwgbnVtX3RleHQpOwotICAgIH0KLQotCi0gICAgLyogd3JpdGUgYWxsIGNodW5rcyB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIGZpcnN0IElEQVQgKi8KLQotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotCi0gICAgLyogaWYgd2Ugd2FudGVkIHRvIHdyaXRlIGFueSBtb3JlIHRleHQgaW5mbyAqYWZ0ZXIqIHRoZSBpbWFnZSBkYXRhLCB3ZQotICAgICAqIHdvdWxkIHNldCB1cCB0ZXh0IHN0cnVjdChzKSBoZXJlIGFuZCBjYWxsIHBuZ19zZXRfdGV4dCgpIGFnYWluLCB3aXRoCi0gICAgICoganVzdCB0aGUgbmV3IGRhdGE7IHBuZ19zZXRfdElNRSgpIGNvdWxkIGFsc28gZ28gaGVyZSwgYnV0IGl0IHdvdWxkCi0gICAgICogaGF2ZSBubyBlZmZlY3Qgc2luY2Ugd2UgYWxyZWFkeSBjYWxsZWQgaXQgYWJvdmUgKG9ubHkgb25lIHRJTUUgY2h1bmsKLSAgICAgKiBhbGxvd2VkKSAqLwotCi0KLSAgICAvKiBzZXQgdXAgdGhlIHRyYW5zZm9ybWF0aW9uczogIGZvciBub3csIGp1c3QgcGFjayBsb3ctYml0LWRlcHRoIHBpeGVscwotICAgICAqIGludG8gYnl0ZXMgKG9uZSwgdHdvIG9yIGZvdXIgcGl4ZWxzIHBlciBieXRlKSAqLwotCi0gICAgcG5nX3NldF9wYWNraW5nKHBuZ19wdHIpOwotLyogIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJnNpZ19iaXQpOyAgdG8gc2NhbGUgbG93LWJpdC1kZXB0aCB2YWx1ZXMgKi8KLQotCi0gICAgLyogbWFrZSBzdXJlIHdlIHNhdmUgb3VyIHBvaW50ZXJzIGZvciB1c2UgaW4gd3JpdGVwbmdfZW5jb2RlX2ltYWdlKCkgKi8KLQotICAgIG1haW5wcm9nX3B0ci0+cG5nX3B0ciA9IHBuZ19wdHI7Ci0gICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IGluZm9fcHRyOwotCi0KLSAgICAvKiBPSywgdGhhdCdzIGFsbCB3ZSBuZWVkIHRvIGRvIGZvciBub3c7IHJldHVybiBoYXBweSAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyogcmV0dXJucyAwIGZvciBzdWNjZXNzLCAyIGZvciBsaWJwbmcgKGxvbmdqbXApIHByb2JsZW0gKi8KLQotaW50IHdyaXRlcG5nX2VuY29kZV9pbWFnZShtYWlucHJvZ19pbmZvICptYWlucHJvZ19wdHIpCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0KLSAgICAvKiBhcyBhbHdheXMsIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYQotICAgICAqIFBORy13cml0aW5nIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBOVUxMOwotICAgICAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBhbmQgbm93IHdlIGp1c3Qgd3JpdGUgdGhlIHdob2xlIGltYWdlOyBsaWJwbmcgdGFrZXMgY2FyZSBvZiBpbnRlcmxhY2luZwotICAgICAqIGZvciB1cyAqLwotCi0gICAgcG5nX3dyaXRlX2ltYWdlKHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+cm93X3BvaW50ZXJzKTsKLQotCi0gICAgLyogc2luY2UgdGhhdCdzIGl0LCB3ZSBhbHNvIGNsb3NlIG91dCB0aGUgZW5kIG9mIHRoZSBQTkcgZmlsZSBub3ctLWlmIHdlCi0gICAgICogaGFkIGFueSB0ZXh0IG9yIHRpbWUgaW5mbyB0byB3cml0ZSBhZnRlciB0aGUgSURBVHMsIHNlY29uZCBhcmd1bWVudAotICAgICAqIHdvdWxkIGJlIGluZm9fcHRyLCBidXQgd2Ugb3B0aW1pemUgc2xpZ2h0bHkgYnkgc2VuZGluZyBOVUxMIHBvaW50ZXI6ICovCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIE5VTEwpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyogcmV0dXJucyAwIGlmIHN1Y2NlZWRzLCAyIGlmIGxpYnBuZyBwcm9ibGVtICovCi0KLWludCB3cml0ZXBuZ19lbmNvZGVfcm93KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikgIC8qIE5PTi1pbnRlcmxhY2VkIG9ubHkhICovCi17Ci0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltYWlucHJvZ19wdHItPnBuZ19wdHI7Ci0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltYWlucHJvZ19wdHItPmluZm9fcHRyOwotCi0KLSAgICAvKiBhcyBhbHdheXMsIHNldGptcCgpIG11c3QgYmUgY2FsbGVkIGluIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgYQotICAgICAqIFBORy13cml0aW5nIGxpYnBuZyBmdW5jdGlvbiAqLwotCi0gICAgaWYgKHNldGptcChtYWlucHJvZ19wdHItPmptcGJ1ZikpIHsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotICAgICAgICBtYWlucHJvZ19wdHItPnBuZ19wdHIgPSBOVUxMOwotICAgICAgICBtYWlucHJvZ19wdHItPmluZm9fcHRyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0KLSAgICAvKiBpbWFnZV9kYXRhIHBvaW50cyBhdCBvdXIgb25lIHJvdyBvZiBpbWFnZSBkYXRhICovCi0KLSAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsIG1haW5wcm9nX3B0ci0+aW1hZ2VfZGF0YSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi0vKiByZXR1cm5zIDAgaWYgc3VjY2VlZHMsIDIgaWYgbGlicG5nIHByb2JsZW0gKi8KLQotaW50IHdyaXRlcG5nX2VuY29kZV9maW5pc2gobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKSAgIC8qIE5PTi1pbnRlcmxhY2VkISAqLwotewotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSAocG5nX3N0cnVjdHApbWFpbnByb2dfcHRyLT5wbmdfcHRyOwotICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbWFpbnByb2dfcHRyLT5pbmZvX3B0cjsKLQotCi0gICAgLyogYXMgYWx3YXlzLCBzZXRqbXAoKSBtdXN0IGJlIGNhbGxlZCBpbiBldmVyeSBmdW5jdGlvbiB0aGF0IGNhbGxzIGEKLSAgICAgKiBQTkctd3JpdGluZyBsaWJwbmcgZnVuY3Rpb24gKi8KLQotICAgIGlmIChzZXRqbXAobWFpbnByb2dfcHRyLT5qbXBidWYpKSB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5wbmdfcHRyID0gTlVMTDsKLSAgICAgICAgbWFpbnByb2dfcHRyLT5pbmZvX3B0ciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLQotCi0gICAgLyogY2xvc2Ugb3V0IFBORyBmaWxlOyBpZiB3ZSBoYWQgYW55IHRleHQgb3IgdGltZSBpbmZvIHRvIHdyaXRlIGFmdGVyCi0gICAgICogdGhlIElEQVRzLCBzZWNvbmQgYXJndW1lbnQgd291bGQgYmUgaW5mb19wdHI6ICovCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIE5VTEwpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotdm9pZCB3cml0ZXBuZ19jbGVhbnVwKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cikKLXsKLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1haW5wcm9nX3B0ci0+cG5nX3B0cjsKLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSAocG5nX2luZm9wKW1haW5wcm9nX3B0ci0+aW5mb19wdHI7Ci0KLSAgICBpZiAocG5nX3B0ciAmJiBpbmZvX3B0cikKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIpOwotfQotCi0KLQotCi0KLXN0YXRpYyB2b2lkIHdyaXRlcG5nX2Vycm9yX2hhbmRsZXIocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZykKLXsKLSAgICBtYWlucHJvZ19pbmZvICAqbWFpbnByb2dfcHRyOwotCi0gICAgLyogVGhpcyBmdW5jdGlvbiwgYXNpZGUgZnJvbSB0aGUgZXh0cmEgc3RlcCBvZiByZXRyaWV2aW5nIHRoZSAiZXJyb3IKLSAgICAgKiBwb2ludGVyIiAoYmVsb3cpIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGV4aXN0cyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uCi0gICAgICogcmF0aGVyIHRoYW4gd2l0aGluIGxpYnBuZywgaXMgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIGxpYnBuZydzCi0gICAgICogZGVmYXVsdCBlcnJvciBoYW5kbGVyLiAgVGhlIHNlY29uZCBwb2ludCBpcyBjcml0aWNhbDogIHNpbmNlIGJvdGgKLSAgICAgKiBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGFyZSBjYWxsZWQgZnJvbSB0aGUgc2FtZSBjb2RlLCB0aGV5IGFyZQotICAgICAqIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb21wYXRpYmxlIG5vdGlvbnMgb2YgaG93IGJpZyBhIGptcF9idWYgaXMsCi0gICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIF9CU0RfU09VUkNFIG9yIGFueXRoaW5nIGVsc2UgaGFzIChvciBoYXMgbm90KQotICAgICAqIGJlZW4gZGVmaW5lZC4gKi8KLQotICAgIGZwcmludGYoc3RkZXJyLCAid3JpdGVwbmcgbGlicG5nIGVycm9yOiAlc1xuIiwgbXNnKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgIG1haW5wcm9nX3B0ciA9IHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpOwotICAgIGlmIChtYWlucHJvZ19wdHIgPT0gTlVMTCkgeyAgICAgICAgIC8qIHdlIGFyZSBjb21wbGV0ZWx5IGhvc2VkIG5vdyAqLwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAid3JpdGVwbmcgc2V2ZXJlIGVycm9yOiAgam1wYnVmIG5vdCByZWNvdmVyYWJsZTsgdGVybWluYXRpbmcuXG4iKTsKLSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgIGV4aXQoOTkpOwotICAgIH0KLQotICAgIC8qIE5vdyB3ZSBoYXZlIG91ciBkYXRhIHN0cnVjdHVyZSB3ZSBjYW4gdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiBpdAotICAgICAqIHRvIHJldHVybiBjb250cm9sIHRvIG91ciBvd24gaGlnaGVyIGxldmVsIGNvZGUgKGFsbCB0aGUgcG9pbnRzCi0gICAgICogd2hlcmUgJ3NldGptcCcgaXMgY2FsbGVkIGluIHRoaXMgZmlsZS4pICBUaGlzIHdpbGwgd29yayB3aXRoIG90aGVyCi0gICAgICogZXJyb3IgaGFuZGxpbmcgbWVjaGFuaXNtcyBhcyB3ZWxsIC0gbGlicG5nIGFsd2F5cyBjYWxscyBwbmdfZXJyb3IKLSAgICAgKiB3aGVuIGl0IGNhbiBwcm9jZWVkIG5vIGZ1cnRoZXIsIHRodXMsIHNvIGxvbmcgYXMgdGhlIGVycm9yIGhhbmRsZXIKLSAgICAgKiBpcyBpbnRlcmNlcHRlZCwgYXBwbGljYXRpb24gY29kZSBjYW4gZG8gaXRzIG93biBlcnJvciByZWNvdmVyeS4KLSAgICAgKi8KLSAgICBsb25nam1wKG1haW5wcm9nX3B0ci0+am1wYnVmLCAxKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuaCBiL2NvbnRyaWIvZ3JlZ2Jvb2svd3JpdGVwbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiOTY2Yi4uMDAwMDAwMAotLS0gYS9jb250cmliL2dyZWdib29rL3dyaXRlcG5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgd3BuZyAtIHNpbXBsZSBQTkctd3JpdGluZyBwcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXBuZy5oCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzLCIgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZCwKLSAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCi0gICAgICBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBpbiBhbnkgd2F5IGZyb20gdGhlIHVzZSBvZgotICAgICAgdGhpcyBzb2Z0d2FyZS4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgRFVBTC1MSUNFTlNFRC4gIFlvdSBtYXkgbW9kaWZ5IGFuZC9vcgotICAgICAgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiBvbmUgb2YgdGhlCi0gICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6Ci0KLQotICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKLQotICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCi0gICAgICBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucy4KLSAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQotICAgICAgICAgdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgICAgIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0KLSAgICAgICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgR3JlZyBSb2Vsb2ZzCi0gICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgotICAgICAgICAgICAgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IGFuZCBBc3NvY2lhdGVzLgotCi0KLSAgICAgIExJQ0VOU0UgMiAoR05VIEdQTCB2MiBvciBsYXRlcik6Ci0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgVFJVRQotIyAgZGVmaW5lIFRSVUUgMQotIyAgZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICAoKGEpID4gKGIpPyAoYSkgOiAoYikpCi0jICBkZWZpbmUgTUlOKGEsYikgICgoYSkgPCAoYik/IChhKSA6IChiKSkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSMgIGRlZmluZSBUcmFjZSh4KSAge2ZwcmludGYgeCA7IGZmbHVzaChzdGRlcnIpOyBmZmx1c2goc3Rkb3V0KTt9Ci0jZWxzZQotIyAgZGVmaW5lIFRyYWNlKHgpICA7Ci0jZW5kaWYKLQotI2RlZmluZSBURVhUX1RJVExFICAgIDB4MDEKLSNkZWZpbmUgVEVYVF9BVVRIT1IgICAweDAyCi0jZGVmaW5lIFRFWFRfREVTQyAgICAgMHgwNAotI2RlZmluZSBURVhUX0NPUFkgICAgIDB4MDgKLSNkZWZpbmUgVEVYVF9FTUFJTCAgICAweDEwCi0jZGVmaW5lIFRFWFRfVVJMICAgICAgMHgyMAotCi0jZGVmaW5lIFRFWFRfVElUTEVfT0ZGU0VUICAgICAgICAwCi0jZGVmaW5lIFRFWFRfQVVUSE9SX09GRlNFVCAgICAgIDcyCi0jZGVmaW5lIFRFWFRfQ09QWV9PRkZTRVQgICAgICgyKjcyKQotI2RlZmluZSBURVhUX0VNQUlMX09GRlNFVCAgICAoMyo3MikKLSNkZWZpbmUgVEVYVF9VUkxfT0ZGU0VUICAgICAgKDQqNzIpCi0jZGVmaW5lIFRFWFRfREVTQ19PRkZTRVQgICAgICg1KjcyKQotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2g7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1c2g7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bGc7Ci0KLXR5cGVkZWYgc3RydWN0IF9tYWlucHJvZ19pbmZvIHsKLSAgICBkb3VibGUgZ2FtbWE7Ci0gICAgbG9uZyB3aWR0aDsKLSAgICBsb25nIGhlaWdodDsKLSAgICB0aW1lX3QgbW9kdGltZTsKLSAgICBGSUxFICppbmZpbGU7Ci0gICAgRklMRSAqb3V0ZmlsZTsKLSAgICB2b2lkICpwbmdfcHRyOwotICAgIHZvaWQgKmluZm9fcHRyOwotICAgIHVjaCAqaW1hZ2VfZGF0YTsKLSAgICB1Y2ggKipyb3dfcG9pbnRlcnM7Ci0gICAgY2hhciAqdGl0bGU7Ci0gICAgY2hhciAqYXV0aG9yOwotICAgIGNoYXIgKmRlc2M7Ci0gICAgY2hhciAqY29weXJpZ2h0OwotICAgIGNoYXIgKmVtYWlsOwotICAgIGNoYXIgKnVybDsKLSAgICBpbnQgZmlsdGVyOyAgICAvKiBjb21tYW5kLWxpbmUtZmlsdGVyIGZsYWcsIG5vdCBQTkcgcm93IGZpbHRlciEgKi8KLSAgICBpbnQgcG5tdHlwZTsKLSAgICBpbnQgc2FtcGxlX2RlcHRoOwotICAgIGludCBpbnRlcmxhY2VkOwotICAgIGludCBoYXZlX2JnOwotICAgIGludCBoYXZlX3RpbWU7Ci0gICAgaW50IGhhdmVfdGV4dDsKLSAgICBqbXBfYnVmIGptcGJ1ZjsKLSAgICB1Y2ggYmdfcmVkOwotICAgIHVjaCBiZ19ncmVlbjsKLSAgICB1Y2ggYmdfYmx1ZTsKLX0gbWFpbnByb2dfaW5mbzsKLQotCi0vKiBwcm90b3R5cGVzIGZvciBwdWJsaWMgZnVuY3Rpb25zIGluIHdyaXRlcG5nLmMgKi8KLQotdm9pZCB3cml0ZXBuZ192ZXJzaW9uX2luZm8odm9pZCk7Ci0KLWludCB3cml0ZXBuZ19pbml0KG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7Ci0KLWludCB3cml0ZXBuZ19lbmNvZGVfaW1hZ2UobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKLQotaW50IHdyaXRlcG5nX2VuY29kZV9yb3cobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKLQotaW50IHdyaXRlcG5nX2VuY29kZV9maW5pc2gobWFpbnByb2dfaW5mbyAqbWFpbnByb2dfcHRyKTsKLQotdm9pZCB3cml0ZXBuZ19jbGVhbnVwKG1haW5wcm9nX2luZm8gKm1haW5wcm9nX3B0cik7CmRpZmYgLS1naXQgYS9jb250cmliL2xpYnRlc3RzL2Zha2VwbmcuYyBiL2NvbnRyaWIvbGlidGVzdHMvZmFrZXBuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTEyYzE0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvbGlidGVzdHMvZmFrZXBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogRmFrZSBhIFBORyAtIGp1c3Qgd3JpdGUgaXQgb3V0IGRpcmVjdGx5LgotICoKLSAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDE0LgotICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAotICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotICogVW5pdGVkIFN0YXRlcy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8emxpYi5oPiAvKiBmb3IgY3JjMzIgKi8KLQotdm9pZAotcHV0X3VMb25nKHVMb25nIHZhbCkKLXsKLSAgIHB1dGNoYXIodmFsID4+IDI0KTsKLSAgIHB1dGNoYXIodmFsID4+IDE2KTsKLSAgIHB1dGNoYXIodmFsID4+ICA4KTsKLSAgIHB1dGNoYXIodmFsID4+ICAwKTsKLX0KLQotdm9pZAotcHV0X2NodW5rKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNodW5rLCB1SW50IGxlbmd0aCkKLXsKLSAgIHVMb25nIGNyYzsKLQotICAgcHV0X3VMb25nKGxlbmd0aC00KTsgLyogRXhjbHVkZSB0aGUgdGFnICovCi0KLSAgIGZ3cml0ZShjaHVuaywgbGVuZ3RoLCAxLCBzdGRvdXQpOwotCi0gICBjcmMgPSBjcmMzMigwLCBaX05VTEwsIDApOwotICAgcHV0X3VMb25nKGNyYzMyKGNyYywgY2h1bmssIGxlbmd0aCkpOwotfQotCi1jb25zdCB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtdID0KLXsKLSAgIDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAKLX07Ci0KLWNvbnN0IHVuc2lnbmVkIGNoYXIgSUhEUltdID0KLXsKLSAgIDczLCA3MiwgNjgsIDgyLCAvKiBJSERSICovCi0gICAwLCAwLCAwLCAxLCAvKiB3aWR0aCAqLwotICAgMCwgMCwgMCwgMSwgLyogaGVpZ2h0ICovCi0gICAxLCAvKiBiaXQgZGVwdGggKi8KLSAgIDAsIC8qIGNvbG9yIHR5cGU6IGdyZXlzY2FsZSAqLwotICAgMCwgLyogY29tcHJlc3Npb24gbWV0aG9kICovCi0gICAwLCAvKiBmaWx0ZXIgbWV0aG9kICovCi0gICAwICAvKiBpbnRlcmxhY2UgbWV0aG9kOiBub25lICovCi19OwotCi1jb25zdCB1bnNpZ25lZCBjaGFyIHVua25vd25bXSA9Ci17Ci0gICAndScsICduJywgJ0snLCAnbicgLyogInVuS24iIC0gcHJpdmF0ZSBzYWZlIHRvIGNvcHkgKi8KLX07Ci0KLWludAotbWFpbih2b2lkKQotewotICAgZndyaXRlKHNpZ25hdHVyZSwgc2l6ZW9mIHNpZ25hdHVyZSwgMSwgc3Rkb3V0KTsKLSAgIHB1dF9jaHVuayhJSERSLCBzaXplb2YgSUhEUik7Ci0KLSAgIGZvciAoOzspCi0gICAgICBwdXRfY2h1bmsodW5rbm93biwgc2l6ZW9mIHVua25vd24pOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9saWJ0ZXN0cy9nZW50ZXN0cy5zaCBiL2NvbnRyaWIvbGlidGVzdHMvZ2VudGVzdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZjhkMjMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9saWJ0ZXN0cy9nZW50ZXN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDEzIEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKLSMKLSMgTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSMKLSMgR2VuZXJhdGUgYSBzZXQgb2YgUE5HIHRlc3QgaW1hZ2VzLiAgVGhlIGltYWdlcyBhcmUgZ2VuZXJhdGVkIGluIGEKLSMgc3ViLWRpcmVjdG9yeSBjYWxsZWQgJ3Rlc3RzJyBieSBkZWZhdWx0LCBob3dldmVyIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdpbGwKLSMgY2hhbmdlIHRoYXQgbmFtZS4gIFRoZSBnZW5lcmF0aW9uIHJlcXVpcmVzIGEgYnVpbHQgdmVyc2lvbiBvZiBtYWtlcG5nIGluIHRoZQotIyBjdXJyZW50IGRpcmVjdG9yeS4KLSMKLXVzYWdlKCl7Ci0gICBleGVjID4mMgotICAgZWNobyAiJDAgWzxkaXJlY3Rvcnk+XSIKLSAgIGVjaG8gJyAgR2VuZXJhdGUgYSBzZXQgb2YgUE5HIHRlc3QgZmlsZXMgaW4gImRpcmVjdG9yeSIgKCJ0ZXN0cyIgYnkgZGVmYXVsdCknCi0gICBleGl0IDEKLX0KLQotbXA9IiRQV0QvbWFrZXBuZyIKLXRlc3QgLXggIiRtcCIgfHwgewotICAgZXhlYyA+JjIKLSAgIGVjaG8gIiQwOiB0aGUgJ21ha2VwbmcnIHByb2dyYW0gbXVzdCBleGlzdCIKLSAgIGVjaG8gIiAgaW4gdGhlIGRpcmVjdG9yeSB3aXRoaW4gd2hpY2ggdGhpcyBwcm9ncmFtOiIKLSAgIGVjaG8gIiAgICAkbXAiCi0gICBlY2hvICIgIGlzIGV4ZWN1dGVkIgotICAgdXNhZ2UKLX0KLQotIyBKdXN0IG9uZSBhcmd1bWVudDogdGhlIGRpcmVjdG9yeQotdGVzdGRpcj0idGVzdHMiCi10ZXN0ICQjIC1ndCAxICYmIHsKLSAgIHRlc3RkaXI9IiQxIgotICAgc2hpZnQKLX0KLXRlc3QgJCMgLWVxIDAgfHwgdXNhZ2UKLQotIyBUYWtlIGNhcmUgbm90IHRvIGNsb2JiZXIgc29tZXRoaW5nCi1pZiB0ZXN0IC1lICIkdGVzdGRpciIKLXRoZW4KLSAgIHRlc3QgLWQgIiR0ZXN0ZGlyIiB8fCB1c2FnZQotZWxzZQotICAgIyBta2RpciAtcCBpc24ndCBwb3J0YWJsZSwgc28gZG8gdGhlIGZvbGxvd2luZwotICAgbWtkaXIgIiR0ZXN0ZGlyIiAyPi9kZXYvbnVsbCB8fCBta2RpciAtcCAiJHRlc3RkaXIiIHx8IHVzYWdlCi1maQotCi0jIFRoaXMgZmFpbHMgaW4gYSB2ZXJ5IHNhdGlzZmFjdG9yeSB3YXkgaWYgaXQncyBub3QgYWNjZXNzaWJsZQotY2QgIiR0ZXN0ZGlyIgotOj4idGVzdCQkLnBuZyIgfHwgewotICAgZXhlYyA+JjIKLSAgIGVjaG8gIiR0ZXN0ZGlyOiBkaXJlY3Rvcnkgbm90IHdyaXRhYmxlIgotICAgdXNhZ2UKLX0KLXJtICJ0ZXN0JCQucG5nIiB8fCB7Ci0gICBleGVjID4mMgotICAgZWNobyAiJHRlc3RkaXI6IHlvdSBoYXZlIGNyZWF0ZSBidXQgbm90IHdyaXRlIHByaXZpbGVnZXMgaGVyZS4iCi0gICBlY2hvICIgIFRoaXMgaXMgdW5leHBlY3RlZC4gIFlvdSBoYXZlIGEgc3B1cmlvbjsgIiciJyJ0ZXN0JCQucG5nIiciJyIuIgotICAgZWNobyAiICBZb3UgbmVlZCB0byByZW1vdmUgdGhpcyB5b3Vyc2VsZi4gIFRyeSBhIGRpZmZlcmVudCBkaXJlY3RvcnkuIgotICAgZXhpdCAxCi19Ci0KLSMgTm93IGNhbGwgbWFrZXBuZyAoJG1wKSB0byBjcmVhdGUgZXZlcnkgZmlsZSB3ZSBjYW4gdGhpbmsgb2Ygd2l0aCBhCi0jIHJlYXNvbmFibGUgbmFtZQotZG9pdCgpewotICAgZm9yIGdhbW1hIGluICIiIC0tc1JHQiAtLWxpbmVhciAtLTEuOAotICAgZG8KLSAgICAgIGNhc2UgIiRnYW1tYSIgaW4KLSAgICAgICAgICIiKQotICAgICAgICAgICAgZ25hbWU9OzsKLSAgICAgICAgIC0tc1JHQikKLSAgICAgICAgICAgIGduYW1lPSItc3JnYiI7OwotICAgICAgICAgLS1saW5lYXIpCi0gICAgICAgICAgICBnbmFtZT0iLWxpbiI7OwotICAgICAgICAgLS0xLjgpCi0gICAgICAgICAgICBnbmFtZT0iLTE4Ijs7Ci0gICAgICAgICAqKQotICAgICAgICAgICAgZ25hbWU9Ii0kZ2FtbWEiOzsKLSAgICAgIGVzYWMKLSAgICAgICIkbXAiICRnYW1tYSAiJDEiICIkMiIgInRlc3QtJDEtJDIkZ25hbWUucG5nIgotICAgZG9uZQotfQotIwotZm9yIGN0IGluIGdyYXkgcGFsZXR0ZQotZG8KLSAgIGZvciBiZCBpbiAxIDIgNCA4Ci0gICBkbwotICAgICAgZG9pdCAiJGN0IiAiJGJkIgotICAgZG9uZQotZG9uZQotIwotZG9pdCAiZ3JheSIgIjE2IgotIwotZm9yIGN0IGluIGdyYXktYWxwaGEgcmdiIHJnYi1hbHBoYQotZG8KLSAgIGZvciBiZCBpbiA4IDE2Ci0gICBkbwotICAgICAgZG9pdCAiJGN0IiAiJGJkIgotICAgZG9uZQotZG9uZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9saWJ0ZXN0cy9tYWtlcG5nLmMgYi9jb250cmliL2xpYnRlc3RzL21ha2VwbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmZjA0OC4uMDAwMDAwMAotLS0gYS9jb250cmliL2xpYnRlc3RzL21ha2VwbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NDEgKzAsMCBAQAotLyogbWFrZXBuZy5jICovCi0jZGVmaW5lIF9JU09DOTlfU09VUkNFCi0vKiBDb3B5cmlnaHQ6ICovCi0jZGVmaW5lIENPUFlSSUdIVCAiXDI1MSAyMDEzLDIwMTUgSm9obiBDdW5uaW5naGFtIEJvd2xlciIKLS8qCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMCBbTm92ZW1iZXIgMjQsIDIwMTVdCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogTWFrZSBhIHRlc3QgUE5HIGltYWdlLiAgVGhlIGFyZ3VtZW50cyBhcmUgYXMgZm9sbG93czoKLSAqCi0gKiAgICBtYWtlcG5nIFstLXNSR0J8LS1saW5lYXJ8LS0xLjhdIFstLXRSTlNdIFstLW5vZmlsdGVyc10gXAotICogICAgICAgY29sb3ItdHlwZSBiaXQtZGVwdGggW2ZpbGUtbmFtZV0KLSAqCi0gKiBUaGUgY29sb3ItdHlwZSBtYXkgYmUgbnVtZXJpYyAoYW5kIG11c3QgbWF0Y2ggdGhlIG51bWJlcnMgdXNlZCBieSB0aGUgUE5HCi0gKiBzcGVjaWZpY2F0aW9uKSBvciBvbmUgb2YgdGhlIGZvcm1hdCBuYW1lcyBsaXN0ZWQgYmVsb3cuICBUaGUgYml0LWRlcHRoIGlzIHRoZQotICogY29tcG9uZW50IGJpdCBkZXB0aCwgb3IgdGhlIHBpeGVsIGJpdC1kZXB0aCBmb3IgYSBjb2xvci1tYXBwZWQgaW1hZ2UuCi0gKgotICogV2l0aG91dCBhbnkgb3B0aW9ucyBubyBjb2xvci1zcGFjZSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuLCB3aXRoIHRoZSBvcHRpb25zCi0gKiBhbiBzUkdCIG9yIHRoZSBhcHByb3ByaWF0ZSBnQU1BIGNodW5rIGlzIHdyaXR0ZW4uICAiMS44IiByZWZlcnMgdG8gdGhlCi0gKiBkaXNwbGF5IHN5c3RlbSB1c2VkIG9uIG9sZGVyIEFwcGxlIGNvbXB1dGVycyB0byBjb3JyZWN0IGZvciBoaWdoIGFtYmllbnQKLSAqIGxpZ2h0IGxldmVscyBpbiB0aGUgdmlld2luZyBlbnZpcm9ubWVudDsgaXQgYXBwbGllcyBhIHRyYW5zZm9ybSBvZgotICogYXBwcm94aW1hdGVseSB2YWx1ZV4oMS8xLjQ1KSB0byB0aGUgY29sb3IgdmFsdWVzIGFuZCBzbyBhIGdBTUEgY2h1bmsgb2YgNjU5MDkKLSAqIGlzIHdyaXR0ZW4gKDEuNDUvMi4yKS4KLSAqCi0gKiBUaGUgaW1hZ2UgZGF0YSBpcyBnZW5lcmF0ZWQgaW50ZXJuYWxseS4gIFVubGVzcyAtLWNvbG9yIGlzIGdpdmVuIHRoZSBpbWFnZXMKLSAqIHVzZWQgYXJlIGFzIGZvbGxvd3M6Ci0gKgotICogMSBjaGFubmVsOiBhIHNxdWFyZSBpbWFnZSB3aXRoIGEgZGlhbW9uZCwgdGhlIGxlYXN0IGx1bWlub3VzIGNvbG9ycyBhcmUgb24KLSAqICAgIHRoZSBlZGdlIG9mIHRoZSBpbWFnZSwgdGhlIG1vc3QgbHVtaW5vdXMgaW4gdGhlIGNlbnRlci4KLSAqCi0gKiAyIGNoYW5uZWxzOiB0aGUgY29sb3IgY2hhbm5lbCBpbmNyZWFzZXMgaW4gbHVtaW5vc2l0eSBmcm9tIHRvcCB0byBib3R0b20sIHRoZQotICogICAgYWxwaGEgY2hhbm5lbCBpbmNyZWFzZXMgaW4gb3BhY2l0eSBmcm9tIGxlZnQgdG8gcmlnaHQuCi0gKgotICogMyBjaGFubmVsczogbGluZWFyIGNvbWJpbmF0aW9ucyBvZiwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIGNsb2Nrd2lzZSwKLSAqICAgIGJsYWNrLCBncmVlbiwgd2hpdGUsIHJlZC4KLSAqCi0gKiA0IGNoYW5uZWxzOiBsaW5lYXIgY29tYmluYXRpb25zIG9mLCBmcm9tIHRoZSB0b3AtbGVmdCBjb3JuZXIgY2xvY2t3aXNlLAotICogICAgdHJhbnNwYXJlbnQsIHJlZCwgZ3JlZW4sIGJsdWUuCi0gKgotICogRm9yIGNvbG9yLW1hcHBlZCBpbWFnZXMgYSBmb3VyIGNoYW5uZWwgY29sb3ItbWFwIGlzIHVzZWQgYW5kIGlmIC0tdFJOUyBpcwotICogZ2l2ZW4gdGhlIFBORyBmaWxlIGhhcyBhIHRSTlMgY2h1bmssIGFzIGZvbGxvd3M6Ci0gKgotICogMS1iaXQ6IGVudHJ5IDAgaXMgdHJhbnNwYXJlbnQtcmVkLCBlbnRyeSAxIGlzIG9wYXF1ZS13aGl0ZQotICogMi1iaXQ6IGVudHJ5IDA6IHRyYW5zcGFyZW50LWdyZWVuCi0gKiAgICAgICAgZW50cnkgMTogNDAlLXJlZAotICogICAgICAgIGVudHJ5IDI6IDgwJS1ibHVlCi0gKiAgICAgICAgZW50cnkgMzogb3BhcXVlLXdoaXRlCi0gKiA0LWJpdDogdGhlIDE2IGNvbWJpbmF0aW9ucyBvZiB0aGUgMi1iaXQgY2FzZQotICogOC1iaXQ6IHRoZSAyNTYgY29tYmluYXRpb25zIG9mIHRoZSA0LWJpdCBjYXNlCi0gKgotICogVGhlIHBhbGV0dGUgYWx3YXlzIGhhcyAyXmJpdC1kZXB0aCBlbnRyaWVzIGFuZCB0aGUgdFJOUyBjaHVuayBvbmUgZmV3ZXIuICBUaGUKLSAqIGltYWdlIGlzIHRoZSAxLWNoYW5uZWwgZGlhbW9uZCwgYnV0IHVzaW5nIHBhbGV0dGUgaW5kZXgsIG5vdCBsdW1pbm9zaXR5LgotICoKLSAqIEZvciBmb3JtYXRzIG90aGVyIHRoYW4gY29sb3ItbWFwcGVkIG9uZXMgaWYgLS10Uk5TIGlzIHNwZWNpZmllZCBhIHRSTlMgY2h1bmsKLSAqIGlzIGdlbmVyYXRlZCB3aXRoIGFsbCBjaGFubmVscyBlcXVhbCB0byB0aGUgbG93IGJpdHMgb2YgMHgwMTAxLgotICoKLSAqIEltYWdlIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYWwgcGl4ZWwgZGVwdGggaW4gYml0cywgaS5lLiBjaGFubmVscyB4Ci0gKiBiaXQtZGVwdGgsIGFzIGZvbGxvd3M6Ci0gKgotICogOCBiaXRzIG9yIGxlc3M6ICAgIDY0eDY0Ci0gKiAxNiBiaXRzOiAgICAgICAgICAgMjU2eDI1NgotICogTW9yZSB0aGFuIDE2IGJpdHM6IDEwMjR4MTAyNAotICoKLSAqIFJvdyBmaWx0ZXJpbmcgaXMgdGhlIGxpYnBuZyBkZWZhdWx0IGJ1dCBtYXkgYmUgdHVybmVkIG9mZiAodGhlICdub25lJyBmaWx0ZXIKLSAqIGlzIHVzZWQgb24gZXZlcnkgcm93KSB3aXRoIHRoZSAtLW5vZmlsdGVycyBvcHRpb24uCi0gKgotICogVGhlIGltYWdlcyBhcmUgbm90IGludGVybGFjZWQuCi0gKgotICogSWYgZmlsZS1uYW1lIGlzIGdpdmVuIHRoZW4gdGhlIFBORyBpcyB3cml0dGVuIHRvIHRoYXQgZmlsZSwgZWxzZSBpdCBpcwotICogd3JpdHRlbiB0byBzdGRvdXQuICBOb3RpY2UgdGhhdCBzdGRvdXQgaXMgbm90IHN1cHBvcnRlZCBvbiBzeXN0ZW1zIHdoZXJlLCBieQotICogZGVmYXVsdCwgaXQgYXNzdW1lcyB0ZXh0IG91dHB1dDsgdGhpcyBwcm9ncmFtIG1ha2VzIG5vIGF0dGVtcHQgdG8gY2hhbmdlIHRoZQotICogdGV4dCBtb2RlIG9mIHN0ZG91dCEKLSAqCi0gKiAgICBtYWtlcG5nIC0tY29sb3I9PGNvbG9yPiAuLi4KLSAqCi0gKiBJZiAtLWNvbG9yIGlzIGdpdmVuIHRoZW4gdGhlIHdob2xlIGltYWdlIGhhcyB0aGF0IGNvbG9yLCBjb2xvci1tYXBwZWQgaW1hZ2VzCi0gKiB3aWxsIGhhdmUgZXhhY3RseSBvbmUgcGFsZXR0ZSBlbnRyeSBhbmQgYWxsIGltYWdlIGZpbGVzIHdpdGggYmUgMTZ4MTYgaW4KLSAqIHNpemUuICBUaGUgY29sb3IgdmFsdWUgaXMgMSB0byA0IGRlY2ltYWwgbnVtYmVycyBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGNvbG9yCi0gKiB0eXBlLgotICoKLSAqICAgIG1ha2VwbmcgLS1zbWFsbCAuLi4KLSAqCi0gKiBJZiAtLXNtYWxsIGlzIGdpdmVuIHRoZSBpbWFnZXMgYXJlIG5vIGxhcmdlciB0aGFuIHJlcXVpcmVkIHRvIGluY2x1ZGUgZXZlcnkKLSAqIHBvc3NpYmxlIHBpeGVsIHZhbHVlIGZvciB0aGUgZm9ybWF0LgotICoKLSAqIEZvciBmb3JtYXRzIHdpdGggcGl4ZWxzIDggYml0cyBvciBmZXdlciBpbiBzaXplIHRoZSBpbWFnZXMgY29uc2lzdCBvZiBhCi0gKiBzaW5nbGUgcm93IHdpdGggMl5waXhlbC1kZXB0aCBwaXhlbHMsIG9uZSBvZiBldmVyeSBwb3NzaWJsZSB2YWx1ZS4KLSAqCi0gKiBGb3IgZm9ybWF0cyB3aXRoIDE2LWJpdCBwaXhlbHMgYSAyNTZ4MjU2IGltYWdlIGlzIGdlbmVyYXRlZCBjb250YWluaW5nIGV2ZXJ5Ci0gKiBwb3NzaWJsZSBwaXhlbCB2YWx1ZS4KLSAqCi0gKiBGb3IgbGFyZ2VyIHBpeGVsIHNpemVzIGEgMjU2eDI1NiBpbWFnZSBpcyBnZW5lcmF0ZWQgd2hlcmUgdGhlIGZpcnN0IHJvdwotICogY29uc2lzdHMgb2YgZWFjaCBwaXhlbCB0aGF0IGhhcyBpZGVudGljYWwgYnl0ZSB2YWx1ZXMgdGhyb3VnaG91dCB0aGUgcGl4ZWwKLSAqIGZvbGxvd2VkIGJ5IHJvd3Mgd2hlcmUgdGhlIGJ5dGUgdmFsdWVzIGRpZmZlciB3aXRoaW4gdGhlIHBpeGVsLgotICoKLSAqIEluIGFsbCBjYXNlcyB0aGUgcGl4ZWwgdmFsdWVzIGFyZSBhcnJhbmdlZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIFNVQiBhbmQgVVAKLSAqIGZpbHRlcnMgZ2l2ZSBieXRlIHNlcXVlbmNlcyBmb3IgbWF4aW1hbCB6bGliIGNvbXByZXNzaW9uLiAgQnkgZGVmYXVsdCAoaWYKLSAqIC0tbm9maWx0ZXJzIGlzIG5vdCBnaXZlbikgdGhlIFNVQiBmaWx0ZXIgaXMgdXNlZCBvbiB0aGUgZmlyc3Qgcm93IGFuZCB0aGUgVVAKLSAqIGZpbHRlciBvbiBhbGwgZm9sbG93aW5nIHJvd3MuCi0gKgotICogVGhlIC0tc21hbGwgb3B0aW9uIGlzIG1lYW50IHRvIHByb3ZpZGUgZ29vZCB0ZXN0LWNhc2UgY292ZXJhZ2UsIGhvd2V2ZXIgdGhlCi0gKiBpbWFnZXMgYXJlIG5vdCBlYXN5IHRvIGV4YW1pbmUgdmlzdWFsbHkuICBXaXRob3V0IHRoZSAtLXNtYWxsIG9wdGlvbiB0aGUKLSAqIGltYWdlcyBjb250YWluIGlkZW50aWNhbCBjb2xvciB2YWx1ZXM7IHRoZSBwaXhlbCB2YWx1ZXMgYXJlIGFkanVzdGVkCi0gKiBhY2NvcmRpbmcgdG8gdGhlIGdhbW1hIGVuY29kaW5nIHdpdGggbm8gZ2FtbWEgZW5jb2RpbmcgYmVpbmcgaW50ZXJwcmV0ZWQgYXMKLSAqIHNSR0IuCi0gKgotICogTElDRU5TSU5HCi0gKiA9PT09PT09PT0KLSAqCi0gKiBUaGlzIGNvZGUgaXMgY29weXJpZ2h0IG9mIHRoZSBhdXRob3JzLCBzZWUgdGhlIENPUFlSSUdIVCBkZWZpbmUgYWJvdmUuICBUaGUKLSAqIGNvZGUgaXMgbGljZW5zZWQgYXMgYWJvdmUsIHVzaW5nIHRoZSBsaWJwbmcgbGljZW5zZS4gIFRoZSBjb2RlIGdlbmVyYXRlcwotICogaW1hZ2VzIHdoaWNoIGFyZSBzb2xlbHkgdGhlIHByb2R1Y3Qgb2YgdGhlIGNvZGU7IHRoZSBvcHRpb25zIGNob29zZSB3aGljaCBvZgotICogdGhlIG1hbnkgcG9zc2liaWxpdGllcyB0byBnZW5lcmF0ZS4gIFRoZSBpbWFnZXMgdGhhdCByZXN1bHQgKGJ1dCBub3QgdGhlIGNvZGUKLSAqIHdoaWNoIGdlbmVyYXRlcyB0aGVtKSBhcmUgbGljZW5zZWQgYXMgZGVmaW5lZCBoZXJlOgotICoKLSAqIElNUE9SVEFOVDogdGhlIENPUFlSSUdIVCAjZGVmaW5lIG11c3QgY29udGFpbiBJU08tTGF0aW4tMSBjaGFyYWN0ZXJzLCB0aGUKLSAqIElNQUdFX0xJQ0VOU0lORyAjZGVmaW5lIG11c3QgY29udGFpbiBVVEYtOCBjaGFyYWN0ZXJzLiAgVGhlICdjb3B5cmlnaHQnCi0gKiBzeW1ib2wgMHhBOVUgKFwyNTEpIGluIElTTy1MYXRpbi0xIGVuY29kaW5nIGFuZCAweEMyMHhBOSAoXDMwMlwyNTEpIGluIFVURi04LgotICovCi0jZGVmaW5lIElNQUdFX0xJQ0VOU0lORyAiRGVkaWNhdGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluIHBlciBDcmVhdGl2ZSBDb21tb25zICJcCi0gICAgImxpY2Vuc2UgXCJDQzAgMS4wXCI7IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvIgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+IC8qIGZvciBvZmZzZXRvZiAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoaXMgdGVzdCBhZ2FpbnN0IHlvdXIgaW5zdGFsbGVkIGxpYnBuZywgcmF0aGVyCi0gKiB0aGFuIHRoZSBvbmUgYmVpbmcgYnVpbHQgaGVyZToKLSAqLwotI2lmZGVmIFBOR19GUkVFU1RBTkRJTkdfVEVTVFMKLSMgIGluY2x1ZGUgPHBuZy5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgIi4uLy4uL3BuZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLS8qIFdvcmsgcm91bmQgZm9yIEdDQyBjb21wbGFpbnRzIGFib3V0IGNhc3RpbmcgYSAoZG91YmxlKSBmdW5jdGlvbiByZXN1bHQgdG8KLSAqIGFuIHVuc2lnbmVkOgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1mbG9vcnUoZG91YmxlIGQpCi17Ci0gICBkID0gZmxvb3IoZCk7Ci0gICByZXR1cm4gKHVuc2lnbmVkIGludClkOwotfQotCi1zdGF0aWMgcG5nX2J5dGUKLWZsb29yYihkb3VibGUgZCkKLXsKLSAgIGQgPSBmbG9vcihkKTsKLSAgIHJldHVybiAocG5nX2J5dGUpZDsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgaW5zZXJ0aW5nIGV4dHJhIGNodW5rcyAodGhlIC0taW5zZXJ0IGFyZ3VtZW50LCBub3QKLSAqIGRvY3VtZW50ZWQgYWJvdmUuKQotICovCi10eXBlZGVmIHN0cnVjdCBjaHVua19pbnNlcnQKLXsKLSAgIHN0cnVjdCBjaHVua19pbnNlcnQgKm5leHQ7Ci0gICB2b2lkICAgICAgICAgICAgICAgKCppbnNlcnQpKHBuZ19zdHJ1Y3RwLCBwbmdfaW5mb3AsIGludCwgcG5nX2NoYXJwcCk7Ci0gICBpbnQgICAgICAgICAgICAgICAgICBucGFyYW1zOwotICAgcG5nX2NoYXJwICAgICAgICAgICAgcGFyYW1ldGVyc1sxXTsKLX0gY2h1bmtfaW5zZXJ0OwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jaGFubmVsc19vZl90eXBlKGludCBjb2xvcl90eXBlKQotewotICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGludCBjaGFubmVscyA9IDE7Ci0KLSAgICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgICAgICBjaGFubmVscyA9IDM7Ci0KLSAgICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpCi0gICAgICAgICByZXR1cm4gY2hhbm5lbHMgKyAxOwotCi0gICAgICBlbHNlCi0gICAgICAgICByZXR1cm4gY2hhbm5lbHM7Ci0gICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBpeGVsX2RlcHRoX29mX3R5cGUoaW50IGNvbG9yX3R5cGUsIGludCBiaXRfZGVwdGgpCi17Ci0gICByZXR1cm4gY2hhbm5lbHNfb2ZfdHlwZShjb2xvcl90eXBlKSAqIGJpdF9kZXB0aDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotaW1hZ2Vfc2l6ZV9vZl90eXBlKGludCBjb2xvcl90eXBlLCBpbnQgYml0X2RlcHRoLCB1bnNpZ25lZCBpbnQgKmNvbG9ycywKLSAgIGludCBzbWFsbCkKLXsKLSAgIGlmICgqY29sb3JzKQotICAgICAgcmV0dXJuIDE2OwotCi0gICBlbHNlCi0gICB7Ci0gICAgICBpbnQgcGl4ZWxfZGVwdGggPSBwaXhlbF9kZXB0aF9vZl90eXBlKGNvbG9yX3R5cGUsIGJpdF9kZXB0aCk7Ci0KLSAgICAgIGlmIChzbWFsbCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChwaXhlbF9kZXB0aCA8PSA4KSAvKiB0aGVyZSB3aWxsIGJlIG9uZSByb3cgKi8KLSAgICAgICAgICAgIHJldHVybiAxIDw8IHBpeGVsX2RlcHRoOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMjU2OwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChwaXhlbF9kZXB0aCA8IDgpCi0gICAgICAgICByZXR1cm4gNjQ7Ci0KLSAgICAgIGVsc2UgaWYgKHBpeGVsX2RlcHRoID4gMTYpCi0gICAgICAgICByZXR1cm4gMTAyNDsKLQotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIDI1NjsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9jb2xvcihwbmdfY29sb3JwIGNvbG9yLCBwbmdfYnl0ZXAgdHJhbnMsIHVuc2lnbmVkIGludCByZWQsCi0gICB1bnNpZ25lZCBpbnQgZ3JlZW4sIHVuc2lnbmVkIGludCBibHVlLCB1bnNpZ25lZCBpbnQgYWxwaGEsCi0gICBwbmdfY29uc3RfYnl0ZXAgZ2FtbWFfdGFibGUpCi17Ci0gICBjb2xvci0+cmVkID0gZ2FtbWFfdGFibGVbcmVkXTsKLSAgIGNvbG9yLT5ncmVlbiA9IGdhbW1hX3RhYmxlW2dyZWVuXTsKLSAgIGNvbG9yLT5ibHVlID0gZ2FtbWFfdGFibGVbYmx1ZV07Ci0gICAqdHJhbnMgPSAocG5nX2J5dGUpYWxwaGE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdlbmVyYXRlX3BhbGV0dGUocG5nX2NvbG9ycCBwYWxldHRlLCBwbmdfYnl0ZXAgdHJhbnMsIGludCBiaXRfZGVwdGgsCi0gICBwbmdfY29uc3RfYnl0ZXAgZ2FtbWFfdGFibGUsIHVuc2lnbmVkIGludCAqY29sb3JzKQotewotICAgLyoKLSAgICAqIDEtYml0OiBlbnRyeSAwIGlzIHRyYW5zcGFyZW50LXJlZCwgZW50cnkgMSBpcyBvcGFxdWUtd2hpdGUKLSAgICAqIDItYml0OiBlbnRyeSAwOiB0cmFuc3BhcmVudC1ncmVlbgotICAgICogICAgICAgIGVudHJ5IDE6IDQwJS1yZWQKLSAgICAqICAgICAgICBlbnRyeSAyOiA4MCUtYmx1ZQotICAgICogICAgICAgIGVudHJ5IDM6IG9wYXF1ZS13aGl0ZQotICAgICogNC1iaXQ6IHRoZSAxNiBjb21iaW5hdGlvbnMgb2YgdGhlIDItYml0IGNhc2UKLSAgICAqIDgtYml0OiB0aGUgMjU2IGNvbWJpbmF0aW9ucyBvZiB0aGUgNC1iaXQgY2FzZQotICAgICovCi0gICBzd2l0Y2ggKGNvbG9yc1swXSkKLSAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6IC0tY29sb3JzPS4uLjogaW52YWxpZCBjb3VudCAldVxuIiwKLSAgICAgICAgICAgIGNvbG9yc1swXSk7Ci0gICAgICAgICBleGl0KDEpOwotCi0gICAgICBjYXNlIDE6Ci0gICAgICAgICBzZXRfY29sb3IocGFsZXR0ZSswLCB0cmFucyswLCBjb2xvcnNbMV0sIGNvbG9yc1sxXSwgY29sb3JzWzFdLCAyNTUsCi0gICAgICAgICAgICBnYW1tYV90YWJsZSk7Ci0gICAgICAgICByZXR1cm4gMTsKLQotICAgICAgY2FzZSAyOgotICAgICAgICAgc2V0X2NvbG9yKHBhbGV0dGUrMCwgdHJhbnMrMCwgY29sb3JzWzFdLCBjb2xvcnNbMV0sIGNvbG9yc1sxXSwKLSAgICAgICAgICAgIGNvbG9yc1syXSwgZ2FtbWFfdGFibGUpOwotICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIGNhc2UgMzoKLSAgICAgICAgIHNldF9jb2xvcihwYWxldHRlKzAsIHRyYW5zKzAsIGNvbG9yc1sxXSwgY29sb3JzWzJdLCBjb2xvcnNbM10sIDI1NSwKLSAgICAgICAgICAgIGdhbW1hX3RhYmxlKTsKLSAgICAgICAgIHJldHVybiAxOwotCi0gICAgICBjYXNlIDQ6Ci0gICAgICAgICBzZXRfY29sb3IocGFsZXR0ZSswLCB0cmFucyswLCBjb2xvcnNbMV0sIGNvbG9yc1syXSwgY29sb3JzWzNdLAotICAgICAgICAgICAgY29sb3JzWzRdLCBnYW1tYV90YWJsZSk7Ci0gICAgICAgICByZXR1cm4gMTsKLQotICAgICAgY2FzZSAwOgotICAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxKQotICAgICAgICAgewotICAgICAgICAgICAgc2V0X2NvbG9yKHBhbGV0dGUrMCwgdHJhbnMrMCwgMjU1LCAwLCAwLCAwLCBnYW1tYV90YWJsZSk7Ci0gICAgICAgICAgICBzZXRfY29sb3IocGFsZXR0ZSsxLCB0cmFucysxLCAyNTUsIDI1NSwgMjU1LCAyNTUsIGdhbW1hX3RhYmxlKTsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDFVIDw8IChiaXRfZGVwdGgvMik7IC8qIDIsIDQgb3IgMTYgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGludCB4LCB5OwotICAgICAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50IGlwID0gMDsKLQotICAgICAgICAgICAgZm9yICh4PTA7IHg8c2l6ZTsgKyt4KSBmb3IgKHk9MDsgeTxzaXplOyArK3kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpcCA9IHggKyAoc2l6ZSAqIHkpOwotCi0gICAgICAgICAgICAgICAvKiBzaXplIGlzIGF0IG1vc3QgMTYsIHNvIHRoZSBzY2FsZWQgdmFsdWUgYmVsb3cgZml0cyBpbiAxNiBiaXRzCi0gICAgICAgICAgICAgICAgKi8KLSMgICAgICAgICAgICAgIGRlZmluZSBpbnRlcnAocG9zLCBjMSwgYzIpICgocG9zICogYzEpICsgKChzaXplLXBvcykgKiBjMikpCi0jICAgICAgICAgICAgICBkZWZpbmUgeHlpbnRlcnAoeCwgeSwgYzEsIGMyLCBjMywgYzQpICgoKHNpemUgKiBzaXplIC8gMikgK1wKLSAgICAgICAgICAgICAgICAgIChpbnRlcnAoeCwgYzEsIGMyKSAqIHkgKyAoc2l6ZS15KSAqIGludGVycCh4LCBjMywgYzQpKSkgL1wKLSAgICAgICAgICAgICAgICAgIChzaXplKnNpemUpKQotCi0gICAgICAgICAgICAgICBzZXRfY29sb3IocGFsZXR0ZStpcCwgdHJhbnMraXAsCi0gICAgICAgICAgICAgICAgICAvKiBjb2xvcjogICAgZ3JlZW4sIHJlZCxibHVlLHdoaXRlICovCi0gICAgICAgICAgICAgICAgICB4eWludGVycCh4LCB5LCAgIDAsIDI1NSwgICAwLCAyNTUpLAotICAgICAgICAgICAgICAgICAgeHlpbnRlcnAoeCwgeSwgMjU1LCAgIDAsICAgMCwgMjU1KSwKLSAgICAgICAgICAgICAgICAgIHh5aW50ZXJwKHgsIHksICAgMCwgICAwLCAyNTUsIDI1NSksCi0gICAgICAgICAgICAgICAgICAvKiBhbHBoYTogICAgICAgIDAsIDEwMiwgMjA0LCAyNTUpICovCi0gICAgICAgICAgICAgICAgICB4eWludGVycCh4LCB5LCAgIDAsIDEwMiwgMjA0LCAyNTUpLAotICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gaXArMTsKLSAgICAgICAgIH0KLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF92YWx1ZShwbmdfYnl0ZXAgcm93LCBzaXplX3Qgcm93Ynl0ZXMsIHBuZ191aW50XzMyIHgsIHVuc2lnbmVkIGludCBiaXRfZGVwdGgsCi0gICBwbmdfdWludF8zMiB2YWx1ZSwgcG5nX2NvbnN0X2J5dGVwIGdhbW1hX3RhYmxlLCBkb3VibGUgY29udikKLXsKLSAgIHVuc2lnbmVkIGludCBtYXNrID0gKDFVIDw8IGJpdF9kZXB0aCktMTsKLQotICAgeCAqPSBiaXRfZGVwdGg7ICAvKiBNYXhpbXVtIHggaXMgNCoxMDI0LCBtYXhpbXVtIGJpdF9kZXB0aCBpcyAxNiAqLwotCi0gICBpZiAodmFsdWUgPD0gbWFzaykKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIG9mZnNldCA9IHggPj4gMzsKLQotICAgICAgaWYgKG9mZnNldCA8IHJvd2J5dGVzICYmIChiaXRfZGVwdGggPCAxNiB8fCBvZmZzZXQrMSA8IHJvd2J5dGVzKSkKLSAgICAgIHsKLSAgICAgICAgIHJvdyArPSBvZmZzZXQ7Ci0KLSAgICAgICAgIHN3aXRjaCAoYml0X2RlcHRoKQotICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgLyogRG9uJ3QgZ2FtbWEgY29ycmVjdCAtIHZhbHVlcyBnZXQgc21hc2hlZCAqLwotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNoaWZ0ID0gKDggLSBiaXRfZGVwdGgpIC0gKHggJiAweDdVKTsKLQotICAgICAgICAgICAgICAgICAgbWFzayA8PD0gc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCBzaGlmdCkgJiBtYXNrOwotICAgICAgICAgICAgICAgICAgKnJvdyA9IChwbmdfYnl0ZSkoKCpyb3cgJiB+bWFzaykgfCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6IGJhZCBiaXQgZGVwdGggKGludGVybmFsIGVycm9yKVxuIik7Ci0gICAgICAgICAgICAgICBleGl0KDEpOwotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgdmFsdWUgPSBmbG9vcnUoNjU1MzUqcG93KHZhbHVlLzY1NTM1Lixjb252KSsuNSk7Ci0gICAgICAgICAgICAgICAqcm93KysgPSAocG5nX2J5dGUpKHZhbHVlID4+IDgpOwotICAgICAgICAgICAgICAgKnJvdyA9IChwbmdfYnl0ZSl2YWx1ZTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgKnJvdyA9IGdhbW1hX3RhYmxlW3ZhbHVlXTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiByb3cgYnVmZmVyIG92ZXJmbG93IChpbnRlcm5hbCBlcnJvcilcbiIpOwotICAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiBjb21wb25lbnQgb3ZlcmZsb3cgKGludGVybmFsIGVycm9yKVxuIik7Ci0gICAgICBleGl0KDEpOwotICAgfQotfQotCi1zdGF0aWMgaW50IC8qIGZpbHRlciBtYXNrIGZvciByb3cgKi8KLWdlbmVyYXRlX3JvdyhwbmdfYnl0ZXAgcm93LCBzaXplX3Qgcm93Ynl0ZXMsIHVuc2lnbmVkIGludCB5LCBpbnQgY29sb3JfdHlwZSwKLSAgIGludCBiaXRfZGVwdGgsIHBuZ19jb25zdF9ieXRlcCBnYW1tYV90YWJsZSwgZG91YmxlIGNvbnYsCi0gICB1bnNpZ25lZCBpbnQgKmNvbG9ycywgaW50IHNtYWxsKQotewotICAgaW50IGZpbHRlcnMgPSAwOyAvKiBmaWxlICpNQVNLKiwgMCBtZWFucyB0aGUgZGVmYXVsdCwgbm90IE5PTkUgKi8KLSAgIHBuZ191aW50XzMyIHNpemVfbWF4ID0KLSAgICAgIGltYWdlX3NpemVfb2ZfdHlwZShjb2xvcl90eXBlLCBiaXRfZGVwdGgsIGNvbG9ycywgc21hbGwpLTE7Ci0gICBwbmdfdWludF8zMiBkZXB0aF9tYXggPSAoMVUgPDwgYml0X2RlcHRoKS0xOyAvKiB1cCB0byA2NTUzNiAqLwotCi0gICBpZiAoY29sb3JzWzBdID09IDApIGlmIChzbWFsbCkKLSAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBwaXhlbF9kZXB0aCA9IHBpeGVsX2RlcHRoX29mX3R5cGUoY29sb3JfdHlwZSwgYml0X2RlcHRoKTsKLQotICAgICAgLyogRm9yIHBpeGVsIGRlcHRocyBsZXNzIHRoYW4gMTYgZ2VuZXJhdGUgYSBzaW5nbGUgcm93IGNvbnRhaW5pbmcgYWxsIHRoZQotICAgICAgICogcG9zc2libGUgcGl4ZWwgdmFsdWVzLiAgRm9yIDE2IGdlbmVyYXRlIGFsbCA2NTUzNiBieXRlIHBhaXIKLSAgICAgICAqIGNvbWJpbmF0aW9ucyBpbiBhIDI1NngyNTYgcGl4ZWwgYXJyYXkuCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAocGl4ZWxfZGVwdGgpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBhc3NlcnQoeSA9PSAwICYmIHJvd2J5dGVzID09IDEgJiYgc2l6ZV9tYXggPT0gMSk7Ci0gICAgICAgICAgICByb3dbMF0gPSAweDZDVTsgLyogYmluYXJ5OiAwMTEwMTEwMCwgb25seSB0b3AgMiBiaXRzIHVzZWQgKi8KLSAgICAgICAgICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgYXNzZXJ0KHkgPT0gMCAmJiByb3dieXRlcyA9PSAxICYmIHNpemVfbWF4ID09IDMpOwotICAgICAgICAgICAgcm93WzBdID0gMHgxQlU7IC8qIGJpbmFyeSAwMDAxMTAxMSwgYWxsIGJpdHMgdXNlZCAqLwotICAgICAgICAgICAgZmlsdGVycyA9IFBOR19GSUxURVJfTk9ORTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBhc3NlcnQoeSA9PSAwICYmIHJvd2J5dGVzID09IDggJiYgc2l6ZV9tYXggPT0gMTUpOwotICAgICAgICAgICAgcm93WzBdID0gMHgwMVU7Ci0gICAgICAgICAgICByb3dbMV0gPSAweDIzVTsgLyogU1VCIGdpdmVzIDB4MjJVIGZvciBhbGwgZm9sbG93aW5nIGJ5dGVzICovCi0gICAgICAgICAgICByb3dbMl0gPSAweDQ1VTsKLSAgICAgICAgICAgIHJvd1szXSA9IDB4NjdVOwotICAgICAgICAgICAgcm93WzRdID0gMHg4OVU7Ci0gICAgICAgICAgICByb3dbNV0gPSAweEFCVTsKLSAgICAgICAgICAgIHJvd1s2XSA9IDB4Q0RVOwotICAgICAgICAgICAgcm93WzddID0gMHhFRlU7Ci0gICAgICAgICAgICBmaWx0ZXJzID0gUE5HX0ZJTFRFUl9TVUI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgLyogVGhlIHJvdyB3aWxsIGhhdmUgYWxsIHRoZSBwaXhlbCB2YWx1ZXMgaW4gb3JkZXIgc3RhcnRpbmcgd2l0aAotICAgICAgICAgICAgICogJzEnLCB0aGUgU1VCIGZpbHRlciB3aWxsIGNoYW5nZSBldmVyeSBieXRlIGludG8gJzEnIChpbmNsdWRpbmcKLSAgICAgICAgICAgICAqIHRoZSBsYXN0LCB3aGljaCBnZW5lcmF0ZXMgcGl4ZWwgdmFsdWUgJzAnKS4gIFNpbmNlIHRoZSBTVUIgZmlsdGVyCi0gICAgICAgICAgICAgKiBoYXMgdmFsdWUgMSB0aGlzIHNob3VsZCByZXN1bHQgaW4gbWF4aW11bSBjb21wcmVzc2lvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXNzZXJ0KHkgPT0gMCAmJiByb3dieXRlcyA9PSAyNTYgJiYgc2l6ZV9tYXggPT0gMjU1KTsKLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByb3dbc2l6ZV9tYXhdID0gMHhGRlUgJiAoc2l6ZV9tYXgrMSk7Ci0gICAgICAgICAgICAgICBpZiAoc2l6ZV9tYXggPT0gMCkKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgLS1zaXplX21heDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX1NVQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgLyogUm93cyBhcmUgZ2VuZXJhdGVkIHN1Y2ggdGhhdCBlYWNoIHJvdyBoYXMgYSBjb25zdGFudCBkaWZmZXJlbmNlCi0gICAgICAgICAgICAgKiBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGJ5dGUgb2YgZWFjaCBwaXhlbCBhbmQgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAqIGRpZmZlcmVuY2UgaW5jcmVhc2VzIGJ5IDEgYXQgZWFjaCByb3cuICBUaGUgcm93cyBzdGFydCB3aXRoIHRoZQotICAgICAgICAgICAgICogZmlyc3QgYnl0ZSB2YWx1ZSBvZiAwIGFuZCB0aGUgdmFsdWUgaW5jcmVhc2VzIHRvIDI1NSBhY3Jvc3MgdGhlCi0gICAgICAgICAgICAgKiByb3cuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogVGhlIGRpZmZlcmVuY2Ugc3RhcnRzIGF0IDEsIHNvIHRoZSBmaXJzdCByb3cgaXM6Ci0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogICAgIDAgMSAxIDIgMiAzIDMgNCAuLi4gMjU0IDI1NSAyNTUgMAotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFRoaXMgbWVhbnMgdGhhdCBydW5uaW5nIHRoZSBTVUIgZmlsdGVyIG9uIHRoZSBmaXJzdCByb3cgcHJvZHVjZXM6Ci0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogICBbU1VCPT0xXSAwIDEgMCAxIDAgMS4uLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFRoZW4gdGhlIGRpZmZlcmVuY2UgaXMgMiBvbiB0aGUgbmV4dCByb3csIGdpdmluZzoKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgICAwIDIgMSAzIDIgNCAzIDUgLi4uIDI1NCAwIDI1NSAxCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogV2hlbiB0aGUgVVAgZmlsdGVyIGlzIHJ1biBvbiB0aGlzIGxpYnBuZyBwcm9kdWNlczoKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgIFtVUCA9PTJdIDAgMSAwIDEgMCAxLi4uCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogQW5kIHNvIG9uIGZvciBhbGwgdGhlIHJlbWFpbiByb3dzIHRvIHRoZSBmaW5hbCB0d28gKiByb3dzOgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAgIHJvdyAyNTQ6IDAgMjU1IDEgMCAyIDEgMyAyIDQgMyAuLi4gMjU0IDI1MyAyNTUgMjU0Ci0gICAgICAgICAgICAgKiAgICByb3cgMjU1OiAwICAgMCAxIDEgMiAyIDMgMyA0IDQgLi4uIDI1NCAyNTQgMjU1IDI1NQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhc3NlcnQocm93Ynl0ZXMgPT0gNTEyICYmIHNpemVfbWF4ID09IDI1NSk7Ci0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcm93WzIqc2l6ZV9tYXggIF0gPSAweEZGVSAmIHNpemVfbWF4OwotICAgICAgICAgICAgICAgcm93WzIqc2l6ZV9tYXgrMV0gPSAweEZGVSAmIChzaXplX21heCt5KzEpOwotICAgICAgICAgICAgICAgaWYgKHNpemVfbWF4ID09IDApCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIC0tc2l6ZV9tYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBUaGUgZmlyc3Qgcm93IG11c3QgaW5jbHVkZSBQTkdfRklMVEVSX1VQIHNvIHRoYXQgbGlicG5nIGtub3dzIHdlCi0gICAgICAgICAgICAgKiBuZWVkIHRvIGtlZXAgaXQgZm9yIHRoZSBmb2xsb3dpbmcgcm93OgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmaWx0ZXJzID0gKHkgPT0gMCA/IFBOR19GSUxURVJfU1VCK1BOR19GSUxURVJfVVAgOiBQTkdfRklMVEVSX1VQKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDI0OgotICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgLyogVGhlIHJvd3MgYXJlIGZpbGxlZCBieSBhbiBhbG9nb3JpdGhtIHNpbWlsYXIgdG8gdGhlIGFib3ZlLCBpbiB0aGUKLSAgICAgICAgICAgICAqIGZpcnN0IHJvdyBwaXhlbCBieXRlcyBhcmUgYWxsIGVxdWFsLCBpbmNyZWFzaW5nIGZyb20gMCBieSAxIGZvcgotICAgICAgICAgICAgICogZWFjaCBwaXhlbC4gIEluIHRoZSBzZWNvbmQgcm93IHRoZSBieXRlcyB3aXRoaW4gYSBwaXhlbCBhcmUKLSAgICAgICAgICAgICAqIGluY3JlbWVudGVkIDEsMyw1LDcsLi4uIGZyb20gdGhlIHByZXZpb3VzIHJvdyBieXRlLiAgVXNpbmcgYW4gb2RkCi0gICAgICAgICAgICAgKiBudW1iZXIgZW5zdXJlcyBhbGwgdGhlIHBvc3NpYmxlIGJ5dGUgdmFsdWVzIGFyZSB1c2VkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhc3NlcnQoc2l6ZV9tYXggPT0gMjU1ICYmIHJvd2J5dGVzID09IDI1NioocGl4ZWxfZGVwdGg+PjMpKTsKLSAgICAgICAgICAgIHBpeGVsX2RlcHRoID4+PSAzOyAvKiBub3cgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgIHdoaWxlIChyb3dieXRlcyA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjb25zdCBzaXplX3QgcGl4ZWxfaW5kZXggPSAtLXJvd2J5dGVzL3BpeGVsX2RlcHRoOwotCi0gICAgICAgICAgICAgICBpZiAoeSA9PSAwKQotICAgICAgICAgICAgICAgICAgcm93W3Jvd2J5dGVzXSA9IDB4RkZVICYgcGl4ZWxfaW5kZXg7Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBieXRlX29mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICByb3dieXRlcyAtIHBpeGVsX2luZGV4ICogcGl4ZWxfZGVwdGg7Ci0KLSAgICAgICAgICAgICAgICAgIHJvd1tyb3dieXRlc10gPQotICAgICAgICAgICAgICAgICAgICAgMHhGRlUgJiAocGl4ZWxfaW5kZXggKyAoYnl0ZV9vZmZzZXQgKiAyKnkpICsgMSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWx0ZXJzID0gKHkgPT0gMCA/IFBOR19GSUxURVJfU1VCK1BOR19GSUxURVJfVVAgOiBQTkdfRklMVEVSX1VQKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXNzZXJ0KDAvKk5PVCBSRUFDSEVEKi8pOwotICAgICAgfQotICAgfQotCi0gICBlbHNlIHN3aXRjaCAoY2hhbm5lbHNfb2ZfdHlwZShjb2xvcl90eXBlKSkKLSAgIHsKLSAgIC8qIDEgY2hhbm5lbDogYSBzcXVhcmUgaW1hZ2Ugd2l0aCBhIGRpYW1vbmQsIHRoZSBsZWFzdCBsdW1pbm91cyBjb2xvcnMgYXJlIG9uCi0gICAgKiAgICB0aGUgZWRnZSBvZiB0aGUgaW1hZ2UsIHRoZSBtb3N0IGx1bWlub3VzIGluIHRoZSBjZW50ZXIuCi0gICAgKi8KLSAgICAgIGNhc2UgMToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHg7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBiYXNlID0gMipzaXplX21heCAtIGFicygyKnktc2l6ZV9tYXgpOwotCi0gICAgICAgICAgICBmb3IgKHg9MDsgeDw9c2l6ZV9tYXg7ICsreCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ191aW50XzMyIGx1bWEgPSBiYXNlIC0gYWJzKDIqeC1zaXplX21heCk7Ci0KLSAgICAgICAgICAgICAgIC8qICdsdW1hJyBpcyBub3cgaW4gdGhlIHJhbmdlIDAuLjIqc2l6ZV9tYXgsIHdlIG5lZWQKLSAgICAgICAgICAgICAgICAqIDAuLmRlcHRoX21heAotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBsdW1hID0gKGx1bWEqZGVwdGhfbWF4ICsgc2l6ZV9tYXgpIC8gKDIqc2l6ZV9tYXgpOwotICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIHgsIGJpdF9kZXB0aCwgbHVtYSwgZ2FtbWFfdGFibGUsIGNvbnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0KLSAgIC8qIDIgY2hhbm5lbHM6IHRoZSBjb2xvciBjaGFubmVsIGluY3JlYXNlcyBpbiBsdW1pbm9zaXR5IGZyb20gdG9wIHRvIGJvdHRvbSwKLSAgICAqICAgIHRoZSBhbHBoYSBjaGFubmVsIGluY3JlYXNlcyBpbiBvcGFjaXR5IGZyb20gbGVmdCB0byByaWdodC4KLSAgICAqLwotICAgICAgY2FzZSAyOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMzIgYWxwaGEgPSAoZGVwdGhfbWF4ICogeSAqIDIgKyBzaXplX21heCkgLyAoMiAqIHNpemVfbWF4KTsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHg7Ci0KLSAgICAgICAgICAgIGZvciAoeD0wOyB4PD1zaXplX21heDsgKyt4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDIqeCwgYml0X2RlcHRoLAotICAgICAgICAgICAgICAgICAgKGRlcHRoX21heCAqIHggKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCksIGdhbW1hX3RhYmxlLAotICAgICAgICAgICAgICAgICAgY29udik7Ci0gICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMip4KzEsIGJpdF9kZXB0aCwgYWxwaGEsIGdhbW1hX3RhYmxlLAotICAgICAgICAgICAgICAgICAgY29udik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLQotICAgLyogMyBjaGFubmVsczogbGluZWFyIGNvbWJpbmF0aW9ucyBvZiwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIGNsb2Nrd2lzZSwKLSAgICAqICAgIGJsYWNrLCBncmVlbiwgd2hpdGUsIHJlZC4KLSAgICAqLwotICAgICAgY2FzZSAzOgotICAgICAgICAgewotICAgICAgICAgICAgLyogeDA6IHRoZSBibGFjay0+cmVkIHNjYWxlICh0aGUgdmFsdWUgb2YgdGhlIHJlZCBjb21wb25lbnQpIGF0IHRoZQotICAgICAgICAgICAgICogICAgIHN0YXJ0IG9mIHRoZSByb3cgKGJsdWUgYW5kIGdyZWVuIGFyZSAwKS4KLSAgICAgICAgICAgICAqIHgxOiB0aGUgZ3JlZW4tPndoaXRlIHNjYWxlICh0aGUgdmFsdWUgb2YgdGhlIHJlZCBhbmQgYmx1ZQotICAgICAgICAgICAgICogICAgIGNvbXBvbmVudHMgYXQgdGhlIGVuZCBvZiB0aGUgcm93OyBncmVlbiBpcyBkZXB0aF9tYXgpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwbmdfdWludF8zMiBZID0gKGRlcHRoX21heCAqIHkgKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiB4OwotCi0gICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB4L2RlcHRoX21heCBmcm9tIHN0YXJ0IHRvIGVuZDoKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgICAgICAgc3RhcnQgZW5kICAgICAgICAgZGlmZmVyZW5jZQotICAgICAgICAgICAgICogcmVkOiAgICAgWSAgICBZICAgICAgICAgICAgMAotICAgICAgICAgICAgICogZ3JlZW46ICAgMCAgIGRlcHRoX21heCAgIGRlcHRoX21heAotICAgICAgICAgICAgICogYmx1ZTogICAgMCAgICBZICAgICAgICAgICAgWQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKHg9MDsgeDw9c2l6ZV9tYXg7ICsreCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCAzKngrMCwgYml0X2RlcHRoLCAvKiByZWQgKi8gWSwKLSAgICAgICAgICAgICAgICAgICAgIGdhbW1hX3RhYmxlLCBjb252KTsKLSAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCAzKngrMSwgYml0X2RlcHRoLCAvKiBncmVlbiAqLwotICAgICAgICAgICAgICAgICAgKGRlcHRoX21heCAqIHggKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCksCi0gICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSwgY29udik7Ci0gICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMyp4KzIsIGJpdF9kZXB0aCwgLyogYmx1ZSAqLwotICAgICAgICAgICAgICAgICAgKFkgKiB4ICogMiArIHNpemVfbWF4KSAvICgyICogc2l6ZV9tYXgpLAotICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUsIGNvbnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0KLSAgIC8qIDQgY2hhbm5lbHM6IGxpbmVhciBjb21iaW5hdGlvbnMgb2YsIGZyb20gdGhlIHRvcC1sZWZ0IGNvcm5lciBjbG9ja3dpc2UsCi0gICAgKiAgICB0cmFuc3BhcmVudCwgcmVkLCBncmVlbiwgYmx1ZS4KLSAgICAqLwotICAgICAgY2FzZSA0OgotICAgICAgICAgewotICAgICAgICAgICAgLyogeDA6IHRoZSB0cmFuc3BhcmVudC0+Ymx1ZSBzY2FsZSAodGhlIHZhbHVlIG9mIHRoZSBibHVlIGFuZCBhbHBoYQotICAgICAgICAgICAgICogICAgIGNvbXBvbmVudHMpIGF0IHRoZSBzdGFydCBvZiB0aGUgcm93IChyZWQgYW5kIGdyZWVuIGFyZSAwKS4KLSAgICAgICAgICAgICAqIHgxOiB0aGUgcmVkLT5ncmVlbiBzY2FsZSAodGhlIHZhbHVlIG9mIHRoZSByZWQgYW5kIGdyZWVuCi0gICAgICAgICAgICAgKiAgICAgY29tcG9uZW50cyBhdCB0aGUgZW5kIG9mIHRoZSByb3c7IGJsdWUgaXMgMCBhbmQgYWxwaGEgaXMKLSAgICAgICAgICAgICAqICAgICBkZXB0aF9tYXgpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwbmdfdWludF8zMiBZID0gKGRlcHRoX21heCAqIHkgKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCk7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiB4OwotCi0gICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB4L2RlcHRoX21heCBmcm9tIHN0YXJ0IHRvIGVuZDoKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgICAgICAgc3RhcnQgICAgZW5kICAgICAgIGRpZmZlcmVuY2UKLSAgICAgICAgICAgICAqIHJlZDogICAgIDAgICBkZXB0aF9tYXgtWSBkZXB0aF9tYXgtWQotICAgICAgICAgICAgICogZ3JlZW46ICAgMCAgICAgICBZICAgICAgICAgICAgIFkKLSAgICAgICAgICAgICAqIGJsdWU6ICAgIFkgICAgICAgMCAgICAgICAgICAgIC1ZCi0gICAgICAgICAgICAgKiBhbHBoYTogICBZICAgIGRlcHRoX21heCAgZGVwdGhfbWF4LVkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yICh4PTA7IHg8PXNpemVfbWF4OyArK3gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgNCp4KzAsIGJpdF9kZXB0aCwgLyogcmVkICovCi0gICAgICAgICAgICAgICAgICAoKGRlcHRoX21heC1ZKSAqIHggKiAyICsgc2l6ZV9tYXgpIC8gKDIgKiBzaXplX21heCksCi0gICAgICAgICAgICAgICAgICBnYW1tYV90YWJsZSwgY29udik7Ci0gICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgNCp4KzEsIGJpdF9kZXB0aCwgLyogZ3JlZW4gKi8KLSAgICAgICAgICAgICAgICAgIChZICogeCAqIDIgKyBzaXplX21heCkgLyAoMiAqIHNpemVfbWF4KSwKLSAgICAgICAgICAgICAgICAgIGdhbW1hX3RhYmxlLCBjb252KTsKLSAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCA0KngrMiwgYml0X2RlcHRoLCAvKiBibHVlICovCi0gICAgICAgICAgICAgICAgICBZIC0gKFkgKiB4ICogMiArIHNpemVfbWF4KSAvICgyICogc2l6ZV9tYXgpLAotICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUsIGNvbnYpOwotICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDQqeCszLCBiaXRfZGVwdGgsIC8qIGFscGhhICovCi0gICAgICAgICAgICAgICAgICBZICsgKChkZXB0aF9tYXgtWSkgKiB4ICogMiArIHNpemVfbWF4KSAvICgyICogc2l6ZV9tYXgpLAotICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUsIGNvbnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6IGludGVybmFsIGJhZCBjaGFubmVsIGNvdW50XG4iKTsKLSAgICAgICAgIGV4aXQoMik7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKQotICAgewotICAgICAgLyogUGFsZXR0ZSB3aXRoIGZpeGVkIGNvbG9yOiB0aGUgaW1hZ2Ugcm93cyBhcmUgYWxsIDAgYW5kIHRoZSBpbWFnZSB3aWR0aAotICAgICAgICogaXMgMTYuCi0gICAgICAgKi8KLSAgICAgIG1lbXNldChyb3csIDAsIHJvd2J5dGVzKTsKLSAgIH0KLQotICAgZWxzZSBpZiAoY29sb3JzWzBdID09IGNoYW5uZWxzX29mX3R5cGUoY29sb3JfdHlwZSkpCi0gICAgICBzd2l0Y2ggKGNoYW5uZWxzX29mX3R5cGUoY29sb3JfdHlwZSkpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBsdW1hID0gY29sb3JzWzFdOwotICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgeDsKLQotICAgICAgICAgICAgICAgZm9yICh4PTA7IHg8PXNpemVfbWF4OyArK3gpCi0gICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgeCwgYml0X2RlcHRoLCBsdW1hLCBnYW1tYV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNvbnN0IHBuZ191aW50XzMyIGx1bWEgPSBjb2xvcnNbMV07Ci0gICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBhbHBoYSA9IGNvbG9yc1syXTsKLSAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHg7Ci0KLSAgICAgICAgICAgICAgIGZvciAoeD0wOyB4PHNpemVfbWF4OyArK3gpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMip4LCBiaXRfZGVwdGgsIGx1bWEsIGdhbW1hX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgY29udik7Ci0gICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMip4KzEsIGJpdF9kZXB0aCwgYWxwaGEsIGdhbW1hX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgY29udik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgcmVkID0gY29sb3JzWzFdOwotICAgICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgZ3JlZW4gPSBjb2xvcnNbMl07Ci0gICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBibHVlID0gY29sb3JzWzNdOwotICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgeDsKLQotICAgICAgICAgICAgICAgZm9yICh4PTA7IHg8PXNpemVfbWF4OyArK3gpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgMyp4KzAsIGJpdF9kZXB0aCwgcmVkLCBnYW1tYV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnYpOwotICAgICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDMqeCsxLCBiaXRfZGVwdGgsIGdyZWVuLCBnYW1tYV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnYpOwotICAgICAgICAgICAgICAgICAgc2V0X3ZhbHVlKHJvdywgcm93Ynl0ZXMsIDMqeCsyLCBiaXRfZGVwdGgsIGJsdWUsIGdhbW1hX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgY29udik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgcmVkID0gY29sb3JzWzFdOwotICAgICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgZ3JlZW4gPSBjb2xvcnNbMl07Ci0gICAgICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiBibHVlID0gY29sb3JzWzNdOwotICAgICAgICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgYWxwaGEgPSBjb2xvcnNbNF07Ci0gICAgICAgICAgICAgICBwbmdfdWludF8zMiB4OwotCi0gICAgICAgICAgICAgICBmb3IgKHg9MDsgeDw9c2l6ZV9tYXg7ICsreCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCA0KngrMCwgYml0X2RlcHRoLCByZWQsIGdhbW1hX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgY29udik7Ci0gICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgNCp4KzEsIGJpdF9kZXB0aCwgZ3JlZW4sIGdhbW1hX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgY29udik7Ci0gICAgICAgICAgICAgICAgICBzZXRfdmFsdWUocm93LCByb3dieXRlcywgNCp4KzIsIGJpdF9kZXB0aCwgYmx1ZSwgZ2FtbWFfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBjb252KTsKLSAgICAgICAgICAgICAgICAgIHNldF92YWx1ZShyb3csIHJvd2J5dGVzLCA0KngrMywgYml0X2RlcHRoLCBhbHBoYSwgZ2FtbWFfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBjb252KTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nOiBpbnRlcm5hbCBiYWQgY2hhbm5lbCBjb3VudFxuIik7Ci0gICAgICAgICAgICBleGl0KDIpOwotICAgICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICJtYWtlcG5nOiAtLWNvbG9yOiBjb3VudCgldSkgZG9lcyBub3QgbWF0Y2ggY2hhbm5lbHMoJXUpXG4iLAotICAgICAgICAgY29sb3JzWzBdLCBjaGFubmVsc19vZl90eXBlKGNvbG9yX3R5cGUpKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIHJldHVybiBmaWx0ZXJzOwotfQotCi0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi1tYWtlcG5nX3dhcm5pbmcocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCi17Ci0gICBjb25zdCBjaGFyICoqZXAgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKLSAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgIGlmIChlcCAhPSBOVUxMICYmICplcCAhPSBOVUxMKQotICAgICAgbmFtZSA9ICplcDsKLQotICAgZWxzZQotICAgICAgbmFtZSA9ICJtYWtlcG5nIjsKLQotICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nOiAlc1xuIiwgbmFtZSwgbWVzc2FnZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi1tYWtlcG5nX2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKQotewotICAgbWFrZXBuZ193YXJuaW5nKHBuZ19wdHIsIG1lc3NhZ2UpOwotICAgcG5nX2xvbmdqbXAocG5nX3B0ciwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgLyogMCBvbiBzdWNjZXNzLCBlbHNlIGFuIGVycm9yIGNvZGUgKi8KLXdyaXRlX3BuZyhjb25zdCBjaGFyICoqbmFtZSwgRklMRSAqZnAsIGludCBjb2xvcl90eXBlLCBpbnQgYml0X2RlcHRoLAotICAgdm9sYXRpbGUgcG5nX2ZpeGVkX3BvaW50IGdhbW1hLCBjaHVua19pbnNlcnQgKiB2b2xhdGlsZSBpbnNlcnQsCi0gICB1bnNpZ25lZCBpbnQgZmlsdGVycywgdW5zaWduZWQgaW50ICpjb2xvcnMsIGludCBzbWFsbCwgaW50IHRSTlMpCi17Ci0gICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgbmFtZSwgbWFrZXBuZ19lcnJvciwgbWFrZXBuZ193YXJuaW5nKTsKLSAgIHZvbGF0aWxlIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7Ci0gICB2b2xhdGlsZSBwbmdfYnl0ZXAgcm93ID0gTlVMTDsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogT09NIGFsbG9jYXRpbmcgd3JpdGUgc3RydWN0dXJlXG4iKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotCi0gICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgewotICAgICAgcG5nX3N0cnVjdHAgbnZfcHRyID0gcG5nX3B0cjsKLSAgICAgIHBuZ19pbmZvcCBudl9pbmZvID0gaW5mb19wdHI7Ci0KLSAgICAgIHBuZ19wdHIgPSBOVUxMOwotICAgICAgaW5mb19wdHIgPSBOVUxMOwotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZudl9wdHIsICZudl9pbmZvKTsKLSAgICAgIGlmIChyb3cgIT0gTlVMTCkgZnJlZShyb3cpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIC8qIEFsbG93IGJlbmlnbiBlcnJvcnMgc28gdGhhdCB3ZSBjYW4gd3JpdGUgUE5HcyB3aXRoIGVycm9ycyAqLwotICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzKHBuZ19wdHIsIDEvKmFsbG93ZWQqLyk7Ci0KLSAgIC8qIE1heCBvdXQgdGhlIHRleHQgY29tcHJlc3Npb24gbGV2ZWwgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBsaWNlbnNlCi0gICAgKiBzbWFsbC4gICBJZiAtLXNtYWxsIHRoZW4gZG8gdGhlIHNhbWUgZm9yIHRoZSBJREFULgotICAgICovCi0gICBpZiAoc21hbGwpCi0gICAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIFpfQkVTVF9DT01QUkVTU0lPTik7Ci0KLSAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBaX0JFU1RfQ09NUFJFU1NJT04pOwotCi0gICBwbmdfaW5pdF9pbyhwbmdfcHRyLCBmcCk7Ci0KLSAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyBpbmZvIHN0cnVjdHVyZSIpOwotCi0gICB7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSA9Ci0gICAgICAgICBpbWFnZV9zaXplX29mX3R5cGUoY29sb3JfdHlwZSwgYml0X2RlcHRoLCBjb2xvcnMsIHNtYWxsKTsKLSAgICAgIHVuc2lnbmVkIGludCB5c2l6ZTsKLSAgICAgIHBuZ19maXhlZF9wb2ludCByZWFsX2dhbW1hID0gNDU0NTU7IC8qIEZvciBzUkdCICovCi0gICAgICBwbmdfYnl0ZSBnYW1tYV90YWJsZVsyNTZdOwotICAgICAgZG91YmxlIGNvbnY7Ci0KLSAgICAgIC8qIE5vcm1hbGx5IGltYWdlcyBhcmUgc3F1YXJlLCBidXQgd2l0aCAnc21hbGwnIHdlIHdhbnQgdG8gc2ltcGx5IGdlbmVyYXRlCi0gICAgICAgKiBhbGwgdGhlIHBpeGVsIHZhbHVlcywgb3IgYWxsIHRoYXQgd2UgcmVhc29uYWJseSBjYW46Ci0gICAgICAgKi8KLSAgICAgIGlmIChzbWFsbCkKLSAgICAgIHsKLSAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBwaXhlbF9kZXB0aCA9Ci0gICAgICAgICAgICBwaXhlbF9kZXB0aF9vZl90eXBlKGNvbG9yX3R5cGUsIGJpdF9kZXB0aCk7Ci0KLSAgICAgICAgIGlmIChwaXhlbF9kZXB0aCA8PSA4VSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydChzaXplID09ICgxVTw8cGl4ZWxfZGVwdGgpKTsKLSAgICAgICAgICAgIHlzaXplID0gMVU7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydChzaXplID09IDI1NlUpOwotICAgICAgICAgICAgeXNpemUgPSAyNTZVOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICB5c2l6ZSA9IHNpemU7Ci0KLSAgICAgIC8qIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGlicG5nIHZhbHVlcyB1c2VkIG9uIHJlYWQgdG8gY2FycnkgZXh0cmEKLSAgICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnYW1tYToKLSAgICAgICAqLwotICAgICAgaWYgKGdhbW1hID09IFBOR19HQU1NQV9NQUNfMTgpCi0gICAgICAgICBnYW1tYSA9IDY1OTA5OwotCi0gICAgICBlbHNlIGlmIChnYW1tYSA+IDAgJiYgZ2FtbWEgPCAxMDAwKQotICAgICAgICAgZ2FtbWEgPSBQTkdfRlBfMTsKLQotICAgICAgaWYgKGdhbW1hID4gMCkKLSAgICAgICAgIHJlYWxfZ2FtbWEgPSBnYW1tYTsKLQotICAgICAgewotICAgICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgICAgIGlmIChyZWFsX2dhbW1hID09IDQ1NDU1KSBmb3IgKGk9MDsgaTwyNTY7ICsraSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGdhbW1hX3RhYmxlW2ldID0gKHBuZ19ieXRlKWk7Ci0gICAgICAgICAgICBjb252ID0gMS47Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnZlcnQgJ2knIGZyb20gc1JHQiAoNDU0NTUpIHRvIHJlYWxfZ2FtbWEsIHRoaXMgbWFrZXMKLSAgICAgICAgICAgICAqIHRoZSBpbWFnZXMgbG9vayB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHRoZSBnQU1BIGNodW5rLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjb252ID0gcmVhbF9nYW1tYTsKLSAgICAgICAgICAgIGNvbnYgLz0gNDU0NTU7Ci0KLSAgICAgICAgICAgIGdhbW1hX3RhYmxlWzBdID0gMDsKLQotICAgICAgICAgICAgZm9yIChpPTE7IGk8MjU1OyArK2kpCi0gICAgICAgICAgICAgICBnYW1tYV90YWJsZVtpXSA9IGZsb29yYihwb3coaS8yNTUuLGNvbnYpICogMjU1ICsgLjUpOwotCi0gICAgICAgICAgICBnYW1tYV90YWJsZVsyNTVdID0gMjU1OwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHNpemUsIHlzaXplLCBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsCi0gICAgICAgICBQTkdfSU5URVJMQUNFX05PTkUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKLQotICAgICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKQotICAgICAgewotICAgICAgICAgaW50IG5wYWxldHRlOwotICAgICAgICAgcG5nX2NvbG9yIHBhbGV0dGVbMjU2XTsKLSAgICAgICAgIHBuZ19ieXRlIHRyYW5zWzI1Nl07Ci0KLSAgICAgICAgIG5wYWxldHRlID0gZ2VuZXJhdGVfcGFsZXR0ZShwYWxldHRlLCB0cmFucywgYml0X2RlcHRoLCBnYW1tYV90YWJsZSwKLSAgICAgICAgICAgIGNvbG9ycyk7Ci0gICAgICAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsIG5wYWxldHRlKTsKLQotICAgICAgICAgaWYgKHRSTlMpCi0gICAgICAgICAgICBwbmdfc2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHRyYW5zLCBucGFsZXR0ZS0xLAotICAgICAgICAgICAgICAgTlVMTC8qdHJhbnNwYXJlbnQgY29sb3IqLyk7Ci0KLSAgICAgICAgIC8qIFJlc2V0IGdhbW1hX3RhYmxlIHRvIHByZXZlbnQgdGhlIGltYWdlIHJvd3MgYmVpbmcgY2hhbmdlZCAqLwotICAgICAgICAgZm9yIChucGFsZXR0ZT0wOyBucGFsZXR0ZTwyNTY7ICsrbnBhbGV0dGUpCi0gICAgICAgICAgICBnYW1tYV90YWJsZVtucGFsZXR0ZV0gPSAocG5nX2J5dGUpbnBhbGV0dGU7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKHRSTlMpCi0gICAgICB7Ci0gICAgICAgICBwbmdfY29sb3JfMTYgY29sOwotCi0gICAgICAgICBjb2wucmVkID0gY29sLmdyZWVuID0gY29sLmJsdWUgPSBjb2wuZ3JheSA9Ci0gICAgICAgICAgICAweDAxMDFVICYgKCgxVTw8Yml0X2RlcHRoKS0xVSk7Ci0gICAgICAgICBjb2wuaW5kZXggPSAwVTsKLSAgICAgICAgIHBuZ19zZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgTlVMTC8qdHJhbnMqLywgMVUsICZjb2wpOwotICAgICAgfQotCi0gICAgICBpZiAoZ2FtbWEgPT0gUE5HX0RFRkFVTFRfc1JHQikKLSAgICAgICAgIHBuZ19zZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX3NSR0JfSU5URU5UX0FCU09MVVRFKTsKLQotICAgICAgZWxzZSBpZiAoZ2FtbWEgPiAwKSAvKiBFbHNlIGRvbid0IHNldCBjb2xvciBzcGFjZSBpbmZvcm1hdGlvbiAqLwotICAgICAgewotICAgICAgICAgcG5nX3NldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCByZWFsX2dhbW1hKTsKLQotICAgICAgICAgLyogSnVzdCB1c2UgdGhlIHNSR0IgdmFsdWVzIGhlcmUuICovCi0gICAgICAgICBwbmdfc2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAvKiBjb2xvciAgICAgIHggICAgICAgeSAqLwotICAgICAgICAgICAgLyogd2hpdGUgKi8gMzEyNzAsIDMyOTAwLAotICAgICAgICAgICAgLyogcmVkICAgKi8gNjQwMDAsIDMzMDAwLAotICAgICAgICAgICAgLyogZ3JlZW4gKi8gMzAwMDAsIDYwMDAwLAotICAgICAgICAgICAgLyogYmx1ZSAgKi8gMTUwMDAsICA2MDAwCi0gICAgICAgICApOwotICAgICAgfQotCi0gICAgICAvKiBJbnNlcnQgZXh0cmEgaW5mb3JtYXRpb24uICovCi0gICAgICB3aGlsZSAoaW5zZXJ0ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBpbnNlcnQtPmluc2VydChwbmdfcHRyLCBpbmZvX3B0ciwgaW5zZXJ0LT5ucGFyYW1zLCBpbnNlcnQtPnBhcmFtZXRlcnMpOwotICAgICAgICAgaW5zZXJ0ID0gaW5zZXJ0LT5uZXh0OwotICAgICAgfQotCi0gICAgICAvKiBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuICovCi0gICAgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICAgIC8qIFJlc3RyaWN0IHRoZSBmaWx0ZXJzICovCi0gICAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCBQTkdfRklMVEVSX1RZUEVfQkFTRSwgZmlsdGVycyk7Ci0KLSAgICAgIHsKLSMgICAgICAgIGlmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgICAgICAgICAgIGludCBwYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLSMgICAgICAgIGVsc2UgLyogIVdSSVRFX0lOVEVSTEFDSU5HICovCi0gICAgICAgICAgICBpbnQgcGFzc2VzID0gMTsKLSMgICAgICAgIGVuZGlmIC8qICFXUklURV9JTlRFUkxBQ0lORyAqLwotICAgICAgICAgaW50IHBhc3M7Ci0gICAgICAgICBwbmdfc2l6ZV90IHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICAgICAgIHJvdyA9IG1hbGxvYyhyb3dieXRlcyk7Ci0KLSAgICAgICAgIGlmIChyb3cgPT0gTlVMTCkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiT09NIGFsbG9jYXRpbmcgcm93IGJ1ZmZlciIpOwotCi0gICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgcGFzc2VzOyArK3Bhc3MpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgeTsKLQotICAgICAgICAgICAgZm9yICh5PTA7IHk8eXNpemU7ICsreSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByb3dfZmlsdGVycyA9Ci0gICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9yb3cocm93LCByb3dieXRlcywgeSwgY29sb3JfdHlwZSwgYml0X2RlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFfdGFibGUsIGNvbnYsIGNvbG9ycywgc21hbGwpOwotCi0gICAgICAgICAgICAgICBpZiAocm93X2ZpbHRlcnMgIT0gMCAmJiBmaWx0ZXJzID09IFBOR19BTExfRklMVEVSUykKLSAgICAgICAgICAgICAgICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIFBOR19GSUxURVJfVFlQRV9CQVNFLCByb3dfZmlsdGVycyk7Ci0KLSAgICAgICAgICAgICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgcm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgLyogRmluaXNoIHdyaXRpbmcgdGhlIGZpbGUuICovCi0gICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgewotICAgICAgcG5nX3N0cnVjdHAgbnZfcHRyID0gcG5nX3B0cjsKLSAgICAgIHBuZ19pbmZvcCBudl9pbmZvID0gaW5mb19wdHI7Ci0KLSAgICAgIHBuZ19wdHIgPSBOVUxMOwotICAgICAgaW5mb19wdHIgPSBOVUxMOwotICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZudl9wdHIsICZudl9pbmZvKTsKLSAgIH0KLSAgIGZyZWUocm93KTsKLSAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBzaXplX3QKLWxvYWRfZmlsZShwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX2J5dGVwcCByZXN1bHQpCi17Ci0gICBGSUxFICpmcCA9IHRtcGZpbGUoKTsKLQotICAgaWYgKGZwICE9IE5VTEwpCi0gICB7Ci0gICAgICBGSUxFICppcCA9IGZvcGVuKG5hbWUsICJyYiIpOwotCi0gICAgICBpZiAoaXAgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgICBpbnQgY2g7Ci0KLSAgICAgICAgIGZvciAoOzspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjaCA9IGdldGMoaXApOwotICAgICAgICAgICAgaWYgKGNoID09IEVPRikgYnJlYWs7Ci0gICAgICAgICAgICBwdXRjKGNoLCBmcCk7Ci0gICAgICAgICAgICArK3RvdGFsOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAoZmVycm9yKGlwKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBlcnJvcihuYW1lKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHJlYWQgZXJyb3JcbiIsIG5hbWUpOwotICAgICAgICAgICAgKHZvaWQpZmNsb3NlKGlwKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpZmNsb3NlKGlwKTsKLQotICAgICAgICAgICAgaWYgKGZlcnJvcihmcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwZXJyb3IoInRlbXBvcmFyeSBmaWxlIik7Ci0gICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRlbXBvcmFyeSBmaWxlIHdyaXRlIGVycm9yXG4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV3aW5kKGZwKTsKLQotICAgICAgICAgICAgICAgaWYgKHRvdGFsID4gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgNCBoZXJlIHRvIGFsbG93IGFuIGlDQ1AgcHJvZmlsZQotICAgICAgICAgICAgICAgICAgICogdG8gYmUgcGFkZGVkIHRvIGEgNHggYm91bmRhcnkuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBkYXRhID0gbWFsbG9jKCh0b3RhbCszKSZ+Myk7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmV3X3NpemUgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBnZXRjKGZwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBFT0YpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtuZXdfc2l6ZSsrXSA9IChwbmdfYnl0ZSljaDsKLSAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGZlcnJvcihmcCkgfHwgbmV3X3NpemUgIT0gdG90YWwpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJyb3IoInRlbXBvcmFyeSBmaWxlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRlbXBvcmFyeSBmaWxlIHJlYWQgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpZmNsb3NlKGZwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBkYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvdXQgb2YgbWVtb3J5IGxvYWRpbmcgZmlsZVxuIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGVtcHR5IGZpbGVcbiIsIG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBwZXJyb3IobmFtZSk7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuIGZhaWxlZFxuIiwgbmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZjbG9zZShmcCk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogJXM6IGNvdWxkIG5vdCBvcGVuIHRlbXBvcmFyeSBmaWxlXG4iLCBuYW1lKTsKLQotICAgZXhpdCgxKTsKLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgcG5nX3NpemVfdAotbG9hZF9mYWtlKHBuZ19jaGFycCBwYXJhbSwgcG5nX2J5dGVwcCBwcm9maWxlKQotewotICAgY2hhciAqZW5kcHRyID0gTlVMTDsKLSAgIHVpbnQ2NF90IHNpemUgPSBzdHJ0b3VsbChwYXJhbSwgJmVuZHB0ciwgMC8qYmFzZSovKTsKLQotICAgLyogVGhlICdmYWtlJyBmb3JtYXQgaXMgPG51bWJlcj4qW3N0cmluZ10gKi8KLSAgIGlmIChlbmRwdHIgIT0gTlVMTCAmJiAqZW5kcHRyID09ICcqJykKLSAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oKytlbmRwdHIpOwotICAgICAgc2l6ZV90IHJlc3VsdCA9IChzaXplX3Qpc2l6ZTsKLQotICAgICAgaWYgKGxlbiA9PSAwKSBsZW4gPSAxOyAvKiBjYXB0dXJlIHRoZSB0ZXJtaW5hdGluZyAnXDAnICovCi0KLSAgICAgIC8qIE5vdyByZXBlYXQgdGhhdCBzdHJpbmcgdG8gZmlsbCAnc2l6ZScgYnl0ZXMuICovCi0gICAgICBpZiAocmVzdWx0ID09IHNpemUgJiYgKCpwcm9maWxlID0gbWFsbG9jKHJlc3VsdCkpICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZXAgb3V0ID0gKnByb2ZpbGU7Ci0KLSAgICAgICAgIGlmIChsZW4gPT0gMSkKLSAgICAgICAgICAgIG1lbXNldChvdXQsICplbmRwdHIsIHJlc3VsdCk7Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChzaXplID49IGxlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIG1lbWNweShvdXQsIGVuZHB0ciwgbGVuKTsKLSAgICAgICAgICAgICAgIG91dCArPSBsZW47Ci0gICAgICAgICAgICAgICBzaXplIC09IGxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShvdXQsIGVuZHB0ciwgc2l6ZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNpemUgZXhjZWVkcyBzeXN0ZW0gbGltaXRzXG4iLCBwYXJhbSk7Ci0gICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgfQotCi0gICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3BhcmFtX2NvdW50KGludCBucGFyYW1zLCBpbnQgZXhwZWN0KQotewotICAgaWYgKG5wYXJhbXMgIT0gZXhwZWN0KQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgcGFyYW1ldGVyIGNvdW50IChpbnRlcm5hbCBlcnJvcilcbiIpOwotICAgICAgZXhpdCgxKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9pQ0NQKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IG5wYXJhbXMsCi0gICBwbmdfY2hhcnBwIHBhcmFtcykKLXsKLSAgIHBuZ19ieXRlcCBwcm9maWxlID0gTlVMTDsKLSAgIHBuZ191aW50XzMyIHByb2ZsZW4gPSAwOwotICAgaW50IHJlc3VsdDsKLQotICAgY2hlY2tfcGFyYW1fY291bnQobnBhcmFtcywgMik7Ci0KLSAgIHN3aXRjaCAocGFyYW1zWzFdWzBdKQotICAgewotICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfc2l6ZV90IGZpbGVsZW4gPSBsb2FkX2ZpbGUocGFyYW1zWzFdKzEsICZwcm9maWxlKTsKLSAgICAgICAgICAgIGlmIChmaWxlbGVuID4gMHhmZmZmZmZmYykgLyogTWF4aW11bSBwcm9maWxlIGxlbmd0aCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZmlsZSB0b28gbG9uZyAoJWx1KSBmb3IgYW4gSUNDIHByb2ZpbGVcbiIsCi0gICAgICAgICAgICAgICAgICBwYXJhbXNbMV0rMSwgKHVuc2lnbmVkIGxvbmcpZmlsZWxlbik7Ci0gICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9mbGVuID0gKHBuZ191aW50XzMyKWZpbGVsZW47Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3NpemVfdCBmYWtlX2xlbiA9IGxvYWRfZmFrZShwYXJhbXNbMV0sICZwcm9maWxlKTsKLQotICAgICAgICAgICAgaWYgKGZha2VfbGVuID4gMCkgLyogZWxzZSBhIHNpbXBsZSBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChmYWtlX2xlbiA+IDB4ZmZmZmZmZmYpIC8qIE1heGltdW0gcHJvZmlsZSBsZW5ndGggKi8KLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBmYWtlIGRhdGEgdG9vIGxvbmcgKCVsdSkgZm9yIGFuIElDQyBwcm9maWxlXG4iLAotICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLCAodW5zaWduZWQgbG9uZylmYWtlX2xlbik7Ci0gICAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcHJvZmxlbiA9IChwbmdfdWludF8zMikoZmFrZV9sZW4gJiB+M1UpOwotICAgICAgICAgICAgICAgLyogQWx3YXlzIGZpeCB1cCB0aGUgcHJvZmlsZSBsZW5ndGguICovCi0gICAgICAgICAgICAgICBwbmdfc2F2ZV91aW50XzMyKHByb2ZpbGUsIHByb2ZsZW4pOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi0taW5zZXJ0IGlDQ1AgXCIlc1wiOiB1bnJlY29nbml6ZWRcbiIsIHBhcmFtc1sxXSk7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgdXNlICc8JyB0byByZWFkIGEgZmlsZTogXCI8ZmlsZW5hbWVcIlxuIik7Ci0gICAgICAgICBleGl0KDEpOwotICAgfQotCi0gICByZXN1bHQgPSAxOwotCi0gICBpZiAocHJvZmxlbiAmIDMpCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICJtYWtlcG5nOiAtLWluc2VydCBpQ0NQICVzOiBwcm9maWxlIGxlbmd0aCBtYWRlIGEgbXVsdGlwbGUgb2YgNFxuIiwKLSAgICAgICAgIHBhcmFtc1sxXSk7Ci0KLSAgICAgIC8qIGxvYWRfZmlsZSBhbGxvY2F0ZXMgZXh0cmEgc3BhY2UgZm9yIHRoaXMgcGFkZGluZywgdGhlIElDQyBzcGVjIHJlcXVpcmVzCi0gICAgICAgKiBwYWRkaW5nIHdpdGggemVybyBieXRlcy4KLSAgICAgICAqLwotICAgICAgd2hpbGUgKHByb2ZsZW4gJiAzKQotICAgICAgICAgcHJvZmlsZVtwcm9mbGVuKytdID0gMDsKLSAgIH0KLQotICAgaWYgKHByb2ZpbGUgIT0gTlVMTCAmJiBwcm9mbGVuID4gMykKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIHByb2ZfaGVhZGVyID0gcG5nX2dldF91aW50XzMyKHByb2ZpbGUpOwotCi0gICAgICBpZiAocHJvZl9oZWFkZXIgIT0gcHJvZmxlbikKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLS1pbnNlcnQgaUNDUCAlczogcHJvZmlsZSBsZW5ndGggZmllbGQgd3Jvbmc6XG4iLAotICAgICAgICAgICAgcGFyYW1zWzFdKTsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBhY3R1YWwgJWx1LCByZWNvcmRlZCB2YWx1ZSAlbHUgKGNvcnJlY3RlZClcbiIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZylwcm9mbGVuLCAodW5zaWduZWQgbG9uZylwcm9mX2hlYWRlcik7Ci0gICAgICAgICBwbmdfc2F2ZV91aW50XzMyKHByb2ZpbGUsIHByb2ZsZW4pOwotICAgICAgfQotICAgfQotCi0gICBpZiAocmVzdWx0ICYmIHByb2ZpbGUgIT0gTlVMTCAmJiBwcm9mbGVuID49NCkKLSAgICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgcGFyYW1zWzBdLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLAotICAgICAgICAgcHJvZmlsZSwgcHJvZmxlbik7Ci0KLSAgIGlmIChwcm9maWxlKQotICAgICAgZnJlZShwcm9maWxlKTsKLQotICAgaWYgKCFyZXN1bHQpCi0gICAgICBleGl0KDEpOwotfQotCi1zdGF0aWMgdm9pZAotY2xlYXJfdGV4dChwbmdfdGV4dCAqdGV4dCwgcG5nX2NoYXJwIGtleXdvcmQpCi17Ci0gICB0ZXh0LT5jb21wcmVzc2lvbiA9IC0xOyAvKiBub25lICovCi0gICB0ZXh0LT5rZXkgPSBrZXl3b3JkOwotICAgdGV4dC0+dGV4dCA9IE5VTEw7Ci0gICB0ZXh0LT50ZXh0X2xlbmd0aCA9IDA7IC8qIGxpYnBuZyBjYWxjdWxhdGVzIHRoaXMgKi8KLSAgIHRleHQtPml0eHRfbGVuZ3RoID0gMDsgLyogbGlicG5nIGNhbGN1bGF0ZXMgdGhpcyAqLwotICAgdGV4dC0+bGFuZyA9IE5VTEw7Ci0gICB0ZXh0LT5sYW5nX2tleSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfdGV4dChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIHBuZ190ZXh0cCB0ZXh0LAotICAgcG5nX2NoYXJwIHBhcmFtKQotewotICAgc3dpdGNoIChwYXJhbVswXSkKLSAgIHsKLSAgICAgIGNhc2UgJzwnOgotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIGZpbGUgPSBOVUxMOwotCi0gICAgICAgICAgICB0ZXh0LT50ZXh0X2xlbmd0aCA9IGxvYWRfZmlsZShwYXJhbSsxLCAmZmlsZSk7Ci0gICAgICAgICAgICB0ZXh0LT50ZXh0ID0gKHBuZ19jaGFycClmaWxlOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLSAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlcCBkYXRhID0gTlVMTDsKLSAgICAgICAgICAgIHBuZ19zaXplX3QgZmFrZV9sZW4gPSBsb2FkX2Zha2UocGFyYW0sICZkYXRhKTsKLQotICAgICAgICAgICAgaWYgKGZha2VfbGVuID4gMCkgLyogZWxzZSBhIHNpbXBsZSBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRleHQtPnRleHRfbGVuZ3RoID0gZmFrZV9sZW47Ci0gICAgICAgICAgICAgICB0ZXh0LT50ZXh0ID0gKHBuZ19jaGFycClkYXRhOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICB0ZXh0LT50ZXh0ID0gcGFyYW07Ci0gICAgICAgICBicmVhazsKLSAgIH0KLQotICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0LCAxKTsKLQotICAgaWYgKHRleHQtPnRleHQgIT0gcGFyYW0pCi0gICAgICBmcmVlKHRleHQtPnRleHQpOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3RFWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgbnBhcmFtcywKLSAgIHBuZ19jaGFycHAgcGFyYW1zKQotewotICAgcG5nX3RleHQgdGV4dDsKLQotICAgY2hlY2tfcGFyYW1fY291bnQobnBhcmFtcywgMik7Ci0gICBjbGVhcl90ZXh0KCZ0ZXh0LCBwYXJhbXNbMF0pOwotICAgc2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0LCBwYXJhbXNbMV0pOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3pUWHQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgbnBhcmFtcywKLSAgIHBuZ19jaGFycHAgcGFyYW1zKQotewotICAgcG5nX3RleHQgdGV4dDsKLQotICAgY2hlY2tfcGFyYW1fY291bnQobnBhcmFtcywgMik7Ci0gICBjbGVhcl90ZXh0KCZ0ZXh0LCBwYXJhbXNbMF0pOwotICAgdGV4dC5jb21wcmVzc2lvbiA9IDA7IC8qIGRlZmxhdGUgKi8KLSAgIHNldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dCwgcGFyYW1zWzFdKTsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9pVFh0KHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IG5wYXJhbXMsCi0gICBwbmdfY2hhcnBwIHBhcmFtcykKLXsKLSAgIHBuZ190ZXh0IHRleHQ7Ci0KLSAgIGNoZWNrX3BhcmFtX2NvdW50KG5wYXJhbXMsIDQpOwotICAgY2xlYXJfdGV4dCgmdGV4dCwgcGFyYW1zWzBdKTsKLSAgIHRleHQuY29tcHJlc3Npb24gPSAyOyAvKiBpVFh0ICsgZGVmbGF0ZSAqLwotICAgdGV4dC5sYW5nID0gcGFyYW1zWzFdOy8qIGxhbmd1YWdlIHRhZyAqLwotICAgdGV4dC5sYW5nX2tleSA9IHBhcmFtc1syXTsgLyogdHJhbnNsYXRlZCBrZXl3b3JkICovCi0gICBzZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgJnRleHQsIHBhcmFtc1szXSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfaElTVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBucGFyYW1zLAotICAgICAgcG5nX2NoYXJwcCBwYXJhbXMpCi17Ci0gICBpbnQgaTsKLSAgIHBuZ191aW50XzE2IGZyZXFbMjU2XTsKLQotICAgLyogbGlicG5nIHRha2VzIHRoZSBjb3VudCBmcm9tIHRoZSBQTFRFIGNvdW50OyB3ZSBkb24ndCBjaGVjayBpdCBoZXJlIGJ1dCB3ZQotICAgICogZG8gc2V0IHRoZSBhcnJheSB0byAwIGZvciB1bnNwZWNpZmllZCBlbnRyaWVzLgotICAgICovCi0gICBtZW1zZXQoZnJlcSwgMCwgc2l6ZW9mIGZyZXEpOwotICAgZm9yIChpPTA7IGk8bnBhcmFtczsgKytpKQotICAgewotICAgICAgY2hhciAqZW5kcHRyID0gTlVMTDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGwgPSBzdHJ0b3VsKHBhcmFtc1tpXSwgJmVuZHB0ciwgMC8qYmFzZSovKTsKLQotICAgICAgaWYgKHBhcmFtc1tpXVswXSAmJiAqZW5kcHRyID09IDAgJiYgbCA8PSA2NTUzNSkKLSAgICAgICAgIGZyZXFbaV0gPSAocG5nX3VpbnRfMTYpbDsKLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJoSVNUWyVkXTogJXM6IGludmFsaWQgZnJlcXVlbmN5XG4iLCBpLCBwYXJhbXNbaV0pOwotICAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgIH0KLQotICAgcG5nX3NldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBmcmVxKTsKLX0KLQotc3RhdGljIHBuZ19ieXRlCi1idmFsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY2hhcnAgcGFyYW0sIHVuc2lnbmVkIGludCBtYXh2YWwpCi17Ci0gICBjaGFyICplbmRwdHIgPSBOVUxMOwotICAgdW5zaWduZWQgbG9uZyBpbnQgbCA9IHN0cnRvdWwocGFyYW0sICZlbmRwdHIsIDAvKmJhc2UqLyk7Ci0KLSAgIGlmIChwYXJhbVswXSAmJiAqZW5kcHRyID09IDAgJiYgbCA8PSBtYXh2YWwpCi0gICAgICByZXR1cm4gKHBuZ19ieXRlKWw7Ci0KLSAgIGVsc2UKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAic0JJVDogaW52YWxpZCBzQklUIHZhbHVlIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfc0JJVChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBucGFyYW1zLAotICAgICAgcG5nX2NoYXJwcCBwYXJhbXMpCi17Ci0gICBjb25zdCBpbnQgY3QgPSBwbmdfZ2V0X2NvbG9yX3R5cGUocG5nX3B0ciwgaW5mb19wdHIpOwotICAgY29uc3QgaW50IGMgPSAoY3QgJiBQTkdfQ09MT1JfTUFTS19DT0xPUiA/IDMgOiAxKSArCi0gICAgICAoY3QgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSA/IDEgOiAwKTsKLSAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXh2YWwgPQotICAgICAgY3QgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFID8gOFUgOiBwbmdfZ2V0X2JpdF9kZXB0aChwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICBwbmdfY29sb3JfOCBzQklUOwotCi0gICBpZiAobnBhcmFtcyAhPSBjKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJzQklUOiBpbmNvcnJlY3QgcGFyYW1ldGVyIGNvdW50Iik7Ci0KLSAgIGlmIChjdCAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgewotICAgICAgc0JJVC5yZWQgPSBidmFsKHBuZ19wdHIsIHBhcmFtc1swXSwgbWF4dmFsKTsKLSAgICAgIHNCSVQuZ3JlZW4gPSBidmFsKHBuZ19wdHIsIHBhcmFtc1sxXSwgbWF4dmFsKTsKLSAgICAgIHNCSVQuYmx1ZSA9IGJ2YWwocG5nX3B0ciwgcGFyYW1zWzJdLCBtYXh2YWwpOwotICAgICAgc0JJVC5ncmF5ID0gNDI7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHNCSVQucmVkID0gc0JJVC5ncmVlbiA9IHNCSVQuYmx1ZSA9IDQyOwotICAgICAgc0JJVC5ncmF5ID0gYnZhbChwbmdfcHRyLCBwYXJhbXNbMF0sIG1heHZhbCk7Ci0gICB9Ci0KLSAgIGlmIChjdCAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgICAgc0JJVC5hbHBoYSA9IGJ2YWwocG5nX3B0ciwgcGFyYW1zW25wYXJhbXMtMV0sIG1heHZhbCk7Ci0KLSAgIGVsc2UKLSAgICAgIHNCSVQuYWxwaGEgPSA0MjsKLQotICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc0JJVCk7Ci19Ci0KLSNpZiAwCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3NQTFQocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyLCBpbnQgbnBhcmFtcywgcG5nX2NoYXJwcCBwYXJhbXMpCi17Ci0gICBmcHJpbnRmKHN0ZGVyciwgImluc2VydCBzUExUOiBOWUlcbiIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWZpbmRfcGFyYW1ldGVycyhwbmdfY29uc3RfY2hhcnAgd2hhdCwgcG5nX2NoYXJwIHBhcmFtLCBwbmdfY2hhcnAgKmxpc3QsCi0gICBpbnQgbnBhcmFtcykKLXsKLSAgIC8qIFBhcmFtZXRlcnMgYXJlIHNlcGFyYXRlZCBieSAnXG4nIG9yICc6JyBjaGFyYWN0ZXJzLCB1cCB0byBucGFyYW1zIGFyZQotICAgICogYWNjZXB0ZWQgKG1vcmUgaXMgYW4gZXJyb3IpIGFuZCB0aGUgbnVtYmVyIGZvdW5kIGlzIHJldHVybmVkLgotICAgICovCi0gICBpbnQgaTsKLSAgIGZvciAoaT0wOyAqcGFyYW0gJiYgaTxucGFyYW1zOyArK2kpCi0gICB7Ci0gICAgICBsaXN0W2ldID0gcGFyYW07Ci0gICAgICB3aGlsZSAoKisrcGFyYW0pIGlmICgqcGFyYW0gPT0gJ1xuJyB8fCAqcGFyYW0gPT0gJzonKQotICAgICAgewotICAgICAgICAgKnBhcmFtKysgPSAwOyAvKiBUZXJtaW5hdGUgbGFzdCBwYXJhbWV0ZXIgKi8KLSAgICAgICAgIGJyZWFrOyAgICAgICAgLyogQW5kIHN0YXJ0IGEgbmV3IG9uZS4gKi8KLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKCpwYXJhbSkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiLS1pbnNlcnQgJXM6IHRvbyBtYW55IHBhcmFtZXRlcnMgKCVzKVxuIiwgd2hhdCwgcGFyYW0pOwotICAgICAgZXhpdCgxKTsKLSAgIH0KLQotICAgbGlzdFtpXSA9IE5VTEw7IC8qIHRlcm1pbmF0ZXMgbGlzdCAqLwotICAgcmV0dXJuIGk7IC8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIGZpbGxlZCBpbiAqLwotfQotCi1zdGF0aWMgdm9pZAotYmFkX3BhcmFtZXRlcl9jb3VudChwbmdfY29uc3RfY2hhcnAgd2hhdCwgaW50IG5wYXJhbXMpCi17Ci0gICBmcHJpbnRmKHN0ZGVyciwgIi0taW5zZXJ0ICVzOiBiYWQgcGFyYW1ldGVyIGNvdW50ICVkXG4iLCB3aGF0LCBucGFyYW1zKTsKLSAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyBjaHVua19pbnNlcnQgKgotbWFrZV9pbnNlcnQocG5nX2NvbnN0X2NoYXJwIHdoYXQsCi0gICB2b2lkICgqaW5zZXJ0KShwbmdfc3RydWN0cCwgcG5nX2luZm9wLCBpbnQsIHBuZ19jaGFycHApLAotICAgaW50IG5wYXJhbXMsIHBuZ19jaGFycHAgbGlzdCkKLXsKLSAgIGludCBpOwotICAgY2h1bmtfaW5zZXJ0ICpjaXA7Ci0KLSAgIGNpcCA9IG1hbGxvYyhvZmZzZXRvZihjaHVua19pbnNlcnQscGFyYW1ldGVycykgKwotICAgICAgbnBhcmFtcyAqIHNpemVvZiAocG5nX2NoYXJwKSk7Ci0KLSAgIGlmIChjaXAgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiLS1pbnNlcnQgJXM6IG91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyAlZCBwYXJhbWV0ZXJzXG4iLAotICAgICAgICAgd2hhdCwgbnBhcmFtcyk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICBjaXAtPm5leHQgPSBOVUxMOwotICAgY2lwLT5pbnNlcnQgPSBpbnNlcnQ7Ci0gICBjaXAtPm5wYXJhbXMgPSBucGFyYW1zOwotICAgZm9yIChpPTA7IGk8bnBhcmFtczsgKytpKQotICAgICAgY2lwLT5wYXJhbWV0ZXJzW2ldID0gbGlzdFtpXTsKLQotICAgcmV0dXJuIGNpcDsKLX0KLQotc3RhdGljIGNodW5rX2luc2VydCAqCi1maW5kX2luc2VydChwbmdfY29uc3RfY2hhcnAgd2hhdCwgcG5nX2NoYXJwIHBhcmFtKQotewotICAgcG5nX3VpbnRfMzIgY2h1bmsgPSAwOwotICAgcG5nX2NoYXJwIHBhcmFtZXRlcl9saXN0WzEwMjRdOwotICAgaW50IGksIG5wYXJhbXM7Ci0KLSAgIC8qIEFzc2VtYmxlIHRoZSBjaHVuayBuYW1lICovCi0gICBmb3IgKGk9MDsgaTw0OyArK2kpCi0gICB7Ci0gICAgICBjaGFyIGNoID0gd2hhdFtpXTsKLQotICAgICAgaWYgKChjaCA+PSA2NSAmJiBjaCA8PSA5MCkgfHwgKGNoID49IDk3ICYmIGNoIDw9IDEyMikpCi0gICAgICAgICBjaHVuayA9IChjaHVuayA8PCA4KSArIHdoYXRbaV07Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIGJyZWFrOwotICAgfQotCi0gICBpZiAoaSA8IDQgfHwgd2hhdFs0XSAhPSAwKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlcG5nIC0taW5zZXJ0IFwiJXNcIjogaW52YWxpZCBjaHVuayBuYW1lXG4iLCB3aGF0KTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIC8qIEFzc2VtYmxlIHRoZSBwYXJhbWV0ZXIgbGlzdC4gKi8KLSAgIG5wYXJhbXMgPSBmaW5kX3BhcmFtZXRlcnMod2hhdCwgcGFyYW0sIHBhcmFtZXRlcl9saXN0LCAxMDI0KTsKLQotIyAgZGVmaW5lIENIVU5LKGEsYixjLGQpICgoKGEpPDwyNCkrKChiKTw8MTYpKygoYyk8PDgpKyhkKSkKLQotICAgc3dpdGNoIChjaHVuaykKLSAgIHsKLSAgICAgIGNhc2UgQ0hVTksoMTA1LDY3LDY3LDgwKTogIC8qIGlDQ1AgKi8KLSAgICAgICAgIGlmIChucGFyYW1zID09IDIpCi0gICAgICAgICAgICByZXR1cm4gbWFrZV9pbnNlcnQod2hhdCwgaW5zZXJ0X2lDQ1AsIG5wYXJhbXMsIHBhcmFtZXRlcl9saXN0KTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIENIVU5LKDExNiw2OSw4OCwxMTYpOiAvKiB0RVh0ICovCi0gICAgICAgICBpZiAobnBhcmFtcyA9PSAyKQotICAgICAgICAgICAgcmV0dXJuIG1ha2VfaW5zZXJ0KHdoYXQsIGluc2VydF90RVh0LCBucGFyYW1zLCBwYXJhbWV0ZXJfbGlzdCk7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBDSFVOSygxMjIsODQsODgsMTE2KTogLyogelRYdCAqLwotICAgICAgICAgaWYgKG5wYXJhbXMgPT0gMikKLSAgICAgICAgICAgIHJldHVybiBtYWtlX2luc2VydCh3aGF0LCBpbnNlcnRfelRYdCwgbnBhcmFtcywgcGFyYW1ldGVyX2xpc3QpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQ0hVTksoMTA1LDg0LDg4LDExNik6IC8qIGlUWHQgKi8KLSAgICAgICAgIGlmIChucGFyYW1zID09IDQpCi0gICAgICAgICAgICByZXR1cm4gbWFrZV9pbnNlcnQod2hhdCwgaW5zZXJ0X2lUWHQsIG5wYXJhbXMsIHBhcmFtZXRlcl9saXN0KTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIENIVU5LKDEwNCw3Myw4Myw4NCk6ICAvKiBoSVNUICovCi0gICAgICAgICBpZiAobnBhcmFtcyA8PSAyNTYpCi0gICAgICAgICAgICByZXR1cm4gbWFrZV9pbnNlcnQod2hhdCwgaW5zZXJ0X2hJU1QsIG5wYXJhbXMsIHBhcmFtZXRlcl9saXN0KTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIENIVU5LKDExNSw2Niw3Myw4NCk6IC8qIHNCSVQgKi8KLSAgICAgICAgIGlmIChucGFyYW1zIDw9IDQpCi0gICAgICAgICAgICByZXR1cm4gbWFrZV9pbnNlcnQod2hhdCwgaW5zZXJ0X3NCSVQsIG5wYXJhbXMsIHBhcmFtZXRlcl9saXN0KTsKLSAgICAgICAgIGJyZWFrOwotCi0jaWYgMAotICAgICAgY2FzZSBDSFVOSygxMTUsODAsNzYsODQpOiAgLyogc1BMVCAqLwotICAgICAgICAgcmV0dXJuIG1ha2VfaW5zZXJ0KHdoYXQsIGluc2VydF9zUExULCBucGFyYW1zLCBwYXJhbWV0ZXJfbGlzdCk7Ci0jZW5kaWYKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZyAtLWluc2VydCBcIiVzXCI6IHVucmVjb2duaXplZCBjaHVuayBuYW1lXG4iLAotICAgICAgICAgICAgd2hhdCk7Ci0gICAgICAgICBleGl0KDEpOwotICAgfQotCi0gICBiYWRfcGFyYW1ldGVyX2NvdW50KHdoYXQsIG5wYXJhbXMpOwotICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgbGlicG5nIGV4cGVjdHMgd3JpdGVhYmxlIHN0cmluZ3MgZm9yIHRoaW5ncyBsaWtlCi0gKiB0ZXh0IGNodW5rcyAobWF5YmUgdGhpcyBzaG91bGQgYmUgZml4ZWQuLi4pCi0gKi8KLXN0YXRpYyBwbmdfY2hhcnAKLXN0cnN0YXNoKHBuZ19jb25zdF9jaGFycCBmb28pCi17Ci0gICAvKiBUaGUgcHJvZ3JhbSBpbmRpY2F0ZXMgYSBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBieSBjcmFzaGluZywgdGhpcyBpcyBieQotICAgICogZGVzaWduLgotICAgICovCi0gICBpZiAoZm9vICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfY2hhcnAgYmFyID0gbWFsbG9jKHN0cmxlbihmb28pKzEpOwotICAgICAgcmV0dXJuIHN0cmNweShiYXIsIGZvbyk7Ci0gICB9Ci0KLSAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgcG5nX2NoYXJwCi1zdHJzdGFzaF9saXN0KGNvbnN0IHBuZ19jb25zdF9jaGFycCAqdGV4dCkKLXsKLSAgIHNpemVfdCBmb28gPSAwOwotICAgcG5nX2NoYXJwIHJlc3VsdCwgYmFyOwotICAgY29uc3QgcG5nX2NvbnN0X2NoYXJwICpsaW5lID0gdGV4dDsKLQotICAgd2hpbGUgKCpsaW5lICE9IE5VTEwpCi0gICAgICBmb28gKz0gc3RybGVuKCpsaW5lKyspOwotCi0gICByZXN1bHQgPSBiYXIgPSBtYWxsb2MoZm9vKzEpOwotCi0gICBsaW5lID0gdGV4dDsKLSAgIHdoaWxlICgqbGluZSAhPSBOVUxMKQotICAgewotICAgICAgZm9vID0gc3RybGVuKCpsaW5lKTsKLSAgICAgIG1lbWNweShiYXIsICpsaW5lKyssIGZvbyk7Ci0gICAgICBiYXIgKz0gZm9vOwotICAgfQotCi0gICAqYmFyID0gMDsKLSAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFRoZXNlIGFyZSB1c2VkIHRvIGluc2VydCBDb3B5cmlnaHQgYW5kIExpY2VuY2UgZmllbGRzLCB0aGV5IGFsbG93IHRoZSB0ZXh0IHRvCi0gKiBoYXZlIFxuIHVubGlrZSB0aGUgLS1pbnNlcnQgb3B0aW9uLgotICovCi1zdGF0aWMgY2h1bmtfaW5zZXJ0ICoKLWFkZF90RVh0KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgcG5nX2NvbnN0X2NoYXJwICp0ZXh0KQotewotICAgc3RhdGljIGNoYXIgd2hhdFs1XSA9IHsgMTE2LCA2OSwgODgsIDExNiwgMCB9OwotICAgcG5nX2NoYXJwIHBhcmFtZXRlcl9saXN0WzNdOwotCi0gICBwYXJhbWV0ZXJfbGlzdFswXSA9IHN0cnN0YXNoKGtleSk7Ci0gICBwYXJhbWV0ZXJfbGlzdFsxXSA9IHN0cnN0YXNoX2xpc3QodGV4dCk7Ci0gICBwYXJhbWV0ZXJfbGlzdFsyXSA9IE5VTEw7Ci0KLSAgIHJldHVybiBtYWtlX2luc2VydCh3aGF0LCBpbnNlcnRfdEVYdCwgMiwgcGFyYW1ldGVyX2xpc3QpOwotfQotCi1zdGF0aWMgY2h1bmtfaW5zZXJ0ICoKLWFkZF9pVFh0KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKmxhbmd1YWdlX2tleSwKLSAgICAgIGNvbnN0IHBuZ19jb25zdF9jaGFycCAqdGV4dCkKLXsKLSAgIHN0YXRpYyBjaGFyIHdoYXRbNV0gPSB7IDEwNSwgODQsIDg4LCAxMTYsIDAgfTsKLSAgIHBuZ19jaGFycCBwYXJhbWV0ZXJfbGlzdFs1XTsKLQotICAgcGFyYW1ldGVyX2xpc3RbMF0gPSBzdHJzdGFzaChrZXkpOwotICAgcGFyYW1ldGVyX2xpc3RbMV0gPSBzdHJzdGFzaChsYW5ndWFnZSk7Ci0gICBwYXJhbWV0ZXJfbGlzdFsyXSA9IHN0cnN0YXNoKGxhbmd1YWdlX2tleSk7Ci0gICBwYXJhbWV0ZXJfbGlzdFszXSA9IHN0cnN0YXNoX2xpc3QodGV4dCk7Ci0gICBwYXJhbWV0ZXJfbGlzdFs0XSA9IE5VTEw7Ci0KLSAgIHJldHVybiBtYWtlX2luc2VydCh3aGF0LCBpbnNlcnRfaVRYdCwgNCwgcGFyYW1ldGVyX2xpc3QpOwotfQotCi0vKiBUaGlzIGlzIGEgbm90LXZlcnktZ29vZCBwYXJzZXIgZm9yIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyAoaW5jbHVkaW5nIDApLiAgSXQKLSAqIGRvZXNuJ3QgYWNjZXB0IHNvbWUgYXBwYXJlbnRseSB2YWxpZCB0aGluZ3MsIGJ1dCBpdCBhY2NlcHRzIGFsbCB0aGUgc2Vuc2libGUKLSAqIGNvbWJpbmF0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLXBhcnNlX2NvbG9yKGNoYXIgKmFyZywgdW5zaWduZWQgaW50ICpjb2xvcnMpCi17Ci0gICB1bnNpZ25lZCBpbnQgbmNvbG9ycyA9IDA7Ci0KLSAgIHdoaWxlICgqYXJnICYmIG5jb2xvcnMgPCA0KQotICAgewotICAgICAgY2hhciAqZXAgPSBhcmc7Ci0KLSAgICAgIHVuc2lnbmVkIGxvbmcgdWwgPSBzdHJ0b3VsKGFyZywgJmVwLCAwKTsKLQotICAgICAgaWYgKHVsID4gNjU1MzUpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2VwbmcgLS1jb2xvcj0uLi4nJXMnOiB0b28gYmlnXG4iLCBhcmcpOwotICAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGVwID09IGFyZykKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZyAtLWNvbG9yPS4uLiclcyc6IG5vdCBhIHZhbGlkIGNvbG9yXG4iLCBhcmcpOwotICAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCplcCkgKytlcDsgLyogc2tpcCBhIHNlcGFyYXRvciAqLwotICAgICAgYXJnID0gZXA7Ci0KLSAgICAgIGNvbG9yc1srK25jb2xvcnNdID0gKHVuc2lnbmVkIGludCl1bDsgLyogY2hlY2tlZCBhYm92ZSAqLwotICAgfQotCi0gICBpZiAoKmFyZykKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZyAtLWNvbG9yPS4uLiclcyc6IHRvbyBtYW55IHZhbHVlc1xuIiwgYXJnKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgICpjb2xvcnMgPSBuY29sb3JzOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgRklMRSAqZnAgPSBzdGRvdXQ7Ci0gICBjb25zdCBjaGFyICpmaWxlX25hbWUgPSBOVUxMOwotICAgaW50IGNvbG9yX3R5cGUgPSA4OyAvKiBpbnZhbGlkICovCi0gICBpbnQgYml0X2RlcHRoID0gMzI7IC8qIGludmFsaWQgKi8KLSAgIGludCBzbWFsbCA9IDA7IC8qIG1ha2UgZnVsbCBzaXplIGltYWdlcyAqLwotICAgaW50IHRSTlMgPSAwOyAvKiBkb24ndCBvdXRwdXQgYSB0Uk5TIGNodW5rICovCi0gICB1bnNpZ25lZCBpbnQgY29sb3JzWzVdOwotICAgdW5zaWduZWQgaW50IGZpbHRlcnMgPSBQTkdfQUxMX0ZJTFRFUlM7Ci0gICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWEgPSAwOyAvKiBub3Qgc2V0ICovCi0gICBjaHVua19pbnNlcnQgKmhlYWRfaW5zZXJ0ID0gTlVMTDsKLSAgIGNodW5rX2luc2VydCAqKmluc2VydF9wdHIgPSAmaGVhZF9pbnNlcnQ7Ci0KLSAgIG1lbXNldChjb2xvcnMsIDAsIHNpemVvZiBjb2xvcnMpOwotCi0gICB3aGlsZSAoLS1hcmdjID4gMCkKLSAgIHsKLSAgICAgIGNoYXIgKmFyZyA9ICorK2FyZ3Y7Ci0KLSAgICAgIGlmIChzdHJjbXAoYXJnLCAiLS1zbWFsbCIpID09IDApCi0gICAgICB7Ci0gICAgICAgICBzbWFsbCA9IDE7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcChhcmcsICItLXRSTlMiKSA9PSAwKQotICAgICAgewotICAgICAgICAgdFJOUyA9IDE7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcChhcmcsICItLXNSR0IiKSA9PSAwKQotICAgICAgewotICAgICAgICAgZ2FtbWEgPSBQTkdfREVGQVVMVF9zUkdCOwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHJjbXAoYXJnLCAiLS1saW5lYXIiKSA9PSAwKQotICAgICAgewotICAgICAgICAgZ2FtbWEgPSBQTkdfRlBfMTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoc3RyY21wKGFyZywgIi0tMS44IikgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGdhbW1hID0gUE5HX0dBTU1BX01BQ18xODsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoc3RyY21wKGFyZywgIi0tbm9maWx0ZXJzIikgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkU7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cm5jbXAoYXJnLCAiLS1jb2xvcj0iLCA4KSA9PSAwKQotICAgICAgewotICAgICAgICAgIHBhcnNlX2NvbG9yKGFyZys4LCBjb2xvcnMpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoYXJnYyA+PSAzICYmIHN0cmNtcChhcmcsICItLWluc2VydCIpID09IDApCi0gICAgICB7Ci0gICAgICAgICBwbmdfY29uc3RfY2hhcnAgd2hhdCA9ICorK2FyZ3Y7Ci0gICAgICAgICBwbmdfY2hhcnAgcGFyYW0gPSAqKythcmd2OwotICAgICAgICAgY2h1bmtfaW5zZXJ0ICpuZXdfaW5zZXJ0OwotCi0gICAgICAgICBhcmdjIC09IDI7Ci0KLSAgICAgICAgIG5ld19pbnNlcnQgPSBmaW5kX2luc2VydCh3aGF0LCBwYXJhbSk7Ci0KLSAgICAgICAgIGlmIChuZXdfaW5zZXJ0ICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAqaW5zZXJ0X3B0ciA9IG5ld19pbnNlcnQ7Ci0gICAgICAgICAgICBpbnNlcnRfcHRyID0gJm5ld19pbnNlcnQtPm5leHQ7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoYXJnWzBdID09ICctJykKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogJXM6IGludmFsaWQgb3B0aW9uXG4iLCBhcmcpOwotICAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcChhcmcsICJwYWxldHRlIikgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHJuY21wKGFyZywgImdyYXkiLCA0KSA9PSAwKQotICAgICAgewotICAgICAgICAgaWYgKGFyZ1s0XSA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZys0LCAiYSIpID09IDAgfHwKLSAgICAgICAgICAgIHN0cmNtcChhcmcrNCwgImFscGhhIikgPT0gMCB8fAotICAgICAgICAgICAgc3RyY21wKGFyZys0LCAiLWFscGhhIikgPT0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHJuY21wKGFyZywgInJnYiIsIDMpID09IDApCi0gICAgICB7Ci0gICAgICAgICBpZiAoYXJnWzNdID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcrMywgImEiKSA9PSAwIHx8Ci0gICAgICAgICAgICBzdHJjbXAoYXJnKzMsICJhbHBoYSIpID09IDAgfHwKLSAgICAgICAgICAgIHN0cmNtcChhcmcrMywgIi1hbHBoYSIpID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjb2xvcl90eXBlID09IDggJiYgaXNkaWdpdChhcmdbMF0pKQotICAgICAgewotICAgICAgICAgY29sb3JfdHlwZSA9IGF0b2koYXJnKTsKLSAgICAgICAgIGlmIChjb2xvcl90eXBlIDwgMCB8fCBjb2xvcl90eXBlID4gNiB8fCBjb2xvcl90eXBlID09IDEgfHwKLSAgICAgICAgICAgIGNvbG9yX3R5cGUgPT0gNSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogJXM6IG5vdCBhIHZhbGlkIGNvbG9yIHR5cGVcbiIsIGFyZyk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgfQotCi0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGJpdF9kZXB0aCA9PSAzMiAmJiBpc2RpZ2l0KGFyZ1swXSkpCi0gICAgICB7Ci0gICAgICAgICBiaXRfZGVwdGggPSBhdG9pKGFyZyk7Ci0gICAgICAgICBpZiAoYml0X2RlcHRoIDw9IDAgfHwgYml0X2RlcHRoID4gMTYgfHwKLSAgICAgICAgICAgIChiaXRfZGVwdGggJiAtYml0X2RlcHRoKSAhPSBiaXRfZGVwdGgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6ICVzOiBub3QgYSB2YWxpZCBiaXQgZGVwdGhcbiIsIGFyZyk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgfQotCi0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGFyZ2MgPT0gMSkgLyogSXQncyB0aGUgZmlsZSBuYW1lICovCi0gICAgICB7Ci0gICAgICAgICBmcCA9IGZvcGVuKGFyZywgIndiIik7Ci0gICAgICAgICBpZiAoZnAgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiBjb3VsZCBub3Qgb3BlblxuIiwgYXJnLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZmlsZV9uYW1lID0gYXJnOwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogJXM6IHVua25vd24gYXJndW1lbnRcbiIsIGFyZyk7Ci0gICAgICBleGl0KDEpOwotICAgfSAvKiBhcmd1bWVudCB3aGlsZSBsb29wICovCi0KLSAgIGlmIChjb2xvcl90eXBlID09IDggfHwgYml0X2RlcHRoID09IDMyKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogbWFrZXBuZyBbLS1zbWFsbF0gWy0tc1JHQnwtLWxpbmVhcnwtLTEuOF0gIgotICAgICAgICAgIlstLWNvbG9yPS4uLl0gY29sb3ItdHlwZSBiaXQtZGVwdGggW2ZpbGUtbmFtZV1cbiIKLSAgICAgICAgICIgIE1ha2UgYSB0ZXN0IFBORyBmaWxlLCBieSBkZWZhdWx0IHdyaXRlcyB0byBzdGRvdXQuXG4iCi0gICAgICAgICAiICBPdGhlciBvcHRpb25zIGFyZSBhdmFpbGFibGUsIFVUU0wuXG4iKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIC8qIENoZWNrIHRoZSBjb2xvcnMgKi8KLSAgIHsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBsaW0gPSAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFID8gMjU1VSA6Ci0gICAgICAgICAoMVU8PGJpdF9kZXB0aCktMSk7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpPTE7IGk8PWNvbG9yc1swXTsgKytpKQotICAgICAgICAgaWYgKGNvbG9yc1tpXSA+IGxpbSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFrZXBuZzogLS1jb2xvcj0uLi46ICV1IG91dCBvZiByYW5nZSBbMC4uJXVdXG4iLAotICAgICAgICAgICAgICAgY29sb3JzW2ldLCBsaW0pOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgIH0KLSAgIH0KLQotICAgLyogc21hbGwgYW5kIGNvbG9ycyBhcmUgaW5jb21wYXJpYmxlICh3aWxsIHByb2JhYmx5IGNyYXNoIGlmIGJvdGggYXJlIHVzZWQgYXQKLSAgICAqIHRoZSBzYW1lIHRpbWUhKQotICAgICovCi0gICBpZiAoc21hbGwgJiYgY29sb3JzWzBdICE9IDApCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2Vwbmc6IC0tY29sb3IgLS1zbWFsbDogb25seSBvbmUgYXQgYSB0aW1lIVxuIik7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICAvKiBSZXN0cmljdCB0aGUgZmlsdGVycyBmb3IgbW9yZSBzcGVlZCB0byB0aG9zZSB3ZSBrbm93IGFyZSB1c2VkIGZvciB0aGUKLSAgICAqIGdlbmVyYXRlZCBpbWFnZXMuCi0gICAgKi8KLSAgIGlmIChmaWx0ZXJzID09IFBOR19BTExfRklMVEVSUyAmJiAhc21hbGwvKnNtYWxsIHByb3ZpZGVzIGRlZmF1bHRzKi8pCi0gICB7Ci0gICAgICBpZiAoKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19QQUxFVFRFKSAhPSAwIHx8IGJpdF9kZXB0aCA8IDgpCi0gICAgICAgICBmaWx0ZXJzID0gUE5HX0ZJTFRFUl9OT05FOwotCi0gICAgICBlbHNlIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpIC8qIHJnYiAqLwotICAgICAgewotICAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSA4KQotICAgICAgICAgICAgZmlsdGVycyAmPSB+KFBOR19GSUxURVJfTk9ORSB8IFBOR19GSUxURVJfQVZHKTsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZmlsdGVycyA9IFBOR19GSUxURVJfU1VCIHwgUE5HX0ZJTFRFUl9QQUVUSDsKLSAgICAgIH0KLQotICAgICAgZWxzZSAvKiBncmF5IDggb3IgMTYtYml0ICovCi0gICAgICAgICBmaWx0ZXJzICY9IH5QTkdfRklMVEVSX05PTkU7Ci0gICB9Ci0KLSAgIC8qIEluc2VydCBzdGFuZGFyZCBjb3B5cmlnaHQgYW5kIGxpY2VuY2UgdGV4dC4gKi8KLSAgIHsKLSAgICAgIHN0YXRpYyBwbmdfY29uc3RfY2hhcnAgY29weXJpZ2h0W10gPQotICAgICAgewotICAgICAgICAgQ09QWVJJR0hULCAvKiBJU08tTGF0aW4tMSAqLwotICAgICAgICAgTlVMTAotICAgICAgfTsKLSAgICAgIHN0YXRpYyBwbmdfY29uc3RfY2hhcnAgbGljZW5zaW5nW10gPQotICAgICAgewotICAgICAgICAgSU1BR0VfTElDRU5TSU5HLCAvKiBVVEYtOCAqLwotICAgICAgICAgTlVMTAotICAgICAgfTsKLQotICAgICAgY2h1bmtfaW5zZXJ0ICpuZXdfaW5zZXJ0OwotCi0gICAgICBuZXdfaW5zZXJ0ID0gYWRkX3RFWHQoIkNvcHlyaWdodCIsIGNvcHlyaWdodCk7Ci0gICAgICBpZiAobmV3X2luc2VydCAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgKmluc2VydF9wdHIgPSBuZXdfaW5zZXJ0OwotICAgICAgICAgaW5zZXJ0X3B0ciA9ICZuZXdfaW5zZXJ0LT5uZXh0OwotICAgICAgfQotCi0gICAgICBuZXdfaW5zZXJ0ID0gYWRkX2lUWHQoIkxpY2Vuc2luZyIsICJlbiIsIE5VTEwsIGxpY2Vuc2luZyk7Ci0gICAgICBpZiAobmV3X2luc2VydCAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgKmluc2VydF9wdHIgPSBuZXdfaW5zZXJ0OwotICAgICAgICAgaW5zZXJ0X3B0ciA9ICZuZXdfaW5zZXJ0LT5uZXh0OwotICAgICAgfQotICAgfQotCi0gICB7Ci0gICAgICBpbnQgcmV0ID0gd3JpdGVfcG5nKCZmaWxlX25hbWUsIGZwLCBjb2xvcl90eXBlLCBiaXRfZGVwdGgsIGdhbW1hLAotICAgICAgICAgaGVhZF9pbnNlcnQsIGZpbHRlcnMsIGNvbG9ycywgc21hbGwsIHRSTlMpOwotCi0gICAgICBpZiAocmV0ICE9IDAgJiYgZmlsZV9uYW1lICE9IE5VTEwpCi0gICAgICAgICByZW1vdmUoZmlsZV9uYW1lKTsKLQotICAgICAgcmV0dXJuIHJldDsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbGlidGVzdHMvcG5naW1hZ2UuYyBiL2NvbnRyaWIvbGlidGVzdHMvcG5naW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlNDAyYy4uMDAwMDAwMAotLS0gYS9jb250cmliL2xpYnRlc3RzL3BuZ2ltYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEyICswLDAgQEAKLS8qIHBuZ2ltYWdlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsMjAxNiBKb2huIEN1bm5pbmdoYW0gQm93bGVyCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjQgW0F1Z3VzdCA0LCAyMDE2XQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFRlc3QgdGhlIHBuZ19yZWFkX3BuZyBhbmQgcG5nX3dyaXRlX3BuZyBpbnRlcmZhY2VzLiAgR2l2ZW4gYSBQTkcgZmlsZSBsb2FkIGl0Ci0gKiB1c2luZyBwbmdfcmVhZF9wbmcgYW5kIHRoZW4gd3JpdGUgd2l0aCBwbmdfd3JpdGVfcG5nLiAgVGVzdCBhbGwgcG9zc2libGUKLSAqIHRyYW5zZm9ybXMuCi0gKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpZiBkZWZpbmVkKEhBVkVfQ09ORklHX0gpICYmICFkZWZpbmVkKFBOR19OT19DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgotICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6Ci0gKi8KLSNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCi0jICBpbmNsdWRlIDxwbmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKLSNlbmRpZgotCi0jaWZuZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0jICBpbmNsdWRlIDxzZXRqbXAuaD4gLyogYmVjYXVzZSBwbmcuaCBkaWQgKm5vdCogaW5jbHVkZSB0aGlzICovCi0jZW5kaWYKLQotLyogMS42LjEgYWRkZWQgc3VwcG9ydCBmb3IgdGhlIGNvbmZpZ3VyZSB0ZXN0IGhhcm5lc3MsIHdoaWNoIHVzZXMgNzcgdG8gaW5kaWNhdGUKLSAqIGEgc2tpcHBlZCB0ZXN0LCBpbiBlYXJsaWVyIHZlcnNpb25zIHdlIG5lZWQgdG8gc3VjY2VlZCBvbiBhIHNraXBwZWQgdGVzdCwgc286Ci0gKi8KLSNpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDYwMSAmJiBkZWZpbmVkKEhBVkVfQ09ORklHX0gpCi0jICBkZWZpbmUgU0tJUCA3NwotI2Vsc2UKLSMgIGRlZmluZSBTS0lQIDAKLSNlbmRpZgotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAotICAgLyogUkVBRF9QTkcgYW5kIFdSSVRFX1BORyB3ZXJlIG5vdCBkZWZpbmVkLCBzbzogKi8KLSMgIGlmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAotIyAgICAgaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLSMgICAgICAgIGRlZmluZSBQTkdfUkVBRF9QTkdfU1VQUE9SVEVECi0jICAgICBlbmRpZiAvKiBTRVFVRU5USUFMX1JFQUQgKi8KLSMgICAgIGlmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSMgICAgICAgIGRlZmluZSBQTkdfV1JJVEVfUE5HX1NVUFBPUlRFRAotIyAgICAgZW5kaWYgLyogV1JJVEUgKi8KLSMgIGVuZGlmIC8qIElORk9fSU1BR0UgKi8KLSNlbmRpZiAvKiBwcmUgMS43LjAgKi8KLQotI2lmZGVmIFBOR19SRUFEX1BOR19TVVBQT1JURUQKLS8qIElmIGEgdHJhbnNmb3JtIGlzIHZhbGlkIG9uIGJvdGggcmVhZCBhbmQgd3JpdGUgdGhpcyBpbXBsaWVzIHRoYXQgaWYgdGhlCi0gKiB0cmFuc2Zvcm0gaXMgYXBwbGllZCB0byByZWFkIGl0IG11c3QgYWxzbyBiZSBhcHBsaWVkIG9uIHdyaXRlIHRvIHByb2R1Y2UKLSAqIG1lYW5pbmdmdWwgZGF0YS4gIFRoaXMgaXMgYmVjYXVzZSB0aGVzZSB0cmFuc2Zvcm1zIHdoZW4gcGVyZm9ybWVkIG9uIHJlYWQKLSAqIHByb2R1Y2UgZGF0YSB3aXRoIGEgbWVtb3J5IGZvcm1hdCB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBQTkcgZm9ybWF0LgotICoKLSAqIE1vc3Qgb2YgdGhlc2UgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0aWJsZTsgYWZ0ZXIgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybSBvbgotICogd3JpdGUgdGhlIHJlc3VsdCBpcyB0aGUgb3JpZ2luYWwgUE5HIGRhdGEgdGhhdCB3b3VsZCBoYXZlIHdvdWxkIGhhdmUgYmVlbgotICogcmVhZCBpZiBubyB0cmFuc2Zvcm0gd2VyZSBhcHBsaWVkLgotICoKLSAqIFRoZSBleGNlcHRpb24gaXMgX1NISUZULCB3aGljaCBkZXN0cm95cyB0aGUgbG93IG9yZGVyIGJpdHMgbWFya2VkIGFzIG5vdAotICogc2lnbmlmaWNhbnQgaW4gYSBQTkcgd2l0aCB0aGUgc0JJVCBjaHVuay4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzLCBmb3IgZWFjaCB0cmFuc2Zvcm0sIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGl0Ci0gKiBpcyBleHBlY3RlZCB0byBkbyBhbnl0aGluZy4gIENvbmRpdGlvbnMgYXJlIGRlZmluZWQgYXMgZm9sbG93czoKLSAqCi0gKiAxKSBDb2xvciBtYXNrIGJpdHMgcmVxdWlyZWQgLSBzaW1wbHkgYSBtYXNrIHRvIEFORCB3aXRoIGNvbG9yX3R5cGU7IG9uZSBvZgotICogICAgdGhlc2UgbXVzdCBiZSBwcmVzZW50IGZvciB0aGUgdHJhbnNmb3JtIHRvIGZpcmUsIGV4Y2VwdCB0aGF0IDAgbWVhbnMKLSAqICAgICdhbHdheXMnLgotICogMikgQ29sb3IgbWFzayBiaXRzIHdoaWNoIG11c3QgYmUgYWJzZW50IC0gYW5vdGhlciBtYXNrIC0gbm9uZSBvZiB0aGVzZSBtdXN0Ci0gKiAgICBiZSBwcmVzZW50LgotICogMykgQml0IGRlcHRocyAtIGEgbWFzayBvZiBjb21wb25lbnQgYml0IGRlcHRocyBmb3IgdGhlIHRyYW5zZm9ybSB0byBmaXJlLgotICogNCkgJ3JlYWQnIC0gdGhlIHRyYW5zZm9ybSB3b3JrcyBpbiBwbmdfcmVhZF9wbmcuCi0gKiA1KSAnd3JpdGUnIC0gdGhlIHRyYW5zZm9ybSB3b3JrcyBpbiBwbmdfd3JpdGVfcG5nLgotICogNikgUE5HX0lORk9fY2h1bms7IGEgbWFzayBvZiB0aGUgY2h1bmtzIHRoYXQgbXVzdCBiZSBwcmVzZW50IGZvciB0aGUKLSAqICAgIHRyYW5zZm9ybSB0byBmaXJlLiAgQWxsIG11c3QgYmUgcHJlc2VudCAtIHRoZSByZXF1aXJlbWVudCBpcyB0aGF0Ci0gKiAgICBwbmdfZ2V0X3ZhbGlkKCkgJiBtYXNrID09IG1hc2ssIHNvIGlmIG1hc2sgaXMgMCB0aGVyZSBpcyBubyByZXF1aXJlbWVudC4KLSAqCi0gKiBUaGUgY29uZGl0aW9uIHJlZmVycyB0byB0aGUgb3JpZ2luYWwgaW1hZ2Ugc3RhdGUgLSBpZiBtdWx0aXBsZSB0cmFuc2Zvcm1zIGFyZQotICogdXNlZCB0b2dldGhlciBpdCBpcyBwb3NzaWJsZSB0byBjYXVzZSBhIHRyYW5zZm9ybSB0aGF0IHdvdWxkbid0IGZpcmUgb24gdGhlCi0gKiBvcmlnaW5hbCBpbWFnZSB0byBmaXJlLgotICovCi1zdGF0aWMgc3RydWN0IHRyYW5zZm9ybV9pbmZvCi17Ci0gICBjb25zdCBjaGFyICpuYW1lOwotICAgaW50ICAgICAgICAgdHJhbnNmb3JtOwotICAgcG5nX3VpbnRfMzIgdmFsaWRfY2h1bmtzOwotIyAgICAgZGVmaW5lIENIVU5LX05PTkUgMAotIyAgICAgZGVmaW5lIENIVU5LX3NCSVQgUE5HX0lORk9fc0JJVAotIyAgICAgZGVmaW5lIENIVU5LX3RSTlMgUE5HX0lORk9fdFJOUwotICAgcG5nX2J5dGUgICAgY29sb3JfbWFza19yZXF1aXJlZDsKLSAgIHBuZ19ieXRlICAgIGNvbG9yX21hc2tfYWJzZW50OwotIyAgICAgZGVmaW5lIENPTE9SX01BU0tfWCAgIDAKLSMgICAgIGRlZmluZSBDT0xPUl9NQVNLX1AgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0jICAgICBkZWZpbmUgQ09MT1JfTUFTS19DICAgUE5HX0NPTE9SX01BU0tfQ09MT1IKLSMgICAgIGRlZmluZSBDT0xPUl9NQVNLX0EgICBQTkdfQ09MT1JfTUFTS19BTFBIQQotIyAgICAgZGVmaW5lIENPTE9SX01BU0tfQUxMIChQQUxFVFRFK0NPTE9SK0FMUEhBKSAgLyogYWJzZW50ID0gZ3JheSwgbm8gYWxwaGEgKi8KLSAgIHBuZ19ieXRlICAgIGJpdF9kZXB0aHM7Ci0jICAgICBkZWZpbmUgQkRfQUxMICAoMSArIDIgKyA0ICsgOCArIDE2KQotIyAgICAgZGVmaW5lIEJEX1BBTCAgKDEgKyAyICsgNCArIDgpCi0jICAgICBkZWZpbmUgQkRfTE9XICAoMSArIDIgKyA0KQotIyAgICAgZGVmaW5lIEJEXzE2ICAgMTYKLSMgICAgIGRlZmluZSBCRF9UUlVFICg4KzE2KSAvKiBpLmUuIHRydWUtY29sb3IgZGVwdGhzICovCi0gICBwbmdfYnl0ZSAgICB3aGVuOwotIyAgICAgZGVmaW5lIFRSQU5TRk9STV9SICAxCi0jICAgICBkZWZpbmUgVFJBTlNGT1JNX1cgIDIKLSMgICAgIGRlZmluZSBUUkFOU0ZPUk1fUlcgMwotICAgcG5nX2J5dGUgICAgdGVzdGVkOyAvKiB0aGUgdHJhbnNmb3JtIHdhcyB0ZXN0ZWQgc29tZXdoZXJlICovCi19IHRyYW5zZm9ybV9pbmZvW10gPQotewotICAgLyogTGlzdCBBTEwgdGhlIFBOR19UUkFOU0ZPUk1fIG1hY3JvcyBoZXJlLiAgQ2hlY2sgZm9yIHN1cHBvcnQgdXNpbmcgdGhlIFJFQUQKLSAgICAqIG1hY3JvczsgZXZlbiBpZiB0aGUgdHJhbnNmb3JtIGlzIHN1cHBvcnRlZCBvbiB3cml0ZSBpdCBjYW5ub3QgYmUgdGVzdGVkCi0gICAgKiB3aXRob3V0IHRoZSByZWFkIHN1cHBvcnQuCi0gICAgKi8KLSMgIGRlZmluZSBUKG5hbWUsY2h1bmssY21fcmVxdWlyZWQsY21fYWJzZW50LGJkLHdoZW4pXAotICAgeyAgI25hbWUsIFBOR19UUkFOU0ZPUk1fICMjIG5hbWUsIENIVU5LXyAjIyBjaHVuayxcCi0gICAgICBDT0xPUl9NQVNLXyAjIyBjbV9yZXF1aXJlZCwgQ09MT1JfTUFTS18gIyMgY21fYWJzZW50LCBCRF8gIyMgYmQsXAotICAgICAgVFJBTlNGT1JNXyAjIyB3aGVuLCAwLyohdGVzdGVkKi8gfQotCi0jaWZkZWYgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQKLSAgIFQoU1RSSVBfMTYsICAgICAgICAgICAgTk9ORSwgWCwgICBYLCAgIDE2LCAgUiksCi0gICAgICAvKiBkcm9wcyB0aGUgYm90dG9tIDggYml0cyB3aGVuIGJpdCBkZXB0aCBpcyAxNiAqLwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECi0gICBUKFNUUklQX0FMUEhBLCAgICAgICAgIE5PTkUsIEEsICAgWCwgIEFMTCwgIFIpLAotICAgICAgLyogcmVtb3ZlcyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBwcmVzZW50ICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQKLSMgIGRlZmluZSBUUkFOU0ZPUk1fUldfUEFDSyBUUkFOU0ZPUk1fUlcKLSNlbHNlCi0jICBkZWZpbmUgVFJBTlNGT1JNX1JXX1BBQ0sgVFJBTlNGT1JNX1IKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVECi0gICBUKFBBQ0tJTkcsICAgICAgICAgICAgIE5PTkUsIFgsICAgWCwgIExPVywgUldfUEFDSyksCi0gICAgICAvKiB1bnBhY2tzIGxvdy1iaXQtZGVwdGggY29tcG9uZW50cyBpbnRvIDEgYnl0ZSBwZXIgY29tcG9uZW50IG9uIHJlYWQsCi0gICAgICAgKiByZXZlcnNlcyB0aGlzIG9uIHdyaXRlLgotICAgICAgICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVECi0jICBkZWZpbmUgVFJBTlNGT1JNX1JXX1BBQ0tTV0FQIFRSQU5TRk9STV9SVwotI2Vsc2UKLSMgIGRlZmluZSBUUkFOU0ZPUk1fUldfUEFDS1NXQVAgVFJBTlNGT1JNX1IKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAotICAgVChQQUNLU1dBUCwgICAgICAgICAgICBOT05FLCBYLCAgIFgsICBMT1csIFJXX1BBQ0tTV0FQKSwKLSAgICAgIC8qIHJldmVyc2VzIHRoZSBvcmRlciBvZiBsb3ctYml0LWRlcHRoIGNvbXBvbmVudHMgcGFja2VkIGludG8gYSBieXRlICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVECi0gICBUKEVYUEFORCwgICAgICAgICAgICAgIE5PTkUsIFAsICAgWCwgIEFMTCwgIFIpLAotICAgICAgLyogZXhwYW5kcyBQTFRFIFBORyBmaWxlcyB0byBSR0IgKG5vIHRSTlMpIG9yIFJHQkEgKHRSTlMpICoKLSAgICAgICAqIE5vdGUgdGhhdCB0aGUgJ0VYUEFORCcgdHJhbnNmb3JtIGRvZXMgbG90cyBvZiBkaWZmZXJlbnQgdGhpbmdzOiAqLwotICAgVChFWFBBTkQsICAgICAgICAgICAgICBOT05FLCBYLCAgIEMsICBBTEwsICBSKSwKLSAgICAgIC8qIGV4cGFuZHMgZ3JheXNjYWxlIFBORyBmaWxlcyB0byBSR0IsIG9yIFJHQkEgKi8KLSAgIFQoRVhQQU5ELCAgICAgICAgICAgICAgdFJOUywgWCwgICBBLCAgQUxMLCAgUiksCi0gICAgICAvKiBleHBhbmRzIHRoZSB0Uk5TIGNodW5rIGluIGZpbGVzIHdpdGhvdXQgYWxwaGEgKi8KLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVECi0jICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVCBUUkFOU0ZPUk1fUlcKLSNlbHNlCi0jICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVCBUUkFOU0ZPUk1fUgotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRAotICAgVChJTlZFUlRfTU9OTywgICAgICAgICBOT05FLCBYLCAgIEMsICBBTEwsIFJXX0lOVkVSVCksCi0gICAgICAvKiBjb252ZXJ0cyBncmF5LXNjYWxlIGNvbXBvbmVudHMgdG8gMS4uMCBmcm9tIDAuLjEgKi8KLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKLSMgIGRlZmluZSBUUkFOU0ZPUk1fUldfU0hJRlQgVFJBTlNGT1JNX1JXCi0jZWxzZQotIyAgZGVmaW5lIFRSQU5TRk9STV9SV19TSElGVCBUUkFOU0ZPUk1fUgotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECi0gICBUKFNISUZULCAgICAgICAgICAgICAgIHNCSVQsIFgsICAgWCwgIEFMTCwgUldfU0hJRlQpLAotICAgICAgLyogcmVkdWNlcyBjb21wb25lbnQgdmFsdWVzIHRvIHRoZSBvcmlnaW5hbCByYW5nZSBiYXNlZCBvbiB0aGUgc0JJVCBjaHVuaywKLSAgICAgICAqIHRoaXMgaXMgb25seSBwYXJ0aWFsbHkgcmV2ZXJzaWJsZSAtIHRoZSBsb3cgYml0cyBhcmUgbG9zdCBhbmQgY2Fubm90IGJlCi0gICAgICAgKiByZWNvdmVyZWQgb24gd3JpdGUuICBJbiBmYWN0IHdyaXRlIGNvZGUgcmVwbGljYXRlcyB0aGUgYml0cyB0byBnZW5lcmF0ZQotICAgICAgICogbmV3IGxvdy1vcmRlciBiaXRzLgotICAgICAgICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRAotIyAgZGVmaW5lIFRSQU5TRk9STV9SV19CR1IgVFJBTlNGT1JNX1JXCi0jZWxzZQotIyAgZGVmaW5lIFRSQU5TRk9STV9SV19CR1IgVFJBTlNGT1JNX1IKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX0JHUl9TVVBQT1JURUQKLSAgIFQoQkdSLCAgICAgICAgICAgICAgICAgTk9ORSwgQywgICBQLCBUUlVFLCBSV19CR1IpLAotICAgICAgLyogcmV2ZXJzZXMgdGhlIHJnYiBjb21wb25lbnQgdmFsdWVzIG9mIHRydWUtY29sb3IgcGl4ZWxzICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQKLSMgIGRlZmluZSBUUkFOU0ZPUk1fUldfU1dBUF9BTFBIQSBUUkFOU0ZPUk1fUlcKLSNlbHNlCi0jICBkZWZpbmUgVFJBTlNGT1JNX1JXX1NXQVBfQUxQSEEgVFJBTlNGT1JNX1IKLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX1NXQVBfQUxQSEFfU1VQUE9SVEVECi0gICBUKFNXQVBfQUxQSEEsICAgICAgICAgIE5PTkUsIEEsICAgWCwgVFJVRSwgUldfU1dBUF9BTFBIQSksCi0gICAgICAvKiBzd2FwcyB0aGUgYWxwaGEgY2hhbm5lbCBvZiBSR0JBIG9yIEdBIHBpeGVscyB0byB0aGUgZnJvbnQgLSBBUkdCIG9yCi0gICAgICAgKiBBRywgb24gd3JpdGUgcmV2ZXJzZXMgdGhlIHByb2Nlc3MuCi0gICAgICAgKi8KLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9TV0FQX1NVUFBPUlRFRAotIyAgZGVmaW5lIFRSQU5TRk9STV9SV19TV0FQIFRSQU5TRk9STV9SVwotI2Vsc2UKLSMgIGRlZmluZSBUUkFOU0ZPUk1fUldfU1dBUCBUUkFOU0ZPUk1fUgotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKLSAgIFQoU1dBUF9FTkRJQU4sICAgICAgICAgTk9ORSwgWCwgICBQLCAgIDE2LCBSV19TV0FQKSwKLSAgICAgIC8qIGJ5dGUtc3dhcHMgMTYtYml0IGNvbXBvbmVudCB2YWx1ZXMgKi8KLSNlbmRpZgotI2lmZGVmIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi0jICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVF9BTFBIQSBUUkFOU0ZPUk1fUlcKLSNlbHNlCi0jICBkZWZpbmUgVFJBTlNGT1JNX1JXX0lOVkVSVF9BTFBIQSBUUkFOU0ZPUk1fUgotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotICAgVChJTlZFUlRfQUxQSEEsICAgICAgICBOT05FLCBBLCAgIFgsIFRSVUUsIFJXX0lOVkVSVF9BTFBIQSksCi0gICAgICAvKiBjb252ZXJ0cyBhbiBhbHBoYSBjaGFubmVsIGZyb20gMC4uMSB0byAxLi4wICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRAotICAgVChTVFJJUF9GSUxMRVJfQkVGT1JFLCBOT05FLCBBLCAgIFAsIFRSVUUsICBXKSwgLyogJ0EnIGZvciBhIGZpbGxlciEgKi8KLSAgICAgIC8qIG9uIHdyaXRlIHNraXBzIGEgbGVhZGluZyBmaWxsZXIgY2hhbm5lbDsgdGVzdGluZyByZXF1aXJlcyBkYXRhIHdpdGggYQotICAgICAgICogZmlsbGVyIGNoYW5uZWwgc28gdGhpcyBpcyBwcm9kdWNlZCBmcm9tIFJHQkEgb3IgR0EgaW1hZ2VzIGJ5IHJlbW92aW5nCi0gICAgICAgKiB0aGUgJ2FscGhhJyBmbGFnIGZyb20gdGhlIGNvbG9yIHR5cGUgaW4gcGxhY2UuCi0gICAgICAgKi8KLSAgIFQoU1RSSVBfRklMTEVSX0FGVEVSLCAgTk9ORSwgQSwgICBQLCBUUlVFLCAgVyksCi0gICAgICAvKiBvbiB3cml0ZSBzdHJpcHMgYSB0cmFpbGluZyBmaWxsZXIgY2hhbm5lbCAqLwotI2VuZGlmCi0jaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVECi0gICBUKEdSQVlfVE9fUkdCLCAgICAgICAgIE5PTkUsIFgsICAgQywgIEFMTCwgIFIpLAotICAgICAgLyogZXhwYW5kcyBncmF5c2NhbGUgaW1hZ2VzIHRvIFJHQiwgYWxzbyBjYXVzZXMgdGhlIHBhbGV0dGUgcGFydCBvZgotICAgICAgICogJ0VYUEFORCcgdG8gaGFwcGVuLiAgTG93IGJpdCBkZXB0aCBncmF5c2NhbGUgaW1hZ2VzIGFyZSBleHBhbmRlZCB0bwotICAgICAgICogOC1iaXRzIHBlciBjb21wb25lbnQgYW5kIG5vIGF0dGVtcHQgaXMgbWFkZSB0byBjb252ZXJ0IHRoZSBpbWFnZSB0byBhCi0gICAgICAgKiBwYWxldHRlIGltYWdlLiAgV2hpbGUgdGhpcyB0cmFuc2Zvcm0gaXMgcGFydGlhbGx5IHJldmVyc2libGUKLSAgICAgICAqIHBuZ193cml0ZV9wbmcgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcy4KLSAgICAgICAqLwotICAgVChHUkFZX1RPX1JHQiwgICAgICAgICBOT05FLCBQLCAgIFgsICBBTEwsICBSKSwKLSAgICAgIC8qIFRoZSAncGFsZXR0ZScgc2lkZSBlZmZlY3QgbWVudGlvbmVkIGFib3ZlOyBhIGJpdCBib2d1cyBidXQgdGhpcyBpcyB0aGUKLSAgICAgICAqIHdheSB0aGUgbGlicG5nIGNvZGUgd29ya3MuCi0gICAgICAgKi8KLSNlbmRpZgotI2lmZGVmIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQKLSAgIFQoRVhQQU5EXzE2LCAgICAgICAgICAgTk9ORSwgWCwgICBYLCAgUEFMLCAgUiksCi0gICAgICAvKiBleHBhbmRzIGltYWdlcyB0byAxNi1iaXRzIHBlciBjb21wb25lbnQsIGFzIGEgc2lkZSBlZmZlY3QgZXhwYW5kcwotICAgICAgICogcGFsZXR0ZSBpbWFnZXMgdG8gUkdCIGFuZCBleHBhbmRzIHRoZSB0Uk5TIGNodW5rIGlmIHByZXNlbnQsIHNvIGl0IGNhbgotICAgICAgICogbW9kaWZ5IDE2LWJpdCBwZXIgY29tcG9uZW50IGltYWdlcyBhcyB3ZWxsOgotICAgICAgICovCi0gICBUKEVYUEFORF8xNiwgICAgICAgICAgIHRSTlMsIFgsICAgQSwgICAxNiwgIFIpLAotICAgICAgLyogc2lkZSBlZmZlY3Qgb2YgRVhQQU5EXzE2IC0gZXhwYW5kcyB0aGUgdFJOUyBjaHVuayBpbiBhbiBSR0Igb3IgRyAxNi1iaXQKLSAgICAgICAqIGltYWdlLgotICAgICAgICovCi0jZW5kaWYKLSNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAotICAgVChTQ0FMRV8xNiwgICAgICAgICAgICBOT05FLCBYLCAgIFgsICAgMTYsICBSKSwKLSAgICAgIC8qIHNjYWxlcyAxNi1iaXQgY29tcG9uZW50cyB0byA4LWJpdHMuICovCi0jZW5kaWYKLQotICAgeyBOVUxMIC8qbmFtZSovLCAwLCAwLCAwLCAwLCAwLCAwLCAwLyohdGVzdGVkKi8gfQotCi0jdW5kZWYgVAotfTsKLQotI2RlZmluZSBBUlJBWV9TSVpFKGEpICgoc2l6ZW9mIGEpLyhzaXplb2YgYVswXSkpCi0jZGVmaW5lIFRUQUJMRV9TSVpFIEFSUkFZX1NJWkUodHJhbnNmb3JtX2luZm8pCi0KLS8qIFNvbWUgY29tYmluYXRpb25zIG9mIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgcmV2ZXJzaWJsZSBhcmUgbm90OyB0aGVzZSBjYXNlcwotICogYXJlIGJ1Z3MuCi0gKi8KLXN0YXRpYyBpbnQga25vd25fYmFkX2NvbWJvc1tdWzJdID0KLXsKLSAgIC8qIHByb2JsZW0sIGFudGlkb3RlICovCi0gICB7IFBOR19UUkFOU0ZPUk1fU0hJRlQgfCBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSwgMC8qYW50aWRvdGUqLyB9Ci19OwotCi1zdGF0aWMgaW50Ci1pc19jb21ibyhpbnQgdHJhbnNmb3JtcykKLXsKLSAgIHJldHVybiB0cmFuc2Zvcm1zICYgKHRyYW5zZm9ybXMtMSk7IC8qIG5vbi16ZXJvIGlmIG1vcmUgdGhhbiBvbmUgc2V0IGJpdCAqLwotfQotCi1zdGF0aWMgaW50Ci1maXJzdF90cmFuc2Zvcm0oaW50IHRyYW5zZm9ybXMpCi17Ci0gICByZXR1cm4gdHJhbnNmb3JtcyAmIC10cmFuc2Zvcm1zOyAvKiBsb3dlc3Qgc2V0IGJpdCAqLwotfQotCi1zdGF0aWMgaW50Ci1pc19iYWRfY29tYm8oaW50IHRyYW5zZm9ybXMpCi17Ci0gICB1bnNpZ25lZCBpbnQgaTsKLQotICAgZm9yIChpPTA7IGk8QVJSQVlfU0laRShrbm93bl9iYWRfY29tYm9zKTsgKytpKQotICAgewotICAgICAgaW50IGNvbWJvID0ga25vd25fYmFkX2NvbWJvc1tpXVswXTsKLQotICAgICAgaWYgKChjb21ibyAmIHRyYW5zZm9ybXMpID09IGNvbWJvICYmCi0gICAgICAgICAodHJhbnNmb3JtcyAmIGtub3duX2JhZF9jb21ib3NbaV1bMV0pID09IDApCi0gICAgICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgcmV0dXJuIDA7IC8qIGNvbWJvIGlzIG9rICovCi19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXRyYW5zZm9ybV9uYW1lKGludCB0KQotICAgLyogVGhlIG5hbWUsIGlmICd0JyBoYXMgbXVsdGlwbGUgYml0cyBzZXQgdGhlIG5hbWUgb2YgdGhlIGxvd2VzdCBzZXQgYml0IGlzCi0gICAgKiByZXR1cm5lZC4KLSAgICAqLwotewotICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgIHQgJj0gLXQ7IC8qIGZpcnN0IHNldCBiaXQgKi8KLQotICAgZm9yIChpPTA7IGk8VFRBQkxFX1NJWkU7ICsraSkgaWYgKHRyYW5zZm9ybV9pbmZvW2ldLm5hbWUgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGlmICgodHJhbnNmb3JtX2luZm9baV0udHJhbnNmb3JtICYgdCkgIT0gMCkKLSAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1faW5mb1tpXS5uYW1lOwotICAgfQotCi0gICByZXR1cm4gImludmFsaWQgdHJhbnNmb3JtIjsKLX0KLQotLyogVmFyaWFibGVzIGNhbGN1bGF0ZWQgYnkgdmFsaWRhdGVfVCBiZWxvdyBhbmQgdXNlZCB0byByZWNvcmQgYWxsIHRoZSBzdXBwb3J0ZWQKLSAqIHRyYW5zZm9ybXMuICBOZWVkICh1bnNpZ25lZCBpbnQpIGhlcmUgYmVjYXVzZSBvZiB0aGUgcGxhY2VzIHdoZXJlIHRoZXNlCi0gKiB2YWx1ZXMgYXJlIHVzZWQgKHVuc2lnbmVkIGNvbXBhcmVzIGluIHRoZSAnZXhoYXVzdGl2ZScgaXRlcmF0b3IuKQotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfdHJhbnNmb3Jtcywgd3JpdGVfdHJhbnNmb3JtcywgcndfdHJhbnNmb3JtczsKLQotc3RhdGljIHZvaWQKLXZhbGlkYXRlX1Qodm9pZCkKLSAgIC8qIFZhbGlkYXRlIHRoZSBhYm92ZSB0YWJsZSAtIHRoaXMganVzdCBidWlsZHMgdGhlIGFib3ZlIHZhbHVlcyAqLwotewotICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgIGZvciAoaT0wOyBpPFRUQUJMRV9TSVpFOyArK2kpIGlmICh0cmFuc2Zvcm1faW5mb1tpXS5uYW1lICE9IE5VTEwpCi0gICB7Ci0gICAgICBpZiAodHJhbnNmb3JtX2luZm9baV0ud2hlbiAmIFRSQU5TRk9STV9SKQotICAgICAgICAgcmVhZF90cmFuc2Zvcm1zIHw9IHRyYW5zZm9ybV9pbmZvW2ldLnRyYW5zZm9ybTsKLQotICAgICAgaWYgKHRyYW5zZm9ybV9pbmZvW2ldLndoZW4gJiBUUkFOU0ZPUk1fVykKLSAgICAgICAgIHdyaXRlX3RyYW5zZm9ybXMgfD0gdHJhbnNmb3JtX2luZm9baV0udHJhbnNmb3JtOwotICAgfQotCi0gICAvKiBSZXZlcnNpYmxlIHRyYW5zZm9ybXMgYXJlIHRob3NlIHdoaWNoIGFyZSBzdXBwb3J0ZWQgb24gYm90aCByZWFkIGFuZAotICAgICogd3JpdGUuCi0gICAgKi8KLSAgIHJ3X3RyYW5zZm9ybXMgPSByZWFkX3RyYW5zZm9ybXMgJiB3cml0ZV90cmFuc2Zvcm1zOwotfQotCi0vKiBGSUxFIERBVEEgSEFORExJTkcKLSAqICAgIFRoZSBvcmlnaW5hbCBmaWxlIGlzIGNhY2hlZCBpbiBtZW1vcnkuICBEdXJpbmcgd3JpdGUgdGhlIG91dHB1dCBmaWxlIGlzCi0gKiAgICB3cml0dGVuIHRvIG1lbW9yeS4KLSAqCi0gKiAgICBJbiBib3RoIGNhc2VzIHRoZSBmaWxlIGRhdGEgaXMgaGVsZCBpbiBhIGxpbmtlZCBsaXN0IG9mIGJ1ZmZlcnMgLSBub3QgYWxsCi0gKiAgICBvZiB0aGVzZSBhcmUgaW4gdXNlIGF0IGFueSB0aW1lLgotICovCi0jZGVmaW5lIE5FVyh0eXBlKSAoKHR5cGUgKiltYWxsb2Moc2l6ZW9mICh0eXBlKSkpCi0jZGVmaW5lIERFTEVURShwdHIpIChmcmVlKHB0cikpCi0KLXN0cnVjdCBidWZmZXJfbGlzdAotewotICAgc3RydWN0IGJ1ZmZlcl9saXN0ICpuZXh0OyAgICAgICAgIC8qIG5leHQgYnVmZmVyIGluIGxpc3QgKi8KLSAgIHBuZ19ieXRlICAgICAgICAgICAgYnVmZmVyWzEwMjRdOyAvKiB0aGUgYWN0dWFsIGJ1ZmZlciAqLwotfTsKLQotc3RydWN0IGJ1ZmZlcgotewotICAgc3RydWN0IGJ1ZmZlcl9saXN0ICAqbGFzdDsgICAgICAgLyogbGFzdCBidWZmZXIgaW4gdXNlICovCi0gICBzaXplX3QgICAgICAgICAgICAgICBlbmRfY291bnQ7ICAvKiBieXRlcyBpbiB0aGUgbGFzdCBidWZmZXIgKi8KLSAgIHN0cnVjdCBidWZmZXJfbGlzdCAgKmN1cnJlbnQ7ICAgIC8qIGN1cnJlbnQgYnVmZmVyIGJlaW5nIHJlYWQgKi8KLSAgIHNpemVfdCAgICAgICAgICAgICAgIHJlYWRfY291bnQ7IC8qIGNvdW50IG9mIGJ5dGVzIHJlYWQgZnJvbSBjdXJyZW50ICovCi0gICBzdHJ1Y3QgYnVmZmVyX2xpc3QgICBmaXJzdDsgICAgICAvKiB0aGUgdmVyeSBmaXJzdCBidWZmZXIgKi8KLX07Ci0KLXN0YXRpYyB2b2lkCi1idWZmZXJfaW5pdChzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCi0gICAvKiBDYWxsIHRoaXMgb25seSBvbmNlIGZvciBhIGdpdmVuIGJ1ZmZlciAqLwotewotICAgYnVmZmVyLT5maXJzdC5uZXh0ID0gTlVMTDsKLSAgIGJ1ZmZlci0+bGFzdCA9IE5VTEw7Ci0gICBidWZmZXItPmN1cnJlbnQgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotYnVmZmVyX2Rlc3Ryb3lfbGlzdChzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxpc3QpCi17Ci0gICBpZiAobGlzdCAhPSBOVUxMKQotICAgewotICAgICAgc3RydWN0IGJ1ZmZlcl9saXN0ICpuZXh0ID0gbGlzdC0+bmV4dDsKLSAgICAgIERFTEVURShsaXN0KTsKLSAgICAgIGJ1ZmZlcl9kZXN0cm95X2xpc3QobmV4dCk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idWZmZXJfZGVzdHJveShzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCi17Ci0gICBzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxpc3QgPSBidWZmZXItPmZpcnN0Lm5leHQ7Ci0gICBidWZmZXJfaW5pdChidWZmZXIpOwotICAgYnVmZmVyX2Rlc3Ryb3lfbGlzdChsaXN0KTsKLX0KLQotI2lmZGVmIFBOR19XUklURV9QTkdfU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotYnVmZmVyX3N0YXJ0X3dyaXRlKHN0cnVjdCBidWZmZXIgKmJ1ZmZlcikKLXsKLSAgIGJ1ZmZlci0+bGFzdCA9ICZidWZmZXItPmZpcnN0OwotICAgYnVmZmVyLT5lbmRfY291bnQgPSAwOwotICAgYnVmZmVyLT5jdXJyZW50ID0gTlVMTDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotYnVmZmVyX3N0YXJ0X3JlYWQoc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQotewotICAgYnVmZmVyLT5jdXJyZW50ID0gJmJ1ZmZlci0+Zmlyc3Q7Ci0gICBidWZmZXItPnJlYWRfY291bnQgPSAwOwotfQotCi0jaWZkZWYgRU5PTUVNIC8qIHJlcXVpcmVkIGJ5IFBPU0lYIDEwMDMuMSAqLwotIyAgZGVmaW5lIE1FTU9SWSBFTk9NRU0KLSNlbHNlCi0jICBkZWZpbmUgTUVNT1JZIEVSQU5HRSAvKiByZXF1aXJlZCBieSBBTlNJLUMgKi8KLSNlbmRpZgotc3RhdGljIHN0cnVjdCBidWZmZXIgKgotZ2V0X2J1ZmZlcihwbmdfc3RydWN0cCBwcCkKLSAgIC8qIFVzZWQgZnJvbSBsaWJwbmcgY2FsbGJhY2tzIHRvIGdldCB0aGUgY3VycmVudCBidWZmZXIgKi8KLXsKLSAgIHJldHVybiAoc3RydWN0IGJ1ZmZlciopcG5nX2dldF9pb19wdHIocHApOwotfQotCi1zdGF0aWMgc3RydWN0IGJ1ZmZlcl9saXN0ICoKLWJ1ZmZlcl9leHRlbmQoc3RydWN0IGJ1ZmZlcl9saXN0ICpjdXJyZW50KQotewotICAgc3RydWN0IGJ1ZmZlcl9saXN0ICphZGQ7Ci0KLSAgIGFzc2VydChjdXJyZW50LT5uZXh0ID09IE5VTEwpOwotCi0gICBhZGQgPSBORVcoc3RydWN0IGJ1ZmZlcl9saXN0KTsKLSAgIGlmIChhZGQgPT0gTlVMTCkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICBhZGQtPm5leHQgPSBOVUxMOwotICAgY3VycmVudC0+bmV4dCA9IGFkZDsKLQotICAgcmV0dXJuIGFkZDsKLX0KLQotLyogTG9hZCBhIGJ1ZmZlciBmcm9tIGEgZmlsZTsgZG9lcyB0aGUgZXF1aXZhbGVudCBvZiBidWZmZXJfc3RhcnRfd3JpdGUuICBPbiBhCi0gKiByZWFkIGVycm9yIHJldHVybnMgYW4gZXJybm8gdmFsdWUsIGVsc2UgcmV0dXJucyAwLgotICovCi1zdGF0aWMgaW50Ci1idWZmZXJfZnJvbV9maWxlKHN0cnVjdCBidWZmZXIgKmJ1ZmZlciwgRklMRSAqZnApCi17Ci0gICBzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxhc3QgPSAmYnVmZmVyLT5maXJzdDsKLSAgIHNpemVfdCBjb3VudCA9IDA7Ci0KLSAgIGZvciAoOzspCi0gICB7Ci0gICAgICBzaXplX3QgciA9IGZyZWFkKGxhc3QtPmJ1ZmZlcitjb3VudCwgMS8qc2l6ZSovLAotICAgICAgICAgKHNpemVvZiBsYXN0LT5idWZmZXIpLWNvdW50LCBmcCk7Ci0KLSAgICAgIGlmIChyID4gMCkKLSAgICAgIHsKLSAgICAgICAgIGNvdW50ICs9IHI7Ci0KLSAgICAgICAgIGlmIChjb3VudCA+PSBzaXplb2YgbGFzdC0+YnVmZmVyKQotICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KGNvdW50ID09IHNpemVvZiBsYXN0LT5idWZmZXIpOwotICAgICAgICAgICAgY291bnQgPSAwOwotCi0gICAgICAgICAgICBpZiAobGFzdC0+bmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbGFzdCA9IGJ1ZmZlcl9leHRlbmQobGFzdCk7Ci0gICAgICAgICAgICAgICBpZiAobGFzdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIE1FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgbGFzdCA9IGxhc3QtPm5leHQ7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgLyogZnJlYWQgZmFpbGVkIC0gcHJvYmFibHkgZW5kIG9mIGZpbGUgKi8KLSAgICAgIHsKLSAgICAgICAgIGlmIChmZW9mKGZwKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+bGFzdCA9IGxhc3Q7Ci0gICAgICAgICAgICBidWZmZXItPmVuZF9jb3VudCA9IGNvdW50OwotICAgICAgICAgICAgcmV0dXJuIDA7IC8qIG5vIGVycm9yICovCi0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIFNvbWUga2luZCBvZiBmdW5reSBlcnJvcjsgZXJybm8gc2hvdWxkIGJlIG5vbi16ZXJvICovCi0gICAgICAgICByZXR1cm4gZXJybm8gPT0gMCA/IEVSQU5HRSA6IGVycm5vOwotICAgICAgfQotICAgfQotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHRlc3Qgb2YgYSBzaW5nbGUgZmlsZS4gKi8KLXR5cGVkZWYgZW51bQotewotICAgVkVSQk9TRSwgICAgICAgIC8qIHN3aXRjaGVzIG9uIGFsbCBtZXNzYWdlcyAqLwotICAgSU5GT1JNQVRJT04sCi0gICBXQVJOSU5HUywgICAgICAgLyogc3dpdGNoZXMgb24gd2FybmluZ3MgKi8KLSAgIExJQlBOR19XQVJOSU5HLAotICAgQVBQX1dBUk5JTkcsCi0gICBFUlJPUlMsICAgICAgICAgLyoganVzdCBlcnJvcnMgKi8KLSAgIEFQUF9GQUlMLCAgICAgICAvKiBjb250aW51YWJsZSBlcnJvciAtIG5vIG5lZWQgdG8gbG9uZ2ptcCAqLwotICAgTElCUE5HX0VSUk9SLCAgIC8qIHRoaXMgYW5kIGhpZ2hlciBjYXVzZSBhIGxvbmdqbXAgKi8KLSAgIExJQlBOR19CVUcsICAgICAvKiBlcnJvbmVvdXMgYmVoYXZpb3IgaW4gbGlicG5nICovCi0gICBBUFBfRVJST1IsICAgICAgLyogc3VjaCBhcyBvdXQtb2YtbWVtb3J5IGluIGEgY2FsbGJhY2sgKi8KLSAgIFFVSUVULCAgICAgICAgICAvKiBubyBub3JtYWwgbWVzc2FnZXMgKi8KLSAgIFVTRVJfRVJST1IsICAgICAvKiBzdWNoIGFzIGZpbGUtbm90LWZvdW5kICovCi0gICBJTlRFUk5BTF9FUlJPUgotfSBlcnJvcl9sZXZlbDsKLSNkZWZpbmUgTEVWRUxfTUFTSyAgICAgIDB4ZiAgIC8qIHdoZXJlIHRoZSBsZXZlbCBpcyBpbiAnb3B0aW9ucycgKi8KLQotI2RlZmluZSBFWEhBVVNUSVZFICAgICAgMHgwMTAgLyogVGVzdCBhbGwgY29tYmluYXRpb25zIG9mIGFjdGl2ZSBvcHRpb25zICovCi0jZGVmaW5lIFNUUklDVCAgICAgICAgICAweDAyMCAvKiBGYWlsIG9uIHdhcm5pbmdzIGFzIHdlbGwgYXMgZXJyb3JzICovCi0jZGVmaW5lIExPRyAgICAgICAgICAgICAweDA0MCAvKiBMb2cgcGFzcy9mYWlsIHRvIHN0ZG91dCAqLwotI2RlZmluZSBDT05USU5VRSAgICAgICAgMHgwODAgLyogQ29udGludWUgb24gQVBQX0ZBSUwgZXJyb3JzICovCi0jZGVmaW5lIFNLSVBfQlVHUyAgICAgICAweDEwMCAvKiBTa2lwIG92ZXIga25vd24gYnVncyAqLwotI2RlZmluZSBMT0dfU0tJUFBFRCAgICAgMHgyMDAgLyogTG9nIHNraXBwZWQgYnVncyAqLwotI2RlZmluZSBGSU5EX0JBRF9DT01CT1MgMHg0MDAgLyogQXR0ZW1wdCB0byBkZWR1Y2UgYmFkIGNvbWJvcyAqLwotI2RlZmluZSBMSVNUX0NPTUJPUyAgICAgMHg4MDAgLyogTGlzdCBjb21ib3MgYnkgbmFtZSAqLwotCi0vKiBSZXN1bHQgbWFza3MgYXBwbHkgdG8gdGhlIHJlc3VsdCBiaXRzIGluIHRoZSAncmVzdWx0cycgZmllbGQgYmVsb3c7IHRoZXNlCi0gKiBiaXRzIGFyZSBzaW1wbGUgMVU8PGVycm9yX2xldmVsLiAgQSBwYXNzIHJlcXVpcmVzIGVpdGhlciBub3RoaW5nIHdvcnNlIHRoYW4KLSAqIHdhcm5pbmdzICgtLXJlbGF4ZXMpIG9yIG5vdGhpbmcgd29yc2UgdGhhbiBpbmZvcm1hdGlvbiAoLS1zdHJpY3QpCi0gKi8KLSNkZWZpbmUgUkVTVUxUX1NUUklDVChyKSAgICgoKHIpICYgfigoMVU8PFdBUk5JTkdTKS0xKSkgPT0gMCkKLSNkZWZpbmUgUkVTVUxUX1JFTEFYRUQocikgICgoKHIpICYgfigoMVU8PEVSUk9SUyktMSkpID09IDApCi0KLXN0cnVjdCBkaXNwbGF5Ci17Ci0gICBqbXBfYnVmICAgICAgICBlcnJvcl9yZXR1cm47ICAgICAgLyogV2hlcmUgdG8gZ28gdG8gb24gZXJyb3IgKi8KLQotICAgY29uc3QgY2hhciAgICAqZmlsZW5hbWU7ICAgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBmaWxlICovCi0gICBjb25zdCBjaGFyICAgICpvcGVyYXRpb247ICAgICAgICAgLyogT3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAqLwotICAgaW50ICAgICAgICAgICAgdHJhbnNmb3JtczsgICAgICAgIC8qIFRyYW5zZm9ybSB1c2VkIGluIG9wZXJhdGlvbiAqLwotICAgcG5nX3VpbnRfMzIgICAgb3B0aW9uczsgICAgICAgICAgIC8qIFNlZSBkaXNwbGF5X2xvZyBiZWxvdyAqLwotICAgcG5nX3VpbnRfMzIgICAgcmVzdWx0czsgICAgICAgICAgIC8qIEEgbWFzayBvZiBlcnJvcnMgc2VlbiAqLwotCi0KLSAgIHBuZ19zdHJ1Y3RwICAgIG9yaWdpbmFsX3BwOyAgICAgICAvKiB1c2VkIG9uIHRoZSBvcmlnaW5hbCByZWFkICovCi0gICBwbmdfaW5mb3AgICAgICBvcmlnaW5hbF9pcDsgICAgICAgLyogc2V0IGJ5IHRoZSBvcmlnaW5hbCByZWFkICovCi0KLSAgIHBuZ19zaXplX3QgICAgIG9yaWdpbmFsX3Jvd2J5dGVzOyAvKiBvZiB0aGUgb3JpZ2luYWwgcm93czogKi8KLSAgIHBuZ19ieXRlcHAgICAgIG9yaWdpbmFsX3Jvd3M7ICAgICAvKiBmcm9tIHRoZSBvcmlnaW5hbCByZWFkICovCi0KLSAgIC8qIE9yaWdpbmFsIGNodW5rcyB2YWxpZCAqLwotICAgcG5nX3VpbnRfMzIgICAgY2h1bmtzOwotCi0gICAvKiBPcmlnaW5hbCBJSERSIGluZm9ybWF0aW9uICovCi0gICBwbmdfdWludF8zMiAgICB3aWR0aDsKLSAgIHBuZ191aW50XzMyICAgIGhlaWdodDsKLSAgIGludCAgICAgICAgICAgIGJpdF9kZXB0aDsKLSAgIGludCAgICAgICAgICAgIGNvbG9yX3R5cGU7Ci0gICBpbnQgICAgICAgICAgICBpbnRlcmxhY2VfbWV0aG9kOwotICAgaW50ICAgICAgICAgICAgY29tcHJlc3Npb25fbWV0aG9kOwotICAgaW50ICAgICAgICAgICAgZmlsdGVyX21ldGhvZDsKLQotICAgLyogRGVyaXZlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIGltYWdlLiAqLwotICAgaW50ICAgICAgICAgICAgYWN0aXZlX3RyYW5zZm9ybXM7ICAvKiB0cmFuc2Zvcm1zIHRoYXQgZG8gc29tZXRoaW5nIG9uIHJlYWQgKi8KLSAgIGludCAgICAgICAgICAgIGlnbm9yZWRfdHJhbnNmb3JtczsgLyogdHJhbnNmb3JtcyB0aGF0IHNob3VsZCBkbyBub3RoaW5nICovCi0KLSAgIC8qIFVzZWQgb24gYSByZWFkLCBib3RoIHRoZSBvcmlnaW5hbCByZWFkIGFuZCB3aGVuIHZhbGlkYXRpbmcgYSB3cml0dGVuCi0gICAgKiBpbWFnZS4KLSAgICAqLwotICAgcG5nX3N0cnVjdHAgICAgcmVhZF9wcDsKLSAgIHBuZ19pbmZvcCAgICAgIHJlYWRfaXA7Ci0KLSMgIGlmZGVmIFBOR19XUklURV9QTkdfU1VQUE9SVEVECi0gICAgICAvKiBVc2VkIHRvIHdyaXRlIGEgbmV3IGltYWdlICh0aGUgb3JpZ2luYWwgaW5mb19wdHIgaXMgdXNlZCkgKi8KLSAgICAgIHBuZ19zdHJ1Y3RwICAgd3JpdGVfcHA7Ci0gICAgICBzdHJ1Y3QgYnVmZmVyIHdyaXR0ZW5fZmlsZTsgICAvKiB3aGVyZSB0aGUgZmlsZSBnZXRzIHdyaXR0ZW4gKi8KLSMgIGVuZGlmCi0KLSAgIHN0cnVjdCBidWZmZXIgIG9yaWdpbmFsX2ZpbGU7ICAgICAvKiBEYXRhIHJlYWQgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSAqLwotfTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5pdChzdHJ1Y3QgZGlzcGxheSAqZHApCi0gICAvKiBDYWxsIHRoaXMgb25seSBvbmNlIHJpZ2h0IGF0IHRoZSBzdGFydCB0byBpbml0aWFsaXplIHRoZSBjb250cm9sCi0gICAgKiBzdHJ1Y3R1cmUsIHRoZSAoc3RydWN0IGJ1ZmZlcikgbGlzdHMgYXJlIG1haW50YWluZWQgYWNyb3NzIGNhbGxzIC0gdGhlCi0gICAgKiBtZW1vcnkgaXMgbm90IGZyZWVkLgotICAgICovCi17Ci0gICBtZW1zZXQoZHAsIDAsIHNpemVvZiAqZHApOwotICAgZHAtPm9wdGlvbnMgPSBXQVJOSU5HUzsgLyogZGVmYXVsdCB0byAhdmVyYm9zZSwgIXF1aWV0ICovCi0gICBkcC0+ZmlsZW5hbWUgPSBOVUxMOwotICAgZHAtPm9wZXJhdGlvbiA9IE5VTEw7Ci0gICBkcC0+b3JpZ2luYWxfcHAgPSBOVUxMOwotICAgZHAtPm9yaWdpbmFsX2lwID0gTlVMTDsKLSAgIGRwLT5vcmlnaW5hbF9yb3dzID0gTlVMTDsKLSAgIGRwLT5yZWFkX3BwID0gTlVMTDsKLSAgIGRwLT5yZWFkX2lwID0gTlVMTDsKLSAgIGJ1ZmZlcl9pbml0KCZkcC0+b3JpZ2luYWxfZmlsZSk7Ci0KLSMgIGlmZGVmIFBOR19XUklURV9QTkdfU1VQUE9SVEVECi0gICAgICBkcC0+d3JpdGVfcHAgPSBOVUxMOwotICAgICAgYnVmZmVyX2luaXQoJmRwLT53cml0dGVuX2ZpbGUpOwotIyAgZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfY2xlYW5fcmVhZChzdHJ1Y3QgZGlzcGxheSAqZHApCi17Ci0gICBpZiAoZHAtPnJlYWRfcHAgIT0gTlVMTCkKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZkcC0+cmVhZF9wcCwgJmRwLT5yZWFkX2lwLCBOVUxMKTsKLX0KLQotI2lmZGVmIFBOR19XUklURV9QTkdfU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotZGlzcGxheV9jbGVhbl93cml0ZShzdHJ1Y3QgZGlzcGxheSAqZHApCi17Ci0gICAgICBpZiAoZHAtPndyaXRlX3BwICE9IE5VTEwpCi0gICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJmRwLT53cml0ZV9wcCwgTlVMTCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfY2xlYW4oc3RydWN0IGRpc3BsYXkgKmRwKQotewotIyAgaWZkZWYgUE5HX1dSSVRFX1BOR19TVVBQT1JURUQKLSAgICAgIGRpc3BsYXlfY2xlYW5fd3JpdGUoZHApOwotIyAgZW5kaWYKLSAgIGRpc3BsYXlfY2xlYW5fcmVhZChkcCk7Ci0KLSAgIGRwLT5vcmlnaW5hbF9yb3dieXRlcyA9IDA7Ci0gICBkcC0+b3JpZ2luYWxfcm93cyA9IE5VTEw7Ci0gICBkcC0+Y2h1bmtzID0gMDsKLQotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJmRwLT5vcmlnaW5hbF9wcCwgJmRwLT5vcmlnaW5hbF9pcCwgTlVMTCk7Ci0gICAvKiBsZWF2ZSB0aGUgZmlsZW5hbWUgZm9yIGVycm9yIGRldGVjdGlvbiAqLwotICAgZHAtPnJlc3VsdHMgPSAwOyAvKiByZXNldCBmb3IgbmV4dCB0aW1lICovCi19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2Rlc3Ryb3koc3RydWN0IGRpc3BsYXkgKmRwKQotewotICAgIC8qIFJlbGVhc2UgYW55IG1lbW9yeSBoZWxkIGluIHRoZSBkaXNwbGF5LiAqLwotIyAgaWZkZWYgUE5HX1dSSVRFX1BOR19TVVBQT1JURUQKLSAgICAgIGJ1ZmZlcl9kZXN0cm95KCZkcC0+d3JpdHRlbl9maWxlKTsKLSMgIGVuZGlmCi0KLSAgIGJ1ZmZlcl9kZXN0cm95KCZkcC0+b3JpZ2luYWxfZmlsZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGlzcGxheSAqCi1nZXRfZHAocG5nX3N0cnVjdHAgcHApCi0gICAvKiBUaGUgZGlzcGxheSBwb2ludGVyIGlzIGFsd2F5cyBzdG9yZWQgaW4gdGhlIHBuZ19zdHJ1Y3QgZXJyb3IgcG9pbnRlciAqLwotewotICAgc3RydWN0IGRpc3BsYXkgKmRwID0gKHN0cnVjdCBkaXNwbGF5KilwbmdfZ2V0X2Vycm9yX3B0cihwcCk7Ci0KLSAgIGlmIChkcCA9PSBOVUxMKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJwbmdpbWFnZTogaW50ZXJuYWwgZXJyb3IgKG5vIGRpc3BsYXkpXG4iKTsKLSAgICAgIGV4aXQoOTkpOyAvKiBwcmV2ZW50cyBhIGNyYXNoICovCi0gICB9Ci0KLSAgIHJldHVybiBkcDsKLX0KLQotLyogZXJyb3IgaGFuZGxpbmcgKi8KLSNpZmRlZiBfX0dOVUNfXwotIyAgZGVmaW5lIFZHQVRUUiBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLDMsNCkpKQotICAgLyogUmVxdWlyZWQgdG8gcXVpZXQgR05VQyB3YXJuaW5ncyB3aGVuIHRoZSBjb21waWxlciBzZWVzIGEgc3RkYXJnIGZ1bmN0aW9uCi0gICAgKiB0aGF0IGNhbGxzIG9uZSBvZiB0aGUgc3RkaW8gdiBBUElzLgotICAgICovCi0jZWxzZQotIyAgZGVmaW5lIFZHQVRUUgotI2VuZGlmCi1zdGF0aWMgdm9pZCBWR0FUVFIKLWRpc3BsYXlfbG9nKHN0cnVjdCBkaXNwbGF5ICpkcCwgZXJyb3JfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgLyogJ2xldmVsJyBpcyBhcyBhYm92ZSwgZm10IGlzIGEgc3RkaW8gc3R5bGUgZm9ybWF0IHN0cmluZy4gIFRoaXMgcm91dGluZQotICAgICogZG9lcyBub3QgcmV0dXJuIGlmIGxldmVsIGlzIGFib3ZlIExJQlBOR19XQVJOSU5HCi0gICAgKi8KLXsKLSAgIGRwLT5yZXN1bHRzIHw9IDFVIDw8IGxldmVsOwotCi0gICBpZiAobGV2ZWwgPiAoZXJyb3JfbGV2ZWwpKGRwLT5vcHRpb25zICYgTEVWRUxfTUFTSykpCi0gICB7Ci0gICAgICBjb25zdCBjaGFyICpscDsKLSAgICAgIHZhX2xpc3QgYXA7Ci0KLSAgICAgIHN3aXRjaCAobGV2ZWwpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIElORk9STUFUSU9OOiAgICBscCA9ICJpbmZvcm1hdGlvbiI7IGJyZWFrOwotICAgICAgICAgY2FzZSBMSUJQTkdfV0FSTklORzogbHAgPSAid2FybmluZyhsaWJwbmcpIjsgYnJlYWs7Ci0gICAgICAgICBjYXNlIEFQUF9XQVJOSU5HOiAgICBscCA9ICJ3YXJuaW5nKHBuZ2ltYWdlKSI7IGJyZWFrOwotICAgICAgICAgY2FzZSBBUFBfRkFJTDogICAgICAgbHAgPSAiZXJyb3IoY29udGludWFibGUpIjsgYnJlYWs7Ci0gICAgICAgICBjYXNlIExJQlBOR19FUlJPUjogICBscCA9ICJlcnJvcihsaWJwbmcpIjsgYnJlYWs7Ci0gICAgICAgICBjYXNlIExJQlBOR19CVUc6ICAgICBscCA9ICJidWcobGlicG5nKSI7IGJyZWFrOwotICAgICAgICAgY2FzZSBBUFBfRVJST1I6ICAgICAgbHAgPSAiZXJyb3IocG5naW1hZ2UpIjsgYnJlYWs7Ci0gICAgICAgICBjYXNlIFVTRVJfRVJST1I6ICAgICBscCA9ICJlcnJvcih1c2VyKSI7IGJyZWFrOwotCi0gICAgICAgICBjYXNlIElOVEVSTkFMX0VSUk9SOiAvKiBhbnl0aGluZyB1bmV4cGVjdGVkIGlzIGFuIGludGVybmFsIGVycm9yOiAqLwotICAgICAgICAgY2FzZSBWRVJCT1NFOiBjYXNlIFdBUk5JTkdTOiBjYXNlIEVSUk9SUzogY2FzZSBRVUlFVDoKLSAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIGxwID0gImJ1ZyhwbmdpbWFnZSkiOyBicmVhazsKLSAgICAgIH0KLQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXM6ICVzIiwKLSAgICAgICAgIGRwLT5maWxlbmFtZSAhPSBOVUxMID8gZHAtPmZpbGVuYW1lIDogIjxzdGRpbj4iLCBscCwgZHAtPm9wZXJhdGlvbik7Ci0KLSAgICAgIGlmIChkcC0+dHJhbnNmb3JtcyAhPSAwKQotICAgICAgewotICAgICAgICAgaW50IHRyID0gZHAtPnRyYW5zZm9ybXM7Ci0KLSAgICAgICAgIGlmIChpc19jb21ibyh0cikpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZHAtPm9wdGlvbnMgJiBMSVNUX0NPTUJPUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGludCB0cnggPSB0cjsKLQotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIoIik7Ci0gICAgICAgICAgICAgICBpZiAodHJ4KQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgd2hpbGUgKHRyeCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGludCB0cnogPSB0cnggJiAtdHJ4OwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIGZwcmludGYoc3RkZXJyLCAiKyIpOwotICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHRyYW5zZm9ybV9uYW1lKHRyeikpOwotICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgdHJ4ICY9IH50cno7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLSIpOwotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKDB4JXgpIiwgdHIpOwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiglcykiLCB0cmFuc2Zvcm1fbmFtZSh0cikpOwotICAgICAgfQotCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIjogIik7Ci0KLSAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKLSAgICAgIHZhX2VuZChhcCk7Ci0KLSAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7Ci0gICB9Ci0gICAvKiBlbHNlIGRvIG5vdCBvdXRwdXQgYW55IG1lc3NhZ2UgKi8KLQotICAgLyogRXJyb3JzIGNhdXNlIHRoaXMgcm91dGluZSB0byBleGl0IHRvIHRoZSBmYWlsIGNvZGUgKi8KLSAgIGlmIChsZXZlbCA+IEFQUF9GQUlMIHx8IChsZXZlbCA+IEVSUk9SUyAmJiAhKGRwLT5vcHRpb25zICYgQ09OVElOVUUpKSkKLSAgICAgIGxvbmdqbXAoZHAtPmVycm9yX3JldHVybiwgbGV2ZWwpOwotfQotCi0vKiBlcnJvciBoYW5kbGVyIGNhbGxiYWNrcyBmb3IgbGlicG5nICovCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotZGlzcGxheV93YXJuaW5nKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZykKLXsKLSAgIGRpc3BsYXlfbG9nKGdldF9kcChwcCksIExJQlBOR19XQVJOSU5HLCAiJXMiLCB3YXJuaW5nKTsKLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLWRpc3BsYXlfZXJyb3IocG5nX3N0cnVjdHAgcHAsIHBuZ19jb25zdF9jaGFycCBlcnJvcikKLXsKLSAgIHN0cnVjdCBkaXNwbGF5ICpkcCA9IGdldF9kcChwcCk7Ci0KLSAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfRVJST1IsICIlcyIsIGVycm9yKTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfY2FjaGVfZmlsZShzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgLyogRG9lcyB0aGUgaW5pdGlhbCBjYWNoZSBvZiB0aGUgZmlsZS4gKi8KLXsKLSAgIEZJTEUgKmZwOwotICAgaW50IHJldDsKLQotICAgZHAtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0KLSAgIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotICAgewotICAgICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7Ci0gICAgICBpZiAoZnAgPT0gTlVMTCkKLSAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLCAib3BlbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgIH0KLQotICAgZWxzZQotICAgICAgZnAgPSBzdGRpbjsKLQotICAgcmV0ID0gYnVmZmVyX2Zyb21fZmlsZSgmZHAtPm9yaWdpbmFsX2ZpbGUsIGZwKTsKLQotICAgZmNsb3NlKGZwKTsKLQotICAgaWYgKHJldCAhPSAwKQotICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9FUlJPUiwgInJlYWQgZmFpbGVkOiAlcyIsIHN0cmVycm9yKHJldCkpOwotfQotCi1zdGF0aWMgdm9pZAotYnVmZmVyX3JlYWQoc3RydWN0IGRpc3BsYXkgKmRwLCBzdHJ1Y3QgYnVmZmVyICpicCwgcG5nX2J5dGVwIGRhdGEsCi0gICBwbmdfc2l6ZV90IHNpemUpCi17Ci0gICBzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxhc3QgPSBicC0+Y3VycmVudDsKLSAgIHNpemVfdCByZWFkX2NvdW50ID0gYnAtPnJlYWRfY291bnQ7Ci0KLSAgIHdoaWxlIChzaXplID4gMCkKLSAgIHsKLSAgICAgIHNpemVfdCBhdmFpbDsKLQotICAgICAgaWYgKGxhc3QgPT0gTlVMTCB8fAotICAgICAgICAgKGxhc3QgPT0gYnAtPmxhc3QgJiYgcmVhZF9jb3VudCA+PSBicC0+ZW5kX2NvdW50KSkKLSAgICAgIHsKLSAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLCAiZmlsZSB0cnVuY2F0ZWQgKCVsdSBieXRlcykiLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7Ci0gICAgICAgICAvKk5PVFJFQUNIRUQqLwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKHJlYWRfY291bnQgPj0gc2l6ZW9mIGxhc3QtPmJ1ZmZlcikKLSAgICAgIHsKLSAgICAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgYnVmZmVyOiAqLwotICAgICAgICAgbGFzdCA9IGxhc3QtPm5leHQ7Ci0gICAgICAgICByZWFkX2NvdW50ID0gMDsKLSAgICAgICAgIGJwLT5jdXJyZW50ID0gbGFzdDsgLyogQXZvaWQgdXBkYXRlIG91dHNpZGUgdGhlIGxvb3AgKi8KLQotICAgICAgICAgLyogQW5kIGRvIGEgc2FuaXR5IGNoZWNrICh0aGUgRU9GIGNhc2UgaXMgY2F1Z2h0IGFib3ZlKSAqLwotICAgICAgICAgaWYgKGxhc3QgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBJTlRFUk5BTF9FUlJPUiwgImRhbWFnZWQgYnVmZmVyIGxpc3QiKTsKLSAgICAgICAgICAgIC8qTk9UUkVBQ0hFRCovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgYXZhaWwgPSAoc2l6ZW9mIGxhc3QtPmJ1ZmZlcikgLSByZWFkX2NvdW50OwotICAgICAgaWYgKGF2YWlsID4gc2l6ZSkKLSAgICAgICAgIGF2YWlsID0gc2l6ZTsKLQotICAgICAgbWVtY3B5KGRhdGEsIGxhc3QtPmJ1ZmZlciArIHJlYWRfY291bnQsIGF2YWlsKTsKLSAgICAgIHJlYWRfY291bnQgKz0gYXZhaWw7Ci0gICAgICBzaXplIC09IGF2YWlsOwotICAgICAgZGF0YSArPSBhdmFpbDsKLSAgIH0KLQotICAgYnAtPnJlYWRfY291bnQgPSByZWFkX2NvdW50OwotfQotCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotcmVhZF9mdW5jdGlvbihwbmdfc3RydWN0cCBwcCwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3Qgc2l6ZSkKLXsKLSAgIGJ1ZmZlcl9yZWFkKGdldF9kcChwcCksIGdldF9idWZmZXIocHApLCBkYXRhLCBzaXplKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlYWRfcG5nKHN0cnVjdCBkaXNwbGF5ICpkcCwgc3RydWN0IGJ1ZmZlciAqYnAsIGNvbnN0IGNoYXIgKm9wZXJhdGlvbiwKLSAgIGludCB0cmFuc2Zvcm1zKQotewotICAgcG5nX3N0cnVjdHAgcHA7Ci0gICBwbmdfaW5mb3AgICBpcDsKLQotICAgLyogVGhpcyBjbGVhbnMgb3V0IGFueSBwcmV2aW91cyByZWFkIGFuZCBzZXRzIG9wZXJhdGlvbiBhbmQgdHJhbnNmb3JtcyB0bwotICAgICogZW1wdHkuCi0gICAgKi8KLSAgIGRpc3BsYXlfY2xlYW5fcmVhZChkcCk7Ci0KLSAgIGlmIChvcGVyYXRpb24gIT0gTlVMTCkgLyogZWxzZSB0aGlzIGlzIGEgdmVyaWZ5IGFuZCBkbyBub3Qgb3ZlcndyaXRlIGluZm8gKi8KLSAgIHsKLSAgICAgIGRwLT5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgICBkcC0+dHJhbnNmb3JtcyA9IHRyYW5zZm9ybXM7Ci0gICB9Ci0KLSAgIGRwLT5yZWFkX3BwID0gcHAgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgZHAsCi0gICAgICBkaXNwbGF5X2Vycm9yLCBkaXNwbGF5X3dhcm5pbmcpOwotICAgaWYgKHBwID09IE5VTEwpCi0gICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0VSUk9SLCAiZmFpbGVkIHRvIGNyZWF0ZSByZWFkIHN0cnVjdCIpOwotCi0gICAvKiBUaGUgcG5nX3JlYWRfcG5nIEFQSSByZXF1aXJlcyB1cyB0byBtYWtlIHRoZSBpbmZvIHN0cnVjdCwgYnV0IGl0IGRvZXMgdGhlCi0gICAgKiBjYWxsIHRvIHBuZ19yZWFkX2luZm8uCi0gICAgKi8KLSAgIGRwLT5yZWFkX2lwID0gaXAgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBwKTsKLSAgIGlmIChpcCA9PSBOVUxMKQotICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19FUlJPUiwgImZhaWxlZCB0byBjcmVhdGUgaW5mbyBzdHJ1Y3QiKTsKLQotIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgICAgIC8qIFJlbW92ZSB0aGUgdXNlciBsaW1pdHMsIGlmIGFueSAqLwotICAgICAgcG5nX3NldF91c2VyX2xpbWl0cyhwcCwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZik7Ci0jICBlbmRpZgotCi0gICAvKiBTZXQgdGhlIElPIGhhbmRsaW5nICovCi0gICBidWZmZXJfc3RhcnRfcmVhZChicCk7Ci0gICBwbmdfc2V0X3JlYWRfZm4ocHAsIGJwLCByZWFkX2Z1bmN0aW9uKTsKLQotICAgcG5nX3JlYWRfcG5nKHBwLCBpcCwgdHJhbnNmb3JtcywgTlVMTC8qcGFyYW1zKi8pOwotCi0jaWYgMCAvKiBjcmF6eSBkZWJ1Z2dpbmcgKi8KLSAgIHsKLSAgICAgIHBuZ19ieXRlcCBwciA9IHBuZ19nZXRfcm93cyhwcCwgaXApWzBdOwotICAgICAgc2l6ZV90IHJiID0gcG5nX2dldF9yb3dieXRlcyhwcCwgaXApOwotICAgICAgc2l6ZV90IGNiOwotICAgICAgY2hhciBjID0gJyAnOwotCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiUuNHggJTJkICglM2x1IGJ5dGVzKToiLCB0cmFuc2Zvcm1zLCBwbmdfZ2V0X2JpdF9kZXB0aChwcCxpcCksICh1bnNpZ25lZCBsb25nKXJiKTsKLQotICAgICAgZm9yIChjYj0wOyBjYjxyYjsgKytjYikKLSAgICAgICAgIGZwdXRjKGMsIHN0ZGVyciksIGZwcmludGYoc3RkZXJyLCAiJS4yeCIsIHByW2NiXSksIGM9Jy4nOwotCi0gICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOwotICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi11cGRhdGVfZGlzcGxheShzdHJ1Y3QgZGlzcGxheSAqZHApCi0gICAvKiBjYWxsZWQgb25jZSBhZnRlciB0aGUgZmlyc3QgcmVhZCB0byB1cGRhdGUgYWxsIHRoZSBpbmZvLCBvcmlnaW5hbF9wcCBhbmQKLSAgICAqIG9yaWdpbmFsX2lwIG11c3QgaGF2ZSBiZWVuIGZpbGxlZCBpbi4KLSAgICAqLwotewotICAgcG5nX3N0cnVjdHAgcHA7Ci0gICBwbmdfaW5mb3AgICBpcDsKLQotICAgLyogTm93IHBlcmZvcm0gdGhlIGluaXRpYWwgcmVhZCB3aXRoIGEgMCB0cmFuZm9ybS4gKi8KLSAgIHJlYWRfcG5nKGRwLCAmZHAtPm9yaWdpbmFsX2ZpbGUsICJvcmlnaW5hbCByZWFkIiwgMC8qbm8gdHJhbnNmb3JtKi8pOwotCi0gICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlICdvcmlnaW5hbCcgZmllbGRzICovCi0gICBkcC0+b3JpZ2luYWxfcHAgPSBwcCA9IGRwLT5yZWFkX3BwLCBkcC0+cmVhZF9wcCA9IE5VTEw7Ci0gICBkcC0+b3JpZ2luYWxfaXAgPSBpcCA9IGRwLT5yZWFkX2lwLCBkcC0+cmVhZF9pcCA9IE5VTEw7Ci0KLSAgIGRwLT5vcmlnaW5hbF9yb3dieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMocHAsIGlwKTsKLSAgIGlmIChkcC0+b3JpZ2luYWxfcm93Ynl0ZXMgPT0gMCkKLSAgICAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfQlVHLCAicG5nX2dldF9yb3dieXRlcyByZXR1cm5lZCAwIik7Ci0KLSAgIGRwLT5jaHVua3MgPSBwbmdfZ2V0X3ZhbGlkKHBwLCBpcCwgMHhmZmZmZmZmZik7Ci0gICBpZiAoKGRwLT5jaHVua3MgJiBQTkdfSU5GT19JREFUKSA9PSAwKSAvKiBzZXQgYnkgcG5nX3JlYWRfcG5nICovCi0gICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0JVRywgInBuZ19yZWFkX3BuZyBkaWQgbm90IHNldCBJREFUIGZsYWciKTsKLQotICAgZHAtPm9yaWdpbmFsX3Jvd3MgPSBwbmdfZ2V0X3Jvd3MocHAsIGlwKTsKLSAgIGlmIChkcC0+b3JpZ2luYWxfcm93cyA9PSBOVUxMKQotICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19CVUcsICJwbmdfcmVhZF9wbmcgZGlkIG5vdCBjcmVhdGUgcm93IGJ1ZmZlcnMiKTsKLQotICAgaWYgKCFwbmdfZ2V0X0lIRFIocHAsIGlwLAotICAgICAgJmRwLT53aWR0aCwgJmRwLT5oZWlnaHQsICZkcC0+Yml0X2RlcHRoLCAmZHAtPmNvbG9yX3R5cGUsCi0gICAgICAmZHAtPmludGVybGFjZV9tZXRob2QsICZkcC0+Y29tcHJlc3Npb25fbWV0aG9kLCAmZHAtPmZpbHRlcl9tZXRob2QpKQotICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19CVUcsICJwbmdfZ2V0X0lIRFIgZmFpbGVkIik7Ci0KLSAgIC8qICdhY3RpdmUnIHRyYW5zZm9ybXMgYXJlIGRpc2NvdmVyZWQgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGltYWdlIGZvcm1hdDsKLSAgICAqIHJ1bm5pbmcgb25lIGFjdGl2ZSB0cmFuc2Zvcm0gY2FuIGFjdGl2YXRlIG90aGVycy4gIEF0IHByZXNlbnQgdGhlIGNvZGUKLSAgICAqIGRvZXMgbm90IGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHRoZSBjbG9zdXJlLgotICAgICovCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBjaHVua3MgPSBkcC0+Y2h1bmtzOwotICAgICAgaW50IGFjdGl2ZSA9IDAsIGluYWN0aXZlID0gMDsKLSAgICAgIGludCBjdCA9IGRwLT5jb2xvcl90eXBlOwotICAgICAgaW50IGJkID0gZHAtPmJpdF9kZXB0aDsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGk9MDsgaTxUVEFCTEVfU0laRTsgKytpKSBpZiAodHJhbnNmb3JtX2luZm9baV0ubmFtZSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgaW50IHRyYW5zZm9ybSA9IHRyYW5zZm9ybV9pbmZvW2ldLnRyYW5zZm9ybTsKLQotICAgICAgICAgaWYgKCh0cmFuc2Zvcm1faW5mb1tpXS52YWxpZF9jaHVua3MgPT0gMCB8fAotICAgICAgICAgICAgICAgKHRyYW5zZm9ybV9pbmZvW2ldLnZhbGlkX2NodW5rcyAmIGNodW5rcykgIT0gMCkgJiYKLSAgICAgICAgICAgICh0cmFuc2Zvcm1faW5mb1tpXS5jb2xvcl9tYXNrX3JlcXVpcmVkICYgY3QpID09Ci0gICAgICAgICAgICAgICB0cmFuc2Zvcm1faW5mb1tpXS5jb2xvcl9tYXNrX3JlcXVpcmVkICYmCi0gICAgICAgICAgICAodHJhbnNmb3JtX2luZm9baV0uY29sb3JfbWFza19hYnNlbnQgJiBjdCkgPT0gMCAmJgotICAgICAgICAgICAgKHRyYW5zZm9ybV9pbmZvW2ldLmJpdF9kZXB0aHMgJiBiZCkgIT0gMCAmJgotICAgICAgICAgICAgKHRyYW5zZm9ybV9pbmZvW2ldLndoZW4gJiBUUkFOU0ZPUk1fUikgIT0gMCkKLSAgICAgICAgICAgIGFjdGl2ZSB8PSB0cmFuc2Zvcm07Ci0KLSAgICAgICAgIGVsc2UgaWYgKCh0cmFuc2Zvcm1faW5mb1tpXS53aGVuICYgVFJBTlNGT1JNX1IpICE9IDApCi0gICAgICAgICAgICBpbmFjdGl2ZSB8PSB0cmFuc2Zvcm07Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNvbWUgdHJhbnNmb3JtcyBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHRhYmxlOyB0aGUgJ2FjdGl2ZScgc3RhdHVzCi0gICAgICAgKiBpcyB0aGUgbG9naWNhbCBPUiBvZiB0aGVzZSBhbmQgdGhlIGluYWN0aXZlIHN0YXR1cyBtdXN0IGJlIGFkanVzdGVkIHRvCi0gICAgICAgKiB0YWtlIHRoaXMgaW50byBhY2NvdW50LgotICAgICAgICovCi0gICAgICBpbmFjdGl2ZSAmPSB+YWN0aXZlOwotCi0gICAgICBkcC0+YWN0aXZlX3RyYW5zZm9ybXMgPSBhY3RpdmU7Ci0gICAgICBkcC0+aWdub3JlZF90cmFuc2Zvcm1zID0gaW5hY3RpdmU7IC8qIGV4Y2x1ZGluZyB3cml0ZS1vbmx5IHRyYW5zZm9ybXMgKi8KLSAgIH0KLX0KLQotc3RhdGljIGludAotY29tcGFyZV9yZWFkKHN0cnVjdCBkaXNwbGF5ICpkcCwgaW50IGFwcGxpZWRfdHJhbnNmb3JtcykKLXsKLSAgIC8qIENvbXBhcmUgdGhlIHBuZ19pbmZvIGZyb20gcmVhZF9pcCB3aXRoIG9yaWdpbmFsX2luZm8gKi8KLSAgIHNpemVfdCByb3dieXRlczsKLSAgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7Ci0gICBpbnQgYml0X2RlcHRoLCBjb2xvcl90eXBlOwotICAgaW50IGludGVybGFjZV9tZXRob2QsIGNvbXByZXNzaW9uX21ldGhvZCwgZmlsdGVyX21ldGhvZDsKLSAgIGNvbnN0IGNoYXIgKmUgPSBOVUxMOwotCi0gICBwbmdfZ2V0X0lIRFIoZHAtPnJlYWRfcHAsIGRwLT5yZWFkX2lwLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsCi0gICAgICAmY29sb3JfdHlwZSwgJmludGVybGFjZV9tZXRob2QsICZjb21wcmVzc2lvbl9tZXRob2QsICZmaWx0ZXJfbWV0aG9kKTsKLQotIyAgZGVmaW5lIEMoaXRlbSkgaWYgKGl0ZW0gIT0gZHAtPml0ZW0pIFwKLSAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfV0FSTklORywgIklIRFIgIiAjaXRlbSAiKCVsdSkgY2hhbmdlZCB0byAlbHUiLFwKLSAgICAgICAgICh1bnNpZ25lZCBsb25nKWRwLT5pdGVtLCAodW5zaWduZWQgbG9uZylpdGVtKSwgZSA9ICNpdGVtCi0KLSAgIC8qIFRoZSBJSERSIHNob3VsZCBiZSBpZGVudGljYWw6ICovCi0gICBDKHdpZHRoKTsKLSAgIEMoaGVpZ2h0KTsKLSAgIEMoYml0X2RlcHRoKTsKLSAgIEMoY29sb3JfdHlwZSk7Ci0gICBDKGludGVybGFjZV9tZXRob2QpOwotICAgQyhjb21wcmVzc2lvbl9tZXRob2QpOwotICAgQyhmaWx0ZXJfbWV0aG9kKTsKLQotICAgLyogJ2UnIHJlbWFpbnMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBsYXN0IHRoaW5nIGNoYW5nZWQ6ICovCi0gICBpZiAoZSkKLSAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRVJST1IsICJJSERSIGNoYW5nZWQgKCVzKSIsIGUpOwotCi0gICAvKiBBbGwgdGhlIGNodW5rcyBmcm9tIHRoZSBvcmlnaW5hbCBQTkcgc2hvdWxkIGJlIHByZXNlcnZlZCBpbiB0aGUgb3V0cHV0IFBORwotICAgICogYmVjYXVzZSB0aGUgUE5HIGZvcm1hdCBoYXMgbm90IGJlZW4gY2hhbmdlZC4KLSAgICAqLwotICAgewotICAgICAgdW5zaWduZWQgbG9uZyBjaHVua3MgPQotICAgICAgICAgcG5nX2dldF92YWxpZChkcC0+cmVhZF9wcCwgZHAtPnJlYWRfaXAsIDB4ZmZmZmZmZmYpOwotCi0gICAgICBpZiAoY2h1bmtzICE9IGRwLT5jaHVua3MpCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgQVBQX0ZBSUwsICJQTkcgY2h1bmtzIGNoYW5nZWQgZnJvbSAweCVseCB0byAweCVseCIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZylkcC0+Y2h1bmtzLCBjaHVua3MpOwotICAgfQotCi0gICAvKiByb3dieXRlcyBzaG91bGQgYmUgdGhlIHNhbWUgKi8KLSAgIHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhkcC0+cmVhZF9wcCwgZHAtPnJlYWRfaXApOwotCi0gICAvKiBOT1RFOiBvbiA2NC1iaXQgc3lzdGVtcyB0aGlzIG1heSB0cmFzaCB0aGUgdG9wIGJpdHMgb2Ygcm93Ynl0ZXMsCi0gICAgKiB3aGljaCBjb3VsZCBsZWFkIHRvIHdlaXJkIGVycm9yIG1lc3NhZ2VzLgotICAgICovCi0gICBpZiAocm93Ynl0ZXMgIT0gZHAtPm9yaWdpbmFsX3Jvd2J5dGVzKQotICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9FUlJPUiwgIlBORyByb3dieXRlcyBjaGFuZ2VkIGZyb20gJWx1IHRvICVsdSIsCi0gICAgICAgICAodW5zaWduZWQgbG9uZylkcC0+b3JpZ2luYWxfcm93Ynl0ZXMsICh1bnNpZ25lZCBsb25nKXJvd2J5dGVzKTsKLQotICAgLyogVGhlIHJvd3Mgc2hvdWxkIGJlIHRoZSBzYW1lIHRvbywgdW5sZXNzIHRoZSBhcHBsaWVkIHRyYW5zZm9ybXMgaW5jbHVkZXMKLSAgICAqIHRoZSBzaGlmdCB0cmFuc2Zvcm0sIGluIHdoaWNoIGNhc2UgbG93IGJpdHMgbWF5IGhhdmUgYmVlbiBsb3N0LgotICAgICovCi0gICB7Ci0gICAgICBwbmdfYnl0ZXBwIHJvd3MgPSBwbmdfZ2V0X3Jvd3MoZHAtPnJlYWRfcHAsIGRwLT5yZWFkX2lwKTsKLSAgICAgIHVuc2lnbmVkIGludCBtYXNrOyAgLyogbWFzayAoaWYgbm90IHplcm8pIGZvciB0aGUgZmluYWwgYnl0ZSAqLwotCi0gICAgICBpZiAoYml0X2RlcHRoIDwgOCkKLSAgICAgIHsKLSAgICAgICAgIC8qIE5lZWQgdGhlIHN0cmF5IGJpdHMgYXQgdGhlIGVuZCwgdGhpcyBkZXBlbmRzIG9ubHkgb24gdGhlIGxvdyBiaXRzCi0gICAgICAgICAgKiBvZiB0aGUgaW1hZ2Ugd2lkdGg7IG92ZXJmbG93IGRvZXMgbm90IG1hdHRlci4gIElmIHRoZSB3aWR0aCBpcyBhbgotICAgICAgICAgICogZXhhY3QgbXVsdGlwbGUgb2YgOCBiaXRzIHRoaXMgZ2l2ZXMgYSBtYXNrIG9mIDAsIG5vdCAweGZmLgotICAgICAgICAgICovCi0gICAgICAgICBtYXNrID0gMHhmZiAmICgweGZmMDAgPj4gKChiaXRfZGVwdGggKiB3aWR0aCkgJiA3KSk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG1hc2sgPSAwOwotCi0gICAgICBpZiAocm93cyA9PSBOVUxMKQotICAgICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19CVUcsICJwbmdfZ2V0X3Jvd3MgcmV0dXJuZWQgTlVMTCIpOwotCi0gICAgICBpZiAoKGFwcGxpZWRfdHJhbnNmb3JtcyAmIFBOR19UUkFOU0ZPUk1fU0hJRlQpID09IDAgfHwKLSAgICAgICAgIChkcC0+YWN0aXZlX3RyYW5zZm9ybXMgJiBQTkdfVFJBTlNGT1JNX1NISUZUKSA9PSAwIHx8Ci0gICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICB7Ci0gICAgICAgICB1bnNpZ25lZCBsb25nIHk7Ci0KLSAgICAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgKyt5KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHJvdyA9IHJvd3NbeV07Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgb3JpZyA9IGRwLT5vcmlnaW5hbF9yb3dzW3ldOwotCi0gICAgICAgICAgICBpZiAobWVtY21wKHJvdywgb3JpZywgcm93Ynl0ZXMtKG1hc2sgIT0gMCkpICE9IDAgfHwgKG1hc2sgIT0gMCAmJgotICAgICAgICAgICAgICAgKChyb3dbcm93Ynl0ZXMtMV0gJiBtYXNrKSAhPSAob3JpZ1tyb3dieXRlcy0xXSAmIG1hc2spKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzaXplX3QgeDsKLQotICAgICAgICAgICAgICAgLyogRmluZCB0aGUgZmlyc3QgZXJyb3IgKi8KLSAgICAgICAgICAgICAgIGZvciAoeD0wOyB4PHJvd2J5dGVzLTE7ICsreCkgaWYgKHJvd1t4XSAhPSBvcmlnW3hdKQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRkFJTCwKLSAgICAgICAgICAgICAgICAgICJieXRlKCVsdSwlbHUpIGNoYW5nZWQgMHglLjJ4IC0+IDB4JS4yeCIsCi0gICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl4LCAodW5zaWduZWQgbG9uZyl5LCBvcmlnW3hdLCByb3dbeF0pOwotICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGRvbid0IGtlZXAgcmVwb3J0aW5nIGZhaWxlZCByb3dzIG9uICdjb250aW51ZScgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZQotIyAgICAgaWZkZWYgUE5HX3NCSVRfU1VQUE9SVEVECi0gICAgICB7Ci0gICAgICAgICB1bnNpZ25lZCBsb25nIHk7Ci0gICAgICAgICBpbnQgYnBwOyAgIC8qIGJpdHMtcGVyLXBpeGVsIHRoZW4gYnl0ZXMtcGVyLXBpeGVsICovCi0gICAgICAgICAvKiBjb21wb25lbnRzIGFyZSB1cCB0byA4IGJ5dGVzIGluIHNpemUgKi8KLSAgICAgICAgIHBuZ19ieXRlIHNpZ19iaXRzWzhdOwotICAgICAgICAgcG5nX2NvbG9yXzhwIHNCSVQ7Ci0KLSAgICAgICAgIGlmIChwbmdfZ2V0X3NCSVQoZHAtPnJlYWRfcHAsIGRwLT5yZWFkX2lwLCAmc0JJVCkgIT0gUE5HX0lORk9fc0JJVCkKLSAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBJTlRFUk5BTF9FUlJPUiwKLSAgICAgICAgICAgICAgICJhY3RpdmUgc2hpZnQgdHJhbnNmb3JtIGJ1dCBubyBzQklUIGluIGZpbGUiKTsKLQotICAgICAgICAgc3dpdGNoIChjb2xvcl90eXBlKQotICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgotICAgICAgICAgICAgICAgc2lnX2JpdHNbMF0gPSBzQklULT5ncmF5OwotICAgICAgICAgICAgICAgYnBwID0gYml0X2RlcHRoOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR0E6Ci0gICAgICAgICAgICAgICBzaWdfYml0c1swXSA9IHNCSVQtPmdyYXk7Ci0gICAgICAgICAgICAgICBzaWdfYml0c1sxXSA9IHNCSVQtPmFscGhhOwotICAgICAgICAgICAgICAgYnBwID0gMiAqIGJpdF9kZXB0aDsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKLSAgICAgICAgICAgICAgIHNpZ19iaXRzWzBdID0gc0JJVC0+cmVkOwotICAgICAgICAgICAgICAgc2lnX2JpdHNbMV0gPSBzQklULT5ncmVlbjsKLSAgICAgICAgICAgICAgIHNpZ19iaXRzWzJdID0gc0JJVC0+Ymx1ZTsKLSAgICAgICAgICAgICAgIGJwcCA9IDMgKiBiaXRfZGVwdGg7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JBOgotICAgICAgICAgICAgICAgc2lnX2JpdHNbMF0gPSBzQklULT5yZWQ7Ci0gICAgICAgICAgICAgICBzaWdfYml0c1sxXSA9IHNCSVQtPmdyZWVuOwotICAgICAgICAgICAgICAgc2lnX2JpdHNbMl0gPSBzQklULT5ibHVlOwotICAgICAgICAgICAgICAgc2lnX2JpdHNbM10gPSBzQklULT5hbHBoYTsKLSAgICAgICAgICAgICAgIGJwcCA9IDQgKiBiaXRfZGVwdGg7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfRVJST1IsICJpbnZhbGlkIGNvbG91ciB0eXBlICVkIiwKLSAgICAgICAgICAgICAgICAgIGNvbG9yX3R5cGUpOwotICAgICAgICAgICAgICAgLypOT1RSRUFDSEVEKi8KLSAgICAgICAgICAgICAgIGJwcCA9IDA7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgewotICAgICAgICAgICAgaW50IGI7Ci0KLSAgICAgICAgICAgIGZvciAoYj0wOyA4KmI8YnBwOyArK2IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBsaWJwbmcgc2hvdWxkIGNhdGNoIHRoaXM7IGlmIG5vdCB0aGVyZSBpcyBhIHNlY3VyaXR5IGlzc3VlCi0gICAgICAgICAgICAgICAgKiBiZWNhdXNlIGFuIGFwcCAobGlrZSB0aGlzIG9uZSkgbWF5IG92ZXJmbG93IGFuIGFycmF5LiBJbiBmYWN0Ci0gICAgICAgICAgICAgICAgKiBsaWJwbmcgZG9lc24ndCBjYXRjaCB0aGlzIGF0IHByZXNlbnQuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGlmIChzaWdfYml0c1tiXSA9PSAwIHx8IHNpZ19iaXRzW2JdID4gYml0X2RlcHRoLyohcGFsZXR0ZSovKQotICAgICAgICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19CVUcsCi0gICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzQklUWyV1XSAgdmFsdWUgJWQgcmV0dXJuZWQgZm9yIFBORyBiaXQgZGVwdGggJWQiLAotICAgICAgICAgICAgICAgICAgICAgYiwgc2lnX2JpdHNbYl0sIGJpdF9kZXB0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChicHAgPCA4ICYmIGJwcCAhPSBiaXRfZGVwdGgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2s7IHRoaXMgaXMgYSBncmF5c2NhbGUgUE5HOyBzb21ldGhpbmcgaXMgd3JvbmcgaW4gdGhlCi0gICAgICAgICAgICAgKiBjb2RlIGFib3ZlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsICJpbnZhbGlkIGJwcCAldSBmb3IgYml0X2RlcHRoICV1IiwKLSAgICAgICAgICAgICAgIGJwcCwgYml0X2RlcHRoKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgc3dpdGNoIChiaXRfZGVwdGgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYjsKLQotICAgICAgICAgICAgY2FzZSAxNjogLyogVHdvIGJ5dGVzIHBlciBjb21wb25lbnQsIGJpZy1lbmRpYW4gKi8KLSAgICAgICAgICAgICAgIGZvciAoYiA9IChicHAgPj4gNCk7IGIgPiAwOyAtLWIpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2lnID0gKHVuc2lnbmVkIGludCkoMHhmZmZmMDAwMCA+PiBzaWdfYml0c1tiXSk7Ci0KLSAgICAgICAgICAgICAgICAgIHNpZ19iaXRzWzIqYisxXSA9IChwbmdfYnl0ZSlzaWc7Ci0gICAgICAgICAgICAgICAgICBzaWdfYml0c1syKmIrMF0gPSAocG5nX2J5dGUpKHNpZyA+PiA4KTsgLyogYmlnLWVuZGlhbiAqLwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODogLyogT25lIGJ5dGUgcGVyIGNvbXBvbmVudCAqLwotICAgICAgICAgICAgICAgZm9yIChiPTA7IGIqOCA8IGJwcDsgKytiKQotICAgICAgICAgICAgICAgICAgc2lnX2JpdHNbYl0gPSAocG5nX2J5dGUpKDB4ZmYwMCA+PiBzaWdfYml0c1tiXSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBhbGxvd2VkLCBidXQgZHVtYiAqLwotICAgICAgICAgICAgICAgLyogVmFsdWUgaXMgMSAqLwotICAgICAgICAgICAgICAgc2lnX2JpdHNbMF0gPSAweGZmOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogUmVwbGljYXRlIDQgdGltZXMgKi8KLSAgICAgICAgICAgICAgIC8qIFZhbHVlIGlzIDEgb3IgMiAqLwotICAgICAgICAgICAgICAgYiA9IDB4MyAmICgoMHgzPDwyKSA+PiBzaWdfYml0c1swXSk7Ci0gICAgICAgICAgICAgICBiIHw9IGIgPDwgMjsKLSAgICAgICAgICAgICAgIGIgfD0gYiA8PCA0OwotICAgICAgICAgICAgICAgc2lnX2JpdHNbMF0gPSAocG5nX2J5dGUpYjsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ6IC8qIFJlbGljYXRlIHR3aWNlICovCi0gICAgICAgICAgICAgICAvKiBWYWx1ZSBpcyAxLCAyLCAzIG9yIDQgKi8KLSAgICAgICAgICAgICAgIGIgPSAweGYgJiAoKDB4ZiA8PCA0KSA+PiBzaWdfYml0c1swXSk7Ci0gICAgICAgICAgICAgICBiIHw9IGIgPDwgNDsKLSAgICAgICAgICAgICAgIHNpZ19iaXRzWzBdID0gKHBuZ19ieXRlKWI7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfQlVHLCAiaW52YWxpZCBiaXQgZGVwdGggJWQiLCBiaXRfZGVwdGgpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIENvbnZlcnQgYnBwIHRvIGJ5dGVzOyB0aGlzIGdpdmVzICcxJyBmb3IgbG93LWJpdCBkZXB0aCBncmF5c2NhbGUsCi0gICAgICAgICAgKiB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUgcGl4ZWxzIHBlciBieXRlLgotICAgICAgICAgICovCi0gICAgICAgICBicHAgPSAoYnBwKzcpID4+IDM7Ci0KLSAgICAgICAgIC8qIFRoZSBtYXNrIGNhbiBiZSBjb21iaW5lZCB3aXRoIHNpZ19iaXRzWzBdICovCi0gICAgICAgICBpZiAobWFzayAhPSAwKQotICAgICAgICAgewotICAgICAgICAgICAgbWFzayAmPSBzaWdfYml0c1swXTsKLQotICAgICAgICAgICAgaWYgKGJwcCAhPSAxIHx8IG1hc2sgPT0gMCkKLSAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBJTlRFUk5BTF9FUlJPUiwgIm1hc2sgY2FsY3VsYXRpb24gZXJyb3IgJXUsICV1IiwKLSAgICAgICAgICAgICAgICAgIGJwcCwgbWFzayk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgKyt5KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX2J5dGVwIHJvdyA9IHJvd3NbeV07Ci0gICAgICAgICAgICBwbmdfYnl0ZXAgb3JpZyA9IGRwLT5vcmlnaW5hbF9yb3dzW3ldOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgICAgICBmb3IgKHg9MDsgeDwod2lkdGgtKG1hc2shPTApKTsgKyt4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaW50IGI7Ci0KLSAgICAgICAgICAgICAgIGZvciAoYj0wOyBiPGJwcDsgKytiKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCgqcm93KysgJiBzaWdfYml0c1tiXSkgIT0gKCpvcmlnKysgJiBzaWdfYml0c1tiXSkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgQVBQX0ZBSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAic2lnbmlmaWNhbnQgYml0cyBhdCAoJWx1WyV1XSwlbHUpIGNoYW5nZWQgJS4yeC0+JS4yeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICB4LCBiLCB5LCBvcmlnWy0xXSwgcm93Wy0xXSk7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1hc2sgIT0gMCAmJiAoKnJvdyAmIG1hc2spICE9ICgqb3JpZyAmIG1hc2spKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9GQUlMLAotICAgICAgICAgICAgICAgICAgInNpZ25pZmljYW50IGJpdHMgYXQgKCVsdVtlbmRdLCVsdSkgY2hhbmdlZCIsIHgsIHkpOwotICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IC8qIGZvciB5ICovCi0gICAgICB9Ci0jICAgICBlbHNlIC8qICFzQklUICovCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgICAgICAiYWN0aXZlIHNoaWZ0IHRyYW5zZm9ybSBidXQgbm8gc0JJVCBzdXBwb3J0Iik7Ci0jICAgICBlbmRpZiAvKiAhc0JJVCAqLwotICAgfQotCi0gICByZXR1cm4gMTsgLyogY29tcGFyZSBzdWNjZWVkZWQgKi8KLX0KLQotI2lmZGVmIFBOR19XUklURV9QTkdfU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotYnVmZmVyX3dyaXRlKHN0cnVjdCBkaXNwbGF5ICpkcCwgc3RydWN0IGJ1ZmZlciAqYnVmZmVyLCBwbmdfYnl0ZXAgZGF0YSwKLSAgIHBuZ19zaXplX3Qgc2l6ZSkKLSAgIC8qIEdlbmVyaWMgd3JpdGUgZnVuY3Rpb24gdXNlZCBib3RoIGZyb20gdGhlIHdyaXRlIGNhbGxiYWNrIHByb3ZpZGVkIHRvCi0gICAgKiBsaWJwbmcgYW5kIGZyb20gdGhlIGdlbmVyaWMgcmVhZCBjb2RlLgotICAgICovCi17Ci0gICAvKiBXcml0ZSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIsIGFkZGluZyBidWZmZXJzIGFzIHJlcXVpcmVkICovCi0gICBzdHJ1Y3QgYnVmZmVyX2xpc3QgKmxhc3QgPSBidWZmZXItPmxhc3Q7Ci0gICBzaXplX3QgZW5kX2NvdW50ID0gYnVmZmVyLT5lbmRfY291bnQ7Ci0KLSAgIHdoaWxlIChzaXplID4gMCkKLSAgIHsKLSAgICAgIHNpemVfdCBhdmFpbDsKLQotICAgICAgaWYgKGVuZF9jb3VudCA+PSBzaXplb2YgbGFzdC0+YnVmZmVyKQotICAgICAgewotICAgICAgICAgaWYgKGxhc3QtPm5leHQgPT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGxhc3QgPSBidWZmZXJfZXh0ZW5kKGxhc3QpOwotCi0gICAgICAgICAgICBpZiAobGFzdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9FUlJPUiwgIm91dCBvZiBtZW1vcnkgc2F2aW5nIGZpbGUiKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgbGFzdCA9IGxhc3QtPm5leHQ7Ci0KLSAgICAgICAgIGJ1ZmZlci0+bGFzdCA9IGxhc3Q7IC8qIGF2b2lkIHRoZSBuZWVkIHRvIHJld3JpdGUgZXZlcnkgdGltZSAqLwotICAgICAgICAgZW5kX2NvdW50ID0gMDsKLSAgICAgIH0KLQotICAgICAgYXZhaWwgPSAoc2l6ZW9mIGxhc3QtPmJ1ZmZlcikgLSBlbmRfY291bnQ7Ci0gICAgICBpZiAoYXZhaWwgPiBzaXplKQotICAgICAgICAgYXZhaWwgPSBzaXplOwotCi0gICAgICBtZW1jcHkobGFzdC0+YnVmZmVyICsgZW5kX2NvdW50LCBkYXRhLCBhdmFpbCk7Ci0gICAgICBlbmRfY291bnQgKz0gYXZhaWw7Ci0gICAgICBzaXplIC09IGF2YWlsOwotICAgICAgZGF0YSArPSBhdmFpbDsKLSAgIH0KLQotICAgYnVmZmVyLT5lbmRfY291bnQgPSBlbmRfY291bnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi13cml0ZV9mdW5jdGlvbihwbmdfc3RydWN0cCBwcCwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3Qgc2l6ZSkKLXsKLSAgIGJ1ZmZlcl93cml0ZShnZXRfZHAocHApLCBnZXRfYnVmZmVyKHBwKSwgZGF0YSwgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9wbmcoc3RydWN0IGRpc3BsYXkgKmRwLCBwbmdfaW5mb3AgaXAsIGludCB0cmFuc2Zvcm1zKQotewotICAgZGlzcGxheV9jbGVhbl93cml0ZShkcCk7IC8qIHNhZmV0eSAqLwotCi0gICBidWZmZXJfc3RhcnRfd3JpdGUoJmRwLT53cml0dGVuX2ZpbGUpOwotICAgZHAtPm9wZXJhdGlvbiA9ICJ3cml0ZSI7Ci0gICBkcC0+dHJhbnNmb3JtcyA9IHRyYW5zZm9ybXM7Ci0KLSAgIGRwLT53cml0ZV9wcCA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgZHAsCi0gICAgICBkaXNwbGF5X2Vycm9yLCBkaXNwbGF5X3dhcm5pbmcpOwotCi0gICBpZiAoZHAtPndyaXRlX3BwID09IE5VTEwpCi0gICAgICBkaXNwbGF5X2xvZyhkcCwgQVBQX0VSUk9SLCAiZmFpbGVkIHRvIGNyZWF0ZSB3cml0ZSBwbmdfc3RydWN0Iik7Ci0KLSAgIHBuZ19zZXRfd3JpdGVfZm4oZHAtPndyaXRlX3BwLCAmZHAtPndyaXR0ZW5fZmlsZSwgd3JpdGVfZnVuY3Rpb24sCi0gICAgICBOVUxMLypmbHVzaCovKTsKLQotIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgICAgIC8qIFJlbW92ZSB0aGUgdXNlciBsaW1pdHMsIGlmIGFueSAqLwotICAgICAgcG5nX3NldF91c2VyX2xpbWl0cyhkcC0+d3JpdGVfcHAsIDB4N2ZmZmZmZmYsIDB4N2ZmZmZmZmYpOwotIyAgZW5kaWYKLQotICAgLyogQ2VydGFpbiB0cmFuc2Zvcm1zIHJlcXVpcmUgdGhlIHBuZ19pbmZvIHRvIGJlIHphcHBlZCB0byBhbGxvdyB0aGUKLSAgICAqIHRyYW5zZm9ybSB0byB3b3JrIGNvcnJlY3RseS4KLSAgICAqLwotICAgaWYgKHRyYW5zZm9ybXMgJiAoUE5HX1RSQU5TRk9STV9QQUNLSU5HfAotICAgICAgICAgICAgICAgICAgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJ8Ci0gICAgICAgICAgICAgICAgICAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9CRUZPUkUpKQotICAgewotICAgICAgaW50IGN0ID0gZHAtPmNvbG9yX3R5cGU7Ci0KLSAgICAgIGlmICh0cmFuc2Zvcm1zICYgKFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSfAotICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVJfQkVGT1JFKSkKLSAgICAgICAgIGN0ICY9IH5QTkdfQ09MT1JfTUFTS19BTFBIQTsKLQotICAgICAgcG5nX3NldF9JSERSKGRwLT53cml0ZV9wcCwgaXAsIGRwLT53aWR0aCwgZHAtPmhlaWdodCwgZHAtPmJpdF9kZXB0aCwgY3QsCi0gICAgICAgICBkcC0+aW50ZXJsYWNlX21ldGhvZCwgZHAtPmNvbXByZXNzaW9uX21ldGhvZCwgZHAtPmZpbHRlcl9tZXRob2QpOwotICAgfQotCi0gICBwbmdfd3JpdGVfcG5nKGRwLT53cml0ZV9wcCwgaXAsIHRyYW5zZm9ybXMsIE5VTEwvKnBhcmFtcyovKTsKLQotICAgLyogQ2xlYW4gaXQgb24gdGhlIHdheSBvdXQgLSBpZiBjb250cm9sIHJldHVybnMgdG8gdGhlIGNhbGxlciB0aGVuIHRoZQotICAgICogd3JpdHRlbl9maWxlIGNvbnRhaW5zIHRoZSByZXF1aXJlZCBkYXRhLgotICAgICovCi0gICBkaXNwbGF5X2NsZWFuX3dyaXRlKGRwKTsKLX0KLSNlbmRpZiAvKiBXUklURV9QTkcgKi8KLQotc3RhdGljIGludAotc2tpcF90cmFuc2Zvcm0oc3RydWN0IGRpc3BsYXkgKmRwLCBpbnQgdHIpCi0gICAvKiBIZWxwZXIgdG8gdGVzdCBmb3IgYSBiYWQgY29tYm8gYW5kIGxvZyBpdCBpZiBpdCBpcyBza2lwcGVkICovCi17Ci0gICBpZiAoKGRwLT5vcHRpb25zICYgU0tJUF9CVUdTKSAhPSAwICYmIGlzX2JhZF9jb21ibyh0cikpCi0gICB7Ci0gICAgICAvKiBMb2cgdGhpcyB0byBzdGRvdXQgaWYgbG9nZ2luZyBpcyBvbiwgb3RoZXJ3aXNlIGp1c3QgZG8gYW4gaW5mb3JtYXRpb24KLSAgICAgICAqIGRpc3BsYXlfbG9nLgotICAgICAgICovCi0gICAgICBpZiAoKGRwLT5vcHRpb25zICYgTE9HX1NLSVBQRUQpICE9IDApCi0gICAgICB7Ci0gICAgICAgICBwcmludGYoIlNLSVA6ICVzIHRyYW5zZm9ybXMgIiwgZHAtPmZpbGVuYW1lKTsKLQotICAgICAgICAgd2hpbGUgKHRyICE9IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbmV4dCA9IGZpcnN0X3RyYW5zZm9ybSh0cik7Ci0gICAgICAgICAgICB0ciAmPSB+bmV4dDsKLQotICAgICAgICAgICAgcHJpbnRmKCIlcyIsIHRyYW5zZm9ybV9uYW1lKG5leHQpKTsKLSAgICAgICAgICAgIGlmICh0ciAhPSAwKQotICAgICAgICAgICAgICAgcHV0Y2hhcignKycpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdXRjaGFyKCdcbicpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgSU5GT1JNQVRJT04sICIlczogc2tpcHBlZCBrbm93biBiYWQgY29tYm8gMHgleCIsCi0gICAgICAgICAgICBkcC0+ZmlsZW5hbWUsIHRyKTsKLQotICAgICAgcmV0dXJuIDE7IC8qIHNraXAgKi8KLSAgIH0KLQotICAgcmV0dXJuIDA7IC8qIGRvbid0IHNraXAgKi8KLX0KLQotc3RhdGljIHZvaWQKLXRlc3Rfb25lX2ZpbGUoc3RydWN0IGRpc3BsYXkgKmRwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgIC8qIEZpcnN0IGNhY2hlIHRoZSBmaWxlIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXkgb3JpZ2luYWwgZmlsZQotICAgICogaW5mb3JtYXRpb24gZm9yIHRoZSBuZXcgZmlsZS4KLSAgICAqLwotICAgZHAtPm9wZXJhdGlvbiA9ICJjYWNoZSBmaWxlIjsKLSAgIGRwLT50cmFuc2Zvcm1zID0gMDsKLSAgIGRpc3BsYXlfY2FjaGVfZmlsZShkcCwgZmlsZW5hbWUpOwotICAgdXBkYXRlX2Rpc3BsYXkoZHApOwotCi0gICAvKiBGaXJzdCB0ZXN0OiBpZiB0aGVyZSBhcmUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIGZvciB0aGlzIGZpbGUKLSAgICAqIHZlcmlmeSB0aGF0IHRoZXkgcmVhbGx5IGFyZSBpZ25vcmVkLgotICAgICovCi0gICBpZiAoZHAtPmlnbm9yZWRfdHJhbnNmb3JtcyAhPSAwKQotICAgewotICAgICAgcmVhZF9wbmcoZHAsICZkcC0+b3JpZ2luYWxfZmlsZSwgImlnbm9yZWQgdHJhbnNmb3JtcyIsCi0gICAgICAgICBkcC0+aWdub3JlZF90cmFuc2Zvcm1zKTsKLQotICAgICAgLyogVGhlIHJlc3VsdCBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbF9yb3dzICovCi0gICAgICBpZiAoIWNvbXBhcmVfcmVhZChkcCwgMC8qdHJhbnNmb3JtcyBhcHBsaWVkKi8pKQotICAgICAgICAgcmV0dXJuOyAvKiBubyBwb2ludCB0ZXN0aW5nIG1vcmUgKi8KLSAgIH0KLQotI2lmZGVmIFBOR19XUklURV9QTkdfU1VQUE9SVEVECi0gICAvKiBTZWNvbmQgdGVzdDogd3JpdGUgdGhlIG9yaWdpbmFsIFBORyBkYXRhIG91dCB0byBhIG5ldyBmaWxlICh0byB0ZXN0IHRoZQotICAgICogd3JpdGUgc2lkZSkgdGhlbiByZWFkIHRoZSByZXN1bHQgYmFjayBpbiBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaGFzbid0Ci0gICAgKiBjaGFuZ2VkLgotICAgICovCi0gICBkcC0+b3BlcmF0aW9uID0gIndyaXRlIjsKLSAgIHdyaXRlX3BuZyhkcCwgZHAtPm9yaWdpbmFsX2lwLCAwLyp0cmFuc2Zvcm1zKi8pOwotICAgcmVhZF9wbmcoZHAsICZkcC0+d3JpdHRlbl9maWxlLCBOVUxMLCAwLyp0cmFuc2Zvcm1zKi8pOwotICAgaWYgKCFjb21wYXJlX3JlYWQoZHAsIDAvKnRyYW5zZm9ybXMgYXBwbGllZCovKSkKLSAgICAgIHJldHVybjsKLSNlbmRpZgotCi0gICAvKiBUaGlyZCB0ZXN0OiB0aGUgYWN0aXZlIG9wdGlvbnMuICBUZXN0IGVhY2ggaW4gdHVybiwgb3IsIHdpdGggdGhlCi0gICAgKiBFWEhBVVNUSVZFIG9wdGlvbiwgdGVzdCBhbGwgcG9zc2libGUgY29tYmluYXRpb25zLgotICAgICovCi0gICB7Ci0gICAgICAvKiBVc2UgdW5zaWduZWQgaW50IGhlcmUgYmVjYXVzZSB0aGUgY29kZSBiZWxvdyB0byBpbmNyZW1lbnQgdGhyb3VnaCBhbGwKLSAgICAgICAqIHRoZSBwb3NzaWJpbGl0aWVzIGV4aGF1c3RpdmVseSBoYXMgdG8gdXNlIGEgY29tcGFyZSBhbmQgdGhhdCBtdXN0IGJlCi0gICAgICAgKiB1bnNpZ25lZCwgYmVjYXVzZSBzb21lIHRyYW5zZm9ybXMgYXJlIG5lZ2F0aXZlIG9uIGEgMTYtYml0IHN5c3RlbS4KLSAgICAgICAqLwotICAgICAgdW5zaWduZWQgaW50IGFjdGl2ZSA9IGRwLT5hY3RpdmVfdHJhbnNmb3JtczsKLSAgICAgIGNvbnN0IGludCBleGhhdXN0aXZlID0gKGRwLT5vcHRpb25zICYgRVhIQVVTVElWRSkgIT0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBjdXJyZW50ID0gZmlyc3RfdHJhbnNmb3JtKGFjdGl2ZSk7Ci0gICAgICB1bnNpZ25lZCBpbnQgYmFkX3RyYW5zZm9ybXMgPSAwOwotICAgICAgdW5zaWduZWQgaW50IGJhZF9jb21ibyA9IH4wVTsgICAgLyogYml0d2lzZSBBTkQgb2YgZmFpbGluZyB0cmFuc2Zvcm1zICovCi0gICAgICB1bnNpZ25lZCBpbnQgYmFkX2NvbWJvX2xpc3QgPSAwOyAvKiBiaXR3aXNlIE9SIG9mIGZhaWx1cmVzICovCi0KLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgICByZWFkX3BuZyhkcCwgJmRwLT5vcmlnaW5hbF9maWxlLCAiYWN0aXZlIHRyYW5zZm9ybXMiLCBjdXJyZW50KTsKLQotICAgICAgICAgLyogSWYgdGhpcyBpbnZvbHZlZCBhbnkgaXJyZXZlcnNpYmxlIHRyYW5zZm9ybWF0aW9ucyB0aGVuIGlmIHdlIHdyaXRlCi0gICAgICAgICAgKiBpdCBvdXQgd2l0aCBqdXN0IHRoZSByZXZlcnNpYmxlIHRyYW5zZm9ybWF0aW9ucyBhbmQgcmVhZCBpdCBpbiBhZ2FpbgotICAgICAgICAgICogd2l0aCB0aGUgc2FtZSB0cmFuc2Zvcm1zIHdlIHNob3VsZCBnZXQgdGhlIHNhbWUgdGhpbmcuICBBdCBwcmVzZW50Ci0gICAgICAgICAgKiB0aGlzIGlzbid0IGRvbmUgLSBpdCBqdXN0IHNlZW1zIGxpa2UgYSB3YXN0ZSBvZiB0aW1lIGFuZCBpdCB3b3VsZAotICAgICAgICAgICogcmVxdWlyZSB0d28gc2V0cyBvZiByZWFkIHBuZ19zdHJ1Y3QvcG5nX2luZm8uCi0gICAgICAgICAgKgotICAgICAgICAgICogSWYgdGhlcmUgd2VyZSBubyBpcnJldmVyc2libGUgdHJhbnNmb3JtYXRpb25zIHRoZW4gaWYgd2Ugd3JpdGUgaXQKLSAgICAgICAgICAqIG91dCBhbmQgcmVhZCBpdCBiYWNrIGluIGFnYWluICh3aXRob3V0IHRoZSByZXZlcnNpYmxlIHRyYW5zZm9ybXMpCi0gICAgICAgICAgKiB3ZSBzaG91bGQgZ2V0IGJhY2sgdG8gdGhlIHBsYWNlIHdoZXJlIHdlIHN0YXJ0ZWQuCi0gICAgICAgICAgKi8KLSNpZmRlZiBQTkdfV1JJVEVfUE5HX1NVUFBPUlRFRAotICAgICAgICAgaWYgKChjdXJyZW50ICYgd3JpdGVfdHJhbnNmb3JtcykgPT0gY3VycmVudCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFsbCB0cmFuc2Zvcm1zIHJldmVyc2libGU6IHdyaXRlIHRoZSBQTkcgd2l0aCB0aGUgdHJhbnNmb3JtYXRpb25zCi0gICAgICAgICAgICAgKiByZXZlcnNlZCwgdGhlbiByZWFkIGl0IGJhY2sgaW4gd2l0aCBubyB0cmFuc2Zvcm1hdGlvbnMuICBUaGUKLSAgICAgICAgICAgICAqIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIGFwYXJ0IGZyb20gdGhlIGxvc3Mgb2YKLSAgICAgICAgICAgICAqIGxvdyBvcmRlciBiaXRzIGJlY2F1c2Ugb2YgdGhlIFNISUZUL3NCSVQgdHJhbnNmb3JtLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBkcC0+b3BlcmF0aW9uID0gInJldmVyc2libGUgdHJhbnNmb3JtcyI7Ci0gICAgICAgICAgICB3cml0ZV9wbmcoZHAsIGRwLT5yZWFkX2lwLCBjdXJyZW50KTsKLQotICAgICAgICAgICAgLyogQW5kIGlmIHRoaXMgaXMgcmVhZCBiYWNrIGluLCBiZWNhdXNlIGFsbCB0aGUgdHJhbnNmb3JtYXRpb25zIHdlcmUKLSAgICAgICAgICAgICAqIHJldmVyc2libGUsIHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZWFkX3BuZyhkcCwgJmRwLT53cml0dGVuX2ZpbGUsIE5VTEwsIDApOwotICAgICAgICAgICAgaWYgKCFjb21wYXJlX3JlYWQoZHAsIGN1cnJlbnQvKmZvciB0aGUgU0hJRlQvc0JJVCB0cmFuc2Zvcm0qLykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBUaGlzIHNldCBvZiB0cmFuc2Zvcm1zIGZhaWxlZC4gIElmIGEgc2luZ2xlIGJpdCBpcyBzZXQgLSBpZgotICAgICAgICAgICAgICAgICogdGhlcmUgaXMganVzdCBvbmUgdHJhbnNmb3JtIC0gZG9uJ3QgaW5jbHVkZSB0aGlzIGluIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAqICdleGhhdXN0aXZlJyB0ZXN0cy4gIE5vdGljZSB0aGF0IGVhY2ggdHJhbnNmb3JtIGlzIHRlc3RlZCBvbgotICAgICAgICAgICAgICAgICogaXRzIG93biBiZWZvcmUgdGVzdGluZyBjb21ib3MgaW4gdGhlIGV4aGF1c3RpdmUgY2FzZS4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgaWYgKGlzX2NvbWJvKGN1cnJlbnQpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmFkX2NvbWJvICY9IGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICBiYWRfY29tYm9fbGlzdCB8PSBjdXJyZW50OwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBiYWRfdHJhbnNmb3JtcyB8PSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgIC8qIE5vdyBtb3ZlIHRvIHRoZSBuZXh0IHRyYW5zZm9ybSAqLwotICAgICAgICAgaWYgKGV4aGF1c3RpdmUpIC8qIGFsbCBjb21iaW5hdGlvbnMgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBuZXh0ID0gY3VycmVudDsKLQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChuZXh0ID09IHJlYWRfdHJhbnNmb3JtcykgLyogRXZlcnl0aGluZyB0ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICAgIGdvdG8gY29tYm87Ci0KLSAgICAgICAgICAgICAgICsrbmV4dDsKLSAgICAgICAgICAgIH0gIC8qIHNraXAga25vd24gYmFkIGNvbWJvcyBpZiB0aGUgcmVsZXZhbnQgb3B0aW9uIGlzIHNldDsgc2tpcAotICAgICAgICAgICAgICAgICogY29tYm9zIGludm9sdmluZyBrbm93biBiYWQgc2luZ2xlIHRyYW5zZm9ybXMgaW4gYWxsIGNhc2VzLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAoICAobmV4dCAmIHJlYWRfdHJhbnNmb3JtcykgPD0gY3VycmVudAotICAgICAgICAgICAgICAgICAgfHwgKG5leHQgJiBhY3RpdmUpID09IDAgLyogc2tpcCBjYXNlcyB0aGF0IGRvIG5vdGhpbmcgKi8KLSAgICAgICAgICAgICAgICAgIHx8IChuZXh0ICYgYmFkX3RyYW5zZm9ybXMpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IHNraXBfdHJhbnNmb3JtKGRwLCBuZXh0KSk7Ci0KLSAgICAgICAgICAgIGFzc2VydCgobmV4dCAmIHJlYWRfdHJhbnNmb3JtcykgPT0gbmV4dCk7Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZSAvKiBvbmUgYXQgYSB0aW1lICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBhY3RpdmUgJj0gfmN1cnJlbnQ7Ci0KLSAgICAgICAgICAgIGlmIChhY3RpdmUgPT0gMCkKLSAgICAgICAgICAgICAgIGdvdG8gY29tYm87Ci0KLSAgICAgICAgICAgIGN1cnJlbnQgPSBmaXJzdF90cmFuc2Zvcm0oYWN0aXZlKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotY29tYm86Ci0gICAgICBpZiAoZHAtPm9wdGlvbnMgJiBGSU5EX0JBRF9DT01CT1MpCi0gICAgICB7Ci0gICAgICAgICAvKiBiYWRfY29tYm9zIGlkZW50aWZpZXMgdGhlIGNvbWJvcyB0aGF0IG9jY3VyIGluIGFsbCBmYWlsaW5nIGNhc2VzOwotICAgICAgICAgICogYmFkX2NvbWJvX2xpc3QgaWRlbnRpZmllcyB0cmFuc2Zvcm1zIHRoYXQgZG8gbm90IHByZXZlbnQgdGhlCi0gICAgICAgICAgKiBmYWlsdXJlLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoYmFkX2NvbWJvICE9IH4wVSkKLSAgICAgICAgICAgIHByaW50ZigiJXNbMHgleF06IFBST0JMRU06IDB4JXhbMHgleF0gQU5USURPVEU6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICBkcC0+ZmlsZW5hbWUsIGFjdGl2ZSwgYmFkX2NvbWJvLCBiYWRfY29tYm9fbGlzdCwKLSAgICAgICAgICAgICAgIHJ3X3RyYW5zZm9ybXMgJiB+YmFkX2NvbWJvX2xpc3QpOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYoIiVzOiBubyAlc2JhZCBjb21ib3MgZm91bmRcbiIsIGRwLT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgIChkcC0+b3B0aW9ucyAmIFNLSVBfQlVHUykgPyAiYWRkaXRpb25hbCAiIDogIiIpOwotICAgICAgfQotICAgfQotfQotCi1zdGF0aWMgaW50Ci1kb190ZXN0KHN0cnVjdCBkaXNwbGF5ICpkcCwgY29uc3QgY2hhciAqZmlsZSkKLSAgIC8qIEV4aXN0cyBzb2xlbHkgdG8gaXNvbGF0ZSB0aGUgc2V0am1wIGNsb2JiZXJzICovCi17Ci0gICBpbnQgcmV0ID0gc2V0am1wKGRwLT5lcnJvcl9yZXR1cm4pOwotCi0gICBpZiAocmV0ID09IDApCi0gICB7Ci0gICAgICB0ZXN0X29uZV9maWxlKGRwLCBmaWxlKTsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICBlbHNlIGlmIChyZXQgPCBFUlJPUlMpIC8qIHNob3VsZG4ndCBsb25nam1wIG9uIHdhcm5pbmdzICovCi0gICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsICJ1bmV4cGVjdGVkIHJldHVybiBjb2RlICVkIiwgcmV0KTsKLQotICAgcmV0dXJuIHJldDsKLX0KLQotaW50Ci1tYWluKGNvbnN0IGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgKiBjb25zdCBhcmd2KQotewotICAgLyogRm9yIGVhY2ggZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lIHRlc3QgaXQgd2l0aCBhIHJhbmdlIG9mIHRyYW5zZm9ybXMgKi8KLSAgIGludCBvcHRpb25fZW5kLCBpbG9nID0gMDsKLSAgIHN0cnVjdCBkaXNwbGF5IGQ7Ci0KLSAgIHZhbGlkYXRlX1QoKTsKLSAgIGRpc3BsYXlfaW5pdCgmZCk7Ci0KLSAgIGZvciAob3B0aW9uX2VuZD0xOyBvcHRpb25fZW5kPGFyZ2M7ICsrb3B0aW9uX2VuZCkKLSAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2W29wdGlvbl9lbmRdOwotCi0gICAgICBpZiAoc3RyY21wKG5hbWUsICItLXZlcmJvc2UiKSA9PSAwKQotICAgICAgICAgZC5vcHRpb25zID0gKGQub3B0aW9ucyAmIH5MRVZFTF9NQVNLKSB8IFZFUkJPU0U7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS13YXJuaW5ncyIpID09IDApCi0gICAgICAgICBkLm9wdGlvbnMgPSAoZC5vcHRpb25zICYgfkxFVkVMX01BU0spIHwgV0FSTklOR1M7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1lcnJvcnMiKSA9PSAwKQotICAgICAgICAgZC5vcHRpb25zID0gKGQub3B0aW9ucyAmIH5MRVZFTF9NQVNLKSB8IEVSUk9SUzsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLXF1aWV0IikgPT0gMCkKLSAgICAgICAgIGQub3B0aW9ucyA9IChkLm9wdGlvbnMgJiB+TEVWRUxfTUFTSykgfCBRVUlFVDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLWV4aGF1c3RpdmUiKSA9PSAwKQotICAgICAgICAgZC5vcHRpb25zIHw9IEVYSEFVU1RJVkU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1mYXN0IikgPT0gMCkKLSAgICAgICAgIGQub3B0aW9ucyAmPSB+RVhIQVVTVElWRTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLXN0cmljdCIpID09IDApCi0gICAgICAgICBkLm9wdGlvbnMgfD0gU1RSSUNUOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tcmVsYXhlZCIpID09IDApCi0gICAgICAgICBkLm9wdGlvbnMgJj0gflNUUklDVDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLWxvZyIpID09IDApCi0gICAgICB7Ci0gICAgICAgICBpbG9nID0gb3B0aW9uX2VuZDsgLyogcHJldmVudCBkaXNwbGF5ICovCi0gICAgICAgICBkLm9wdGlvbnMgfD0gTE9HOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tbm9sb2ciKSA9PSAwKQotICAgICAgICAgZC5vcHRpb25zICY9IH5MT0c7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1jb250aW51ZSIpID09IDApCi0gICAgICAgICBkLm9wdGlvbnMgfD0gQ09OVElOVUU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1zdG9wIikgPT0gMCkKLSAgICAgICAgIGQub3B0aW9ucyAmPSB+Q09OVElOVUU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1za2lwLWJ1Z3MiKSA9PSAwKQotICAgICAgICAgZC5vcHRpb25zIHw9IFNLSVBfQlVHUzsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLXRlc3QtYWxsIikgPT0gMCkKLSAgICAgICAgIGQub3B0aW9ucyAmPSB+U0tJUF9CVUdTOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tbG9nLXNraXBwZWQiKSA9PSAwKQotICAgICAgICAgZC5vcHRpb25zIHw9IExPR19TS0lQUEVEOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tbm9sb2ctc2tpcHBlZCIpID09IDApCi0gICAgICAgICBkLm9wdGlvbnMgJj0gfkxPR19TS0lQUEVEOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIi0tZmluZC1iYWQtY29tYm9zIikgPT0gMCkKLSAgICAgICAgIGQub3B0aW9ucyB8PSBGSU5EX0JBRF9DT01CT1M7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLS1ub2ZpbmQtYmFkLWNvbWJvcyIpID09IDApCi0gICAgICAgICBkLm9wdGlvbnMgJj0gfkZJTkRfQkFEX0NPTUJPUzsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLWxpc3QtY29tYm9zIikgPT0gMCkKLSAgICAgICAgIGQub3B0aW9ucyB8PSBMSVNUX0NPTUJPUzsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICItLW5vbGlzdC1jb21ib3MiKSA9PSAwKQotICAgICAgICAgZC5vcHRpb25zICY9IH5MSVNUX0NPTUJPUzsKLQotICAgICAgZWxzZSBpZiAobmFtZVswXSA9PSAnLScgJiYgbmFtZVsxXSA9PSAnLScpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ2ltYWdlOiAlczogdW5rbm93biBvcHRpb25cbiIsIG5hbWUpOwotICAgICAgICAgcmV0dXJuIDk5OwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBicmVhazsgLyogTm90IGFuIG9wdGlvbiAqLwotICAgfQotCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBlcnJvcnMgPSAwOwotCi0gICAgICBmb3IgKGk9b3B0aW9uX2VuZDsgaTxhcmdjOyArK2kpCi0gICAgICB7Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gZG9fdGVzdCgmZCwgYXJndltpXSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXQgPiBRVUlFVCkgLyogYWJvcnQgb24gdXNlciBvciBpbnRlcm5hbCBlcnJvciAqLwotICAgICAgICAgICAgICAgcmV0dXJuIDk5OwotICAgICAgICAgfQotCi0gICAgICAgICAvKiBIZXJlIG9uIGFueSByZXR1cm4sIGluY2x1ZGluZyBmYWlsdXJlcywgZXhjZXB0IHVzZXIvaW50ZXJuYWwgaXNzdWVzCi0gICAgICAgICAgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBwYXNzID0gKGQub3B0aW9ucyAmIFNUUklDVCkgPwotICAgICAgICAgICAgICAgUkVTVUxUX1NUUklDVChkLnJlc3VsdHMpIDogUkVTVUxUX1JFTEFYRUQoZC5yZXN1bHRzKTsKLQotICAgICAgICAgICAgaWYgKCFwYXNzKQotICAgICAgICAgICAgICAgKytlcnJvcnM7Ci0KLSAgICAgICAgICAgIGlmIChkLm9wdGlvbnMgJiBMT0cpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgcHJpbnRmKCIlczogcG5naW1hZ2UgIiwgcGFzcyA/ICJQQVNTIiA6ICJGQUlMIik7Ci0KLSAgICAgICAgICAgICAgIGZvciAoaj0xOyBqPG9wdGlvbl9lbmQ7ICsraikgaWYgKGogIT0gaWxvZykKLSAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIiwgYXJndltqXSk7Ci0KLSAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIGQuZmlsZW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBkaXNwbGF5X2NsZWFuKCZkKTsKLSAgICAgIH0KLQotICAgICAgLyogUmVsZWFzZSBhbGxvY2F0ZWQgbWVtb3J5ICovCi0gICAgICBkaXNwbGF5X2Rlc3Ryb3koJmQpOwotCi0gICAgICByZXR1cm4gZXJyb3JzICE9IDA7Ci0gICB9Ci19Ci0jZWxzZSAvKiAhUkVBRF9QTkcgKi8KLWludAotbWFpbih2b2lkKQotewotICAgZnByaW50ZihzdGRlcnIsICJwbmdpbWFnZTogbm8gc3VwcG9ydCBmb3IgcG5nX3JlYWQvd3JpdGVfaW1hZ2VcbiIpOwotICAgcmV0dXJuIFNLSVA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QtZXJyb3JzLmggYi9jb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LWVycm9ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzU2ZjFjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvbGlidGVzdHMvcG5nc3Rlc3QtZXJyb3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyogY29udHJpYi9saWJ0ZXN0cy9wbmdzdGVzdC1lcnJvcnMuaAotICoKLSAqIEJVSUxUIFVTSU5HOiBsaWJwbmcgdmVyc2lvbiAxLjYuMTliZXRhMDMgLSBTZXB0ZW1iZXIgMjUsIDIwMTUKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBUSElTIElTIEEgTUFDSElORSBHRU5FUkFURUQgRklMRTogZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkhCi0gKiBJbnN0ZWFkIHJ1bjoKLSAqCi0gKiAgICBwbmdzdGVzdCAtLWFjY3VtdWxhdGUKLSAqCi0gKiBvbiBhcyBtYW55IFBORyBmaWxlcyBhcyBwb3NzaWJsZTsgYXQgbGVhc3QgUE5HU3VpdGUgYW5kCi0gKiBjb250cmliL2xpYnRlc3RzL3Rlc3RwbmdzLgotICovCi1zdGF0aWMgcG5nX3VpbnRfMTYgZ3BjX2Vycm9yWzE2LyppbiovXVsxNi8qb3V0Ki9dWzQvKmEqL10gPQotewotIHsgLyogaW5wdXQ6IHNSR0ItZ3JheSAqLwotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAzNzIsIDAgfSwgeyAwLCAwLCAzNzIsIDAgfSwgeyAwLCAwLCAzNzIsIDAgfSwgeyAwLCAwLCAzNzIsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogc1JHQi1ncmF5K2FscGhhICovCi0gIHsgMCwgMTksIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMjAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgODk3LCA3ODgsIDAgfSwgeyAwLCA4OTcsIDc4OCwgMCB9LCB7IDAsIDg5NywgNzg4LCAwIH0sIHsgMCwgODk3LCA3ODgsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogc1JHQi1yZ2IgKi8KLSAgeyAwLCAwLCAxOSwgMCB9LCB7IDAsIDAsIDE5LCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCA4OTMsIDAgfSwgeyAwLCAwLCA4OTMsIDAgfSwgeyAwLCAwLCA4MTEsIDAgfSwgeyAwLCAwLCA4MTEsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogc1JHQi1yZ2IrYWxwaGEgKi8KLSAgeyAwLCAxNiwgMTcsIDAgfSwgeyAwLCAxNywgMTcsIDAgfSwgeyAwLCAxOSwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCA4NTAsIDg3NSwgMCB9LCB7IDAsIDg1MCwgODc1LCAwIH0sIHsgMCwgODk3LCA3ODgsIDAgfSwgeyAwLCA4OTcsIDc4OCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KLSB9LCB7IC8qIGlucHV0OiBsaW5lYXItZ3JheSAqLwotICB7IDAsIDAsIDksIDAgfSwgeyAwLCAwLCA5LCAwIH0sIHsgMCwgMCwgOSwgMCB9LCB7IDAsIDAsIDksIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1ncmF5K2FscGhhICovCi0gIHsgMCwgNzQsIDksIDAgfSwgeyAwLCAyMCwgOSwgMCB9LCB7IDAsIDc0LCA5LCAwIH0sIHsgMCwgMjAsIDksIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMSwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAxLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1yZ2IgKi8KLSAgeyAwLCAwLCA5LCAwIH0sIHsgMCwgMCwgOSwgMCB9LCB7IDAsIDAsIDksIDAgfSwgeyAwLCAwLCA5LCAwIH0sCi0gIHsgMCwgMCwgNCwgMCB9LCB7IDAsIDAsIDQsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KLSB9LCB7IC8qIGlucHV0OiBsaW5lYXItcmdiK2FscGhhICovCi0gIHsgMCwgMTI2LCAxNDMsIDAgfSwgeyAwLCAxMSwgNywgMCB9LCB7IDAsIDc0LCA5LCAwIH0sIHsgMCwgMTcsIDksIDAgfSwKLSAgeyAwLCA0LCA0LCAwIH0sIHsgMCwgNSwgNCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAxLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1zUkdCLWdyYXkgKi8KLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KLSB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtc1JHQi1ncmF5K2FscGhhICovCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLXNSR0ItcmdiICovCi0gIHsgMCwgMCwgMTMsIDAgfSwgeyAwLCAwLCAxMywgMCB9LCB7IDAsIDAsIDksIDAgfSwgeyAwLCAwLCA5LCAwIH0sCi0gIHsgMCwgMCwgNjczLCAwIH0sIHsgMCwgMCwgNjczLCAwIH0sIHsgMCwgMCwgNjc0LCAwIH0sIHsgMCwgMCwgNjc0LCAwIH0sCi0gIHsgMCwgMCwgMSwgMCB9LCB7IDAsIDAsIDEsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDQ2MCwgMCB9LCB7IDAsIDAsIDQ2MCwgMCB9LCB7IDAsIDAsIDI2MywgMCB9LCB7IDAsIDAsIDI2MywgMCB9Ci0gfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLXNSR0ItcmdiK2FscGhhICovCi0gIHsgMCwgNiwgOCwgMCB9LCB7IDAsIDcsIDgsIDAgfSwgeyAwLCA3NSwgOSwgMCB9LCB7IDAsIDksIDksIDAgfSwKLSAgeyAwLCA1ODUsIDQyNywgMCB9LCB7IDAsIDU4NSwgNDI3LCAwIH0sIHsgMCwgNzE3LCA1MTQsIDAgfSwgeyAwLCA3MTcsIDUxNCwgMCB9LAotICB7IDAsIDEsIDEsIDAgfSwgeyAwLCAxLCAxLCAwIH0sIHsgMCwgMSwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAxMzMyMywgNDYwLCAwIH0sIHsgMCwgNDI3LCA0NjAsIDAgfSwgeyAwLCAxNjQ4MCwgMjYzLCAwIH0sIHsgMCwgMjQzLCAyNjMsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1saW5lYXItZ3JheSAqLwotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDI4MiwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLWxpbmVhci1ncmF5K2FscGhhICovCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDI1MywgMjgyLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1saW5lYXItcmdiICovCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAyNjUsIDAgfSwgeyAwLCAwLCAwLCAwIH0KLSB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtbGluZWFyLXJnYithbHBoYSAqLwotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwKLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LAotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDI0MywgMjY1LCAwIH0KLSB9Ci19Owotc3RhdGljIHBuZ191aW50XzE2IGdwY19lcnJvcl92aWFfbGluZWFyWzE2XVs0LypvdXQqL11bNF0gPQotewotIHsgLyogaW5wdXQ6IHNSR0ItZ3JheSAqLwotICB7IDAsIDAsIDcsIDAgfSwgeyAwLCAwLCA3LCAwIH0sIHsgMCwgMCwgNywgMCB9LCB7IDAsIDAsIDcsIDAgfQotIH0sIHsgLyogaW5wdXQ6IHNSR0ItZ3JheSthbHBoYSAqLwotICB7IDAsIDE1LCAxNSwgMCB9LCB7IDAsIDE4NiwgMTUsIDAgfSwgeyAwLCAxNSwgMTUsIDAgfSwgeyAwLCAxODYsIDE1LCAwIH0KLSB9LCB7IC8qIGlucHV0OiBzUkdCLXJnYiAqLwotICB7IDAsIDAsIDIwLCAwIH0sIHsgMCwgMCwgMjAsIDAgfSwgeyAwLCAwLCAxNSwgMCB9LCB7IDAsIDAsIDE1LCAwIH0KLSB9LCB7IC8qIGlucHV0OiBzUkdCLXJnYithbHBoYSAqLwotICB7IDAsIDE2LCAxNywgMCB9LCB7IDAsIDE4NywgMTcsIDAgfSwgeyAwLCAxNSwgMTUsIDAgfSwgeyAwLCAxODYsIDE1LCAwIH0KLSB9LCB7IC8qIGlucHV0OiBsaW5lYXItZ3JheSAqLwotICB7IDAsIDAsIDEsIDAgfSwgeyAwLCAwLCAxLCAwIH0sIHsgMCwgMCwgMSwgMCB9LCB7IDAsIDAsIDEsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1ncmF5K2FscGhhICovCi0gIHsgMCwgMSwgMSwgMCB9LCB7IDAsIDEsIDEsIDAgfSwgeyAwLCAxLCAxLCAwIH0sIHsgMCwgMSwgMSwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogbGluZWFyLXJnYiAqLwotICB7IDAsIDAsIDEsIDAgfSwgeyAwLCAwLCAxLCAwIH0sIHsgMCwgMCwgMSwgMCB9LCB7IDAsIDAsIDEsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1yZ2IrYWxwaGEgKi8KLSAgeyAwLCAxLCAxLCAwIH0sIHsgMCwgOSwgMSwgMCB9LCB7IDAsIDEsIDEsIDAgfSwgeyAwLCAxLCAxLCAwIH0KLSB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtc1JHQi1ncmF5ICovCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLXNSR0ItZ3JheSthbHBoYSAqLwotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGNvbG9yLW1hcHBlZC1zUkdCLXJnYiAqLwotICB7IDAsIDAsIDEzLCAwIH0sIHsgMCwgMCwgMTMsIDAgfSwgeyAwLCAwLCAxNCwgMCB9LCB7IDAsIDAsIDE0LCAwIH0KLSB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtc1JHQi1yZ2IrYWxwaGEgKi8KLSAgeyAwLCA0LCA4LCAwIH0sIHsgMCwgOSwgOCwgMCB9LCB7IDAsIDksIDUsIDAgfSwgeyAwLCAzMiwgNSwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLWxpbmVhci1ncmF5ICovCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLWxpbmVhci1ncmF5K2FscGhhICovCi0gIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogY29sb3ItbWFwcGVkLWxpbmVhci1yZ2IgKi8KLSAgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0KLSB9LCB7IC8qIGlucHV0OiBjb2xvci1tYXBwZWQtbGluZWFyLXJnYithbHBoYSAqLwotICB7IDAsIDAsIDAsIDAgfSwgeyAwLCAwLCAwLCAwIH0sIHsgMCwgMCwgMCwgMCB9LCB7IDAsIDAsIDAsIDAgfQotIH0KLX07Ci1zdGF0aWMgcG5nX3VpbnRfMTYgZ3BjX2Vycm9yX3RvX2NvbG9ybWFwWzgvKmkqL11bOC8qbyovXVs0XSA9Ci17Ci0geyAvKiBpbnB1dDogc1JHQi1ncmF5ICovCi0gIHsgMCwgMCwgOSwgMCB9LCB7IDAsIDAsIDksIDAgfSwgeyAwLCAwLCA5LCAwIH0sIHsgMCwgMCwgOSwgMCB9LAotICB7IDAsIDAsIDU2MCwgMCB9LCB7IDAsIDAsIDU2MCwgMCB9LCB7IDAsIDAsIDU2MCwgMCB9LCB7IDAsIDAsIDU2MCwgMCB9Ci0gfSwgeyAvKiBpbnB1dDogc1JHQi1ncmF5K2FscGhhICovCi0gIHsgMCwgMTksIDksIDAgfSwgeyAwLCAyNTUsIDksIDI1IH0sIHsgMCwgODgsIDksIDAgfSwgeyAwLCAyNTUsIDksIDI1IH0sCi0gIHsgMCwgMTAxMiwgOTI4LCAwIH0sIHsgMCwgMTYwMjYsIDkyOCwgNjQyNSB9LCB7IDAsIDEwMTIsIDkyOCwgMCB9LCB7IDAsIDE2MDI2LCA5MjgsIDY0MjUgfQotIH0sIHsgLyogaW5wdXQ6IHNSR0ItcmdiICovCi0gIHsgMCwgMCwgMTksIDAgfSwgeyAwLCAwLCAxOSwgMCB9LCB7IDAsIDAsIDI1LCAwIH0sIHsgMCwgMCwgMjUsIDAgfSwKLSAgeyAwLCAwLCA5NjIsIDAgfSwgeyAwLCAwLCA5NjIsIDAgfSwgeyAwLCAwLCAxMzY3NywgMCB9LCB7IDAsIDAsIDEzNjc3LCAwIH0KLSB9LCB7IC8qIGlucHV0OiBzUkdCLXJnYithbHBoYSAqLwotICB7IDAsIDYzLCA3NywgMCB9LCB7IDAsIDI1NSwgMTksIDI1IH0sIHsgMCwgMjI1LCAyNSwgMCB9LCB7IDAsIDI1NSwgMjUsIDY3IH0sCi0gIHsgMCwgMTc1MzQsIDE4NDkxLCAwIH0sIHsgMCwgMTU3MzYsIDI4MjQsIDY0MjUgfSwgeyAwLCAxNDAxOSwgMTM2NzcsIDAgfSwgeyAwLCA1MDExNSwgMTM2NzcsIDE3MjE5IH0KLSB9LCB7IC8qIGlucHV0OiBsaW5lYXItZ3JheSAqLwotICB7IDAsIDAsIDczLCAwIH0sIHsgMCwgMCwgNzMsIDAgfSwgeyAwLCAwLCA3MywgMCB9LCB7IDAsIDAsIDczLCAwIH0sCi0gIHsgMCwgMCwgMTg4MTcsIDAgfSwgeyAwLCAwLCAxODgxNywgMCB9LCB7IDAsIDAsIDE4ODE3LCAwIH0sIHsgMCwgMCwgMTg4MTcsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1ncmF5K2FscGhhICovCi0gIHsgMCwgNzQsIDc0LCAwIH0sIHsgMCwgMjU1LCA3NCwgMjUgfSwgeyAwLCA5OSwgNzQsIDAgfSwgeyAwLCAyNTUsIDc0LCAyNSB9LAotICB7IDAsIDE4OTE5LCAxODkwNywgMCB9LCB7IDAsIDI0NTQ5LCAxODkwNywgNjU1MyB9LCB7IDAsIDE4OTE5LCAxODkwNywgMCB9LCB7IDAsIDI0NTQ5LCAxODkwNywgNjU1MyB9Ci0gfSwgeyAvKiBpbnB1dDogbGluZWFyLXJnYiAqLwotICB7IDAsIDAsIDczLCAwIH0sIHsgMCwgMCwgNzMsIDAgfSwgeyAwLCAwLCA5OCwgMCB9LCB7IDAsIDAsIDk4LCAwIH0sCi0gIHsgMCwgMCwgMTg2NjQsIDAgfSwgeyAwLCAwLCAxODY2NCwgMCB9LCB7IDAsIDAsIDI0OTk4LCAwIH0sIHsgMCwgMCwgMjQ5OTgsIDAgfQotIH0sIHsgLyogaW5wdXQ6IGxpbmVhci1yZ2IrYWxwaGEgKi8KLSAgeyAwLCAxODEsIDE5NiwgMCB9LCB7IDAsIDI1NSwgNjEsIDI1IH0sIHsgMjA2LCAxODcsIDk4LCAwIH0sIHsgMCwgMjU1LCA5OCwgNjcgfSwKLSAgeyAwLCAxODE0MSwgMTgxMzcsIDAgfSwgeyAwLCAxNzQ5NCwgMTc1MDQsIDY1NTMgfSwgeyAwLCAyNDk3OSwgMjQ5OTIsIDAgfSwgeyAwLCA0OTE3MiwgMjQ5OTIsIDE3MzQ3IH0KLSB9Ci19OwotLyogRU5EIE1BQ0hJTkUgR0VORVJBVEVEICovCmRpZmYgLS1naXQgYS9jb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LmMgYi9jb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjU3YTkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9saWJ0ZXN0cy9wbmdzdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgxOSArMCwwIEBACi0vKi0KLSAqIHBuZ3N0ZXN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBKb2huIEN1bm5pbmdoYW0gQm93bGVyCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjQgW0F1Z3VzdCA0LCAyMDE2XQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFRlc3QgZm9yIHRoZSBQTkcgJ3NpbXBsaWZpZWQnIEFQSXMuCi0gKi8KLSNkZWZpbmUgX0lTT0M5MF9TT1VSQ0UgMQotI2RlZmluZSBNQUxMT0NfQ0hFQ0tfIDIvKmdsaWJjIGZhY2lsaXR5OiB0dXJuIG9uIGRlYnVnZ2luZyovCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpZiBkZWZpbmVkKEhBVkVfQ09ORklHX0gpICYmICFkZWZpbmVkKFBOR19OT19DT05GSUdfSCkKLSMgIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgotICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6Ci0gKi8KLSNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCi0jICBpbmNsdWRlIDxwbmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKLSNlbmRpZgotCi0vKiAxLjYuMSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgY29uZmlndXJlIHRlc3QgaGFybmVzcywgd2hpY2ggdXNlcyA3NyB0byBpbmRpY2F0ZQotICogYSBza2lwcGVkIHRlc3QsIGluIGVhcmxpZXIgdmVyc2lvbnMgd2UgbmVlZCB0byBzdWNjZWVkIG9uIGEgc2tpcHBlZCB0ZXN0LCBzbzoKLSAqLwotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNjAxICYmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkKLSMgIGRlZmluZSBTS0lQIDc3Ci0jZWxzZQotIyAgZGVmaW5lIFNLSVAgMAotI2VuZGlmCi0KLSNpZmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCAvKiBFbHNlIG5vdGhpbmcgY2FuIGJlIGRvbmUgKi8KLSNpbmNsdWRlICIuLi90b29scy9zUkdCLmgiCi0KLS8qIEtOT1dOIElTU1VFUwotICoKLSAqIFRoZXNlIGRlZmluZXMgc3dpdGNoIG9uIGFsdGVybmF0ZSBhbGdvcml0aG1zIGZvciBmb3JtYXQgY29udmVyc2lvbnMgdG8gbWF0Y2gKLSAqIHRoZSBjdXJyZW50IGxpYnBuZyBpbXBsZW1lbnRhdGlvbjsgdGhleSBhcmUgc2V0IHRvIGFsbG93IHBuZ3N0ZXN0IHRvIHBhc3MKLSAqIGV2ZW4gdGhvdWdoIGxpYnBuZyBpcyBwcm9kdWNpbmcgYW5zd2VycyB0aGF0IGFyZSBub3QgYXMgY29ycmVjdCBhcyB0aGV5Ci0gKiBzaG91bGQgYmUuCi0gKi8KLSNkZWZpbmUgQUxMT1dfVU5VU0VEX0dQQyAwCi0gICAvKiBJZiB0cnVlIGluY2x1ZGUgdW51c2VkIHN0YXRpYyBHUEMgZnVuY3Rpb25zIGFuZCBkZWNsYXJlIGFuIGV4dGVybmFsIGFycmF5Ci0gICAgKiBvZiB0aGVtIHRvIGhpZGUgdGhlIGZhY3QgdGhhdCB0aGV5IGFyZSB1bnVzZWQuICBUaGlzIGlzIGZvciBkZXZlbG9wbWVudAotICAgICogdXNlIHdoaWxlIHRlc3RpbmcgdGhlIGNvcnJlY3QgZnVuY3Rpb24gdG8gdXNlIHRvIHRha2UgaW50byBhY2NvdW50IGxpYnBuZwotICAgICogbWlzYmVoYXZpb3IsIHN1Y2ggYXMgdXNpbmcgYSBzaW1wbGUgcG93ZXIgbGF3IHRvIGNvcnJlY3Qgc1JHQiB0byBsaW5lYXIuCi0gICAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBpcyB0byBzdXBwb3J0IGRpcmVjdCBjb21waWxhdGlvbiBvZiB0aGlzIGZpbGUgYXMgQysrICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSMgIGRlZmluZSB2b2lkY2FzdCh0eXBlLCB2YWx1ZSkgc3RhdGljX2Nhc3Q8dHlwZT4odmFsdWUpCi0jICBkZWZpbmUgYWxpZ25jYXN0Y29uc3QodHlwZSwgdmFsdWUpIFwKLSAgICAgIHN0YXRpY19jYXN0PHR5cGU+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpCi0jZWxzZQotIyAgZGVmaW5lIHZvaWRjYXN0KHR5cGUsIHZhbHVlKSAodmFsdWUpCi0jICBkZWZpbmUgYWxpZ25jYXN0Y29uc3QodHlwZSwgdmFsdWUpICgoY29uc3Qgdm9pZCopKHZhbHVlKSkKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBEdXJpbmcgcGFyYWxsZWwgcnVucyBvZiBwbmdzdGVzdCBlYWNoIHRlbXBvcmFyeSBmaWxlIG5lZWRzIGEgdW5pcXVlIG5hbWUsCi0gKiB0aGlzIGlzIHVzZWQgdG8gcGVybWl0IHVuaXF1ZW5lc3MgdXNpbmcgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2hpY2ggY2FuIGJlCi0gKiB1cCB0byAyMiBjaGFyYWN0ZXJzIGxvbmcuCi0gKi8KLXN0YXRpYyBjaGFyIHRtcGZbMjNdID0gIlRNUCI7Ci0KLS8qIEdlbmVyYXRlIHJhbmRvbSBieXRlcy4gIFRoaXMgdXNlcyBhIGJvcmluZyByZXBlYXRhYmxlIGFsZ29yaXRobSBhbmQgaXQKLSAqIGlzIGltcGxlbWVudGVkIGhlcmUgc28gdGhhdCBpdCBnaXZlcyB0aGUgc2FtZSBzZXQgb2YgbnVtYmVycyBvbiBldmVyeQotICogYXJjaGl0ZWN0dXJlLiAgSXQncyBhIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIChLbnV0aCBvciBTZWRnZXdpY2sKLSAqICJBbGdvcml0aG1zIikgYnV0IGl0IGNvbWVzIGZyb20gdGhlICdmZWVkYmFjayB0YXBzJyB0YWJsZSBpbiBIb3Jvd2l0eiBhbmQKLSAqIEhpbGwsICJUaGUgQXJ0IG9mIEVsZWN0cm9uaWNzIi4KLSAqLwotc3RhdGljIHZvaWQKLW1ha2VfcmFuZG9tX2J5dGVzKHBuZ191aW50XzMyKiBzZWVkLCB2b2lkKiBwdiwgc2l6ZV90IHNpemUpCi17Ci0gICBwbmdfdWludF8zMiB1MCA9IHNlZWRbMF0sIHUxID0gc2VlZFsxXTsKLSAgIHBuZ19ieXRlcCBieXRlcyA9IHZvaWRjYXN0KHBuZ19ieXRlcCwgcHYpOwotCi0gICAvKiBUaGVyZSBhcmUgdGhpcnR5IHRocmVlIGJpdHMsIHRoZSBuZXh0IGJpdCBpbiB0aGUgc2VxdWVuY2UgaXMgYml0LTMzIFhPUgotICAgICogYml0LTIwLiAgVGhlIHRvcCAxIGJpdCBpcyBpbiB1MSwgdGhlIGJvdHRvbSAzMiBhcmUgaW4gdTAuCi0gICAgKi8KLSAgIHNpemVfdCBpOwotICAgZm9yIChpPTA7IGk8c2l6ZTsgKytpKQotICAgewotICAgICAgLyogRmlyc3QgZ2VuZXJhdGUgOCBuZXcgYml0cyB0aGVuIHNoaWZ0IHRoZW0gaW4gYXQgdGhlIGVuZC4gKi8KLSAgICAgIHBuZ191aW50XzMyIHUgPSAoKHUwID4+ICgyMC04KSkgXiAoKHUxIDw8IDcpIHwgKHUwID4+ICgzMi03KSkpKSAmIDB4ZmY7Ci0gICAgICB1MSA8PD0gODsKLSAgICAgIHUxIHw9IHUwID4+IDI0OwotICAgICAgdTAgPDw9IDg7Ci0gICAgICB1MCB8PSB1OwotICAgICAgKmJ5dGVzKysgPSAocG5nX2J5dGUpdTsKLSAgIH0KLQotICAgc2VlZFswXSA9IHUwOwotICAgc2VlZFsxXSA9IHUxOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIgY29sb3Jfc2VlZFsyXTsKLQotc3RhdGljIHZvaWQKLXJlc2VlZCh2b2lkKQotewotICAgY29sb3Jfc2VlZFswXSA9IDB4MTIzNDU2NzhVOwotICAgY29sb3Jfc2VlZFsxXSA9IDB4OWFiY2RlZlU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yYW5kb21fY29sb3IocG5nX2NvbG9ycCBjb2xvcikKLXsKLSAgIG1ha2VfcmFuZG9tX2J5dGVzKGNvbG9yX3NlZWQsIGNvbG9yLCBzaXplb2YgKmNvbG9yKTsKLX0KLQotLyogTWF0aCBzdXBwb3J0IC0gbmVpdGhlciBDeWd3aW4gbm9yIFZpc3VhbCBTdHVkaW8gaGF2ZSBDOTkgc3VwcG9ydCBhbmQgd2UgbmVlZAotICogYSBwcmVkaWN0YWJsZSByb3VuZGluZyBmdW5jdGlvbiwgc28gbWFrZSBvbmUgaGVyZToKLSAqLwotc3RhdGljIGRvdWJsZQotY2xvc2VzdGludGVnZXIoZG91YmxlIHgpCi17Ci0gICByZXR1cm4gZmxvb3IoeCArIC41KTsKLX0KLQotLyogQ2FzdCBzdXBwb3J0OiByZW1vdmUgR0NDIHdoaW5lcy4gKi8KLXN0YXRpYyBwbmdfYnl0ZQotdThkKGRvdWJsZSBkKQotewotICAgZCA9IGNsb3Nlc3RpbnRlZ2VyKGQpOwotICAgcmV0dXJuIChwbmdfYnl0ZSlkOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMTYKLXUxNmQoZG91YmxlIGQpCi17Ci0gICBkID0gY2xvc2VzdGludGVnZXIoZCk7Ci0gICByZXR1cm4gKHBuZ191aW50XzE2KWQ7Ci19Ci0KLS8qIHNSR0Igc3VwcG9ydDogdXNlIGV4YWN0IGNhbGN1bGF0aW9ucyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludCwgc2VlIHRoZQotICogZmVzZXRyb3VuZCgpIGNhbGwgaW4gbWFpbigpLiAgc1JHQl90b19kIG9wdGltaXplcyB0aGUgOCB0byAxNi1iaXQgY29udmVyc2lvbi4KLSAqLwotc3RhdGljIGRvdWJsZSBzUkdCX3RvX2RbMjU2XTsKLXN0YXRpYyBkb3VibGUgZzIyX3RvX2RbMjU2XTsKLQotc3RhdGljIHZvaWQKLWluaXRfc1JHQl90b19kKHZvaWQpCi17Ci0gICBpbnQgaTsKLQotICAgc1JHQl90b19kWzBdID0gMDsKLSAgIGZvciAoaT0xOyBpPDI1NTsgKytpKQotICAgICAgc1JHQl90b19kW2ldID0gbGluZWFyX2Zyb21fc1JHQihpLzI1NS4pOwotICAgc1JHQl90b19kWzI1NV0gPSAxOwotCi0gICBnMjJfdG9fZFswXSA9IDA7Ci0gICBmb3IgKGk9MTsgaTwyNTU7ICsraSkKLSAgICAgIGcyMl90b19kW2ldID0gcG93KGkvMjU1LiwgMS8uNDU0NTUpOwotICAgZzIyX3RvX2RbMjU1XSA9IDE7Ci19Ci0KLXN0YXRpYyBwbmdfYnl0ZQotc1JHQihkb3VibGUgbGluZWFyIC8qcmFuZ2UgMC4wIC4uIDEuMCovKQotewotICAgcmV0dXJuIHU4ZCgyNTUgKiBzUkdCX2Zyb21fbGluZWFyKGxpbmVhcikpOwotfQotCi1zdGF0aWMgcG5nX2J5dGUKLWlzUkdCKGludCBmaXhlZF9saW5lYXIpCi17Ci0gICByZXR1cm4gc1JHQihmaXhlZF9saW5lYXIgLyA2NTUzNS4pOwotfQotCi0jaWYgMCAvKiBub3QgdXNlZCAqLwotc3RhdGljIHBuZ19ieXRlCi11bnByZW11bHRpcGx5KGludCBjb21wb25lbnQsIGludCBhbHBoYSkKLXsKLSAgIGlmIChhbHBoYSA8PSBjb21wb25lbnQpCi0gICAgICByZXR1cm4gMjU1OyAvKiBBcmJpdHJhcnksIGJ1dCBjb25zaXN0ZW50IHdpdGggdGhlIGxpYnBuZyBjb2RlICovCi0KLSAgIGVsc2UgaWYgKGFscGhhID49IDY1NTM1KQotICAgICAgcmV0dXJuIGlzUkdCKGNvbXBvbmVudCk7Ci0KLSAgIGVsc2UKLSAgICAgIHJldHVybiBzUkdCKChkb3VibGUpY29tcG9uZW50IC8gYWxwaGEpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBwbmdfdWludF8xNgotaWxpbmVhcihpbnQgZml4ZWRfc3JnYikKLXsKLSAgIHJldHVybiB1MTZkKDY1NTM1ICogc1JHQl90b19kW2ZpeGVkX3NyZ2JdKTsKLX0KLQotc3RhdGljIHBuZ191aW50XzE2Ci1pbGluZWFyYShpbnQgZml4ZWRfc3JnYiwgaW50IGFscGhhKQotewotICAgcmV0dXJuIHUxNmQoKDI1NyAqIGFscGhhKSAqIHNSR0JfdG9fZFtmaXhlZF9zcmdiXSk7Ci19Ci0KLXN0YXRpYyBwbmdfdWludF8xNgotaWxpbmVhcl9nMjIoaW50IGZpeGVkX3NyZ2IpCi17Ci0gICByZXR1cm4gdTE2ZCg2NTUzNSAqIGcyMl90b19kW2ZpeGVkX3NyZ2JdKTsKLX0KLQotI2lmIEFMTE9XX1VOVVNFRF9HUEMKLXN0YXRpYyBwbmdfdWludF8xNgotaWxpbmVhcmFfZzIyKGludCBmaXhlZF9zcmdiLCBpbnQgYWxwaGEpCi17Ci0gICByZXR1cm4gdTE2ZCgoMjU3ICogYWxwaGEpICogZzIyX3RvX2RbZml4ZWRfc3JnYl0pOwotfQotI2VuZGlmCi0KLXN0YXRpYyBkb3VibGUKLVlmcm9tUkdCaW50KGludCBpciwgaW50IGlnLCBpbnQgaWIpCi17Ci0gICBkb3VibGUgciA9IGlyOwotICAgZG91YmxlIGcgPSBpZzsKLSAgIGRvdWJsZSBiID0gaWI7Ci0gICByZXR1cm4gWWZyb21SR0IociwgZywgYik7Ci19Ci0KLSNpZiAwIC8qIHVudXNlZCAqLwotLyogVGhlIGVycm9yIHRoYXQgcmVzdWx0cyBmcm9tIHVzaW5nIGEgMi4yIHBvd2VyIGxhdyBpbiBwbGFjZSBvZiB0aGUgY29ycmVjdAotICogc1JHQiB0cmFuc2Zvcm0sIGdpdmVuIGFuIDgtYml0IHZhbHVlIHdoaWNoIG1pZ2h0IGJlIGVpdGhlciBzUkdCIG9yIHBvd2VyLWxhdy4KLSAqLwotc3RhdGljIGludAotcG93ZXJfbGF3X2Vycm9yOChpbnQgdmFsdWUpCi17Ci0gICBpZiAodmFsdWUgPiAwICYmIHZhbHVlIDwgMjU1KQotICAgewotICAgICAgZG91YmxlIHZkID0gdmFsdWUgLyAyNTUuOwotICAgICAgZG91YmxlIGUgPSBmYWJzKAotICAgICAgICAgcG93KHNSR0JfdG9fZFt2YWx1ZV0sIDEvMi4yKSAtIHNSR0JfZnJvbV9saW5lYXIocG93KHZkLCAyLjIpKSk7Ci0KLSAgICAgIC8qIEFsd2F5cyBhbGxvdyBhbiBleHRyYSAxIGhlcmUgZm9yIHJvdW5kaW5nIGVycm9ycyAqLwotICAgICAgZSA9IDErZmxvb3IoMjU1ICogZSk7Ci0gICAgICByZXR1cm4gKGludCllOwotICAgfQotCi0gICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlcnJvcl9pbl9zUkdCX3JvdW5kdHJpcCA9IDU2OyAvKiBieSBleHBlcmltZW50ICovCi1zdGF0aWMgaW50Ci1wb3dlcl9sYXdfZXJyb3IxNihpbnQgdmFsdWUpCi17Ci0gICBpZiAodmFsdWUgPiAwICYmIHZhbHVlIDwgNjU1MzUpCi0gICB7Ci0gICAgICAvKiBSb3VuZCB0cmlwIHRoZSB2YWx1ZSB0aHJvdWdoIGFuIDgtYml0IHJlcHJlc2VudGF0aW9uIGJ1dCB1c2luZwotICAgICAgICogbm9uLW1hdGNoaW5nIHRvL2Zyb20gY29udmVyc2lvbnMuCi0gICAgICAgKi8KLSAgICAgIGRvdWJsZSB2ZCA9IHZhbHVlIC8gNjU1MzUuOwotICAgICAgZG91YmxlIGUgPSBmYWJzKAotICAgICAgICAgcG93KHNSR0JfZnJvbV9saW5lYXIodmQpLCAyLjIpIC0gbGluZWFyX2Zyb21fc1JHQihwb3codmQsIDEvMi4yKSkpOwotCi0gICAgICAvKiBBbHdheXMgYWxsb3cgYW4gZXh0cmEgMSBoZXJlIGZvciByb3VuZGluZyBlcnJvcnMgKi8KLSAgICAgIGUgPSBlcnJvcl9pbl9zUkdCX3JvdW5kdHJpcCtmbG9vcig2NTUzNSAqIGUpOwotICAgICAgcmV0dXJuIChpbnQpZTsKLSAgIH0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfOGJpdChpbnQgdjEsIGludCB2MiwgaW50IGVycm9yX2xpbWl0LCBpbnQgbXVsdGlwbGVfYWxnb3JpdGhtcykKLXsKLSAgIGludCBlID0gYWJzKHYxLXYyKTsKLSAgIGludCBldjEsIGV2MjsKLQotICAgaWYgKGUgPD0gZXJyb3JfbGltaXQpCi0gICAgICByZXR1cm4gMTsKLQotICAgaWYgKCFtdWx0aXBsZV9hbGdvcml0aG1zKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgIGV2MSA9IHBvd2VyX2xhd19lcnJvcjgodjEpOwotICAgaWYgKGUgPD0gZXYxKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgIGV2MiA9IHBvd2VyX2xhd19lcnJvcjgodjIpOwotICAgaWYgKGUgPD0gZXYyKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jb21wYXJlXzE2Yml0KGludCB2MSwgaW50IHYyLCBpbnQgZXJyb3JfbGltaXQsIGludCBtdWx0aXBsZV9hbGdvcml0aG1zKQotewotICAgaW50IGUgPSBhYnModjEtdjIpOwotICAgaW50IGV2MSwgZXYyOwotCi0gICBpZiAoZSA8PSBlcnJvcl9saW1pdCkKLSAgICAgIHJldHVybiAxOwotCi0gICAvKiAibXVsdGlwbGVfYWxnb3JpdGhtcyIgaW4gdGhpcyBjYXNlIG1lYW5zIHRoYXQgYSBjb2xvci1tYXAgaGFzIGJlZW4KLSAgICAqIGludm9sdmVkIHNvbWV3aGVyZSwgc28gd2UgY2FuIGRlZHVjZSB0aGF0IHRoZSB2YWx1ZXMgd2VyZSBmb3JjZWQgdG8gOC1iaXQKLSAgICAqIChsaWtlIHRoZSB2aWFfbGluZWFyIGNhc2UgZm9yIDgtYml0LikKLSAgICAqLwotICAgaWYgKCFtdWx0aXBsZV9hbGdvcml0aG1zKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgIGV2MSA9IHBvd2VyX2xhd19lcnJvcjE2KHYxKTsKLSAgIGlmIChlIDw9IGV2MSkKLSAgICAgIHJldHVybiAxOwotCi0gICBldjIgPSBwb3dlcl9sYXdfZXJyb3IxNih2Mik7Ci0gICBpZiAoZSA8PSBldjIpCi0gICAgICByZXR1cm4gMTsKLQotICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogdW51c2VkICovCi0KLSNkZWZpbmUgVVNFX0ZJTEUgMSAgICAgICAvKiBlbHNlIG1lbW9yeSAqLwotI2RlZmluZSBVU0VfU1RESU8gMiAgICAgIC8qIGVsc2UgdXNlIGZpbGUgbmFtZSAqLwotI2RlZmluZSBTVFJJQ1QgNCAgICAgICAgIC8qIGZhaWwgb24gd2FybmluZ3MgdG9vICovCi0jZGVmaW5lIFZFUkJPU0UgOAotI2RlZmluZSBLRUVQX1RNUEZJTEVTIDE2IC8qIGVsc2UgZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyAqLwotI2RlZmluZSBLRUVQX0dPSU5HIDMyCi0jZGVmaW5lIEFDQ1VNVUxBVEUgNjQKLSNkZWZpbmUgRkFTVF9XUklURSAxMjgKLSNkZWZpbmUgc1JHQl8xNkJJVCAyNTYKLSNkZWZpbmUgTk9fUkVTRUVEICA1MTIgICAvKiBkbyBub3QgcmVzZWVkIG9uIGVhY2ggbmV3IGZpbGUgKi8KLSNkZWZpbmUgR0JHX0VSUk9SIDEwMjQgICAvKiBkbyBub3QgaWdub3JlIHRoZSBnYW1tYStiYWNrZ3JvdW5kX3JnYl90b19ncmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICogbGlicG5nIHdhcm5pbmcuICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcHRzKHBuZ191aW50XzMyIG9wdHMpCi17Ci0gICBpZiAob3B0cyAmIFVTRV9GSUxFKQotICAgICAgcHJpbnRmKCIgLS1maWxlIik7Ci0gICBpZiAob3B0cyAmIFVTRV9TVERJTykKLSAgICAgIHByaW50ZigiIC0tc3RkaW8iKTsKLSAgIGlmICghKG9wdHMgJiBTVFJJQ1QpKQotICAgICAgcHJpbnRmKCIgLS1ub3N0cmljdCIpOwotICAgaWYgKG9wdHMgJiBWRVJCT1NFKQotICAgICAgcHJpbnRmKCIgLS12ZXJib3NlIik7Ci0gICBpZiAob3B0cyAmIEtFRVBfVE1QRklMRVMpCi0gICAgICBwcmludGYoIiAtLXByZXNlcnZlIik7Ci0gICBpZiAob3B0cyAmIEtFRVBfR09JTkcpCi0gICAgICBwcmludGYoIiAtLWtlZXAtZ29pbmciKTsKLSAgIGlmIChvcHRzICYgQUNDVU1VTEFURSkKLSAgICAgIHByaW50ZigiIC0tYWNjdW11bGF0ZSIpOwotICAgaWYgKCEob3B0cyAmIEZBU1RfV1JJVEUpKSAvKiAtLWZhc3QgaXMgY3VycmVudGx5IHRoZSBkZWZhdWx0ICovCi0gICAgICBwcmludGYoIiAtLXNsb3ciKTsKLSAgIGlmIChvcHRzICYgc1JHQl8xNkJJVCkKLSAgICAgIHByaW50ZigiIC0tc1JHQi0xNmJpdCIpOwotICAgaWYgKG9wdHMgJiBOT19SRVNFRUQpCi0gICAgICBwcmludGYoIiAtLW5vcmVzZWVkIik7Ci0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMCAvKiBlbHNlIG9uIGJ5IGRlZmF1bHQgKi8KLSAgIGlmIChvcHRzICYgR0JHX0VSUk9SKQotICAgICAgcHJpbnRmKCIgLS1mYXVsdC1nYmctd2FybmluZyIpOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgRk9STUFUX05PX0NIQU5HRSAweDgwMDAwMDAwIC8qIGFkZGl0aW9uYWwgZmxhZyAqLwotCi0vKiBBIG5hbWUgdGFibGUgZm9yIGFsbCB0aGUgZm9ybWF0cyAtIGRlZmluZXMgdGhlIGZvcm1hdCBvZiB0aGUgJysnIGFyZ3VtZW50cyB0bwotICogcG5nc3Rlc3QuCi0gKi8KLSNkZWZpbmUgRk9STUFUX0NPVU5UIDY0Ci0jZGVmaW5lIEZPUk1BVF9NQVNLIDB4M2YKLXN0YXRpYyBQTkdfQ09OU1QgY2hhciAqIFBOR19DT05TVCBmb3JtYXRfbmFtZXNbRk9STUFUX0NPVU5UXSA9Ci17Ci0gICAic1JHQi1ncmF5IiwKLSAgICJzUkdCLWdyYXkrYWxwaGEiLAotICAgInNSR0ItcmdiIiwKLSAgICJzUkdCLXJnYithbHBoYSIsCi0gICAibGluZWFyLWdyYXkiLAotICAgImxpbmVhci1ncmF5K2FscGhhIiwKLSAgICJsaW5lYXItcmdiIiwKLSAgICJsaW5lYXItcmdiK2FscGhhIiwKLQotICAgImNvbG9yLW1hcHBlZC1zUkdCLWdyYXkiLAotICAgImNvbG9yLW1hcHBlZC1zUkdCLWdyYXkrYWxwaGEiLAotICAgImNvbG9yLW1hcHBlZC1zUkdCLXJnYiIsCi0gICAiY29sb3ItbWFwcGVkLXNSR0ItcmdiK2FscGhhIiwKLSAgICJjb2xvci1tYXBwZWQtbGluZWFyLWdyYXkiLAotICAgImNvbG9yLW1hcHBlZC1saW5lYXItZ3JheSthbHBoYSIsCi0gICAiY29sb3ItbWFwcGVkLWxpbmVhci1yZ2IiLAotICAgImNvbG9yLW1hcHBlZC1saW5lYXItcmdiK2FscGhhIiwKLQotICAgInNSR0ItZ3JheSIsCi0gICAic1JHQi1ncmF5K2FscGhhIiwKLSAgICJzUkdCLWJnciIsCi0gICAic1JHQi1iZ3IrYWxwaGEiLAotICAgImxpbmVhci1ncmF5IiwKLSAgICJsaW5lYXItZ3JheSthbHBoYSIsCi0gICAibGluZWFyLWJnciIsCi0gICAibGluZWFyLWJncithbHBoYSIsCi0KLSAgICJjb2xvci1tYXBwZWQtc1JHQi1ncmF5IiwKLSAgICJjb2xvci1tYXBwZWQtc1JHQi1ncmF5K2FscGhhIiwKLSAgICJjb2xvci1tYXBwZWQtc1JHQi1iZ3IiLAotICAgImNvbG9yLW1hcHBlZC1zUkdCLWJncithbHBoYSIsCi0gICAiY29sb3ItbWFwcGVkLWxpbmVhci1ncmF5IiwKLSAgICJjb2xvci1tYXBwZWQtbGluZWFyLWdyYXkrYWxwaGEiLAotICAgImNvbG9yLW1hcHBlZC1saW5lYXItYmdyIiwKLSAgICJjb2xvci1tYXBwZWQtbGluZWFyLWJncithbHBoYSIsCi0KLSAgICJzUkdCLWdyYXkiLAotICAgImFscGhhK3NSR0ItZ3JheSIsCi0gICAic1JHQi1yZ2IiLAotICAgImFscGhhK3NSR0ItcmdiIiwKLSAgICJsaW5lYXItZ3JheSIsCi0gICAiYWxwaGErbGluZWFyLWdyYXkiLAotICAgImxpbmVhci1yZ2IiLAotICAgImFscGhhK2xpbmVhci1yZ2IiLAotCi0gICAiY29sb3ItbWFwcGVkLXNSR0ItZ3JheSIsCi0gICAiY29sb3ItbWFwcGVkLWFscGhhK3NSR0ItZ3JheSIsCi0gICAiY29sb3ItbWFwcGVkLXNSR0ItcmdiIiwKLSAgICJjb2xvci1tYXBwZWQtYWxwaGErc1JHQi1yZ2IiLAotICAgImNvbG9yLW1hcHBlZC1saW5lYXItZ3JheSIsCi0gICAiY29sb3ItbWFwcGVkLWFscGhhK2xpbmVhci1ncmF5IiwKLSAgICJjb2xvci1tYXBwZWQtbGluZWFyLXJnYiIsCi0gICAiY29sb3ItbWFwcGVkLWFscGhhK2xpbmVhci1yZ2IiLAotCi0gICAic1JHQi1ncmF5IiwKLSAgICJhbHBoYStzUkdCLWdyYXkiLAotICAgInNSR0ItYmdyIiwKLSAgICJhbHBoYStzUkdCLWJnciIsCi0gICAibGluZWFyLWdyYXkiLAotICAgImFscGhhK2xpbmVhci1ncmF5IiwKLSAgICJsaW5lYXItYmdyIiwKLSAgICJhbHBoYStsaW5lYXItYmdyIiwKLQotICAgImNvbG9yLW1hcHBlZC1zUkdCLWdyYXkiLAotICAgImNvbG9yLW1hcHBlZC1hbHBoYStzUkdCLWdyYXkiLAotICAgImNvbG9yLW1hcHBlZC1zUkdCLWJnciIsCi0gICAiY29sb3ItbWFwcGVkLWFscGhhK3NSR0ItYmdyIiwKLSAgICJjb2xvci1tYXBwZWQtbGluZWFyLWdyYXkiLAotICAgImNvbG9yLW1hcHBlZC1hbHBoYStsaW5lYXItZ3JheSIsCi0gICAiY29sb3ItbWFwcGVkLWxpbmVhci1iZ3IiLAotICAgImNvbG9yLW1hcHBlZC1hbHBoYStsaW5lYXItYmdyIiwKLX07Ci0KLS8qIERlY29kZSBhbiBhcmd1bWVudCB0byBhIGZvcm1hdCBudW1iZXIuICovCi1zdGF0aWMgcG5nX3VpbnRfMzIKLWZvcm1hdG9mKGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgIGNoYXIgKmVwOwotICAgdW5zaWduZWQgbG9uZyBmb3JtYXQgPSBzdHJ0b3VsKGFyZywgJmVwLCAwKTsKLQotICAgaWYgKGVwID4gYXJnICYmICplcCA9PSAwICYmIGZvcm1hdCA8IEZPUk1BVF9DT1VOVCkKLSAgICAgIHJldHVybiAocG5nX3VpbnRfMzIpZm9ybWF0OwotCi0gICBlbHNlIGZvciAoZm9ybWF0PTA7IGZvcm1hdCA8IEZPUk1BVF9DT1VOVDsgKytmb3JtYXQpCi0gICB7Ci0gICAgICBpZiAoc3RyY21wKGZvcm1hdF9uYW1lc1tmb3JtYXRdLCBhcmcpID09IDApCi0gICAgICAgICByZXR1cm4gKHBuZ191aW50XzMyKWZvcm1hdDsKLSAgIH0KLQotICAgZnByaW50ZihzdGRlcnIsICJwbmdzdGVzdDogZm9ybWF0IG5hbWUgJyVzJyBpbnZhbGlkXG4iLCBhcmcpOwotICAgcmV0dXJuIEZPUk1BVF9DT1VOVDsKLX0KLQotLyogQml0c2V0L3Rlc3QgZnVuY3Rpb25zIGZvciBmb3JtYXRzICovCi0jZGVmaW5lIEZPUk1BVF9TRVRfQ09VTlQgKEZPUk1BVF9DT1VOVCAvIDMyKQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIHBuZ191aW50XzMyIGJpdHNbRk9STUFUX1NFVF9DT1VOVF07Ci19Ci1mb3JtYXRfbGlzdDsKLQotc3RhdGljIHZvaWQgZm9ybWF0X2luaXQoZm9ybWF0X2xpc3QgKnBmKQotewotICAgaW50IGk7Ci0gICBmb3IgKGk9MDsgaTxGT1JNQVRfU0VUX0NPVU5UOyArK2kpCi0gICAgICBwZi0+Yml0c1tpXSA9IDA7IC8qIEFsbCBvZmYgKi8KLX0KLQotI2lmIDAgLyogY3VycmVudGx5IHVudXNlZCAqLwotc3RhdGljIHZvaWQgZm9ybWF0X2NsZWFyKGZvcm1hdF9saXN0ICpwZikKLXsKLSAgIGludCBpOwotICAgZm9yIChpPTA7IGk8Rk9STUFUX1NFVF9DT1VOVDsgKytpKQotICAgICAgcGYtPmJpdHNbaV0gPSAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZm9ybWF0X2lzX2luaXRpYWwoZm9ybWF0X2xpc3QgKnBmKQotewotICAgaW50IGk7Ci0gICBmb3IgKGk9MDsgaTxGT1JNQVRfU0VUX0NPVU5UOyArK2kpCi0gICAgICBpZiAocGYtPmJpdHNbaV0gIT0gMCkKLSAgICAgICAgIHJldHVybiAwOwotCi0gICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBmb3JtYXRfc2V0KGZvcm1hdF9saXN0ICpwZiwgcG5nX3VpbnRfMzIgZm9ybWF0KQotewotICAgaWYgKGZvcm1hdCA8IEZPUk1BVF9DT1VOVCkKLSAgICAgIHJldHVybiBwZi0+Yml0c1tmb3JtYXQgPj4gNV0gfD0gKChwbmdfdWludF8zMikxKSA8PCAoZm9ybWF0ICYgMzEpOwotCi0gICByZXR1cm4gMDsKLX0KLQotI2lmIDAgLyogY3VycmVudGx5IHVudXNlZCAqLwotc3RhdGljIGludCBmb3JtYXRfdW5zZXQoZm9ybWF0X2xpc3QgKnBmLCBwbmdfdWludF8zMiBmb3JtYXQpCi17Ci0gICBpZiAoZm9ybWF0IDwgRk9STUFUX0NPVU5UKQotICAgICAgcmV0dXJuIHBmLT5iaXRzW2Zvcm1hdCA+PiA1XSAmPSB+KChwbmdfdWludF8zMikxKSA8PCAoZm9ybWF0ICYgMzEpOwotCi0gICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGZvcm1hdF9pc3NldChmb3JtYXRfbGlzdCAqcGYsIHBuZ191aW50XzMyIGZvcm1hdCkKLXsKLSAgIHJldHVybiBmb3JtYXQgPCBGT1JNQVRfQ09VTlQgJiYKLSAgICAgIChwZi0+Yml0c1tmb3JtYXQgPj4gNV0gJiAoKChwbmdfdWludF8zMikxKSA8PCAoZm9ybWF0ICYgMzEpKSkgIT0gMDsKLX0KLQotc3RhdGljIHZvaWQgZm9ybWF0X2RlZmF1bHQoZm9ybWF0X2xpc3QgKnBmLCBpbnQgcmVkdW5kYW50KQotewotICAgaWYgKHJlZHVuZGFudCkKLSAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICAvKiBzZXQgZXZlcnl0aGluZywgaW5jbHVkaW5nIGZsYWdzIHRoYXQgYXJlIHBvaW50bGVzcyAqLwotICAgICAgZm9yIChpPTA7IGk8Rk9STUFUX1NFVF9DT1VOVDsgKytpKQotICAgICAgICAgcGYtPmJpdHNbaV0gPSB+KHBuZ191aW50XzMyKTA7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIGY7Ci0KLSAgICAgIGZvciAoZj0wOyBmPEZPUk1BVF9DT1VOVDsgKytmKQotICAgICAgewotICAgICAgICAgLyogRWxpbWluYXRlIHJlZHVuZGFudCBhbmQgdW5zdXBwb3J0ZWQgc2V0dGluZ3MuICovCi0jICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQKLSAgICAgICAgICAgIC8qIEJHUiBpcyBtZWFuaW5nbGVzcyBpZiBubyBjb2xvcjogKi8KLSAgICAgICAgICAgIGlmICgoZiAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikgPT0gMCAmJgotICAgICAgICAgICAgICAgKGYgJiBQTkdfRk9STUFUX0ZMQUdfQkdSKSAhPSAwKQotIyAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgKChmICYgMHgxMFUvKkhBQ0s6IGZpeGVkIHZhbHVlKi8pICE9IDApCi0jICAgICAgICBlbmRpZgotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgIC8qIEFGSVJTVCBpcyBtZWFuaW5nbGVzcyBpZiBubyBhbHBoYTogKi8KLSMgICAgICAgIGlmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAotICAgICAgICAgICAgaWYgKChmICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKSA9PSAwICYmCi0gICAgICAgICAgICAgICAoZiAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpICE9IDApCi0jICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAoKGYgJiAweDIwVS8qSEFDSzogZml4ZWQgdmFsdWUqLykgIT0gMCkKLSMgICAgICAgIGVuZGlmCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgZm9ybWF0X3NldChwZiwgZik7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLS8qIFRIRSBJbWFnZSBTVFJVQ1RVUkUgKi8KLS8qIFRoZSBzdXBlci1jbGFzcyBvZiBhIHBuZ19pbWFnZSwgY29udGFpbnMgdGhlIGRlY29kZWQgaW1hZ2UgcGx1cyB0aGUgaW5wdXQKLSAqIGRhdGEgbmVjZXNzYXJ5IHRvIHJlLXJlYWQgdGhlIGZpbGUgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQuCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBwbmdfaW1hZ2UgICBpbWFnZTsKLSAgIHBuZ191aW50XzMyIG9wdHM7Ci0gICBjb25zdCBjaGFyICpmaWxlX25hbWU7Ci0gICBpbnQgICAgICAgICBzdHJpZGVfZXh0cmE7Ci0gICBGSUxFICAgICAgICppbnB1dF9maWxlOwotICAgcG5nX3ZvaWRwICAgaW5wdXRfbWVtb3J5OwotICAgcG5nX3NpemVfdCAgaW5wdXRfbWVtb3J5X3NpemU7Ci0gICBwbmdfYnl0ZXAgICBidWZmZXI7Ci0gICBwdHJkaWZmX3QgICBzdHJpZGU7Ci0gICBwbmdfc2l6ZV90ICBidWZzaXplOwotICAgcG5nX3NpemVfdCAgYWxsb2NzaXplOwotICAgY2hhciAgICAgICAgdG1wZmlsZV9uYW1lWzMyXTsKLSAgIHBuZ191aW50XzE2IGNvbG9ybWFwWzI1Nio0XTsKLX0KLUltYWdlOwotCi0vKiBJbml0aWFsaXplcjogYWxzbyBzZXRzIHRoZSBwZXJtaXR0ZWQgZXJyb3IgbGltaXQgZm9yIDE2LWJpdCBvcGVyYXRpb25zLiAqLwotc3RhdGljIHZvaWQKLW5ld2ltYWdlKEltYWdlICppbWFnZSkKLXsKLSAgIG1lbXNldChpbWFnZSwgMCwgc2l6ZW9mICppbWFnZSk7Ci19Ci0KLS8qIFJlc2V0IHRoZSBpbWFnZSB0byBiZSByZWFkIGFnYWluIC0gb25seSBuZWVkcyB0byByZXdpbmQgdGhlIEZJTEUqIGF0IHByZXNlbnQuCi0gKi8KLXN0YXRpYyB2b2lkCi1yZXNldGltYWdlKEltYWdlICppbWFnZSkKLXsKLSAgIGlmIChpbWFnZS0+aW5wdXRfZmlsZSAhPSBOVUxMKQotICAgICAgcmV3aW5kKGltYWdlLT5pbnB1dF9maWxlKTsKLX0KLQotLyogRnJlZSB0aGUgaW1hZ2UgYnVmZmVyOyB0aGUgYnVmZmVyIGlzIHJlLXVzZWQgb24gYSByZS1yZWFkLCB0aGlzIGlzIGp1c3QgZm9yCi0gKiBjbGVhbnVwLgotICovCi1zdGF0aWMgdm9pZAotZnJlZWJ1ZmZlcihJbWFnZSAqaW1hZ2UpCi17Ci0gICBpZiAoaW1hZ2UtPmJ1ZmZlcikgZnJlZShpbWFnZS0+YnVmZmVyKTsKLSAgIGltYWdlLT5idWZmZXIgPSBOVUxMOwotICAgaW1hZ2UtPmJ1ZnNpemUgPSAwOwotICAgaW1hZ2UtPmFsbG9jc2l6ZSA9IDA7Ci19Ci0KLS8qIERlbGV0ZSBmdW5jdGlvbjsgY2xlYW5zIG91dCBhbGwgdGhlIGFsbG9jYXRlZCBkYXRhIGFuZCB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4KLSAqIHRoZSBpbWFnZS4KLSAqLwotc3RhdGljIHZvaWQKLWZyZWVpbWFnZShJbWFnZSAqaW1hZ2UpCi17Ci0gICBmcmVlYnVmZmVyKGltYWdlKTsKLSAgIHBuZ19pbWFnZV9mcmVlKCZpbWFnZS0+aW1hZ2UpOwotCi0gICBpZiAoaW1hZ2UtPmlucHV0X2ZpbGUgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGZjbG9zZShpbWFnZS0+aW5wdXRfZmlsZSk7Ci0gICAgICBpbWFnZS0+aW5wdXRfZmlsZSA9IE5VTEw7Ci0gICB9Ci0KLSAgIGlmIChpbWFnZS0+aW5wdXRfbWVtb3J5ICE9IE5VTEwpCi0gICB7Ci0gICAgICBmcmVlKGltYWdlLT5pbnB1dF9tZW1vcnkpOwotICAgICAgaW1hZ2UtPmlucHV0X21lbW9yeSA9IE5VTEw7Ci0gICAgICBpbWFnZS0+aW5wdXRfbWVtb3J5X3NpemUgPSAwOwotICAgfQotCi0gICBpZiAoaW1hZ2UtPnRtcGZpbGVfbmFtZVswXSAhPSAwICYmIChpbWFnZS0+b3B0cyAmIEtFRVBfVE1QRklMRVMpID09IDApCi0gICB7Ci0gICAgICAodm9pZClyZW1vdmUoaW1hZ2UtPnRtcGZpbGVfbmFtZSk7Ci0gICAgICBpbWFnZS0+dG1wZmlsZV9uYW1lWzBdID0gMDsKLSAgIH0KLX0KLQotLyogVGhpcyBpcyBhY3R1YWxseSBhIHJlLWluaXRpYWxpemVyOyBhbGxvd3MgYW4gaW1hZ2Ugc3RydWN0dXJlIHRvIGJlIHJlLXVzZWQgYnkKLSAqIGZyZWVpbmcgZXZlcnl0aGluZyB0aGF0IHJlbGF0ZXMgdG8gYW4gb2xkIGltYWdlLgotICovCi1zdGF0aWMgdm9pZCBpbml0aW1hZ2UoSW1hZ2UgKmltYWdlLCBwbmdfdWludF8zMiBvcHRzLCBjb25zdCBjaGFyICpmaWxlX25hbWUsCi0gICBpbnQgc3RyaWRlX2V4dHJhKQotewotICAgZnJlZWltYWdlKGltYWdlKTsKLSAgIG1lbXNldCgmaW1hZ2UtPmltYWdlLCAwLCBzaXplb2YgaW1hZ2UtPmltYWdlKTsKLSAgIGltYWdlLT5vcHRzID0gb3B0czsKLSAgIGltYWdlLT5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0gICBpbWFnZS0+c3RyaWRlX2V4dHJhID0gc3RyaWRlX2V4dHJhOwotfQotCi0vKiBNYWtlIHN1cmUgdGhlIGltYWdlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoOyBhbGxvd3MgcmUtdXNlIG9mIHRoZSBidWZmZXIgaWYgdGhlCi0gKiBpbWFnZSBpcyByZS1yZWFkLgotICovCi0jZGVmaW5lIEJVRkZFUl9JTklUOCA3Mwotc3RhdGljIHZvaWQKLWFsbG9jYnVmZmVyKEltYWdlICppbWFnZSkKLXsKLSAgIHBuZ19zaXplX3Qgc2l6ZSA9IFBOR19JTUFHRV9CVUZGRVJfU0laRShpbWFnZS0+aW1hZ2UsIGltYWdlLT5zdHJpZGUpOwotCi0gICBpZiAoc2l6ZSszMiA+IGltYWdlLT5idWZzaXplKQotICAgewotICAgICAgZnJlZWJ1ZmZlcihpbWFnZSk7Ci0gICAgICBpbWFnZS0+YnVmZmVyID0gdm9pZGNhc3QocG5nX2J5dGVwLCBtYWxsb2Moc2l6ZSszMikpOwotICAgICAgaWYgKGltYWdlLT5idWZmZXIgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAic2ltcGxldGVzdDogb3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICVsdSgrMzIpIGJ5dGUgYnVmZmVyXG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7Ci0gICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgICAgaW1hZ2UtPmJ1ZnNpemUgPSBzaXplKzMyOwotICAgfQotCi0gICBtZW1zZXQoaW1hZ2UtPmJ1ZmZlciwgOTUsIGltYWdlLT5idWZzaXplKTsKLSAgIG1lbXNldChpbWFnZS0+YnVmZmVyKzE2LCBCVUZGRVJfSU5JVDgsIHNpemUpOwotICAgaW1hZ2UtPmFsbG9jc2l6ZSA9IHNpemU7Ci19Ci0KLS8qIE1ha2Ugc3VyZSAxNiBieXRlcyBtYXRjaCB0aGUgZ2l2ZW4gYnl0ZS4gKi8KLXN0YXRpYyBpbnQKLWNoZWNrMTYocG5nX2NvbnN0X2J5dGVwIGJwLCBpbnQgYikKLXsKLSAgIGludCBpID0gMTY7Ci0KLSAgIGRvCi0gICAgICBpZiAoKmJwICE9IGIpIHJldHVybiAxOwotICAgd2hpbGUgKC0taSk7Ci0KLSAgIHJldHVybiAwOwotfQotCi0vKiBDaGVjayBmb3Igb3ZlcndyaXRlIGluIHRoZSBpbWFnZSBidWZmZXIuICovCi1zdGF0aWMgdm9pZAotY2hlY2tidWZmZXIoSW1hZ2UgKmltYWdlLCBjb25zdCBjaGFyICphcmcpCi17Ci0gICBpZiAoY2hlY2sxNihpbWFnZS0+YnVmZmVyLCA5NSkpCi0gICB7Ci0gICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG92ZXJ3cml0ZSBhdCBzdGFydCBvZiBpbWFnZSBidWZmZXJcbiIsIGFyZyk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICBpZiAoY2hlY2sxNihpbWFnZS0+YnVmZmVyKzE2K2ltYWdlLT5hbGxvY3NpemUsIDk1KSkKLSAgIHsKLSAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogb3ZlcndyaXRlIGF0IGVuZCBvZiBpbWFnZSBidWZmZXJcbiIsIGFyZyk7Ci0gICAgICBleGl0KDEpOwotICAgfQotfQotCi0vKiBFUlJPUiBIQU5ETElORyAqLwotLyogTG9nIGEgdGVybWluYWwgZXJyb3IsIGFsc28gZnJlZXMgdGhlIGxpYnBuZyBwYXJ0IG9mIHRoZSBpbWFnZSBpZiBuZWNlc3NhcnkuCi0gKi8KLXN0YXRpYyBpbnQKLWxvZ2Vycm9yKEltYWdlICppbWFnZSwgY29uc3QgY2hhciAqYTEsIGNvbnN0IGNoYXIgKmEyLCBjb25zdCBjaGFyICphMykKLXsKLSAgIGZmbHVzaChzdGRvdXQpOwotICAgaWYgKGltYWdlLT5pbWFnZS53YXJuaW5nX29yX2Vycm9yKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVzJXM6ICVzXG4iLCBhMSwgYTIsIGEzLCBpbWFnZS0+aW1hZ2UubWVzc2FnZSk7Ci0KLSAgIGVsc2UKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMlcyVzXG4iLCBhMSwgYTIsIGEzKTsKLQotICAgaWYgKGltYWdlLT5pbWFnZS5vcGFxdWUgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGltYWdlIG9wYXF1ZSBwb2ludGVyIG5vbi1OVUxMIG9uIGVycm9yXG4iLAotICAgICAgICAgaW1hZ2UtPmZpbGVfbmFtZSk7Ci0gICAgICBwbmdfaW1hZ2VfZnJlZSgmaW1hZ2UtPmltYWdlKTsKLSAgIH0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLS8qIExvZyBhbiBlcnJvciBhbmQgY2xvc2UgYSBmaWxlIChqdXN0IGEgdXRpbGl0eSB0byBkbyBib3RoIHRoaW5ncyBpbiBvbmUKLSAqIGZ1bmN0aW9uIGNhbGwuKQotICovCi1zdGF0aWMgaW50Ci1sb2djbG9zZShJbWFnZSAqaW1hZ2UsIEZJTEUgKmYsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm9wZXJhdGlvbikKLXsKLSAgIGludCBlID0gZXJybm87Ci0KLSAgIGZjbG9zZShmKTsKLSAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgbmFtZSwgb3BlcmF0aW9uLCBzdHJlcnJvcihlKSk7Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgcG5nX2ltYWdlIGhhcyBiZWVuIGZyZWVkIC0gdmFsaWRhdGVzIHRoYXQgbGlicG5nIGlzIGRvaW5nIHdoYXQKLSAqIHRoZSBzcGVjIHNheXMgYW5kIGZyZWVpbmcgdGhlIGltYWdlLgotICovCi1zdGF0aWMgaW50Ci1jaGVja29wYXF1ZShJbWFnZSAqaW1hZ2UpCi17Ci0gICBpZiAoaW1hZ2UtPmltYWdlLm9wYXF1ZSAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2ltYWdlX2ZyZWUoJmltYWdlLT5pbWFnZSk7Ci0gICAgICByZXR1cm4gbG9nZXJyb3IoaW1hZ2UsIGltYWdlLT5maWxlX25hbWUsICI6IG9wYXF1ZSBub3QgTlVMTCIsICIiKTsKLSAgIH0KLQotICAgLyogU2VwYXJhdGUgb3V0IHRoZSBnYW1tYStiYWNrZ3JvdW5kX3JnYl90b19ncmF5IHdhcm5pbmcgYmVjYXVzZSBpdCBtYXkKLSAgICAqIHByb2R1Y2Ugb3BhcXVlIGNvbXBvbmVudCBlcnJvcnM6Ci0gICAgKi8KLSAgIGVsc2UgaWYgKGltYWdlLT5pbWFnZS53YXJuaW5nX29yX2Vycm9yICE9IDAgJiYKLSAgICAgICAgICAgIChzdHJjbXAoaW1hZ2UtPmltYWdlLm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAibGlicG5nIGRvZXMgbm90IHN1cHBvcnQgZ2FtbWErYmFja2dyb3VuZCtyZ2JfdG9fZ3JheSIpID09IDAgPwotICAgICAgICAgICAgICAgICAgKGltYWdlLT5vcHRzICYgR0JHX0VSUk9SKSAhPSAwIDogKGltYWdlLT5vcHRzICYgU1RSSUNUKSAhPSAwKSkKLSAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgaW1hZ2UtPmZpbGVfbmFtZSwgKGltYWdlLT5vcHRzICYgR0JHX0VSUk9SKSAhPSAwID8KLSAgICAgICAgICAgICAgICAgICAgICAiIC0tZmF1bHQtZ2JnLXdhcm5pbmciIDogIiAtLXN0cmljdCIsICIiKTsKLQotICAgZWxzZQotICAgICAgcmV0dXJuIDE7Ci19Ci0KLS8qIElNQUdFIENPTVBBUklTT04vQ0hFQ0tJTkcgKi8KLS8qIENvbXBhcmUgdGhlIHBpeGVscyBvZiB0d28gaW1hZ2VzLCB3aGljaCBzaG91bGQgYmUgdGhlIHNhbWUgYnV0IGFyZW4ndC4gIFRoZQotICogaW1hZ2VzIG11c3QgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIGEgc2l6ZSBtYXRjaC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIC8qIFRoZSBjb21wb25lbnRzLCBmb3IgZ3JheXNjYWxlIGltYWdlcyB0aGUgZ3JheSB2YWx1ZSBpcyBpbiAnZycgYW5kIGlmIGFscGhhCi0gICAgKiBpcyBub3QgcHJlc2VudCAnYScgaXMgc2V0IHRvIDI1NSBvciA2NTUzNSBhY2NvcmRpbmcgdG8gZm9ybWF0LgotICAgICovCi0gICBpbnQgICAgICAgICByLCBnLCBiLCBhOwotfSBQaXhlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIC8qIFRoZSBiYWNrZ3JvdW5kIGFzIHRoZSBvcmlnaW5hbCBzUkdCIDgtYml0IHZhbHVlIGNvbnZlcnRlZCB0byB0aGUgZmluYWwKLSAgICAqIGludGVnZXIgZm9ybWF0IGFuZCBhcyBhIGRvdWJsZSBwcmVjaXNpb24gbGluZWFyIHZhbHVlIGluIHRoZSByYW5nZSAwLi4xCi0gICAgKiBmb3Igd2l0aCBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgcGl4ZWxzLgotICAgICovCi0gICBpbnQgaXIsIGlnLCBpYjsKLSAgIGRvdWJsZSBkciwgZGcsIGRiOyAvKiBsaW5lYXIgcixnLGIgc2NhbGVkIHRvIDAuLjEgKi8KLX0gQmFja2dyb3VuZDsKLQotLyogQmFzaWMgaW1hZ2UgZm9ybWF0czsgY29udHJvbCB0aGUgZGF0YSBidXQgbm90IHRoZSBsYXlvdXQgdGhlcmVvZi4gKi8KLSNkZWZpbmUgQkFTRV9GT1JNQVRTXAotICAgKFBOR19GT1JNQVRfRkxBR19BTFBIQXxQTkdfRk9STUFUX0ZMQUdfQ09MT1J8UE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikKLQotLyogUmVhZCBhIFBpeGVsIGZyb20gYSBidWZmZXIuICBUaGUgY29kZSBiZWxvdyBzdG9yZXMgdGhlIGNvcnJlY3Qgcm91dGluZSBmb3IKLSAqIHRoZSBmb3JtYXQgaW4gYSBmdW5jdGlvbiBwb2ludGVyLCB0aGVzZSBhcmUgdGhlIHJvdXRpbmVzOgotICovCi1zdGF0aWMgdm9pZAotZ3BfZzgoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgcGIpOwotCi0gICBwLT5yID0gcC0+ZyA9IHAtPmIgPSBwcFswXTsKLSAgIHAtPmEgPSAyNTU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ncF9nYTgoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgcGIpOwotCi0gICBwLT5yID0gcC0+ZyA9IHAtPmIgPSBwcFswXTsKLSAgIHAtPmEgPSBwcFsxXTsKLX0KLQotI2lmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLWdwX2FnOChQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQotewotICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBwYik7Ci0KLSAgIHAtPnIgPSBwLT5nID0gcC0+YiA9IHBwWzFdOwotICAgcC0+YSA9IHBwWzBdOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1ncF9yZ2I4KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCi17Ci0gICBwbmdfY29uc3RfYnl0ZXAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIHBiKTsKLQotICAgcC0+ciA9IHBwWzBdOwotICAgcC0+ZyA9IHBwWzFdOwotICAgcC0+YiA9IHBwWzJdOwotICAgcC0+YSA9IDI1NTsKLX0KLQotI2lmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLWdwX2JncjgoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF9ieXRlcCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF9ieXRlcCwgcGIpOwotCi0gICBwLT5yID0gcHBbMl07Ci0gICBwLT5nID0gcHBbMV07Ci0gICBwLT5iID0gcHBbMF07Ci0gICBwLT5hID0gMjU1OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1ncF9yZ2JhOChQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQotewotICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBwYik7Ci0KLSAgIHAtPnIgPSBwcFswXTsKLSAgIHAtPmcgPSBwcFsxXTsKLSAgIHAtPmIgPSBwcFsyXTsKLSAgIHAtPmEgPSBwcFszXTsKLX0KLQotI2lmZGVmIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLWdwX2JncmE4KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCi17Ci0gICBwbmdfY29uc3RfYnl0ZXAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIHBiKTsKLQotICAgcC0+ciA9IHBwWzJdOwotICAgcC0+ZyA9IHBwWzFdOwotICAgcC0+YiA9IHBwWzBdOwotICAgcC0+YSA9IHBwWzNdOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1ncF9hcmdiOChQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQotewotICAgcG5nX2NvbnN0X2J5dGVwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X2J5dGVwLCBwYik7Ci0KLSAgIHAtPnIgPSBwcFsxXTsKLSAgIHAtPmcgPSBwcFsyXTsKLSAgIHAtPmIgPSBwcFszXTsKLSAgIHAtPmEgPSBwcFswXTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVEKQotc3RhdGljIHZvaWQKLWdwX2FiZ3I4KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCi17Ci0gICBwbmdfY29uc3RfYnl0ZXAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfYnl0ZXAsIHBiKTsKLQotICAgcC0+ciA9IHBwWzNdOwotICAgcC0+ZyA9IHBwWzJdOwotICAgcC0+YiA9IHBwWzFdOwotICAgcC0+YSA9IHBwWzBdOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1ncF9nMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOwotCi0gICBwLT5yID0gcC0+ZyA9IHAtPmIgPSBwcFswXTsKLSAgIHAtPmEgPSA2NTUzNTsKLX0KLQotc3RhdGljIHZvaWQKLWdwX2dhMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOwotCi0gICBwLT5yID0gcC0+ZyA9IHAtPmIgPSBwcFswXTsKLSAgIHAtPmEgPSBwcFsxXTsKLX0KLQotI2lmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLWdwX2FnMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOwotCi0gICBwLT5yID0gcC0+ZyA9IHAtPmIgPSBwcFsxXTsKLSAgIHAtPmEgPSBwcFswXTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZ3BfcmdiMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOwotCi0gICBwLT5yID0gcHBbMF07Ci0gICBwLT5nID0gcHBbMV07Ci0gICBwLT5iID0gcHBbMl07Ci0gICBwLT5hID0gNjU1MzU7Ci19Ci0KLSNpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1ncF9iZ3IxNihQaXhlbCAqcCwgcG5nX2NvbnN0X3ZvaWRwIHBiKQotewotICAgcG5nX2NvbnN0X3VpbnRfMTZwIHBwID0gdm9pZGNhc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwYik7Ci0KLSAgIHAtPnIgPSBwcFsyXTsKLSAgIHAtPmcgPSBwcFsxXTsKLSAgIHAtPmIgPSBwcFswXTsKLSAgIHAtPmEgPSA2NTUzNTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZ3BfcmdiYTE2KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCi17Ci0gICBwbmdfY29uc3RfdWludF8xNnAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfdWludF8xNnAsIHBiKTsKLQotICAgcC0+ciA9IHBwWzBdOwotICAgcC0+ZyA9IHBwWzFdOwotICAgcC0+YiA9IHBwWzJdOwotICAgcC0+YSA9IHBwWzNdOwotfQotCi0jaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotZ3BfYmdyYTE2KFBpeGVsICpwLCBwbmdfY29uc3Rfdm9pZHAgcGIpCi17Ci0gICBwbmdfY29uc3RfdWludF8xNnAgcHAgPSB2b2lkY2FzdChwbmdfY29uc3RfdWludF8xNnAsIHBiKTsKLQotICAgcC0+ciA9IHBwWzJdOwotICAgcC0+ZyA9IHBwWzFdOwotICAgcC0+YiA9IHBwWzBdOwotICAgcC0+YSA9IHBwWzNdOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1ncF9hcmdiMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOwotCi0gICBwLT5yID0gcHBbMV07Ci0gICBwLT5nID0gcHBbMl07Ci0gICBwLT5iID0gcHBbM107Ci0gICBwLT5hID0gcHBbMF07Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRCkKLXN0YXRpYyB2b2lkCi1ncF9hYmdyMTYoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIHBuZ19jb25zdF91aW50XzE2cCBwcCA9IHZvaWRjYXN0KHBuZ19jb25zdF91aW50XzE2cCwgcGIpOwotCi0gICBwLT5yID0gcHBbM107Ci0gICBwLT5nID0gcHBbMl07Ci0gICBwLT5iID0gcHBbMV07Ci0gICBwLT5hID0gcHBbMF07Ci19Ci0jZW5kaWYKLQotLyogR2l2ZW4gYSBmb3JtYXQsIHJldHVybiB0aGUgY29ycmVjdCBvbmUgb2YgdGhlIGFib3ZlIGZ1bmN0aW9ucy4gKi8KLXN0YXRpYyB2b2lkICgqCi1nZXRfcGl4ZWwocG5nX3VpbnRfMzIgZm9ybWF0KSkoUGl4ZWwgKnAsIHBuZ19jb25zdF92b2lkcCBwYikKLXsKLSAgIC8qIFRoZSBjb2xvci1tYXAgZmxhZyBpcyBpcnJlbGV2YW50IGhlcmUgLSB0aGUgY2FsbGVyIG9mIHRoZSBmdW5jdGlvbgotICAgICogcmV0dXJuZWQgbXVzdCBlaXRoZXIgcGFzcyB0aGUgYnVmZmVyIG9yLCBmb3IgYSBjb2xvci1tYXBwZWQgaW1hZ2UsIHRoZQotICAgICogY29ycmVjdCBlbnRyeSBpbiB0aGUgY29sb3ItbWFwLgotICAgICovCi0gICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikKLSAgIHsKLSAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpCi0gICAgICB7Ci0jICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQKLSAgICAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQkdSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkKLSAgICAgICAgICAgICAgIHsKLSMgICAgICAgICAgICAgICAgIGlmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfYWJncjE2OwotCi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0jICAgICAgICAgICAgICAgICBlbmRpZgotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwX2JncmExNjsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwX2JncjE2OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0jICAgICAgICBlbmRpZgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkKLSAgICAgICAgICAgIHsKLSMgICAgICAgICAgICAgIGlmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfYXJnYjE2OwotCi0gICAgICAgICAgICAgICAgICBlbHNlCi0jICAgICAgICAgICAgICBlbmRpZgotICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwX3JnYmExNjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgcmV0dXJuIGdwX3JnYjE2OwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQotICAgICAgICAgewotIyAgICAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECi0gICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBncF9hZzE2OwotCi0gICAgICAgICAgICAgICBlbHNlCi0jICAgICAgICAgICBlbmRpZgotICAgICAgICAgICAgICAgcmV0dXJuIGdwX2dhMTY7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBncF9nMTY7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1IpCi0gICAgICB7Ci0jICAgICAgICBpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQKLSAgICAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQkdSKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkKLSAgICAgICAgICAgICAgIHsKLSMgICAgICAgICAgICAgICAgIGlmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfYWJncjg7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSMgICAgICAgICAgICAgICAgIGVuZGlmCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfYmdyYTg7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHJldHVybiBncF9iZ3I4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0jICAgICAgICBlbmRpZgotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkKLSAgICAgICAgICAgIHsKLSMgICAgICAgICAgICAgIGlmZGVmIFBOR19GT1JNQVRfQUZJUlNUX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfYXJnYjg7Ci0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSMgICAgICAgICAgICAgIGVuZGlmCi0gICAgICAgICAgICAgICAgICByZXR1cm4gZ3BfcmdiYTg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHJldHVybiBncF9yZ2I4OwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKQotICAgICAgICAgewotIyAgICAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECi0gICAgICAgICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0FGSVJTVCkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBncF9hZzg7Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSMgICAgICAgICAgIGVuZGlmCi0gICAgICAgICAgICAgICByZXR1cm4gZ3BfZ2E4OwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZ3BfZzg7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLS8qIENvbnZlcnRpb24gYmV0d2VlbiBwaXhlbCBmb3JtYXRzLiAgVGhlIGNvZGUgYWJvdmUgZWZmZWN0aXZlbHkgZWxpbWluYXRlcyB0aGUKLSAqIGNvbXBvbmVudCBvcmRlcmluZyBjaGFuZ2VzIGxlYXZpbmcgdGhyZWUgYmFzaWMgY2hhbmdlczoKLSAqCi0gKiAxKSBSZW1vdmUgYW4gYWxwaGEgY2hhbm5lbCBieSBwcmUtbXVsdGlwbGljYXRpb24gb3IgY29tcG9zaXRpbmcgb24gYQotICogICAgYmFja2dyb3VuZCBjb2xvci4gIChBZGRpbmcgYW4gYWxwaGEgY2hhbm5lbCBpcyBhIG5vLW9wLikKLSAqCi0gKiAyKSBSZW1vdmUgY29sb3IgYnkgbWFwcGluZyB0byBncmF5c2NhbGUuICAoR3JheXNjYWxlIHRvIGNvbG9yIGlzIGEgbm8tb3AuKQotICoKLSAqIDMpIENvbnZlcnQgYmV0d2VlbiA4LWJpdCBhbmQgMTYtYml0IGNvbXBvbmVudHMuICAoQm90aCBkaXJlY3R0aW9ucyBhcmUKLSAqICAgIHJlbGV2YW50LikKLSAqCi0gKiBUaGlzIGdpdmVzIHRoZSBmb2xsb3dpbmcgYmFzZSBmb3JtYXQgY29udmVyc2lvbiBtYXRyaXg6Ci0gKgotICogICBPVVQ6ICAgIC0tLS0tIDgtYml0IC0tLS0tICAgIC0tLS0tIDE2LWJpdCAtLS0tLQotICogICBJTiAgICAgRyAgICBHQSAgIFJHQiAgUkdCQSAgRyAgICBHQSAgIFJHQiAgUkdCQQotICogIDggRyAgICAgLiAgICAuICAgIC4gICAgLiAgICAgbGluICBsaW4gIGxpbiAgbGluCi0gKiAgOCBHQSAgICBiY2tnIC4gICAgYmNrYyAuICAgICBwcmUnIHByZSAgcHJlJyBwcmUKLSAqICA4IFJHQiAgIGc4ICAgZzggICAuICAgIC4gICAgIGdsaW4gZ2xpbiBsaW4gIGxpbgotICogIDggUkdCQSAgZzhiICBnOCAgIGJja2MgLiAgICAgZ3ByJyBncHJlIHByZScgcHJlCi0gKiAxNiBHICAgICBzUkdCIHNSR0Igc1JHQiBzUkdCICAuICAgIC4gICAgLiAgICAuCi0gKiAxNiBHQSAgICBiMTZnIHVucGcgYjE2YyB1bnBjICBBICAgIC4gICAgQSAgICAuCi0gKiAxNiBSR0IgICBzRyAgIHNHICAgc1JHQiBzUkdCICBnMTYgIGcxNiAgLiAgICAuCi0gKiAxNiBSR0JBICBnYjE2IHNHcCAgY2IxNiBzQ3AgICBnMTYgIGcxNicgQSAgICAuCi0gKgotICogIDgtYml0IHRvIDgtYml0OgotICogYmNrZzogY29tcG9zaXRlIG9uIGdyYXkgYmFja2dyb3VuZAotICogYmNrYzogY29tcG9zaXRlIG9uIGNvbG9yIGJhY2tncm91bmQKLSAqIGc4OiAgIGNvbnZlcnQgc1JHQiBjb21wb25lbnRzIHRvIHNSR0IgZ3JheXNjYWxlCi0gKiBnOGI6ICBjb252ZXJ0IHNSR0IgY29tcG9uZW50cyB0byBncmF5c2NhbGUgYW5kIGNvbXBvc2l0ZSBvbiBncmF5IGJhY2tncm91bmQKLSAqCi0gKiAgOC1iaXQgdG8gMTYtYml0OgotICogbGluOiAgbWFrZSBzUkdCIGNvbXBvbmVudHMgbGluZWFyLCBhbHBoYSA6PSA2NTUzNQotICogcHJlOiAgbWFrZSBzUkdCIGNvbXBvbmVudHMgbGluZWFyIGFuZCBwcmVtdWx0aXBseSBieSBhbHBoYSAgKHNjYWxlIGFscGhhKQotICogcHJlJzogYXMgJ3ByZScgYnV0IGFscGhhIDo9IDY1NTM1Ci0gKiBnbGluOiBtYWtlIHNSR0IgY29tcG9uZW50cyBsaW5lYXIsIGNvbnZlcnQgdG8gZ3JheXNjYWxlLCBhbHBoYSA6PSA2NTUzNQotICogZ3ByZTogbWFrZSBzUkdCIGNvbXBvbmVudHMgZ3JheXNjYWxlIGFuZCBsaW5lYXIgYW5kIHByZW11bHRpcGx5IGJ5IGFscGhhCi0gKiBncHInOiBhcyAnZ3ByZScgYnV0IGFscGhhIDo9IDY1NTM1Ci0gKgotICogIDE2LWJpdCB0byA4LWJpdDoKLSAqIHNSR0I6IGNvbnZlcnQgbGluZWFyIGNvbXBvbmVudHMgdG8gc1JHQiwgYWxwaGEgOj0gMjU1Ci0gKiB1bnBnOiB1bnByZW11bHRpcGx5IGdyYXkgY29tcG9uZW50IGFuZCBjb252ZXJ0IHRvIHNSR0IgKHNjYWxlIGFscGhhKQotICogdW5wYzogdW5wcmVtdWx0aXBseSBjb2xvciBjb21wb25lbnRzIGFuZCBjb252ZXJ0IHRvIHNSR0IgKHNjYWxlIGFscGhhKQotICogYjE2ZzogY29tcG9zaXRlIGxpbmVhciBvbnRvIGdyYXkgYmFja2dyb3VuZCBhbmQgY29udmVydCB0aGUgcmVzdWx0IHRvIHNSR0IKLSAqIGIxNmM6IGNvbXBvc2l0ZSBsaW5lYXIgb250byBjb2xvciBiYWNrZ3JvdW5kIGFuZCBjb252ZXJ0IHRoZSByZXN1bHQgdG8gc1JHQgotICogc0c6ICAgY29udmVydCBsaW5lYXIgUkdCIHRvIHNSR0IgZ3JheXNjYWxlCi0gKiBzR3A6ICB1bnByZW11bHRpcGx5IFJHQiB0aGVuIGNvbnZlcnQgdG8gc1JHQiBncmF5c2NhbGUKLSAqIHNDcDogIHVucHJlbXVsdGlwbHkgUkdCIHRoZW4gY29udmVydCB0byBzUkdCCi0gKiBnYjE2OiBjb21wb3NpdGUgbGluZWFyIG9udG8gYmFja2dyb3VuZCBhbmQgY29udmVydCB0byBzUkdCIGdyYXlzY2FsZQotICogICAgICAgKG9yZGVyIGRvZXNuJ3QgbWF0dGVyLCB0aGUgY29tcG9zaXRlIGFuZCBncmF5c2NhbGUgb3BlcmF0aW9ucyBwZXJtdXRlKQotICogY2IxNjogY29tcG9zaXRlIGxpbmVhciBvbnRvIGJhY2tncm91bmQgYW5kIGNvbnZlcnQgdG8gc1JHQgotICoKLSAqICAxNi1iaXQgdG8gMTYtYml0OgotICogQTogICAgc2V0IGFscGhhIHRvIDY1NTM1Ci0gKiBnMTY6ICBjb252ZXJ0IGxpbmVhciBSR0IgdG8gbGluZWFyIGdyYXlzY2FsZSAoYWxwaGEgOj0gNjU1MzUpCi0gKiBnMTYnOiBhcyAnZzE2JyBidXQgYWxwaGEgaXMgdW5jaGFuZ2VkCi0gKi8KLS8qIFNpbXBsZSBjb3B5OiAqLwotc3RhdGljIHZvaWQKLWdwY19ub29wKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0gICBvdXQtPnIgPSBpbi0+cjsKLSAgIG91dC0+ZyA9IGluLT5nOwotICAgb3V0LT5iID0gaW4tPmI7Ci0gICBvdXQtPmEgPSBpbi0+YTsKLX0KLQotI2lmIEFMTE9XX1VOVVNFRF9HUEMKLXN0YXRpYyB2b2lkCi1ncGNfbm9wOChQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICAodm9pZCliYWNrOwotICAgaWYgKGluLT5hID09IDApCi0gICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSAyNTU7Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIG91dC0+ciA9IGluLT5yOwotICAgICAgb3V0LT5nID0gaW4tPmc7Ci0gICAgICBvdXQtPmIgPSBpbi0+YjsKLSAgIH0KLQotICAgb3V0LT5hID0gaW4tPmE7Ci19Ci0jZW5kaWYKLQotI2lmIEFMTE9XX1VOVVNFRF9HUEMKLXN0YXRpYyB2b2lkCi1ncGNfbm9wNihQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICAodm9pZCliYWNrOwotICAgaWYgKGluLT5hID09IDApCi0gICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSA2NTUzNTsKLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5yID0gaW4tPnI7Ci0gICAgICBvdXQtPmcgPSBpbi0+ZzsKLSAgICAgIG91dC0+YiA9IGluLT5iOwotICAgfQotCi0gICBvdXQtPmEgPSBpbi0+YTsKLX0KLSNlbmRpZgotCi0vKiA4LWJpdCB0byA4LWJpdCBjb252ZXJzaW9ucyAqLwotLyogYmNrZzogY29tcG9zaXRlIG9uIGdyYXkgYmFja2dyb3VuZCAqLwotc3RhdGljIHZvaWQKLWdwY19iY2tnKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgIGlmIChpbi0+YSA8PSAwKQotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gYmFjay0+aWc7Ci0KLSAgIGVsc2UgaWYgKGluLT5hID49IDI1NSkKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGluLT5nOwotCi0gICBlbHNlCi0gICB7Ci0gICAgICBkb3VibGUgYSA9IGluLT5hIC8gMjU1LjsKLQotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gc1JHQihzUkdCX3RvX2RbaW4tPmddICogYSArIGJhY2stPmRnICogKDEtYSkpOwotICAgfQotCi0gICBvdXQtPmEgPSAyNTU7Ci19Ci0KLS8qIGJja2M6IGNvbXBvc2l0ZSBvbiBjb2xvciBiYWNrZ3JvdW5kICovCi1zdGF0aWMgdm9pZAotZ3BjX2Jja2MoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgaWYgKGluLT5hIDw9IDApCi0gICB7Ci0gICAgICBvdXQtPnIgPSBiYWNrLT5pcjsKLSAgICAgIG91dC0+ZyA9IGJhY2stPmlnOwotICAgICAgb3V0LT5iID0gYmFjay0+aWI7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKGluLT5hID49IDI1NSkKLSAgIHsKLSAgICAgIG91dC0+ciA9IGluLT5yOwotICAgICAgb3V0LT5nID0gaW4tPmc7Ci0gICAgICBvdXQtPmIgPSBpbi0+YjsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgZG91YmxlIGEgPSBpbi0+YSAvIDI1NS47Ci0KLSAgICAgIG91dC0+ciA9IHNSR0Ioc1JHQl90b19kW2luLT5yXSAqIGEgKyBiYWNrLT5kciAqICgxLWEpKTsKLSAgICAgIG91dC0+ZyA9IHNSR0Ioc1JHQl90b19kW2luLT5nXSAqIGEgKyBiYWNrLT5kZyAqICgxLWEpKTsKLSAgICAgIG91dC0+YiA9IHNSR0Ioc1JHQl90b19kW2luLT5iXSAqIGEgKyBiYWNrLT5kYiAqICgxLWEpKTsKLSAgIH0KLQotICAgb3V0LT5hID0gMjU1OwotfQotCi0vKiBnODogY29udmVydCBzUkdCIGNvbXBvbmVudHMgdG8gc1JHQiBncmF5c2NhbGUgKi8KLXN0YXRpYyB2b2lkCi1ncGNfZzgoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgaWYgKGluLT5yID09IGluLT5nICYmIGluLT5nID09IGluLT5iKQotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaW4tPmc7Ci0KLSAgIGVsc2UKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9Ci0gICAgICAgICBzUkdCKFlmcm9tUkdCKHNSR0JfdG9fZFtpbi0+cl0sIHNSR0JfdG9fZFtpbi0+Z10sIHNSR0JfdG9fZFtpbi0+Yl0pKTsKLQotICAgb3V0LT5hID0gaW4tPmE7Ci19Ci0KLS8qIGc4YjogY29udmVydCBzUkdCIGNvbXBvbmVudHMgdG8gZ3JheXNjYWxlIGFuZCBjb21wb3NpdGUgb24gZ3JheSBiYWNrZ3JvdW5kICovCi1zdGF0aWMgdm9pZAotZ3BjX2c4YihQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICBpZiAoaW4tPmEgPD0gMCkKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGJhY2stPmlnOwotCi0gICBlbHNlIGlmIChpbi0+YSA+PSAyNTUpCi0gICB7Ci0gICAgICBpZiAoaW4tPnIgPT0gaW4tPmcgJiYgaW4tPmcgPT0gaW4tPmIpCi0gICAgICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBpbi0+ZzsKLQotICAgICAgZWxzZQotICAgICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gc1JHQihZZnJvbVJHQigKLSAgICAgICAgICAgIHNSR0JfdG9fZFtpbi0+cl0sIHNSR0JfdG9fZFtpbi0+Z10sIHNSR0JfdG9fZFtpbi0+Yl0pKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgZG91YmxlIGEgPSBpbi0+YS8yNTUuOwotCi0gICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBzUkdCKGEgKiBZZnJvbVJHQihzUkdCX3RvX2RbaW4tPnJdLAotICAgICAgICAgc1JHQl90b19kW2luLT5nXSwgc1JHQl90b19kW2luLT5iXSkgKyBiYWNrLT5kZyAqICgxLWEpKTsKLSAgIH0KLQotICAgb3V0LT5hID0gMjU1OwotfQotCi0vKiA4LWJpdCB0byAxNi1iaXQgY29udmVyc2lvbnMgKi8KLS8qIGxpbjogbWFrZSBzUkdCIGNvbXBvbmVudHMgbGluZWFyLCBhbHBoYSA6PSA2NTUzNSAqLwotc3RhdGljIHZvaWQKLWdwY19saW4oUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgb3V0LT5yID0gaWxpbmVhcihpbi0+cik7Ci0KLSAgIGlmIChpbi0+ZyA9PSBpbi0+cikKLSAgIHsKLSAgICAgIG91dC0+ZyA9IG91dC0+cjsKLQotICAgICAgaWYgKGluLT5iID09IGluLT5yKQotICAgICAgICAgb3V0LT5iID0gb3V0LT5yOwotCi0gICAgICBlbHNlCi0gICAgICAgICBvdXQtPmIgPSBpbGluZWFyKGluLT5iKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5nID0gaWxpbmVhcihpbi0+Zyk7Ci0KLSAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKLSAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKLQotICAgICAgZWxzZSBpZiAoaW4tPmIgPT0gaW4tPmcpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPmc7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG91dC0+YiA9IGlsaW5lYXIoaW4tPmIpOwotICAgfQotCi0gICBvdXQtPmEgPSA2NTUzNTsKLX0KLQotLyogcHJlOiBtYWtlIHNSR0IgY29tcG9uZW50cyBsaW5lYXIgYW5kIHByZW11bHRpcGx5IGJ5IGFscGhhIChzY2FsZSBhbHBoYSkgKi8KLXN0YXRpYyB2b2lkCi1ncGNfcHJlKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIG91dC0+ciA9IGlsaW5lYXJhKGluLT5yLCBpbi0+YSk7Ci0KLSAgIGlmIChpbi0+ZyA9PSBpbi0+cikKLSAgIHsKLSAgICAgIG91dC0+ZyA9IG91dC0+cjsKLQotICAgICAgaWYgKGluLT5iID09IGluLT5yKQotICAgICAgICAgb3V0LT5iID0gb3V0LT5yOwotCi0gICAgICBlbHNlCi0gICAgICAgICBvdXQtPmIgPSBpbGluZWFyYShpbi0+YiwgaW4tPmEpOwotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICBvdXQtPmcgPSBpbGluZWFyYShpbi0+ZywgaW4tPmEpOwotCi0gICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPnI7Ci0KLSAgICAgIGVsc2UgaWYgKGluLT5iID09IGluLT5nKQotICAgICAgICAgb3V0LT5iID0gb3V0LT5nOwotCi0gICAgICBlbHNlCi0gICAgICAgICBvdXQtPmIgPSBpbGluZWFyYShpbi0+YiwgaW4tPmEpOwotICAgfQotCi0gICBvdXQtPmEgPSBpbi0+YSAqIDI1NzsKLX0KLQotLyogcHJlJzogYXMgJ3ByZScgYnV0IGFscGhhIDo9IDY1NTM1ICovCi1zdGF0aWMgdm9pZAotZ3BjX3ByZXEoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgb3V0LT5yID0gaWxpbmVhcmEoaW4tPnIsIGluLT5hKTsKLQotICAgaWYgKGluLT5nID09IGluLT5yKQotICAgewotICAgICAgb3V0LT5nID0gb3V0LT5yOwotCi0gICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPnI7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhKGluLT5iLCBpbi0+YSk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIG91dC0+ZyA9IGlsaW5lYXJhKGluLT5nLCBpbi0+YSk7Ci0KLSAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKLSAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKLQotICAgICAgZWxzZSBpZiAoaW4tPmIgPT0gaW4tPmcpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPmc7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhKGluLT5iLCBpbi0+YSk7Ci0gICB9Ci0KLSAgIG91dC0+YSA9IDY1NTM1OwotfQotCi0vKiBnbGluOiBtYWtlIHNSR0IgY29tcG9uZW50cyBsaW5lYXIsIGNvbnZlcnQgdG8gZ3JheXNjYWxlLCBhbHBoYSA6PSA2NTUzNSAqLwotc3RhdGljIHZvaWQKLWdwY19nbGluKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIGlmIChpbi0+ciA9PSBpbi0+ZyAmJiBpbi0+ZyA9PSBpbi0+YikKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGlsaW5lYXIoaW4tPmcpOwotCi0gICBlbHNlCi0gICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSB1MTZkKDY1NTM1ICoKLSAgICAgICAgIFlmcm9tUkdCKHNSR0JfdG9fZFtpbi0+cl0sIHNSR0JfdG9fZFtpbi0+Z10sIHNSR0JfdG9fZFtpbi0+Yl0pKTsKLQotICAgb3V0LT5hID0gNjU1MzU7Ci19Ci0KLS8qIGdwcmU6IG1ha2Ugc1JHQiBjb21wb25lbnRzIGdyYXlzY2FsZSBhbmQgbGluZWFyIGFuZCBwcmVtdWx0aXBseSBieSBhbHBoYSAqLwotc3RhdGljIHZvaWQKLWdwY19ncHJlKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIGlmIChpbi0+ciA9PSBpbi0+ZyAmJiBpbi0+ZyA9PSBpbi0+YikKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGlsaW5lYXJhKGluLT5nLCBpbi0+YSk7Ci0KLSAgIGVsc2UKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHUxNmQoaW4tPmEgKiAyNTcgKgotICAgICAgICAgWWZyb21SR0Ioc1JHQl90b19kW2luLT5yXSwgc1JHQl90b19kW2luLT5nXSwgc1JHQl90b19kW2luLT5iXSkpOwotCi0gICBvdXQtPmEgPSAyNTcgKiBpbi0+YTsKLX0KLQotLyogZ3ByJzogYXMgJ2dwcmUnIGJ1dCBhbHBoYSA6PSA2NTUzNSAqLwotc3RhdGljIHZvaWQKLWdwY19ncHJxKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIGlmIChpbi0+ciA9PSBpbi0+ZyAmJiBpbi0+ZyA9PSBpbi0+YikKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGlsaW5lYXJhKGluLT5nLCBpbi0+YSk7Ci0KLSAgIGVsc2UKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHUxNmQoaW4tPmEgKiAyNTcgKgotICAgICAgICAgWWZyb21SR0Ioc1JHQl90b19kW2luLT5yXSwgc1JHQl90b19kW2luLT5nXSwgc1JHQl90b19kW2luLT5iXSkpOwotCi0gICBvdXQtPmEgPSA2NTUzNTsKLX0KLQotLyogOC1iaXQgdG8gMTYtYml0IGNvbnZlcnNpb25zIGZvciBnQU1BIDQ1NDU1IGVuY29kZWQgdmFsdWVzICovCi0vKiBMaW46IG1ha2UgZ0FNQSA0NTQ1NSBjb21wb25lbnRzIGxpbmVhciwgYWxwaGEgOj0gNjU1MzUgKi8KLXN0YXRpYyB2b2lkCi1ncGNfTGluKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIG91dC0+ciA9IGlsaW5lYXJfZzIyKGluLT5yKTsKLQotICAgaWYgKGluLT5nID09IGluLT5yKQotICAgewotICAgICAgb3V0LT5nID0gb3V0LT5yOwotCi0gICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPnI7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJfZzIyKGluLT5iKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5nID0gaWxpbmVhcl9nMjIoaW4tPmcpOwotCi0gICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPnI7Ci0KLSAgICAgIGVsc2UgaWYgKGluLT5iID09IGluLT5nKQotICAgICAgICAgb3V0LT5iID0gb3V0LT5nOwotCi0gICAgICBlbHNlCi0gICAgICAgICBvdXQtPmIgPSBpbGluZWFyX2cyMihpbi0+Yik7Ci0gICB9Ci0KLSAgIG91dC0+YSA9IDY1NTM1OwotfQotCi0jaWYgQUxMT1dfVU5VU0VEX0dQQwotLyogUHJlOiBtYWtlIGdBTUEgNDU0NTUgY29tcG9uZW50cyBsaW5lYXIgYW5kIHByZW11bHRpcGx5IGJ5IGFscGhhIChzY2FsZSBhbHBoYSkKLSAqLwotc3RhdGljIHZvaWQKLWdwY19QcmUoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgb3V0LT5yID0gaWxpbmVhcmFfZzIyKGluLT5yLCBpbi0+YSk7Ci0KLSAgIGlmIChpbi0+ZyA9PSBpbi0+cikKLSAgIHsKLSAgICAgIG91dC0+ZyA9IG91dC0+cjsKLQotICAgICAgaWYgKGluLT5iID09IGluLT5yKQotICAgICAgICAgb3V0LT5iID0gb3V0LT5yOwotCi0gICAgICBlbHNlCi0gICAgICAgICBvdXQtPmIgPSBpbGluZWFyYV9nMjIoaW4tPmIsIGluLT5hKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5nID0gaWxpbmVhcmFfZzIyKGluLT5nLCBpbi0+YSk7Ci0KLSAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKLSAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKLQotICAgICAgZWxzZSBpZiAoaW4tPmIgPT0gaW4tPmcpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPmc7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhX2cyMihpbi0+YiwgaW4tPmEpOwotICAgfQotCi0gICBvdXQtPmEgPSBpbi0+YSAqIDI1NzsKLX0KLSNlbmRpZgotCi0jaWYgQUxMT1dfVU5VU0VEX0dQQwotLyogUHJlJzogYXMgJ1ByZScgYnV0IGFscGhhIDo9IDY1NTM1ICovCi1zdGF0aWMgdm9pZAotZ3BjX1ByZXEoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgb3V0LT5yID0gaWxpbmVhcmFfZzIyKGluLT5yLCBpbi0+YSk7Ci0KLSAgIGlmIChpbi0+ZyA9PSBpbi0+cikKLSAgIHsKLSAgICAgIG91dC0+ZyA9IG91dC0+cjsKLQotICAgICAgaWYgKGluLT5iID09IGluLT5yKQotICAgICAgICAgb3V0LT5iID0gb3V0LT5yOwotCi0gICAgICBlbHNlCi0gICAgICAgICBvdXQtPmIgPSBpbGluZWFyYV9nMjIoaW4tPmIsIGluLT5hKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5nID0gaWxpbmVhcmFfZzIyKGluLT5nLCBpbi0+YSk7Ci0KLSAgICAgIGlmIChpbi0+YiA9PSBpbi0+cikKLSAgICAgICAgIG91dC0+YiA9IG91dC0+cjsKLQotICAgICAgZWxzZSBpZiAoaW4tPmIgPT0gaW4tPmcpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPmc7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG91dC0+YiA9IGlsaW5lYXJhX2cyMihpbi0+YiwgaW4tPmEpOwotICAgfQotCi0gICBvdXQtPmEgPSA2NTUzNTsKLX0KLSNlbmRpZgotCi0jaWYgQUxMT1dfVU5VU0VEX0dQQwotLyogR2xpbjogbWFrZSBnQU1BIDQ1NDU1IGNvbXBvbmVudHMgbGluZWFyLCBjb252ZXJ0IHRvIGdyYXlzY2FsZSwgYWxwaGEgOj0gNjU1MzUKLSAqLwotc3RhdGljIHZvaWQKLWdwY19HbGluKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIGlmIChpbi0+ciA9PSBpbi0+ZyAmJiBpbi0+ZyA9PSBpbi0+YikKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGlsaW5lYXJfZzIyKGluLT5nKTsKLQotICAgZWxzZQotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gdTE2ZCg2NTUzNSAqCi0gICAgICAgICBZZnJvbVJHQihnMjJfdG9fZFtpbi0+cl0sIGcyMl90b19kW2luLT5nXSwgZzIyX3RvX2RbaW4tPmJdKSk7Ci0KLSAgIG91dC0+YSA9IDY1NTM1OwotfQotI2VuZGlmCi0KLSNpZiBBTExPV19VTlVTRURfR1BDCi0vKiBHcHJlOiBtYWtlIGdBTUEgNDU0NTUgY29tcG9uZW50cyBncmF5c2NhbGUgYW5kIGxpbmVhciBhbmQgcHJlbXVsdGlwbHkgYnkKLSAqIGFscGhhLgotICovCi1zdGF0aWMgdm9pZAotZ3BjX0dwcmUoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgaWYgKGluLT5yID09IGluLT5nICYmIGluLT5nID09IGluLT5iKQotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gaWxpbmVhcmFfZzIyKGluLT5nLCBpbi0+YSk7Ci0KLSAgIGVsc2UKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHUxNmQoaW4tPmEgKiAyNTcgKgotICAgICAgICAgWWZyb21SR0IoZzIyX3RvX2RbaW4tPnJdLCBnMjJfdG9fZFtpbi0+Z10sIGcyMl90b19kW2luLT5iXSkpOwotCi0gICBvdXQtPmEgPSAyNTcgKiBpbi0+YTsKLX0KLSNlbmRpZgotCi0jaWYgQUxMT1dfVU5VU0VEX0dQQwotLyogR3ByJzogYXMgJ0dwcmUnIGJ1dCBhbHBoYSA6PSA2NTUzNSAqLwotc3RhdGljIHZvaWQKLWdwY19HcHJxKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIGlmIChpbi0+ciA9PSBpbi0+ZyAmJiBpbi0+ZyA9PSBpbi0+YikKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGlsaW5lYXJhX2cyMihpbi0+ZywgaW4tPmEpOwotCi0gICBlbHNlCi0gICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSB1MTZkKGluLT5hICogMjU3ICoKLSAgICAgICAgIFlmcm9tUkdCKGcyMl90b19kW2luLT5yXSwgZzIyX3RvX2RbaW4tPmddLCBnMjJfdG9fZFtpbi0+Yl0pKTsKLQotICAgb3V0LT5hID0gNjU1MzU7Ci19Ci0jZW5kaWYKLQotLyogMTYtYml0IHRvIDgtYml0IGNvbnZlcnNpb25zICovCi0vKiBzUkdCOiBjb252ZXJ0IGxpbmVhciBjb21wb25lbnRzIHRvIHNSR0IsIGFscGhhIDo9IDI1NSAqLwotc3RhdGljIHZvaWQKLWdwY19zUkdCKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0KLSAgIG91dC0+ciA9IGlzUkdCKGluLT5yKTsKLQotICAgaWYgKGluLT5nID09IGluLT5yKQotICAgewotICAgICAgb3V0LT5nID0gb3V0LT5yOwotCi0gICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPnI7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG91dC0+YiA9IGlzUkdCKGluLT5iKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5nID0gaXNSR0IoaW4tPmcpOwotCi0gICAgICBpZiAoaW4tPmIgPT0gaW4tPnIpCi0gICAgICAgICBvdXQtPmIgPSBvdXQtPnI7Ci0KLSAgICAgIGVsc2UgaWYgKGluLT5iID09IGluLT5nKQotICAgICAgICAgb3V0LT5iID0gb3V0LT5nOwotCi0gICAgICBlbHNlCi0gICAgICAgICBvdXQtPmIgPSBpc1JHQihpbi0+Yik7Ci0gICB9Ci0KLSAgIG91dC0+YSA9IDI1NTsKLX0KLQotLyogdW5wZzogdW5wcmVtdWx0aXBseSBncmF5IGNvbXBvbmVudCBhbmQgY29udmVydCB0byBzUkdCIChzY2FsZSBhbHBoYSkgKi8KLXN0YXRpYyB2b2lkCi1ncGNfdW5wZyhQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICAodm9pZCliYWNrOwotCi0gICBpZiAoaW4tPmEgPD0gMTI4KQotICAgewotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gMjU1OwotICAgICAgb3V0LT5hID0gMDsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gc1JHQigoZG91YmxlKWluLT5nIC8gaW4tPmEpOwotICAgICAgb3V0LT5hID0gdThkKGluLT5hIC8gMjU3Lik7Ci0gICB9Ci19Ci0KLS8qIHVucGM6IHVucHJlbXVsdGlwbHkgY29sb3IgY29tcG9uZW50cyBhbmQgY29udmVydCB0byBzUkdCIChzY2FsZSBhbHBoYSkgKi8KLXN0YXRpYyB2b2lkCi1ncGNfdW5wYyhQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICAodm9pZCliYWNrOwotCi0gICBpZiAoaW4tPmEgPD0gMTI4KQotICAgewotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gMjU1OwotICAgICAgb3V0LT5hID0gMDsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5yID0gc1JHQigoZG91YmxlKWluLT5yIC8gaW4tPmEpOwotICAgICAgb3V0LT5nID0gc1JHQigoZG91YmxlKWluLT5nIC8gaW4tPmEpOwotICAgICAgb3V0LT5iID0gc1JHQigoZG91YmxlKWluLT5iIC8gaW4tPmEpOwotICAgICAgb3V0LT5hID0gdThkKGluLT5hIC8gMjU3Lik7Ci0gICB9Ci19Ci0KLS8qIGIxNmc6IGNvbXBvc2l0ZSBsaW5lYXIgb250byBncmF5IGJhY2tncm91bmQgYW5kIGNvbnZlcnQgdGhlIHJlc3VsdCB0byBzUkdCICovCi1zdGF0aWMgdm9pZAotZ3BjX2IxNmcoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgaWYgKGluLT5hIDw9IDApCi0gICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBiYWNrLT5pZzsKLQotICAgZWxzZQotICAgewotICAgICAgZG91YmxlIGEgPSBpbi0+YS82NTUzNS47Ci0gICAgICBkb3VibGUgYTEgPSAxLWE7Ci0KLSAgICAgIGEgLz0gNjU1MzU7Ci0gICAgICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSBzUkdCKGluLT5nICogYSArIGJhY2stPmRnICogYTEpOwotICAgfQotCi0gICBvdXQtPmEgPSAyNTU7Ci19Ci0KLS8qIGIxNmM6IGNvbXBvc2l0ZSBsaW5lYXIgb250byBjb2xvciBiYWNrZ3JvdW5kIGFuZCBjb252ZXJ0IHRoZSByZXN1bHQgdG8gc1JHQiovCi1zdGF0aWMgdm9pZAotZ3BjX2IxNmMoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgaWYgKGluLT5hIDw9IDApCi0gICB7Ci0gICAgICBvdXQtPnIgPSBiYWNrLT5pcjsKLSAgICAgIG91dC0+ZyA9IGJhY2stPmlnOwotICAgICAgb3V0LT5iID0gYmFjay0+aWI7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGRvdWJsZSBhID0gaW4tPmEvNjU1MzUuOwotICAgICAgZG91YmxlIGExID0gMS1hOwotCi0gICAgICBhIC89IDY1NTM1OwotICAgICAgb3V0LT5yID0gc1JHQihpbi0+ciAqIGEgKyBiYWNrLT5kciAqIGExKTsKLSAgICAgIG91dC0+ZyA9IHNSR0IoaW4tPmcgKiBhICsgYmFjay0+ZGcgKiBhMSk7Ci0gICAgICBvdXQtPmIgPSBzUkdCKGluLT5iICogYSArIGJhY2stPmRiICogYTEpOwotICAgfQotCi0gICBvdXQtPmEgPSAyNTU7Ci19Ci0KLS8qIHNHOiBjb252ZXJ0IGxpbmVhciBSR0IgdG8gc1JHQiBncmF5c2NhbGUgKi8KLXN0YXRpYyB2b2lkCi1ncGNfc0coUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gc1JHQihZZnJvbVJHQmludChpbi0+ciwgaW4tPmcsIGluLT5iKS82NTUzNSk7Ci0gICBvdXQtPmEgPSAyNTU7Ci19Ci0KLS8qIHNHcDogdW5wcmVtdWx0aXBseSBSR0IgdGhlbiBjb252ZXJ0IHRvIHNSR0IgZ3JheXNjYWxlICovCi1zdGF0aWMgdm9pZAotZ3BjX3NHcChQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICAodm9pZCliYWNrOwotCi0gICBpZiAoaW4tPmEgPD0gMTI4KQotICAgewotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gMjU1OwotICAgICAgb3V0LT5hID0gMDsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgb3V0LT5yID0gb3V0LT5nID0gb3V0LT5iID0gc1JHQihZZnJvbVJHQmludChpbi0+ciwgaW4tPmcsIGluLT5iKS9pbi0+YSk7Ci0gICAgICBvdXQtPmEgPSB1OGQoaW4tPmEgLyAyNTcuKTsKLSAgIH0KLX0KLQotLyogc0NwOiB1bnByZW11bHRpcGx5IFJHQiB0aGVuIGNvbnZlcnQgdG8gc1JHQiAqLwotc3RhdGljIHZvaWQKLWdwY19zQ3AoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLQotICAgaWYgKGluLT5hIDw9IDEyOCkKLSAgIHsKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IDI1NTsKLSAgICAgIG91dC0+YSA9IDA7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIG91dC0+ciA9IHNSR0IoKGRvdWJsZSlpbi0+ciAvIGluLT5hKTsKLSAgICAgIG91dC0+ZyA9IHNSR0IoKGRvdWJsZSlpbi0+ZyAvIGluLT5hKTsKLSAgICAgIG91dC0+YiA9IHNSR0IoKGRvdWJsZSlpbi0+YiAvIGluLT5hKTsKLSAgICAgIG91dC0+YSA9IHU4ZChpbi0+YSAvIDI1Ny4pOwotICAgfQotfQotCi0vKiBnYjE2OiBjb21wb3NpdGUgbGluZWFyIG9udG8gYmFja2dyb3VuZCBhbmQgY29udmVydCB0byBzUkdCIGdyYXlzY2FsZSAqLwotLyogIChvcmRlciBkb2Vzbid0IG1hdHRlciwgdGhlIGNvbXBvc2l0ZSBhbmQgZ3JheXNjYWxlIG9wZXJhdGlvbnMgcGVybXV0ZSkgKi8KLXN0YXRpYyB2b2lkCi1ncGNfZ2IxNihQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICBpZiAoaW4tPmEgPD0gMCkKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGJhY2stPmlnOwotCi0gICBlbHNlIGlmIChpbi0+YSA+PSA2NTUzNSkKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IGlzUkdCKGluLT5nKTsKLQotICAgZWxzZQotICAgewotICAgICAgZG91YmxlIGEgPSBpbi0+YSAvIDY1NTM1LjsKLSAgICAgIGRvdWJsZSBhMSA9IDEtYTsKLQotICAgICAgYSAvPSA2NTUzNTsKLSAgICAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHNSR0IoaW4tPmcgKiBhICsgYmFjay0+ZGcgKiBhMSk7Ci0gICB9Ci0KLSAgIG91dC0+YSA9IDI1NTsKLX0KLQotLyogY2IxNjogY29tcG9zaXRlIGxpbmVhciBvbnRvIGJhY2tncm91bmQgYW5kIGNvbnZlcnQgdG8gc1JHQiAqLwotc3RhdGljIHZvaWQKLWdwY19jYjE2KFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgIGlmIChpbi0+YSA8PSAwKQotICAgewotICAgICAgb3V0LT5yID0gYmFjay0+aXI7Ci0gICAgICBvdXQtPmcgPSBiYWNrLT5pZzsKLSAgICAgIG91dC0+YiA9IGJhY2stPmliOwotICAgfQotCi0gICBlbHNlIGlmIChpbi0+YSA+PSA2NTUzNSkKLSAgIHsKLSAgICAgIG91dC0+ciA9IGlzUkdCKGluLT5yKTsKLSAgICAgIG91dC0+ZyA9IGlzUkdCKGluLT5nKTsKLSAgICAgIG91dC0+YiA9IGlzUkdCKGluLT5iKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgZG91YmxlIGEgPSBpbi0+YSAvIDY1NTM1LjsKLSAgICAgIGRvdWJsZSBhMSA9IDEtYTsKLQotICAgICAgYSAvPSA2NTUzNTsKLSAgICAgIG91dC0+ciA9IHNSR0IoaW4tPnIgKiBhICsgYmFjay0+ZHIgKiBhMSk7Ci0gICAgICBvdXQtPmcgPSBzUkdCKGluLT5nICogYSArIGJhY2stPmRnICogYTEpOwotICAgICAgb3V0LT5iID0gc1JHQihpbi0+YiAqIGEgKyBiYWNrLT5kYiAqIGExKTsKLSAgIH0KLQotICAgb3V0LT5hID0gMjU1OwotfQotCi0vKiAxNi1iaXQgdG8gMTYtYml0IGNvbnZlcnNpb25zICovCi0vKiBBOiAgICBzZXQgYWxwaGEgdG8gNjU1MzUgKi8KLXN0YXRpYyB2b2lkCi1ncGNfQShQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spCi17Ci0gICAodm9pZCliYWNrOwotICAgb3V0LT5yID0gaW4tPnI7Ci0gICBvdXQtPmcgPSBpbi0+ZzsKLSAgIG91dC0+YiA9IGluLT5iOwotICAgb3V0LT5hID0gNjU1MzU7Ci19Ci0KLS8qIGcxNjogIGNvbnZlcnQgbGluZWFyIFJHQiB0byBsaW5lYXIgZ3JheXNjYWxlIChhbHBoYSA6PSA2NTUzNSkgKi8KLXN0YXRpYyB2b2lkCi1ncGNfZzE2KFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykKLXsKLSAgICh2b2lkKWJhY2s7Ci0gICBvdXQtPnIgPSBvdXQtPmcgPSBvdXQtPmIgPSB1MTZkKFlmcm9tUkdCaW50KGluLT5yLCBpbi0+ZywgaW4tPmIpKTsKLSAgIG91dC0+YSA9IDY1NTM1OwotfQotCi0vKiBnMTYnOiBhcyAnZzE2JyBidXQgYWxwaGEgaXMgdW5jaGFuZ2VkICovCi1zdGF0aWMgdm9pZAotZ3BjX2cxNnEoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKQotewotICAgKHZvaWQpYmFjazsKLSAgIG91dC0+ciA9IG91dC0+ZyA9IG91dC0+YiA9IHUxNmQoWWZyb21SR0JpbnQoaW4tPnIsIGluLT5nLCBpbi0+YikpOwotICAgb3V0LT5hID0gaW4tPmE7Ci19Ci0KLSNpZiBBTExPV19VTlVTRURfR1BDCi0vKiBVbnVzZWQgZnVuY3Rpb25zICh0byBoaWRlIHRoZW0gZnJvbSBHQ0MgdW51c2VkIGZ1bmN0aW9uIHdhcm5pbmdzKSAqLwotdm9pZCAoKiBjb25zdCBncGNfdW51c2VkW10pCi0gICAoUGl4ZWwgKm91dCwgY29uc3QgUGl4ZWwgKmluLCBjb25zdCBCYWNrZ3JvdW5kICpiYWNrKSA9Ci17Ci0gICBncGNfUHJlLCBncGNfUHJlcSwgZ3BjX0dsaW4sIGdwY19HcHJlLCBncGNfR3BycSwgZ3BjX25vcDgsIGdwY19ub3A2Ci19OwotI2VuZGlmCi0KLS8qICAgT1VUOiAgICAtLS0tLSA4LWJpdCAtLS0tLSAgICAtLS0tLSAxNi1iaXQgLS0tLS0KLSAqICAgSU4gICAgIEcgICAgR0EgICBSR0IgIFJHQkEgIEcgICAgR0EgICBSR0IgIFJHQkEKLSAqICA4IEcgICAgIC4gICAgLiAgICAuICAgIC4gICAgIGxpbiAgbGluICBsaW4gIGxpbgotICogIDggR0EgICAgYmNrZyAuICAgIGJja2MgLiAgICAgcHJlJyBwcmUgIHByZScgcHJlCi0gKiAgOCBSR0IgICBnOCAgIGc4ICAgLiAgICAuICAgICBnbGluIGdsaW4gbGluICBsaW4KLSAqICA4IFJHQkEgIGc4YiAgZzggICBiY2tjIC4gICAgIGdwcicgZ3ByZSBwcmUnIHByZQotICogMTYgRyAgICAgc1JHQiBzUkdCIHNSR0Igc1JHQiAgLiAgICAuICAgIC4gICAgLgotICogMTYgR0EgICAgYjE2ZyB1bnBnIGIxNmMgdW5wYyAgQSAgICAuICAgIEEgICAgLgotICogMTYgUkdCICAgc0cgICBzRyAgIHNSR0Igc1JHQiAgZzE2ICBnMTYgIC4gICAgLgotICogMTYgUkdCQSAgZ2IxNiBzR3AgIGNiMTYgc0NwICAgZzE2ICBnMTYnIEEgICAgLgotICoKLSAqIFRoZSBtYXRyaXggaXMgaGVsZCBpbiBhbiBhcnJheSBpbmRleGVkIHRodXM6Ci0gKgotICogICBncGNfZm5bb3V0X2Zvcm1hdCAmIEJBU0VfRk9STUFUU11baW5fZm9ybWF0ICYgQkFTRV9GT1JNQVRTXTsKLSAqLwotLyogVGhpcyB3aWxsIHByb2R1Y2UgYSBjb21waWxlIHRpbWUgZXJyb3IgaWYgdGhlIEZPUk1BVF9GTEFHIHZhbHVlcyBkb24ndAotICogbWF0Y2ggdGhlIGFib3ZlIG1hdHJpeCEKLSAqLwotI2lmIFBOR19GT1JNQVRfRkxBR19BTFBIQSA9PSAxICYmIFBOR19GT1JNQVRfRkxBR19DT0xPUiA9PSAyICYmXAotICAgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiA9PSA0Ci1zdGF0aWMgdm9pZCAoKiBjb25zdCBncGNfZm5bOC8qaW4qL11bOC8qb3V0Ki9dKQotICAgKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjaykgPQotewotLypvdXQ6IEctOCAgICAgR0EtOCAgICAgUkdCLTggICAgUkdCQS04ICAgIEctMTYgICAgIEdBLTE2ICAgUkdCLTE2ICBSR0JBLTE2ICovCi0gICB7Z3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3AsIGdwY19MaW4sIGdwY19MaW4sIGdwY19MaW4sIGdwY19MaW4gfSwKLSAgIHtncGNfYmNrZyxncGNfbm9vcCxncGNfYmNrYyxncGNfbm9vcCwgZ3BjX3ByZXEsZ3BjX3ByZSwgZ3BjX3ByZXEsZ3BjX3ByZSB9LAotICAge2dwY19nOCwgIGdwY19nOCwgIGdwY19ub29wLGdwY19ub29wLCBncGNfZ2xpbixncGNfZ2xpbixncGNfbGluLCBncGNfbGluIH0sCi0gICB7Z3BjX2c4YiwgZ3BjX2c4LCAgZ3BjX2Jja2MsZ3BjX25vb3AsIGdwY19ncHJxLGdwY19ncHJlLGdwY19wcmVxLGdwY19wcmUgfSwKLSAgIHtncGNfc1JHQixncGNfc1JHQixncGNfc1JHQixncGNfc1JHQiwgZ3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3AsZ3BjX25vb3B9LAotICAge2dwY19iMTZnLGdwY191bnBnLGdwY19iMTZjLGdwY191bnBjLCBncGNfQSwgICBncGNfbm9vcCxncGNfQSwgICBncGNfbm9vcH0sCi0gICB7Z3BjX3NHLCAgZ3BjX3NHLCAgZ3BjX3NSR0IsZ3BjX3NSR0IsIGdwY19nMTYsIGdwY19nMTYsIGdwY19ub29wLGdwY19ub29wfSwKLSAgIHtncGNfZ2IxNixncGNfc0dwLCBncGNfY2IxNixncGNfc0NwLCAgZ3BjX2cxNiwgZ3BjX2cxNnEsZ3BjX0EsICAgZ3BjX25vb3B9Ci19OwotCi0vKiBUaGUgYXJyYXkgaXMgcmVwZWF0ZWQgZm9yIHRoZSBjYXNlcyB3aGVyZSBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBjb2xvcgotICogbWFwcGVkIGJlY2F1c2UgdGhlbiBkaWZmZXJlbnQgYWxnb3JpdGhtcyBhcmUgdXNlZC4KLSAqLwotc3RhdGljIHZvaWQgKCogY29uc3QgZ3BjX2ZuX2NvbG9ybWFwcGVkWzgvKmluKi9dWzgvKm91dCovXSkKLSAgIChQaXhlbCAqb3V0LCBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IEJhY2tncm91bmQgKmJhY2spID0KLXsKLS8qb3V0OiBHLTggICAgIEdBLTggICAgIFJHQi04ICAgIFJHQkEtOCAgICBHLTE2ICAgICBHQS0xNiAgIFJHQi0xNiAgUkdCQS0xNiAqLwotICAge2dwY19ub29wLGdwY19ub29wLGdwY19ub29wLGdwY19ub29wLCBncGNfbGluLCBncGNfbGluLCBncGNfbGluLCBncGNfbGluIH0sCi0gICB7Z3BjX2Jja2csZ3BjX25vb3AsZ3BjX2Jja2MsZ3BjX25vb3AsIGdwY19wcmVxLGdwY19wcmUsIGdwY19wcmVxLGdwY19wcmUgfSwKLSAgIHtncGNfZzgsICBncGNfZzgsICBncGNfbm9vcCxncGNfbm9vcCwgZ3BjX2dsaW4sZ3BjX2dsaW4sZ3BjX2xpbiwgZ3BjX2xpbiB9LAotICAge2dwY19nOGIsIGdwY19nOCwgIGdwY19iY2tjLGdwY19ub29wLCBncGNfZ3BycSxncGNfZ3ByZSxncGNfcHJlcSxncGNfcHJlIH0sCi0gICB7Z3BjX3NSR0IsZ3BjX3NSR0IsZ3BjX3NSR0IsZ3BjX3NSR0IsIGdwY19ub29wLGdwY19ub29wLGdwY19ub29wLGdwY19ub29wfSwKLSAgIHtncGNfYjE2ZyxncGNfdW5wZyxncGNfYjE2YyxncGNfdW5wYywgZ3BjX0EsICAgZ3BjX25vb3AsZ3BjX0EsICAgZ3BjX25vb3B9LAotICAge2dwY19zRywgIGdwY19zRywgIGdwY19zUkdCLGdwY19zUkdCLCBncGNfZzE2LCBncGNfZzE2LCBncGNfbm9vcCxncGNfbm9vcH0sCi0gICB7Z3BjX2diMTYsZ3BjX3NHcCwgZ3BjX2NiMTYsZ3BjX3NDcCwgIGdwY19nMTYsIGdwY19nMTZxLGdwY19BLCAgIGdwY19ub29wfQotfTsKLQotLyogVGhlIGVycm9yIGFycmF5cyByZWNvcmQgdGhlIGVycm9yIGluIHRoZSBzYW1lIG1hdHJpeDsgNjQgZW50cmllcywgaG93ZXZlcgotICogdGhlIGRpZmZlcmVudCBhbGdvcml0aG1zIHVzZWQgaW4gbGlicG5nIGZvciBjb2xvcm1hcCBhbmQgZGlyZWN0IGNvbnZlcnNpb25zCi0gKiBtZWFuIHRoYXQgZm91ciBzZXBhcmF0ZSBtYXRyaWNlcyBhcmUgdXNlZCAoZm9yIGVhY2ggY29tYmluYXRpb24gb2YKLSAqIGNvbG9ybWFwcGVkIGFuZCBkaXJlY3QuKQotICoKLSAqIEluIHNvbWUgY2FzZXMgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiBzUkdCIGZvcm1hdHMgZ29lcyB2aWEgYSBsaW5lYXIKLSAqIGludGVybWVkaWF0ZTsgYW4gc1JHQiB0byBsaW5lYXIgY29udmVyc2lvbiAoYXMgYWJvdmUpIGlzIGZvbGxvd2VkIGJ5IGEgc2ltcGxlCi0gKiBsaW5lYXIgdG8gc1JHQiBzdGVwIHdpdGggbm8gb3RoZXIgY29udmVyc2lvbnMuICBUaGlzIGlzIGRvbmUgYnkgYSBzZXBhcmF0ZQotICogZXJyb3IgYXJyYXkgZnJvbSBhbiBhcmJpdHJhcnkgJ2luJyBmb3JtYXQgdG8gb25lIG9mIHRoZSBmb3VyIGJhc2ljIG91dHB1dHMKLSAqIChzaW5jZSBmaW5hbCBvdXRwdXQgaXMgYWx3YXlzIHNSR0Igbm90IGNvbG9ybWFwcGVkKS4KLSAqCi0gKiBUaGVzZSBhcnJheXMgbWF5IGJlIG1vZGlmaWVkIGlmIHRoZSAtLWFjY3VtdWxhdGUgZmxhZyBpcyBzZXQgZHVyaW5nIHRoZSBydW47Ci0gKiB0aGVuIGluc3RlYWQgb2YgbG9nZ2luZyBlcnJvcnMgdGhleSBhcmUgc2ltcGx5IGFkZGVkIGluLgotICoKLSAqIFRoZSB0aHJlZSBlbnRyaWVzIGFyZSBjdXJyZW50bHkgZm9yIHRyYW5zcGFyZW50LCBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgYW5kCi0gKiBvcGFxdWUgaW5wdXQgcGl4ZWwgdmFsdWVzLiAgTm90aWNlIHRoYXQgYWxwaGEgc2hvdWxkIGJlIGV4YWN0IGluIGVhY2ggY2FzZS4KLSAqCi0gKiBFcnJvcnMgaW4gYWxwaGEgc2hvdWxkIG9ubHkgb2NjdXIgd2hlbiBjb252ZXJ0aW5nIGZyb20gYSBkaXJlY3QgZm9ybWF0Ci0gKiB0byBhIGNvbG9ybWFwcGVkIGZvcm1hdCwgd2hlbiBhbHBoYSBpcyBlZmZlY3RpdmVseSBzbWFzaGVkIChzbyBsYXJnZQotICogZXJyb3JzIGNhbiBvY2N1ci4pICBUaGVyZSBzaG91bGQgYmUgbm8gZXJyb3IgaW4gdGhlICcwJyBhbmQgJ29wYXF1ZScKLSAqIHZhbHVlcy4gIFRoZSBmb3VydGggZW50cnkgaW4gdGhlIGFycmF5IGlzIHVzZWQgZm9yIHRoZSBhbHBoYSBlcnJvciAoYW5kIGl0Ci0gKiBzaG91bGQgYWx3YXlzIGJlIHplcm8gZm9yIHRoZSAndmlhIGxpbmVhcicgY2FzZSBzaW5jZSB0aGlzIGlzIG5ldmVyIGNvbG9yCi0gKiBtYXBwZWQuKQotICoKLSAqIE1hcHBpbmcgdG8gYSBjb2xvcm1hcCBzbWFzaGVzIHRoZSBjb2xvcnMsIGl0IGlzIG5lY2Vzc2FyeSB0byBoYXZlIHNlcGFyYXRlCi0gKiB2YWx1ZXMgZm9yIHRoZXNlIGNhc2VzIGJlY2F1c2UgdGhleSBhcmUgbXVjaCBsYXJnZXI7IGl0IGlzIHZlcnkgbXVjaAotICogaW1wb3NzaWJsZSB0byBvYnRhaW4gYSByZWFzb25hYmxlIHJlc3VsdCwgdGhlc2UgYXJlIGhlbGQgaW4KLSAqIGdwY19lcnJvcl90b19jb2xvcm1hcC4KLSAqLwotI2lmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCA9PSA4IC8qIGV4dHJhIGNoZWNrIGFsc28gcmVxdWlyZWQgKi8KLSMgIGluY2x1ZGUgInBuZ3N0ZXN0LWVycm9ycy5oIiAvKiBtYWNoaW5lIGdlbmVyYXRlZCAqLwotI2VuZGlmIC8qIENPTE9STUFQIGZsYWcgY2hlY2sgKi8KLSNlbmRpZiAvKiBmbGFnIGNoZWNrcyAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgLyogQmFzaWMgcGl4ZWwgaW5mb3JtYXRpb246ICovCi0gICBJbWFnZSogICAgICAgaW5faW1hZ2U7ICAgLyogSW5wdXQgaW1hZ2UgKi8KLSAgIGNvbnN0IEltYWdlKiBvdXRfaW1hZ2U7ICAvKiBPdXRwdXQgaW1hZ2UgKi8KLQotICAgLyogJ2JhY2tncm91bmQnIGlzIHRoZSB2YWx1ZSBwYXNzZWQgdG8gdGhlIGdwY18gcm91dGluZXMsIGl0IG1heSBiZSBOVUxMIGlmCi0gICAgKiBpdCBzaG91bGQgbm90IGJlIHVzZWQgKCp0aGlzKiBwcm9ncmFtIGhhcyBhbiBlcnJvciBpZiBpdCBjcmFzaGVzIGFzIGEKLSAgICAqIHJlc3VsdCEpCi0gICAgKi8KLSAgIEJhY2tncm91bmQgICAgICAgIGJhY2tncm91bmRfY29sb3I7Ci0gICBjb25zdCBCYWNrZ3JvdW5kKiBiYWNrZ3JvdW5kOwotCi0gICAvKiBQcmVjYWxjdWxhdGVkIHZhbHVlczogKi8KLSAgIGludCAgICAgICAgICBpbl9vcGFxdWU7ICAgLyogVmFsdWUgb2YgaW5wdXQgYWxwaGEgdGhhdCBpcyBvcGFxdWUgKi8KLSAgIGludCAgICAgICAgICBpc19wYWxldHRlOyAgLyogU2FtcGxlIHZhbHVlcyBjb21lIGZyb20gdGhlIHBhbGV0dGUgKi8KLSAgIGludCAgICAgICAgICBhY2N1bXVsYXRlOyAgLyogQWNjdW1sYXRlIGNvbXBvbmVudCBlcnJvcnMgKGRvbid0IGxvZykgKi8KLSAgIGludCAgICAgICAgICBvdXRwdXRfOGJpdDsgLyogT3V0cHV0IGlzIDgtYml0IChlbHNlIDE2LWJpdCkgKi8KLQotICAgdm9pZCAoKmluX2dwKShQaXhlbCosIHBuZ19jb25zdF92b2lkcCk7Ci0gICB2b2lkICgqb3V0X2dwKShQaXhlbCosIHBuZ19jb25zdF92b2lkcCk7Ci0KLSAgIHZvaWQgKCp0cmFuc2Zvcm0pKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjayk7Ci0gICAgICAvKiBBIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIHRyYW5zZm9ybSAqLwotCi0gICB2b2lkICgqZnJvbV9saW5lYXIpKFBpeGVsICpvdXQsIGNvbnN0IFBpeGVsICppbiwgY29uc3QgQmFja2dyb3VuZCAqYmFjayk7Ci0gICAgICAvKiBGb3IgJ3ZpYV9saW5lYXInIHRyYW5zZm9ybXMgdGhlIGZpbmFsLCBmcm9tIGxpbmVhciwgc3RlcCwgZWxzZSBOVUxMICovCi0KLSAgIHBuZ191aW50XzE2IGVycm9yWzRdOwotICAgICAgLyogVGhyZWUgZXJyb3IgdmFsdWVzIGZvciB0cmFuc3BhcmVudCwgcGFydGlhbGx5IHRyYW5zcGFyZW50IGFuZCBvcGFxdWUKLSAgICAgICAqIGlucHV0IHBpeGVscyAoaW4gdHVybikuCi0gICAgICAgKi8KLQotICAgcG5nX3VpbnRfMTYgKmVycm9yX3B0cjsKLSAgICAgIC8qIFdoZXJlIHRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIHN0YXRpYyBhcnJheSAoZm9yICdhY2N1bXVsYXRlJykgKi8KLX0KLVRyYW5zZm9ybTsKLQotLyogUmV0dXJuIGEgJ3RyYW5zZm9ybScgYXMgYWJvdmUgZm9yIHRoZSBnaXZlbiBmb3JtYXQgY29udmVyc2lvbi4gKi8KLXN0YXRpYyB2b2lkCi10cmFuc2Zvcm1fZnJvbV9mb3JtYXRzKFRyYW5zZm9ybSAqcmVzdWx0LCBJbWFnZSAqaW5faW1hZ2UsCi0gICBjb25zdCBJbWFnZSAqb3V0X2ltYWdlLCBwbmdfY29uc3RfY29sb3JwIGJhY2tncm91bmQsIGludCB2aWFfbGluZWFyKQotewotICAgcG5nX3VpbnRfMzIgaW5fZm9ybWF0LCBvdXRfZm9ybWF0OwotICAgcG5nX3VpbnRfMzIgaW5fYmFzZSwgb3V0X2Jhc2U7Ci0KLSAgIG1lbXNldChyZXN1bHQsIDAsIHNpemVvZiAqcmVzdWx0KTsKLQotICAgLyogU3RvcmUgdGhlIG9yaWdpbmFsIGltYWdlcyBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLSAgIHJlc3VsdC0+aW5faW1hZ2UgPSBpbl9pbWFnZTsKLSAgIHJlc3VsdC0+b3V0X2ltYWdlID0gb3V0X2ltYWdlOwotCi0gICBpbl9mb3JtYXQgPSBpbl9pbWFnZS0+aW1hZ2UuZm9ybWF0OwotICAgb3V0X2Zvcm1hdCA9IG91dF9pbWFnZS0+aW1hZ2UuZm9ybWF0OwotCi0gICBpZiAoaW5fZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikKLSAgICAgIHJlc3VsdC0+aW5fb3BhcXVlID0gNjU1MzU7Ci0gICBlbHNlCi0gICAgICByZXN1bHQtPmluX29wYXF1ZSA9IDI1NTsKLQotICAgcmVzdWx0LT5vdXRwdXRfOGJpdCA9IChvdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikgPT0gMDsKLQotICAgcmVzdWx0LT5pc19wYWxldHRlID0gMDsgLyogc2V0IGJ5IGNhbGxlciBpZiByZXF1aXJlZCAqLwotICAgcmVzdWx0LT5hY2N1bXVsYXRlID0gKGluX2ltYWdlLT5vcHRzICYgQUNDVU1VTEFURSkgIT0gMDsKLQotICAgLyogVGhlIGxvYWRlcnMgKHdoaWNoIG5lZWQgdGhlIG9yZGVyaW5nIGluZm9ybWF0aW9uKSAqLwotICAgcmVzdWx0LT5pbl9ncCA9IGdldF9waXhlbChpbl9mb3JtYXQpOwotICAgcmVzdWx0LT5vdXRfZ3AgPSBnZXRfcGl4ZWwob3V0X2Zvcm1hdCk7Ci0KLSAgIC8qIFJlbW92ZSB0aGUgb3JkZXJpbmcgaW5mb3JtYXRpb246ICovCi0gICBpbl9mb3JtYXQgJj0gQkFTRV9GT1JNQVRTIHwgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQOwotICAgaW5fYmFzZSA9IGluX2Zvcm1hdCAmIEJBU0VfRk9STUFUUzsKLSAgIG91dF9mb3JtYXQgJj0gQkFTRV9GT1JNQVRTIHwgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQOwotICAgb3V0X2Jhc2UgPSBvdXRfZm9ybWF0ICYgQkFTRV9GT1JNQVRTOwotCi0gICBpZiAodmlhX2xpbmVhcikKLSAgIHsKLSAgICAgIC8qIENoZWNrIGZvciBhbiBlcnJvciBpbiB0aGlzIHByb2dyYW06ICovCi0gICAgICBpZiAob3V0X2Zvcm1hdCAmIChQTkdfRk9STUFUX0ZMQUdfTElORUFSfFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludGVybmFsIHRyYW5zZm9ybSB2aWEgbGluZWFyIGVycm9yIDB4JXgtPjB4JXhcbiIsCi0gICAgICAgICAgICBpbl9mb3JtYXQsIG91dF9mb3JtYXQpOwotICAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgcmVzdWx0LT50cmFuc2Zvcm0gPSBncGNfZm5baW5fYmFzZV1bb3V0X2Jhc2UgfCBQTkdfRk9STUFUX0ZMQUdfTElORUFSXTsKLSAgICAgIHJlc3VsdC0+ZnJvbV9saW5lYXIgPSBncGNfZm5bb3V0X2Jhc2UgfCBQTkdfRk9STUFUX0ZMQUdfTElORUFSXVtvdXRfYmFzZV07Ci0gICAgICByZXN1bHQtPmVycm9yX3B0ciA9IGdwY19lcnJvcl92aWFfbGluZWFyW2luX2Zvcm1hdF1bb3V0X2Zvcm1hdF07Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKH5pbl9mb3JtYXQgJiBvdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQotICAgewotICAgICAgLyogVGhlIGlucHV0IGlzIG5vdCBjb2xvcm1hcHBlZCBidXQgdGhlIG91dHB1dCBpcywgdGhlIGVycm9ycyB3aWxsCi0gICAgICAgKiB0eXBpY2FsbHkgYmUgbGFyZ2UgKG9ubHkgdGhlIGdyYXlzY2FsZS1uby1hbHBoYSBjYXNlIHBlcm1pdHMgcHJlc2VydmluZwotICAgICAgICogZXZlbiA4LWJpdCB2YWx1ZXMuKQotICAgICAgICovCi0gICAgICByZXN1bHQtPnRyYW5zZm9ybSA9IGdwY19mbltpbl9iYXNlXVtvdXRfYmFzZV07Ci0gICAgICByZXN1bHQtPmZyb21fbGluZWFyID0gTlVMTDsKLSAgICAgIHJlc3VsdC0+ZXJyb3JfcHRyID0gZ3BjX2Vycm9yX3RvX2NvbG9ybWFwW2luX2Jhc2VdW291dF9iYXNlXTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgLyogVGhlIGNhbGxlciBoYW5kbGVzIHRoZSBjb2xvcm1hcC0+cGl4ZWwgdmFsdWUgY29udmVyc2lvbiwgc28gdGhlCi0gICAgICAgKiB0cmFuc2Zvcm0gZnVuY3Rpb24ganVzdCBnZXRzIGEgcGl4ZWwgdmFsdWUsIGhvd2V2ZXIgYmVjYXVzZSBsaWJwbmcKLSAgICAgICAqIGN1cnJlbnRseSBjb250YWlucyBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFwcGluZyBhIGNvbG9ybWFwIGlmCi0gICAgICAgKiBib3RoIGlucHV0IGFuZCBvdXRwdXQgYXJlIGNvbG9ybWFwcGVkIHdlIG5lZWQgZGlmZmVyZW50IGNvbnZlcnNpb24KLSAgICAgICAqIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZXJyb3JzIGluIHRoZSBsaWJwbmcgaW1wbGVtZW50YXRpb24uCi0gICAgICAgKi8KLSAgICAgIGlmIChpbl9mb3JtYXQgJiBvdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQotICAgICAgICAgcmVzdWx0LT50cmFuc2Zvcm0gPSBncGNfZm5fY29sb3JtYXBwZWRbaW5fYmFzZV1bb3V0X2Jhc2VdOwotICAgICAgZWxzZQotICAgICAgICAgcmVzdWx0LT50cmFuc2Zvcm0gPSBncGNfZm5baW5fYmFzZV1bb3V0X2Jhc2VdOwotICAgICAgcmVzdWx0LT5mcm9tX2xpbmVhciA9IE5VTEw7Ci0gICAgICByZXN1bHQtPmVycm9yX3B0ciA9IGdwY19lcnJvcltpbl9mb3JtYXRdW291dF9mb3JtYXRdOwotICAgfQotCi0gICAvKiBGb2xsb3cgdGhlIGxpYnBuZyBzaW1wbGlmaWVkIEFQSSBydWxlcyB0byB3b3JrIG91dCB3aGF0IHRvIHBhc3MgdG8gdGhlIGdwYwotICAgICogcm91dGluZXMgYXMgYSBiYWNrZ3JvdW5kIHZhbHVlLCBpZiBvbmUgaXMgbm90IHJlcXVpcmVkIHBhc3MgTlVMTCBzbyB0aGF0Ci0gICAgKiB0aGlzIHByb2dyYW0gY3Jhc2hlcyBpbiB0aGUgZXZlbiBvZiBhIHByb2dyYW1taW5nIGVycm9yLgotICAgICovCi0gICByZXN1bHQtPmJhY2tncm91bmQgPSBOVUxMOyAvKiBkZWZhdWx0OiBub3QgcmVxdWlyZWQgKi8KLQotICAgLyogUnVsZSAxOiBiYWNrZ3JvdW5kIG9ubHkgbmVlZCBiZSBzdXBwbGllZCBpZiBhbHBoYSBpcyB0byBiZSByZW1vdmVkICovCi0gICBpZiAoaW5fZm9ybWF0ICYgfm91dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpCi0gICB7Ci0gICAgICAvKiBUaGUgaW5wdXQgdmFsdWUgaXMgJ05VTEwnIHRvIHVzZSB0aGUgYmFja2dyb3VuZCBhbmQgKG90aGVyd2lzZSkgYW4gc1JHQgotICAgICAgICogYmFja2dyb3VuZCBjb2xvciAodG8gdXNlIGEgc29saWQgY29sb3IpLiAgVGhlIGNvZGUgYWJvdmUgdXNlcyBhIGZpeGVkCi0gICAgICAgKiBieXRlIHZhbHVlLCBCVUZGRVJfSU5JVDgsIGZvciBidWZmZXIgZXZlbiBmb3IgMTYtYml0IG91dHB1dC4gIEZvcgotICAgICAgICogbGluZWFyICgxNi1iaXQpIG91dHB1dCB0aGUgc1JHQiBiYWNrZ3JvdW5kIGNvbG9yIGlzIGlnbm9yZWQ7IHRoZQotICAgICAgICogY29tcG9zaXRpb24gaXMgYWx3YXlzIG9uIHRoZSBiYWNrZ3JvdW5kIChzbyBCVUZGRVJfSU5JVDggKiAyNTcpLCBleGNlcHQKLSAgICAgICAqIHRoYXQgZm9yIHRoZSBjb2xvcm1hcCAoaS5lLiBsaW5lYXIgY29sb3JtYXBwZWQgb3V0cHV0KSBibGFjayBpcyB1c2VkLgotICAgICAgICovCi0gICAgICByZXN1bHQtPmJhY2tncm91bmQgPSAmcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yOwotCi0gICAgICBpZiAob3V0X2Zvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIgfHwgdmlhX2xpbmVhcikKLSAgICAgIHsKLSAgICAgICAgIGlmIChvdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQotICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlyID0KLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pZyA9Ci0gICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWIgPSAwOwotICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRyID0KLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kZyA9Ci0gICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGIgPSAwOwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaXIgPQotICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlnID0KLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pYiA9IEJVRkZFUl9JTklUOCAqIDI1NzsKLSAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kciA9Ci0gICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGcgPQotICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRiID0gMDsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSAvKiBzUkdCIG91dHB1dCAqLwotICAgICAgewotICAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gTlVMTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvdXRfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlyID0gYmFja2dyb3VuZC0+cmVkOwotICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlnID0gYmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWIgPSBiYWNrZ3JvdW5kLT5ibHVlOwotICAgICAgICAgICAgICAgLyogVE9ETzogc29tZXRpbWVzIGxpYnBuZyB1c2VzIHRoZSBwb3dlciBsYXcgY29udmVyc2lvbiBoZXJlLCBob3cKLSAgICAgICAgICAgICAgICAqIHRvIGhhbmRsZSB0aGlzPwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZHIgPSBzUkdCX3RvX2RbYmFja2dyb3VuZC0+cmVkXTsKLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kZyA9IHNSR0JfdG9fZFtiYWNrZ3JvdW5kLT5ncmVlbl07Ci0gICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGIgPSBzUkdCX3RvX2RbYmFja2dyb3VuZC0+Ymx1ZV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgLyogZ3JheXNjYWxlOiBsaWJwbmcgb25seSBsb29rcyBhdCAnZycgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pciA9Ci0gICAgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWcgPQotICAgICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmliID0gYmFja2dyb3VuZC0+Z3JlZW47Ci0gICAgICAgICAgICAgICAvKiBUT0RPOiBzb21ldGltZXMgbGlicG5nIHVzZXMgdGhlIHBvd2VyIGxhdyBjb252ZXJzaW9uIGhlcmUsIGhvdwotICAgICAgICAgICAgICAgICogdG8gaGFuZGxlIHRoaXM/Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kciA9Ci0gICAgICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGcgPQotICAgICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRiID0gc1JHQl90b19kW2JhY2tncm91bmQtPmdyZWVuXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZSBpZiAoKG91dF9mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaXIgPQotICAgICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlnID0KLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pYiA9IEJVRkZFUl9JTklUODsKLSAgICAgICAgICAgIC8qIFRPRE86IHNvbWV0aW1lcyBsaWJwbmcgdXNlcyB0aGUgcG93ZXIgbGF3IGNvbnZlcnNpb24gaGVyZSwgaG93Ci0gICAgICAgICAgICAgKiB0byBoYW5kbGUgdGhpcz8KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRyID0KLSAgICAgICAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kZyA9Ci0gICAgICAgICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGIgPSBzUkdCX3RvX2RbQlVGRkVSX0lOSVQ4XTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogRWxzZSB0aGUgb3V0cHV0IGlzIGNvbG9ybWFwcGVkIGFuZCBhIGJhY2tncm91bmQgY29sb3IgbXVzdCBiZQotICAgICAgICAgICogcHJvdmlkZWQ7IGlmIHBuZ3N0ZXN0IGNyYXNoZXMgdGhlbiB0aGF0IGlzIGEgYnVnIGluIHRoaXMgcHJvZ3JhbQotICAgICAgICAgICogKHRob3VnaCBsaWJwbmcgc2hvdWxkIHBuZ19lcnJvciBhcyB3ZWxsLikKLSAgICAgICAgICAqLwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kID0gTlVMTDsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKHJlc3VsdC0+YmFja2dyb3VuZCA9PSBOVUxMKQotICAgewotICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmlyID0KLSAgICAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5pZyA9Ci0gICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuaWIgPSAtMTsgLyogbm90IHVzZWQgKi8KLSAgICAgIHJlc3VsdC0+YmFja2dyb3VuZF9jb2xvci5kciA9Ci0gICAgICAgICByZXN1bHQtPmJhY2tncm91bmRfY29sb3IuZGcgPQotICAgICAgICAgcmVzdWx0LT5iYWNrZ3JvdW5kX2NvbG9yLmRiID0gMUUzMDsgLyogbm90IHVzZWQgKi8KLSAgIH0KLQotCi0gICAvKiBDb3B5IHRoZSBlcnJvciB2YWx1ZXMgaW50byB0aGUgVHJhbnNmb3JtOiAqLwotICAgcmVzdWx0LT5lcnJvclswXSA9IHJlc3VsdC0+ZXJyb3JfcHRyWzBdOwotICAgcmVzdWx0LT5lcnJvclsxXSA9IHJlc3VsdC0+ZXJyb3JfcHRyWzFdOwotICAgcmVzdWx0LT5lcnJvclsyXSA9IHJlc3VsdC0+ZXJyb3JfcHRyWzJdOwotICAgcmVzdWx0LT5lcnJvclszXSA9IHJlc3VsdC0+ZXJyb3JfcHRyWzNdOwotfQotCi0KLS8qIENvbXBhcmUgdHdvIHBpeGVscy4KLSAqCi0gKiBPTEQgZXJyb3IgdmFsdWVzOgotc3RhdGljIGludCBlcnJvcl90b19saW5lYXIgPSA4MTE7ICogYnkgZXhwZXJpbWVudCAqCi1zdGF0aWMgaW50IGVycm9yX3RvX2xpbmVhcl9ncmF5c2NhbGUgPSA0MjQ7ICogYnkgZXhwZXJpbWVudCAqCi1zdGF0aWMgaW50IGVycm9yX3RvX3NSR0IgPSA2OyAqIGJ5IGV4cGVyaW1lbnQgKgotc3RhdGljIGludCBlcnJvcl90b19zUkdCX2dyYXlzY2FsZSA9IDE3OyAqIGxpYnBuZyBlcnJvciBieSBjYWxjdWxhdGlvbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnkgZXhwZXJpbWVudCAqCi1zdGF0aWMgaW50IGVycm9yX2luX2NvbXBvc2UgPSAyOyAqIGJ5IGV4cGVyaW1lbnQgKgotc3RhdGljIGludCBlcnJvcl9pbl9wcmVtdWx0aXBseSA9IDE7Ci0gKgotICogVGhlIGZvbGxvd2luZyBpcyAqanVzdCogdGhlIHJlc3VsdCBvZiBhIHJvdW5kIHRyaXAgZnJvbSA4LWJpdCBzUkdCIHRvIGxpbmVhcgotICogdGhlbiBiYWNrIHRvIDgtYml0IHNSR0Igd2hlbiBpdCBpcyBkb25lIGJ5IGxpYnBuZy4gIFRoZXJlIGFyZSB0d28gcHJvYmxlbXM6Ci0gKgotICogMSkgbGlicG5nIGN1cnJlbnRseSB1c2VzIGEgMi4yIHBvd2VyIGxhdyB3aXRoIG5vIGxpbmVhciBzZWdtZW50LCB0aGlzIHJlc3VsdHMKLSAqIGluIGluc3RhYmlsaXR5IGluIHRoZSBsb3cgdmFsdWVzIGFuZCBldmVuIHdpdGggMTYtYml0IHByZWNpc2lvbiBzUkdCKDEpIGVuZHMKLSAqIHVwIG1hcHBpbmcgdG8gc1JHQigwKSBhcyBhIHJlc3VsdCBvZiByb3VuZGluZyBpbiB0aGUgMTYtYml0IHJlcHJlc2VudGF0aW9uLgotICogVGhpcyBnaXZlcyBhbiBlcnJvciBvZiAxIGluIHRoZSBoYW5kbGluZyBvZiB2YWx1ZSAxIG9ubHkuCi0gKgotICogMikgbGlicG5nIGN1cnJlbnRseSB1c2VzIGFuIGludGVybWVkaWF0ZSA4LWJpdCBsaW5lYXIgdmFsdWUgaW4gZ2FtbWEKLSAqIGNvcnJlY3Rpb24gb2YgOC1iaXQgdmFsdWVzLiAgVGhpcyByZXN1bHRzIGluIG1hbnkgbW9yZSBlcnJvcnMsIHRoZSB3b3JzZSBvZgotICogd2hpY2ggaXMgbWFwcGluZyBzUkdCKDE0KSB0byBzUkdCKDApLgotICoKLSAqIFRoZSBnZW5lcmFsICdlcnJvcl92aWFfbGluZWFyJyBpcyBtb3JlIGNvbXBsZXggYmVjYXVzZSBvZiBwcmUtbXVsdGlwbGljYXRpb24sCi0gKiB0aGlzIGNvbXBvdW5kcyB0aGUgOC1iaXQgZXJyb3JzIGFjY29yZGluZyB0byB0aGUgYWxwaGEgdmFsdWUgb2YgdGhlIHBpeGVsLgotICogQXMgYSByZXN1bHQgMjU2IHZhbHVlcyBhcmUgcHJlLWNhbGN1bGF0ZWQgZm9yIGVycm9yX3ZpYV9saW5lYXIuCi0gKi8KLSNpZiAwCi1zdGF0aWMgaW50IGVycm9yX2luX2xpYnBuZ19nYW1tYTsKLXN0YXRpYyBpbnQgZXJyb3JfdmlhX2xpbmVhclsyNTZdOyAvKiBJbmRleGVkIGJ5IDgtYml0IGFscGhhICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2Vycm9yX3ZpYV9saW5lYXIodm9pZCkKLXsKLSAgIGludCBhbHBoYTsKLQotICAgZXJyb3JfdmlhX2xpbmVhclswXSA9IDI1NTsgLyogdHJhbnNwYXJlbnQgcGl4ZWwgKi8KLQotICAgZm9yIChhbHBoYT0xOyBhbHBoYTw9MjU1OyArK2FscGhhKQotICAgewotICAgICAgLyogMTYtYml0IHZhbHVlcyBsZXNzIHRoYW4gMTI4LjUgZ2V0IHJvdW5kZWQgdG8gOC1iaXQgMCBhbmQgc28gdGhlIHdvcnN0Ci0gICAgICAgKiBjYXNlIGVycm9yIGFyaXNlcyB3aXRoIDE2LWJpdCAxMjguNSwgd29yayBvdXQgd2hhdCBzUkdCCi0gICAgICAgKiAobm9uLWFzc29jaWF0ZWQpIHZhbHVlIGdlbmVyYXRlcyAxMjguNTsgYW55IHZhbHVlIGxlc3MgdGhhbiB0aGlzIGlzCi0gICAgICAgKiBnb2luZyB0byBtYXAgdG8gMCwgc28gdGhlIHdvcnN0IGVycm9yIGlzIGZsb29yKHZhbHVlKS4KLSAgICAgICAqCi0gICAgICAgKiBOb3RlIHRoYXQgZXJyb3JzIGFyZSBjb25zaWRlcmFibHkgaGlnaGVyIChtb3JlIHRoYW4gYSBmYWN0b3Igb2YgMikKLSAgICAgICAqIGJlY2F1c2UgbGlicG5nIHVzZXMgYSBzaW1wbGUgcG93ZXIgbGF3IGZvciBzUkdCIGRhdGEgYXQgcHJlc2VudC4KLSAgICAgICAqCi0gICAgICAgKiBBZGQgLjEgZm9yIGFyaXRobWV0aWMgZXJyb3JzIGluc2lkZSBsaWJwbmcuCi0gICAgICAgKi8KLSAgICAgIGRvdWJsZSB2ID0gZmxvb3IoMjU1KnBvdyguNS8qKDEyOC41ICogMjU1IC8gNjU1MzUpKi8gLyBhbHBoYSwgMS8yLjIpKy4xKTsKLQotICAgICAgZXJyb3JfdmlhX2xpbmVhclthbHBoYV0gPSAoaW50KXY7Ci0gICB9Ci0KLSAgIC8qIFRoaXMgaXMgYWN0dWFsbHkgMTQuOTksIGJ1dCwgZGVzcGl0ZSB0aGUgY2xvc2VuZXNzIHRvIDE1LCAxNCBzZWVtcyB0byB3b3JrCi0gICAgKiBvayBpbiB0aGlzIGNhc2UuCi0gICAgKi8KLSAgIGVycm9yX2luX2xpYnBuZ19nYW1tYSA9IDE0OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1wcmludF9waXhlbChjaGFyIHN0cmluZ1s2NF0sIGNvbnN0IFBpeGVsICpwaXhlbCwgcG5nX3VpbnRfMzIgZm9ybWF0KQotewotICAgc3dpdGNoIChmb3JtYXQgJiAoUE5HX0ZPUk1BVF9GTEFHX0FMUEhBfFBOR19GT1JNQVRfRkxBR19DT0xPUikpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICBzcHJpbnRmKHN0cmluZywgIiVzKCVkKSIsIGZvcm1hdF9uYW1lc1tmb3JtYXRdLCBwaXhlbC0+Zyk7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfRk9STUFUX0ZMQUdfQUxQSEE6Ci0gICAgICAgICBzcHJpbnRmKHN0cmluZywgIiVzKCVkLCVkKSIsIGZvcm1hdF9uYW1lc1tmb3JtYXRdLCBwaXhlbC0+ZywKLSAgICAgICAgICAgIHBpeGVsLT5hKTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19GT1JNQVRfRkxBR19DT0xPUjoKLSAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMoJWQsJWQsJWQpIiwgZm9ybWF0X25hbWVzW2Zvcm1hdF0sCi0gICAgICAgICAgICBwaXhlbC0+ciwgcGl4ZWwtPmcsIHBpeGVsLT5iKTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19GT1JNQVRfRkxBR19DT0xPUnxQTkdfRk9STUFUX0ZMQUdfQUxQSEE6Ci0gICAgICAgICBzcHJpbnRmKHN0cmluZywgIiVzKCVkLCVkLCVkLCVkKSIsIGZvcm1hdF9uYW1lc1tmb3JtYXRdLAotICAgICAgICAgICAgcGl4ZWwtPnIsIHBpeGVsLT5nLCBwaXhlbC0+YiwgcGl4ZWwtPmEpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBzcHJpbnRmKHN0cmluZywgImludmFsaWQtZm9ybWF0Iik7Ci0gICAgICAgICBicmVhazsKLSAgIH0KLX0KLQotc3RhdGljIGludAotbG9ncGl4ZWwoY29uc3QgVHJhbnNmb3JtICp0cmFuc2Zvcm0sIHBuZ191aW50XzMyIHgsIHBuZ191aW50XzMyIHksCi0gICBjb25zdCBQaXhlbCAqaW4sIGNvbnN0IFBpeGVsICpjYWxjLCBjb25zdCBQaXhlbCAqb3V0LCBjb25zdCBjaGFyICpyZWFzb24pCi17Ci0gICBjb25zdCBwbmdfdWludF8zMiBpbl9mb3JtYXQgPSB0cmFuc2Zvcm0tPmluX2ltYWdlLT5pbWFnZS5mb3JtYXQ7Ci0gICBjb25zdCBwbmdfdWludF8zMiBvdXRfZm9ybWF0ID0gdHJhbnNmb3JtLT5vdXRfaW1hZ2UtPmltYWdlLmZvcm1hdDsKLQotICAgcG5nX3VpbnRfMzIgYmFja19mb3JtYXQgPSBvdXRfZm9ybWF0ICYgflBOR19GT1JNQVRfRkxBR19BTFBIQTsKLSAgIGNvbnN0IGNoYXIgKnZpYV9saW5lYXIgPSAiIjsKLQotICAgY2hhciBwaXhlbF9pbls2NF0sIHBpeGVsX2NhbGNbNjRdLCBwaXhlbF9vdXRbNjRdLCBwaXhlbF9sb2NbNjRdOwotICAgY2hhciBiYWNrZ3JvdW5kX2luZm9bMTAwXTsKLQotICAgcHJpbnRfcGl4ZWwocGl4ZWxfaW4sIGluLCBpbl9mb3JtYXQpOwotICAgcHJpbnRfcGl4ZWwocGl4ZWxfY2FsYywgY2FsYywgb3V0X2Zvcm1hdCk7Ci0gICBwcmludF9waXhlbChwaXhlbF9vdXQsIG91dCwgb3V0X2Zvcm1hdCk7Ci0KLSAgIGlmICh0cmFuc2Zvcm0tPmlzX3BhbGV0dGUpCi0gICAgICBzcHJpbnRmKHBpeGVsX2xvYywgInBhbGV0dGU6ICVsdSIsICh1bnNpZ25lZCBsb25nKXkpOwotICAgZWxzZQotICAgICAgc3ByaW50ZihwaXhlbF9sb2MsICIlbHUsJWx1IiwgKHVuc2lnbmVkIGxvbmcpeCwgKHVuc2lnbmVkIGxvbmcpeSk7Ci0KLSAgIGlmICh0cmFuc2Zvcm0tPmZyb21fbGluZWFyICE9IE5VTEwpCi0gICB7Ci0gICAgICB2aWFfbGluZWFyID0gIiAodmlhIGxpbmVhcikiOwotICAgICAgLyogQW5kIGFzIGEgcmVzdWx0IHRoZSAqcmVhZCogZm9ybWF0IHdoaWNoIGRpZCBhbnkgYmFja2dyb3VuZCBwcm9jZXNzaW5nCi0gICAgICAgKiB3YXMgaXRzZWxmIGxpbmVhciwgc28gdGhlIGJhY2tncm91bmQgY29sb3IgaW5mb3JtYXRpb24gaXMgYWxzbwotICAgICAgICogbGluZWFyLgotICAgICAgICovCi0gICAgICBiYWNrX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfTElORUFSOwotICAgfQotCi0gICBpZiAodHJhbnNmb3JtLT5iYWNrZ3JvdW5kICE9IE5VTEwpCi0gICB7Ci0gICAgICBQaXhlbCBiYWNrOwotICAgICAgY2hhciBwaXhlbF9iYWNrWzY0XTsKLQotICAgICAgYmFjay5yID0gdHJhbnNmb3JtLT5iYWNrZ3JvdW5kLT5pcjsKLSAgICAgIGJhY2suZyA9IHRyYW5zZm9ybS0+YmFja2dyb3VuZC0+aWc7Ci0gICAgICBiYWNrLmIgPSB0cmFuc2Zvcm0tPmJhY2tncm91bmQtPmliOwotICAgICAgYmFjay5hID0gLTE7IC8qIG5vdCB1c2VkICovCi0KLSAgICAgIHByaW50X3BpeGVsKHBpeGVsX2JhY2ssICZiYWNrLCBiYWNrX2Zvcm1hdCk7Ci0gICAgICBzcHJpbnRmKGJhY2tncm91bmRfaW5mbywgIiBvbiBiYWNrZ3JvdW5kICVzIiwgcGl4ZWxfYmFjayk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIGJhY2tncm91bmRfaW5mb1swXSA9IDA7Ci0KLSAgIGlmICh0cmFuc2Zvcm0tPmluX2ltYWdlLT5maWxlX25hbWUgIT0gdHJhbnNmb3JtLT5vdXRfaW1hZ2UtPmZpbGVfbmFtZSkKLSAgIHsKLSAgICAgIGNoYXIgZXJyb3JfYnVmZmVyWzUxMl07Ci0gICAgICBzcHJpbnRmKGVycm9yX2J1ZmZlciwKLSAgICAgICAgICIoJXMpICVzIGVycm9yJXM6XG4gJXMlcyAtPlxuICAgICAgICVzXG4gIG5vdDogJXMuXG4iCi0gICAgICAgICAiVXNlIC0tcHJlc2VydmUgYW5kIGV4YW1pbmU6ICIsIHBpeGVsX2xvYywgcmVhc29uLCB2aWFfbGluZWFyLAotICAgICAgICAgcGl4ZWxfaW4sIGJhY2tncm91bmRfaW5mbywgcGl4ZWxfb3V0LCBwaXhlbF9jYWxjKTsKLSAgICAgIHJldHVybiBsb2dlcnJvcih0cmFuc2Zvcm0tPmluX2ltYWdlLCB0cmFuc2Zvcm0tPmluX2ltYWdlLT5maWxlX25hbWUsCi0gICAgICAgICBlcnJvcl9idWZmZXIsIHRyYW5zZm9ybS0+b3V0X2ltYWdlLT5maWxlX25hbWUpOwotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICBjaGFyIGVycm9yX2J1ZmZlcls1MTJdOwotICAgICAgc3ByaW50ZihlcnJvcl9idWZmZXIsCi0gICAgICAgICAiKCVzKSAlcyBlcnJvciVzOlxuICVzJXMgLT5cbiAgICAgICAlc1xuICBub3Q6ICVzLlxuIgotICAgICAgICAgIiBUaGUgZXJyb3IgaGFwcGVuZWQgd2hlbiByZWFkaW5nIHRoZSBvcmlnaW5hbCBmaWxlIHdpdGggdGhpcyBmb3JtYXQuIiwKLSAgICAgICAgIHBpeGVsX2xvYywgcmVhc29uLCB2aWFfbGluZWFyLCBwaXhlbF9pbiwgYmFja2dyb3VuZF9pbmZvLCBwaXhlbF9vdXQsCi0gICAgICAgICBwaXhlbF9jYWxjKTsKLSAgICAgIHJldHVybiBsb2dlcnJvcih0cmFuc2Zvcm0tPmluX2ltYWdlLCB0cmFuc2Zvcm0tPmluX2ltYWdlLT5maWxlX25hbWUsCi0gICAgICAgICBlcnJvcl9idWZmZXIsICIiKTsKLSAgIH0KLX0KLQotc3RhdGljIGludAotY21wcGl4ZWwoVHJhbnNmb3JtICp0cmFuc2Zvcm0sIHBuZ19jb25zdF92b2lkcCBpbiwgcG5nX2NvbnN0X3ZvaWRwIG91dCwKLSAgIHBuZ191aW50XzMyIHgsIHBuZ191aW50XzMyIHkvKm9yIHBhbGV0dGUgaW5kZXgqLykKLXsKLSAgIGludCBtYXhlcnI7Ci0gICBwbmdfY29uc3RfY2hhcnAgZXJybXNnOwotICAgUGl4ZWwgcGl4ZWxfaW4sIHBpeGVsX2NhbGMsIHBpeGVsX291dDsKLQotICAgdHJhbnNmb3JtLT5pbl9ncCgmcGl4ZWxfaW4sIGluKTsKLQotICAgaWYgKHRyYW5zZm9ybS0+ZnJvbV9saW5lYXIgPT0gTlVMTCkKLSAgICAgIHRyYW5zZm9ybS0+dHJhbnNmb3JtKCZwaXhlbF9jYWxjLCAmcGl4ZWxfaW4sIHRyYW5zZm9ybS0+YmFja2dyb3VuZCk7Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHRyYW5zZm9ybS0+dHJhbnNmb3JtKCZwaXhlbF9vdXQsICZwaXhlbF9pbiwgdHJhbnNmb3JtLT5iYWNrZ3JvdW5kKTsKLSAgICAgIHRyYW5zZm9ybS0+ZnJvbV9saW5lYXIoJnBpeGVsX2NhbGMsICZwaXhlbF9vdXQsIE5VTEwpOwotICAgfQotCi0gICB0cmFuc2Zvcm0tPm91dF9ncCgmcGl4ZWxfb3V0LCBvdXQpOwotCi0gICAvKiBFbGltaW5hdGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgdmFsdWVzIG1hdGNoIGV4YWN0bHkuICovCi0gICBpZiAocGl4ZWxfY2FsYy5hID09IHBpeGVsX291dC5hICYmIHBpeGVsX2NhbGMuciA9PSBwaXhlbF9vdXQuciAmJgotICAgICAgcGl4ZWxfY2FsYy5nID09IHBpeGVsX291dC5nICYmIHBpeGVsX2NhbGMuYiA9PSBwaXhlbF9vdXQuYikKLSAgICAgIHJldHVybiAxOwotCi0gICAvKiBFbGltaW5hdGUgdGhlIGNhc2Ugd2hlcmUgdGhlIG91dHB1dCBwaXhlbCBpcyB0cmFuc3BhcmVudCBhbmQgdGhlIG91dHB1dAotICAgICogaXMgOC1iaXQgLSBhbnkgY29tcG9uZW50IHZhbHVlcyBhcmUgdmFsaWQuICBEb24ndCBjaGVjayB0aGUgaW5wdXQgYWxwaGEKLSAgICAqIGhlcmUgdG8gYWxzbyBza2lwIHRoZSAxNi1iaXQgc21hbGwgYWxwaGEgY2FzZXMuCi0gICAgKi8KLSAgIGlmICh0cmFuc2Zvcm0tPm91dHB1dF84Yml0ICYmIHBpeGVsX2NhbGMuYSA9PSAwICYmIHBpeGVsX291dC5hID09IDApCi0gICAgICByZXR1cm4gMTsKLQotICAgLyogQ2hlY2sgZm9yIGFscGhhIGVycm9ycyBmaXJzdDsgYW4gYWxwaGEgZXJyb3IgY2FuIGRhbWFnZSB0aGUgY29tcG9uZW50cyB0b28KLSAgICAqIHNvIGF2b2lkIHNwdXJpb3VzIGNoZWNrcyBvbiBjb21wb25lbnRzIGlmIG9uZSBpcyBmb3VuZC4KLSAgICAqLwotICAgZXJybXNnID0gTlVMTDsKLSAgIHsKLSAgICAgIGludCBlcnJfYSA9IGFicyhwaXhlbF9jYWxjLmEtcGl4ZWxfb3V0LmEpOwotCi0gICAgICBpZiAoZXJyX2EgPiB0cmFuc2Zvcm0tPmVycm9yWzNdKQotICAgICAgewotICAgICAgICAgLyogSWYgYWNjdW11bGF0aW5nIGNoZWNrIHRoZSBjb21wb25lbnRzIHRvbyAqLwotICAgICAgICAgaWYgKHRyYW5zZm9ybS0+YWNjdW11bGF0ZSkKLSAgICAgICAgICAgIHRyYW5zZm9ybS0+ZXJyb3JbM10gPSAocG5nX3VpbnRfMTYpZXJyX2E7Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVycm1zZyA9ICJhbHBoYSI7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIE5vdyBpZiAqZWl0aGVyKiBvZiB0aGUgb3V0cHV0IGFscGhhcyBhcmUgMCBidXQgYWxwaGEgaXMgd2l0aGluIHRvbGVyYW5jZQotICAgICogZWxpbWluYXRlIHRoZSA4LWJpdCBjb21wb25lbnQgY29tcGFyaXNvbi4KLSAgICAqLwotICAgaWYgKGVycm1zZyA9PSBOVUxMICYmIHRyYW5zZm9ybS0+b3V0cHV0XzhiaXQgJiYKLSAgICAgIChwaXhlbF9jYWxjLmEgPT0gMCB8fCBwaXhlbF9vdXQuYSA9PSAwKSkKLSAgICAgIHJldHVybiAxOwotCi0gICBpZiAoZXJybXNnID09IE5VTEwpIC8qIGVsc2UganVzdCBzaWduYWwgYW4gYWxwaGEgZXJyb3IgKi8KLSAgIHsKLSAgICAgIGludCBlcnJfciA9IGFicyhwaXhlbF9jYWxjLnIgLSBwaXhlbF9vdXQucik7Ci0gICAgICBpbnQgZXJyX2cgPSBhYnMocGl4ZWxfY2FsYy5nIC0gcGl4ZWxfb3V0LmcpOwotICAgICAgaW50IGVycl9iID0gYWJzKHBpeGVsX2NhbGMuYiAtIHBpeGVsX291dC5iKTsKLSAgICAgIGludCBsaW1pdDsKLQotICAgICAgaWYgKChlcnJfciB8IGVycl9nIHwgZXJyX2IpID09IDApCi0gICAgICAgICByZXR1cm4gMTsgLyogZXhhY3QgbWF0Y2ggKi8KLQotICAgICAgLyogTWlzbWF0Y2ggb24gYSBjb21wb25lbnQsIGNoZWNrIHRoZSBpbnB1dCBhbHBoYSAqLwotICAgICAgaWYgKHBpeGVsX2luLmEgPj0gdHJhbnNmb3JtLT5pbl9vcGFxdWUpCi0gICAgICB7Ci0gICAgICAgICBlcnJtc2cgPSAib3BhcXVlIGNvbXBvbmVudCI7Ci0gICAgICAgICBsaW1pdCA9IDI7IC8qIG9wYXF1ZSAqLwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChwaXhlbF9pbi5hID4gMCkKLSAgICAgIHsKLSAgICAgICAgIGVycm1zZyA9ICJhbHBoYSBjb21wb25lbnQiOwotICAgICAgICAgbGltaXQgPSAxOyAvKiBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZXJybXNnID0gInRyYW5zcGFyZW50IGNvbXBvbmVudCAoYmFja2dyb3VuZCkiOwotICAgICAgICAgbGltaXQgPSAwOyAvKiB0cmFuc3BhcmVudCAqLwotICAgICAgfQotCi0gICAgICBtYXhlcnIgPSBlcnJfcjsKLSAgICAgIGlmIChtYXhlcnIgPCBlcnJfZykgbWF4ZXJyID0gZXJyX2c7Ci0gICAgICBpZiAobWF4ZXJyIDwgZXJyX2IpIG1heGVyciA9IGVycl9iOwotCi0gICAgICBpZiAobWF4ZXJyIDw9IHRyYW5zZm9ybS0+ZXJyb3JbbGltaXRdKQotICAgICAgICAgcmV0dXJuIDE7IC8qIHdpdGhpbiB0aGUgZXJyb3IgbGltaXRzICovCi0KLSAgICAgIC8qIEhhbmRsZSBhIGNvbXBvbmVudCBtaXMtbWF0Y2g7IGxvZyBpdCwganVzdCByZXR1cm4gYW4gZXJyb3IgY29kZSwgb3IKLSAgICAgICAqIGFjY3VtdWxhdGUgaXQuCi0gICAgICAgKi8KLSAgICAgIGlmICh0cmFuc2Zvcm0tPmFjY3VtdWxhdGUpCi0gICAgICB7Ci0gICAgICAgICB0cmFuc2Zvcm0tPmVycm9yW2xpbWl0XSA9IChwbmdfdWludF8xNiltYXhlcnI7Ci0gICAgICAgICByZXR1cm4gMTsgLyogdG8gY2F1c2UgdGhlIGNhbGxlciB0byBrZWVwIGdvaW5nICovCi0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIEZhaWx1cmUgdG8gbWF0Y2ggYW5kIG5vdCBhY2N1bXVsYXRpbmcsIHNvIHRoZSBlcnJvciBtdXN0IGJlIGxvZ2dlZC4gKi8KLSAgIHJldHVybiBsb2dwaXhlbCh0cmFuc2Zvcm0sIHgsIHksICZwaXhlbF9pbiwgJnBpeGVsX2NhbGMsICZwaXhlbF9vdXQsIGVycm1zZyk7Ci19Ci0KLXN0YXRpYyBwbmdfYnl0ZQotY29tcG9uZW50X2xvYyhwbmdfYnl0ZSBsb2NbNF0sIHBuZ191aW50XzMyIGZvcm1hdCkKLXsKLSAgIC8qIEdpdmVuIGEgZm9ybWF0IHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCB0aGUgbG9jYXRpb24gb2YKLSAgICAqIGVhY2ggY2hhbm5lbC4KLSAgICAqCi0gICAgKiBUaGUgbWFzayAnbG9jJyBjb250YWlucyB0aGUgY29tcG9uZW50IG9mZnNldCBvZiB0aGUgY2hhbm5lbHMgaW4gdGhlCi0gICAgKiBmb2xsb3dpbmcgb3JkZXIuICBOb3RlIHRoYXQgaWYgJ2Zvcm1hdCcgaXMgZ3JheXNjYWxlIHRoZSBlbnRyaWVzIDEtMyBtdXN0Ci0gICAgKiBhbGwgY29udGFpbiB0aGUgbG9jYXRpb24gb2YgdGhlIGdyYXkgY2hhbm5lbC4KLSAgICAqCi0gICAgKiAwOiBhbHBoYQotICAgICogMTogcmVkIG9yIGdyYXkKLSAgICAqIDI6IGdyZWVuIG9yIGdyYXkKLSAgICAqIDM6IGJsdWUgb3IgZ3JheQotICAgICovCi0gICBwbmdfYnl0ZSBjaGFubmVsczsKLQotICAgaWYgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikKLSAgIHsKLSAgICAgIGNoYW5uZWxzID0gMzsKLQotICAgICAgbG9jWzJdID0gMTsKLQotIyAgICAgaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECi0gICAgICAgICBpZiAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0JHUikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGxvY1sxXSA9IDI7Ci0gICAgICAgICAgICBsb2NbM10gPSAwOwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0jICAgICBlbmRpZgotICAgICAgewotICAgICAgICAgbG9jWzFdID0gMDsKLSAgICAgICAgIGxvY1szXSA9IDI7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGNoYW5uZWxzID0gMTsKLSAgICAgIGxvY1sxXSA9IGxvY1syXSA9IGxvY1szXSA9IDA7Ci0gICB9Ci0KLSAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpCi0gICB7Ci0jICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKLSAgICAgICAgIGlmIChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUKQotICAgICAgICAgewotICAgICAgICAgICAgbG9jWzBdID0gMDsKLSAgICAgICAgICAgICsrbG9jWzFdOwotICAgICAgICAgICAgKytsb2NbMl07Ci0gICAgICAgICAgICArK2xvY1szXTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotIyAgICAgZW5kaWYKLSAgICAgICAgIGxvY1swXSA9IGNoYW5uZWxzOwotCi0gICAgICArK2NoYW5uZWxzOwotICAgfQotCi0gICBlbHNlCi0gICAgICBsb2NbMF0gPSA0OyAvKiBub3QgcHJlc2VudCAqLwotCi0gICByZXR1cm4gY2hhbm5lbHM7Ci19Ci0KLS8qIENvbXBhcmUgdHdvIGltYWdlcywgdGhlIG9yaWdpbmFsICdhJywgd2hpY2ggd2FzIHdyaXR0ZW4gb3V0IHRoZW4gcmVhZCBiYWNrIGluCi0gKiB0byAqIGdpdmUgaW1hZ2UgJ2InLiAgVGhlIGZvcm1hdHMgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkLgotICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX3R3b19pbWFnZXMoSW1hZ2UgKmEsIEltYWdlICpiLCBpbnQgdmlhX2xpbmVhciwKLSAgIHBuZ19jb25zdF9jb2xvcnAgYmFja2dyb3VuZCkKLXsKLSAgIHB0cmRpZmZfdCBzdHJpZGVhID0gYS0+c3RyaWRlOwotICAgcHRyZGlmZl90IHN0cmlkZWIgPSBiLT5zdHJpZGU7Ci0gICBwbmdfY29uc3RfYnl0ZXAgcm93YSA9IGEtPmJ1ZmZlcisxNjsKLSAgIHBuZ19jb25zdF9ieXRlcCByb3diID0gYi0+YnVmZmVyKzE2OwotICAgY29uc3QgcG5nX3VpbnRfMzIgd2lkdGggPSBhLT5pbWFnZS53aWR0aDsKLSAgIGNvbnN0IHBuZ191aW50XzMyIGhlaWdodCA9IGEtPmltYWdlLmhlaWdodDsKLSAgIGNvbnN0IHBuZ191aW50XzMyIGZvcm1hdGEgPSBhLT5pbWFnZS5mb3JtYXQ7Ci0gICBjb25zdCBwbmdfdWludF8zMiBmb3JtYXRiID0gYi0+aW1hZ2UuZm9ybWF0OwotICAgY29uc3QgdW5zaWduZWQgaW50IGFfc2FtcGxlID0gUE5HX0lNQUdFX1NBTVBMRV9TSVpFKGZvcm1hdGEpOwotICAgY29uc3QgdW5zaWduZWQgaW50IGJfc2FtcGxlID0gUE5HX0lNQUdFX1NBTVBMRV9TSVpFKGZvcm1hdGIpOwotICAgaW50IGFscGhhX2FkZGVkLCBhbHBoYV9yZW1vdmVkOwotICAgaW50IGJjaGFubmVsczsKLSAgIGludCBidG9hWzRdOwotICAgcG5nX3VpbnRfMzIgeTsKLSAgIFRyYW5zZm9ybSB0cjsKLQotICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOiAqLwotICAgaWYgKHdpZHRoICE9IGItPmltYWdlLndpZHRoIHx8IGhlaWdodCAhPSBiLT5pbWFnZS5oZWlnaHQpCi0gICAgICByZXR1cm4gbG9nZXJyb3IoYSwgYS0+ZmlsZV9uYW1lLCAiOiB3aWR0aCB4IGhlaWdodCBjaGFuZ2VkOiAiLAotICAgICAgICAgYi0+ZmlsZV9uYW1lKTsKLQotICAgLyogU2V0IHVwIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgdHJhbnNmb3JtICovCi0gICB0cmFuc2Zvcm1fZnJvbV9mb3JtYXRzKCZ0ciwgYSwgYiwgYmFja2dyb3VuZCwgdmlhX2xpbmVhcik7Ci0KLSAgIC8qIEZpbmQgdGhlIGZpcnN0IHJvdyBhbmQgaW50ZXItcm93IHNwYWNlLiAqLwotICAgaWYgKCEoZm9ybWF0YSAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgJiYKLSAgICAgIChmb3JtYXRhICYgUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUikpCi0gICAgICBzdHJpZGVhICo9IDI7Ci0KLSAgIGlmICghKGZvcm1hdGIgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApICYmCi0gICAgICAoZm9ybWF0YiAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpKQotICAgICAgc3RyaWRlYiAqPSAyOwotCi0gICBpZiAoc3RyaWRlYSA8IDApIHJvd2EgKz0gKGhlaWdodC0xKSAqICgtc3RyaWRlYSk7Ci0gICBpZiAoc3RyaWRlYiA8IDApIHJvd2IgKz0gKGhlaWdodC0xKSAqICgtc3RyaWRlYik7Ci0KLSAgIC8qIEZpcnN0IHNob3J0Y3V0IHRoZSB0d28gY29sb3JtYXAgY2FzZSBieSBjb21wYXJpbmcgdGhlIGltYWdlIGRhdGE7IGlmIGl0Ci0gICAgKiBtYXRjaGVzIHRoZW4gd2UgZXhwZWN0IHRoZSBjb2xvcm1hcHMgdG8gbWF0Y2gsIGFsdGhvdWdoIHRoaXMgaXMgbm90Ci0gICAgKiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBmb3IgYW4gaW1hZ2UgbWF0Y2guICBJZiB0aGUgY29sb3JtYXBzIGZhaWwgdG8gbWF0Y2gKLSAgICAqIHRoZW4gdGhlcmUgaXMgYSBwcm9ibGVtIGluIGxpYnBuZy4KLSAgICAqLwotICAgaWYgKGZvcm1hdGEgJiBmb3JtYXRiICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKQotICAgewotICAgICAgLyogT25seSBjaGVjayBjb2xvcm1hcCBlbnRyaWVzIHRoYXQgYWN0dWFsbHkgZXhpc3Q7ICovCi0gICAgICBwbmdfY29uc3RfYnl0ZXAgcHBhLCBwcGI7Ci0gICAgICBpbnQgbWF0Y2g7Ci0gICAgICBwbmdfYnl0ZSBpbl91c2VbMjU2XSwgYW1heCA9IDAsIGJtYXggPSAwOwotCi0gICAgICBtZW1zZXQoaW5fdXNlLCAwLCBzaXplb2YgaW5fdXNlKTsKLQotICAgICAgcHBhID0gcm93YTsKLSAgICAgIHBwYiA9IHJvd2I7Ci0KLSAgICAgIC8qIERvIHRoaXMgdGhlIHNsb3cgd2F5IHRvIGFjY3VtdWxhdGUgdGhlICdpbl91c2UnIGZsYWdzLCBkb24ndCBicmVhayBvdXQKLSAgICAgICAqIG9mIHRoZSBsb29wIHVudGlsIHRoZSBlbmQ7IHRoaXMgdmFsaWRhdGVzIHRoZSBjb2xvci1tYXBwZWQgZGF0YSB0bwotICAgICAgICogZW5zdXJlIGFsbCBwaXhlbHMgYXJlIHZhbGlkIGNvbG9yLW1hcCBpbmRleGVzLgotICAgICAgICovCi0gICAgICBmb3IgKHk9MCwgbWF0Y2g9MTsgeTxoZWlnaHQgJiYgbWF0Y2g7ICsreSwgcHBhICs9IHN0cmlkZWEsIHBwYiArPSBzdHJpZGViKQotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgeDsKLQotICAgICAgICAgZm9yICh4PTA7IHg8d2lkdGg7ICsreCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19ieXRlIGJ2YWwgPSBwcGJbeF07Ci0gICAgICAgICAgICBwbmdfYnl0ZSBhdmFsID0gcHBhW3hdOwotCi0gICAgICAgICAgICBpZiAoYnZhbCA+IGJtYXgpCi0gICAgICAgICAgICAgICBibWF4ID0gYnZhbDsKLQotICAgICAgICAgICAgaWYgKGJ2YWwgIT0gYXZhbCkKLSAgICAgICAgICAgICAgIG1hdGNoID0gMDsKLQotICAgICAgICAgICAgaW5fdXNlW2F2YWxdID0gMTsKLSAgICAgICAgICAgIGlmIChhdmFsID4gYW1heCkKLSAgICAgICAgICAgICAgIGFtYXggPSBhdmFsOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBJZiB0aGUgYnVmZmVycyBtYXRjaCB0aGVuIHRoZSBjb2xvcm1hcHMgbXVzdCB0b28uICovCi0gICAgICBpZiAobWF0Y2gpCi0gICAgICB7Ci0gICAgICAgICAvKiBEbyB0aGUgY29sb3ItbWFwcyBtYXRjaCwgZW50cnkgYnkgZW50cnk/ICBPbmx5IGNoZWNrIHRoZSAnaW5fdXNlJwotICAgICAgICAgICogZW50cmllcy4gIEFuIGVycm9yIGhlcmUgc2hvdWxkIGJlIGxvZ2dlZCBhcyBhIGNvbG9yLW1hcCBlcnJvci4KLSAgICAgICAgICAqLwotICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIGFfY21hcCA9IChwbmdfY29uc3RfYnl0ZXApYS0+Y29sb3JtYXA7Ci0gICAgICAgICBwbmdfY29uc3RfYnl0ZXAgYl9jbWFwID0gKHBuZ19jb25zdF9ieXRlcCliLT5jb2xvcm1hcDsKLSAgICAgICAgIGludCByZXN1bHQgPSAxOyAvKiBtYXRjaCBieSBkZWZhdWx0ICovCi0KLSAgICAgICAgIC8qIFRoaXMgaXMgdXNlZCBpbiBsb2dwaXhlbCB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UgY29ycmVjdC4gKi8KLSAgICAgICAgIHRyLmlzX3BhbGV0dGUgPSAxOwotCi0gICAgICAgICBmb3IgKHk9MDsgeTwyNTY7ICsreSwgYV9jbWFwICs9IGFfc2FtcGxlLCBiX2NtYXAgKz0gYl9zYW1wbGUpCi0gICAgICAgICAgICBpZiAoaW5fdXNlW3ldKQotICAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIGNvbG9ybWFwIGVudHJpZXMgc2hvdWxkIGJlIHZhbGlkLCBidXQgYmVjYXVzZSBsaWJwbmcgZG9lc24ndAotICAgICAgICAgICAgICogZG8gYW55IGNoZWNraW5nIGF0IHByZXNlbnQgdGhlIG9yaWdpbmFsIGltYWdlIG1heSBjb250YWluIGludmFsaWQKLSAgICAgICAgICAgICAqIHBpeGVsIHZhbHVlcy4gIFRoZXNlIGNhdXNlIGFuIGVycm9yIGhlcmUgKGF0IHByZXNlbnQpIHVubGVzcwotICAgICAgICAgICAgICogYWNjdW11bGF0aW5nIGVycm9ycyBpbiB3aGljaCBjYXNlIHRoZSBwcm9ncmFtIGp1c3QgaWdub3JlcyB0aGVtLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoeSA+PSBhLT5pbWFnZS5jb2xvcm1hcF9lbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKChhLT5vcHRzICYgQUNDVU1VTEFURSkgPT0gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNoYXIgcGluZGV4WzldOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZihwaW5kZXgsICIlbHVbJWx1XSIsICh1bnNpZ25lZCBsb25nKXksCi0gICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylhLT5pbWFnZS5jb2xvcm1hcF9lbnRyaWVzKTsKLSAgICAgICAgICAgICAgICAgIGxvZ2Vycm9yKGEsIGEtPmZpbGVfbmFtZSwgIjogYmFkIHBpeGVsIGluZGV4OiAiLCBwaW5kZXgpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAoeSA+PSBiLT5pbWFnZS5jb2xvcm1hcF9lbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKChiLT5vcHRzICYgQUNDVU1VTEFURSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNoYXIgcGluZGV4WzldOwotICAgICAgICAgICAgICAgICAgc3ByaW50ZihwaW5kZXgsICIlbHVbJWx1XSIsICh1bnNpZ25lZCBsb25nKXksCi0gICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyliLT5pbWFnZS5jb2xvcm1hcF9lbnRyaWVzKTsKLSAgICAgICAgICAgICAgICAgIGxvZ2Vycm9yKGIsIGItPmZpbGVfbmFtZSwgIjogYmFkIHBpeGVsIGluZGV4OiAiLCBwaW5kZXgpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQWxsIHRoZSBtaXNtYXRjaGVzIGFyZSBsb2dnZWQgaGVyZTsgdGhlcmUgY2FuIG9ubHkgYmUgMjU2ISAqLwotICAgICAgICAgICAgZWxzZSBpZiAoIWNtcHBpeGVsKCZ0ciwgYV9jbWFwLCBiX2NtYXAsIDAsIHkpKQotICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogSWYgcmVxZXN0ZWQgY29weSB0aGUgZXJyb3IgdmFsdWVzIGJhY2sgZnJvbSB0aGUgVHJhbnNmb3JtLiAqLwotICAgICAgICAgaWYgKGEtPm9wdHMgJiBBQ0NVTVVMQVRFKQotICAgICAgICAgewotICAgICAgICAgICAgdHIuZXJyb3JfcHRyWzBdID0gdHIuZXJyb3JbMF07Ci0gICAgICAgICAgICB0ci5lcnJvcl9wdHJbMV0gPSB0ci5lcnJvclsxXTsKLSAgICAgICAgICAgIHRyLmVycm9yX3B0clsyXSA9IHRyLmVycm9yWzJdOwotICAgICAgICAgICAgdHIuZXJyb3JfcHRyWzNdID0gdHIuZXJyb3JbM107Ci0gICAgICAgICAgICByZXN1bHQgPSAxOyAvKiBmb3JjZSBhIGNvbnRpbnVlICovCi0gICAgICAgICB9Ci0KLSAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGVsc2UgdGhlIGltYWdlIGJ1ZmZlcnMgZG9uJ3QgbWF0Y2ggcGl4ZWwtd2lzZSBzbyBjb21wYXJlIHNhbXBsZSB2YWx1ZXMKLSAgICAgICAqIGluc3RlYWQsIGJ1dCBmaXJzdCB2YWxpZGF0ZSB0aGF0IHRoZSBwaXhlbCBpbmRleGVzIGFyZSBpbiByYW5nZSAoYnV0Ci0gICAgICAgKiBvbmx5IGlmIG5vdCBhY2N1bXVsYXRpbmcsIHdoZW4gdGhlIGVycm9yIGlzIGlnbm9yZWQuKQotICAgICAgICovCi0gICAgICBlbHNlIGlmICgoYS0+b3B0cyAmIEFDQ1VNVUxBVEUpID09IDApCi0gICAgICB7Ci0gICAgICAgICAvKiBDaGVjayB0aGUgb3JpZ2luYWwgaW1hZ2UgZmlyc3QsCi0gICAgICAgICAgKiBUT0RPOiBkZWFsIHdpdGggaW5wdXQgaW1hZ2VzIHdpdGggYmFkIHBpeGVsIHZhbHVlcz8KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGFtYXggPj0gYS0+aW1hZ2UuY29sb3JtYXBfZW50cmllcykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgcGluZGV4WzldOwotICAgICAgICAgICAgc3ByaW50ZihwaW5kZXgsICIlZFslbHVdIiwgYW1heCwKLSAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWEtPmltYWdlLmNvbG9ybWFwX2VudHJpZXMpOwotICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGEsIGEtPmZpbGVfbmFtZSwgIjogYmFkIHBpeGVsIGluZGV4OiAiLCBwaW5kZXgpOwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlIGlmIChibWF4ID49IGItPmltYWdlLmNvbG9ybWFwX2VudHJpZXMpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIHBpbmRleFs5XTsKLSAgICAgICAgICAgIHNwcmludGYocGluZGV4LCAiJWRbJWx1XSIsIGJtYXgsCi0gICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyliLT5pbWFnZS5jb2xvcm1hcF9lbnRyaWVzKTsKLSAgICAgICAgICAgIHJldHVybiBsb2dlcnJvcihiLCBiLT5maWxlX25hbWUsICI6IGJhZCBwaXhlbCBpbmRleDogIiwgcGluZGV4KTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgLyogV2UgY2FuIGRpcmVjdGx5IGNvbXBhcmUgcGl4ZWwgdmFsdWVzIHdpdGhvdXQgdGhlIG5lZWQgdG8gdXNlIHRoZSByZWFkCi0gICAgKiBvciB0cmFuc2Zvcm0gc3VwcG9ydCAoaS5lLiBhIG1lbW9yeSBjb21wYXJlKSBpZjoKLSAgICAqCi0gICAgKiAxKSBUaGUgYml0IGRlcHRoIGhhcyBub3QgY2hhbmdlZC4KLSAgICAqIDIpIFJHQiB0byBncmF5c2NhbGUgaGFzIG5vdCBiZWVuIGRvbmUgKHRoZSByZXZlcnNlIGlzIG9rOyB3ZSBqdXN0IGNvbXBhcmUKLSAgICAqICAgIHRoZSB0aHJlZSBSR0IgdmFsdWVzIHRvIHRoZSBvcmlnaW5hbCBncmF5c2NhbGUuKQotICAgICogMykgQW4gYWxwaGEgY2hhbm5lbCBoYXMgbm90IGJlZW4gcmVtb3ZlZCBmcm9tIGFuIDgtYml0IGZvcm1hdCwgb3IgdGhlCi0gICAgKiAgICA4LWJpdCBhbHBoYSB2YWx1ZSBvZiB0aGUgcGl4ZWwgd2FzIDI1NSAob3BhcXVlKS4KLSAgICAqCi0gICAgKiBJZiBhbiBhbHBoYSBjaGFubmVsIGhhcyBiZWVuICphZGRlZCogdGhlbiBpdCBtdXN0IGhhdmUgdGhlIHJlbGV2YW50IG9wYXF1ZQotICAgICogdmFsdWUgKDI1NSBvciA2NTUzNSkuCi0gICAgKgotICAgICogVGhlIGZpc3QgdHdvIHRoZSB0ZXN0cyAoaW4gdGhlIG9yZGVyIGdpdmVuIGFib3ZlKSAodXNpbmcgdGhlIGJvb2xlYW4KLSAgICAqIGVxdWl2YWxlbmNlICFhICYmICFiID09ICEoYSB8fCBiKSkKLSAgICAqLwotICAgaWYgKCEoKChmb3JtYXRhIF4gZm9ybWF0YikgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSB8Ci0gICAgICAoZm9ybWF0YSAmIChmb3JtYXRiIF4gUE5HX0ZPUk1BVF9GTEFHX0NPTE9SKSAmIFBOR19GT1JNQVRfRkxBR19DT0xPUikpKQotICAgewotICAgICAgLyogV2FzIGFuIGFscGhhIGNoYW5uZWwgY2hhbmdlZD8gKi8KLSAgICAgIGNvbnN0IHBuZ191aW50XzMyIGFscGhhX2NoYW5nZWQgPSAoZm9ybWF0YSBeIGZvcm1hdGIpICYKLSAgICAgICAgIFBOR19GT1JNQVRfRkxBR19BTFBIQTsKLQotICAgICAgLyogV2FzIGFuIGFscGhhIGNoYW5uZWwgcmVtb3ZlZD8gIChUaGUgdGhpcmQgdGVzdC4pICBJZiBzbyB0aGUgZGlyZWN0Ci0gICAgICAgKiBjb21wYXJpc29uIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIGlucHV0IGFscGhhIGlzIG9wYXF1ZS4KLSAgICAgICAqLwotICAgICAgYWxwaGFfcmVtb3ZlZCA9IChmb3JtYXRhICYgYWxwaGFfY2hhbmdlZCkgIT0gMDsKLQotICAgICAgLyogV2FzIGFuIGFscGhhIGNoYW5uZWwgYWRkZWQ/ICovCi0gICAgICBhbHBoYV9hZGRlZCA9IChmb3JtYXRiICYgYWxwaGFfY2hhbmdlZCkgIT0gMDsKLQotICAgICAgLyogVGhlIGNoYW5uZWxzIG1heSBoYXZlIGJlZW4gbW92ZWQgYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0LCB0aGlzIGZpbmRzCi0gICAgICAgKiBvdXQgaG93LCByZWNvcmRpbmcgdGhlIHJlc3VsdCBpbiB0aGUgYnRvYSBhcnJheSwgd2hpY2ggc2F5cyB3aGVyZSBpbgotICAgICAgICogJ2EnIHRvIGZpbmQgZWFjaCBjaGFubmVsIG9mICdiJy4gIElmIGFscGhhIHdhcyBhZGRlZCB0aGVuIGJ0b2FbYWxwaGFdCi0gICAgICAgKiBlbmRzIHVwIGFzIDQgKGFuZCBpcyBub3QgdXNlZC4pCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgIGludCBpOwotICAgICAgICAgcG5nX2J5dGUgYWxvY1s0XTsKLSAgICAgICAgIHBuZ19ieXRlIGJsb2NbNF07Ci0KLSAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgb25seSBpZiB0aGUgZm9ybWF0cyBtYXRjaCwgZXhjZXB0IHRoYXQKLSAgICAgICAgICAqICdiY2hhbm5lbHMnIGlzIGEgZmxhZyBmb3IgbWF0Y2hpbmcgZm9ybWF0cy4gIGJ0b2FbeF0gc2F5cywgZm9yIGVhY2gKLSAgICAgICAgICAqIGNoYW5uZWwgaW4gYiwgd2hlcmUgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBhLCBmb3IgdGhlCi0gICAgICAgICAgKiBiY2hhbm5lbHMuICBhY2hhbm5lbHMgbWF5IGJlIGRpZmZlcmVudCBmb3IgYSBncmF5IHRvIHJnYiB0cmFuc2Zvcm0KLSAgICAgICAgICAqIChhIHdpbGwgYmUgMSBvciAyLCBiIHdpbGwgYmUgMyBvciA0IGNoYW5uZWxzLikKLSAgICAgICAgICAqLwotICAgICAgICAgKHZvaWQpY29tcG9uZW50X2xvYyhhbG9jLCBmb3JtYXRhKTsKLSAgICAgICAgIGJjaGFubmVscyA9IGNvbXBvbmVudF9sb2MoYmxvYywgZm9ybWF0Yik7Ci0KLSAgICAgICAgIC8qIEhlbmNlIHRoZSBidG9hIGFycmF5LiAqLwotICAgICAgICAgZm9yIChpPTA7IGk8NDsgKytpKSBpZiAoYmxvY1tpXSA8IDQpCi0gICAgICAgICAgICBidG9hW2Jsb2NbaV1dID0gYWxvY1tpXTsgLyogbWF5IGJlICc0JyBmb3IgYWxwaGEgKi8KLQotICAgICAgICAgaWYgKGFscGhhX2FkZGVkKQotICAgICAgICAgICAgYWxwaGFfYWRkZWQgPSBibG9jWzBdOyAvKiBsb2NhdGlvbiBvZiBhbHBoYSBjaGFubmVsIGluIGltYWdlIGIgKi8KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgYWxwaGFfYWRkZWQgPSA0OyAvKiBXb24ndCBtYXRjaCBhbiBpbWFnZSBiIGNoYW5uZWwgKi8KLQotICAgICAgICAgaWYgKGFscGhhX3JlbW92ZWQpCi0gICAgICAgICAgICBhbHBoYV9yZW1vdmVkID0gYWxvY1swXTsgLyogbG9jYXRpb24gb2YgYWxwaGEgY2hhbm5lbCBpbiBpbWFnZSBhICovCi0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFscGhhX3JlbW92ZWQgPSA0OwotICAgICAgfQotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICAvKiBEaXJlY3QgY29tcGFyZSBpcyBub3QgcG9zc2libGUsIGNhbmNlbCBvdXQgYWxsIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsCi0gICAgICAgKiB2YXJpYWJsZXMuCi0gICAgICAgKi8KLSAgICAgIGJjaGFubmVscyA9IDA7Ci0gICAgICBhbHBoYV9yZW1vdmVkID0gYWxwaGFfYWRkZWQgPSA0OwotICAgICAgYnRvYVszXSA9IGJ0b2FbMl0gPSBidG9hWzFdID0gYnRvYVswXSA9IDQ7IC8qIDQgPT0gbm90IHByZXNlbnQgKi8KLSAgIH0KLQotICAgZm9yICh5PTA7IHk8aGVpZ2h0OyArK3ksIHJvd2EgKz0gc3RyaWRlYSwgcm93YiArPSBzdHJpZGViKQotICAgewotICAgICAgcG5nX2NvbnN0X2J5dGVwIHBwYSwgcHBiOwotICAgICAgcG5nX3VpbnRfMzIgeDsKLQotICAgICAgZm9yICh4PTAsIHBwYT1yb3dhLCBwcGI9cm93YjsgeDx3aWR0aDsgKyt4KQotICAgICAgewotICAgICAgICAgcG5nX2NvbnN0X2J5dGVwIHBzYSwgcHNiOwotCi0gICAgICAgICBpZiAoZm9ybWF0YSAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkKLSAgICAgICAgICAgIHBzYSA9IChwbmdfY29uc3RfYnl0ZXApYS0+Y29sb3JtYXAgKyBhX3NhbXBsZSAqICpwcGErKzsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBzYSA9IHBwYSwgcHBhICs9IGFfc2FtcGxlOwotCi0gICAgICAgICBpZiAoZm9ybWF0YiAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkKLSAgICAgICAgICAgIHBzYiA9IChwbmdfY29uc3RfYnl0ZXApYi0+Y29sb3JtYXAgKyBiX3NhbXBsZSAqICpwcGIrKzsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBzYiA9IHBwYiwgcHBiICs9IGJfc2FtcGxlOwotCi0gICAgICAgICAvKiBEbyB0aGUgZmFzdCB0ZXN0IGlmIHBvc3NpYmxlLiAqLwotICAgICAgICAgaWYgKGJjaGFubmVscykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGVhY2ggJ2InIGNoYW5uZWwgYWdhaW5zdCBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgJ2EnCi0gICAgICAgICAgICAgKiBjaGFubmVsIG9yIHRoZSBvcGFxdWUgYWxwaGEgdmFsdWUsIGFzIGFwcHJvcHJpYXRlLiAgSWYKLSAgICAgICAgICAgICAqIGFscGhhX3JlbW92ZWQgdmFsdWUgaXMgc2V0IChub3QgNCkgdGhlbiBhbHNvIGRvIHRoaXMgb25seSBpZiB0aGUKLSAgICAgICAgICAgICAqICdhJyBhbHBoYSBjaGFubmVsIChhbHBoYV9yZW1vdmVkKSBpcyBvcGFxdWU7IG9ubHkgcmVsZXZhbnQgZm9yCi0gICAgICAgICAgICAgKiB0aGUgOC1iaXQgY2FzZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGZvcm1hdGIgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSAvKiAxNi1iaXQgY2hlY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwbmdfY29uc3RfdWludF8xNnAgcHVhID0gYWxpZ25jYXN0Y29uc3QocG5nX2NvbnN0X3VpbnRfMTZwLCBwc2EpOwotICAgICAgICAgICAgICAgcG5nX2NvbnN0X3VpbnRfMTZwIHB1YiA9IGFsaWduY2FzdGNvbnN0KHBuZ19jb25zdF91aW50XzE2cCwgcHNiKTsKLQotICAgICAgICAgICAgICAgc3dpdGNoIChiY2hhbm5lbHMpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICBpZiAocHVhW2J0b2FbM11dICE9IHB1YlszXSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICBpZiAocHVhW2J0b2FbMl1dICE9IHB1YlsyXSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICBpZiAocHVhW2J0b2FbMV1dICE9IHB1YlsxXSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICBpZiAocHVhW2J0b2FbMF1dICE9IHB1YlswXSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGFfYWRkZWQgIT0gNCAmJiBwdWJbYWxwaGFfYWRkZWRdICE9IDY1NTM1KSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB4IGxvb3AgKi8KLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogaW1wb3NzaWJsZSAqLwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChhbHBoYV9yZW1vdmVkID09IDQgfHwgcHNhW2FscGhhX3JlbW92ZWRdID09IDI1NSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN3aXRjaCAoYmNoYW5uZWxzKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICAgaWYgKHBzYVtidG9hWzNdXSAhPSBwc2JbM10pIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgaWYgKHBzYVtidG9hWzJdXSAhPSBwc2JbMl0pIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgaWYgKHBzYVtidG9hWzFdXSAhPSBwc2JbMV0pIGJyZWFrOwotICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgaWYgKHBzYVtidG9hWzBdXSAhPSBwc2JbMF0pIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhX2FkZGVkICE9IDQgJiYgcHNiW2FscGhhX2FkZGVkXSAhPSAyNTUpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIHggbG9vcCAqLwotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBpbXBvc3NpYmxlICovCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIElmIHdlIGdldCB0byBoZXJlIHRoZSBmYXN0IG1hdGNoIGZhaWxlZDsgZG8gdGhlIHNsb3cgbWF0Y2ggZm9yIHRoaXMKLSAgICAgICAgICAqIHBpeGVsLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoIWNtcHBpeGVsKCZ0ciwgcHNhLCBwc2IsIHgsIHkpICYmIChhLT5vcHRzICYgS0VFUF9HT0lORykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOyAvKiBlcnJvciBjYXNlICovCi0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIElmIHJlcWVzdGVkIGNvcHkgdGhlIGVycm9yIHZhbHVlcyBiYWNrIGZyb20gdGhlIFRyYW5zZm9ybS4gKi8KLSAgIGlmIChhLT5vcHRzICYgQUNDVU1VTEFURSkKLSAgIHsKLSAgICAgIHRyLmVycm9yX3B0clswXSA9IHRyLmVycm9yWzBdOwotICAgICAgdHIuZXJyb3JfcHRyWzFdID0gdHIuZXJyb3JbMV07Ci0gICAgICB0ci5lcnJvcl9wdHJbMl0gPSB0ci5lcnJvclsyXTsKLSAgICAgIHRyLmVycm9yX3B0clszXSA9IHRyLmVycm9yWzNdOwotICAgfQotCi0gICByZXR1cm4gMTsKLX0KLQotLyogUmVhZCB0aGUgZmlsZTsgaG93IHRoZSByZWFkIGdldHMgZG9uZSBkZXBlbmRzIG9uIHdoaWNoIG9mIGlucHV0X2ZpbGUgYW5kCi0gKiBpbnB1dF9tZW1vcnkgaGF2ZSBiZWVuIHNldC4KLSAqLwotc3RhdGljIGludAotcmVhZF9maWxlKEltYWdlICppbWFnZSwgcG5nX3VpbnRfMzIgZm9ybWF0LCBwbmdfY29uc3RfY29sb3JwIGJhY2tncm91bmQpCi17Ci0gICBtZW1zZXQoJmltYWdlLT5pbWFnZSwgMCwgc2l6ZW9mIGltYWdlLT5pbWFnZSk7Ci0gICBpbWFnZS0+aW1hZ2UudmVyc2lvbiA9IFBOR19JTUFHRV9WRVJTSU9OOwotCi0gICBpZiAoaW1hZ2UtPmlucHV0X21lbW9yeSAhPSBOVUxMKQotICAgewotICAgICAgaWYgKCFwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeSgmaW1hZ2UtPmltYWdlLCBpbWFnZS0+aW5wdXRfbWVtb3J5LAotICAgICAgICAgaW1hZ2UtPmlucHV0X21lbW9yeV9zaXplKSkKLSAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgIm1lbW9yeSBpbml0OiAiLCBpbWFnZS0+ZmlsZV9uYW1lLCAiIik7Ci0gICB9Ci0KLSMgIGlmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKGltYWdlLT5pbnB1dF9maWxlICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBpZiAoIXBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8oJmltYWdlLT5pbWFnZSwgaW1hZ2UtPmlucHV0X2ZpbGUpKQotICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAic3RkaW8gaW5pdDogIiwgaW1hZ2UtPmZpbGVfbmFtZSwgIiIpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAoIXBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSgmaW1hZ2UtPmltYWdlLCBpbWFnZS0+ZmlsZV9uYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgImZpbGUgaW5pdDogIiwgaW1hZ2UtPmZpbGVfbmFtZSwgIiIpOwotICAgICAgfQotIyAgZWxzZQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAidW5zdXBwb3J0ZWQgZmlsZS9zdGRpbyBpbml0OiAiLAotICAgICAgICAgICAgaW1hZ2UtPmZpbGVfbmFtZSwgIiIpOwotICAgICAgfQotIyAgZW5kaWYKLQotICAgLyogVGhpcyBtdXN0IGJlIHNldCBhZnRlciB0aGUgYmVnaW5fcmVhZCBjYWxsOiAqLwotICAgaWYgKGltYWdlLT5vcHRzICYgc1JHQl8xNkJJVCkKLSAgICAgIGltYWdlLT5pbWFnZS5mbGFncyB8PSBQTkdfSU1BR0VfRkxBR18xNkJJVF9zUkdCOwotCi0gICAvKiBIYXZlIGFuIGluaXRpYWxpemVkIGltYWdlIHdpdGggYWxsIHRoZSBkYXRhIHdlIG5lZWQgcGx1cywgbWF5YmUsIGFuCi0gICAgKiBhbGxvY2F0ZWQgZmlsZSAobXlmaWxlKSBvciBidWZmZXIgKG15YnVmZmVyKSB0aGF0IG5lZWQgdG8gYmUgZnJlZWQuCi0gICAgKi8KLSAgIHsKLSAgICAgIGludCByZXN1bHQ7Ci0gICAgICBwbmdfdWludF8zMiBpbWFnZV9mb3JtYXQ7Ci0KLSAgICAgIC8qIFByaW50IGJvdGggb3JpZ2luYWwgYW5kIG91dHB1dCBmb3JtYXRzLiAqLwotICAgICAgaW1hZ2VfZm9ybWF0ID0gaW1hZ2UtPmltYWdlLmZvcm1hdDsKLQotICAgICAgaWYgKGltYWdlLT5vcHRzICYgVkVSQk9TRSkKLSAgICAgIHsKLSAgICAgICAgIHByaW50ZigiJXMgJWx1IHggJWx1ICVzIC0+ICVzIiwgaW1hZ2UtPmZpbGVfbmFtZSwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWltYWdlLT5pbWFnZS53aWR0aCwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWltYWdlLT5pbWFnZS5oZWlnaHQsCi0gICAgICAgICAgICBmb3JtYXRfbmFtZXNbaW1hZ2VfZm9ybWF0ICYgRk9STUFUX01BU0tdLAotICAgICAgICAgICAgKGZvcm1hdCAmIEZPUk1BVF9OT19DSEFOR0UpICE9IDAgfHwgaW1hZ2UtPmltYWdlLmZvcm1hdCA9PSBmb3JtYXQKLSAgICAgICAgICAgID8gIm5vIGNoYW5nZSIgOiBmb3JtYXRfbmFtZXNbZm9ybWF0ICYgRk9STUFUX01BU0tdKTsKLQotICAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gTlVMTCkKLSAgICAgICAgICAgIHByaW50ZigiIGJhY2tncm91bmQoJWQsJWQsJWQpXG4iLCBiYWNrZ3JvdW5kLT5yZWQsCi0gICAgICAgICAgICAgICBiYWNrZ3JvdW5kLT5ncmVlbiwgYmFja2dyb3VuZC0+Ymx1ZSk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYoIlxuIik7Ci0KLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgfQotCi0gICAgICAvKiAnTk9fQ0hBTkdFJyBjb21iaW5lZCB3aXRoIHRoZSBjb2xvci1tYXAgZmxhZyBmb3JjZXMgdGhlIGJhc2UgZm9ybWF0Ci0gICAgICAgKiBmbGFncyB0byBiZSBzZXQgb24gcmVhZCB0byBlbnN1cmUgdGhhdCB0aGUgb3JpZ2luYWwgcmVwcmVzZW50YXRpb24gaXMKLSAgICAgICAqIG5vdCBsb3N0IGluIHRoZSBwYXNzIHRocm91Z2ggYSBjb2xvcm1hcCBmb3JtYXQuCi0gICAgICAgKi8KLSAgICAgIGlmICgoZm9ybWF0ICYgRk9STUFUX05PX0NIQU5HRSkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSAhPSAwICYmCi0gICAgICAgICAgICAoaW1hZ2VfZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSAhPSAwKQotICAgICAgICAgICAgZm9ybWF0ID0gKGltYWdlX2Zvcm1hdCAmIH5CQVNFX0ZPUk1BVFMpIHwgKGZvcm1hdCAmIEJBU0VfRk9STUFUUyk7Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZvcm1hdCA9IGltYWdlX2Zvcm1hdDsKLSAgICAgIH0KLQotICAgICAgaW1hZ2UtPmltYWdlLmZvcm1hdCA9IGZvcm1hdDsKLQotICAgICAgaW1hZ2UtPnN0cmlkZSA9IFBOR19JTUFHRV9ST1dfU1RSSURFKGltYWdlLT5pbWFnZSkgKyBpbWFnZS0+c3RyaWRlX2V4dHJhOwotICAgICAgYWxsb2NidWZmZXIoaW1hZ2UpOwotCi0gICAgICByZXN1bHQgPSBwbmdfaW1hZ2VfZmluaXNoX3JlYWQoJmltYWdlLT5pbWFnZSwgYmFja2dyb3VuZCwKLSAgICAgICAgIGltYWdlLT5idWZmZXIrMTYsIChwbmdfaW50XzMyKWltYWdlLT5zdHJpZGUsIGltYWdlLT5jb2xvcm1hcCk7Ci0KLSAgICAgIGNoZWNrYnVmZmVyKGltYWdlLCBpbWFnZS0+ZmlsZV9uYW1lKTsKLQotICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgIHJldHVybiBjaGVja29wYXF1ZShpbWFnZSk7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgaW1hZ2UtPmZpbGVfbmFtZSwgIjogaW1hZ2UgcmVhZCBmYWlsZWQiLCAiIik7Ci0gICB9Ci19Ci0KLS8qIFJlYWRzIGZyb20gYSBmaWxlbmFtZSwgd2hpY2ggbXVzdCBiZSBpbiBpbWFnZS0+ZmlsZV9uYW1lLCBidXQgdXNlcwotICogaW1hZ2UtPm9wdHMgdG8gY2hvb3NlIHRoZSBtZXRob2QuICBUaGUgZmlsZSBpcyBhbHdheXMgcmVhZCBpbiBpdHMgbmF0aXZlCi0gKiBmb3JtYXQgKHRoZSBvbmUgdGhlIHNpbXBsaWZpZWQgQVBJIHN1Z2dlc3RzKS4KLSAqLwotc3RhdGljIGludAotcmVhZF9vbmVfZmlsZShJbWFnZSAqaW1hZ2UpCi17Ci0gICBpZiAoIShpbWFnZS0+b3B0cyAmIFVTRV9GSUxFKSB8fCAoaW1hZ2UtPm9wdHMgJiBVU0VfU1RESU8pKQotICAgewotICAgICAgLyogbWVtb3J5IG9yIHN0ZGlvLiAqLwotICAgICAgRklMRSAqZiA9IGZvcGVuKGltYWdlLT5maWxlX25hbWUsICJyYiIpOwotCi0gICAgICBpZiAoZiAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgaWYgKGltYWdlLT5vcHRzICYgVVNFX0ZJTEUpCi0gICAgICAgICAgICBpbWFnZS0+aW5wdXRfZmlsZSA9IGY7Ci0KLSAgICAgICAgIGVsc2UgLyogbWVtb3J5ICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZnNlZWsoZiwgMCwgU0VFS19FTkQpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBsb25nIGludCBjYiA9IGZ0ZWxsKGYpOwotCi0gICAgICAgICAgICAgICBpZiAoY2IgPiAwKQotICAgICAgICAgICAgICAgewotI2lmbmRlZiBfX0NPVkVSSVRZX18KLSAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQgbG9uZyBpbnQpY2IgPD0gKHNpemVfdCl+KHNpemVfdCkwKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgYiA9IHZvaWRjYXN0KHBuZ19ieXRlcCwgbWFsbG9jKChzaXplX3QpY2IpKTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJld2luZChmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyZWFkKGIsIChzaXplX3QpY2IsIDEsIGYpID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+aW5wdXRfbWVtb3J5X3NpemUgPSBjYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5pbnB1dF9tZW1vcnkgPSBiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2Nsb3NlKGltYWdlLCBmLCBpbWFnZS0+ZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogcmVhZCBmYWlsZWQ6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nY2xvc2UoaW1hZ2UsIGYsIGltYWdlLT5maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBvdXQgb2YgbWVtb3J5OiAiKTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2Nsb3NlKGltYWdlLCBmLCBpbWFnZS0+ZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIjogZmlsZSB0b28gYmlnIGZvciB0aGlzIGFyY2hpdGVjdHVyZTogIik7Ci0gICAgICAgICAgICAgICAgICAgICAvKiBjYiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGFzIGEgKGxvbmcpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICogdGhpcyBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYW1vdW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgKiBtZW1vcnkgdGhhdCBjYW4gYmUgcmVxdWVzdGVkIGZyb20gbWFsbG9jLgotICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKGNiID09IDApCi0gICAgICAgICAgICAgICAgICByZXR1cm4gbG9nY2xvc2UoaW1hZ2UsIGYsIGltYWdlLT5maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAiOiB6ZXJvIGxlbmd0aDogIik7Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHJldHVybiBsb2djbG9zZShpbWFnZSwgZiwgaW1hZ2UtPmZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICI6IHRlbGwgZmFpbGVkOiAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2Nsb3NlKGltYWdlLCBmLCBpbWFnZS0+ZmlsZV9uYW1lLCAiOiBzZWVrIGZhaWxlZDogIik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgaW1hZ2UtPmZpbGVfbmFtZSwgIjogb3BlbiBmYWlsZWQ6ICIsCi0gICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgfQotCi0gICByZXR1cm4gcmVhZF9maWxlKGltYWdlLCBGT1JNQVRfTk9fQ0hBTkdFLCBOVUxMKTsKLX0KLQotI2lmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRAotc3RhdGljIGludAotd3JpdGVfb25lX2ZpbGUoSW1hZ2UgKm91dHB1dCwgSW1hZ2UgKmltYWdlLCBpbnQgY29udmVydF90b184Yml0KQotewotICAgaWYgKGltYWdlLT5vcHRzICYgRkFTVF9XUklURSkKLSAgICAgIGltYWdlLT5pbWFnZS5mbGFncyB8PSBQTkdfSU1BR0VfRkxBR19GQVNUOwotCi0gICBpZiAoaW1hZ2UtPm9wdHMgJiBVU0VfU1RESU8pCi0gICB7Ci0jaWZkZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1RESU9fU1VQUE9SVEVECi0jaWZuZGVmIF9fQ09WRVJJVFlfXwotICAgICAgRklMRSAqZiA9IHRtcGZpbGUoKTsKLSNlbHNlCi0gICAgICAvKiBFeHBlcmltZW50YWwuIENvdmVyaXR5IHNheXMgdG1wZmlsZSgpIGlzIGluc2VjdXJlIGJlY2F1c2UgaXQKLSAgICAgICAqIGdlbmVyYXRlcyBwcmVkaWN0YWJsZSBuYW1lcy4KLSAgICAgICAqCi0gICAgICAgKiBJdCBpcyBwb3NzaWJsZSB0byBzYXRpc2Z5IENvdmVyaXR5IGJ5IHVzaW5nIG1rc3RlbXAoKTsgaG93ZXZlciwKLSAgICAgICAqIGFueSBwbGF0Zm9ybSBzdXBwb3J0aW5nIG1rc3RlbXAoKSB1bmRvdWJ0ZWRseSBoYXMgYSBzZWN1cmUgdG1wZmlsZSgpCi0gICAgICAgKiBpbXBsZW1lbnRhdGlvbiBhcyB3ZWxsLCBhbmQgZG9lc24ndCBuZWVkIHRoZSBmaXguICBOb3RlIHRoYXQKLSAgICAgICAqIHRoZSBmaXggd29uJ3Qgd29yayBvbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IG1rc3RlbXAoKS4KLSAgICAgICAqCi0gICAgICAgKiBodHRwczovL3d3dy5zZWN1cmVjb2RpbmcuY2VydC5vcmcvY29uZmx1ZW5jZS9kaXNwbGF5L2MvCi0gICAgICAgKiBGSU8yMS1DLitEbytub3QrY3JlYXRlK3RlbXBvcmFyeStmaWxlcytpbitzaGFyZWQrZGlyZWN0b3JpZXMKLSAgICAgICAqIHNheXMgdGhhdCBtb3N0IGhpc3RvcmljIGltcGxlbWVudGF0aW9ucyBvZiB0bXBmaWxlKCkgcHJvdmlkZQotICAgICAgICogb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIHBvc3NpYmxlIHRlbXBvcmFyeSBmaWxlIG5hbWVzCi0gICAgICAgKiAodXN1YWxseSAyNikgYmVmb3JlIGZpbGUgbmFtZXMgYXJlIHJlY3ljbGVkLiBUaGF0IGFydGljbGUgYWxzbwotICAgICAgICogcHJvdmlkZXMgYSBzZWN1cmUgc29sdXRpb24gdGhhdCB1bmZvcnR1bmF0ZWx5IGRlcGVuZHMgdXBvbiBta3N0ZW1wKCkuCi0gICAgICAgKi8KLSAgICAgIGNoYXIgdG1wZmlsZVtdID0gInBuZ3N0ZXN0LVhYWFhYWCI7Ci0gICAgICBpbnQgZmlsZWRlczsKLSAgICAgIEZJTEUgKmY7Ci0gICAgICB1bWFzaygwMTc3KTsKLSAgICAgIGZpbGVkZXMgPSBta3N0ZW1wKHRtcGZpbGUpOwotICAgICAgaWYgKGZpbGVkZXMgPCAwKQotICAgICAgICBmID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZiA9IGZkb3BlbihmaWxlZGVzLCJ3KyIpOwotICAgICAgICAvKiBIaWRlIHRoZSBmaWxlbmFtZSBpbW1lZGlhdGVseSBhbmQgZW5zdXJlIHRoYXQgdGhlIGZpbGUgZG9lcwotICAgICAgICAgKiBub3QgZXhpc3QgYWZ0ZXIgdGhlIHByb2dyYW0gZW5kcwotICAgICAgICAgKi8KLSAgICAgICAgKHZvaWQpIHVubGluayh0bXBmaWxlKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAoZiAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgaWYgKHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygmaW1hZ2UtPmltYWdlLCBmLCBjb252ZXJ0X3RvXzhiaXQsCi0gICAgICAgICAgICBpbWFnZS0+YnVmZmVyKzE2LCAocG5nX2ludF8zMilpbWFnZS0+c3RyaWRlLCBpbWFnZS0+Y29sb3JtYXApKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGZmbHVzaChmKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV3aW5kKGYpOwotICAgICAgICAgICAgICAgaW5pdGltYWdlKG91dHB1dCwgaW1hZ2UtPm9wdHMsICJ0bXBmaWxlIiwgaW1hZ2UtPnN0cmlkZV9leHRyYSk7Ci0gICAgICAgICAgICAgICBvdXRwdXQtPmlucHV0X2ZpbGUgPSBmOwotICAgICAgICAgICAgICAgaWYgKCFjaGVja29wYXF1ZShpbWFnZSkpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2Nsb3NlKGltYWdlLCBmLCAidG1wZmlsZSIsICI6IGZsdXNoOiAiKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAidG1wZmlsZSIsICI6IHdyaXRlIGZhaWxlZCIsICIiKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAidG1wZmlsZSIsICI6IG9wZW46ICIsIHN0cmVycm9yKGVycm5vKSk7Ci0jZWxzZSAvKiBTSU1QTElGSUVEX1dSSVRFX1NURElPICovCi0gICAgICByZXR1cm4gbG9nZXJyb3IoaW1hZ2UsICJ0bXBmaWxlIiwgIjogb3BlbjogdW5zdXBwb3J0ZWQiLCAiIik7Ci0jZW5kaWYgLyogU0lNUExJRklFRF9XUklURV9TVERJTyAqLwotICAgfQotCi0gICBlbHNlIGlmIChpbWFnZS0+b3B0cyAmIFVTRV9GSUxFKQotICAgewotI2lmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX1NURElPX1NVUFBPUlRFRAotICAgICAgc3RhdGljIGludCBjb3VudGVyID0gMDsKLSAgICAgIGNoYXIgbmFtZVszMl07Ci0KLSAgICAgIHNwcmludGYobmFtZSwgIiVzJWQucG5nIiwgdG1wZiwgKytjb3VudGVyKTsKLQotICAgICAgaWYgKHBuZ19pbWFnZV93cml0ZV90b19maWxlKCZpbWFnZS0+aW1hZ2UsIG5hbWUsIGNvbnZlcnRfdG9fOGJpdCwKLSAgICAgICAgIGltYWdlLT5idWZmZXIrMTYsIChwbmdfaW50XzMyKWltYWdlLT5zdHJpZGUsIGltYWdlLT5jb2xvcm1hcCkpCi0gICAgICB7Ci0gICAgICAgICBpbml0aW1hZ2Uob3V0cHV0LCBpbWFnZS0+b3B0cywgb3V0cHV0LT50bXBmaWxlX25hbWUsCi0gICAgICAgICAgICBpbWFnZS0+c3RyaWRlX2V4dHJhKTsKLSAgICAgICAgIC8qIEFmdGVyd2FyZHMsIG9yIGZyZWVpbWFnZSB3aWxsIGRlbGV0ZSBpdCEgKi8KLSAgICAgICAgIHN0cmNweShvdXRwdXQtPnRtcGZpbGVfbmFtZSwgbmFtZSk7Ci0KLSAgICAgICAgIGlmICghY2hlY2tvcGFxdWUoaW1hZ2UpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgbmFtZSwgIjogd3JpdGUgZmFpbGVkIiwgIiIpOwotI2Vsc2UgLyogU0lNUExJRklFRF9XUklURV9TVERJTyAqLwotICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAic3RkaW8iLCAiOiBvcGVuOiB1bnN1cHBvcnRlZCIsICIiKTsKLSNlbmRpZiAvKiBTSU1QTElGSUVEX1dSSVRFX1NURElPICovCi0gICB9Ci0KLSAgIGVsc2UgLyogdXNlIG1lbW9yeSAqLwotICAgewotICAgICAgcG5nX2FsbG9jX3NpemVfdCBzaXplOwotCi0gICAgICBpZiAocG5nX2ltYWdlX3dyaXRlX2dldF9tZW1vcnlfc2l6ZShpbWFnZS0+aW1hZ2UsIHNpemUsIGNvbnZlcnRfdG9fOGJpdCwKLSAgICAgICAgICAgICAgIGltYWdlLT5idWZmZXIrMTYsIChwbmdfaW50XzMyKWltYWdlLT5zdHJpZGUsIGltYWdlLT5jb2xvcm1hcCkpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIGlzIG5vbi1mYXRhbCBidXQgaWdub3JpbmcgaXQgd2FzIGNhdXNpbmcgc2VyaW91cyBwcm9ibGVtcyBpbgotICAgICAgICAgICogdGhlIG1hY3JvIHRvIGJlIGlnbm9yZWQ6Ci0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChzaXplID4gUE5HX0lNQUdFX1BOR19TSVpFX01BWChpbWFnZS0+aW1hZ2UpKQotICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAibWVtb3J5IiwgIjogUE5HX0lNQUdFX1NJWkVfTUFYIHdyb25nIiwgIiIpOwotCi0gICAgICAgICBpbml0aW1hZ2Uob3V0cHV0LCBpbWFnZS0+b3B0cywgIm1lbW9yeSIsIGltYWdlLT5zdHJpZGVfZXh0cmEpOwotICAgICAgICAgb3V0cHV0LT5pbnB1dF9tZW1vcnkgPSBtYWxsb2Moc2l6ZSk7Ci0KLSAgICAgICAgIGlmIChvdXRwdXQtPmlucHV0X21lbW9yeSAhPSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LT5pbnB1dF9tZW1vcnlfc2l6ZSA9IHNpemU7Ci0KLSAgICAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfdG9fbWVtb3J5KCZpbWFnZS0+aW1hZ2UsIG91dHB1dC0+aW5wdXRfbWVtb3J5LAotICAgICAgICAgICAgICAgICAgJm91dHB1dC0+aW5wdXRfbWVtb3J5X3NpemUsIGNvbnZlcnRfdG9fOGJpdCwgaW1hZ2UtPmJ1ZmZlcisxNiwKLSAgICAgICAgICAgICAgICAgIChwbmdfaW50XzMyKWltYWdlLT5zdHJpZGUsIGltYWdlLT5jb2xvcm1hcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBUaGlzIGlzIGFsc28gbm9uLWZhdGFsIGJ1dCBpdCBzYWZlcyBzYWZlciB0byBlcnJvciBvdXQgYW55d2F5OgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBvdXRwdXQtPmlucHV0X21lbW9yeV9zaXplKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAibWVtb3J5IiwgIjogbWVtb3J5IHNpemUgd3JvbmciLCAiIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHJldHVybiBsb2dlcnJvcihpbWFnZSwgIm1lbW9yeSIsICI6IHdyaXRlIGZhaWxlZCIsICIiKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAibWVtb3J5IiwgIjogb3V0IG9mIG1lbW9yeSIsICIiKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKGltYWdlLCAibWVtb3J5IiwgIjogZ2V0IHNpemU6IiwgIiIpOwotICAgfQotCi0gICAvKiAnb3V0cHV0JyBoYXMgYW4gaW5pdGlhbGl6ZWQgdGVtcG9yYXJ5IGltYWdlLCByZWFkIHRoaXMgYmFjayBpbiBhbmQgY29tcGFyZQotICAgICogdGhpcyBhZ2FpbnN0IHRoZSBvcmlnaW5hbDogdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZSBzaW5jZSB0aGUgb3JpZ2luYWwKLSAgICAqIGZvcm1hdCB3YXMgd3JpdHRlbiB1bm1vZGlmaWVkIHVubGVzcyAnY29udmVydF90b184Yml0JyB3YXMgc3BlY2lmaWVkLgotICAgICogSG93ZXZlciwgaWYgdGhlIG9yaWdpbmFsIGltYWdlIHdhcyBjb2xvci1tYXBwZWQsIGEgc2ltcGxlIHJlYWQgd2lsbCB6YXAKLSAgICAqIHRoZSBsaW5lYXIsIGNvbG9yIGFuZCBtYXliZSBhbHBoYSBmbGFncywgdGhpcyB3aWxsIGNhdXNlIHNwdXJpb3VzIGZhaWx1cmVzCi0gICAgKiB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuCi0gICAgKi8KLSAgIGlmIChyZWFkX2ZpbGUob3V0cHV0LCBpbWFnZS0+aW1hZ2UuZm9ybWF0IHwgRk9STUFUX05PX0NIQU5HRSwgTlVMTCkpCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBvcmlnaW5hbF9mb3JtYXQgPSBpbWFnZS0+aW1hZ2UuZm9ybWF0OwotCi0gICAgICBpZiAoY29udmVydF90b184Yml0KQotICAgICAgICAgb3JpZ2luYWxfZm9ybWF0ICY9IH5QTkdfRk9STUFUX0ZMQUdfTElORUFSOwotCi0gICAgICBpZiAoKG91dHB1dC0+aW1hZ2UuZm9ybWF0ICYgQkFTRV9GT1JNQVRTKSAhPQotICAgICAgICAgKG9yaWdpbmFsX2Zvcm1hdCAmIEJBU0VfRk9STUFUUykpCi0gICAgICAgICByZXR1cm4gbG9nZXJyb3IoaW1hZ2UsIGltYWdlLT5maWxlX25hbWUsICI6IGZvcm1hdCBjaGFuZ2VkIG9uIHJlYWQ6ICIsCi0gICAgICAgICAgICBvdXRwdXQtPmZpbGVfbmFtZSk7Ci0KLSAgICAgIHJldHVybiBjb21wYXJlX3R3b19pbWFnZXMoaW1hZ2UsIG91dHB1dCwgMC8qdmlhIGxpbmVhciovLCBOVUxMKTsKLSAgIH0KLQotICAgZWxzZQotICAgICAgcmV0dXJuIGxvZ2Vycm9yKG91dHB1dCwgb3V0cHV0LT50bXBmaWxlX25hbWUsCi0gICAgICAgICAiOiByZWFkIG9mIG5ldyBmaWxlIGZhaWxlZCIsICIiKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci10ZXN0aW1hZ2UoSW1hZ2UgKmltYWdlLCBwbmdfdWludF8zMiBvcHRzLCBmb3JtYXRfbGlzdCAqcGYpCi17Ci0gICBpbnQgcmVzdWx0OwotICAgSW1hZ2UgY29weTsKLQotICAgLyogQ29weSB0aGUgb3JpZ2luYWwgZGF0YSwgc3RlYWxpbmcgaXQgZnJvbSAnaW1hZ2UnICovCi0gICBjaGVja29wYXF1ZShpbWFnZSk7Ci0gICBjb3B5ID0gKmltYWdlOwotCi0gICBjb3B5Lm9wdHMgPSBvcHRzOwotICAgY29weS5idWZmZXIgPSBOVUxMOwotICAgY29weS5idWZzaXplID0gMDsKLSAgIGNvcHkuYWxsb2NzaXplID0gMDsKLQotICAgaW1hZ2UtPmlucHV0X2ZpbGUgPSBOVUxMOwotICAgaW1hZ2UtPmlucHV0X21lbW9yeSA9IE5VTEw7Ci0gICBpbWFnZS0+aW5wdXRfbWVtb3J5X3NpemUgPSAwOwotICAgaW1hZ2UtPnRtcGZpbGVfbmFtZVswXSA9IDA7Ci0KLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIGNvdW50ZXI7Ci0gICAgICBJbWFnZSBvdXRwdXQ7Ci0KLSAgICAgIG5ld2ltYWdlKCZvdXRwdXQpOwotCi0gICAgICByZXN1bHQgPSAxOwotCi0gICAgICAvKiBVc2UgdGhlIGxvdyBiaXQgb2YgJ2NvdW50ZXInIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRvIGRvIGFscGhhCi0gICAgICAgKiByZW1vdmFsIHdpdGggYSBiYWNrZ3JvdW5kIGNvbG9yIG9yIGJ5IGNvbXBvc3Rpbmcgb250byB0aGUgaW1hZ2U7IHRoaXMKLSAgICAgICAqIHN0ZXAgZ2V0cyBza2lwcGVkIGlmIGl0IGlzbid0IHJlbGV2YW50Ci0gICAgICAgKi8KLSAgICAgIGZvciAoY291bnRlcj0wOyBjb3VudGVyPDIqRk9STUFUX0NPVU5UOyArK2NvdW50ZXIpCi0gICAgICAgICBpZiAoZm9ybWF0X2lzc2V0KHBmLCBjb3VudGVyID4+IDEpKQotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgZm9ybWF0ID0gY291bnRlciA+PiAxOwotCi0gICAgICAgICBwbmdfY29sb3IgYmFja2dyb3VuZF9jb2xvcjsKLSAgICAgICAgIHBuZ19jb2xvcnAgYmFja2dyb3VuZCA9IE5VTEw7Ci0KLSAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgZm9ybWF0IGNoYW5nZSB0aGF0IHJlbW92ZXMgdGhlIGFscGhhIGNoYW5uZWwgdGhlbgotICAgICAgICAgICogdGhlIGJhY2tncm91bmQgaXMgcmVsZXZhbnQuICBJZiB0aGUgb3V0cHV0IGlzIDgtYml0IGNvbG9yLW1hcHBlZAotICAgICAgICAgICogdGhlbiBhIGJhY2tncm91bmQgY29sb3IgKm11c3QqIGJlIHByb3ZpZGVkLCBvdGhlcndpc2UgdGhlcmUgYXJlCi0gICAgICAgICAgKiB0d28gdGVzdHMgdG8gZG8gLSBvbmUgd2l0aCBhIGNvbG9yLCB0aGUgb3RoZXIgd2l0aCBOVUxMLiAgVGhlCi0gICAgICAgICAgKiBOVUxMIHRlc3QgaGFwcGVucyBzZWNvbmQuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmICgoY291bnRlciAmIDEpID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BTFBIQSkgPT0gMCAmJgotICAgICAgICAgICAgICAgKGltYWdlLT5pbWFnZS5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQUxQSEEpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBBbHBoYS90cmFuc3BhcmVuY3kgd2lsbCBiZSByZW1vdmVkLCB0aGUgYmFja2dyb3VuZCBpcwotICAgICAgICAgICAgICAgICogcmVsZXZhbnQ6IG1ha2UgaXQgYSBjb2xvciB0aGUgZmlyc3QgdGltZQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICByYW5kb21fY29sb3IoJmJhY2tncm91bmRfY29sb3IpOwotICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9ICZiYWNrZ3JvdW5kX2NvbG9yOwotCi0gICAgICAgICAgICAgICAvKiBCVVQgaWYgdGhlIG91dHB1dCBpcyB0byBhIGNvbG9yLW1hcHBlZCA4LWJpdCBmb3JtYXQgdGhlbgotICAgICAgICAgICAgICAgICogdGhlIGJhY2tncm91bmQgbXVzdCBhbHdheXMgYmUgYSBjb2xvciwgc28gaW5jcmVtZW50ICdjb3VudGVyJwotICAgICAgICAgICAgICAgICogdG8gc2tpcCB0aGUgTlVMTCB0ZXN0LgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19MSU5FQVIpID09IDApCi0gICAgICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIE90aGVyd2lzZSBhbiBhbHBoYSBjaGFubmVsIGlzIG5vdCBiZWluZyBlbGltaW5hdGVkLCBqdXN0IGxlYXZlCi0gICAgICAgICAgICAgKiBiYWNrZ3JvdW5kIE5VTEwgYW5kIHNraXAgdGhlIChjb3VudGVyICYgMSkgTlVMTCB0ZXN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICB9Ci0gICAgICAgICAvKiBlbHNlIGp1c3QgdXNlIE5VTEwgZm9yIGJhY2tncm91bmQgKi8KLQotICAgICAgICAgcmVzZXRpbWFnZSgmY29weSk7Ci0gICAgICAgICBjb3B5Lm9wdHMgPSBvcHRzOyAvKiBpbiBjYXNlIHJlYWRfZmlsZSBuZWVkcyB0byBjaGFuZ2UgaXQgKi8KLQotICAgICAgICAgcmVzdWx0ID0gcmVhZF9maWxlKCZjb3B5LCBmb3JtYXQsIGJhY2tncm91bmQpOwotICAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmaWxlIGp1c3QgcmVhZCBtYXRjaGVzIHRoZSBvcmlnaW5hbCBmaWxlLiAqLwotICAgICAgICAgcmVzdWx0ID0gY29tcGFyZV90d29faW1hZ2VzKGltYWdlLCAmY29weSwgMC8qdmlhIGxpbmVhciovLCBiYWNrZ3JvdW5kKTsKLSAgICAgICAgIGlmICghcmVzdWx0KQotICAgICAgICAgICAgYnJlYWs7Ci0KLSMgICAgICAgIGlmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRAotICAgICAgICAgICAgLyogV3JpdGUgdGhlICpjb3B5KiBqdXN0IG1hZGUgdG8gYSBuZXcgZmlsZSB0byBtYWtlIHN1cmUgdGhlIHdyaXRlCi0gICAgICAgICAgICAgKiBzaWRlIHdvcmtzIG9rLiAgQ2hlY2sgdGhlIGNvbnZlcnNpb24gdG8gc1JHQiBpZiB0aGUgY29weSBpcwotICAgICAgICAgICAgICogbGluZWFyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBvdXRwdXQub3B0cyA9IG9wdHM7Ci0gICAgICAgICAgICByZXN1bHQgPSB3cml0ZV9vbmVfZmlsZSgmb3V0cHV0LCAmY29weSwgMC8qY29udmVydCB0byA4Yml0Ki8pOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogVmFsaWRhdGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdG9vOyB0aGUgYmFja2dyb3VuZCBpcyBuZWVkZWQgaGVyZQotICAgICAgICAgICAgICogYXMgd2VsbCBzbyB0aGF0IGNvbXBhcmVfdHdvX2ltYWdlcyBrbm93cyB3aGF0IGNvbG9yIHdhcyB1c2VkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlX3R3b19pbWFnZXMoaW1hZ2UsICZvdXRwdXQsIDAsIGJhY2tncm91bmQpOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKChmb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfTElORUFSKSAhPSAwICYmCi0gICAgICAgICAgICAgICAoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogJ291dHB1dCcgaXMgbGluZWFyLCBjb252ZXJ0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHNSR0IgZm9ybWF0LgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBvdXRwdXQub3B0cyA9IG9wdHM7Ci0gICAgICAgICAgICAgICByZXN1bHQgPSB3cml0ZV9vbmVfZmlsZSgmb3V0cHV0LCAmY29weSwgMS8qY29udmVydCB0byA4Yml0Ki8pOwotICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgLyogVGhpcyBtYXkgaW52b2x2ZSBhIGNvbnZlcnNpb24gdmlhIGxpbmVhcjsgaW4gdGhlIGlkZWFsIHdvcmxkCi0gICAgICAgICAgICAgICAgKiB0aGlzIHdvdWxkIHJvdW5kLXRyaXAgY29ycmVjdGx5LCBidXQgbGlicG5nIDEuNS43IGlzIG5vdCB0aGUKLSAgICAgICAgICAgICAgICAqIGlkZWFsIHdvcmxkIHNvIGFsbG93IGEgZHJpZnQgKGVycm9yX3ZpYV9saW5lYXIpLgotICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAqICdpbWFnZScgaGFzIGFuIGFscGhhIGNoYW5uZWwgYnV0ICdvdXRwdXQnIGRvZXMgbm90IHRoZW4gdGhlcmUKLSAgICAgICAgICAgICAgICAqIHdpbGwgYSBzdHJpcC1hbHBoYS1jaGFubmVsIG9wZXJhdGlvbiAoYmVjYXVzZSAnb3V0cHV0JyBpcwotICAgICAgICAgICAgICAgICogbGluZWFyKSwgaGFuZGxlIHRoaXMgYnkgY29tcG9zaW5nIG9uIGJsYWNrIHdoZW4gZG9pbmcgdGhlCi0gICAgICAgICAgICAgICAgKiBjb21wYXJpc29uLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlX3R3b19pbWFnZXMoaW1hZ2UsICZvdXRwdXQsIDEvKnZpYV9saW5lYXIqLywKLSAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQpOwotICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSMgICAgICAgIGVuZGlmIC8qIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCAqLwotICAgICAgfQotCi0gICAgICBmcmVlaW1hZ2UoJm91dHB1dCk7Ci0gICB9Ci0KLSAgIGZyZWVpbWFnZSgmY29weSk7Ci0KLSAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXRlc3Rfb25lX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9uYW1lLCBmb3JtYXRfbGlzdCAqZm9ybWF0cywgcG5nX3VpbnRfMzIgb3B0cywKLSAgIGludCBzdHJpZGVfZXh0cmEsIGludCBsb2dfcGFzcykKLXsKLSAgIGludCByZXN1bHQ7Ci0gICBJbWFnZSBpbWFnZTsKLQotICAgaWYgKCEob3B0cyAmIE5PX1JFU0VFRCkpCi0gICAgICByZXNlZWQoKTsgLyogZW5zdXJlIHRoYXQgdGhlIHJhbmRvbSBudW1iZXJzIGRvbid0IGRlcGVuZCBvbiBmaWxlIG9yZGVyICovCi0gICBuZXdpbWFnZSgmaW1hZ2UpOwotICAgaW5pdGltYWdlKCZpbWFnZSwgb3B0cywgZmlsZV9uYW1lLCBzdHJpZGVfZXh0cmEpOwotICAgcmVzdWx0ID0gcmVhZF9vbmVfZmlsZSgmaW1hZ2UpOwotICAgaWYgKHJlc3VsdCkKLSAgICAgIHJlc3VsdCA9IHRlc3RpbWFnZSgmaW1hZ2UsIG9wdHMsIGZvcm1hdHMpOwotICAgZnJlZWltYWdlKCZpbWFnZSk7Ci0KLSAgIC8qIEVuc3VyZSB0aGF0IHN0ZGVyciBpcyBmbHVzaGVkIGludG8gYW55IGxvZyBmaWxlICovCi0gICBmZmx1c2goc3RkZXJyKTsKLQotICAgaWYgKGxvZ19wYXNzKQotICAgewotICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgIHByaW50ZigiUEFTUzoiKTsKLQotICAgICAgZWxzZQotICAgICAgICAgcHJpbnRmKCJGQUlMOiIpOwotCi0jICAgICBpZm5kZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVECi0gICAgICAgICBwcmludGYoIiAobm8gd3JpdGUpIik7Ci0jICAgICBlbmRpZgotCi0gICAgICBwcmludF9vcHRzKG9wdHMpOwotICAgICAgcHJpbnRmKCIgJXNcbiIsIGZpbGVfbmFtZSk7Ci0gICAgICAvKiBzdGRvdXQgbWF5IG5vdCBiZSBsaW5lLWJ1ZmZlcmVkIGlmIGl0IGlzIHBpcGVkIHRvIGEgZmlsZSwgc286ICovCi0gICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgIH0KLQotICAgZWxzZSBpZiAoIXJlc3VsdCkKLSAgICAgIGV4aXQoMSk7Ci0KLSAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICBwbmdfdWludF8zMiBvcHRzID0gRkFTVF9XUklURSB8IFNUUklDVDsKLSAgIGZvcm1hdF9saXN0IGZvcm1hdHM7Ci0gICBjb25zdCBjaGFyICp0b3VjaCA9IE5VTEw7Ci0gICBpbnQgbG9nX3Bhc3MgPSAwOwotICAgaW50IHJlZHVuZGFudCA9IDA7Ci0gICBpbnQgc3RyaWRlX2V4dHJhID0gMDsKLSAgIGludCByZXR2YWwgPSAwOwotICAgaW50IGM7Ci0KLSNpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMAotICAgICAgLyogVGhpcyBlcnJvciBzaG91bGQgbm90IGV4aXN0IGluIDEuNyBvciBsYXRlcjogKi8KLSAgICAgIG9wdHMgfD0gR0JHX0VSUk9SOwotI2VuZGlmCi0KLSAgIGluaXRfc1JHQl90b19kKCk7Ci0jaWYgMAotICAgaW5pdF9lcnJvcl92aWFfbGluZWFyKCk7Ci0jZW5kaWYKLSAgIGZvcm1hdF9pbml0KCZmb3JtYXRzKTsKLSAgIHJlc2VlZCgpOyAvKiBpbml0aWFsaXplIHJhbmRvbSBudW1iZXIgc2VlZHMgKi8KLQotICAgZm9yIChjPTE7IGM8YXJnYzsgKytjKQotICAgewotICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltjXTsKLQotICAgICAgaWYgKHN0cmNtcChhcmcsICItLWxvZyIpID09IDApCi0gICAgICAgICBsb2dfcGFzcyA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1mcmVzaCIpID09IDApCi0gICAgICB7Ci0gICAgICAgICBtZW1zZXQoZ3BjX2Vycm9yLCAwLCBzaXplb2YgZ3BjX2Vycm9yKTsKLSAgICAgICAgIG1lbXNldChncGNfZXJyb3JfdmlhX2xpbmVhciwgMCwgc2l6ZW9mIGdwY19lcnJvcl92aWFfbGluZWFyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWZpbGUiKSA9PSAwKQotIyAgICAgICAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAotICAgICAgICAgICAgb3B0cyB8PSBVU0VfRklMRTsKLSMgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBTS0lQOyAvKiBza2lwcGVkOiBubyBzdXBwb3J0ICovCi0jICAgICAgICBlbmRpZgotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tbWVtb3J5IikgPT0gMCkKLSAgICAgICAgIG9wdHMgJj0gflVTRV9GSUxFOwotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tc3RkaW8iKSA9PSAwKQotIyAgICAgICAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRAotICAgICAgICAgICAgb3B0cyB8PSBVU0VfU1RESU87Ci0jICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gU0tJUDsgLyogc2tpcHBlZDogbm8gc3VwcG9ydCAqLwotIyAgICAgICAgZW5kaWYKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLW5hbWUiKSA9PSAwKQotICAgICAgICAgb3B0cyAmPSB+VVNFX1NURElPOwotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpID09IDApCi0gICAgICAgICBvcHRzIHw9IFZFUkJPU0U7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1xdWlldCIpID09IDApCi0gICAgICAgICBvcHRzICY9IH5WRVJCT1NFOwotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tcHJlc2VydmUiKSA9PSAwKQotICAgICAgICAgb3B0cyB8PSBLRUVQX1RNUEZJTEVTOwotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tbm9wcmVzZXJ2ZSIpID09IDApCi0gICAgICAgICBvcHRzICY9IH5LRUVQX1RNUEZJTEVTOwotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0ta2VlcC1nb2luZyIpID09IDApCi0gICAgICAgICBvcHRzIHw9IEtFRVBfR09JTkc7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1mYXN0IikgPT0gMCkKLSAgICAgICAgIG9wdHMgfD0gRkFTVF9XUklURTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXNsb3ciKSA9PSAwKQotICAgICAgICAgb3B0cyAmPSB+RkFTVF9XUklURTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWFjY3VtdWxhdGUiKSA9PSAwKQotICAgICAgICAgb3B0cyB8PSBBQ0NVTVVMQVRFOwotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tcmVkdW5kYW50IikgPT0gMCkKLSAgICAgICAgIHJlZHVuZGFudCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zdG9wIikgPT0gMCkKLSAgICAgICAgIG9wdHMgJj0gfktFRVBfR09JTkc7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zdHJpY3QiKSA9PSAwKQotICAgICAgICAgb3B0cyB8PSBTVFJJQ1Q7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1ub3N0cmljdCIpID09IDApCi0gICAgICAgICBvcHRzICY9IH5TVFJJQ1Q7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1zUkdCLTE2Yml0IikgPT0gMCkKLSAgICAgICAgIG9wdHMgfD0gc1JHQl8xNkJJVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWxpbmVhci0xNmJpdCIpID09IDApCi0gICAgICAgICBvcHRzICY9IH5zUkdCXzE2QklUOwotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tbm9yZXNlZWQiKSA9PSAwKQotICAgICAgICAgb3B0cyB8PSBOT19SRVNFRUQ7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS1mYXVsdC1nYmctd2FybmluZyIpID09IDApCi0gICAgICAgICBvcHRzIHw9IEdCR19FUlJPUjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICItLXRtcGZpbGUiKSA9PSAwKQotICAgICAgewotICAgICAgICAgaWYgKGMrMSA8IGFyZ2MpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RybGVuKGFyZ3ZbKytjXSkgPj0gc2l6ZW9mIHRtcGYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGlzIHRvbyBsb25nIGZvciBhIHRlbXAgZmlsZSBwcmVmaXhcbiIsCi0gICAgICAgICAgICAgICAgICBhcmd2WzBdLCBhcmd2W2NdKTsKLSAgICAgICAgICAgICAgIGV4aXQoOTkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTYWZlOiBjaGVja2VkIGFib3ZlICovCi0gICAgICAgICAgICBzdHJuY3B5KHRtcGYsIGFyZ3ZbY10sIHNpemVvZiAodG1wZiktMSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgZmlsZSBwcmVmaXhcbiIsCi0gICAgICAgICAgICAgICBhcmd2WzBdLCBhcmcpOwotICAgICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLS10b3VjaCIpID09IDApCi0gICAgICB7Ci0gICAgICAgICBpZiAoYysxIDwgYXJnYykKLSAgICAgICAgICAgIHRvdWNoID0gYXJndlsrK2NdOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzIHJlcXVpcmVzIGEgZmlsZSBuYW1lIGFyZ3VtZW50XG4iLAotICAgICAgICAgICAgICAgYXJndlswXSwgYXJnKTsKLSAgICAgICAgICAgIGV4aXQoOTkpOwotICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICcrJykKLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzMyIGZvcm1hdCA9IGZvcm1hdG9mKGFyZysxKTsKLQotICAgICAgICAgaWYgKGZvcm1hdCA+IEZPUk1BVF9DT1VOVCkKLSAgICAgICAgICAgIGV4aXQoOTkpOwotCi0gICAgICAgICBmb3JtYXRfc2V0KCZmb3JtYXRzLCBmb3JtYXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gIT0gMCAmJiAoYXJnWzFdICE9ICcwJyB8fCBhcmdbMl0gIT0gMCkpCi0gICAgICB7Ci0gICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndlswXSwgYXJnKTsKLSAgICAgICAgIGV4aXQoOTkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaWYgKGZvcm1hdF9pc19pbml0aWFsKCZmb3JtYXRzKSkKLSAgICAgICAgICAgIGZvcm1hdF9kZWZhdWx0KCZmb3JtYXRzLCByZWR1bmRhbnQpOwotCi0gICAgICAgICBpZiAoYXJnWzBdID09ICctJykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB0ZXJtID0gKGFyZ1sxXSA9PSAnMCcgPyAwIDogJ1xuJyk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWNoID0gMDsKLQotICAgICAgICAgICAgLyogTG9vcCByZWFkaW5nIGZpbGVzLCB1c2UgYSBzdGF0aWMgYnVmZmVyIHRvIHNpbXBsaWZ5IHRoaXMgYW5kIGp1c3QKLSAgICAgICAgICAgICAqIHN0b3AgaWYgdGhlIG5hbWUgZ2V0cyB0byBsb25nLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzdGF0aWMgY2hhciBidWZmZXJbNDA5Nl07Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgY2ggPSBnZXRjaGFyKCk7Ci0KLSAgICAgICAgICAgICAgIC8qIERvbid0IGFsbG93ICdcMCcgaW4gZmlsZSBuYW1lcywgYW5kIHRlcm1pbmF0ZSB3aXRoICdcbicgb3IsCi0gICAgICAgICAgICAgICAgKiBmb3IgLTAsIGp1c3QgJ1wwJyAodXNlIC1wcmludDAgdG8gZmluZCB0byBtYWtlIHRoaXMgd29yayEpCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGlmIChjaCA9PSBFT0YgfHwgY2ggPT0gdGVybSB8fCBjaCA9PSAwKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYnVmZmVyW2ljaF0gPSAwOwotCi0gICAgICAgICAgICAgICAgICBpZiAoaWNoID4gMCAmJiAhdGVzdF9vbmVfZmlsZShidWZmZXIsICZmb3JtYXRzLCBvcHRzLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlX2V4dHJhLCBsb2dfcGFzcykpCi0gICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAxOwotCi0gICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGljaCA9IDA7Ci0gICAgICAgICAgICAgICAgICAtLWljaDsgLyogc28gdGhhdCB0aGUgaW5jcmVtZW50IGJlbG93IHNldHMgaXQgdG8gMCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBidWZmZXJbaWNoXSA9IChjaGFyKWNoOwotICAgICAgICAgICAgfSB3aGlsZSAoKytpY2ggPCBzaXplb2YgYnVmZmVyKTsKLQotICAgICAgICAgICAgaWYgKGljaCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGJ1ZmZlclszMl0gPSAwOwotICAgICAgICAgICAgICAgYnVmZmVyWzQwOTVdID0gMDsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMuLi4lczogZmlsZSBuYW1lIHRvbyBsb25nXG4iLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICBidWZmZXIrKDQwOTYtMzIpKTsKLSAgICAgICAgICAgICAgIGV4aXQoOTkpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlIGlmICghdGVzdF9vbmVfZmlsZShhcmcsICZmb3JtYXRzLCBvcHRzLCBzdHJpZGVfZXh0cmEsIGxvZ19wYXNzKSkKLSAgICAgICAgICAgIHJldHZhbCA9IDE7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGlmIChvcHRzICYgQUNDVU1VTEFURSkKLSAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbjsKLQotICAgICAgcHJpbnRmKCIvKiBjb250cmliL2xpYnRlc3RzL3BuZ3N0ZXN0LWVycm9ycy5oXG4iKTsKLSAgICAgIHByaW50ZigiICpcbiIpOwotICAgICAgcHJpbnRmKCIgKiBCVUlMVCBVU0lORzoiIFBOR19IRUFERVJfVkVSU0lPTl9TVFJJTkcpOwotICAgICAgcHJpbnRmKCIgKlxuIik7Ci0gICAgICBwcmludGYoIiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuXG4iKTsKLSAgICAgIHByaW50ZigiICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lclxuIik7Ci0gICAgICBwcmludGYoIiAqIGFuZCBsaWNlbnNlIGluIHBuZy5oXG4iKTsKLSAgICAgIHByaW50ZigiICpcbiIpOwotICAgICAgcHJpbnRmKCIgKiBUSElTIElTIEEgTUFDSElORSBHRU5FUkFURUQgRklMRTogZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkhXG4iKTsKLSAgICAgIHByaW50ZigiICogSW5zdGVhZCBydW46XG4iKTsKLSAgICAgIHByaW50ZigiICpcbiIpOwotICAgICAgcHJpbnRmKCIgKiAgICBwbmdzdGVzdCAtLWFjY3VtdWxhdGVcbiIpOwotICAgICAgcHJpbnRmKCIgKlxuIik7Ci0gICAgICBwcmludGYoIiAqIG9uIGFzIG1hbnkgUE5HIGZpbGVzIGFzIHBvc3NpYmxlOyBhdCBsZWFzdCBQTkdTdWl0ZSBhbmRcbiIpOwotICAgICAgcHJpbnRmKCIgKiBjb250cmliL2xpYnRlc3RzL3Rlc3RwbmdzLlxuIik7Ci0gICAgICBwcmludGYoIiAqL1xuIik7Ci0KLSAgICAgIHByaW50Zigic3RhdGljIHBuZ191aW50XzE2IGdwY19lcnJvclsxNi8qaW4qL11bMTYvKm91dCovXVs0LyphKi9dID1cbiIpOwotICAgICAgcHJpbnRmKCJ7XG4iKTsKLSAgICAgIGZvciAoaW49MDsgaW48MTY7ICsraW4pCi0gICAgICB7Ci0gICAgICAgICB1bnNpZ25lZCBpbnQgb3V0OwotICAgICAgICAgcHJpbnRmKCIgeyAvKiBpbnB1dDogJXMgKi9cbiAiLCBmb3JtYXRfbmFtZXNbaW5dKTsKLSAgICAgICAgIGZvciAob3V0PTA7IG91dDwxNjsgKytvdXQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxwaGE7Ci0gICAgICAgICAgICBwcmludGYoIiB7Iik7Ci0gICAgICAgICAgICBmb3IgKGFscGhhPTA7IGFscGhhPDQ7ICsrYWxwaGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGYoIiAlZCIsIGdwY19lcnJvcltpbl1bb3V0XVthbHBoYV0pOwotICAgICAgICAgICAgICAgaWYgKGFscGhhIDwgMykgcHV0Y2hhcignLCcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCIgfSIpOwotICAgICAgICAgICAgaWYgKG91dCA8IDE1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcHV0Y2hhcignLCcpOwotICAgICAgICAgICAgICAgaWYgKG91dCAlIDQgPT0gMykgcHJpbnRmKCJcbiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50ZigiXG4gfSIpOwotCi0gICAgICAgICBpZiAoaW4gPCAxNSkKLSAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7Ci0gICAgICB9Ci0gICAgICBwcmludGYoIn07XG4iKTsKLQotICAgICAgcHJpbnRmKCJzdGF0aWMgcG5nX3VpbnRfMTYgZ3BjX2Vycm9yX3ZpYV9saW5lYXJbMTZdWzQvKm91dCovXVs0XSA9XG4iKTsKLSAgICAgIHByaW50Zigie1xuIik7Ci0gICAgICBmb3IgKGluPTA7IGluPDE2OyArK2luKQotICAgICAgewotICAgICAgICAgdW5zaWduZWQgaW50IG91dDsKLSAgICAgICAgIHByaW50ZigiIHsgLyogaW5wdXQ6ICVzICovXG4gIiwgZm9ybWF0X25hbWVzW2luXSk7Ci0gICAgICAgICBmb3IgKG91dD0wOyBvdXQ8NDsgKytvdXQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxwaGE7Ci0gICAgICAgICAgICBwcmludGYoIiB7Iik7Ci0gICAgICAgICAgICBmb3IgKGFscGhhPTA7IGFscGhhPDQ7ICsrYWxwaGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGYoIiAlZCIsIGdwY19lcnJvcl92aWFfbGluZWFyW2luXVtvdXRdW2FscGhhXSk7Ci0gICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAzKSBwdXRjaGFyKCcsJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludGYoIiB9Iik7Ci0gICAgICAgICAgICBpZiAob3V0IDwgMykKLSAgICAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50ZigiXG4gfSIpOwotCi0gICAgICAgICBpZiAoaW4gPCAxNSkKLSAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7Ci0gICAgICB9Ci0gICAgICBwcmludGYoIn07XG4iKTsKLQotICAgICAgcHJpbnRmKCJzdGF0aWMgcG5nX3VpbnRfMTYgZ3BjX2Vycm9yX3RvX2NvbG9ybWFwWzgvKmkqL11bOC8qbyovXVs0XSA9XG4iKTsKLSAgICAgIHByaW50Zigie1xuIik7Ci0gICAgICBmb3IgKGluPTA7IGluPDg7ICsraW4pCi0gICAgICB7Ci0gICAgICAgICB1bnNpZ25lZCBpbnQgb3V0OwotICAgICAgICAgcHJpbnRmKCIgeyAvKiBpbnB1dDogJXMgKi9cbiAiLCBmb3JtYXRfbmFtZXNbaW5dKTsKLSAgICAgICAgIGZvciAob3V0PTA7IG91dDw4OyArK291dCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBhbHBoYTsKLSAgICAgICAgICAgIHByaW50ZigiIHsiKTsKLSAgICAgICAgICAgIGZvciAoYWxwaGE9MDsgYWxwaGE8NDsgKythbHBoYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHByaW50ZigiICVkIiwgZ3BjX2Vycm9yX3RvX2NvbG9ybWFwW2luXVtvdXRdW2FscGhhXSk7Ci0gICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAzKSBwdXRjaGFyKCcsJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludGYoIiB9Iik7Ci0gICAgICAgICAgICBpZiAob3V0IDwgNykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICAgICAgICAgICAgIGlmIChvdXQgJSA0ID09IDMpIHByaW50ZigiXG4gIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBwcmludGYoIlxuIH0iKTsKLQotICAgICAgICAgaWYgKGluIDwgNykKLSAgICAgICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7Ci0gICAgICB9Ci0gICAgICBwcmludGYoIn07XG4iKTsKLSAgICAgIHByaW50ZigiLyogRU5EIE1BQ0hJTkUgR0VORVJBVEVEICovXG4iKTsKLSAgIH0KLQotICAgaWYgKHJldHZhbCA9PSAwICYmIHRvdWNoICE9IE5VTEwpCi0gICB7Ci0gICAgICBGSUxFICpmc3VjY2VzcyA9IGZvcGVuKHRvdWNoLCAid3QiKTsKLQotICAgICAgaWYgKGZzdWNjZXNzICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBpbnQgZXJyb3IgPSAwOwotICAgICAgICAgZnByaW50Zihmc3VjY2VzcywgIlBORyBzaW1wbGUgQVBJIHRlc3RzIHN1Y2NlZWRlZFxuIik7Ci0gICAgICAgICBmZmx1c2goZnN1Y2Nlc3MpOwotICAgICAgICAgZXJyb3IgPSBmZXJyb3IoZnN1Y2Nlc3MpOwotCi0gICAgICAgICBpZiAoZmNsb3NlKGZzdWNjZXNzKSB8fCBlcnJvcikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbGVkXG4iLCB0b3VjaCk7Ci0gICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuIGZhaWxlZFxuIiwgdG91Y2gpOwotICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiByZXR2YWw7Ci19Ci0KLSNlbHNlIC8qICFQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCAqLwotaW50IG1haW4odm9pZCkKLXsKLSAgIGZwcmludGYoc3RkZXJyLCAicG5nc3Rlc3Q6IG5vIHJlYWQgc3VwcG9ydCBpbiBsaWJwbmcsIHRlc3Qgc2tpcHBlZFxuIik7Ci0gICAvKiBTbyB0aGUgdGVzdCBpcyBza2lwcGVkOiAqLwotICAgcmV0dXJuIFNLSVA7Ci19Ci0jZW5kaWYgLyogUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbGlidGVzdHMvcG5ndW5rbm93bi5jIGIvY29udHJpYi9saWJ0ZXN0cy9wbmd1bmtub3duLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTUyODIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9saWJ0ZXN0cy9wbmd1bmtub3duLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg2ICswLDAgQEAKLQotLyogcG5ndW5rbm93bi5jIC0gdGVzdCB0aGUgcmVhZCBzaWRlIHVua25vd24gY2h1bmsgaGFuZGxpbmcKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMiBbTWF5IDI2LCAyMDE2XQotICogQ29weXJpZ2h0IChjKSAyMDE1LDIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBOT1RFUzoKLSAqICAgVGhpcyBpcyBhIEMgcHJvZ3JhbSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGxpbmtlZCBhZ2FpbnN0IGxpYnBuZy4gIEl0Ci0gKiAgIGFsbG93cyB0aGUgbGlicG5nIHVua25vd24gaGFuZGxpbmcgY29kZSB0byBiZSB0ZXN0ZWQgYnkgaW50ZXJwcmV0aW5nCi0gKiAgIGFyZ3VtZW50cyB0byBzYXZlIG9yIGRpc2NhcmQgY29tYmluYXRpb25zIG9mIGNodW5rcy4gIFRoZSBwcm9ncmFtIGlzCi0gKiAgIGN1cnJlbnRseSBqdXN0IGEgbWluaW1hbCB2YWxpZGF0aW9uIGZvciB0aGUgYnVpbHQtaW4gbGlicG5nIGZhY2lsaXRpZXMuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLS8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgotICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6Ci0gKi8KLSNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCi0jICBpbmNsdWRlIDxwbmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKLSNlbmRpZgotCi0vKiAxLjYuMSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgY29uZmlndXJlIHRlc3QgaGFybmVzcywgd2hpY2ggdXNlcyA3NyB0byBpbmRpY2F0ZQotICogYSBza2lwcGVkIHRlc3QsIGluIGVhcmxpZXIgdmVyc2lvbnMgd2UgbmVlZCB0byBzdWNjZWVkIG9uIGEgc2tpcHBlZCB0ZXN0LCBzbzoKLSAqLwotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNjAxICYmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkKLSMgIGRlZmluZSBTS0lQIDc3Ci0jZWxzZQotIyAgZGVmaW5lIFNLSVAgMAotI2VuZGlmCi0KLQotLyogU2luY2UgdGhpcyBwcm9ncmFtIHRlc3RzIHRoZSBhYmlsaXR5IHRvIGNoYW5nZSB0aGUgdW5rbm93biBjaHVuayBoYW5kbGluZwotICogdGhlc2UgbXVzdCBiZSBkZWZpbmVkOgotICovCi0jaWYgZGVmaW5lZChQTkdfU0VUX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkgJiZcCi0gICBkZWZpbmVkKFBOR19TVERJT19TVVBQT1JURUQpICYmXAotICAgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpCi0KLS8qIE9uZSBvZiB0aGVzZSBtdXN0IGJlIGRlZmluZWQgdG8gYWxsb3cgdXMgdG8gZmluZCBvdXQgd2hhdCBoYXBwZW5lZC4gIEl0IGlzCi0gKiBzdGlsbCB1c2VmdWwgdG8gc2V0IHVua25vd24gY2h1bmsgaGFuZGxpbmcgd2l0aG91dCBlaXRoZXIgb2YgdGhlc2UgaW4gb3JkZXIKLSAqIHRvIGNhdXNlICprbm93biogY2h1bmtzIHRvIGJlIGRpc2NhcmRlZC4gIFRoaXMgY2FuIGJlIGEgc2lnbmlmaWNhbnQKLSAqIGVmZmljaWVuY3kgZ2FpbiwgYnV0IGl0IGNhbid0IHJlYWxseSBiZSB0ZXN0ZWQgaGVyZS4KLSAqLwotI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVEKSB8fFwKLSAgIGRlZmluZWQoUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDUwMAotLyogVGhpcyBkZWxpYmVyYXRlbHkgbGFja3MgdGhlIFBOR19DT05TVC4gKi8KLXR5cGVkZWYgcG5nX2J5dGUgKnBuZ19jb25zdF9ieXRlcDsKLQotLyogVGhpcyBpcyBjb3BpZWQgZnJvbSAxLjUuMSBwbmcuaDogKi8KLSNkZWZpbmUgUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMgNwotI2RlZmluZSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcykgKCgoMVUmfihwYXNzKSk8PCgzLSgocGFzcyk+PjEpKSkmNykKLSNkZWZpbmUgUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpICgoKDFVJiAocGFzcykpPDwoMy0oKChwYXNzKSsxKT4+MSkpKSY3KQotI2RlZmluZSBQTkdfUEFTU19ST1dfU0hJRlQocGFzcykgKChwYXNzKT4yPyg4LShwYXNzKSk+PjE6MykKLSNkZWZpbmUgUE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpICgocGFzcyk+MT8oNy0ocGFzcykpPj4xOjMpCi0jZGVmaW5lIFBOR19QQVNTX1JPV1MoaGVpZ2h0LCBwYXNzKSAoKChoZWlnaHQpKygoKDE8PFBOR19QQVNTX1JPV19TSElGVChwYXNzKSlcCi0gICAtMSktUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpKSk+PlBOR19QQVNTX1JPV19TSElGVChwYXNzKSkKLSNkZWZpbmUgUE5HX1BBU1NfQ09MUyh3aWR0aCwgcGFzcykgKCgod2lkdGgpKygoKDE8PFBOR19QQVNTX0NPTF9TSElGVChwYXNzKSlcCi0gICAtMSktUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpKSk+PlBOR19QQVNTX0NPTF9TSElGVChwYXNzKSkKLSNkZWZpbmUgUE5HX1JPV19GUk9NX1BBU1NfUk9XKHlJbiwgcGFzcykgXAotICAgKCgoeUluKTw8UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKStQTkdfUEFTU19TVEFSVF9ST1cocGFzcykpCi0jZGVmaW5lIFBOR19DT0xfRlJPTV9QQVNTX0NPTCh4SW4sIHBhc3MpIFwKLSAgICgoKHhJbik8PFBOR19QQVNTX0NPTF9TSElGVChwYXNzKSkrUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpKQotI2RlZmluZSBQTkdfUEFTU19NQVNLKHBhc3Msb2ZmKSAoIFwKLSAgICgoMHgxMTAxNDVBRlU+PigoKDctKG9mZikpLShwYXNzKSk8PDIpKSAmIDB4RlUpIHwgXAotICAgKCgweDAxMTQ1QUYwVT4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGMFUpKQotI2RlZmluZSBQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKHksIHBhc3MpIFwKLSAgICgoUE5HX1BBU1NfTUFTSyhwYXNzLDApID4+ICgoeSkmNykpICYgMSkKLSNkZWZpbmUgUE5HX0NPTF9JTl9JTlRFUkxBQ0VfUEFTUyh4LCBwYXNzKSBcCi0gICAoKFBOR19QQVNTX01BU0socGFzcywxKSA+PiAoKHgpJjcpKSAmIDEpCi0KLS8qIFRoZXNlIGFyZSBuZWVkZWQgdG9vIGZvciB0aGUgZGVmYXVsdCBidWlsZDogKi8KLSNkZWZpbmUgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF8xNkJJVF9TVVBQT1JURUQKLQotLyogVGhpcyBjb21lcyBmcm9tIHBuZ2xpYmNvbmYuaCBhZmVyIDEuNTogKi8KLSNkZWZpbmUgUE5HX0ZQXzEgMTAwMDAwCi0jZGVmaW5lIFBOR19HQU1NQV9USFJFU0hPTERfRklYRURcCi0gICAoKHBuZ19maXhlZF9wb2ludCkoUE5HX0dBTU1BX1RIUkVTSE9MRCAqIFBOR19GUF8xKSkKLSNlbmRpZgotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDYwMAotICAgLyogMS42LjAgY29uc3RpZmllcyBtYW55IEFQSXMuIFRoZSBmb2xsb3dpbmcgZXhpc3RzIHRvIGFsbG93IHBuZ3ZhbGlkIHRvIGJlCi0gICAgKiBjb21waWxlZCBhZ2FpbnN0IGVhcmxpZXIgdmVyc2lvbnMuCi0gICAgKi8KLSMgIGRlZmluZSBwbmdfY29uc3Rfc3RydWN0cCBwbmdfc3RydWN0cAotI2VuZGlmCi0KLSNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCi0gICAvKiBDb3BpZWQgZnJvbSBsaWJwbmcgMS43LjAgcG5nLmggKi8KLSNkZWZpbmUgUE5HX3UyKGIxLCBiMikgKCgodW5zaWduZWQgaW50KShiMSkgPDwgOCkgKyAoYjIpKQotCi0jZGVmaW5lIFBOR19VMTYoYjEsIGIyKSAoKHBuZ191aW50XzE2KVBOR191MihiMSwgYjIpKQotI2RlZmluZSBQTkdfVTMyKGIxLCBiMiwgYjMsIGI0KVwKLSAgICgoKHBuZ191aW50XzMyKVBOR191MihiMSwgYjIpIDw8IDE2KSArIFBOR191MihiMywgYjQpKQotCi0vKiBDb25zdGFudHMgZm9yIGtub3duIGNodW5rIHR5cGVzLgotICovCi0jZGVmaW5lIHBuZ19JREFUIFBOR19VMzIoIDczLCAgNjgsICA2NSwgIDg0KQotI2RlZmluZSBwbmdfSUVORCBQTkdfVTMyKCA3MywgIDY5LCAgNzgsICA2OCkKLSNkZWZpbmUgcG5nX0lIRFIgUE5HX1UzMiggNzMsICA3MiwgIDY4LCAgODIpCi0jZGVmaW5lIHBuZ19QTFRFIFBOR19VMzIoIDgwLCAgNzYsICA4NCwgIDY5KQotI2RlZmluZSBwbmdfYktHRCBQTkdfVTMyKCA5OCwgIDc1LCAgNzEsICA2OCkKLSNkZWZpbmUgcG5nX2NIUk0gUE5HX1UzMiggOTksICA3MiwgIDgyLCAgNzcpCi0jZGVmaW5lIHBuZ19mUkFjIFBOR19VMzIoMTAyLCAgODIsICA2NSwgIDk5KSAvKiByZWdpc3RlcmVkLCBub3QgZGVmaW5lZCAqLwotI2RlZmluZSBwbmdfZ0FNQSBQTkdfVTMyKDEwMywgIDY1LCAgNzcsICA2NSkKLSNkZWZpbmUgcG5nX2dJRmcgUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMDMpCi0jZGVmaW5lIHBuZ19nSUZ0IFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTE2KSAvKiBkZXByZWNhdGVkICovCi0jZGVmaW5lIHBuZ19nSUZ4IFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTIwKQotI2RlZmluZSBwbmdfaElTVCBQTkdfVTMyKDEwNCwgIDczLCAgODMsICA4NCkKLSNkZWZpbmUgcG5nX2lDQ1AgUE5HX1UzMigxMDUsICA2NywgIDY3LCAgODApCi0jZGVmaW5lIHBuZ19pVFh0IFBOR19VMzIoMTA1LCAgODQsICA4OCwgMTE2KQotI2RlZmluZSBwbmdfb0ZGcyBQTkdfVTMyKDExMSwgIDcwLCAgNzAsIDExNSkKLSNkZWZpbmUgcG5nX3BDQUwgUE5HX1UzMigxMTIsICA2NywgIDY1LCAgNzYpCi0jZGVmaW5lIHBuZ19wSFlzIFBOR19VMzIoMTEyLCAgNzIsICA4OSwgMTE1KQotI2RlZmluZSBwbmdfc0JJVCBQTkdfVTMyKDExNSwgIDY2LCAgNzMsICA4NCkKLSNkZWZpbmUgcG5nX3NDQUwgUE5HX1UzMigxMTUsICA2NywgIDY1LCAgNzYpCi0jZGVmaW5lIHBuZ19zUExUIFBOR19VMzIoMTE1LCAgODAsICA3NiwgIDg0KQotI2RlZmluZSBwbmdfc1JHQiBQTkdfVTMyKDExNSwgIDgyLCAgNzEsICA2NikKLSNkZWZpbmUgcG5nX3NURVIgUE5HX1UzMigxMTUsICA4NCwgIDY5LCAgODIpCi0jZGVmaW5lIHBuZ190RVh0IFBOR19VMzIoMTE2LCAgNjksICA4OCwgMTE2KQotI2RlZmluZSBwbmdfdElNRSBQTkdfVTMyKDExNiwgIDczLCAgNzcsICA2OSkKLSNkZWZpbmUgcG5nX3RSTlMgUE5HX1UzMigxMTYsICA4MiwgIDc4LCAgODMpCi0jZGVmaW5lIHBuZ196VFh0IFBOR19VMzIoMTIyLCAgODQsICA4OCwgMTE2KQotCi0vKiBUZXN0IG9uIGZsYWcgdmFsdWVzIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKHNlY3Rpb24gNS40KTogKi8KLSNkZWZpbmUgUE5HX0NIVU5LX0FOQ0lMTEFSWShjKSAgICAoMSAmICgoYykgPj4gMjkpKQotI2RlZmluZSBQTkdfQ0hVTktfQ1JJVElDQUwoYykgICAgICghUE5HX0NIVU5LX0FOQ0lMTEFSWShjKSkKLSNkZWZpbmUgUE5HX0NIVU5LX1BSSVZBVEUoYykgICAgICAoMSAmICgoYykgPj4gMjEpKQotI2RlZmluZSBQTkdfQ0hVTktfUkVTRVJWRUQoYykgICAgICgxICYgKChjKSA+PiAxMykpCi0jZGVmaW5lIFBOR19DSFVOS19TQUZFX1RPX0NPUFkoYykgKDEgJiAoKGMpID4+ICA1KSkKLQotI2VuZGlmIC8qIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jICBkZWZpbmUgdGhpcyBub3RfdGhlX2NwcF90aGlzCi0jICBkZWZpbmUgbmV3IG5vdF90aGVfY3BwX25ldwotIyAgZGVmaW5lIHZvaWRjYXN0KHR5cGUsIHZhbHVlKSBzdGF0aWNfY2FzdDx0eXBlPih2YWx1ZSkKLSNlbHNlCi0jICBkZWZpbmUgdm9pZGNhc3QodHlwZSwgdmFsdWUpICh2YWx1ZSkKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciBlcnJvcnMgYXJlIHJlbW92ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybyB3aGljaCBpcwotICogZXhwZWN0ZWQgdG8gaGF2ZSBubyBiYWQgZWZmZWN0cyBvbiBwZXJmb3JtYW5jZS4KLSAqLwotI2lmbmRlZiBVTlVTRUQKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCi0jICAgICBkZWZpbmUgVU5VU0VEKHBhcmFtKSAodm9pZClwYXJhbTsKLSMgIGVsc2UKLSMgICAgIGRlZmluZSBVTlVTRUQocGFyYW0pCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIFR5cGVzIG9mIGNodW5rcyBub3Qga25vd24gdG8gbGlicG5nICovCi0jZGVmaW5lIHBuZ192cEFnIFBOR19VMzIoMTE4LCAxMTIsIDY1LCAxMDMpCi0KLS8qIENodW5rIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFBOR19JTkZPX3RFWHQgMHgxMDAwMDAwMFUKLSNkZWZpbmUgUE5HX0lORk9faVRYdCAweDIwMDAwMDAwVQotI2RlZmluZSBQTkdfSU5GT196VFh0IDB4NDAwMDAwMDBVCi0KLSNkZWZpbmUgUE5HX0lORk9fc1RFUiAweDAxMDAwMDAwVQotI2RlZmluZSBQTkdfSU5GT192cEFnIDB4MDIwMDAwMDBVCi0KLSNkZWZpbmUgQUJTRU5UICAwCi0jZGVmaW5lIFNUQVJUICAgMQotI2RlZmluZSBFTkQgICAgIDIKLQotc3RhdGljIHN0cnVjdAotewotICAgY2hhciAgICAgICAgbmFtZVs1XTsKLSAgIHBuZ191aW50XzMyIGZsYWc7Ci0gICBwbmdfdWludF8zMiB0YWc7Ci0gICBpbnQgICAgICAgICB1bmtub3duOyAgICAvKiBDaHVuayBub3Qga25vd24gdG8gbGlicG5nICovCi0gICBpbnQgICAgICAgICBhbGw7ICAgICAgICAvKiBDaHVuayBzZXQgYnkgdGhlICctMScgb3B0aW9uICovCi0gICBpbnQgICAgICAgICBwb3NpdGlvbjsgICAvKiBwb3NpdGlvbiBpbiBwbmd0ZXN0LnBuZyAqLwotICAgaW50ICAgICAgICAga2VlcDsgICAgICAgLyogdW5rbm93biBoYW5kbGluZyBzZXR0aW5nICovCi19IGNodW5rX2luZm9bXSA9IHsKLSAgIC8qIENyaXRpY2FsIGNodW5rcyAqLwotICAgeyAiSURBVCIsIFBOR19JTkZPX0lEQVQsIHBuZ19JREFULCAwLCAwLCAgU1RBUlQsIDAgfSwgLyogbXVzdCBiZSBbMF0gKi8KLSAgIHsgIlBMVEUiLCBQTkdfSU5GT19QTFRFLCBwbmdfUExURSwgMCwgMCwgQUJTRU5ULCAwIH0sCi0KLSAgIC8qIE5vbi1jcml0aWNhbCBjaHVua3MgdGhhdCBsaWJwbmcgaGFuZGxlcyAqLwotICAgLyogVGhpcyBpcyBhIG1lc3MgYnV0IGl0IHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byBkbyBpdCAtIHRoZXJlIGlzIG5vIHdheQotICAgICogdG8gY2hlY2sgZm9yIGEgZGVmaW5pdGlvbiBvdXRzaWRlIGEgI2lmLgotICAgICovCi0gICB7ICJiS0dEIiwgUE5HX0lORk9fYktHRCwgcG5nX2JLR0QsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJjSFJNIiwgUE5HX0lORk9fY0hSTSwgcG5nX2NIUk0sCi0jICAgICBpZmRlZiBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJnQU1BIiwgUE5HX0lORk9fZ0FNQSwgcG5nX2dBTUEsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJoSVNUIiwgUE5HX0lORk9faElTVCwgcG5nX2hJU1QsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgQUJTRU5ULCAwIH0sCi0gICB7ICJpQ0NQIiwgUE5HX0lORk9faUNDUCwgcG5nX2lDQ1AsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgQUJTRU5ULCAwIH0sCi0gICB7ICJpVFh0IiwgUE5HX0lORk9faVRYdCwgcG5nX2lUWHQsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgQUJTRU5ULCAwIH0sCi0gICB7ICJvRkZzIiwgUE5HX0lORk9fb0ZGcywgcG5nX29GRnMsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJwQ0FMIiwgUE5HX0lORk9fcENBTCwgcG5nX3BDQUwsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJwSFlzIiwgUE5HX0lORk9fcEhZcywgcG5nX3BIWXMsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJzQklUIiwgUE5HX0lORk9fc0JJVCwgcG5nX3NCSVQsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJzQ0FMIiwgUE5HX0lORk9fc0NBTCwgcG5nX3NDQUwsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJzUExUIiwgUE5HX0lORk9fc1BMVCwgcG5nX3NQTFQsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgQUJTRU5ULCAwIH0sCi0gICB7ICJzUkdCIiwgUE5HX0lORk9fc1JHQiwgcG5nX3NSR0IsCi0jICAgICBpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJ0RVh0IiwgUE5HX0lORk9fdEVYdCwgcG5nX3RFWHQsCi0jICAgICBpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJ0SU1FIiwgUE5HX0lORk9fdElNRSwgcG5nX3RJTUUsCi0jICAgICBpZmRlZiBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgIFNUQVJULCAwIH0sCi0gICB7ICJ0Uk5TIiwgUE5HX0lORk9fdFJOUywgcG5nX3RSTlMsCi0jICAgICBpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMCwgQUJTRU5ULCAwIH0sCi0gICB7ICJ6VFh0IiwgUE5HX0lORk9felRYdCwgcG5nX3pUWHQsCi0jICAgICBpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAotICAgICAgICAgMCwKLSMgICAgIGVsc2UKLSAgICAgICAgIDEsCi0jICAgICBlbmRpZgotICAgICAgMSwgICAgRU5ELCAwIH0sCi0KLSAgIC8qIE5vIGxpYnBuZyBoYW5kbGluZyAqLwotICAgeyAic1RFUiIsIFBOR19JTkZPX3NURVIsIHBuZ19zVEVSLCAxLCAxLCAgU1RBUlQsIDAgfSwKLSAgIHsgInZwQWciLCBQTkdfSU5GT192cEFnLCBwbmdfdnBBZywgMSwgMCwgIFNUQVJULCAwIH0sCi19OwotCi0jZGVmaW5lIE5JTkZPICgoaW50KSgoc2l6ZW9mIGNodW5rX2luZm8pLyhzaXplb2YgY2h1bmtfaW5mb1swXSkpKQotCi1zdGF0aWMgdm9pZAotY2xlYXJfa2VlcCh2b2lkKQotewotICAgaW50IGkgPSBOSU5GTzsKLSAgIHdoaWxlICgtLWkgPj0gMCkKLSAgICAgIGNodW5rX2luZm9baV0ua2VlcCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWZpbmQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgIGludCBpID0gTklORk87Ci0gICB3aGlsZSAoLS1pID49IDApCi0gICB7Ci0gICAgICBpZiAobWVtY21wKGNodW5rX2luZm9baV0ubmFtZSwgbmFtZSwgNCkgPT0gMCkKLSAgICAgICAgIGJyZWFrOwotICAgfQotCi0gICByZXR1cm4gaTsKLX0KLQotc3RhdGljIGludAotZmluZGIoY29uc3QgcG5nX2J5dGUgKm5hbWUpCi17Ci0gICBpbnQgaSA9IE5JTkZPOwotICAgd2hpbGUgKC0taSA+PSAwKQotICAgewotICAgICAgaWYgKG1lbWNtcChjaHVua19pbmZvW2ldLm5hbWUsIG5hbWUsIDQpID09IDApCi0gICAgICAgICBicmVhazsKLSAgIH0KLQotICAgcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbnQKLWZpbmRfYnlfZmxhZyhwbmdfdWludF8zMiBmbGFnKQotewotICAgaW50IGkgPSBOSU5GTzsKLQotICAgd2hpbGUgKC0taSA+PSAwKSBpZiAoY2h1bmtfaW5mb1tpXS5mbGFnID09IGZsYWcpIHJldHVybiBpOwotCi0gICBmcHJpbnRmKHN0ZGVyciwgInBuZ3Vua25vd246IGludGVybmFsIGVycm9yXG4iKTsKLSAgIGV4aXQoNCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWFuY2lsbGFyeShjb25zdCBjaGFyICpuYW1lKQotewotICAgcmV0dXJuIFBOR19DSFVOS19BTkNJTExBUlkoUE5HX1UzMihuYW1lWzBdLCBuYW1lWzFdLCBuYW1lWzJdLCBuYW1lWzNdKSk7Ci19Ci0KLSNpZmRlZiBQTkdfU0FWRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLXN0YXRpYyBpbnQKLWFuY2lsbGFyeWIoY29uc3QgcG5nX2J5dGUgKm5hbWUpCi17Ci0gICByZXR1cm4gUE5HX0NIVU5LX0FOQ0lMTEFSWShQTkdfVTMyKG5hbWVbMF0sIG5hbWVbMV0sIG5hbWVbMl0sIG5hbWVbM10pKTsKLX0KLSNlbmRpZgotCi0vKiBUeXBlIG9mIGFuIGVycm9yX3B0ciAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIGptcF9idWYgICAgIGVycm9yX3JldHVybjsKLSAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7Ci0gICBwbmdfaW5mb3AgICBpbmZvX3B0ciwgZW5kX3B0cjsKLSAgIHBuZ191aW50XzMyIGJlZm9yZV9JREFUOwotICAgcG5nX3VpbnRfMzIgYWZ0ZXJfSURBVDsKLSAgIGludCAgICAgICAgIGVycm9yX2NvdW50OwotICAgaW50ICAgICAgICAgd2FybmluZ19jb3VudDsKLSAgIGludCAgICAgICAgIGtlZXA7IC8qIHRoZSBkZWZhdWx0IHZhbHVlICovCi0gICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgY29uc3QgY2hhciAqZmlsZTsKLSAgIGNvbnN0IGNoYXIgKnRlc3Q7Ci19IGRpc3BsYXk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGluaXRbXSA9ICJpbml0aWFsaXphdGlvbiI7Ci1zdGF0aWMgY29uc3QgY2hhciBjbWRbXSA9ICJjb21tYW5kIGxpbmUiOwotCi1zdGF0aWMgdm9pZAotaW5pdF9kaXNwbGF5KGRpc3BsYXkgKmQsIGNvbnN0IGNoYXIgKnByb2dyYW0pCi17Ci0gICBtZW1zZXQoZCwgMCwgc2l6ZW9mICpkKTsKLSAgIGQtPnBuZ19wdHIgPSBOVUxMOwotICAgZC0+aW5mb19wdHIgPSBkLT5lbmRfcHRyID0gTlVMTDsKLSAgIGQtPmVycm9yX2NvdW50ID0gZC0+d2FybmluZ19jb3VudCA9IDA7Ci0gICBkLT5wcm9ncmFtID0gcHJvZ3JhbTsKLSAgIGQtPmZpbGUgPSBwcm9ncmFtOwotICAgZC0+dGVzdCA9IGluaXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGVhbl9kaXNwbGF5KGRpc3BsYXkgKmQpCi17Ci0gICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmZC0+cG5nX3B0ciwgJmQtPmluZm9fcHRyLCAmZC0+ZW5kX3B0cik7Ci0KLSAgIC8qIFRoaXMgbXVzdCBub3QgaGFwcGVuIC0gaXQgbWlnaHQgY2F1c2UgYW4gYXBwIGNyYXNoICovCi0gICBpZiAoZC0+cG5nX3B0ciAhPSBOVUxMIHx8IGQtPmluZm9fcHRyICE9IE5VTEwgfHwgZC0+ZW5kX3B0ciAhPSBOVUxMKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IHBuZ19kZXN0cm95X3JlYWRfc3RydWN0IGVycm9yXG4iLCBkLT5maWxlLAotICAgICAgICAgZC0+dGVzdCk7Ci0gICAgICBleGl0KDEpOwotICAgfQotfQotCi1QTkdfRlVOQ1RJT04odm9pZCwgZGlzcGxheV9leGl0LCAoZGlzcGxheSAqZCksIHN0YXRpYyBQTkdfTk9SRVRVUk4pCi17Ci0gICArKyhkLT5lcnJvcl9jb3VudCk7Ci0KLSAgIGlmIChkLT5wbmdfcHRyICE9IE5VTEwpCi0gICAgICBjbGVhbl9kaXNwbGF5KGQpOwotCi0gICAvKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGlmIHRoaXMgaXMgYSBzaW5nbGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHNldAotICAgICogZXhpdCBub3cgLSB0aGVyZSBpcyBvbmx5IG9uZSB0ZXN0LCBvdGhlcndpc2UgbG9uZ2ptcCB0byBkbyB0aGUgbmV4dCB0ZXN0LgotICAgICovCi0gICBpZiAoZC0+dGVzdCA9PSBpbml0IHx8IGQtPnRlc3QgPT0gY21kKQotICAgICAgZXhpdCgxKTsKLQotICAgbG9uZ2ptcChkLT5lcnJvcl9yZXR1cm4sIDEpOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X3JjKGNvbnN0IGRpc3BsYXkgKmQsIGludCBzdHJpY3QpCi17Ci0gICByZXR1cm4gZC0+ZXJyb3JfY291bnQgKyAoc3RyaWN0ID8gZC0+d2FybmluZ19jb3VudCA6IDApOwotfQotCi0vKiBsaWJwbmcgZXJyb3IgYW5kIHdhcm5pbmcgY2FsbGJhY2tzICovCi1QTkdfRlVOQ1RJT04odm9pZCwgKFBOR0NCQVBJIGVycm9yKSwgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpLAotICAgc3RhdGljIFBOR19OT1JFVFVSTikKLXsKLSAgIGRpc3BsYXkgKmQgPSAoZGlzcGxheSopcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7Ci0KLSAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiBsaWJwbmcgZXJyb3I6ICVzXG4iLCBkLT5maWxlLCBkLT50ZXN0LCBtZXNzYWdlKTsKLSAgIGRpc3BsYXlfZXhpdChkKTsKLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLXdhcm5pbmcocG5nX3N0cnVjdHAgcG5nX3B0ciwgY29uc3QgY2hhciAqbWVzc2FnZSkKLXsKLSAgIGRpc3BsYXkgKmQgPSAoZGlzcGxheSopcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7Ci0KLSAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiBsaWJwbmcgd2FybmluZzogJXNcbiIsIGQtPmZpbGUsIGQtPnRlc3QsIG1lc3NhZ2UpOwotICAgKysoZC0+d2FybmluZ19jb3VudCk7Ci19Ci0KLXN0YXRpYyBwbmdfdWludF8zMgotZ2V0X3ZhbGlkKGRpc3BsYXkgKmQsIHBuZ19pbmZvcCBpbmZvX3B0cikKLXsKLSAgIHBuZ191aW50XzMyIGZsYWdzID0gcG5nX2dldF92YWxpZChkLT5wbmdfcHRyLCBpbmZvX3B0ciwgKHBuZ191aW50XzMyKX4wKTsKLQotICAgLyogTWFwIHRoZSB0ZXh0IGNodW5rcyBiYWNrIGludG8gdGhlIGZsYWdzICovCi0gICB7Ci0gICAgICBwbmdfdGV4dHAgdGV4dDsKLSAgICAgIHBuZ191aW50XzMyIG50ZXh0ID0gcG5nX2dldF90ZXh0KGQtPnBuZ19wdHIsIGluZm9fcHRyLCAmdGV4dCwgTlVMTCk7Ci0KLSAgICAgIHdoaWxlIChudGV4dC0tID4gMCkgc3dpdGNoICh0ZXh0W250ZXh0XS5jb21wcmVzc2lvbikKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICBmbGFncyB8PSBQTkdfSU5GT190RVh0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmbGFncyB8PSBQTkdfSU5GT196VFh0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIDE6Ci0gICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmbGFncyB8PSBQTkdfSU5GT19pVFh0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IHVua25vd24gdGV4dCBjb21wcmVzc2lvbiAlZFxuIiwgZC0+ZmlsZSwKLSAgICAgICAgICAgICAgIGQtPnRlc3QsIHRleHRbbnRleHRdLmNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgIGRpc3BsYXlfZXhpdChkKTsKLSAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIGZsYWdzOwotfQotCi0jaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi1zdGF0aWMgaW50IFBOR0NCQVBJCi1yZWFkX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfdW5rbm93bl9jaHVua3AgcGMpCi17Ci0gICAvKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzIGJ5Ci0gICAgKiByZXR1cm5pbmcgJzAnIHRvIGtlZXAgdGhlIGNodW5rIGFuZCAnMScgdG8gZGlzY2FyZCBpdC4KLSAgICAqLwotICAgZGlzcGxheSAqZCA9IHZvaWRjYXN0KGRpc3BsYXkqLCBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKHBwKSk7Ci0gICBpbnQgY2h1bmsgPSBmaW5kYihwYy0+bmFtZSk7Ci0gICBpbnQga2VlcCwgZGlzY2FyZDsKLQotICAgaWYgKGNodW5rIDwgMCkgLyogbm90IG9uZSBpbiBvdXIgbGlzdCwgc28gbm90IGEga25vd24gY2h1bmsgKi8KLSAgICAgIGtlZXAgPSBkLT5rZWVwOwotCi0gICBlbHNlCi0gICB7Ci0gICAgICBrZWVwID0gY2h1bmtfaW5mb1tjaHVua10ua2VlcDsKLSAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkKLSAgICAgIHsKLSAgICAgICAgIC8qIFNlZSB0aGUgY29tbWVudHMgaW4gcG5nLmggLSB1c2UgdGhlIGRlZmF1bHQgZm9yIHVua25vd24gY2h1bmtzLAotICAgICAgICAgICogZG8gbm90IGtlZXAga25vd24gY2h1bmtzLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoY2h1bmtfaW5mb1tjaHVua10udW5rbm93bikKLSAgICAgICAgICAgIGtlZXAgPSBkLT5rZWVwOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBrZWVwID0gUE5HX0hBTkRMRV9DSFVOS19ORVZFUjsKLSAgICAgIH0KLSAgIH0KLQotICAgc3dpdGNoIChrZWVwKQotICAgewotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiAlZDogdW5yZWNvZ25pemVkIGNodW5rIG9wdGlvblxuIiwgZC0+ZmlsZSwKLSAgICAgICAgICAgIGQtPnRlc3QsIGNodW5rX2luZm9bY2h1bmtdLmtlZXApOwotICAgICAgICAgZGlzcGxheV9leGl0KGQpOwotCi0gICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKLSAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKLSAgICAgICAgIGRpc2NhcmQgPSAxLypoYW5kbGVkOyBkaXNjYXJkKi87Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkU6Ci0gICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTOgotICAgICAgICAgZGlzY2FyZCA9IDAvKm5vdCBoYW5kbGVkOyBrZWVwKi87Ci0gICAgICAgICBicmVhazsKLSAgIH0KLQotICAgLyogQWxzbyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNodW5rIGluIHRoZSBkaXNwbGF5LCB0aGUgcmVsZXZhbnQgZmxhZwotICAgICogaXMgc2V0IGlmIHRoZSBjaHVuayBpcyB0byBiZSBrZXB0ICgnbm90IGhhbmRsZWQnLikKLSAgICAqLwotICAgaWYgKGNodW5rID49IDApIGlmICghZGlzY2FyZCkgLyogc3R1cGlkaXR5IHRvIHN0b3AgYSBHQ0Mgd2FybmluZyAqLwotICAgewotICAgICAgcG5nX3VpbnRfMzIgZmxhZyA9IGNodW5rX2luZm9bY2h1bmtdLmZsYWc7Ci0KLSAgICAgIGlmIChwYy0+bG9jYXRpb24gJiBQTkdfQUZURVJfSURBVCkKLSAgICAgICAgIGQtPmFmdGVyX0lEQVQgfD0gZmxhZzsKLQotICAgICAgZWxzZQotICAgICAgICAgZC0+YmVmb3JlX0lEQVQgfD0gZmxhZzsKLSAgIH0KLQotICAgLyogSG93ZXZlciBpZiB0aGVyZSBpcyBubyBzdXBwb3J0IHRvIHN0b3JlIHVua25vd24gY2h1bmtzIGRvbid0IGFzayBsaWJwbmcgdG8KLSAgICAqIGRvIGl0OyB0aGVyZSB3aWxsIGJlIGFuIHBuZ19lcnJvci4KLSAgICAqLwotIyAgaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICByZXR1cm4gZGlzY2FyZDsKLSMgIGVsc2UKLSAgICAgIHJldHVybiAxOyAvKmhhbmRsZWQ7IGRpc2NhcmQqLwotIyAgZW5kaWYKLX0KLSNlbmRpZiAvKiBSRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi1zdGF0aWMgcG5nX3VpbnRfMzIKLWdldF91bmtub3duKGRpc3BsYXkgKmQsIHBuZ19pbmZvcCBpbmZvX3B0ciwgaW50IGFmdGVyX0lEQVQpCi17Ci0gICAvKiBDcmVhdGUgY29ycmVzcG9uZGluZyAndW5rbm93bicgZmxhZ3MgKi8KLSAgIHBuZ191aW50XzMyIGZsYWdzID0gMDsKLQotICAgVU5VU0VEKGFmdGVyX0lEQVQpCi0KLSAgIHsKLSAgICAgIHBuZ191bmtub3duX2NodW5rcCB1bmtub3duOwotICAgICAgaW50IG51bV91bmtub3duID0gcG5nX2dldF91bmtub3duX2NodW5rcyhkLT5wbmdfcHRyLCBpbmZvX3B0ciwgJnVua25vd24pOwotCi0gICAgICB3aGlsZSAoLS1udW1fdW5rbm93biA+PSAwKQotICAgICAgewotICAgICAgICAgaW50IGNodW5rID0gZmluZGIodW5rbm93bltudW1fdW5rbm93bl0ubmFtZSk7Ci0KLSAgICAgICAgIC8qIENodW5rcyBub3Qga25vd24gdG8gcG5ndW5rbm93biBtdXN0IGJlIHZhbGlkYXRlZCBoZXJlOyBzaW5jZSB0aGV5Ci0gICAgICAgICAgKiBtdXN0IGFsc28gYmUgdW5rbm93biB0byBsaWJwbmcgdGhlICdkaXNwbGF5LT5rZWVwJyBiZWhhdmlvciBzaG91bGQKLSAgICAgICAgICAqIGhhdmUgYmVlbiB1c2VkLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoY2h1bmsgPCAwKSBzd2l0Y2ggKGQtPmtlZXApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OiAvKiBpbXBvc3NpYmxlICovCi0gICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKLSAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiAlczogJXM6IHVua25vd24gY2h1bmsgc2F2ZWRcbiIsCi0gICAgICAgICAgICAgICAgICBkLT5maWxlLCBkLT50ZXN0LCBkLT5rZWVwID8gImRpc2NhcmQiIDogImRlZmF1bHQiLAotICAgICAgICAgICAgICAgICAgdW5rbm93bltudW1fdW5rbm93bl0ubmFtZSk7Ci0gICAgICAgICAgICAgICArKyhkLT5lcnJvcl9jb3VudCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkU6Ci0gICAgICAgICAgICAgICBpZiAoIWFuY2lsbGFyeWIodW5rbm93bltudW1fdW5rbm93bl0ubmFtZSkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgICIlcyglcyk6IGlmLXNhZmU6ICVzOiB1bmtub3duIGNyaXRpY2FsIGNodW5rIHNhdmVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgZC0+ZmlsZSwgZC0+dGVzdCwgdW5rbm93bltudW1fdW5rbm93bl0ubmFtZSk7Ci0gICAgICAgICAgICAgICAgICArKyhkLT5lcnJvcl9jb3VudCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAoc2FmZSkgKi8KLSAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVM6Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZmxhZ3MgfD0gY2h1bmtfaW5mb1tjaHVua10uZmxhZzsKLSAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIGZsYWdzOwotfQotI2Vsc2UgLyogU0FWRV9VTktOT1dOX0NIVU5LUyAqLwotc3RhdGljIHBuZ191aW50XzMyCi1nZXRfdW5rbm93bihkaXNwbGF5ICpkLCBwbmdfaW5mb3AgaW5mb19wdHIsIGludCBhZnRlcl9JREFUKQotICAgLyogT3RoZXJ3aXNlIHRoaXMgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZXMgc2V0IGJ5IGFueSB1c2VyIGNhbGxiYWNrICovCi17Ci0gICBVTlVTRUQoaW5mb19wdHIpOwotCi0gICBpZiAoYWZ0ZXJfSURBVCkKLSAgICAgIHJldHVybiBkLT5hZnRlcl9JREFUOwotCi0gICBlbHNlCi0gICAgICByZXR1cm4gZC0+YmVmb3JlX0lEQVQ7Ci19Ci0KLSMgIGlmbmRlZiBQTkdfUkVBRF9VU0VSX0NIVU5LU19TVVBQT1JURUQKLSAgICAgIC8qIFRoZSAjZGVmaW5lcyBhYm92ZSBzaG91bGQgbWVhbiB0aGlzIGlzIG5ldmVyIHJlYWNoZWQsIGl0J3MganVzdCBoZXJlIGFzCi0gICAgICAgKiBhIGNoZWNrIHRvIGVuc3VyZSB0aGUgbG9naWMgaXMgY29ycmVjdC4KLSAgICAgICAqLwotIyAgICAgZXJyb3IgTm8gc3RvcmUgc3VwcG9ydCBhbmQgbm8gdXNlciBjaHVuayBzdXBwb3J0LCB0aGlzIHdpbGwgbm90IHdvcmsKLSMgIGVuZGlmIC8qIFJFQURfVVNFUl9DSFVOS1MgKi8KLSNlbmRpZiAvKiBTQVZFX1VOS05PV05fQ0hVTktTICovCi0KLXN0YXRpYyBpbnQKLWNoZWNrKEZJTEUgKmZwLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIHBuZ191aW50XzMycCBmbGFncy8qb3V0Ki8sCi0gICBkaXNwbGF5ICpkLCBpbnQgc2V0X2NhbGxiYWNrKQotewotICAgaW50IGksIG5wYXNzZXMsIGlwYXNzOwotICAgcG5nX3VpbnRfMzIgaGVpZ2h0OwotCi0gICBkLT5rZWVwID0gUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUOwotICAgZC0+YmVmb3JlX0lEQVQgPSAwOwotICAgZC0+YWZ0ZXJfSURBVCA9IDA7Ci0KLSAgIC8qIFNvbWUgb2YgdGhlc2UgZXJyb3JzIGFyZSBwZXJtYW5lbnRseSBmYXRhbCBhbmQgY2F1c2UgYW4gZXhpdCBoZXJlLCBvdGhlcnMKLSAgICAqIGFyZSBwZXItdGVzdCBhbmQgY2F1c2UgYW4gZXJyb3IgcmV0dXJuLgotICAgICovCi0gICBkLT5wbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIGQsIGVycm9yLAotICAgICAgd2FybmluZyk7Ci0gICBpZiAoZC0+cG5nX3B0ciA9PSBOVUxMKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBwbmcgc3RydWN0XG4iLCBkLT5maWxlLAotICAgICAgICAgZC0+dGVzdCk7Ci0gICAgICAvKiBUZXJtaW5hdGUgaGVyZSwgdGhpcyBlcnJvciBpcyBub3QgdGVzdCBzcGVjaWZpYy4gKi8KLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIGQtPmluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChkLT5wbmdfcHRyKTsKLSAgIGQtPmVuZF9wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KGQtPnBuZ19wdHIpOwotICAgaWYgKGQtPmluZm9fcHRyID09IE5VTEwgfHwgZC0+ZW5kX3B0ciA9PSBOVUxMKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBwbmcgaW5mb1xuIiwgZC0+ZmlsZSwKLSAgICAgICAgIGQtPnRlc3QpOwotICAgICAgY2xlYW5fZGlzcGxheShkKTsKLSAgICAgIGV4aXQoMSk7Ci0gICB9Ci0KLSAgIHBuZ19pbml0X2lvKGQtPnBuZ19wdHIsIGZwKTsKLQotIyAgaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICAvKiBUaGlzIGlzIG9ubHkgZG9uZSBpZiByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlcjsgaXQgaW50ZXJmZXJlcyB3aXRoIHRoZQotICAgICAgICogc3RhbmRhcmQgc3RvcmUvc2F2ZSBtZWNoYW5pc20uCi0gICAgICAgKi8KLSAgICAgIGlmIChzZXRfY2FsbGJhY2spCi0gICAgICAgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihkLT5wbmdfcHRyLCBkLCByZWFkX2NhbGxiYWNrKTsKLSMgIGVsc2UKLSAgICAgIFVOVVNFRChzZXRfY2FsbGJhY2spCi0jICBlbmRpZgotCi0gICAvKiBIYW5kbGUgZWFjaCBhcmd1bWVudCBpbiB0dXJuOyBtdWx0aXBsZSBzZXR0aW5ncyBhcmUgcG9zc2libGUgZm9yIHRoZSBzYW1lCi0gICAgKiBjaHVuayBhbmQgbXVsdGlwbGUgY2FsbHMgd2lsbCBvY2N1ciAodGhlIGxhc3Qgb25lIHNob3VsZCBvdmVycmlkZSBhbGwKLSAgICAqIHByZWNlZGluZyBvbmVzKS4KLSAgICAqLwotICAgZm9yIChpPTA7IGk8YXJnYzsgKytpKQotICAgewotICAgICAgY29uc3QgY2hhciAqZXF1YWxzID0gc3RyY2hyKGFyZ3ZbaV0sICc9Jyk7Ci0KLSAgICAgIGlmIChlcXVhbHMgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIGludCBjaHVuaywgb3B0aW9uOwotCi0gICAgICAgICBpZiAoc3RyY21wKGVxdWFscysxLCAiZGVmYXVsdCIpID09IDApCi0gICAgICAgICAgICBvcHRpb24gPSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQ7Ci0gICAgICAgICBlbHNlIGlmIChzdHJjbXAoZXF1YWxzKzEsICJkaXNjYXJkIikgPT0gMCkKLSAgICAgICAgICAgIG9wdGlvbiA9IFBOR19IQU5ETEVfQ0hVTktfTkVWRVI7Ci0gICAgICAgICBlbHNlIGlmIChzdHJjbXAoZXF1YWxzKzEsICJpZi1zYWZlIikgPT0gMCkKLSAgICAgICAgICAgIG9wdGlvbiA9IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRTsKLSAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChlcXVhbHMrMSwgInNhdmUiKSA9PSAwKQotICAgICAgICAgICAgb3B0aW9uID0gUE5HX0hBTkRMRV9DSFVOS19BTFdBWVM7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVzKTogJXM6IHVucmVjb2duaXplZCBjaHVuayBvcHRpb25cbiIsIGQtPmZpbGUsCi0gICAgICAgICAgICAgICBkLT50ZXN0LCBhcmd2W2ldKTsKLSAgICAgICAgICAgIGRpc3BsYXlfZXhpdChkKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgc3dpdGNoIChlcXVhbHMgLSBhcmd2W2ldKQotICAgICAgICAgewotICAgICAgICAgICAgY2FzZSA0OiAvKiBjaHVuayBuYW1lICovCi0gICAgICAgICAgICAgICBjaHVuayA9IGZpbmQoYXJndltpXSk7Ci0KLSAgICAgICAgICAgICAgIGlmIChjaHVuayA+PSAwKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogVGhlc2UgI2lmIHRlc3RzIGhhdmUgdGhlIGVmZmVjdCBvZiBza2lwcGluZyB0aGUgYXJndW1lbnRzCi0gICAgICAgICAgICAgICAgICAgKiBpZiBTQVZFIHN1cHBvcnQgaXMgdW5hdmFpbGFibGUgLSB3ZSBjYW4ndCBkbyBhIHVzZWZ1bCB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgKiBpbiB0aGlzIGNhc2UsIHNvIHdlIGp1c3QgY2hlY2sgdGhlIGFyZ3VtZW50cyEgIFRoaXMgY291bGQKLSAgICAgICAgICAgICAgICAgICAqIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUgYnkgdXNpbmcgdGhlIHJlYWQgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgICAgKi8KLSMgICAgICAgICAgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSID49IDEwNzAwICYmXAotICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQoUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbiA8IFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSkKLSMgICAgICAgICAgICAgICAgIGVuZGlmIC8qIDEuNysgU0FWRV9VTktOT1dOX0NIVU5LUyAqLwotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGUgbmFtZVs1XTsKLQotICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG5hbWUsIGNodW5rX2luZm9bY2h1bmtdLm5hbWUsIDUpOwotICAgICAgICAgICAgICAgICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKGQtPnBuZ19wdHIsIG9wdGlvbiwgbmFtZSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICBjaHVua19pbmZvW2NodW5rXS5rZWVwID0gb3B0aW9uOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6IC8qIGRlZmF1bHQgKi8KLSAgICAgICAgICAgICAgIGlmIChtZW1jbXAoYXJndltpXSwgImRlZmF1bHQiLCA3KSA9PSAwKQotICAgICAgICAgICAgICAgewotIyAgICAgICAgICAgICAgICAgaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA3MDAgJiZcCi0gICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZChQTkdfU0FWRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uIDwgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFKQotIyAgICAgICAgICAgICAgICAgZW5kaWYgLyogMS43KyBTQVZFX1VOS05PV05fQ0hVTktTICovCi0gICAgICAgICAgICAgICAgICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoZC0+cG5nX3B0ciwgb3B0aW9uLCBOVUxMLCAwKTsKLQotICAgICAgICAgICAgICAgICAgZC0+a2VlcCA9IG9wdGlvbjsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOiAvKiBhbGwgKi8KLSAgICAgICAgICAgICAgIGlmIChtZW1jbXAoYXJndltpXSwgImFsbCIsIDMpID09IDApCi0gICAgICAgICAgICAgICB7Ci0jICAgICAgICAgICAgICAgICBpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMCAmJlwKLSAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVkKFBOR19TQVZFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24gPCBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUpCi0jICAgICAgICAgICAgICAgICBlbmRpZiAvKiAxLjcrIFNBVkVfVU5LTk9XTl9DSFVOS1MgKi8KLSAgICAgICAgICAgICAgICAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhkLT5wbmdfcHRyLCBvcHRpb24sIE5VTEwsIC0xKTsKLQotICAgICAgICAgICAgICAgICAgZC0+a2VlcCA9IG9wdGlvbjsKLQotICAgICAgICAgICAgICAgICAgZm9yIChjaHVuayA9IDA7IGNodW5rIDwgTklORk87ICsrY2h1bmspCi0gICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfaW5mb1tjaHVua10uYWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfaW5mb1tjaHVua10ua2VlcCA9IG9wdGlvbjsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyogc29tZSBtaXNwbGFjZWQgPSAqLwotCi0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglcyk6ICVzOiB1bnJlY29nbml6ZWQgY2h1bmsgYXJndW1lbnRcbiIsIGQtPmZpbGUsCi0gICAgICAgICBkLT50ZXN0LCBhcmd2W2ldKTsKLSAgICAgIGRpc3BsYXlfZXhpdChkKTsKLSAgIH0KLQotICAgcG5nX3JlYWRfaW5mbyhkLT5wbmdfcHRyLCBkLT5pbmZvX3B0cik7Ci0KLSAgIHN3aXRjaCAocG5nX2dldF9pbnRlcmxhY2VfdHlwZShkLT5wbmdfcHRyLCBkLT5pbmZvX3B0cikpCi0gICB7Ci0gICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfTk9ORToKLSAgICAgICAgIG5wYXNzZXMgPSAxOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoKLSAgICAgICAgIG5wYXNzZXMgPSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUzsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgLyogSGFyZCBlcnJvciBiZWNhdXNlIGl0IGlzIG5vdCB0ZXN0IHNwZWNpZmljICovCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVzKTogaW52YWxpZCBpbnRlcmxhY2UgdHlwZVxuIiwgZC0+ZmlsZSwgZC0+dGVzdCk7Ci0gICAgICAgICBjbGVhbl9kaXNwbGF5KGQpOwotICAgICAgICAgZXhpdCgxKTsKLSAgIH0KLQotICAgLyogU2tpcCB0aGUgaW1hZ2UgZGF0YSwgaWYgSURBVCBpcyBub3QgYmVpbmcgaGFuZGxlZCB0aGVuIGRvbid0IGRvIHRoaXMKLSAgICAqIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSBhIENSQyBlcnJvci4KLSAgICAqLwotICAgaWYgKGNodW5rX2luZm9bMC8qSURBVCovXS5rZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkKLSAgIHsKLSAgICAgIHBuZ19zdGFydF9yZWFkX2ltYWdlKGQtPnBuZ19wdHIpOwotICAgICAgaGVpZ2h0ID0gcG5nX2dldF9pbWFnZV9oZWlnaHQoZC0+cG5nX3B0ciwgZC0+aW5mb19wdHIpOwotCi0gICAgICBpZiAobnBhc3NlcyA+IDEpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8zMiB3aWR0aCA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgoZC0+cG5nX3B0ciwgZC0+aW5mb19wdHIpOwotCi0gICAgICAgICBmb3IgKGlwYXNzPTA7IGlwYXNzPG5wYXNzZXM7ICsraXBhc3MpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiB3UGFzcyA9IFBOR19QQVNTX0NPTFMod2lkdGgsIGlwYXNzKTsKLQotICAgICAgICAgICAgaWYgKHdQYXNzID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHk7Ci0KLSAgICAgICAgICAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgKyt5KSBpZiAoUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBpcGFzcykpCi0gICAgICAgICAgICAgICAgICBwbmdfcmVhZF9yb3coZC0+cG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IC8qIGludGVybGFjZWQgKi8KLQotICAgICAgZWxzZSAvKiBub3QgaW50ZXJsYWNlZCAqLwotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgeTsKLQotICAgICAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyArK3kpCi0gICAgICAgICAgICBwbmdfcmVhZF9yb3coZC0+cG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHBuZ19yZWFkX2VuZChkLT5wbmdfcHRyLCBkLT5lbmRfcHRyKTsKLQotICAgZmxhZ3NbMF0gPSBnZXRfdmFsaWQoZCwgZC0+aW5mb19wdHIpOwotICAgZmxhZ3NbMV0gPSBnZXRfdW5rbm93bihkLCBkLT5pbmZvX3B0ciwgMC8qYmVmb3JlIElEQVQqLyk7Ci0KLSAgIC8qIE9ubHkgcG5nX3JlYWRfcG5nIHNldHMgUE5HX0lORk9fSURBVCEgKi8KLSAgIGZsYWdzW2NodW5rX2luZm9bMC8qSURBVCovXS5rZWVwICE9IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVF0gfD0KLSAgICAgIFBOR19JTkZPX0lEQVQ7Ci0KLSAgIGZsYWdzWzJdID0gZ2V0X3ZhbGlkKGQsIGQtPmVuZF9wdHIpOwotICAgZmxhZ3NbM10gPSBnZXRfdW5rbm93bihkLCBkLT5lbmRfcHRyLCAxLyphZnRlciBJREFUKi8pOwotCi0gICBjbGVhbl9kaXNwbGF5KGQpOwotCi0gICByZXR1cm4gZC0+a2VlcDsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2Vycm9yKGRpc3BsYXkgKmQsIHBuZ191aW50XzMyIGZsYWdzLCBjb25zdCBjaGFyICptZXNzYWdlKQotewotICAgd2hpbGUgKGZsYWdzKQotICAgewotICAgICAgcG5nX3VpbnRfMzIgZmxhZyA9IGZsYWdzICYgLShwbmdfaW50XzMyKWZsYWdzOwotICAgICAgaW50IGkgPSBmaW5kX2J5X2ZsYWcoZmxhZyk7Ci0KLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXMpOiBjaHVuayAlczogJXNcbiIsIGQtPmZpbGUsIGQtPnRlc3QsCi0gICAgICAgICBjaHVua19pbmZvW2ldLm5hbWUsIG1lc3NhZ2UpOwotICAgICAgKysoZC0+ZXJyb3JfY291bnQpOwotCi0gICAgICBmbGFncyAmPSB+ZmxhZzsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2hhbmRsaW5nKGRpc3BsYXkgKmQsIGludCBkZWYsIHBuZ191aW50XzMyIGNodW5rcywgcG5nX3VpbnRfMzIga25vd24sCi0gICBwbmdfdWludF8zMiB1bmtub3duLCBjb25zdCBjaGFyICpwb3NpdGlvbiwgaW50IHNldF9jYWxsYmFjaykKLXsKLSAgIHdoaWxlIChjaHVua3MpCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBmbGFnID0gY2h1bmtzICYgLShwbmdfaW50XzMyKWNodW5rczsKLSAgICAgIGludCBpID0gZmluZF9ieV9mbGFnKGZsYWcpOwotICAgICAgaW50IGtlZXAgPSBjaHVua19pbmZvW2ldLmtlZXA7Ci0gICAgICBjb25zdCBjaGFyICp0eXBlOwotICAgICAgY29uc3QgY2hhciAqZXJyb3J4ID0gTlVMTDsKLQotICAgICAgaWYgKGNodW5rX2luZm9baV0udW5rbm93bikKLSAgICAgIHsKLSAgICAgICAgIGlmIChrZWVwID09IFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGUgPSAiVU5LTk9XTiAoZGVmYXVsdCkiOwotICAgICAgICAgICAga2VlcCA9IGRlZjsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgdHlwZSA9ICJVTktOT1dOIChzcGVjaWZpZWQpIjsKLQotICAgICAgICAgaWYgKGZsYWcgJiBrbm93bikKLSAgICAgICAgICAgIGVycm9yeCA9ICJjaHVuayBwcm9jZXNzZWQiOwotCi0gICAgICAgICBlbHNlIHN3aXRjaCAoa2VlcCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUOgotICAgICAgICAgICAgICAgaWYgKGZsYWcgJiB1bmtub3duKQotICAgICAgICAgICAgICAgICAgZXJyb3J4ID0gIkRFRkFVTFQ6IHVua25vd24gY2h1bmsgc2F2ZWQiOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUjoKLSAgICAgICAgICAgICAgIGlmIChmbGFnICYgdW5rbm93bikKLSAgICAgICAgICAgICAgICAgIGVycm9yeCA9ICJESVNDQVJEOiB1bmtub3duIGNodW5rIHNhdmVkIjsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRToKLSAgICAgICAgICAgICAgIGlmIChhbmNpbGxhcnkoY2h1bmtfaW5mb1tpXS5uYW1lKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICghKGZsYWcgJiB1bmtub3duKSkKLSAgICAgICAgICAgICAgICAgICAgIGVycm9yeCA9ICJJRi1TQUZFOiB1bmtub3duIGFuY2lsbGFyeSBjaHVuayBsb3N0IjsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyAmIHVua25vd24pCi0gICAgICAgICAgICAgICAgICBlcnJvcnggPSAiSUYtU0FGRTogdW5rbm93biBjcml0aWNhbCBjaHVuayBzYXZlZCI7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUzoKLSAgICAgICAgICAgICAgIGlmICghKGZsYWcgJiB1bmtub3duKSkKLSAgICAgICAgICAgICAgICAgIGVycm9yeCA9ICJTQVZFOiB1bmtub3duIGNodW5rIGxvc3QiOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICBlcnJvcnggPSAiaW50ZXJuYWwgZXJyb3I6IGJhZCBrZWVwIjsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfSAvKiB1bmtub3duIGNodW5rICovCi0KLSAgICAgIGVsc2UgLyoga25vd24gY2h1bmsgKi8KLSAgICAgIHsKLSAgICAgICAgIHR5cGUgPSAiS05PV04iOwotCi0gICAgICAgICBpZiAoZmxhZyAmIGtub3duKQotICAgICAgICAgewotICAgICAgICAgICAgLyogY2h1bmsgd2FzIHByb2Nlc3NlZCwgaXQgd29uJ3QgaGF2ZSBiZWVuIHNhdmVkIGJlY2F1c2UgdGhhdCBpcwotICAgICAgICAgICAgICogY2F1Z2h0IGJlbG93IHdoZW4gY2hlY2tpbmcgZm9yIGluY29uc2lzdGVudCBwcm9jZXNzaW5nLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoa2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQpCi0gICAgICAgICAgICAgICBlcnJvcnggPSAiIURFRkFVTFQ6IGtub3duIGNodW5rIHByb2Nlc3NlZCI7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgLyogbm90IHByb2Nlc3NlZCAqLyBzd2l0Y2ggKGtlZXApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfQVNfREVGQVVMVDoKLSAgICAgICAgICAgICAgIGVycm9yeCA9ICJERUZBVUxUOiBrbm93biBjaHVuayBub3QgcHJvY2Vzc2VkIjsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFBOR19IQU5ETEVfQ0hVTktfTkVWRVI6Ci0gICAgICAgICAgICAgICBpZiAoZmxhZyAmIHVua25vd24pCi0gICAgICAgICAgICAgICAgICBlcnJvcnggPSAiRElTQ0FSRDoga25vd24gY2h1bmsgc2F2ZWQiOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFOgotICAgICAgICAgICAgICAgaWYgKGFuY2lsbGFyeShjaHVua19pbmZvW2ldLm5hbWUpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZyAmIHVua25vd24pKQotICAgICAgICAgICAgICAgICAgICAgZXJyb3J4ID0gIklGLVNBRkU6IGtub3duIGFuY2lsbGFyeSBjaHVuayBsb3N0IjsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZWxzZSBpZiAoZmxhZyAmIHVua25vd24pCi0gICAgICAgICAgICAgICAgICBlcnJvcnggPSAiSUYtU0FGRToga25vd24gY3JpdGljYWwgY2h1bmsgc2F2ZWQiOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVM6Ci0gICAgICAgICAgICAgICBpZiAoIShmbGFnICYgdW5rbm93bikpCi0gICAgICAgICAgICAgICAgICBlcnJvcnggPSAiU0FWRToga25vd24gY2h1bmsgbG9zdCI7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgIGVycm9yeCA9ICJpbnRlcm5hbCBlcnJvcjogYmFkIGtlZXAgKDIpIjsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZXJyb3J4ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICArKyhkLT5lcnJvcl9jb3VudCk7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVzJXMpOiAlcyAlcyAlczogJXNcbiIsIGQtPmZpbGUsIGQtPnRlc3QsCi0gICAgICAgICAgICBzZXRfY2FsbGJhY2sgPyAiLGNhbGxiYWNrIiA6ICIiLAotICAgICAgICAgICAgdHlwZSwgY2h1bmtfaW5mb1tpXS5uYW1lLCBwb3NpdGlvbiwgZXJyb3J4KTsKLSAgICAgIH0KLQotICAgICAgY2h1bmtzICY9IH5mbGFnOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotcGVyZm9ybV9vbmVfdGVzdChGSUxFICpmcCwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAotICAgcG5nX3VpbnRfMzIgKmRlZmF1bHRfZmxhZ3MsIGRpc3BsYXkgKmQsIGludCBzZXRfY2FsbGJhY2spCi17Ci0gICBpbnQgZGVmOwotICAgcG5nX3VpbnRfMzIgZmxhZ3NbMl1bNF07Ci0KLSAgIHJld2luZChmcCk7Ci0gICBjbGVhcl9rZWVwKCk7Ci0gICBtZW1jcHkoZmxhZ3NbMF0sIGRlZmF1bHRfZmxhZ3MsIHNpemVvZiBmbGFnc1swXSk7Ci0KLSAgIGRlZiA9IGNoZWNrKGZwLCBhcmdjLCBhcmd2LCBmbGFnc1sxXSwgZCwgc2V0X2NhbGxiYWNrKTsKLQotICAgLyogSWYgSURBVCBpcyBiZWluZyBoYW5kbGVkIGFzIHVua25vd24gdGhlIGltYWdlIHJlYWQgaXMgc2tpcHBlZCBhbmQgYWxsIHRoZQotICAgICogSURBVHMgYWZ0ZXIgdGhlIGZpcnN0IGVuZCB1cCBpbiB0aGUgZW5kIGluZm8gc3RydWN0LCBzbyBpbiB0aGlzIGNhc2UgYWRkCi0gICAgKiBJREFUIHRvIHRoZSBsaXN0IG9mIHVua25vd25zLiAgKERvIHRoaXMgYWZ0ZXIgJ2NoZWNrJyBhYm92ZSBzZXRzIHRoZQotICAgICogY2h1bmtfaW5mbyAna2VlcCcgZmllbGRzLikKLSAgICAqCi0gICAgKiBOb3RlIHRoYXQgdGhlIGZsYWcgc2V0dGluZyBoYXMgdG8gYmUgaW4gdGhlICdrbm93bicgZmllbGQgdG8gYXZvaWQKLSAgICAqIHRyaWdnZXJpbmcgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGJlbG93IGFuZCB0aGUgZmxhZyBtdXN0IG9ubHkgYmUgc2V0IGlmCi0gICAgKiB0aGVyZSBhcmUgbXVsdGlwbGUgSURBVHMsIHNvIGlmIHRoZSBjaGVjayBhYm92ZSBkaWQgZmluZCBhbiB1bmtub3duIElEQVQKLSAgICAqIGFmdGVyIElEQVQuCi0gICAgKi8KLSAgIGlmIChjaHVua19pbmZvWzAvKklEQVQqL10ua2VlcCAhPSBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgJiYKLSAgICAgICAoZmxhZ3NbMV1bM10gJiBQTkdfSU5GT19JREFUKSAhPSAwKQotICAgICAgZmxhZ3NbMF1bMl0gfD0gUE5HX0lORk9fSURBVDsKLQotICAgLyogQ2h1bmtzIHNob3VsZCBlaXRoZXIgYmUga25vd24gb3IgdW5rbm93biwgbmV2ZXIgYm90aCBhbmQgdGhpcyBzaG91bGQgYXBwbHkKLSAgICAqIHdoZXRoZXIgdGhlIGNodW5rIGlzIGJlZm9yZSBvciBhZnRlciB0aGUgSURBVCAoYWN0dWFsbHksIHRoZSBhcHAgY2FuCi0gICAgKiBwcm9iYWJseSBjaGFuZ2UgdGhpcyBieSBzd2FwcGluZyB0aGUgaGFuZGxpbmcgYWZ0ZXIgdGhlIGltYWdlLCBidXQgdGhpcwotICAgICogdGVzdCBkb2VzIG5vdCBkbyB0aGF0LikKLSAgICAqLwotICAgY2hlY2tfZXJyb3IoZCwgKGZsYWdzWzBdWzBdfGZsYWdzWzBdWzJdKSAmIChmbGFnc1swXVsxXXxmbGFnc1swXVszXSksCi0gICAgICAiY2h1bmsgaGFuZGxlZCBpbmNvbnNpc3RlbnRseSBpbiBjb3VudCB0ZXN0cyIpOwotICAgY2hlY2tfZXJyb3IoZCwgKGZsYWdzWzFdWzBdfGZsYWdzWzFdWzJdKSAmIChmbGFnc1sxXVsxXXxmbGFnc1sxXVszXSksCi0gICAgICAiY2h1bmsgaGFuZGxlZCBpbmNvbnNpc3RlbnRseSBpbiBvcHRpb24gdGVzdHMiKTsKLQotICAgLyogTm93IGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgdG8gZWFjaCBjaHVuayBiZWZvcmUgYW5kIGFmdGVyIHRoZSBJREFUIGFuZAotICAgICogZGV0ZXJtaW5lIGlmIHRoZSBiZWhhdmlvciB3YXMgY29ycmVjdC4gIEZpcnN0IHNvbWUgYmFzaWMgc2FuaXR5IGNoZWNrcywKLSAgICAqIGFueSBrbm93biBjaHVuayBzaG91bGQgYmUga25vd24gaW4gdGhlIG9yaWdpbmFsIGNvdW50LCBhbnkgdW5rbm93biBjaHVuawotICAgICogc2hvdWxkIGJlIGVpdGhlciBrbm93biBvciB1bmtub3duIGluIHRoZSBvcmlnaW5hbC4KLSAgICAqLwotICAgewotICAgICAgcG5nX3VpbnRfMzIgdGVzdDsKLQotICAgICAgdGVzdCA9IGZsYWdzWzFdWzBdICYgfmZsYWdzWzBdWzBdOwotICAgICAgY2hlY2tfZXJyb3IoZCwgdGVzdCwgIm5ldyBrbm93biBjaHVuayBiZWZvcmUgSURBVCIpOwotICAgICAgdGVzdCA9IGZsYWdzWzFdWzFdICYgfihmbGFnc1swXVswXSB8IGZsYWdzWzBdWzFdKTsKLSAgICAgIGNoZWNrX2Vycm9yKGQsIHRlc3QsICJuZXcgdW5rbm93biBjaHVuayBiZWZvcmUgSURBVCIpOwotICAgICAgdGVzdCA9IGZsYWdzWzFdWzJdICYgfmZsYWdzWzBdWzJdOwotICAgICAgY2hlY2tfZXJyb3IoZCwgdGVzdCwgIm5ldyBrbm93biBjaHVuayBhZnRlciBJREFUIik7Ci0gICAgICB0ZXN0ID0gZmxhZ3NbMV1bM10gJiB+KGZsYWdzWzBdWzJdIHwgZmxhZ3NbMF1bM10pOwotICAgICAgY2hlY2tfZXJyb3IoZCwgdGVzdCwgIm5ldyB1bmtub3duIGNodW5rIGFmdGVyIElEQVQiKTsKLSAgIH0KLQotICAgLyogTm93IGVhY2ggY2h1bmsgaW4gdGhlIG9yaWdpbmFsIGxpc3Qgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFjY29yZGluZyB0bwotICAgICogdGhlIG9wdGlvbnMgc2V0IGZvciB0aGF0IGNodW5rLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgbGlicG5nIGtub3dzIGFib3V0Ci0gICAgKiBpdCBvciBub3QuCi0gICAgKi8KLSAgIGNoZWNrX2hhbmRsaW5nKGQsIGRlZiwgZmxhZ3NbMF1bMF0gfCBmbGFnc1swXVsxXSwgZmxhZ3NbMV1bMF0sIGZsYWdzWzFdWzFdLAotICAgICAgImJlZm9yZSBJREFUIiwgc2V0X2NhbGxiYWNrKTsKLSAgIGNoZWNrX2hhbmRsaW5nKGQsIGRlZiwgZmxhZ3NbMF1bMl0gfCBmbGFnc1swXVszXSwgZmxhZ3NbMV1bMl0sIGZsYWdzWzFdWzNdLAotICAgICAgImFmdGVyIElEQVQiLCBzZXRfY2FsbGJhY2spOwotfQotCi1zdGF0aWMgdm9pZAotcGVyZm9ybV9vbmVfdGVzdF9zYWZlKEZJTEUgKmZwLCBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCi0gICBwbmdfdWludF8zMiAqZGVmYXVsdF9mbGFncywgZGlzcGxheSAqZCwgY29uc3QgY2hhciAqdGVzdCkKLXsKLSAgIGlmIChzZXRqbXAoZC0+ZXJyb3JfcmV0dXJuKSA9PSAwKQotICAgewotICAgICAgZC0+dGVzdCA9IHRlc3Q7IC8qIGFsbG93IHVzZSBvZiBkLT5lcnJvcl9yZXR1cm4gKi8KLSMgICAgIGlmZGVmIFBOR19TQVZFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotICAgICAgICAgcGVyZm9ybV9vbmVfdGVzdChmcCwgYXJnYywgYXJndiwgZGVmYXVsdF9mbGFncywgZCwgMCk7Ci0jICAgICBlbmRpZgotIyAgICAgaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICAgICBwZXJmb3JtX29uZV90ZXN0KGZwLCBhcmdjLCBhcmd2LCBkZWZhdWx0X2ZsYWdzLCBkLCAxKTsKLSMgICAgIGVuZGlmCi0gICAgICBkLT50ZXN0ID0gaW5pdDsgLyogcHJldmVudCB1c2Ugb2YgZC0+ZXJyb3JfcmV0dXJuICovCi0gICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzdGFuZGFyZF90ZXN0c1tdID0KLXsKLSAiZGlzY2FyZCIsICJkZWZhdWx0PWRpc2NhcmQiLCAwLAotICJzYXZlIiwgImRlZmF1bHQ9c2F2ZSIsIDAsCi0gImlmLXNhZmUiLCAiZGVmYXVsdD1pZi1zYWZlIiwgMCwKLSAidnBBZyIsICJ2cEFnPWlmLXNhZmUiLCAwLAotICJzVEVSIiwgInNURVI9aWYtc2FmZSIsIDAsCi0gIklEQVQiLCAiZGVmYXVsdD1kaXNjYXJkIiwgIklEQVQ9c2F2ZSIsIDAsCi0gInNBUEkiLCAiYktHRD1zYXZlIiwgImNIUk09c2F2ZSIsICJnQU1BPXNhdmUiLCAiYWxsPWRpc2NhcmQiLCAiaUNDUD1zYXZlIiwKLSAgICJzQklUPXNhdmUiLCAic1JHQj1zYXZlIiwgMCwKLSAwLyplbmQqLwotfTsKLQotc3RhdGljIFBOR19OT1JFVFVSTiB2b2lkCi11c2FnZShjb25zdCBjaGFyICpwcm9ncmFtLCBjb25zdCBjaGFyICpyZWFzb24pCi17Ci0gICBmcHJpbnRmKHN0ZGVyciwgInBuZ3Vua25vd246ICVzOiB1c2FnZTpcbiAlcyBbLS1zdHJpY3RdICIKLSAgICAgICItLWRlZmF1bHR8eyhDSE5LfGRlZmF1bHR8YWxsKT0oZGVmYXVsdHxkaXNjYXJkfGlmLXNhZmV8c2F2ZSl9ICIKLSAgICAgICJ0ZXN0ZmlsZS5wbmdcbiIsIHJlYXNvbiwgcHJvZ3JhbSk7Ci0gICBleGl0KDk5KTsKLX0KLQotaW50Ci1tYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKLXsKLSAgIEZJTEUgKmZwOwotICAgcG5nX3VpbnRfMzIgZGVmYXVsdF9mbGFnc1s0Lyp2YWxpZCx1bmtub3due2JlZm9yZSxhZnRlcn0qL107Ci0gICBpbnQgc3RyaWN0ID0gMCwgZGVmYXVsdF90ZXN0cyA9IDA7Ci0gICBjb25zdCBjaGFyICpjb3VudF9hcmd2ID0gImRlZmF1bHQ9c2F2ZSI7Ci0gICBjb25zdCBjaGFyICp0b3VjaF9maWxlID0gTlVMTDsKLSAgIGRpc3BsYXkgZDsKLQotICAgaW5pdF9kaXNwbGF5KCZkLCBhcmd2WzBdKTsKLQotICAgd2hpbGUgKCsrYXJndiwgLS1hcmdjID4gMCkKLSAgIHsKLSAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItLXN0cmljdCIpID09IDApCi0gICAgICAgICBzdHJpY3QgPSAxOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWRlZmF1bHQiKSA9PSAwKQotICAgICAgICAgZGVmYXVsdF90ZXN0cyA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tdG91Y2giKSA9PSAwKQotICAgICAgewotICAgICAgICAgaWYgKGFyZ2MgPiAxKQotICAgICAgICAgICAgdG91Y2hfZmlsZSA9ICorK2FyZ3YsIC0tYXJnYzsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgdXNhZ2UoZC5wcm9ncmFtLCAiLS10b3VjaDogbWlzc2luZyBmaWxlIG5hbWUiKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIC8qIEEgZmlsZSBuYW1lIGlzIHJlcXVpcmVkLCBidXQgdGhlcmUgc2hvdWxkIGJlIG5vIG90aGVyIGFyZ3VtZW50cyBpZgotICAgICogLS1kZWZhdWx0IHdhcyBzcGVjaWZpZWQuCi0gICAgKi8KLSAgIGlmIChhcmdjIDw9IDApCi0gICAgICB1c2FnZShkLnByb2dyYW0sICJtaXNzaW5nIHRlc3QgZmlsZSIpOwotCi0gICAvKiBHQ0MgQlVHOiBpZiAoZGVmYXVsdF90ZXN0cyAmJiBhcmdjICE9IDEpIHRyaWdnZXJzIHNvbWUgd2VpcmQgR0NDIGFyZ2MKLSAgICAqIG9wdGltaXphdGlvbiB3aGljaCBjYXVzZXMgd2FybmluZ3Mgd2l0aCAtV3N0cmljdC1vdmVyZmxvdyEKLSAgICAqLwotICAgZWxzZSBpZiAoZGVmYXVsdF90ZXN0cykgaWYgKGFyZ2MgIT0gMSkKLSAgICAgIHVzYWdlKGQucHJvZ3JhbSwgImV4dHJhIGFyZ3VtZW50cyIpOwotCi0gICAvKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBmaWxlIGlzIHRoZSBsYXN0IGFyZ3VtZW50OyByZW1vdmUgaXQuICovCi0gICBkLmZpbGUgPSBhcmd2Wy0tYXJnY107Ci0KLSAgIGZwID0gZm9wZW4oZC5maWxlLCAicmIiKTsKLSAgIGlmIChmcCA9PSBOVUxMKQotICAgewotICAgICAgcGVycm9yKGQuZmlsZSk7Ci0gICAgICBleGl0KDk5KTsKLSAgIH0KLQotICAgLyogRmlyc3QgZmluZCBhbGwgdGhlIGNodW5rcywga25vd24gYW5kIHVua25vd24sIGluIHRoZSB0ZXN0IGZpbGUsIGEgZmFpbHVyZQotICAgICogaGVyZSBhYm9ydHMgdGhlIHdob2xlIHRlc3QuCi0gICAgKgotICAgICogSWYgJ3NhdmUnIGlzIHN1cHBvcnRlZCB0aGVuIHRoZSBub3JtYWwgc2F2aW5nIG1ldGhvZCBzaG91bGQgaGFwcGVuLAotICAgICogb3RoZXJ3aXNlIGlmICdyZWFkJyBpcyBzdXBwb3J0ZWQgdGhlbiB0aGUgcmVhZCBjYWxsYmFjayB3aWxsIGRvIHRoZQotICAgICogc2FtZSB0aGluZy4gIElmIGJvdGggYXJlIHN1cHBvcnRlZCB0aGUgJ3JlYWQnIGNhbGxiYWNrIHdvbid0IGJlCi0gICAgKiBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4gIElmICdzYXZlJyBpcyAqbm90KiBzdXBwb3J0ZWQgdGhlbiBhIHVzZXIKLSAgICAqIGNhbGxiYWNrIGlzIHJlcXVpcmVkIGV2ZW4gdGhvdWdoIHdlIGNhbiBjYWxsIHBuZ19nZXRfdW5rbm93bl9jaHVua3MuCi0gICAgKi8KLSAgIGlmIChjaGVjayhmcCwgMSwgJmNvdW50X2FyZ3YsIGRlZmF1bHRfZmxhZ3MsICZkLAotIyAgICAgaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICAgICAwCi0jICAgICBlbHNlCi0gICAgICAgICAxCi0jICAgICBlbmRpZgotICAgICAgKSAhPSBQTkdfSEFORExFX0NIVU5LX0FMV0FZUykKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiBpbnRlcm5hbCBlcnJvclxuIiwgZC5wcm9ncmFtLCBkLmZpbGUpOwotICAgICAgZXhpdCg5OSk7Ci0gICB9Ci0KLSAgIC8qIE5vdyBmaW5kIHdoYXQgdGhlIHZhcmlvdXMgc3VwcGxpZWQgb3B0aW9ucyBjYXVzZSB0byBjaGFuZ2U6ICovCi0gICBpZiAoIWRlZmF1bHRfdGVzdHMpCi0gICB7Ci0gICAgICBkLnRlc3QgPSBjbWQ7IC8qIGFjdHMgYXMgYSBmbGFnIHRvIHNheSBleGl0LCBkbyBub3QgbG9uZ2ptcCAqLwotIyAgICAgaWZkZWYgUE5HX1NBVkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICAgICBwZXJmb3JtX29uZV90ZXN0KGZwLCBhcmdjLCBhcmd2LCBkZWZhdWx0X2ZsYWdzLCAmZCwgMCk7Ci0jICAgICBlbmRpZgotIyAgICAgaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECi0gICAgICAgICBwZXJmb3JtX29uZV90ZXN0KGZwLCBhcmdjLCBhcmd2LCBkZWZhdWx0X2ZsYWdzLCAmZCwgMSk7Ci0jICAgICBlbmRpZgotICAgICAgZC50ZXN0ID0gaW5pdDsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgY29uc3QgY2hhciAqKnRlc3QgPSBzdGFuZGFyZF90ZXN0czsKLQotICAgICAgLyogU2V0IHRoZSBleGl0X3Rlc3QgcG9pbnRlciBoZXJlIHNvIHdlIGNhbiBjb250aW51ZSBhZnRlciBhIGxpYnBuZyBlcnJvci4KLSAgICAgICAqIE5PVEU6IHRoaXMgbGVha3MgbWVtb3J5IGJlY2F1c2UgdGhlIHBuZ19zdHJ1Y3QgZGF0YSBmcm9tIHRoZSBmYWlsaW5nCi0gICAgICAgKiB0ZXN0IGlzIG5ldmVyIGZyZWVkLgotICAgICAgICovCi0gICAgICB3aGlsZSAoKnRlc3QpCi0gICAgICB7Ci0gICAgICAgICBjb25zdCBjaGFyICp0aGlzX3Rlc3QgPSAqdGVzdCsrOwotICAgICAgICAgY29uc3QgY2hhciAqKm5leHQgPSB0ZXN0OwotICAgICAgICAgaW50IGNvdW50ID0gZGlzcGxheV9yYygmZCwgc3RyaWN0KSwgbmV3X2NvdW50OwotICAgICAgICAgY29uc3QgY2hhciAqcmVzdWx0OwotICAgICAgICAgaW50IGFyZ19jb3VudCA9IDA7Ci0KLSAgICAgICAgIHdoaWxlICgqbmV4dCkgKytuZXh0LCArK2FyZ19jb3VudDsKLQotICAgICAgICAgcGVyZm9ybV9vbmVfdGVzdF9zYWZlKGZwLCBhcmdfY291bnQsIHRlc3QsIGRlZmF1bHRfZmxhZ3MsICZkLAotICAgICAgICAgICAgdGhpc190ZXN0KTsKLQotICAgICAgICAgbmV3X2NvdW50ID0gZGlzcGxheV9yYygmZCwgc3RyaWN0KTsKLQotICAgICAgICAgaWYgKG5ld19jb3VudCA9PSBjb3VudCkKLSAgICAgICAgICAgIHJlc3VsdCA9ICJQQVNTIjsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gIkZBSUwiOwotCi0gICAgICAgICBwcmludGYoIiVzOiAlcyAlc1xuIiwgcmVzdWx0LCBkLnByb2dyYW0sIHRoaXNfdGVzdCk7Ci0KLSAgICAgICAgIHRlc3QgPSBuZXh0KzE7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGZjbG9zZShmcCk7Ci0KLSAgIGlmIChkaXNwbGF5X3JjKCZkLCBzdHJpY3QpID09IDApCi0gICB7Ci0gICAgICAvKiBTdWNjZXNzLCB0b3VjaCB0aGUgc3VjY2VzcyBmaWxlIGlmIGFwcHJvcHJpYXRlICovCi0gICAgICBpZiAodG91Y2hfZmlsZSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgRklMRSAqZnN1Y2Nlc3MgPSBmb3Blbih0b3VjaF9maWxlLCAid3QiKTsKLQotICAgICAgICAgaWYgKGZzdWNjZXNzICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZXJyID0gMDsKLSAgICAgICAgICAgIGZwcmludGYoZnN1Y2Nlc3MsICJQTkcgdW5rbm93biB0ZXN0cyBzdWNjZWVkZWRcbiIpOwotICAgICAgICAgICAgZmZsdXNoKGZzdWNjZXNzKTsKLSAgICAgICAgICAgIGVyciA9IGZlcnJvcihmc3VjY2Vzcyk7Ci0KLSAgICAgICAgICAgIGlmIChmY2xvc2UoZnN1Y2Nlc3MpIHx8IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHdyaXRlIGZhaWxlZFxuIiwgdG91Y2hfZmlsZSk7Ci0gICAgICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogb3BlbiBmYWlsZWRcbiIsIHRvdWNoX2ZpbGUpOwotICAgICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICByZXR1cm4gMTsKLX0KLQotI2Vsc2UgLyogIShSRUFEX1VTRVJfQ0hVTktTIHx8IFNBVkVfVU5LTk9XTl9DSFVOS1MpICovCi1pbnQKLW1haW4odm9pZCkKLXsKLSAgIGZwcmludGYoc3RkZXJyLAotICAgICAgIiB0ZXN0IGlnbm9yZWQ6IG5vIHN1cHBvcnQgdG8gZmluZCBvdXQgYWJvdXQgdW5rbm93biBjaHVua3NcbiIpOwotICAgLyogU28gdGhlIHRlc3QgaXMgc2tpcHBlZDogKi8KLSAgIHJldHVybiBTS0lQOwotfQotI2VuZGlmIC8qIFJFQURfVVNFUl9DSFVOS1MgfHwgU0FWRV9VTktOT1dOX0NIVU5LUyAqLwotCi0jZWxzZSAvKiAhKFNFVF9VTktOT1dOX0NIVU5LUyAmJiBSRUFEKSAqLwotaW50Ci1tYWluKHZvaWQpCi17Ci0gICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICIgdGVzdCBpZ25vcmVkOiBubyBzdXBwb3J0IHRvIG1vZGlmeSB1bmtub3duIGNodW5rIGhhbmRsaW5nXG4iKTsKLSAgIC8qIFNvIHRoZSB0ZXN0IGlzIHNraXBwZWQ6ICovCi0gICByZXR1cm4gU0tJUDsKLX0KLSNlbmRpZiAvKiBTRVRfVU5LTk9XTl9DSFVOS1MgJiYgUkVBRCovCmRpZmYgLS1naXQgYS9jb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLmMgYi9jb250cmliL2xpYnRlc3RzL3BuZ3ZhbGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2JlYjUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9saWJ0ZXN0cy9wbmd2YWxpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyMTcgKzAsMCBAQAotCi0vKiBwbmd2YWxpZC5jIC0gdmFsaWRhdGUgbGlicG5nIGJ5IGNvbnN0cnVjdGluZyB0aGVuIHJlYWRpbmcgcG5nIGZpbGVzLgotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjI0IFtBdWd1c3QgNCwgMjAxNl0KLSAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogTk9URVM6Ci0gKiAgIFRoaXMgaXMgYSBDIHByb2dyYW0gdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBsaW5rZWQgYWdhaW5zdCBsaWJwbmcuICBJdAotICogICBnZW5lcmF0ZXMgYml0bWFwcyBpbnRlcm5hbGx5LCBzdG9yZXMgdGhlbSBhcyBQTkcgZmlsZXMgKHVzaW5nIHRoZQotICogICBzZXF1ZW50aWFsIHdyaXRlIGNvZGUpIHRoZW4gcmVhZHMgdGhlbSBiYWNrICh1c2luZyB0aGUgc2VxdWVudGlhbAotICogICByZWFkIGNvZGUpIGFuZCB2YWxpZGF0ZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyB0aGUgY29ycmVjdCBkYXRhLgotICoKLSAqICAgVGhlIHByb2dyYW0gY2FuIGJlIG1vZGlmaWVkIGFuZCBleHRlbmRlZCB0byB0ZXN0IHRoZSBjb3JyZWN0bmVzcyBvZgotICogICB0cmFuc2Zvcm1hdGlvbnMgcGVyZm9ybWVkIGJ5IGxpYnBuZy4KLSAqLwotCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotI2RlZmluZSBfSVNPQzk5X1NPVVJDRSAxIC8qIEZvciBmbG9hdGluZyBwb2ludCAqLwotI2RlZmluZSBfR05VX1NPVVJDRSAxIC8qIEZvciB0aGUgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGV4dGVuc2lvbiAqLwotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfRkVFTkFCTEVFWENFUFQgLyogZnJvbSBjb25maWcuaCwgaWYgaW5jbHVkZWQgKi8KLSMgIGluY2x1ZGUgPGZlbnYuaD4KLSNlbmRpZgotCi0jaWZuZGVmIEZFX0RJVkJZWkVSTwotIyAgZGVmaW5lIEZFX0RJVkJZWkVSTyAwCi0jZW5kaWYKLSNpZm5kZWYgRkVfSU5WQUxJRAotIyAgZGVmaW5lIEZFX0lOVkFMSUQgMAotI2VuZGlmCi0jaWZuZGVmIEZFX09WRVJGTE9XCi0jICBkZWZpbmUgRkVfT1ZFUkZMT1cgMAotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgotICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6Ci0gKi8KLSNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCi0jICBpbmNsdWRlIDxwbmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKLSNlbmRpZgotCi0jaWZkZWYgUE5HX1pMSUJfSEVBREVSCi0jICBpbmNsdWRlIFBOR19aTElCX0hFQURFUgotI2Vsc2UKLSMgIGluY2x1ZGUgPHpsaWIuaD4gICAvKiBGb3IgY3JjMzIgKi8KLSNlbmRpZgotCi0vKiAxLjYuMSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgY29uZmlndXJlIHRlc3QgaGFybmVzcywgd2hpY2ggdXNlcyA3NyB0byBpbmRpY2F0ZQotICogYSBza2lwcGVkIHRlc3QsIGluIGVhcmxpZXIgdmVyc2lvbnMgd2UgbmVlZCB0byBzdWNjZWVkIG9uIGEgc2tpcHBlZCB0ZXN0LCBzbzoKLSAqLwotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNjAxICYmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkKLSMgIGRlZmluZSBTS0lQIDc3Ci0jZWxzZQotIyAgZGVmaW5lIFNLSVAgMAotI2VuZGlmCi0KLS8qIHBuZ3ZhbGlkIHJlcXVpcmVzIHdyaXRlIHN1cHBvcnQgYW5kIG9uZSBvZiB0aGUgZml4ZWQgb3IgZmxvYXRpbmcgcG9pbnQgQVBJcy4KLSAqLwotI2lmIGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkgJiZcCi0gICAoZGVmaW5lZChQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQpKQotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDUwMAotLyogVGhpcyBkZWxpYmVyYXRlbHkgbGFja3MgdGhlIGNvbnN0LiAqLwotdHlwZWRlZiBwbmdfYnl0ZSAqcG5nX2NvbnN0X2J5dGVwOwotCi0vKiBUaGlzIGlzIGNvcGllZCBmcm9tIDEuNS4xIHBuZy5oOiAqLwotI2RlZmluZSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUyA3Ci0jZGVmaW5lIFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKSAoKCgxVSZ+KHBhc3MpKTw8KDMtKChwYXNzKT4+MSkpKSY3KQotI2RlZmluZSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcykgKCgoMVUmIChwYXNzKSk8PCgzLSgoKHBhc3MpKzEpPj4xKSkpJjcpCi0jZGVmaW5lIFBOR19QQVNTX1JPV19TSElGVChwYXNzKSAoKHBhc3MpPjI/KDgtKHBhc3MpKT4+MTozKQotI2RlZmluZSBQTkdfUEFTU19DT0xfU0hJRlQocGFzcykgKChwYXNzKT4xPyg3LShwYXNzKSk+PjE6MykKLSNkZWZpbmUgUE5HX1BBU1NfUk9XUyhoZWlnaHQsIHBhc3MpICgoKGhlaWdodCkrKCgoMTw8UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKVwKLSAgIC0xKS1QTkdfUEFTU19TVEFSVF9ST1cocGFzcykpKT4+UE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpKQotI2RlZmluZSBQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKSAoKCh3aWR0aCkrKCgoMTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKVwKLSAgIC0xKS1QTkdfUEFTU19TVEFSVF9DT0wocGFzcykpKT4+UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKQotI2RlZmluZSBQTkdfUk9XX0ZST01fUEFTU19ST1coeUluLCBwYXNzKSBcCi0gICAoKCh5SW4pPDxQTkdfUEFTU19ST1dfU0hJRlQocGFzcykpK1BOR19QQVNTX1NUQVJUX1JPVyhwYXNzKSkKLSNkZWZpbmUgUE5HX0NPTF9GUk9NX1BBU1NfQ09MKHhJbiwgcGFzcykgXAotICAgKCgoeEluKTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpKStQTkdfUEFTU19TVEFSVF9DT0wocGFzcykpCi0jZGVmaW5lIFBOR19QQVNTX01BU0socGFzcyxvZmYpICggXAotICAgKCgweDExMDE0NUFGVT4+KCgoNy0ob2ZmKSktKHBhc3MpKTw8MikpICYgMHhGVSkgfCBcCi0gICAoKDB4MDExNDVBRjBVPj4oKCg3LShvZmYpKS0ocGFzcykpPDwyKSkgJiAweEYwVSkpCi0jZGVmaW5lIFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1MoeSwgcGFzcykgXAotICAgKChQTkdfUEFTU19NQVNLKHBhc3MsMCkgPj4gKCh5KSY3KSkgJiAxKQotI2RlZmluZSBQTkdfQ09MX0lOX0lOVEVSTEFDRV9QQVNTKHgsIHBhc3MpIFwKLSAgICgoUE5HX1BBU1NfTUFTSyhwYXNzLDEpID4+ICgoeCkmNykpICYgMSkKLQotLyogVGhlc2UgYXJlIG5lZWRlZCB0b28gZm9yIHRoZSBkZWZhdWx0IGJ1aWxkOiAqLwotI2RlZmluZSBQTkdfV1JJVEVfMTZCSVRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19SRUFEXzE2QklUX1NVUFBPUlRFRAotCi0vKiBUaGlzIGNvbWVzIGZyb20gcG5nbGliY29uZi5oIGFmZXIgMS41OiAqLwotI2RlZmluZSBQTkdfRlBfMSAxMDAwMDAKLSNkZWZpbmUgUE5HX0dBTU1BX1RIUkVTSE9MRF9GSVhFRFwKLSAgICgocG5nX2ZpeGVkX3BvaW50KShQTkdfR0FNTUFfVEhSRVNIT0xEICogUE5HX0ZQXzEpKQotI2VuZGlmCi0KLSNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNjAwCi0gICAvKiAxLjYuMCBjb25zdGlmaWVzIG1hbnkgQVBJcywgdGhlIGZvbGxvd2luZyBleGlzdHMgdG8gYWxsb3cgcG5ndmFsaWQgdG8gYmUKLSAgICAqIGNvbXBpbGVkIGFnYWluc3QgZWFybGllciB2ZXJzaW9ucy4KLSAgICAqLwotIyAgZGVmaW5lIHBuZ19jb25zdF9zdHJ1Y3RwIHBuZ19zdHJ1Y3RwCi0jZW5kaWYKLQotI2lmbmRlZiBSRUxFQVNFX0JVSUxECi0gICAvKiBSRUxFQVNFX0JVSUxEIGlzIHRydWUgZm9yIHJlbGVhc2VzIGFuZCByZWxlYXNlIGNhbmRpZGF0ZXM6ICovCi0jICBkZWZpbmUgUkVMRUFTRV9CVUlMRCAoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgPj0gUE5HX0xJQlBOR19CVUlMRF9SQykKLSNlbmRpZgotI2lmIFJFTEVBU0VfQlVJTEQKLSMgICBkZWZpbmUgZGVidWdvbmx5KHNvbWV0aGluZykKLSNlbHNlIC8qICFSRUxFQVNFX0JVSUxEICovCi0jICAgZGVmaW5lIGRlYnVnb25seShzb21ldGhpbmcpIHNvbWV0aGluZwotI2VuZGlmIC8qICFSRUxFQVNFX0JVSUxEICovCi0KLSNpbmNsdWRlIDxmbG9hdC5oPiAgLyogRm9yIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPiAvKiBGb3IgbWFsbG9jICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+IC8qIEZvciBtZW1jcHksIG1lbXNldCAqLwotI2luY2x1ZGUgPG1hdGguaD4gICAvKiBGb3IgZmxvb3IgKi8KLQotLyogQ29udmVuaWVuY2UgbWFjcm9zLiAqLwotI2RlZmluZSBDSFVOSyhhLGIsYyxkKSAoKChhKTw8MjQpKygoYik8PDE2KSsoKGMpPDw4KSsoZCkpCi0jZGVmaW5lIENIVU5LX0lIRFIgQ0hVTksoNzMsNzIsNjgsODIpCi0jZGVmaW5lIENIVU5LX1BMVEUgQ0hVTksoODAsNzYsODQsNjkpCi0jZGVmaW5lIENIVU5LX0lEQVQgQ0hVTksoNzMsNjgsNjUsODQpCi0jZGVmaW5lIENIVU5LX0lFTkQgQ0hVTksoNzMsNjksNzgsNjgpCi0jZGVmaW5lIENIVU5LX2NIUk0gQ0hVTksoOTksNzIsODIsNzcpCi0jZGVmaW5lIENIVU5LX2dBTUEgQ0hVTksoMTAzLDY1LDc3LDY1KQotI2RlZmluZSBDSFVOS19zQklUIENIVU5LKDExNSw2Niw3Myw4NCkKLSNkZWZpbmUgQ0hVTktfc1JHQiBDSFVOSygxMTUsODIsNzEsNjYpCi0KLS8qIFVudXNlZCBmb3JtYWwgcGFyYW1ldGVyIGVycm9ycyBhcmUgcmVtb3ZlZCB1c2luZyB0aGUgZm9sbG93aW5nIG1hY3JvIHdoaWNoIGlzCi0gKiBleHBlY3RlZCB0byBoYXZlIG5vIGJhZCBlZmZlY3RzIG9uIHBlcmZvcm1hbmNlLgotICovCi0jaWZuZGVmIFVOVVNFRAotIyAgaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikKLSMgICAgIGRlZmluZSBVTlVTRUQocGFyYW0pICh2b2lkKXBhcmFtOwotIyAgZWxzZQotIyAgICAgZGVmaW5lIFVOVVNFRChwYXJhbSkKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVYQ0VQVElPTiBIQU5ETElORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCi0jICBpbmNsdWRlIDxjZXhjZXB0Lmg+Ci0jZWxzZQotIyAgaW5jbHVkZSAiLi4vdmlzdXBuZy9jZXhjZXB0LmgiCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jICBkZWZpbmUgdGhpcyBub3RfdGhlX2NwcF90aGlzCi0jICBkZWZpbmUgbmV3IG5vdF90aGVfY3BwX25ldwotIyAgZGVmaW5lIHZvaWRjYXN0KHR5cGUsIHZhbHVlKSBzdGF0aWNfY2FzdDx0eXBlPih2YWx1ZSkKLSNlbHNlCi0jICBkZWZpbmUgdm9pZGNhc3QodHlwZSwgdmFsdWUpICh2YWx1ZSkKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi1zdHJ1Y3QgcG5nX3N0b3JlOwotZGVmaW5lX2V4Y2VwdGlvbl90eXBlKHN0cnVjdCBwbmdfc3RvcmUqKTsKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgbWFjcm9zIHRvIHJlZHVjZSB0eXBpbmcgZXZlcnl3aGVyZSB3aGVyZSB0aGUgd2VsbCBrbm93bgotICogbmFtZSAndGhlX2V4Y2VwdGlvbl9jb250ZXh0JyBtdXN0IGJlIGRlZmluZWQuCi0gKi8KLSNkZWZpbmUgYW5vbl9jb250ZXh0KHBzKSBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCA9IFwKLSAgICYocHMpLT5leGNlcHRpb25fY29udGV4dAotI2RlZmluZSBjb250ZXh0KHBzLGZhdWx0KSBhbm9uX2NvbnRleHQocHMpOyBwbmdfc3RvcmUgKmZhdWx0Ci0KLS8qIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5IGFzIGFuICh1bnNpZ25lZCBpbnQpLAotICogaXQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIHRoZSBpbmFiaWxpdHkgb2YgY2VydGFpbiB2ZXJzaW9ucyBvZiBHQ0MgdG8gdXNlCi0gKiB0aGUgdmFsdWUgb2YgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgd2hlbiBwZXJmb3JtaW5nIHJhbmdlIGNoZWNrcy4gIEl0IG11c3QKLSAqIGJlIHBhc3NlZCBhbiBhcnJheSBuYW1lLgotICovCi0jZGVmaW5lIEFSUkFZX1NJWkUoYSkgKCh1bnNpZ25lZCBpbnQpKChzaXplb2YgKGEpKS8oc2l6ZW9mIChhKVswXSkpKQotCi0vKiBHQ0MgQlVHIDY2NDQ3IChodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD02NjQ0NykgcmVxdWlyZXMKLSAqIHNvbWUgYnJva2VuIEdDQyB2ZXJzaW9ucyB0byBiZSBmaXhlZCB1cCB0byBhdm9pZCBpbnZhbGlkIHdoaW5pbmcgYWJvdXQgYXV0bwotICogdmFyaWFibGVzIHRoYXQgYXJlICpub3QqIGNoYW5nZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHNldGptcCBiZWluZyBjaGFuZ2VkLgotICoKLSAqIEZlZWwgZnJlZSB0byBleHRlbmQgdGhlIGxpc3Qgb2YgYnJva2VuIHZlcnNpb25zLgotICovCi0jZGVmaW5lIGlzX2dudShtYWpvcixtaW5vcilcCi0gICAoZGVmaW5lZCBfX0dOVUNfXykgJiYgX19HTlVDX18gPT0gKG1ham9yKSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAobWlub3IpCi0jZGVmaW5lIGlzX2dudV9wYXRjaChtYWpvcixtaW5vcixwYXRjaClcCi0gICBpc19nbnUobWFqb3IsbWlub3IpICYmIF9fR05VQ19QQVRDSExFVkVMX18gPT0gMAotLyogRm9yIHRoZSBtb21lbnQganVzdCBkbyBpdCBhbHdheXM7IGFsbCB2ZXJzaW9ucyBvZiBHQ0Mgc2VlbSB0byBiZSBicm9rZW46ICovCi0jaWZkZWYgX19HTlVDX18KLSAgIGNvbnN0IHZvaWQgKiB2b2xhdGlsZSBtYWtlX3ZvbGF0aWxlX2Zvcl9nbnU7Ci0jICBkZWZpbmUgZ251X3ZvbGF0aWxlKHgpIG1ha2Vfdm9sYXRpbGVfZm9yX2dudSA9ICZ4OwotI2Vsc2UgLyogIUdOVUMgYnJva2VuIHZlcnNpb25zICovCi0jICBkZWZpbmUgZ251X3ZvbGF0aWxlKHgpCi0jZW5kaWYgLyogIUdOVUMgYnJva2VuIHZlcnNpb25zICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVUSUxJVElFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvciBoYW5kbGluZyBpcyBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgaW4gcHJvZHVjdGlvbiBjb2RlIC0gZXJyb3IKLSAqIGhhbmRsZXJzIG9mdGVuIHRoZW1zZWx2ZXMgaGF2ZSBidWdzIHdoaWNoIGxlYWQgdG8gcHJvZ3JhbXMgdGhhdCBkZXRlY3QKLSAqIG1pbm9yIGVycm9ycyBjcmFzaGluZy4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGRlYWwgd2l0aCBvbmUgdmVyeQotICogY29tbW9uIGNsYXNzIG9mIGVycm9ycyBpbiBlcnJvciBoYW5kbGVycyAtIGF0dGVtcHRpbmcgdG8gZm9ybWF0IGVycm9yIG9yCi0gKiB3YXJuaW5nIG1lc3NhZ2VzIGludG8gYnVmZmVycyB0aGF0IGFyZSB0b28gc21hbGwuCi0gKi8KLXN0YXRpYyBzaXplX3Qgc2FmZWNhdChjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplLCBzaXplX3QgcG9zLAotICAgY29uc3QgY2hhciAqY2F0KQotewotICAgd2hpbGUgKHBvcyA8IGJ1ZnNpemUgJiYgY2F0ICE9IE5VTEwgJiYgKmNhdCAhPSAwKQotICAgICAgYnVmZmVyW3BvcysrXSA9ICpjYXQrKzsKLQotICAgaWYgKHBvcyA+PSBidWZzaXplKQotICAgICAgcG9zID0gYnVmc2l6ZS0xOwotCi0gICBidWZmZXJbcG9zXSA9IDA7Ci0gICByZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgc2l6ZV90IHNhZmVjYXRuKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCBwb3MsIGludCBuKQotewotICAgY2hhciBudW1iZXJbNjRdOwotICAgc3ByaW50ZihudW1iZXIsICIlZCIsIG4pOwotICAgcmV0dXJuIHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIG51bWJlcik7Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAotc3RhdGljIHNpemVfdCBzYWZlY2F0ZChjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplLCBzaXplX3QgcG9zLCBkb3VibGUgZCwKLSAgICBpbnQgcHJlY2lzaW9uKQotewotICAgY2hhciBudW1iZXJbNjRdOwotICAgc3ByaW50ZihudW1iZXIsICIlLipmIiwgcHJlY2lzaW9uLCBkKTsKLSAgIHJldHVybiBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBudW1iZXIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyIGludmFsaWRbXSA9ICJpbnZhbGlkIjsKLXN0YXRpYyBjb25zdCBjaGFyIHNlcFtdID0gIjogIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbG91cl90eXBlc1s4XSA9Ci17Ci0gICAiZ3JheXNjYWxlIiwgaW52YWxpZCwgInRydWVjb2xvdXIiLCAiaW5kZXhlZC1jb2xvdXIiLAotICAgImdyYXlzY2FsZSB3aXRoIGFscGhhIiwgaW52YWxpZCwgInRydWVjb2xvdXIgd2l0aCBhbHBoYSIsIGludmFsaWQKLX07Ci0KLSNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAotLyogQ29udmVydCBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgdG8gZml4ZWQgcG9pbnQuICovCi1zdGF0aWMgcG5nX2ZpeGVkX3BvaW50Ci1maXgoZG91YmxlIGQpCi17Ci0gICBkID0gZmxvb3IoZCAqIFBOR19GUF8xICsgLjUpOwotICAgcmV0dXJuIChwbmdfZml4ZWRfcG9pbnQpZDsKLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KLQotLyogR2VuZXJhdGUgcmFuZG9tIGJ5dGVzLiAgVGhpcyB1c2VzIGEgYm9yaW5nIHJlcGVhdGFibGUgYWxnb3JpdGhtIGFuZCBpdAotICogaXMgaW1wbGVtZW50ZWQgaGVyZSBzbyB0aGF0IGl0IGdpdmVzIHRoZSBzYW1lIHNldCBvZiBudW1iZXJzIG9uIGV2ZXJ5Ci0gKiBhcmNoaXRlY3R1cmUuICBJdCdzIGEgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgKEtudXRoIG9yIFNlZGdld2ljawotICogIkFsZ29yaXRobXMiKSBidXQgaXQgY29tZXMgZnJvbSB0aGUgJ2ZlZWRiYWNrIHRhcHMnIHRhYmxlIGluIEhvcm93aXR6IGFuZAotICogSGlsbCwgIlRoZSBBcnQgb2YgRWxlY3Ryb25pY3MiIChQc2V1ZG8tUmFuZG9tIEJpdCBTZXF1ZW5jZXMgYW5kIE5vaXNlCi0gKiBHZW5lcmF0aW9uLikKLSAqLwotc3RhdGljIHZvaWQKLW1ha2VfcmFuZG9tX2J5dGVzKHBuZ191aW50XzMyKiBzZWVkLCB2b2lkKiBwdiwgc2l6ZV90IHNpemUpCi17Ci0gICBwbmdfdWludF8zMiB1MCA9IHNlZWRbMF0sIHUxID0gc2VlZFsxXTsKLSAgIHBuZ19ieXRlcCBieXRlcyA9IHZvaWRjYXN0KHBuZ19ieXRlcCwgcHYpOwotCi0gICAvKiBUaGVyZSBhcmUgdGhpcnR5IHRocmVlIGJpdHMsIHRoZSBuZXh0IGJpdCBpbiB0aGUgc2VxdWVuY2UgaXMgYml0LTMzIFhPUgotICAgICogYml0LTIwLiAgVGhlIHRvcCAxIGJpdCBpcyBpbiB1MSwgdGhlIGJvdHRvbSAzMiBhcmUgaW4gdTAuCi0gICAgKi8KLSAgIHNpemVfdCBpOwotICAgZm9yIChpPTA7IGk8c2l6ZTsgKytpKQotICAgewotICAgICAgLyogRmlyc3QgZ2VuZXJhdGUgOCBuZXcgYml0cyB0aGVuIHNoaWZ0IHRoZW0gaW4gYXQgdGhlIGVuZC4gKi8KLSAgICAgIHBuZ191aW50XzMyIHUgPSAoKHUwID4+ICgyMC04KSkgXiAoKHUxIDw8IDcpIHwgKHUwID4+ICgzMi03KSkpKSAmIDB4ZmY7Ci0gICAgICB1MSA8PD0gODsKLSAgICAgIHUxIHw9IHUwID4+IDI0OwotICAgICAgdTAgPDw9IDg7Ci0gICAgICB1MCB8PSB1OwotICAgICAgKmJ5dGVzKysgPSAocG5nX2J5dGUpdTsKLSAgIH0KLQotICAgc2VlZFswXSA9IHUwOwotICAgc2VlZFsxXSA9IHUxOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9mb3VyX3JhbmRvbV9ieXRlcyhwbmdfdWludF8zMiogc2VlZCwgcG5nX2J5dGVwIGJ5dGVzKQotewotICAgbWFrZV9yYW5kb21fYnl0ZXMoc2VlZCwgYnl0ZXMsIDQpOwotfQotCi0jaWYgZGVmaW5lZCBQTkdfUkVBRF9TVVBQT1JURUQgfHwgZGVmaW5lZCBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQgfHxcCi0gICAgZGVmaW5lZCBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLXJhbmRvbWl6ZSh2b2lkICpwdiwgc2l6ZV90IHNpemUpCi17Ci0gICBzdGF0aWMgcG5nX3VpbnRfMzIgcmFuZG9tX3NlZWRbMl0gPSB7MHg1Njc4OWFiYywgMHhkfTsKLSAgIG1ha2VfcmFuZG9tX2J5dGVzKHJhbmRvbV9zZWVkLCBwdiwgc2l6ZSk7Ci19Ci0KLSNkZWZpbmUgUjgodGhpcykgcmFuZG9taXplKCYodGhpcyksIHNpemVvZiAodGhpcykpCi0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLXN0YXRpYyBwbmdfYnl0ZQotcmFuZG9tX2J5dGUodm9pZCkKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYjFbMV07Ci0gICByYW5kb21pemUoYjEsIHNpemVvZiBiMSk7Ci0gICByZXR1cm4gYjFbMF07Ci19Ci0jZW5kaWYgLyogUkVBRCAqLwotCi1zdGF0aWMgcG5nX3VpbnRfMTYKLXJhbmRvbV91MTYodm9pZCkKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYjJbMl07Ci0gICByYW5kb21pemUoYjIsIHNpemVvZiBiMik7Ci0gICByZXR1cm4gcG5nX2dldF91aW50XzE2KGIyKTsKLX0KLQotI2lmIGRlZmluZWQgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEIHx8XAotICAgIGRlZmluZWQgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRAotc3RhdGljIHBuZ191aW50XzMyCi1yYW5kb21fdTMyKHZvaWQpCi17Ci0gICB1bnNpZ25lZCBjaGFyIGI0WzRdOwotICAgcmFuZG9taXplKGI0LCBzaXplb2YgYjQpOwotICAgcmV0dXJuIHBuZ19nZXRfdWludF8zMihiNCk7Ci19Ci0jZW5kaWYgLyogUkVBRF9GSUxMRVIgfHwgUkVBRF9SR0JfVE9fR1JBWSAqLwotCi0jZW5kaWYgLyogUkVBRCB8fCBXUklURV90Uk5TIHx8IFdSSVRFX0ZJTFRFUiAqLwotCi0jaWYgZGVmaW5lZCBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRCB8fFwKLSAgICBkZWZpbmVkIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yYW5kb21fbW9kKHVuc2lnbmVkIGludCBtYXgpCi17Ci0gICByZXR1cm4gcmFuZG9tX3UxNigpICUgbWF4OyAvKiAwIC4uIG1heC0xICovCi19Ci0jZW5kaWYgLyogUkVBRF9UUkFOU0ZPUk1TIHx8IFdSSVRFX0ZJTFRFUiAqLwotCi0jaWYgKGRlZmluZWQgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKSB8fFwKLSAgICAoZGVmaW5lZCBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKQotc3RhdGljIGludAotcmFuZG9tX2Nob2ljZSh2b2lkKQotewotICAgcmV0dXJuIHJhbmRvbV9ieXRlKCkgJiAxOwotfQotI2VuZGlmIC8qIFJFQURfUkdCX1RPX0dSQVkgfHwgUkVBRF9GSUxMRVIgKi8KLQotLyogQSBudW1lcmljIElEIGJhc2VkIG9uIFBORyBmaWxlIGNoYXJhY3RlcmlzdGljcy4gIFRoZSAnZG9faW50ZXJsYWNlJyBmaWVsZAotICogc2ltcGx5IHJlY29yZHMgd2hldGhlciBwbmd2YWxpZCBkaWQgdGhlIGludGVybGFjZSBpdHNlbGYgb3Igd2hldGhlciBpdAotICogd2FzIGRvbmUgYnkgbGlicG5nLiAgV2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGxlc3MgdGhhbiAyNTYuICAncGFsZXR0ZScgaXMgYW4KLSAqIGluZGV4IG9mIHRoZSBwYWxldHRlIHRvIHVzZSBmb3IgZm9ybWF0cyB3aXRoIGEgcGFsZXR0ZSBvdGhlcndpc2UgYSBib29sZWFuCi0gKiBpbmRpY2F0aW5nIGlmIGEgdFJOUyBjaHVuayB3YXMgZ2VuZXJhdGVkLgotICovCi0jZGVmaW5lIEZJTEVJRChjb2wsIGRlcHRoLCBwYWxldHRlLCBpbnRlcmxhY2UsIHdpZHRoLCBoZWlnaHQsIGRvX2ludGVybGFjZSkgXAotICAgKChwbmdfdWludF8zMikoKGNvbCkgKyAoKGRlcHRoKTw8MykgKyAoKHBhbGV0dGUpPDw4KSArICgoaW50ZXJsYWNlKTw8MTMpICsgXAotICAgICgoKGRvX2ludGVybGFjZSkhPTApPDwxNSkgKyAoKHdpZHRoKTw8MTYpICsgKChoZWlnaHQpPDwyNCkpKQotCi0jZGVmaW5lIENPTF9GUk9NX0lEKGlkKSAoKHBuZ19ieXRlKSgoaWQpJiAweDdVKSkKLSNkZWZpbmUgREVQVEhfRlJPTV9JRChpZCkgKChwbmdfYnl0ZSkoKChpZCkgPj4gMykgJiAweDFmVSkpCi0jZGVmaW5lIFBBTEVUVEVfRlJPTV9JRChpZCkgKCgoaWQpID4+IDgpICYgMHgxZikKLSNkZWZpbmUgSU5URVJMQUNFX0ZST01fSUQoaWQpICgocG5nX2J5dGUpKCgoaWQpID4+IDEzKSAmIDB4MykpCi0jZGVmaW5lIERPX0lOVEVSTEFDRV9GUk9NX0lEKGlkKSAoKGludCkoKChpZCk+PjE1KSAmIDEpKQotI2RlZmluZSBXSURUSF9GUk9NX0lEKGlkKSAoKChpZCk+PjE2KSAmIDB4ZmYpCi0jZGVmaW5lIEhFSUdIVF9GUk9NX0lEKGlkKSAoKChpZCk+PjI0KSAmIDB4ZmYpCi0KLS8qIFV0aWxpdHkgdG8gY29uc3RydWN0IGEgc3RhbmRhcmQgbmFtZSBmb3IgYSBzdGFuZGFyZCBpbWFnZS4gKi8KLXN0YXRpYyBzaXplX3QKLXN0YW5kYXJkX25hbWUoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywgcG5nX2J5dGUgY29sb3VyX3R5cGUsCi0gICAgaW50IGJpdF9kZXB0aCwgdW5zaWduZWQgaW50IG5wYWxldHRlLCBpbnQgaW50ZXJsYWNlX3R5cGUsCi0gICAgcG5nX3VpbnRfMzIgdywgcG5nX3VpbnRfMzIgaCwgaW50IGRvX2ludGVybGFjZSkKLXsKLSAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIGNvbG91cl90eXBlc1tjb2xvdXJfdHlwZV0pOwotICAgaWYgKGNvbG91cl90eXBlID09IDMpIC8qIG11c3QgaGF2ZSBhIHBhbGV0dGUgKi8KLSAgIHsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICJbIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0bihidWZmZXIsIGJ1ZnNpemUsIHBvcywgbnBhbGV0dGUpOwotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIl0iKTsKLSAgIH0KLQotICAgZWxzZSBpZiAobnBhbGV0dGUgIT0gMCkKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIrdFJOUyIpOwotCi0gICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiICIpOwotICAgcG9zID0gc2FmZWNhdG4oYnVmZmVyLCBidWZzaXplLCBwb3MsIGJpdF9kZXB0aCk7Ci0gICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiIGJpdCIpOwotCi0gICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9OT05FKQotICAgewotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiBpbnRlcmxhY2VkIik7Ci0gICAgICBpZiAoZG9faW50ZXJsYWNlKQotICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIihwbmd2YWxpZCkiKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIobGlicG5nKSIpOwotICAgfQotCi0gICBpZiAodyA+IDAgfHwgaCA+IDApCi0gICB7Ci0gICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiICIpOwotICAgICAgcG9zID0gc2FmZWNhdG4oYnVmZmVyLCBidWZzaXplLCBwb3MsIHcpOwotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIngiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRuKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBoKTsKLSAgIH0KLQotICAgcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIHNpemVfdAotc3RhbmRhcmRfbmFtZV9mcm9tX2lkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCBwb3MsIHBuZ191aW50XzMyIGlkKQotewotICAgcmV0dXJuIHN0YW5kYXJkX25hbWUoYnVmZmVyLCBidWZzaXplLCBwb3MsIENPTF9GUk9NX0lEKGlkKSwKLSAgICAgIERFUFRIX0ZST01fSUQoaWQpLCBQQUxFVFRFX0ZST01fSUQoaWQpLCBJTlRFUkxBQ0VfRlJPTV9JRChpZCksCi0gICAgICBXSURUSF9GUk9NX0lEKGlkKSwgSEVJR0hUX0ZST01fSUQoaWQpLCBET19JTlRFUkxBQ0VfRlJPTV9JRChpZCkpOwotfQotCi0vKiBDb252ZW5pZW5jZSBBUEkgYW5kIGRlZmluZXMgdG8gbGlzdCB2YWxpZCBmb3JtYXRzLiAgTm90ZSB0aGF0IDE2IGJpdCByZWFkIGFuZAotICogd3JpdGUgc3VwcG9ydCBpcyByZXF1aXJlZCB0byBkbyAxNiBiaXQgcmVhZCB0ZXN0cyAod2UgbXVzdCBiZSBhYmxlIHRvIG1ha2UgYQotICogMTYgYml0IGltYWdlIHRvIHRlc3QhKQotICovCi0jaWZkZWYgUE5HX1dSSVRFXzE2QklUX1NVUFBPUlRFRAotIyAgZGVmaW5lIFdSSVRFX0JESEkgNAotIyAgaWZkZWYgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVECi0jICAgICBkZWZpbmUgUkVBRF9CREhJIDQKLSMgICAgIGRlZmluZSBET18xNkJJVAotIyAgZW5kaWYKLSNlbHNlCi0jICBkZWZpbmUgV1JJVEVfQkRISSAzCi0jZW5kaWYKLSNpZm5kZWYgRE9fMTZCSVQKLSMgIGRlZmluZSBSRUFEX0JESEkgMwotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBwYWxldHRlcyB0byBnZW5lcmF0ZSBmb3IKLSAqIGVhY2ggbG9nIGJpdCBkZXB0aCBvZiBhIGNvbG91ciB0eXBlIDMgc3RhbmRhcmQgaW1hZ2UuCi0gKi8KLSNkZWZpbmUgUEFMRVRURV9DT1VOVChiaXRfZGVwdGgpICgoYml0X2RlcHRoKSA+IDQgPyAxVSA6IDE2VSkKLQotc3RhdGljIGludAotbmV4dF9mb3JtYXQocG5nX2J5dGVwIGNvbG91cl90eXBlLCBwbmdfYnl0ZXAgYml0X2RlcHRoLAotICAgdW5zaWduZWQgaW50KiBwYWxldHRlX251bWJlciwgaW50IGxvd19kZXB0aF9ncmF5LCBpbnQgdFJOUykKLXsKLSAgIGlmICgqYml0X2RlcHRoID09IDApCi0gICB7Ci0gICAgICAqY29sb3VyX3R5cGUgPSAwOwotICAgICAgaWYgKGxvd19kZXB0aF9ncmF5KQotICAgICAgICAgKmJpdF9kZXB0aCA9IDE7Ci0gICAgICBlbHNlCi0gICAgICAgICAqYml0X2RlcHRoID0gODsKLSAgICAgICpwYWxldHRlX251bWJlciA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgaWYgICgqY29sb3VyX3R5cGUgPCA0LypubyBhbHBoYSBjaGFubmVsKi8pCi0gICB7Ci0gICAgICAvKiBBZGQgbXVsdGlwbGUgcGFsZXR0ZXMgZm9yIGNvbG91ciB0eXBlIDMsIG9uZSBpbWFnZSB3aXRoIHRSTlMKLSAgICAgICAqIGFuZCBvbmUgd2l0aG91dCBmb3Igb3RoZXIgbm9uLWFscGhhIGZvcm1hdHM6Ci0gICAgICAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBwbiA9ICsrKnBhbGV0dGVfbnVtYmVyOwotICAgICAgcG5nX2J5dGUgY3QgPSAqY29sb3VyX3R5cGU7Ci0KLSAgICAgIGlmICgoKGN0ID09IDAvKkdSQVkqLyB8fCBjdC8qUkdCKi8gPT0gMikgJiYgdFJOUyAmJiBwbiA8IDIpIHx8Ci0gICAgICAgICAgKGN0ID09IDMvKlBBTEVUVEUqLyAmJiBwbiA8IFBBTEVUVEVfQ09VTlQoKmJpdF9kZXB0aCkpKQotICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIC8qIE5vOiBuZXh0IGJpdCBkZXB0aCAqLwotICAgICAgKnBhbGV0dGVfbnVtYmVyID0gMDsKLSAgIH0KLQotICAgKmJpdF9kZXB0aCA9IChwbmdfYnl0ZSkoKmJpdF9kZXB0aCA8PCAxKTsKLQotICAgLyogUGFsZXR0ZSBpbWFnZXMgYXJlIHJlc3RyaWN0ZWQgdG8gOCBiaXQgZGVwdGggKi8KLSAgIGlmICgqYml0X2RlcHRoIDw9IDgKLSNpZmRlZiBET18xNkJJVAotICAgICAgICAgfHwgKCpjb2xvdXJfdHlwZSAhPSAzICYmICpiaXRfZGVwdGggPD0gMTYpCi0jZW5kaWYKLSAgICAgICkKLSAgICAgIHJldHVybiAxOwotCi0gICAvKiBNb3ZlIHRvIHRoZSBuZXh0IGNvbG9yIHR5cGUsIG9yIHJldHVybiAwIGF0IHRoZSBlbmQuICovCi0gICBzd2l0Y2ggKCpjb2xvdXJfdHlwZSkKLSAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgICpjb2xvdXJfdHlwZSA9IDI7Ci0gICAgICAgICAqYml0X2RlcHRoID0gODsKLSAgICAgICAgIHJldHVybiAxOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICAgICAqY29sb3VyX3R5cGUgPSAzOwotICAgICAgICAgKmJpdF9kZXB0aCA9IDE7Ci0gICAgICAgICByZXR1cm4gMTsKLQotICAgICAgY2FzZSAzOgotICAgICAgICAgKmNvbG91cl90eXBlID0gNDsKLSAgICAgICAgICpiaXRfZGVwdGggPSA4OwotICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIGNhc2UgNDoKLSAgICAgICAgICpjb2xvdXJfdHlwZSA9IDY7Ci0gICAgICAgICAqYml0X2RlcHRoID0gODsKLSAgICAgICAgIHJldHVybiAxOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgcmV0dXJuIDA7Ci0gICB9Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAotc3RhdGljIHVuc2lnbmVkIGludAotc2FtcGxlKHBuZ19jb25zdF9ieXRlcCByb3csIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgsCi0gICAgcG5nX3VpbnRfMzIgeCwgdW5zaWduZWQgaW50IHNhbXBsZV9pbmRleCwgaW50IHN3YXAxNiwgaW50IGxpdHRsZWVuZGlhbikKLXsKLSAgIHBuZ191aW50XzMyIGJpdF9pbmRleCwgcmVzdWx0OwotCi0gICAvKiBGaW5kIGEgc2FtcGxlIGluZGV4IGZvciB0aGUgZGVzaXJlZCBzYW1wbGU6ICovCi0gICB4ICo9IGJpdF9kZXB0aDsKLSAgIGJpdF9pbmRleCA9IHg7Ci0KLSAgIGlmICgoY29sb3VyX3R5cGUgJiAxKSA9PSAwKSAvKiAhcGFsZXR0ZSAqLwotICAgewotICAgICAgaWYgKGNvbG91cl90eXBlICYgMikKLSAgICAgICAgIGJpdF9pbmRleCAqPSAzOwotCi0gICAgICBpZiAoY29sb3VyX3R5cGUgJiA0KQotICAgICAgICAgYml0X2luZGV4ICs9IHg7IC8qIEFscGhhIGNoYW5uZWwgKi8KLQotICAgICAgLyogTXVsdGlwbGUgY2hhbm5lbHM7IHNlbGVjdCBvbmU6ICovCi0gICAgICBpZiAoY29sb3VyX3R5cGUgJiAoMis0KSkKLSAgICAgICAgIGJpdF9pbmRleCArPSBzYW1wbGVfaW5kZXggKiBiaXRfZGVwdGg7Ci0gICB9Ci0KLSAgIC8qIFJldHVybiB0aGUgc2FtcGxlIGZyb20gdGhlIHJvdyBhcyBhbiBpbnRlZ2VyLiAqLwotICAgcm93ICs9IGJpdF9pbmRleCA+PiAzOwotICAgcmVzdWx0ID0gKnJvdzsKLQotICAgaWYgKGJpdF9kZXB0aCA9PSA4KQotICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgZWxzZSBpZiAoYml0X2RlcHRoID4gOCkKLSAgIHsKLSAgICAgIGlmIChzd2FwMTYpCi0gICAgICAgICByZXR1cm4gKCorK3JvdyA8PCA4KSArIHJlc3VsdDsKLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiAocmVzdWx0IDw8IDgpICsgKisrcm93OwotICAgfQotCi0gICAvKiBMZXNzIHRoYW4gOCBiaXRzIHBlciBzYW1wbGUuICBCeSBkZWZhdWx0IFBORyBoYXMgdGhlIGJpZyBlbmQgb2YKLSAgICAqIHRoZSBlZ2cgb24gdGhlIGxlZnQgb2YgdGhlIHNjcmVlbiwgYnV0IGlmIGxpdHRsZWVuZGlhbiBpcyBzZXQKLSAgICAqIHRoZW4gdGhlIGJpZyBlbmQgaXMgb24gdGhlIHJpZ2h0LgotICAgICovCi0gICBiaXRfaW5kZXggJj0gNzsKLQotICAgaWYgKCFsaXR0bGVlbmRpYW4pCi0gICAgICBiaXRfaW5kZXggPSA4LWJpdF9pbmRleC1iaXRfZGVwdGg7Ci0KLSAgIHJldHVybiAocmVzdWx0ID4+IGJpdF9pbmRleCkgJiAoKDFVPDxiaXRfZGVwdGgpLTEpOwotfQotI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCi0KLS8qIENvcHkgYSBzaW5nbGUgcGl4ZWwsIG9mIGEgZ2l2ZW4gc2l6ZSwgZnJvbSBvbmUgYnVmZmVyIHRvIGFub3RoZXIgLQotICogd2hpbGUgdGhpcyBpcyBiYXNpY2FsbHkgYml0IGFkZHJlc3NlZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCBhc3N1bXB0aW9uCi0gKiB0aGF0IHBpeGVscyA4IG9yIG1vcmUgYml0cyBpbiBzaXplIGFyZSBieXRlIGFsaWduZWQgYW5kIHRoYXQgcGl4ZWxzCi0gKiBkbyBub3Qgb3RoZXJ3aXNlIGNyb3NzIGJ5dGUgYm91bmRhcmllcy4gIChUaGlzIGlzLCBzbyBmYXIgYXMgSSBrbm93LAotICogdW5pdmVyc2FsbHkgdHJ1ZSBpbiBiaXRtYXAgY29tcHV0ZXIgZ3JhcGhpY3MuICBbSkNCIDIwMTAxMjEyXSkKLSAqCi0gKiBOT1RFOiBUaGUgdG8gYW5kIGZyb20gYnVmZmVycyBtYXkgYmUgdGhlIHNhbWUuCi0gKi8KLXN0YXRpYyB2b2lkCi1waXhlbF9jb3B5KHBuZ19ieXRlcCB0b0J1ZmZlciwgcG5nX3VpbnRfMzIgdG9JbmRleCwKLSAgIHBuZ19jb25zdF9ieXRlcCBmcm9tQnVmZmVyLCBwbmdfdWludF8zMiBmcm9tSW5kZXgsIHVuc2lnbmVkIGludCBwaXhlbFNpemUsCi0gICBpbnQgbGl0dGxlZW5kaWFuKQotewotICAgLyogQXNzdW1lIHdlIGNhbiBtdWx0aXBseSBieSAnc2l6ZScgd2l0aG91dCBvdmVyZmxvdyBiZWNhdXNlIHdlIGFyZQotICAgICoganVzdCB3b3JraW5nIGluIGEgc2luZ2xlIGJ1ZmZlci4KLSAgICAqLwotICAgdG9JbmRleCAqPSBwaXhlbFNpemU7Ci0gICBmcm9tSW5kZXggKj0gcGl4ZWxTaXplOwotICAgaWYgKHBpeGVsU2l6ZSA8IDgpIC8qIFN1Yi1ieXRlICovCi0gICB7Ci0gICAgICAvKiBNYXNrIHRvIHNlbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIGNvcGllZCBwaXhlbDogKi8KLSAgICAgIHVuc2lnbmVkIGludCBkZXN0TWFzayA9ICgoMVU8PHBpeGVsU2l6ZSktMSkgPDwKLSAgICAgICAgIChsaXR0bGVlbmRpYW4gPyB0b0luZGV4JjcgOiA4LXBpeGVsU2l6ZS0odG9JbmRleCY3KSk7Ci0gICAgICAvKiBUaGUgZm9sbG93aW5nIHJlYWQgdGhlIGVudGlyZSBwaXhlbHMgYW5kIGNsZWFycyB0aGUgZXh0cmE6ICovCi0gICAgICB1bnNpZ25lZCBpbnQgZGVzdEJ5dGUgPSB0b0J1ZmZlclt0b0luZGV4ID4+IDNdICYgfmRlc3RNYXNrOwotICAgICAgdW5zaWduZWQgaW50IHNvdXJjZUJ5dGUgPSBmcm9tQnVmZmVyW2Zyb21JbmRleCA+PiAzXTsKLQotICAgICAgLyogRG9uJ3QgcmVseSBvbiA8PCBvciA+PiBzdXBwb3J0aW5nICcwJyBoZXJlLCBqdXN0IGluIGNhc2U6ICovCi0gICAgICBmcm9tSW5kZXggJj0gNzsKLSAgICAgIGlmIChsaXR0bGVlbmRpYW4pCi0gICAgICB7Ci0gICAgICAgICBpZiAoZnJvbUluZGV4ID4gMCkgc291cmNlQnl0ZSA+Pj0gZnJvbUluZGV4OwotICAgICAgICAgaWYgKCh0b0luZGV4ICYgNykgPiAwKSBzb3VyY2VCeXRlIDw8PSB0b0luZGV4ICYgNzsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaWYgKGZyb21JbmRleCA+IDApIHNvdXJjZUJ5dGUgPDw9IGZyb21JbmRleDsKLSAgICAgICAgIGlmICgodG9JbmRleCAmIDcpID4gMCkgc291cmNlQnl0ZSA+Pj0gdG9JbmRleCAmIDc7Ci0gICAgICB9Ci0KLSAgICAgIHRvQnVmZmVyW3RvSW5kZXggPj4gM10gPSAocG5nX2J5dGUpKGRlc3RCeXRlIHwgKHNvdXJjZUJ5dGUgJiBkZXN0TWFzaykpOwotICAgfQotICAgZWxzZSAvKiBPbmUgb3IgbW9yZSBieXRlcyAqLwotICAgICAgbWVtbW92ZSh0b0J1ZmZlcisodG9JbmRleD4+MyksIGZyb21CdWZmZXIrKGZyb21JbmRleD4+MyksIHBpeGVsU2l6ZT4+Myk7Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLS8qIENvcHkgYSBjb21wbGV0ZSByb3cgb2YgcGl4ZWxzLCB0YWtpbmcgaW50byBhY2NvdW50IHBvdGVudGlhbCBwYXJ0aWFsCi0gKiBieXRlcyBhdCB0aGUgZW5kLgotICovCi1zdGF0aWMgdm9pZAotcm93X2NvcHkocG5nX2J5dGVwIHRvQnVmZmVyLCBwbmdfY29uc3RfYnl0ZXAgZnJvbUJ1ZmZlciwgdW5zaWduZWQgaW50IGJpdFdpZHRoLAotICAgICAgaW50IGxpdHRsZWVuZGlhbikKLXsKLSAgIG1lbWNweSh0b0J1ZmZlciwgZnJvbUJ1ZmZlciwgYml0V2lkdGggPj4gMyk7Ci0KLSAgIGlmICgoYml0V2lkdGggJiA3KSAhPSAwKQotICAgewotICAgICAgdW5zaWduZWQgaW50IG1hc2s7Ci0KLSAgICAgIHRvQnVmZmVyICs9IGJpdFdpZHRoID4+IDM7Ci0gICAgICBmcm9tQnVmZmVyICs9IGJpdFdpZHRoID4+IDM7Ci0gICAgICBpZiAobGl0dGxlZW5kaWFuKQotICAgICAgICAgbWFzayA9IDB4ZmYgPDwgKGJpdFdpZHRoICYgNyk7Ci0gICAgICBlbHNlCi0gICAgICAgICBtYXNrID0gMHhmZiA+PiAoYml0V2lkdGggJiA3KTsKLSAgICAgICp0b0J1ZmZlciA9IChwbmdfYnl0ZSkoKCp0b0J1ZmZlciAmIG1hc2spIHwgKCpmcm9tQnVmZmVyICYgfm1hc2spKTsKLSAgIH0KLX0KLQotLyogQ29tcGFyZSBwaXhlbHMgLSB0aGV5IGFyZSBhc3N1bWVkIHRvIHN0YXJ0IGF0IHRoZSBmaXJzdCBieXRlIGluIHRoZQotICogZ2l2ZW4gYnVmZmVycy4KLSAqLwotc3RhdGljIGludAotcGl4ZWxfY21wKHBuZ19jb25zdF9ieXRlcCBwYSwgcG5nX2NvbnN0X2J5dGVwIHBiLCBwbmdfdWludF8zMiBiaXRfd2lkdGgpCi17Ci0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDUwNgotICAgaWYgKG1lbWNtcChwYSwgcGIsIGJpdF93aWR0aD4+MykgPT0gMCkKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIHA7Ci0KLSAgICAgIGlmICgoYml0X3dpZHRoICYgNykgPT0gMCkgcmV0dXJuIDA7Ci0KLSAgICAgIC8qIE9rLCBhbnkgZGlmZmVyZW5jZXM/ICovCi0gICAgICBwID0gcGFbYml0X3dpZHRoID4+IDNdOwotICAgICAgcCBePSBwYltiaXRfd2lkdGggPj4gM107Ci0KLSAgICAgIGlmIChwID09IDApIHJldHVybiAwOwotCi0gICAgICAvKiBUaGVyZSBhcmUsIGJ1dCB0aGV5IG1heSBub3QgYmUgc2lnbmlmaWNhbnQsIHJlbW92ZSB0aGUgYml0cwotICAgICAgICogYWZ0ZXIgdGhlIGVuZCAodGhlIGxvdyBvcmRlciBiaXRzIGluIFBORy4pCi0gICAgICAgKi8KLSAgICAgIGJpdF93aWR0aCAmPSA3OwotICAgICAgcCA+Pj0gOC1iaXRfd2lkdGg7Ci0KLSAgICAgIGlmIChwID09IDApIHJldHVybiAwOwotICAgfQotI2Vsc2UKLSAgIC8qIEZyb20gbGlicG5nLTEuNS42IHRoZSBvdmVyd3JpdGUgc2hvdWxkIGJlIGZpeGVkLCBzbyBjb21wYXJlIHRoZSB0cmFpbGluZwotICAgICogYml0cyB0b286Ci0gICAgKi8KLSAgIGlmIChtZW1jbXAocGEsIHBiLCAoYml0X3dpZHRoKzcpPj4zKSA9PSAwKQotICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICAgLyogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY2hhbmdlZCBieXRlLiAqLwotICAgewotICAgICAgcG5nX3VpbnRfMzIgd2hlcmUgPSAwOwotCi0gICAgICB3aGlsZSAocGFbd2hlcmVdID09IHBiW3doZXJlXSkgKyt3aGVyZTsKLSAgICAgIHJldHVybiAxK3doZXJlOwotICAgfQotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJBU0lDIFBORyBGSUxFIFdSSVRJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQSBwbmdfc3RvcmUgdGFrZXMgZGF0YSBmcm9tIHRoZSBzZXF1ZW50aWFsIHdyaXRlciBvciBwcm92aWRlcyBkYXRhCi0gKiB0byB0aGUgc2VxdWVudGlhbCByZWFkZXIuICBJdCBjYW4gYWxzbyBzdG9yZSB0aGUgcmVzdWx0IG9mIGEgUE5HCi0gKiB3cml0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLgotICovCi0jZGVmaW5lIFNUT1JFX0JVRkZFUl9TSVpFIDUwMCAvKiBhcmJpdHJhcnkgKi8KLXR5cGVkZWYgc3RydWN0IHBuZ19zdG9yZV9idWZmZXIKLXsKLSAgIHN0cnVjdCBwbmdfc3RvcmVfYnVmZmVyKiAgcHJldjsgICAgLyogTk9URTogc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIgKi8KLSAgIHBuZ19ieXRlICAgICAgICAgICAgICAgICAgYnVmZmVyW1NUT1JFX0JVRkZFUl9TSVpFXTsKLX0gcG5nX3N0b3JlX2J1ZmZlcjsKLQotI2RlZmluZSBGSUxFX05BTUVfU0laRSA2NAotCi10eXBlZGVmIHN0cnVjdCBzdG9yZV9wYWxldHRlX2VudHJ5IC8qIHJlY29yZCBvZiBhIHNpbmdsZSBwYWxldHRlIGVudHJ5ICovCi17Ci0gICBwbmdfYnl0ZSByZWQ7Ci0gICBwbmdfYnl0ZSBncmVlbjsKLSAgIHBuZ19ieXRlIGJsdWU7Ci0gICBwbmdfYnl0ZSBhbHBoYTsKLX0gc3RvcmVfcGFsZXR0ZV9lbnRyeSwgc3RvcmVfcGFsZXR0ZVsyNTZdOwotCi10eXBlZGVmIHN0cnVjdCBwbmdfc3RvcmVfZmlsZQotewotICAgc3RydWN0IHBuZ19zdG9yZV9maWxlKiAgbmV4dDsgICAgICAvKiBhcyBtYW55IGFzIHlvdSBsaWtlLi4uICovCi0gICBjaGFyICAgICAgICAgICAgICAgICAgICBuYW1lW0ZJTEVfTkFNRV9TSVpFXTsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIElEQVRfYml0czsgLyogTnVtYmVyIG9mIGJpdHMgaW4gSURBVCBzaXplICovCi0gICBwbmdfdWludF8zMiAgICAgICAgICAgICBJREFUX3NpemU7IC8qIFRvdGFsIHNpemUgb2YgSURBVCBkYXRhICovCi0gICBwbmdfdWludF8zMiAgICAgICAgICAgICBpZDsgICAgICAgIC8qIG11c3QgYmUgY29ycmVjdCAoc2VlIEZJTEVJRCkgKi8KLSAgIHBuZ19zaXplX3QgICAgICAgICAgICAgIGRhdGFjb3VudDsgLyogSW4gdGhpcyAodGhlIGxhc3QpIGJ1ZmZlciAqLwotICAgcG5nX3N0b3JlX2J1ZmZlciAgICAgICAgZGF0YTsgICAgICAvKiBMYXN0IGJ1ZmZlciBpbiBmaWxlICovCi0gICBpbnQgICAgICAgICAgICAgICAgICAgICBucGFsZXR0ZTsgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHBhbGV0dGUgKi8KLSAgIHN0b3JlX3BhbGV0dGVfZW50cnkqICAgIHBhbGV0dGU7ICAgLyogTWF5IGJlIE5VTEwgKi8KLX0gcG5nX3N0b3JlX2ZpbGU7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgYSBwb29sIG9mIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBzaW5nbGUgbGlicG5nIHJlYWQgb3Igd3JpdGUKLSAqIG9wZXJhdGlvbi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfcG9vbAotewotICAgc3RydWN0IHBuZ19zdG9yZSAgICAqc3RvcmU7ICAgLyogQmFjayBwb2ludGVyICovCi0gICBzdHJ1Y3Qgc3RvcmVfbWVtb3J5ICpsaXN0OyAgICAvKiBMaXN0IG9mIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSAgIHBuZ19ieXRlICAgICAgICAgICAgIG1hcmtbNF07IC8qIEJlZm9yZSBhbmQgYWZ0ZXIgZGF0YSAqLwotCi0gICAvKiBTdGF0aXN0aWNzIGZvciB0aGlzIHJ1bi4gKi8KLSAgIHBuZ19hbGxvY19zaXplX3QgICAgIG1heDsgICAgIC8qIE1heGltdW0gc2luZ2xlIGFsbG9jYXRpb24gKi8KLSAgIHBuZ19hbGxvY19zaXplX3QgICAgIGN1cnJlbnQ7IC8qIEN1cnJlbnQgYWxsb2NhdGlvbiAqLwotICAgcG5nX2FsbG9jX3NpemVfdCAgICAgbGltaXQ7ICAgLyogSGlnaGVzdCBjdXJyZW50IGFsbG9jYXRpb24gKi8KLSAgIHBuZ19hbGxvY19zaXplX3QgICAgIHRvdGFsOyAgIC8qIFRvdGFsIGFsbG9jYXRpb24gKi8KLQotICAgLyogT3ZlcmFsbCBzdGF0aXN0aWNzIChyZXRhaW5lZCBhY3Jvc3Mgc3VjY2Vzc2l2ZSBydW5zKS4gKi8KLSAgIHBuZ19hbGxvY19zaXplX3QgICAgIG1heF9tYXg7Ci0gICBwbmdfYWxsb2Nfc2l6ZV90ICAgICBtYXhfbGltaXQ7Ci0gICBwbmdfYWxsb2Nfc2l6ZV90ICAgICBtYXhfdG90YWw7Ci19IHN0b3JlX3Bvb2w7Ci0KLXR5cGVkZWYgc3RydWN0IHBuZ19zdG9yZQotewotICAgLyogRm9yIGNleGNlcHQuaCBleGNlcHRpb24gaGFuZGxpbmcgLSBzaW1wbHkgc3RvcmUgb25lIG9mIHRoZXNlOwotICAgICogdGhlIGNvbnRleHQgaXMgYSBzZWxmIHBvaW50ZXIgYnV0IGl0IG1heSBwb2ludCB0byBhIGRpZmZlcmVudAotICAgICogcG5nX3N0b3JlIChpbiBmYWN0IGl0IG5ldmVyIGRvZXMgaW4gdGhpcyBwcm9ncmFtLikKLSAgICAqLwotICAgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX2NvbnRleHQ7Ci0KLSAgIHVuc2lnbmVkIGludCAgICAgICB2ZXJib3NlIDoxOwotICAgdW5zaWduZWQgaW50ICAgICAgIHRyZWF0X3dhcm5pbmdzX2FzX2Vycm9ycyA6MTsKLSAgIHVuc2lnbmVkIGludCAgICAgICBleHBlY3RfZXJyb3IgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgZXhwZWN0X3dhcm5pbmcgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgc2F3X3dhcm5pbmcgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgc3BlZWQgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgcHJvZ3Jlc3NpdmUgOjE7IC8qIHVzZSBwcm9ncmVzc2l2ZSByZWFkICovCi0gICB1bnNpZ25lZCBpbnQgICAgICAgdmFsaWRhdGVkIDoxOyAgIC8qIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmxhZyAqLwotICAgaW50ICAgICAgICAgICAgICAgIG5lcnJvcnM7Ci0gICBpbnQgICAgICAgICAgICAgICAgbndhcm5pbmdzOwotICAgaW50ICAgICAgICAgICAgICAgIG5vcHRpb25zOyAgICAgICAvKiBudW1iZXIgb2Ygb3B0aW9ucyBiZWxvdzogKi8KLSAgIHN0cnVjdCB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICAgb3B0aW9uOyAgICAgICAgIC8qIG9wdGlvbiBudW1iZXIsIDAuLjMwICovCi0gICAgICB1bnNpZ25lZCBjaGFyICAgc2V0dGluZzsgICAgICAgIC8qIHNldHRpbmcgKHVuc2V0LGludmFsaWQsb24sb2ZmKSAqLwotICAgfSAgICAgICAgICAgICAgICAgIG9wdGlvbnNbMTZdOwotICAgY2hhciAgICAgICAgICAgICAgIHRlc3RbMTI4XTsgICAgICAvKiBOYW1lIG9mIHRlc3QgKi8KLSAgIGNoYXIgICAgICAgICAgICAgICBlcnJvclsyNTZdOwotCi0gICAvKiBTaGFyZSBmaWVsZHMgKi8KLSAgIHBuZ191aW50XzMyICAgICAgICBjaHVua2xlbjsgLyogTGVuZ3RoIG9mIGNodW5rK292ZXJoZWFkIChjaHVua3BvcyA+PSA4KSAqLwotICAgcG5nX3VpbnRfMzIgICAgICAgIGNodW5rdHlwZTsvKiBUeXBlIG9mIGNodW5rICh2YWxpZCBpZiBjaHVua3BvcyA+PSA0KSAqLwotICAgcG5nX3VpbnRfMzIgICAgICAgIGNodW5rcG9zOyAvKiBQb3NpdGlvbiBpbiBjaHVuayAqLwotICAgcG5nX3VpbnRfMzIgICAgICAgIElEQVRfc2l6ZTsvKiBBY2N1bXVsYXRlZCBJREFUIHNpemUgaW4gLm5ldyAqLwotICAgdW5zaWduZWQgaW50ICAgICAgIElEQVRfYml0czsvKiBDYWNoZSBvZiB0aGUgZmlsZSBzdG9yZSB2YWx1ZSAqLwotCi0gICAvKiBSZWFkIGZpZWxkcyAqLwotICAgcG5nX3N0cnVjdHAgICAgICAgIHByZWFkOyAgICAvKiBVc2VkIHRvIHJlYWQgYSBzYXZlZCBmaWxlICovCi0gICBwbmdfaW5mb3AgICAgICAgICAgcGlyZWFkOwotICAgcG5nX3N0b3JlX2ZpbGUqICAgIGN1cnJlbnQ7ICAvKiBTZXQgd2hlbiByZWFkaW5nICovCi0gICBwbmdfc3RvcmVfYnVmZmVyKiAgbmV4dDsgICAgIC8qIFNldCB3aGVuIHJlYWRpbmcgKi8KLSAgIHBuZ19zaXplX3QgICAgICAgICByZWFkcG9zOyAgLyogUG9zaXRpb24gaW4gKm5leHQgKi8KLSAgIHBuZ19ieXRlKiAgICAgICAgICBpbWFnZTsgICAgLyogQnVmZmVyIGZvciByZWFkaW5nIGludGVybGFjZWQgaW1hZ2VzICovCi0gICBwbmdfc2l6ZV90ICAgICAgICAgY2JfaW1hZ2U7IC8qIFNpemUgb2YgdGhpcyBidWZmZXIgKi8KLSAgIHBuZ19zaXplX3QgICAgICAgICBjYl9yb3c7ICAgLyogUm93IHNpemUgb2YgdGhlIGltYWdlKHMpICovCi0gICB1TG9uZyAgICAgICAgICAgICAgSURBVF9jcmM7Ci0gICBwbmdfdWludF8zMiAgICAgICAgSURBVF9sZW47IC8qIFVzZWQgd2hlbiByZS1jaHVua2luZyBJREFUIGNodW5rcyAqLwotICAgcG5nX3VpbnRfMzIgICAgICAgIElEQVRfcG9zOyAvKiBVc2VkIHdoZW4gcmUtY2h1bmtpbmcgSURBVCBjaHVua3MgKi8KLSAgIHBuZ191aW50XzMyICAgICAgICBpbWFnZV9oOyAgLyogTnVtYmVyIG9mIHJvd3MgaW4gYSBzaW5nbGUgaW1hZ2UgKi8KLSAgIHN0b3JlX3Bvb2wgICAgICAgICByZWFkX21lbW9yeV9wb29sOwotCi0gICAvKiBXcml0ZSBmaWVsZHMgKi8KLSAgIHBuZ19zdG9yZV9maWxlKiAgICBzYXZlZDsKLSAgIHBuZ19zdHJ1Y3RwICAgICAgICBwd3JpdGU7ICAgLyogVXNlZCB3aGVuIHdyaXRpbmcgYSBuZXcgZmlsZSAqLwotICAgcG5nX2luZm9wICAgICAgICAgIHBpd3JpdGU7Ci0gICBwbmdfc2l6ZV90ICAgICAgICAgd3JpdGVwb3M7IC8qIFBvc2l0aW9uIGluIC5uZXcgKi8KLSAgIGNoYXIgICAgICAgICAgICAgICB3bmFtZVtGSUxFX05BTUVfU0laRV07Ci0gICBwbmdfc3RvcmVfYnVmZmVyICAgbmV3OyAgICAgIC8qIFRoZSBlbmQgb2YgdGhlIG5ldyBQTkcgZmlsZSBiZWluZyB3cml0dGVuLiAqLwotICAgc3RvcmVfcG9vbCAgICAgICAgIHdyaXRlX21lbW9yeV9wb29sOwotICAgc3RvcmVfcGFsZXR0ZV9lbnRyeSogcGFsZXR0ZTsKLSAgIGludCAgICAgICAgICAgICAgICAgIG5wYWxldHRlOwotfSBwbmdfc3RvcmU7Ci0KLS8qIEluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwICovCi1zdGF0aWMgdm9pZAotc3RvcmVfcG9vbF9tYXJrKHBuZ19ieXRlcCBtYXJrKQotewotICAgc3RhdGljIHBuZ191aW50XzMyIHN0b3JlX3NlZWRbMl0gPSB7IDB4MTIzNDU2NzgsIDF9OwotCi0gICBtYWtlX2ZvdXJfcmFuZG9tX2J5dGVzKHN0b3JlX3NlZWQsIG1hcmspOwotfQotCi0jaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKLS8qIFVzZSB0aGlzIGZvciByYW5kb20gMzIgYml0IHZhbHVlczsgdGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSByZXN1bHQgaXMKLSAqIG5vbi16ZXJvLgotICovCi1zdGF0aWMgcG5nX3VpbnRfMzIKLXJhbmRvbV8zMih2b2lkKQotewotCi0gICBmb3IgKDs7KQotICAgewotICAgICAgcG5nX2J5dGUgbWFya1s0XTsKLSAgICAgIHBuZ191aW50XzMyIHJlc3VsdDsKLQotICAgICAgc3RvcmVfcG9vbF9tYXJrKG1hcmspOwotICAgICAgcmVzdWx0ID0gcG5nX2dldF91aW50XzMyKG1hcmspOwotCi0gICAgICBpZiAocmVzdWx0ICE9IDApCi0gICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgfQotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi1zdGF0aWMgdm9pZAotc3RvcmVfcG9vbF9pbml0KHBuZ19zdG9yZSAqcHMsIHN0b3JlX3Bvb2wgKnBvb2wpCi17Ci0gICBtZW1zZXQocG9vbCwgMCwgc2l6ZW9mICpwb29sKTsKLQotICAgcG9vbC0+c3RvcmUgPSBwczsKLSAgIHBvb2wtPmxpc3QgPSBOVUxMOwotICAgcG9vbC0+bWF4ID0gcG9vbC0+Y3VycmVudCA9IHBvb2wtPmxpbWl0ID0gcG9vbC0+dG90YWwgPSAwOwotICAgcG9vbC0+bWF4X21heCA9IHBvb2wtPm1heF9saW1pdCA9IHBvb2wtPm1heF90b3RhbCA9IDA7Ci0gICBzdG9yZV9wb29sX21hcmsocG9vbC0+bWFyayk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdG9yZV9pbml0KHBuZ19zdG9yZSogcHMpCi17Ci0gICBtZW1zZXQocHMsIDAsIHNpemVvZiAqcHMpOwotICAgaW5pdF9leGNlcHRpb25fY29udGV4dCgmcHMtPmV4Y2VwdGlvbl9jb250ZXh0KTsKLSAgIHN0b3JlX3Bvb2xfaW5pdChwcywgJnBzLT5yZWFkX21lbW9yeV9wb29sKTsKLSAgIHN0b3JlX3Bvb2xfaW5pdChwcywgJnBzLT53cml0ZV9tZW1vcnlfcG9vbCk7Ci0gICBwcy0+dmVyYm9zZSA9IDA7Ci0gICBwcy0+dHJlYXRfd2FybmluZ3NfYXNfZXJyb3JzID0gMDsKLSAgIHBzLT5leHBlY3RfZXJyb3IgPSAwOwotICAgcHMtPmV4cGVjdF93YXJuaW5nID0gMDsKLSAgIHBzLT5zYXdfd2FybmluZyA9IDA7Ci0gICBwcy0+c3BlZWQgPSAwOwotICAgcHMtPnByb2dyZXNzaXZlID0gMDsKLSAgIHBzLT52YWxpZGF0ZWQgPSAwOwotICAgcHMtPm5lcnJvcnMgPSBwcy0+bndhcm5pbmdzID0gMDsKLSAgIHBzLT5wcmVhZCA9IE5VTEw7Ci0gICBwcy0+cGlyZWFkID0gTlVMTDsKLSAgIHBzLT5zYXZlZCA9IHBzLT5jdXJyZW50ID0gTlVMTDsKLSAgIHBzLT5uZXh0ID0gTlVMTDsKLSAgIHBzLT5yZWFkcG9zID0gMDsKLSAgIHBzLT5pbWFnZSA9IE5VTEw7Ci0gICBwcy0+Y2JfaW1hZ2UgPSAwOwotICAgcHMtPmNiX3JvdyA9IDA7Ci0gICBwcy0+aW1hZ2VfaCA9IDA7Ci0gICBwcy0+cHdyaXRlID0gTlVMTDsKLSAgIHBzLT5waXdyaXRlID0gTlVMTDsKLSAgIHBzLT53cml0ZXBvcyA9IDA7Ci0gICBwcy0+Y2h1bmtwb3MgPSA4OwotICAgcHMtPmNodW5rdHlwZSA9IDA7Ci0gICBwcy0+Y2h1bmtsZW4gPSAxNjsKLSAgIHBzLT5JREFUX3NpemUgPSAwOwotICAgcHMtPklEQVRfYml0cyA9IDA7Ci0gICBwcy0+bmV3LnByZXYgPSBOVUxMOwotICAgcHMtPnBhbGV0dGUgPSBOVUxMOwotICAgcHMtPm5wYWxldHRlID0gMDsKLSAgIHBzLT5ub3B0aW9ucyA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdG9yZV9mcmVlYnVmZmVyKHBuZ19zdG9yZV9idWZmZXIqIHBzYikKLXsKLSAgIGlmIChwc2ItPnByZXYpCi0gICB7Ci0gICAgICBzdG9yZV9mcmVlYnVmZmVyKHBzYi0+cHJldik7Ci0gICAgICBmcmVlKHBzYi0+cHJldik7Ci0gICAgICBwc2ItPnByZXYgPSBOVUxMOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RvcmVfZnJlZW5ldyhwbmdfc3RvcmUgKnBzKQotewotICAgc3RvcmVfZnJlZWJ1ZmZlcigmcHMtPm5ldyk7Ci0gICBwcy0+d3JpdGVwb3MgPSAwOwotICAgcHMtPmNodW5rcG9zID0gODsKLSAgIHBzLT5jaHVua3R5cGUgPSAwOwotICAgcHMtPmNodW5rbGVuID0gMTY7Ci0gICBwcy0+SURBVF9zaXplID0gMDsKLSAgIHBzLT5JREFUX2JpdHMgPSAwOwotICAgaWYgKHBzLT5wYWxldHRlICE9IE5VTEwpCi0gICB7Ci0gICAgICBmcmVlKHBzLT5wYWxldHRlKTsKLSAgICAgIHBzLT5wYWxldHRlID0gTlVMTDsKLSAgICAgIHBzLT5ucGFsZXR0ZSA9IDA7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdG9yZV9zdG9yZW5ldyhwbmdfc3RvcmUgKnBzKQotewotICAgcG5nX3N0b3JlX2J1ZmZlciAqcGI7Ci0KLSAgIHBiID0gdm9pZGNhc3QocG5nX3N0b3JlX2J1ZmZlciosIG1hbGxvYyhzaXplb2YgKnBiKSk7Ci0KLSAgIGlmIChwYiA9PSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBzLT5wd3JpdGUsICJzdG9yZSBuZXc6IE9PTSIpOwotCi0gICAqcGIgPSBwcy0+bmV3OwotICAgcHMtPm5ldy5wcmV2ID0gcGI7Ci0gICBwcy0+d3JpdGVwb3MgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotc3RvcmVfZnJlZWZpbGUocG5nX3N0b3JlX2ZpbGUgKipwcGYpCi17Ci0gICBpZiAoKnBwZiAhPSBOVUxMKQotICAgewotICAgICAgc3RvcmVfZnJlZWZpbGUoJigqcHBmKS0+bmV4dCk7Ci0KLSAgICAgIHN0b3JlX2ZyZWVidWZmZXIoJigqcHBmKS0+ZGF0YSk7Ci0gICAgICAoKnBwZiktPmRhdGFjb3VudCA9IDA7Ci0gICAgICBpZiAoKCpwcGYpLT5wYWxldHRlICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBmcmVlKCgqcHBmKS0+cGFsZXR0ZSk7Ci0gICAgICAgICAoKnBwZiktPnBhbGV0dGUgPSBOVUxMOwotICAgICAgICAgKCpwcGYpLT5ucGFsZXR0ZSA9IDA7Ci0gICAgICB9Ci0gICAgICBmcmVlKCpwcGYpOwotICAgICAgKnBwZiA9IE5VTEw7Ci0gICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWJpdHNfb2YocG5nX3VpbnRfMzIgbnVtKQotewotICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiAnbnVtJyAqLwotICAgdW5zaWduZWQgaW50IGIgPSAwOwotCi0gICBpZiAobnVtICYgMHhmZmZmMDAwMFUpICBiICs9IDE2VSwgbnVtID4+PSAxNjsKLSAgIGlmIChudW0gJiAweGZmMDBVKSAgICAgIGIgKz0gOFUsIG51bSA+Pj0gODsKLSAgIGlmIChudW0gJiAweGYwVSkgICAgICAgIGIgKz0gNFUsIG51bSA+Pj0gNDsKLSAgIGlmIChudW0gJiAweGNVKSAgICAgICAgIGIgKz0gMlUsIG51bSA+Pj0gMjsKLSAgIGlmIChudW0gJiAweDJVKSAgICAgICAgICsrYiwgbnVtID4+PSAxOwotICAgaWYgKG51bSkgICAgICAgICAgICAgICAgKytiOwotCi0gICByZXR1cm4gYjsgLyogMC4uMzIgKi8KLX0KLQotLyogTWFpbiBpbnRlcmZhY2UgdG8gZmlsZSBzdG9yZWFnZSwgYWZ0ZXIgd3JpdGluZyBhIG5ldyBQTkcgZmlsZSAoc2VlIHRoZSBBUEkKLSAqIGJlbG93KSBjYWxsIHN0b3JlX3N0b3JlZmlsZSB0byBzdG9yZSB0aGUgcmVzdWx0IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGlkLgotICovCi1zdGF0aWMgdm9pZAotc3RvcmVfc3RvcmVmaWxlKHBuZ19zdG9yZSAqcHMsIHBuZ191aW50XzMyIGlkKQotewotICAgcG5nX3N0b3JlX2ZpbGUgKnBmOwotCi0gICBpZiAocHMtPmNodW5rcG9zICE9IDBVIHx8IHBzLT5jaHVua3R5cGUgIT0gMFUgfHwgcHMtPmNodW5rbGVuICE9IDBVIHx8Ci0gICAgICAgcHMtPklEQVRfc2l6ZSA9PSAwKQotICAgICAgcG5nX2Vycm9yKHBzLT5wd3JpdGUsICJzdG9yZWZpbGU6IGluY29tcGxldGUgd3JpdGUiKTsKLQotICAgcGYgPSB2b2lkY2FzdChwbmdfc3RvcmVfZmlsZSosIG1hbGxvYyhzaXplb2YgKnBmKSk7Ci0gICBpZiAocGYgPT0gTlVMTCkKLSAgICAgIHBuZ19lcnJvcihwcy0+cHdyaXRlLCAic3RvcmVmaWxlOiBPT00iKTsKLSAgIHNhZmVjYXQocGYtPm5hbWUsIHNpemVvZiBwZi0+bmFtZSwgMCwgcHMtPnduYW1lKTsKLSAgIHBmLT5pZCA9IGlkOwotICAgcGYtPmRhdGEgPSBwcy0+bmV3OwotICAgcGYtPmRhdGFjb3VudCA9IHBzLT53cml0ZXBvczsKLSAgIHBmLT5JREFUX3NpemUgPSBwcy0+SURBVF9zaXplOwotICAgcGYtPklEQVRfYml0cyA9IGJpdHNfb2YocHMtPklEQVRfc2l6ZSk7Ci0gICAvKiBCZWNhdXNlIHRoZSBJREFUIGFsd2F5cyBoYXMgemxpYiBoZWFkZXIgc3R1ZmYgdGhpcyBtdXN0IGJlIHRydWU6ICovCi0gICBpZiAocGYtPklEQVRfYml0cyA9PSAwVSkKLSAgICAgIHBuZ19lcnJvcihwcy0+cHdyaXRlLCAic3RvcmVmaWxlOiAwIHNpemVkIElEQVQiKTsKLSAgIHBzLT5uZXcucHJldiA9IE5VTEw7Ci0gICBwcy0+d3JpdGVwb3MgPSAwOwotICAgcHMtPmNodW5rcG9zID0gODsKLSAgIHBzLT5jaHVua3R5cGUgPSAwOwotICAgcHMtPmNodW5rbGVuID0gMTY7Ci0gICBwcy0+SURBVF9zaXplID0gMDsKLSAgIHBmLT5wYWxldHRlID0gcHMtPnBhbGV0dGU7Ci0gICBwZi0+bnBhbGV0dGUgPSBwcy0+bnBhbGV0dGU7Ci0gICBwcy0+cGFsZXR0ZSA9IDA7Ci0gICBwcy0+bnBhbGV0dGUgPSAwOwotCi0gICAvKiBBbmQgc2F2ZSBpdC4gKi8KLSAgIHBmLT5uZXh0ID0gcHMtPnNhdmVkOwotICAgcHMtPnNhdmVkID0gcGY7Ci19Ci0KLS8qIEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgKGluIHRoZSBnaXZlbiBidWZmZXIpICovCi1zdGF0aWMgc2l6ZV90Ci1zdG9yZV9tZXNzYWdlKHBuZ19zdG9yZSAqcHMsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplLAotICAgc2l6ZV90IHBvcywgY29uc3QgY2hhciAqbXNnKQotewotICAgaWYgKHBwICE9IE5VTEwgJiYgcHAgPT0gcHMtPnByZWFkKQotICAgewotICAgICAgLyogUmVhZGluZyBhIGZpbGUgKi8KLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICJyZWFkOiAiKTsKLQotICAgICAgaWYgKHBzLT5jdXJyZW50ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBwcy0+Y3VycmVudC0+bmFtZSk7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBzZXApOwotICAgICAgfQotICAgfQotCi0gICBlbHNlIGlmIChwcCAhPSBOVUxMICYmIHBwID09IHBzLT5wd3JpdGUpCi0gICB7Ci0gICAgICAvKiBXcml0aW5nIGEgZmlsZSAqLwotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIndyaXRlOiAiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIHBzLT53bmFtZSk7Ci0gICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBzZXApOwotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICAvKiBOZWl0aGVyIHJlYWRpbmcgbm9yIHdyaXRpbmcgKG9yIGEgbWVtb3J5IGVycm9yIGluIHN0cnVjdCBkZWxldGUpICovCi0gICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAicG5ndmFsaWQ6ICIpOwotICAgfQotCi0gICBpZiAocHMtPnRlc3RbMF0gIT0gMCkKLSAgIHsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIHBzLT50ZXN0KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsIHNlcCk7Ci0gICB9Ci0gICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBtc2cpOwotICAgcmV0dXJuIHBvczsKLX0KLQotLyogVmVyYm9zZSBvdXRwdXQgdG8gdGhlIGVycm9yIHN0cmVhbTogKi8KLXN0YXRpYyB2b2lkCi1zdG9yZV92ZXJib3NlKHBuZ19zdG9yZSAqcHMsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfY29uc3RfY2hhcnAgcHJlZml4LAotICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCi17Ci0gICBjaGFyIGJ1ZmZlcls1MTJdOwotCi0gICBpZiAocHJlZml4KQotICAgICAgZnB1dHMocHJlZml4LCBzdGRlcnIpOwotCi0gICAodm9pZClzdG9yZV9tZXNzYWdlKHBzLCBwcCwgYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAwLCBtZXNzYWdlKTsKLSAgIGZwdXRzKGJ1ZmZlciwgc3RkZXJyKTsKLSAgIGZwdXRjKCdcbicsIHN0ZGVycik7Ci19Ci0KLS8qIExvZyBhbiBlcnJvciBvciB3YXJuaW5nIC0gdGhlIHJlbGV2YW50IGNvdW50IGlzIGFsd2F5cyBpbmNyZW1lbnRlZC4gKi8KLXN0YXRpYyB2b2lkCi1zdG9yZV9sb2cocG5nX3N0b3JlKiBwcywgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlLAotICAgaW50IGlzX2Vycm9yKQotewotICAgLyogVGhlIHdhcm5pbmcgaXMgY29waWVkIHRvIHRoZSBlcnJvciBidWZmZXIgaWYgdGhlcmUgYXJlIG5vIGVycm9ycyBhbmQgaXQgaXMKLSAgICAqIHRoZSBmaXJzdCB3YXJuaW5nLiAgVGhlIGVycm9yIGlzIGNvcGllZCB0byB0aGUgZXJyb3IgYnVmZmVyIGlmIGl0IGlzIHRoZQotICAgICogZmlyc3QgZXJyb3IgKG92ZXJ3cml0aW5nIGFueSBwcmlvciB3YXJuaW5ncykuCi0gICAgKi8KLSAgIGlmIChpc19lcnJvciA/IChwcy0+bmVycm9ycykrKyA9PSAwIDoKLSAgICAgICAocHMtPm53YXJuaW5ncykrKyA9PSAwICYmIHBzLT5uZXJyb3JzID09IDApCi0gICAgICBzdG9yZV9tZXNzYWdlKHBzLCBwcCwgcHMtPmVycm9yLCBzaXplb2YgcHMtPmVycm9yLCAwLCBtZXNzYWdlKTsKLQotICAgaWYgKHBzLT52ZXJib3NlKQotICAgICAgc3RvcmVfdmVyYm9zZShwcywgcHAsIGlzX2Vycm9yID8gImVycm9yOiAiIDogIndhcm5pbmc6ICIsIG1lc3NhZ2UpOwotfQotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0vKiBJbnRlcm5hbCBlcnJvciBmdW5jdGlvbiwgY2FsbGVkIHdpdGggYSBwbmdfc3RvcmUgYnV0IG5vIGxpYnBuZyBzdHVmZi4gKi8KLXN0YXRpYyB2b2lkCi1pbnRlcm5hbF9lcnJvcihwbmdfc3RvcmUgKnBzLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKLXsKLSAgIHN0b3JlX2xvZyhwcywgTlVMTCwgbWVzc2FnZSwgMSAvKiBlcnJvciAqLyk7Ci0KLSAgIC8qIEFuZCBmaW5hbGx5IHRocm93IGFuIGV4Y2VwdGlvbi4gKi8KLSAgIHsKLSAgICAgIHN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqdGhlX2V4Y2VwdGlvbl9jb250ZXh0ID0gJnBzLT5leGNlcHRpb25fY29udGV4dDsKLSAgICAgIFRocm93IHBzOwotICAgfQotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0vKiBGdW5jdGlvbnMgdG8gdXNlIGFzIFBORyBjYWxsYmFja3MuICovCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotc3RvcmVfZXJyb3IocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpIC8qIFBOR19OT1JFVFVSTiAqLwotewotICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOwotICAgcG5nX3N0b3JlICpwcyA9IHZvaWRjYXN0KHBuZ19zdG9yZSosIHBuZ19nZXRfZXJyb3JfcHRyKHBwKSk7Ci0KLSAgIGlmICghcHMtPmV4cGVjdF9lcnJvcikKLSAgICAgIHN0b3JlX2xvZyhwcywgcHAsIG1lc3NhZ2UsIDEgLyogZXJyb3IgKi8pOwotCi0gICAvKiBBbmQgZmluYWxseSB0aHJvdyBhbiBleGNlcHRpb24uICovCi0gICB7Ci0gICAgICBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCA9ICZwcy0+ZXhjZXB0aW9uX2NvbnRleHQ7Ci0gICAgICBUaHJvdyBwczsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLXN0b3JlX3dhcm5pbmcocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpCi17Ci0gICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47Ci0gICBwbmdfc3RvcmUgKnBzID0gdm9pZGNhc3QocG5nX3N0b3JlKiwgcG5nX2dldF9lcnJvcl9wdHIocHApKTsKLQotICAgaWYgKCFwcy0+ZXhwZWN0X3dhcm5pbmcpCi0gICAgICBzdG9yZV9sb2cocHMsIHBwLCBtZXNzYWdlLCAwIC8qIHdhcm5pbmcgKi8pOwotICAgZWxzZQotICAgICAgcHMtPnNhd193YXJuaW5nID0gMTsKLX0KLQotLyogVGhlc2Ugc29tZXdoYXQgb2RkIGZ1bmN0aW9ucyBhcmUgdXNlZCB3aGVuIHJlYWRpbmcgYW4gaW1hZ2UgdG8gZW5zdXJlIHRoYXQKLSAqIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCwgdGhlIHBuZ19zdHJ1Y3RwIGlzIGZvciBlcnJvcnMuCi0gKi8KLS8qIFJldHVybiBhIHNpbmdsZSByb3cgZnJvbSB0aGUgY29ycmVjdCBpbWFnZS4gKi8KLXN0YXRpYyBwbmdfYnl0ZXAKLXN0b3JlX2ltYWdlX3Jvdyhjb25zdCBwbmdfc3RvcmUqIHBzLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwgaW50IG5JbWFnZSwKLSAgIHBuZ191aW50XzMyIHkpCi17Ci0gICBwbmdfc2l6ZV90IGNvZmZzZXQgPSAobkltYWdlICogcHMtPmltYWdlX2ggKyB5KSAqIChwcy0+Y2Jfcm93ICsgNSkgKyAyOwotCi0gICBpZiAocHMtPmltYWdlID09IE5VTEwpCi0gICAgICBwbmdfZXJyb3IocHAsICJubyBhbGxvY2F0ZWQgaW1hZ2UiKTsKLQotICAgaWYgKGNvZmZzZXQgKyBwcy0+Y2Jfcm93ICsgMyA+IHBzLT5jYl9pbWFnZSkKLSAgICAgIHBuZ19lcnJvcihwcCwgImltYWdlIHRvbyBzbWFsbCIpOwotCi0gICByZXR1cm4gcHMtPmltYWdlICsgY29mZnNldDsKLX0KLQotc3RhdGljIHZvaWQKLXN0b3JlX2ltYWdlX2ZyZWUocG5nX3N0b3JlICpwcywgcG5nX2NvbnN0X3N0cnVjdHAgcHApCi17Ci0gICBpZiAocHMtPmltYWdlICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfYnl0ZXAgaW1hZ2UgPSBwcy0+aW1hZ2U7Ci0KLSAgICAgIGlmIChpbWFnZVstMV0gIT0gMHhlZCB8fCBpbWFnZVtwcy0+Y2JfaW1hZ2VdICE9IDB4ZmUpCi0gICAgICB7Ci0gICAgICAgICBpZiAocHAgIT0gTlVMTCkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInBuZ19zdG9yZSBpbWFnZSBvdmVyd3JpdGUgKDEpIik7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdG9yZV9sb2cocHMsIE5VTEwsICJwbmdfc3RvcmUgaW1hZ2Ugb3ZlcndyaXRlICgyKSIsIDEpOwotICAgICAgfQotCi0gICAgICBwcy0+aW1hZ2UgPSBOVUxMOwotICAgICAgcHMtPmNiX2ltYWdlID0gMDsKLSAgICAgIC0taW1hZ2U7Ci0gICAgICBmcmVlKGltYWdlKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0b3JlX2Vuc3VyZV9pbWFnZShwbmdfc3RvcmUgKnBzLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwgaW50IG5JbWFnZXMsCi0gICBwbmdfc2l6ZV90IGNiUm93LCBwbmdfdWludF8zMiBjUm93cykKLXsKLSAgIHBuZ19zaXplX3QgY2IgPSBuSW1hZ2VzICogY1Jvd3MgKiAoY2JSb3cgKyA1KTsKLQotICAgaWYgKHBzLT5jYl9pbWFnZSA8IGNiKQotICAgewotICAgICAgcG5nX2J5dGVwIGltYWdlOwotCi0gICAgICBzdG9yZV9pbWFnZV9mcmVlKHBzLCBwcCk7Ci0KLSAgICAgIC8qIFRoZSBidWZmZXIgaXMgZGVsaWJlcmF0ZWx5IG1pcy1hbGlnbmVkLiAqLwotICAgICAgaW1hZ2UgPSB2b2lkY2FzdChwbmdfYnl0ZXAsIG1hbGxvYyhjYisyKSk7Ci0gICAgICBpZiAoaW1hZ2UgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIC8qIENhbGxlZCBmcm9tIHRoZSBzdGFydHVwIC0gaWdub3JlIHRoZSBlcnJvciBmb3IgdGhlIG1vbWVudC4gKi8KLSAgICAgICAgIGlmIChwcCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJPT00gYWxsb2NhdGluZyBpbWFnZSBidWZmZXIiKTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlc2UgbWFnaWMgdGFncyBhcmUgdXNlZCB0byBkZXRlY3Qgb3ZlcndyaXRlcyBhYm92ZS4gKi8KLSAgICAgICsraW1hZ2U7Ci0gICAgICBpbWFnZVstMV0gPSAweGVkOwotICAgICAgaW1hZ2VbY2JdID0gMHhmZTsKLQotICAgICAgcHMtPmltYWdlID0gaW1hZ2U7Ci0gICAgICBwcy0+Y2JfaW1hZ2UgPSBjYjsKLSAgIH0KLQotICAgLyogV2UgaGF2ZSBhbiBhZGVxdWF0ZSBzaXplZCBpbWFnZTsgbGF5IG91dCB0aGUgcm93cy4gIFRoZXJlIGFyZSAyIGJ5dGVzIGF0Ci0gICAgKiB0aGUgc3RhcnQgYW5kIHRocmVlIGF0IHRoZSBlbmQgb2YgZWFjaCAodGhpcyBlbnN1cmVzIHRoYXQgdGhlIHJvdwotICAgICogYWxpZ25tZW50IHN0YXJ0cyBvdXQgb2RkIC0gMisxIGFuZCBjaGFuZ2VzIGZvciBsYXJnZXIgaW1hZ2VzIG9uIGVhY2ggcm93LikKLSAgICAqLwotICAgcHMtPmNiX3JvdyA9IGNiUm93OwotICAgcHMtPmltYWdlX2ggPSBjUm93czsKLQotICAgLyogRm9yIGVycm9yIGNoZWNraW5nLCB0aGUgd2hvbGUgYnVmZmVyIGlzIHNldCB0byAxMDExMDAxMCAoMHhiMiAtIDE3OCkuCi0gICAgKiBUaGlzIGRlbGliZXJhdGVseSBkb2Vzbid0IG1hdGNoIHRoZSBiaXRzIGluIHRoZSBzaXplIHRlc3QgaW1hZ2Ugd2hpY2ggYXJlCi0gICAgKiBvdXRzaWRlIHRoZSBpbWFnZTsgdGhlc2UgYXJlIHNldCB0byAweGZmIChhbGwgMSkuICBUbyBtYWtlIHRoZSByb3cKLSAgICAqIGNvbXBhcmlzb24gd29yayBpbiB0aGUgJ3NpemUnIHRlc3QgY2FzZSB0aGUgc2l6ZSByb3dzIGFyZSBwcmUtaW5pdGlhbGl6ZWQKLSAgICAqIHRvIHRoZSBzYW1lIHZhbHVlIHByaW9yIHRvIGNhbGxpbmcgJ3N0YW5kYXJkX3JvdycuCi0gICAgKi8KLSAgIG1lbXNldChwcy0+aW1hZ2UsIDE3OCwgY2IpOwotCi0gICAvKiBUaGVuIHB1dCBpbiB0aGUgbWFya3MuICovCi0gICB3aGlsZSAoLS1uSW1hZ2VzID49IDApCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiB5OwotCi0gICAgICBmb3IgKHk9MDsgeTxjUm93czsgKyt5KQotICAgICAgewotICAgICAgICAgcG5nX2J5dGVwIHJvdyA9IHN0b3JlX2ltYWdlX3JvdyhwcywgcHAsIG5JbWFnZXMsIHkpOwotCi0gICAgICAgICAvKiBUaGUgbWFya2VyczogKi8KLSAgICAgICAgIHJvd1stMl0gPSAxOTA7Ci0gICAgICAgICByb3dbLTFdID0gMjM5OwotICAgICAgICAgcm93W2NiUm93XSA9IDIyMjsKLSAgICAgICAgIHJvd1tjYlJvdysxXSA9IDE3MzsKLSAgICAgICAgIHJvd1tjYlJvdysyXSA9IDE3OwotICAgICAgfQotICAgfQotfQotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotc3RvcmVfaW1hZ2VfY2hlY2soY29uc3QgcG5nX3N0b3JlKiBwcywgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIGludCBpSW1hZ2UpCi17Ci0gICBwbmdfY29uc3RfYnl0ZXAgaW1hZ2UgPSBwcy0+aW1hZ2U7Ci0KLSAgIGlmIChpbWFnZVstMV0gIT0gMHhlZCB8fCBpbWFnZVtwcy0+Y2JfaW1hZ2VdICE9IDB4ZmUpCi0gICAgICBwbmdfZXJyb3IocHAsICJpbWFnZSBvdmVyd3JpdGUiKTsKLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ19zaXplX3QgY2JSb3cgPSBwcy0+Y2Jfcm93OwotICAgICAgcG5nX3VpbnRfMzIgcm93cyA9IHBzLT5pbWFnZV9oOwotCi0gICAgICBpbWFnZSArPSBpSW1hZ2UgKiAoY2JSb3crNSkgKiBwcy0+aW1hZ2VfaDsKLQotICAgICAgaW1hZ2UgKz0gMjsgLyogc2tpcCBpbWFnZSBmaXJzdCByb3cgbWFya2VycyAqLwotCi0gICAgICB3aGlsZSAocm93cy0tID4gMCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChpbWFnZVstMl0gIT0gMTkwIHx8IGltYWdlWy0xXSAhPSAyMzkpCi0gICAgICAgICAgICBwbmdfZXJyb3IocHAsICJyb3cgc3RhcnQgb3ZlcndyaXR0ZW4iKTsKLQotICAgICAgICAgaWYgKGltYWdlW2NiUm93XSAhPSAyMjIgfHwgaW1hZ2VbY2JSb3crMV0gIT0gMTczIHx8Ci0gICAgICAgICAgICBpbWFnZVtjYlJvdysyXSAhPSAxNykKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInJvdyBlbmQgb3ZlcndyaXR0ZW4iKTsKLQotICAgICAgICAgaW1hZ2UgKz0gY2JSb3crNTsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KLQotc3RhdGljIGludAotdmFsaWRfY2h1bmt0eXBlKHBuZ191aW50XzMyIGNodW5rdHlwZSkKLXsKLSAgIC8qIEVhY2ggYnl0ZSBpbiB0aGUgY2h1bmsgdHlwZSBtdXN0IGJlIGluIG9uZSBvZiB0aGUgcmFuZ2VzIDY1Li45MCwgOTcuLjEyMgotICAgICogKGJvdGggaW5jbHVzaXZlKSwgc286Ci0gICAgKi8KLSAgIHVuc2lnbmVkIGludCBpOwotCi0gICBmb3IgKGk9MDsgaTw0OyArK2kpCi0gICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYyA9IGNodW5rdHlwZSAmIDB4ZmZVOwotCi0gICAgICBpZiAoISgoYyA+PSA2NVUgJiYgYyA8PSA5MFUpIHx8IChjID49IDk3VSAmJiBjIDw9IDEyMlUpKSkKLSAgICAgICAgIHJldHVybiAwOwotCi0gICAgICBjaHVua3R5cGUgPj49IDg7Ci0gICB9Ci0KLSAgIHJldHVybiAxOyAvKiBJdCdzIHZhbGlkICovCi19Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi1zdG9yZV93cml0ZShwbmdfc3RydWN0cCBwcEluLCBwbmdfYnl0ZXAgcGIsIHBuZ19zaXplX3Qgc3QpCi17Ci0gICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47Ci0gICBwbmdfc3RvcmUgKnBzID0gdm9pZGNhc3QocG5nX3N0b3JlKiwgcG5nX2dldF9pb19wdHIocHApKTsKLSAgIHNpemVfdCB3cml0ZXBvcyA9IHBzLT53cml0ZXBvczsKLSAgIHBuZ191aW50XzMyIGNodW5rcG9zID0gcHMtPmNodW5rcG9zOwotICAgcG5nX3VpbnRfMzIgY2h1bmt0eXBlID0gcHMtPmNodW5rdHlwZTsKLSAgIHBuZ191aW50XzMyIGNodW5rbGVuID0gcHMtPmNodW5rbGVuOwotCi0gICBpZiAocHMtPnB3cml0ZSAhPSBwcCkKLSAgICAgIHBuZ19lcnJvcihwcCwgInN0b3JlIHN0YXRlIGRhbWFnZWQiKTsKLQotICAgLyogVGVjaG5pY2FsbHkgdGhpcyBpcyBsZWdhbCwgYnV0IGluIHByYWN0aWNlIGxpYnBuZyBuZXZlciB3cml0ZXMgbW9yZSB0aGFuCi0gICAgKiB0aGUgbWF4aW11bSBjaHVuayBzaXplIGF0IG9uY2Ugc28gaWYgaXQgaGFwcGVucyBzb21ldGhpbmcgd2VpcmQgaGFzCi0gICAgKiBjaGFuZ2VkIGluc2lkZSBsaWJwbmcgKHByb2JhYmx5KS4KLSAgICAqLwotICAgaWYgKHN0ID4gMHg3ZmZmZmZmZlUpCi0gICAgICBwbmdfZXJyb3IocHAsICJ1bmV4cGVjdGVkIHdyaXRlIHNpemUiKTsKLQotICAgLyogTm93IHByb2Nlc3MgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uICBEbyB0aGlzIGluIHVuaXRzIG9mIHRoZSBzcGFjZSBpbiB0aGUKLSAgICAqIG91dHB1dCAod3JpdGUpIGJ1ZmZlciBvciwgYXQgdGhlIHN0YXJ0IDQgYnl0ZXMgZm9yIHRoZSBjaHVuayB0eXBlIGFuZAotICAgICogbGVuZ3RoIGxpbWl0ZWQgaW4gYW55IGNhc2UgYnkgdGhlIGFtb3VudCBvZiBkYXRhLgotICAgICovCi0gICB3aGlsZSAoc3QgPiAwKQotICAgewotICAgICAgaWYgKHdyaXRlcG9zID49IFNUT1JFX0JVRkZFUl9TSVpFKQotICAgICAgICAgc3RvcmVfc3RvcmVuZXcocHMpLCB3cml0ZXBvcyA9IDA7Ci0KLSAgICAgIGlmIChjaHVua3BvcyA8IDQpCi0gICAgICB7Ci0gICAgICAgICBwbmdfYnl0ZSBiID0gKnBiKys7Ci0gICAgICAgICAtLXN0OwotICAgICAgICAgY2h1bmtsZW4gPSAoY2h1bmtsZW4gPDwgOCkgKyBiOwotICAgICAgICAgcHMtPm5ldy5idWZmZXJbd3JpdGVwb3MrK10gPSBiOwotICAgICAgICAgKytjaHVua3BvczsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoY2h1bmtwb3MgPCA4KQotICAgICAgewotICAgICAgICAgcG5nX2J5dGUgYiA9ICpwYisrOwotICAgICAgICAgLS1zdDsKLSAgICAgICAgIGNodW5rdHlwZSA9IChjaHVua3R5cGUgPDwgOCkgKyBiOwotICAgICAgICAgcHMtPm5ldy5idWZmZXJbd3JpdGVwb3MrK10gPSBiOwotCi0gICAgICAgICBpZiAoKytjaHVua3BvcyA9PSA4KQotICAgICAgICAgewotICAgICAgICAgICAgY2h1bmtsZW4gJj0gMHhmZmZmZmZmZlU7Ci0gICAgICAgICAgICBpZiAoY2h1bmtsZW4gPiAweDdmZmZmZmZmVSkKLSAgICAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgImNodW5rIGxlbmd0aCB0b28gZ3JlYXQiKTsKLQotICAgICAgICAgICAgY2h1bmt0eXBlICY9IDB4ZmZmZmZmZmZVOwotICAgICAgICAgICAgaWYgKGNodW5rdHlwZSA9PSBDSFVOS19JREFUKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGNodW5rbGVuID4gfnBzLT5JREFUX3NpemUpCi0gICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJwbmd2YWxpZCBpbnRlcm5hbCBpbWFnZSB0b28gbGFyZ2UiKTsKLQotICAgICAgICAgICAgICAgcHMtPklEQVRfc2l6ZSArPSBjaHVua2xlbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAoIXZhbGlkX2NodW5rdHlwZShjaHVua3R5cGUpKQotICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAiaW52YWxpZCBjaHVuayB0eXBlIik7Ci0KLSAgICAgICAgICAgIGNodW5rbGVuICs9IDEyOyAvKiBmb3IgaGVhZGVyIGFuZCBDUkMgKi8KLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSAvKiBjaHVua3BvcyA+PSA4ICovCi0gICAgICB7Ci0gICAgICAgICBwbmdfc2l6ZV90IGNiID0gc3Q7Ci0KLSAgICAgICAgIGlmIChjYiA+IFNUT1JFX0JVRkZFUl9TSVpFIC0gd3JpdGVwb3MpCi0gICAgICAgICAgICBjYiA9IFNUT1JFX0JVRkZFUl9TSVpFIC0gd3JpdGVwb3M7Ci0KLSAgICAgICAgIGlmIChjYiAgPiBjaHVua2xlbiAtIGNodW5rcG9zLyogYnl0ZXMgbGVmdCBpbiBjaHVuayovKQotICAgICAgICAgICAgY2IgPSAocG5nX3NpemVfdCkvKlNBRkUqLyhjaHVua2xlbiAtIGNodW5rcG9zKTsKLQotICAgICAgICAgbWVtY3B5KHBzLT5uZXcuYnVmZmVyICsgd3JpdGVwb3MsIHBiLCBjYik7Ci0gICAgICAgICBjaHVua3BvcyArPSAocG5nX3VpbnRfMzIpLypTQUZFKi9jYjsKLSAgICAgICAgIHBiICs9IGNiOwotICAgICAgICAgd3JpdGVwb3MgKz0gY2I7Ci0gICAgICAgICBzdCAtPSBjYjsKLQotICAgICAgICAgaWYgKGNodW5rcG9zID49IGNodW5rbGVuKSAvKiBtdXN0IGJlIGVxdWFsICovCi0gICAgICAgICAgICBjaHVua3BvcyA9IGNodW5rdHlwZSA9IGNodW5rbGVuID0gMDsKLSAgICAgIH0KLSAgIH0gLyogd2hpbGUgKHN0ID4gMCkgKi8KLQotICAgcHMtPndyaXRlcG9zID0gd3JpdGVwb3M7Ci0gICBwcy0+Y2h1bmtwb3MgPSBjaHVua3BvczsKLSAgIHBzLT5jaHVua3R5cGUgPSBjaHVua3R5cGU7Ci0gICBwcy0+Y2h1bmtsZW4gPSBjaHVua2xlbjsKLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLXN0b3JlX2ZsdXNoKHBuZ19zdHJ1Y3RwIHBwSW4pCi17Ci0gICBVTlVTRUQocHBJbikgLypET0VTIE5PVEhJTkcqLwotfQotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi1zdGF0aWMgc2l6ZV90Ci1zdG9yZV9yZWFkX2J1ZmZlcl9zaXplKHBuZ19zdG9yZSAqcHMpCi17Ci0gICAvKiBSZXR1cm4gdGhlIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZCBpbiB0aGUgY3VycmVudCBidWZmZXIuICovCi0gICBpZiAocHMtPm5leHQgIT0gJnBzLT5jdXJyZW50LT5kYXRhKQotICAgICAgcmV0dXJuIFNUT1JFX0JVRkZFUl9TSVpFOwotCi0gICByZXR1cm4gcHMtPmN1cnJlbnQtPmRhdGFjb3VudDsKLX0KLQotLyogUmV0dXJuIHRvdGFsIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZC4gKi8KLXN0YXRpYyBzaXplX3QKLXN0b3JlX3JlYWRfYnVmZmVyX2F2YWlsKHBuZ19zdG9yZSAqcHMpCi17Ci0gICBpZiAocHMtPmN1cnJlbnQgIT0gTlVMTCAmJiBwcy0+bmV4dCAhPSBOVUxMKQotICAgewotICAgICAgcG5nX3N0b3JlX2J1ZmZlciAqbmV4dCA9ICZwcy0+Y3VycmVudC0+ZGF0YTsKLSAgICAgIHNpemVfdCBjYkF2YWlsID0gcHMtPmN1cnJlbnQtPmRhdGFjb3VudDsKLQotICAgICAgd2hpbGUgKG5leHQgIT0gcHMtPm5leHQgJiYgbmV4dCAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgbmV4dCA9IG5leHQtPnByZXY7Ci0gICAgICAgICBjYkF2YWlsICs9IFNUT1JFX0JVRkZFUl9TSVpFOwotICAgICAgfQotCi0gICAgICBpZiAobmV4dCAhPSBwcy0+bmV4dCkKLSAgICAgICAgIHBuZ19lcnJvcihwcy0+cHJlYWQsICJidWZmZXIgcmVhZCBlcnJvciIpOwotCi0gICAgICBpZiAoY2JBdmFpbCA+IHBzLT5yZWFkcG9zKQotICAgICAgICAgcmV0dXJuIGNiQXZhaWwgLSBwcy0+cmVhZHBvczsKLSAgIH0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXN0b3JlX3JlYWRfYnVmZmVyX25leHQocG5nX3N0b3JlICpwcykKLXsKLSAgIHBuZ19zdG9yZV9idWZmZXIgKnBiT2xkID0gcHMtPm5leHQ7Ci0gICBwbmdfc3RvcmVfYnVmZmVyICpwYk5ldyA9ICZwcy0+Y3VycmVudC0+ZGF0YTsKLSAgIGlmIChwYk9sZCAhPSBwYk5ldykKLSAgIHsKLSAgICAgIHdoaWxlIChwYk5ldyAhPSBOVUxMICYmIHBiTmV3LT5wcmV2ICE9IHBiT2xkKQotICAgICAgICAgcGJOZXcgPSBwYk5ldy0+cHJldjsKLQotICAgICAgaWYgKHBiTmV3ICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBwcy0+bmV4dCA9IHBiTmV3OwotICAgICAgICAgcHMtPnJlYWRwb3MgPSAwOwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19lcnJvcihwcy0+cHJlYWQsICJidWZmZXIgbG9zdCIpOwotICAgfQotCi0gICByZXR1cm4gMDsgLyogRU9GIG9yIGVycm9yICovCi19Ci0KLS8qIE5lZWQgc2VwYXJhdGUgaW1wbGVtZW50YXRpb24gYW5kIGNhbGxiYWNrIHRvIGFsbG93IHVzZSBvZiB0aGUgc2FtZSBjb2RlCi0gKiBkdXJpbmcgcHJvZ3Jlc3NpdmUgcmVhZCwgd2hlcmUgdGhlIGlvX3B0ciBpcyBzZXQgaW50ZXJuYWxseSBieSBsaWJwbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1zdG9yZV9yZWFkX2ltcChwbmdfc3RvcmUgKnBzLCBwbmdfYnl0ZXAgcGIsIHBuZ19zaXplX3Qgc3QpCi17Ci0gICBpZiAocHMtPmN1cnJlbnQgPT0gTlVMTCB8fCBwcy0+bmV4dCA9PSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBzLT5wcmVhZCwgInN0b3JlIHN0YXRlIGRhbWFnZWQiKTsKLQotICAgd2hpbGUgKHN0ID4gMCkKLSAgIHsKLSAgICAgIHNpemVfdCBjYkF2YWlsID0gc3RvcmVfcmVhZF9idWZmZXJfc2l6ZShwcykgLSBwcy0+cmVhZHBvczsKLQotICAgICAgaWYgKGNiQXZhaWwgPiAwKQotICAgICAgewotICAgICAgICAgaWYgKGNiQXZhaWwgPiBzdCkgY2JBdmFpbCA9IHN0OwotICAgICAgICAgbWVtY3B5KHBiLCBwcy0+bmV4dC0+YnVmZmVyICsgcHMtPnJlYWRwb3MsIGNiQXZhaWwpOwotICAgICAgICAgc3QgLT0gY2JBdmFpbDsKLSAgICAgICAgIHBiICs9IGNiQXZhaWw7Ci0gICAgICAgICBwcy0+cmVhZHBvcyArPSBjYkF2YWlsOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmICghc3RvcmVfcmVhZF9idWZmZXJfbmV4dChwcykpCi0gICAgICAgICBwbmdfZXJyb3IocHMtPnByZWFkLCAicmVhZCBiZXlvbmQgZW5kIG9mIGZpbGUiKTsKLSAgIH0KLX0KLQotc3RhdGljIHBuZ19zaXplX3QKLXN0b3JlX3JlYWRfY2h1bmsocG5nX3N0b3JlICpwcywgcG5nX2J5dGVwIHBiLCBjb25zdCBwbmdfc2l6ZV90IG1heCwKLSAgICAgIGNvbnN0IHBuZ19zaXplX3QgbWluKQotewotICAgcG5nX3VpbnRfMzIgY2h1bmtsZW4gPSBwcy0+Y2h1bmtsZW47Ci0gICBwbmdfdWludF8zMiBjaHVua3R5cGUgPSBwcy0+Y2h1bmt0eXBlOwotICAgcG5nX3VpbnRfMzIgY2h1bmtwb3MgPSBwcy0+Y2h1bmtwb3M7Ci0gICBwbmdfc2l6ZV90IHN0ID0gbWF4OwotCi0gICBpZiAoc3QgPiAwKSBkbwotICAgewotICAgICAgaWYgKGNodW5rcG9zID49IGNodW5rbGVuKSAvKiBlbmQgb2YgbGFzdCBjaHVuayAqLwotICAgICAgewotICAgICAgICAgcG5nX2J5dGUgYnVmZmVyWzhdOwotCi0gICAgICAgICAvKiBSZWFkIHRoZSBoZWFkZXIgb2YgdGhlIG5leHQgY2h1bms6ICovCi0gICAgICAgICBzdG9yZV9yZWFkX2ltcChwcywgYnVmZmVyLCA4VSk7Ci0gICAgICAgICBjaHVua2xlbiA9IHBuZ19nZXRfdWludF8zMihidWZmZXIpICsgMTJVOwotICAgICAgICAgY2h1bmt0eXBlID0gcG5nX2dldF91aW50XzMyKGJ1ZmZlcis0VSk7Ci0gICAgICAgICBjaHVua3BvcyA9IDBVOyAvKiBQb3NpdGlvbiByZWFkIHNvIGZhciAqLwotICAgICAgfQotCi0gICAgICBpZiAoY2h1bmt0eXBlID09IENIVU5LX0lEQVQpCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8zMiBJREFUX3BvcyA9IHBzLT5JREFUX3BvczsKLSAgICAgICAgIHBuZ191aW50XzMyIElEQVRfbGVuID0gcHMtPklEQVRfbGVuOwotICAgICAgICAgcG5nX3VpbnRfMzIgSURBVF9zaXplID0gcHMtPklEQVRfc2l6ZTsKLQotICAgICAgICAgLyogVGhlIElEQVQgaGVhZGVycyBhcmUgY29uc3RydWN0ZWQgaGVyZTsgc2tpcCB0aGUgaW5wdXQgaGVhZGVyLiAqLwotICAgICAgICAgaWYgKGNodW5rcG9zIDwgOFUpCi0gICAgICAgICAgICBjaHVua3BvcyA9IDhVOwotCi0gICAgICAgICBpZiAoSURBVF9wb3MgPT0gSURBVF9sZW4pCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfYnl0ZSByYW5kb20gPSByYW5kb21fYnl0ZSgpOwotCi0gICAgICAgICAgICAvKiBNYWtlIGEgbmV3IElEQVQgY2h1bmssIGlmIElEQVRfbGVuIGlzIDAgdGhpcyBpcyB0aGUgZmlyc3QgSURBVCwKLSAgICAgICAgICAgICAqIGlmIElEQVRfc2l6ZSBpcyAwIHRoaXMgaXMgdGhlIGVuZC4gIEF0IHByZXNlbnQgdGhpcyBpcyBzZXQgdXAKLSAgICAgICAgICAgICAqIHVzaW5nIGEgcmFuZG9tIG51bWJlciBzbyB0aGF0IHRoZXJlIGlzIGEgMjUlIGNoYW5jZSBiZWZvcmUKLSAgICAgICAgICAgICAqIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgSURBVCBjaHVuayBiZWluZyAwIGxlbmd0aC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKElEQVRfbGVuID09IDBVKSAvKiBGaXJzdCBJREFUICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBzd2l0Y2ggKHJhbmRvbSAmIDNVKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2FzZSAwVTogSURBVF9sZW4gPSAxMlU7IGJyZWFrOyAvKiAwIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICBjYXNlIDFVOiBJREFUX2xlbiA9IDEzVTsgYnJlYWs7IC8qIDEgYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgZGVmYXVsdDogSURBVF9sZW4gPSByYW5kb21fdTMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBJREFUX2xlbiAlPSBJREFUX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBJREFUX2xlbiArPSAxM1U7IC8qIDEuLklEQVRfc2l6ZSBieXRlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKElEQVRfc2l6ZSA9PSAwVSkgLyogYWxsIElEQVQgZGF0YSByZWFkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBUaGUgbGFzdCAoSURBVCkgY2h1bmsgc2hvdWxkIGJlIHBvc2l0aW9uZWQgYXQgdGhlIENSQyBub3c6ICovCi0gICAgICAgICAgICAgICBpZiAoY2h1bmtwb3MgIT0gY2h1bmtsZW4tNFUpCi0gICAgICAgICAgICAgICAgICBwbmdfZXJyb3IocHMtPnByZWFkLCAiaW50ZXJuYWw6IElEQVQgc2l6ZSBtaXNtYXRjaCIpOwotCi0gICAgICAgICAgICAgICAvKiBUaGUgb25seSBvcHRpb24gaGVyZSBpcyB0byBhZGQgYSB6ZXJvIGxlbmd0aCBJREFULCB0aGlzCi0gICAgICAgICAgICAgICAgKiBoYXBwZW5zIDI1JSBvZiB0aGUgdGltZS4gIEJlY2F1c2Ugb2YgdGhlIGNoZWNrIGFib3ZlCi0gICAgICAgICAgICAgICAgKiBjaHVua2xlbi00VS1jaHVua3BvcyBtdXN0IGJlIHplcm8sIHdlIGp1c3QgbmVlZCB0byBza2lwIHRoZQotICAgICAgICAgICAgICAgICogQ1JDIG5vdy4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgaWYgKChyYW5kb20gJiAzVSkgPT0gMFUpCi0gICAgICAgICAgICAgICAgICBJREFUX2xlbiA9IDEyVTsgLyogT3V0cHV0IGFub3RoZXIgMCBsZW5ndGggSURBVCAqLwotCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgSURBVHMsIHNraXAgdGhlIENSQyB0byBtYWtlIHRoZSBjb2RlIGFib3ZlIGxvYWQgdGhlCi0gICAgICAgICAgICAgICAgICAgKiBuZXh0IGNodW5rIGhlYWRlciBuZXh0IHRpbWUgcm91bmQuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJ1ZmZlcls0XTsKLQotICAgICAgICAgICAgICAgICAgc3RvcmVfcmVhZF9pbXAocHMsIGJ1ZmZlciwgNFUpOwotICAgICAgICAgICAgICAgICAgY2h1bmtwb3MgKz0gNFU7Ci0gICAgICAgICAgICAgICAgICBwcy0+SURBVF9wb3MgPSBJREFUX3BvczsKLSAgICAgICAgICAgICAgICAgIHBzLT5JREFUX2xlbiA9IElEQVRfbGVuOwotICAgICAgICAgICAgICAgICAgcHMtPklEQVRfc2l6ZSA9IDBVOwotICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIFJlYWQgdGhlIG5leHQgY2h1bmsgKi8KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogTWlkZGxlIG9mIElEQVRzLCB1c2UgJ3JhbmRvbScgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0cwotICAgICAgICAgICAgICAgICogdG8gdXNlIGluIHRoZSBJREFUIGxlbmd0aC4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgSURBVF9sZW4gPSByYW5kb21fdTMyKCk7Ci0gICAgICAgICAgICAgICBJREFUX2xlbiAmPSAoMVUgPDwgKDFVICsgcmFuZG9tICUgcHMtPklEQVRfYml0cykpIC0gMVU7Ci0gICAgICAgICAgICAgICBpZiAoSURBVF9sZW4gPiBJREFUX3NpemUpCi0gICAgICAgICAgICAgICAgICBJREFUX2xlbiA9IElEQVRfc2l6ZTsKLSAgICAgICAgICAgICAgIElEQVRfbGVuICs9IDEyVTsgLyogemVybyBieXRlcyBtYXkgb2NjdXIgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSURBVF9wb3MgPSAwVTsKLSAgICAgICAgICAgIHBzLT5JREFUX2NyYyA9IDB4MzVhZjA2MWU7IC8qIEllOiBjcmMzMigwVUwsICJJREFUIiwgNCkgKi8KLSAgICAgICAgIH0gLyogSURBVF9wb3MgPT0gSURBVF9sZW4gKi8KLQotICAgICAgICAgaWYgKElEQVRfcG9zIDwgOFUpIC8qIFJldHVybiB0aGUgaGVhZGVyICovIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBiOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IHNoaWZ0OwotCi0gICAgICAgICAgICBpZiAoSURBVF9wb3MgPCA0VSkKLSAgICAgICAgICAgICAgIGIgPSBJREFUX2xlbiAtIDEyVTsKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgYiA9IENIVU5LX0lEQVQ7Ci0KLSAgICAgICAgICAgIHNoaWZ0ID0gM1UgJiBJREFUX3BvczsKLSAgICAgICAgICAgICsrSURBVF9wb3M7Ci0KLSAgICAgICAgICAgIGlmIChzaGlmdCA8IDNVKQotICAgICAgICAgICAgICAgYiA+Pj0gOFUqKDNVLXNoaWZ0KTsKLQotICAgICAgICAgICAgKnBiKysgPSAweGZmVSAmIGI7Ci0gICAgICAgICB9Ci0gICAgICAgICB3aGlsZSAoLS1zdCA+IDAgJiYgSURBVF9wb3MgPCA4KTsKLQotICAgICAgICAgZWxzZSBpZiAoSURBVF9wb3MgPCBJREFUX2xlbiAtIDRVKSAvKiBJLmUgbm90IHRoZSBDUkMgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaHVua3BvcyA8IGNodW5rbGVuLTRVKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgdUludCBhdmFpbCA9ICh1SW50KS0xOwotCi0gICAgICAgICAgICAgICBpZiAoYXZhaWwgPiAoSURBVF9sZW4tNFUpIC0gSURBVF9wb3MpCi0gICAgICAgICAgICAgICAgICBhdmFpbCA9ICh1SW50KS8qU0FGRSovKChJREFUX2xlbi00VSkgLSBJREFUX3Bvcyk7Ci0KLSAgICAgICAgICAgICAgIGlmIChhdmFpbCA+IHN0KQotICAgICAgICAgICAgICAgICAgYXZhaWwgPSAodUludCkvKlNBRkUqL3N0OwotCi0gICAgICAgICAgICAgICBpZiAoYXZhaWwgPiAoY2h1bmtsZW4tNFUpIC0gY2h1bmtwb3MpCi0gICAgICAgICAgICAgICAgICBhdmFpbCA9ICh1SW50KS8qU0FGRSovKChjaHVua2xlbi00VSkgLSBjaHVua3Bvcyk7Ci0KLSAgICAgICAgICAgICAgIHN0b3JlX3JlYWRfaW1wKHBzLCBwYiwgYXZhaWwpOwotICAgICAgICAgICAgICAgcHMtPklEQVRfY3JjID0gY3JjMzIocHMtPklEQVRfY3JjLCBwYiwgYXZhaWwpOwotICAgICAgICAgICAgICAgcGIgKz0gKHBuZ19zaXplX3QpLypTQUZFKi9hdmFpbDsKLSAgICAgICAgICAgICAgIHN0IC09IChwbmdfc2l6ZV90KS8qU0FGRSovYXZhaWw7Ci0gICAgICAgICAgICAgICBjaHVua3BvcyArPSAocG5nX3VpbnRfMzIpLypTQUZFKi9hdmFpbDsKLSAgICAgICAgICAgICAgIElEQVRfc2l6ZSAtPSAocG5nX3VpbnRfMzIpLypTQUZFKi9hdmFpbDsKLSAgICAgICAgICAgICAgIElEQVRfcG9zICs9IChwbmdfdWludF8zMikvKlNBRkUqL2F2YWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIC8qIHNraXAgdGhlIGlucHV0IENSQyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgYnVmZmVyWzRdOwotCi0gICAgICAgICAgICAgICBzdG9yZV9yZWFkX2ltcChwcywgYnVmZmVyLCA0VSk7Ci0gICAgICAgICAgICAgICBjaHVua3BvcyArPSA0VTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZSAvKiBJREFUIGNyYyAqLyBkbwotICAgICAgICAgewotICAgICAgICAgICAgdUxvbmcgYiA9IHBzLT5JREFUX2NyYzsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IChJREFUX2xlbiAtIElEQVRfcG9zKTsgLyogNC4uMSAqLwotICAgICAgICAgICAgKytJREFUX3BvczsKLQotICAgICAgICAgICAgaWYgKHNoaWZ0ID4gMVUpCi0gICAgICAgICAgICAgICBiID4+PSA4VSooc2hpZnQtMVUpOwotCi0gICAgICAgICAgICAqcGIrKyA9IDB4ZmZVICYgYjsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlICgtLXN0ID4gMCAmJiBJREFUX3BvcyA8IElEQVRfbGVuKTsKLQotICAgICAgICAgcHMtPklEQVRfcG9zID0gSURBVF9wb3M7Ci0gICAgICAgICBwcy0+SURBVF9sZW4gPSBJREFUX2xlbjsKLSAgICAgICAgIHBzLT5JREFUX3NpemUgPSBJREFUX3NpemU7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgLyogIUlEQVQgKi8KLSAgICAgIHsKLSAgICAgICAgIC8qIElmIHRoZXJlIGlzIHN0aWxsIHNvbWUgcGVuZGluZyBJREFUIGRhdGEgYWZ0ZXIgdGhlIElEQVQgY2h1bmtzIGhhdmUKLSAgICAgICAgICAqIGJlZW4gcHJvY2Vzc2VkIHRoZXJlIGlzIGEgcHJvYmxlbToKLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKHBzLT5JREFUX2xlbiA+IDAgJiYgcHMtPklEQVRfc2l6ZSA+IDApCi0gICAgICAgICAgICBwbmdfZXJyb3IocHMtPnByZWFkLCAiaW50ZXJuYWw6IG1pc3NpbmcgSURBVCBkYXRhIik7Ci0KLSAgICAgICAgIGlmIChjaHVua3R5cGUgPT0gQ0hVTktfSUVORCAmJiBwcy0+SURBVF9sZW4gPT0gMFUpCi0gICAgICAgICAgICBwbmdfZXJyb3IocHMtPnByZWFkLCAiaW50ZXJuYWw6IG1pc3NpbmcgSURBVCIpOwotCi0gICAgICAgICBpZiAoY2h1bmtwb3MgPCA4VSkgLyogUmV0dXJuIHRoZSBoZWFkZXIgKi8gZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIGI7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7Ci0KLSAgICAgICAgICAgIGlmIChjaHVua3BvcyA8IDRVKQotICAgICAgICAgICAgICAgYiA9IGNodW5rbGVuIC0gMTJVOwotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBiID0gY2h1bmt0eXBlOwotCi0gICAgICAgICAgICBzaGlmdCA9IDNVICYgY2h1bmtwb3M7Ci0gICAgICAgICAgICArK2NodW5rcG9zOwotCi0gICAgICAgICAgICBpZiAoc2hpZnQgPCAzVSkKLSAgICAgICAgICAgICAgIGIgPj49IDhVKigzVS1zaGlmdCk7Ci0KLSAgICAgICAgICAgICpwYisrID0gMHhmZlUgJiBiOwotICAgICAgICAgfQotICAgICAgICAgd2hpbGUgKC0tc3QgPiAwICYmIGNodW5rcG9zIDwgOCk7Ci0KLSAgICAgICAgIGVsc2UgLyogUmV0dXJuIGNodW5rIGJ5dGVzLCBpbmNsdWRpbmcgdGhlIENSQyAqLwotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3NpemVfdCBhdmFpbCA9IHN0OwotCi0gICAgICAgICAgICBpZiAoYXZhaWwgPiBjaHVua2xlbiAtIGNodW5rcG9zKQotICAgICAgICAgICAgICAgYXZhaWwgPSAocG5nX3NpemVfdCkvKlNBRkUqLyhjaHVua2xlbiAtIGNodW5rcG9zKTsKLQotICAgICAgICAgICAgc3RvcmVfcmVhZF9pbXAocHMsIHBiLCBhdmFpbCk7Ci0gICAgICAgICAgICBwYiArPSBhdmFpbDsKLSAgICAgICAgICAgIHN0IC09IGF2YWlsOwotICAgICAgICAgICAgY2h1bmtwb3MgKz0gKHBuZ191aW50XzMyKS8qU0FGRSovYXZhaWw7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIGZvciBlbmQgb2YgY2h1bmsgYW5kIGVuZC1vZi1maWxlOyBkb24ndCB0cnkgdG8gcmVhZCBhIG5ldwotICAgICAgICAgICAgICogY2h1bmsgaGVhZGVyIGF0IHRoaXMgcG9pbnQgdW5sZXNzIGluc3RydWN0ZWQgdG8gZG8gc28gYnkgJ21pbicuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChjaHVua3BvcyA+PSBjaHVua2xlbiAmJiBtYXgtc3QgPj0gbWluICYmCi0gICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWFkX2J1ZmZlcl9hdmFpbChwcykgPT0gMCkKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfSAvKiAhSURBVCAqLwotICAgfQotICAgd2hpbGUgKHN0ID4gMCk7Ci0KLSAgIHBzLT5jaHVua2xlbiA9IGNodW5rbGVuOwotICAgcHMtPmNodW5rdHlwZSA9IGNodW5rdHlwZTsKLSAgIHBzLT5jaHVua3BvcyA9IGNodW5rcG9zOwotCi0gICByZXR1cm4gc3Q7IC8qIHNwYWNlIGxlZnQgKi8KLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLXN0b3JlX3JlYWQocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2J5dGVwIHBiLCBwbmdfc2l6ZV90IHN0KQotewotICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOwotICAgcG5nX3N0b3JlICpwcyA9IHZvaWRjYXN0KHBuZ19zdG9yZSosIHBuZ19nZXRfaW9fcHRyKHBwKSk7Ci0KLSAgIGlmIChwcyA9PSBOVUxMIHx8IHBzLT5wcmVhZCAhPSBwcCkKLSAgICAgIHBuZ19lcnJvcihwcCwgImJhZCBzdG9yZSByZWFkIGNhbGwiKTsKLQotICAgc3RvcmVfcmVhZF9jaHVuayhwcywgcGIsIHN0LCBzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdG9yZV9wcm9ncmVzc2l2ZV9yZWFkKHBuZ19zdG9yZSAqcHMsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBpZiAocHMtPnByZWFkICE9IHBwIHx8IHBzLT5jdXJyZW50ID09IE5VTEwgfHwgcHMtPm5leHQgPT0gTlVMTCkKLSAgICAgIHBuZ19lcnJvcihwcCwgInN0b3JlIHN0YXRlIGRhbWFnZWQgKHByb2dyZXNzaXZlKSIpOwotCi0gICAvKiBUaGlzIGlzIGFub3RoZXIgSG9yb3dpdHogYW5kIEhpbGwgcmFuZG9tIG5vaXNlIGdlbmVyYXRvci4gIEluIHRoaXMgY2FzZQotICAgICogdGhlIGFpbSBpcyB0byBzdHJlc3MgdGhlIHByb2dyZXNzaXZlIHJlYWRlciB3aXRoIHRydWx5IGhvcnJpYmxlIHZhcmlhYmxlCi0gICAgKiBidWZmZXIgc2l6ZXMgaW4gdGhlIHJhbmdlIDEuLjUwMCwgc28gYSBzZXF1ZW5jZSBvZiA5IGJpdCByYW5kb20gbnVtYmVycwotICAgICogaXMgZ2VuZXJhdGVkLiAgV2UgY291bGQgcHJvYmFibHkganVzdCBjb3VudCBmcm9tIDEgdG8gMzI3NjcgYW5kIGdldCBhcwotICAgICogZ29vZCBhIHJlc3VsdC4KLSAgICAqLwotICAgd2hpbGUgKHN0b3JlX3JlYWRfYnVmZmVyX2F2YWlsKHBzKSA+IDApCi0gICB7Ci0gICAgICBzdGF0aWMgcG5nX3VpbnRfMzIgbm9pc2UgPSAyOwotICAgICAgcG5nX3NpemVfdCBjYjsKLSAgICAgIHBuZ19ieXRlIGJ1ZmZlcls1MTJdOwotCi0gICAgICAvKiBHZW5lcmF0ZSAxNSBtb3JlIGJpdHMgb2Ygc3R1ZmY6ICovCi0gICAgICBub2lzZSA9IChub2lzZSA8PCA5KSB8ICgobm9pc2UgXiAobm9pc2UgPj4gKDktNSkpKSAmIDB4MWZmKTsKLSAgICAgIGNiID0gbm9pc2UgJiAweDFmZjsKLSAgICAgIGNiIC09IHN0b3JlX3JlYWRfY2h1bmsocHMsIGJ1ZmZlciwgY2IsIDEpOwotICAgICAgcG5nX3Byb2Nlc3NfZGF0YShwcCwgcGksIGJ1ZmZlciwgY2IpOwotICAgfQotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0vKiBUaGUgY2FsbGVyIG11c3QgZmlsbCB0aGlzIGluOiAqLwotc3RhdGljIHN0b3JlX3BhbGV0dGVfZW50cnkgKgotc3RvcmVfd3JpdGVfcGFsZXR0ZShwbmdfc3RvcmUgKnBzLCBpbnQgbnBhbGV0dGUpCi17Ci0gICBpZiAocHMtPnB3cml0ZSA9PSBOVUxMKQotICAgICAgc3RvcmVfbG9nKHBzLCBOVUxMLCAiYXR0ZW1wdCB0byB3cml0ZSBwYWxldHRlIHdpdGhvdXQgd3JpdGUgc3RyZWFtIiwgMSk7Ci0KLSAgIGlmIChwcy0+cGFsZXR0ZSAhPSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBzLT5wd3JpdGUsICJtdWx0aXBsZSBzdG9yZV93cml0ZV9wYWxldHRlIGNhbGxzIik7Ci0KLSAgIC8qIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgcmV0dXJuIE5VTEwgaWYgY2FsbGVkIHdpdGggJzAnISAqLwotICAgaWYgKG5wYWxldHRlID4gMCkKLSAgIHsKLSAgICAgIHBzLT5wYWxldHRlID0gdm9pZGNhc3Qoc3RvcmVfcGFsZXR0ZV9lbnRyeSosIG1hbGxvYyhucGFsZXR0ZSAqCi0gICAgICAgICBzaXplb2YgKnBzLT5wYWxldHRlKSk7Ci0KLSAgICAgIGlmIChwcy0+cGFsZXR0ZSA9PSBOVUxMKQotICAgICAgICAgcG5nX2Vycm9yKHBzLT5wd3JpdGUsICJzdG9yZSBuZXcgcGFsZXR0ZTogT09NIik7Ci0KLSAgICAgIHBzLT5ucGFsZXR0ZSA9IG5wYWxldHRlOwotICAgfQotCi0gICByZXR1cm4gcHMtPnBhbGV0dGU7Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLXN0YXRpYyBzdG9yZV9wYWxldHRlX2VudHJ5ICoKLXN0b3JlX2N1cnJlbnRfcGFsZXR0ZShwbmdfc3RvcmUgKnBzLCBpbnQgKm5wYWxldHRlKQotewotICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciAodGhlIGNhbGwgaGFzIGJlZW4gbWFkZSBvdXRzaWRlIGEgcmVhZAotICAgICogb3BlcmF0aW9uLikKLSAgICAqLwotICAgaWYgKHBzLT5jdXJyZW50ID09IE5VTEwpCi0gICB7Ci0gICAgICBzdG9yZV9sb2cocHMsIHBzLT5wcmVhZCwgIm5vIGN1cnJlbnQgc3RyZWFtIGZvciBwYWxldHRlIiwgMSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLQotICAgLyogVGhlIHJlc3VsdCBtYXkgYmUgbnVsbCBpZiB0aGVyZSBpcyBubyBwYWxldHRlLiAqLwotICAgKm5wYWxldHRlID0gcHMtPmN1cnJlbnQtPm5wYWxldHRlOwotICAgcmV0dXJuIHBzLT5jdXJyZW50LT5wYWxldHRlOwotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTUVNT1JZIE1BTkFHRU1FTlQqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLS8qIEEgc3RvcmVfbWVtb3J5IGlzIHNpbXBseSB0aGUgaGVhZGVyIGZvciBhbiBhbGxvY2F0ZWQgYmxvY2sgb2YgbWVtb3J5LiAgVGhlCi0gKiBwb2ludGVyIHJldHVybmVkIHRvIGxpYnBuZyBpcyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhlIGhlYWRlciBibG9jaywgdGhlCi0gKiBhbGxvY2F0ZWQgbWVtb3J5IGlzIGZvbGxvd2VkIGJ5IGEgc2Vjb25kIGNvcHkgb2YgdGhlICdtYXJrJy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfbWVtb3J5Ci17Ci0gICBzdG9yZV9wb29sICAgICAgICAgICpwb29sOyAgICAvKiBPcmlnaW5hdGluZyBwb29sICovCi0gICBzdHJ1Y3Qgc3RvcmVfbWVtb3J5ICpuZXh0OyAgICAvKiBTaW5nbHkgbGlua2VkIGxpc3QgKi8KLSAgIHBuZ19hbGxvY19zaXplX3QgICAgIHNpemU7ICAgIC8qIFNpemUgb2YgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgcG5nX2J5dGUgICAgICAgICAgICAgbWFya1s0XTsgLyogSUQgbWFya2VyICovCi19IHN0b3JlX21lbW9yeTsKLQotLyogSGFuZGxlIGEgZmF0YWwgZXJyb3IgaW4gbWVtb3J5IGFsbG9jYXRpb24uICBUaGlzIGNhbGxzIHBuZ19lcnJvciBpZiB0aGUKLSAqIGxpYnBuZyBzdHJ1Y3QgaXMgbm9uLU5VTEwsIGVsc2UgaXQgb3V0cHV0cyBhIG1lc3NhZ2UgYW5kIHJldHVybnMuICBUaGlzIG1lYW5zCi0gKiB0aGF0IGEgbWVtb3J5IHByb2JsZW0gd2hpbGUgbGlicG5nIGlzIHJ1bm5pbmcgd2lsbCBhYm9ydCAocG5nX2Vycm9yKSB0aGUKLSAqIGhhbmRsaW5nIG9mIHBhcnRpY3VsYXIgZmlsZSB3aGlsZSBvbmUgaW4gY2xlYW51cCAoYWZ0ZXIgdGhlIGRlc3Ryb3kgb2YgdGhlCi0gKiBzdHJ1Y3QgaGFzIHJldHVybmVkKSB3aWxsIHNpbXBseSBrZWVwIGdvaW5nIGFuZCBmcmVlIChvciBhdHRlbXB0IHRvIGZyZWUpCi0gKiBhbGwgdGhlIG1lbW9yeS4KLSAqLwotc3RhdGljIHZvaWQKLXN0b3JlX3Bvb2xfZXJyb3IocG5nX3N0b3JlICpwcywgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgIGlmIChwcCAhPSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBwLCBtc2cpOwotCi0gICAvKiBFbHNlIHdlIGhhdmUgdG8gZG8gaXQgb3Vyc2VsdmVzLiAgcG5nX2Vycm9yIGV2ZW50dWFsbHkgY2FsbHMgc3RvcmVfbG9nLAotICAgICogYWJvdmUuICBzdG9yZV9sb2cgYWNjZXB0cyBhIE5VTEwgcG5nX3N0cnVjdHAgLSBpdCBqdXN0IGNoYW5nZXMgd2hhdCBnZXRzCi0gICAgKiBvdXRwdXQgYnkgc3RvcmVfbWVzc2FnZS4KLSAgICAqLwotICAgc3RvcmVfbG9nKHBzLCBwcCwgbXNnLCAxIC8qIGVycm9yICovKTsKLX0KLQotc3RhdGljIHZvaWQKLXN0b3JlX21lbW9yeV9mcmVlKHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBzdG9yZV9wb29sICpwb29sLCBzdG9yZV9tZW1vcnkgKm1lbW9yeSkKLXsKLSAgIC8qIE5vdGUgdGhhdCBwcCBtYXkgYmUgTlVMTCAoc2VlIHN0b3JlX3Bvb2xfZGVsZXRlIGJlbG93KSwgdGhlIGNhbGxlciBoYXMKLSAgICAqIGZvdW5kICdtZW1vcnknIGluIHBvb2wtPmxpc3QgKmFuZCogdW5saW5rZWQgdGhpcyBlbnRyeSwgc28gdGhpcyBpcyBhIHZhbGlkCi0gICAgKiBwb2ludGVyIChmb3Igc3VyZSksIGJ1dCB0aGUgY29udGVudHMgbWF5IGhhdmUgYmVlbiB0cmFzaGVkLgotICAgICovCi0gICBpZiAobWVtb3J5LT5wb29sICE9IHBvb2wpCi0gICAgICBzdG9yZV9wb29sX2Vycm9yKHBvb2wtPnN0b3JlLCBwcCwgIm1lbW9yeSBjb3JydXB0ZWQgKHBvb2wpIik7Ci0KLSAgIGVsc2UgaWYgKG1lbWNtcChtZW1vcnktPm1hcmssIHBvb2wtPm1hcmssIHNpemVvZiBtZW1vcnktPm1hcmspICE9IDApCi0gICAgICBzdG9yZV9wb29sX2Vycm9yKHBvb2wtPnN0b3JlLCBwcCwgIm1lbW9yeSBjb3JydXB0ZWQgKHN0YXJ0KSIpOwotCi0gICAvKiBJdCBzaG91bGQgYmUgc2FmZSB0byByZWFkIHRoZSBzaXplIGZpZWxkIG5vdy4gKi8KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHBuZ19hbGxvY19zaXplX3QgY2IgPSBtZW1vcnktPnNpemU7Ci0KLSAgICAgIGlmIChjYiA+IHBvb2wtPm1heCkKLSAgICAgICAgIHN0b3JlX3Bvb2xfZXJyb3IocG9vbC0+c3RvcmUsIHBwLCAibWVtb3J5IGNvcnJ1cHRlZCAoc2l6ZSkiKTsKLQotICAgICAgZWxzZSBpZiAobWVtY21wKChwbmdfYnl0ZXApKG1lbW9yeSsxKStjYiwgcG9vbC0+bWFyaywgc2l6ZW9mIHBvb2wtPm1hcmspCi0gICAgICAgICAhPSAwKQotICAgICAgICAgc3RvcmVfcG9vbF9lcnJvcihwb29sLT5zdG9yZSwgcHAsICJtZW1vcnkgY29ycnVwdGVkIChlbmQpIik7Ci0KLSAgICAgIC8qIEZpbmFsbHkgZ2l2ZSB0aGUgbGlicmFyeSBhIGNoYW5jZSB0byBmaW5kIHByb2JsZW1zIHRvbzogKi8KLSAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgIHBvb2wtPmN1cnJlbnQgLT0gY2I7Ci0gICAgICAgICBmcmVlKG1lbW9yeSk7Ci0gICAgICAgICB9Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdG9yZV9wb29sX2RlbGV0ZShwbmdfc3RvcmUgKnBzLCBzdG9yZV9wb29sICpwb29sKQotewotICAgaWYgKHBvb2wtPmxpc3QgIT0gTlVMTCkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzICVzOiBtZW1vcnkgbG9zdCAobGlzdCBmb2xsb3dzKTpcbiIsIHBzLT50ZXN0LAotICAgICAgICAgcG9vbCA9PSAmcHMtPnJlYWRfbWVtb3J5X3Bvb2wgPyAicmVhZCIgOiAid3JpdGUiLAotICAgICAgICAgcG9vbCA9PSAmcHMtPnJlYWRfbWVtb3J5X3Bvb2wgPyAocHMtPmN1cnJlbnQgIT0gTlVMTCA/Ci0gICAgICAgICAgICBwcy0+Y3VycmVudC0+bmFtZSA6ICJ1bmtub3duIGZpbGUiKSA6IHBzLT53bmFtZSk7Ci0gICAgICArK3BzLT5uZXJyb3JzOwotCi0gICAgICBkbwotICAgICAgewotICAgICAgICAgc3RvcmVfbWVtb3J5ICpuZXh0ID0gcG9vbC0+bGlzdDsKLSAgICAgICAgIHBvb2wtPmxpc3QgPSBuZXh0LT5uZXh0OwotICAgICAgICAgbmV4dC0+bmV4dCA9IE5VTEw7Ci0KLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQlbHUgYnl0ZXMgQCAlcFxuIiwKLSAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyluZXh0LT5zaXplLCAoY29uc3Qgdm9pZCopKG5leHQrMSkpOwotICAgICAgICAgLyogVGhlIE5VTEwgbWVhbnMgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4sIGV2ZW4gaWYgdGhlIG1lbW9yeSBpcwotICAgICAgICAgICogY29ycnVwdGVkLgotICAgICAgICAgICovCi0gICAgICAgICBzdG9yZV9tZW1vcnlfZnJlZShOVUxMLCBwb29sLCBuZXh0KTsKLSAgICAgIH0KLSAgICAgIHdoaWxlIChwb29sLT5saXN0ICE9IE5VTEwpOwotICAgfQotCi0gICAvKiBBbmQgcmVzZXQgdGhlIG90aGVyIGZpZWxkcyB0b28gZm9yIHRoZSBuZXh0IHRpbWUuICovCi0gICBpZiAocG9vbC0+bWF4ID4gcG9vbC0+bWF4X21heCkgcG9vbC0+bWF4X21heCA9IHBvb2wtPm1heDsKLSAgIHBvb2wtPm1heCA9IDA7Ci0gICBpZiAocG9vbC0+Y3VycmVudCAhPSAwKSAvKiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yICovCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyAlczogbWVtb3J5IGNvdW50ZXIgbWlzbWF0Y2ggKGludGVybmFsIGVycm9yKVxuIiwKLSAgICAgICAgIHBzLT50ZXN0LCBwb29sID09ICZwcy0+cmVhZF9tZW1vcnlfcG9vbCA/ICJyZWFkIiA6ICJ3cml0ZSIsCi0gICAgICAgICBwb29sID09ICZwcy0+cmVhZF9tZW1vcnlfcG9vbCA/IChwcy0+Y3VycmVudCAhPSBOVUxMID8KLSAgICAgICAgICAgIHBzLT5jdXJyZW50LT5uYW1lIDogInVua25vd24gZmlsZSIpIDogcHMtPnduYW1lKTsKLSAgIHBvb2wtPmN1cnJlbnQgPSAwOwotCi0gICBpZiAocG9vbC0+bGltaXQgPiBwb29sLT5tYXhfbGltaXQpCi0gICAgICBwb29sLT5tYXhfbGltaXQgPSBwb29sLT5saW1pdDsKLQotICAgcG9vbC0+bGltaXQgPSAwOwotCi0gICBpZiAocG9vbC0+dG90YWwgPiBwb29sLT5tYXhfdG90YWwpCi0gICAgICBwb29sLT5tYXhfdG90YWwgPSBwb29sLT50b3RhbDsKLQotICAgcG9vbC0+dG90YWwgPSAwOwotCi0gICAvKiBHZXQgYSBuZXcgbWFyayB0b28uICovCi0gICBzdG9yZV9wb29sX21hcmsocG9vbC0+bWFyayk7Ci19Ci0KLS8qIFRoZSBtZW1vcnkgY2FsbGJhY2tzOiAqLwotc3RhdGljIHBuZ192b2lkcCBQTkdDQkFQSQotc3RvcmVfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBwSW4sIHBuZ19hbGxvY19zaXplX3QgY2IpCi17Ci0gICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47Ci0gICBzdG9yZV9wb29sICpwb29sID0gdm9pZGNhc3Qoc3RvcmVfcG9vbCosIHBuZ19nZXRfbWVtX3B0cihwcCkpOwotICAgc3RvcmVfbWVtb3J5ICpuZXcgPSB2b2lkY2FzdChzdG9yZV9tZW1vcnkqLCBtYWxsb2MoY2IgKyAoc2l6ZW9mICpuZXcpICsKLSAgICAgIChzaXplb2YgcG9vbC0+bWFyaykpKTsKLQotICAgaWYgKG5ldyAhPSBOVUxMKQotICAgewotICAgICAgaWYgKGNiID4gcG9vbC0+bWF4KQotICAgICAgICAgcG9vbC0+bWF4ID0gY2I7Ci0KLSAgICAgIHBvb2wtPmN1cnJlbnQgKz0gY2I7Ci0KLSAgICAgIGlmIChwb29sLT5jdXJyZW50ID4gcG9vbC0+bGltaXQpCi0gICAgICAgICBwb29sLT5saW1pdCA9IHBvb2wtPmN1cnJlbnQ7Ci0KLSAgICAgIHBvb2wtPnRvdGFsICs9IGNiOwotCi0gICAgICBuZXctPnNpemUgPSBjYjsKLSAgICAgIG1lbWNweShuZXctPm1hcmssIHBvb2wtPm1hcmssIHNpemVvZiBuZXctPm1hcmspOwotICAgICAgbWVtY3B5KChwbmdfYnl0ZSopKG5ldysxKSArIGNiLCBwb29sLT5tYXJrLCBzaXplb2YgcG9vbC0+bWFyayk7Ci0gICAgICBuZXctPnBvb2wgPSBwb29sOwotICAgICAgbmV3LT5uZXh0ID0gcG9vbC0+bGlzdDsKLSAgICAgIHBvb2wtPmxpc3QgPSBuZXc7Ci0gICAgICArK25ldzsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgLyogTk9URTogdGhlIFBORyB1c2VyIG1hbGxvYyBmdW5jdGlvbiBjYW5ub3QgdXNlIHRoZSBwbmdfcHRyIGl0IGlzIHBhc3NlZAotICAgICAgICogb3RoZXIgdGhhbiB0byByZXRyaWV2ZSB0aGUgYWxsb2NhdGlvbiBwb2ludGVyISAgbGlicG5nIGNhbGxzIHRoZQotICAgICAgICogc3RvcmVfbWFsbG9jIGNhbGxiYWNrIGluIHR3byBiYXNpYyBjYXNlczoKLSAgICAgICAqCi0gICAgICAgKiAxKSBGcm9tIHBuZ19tYWxsb2M7IHBuZ19tYWxsb2Mgd2lsbCBkbyBhIHBuZ19lcnJvciBpdHNlbGYgaWYgTlVMTCBpcwotICAgICAgICogICAgcmV0dXJuZWQuCi0gICAgICAgKiAyKSBGcm9tIHBuZ19zdHJ1Y3Qgb3IgcG5nX2luZm8gc3RydWN0dXJlIGNyZWF0aW9uOyBwbmdfbWFsbG9jIGlzCi0gICAgICAgKiAgICB0byByZXR1cm4gc28gY2xlYW51cCBjYW4gYmUgcGVyZm9ybWVkLgotICAgICAgICoKLSAgICAgICAqIFRvIGhhbmRsZSB0aGlzIHN0b3JlX21hbGxvYyBjYW4gbG9nIGEgbWVzc2FnZSwgYnV0IGNhbid0IGRvIGFueXRoaW5nCi0gICAgICAgKiBlbHNlLgotICAgICAgICovCi0gICAgICBzdG9yZV9sb2cocG9vbC0+c3RvcmUsIHBwLCAib3V0IG9mIG1lbW9yeSIsIDEgLyogaXNfZXJyb3IgKi8pOwotICAgfQotCi0gICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotc3RvcmVfZnJlZShwbmdfc3RydWN0cCBwcEluLCBwbmdfdm9pZHAgbWVtb3J5KQotewotICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOwotICAgc3RvcmVfcG9vbCAqcG9vbCA9IHZvaWRjYXN0KHN0b3JlX3Bvb2wqLCBwbmdfZ2V0X21lbV9wdHIocHApKTsKLSAgIHN0b3JlX21lbW9yeSAqdGhpcyA9IHZvaWRjYXN0KHN0b3JlX21lbW9yeSosIG1lbW9yeSksICoqdGVzdDsKLQotICAgLyogQmVjYXVzZSBsaWJwbmcgY2FsbHMgc3RvcmVfZnJlZSB3aXRoIGEgZHVtbXkgcG5nX3N0cnVjdCB3aGVuIGRlbGV0aW5nCi0gICAgKiBwbmdfc3RydWN0IG9yIHBuZ19pbmZvIHZpYSBwbmdfZGVzdHJveV9zdHJ1Y3RfMiBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sKLSAgICAqIHRoZSBwYXNzZWQgaW4gcG5nX3N0cnVjdHAgdG8gZW5zdXJlIGl0IGlzIHZhbGlkLCBhbmQgbm90IHBhc3MgaXQgdG8KLSAgICAqIHBuZ19lcnJvciBpZiBpdCBpcyBub3QuCi0gICAgKi8KLSAgIGlmIChwcCAhPSBwb29sLT5zdG9yZS0+cHJlYWQgJiYgcHAgIT0gcG9vbC0+c3RvcmUtPnB3cml0ZSkKLSAgICAgIHBwID0gTlVMTDsKLQotICAgLyogRmlyc3QgY2hlY2sgdGhhdCB0aGlzICdtZW1vcnknIHJlYWxseSBpcyB2YWxpZCBtZW1vcnkgLSBpdCBtdXN0IGJlIGluIHRoZQotICAgICogcG9vbCBsaXN0LiAgSWYgaXQgaXMsIHVzZSB0aGUgc2hhcmVkIG1lbW9yeV9mcmVlIGZ1bmN0aW9uIHRvIGZyZWUgaXQuCi0gICAgKi8KLSAgIC0tdGhpczsKLSAgIGZvciAodGVzdCA9ICZwb29sLT5saXN0OyAqdGVzdCAhPSB0aGlzOyB0ZXN0ID0gJigqdGVzdCktPm5leHQpCi0gICB7Ci0gICAgICBpZiAoKnRlc3QgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHN0b3JlX3Bvb2xfZXJyb3IocG9vbC0+c3RvcmUsIHBwLCAiYmFkIHBvaW50ZXIgdG8gZnJlZSIpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgfQotCi0gICAvKiBVbmxpbmsgdGhpcyBlbnRyeSwgKnRlc3QgPT0gdGhpcy4gKi8KLSAgICp0ZXN0ID0gdGhpcy0+bmV4dDsKLSAgIHRoaXMtPm5leHQgPSBOVUxMOwotICAgc3RvcmVfbWVtb3J5X2ZyZWUocHAsIHBvb2wsIHRoaXMpOwotfQotI2VuZGlmIC8qIFBOR19VU0VSX01FTV9TVVBQT1JURUQgKi8KLQotLyogU2V0dXAgZnVuY3Rpb25zLiAqLwotLyogQ2xlYW51cCB3aGVuIGFib3J0aW5nIGEgd3JpdGUgb3IgYWZ0ZXIgc3RvcmluZyB0aGUgbmV3IGZpbGUuICovCi1zdGF0aWMgdm9pZAotc3RvcmVfd3JpdGVfcmVzZXQocG5nX3N0b3JlICpwcykKLXsKLSAgIGlmIChwcy0+cHdyaXRlICE9IE5VTEwpCi0gICB7Ci0gICAgICBhbm9uX2NvbnRleHQocHMpOwotCi0gICAgICBUcnkKLSAgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcHMtPnB3cml0ZSwgJnBzLT5waXdyaXRlKTsKLQotICAgICAgQ2F0Y2hfYW5vbnltb3VzCi0gICAgICB7Ci0gICAgICAgICAvKiBtZW1vcnkgY29ycnVwdGlvbjogY29udGludWUuICovCi0gICAgICB9Ci0KLSAgICAgIHBzLT5wd3JpdGUgPSBOVUxMOwotICAgICAgcHMtPnBpd3JpdGUgPSBOVUxMOwotICAgfQotCi0gICAvKiBBbmQgbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBtZW1vcnkgaGFzIGJlZW4gZnJlZWQgLSB0aGlzIHdpbGwgb3V0cHV0Ci0gICAgKiBzcHVyaW91cyBlcnJvcnMgaW4gdGhlIGNhc2Ugb2YgbWVtb3J5IGNvcnJ1cHRpb24gYWJvdmUsIGJ1dCB0aGlzIGlzIHNhZmUuCi0gICAgKi8KLSMgIGlmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgIHN0b3JlX3Bvb2xfZGVsZXRlKHBzLCAmcHMtPndyaXRlX21lbW9yeV9wb29sKTsKLSMgIGVuZGlmCi0KLSAgIHN0b3JlX2ZyZWVuZXcocHMpOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBtYWluIHdyaXRlIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgcG5nX3N0cnVjdCBhbmQsCi0gKiBvcHRpb25hbGx5LCBhIHBuZ19pbmZvIHN1aXRhYmxlIGZvciB3cml0aWluZyBhIG5ldyBQTkcgZmlsZS4gIFVzZQotICogc3RvcmVfc3RvcmVmaWxlIGFib3ZlIHRvIHJlY29yZCB0aGlzIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gd3JpdHRlbi4gIFRoZQotICogcmV0dXJuZWQgbGlicG5nIHN0cnVjdHVyZXMgYXMgZGVzdHJveWVkIGJ5IHN0b3JlX3dyaXRlX3Jlc2V0IGFib3ZlLgotICovCi1zdGF0aWMgcG5nX3N0cnVjdHAKLXNldF9zdG9yZV9mb3Jfd3JpdGUocG5nX3N0b3JlICpwcywgcG5nX2luZm9wcCBwcGksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICBhbm9uX2NvbnRleHQocHMpOwotCi0gICBUcnkKLSAgIHsKLSAgICAgIGlmIChwcy0+cHdyaXRlICE9IE5VTEwpCi0gICAgICAgICBwbmdfZXJyb3IocHMtPnB3cml0ZSwgIndyaXRlIHN0b3JlIGFscmVhZHkgaW4gdXNlIik7Ci0KLSAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KHBzKTsKLSAgICAgIHNhZmVjYXQocHMtPnduYW1lLCBzaXplb2YgcHMtPnduYW1lLCAwLCBuYW1lKTsKLQotICAgICAgLyogRG9uJ3QgZG8gdGhlIHNsb3cgbWVtb3J5IGNoZWNrcyBpZiBkb2luZyBhIHNwZWVkIHRlc3QsIGFsc28gaWYgdXNlcgotICAgICAgICogbWVtb3J5IGlzIG5vdCBzdXBwb3J0ZWQgd2UgY2FuJ3QgZG8gaXQgYW55d2F5LgotICAgICAgICovCi0jICAgICBpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0gICAgICAgICBpZiAoIXBzLT5zcGVlZCkKLSAgICAgICAgICAgIHBzLT5wd3JpdGUgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKFBOR19MSUJQTkdfVkVSX1NUUklORywKLSAgICAgICAgICAgICAgIHBzLCBzdG9yZV9lcnJvciwgc3RvcmVfd2FybmluZywgJnBzLT53cml0ZV9tZW1vcnlfcG9vbCwKLSAgICAgICAgICAgICAgIHN0b3JlX21hbGxvYywgc3RvcmVfZnJlZSk7Ci0KLSAgICAgICAgIGVsc2UKLSMgICAgIGVuZGlmCi0gICAgICAgICBwcy0+cHdyaXRlID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgICAgICAgcHMsIHN0b3JlX2Vycm9yLCBzdG9yZV93YXJuaW5nKTsKLQotICAgICAgcG5nX3NldF93cml0ZV9mbihwcy0+cHdyaXRlLCBwcywgc3RvcmVfd3JpdGUsIHN0b3JlX2ZsdXNoKTsKLQotIyAgICAgaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb3B0OwotICAgICAgICAgICAgZm9yIChvcHQ9MDsgb3B0PHBzLT5ub3B0aW9uczsgKytvcHQpCi0gICAgICAgICAgICAgICBpZiAocG5nX3NldF9vcHRpb24ocHMtPnB3cml0ZSwgcHMtPm9wdGlvbnNbb3B0XS5vcHRpb24sCi0gICAgICAgICAgICAgICAgICBwcy0+b3B0aW9uc1tvcHRdLnNldHRpbmcpID09IFBOR19PUFRJT05fSU5WQUxJRCkKLSAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcihwcy0+cHdyaXRlLCAicG5nIG9wdGlvbiBpbnZhbGlkIik7Ci0gICAgICAgICB9Ci0jICAgICBlbmRpZgotCi0gICAgICBpZiAocHBpICE9IE5VTEwpCi0gICAgICAgICAqcHBpID0gcHMtPnBpd3JpdGUgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBzLT5wd3JpdGUpOwotICAgfQotCi0gICBDYXRjaF9hbm9ueW1vdXMKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICByZXR1cm4gcHMtPnB3cml0ZTsKLX0KLQotLyogQ2xlYW51cCB3aGVuIGZpbmlzaGVkIHJlYWRpbmcgKGVpdGhlciBkdWUgdG8gZXJyb3Igb3IgaW4gdGhlIHN1Y2Nlc3MgY2FzZSkuCi0gKiBUaGlzIHJvdXRpbmUgZXhpc3RzIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyByZWFkIHN1cHBvcnQgdG8gbWFrZSB0aGUgY29kZQotICogdGlkaWVyIChhdm9pZCBhIG1hc3Mgb2YgaWZkZWZzKSBhbmQgc28gZWFzaWVyIHRvIG1haW50YWluLgotICovCi1zdGF0aWMgdm9pZAotc3RvcmVfcmVhZF9yZXNldChwbmdfc3RvcmUgKnBzKQotewotIyAgaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0gICAgICBpZiAocHMtPnByZWFkICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBhbm9uX2NvbnRleHQocHMpOwotCi0gICAgICAgICBUcnkKLSAgICAgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwcy0+cHJlYWQsICZwcy0+cGlyZWFkLCBOVUxMKTsKLQotICAgICAgICAgQ2F0Y2hfYW5vbnltb3VzCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBlcnJvciBhbHJlYWR5IG91dHB1dDogY29udGludWUgKi8KLSAgICAgICAgIH0KLQotICAgICAgICAgcHMtPnByZWFkID0gTlVMTDsKLSAgICAgICAgIHBzLT5waXJlYWQgPSBOVUxMOwotICAgICAgfQotIyAgZW5kaWYKLQotIyAgaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotICAgICAgLyogQWx3YXlzIGRvIHRoaXMgdG8gYmUgc2FmZS4gKi8KLSAgICAgIHN0b3JlX3Bvb2xfZGVsZXRlKHBzLCAmcHMtPnJlYWRfbWVtb3J5X3Bvb2wpOwotIyAgZW5kaWYKLQotICAgcHMtPmN1cnJlbnQgPSBOVUxMOwotICAgcHMtPm5leHQgPSBOVUxMOwotICAgcHMtPnJlYWRwb3MgPSAwOwotICAgcHMtPnZhbGlkYXRlZCA9IDA7Ci0KLSAgIHBzLT5jaHVua3BvcyA9IDg7Ci0gICBwcy0+Y2h1bmt0eXBlID0gMDsKLSAgIHBzLT5jaHVua2xlbiA9IDE2OwotICAgcHMtPklEQVRfc2l6ZSA9IDA7Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1zdG9yZV9yZWFkX3NldChwbmdfc3RvcmUgKnBzLCBwbmdfdWludF8zMiBpZCkKLXsKLSAgIHBuZ19zdG9yZV9maWxlICpwZiA9IHBzLT5zYXZlZDsKLQotICAgd2hpbGUgKHBmICE9IE5VTEwpCi0gICB7Ci0gICAgICBpZiAocGYtPmlkID09IGlkKQotICAgICAgewotICAgICAgICAgcHMtPmN1cnJlbnQgPSBwZjsKLSAgICAgICAgIHBzLT5uZXh0ID0gTlVMTDsKLSAgICAgICAgIHBzLT5JREFUX3NpemUgPSBwZi0+SURBVF9zaXplOwotICAgICAgICAgcHMtPklEQVRfYml0cyA9IHBmLT5JREFUX2JpdHM7IC8qIGp1c3QgYSBjYWNoZSAqLwotICAgICAgICAgcHMtPklEQVRfbGVuID0gMDsKLSAgICAgICAgIHBzLT5JREFUX3BvcyA9IDA7Ci0gICAgICAgICBwcy0+SURBVF9jcmMgPSAwVUw7Ci0gICAgICAgICBzdG9yZV9yZWFkX2J1ZmZlcl9uZXh0KHBzKTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgcGYgPSBwZi0+bmV4dDsKLSAgIH0KLQotICAgewotICAgICAgc2l6ZV90IHBvczsKLSAgICAgIGNoYXIgbXNnW0ZJTEVfTkFNRV9TSVpFKzY0XTsKLQotICAgICAgcG9zID0gc3RhbmRhcmRfbmFtZV9mcm9tX2lkKG1zZywgc2l6ZW9mIG1zZywgMCwgaWQpOwotICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIjogZmlsZSBub3QgZm91bmQiKTsKLSAgICAgIHBuZ19lcnJvcihwcy0+cHJlYWQsIG1zZyk7Ci0gICB9Ci19Ci0KLS8qIFRoZSBtYWluIGludGVyZmFjZSBmb3IgcmVhZGluZyBhIHNhdmVkIGZpbGUgLSBwYXNzIHRoZSBpZCBudW1iZXIgb2YgdGhlIGZpbGUKLSAqIHRvIHJldHJpZXZlLiAgSWRzIG11c3QgYmUgdW5pcXVlIG9yIHRoZSBlYXJsaWVyIGZpbGUgd2lsbCBiZSBoaWRkZW4uICBUaGUgQVBJCi0gKiByZXR1cm5zIGEgcG5nX3N0cnVjdCBhbmQsIG9wdGlvbmFsbHksIGEgcG5nX2luZm8uICBCb3RoIG9mIHRoZXNlIHdpbGwgYmUKLSAqIGRlc3Ryb3llZCBieSBzdG9yZV9yZWFkX3Jlc2V0IGFib3ZlLgotICovCi1zdGF0aWMgcG5nX3N0cnVjdHAKLXNldF9zdG9yZV9mb3JfcmVhZChwbmdfc3RvcmUgKnBzLCBwbmdfaW5mb3BwIHBwaSwgcG5nX3VpbnRfMzIgaWQsCi0gICBjb25zdCBjaGFyICpuYW1lKQotewotICAgLyogU2V0IHRoZSBuYW1lIGZvciBwbmdfZXJyb3IgKi8KLSAgIHNhZmVjYXQocHMtPnRlc3QsIHNpemVvZiBwcy0+dGVzdCwgMCwgbmFtZSk7Ci0KLSAgIGlmIChwcy0+cHJlYWQgIT0gTlVMTCkKLSAgICAgIHBuZ19lcnJvcihwcy0+cHJlYWQsICJyZWFkIHN0b3JlIGFscmVhZHkgaW4gdXNlIik7Ci0KLSAgIHN0b3JlX3JlYWRfcmVzZXQocHMpOwotCi0gICAvKiBCb3RoIHRoZSBjcmVhdGUgQVBJcyBjYW4gcmV0dXJuIE5VTEwgaWYgdXNlZCBpbiB0aGVpciBkZWZhdWx0IG1vZGUKLSAgICAqIChiZWNhdXNlIHRoZXJlIGlzIG5vIG90aGVyIHdheSBvZiBoYW5kbGluZyBhbiBlcnJvciBiZWNhdXNlIHRoZSBqbXBfYnVmCi0gICAgKiBieSBkZWZhdWx0IGlzIHN0b3JlZCBpbiBwbmdfc3RydWN0IGFuZCB0aGF0IGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQhKQotICAgICogSG93ZXZlciwgZ2l2ZW4gdGhhdCBzdG9yZV9lcnJvciB3b3JrcyBjb3JyZWN0bHkgaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcwotICAgICogd2UgZG9uJ3QgZXZlciBleHBlY3QgTlVMTCBpbiB0aGlzIHByb2dyYW0uCi0gICAgKi8KLSMgIGlmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKLSAgICAgIGlmICghcHMtPnNwZWVkKQotICAgICAgICAgcHMtPnByZWFkID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKFBOR19MSUJQTkdfVkVSX1NUUklORywgcHMsCi0gICAgICAgICAgICAgc3RvcmVfZXJyb3IsIHN0b3JlX3dhcm5pbmcsICZwcy0+cmVhZF9tZW1vcnlfcG9vbCwgc3RvcmVfbWFsbG9jLAotICAgICAgICAgICAgIHN0b3JlX2ZyZWUpOwotCi0gICAgICBlbHNlCi0jICBlbmRpZgotICAgcHMtPnByZWFkID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIHBzLCBzdG9yZV9lcnJvciwKLSAgICAgIHN0b3JlX3dhcm5pbmcpOwotCi0gICBpZiAocHMtPnByZWFkID09IE5VTEwpCi0gICB7Ci0gICAgICBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCA9ICZwcy0+ZXhjZXB0aW9uX2NvbnRleHQ7Ci0KLSAgICAgIHN0b3JlX2xvZyhwcywgTlVMTCwgInBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QgcmV0dXJuZWQgTlVMTCAodW5leHBlY3RlZCkiLAotICAgICAgICAgMSAvKmVycm9yKi8pOwotCi0gICAgICBUaHJvdyBwczsKLSAgIH0KLQotIyAgaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECi0gICAgICB7Ci0gICAgICAgICBpbnQgb3B0OwotICAgICAgICAgZm9yIChvcHQ9MDsgb3B0PHBzLT5ub3B0aW9uczsgKytvcHQpCi0gICAgICAgICAgICBpZiAocG5nX3NldF9vcHRpb24ocHMtPnByZWFkLCBwcy0+b3B0aW9uc1tvcHRdLm9wdGlvbiwKLSAgICAgICAgICAgICAgIHBzLT5vcHRpb25zW29wdF0uc2V0dGluZykgPT0gUE5HX09QVElPTl9JTlZBTElEKQotICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBzLT5wcmVhZCwgInBuZyBvcHRpb24gaW52YWxpZCIpOwotICAgICAgfQotIyAgZW5kaWYKLQotICAgc3RvcmVfcmVhZF9zZXQocHMsIGlkKTsKLQotICAgaWYgKHBwaSAhPSBOVUxMKQotICAgICAgKnBwaSA9IHBzLT5waXJlYWQgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBzLT5wcmVhZCk7Ci0KLSAgIHJldHVybiBwcy0+cHJlYWQ7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0KLS8qIFRoZSBvdmVyYWxsIGNsZWFudXAgb2YgYSBzdG9yZSBzaW1wbHkgY2FsbHMgdGhlIGFib3ZlIHRoZW4gcmVtb3ZlcyBhbGwgdGhlCi0gKiBzYXZlZCBmaWxlcy4gIFRoaXMgZG9lcyBub3QgZGVsZXRlIHRoZSBzdG9yZSBpdHNlbGYuCi0gKi8KLXN0YXRpYyB2b2lkCi1zdG9yZV9kZWxldGUocG5nX3N0b3JlICpwcykKLXsKLSAgIHN0b3JlX3dyaXRlX3Jlc2V0KHBzKTsKLSAgIHN0b3JlX3JlYWRfcmVzZXQocHMpOwotICAgc3RvcmVfZnJlZWZpbGUoJnBzLT5zYXZlZCk7Ci0gICBzdG9yZV9pbWFnZV9mcmVlKHBzLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqIFBORyBGSUxFIE1PRElGSUNBVElPTiBPTiBSRUFEICoqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZpbGVzIG1heSBiZSBtb2RpZmllZCBvbiByZWFkLiAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgY29udGFpbnMgYSBjb21wbGV0ZQotICogcG5nX3N0b3JlIHRvZ2V0aGVyIHdpdGggZXh0cmEgbWVtYmVycyB0byBoYW5kbGUgbW9kaWZpY2F0aW9uIGFuZCBhIHNwZWNpYWwKLSAqIHJlYWQgY2FsbGJhY2sgZm9yIGxpYnBuZy4gIFRvIHVzZSB0aGlzIHRoZSAnbW9kaWZpY2F0aW9ucycgZmllbGQgbXVzdCBiZSBzZXQKLSAqIHRvIGEgbGlzdCBvZiBwbmdfbW9kaWZpY2F0aW9uIHN0cnVjdHVyZXMgdGhhdCBhY3R1YWxseSBwZXJmb3JtIHRoZQotICogbW9kaWZpY2F0aW9uLCBvdGhlcndpc2UgYSBwbmdfbW9kaWZpZXIgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gYQotICogcG5nX3N0b3JlLiAgVGhlcmUgaXMgYSBzcGVjaWFsIHJlYWQgZnVuY3Rpb24sIHNldF9tb2RpZmllcl9mb3JfcmVhZCwgd2hpY2gKLSAqIHJlcGxhY2VzIHNldF9zdG9yZV9mb3JfcmVhZC4KLSAqLwotdHlwZWRlZiBlbnVtIG1vZGlmaWVyX3N0YXRlCi17Ci0gICBtb2RpZmllcl9zdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsIHZhbHVlICovCi0gICBtb2RpZmllcl9zaWduYXR1cmUsICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIGEgc2lnbmF0dXJlICovCi0gICBtb2RpZmllcl9JSERSICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXZlIGFuIElIRFIgKi8KLX0gbW9kaWZpZXJfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IENJRV9jb2xvcgotewotICAgLyogQSBzaW5nbGUgQ0lFIHRyaXN0aW11bHVzIHZhbHVlLCByZXByZXNlbnRpbmcgdGhlIHVuaXF1ZSByZXNwb25zZSBvZiBhCi0gICAgKiBzdGFuZGFyZCBvYnNlcnZlciB0byBhIHZhcmlldHkgb2YgbGlnaHQgc3BlY3RyYS4gIFRoZSBvYnNlcnZlciByZWNvZ25pemVzCi0gICAgKiBhbGwgc3BlY3RyYSB0aGF0IHByb2R1Y2UgdGhpcyByZXNwb25zZSBhcyB0aGUgc2FtZSBjb2xvciwgdGhlcmVmb3JlIHRoaXMKLSAgICAqIGlzIGVmZmVjdGl2ZWx5IGEgZGVzY3JpcHRpb24gb2YgYSBjb2xvci4KLSAgICAqLwotICAgZG91YmxlIFgsIFksIFo7Ci19IENJRV9jb2xvcjsKLQotdHlwZWRlZiBzdHJ1Y3QgY29sb3JfZW5jb2RpbmcKLXsKLSAgIC8qIEEgZGVzY3JpcHRpb24gb2YgYW4gKFIsRyxCKSBlbmNvZGluZyBvZiBjb2xvciAoYXMgZGVmaW5lZCBhYm92ZSk7IHRoaXMKLSAgICAqIGluY2x1ZGVzIHRoZSBhY3R1YWwgY29sb3JzIG9mIHRoZSAoUixHLEIpIHRyaXBsZXMgKDEsMCwwKSwgKDAsMSwwKSBhbmQKLSAgICAqICgwLDAsMSkgcGx1cyBhbiBlbmNvZGluZyB2YWx1ZSB0aGF0IGlzIHVzZWQgdG8gZW5jb2RlIHRoZSBsaW5lYXIKLSAgICAqIGNvbXBvbmVudHMgUiwgRyBhbmQgQiB0byBnaXZlIHRoZSBhY3R1YWwgdmFsdWVzIFJeZ2FtbWEsIEdeZ2FtbWEgYW5kCi0gICAgKiBCXmdhbW1hIHRoYXQgYXJlIHN0b3JlZC4KLSAgICAqLwotICAgZG91YmxlICAgIGdhbW1hOyAgICAgICAgICAgIC8qIEVuY29kaW5nIChmaWxlKSBnYW1tYSBvZiBzcGFjZSAqLwotICAgQ0lFX2NvbG9yIHJlZCwgZ3JlZW4sIGJsdWU7IC8qIEVuZCBwb2ludHMgKi8KLX0gY29sb3JfZW5jb2Rpbmc7Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLSNpZiBkZWZpbmVkIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICYmIGRlZmluZWQgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKLXN0YXRpYyBkb3VibGUKLWNocm9tYXRpY2l0eV94KENJRV9jb2xvciBjKQotewotICAgcmV0dXJuIGMuWCAvIChjLlggKyBjLlkgKyBjLlopOwotfQotCi1zdGF0aWMgZG91YmxlCi1jaHJvbWF0aWNpdHlfeShDSUVfY29sb3IgYykKLXsKLSAgIHJldHVybiBjLlkgLyAoYy5YICsgYy5ZICsgYy5aKTsKLX0KLQotc3RhdGljIENJRV9jb2xvcgotd2hpdGVfcG9pbnQoY29uc3QgY29sb3JfZW5jb2RpbmcgKmVuY29kaW5nKQotewotICAgQ0lFX2NvbG9yIHdoaXRlOwotCi0gICB3aGl0ZS5YID0gZW5jb2RpbmctPnJlZC5YICsgZW5jb2RpbmctPmdyZWVuLlggKyBlbmNvZGluZy0+Ymx1ZS5YOwotICAgd2hpdGUuWSA9IGVuY29kaW5nLT5yZWQuWSArIGVuY29kaW5nLT5ncmVlbi5ZICsgZW5jb2RpbmctPmJsdWUuWTsKLSAgIHdoaXRlLlogPSBlbmNvZGluZy0+cmVkLlogKyBlbmNvZGluZy0+Z3JlZW4uWiArIGVuY29kaW5nLT5ibHVlLlo7Ci0KLSAgIHJldHVybiB3aGl0ZTsKLX0KLSNlbmRpZiAvKiBSRUFEX1RSQU5TRk9STVMgJiYgUkVBRF9jSFJNICovCi0KLSNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1ub3JtYWxpemVfY29sb3JfZW5jb2RpbmcoY29sb3JfZW5jb2RpbmcgKmVuY29kaW5nKQotewotICAgY29uc3QgZG91YmxlIHdoaXRlWSA9IGVuY29kaW5nLT5yZWQuWSArIGVuY29kaW5nLT5ncmVlbi5ZICsKLSAgICAgIGVuY29kaW5nLT5ibHVlLlk7Ci0KLSAgIGlmICh3aGl0ZVkgIT0gMSkKLSAgIHsKLSAgICAgIGVuY29kaW5nLT5yZWQuWCAvPSB3aGl0ZVk7Ci0gICAgICBlbmNvZGluZy0+cmVkLlkgLz0gd2hpdGVZOwotICAgICAgZW5jb2RpbmctPnJlZC5aIC89IHdoaXRlWTsKLSAgICAgIGVuY29kaW5nLT5ncmVlbi5YIC89IHdoaXRlWTsKLSAgICAgIGVuY29kaW5nLT5ncmVlbi5ZIC89IHdoaXRlWTsKLSAgICAgIGVuY29kaW5nLT5ncmVlbi5aIC89IHdoaXRlWTsKLSAgICAgIGVuY29kaW5nLT5ibHVlLlggLz0gd2hpdGVZOwotICAgICAgZW5jb2RpbmctPmJsdWUuWSAvPSB3aGl0ZVk7Ci0gICAgICBlbmNvZGluZy0+Ymx1ZS5aIC89IHdoaXRlWTsKLSAgIH0KLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKLXN0YXRpYyBzaXplX3QKLXNhZmVjYXRfY29sb3JfZW5jb2RpbmcoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywKLSAgIGNvbnN0IGNvbG9yX2VuY29kaW5nICplLCBkb3VibGUgZW5jb2RpbmdfZ2FtbWEpCi17Ci0gICBpZiAoZSAhPSAwKQotICAgewotICAgICAgaWYgKGVuY29kaW5nX2dhbW1hICE9IDApCi0gICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiKCIpOwotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIlIoIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIGJ1ZnNpemUsIHBvcywgZS0+cmVkLlgsIDQpOwotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiwiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlLT5yZWQuWSwgNCk7Ci0gICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiLCIpOwotICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBidWZzaXplLCBwb3MsIGUtPnJlZC5aLCA0KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIpLEcoIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIGJ1ZnNpemUsIHBvcywgZS0+Z3JlZW4uWCwgNCk7Ci0gICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCAiLCIpOwotICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBidWZzaXplLCBwb3MsIGUtPmdyZWVuLlksIDQpOwotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIiwiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlLT5ncmVlbi5aLCA0KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIpLEIoIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIGJ1ZnNpemUsIHBvcywgZS0+Ymx1ZS5YLCA0KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIsIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIGJ1ZnNpemUsIHBvcywgZS0+Ymx1ZS5ZLCA0KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIsIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIGJ1ZnNpemUsIHBvcywgZS0+Ymx1ZS5aLCA0KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIpIik7Ci0gICAgICBpZiAoZW5jb2RpbmdfZ2FtbWEgIT0gMCkKLSAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBidWZzaXplLCBwb3MsICIpIik7Ci0gICB9Ci0KLSAgIGlmIChlbmNvZGluZ19nYW1tYSAhPSAwKQotICAgewotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIl4iKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBlbmNvZGluZ19nYW1tYSwgNSk7Ci0gICB9Ci0KLSAgIHJldHVybiBwb3M7Ci19Ci0jZW5kaWYgLyogUkVBRF9UUkFOU0ZPUk1TICovCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0KLXR5cGVkZWYgc3RydWN0IHBuZ19tb2RpZmllcgotewotICAgcG5nX3N0b3JlICAgICAgICAgICAgICAgdGhpczsgICAgICAgICAgICAgLyogSSBhbSBhIHBuZ19zdG9yZSAqLwotICAgc3RydWN0IHBuZ19tb2RpZmljYXRpb24gKm1vZGlmaWNhdGlvbnM7ICAgLyogQ2hhbmdlcyB0byBtYWtlICovCi0KLSAgIG1vZGlmaWVyX3N0YXRlICAgICAgICAgICBzdGF0ZTsgICAgICAgICAgIC8qIE15IHN0YXRlICovCi0KLSAgIC8qIEluZm9ybWF0aW9uIGZyb20gSUhEUjogKi8KLSAgIHBuZ19ieXRlICAgICAgICAgICAgICAgICBiaXRfZGVwdGg7ICAgICAgIC8qIEZyb20gSUhEUiAqLwotICAgcG5nX2J5dGUgICAgICAgICAgICAgICAgIGNvbG91cl90eXBlOyAgICAgLyogRnJvbSBJSERSICovCi0KLSAgIC8qIFdoaWxlIGhhbmRsaW5nIFBMVEUsIElEQVQgYW5kIElFTkQgdGhlc2UgY2h1bmtzIG1heSBiZSBwZW5kZWQgdG8gYWxsb3cKLSAgICAqIG90aGVyIGNodW5rcyB0byBiZSBpbnNlcnRlZC4KLSAgICAqLwotICAgcG5nX3VpbnRfMzIgICAgICAgICAgICAgIHBlbmRpbmdfbGVuOwotICAgcG5nX3VpbnRfMzIgICAgICAgICAgICAgIHBlbmRpbmdfY2h1bms7Ci0KLSAgIC8qIFRlc3QgdmFsdWVzICovCi0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgKmdhbW1hczsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgbmdhbW1hczsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgbmdhbW1hX3Rlc3RzOyAgICAgLyogTnVtYmVyIG9mIGdhbW1hIHRlc3RzIHRvIHJ1biovCi0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2FtbWE7ICAgIC8qIDAgaWYgbm90IHNldCAqLwotICAgY29uc3QgY29sb3JfZW5jb2RpbmcgKmVuY29kaW5nczsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgbmVuY29kaW5nczsKLSAgIGNvbnN0IGNvbG9yX2VuY29kaW5nICpjdXJyZW50X2VuY29kaW5nOyAvKiBJZiBhbiBlbmNvZGluZyBoYXMgYmVlbiBzZXQgKi8KLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgZW5jb2RpbmdfY291bnRlcjsgLyogRm9yIGl0ZXJhdGlvbiAqLwotICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ19pZ25vcmVkOyAvKiBTb21ldGhpbmcgb3Zlcndyb3RlIGl0ICovCi0KLSAgIC8qIENvbnRyb2wgdmFyaWFibGVzIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHBvc3NpYmxlIGVuY29kaW5ncywgdGhlCi0gICAgKiBmb2xsb3dpbmcgbXVzdCBiZSBzZXQgdG8gMCBhbmQgdGVzdGVkIGJ5IHRoZSBmdW5jdGlvbiB0aGF0IHVzZXMgdGhlCi0gICAgKiBwbmdfbW9kaWZpZXIgYmVjYXVzZSB0aGUgbW9kaWZpZXIgb25seSBzZXRzIGl0IHRvIDEgKHRydWUuKQotICAgICovCi0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIHJlcGVhdCA6MTsgICAvKiBSZXBlYXQgdGhpcyB0cmFuc2Zvcm0gdGVzdC4gKi8KLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgdGVzdF91c2VzX2VuY29kaW5nIDoxOwotCi0gICAvKiBMb3dlc3Qgc2JpdCB0byB0ZXN0IChwcmUtMS43IGxpYnBuZyBmYWlscyBmb3Igc2JpdCA8IDgpICovCi0gICBwbmdfYnl0ZSAgICAgICAgICAgICAgICAgc2JpdGxvdzsKLQotICAgLyogRXJyb3IgY29udHJvbCAtIHRoZXNlIGFyZSB0aGUgbGltaXRzIG9uIGVycm9ycyBhY2NlcHRlZCBieSB0aGUgZ2FtbWEgdGVzdHMKLSAgICAqIGJlbG93LgotICAgICovCi0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgbWF4b3V0ODsgIC8qIE1heGltdW0gb3V0cHV0IHZhbHVlIGVycm9yICovCi0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgbWF4YWJzODsgIC8qIEFic29sdXRlIHNhbXBsZSBlcnJvciAwLi4xICovCi0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgbWF4Y2FsYzg7IC8qIEFic29sdXRlIHNhbXBsZSBlcnJvciAwLi4xICovCi0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgbWF4cGM4OyAgIC8qIFBlcmNlbnRhZ2Ugc2FtcGxlIGVycm9yIDAuLjEwMCUgKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhvdXQxNjsgLyogTWF4aW11bSBvdXRwdXQgdmFsdWUgZXJyb3IgKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhhYnMxNjsgLyogQWJzb2x1dGUgc2FtcGxlIGVycm9yIDAuLjEgKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhjYWxjMTY7LyogQWJzb2x1dGUgc2FtcGxlIGVycm9yIDAuLjEgKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhjYWxjRzsgLyogQWJzb2x1dGUgc2FtcGxlIGVycm9yIDAuLjEgKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBtYXhwYzE2OyAgLyogUGVyY2VudGFnZSBzYW1wbGUgZXJyb3IgMC4uMTAwJSAqLwotCi0gICAvKiBUaGlzIGlzIHNldCBieSB0cmFuc2Zvcm1zIHRoYXQgbmVlZCB0byBhbGxvdyBhIGhpZ2hlciBsaW1pdCwgaXQgaXMgYW4KLSAgICAqIGludGVybmFsIGNoZWNrIG9uIHBuZ3ZhbGlkIHRvIGVuc3VyZSB0aGF0IHRoZSBjYWxjdWxhdGVkIGVycm9yIGxpbWl0cyBhcmUKLSAgICAqIG5vdCByaWRpY3Vsb3VzOyB3aXRob3V0IHRoaXMgaXQgaXMgdG9vIGVhc3kgdG8gbWFrZSBhIG1pc3Rha2UgaW4gcG5ndmFsaWQKLSAgICAqIHRoYXQgYWxsb3dzIGFueSB2YWx1ZSB0aHJvdWdoLgotICAgICoKLSAgICAqIE5PVEU6IHRoaXMgaXMgbm90IGNoZWNrZWQgaW4gcmVsZWFzZSBidWlsZHMuCi0gICAgKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBsaW1pdDsgICAgLyogbGltaXQgb24gZXJyb3IgdmFsdWVzLCBub3JtYWxseSA0RS0zICovCi0KLSAgIC8qIExvZyBsaW1pdHMgLSB2YWx1ZXMgYWJvdmUgdGhpcyBhcmUgbG9nZ2VkLCBidXQgbm90IG5lY2Vzc2FyaWx5Ci0gICAgKiB3YXJuZWQuCi0gICAgKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBsb2c4OyAgICAgLyogQWJzb2x1dGUgZXJyb3IgaW4gOCBiaXRzIHRvIGxvZyAqLwotICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGxvZzE2OyAgICAvKiBBYnNvbHV0ZSBlcnJvciBpbiAxNiBiaXRzIHRvIGxvZyAqLwotCi0gICAvKiBMb2dnZWQgOCBhbmQgMTYgYml0IGVycm9ycyAoJ291dHB1dCcgdmFsdWVzKTogKi8KLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBlcnJvcl9ncmF5XzI7Ci0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgZXJyb3JfZ3JheV80OwotICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGVycm9yX2dyYXlfODsKLSAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBlcnJvcl9ncmF5XzE2OwotICAgZG91YmxlICAgICAgICAgICAgICAgICAgIGVycm9yX2NvbG9yXzg7Ci0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgZXJyb3JfY29sb3JfMTY7Ci0gICBkb3VibGUgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5kZXhlZDsKLQotICAgLyogRmxhZ3M6ICovCi0gICAvKiBXaGV0aGVyIHRvIGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8sIG5vdCBwbmdfcmVhZF9zdGFydF9pbWFnZSwgYW5kIGhvdwotICAgICogbWFueSB0aW1lcyB0byBjYWxsIGl0LgotICAgICovCi0gICBpbnQgICAgICAgICAgICAgICAgICAgICAgdXNlX3VwZGF0ZV9pbmZvOwotCi0gICAvKiBXaGV0aGVyIG9yIG5vdCB0byBpbnRlcmxhY2UuICovCi0gICBpbnQgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlX3R5cGUgOjk7IC8qIGludCwgYnV0IG11c3Qgc3RvcmUgJzEnICovCi0KLSAgIC8qIFJ1biB0aGUgc3RhbmRhcmQgdGVzdHM/ICovCi0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9zdGFuZGFyZCA6MTsKLQotICAgLyogUnVuIHRoZSBvZGQtc2l6ZWQgaW1hZ2UgYW5kIGludGVybGFjZSByZWFkL3dyaXRlIHRlc3RzPyAqLwotICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3Rfc2l6ZSA6MTsKLQotICAgLyogUnVuIHRlc3RzIG9uIHJlYWRpbmcgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIHRyYW5zZm9ybXMsICovCi0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF90cmFuc2Zvcm0gOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF90Uk5TIDoxOyAvKiBJbmNsdWRlcyB0Uk5TIGltYWdlcyAqLwotCi0gICAvKiBXaGVuIHRvIHVzZSB0aGUgdXNlX2lucHV0X3ByZWNpc2lvbiBvcHRpb24sIHRoaXMgY29udHJvbHMgdGhlIGdhbW1hCi0gICAgKiB2YWxpZGF0aW9uIGNvZGUgY2hlY2tzLiAgSWYgc2V0IGFueSB2YWx1ZSB0aGF0IGlzIHdpdGhpbiB0aGUgdHJhbnNmb3JtZWQKLSAgICAqIHJhbmdlIGlucHV0LS41IHRvIGlucHV0Ky41IHdpbGwgYmUgYWNjZXB0ZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgbXVzdCBiZQotICAgICogd2l0aGluIHRoZSBub3JtYWwgbGltaXRzLiAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gc2V0IHRoaXM7IHRoZQotICAgICogcmVzdWx0IHNob3VsZCBhbHdheXMgYmUgZXhhY3Qgd2l0aGluIHRoZSBwZXJtaXR0ZWQgZXJyb3IgbGltaXRzLgotICAgICovCi0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdXNlX2lucHV0X3ByZWNpc2lvbiA6MTsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB1c2VfaW5wdXRfcHJlY2lzaW9uX3NiaXQgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdXNlX2lucHV0X3ByZWNpc2lvbl8xNnRvOCA6MTsKLQotICAgLyogSWYgc2V0IGFzc3VtZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiBiaXQgZGVwdGggaXMgc2V0IGJ5IHRoZSBpbnB1dAotICAgICogcHJlY2lzaW9uLCBub3QgdGhlIG91dHB1dCBwcmVjaXNpb24uCi0gICAgKi8KLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBjYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA6MTsKLQotICAgLyogSWYgc2V0IGFzc3VtZSB0aGF0IHRoZSBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgaW4gMTYgYml0cyBldmVuIGlmIHRoZSBzYW1wbGUKLSAgICAqIGRlcHRoIGlzIDggYml0cy4KLSAgICAqLwotICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zIDoxOwotCi0gICAvKiBXaGljaCBnYW1tYSB0ZXN0cyB0byBydW46ICovCi0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV90aHJlc2hvbGQgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV90cmFuc2Zvcm0gOjE7IC8qIG1haW4gdGVzdHMgKi8KLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2dhbW1hX3NiaXQgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV9zY2FsZTE2IDoxOwotICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3RfZ2FtbWFfYmFja2dyb3VuZCA6MTsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2dhbW1hX2FscGhhX21vZGUgOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9nYW1tYV9leHBhbmQxNiA6MTsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2V4aGF1c3RpdmUgOjE7Ci0KLSAgIC8qIFdoZXRoZXIgb3Igbm90IHRvIHJ1biB0aGUgbG93LWJpdC1kZXB0aCBncmF5c2NhbGUgdGVzdHMuICBUaGlzIGZhaWxzIG9uCi0gICAgKiBnYW1tYSBpbWFnZXMgaW4gc29tZSBjYXNlcyBiZWNhdXNlIG9mIGdyb3NzIGluYWNjdXJhY2llcyBpbiB0aGUgZ3JheXNjYWxlCi0gICAgKiBnYW1tYSBoYW5kbGluZyBmb3IgbG93IGJpdCBkZXB0aC4KLSAgICAqLwotICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3RfbGJnIDoxOwotICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIHRlc3RfbGJnX2dhbW1hX3RocmVzaG9sZCA6MTsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0gOjE7Ci0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgdGVzdF9sYmdfZ2FtbWFfc2JpdCA6MTsKLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0ZXN0X2xiZ19nYW1tYV9jb21wb3NpdGlvbiA6MTsKLQotICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGxvZyA6MTsgICAvKiBMb2cgbWF4IGVycm9yICovCi0KLSAgIC8qIEJ1ZmZlciBpbmZvcm1hdGlvbiwgdGhlIGJ1ZmZlciBzaXplIGxpbWl0cyB0aGUgc2l6ZSBvZiB0aGUgY2h1bmtzIHRoYXQgY2FuCi0gICAgKiBiZSBtb2RpZmllZCAtIHRoZXkgbXVzdCBmaXQgKGluY2x1ZGluZyBoZWFkZXIgYW5kIENSQykgaW50byB0aGUgYnVmZmVyIQotICAgICovCi0gICBzaXplX3QgICAgICAgICAgICAgICAgICAgZmx1c2g7ICAgICAgICAgICAvKiBDb3VudCBvZiBieXRlcyB0byBmbHVzaCAqLwotICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9jb3VudDsgICAgLyogQnl0ZXMgaW4gYnVmZmVyICovCi0gICBzaXplX3QgICAgICAgICAgICAgICAgICAgYnVmZmVyX3Bvc2l0aW9uOyAvKiBQb3NpdGlvbiBpbiBidWZmZXIgKi8KLSAgIHBuZ19ieXRlICAgICAgICAgICAgICAgICBidWZmZXJbMTAyNF07Ci19IHBuZ19tb2RpZmllcjsKLQotLyogVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc2hvdWxkIGJlIHN0b3BwZWQgbm93IGJlY2F1c2UgaXQgaGFzIGFscmVhZHkKLSAqIGZhaWxlZCBhbmQgaXQgaXMgcnVubmluZyBzaWxlbnRseS4KLSAgKi8KLXN0YXRpYyBpbnQgZmFpbChwbmdfbW9kaWZpZXIgKnBtKQotewotICAgcmV0dXJuICFwbS0+bG9nICYmICFwbS0+dGhpcy52ZXJib3NlICYmIChwbS0+dGhpcy5uZXJyb3JzID4gMCB8fAotICAgICAgIChwbS0+dGhpcy50cmVhdF93YXJuaW5nc19hc19lcnJvcnMgJiYgcG0tPnRoaXMubndhcm5pbmdzID4gMCkpOwotfQotCi1zdGF0aWMgdm9pZAotbW9kaWZpZXJfaW5pdChwbmdfbW9kaWZpZXIgKnBtKQotewotICAgbWVtc2V0KHBtLCAwLCBzaXplb2YgKnBtKTsKLSAgIHN0b3JlX2luaXQoJnBtLT50aGlzKTsKLSAgIHBtLT5tb2RpZmljYXRpb25zID0gTlVMTDsKLSAgIHBtLT5zdGF0ZSA9IG1vZGlmaWVyX3N0YXJ0OwotICAgcG0tPnNiaXRsb3cgPSAxVTsKLSAgIHBtLT5uZ2FtbWFzID0gMDsKLSAgIHBtLT5uZ2FtbWFfdGVzdHMgPSAwOwotICAgcG0tPmdhbW1hcyA9IDA7Ci0gICBwbS0+Y3VycmVudF9nYW1tYSA9IDA7Ci0gICBwbS0+ZW5jb2RpbmdzID0gMDsKLSAgIHBtLT5uZW5jb2RpbmdzID0gMDsKLSAgIHBtLT5jdXJyZW50X2VuY29kaW5nID0gMDsKLSAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsKLSAgIHBtLT5lbmNvZGluZ19pZ25vcmVkID0gMDsKLSAgIHBtLT5yZXBlYXQgPSAwOwotICAgcG0tPnRlc3RfdXNlc19lbmNvZGluZyA9IDA7Ci0gICBwbS0+bWF4b3V0OCA9IHBtLT5tYXhwYzggPSBwbS0+bWF4YWJzOCA9IHBtLT5tYXhjYWxjOCA9IDA7Ci0gICBwbS0+bWF4b3V0MTYgPSBwbS0+bWF4cGMxNiA9IHBtLT5tYXhhYnMxNiA9IHBtLT5tYXhjYWxjMTYgPSAwOwotICAgcG0tPm1heGNhbGNHID0gMDsKLSAgIHBtLT5saW1pdCA9IDRFLTM7Ci0gICBwbS0+bG9nOCA9IHBtLT5sb2cxNiA9IDA7IC8qIE1lYW5zICdvZmYnICovCi0gICBwbS0+ZXJyb3JfZ3JheV8yID0gcG0tPmVycm9yX2dyYXlfNCA9IHBtLT5lcnJvcl9ncmF5XzggPSAwOwotICAgcG0tPmVycm9yX2dyYXlfMTYgPSBwbS0+ZXJyb3JfY29sb3JfOCA9IHBtLT5lcnJvcl9jb2xvcl8xNiA9IDA7Ci0gICBwbS0+ZXJyb3JfaW5kZXhlZCA9IDA7Ci0gICBwbS0+dXNlX3VwZGF0ZV9pbmZvID0gMDsKLSAgIHBtLT5pbnRlcmxhY2VfdHlwZSA9IFBOR19JTlRFUkxBQ0VfTk9ORTsKLSAgIHBtLT50ZXN0X3N0YW5kYXJkID0gMDsKLSAgIHBtLT50ZXN0X3NpemUgPSAwOwotICAgcG0tPnRlc3RfdHJhbnNmb3JtID0gMDsKLSMgIGlmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAotICAgICAgcG0tPnRlc3RfdFJOUyA9IDE7Ci0jICBlbHNlCi0gICAgICBwbS0+dGVzdF90Uk5TID0gMDsKLSMgIGVuZGlmCi0gICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbiA9IDA7Ci0gICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbl9zYml0ID0gMDsKLSAgIHBtLT51c2VfaW5wdXRfcHJlY2lzaW9uXzE2dG84ID0gMDsKLSAgIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9IDA7Ci0gICBwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgPSAwOwotICAgcG0tPnRlc3RfZ2FtbWFfdGhyZXNob2xkID0gMDsKLSAgIHBtLT50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDA7Ci0gICBwbS0+dGVzdF9nYW1tYV9zYml0ID0gMDsKLSAgIHBtLT50ZXN0X2dhbW1hX3NjYWxlMTYgPSAwOwotICAgcG0tPnRlc3RfZ2FtbWFfYmFja2dyb3VuZCA9IDA7Ci0gICBwbS0+dGVzdF9nYW1tYV9hbHBoYV9tb2RlID0gMDsKLSAgIHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2ID0gMDsKLSAgIHBtLT50ZXN0X2xiZyA9IDE7Ci0gICBwbS0+dGVzdF9sYmdfZ2FtbWFfdGhyZXNob2xkID0gMTsKLSAgIHBtLT50ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0gPSAxOwotICAgcG0tPnRlc3RfbGJnX2dhbW1hX3NiaXQgPSAxOwotICAgcG0tPnRlc3RfbGJnX2dhbW1hX2NvbXBvc2l0aW9uID0gMTsKLSAgIHBtLT50ZXN0X2V4aGF1c3RpdmUgPSAwOwotICAgcG0tPmxvZyA9IDA7Ci0KLSAgIC8qIFJlbHkgb24gdGhlIG1lbXNldCBmb3IgYWxsIHRoZSBvdGhlciBmaWVsZHMgLSB0aGVyZSBhcmUgbm8gcG9pbnRlcnMgKi8KLX0KLQotI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECi0KLS8qIFRoaXMgY29udHJvbHMgdXNlIG9mIGNoZWNrcyB0aGF0IGV4cGxpY2l0bHkga25vdyBob3cgbGlicG5nIGRpZ2l0aXplcyB0aGUKLSAqIHNhbXBsZXMgaW4gY2FsY3VsYXRpb25zOyBzZXR0aW5nIHRoaXMgY2lyY3VtdmVudHMgc2ltcGxlIGVycm9yIGxpbWl0IGNoZWNraW5nCi0gKiBpbiB0aGUgcmdiX3RvX2dyYXkgY2hlY2ssIHJlcGxhY2luZyBpdCB3aXRoIGFuIGV4YWN0IGNvcHkgb2YgdGhlIGxpYnBuZyAxLjUKLSAqIGFsZ29yaXRobS4KLSAqLwotI2RlZmluZSBESUdJVElaRSBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCi0KLS8qIElmIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiBpcyBzZXQgdGhlbiBvcGVyYXRpb25zIHdpbGwgaGFwcGVuCi0gKiB3aXRoIHRoZSBwcmVjaXNpb24gb2YgdGhlIGlucHV0LCBub3QgdGhlIHByZWNpc2lvbiBvZiB0aGUgb3V0cHV0IGRlcHRoLgotICoKLSAqIElmIHBtLT5hc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucyBpcyBzZXQgdGhlbiBldmVuIDggYml0IGNhbGN1bGF0aW9ucyB1c2UgMTYKLSAqIGJpdCBwcmVjaXNpb24uICBUaGlzIG9ubHkgYWZmZWN0cyB0aG9zZSBvZiB0aGUgZm9sbG93aW5nIGxpbWl0cyB0aGF0IHBlcnRhaW4KLSAqIHRvIGEgY2FsY3VsYXRpb24gLSBub3QgYSBkaWdpdGl6YXRpb24gb3BlcmF0aW9uIC0gdW5sZXNzIHRoZSBmb2xsb3dpbmcgQVBJIGlzCi0gKiBjYWxsZWQgZGlyZWN0bHkuCi0gKi8KLSNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQKLSNpZiBESUdJVElaRQotc3RhdGljIGRvdWJsZSBkaWdpdGl6ZShkb3VibGUgdmFsdWUsIGludCBkZXB0aCwgaW50IGRvX3JvdW5kKQotewotICAgLyogJ3ZhbHVlJyBpcyBpbiB0aGUgcmFuZ2UgMCB0byAxLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIHZhbHVlIHJvdW5kZWQgdG8gYQotICAgICogbXVsdGlwbGUgb2YgdGhlIGRpZ2l0aXphdGlvbiBmYWN0b3IgLSA4IG9yIDE2IGJpdHMgZGVwZW5kaW5nIG9uIGJvdGggdGhlCi0gICAgKiBzYW1wbGUgZGVwdGggYW5kIHRoZSAnYXNzdW1lJyBzZXR0aW5nLiAgRGlnaXRpemF0aW9uIGlzIG5vcm1hbGx5IGJ5Ci0gICAgKiByb3VuZGluZyBhbmQgJ2RvX3JvdW5kJyBzaG91bGQgYmUgMSwgaWYgaXQgaXMgMCB0aGUgZGlnaXRpemVkIHZhbHVlIHdpbGwKLSAgICAqIGJlIHRydW5jYXRlZC4KLSAgICAqLwotICAgY29uc3QgdW5zaWduZWQgaW50IGRpZ2l0aXphdGlvbl9mYWN0b3IgPSAoMVUgPDwgZGVwdGgpIC0xOwotCi0gICAvKiBMaW1pdGluZyB0aGUgcmFuZ2UgaXMgZG9uZSBhcyBhIGNvbnZlbmllbmNlIHRvIHRoZSBjYWxsZXIgLSBpdCdzIGVhc2llciB0bwotICAgICogZG8gaXQgb25jZSBoZXJlIHRoYW4gZXZlcnkgdGltZSBhdCB0aGUgY2FsbCBzaXRlLgotICAgICovCi0gICBpZiAodmFsdWUgPD0gMCkKLSAgICAgIHZhbHVlID0gMDsKLQotICAgZWxzZSBpZiAodmFsdWUgPj0gMSkKLSAgICAgIHZhbHVlID0gMTsKLQotICAgdmFsdWUgKj0gZGlnaXRpemF0aW9uX2ZhY3RvcjsKLSAgIGlmIChkb19yb3VuZCkgdmFsdWUgKz0gLjU7Ci0gICByZXR1cm4gZmxvb3IodmFsdWUpL2RpZ2l0aXphdGlvbl9mYWN0b3I7Ci19Ci0jZW5kaWYKLSNlbmRpZiAvKiBSR0JfVE9fR1JBWSAqLwotCi0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi1zdGF0aWMgZG91YmxlIGFic2Vycihjb25zdCBwbmdfbW9kaWZpZXIgKnBtLCBpbnQgaW5fZGVwdGgsIGludCBvdXRfZGVwdGgpCi17Ci0gICAvKiBBYnNvbHV0ZSBlcnJvciBwZXJtaXR0ZWQgaW4gbGluZWFyIHZhbHVlcyAtIGFmZmVjdGVkIGJ5IHRoZSBiaXQgZGVwdGggb2YKLSAgICAqIHRoZSBjYWxjdWxhdGlvbnMuCi0gICAgKi8KLSAgIGlmIChwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgfHwKLSAgICAgIChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCi0gICAgICByZXR1cm4gcG0tPm1heGFiczE2OwotICAgZWxzZQotICAgICAgcmV0dXJuIHBtLT5tYXhhYnM4OwotfQotCi1zdGF0aWMgZG91YmxlIGNhbGNlcnIoY29uc3QgcG5nX21vZGlmaWVyICpwbSwgaW50IGluX2RlcHRoLCBpbnQgb3V0X2RlcHRoKQotewotICAgLyogRXJyb3IgaW4gdGhlIGxpbmVhciBjb21wb3NpdGlvbiBhcml0aG1ldGljIC0gb25seSByZWxldmFudCB3aGVuCi0gICAgKiBjb21wb3NpdGlvbiBhY3R1YWxseSBoYXBwZW5zICgwIDwgYWxwaGEgPCAxKS4KLSAgICAqLwotICAgaWYgKChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCi0gICAgICByZXR1cm4gcG0tPm1heGNhbGMxNjsKLSAgIGVsc2UgaWYgKHBtLT5hc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucykKLSAgICAgIHJldHVybiBwbS0+bWF4Y2FsY0c7Ci0gICBlbHNlCi0gICAgICByZXR1cm4gcG0tPm1heGNhbGM4OwotfQotCi1zdGF0aWMgZG91YmxlIHBjZXJyKGNvbnN0IHBuZ19tb2RpZmllciAqcG0sIGludCBpbl9kZXB0aCwgaW50IG91dF9kZXB0aCkKLXsKLSAgIC8qIFBlcmNlbnRhZ2UgZXJyb3IgcGVybWl0dGVkIGluIHRoZSBsaW5lYXIgdmFsdWVzLiAgTm90ZSB0aGF0IHRoZSBzcGVjaWZpZWQKLSAgICAqIHZhbHVlIGlzIGEgcGVyY2VudGFnZSBidXQgdGhpcyByb3V0aW5lIHJldHVybnMgYSBzaW1wbGUgbnVtYmVyLgotICAgICovCi0gICBpZiAocG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zIHx8Ci0gICAgICAocG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID8gaW5fZGVwdGggOiBvdXRfZGVwdGgpID09IDE2KQotICAgICAgcmV0dXJuIHBtLT5tYXhwYzE2ICogLjAxOwotICAgZWxzZQotICAgICAgcmV0dXJuIHBtLT5tYXhwYzggKiAuMDE7Ci19Ci0KLS8qIE91dHB1dCBlcnJvciAtIHRoZSBlcnJvciBpbiB0aGUgZW5jb2RlZCB2YWx1ZS4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLSAqIGRpZ2l0aXphdGlvbiBvZiB0aGUgb3V0cHV0IHNvIGNhbiBiZSArLy0wLjUgaW4gdGhlIGFjdHVhbCBvdXRwdXQgdmFsdWUuICBJbgotICogdGhlIGV4cGFuZF8xNiBjYXNlIHdpdGggdGhlIGN1cnJlbnQgY29kZSBpbiBsaWJwbmcgdGhlIGV4cGFuZCBoYXBwZW5zIGFmdGVyCi0gKiBhbGwgdGhlIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSBpbiA4IGJpdCBhcml0aG1ldGljLCBzbyBldmVuIHRob3VnaCB0aGUgb3V0cHV0Ci0gKiBkZXB0aCBpcyAxNiB0aGUgb3V0cHV0IGVycm9yIGlzIGRldGVybWluZWQgYnkgdGhlIDggYml0IGNhbGN1bGF0aW9uLgotICoKLSAqIFRoaXMgbGltaXQgaXMgbm90IGRldGVybWluZWQgYnkgdGhlIGJpdCBkZXB0aCBvZiBpbnRlcm5hbCBjYWxjdWxhdGlvbnMuCi0gKgotICogVGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgZG9lcyAqbm90KiBpbmNsdWRlIHRoZSBiYXNlIC41IGRpZ2l0aXphdGlvbiBlcnJvciBidXQKLSAqIGl0IGlzIGFkZGVkIGhlcmUuCi0gKi8KLXN0YXRpYyBkb3VibGUgb3V0ZXJyKGNvbnN0IHBuZ19tb2RpZmllciAqcG0sIGludCBpbl9kZXB0aCwgaW50IG91dF9kZXB0aCkKLXsKLSAgIC8qIFRoZXJlIGlzIGEgc2VyaW91cyBlcnJvciBpbiB0aGUgMiBhbmQgNCBiaXQgZ3JheXNjYWxlIHRyYW5zZm9ybSBiZWNhdXNlCi0gICAgKiB0aGUgZ2FtbWEgdGFibGUgdmFsdWUgKDggYml0cykgaXMgc2ltcGx5IHNoaWZ0ZWQsIG5vdCByb3VuZGVkLCBzbyB0aGUKLSAgICAqIGVycm9yIGluIDQgYml0IGdyYXlzY2FsZSBnYW1tYSBpcyB1cCB0byB0aGUgdmFsdWUgYmVsb3cuICBUaGlzIGlzIGEgaGFjawotICAgICogdG8gYWxsb3cgcG5ndmFsaWQgdG8gc3VjY2VlZDoKLSAgICAqCi0gICAgKiBUT0RPOiBmaXggdGhpcyBpbiBsaWJwbmcKLSAgICAqLwotICAgaWYgKG91dF9kZXB0aCA9PSAyKQotICAgICAgcmV0dXJuIC43MzE4Mi0uNTsKLQotICAgaWYgKG91dF9kZXB0aCA9PSA0KQotICAgICAgcmV0dXJuIC45MDY0NC0uNTsKLQotICAgaWYgKChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCi0gICAgICByZXR1cm4gcG0tPm1heG91dDE2OwotCi0gICAvKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSB2YWx1ZSB3YXMgY2FsY3VsYXRlZCBhdCA4LWJpdCBwcmVjaXNpb24gdGhlbgotICAgICogc2NhbGVkIHRvIDE2IGJpdHMuCi0gICAgKi8KLSAgIGVsc2UgaWYgKG91dF9kZXB0aCA9PSAxNikKLSAgICAgIHJldHVybiBwbS0+bWF4b3V0OCAqIDI1NzsKLQotICAgZWxzZQotICAgICAgcmV0dXJuIHBtLT5tYXhvdXQ4OwotfQotCi0vKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGFib3ZlIGhvd2V2ZXIgaXQgcmV0dXJucyB0aGUgdmFsdWUgdG8gbG9nLAotICogcmF0aGVyIHRoYW4gcmFpc2luZyBhIHdhcm5pbmcuICBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRvIHRyYWNrIGRvd24KLSAqIGV4YWN0bHkgd2hhdCBzZXQgb2YgcGFyYW1ldGVycyBjYXVzZSBoaWdoIGVycm9yIHZhbHVlcy4KLSAqLwotc3RhdGljIGRvdWJsZSBvdXRsb2coY29uc3QgcG5nX21vZGlmaWVyICpwbSwgaW50IGluX2RlcHRoLCBpbnQgb3V0X2RlcHRoKQotewotICAgLyogVGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFyZSBlaXRoZXIgOCBiaXQgKDAuLjI1NSkgb3IgMTYgYml0ICgwLi42NTUzNSkKLSAgICAqIGFuZCBzbyBtdXN0IGJlIGFkanVzdGVkIGZvciBsb3cgYml0IGRlcHRoIGdyYXlzY2FsZToKLSAgICAqLwotICAgaWYgKG91dF9kZXB0aCA8PSA4KQotICAgewotICAgICAgaWYgKHBtLT5sb2c4ID09IDApIC8qIHN3aXRjaGVkIG9mZiAqLwotICAgICAgICAgcmV0dXJuIDI1NjsKLQotICAgICAgaWYgKG91dF9kZXB0aCA8IDgpCi0gICAgICAgICByZXR1cm4gcG0tPmxvZzggLyAyNTUgKiAoKDE8PG91dF9kZXB0aCktMSk7Ci0KLSAgICAgIHJldHVybiBwbS0+bG9nODsKLSAgIH0KLQotICAgaWYgKChwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPyBpbl9kZXB0aCA6IG91dF9kZXB0aCkgPT0gMTYpCi0gICB7Ci0gICAgICBpZiAocG0tPmxvZzE2ID09IDApCi0gICAgICAgICByZXR1cm4gNjU1MzY7Ci0KLSAgICAgIHJldHVybiBwbS0+bG9nMTY7Ci0gICB9Ci0KLSAgIC8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHZhbHVlIHdhcyBjYWxjdWxhdGVkIGF0IDgtYml0IHByZWNpc2lvbiB0aGVuCi0gICAgKiBzY2FsZWQgdG8gMTYgYml0cy4KLSAgICAqLwotICAgaWYgKHBtLT5sb2c4ID09IDApCi0gICAgICByZXR1cm4gNjU1MzY7Ci0KLSAgIHJldHVybiBwbS0+bG9nOCAqIDI1NzsKLX0KLQotLyogVGhpcyBjb21wbGVtZW50cyB0aGUgYWJvdmUgYnkgcHJvdmlkaW5nIHRoZSBhcHByb3ByaWF0ZSBxdWFudGl6YXRpb24gZm9yIHRoZQotICogZmluYWwgdmFsdWUuICBOb3JtYWxseSB0aGlzIHdvdWxkIGp1c3QgYmUgcXVhbnRpemF0aW9uIHRvIGFuIGludGVncmFsIHZhbHVlLAotICogYnV0IGluIHRoZSA4IGJpdCBjYWxjdWxhdGlvbiBjYXNlIGl0J3MgYWN0dWFsbHkgcXVhbnRpemF0aW9uIHRvIGEgbXVsdGlwbGUgb2YKLSAqIDI1NyEKLSAqLwotc3RhdGljIGludCBvdXRwdXRfcXVhbnRpemF0aW9uX2ZhY3Rvcihjb25zdCBwbmdfbW9kaWZpZXIgKnBtLCBpbnQgaW5fZGVwdGgsCi0gICBpbnQgb3V0X2RlcHRoKQotewotICAgaWYgKG91dF9kZXB0aCA9PSAxNiAmJiBpbl9kZXB0aCAhPSAxNiAmJgotICAgICAgcG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uKQotICAgICAgcmV0dXJuIDI1NzsKLSAgIGVsc2UKLSAgICAgIHJldHVybiAxOwotfQotI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAqLwotCi0vKiBPbmUgbW9kaWZpY2F0aW9uIHN0cnVjdHVyZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBlYWNoIGNodW5rIHRvIGJlIG1vZGlmaWVkIChpbgotICogZmFjdCBtb3JlIHRoYW4gb25lIGNhbiBiZSBwcm92aWRlZCBpZiBtdWx0aXBsZSBzZXBhcmF0ZSBjaGFuZ2VzIGFyZSBkZXNpcmVkCi0gKiBmb3IgYSBzaW5nbGUgY2h1bmsuKSAgTW9kaWZpY2F0aW9ucyBpbmNsdWRlIGFkZGluZyBhIG5ldyBjaHVuayB3aGVuIGEKLSAqIHN1aXRhYmxlIGNodW5rIGRvZXMgbm90IGV4aXN0LgotICoKLSAqIFRoZSBjYWxsZXIgb2YgbW9kaWZ5X2ZuIHdpbGwgcmVzZXQgdGhlIENSQyBvZiB0aGUgY2h1bmsgYW5kIHJlY29yZCAnbW9kaWZpZWQnCi0gKiBvciAnYWRkZWQnIGFzIGFwcHJvcHJpYXRlIGlmIHRoZSBtb2RpZnlfZm4gcmV0dXJucyAxICh0cnVlKS4gIElmIHRoZQotICogbW9kaWZ5X2ZuIGlzIE5VTEwgdGhlIGNodW5rIGlzIHNpbXBseSByZW1vdmVkLgotICovCi10eXBlZGVmIHN0cnVjdCBwbmdfbW9kaWZpY2F0aW9uCi17Ci0gICBzdHJ1Y3QgcG5nX21vZGlmaWNhdGlvbiAqbmV4dDsKLSAgIHBuZ191aW50XzMyICAgICAgICAgICAgICBjaHVuazsKLQotICAgLyogSWYgdGhlIGZvbGxvd2luZyBpcyBOVUxMIGFsbCBtYXRjaGluZyBjaHVua3Mgd2lsbCBiZSByZW1vdmVkOiAqLwotICAgaW50ICAgICAgICAgICAgICAgICAgICAoKm1vZGlmeV9mbikoc3RydWN0IHBuZ19tb2RpZmllciAqcG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBuZ19tb2RpZmljYXRpb24gKm1lLCBpbnQgYWRkKTsKLQotICAgLyogSWYgdGhlIGZvbGxvd2luZyBpcyBzZXQgdG8gUExURSwgSURBVCBvciBJRU5EIGFuZCB0aGUgY2h1bmsgaGFzIG5vdCBiZWVuCi0gICAgKiBmb3VuZCBhbmQgbW9kaWZpZWQgKGFuZCB0aGVyZSBpcyBhIG1vZGlmeV9mbikgdGhlIG1vZGlmeV9mbiB3aWxsIGJlIGNhbGxlZAotICAgICogdG8gYWRkIHRoZSBjaHVuayBiZWZvcmUgdGhlIHJlbGV2YW50IGNodW5rLgotICAgICovCi0gICBwbmdfdWludF8zMiAgICAgICAgICAgICAgYWRkOwotICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIG1vZGlmaWVkIDoxOyAgICAgLyogQ2h1bmsgd2FzIG1vZGlmaWVkICovCi0gICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgYWRkZWQgICAgOjE7ICAgICAvKiBDaHVuayB3YXMgYWRkZWQgKi8KLSAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICByZW1vdmVkICA6MTsgICAgIC8qIENodW5rIHdhcyByZW1vdmVkICovCi19IHBuZ19tb2RpZmljYXRpb247Ci0KLXN0YXRpYyB2b2lkCi1tb2RpZmljYXRpb25fcmVzZXQocG5nX21vZGlmaWNhdGlvbiAqcG1tKQotewotICAgaWYgKHBtbSAhPSBOVUxMKQotICAgewotICAgICAgcG1tLT5tb2RpZmllZCA9IDA7Ci0gICAgICBwbW0tPmFkZGVkID0gMDsKLSAgICAgIHBtbS0+cmVtb3ZlZCA9IDA7Ci0gICAgICBtb2RpZmljYXRpb25fcmVzZXQocG1tLT5uZXh0KTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1vZGlmaWNhdGlvbl9pbml0KHBuZ19tb2RpZmljYXRpb24gKnBtbSkKLXsKLSAgIG1lbXNldChwbW0sIDAsIHNpemVvZiAqcG1tKTsKLSAgIHBtbS0+bmV4dCA9IE5VTEw7Ci0gICBwbW0tPmNodW5rID0gMDsKLSAgIHBtbS0+bW9kaWZ5X2ZuID0gTlVMTDsKLSAgIHBtbS0+YWRkID0gMDsKLSAgIG1vZGlmaWNhdGlvbl9yZXNldChwbW0pOwotfQotCi0jaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotbW9kaWZpZXJfY3VycmVudF9lbmNvZGluZyhjb25zdCBwbmdfbW9kaWZpZXIgKnBtLCBjb2xvcl9lbmNvZGluZyAqY2UpCi17Ci0gICBpZiAocG0tPmN1cnJlbnRfZW5jb2RpbmcgIT0gMCkKLSAgICAgICpjZSA9ICpwbS0+Y3VycmVudF9lbmNvZGluZzsKLQotICAgZWxzZQotICAgICAgbWVtc2V0KGNlLCAwLCBzaXplb2YgKmNlKTsKLQotICAgY2UtPmdhbW1hID0gcG0tPmN1cnJlbnRfZ2FtbWE7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVECi1zdGF0aWMgc2l6ZV90Ci1zYWZlY2F0X2N1cnJlbnRfZW5jb2RpbmcoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90IHBvcywKLSAgIGNvbnN0IHBuZ19tb2RpZmllciAqcG0pCi17Ci0gICBwb3MgPSBzYWZlY2F0X2NvbG9yX2VuY29kaW5nKGJ1ZmZlciwgYnVmc2l6ZSwgcG9zLCBwbS0+Y3VycmVudF9lbmNvZGluZywKLSAgICAgIHBtLT5jdXJyZW50X2dhbW1hKTsKLQotICAgaWYgKHBtLT5lbmNvZGluZ19pZ25vcmVkKQotICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIGJ1ZnNpemUsIHBvcywgIltvdmVycmlkZGVuXSIpOwotCi0gICByZXR1cm4gcG9zOwotfQotI2VuZGlmCi0KLS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdXNlZnVsbHkgdGVzdGFibGUgY29sb3IgZW5jb2RpbmdzLiAgQW4gZW5jb2RpbmcgaXMgb25lCi0gKiBvZjoKLSAqCi0gKiAxKSBOb3RoaW5nIChubyBjb2xvciBzcGFjZSwgbm8gZ2FtbWEpLgotICogMikgSnVzdCBhIGdhbW1hIHZhbHVlIGZyb20gdGhlIGdhbW1hIGFycmF5IChpbmNsdWRpbmcgMS4wKQotICogMykgQSBjb2xvciBzcGFjZSBmcm9tIHRoZSBlbmNvZGluZ3MgYXJyYXkgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBnYW1tYS4KLSAqIDQpIFRoZSBzYW1lLCBidXQgd2l0aCBnYW1tYSAxLjAgKG9ubHkgcmVhbGx5IHVzZWZ1bCB3aXRoIDE2IGJpdCBjYWxjdWxhdGlvbnMpCi0gKgotICogVGhlIGl0ZXJhdG9yIHNlbGVjdHMgdGhlc2UgaW4gdHVybiwgdGhlIHJhbmRvbWl6ZXIgc2VsZWN0cyBvbmUgYXQgcmFuZG9tLAotICogd2hpY2ggaXMgdXNlZCBkZXBlbmRzIG9uIHRoZSBzZXR0aW5nIG9mIHRoZSAndGVzdF9leGhhdXN0aXZlJyBmbGFnLiAgTm90aWNlCi0gKiB0aGF0IHRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgY29sb3VyIHNwYWNlIGVuY29kaW5nIHNvIGl0IG11c3Qgb25seSBiZQotICogY2FsbGVkIG9uIGNvbXBsZXRpb24gb2YgdGhlIHByZXZpb3VzIHRlc3QuICBUaGlzIGlzIHdoYXQgJ21vZGlmaWVyX3Jlc2V0JwotICogZG9lcywgYmVsb3cuCi0gKgotICogQWZ0ZXIgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB0aGUgJ3JlcGVhdCcgZmxhZyB3aWxsIHN0aWxsIGJlIHNldDsgdGhlCi0gKiBjYWxsZXIgb2YgbW9kaWZpZXJfcmVzZXQgbXVzdCByZXNldCBpdCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBydW4gb2YgdGhlIHRlc3QhCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLW1vZGlmaWVyX3RvdGFsX2VuY29kaW5ncyhjb25zdCBwbmdfbW9kaWZpZXIgKnBtKQotewotICAgcmV0dXJuIDEgKyAgICAgICAgICAgICAgICAgLyogKDEpIG5vdGhpbmcgKi8KLSAgICAgIHBtLT5uZ2FtbWFzICsgICAgICAgICAgIC8qICgyKSBnYW1tYSB2YWx1ZXMgdG8gdGVzdCAqLwotICAgICAgcG0tPm5lbmNvZGluZ3MgKyAgICAgICAgLyogKDMpIHRvdGFsIG51bWJlciBvZiBlbmNvZGluZ3MgKi8KLSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgdGVzdCBvbmx5IHdvcmtzIGFmdGVyIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggdGhlCi0gICAgICAgKiBwbmdfbW9kaWZpZXIgY29kZSBiZWNhdXNlICdiaXRfZGVwdGgnIGlzIHNldCB3aGVuIHRoZSBJSERSIGlzIHJlYWQuCi0gICAgICAgKiBtb2RpZmllcl9yZXNldCwgYmVsb3csIHByZXNlcnZlcyB0aGUgc2V0dGluZyB1bnRpbCBhZnRlciBpdCBoYXMgY2FsbGVkCi0gICAgICAgKiB0aGUgaXRlcmF0ZSBmdW5jdGlvbiAoYWxzbyBiZWxvdy4pCi0gICAgICAgKgotICAgICAgICogRm9yIHRoaXMgcmVhc29uIGRvIG5vdCByZWx5IG9uIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSBhIGNhbGwgdG8KLSAgICAgICAqIG1vZGlmaWVyX3Jlc2V0LgotICAgICAgICovCi0gICAgICAoKHBtLT5iaXRfZGVwdGggPT0gMTYgfHwgcG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zKSA/Ci0gICAgICAgICBwbS0+bmVuY29kaW5ncyA6IDApOyAvKiAoNCkgZW5jb2RpbmdzIHdpdGggZ2FtbWEgPT0gMS4wICovCi19Ci0KLXN0YXRpYyB2b2lkCi1tb2RpZmllcl9lbmNvZGluZ19pdGVyYXRlKHBuZ19tb2RpZmllciAqcG0pCi17Ci0gICBpZiAoIXBtLT5yZXBlYXQgJiYgLyogRWxzZSBzb21ldGhpbmcgbmVlZHMgdGhlIGN1cnJlbnQgZW5jb2RpbmcgYWdhaW4uICovCi0gICAgICBwbS0+dGVzdF91c2VzX2VuY29kaW5nKSAvKiBTb21lIHRyYW5zZm9ybSBpcyBlbmNvZGluZyBkZXBlbmRlbnQgKi8KLSAgIHsKLSAgICAgIGlmIChwbS0+dGVzdF9leGhhdXN0aXZlKQotICAgICAgewotICAgICAgICAgaWYgKCsrcG0tPmVuY29kaW5nX2NvdW50ZXIgPj0gbW9kaWZpZXJfdG90YWxfZW5jb2RpbmdzKHBtKSkKLSAgICAgICAgICAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsgLyogVGhpcyB3aWxsIHN0b3AgdGhlIHJlcGVhdCAqLwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvKiBOb3QgZXhoYXVzdGl2ZSAtIGNob29zZSBhbiBlbmNvZGluZyBhdCByYW5kb207IGdlbmVyYXRlIGEgbnVtYmVyIGluCi0gICAgICAgICAgKiB0aGUgcmFuZ2UgMS4uKG1heC0xKSwgc28gdGhlIHJlc3VsdCBpcyBhbHdheXMgbm9uLXplcm86Ci0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChwbS0+ZW5jb2RpbmdfY291bnRlciA9PSAwKQotICAgICAgICAgICAgcG0tPmVuY29kaW5nX2NvdW50ZXIgPSByYW5kb21fbW9kKG1vZGlmaWVyX3RvdGFsX2VuY29kaW5ncyhwbSktMSkrMTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsKLSAgICAgIH0KLQotICAgICAgaWYgKHBtLT5lbmNvZGluZ19jb3VudGVyID4gMCkKLSAgICAgICAgIHBtLT5yZXBlYXQgPSAxOwotICAgfQotCi0gICBlbHNlIGlmICghcG0tPnJlcGVhdCkKLSAgICAgIHBtLT5lbmNvZGluZ19jb3VudGVyID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLW1vZGlmaWVyX3Jlc2V0KHBuZ19tb2RpZmllciAqcG0pCi17Ci0gICBzdG9yZV9yZWFkX3Jlc2V0KCZwbS0+dGhpcyk7Ci0gICBwbS0+bGltaXQgPSA0RS0zOwotICAgcG0tPnBlbmRpbmdfbGVuID0gcG0tPnBlbmRpbmdfY2h1bmsgPSAwOwotICAgcG0tPmZsdXNoID0gcG0tPmJ1ZmZlcl9jb3VudCA9IHBtLT5idWZmZXJfcG9zaXRpb24gPSAwOwotICAgcG0tPm1vZGlmaWNhdGlvbnMgPSBOVUxMOwotICAgcG0tPnN0YXRlID0gbW9kaWZpZXJfc3RhcnQ7Ci0gICBtb2RpZmllcl9lbmNvZGluZ19pdGVyYXRlKHBtKTsKLSAgIC8qIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBzZXQgaW4gdGhlIG5leHQgcnVuLiAgSW4gcGFydGljdWxhcgotICAgICogdGVzdF91c2VzX2VuY29kaW5ncyBtdXN0IGJlIHNldCBpbiB0aGUgX2luaSBmdW5jdGlvbiBvZiBlYWNoIHRyYW5zZm9ybQotICAgICogdGhhdCBsb29rcyBhdCB0aGUgZW5jb2RpbmdzLiAgKE5vdCB0aGUgJ2FkZCcgZnVuY3Rpb24hKQotICAgICovCi0gICBwbS0+dGVzdF91c2VzX2VuY29kaW5nID0gMDsKLSAgIHBtLT5jdXJyZW50X2dhbW1hID0gMDsKLSAgIHBtLT5jdXJyZW50X2VuY29kaW5nID0gMDsKLSAgIHBtLT5lbmNvZGluZ19pZ25vcmVkID0gMDsKLSAgIC8qIFRoZXNlIG9ubHkgYmVjb21lIHZhbHVlIGFmdGVyIElIRFIgaXMgcmVhZDogKi8KLSAgIHBtLT5iaXRfZGVwdGggPSBwbS0+Y29sb3VyX3R5cGUgPSAwOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvIGdldCB0aGUgZW5jb2Rpbmcgc2V0IHVwCi0gKiBvbiB0aGUgbW9kaWZpZXIuICBJbiBwYXJ0aWN1bGFyIGl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdHJhbnNmb3JtIGluaXQKLSAqIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLgotICovCi1zdGF0aWMgdm9pZAotbW9kaWZpZXJfc2V0X2VuY29kaW5nKHBuZ19tb2RpZmllciAqcG0pCi17Ci0gICAvKiBTZXQgdGhlIGVuY29kaW5nIHRvIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBjdXJyZW50IGVuY29kaW5nIGNvdW50ZXIsCi0gICAgKiBmaXJzdCBjbGVhciBvdXQgYWxsIHRoZSBzZXR0aW5ncyAtIHRoaXMgY29ycmVzcG9uZHMgdG8gYW4gZW5jb2RpbmdfY291bnRlcgotICAgICogb2YgMC4KLSAgICAqLwotICAgcG0tPmN1cnJlbnRfZ2FtbWEgPSAwOwotICAgcG0tPmN1cnJlbnRfZW5jb2RpbmcgPSAwOwotICAgcG0tPmVuY29kaW5nX2lnbm9yZWQgPSAwOyAvKiBub3QgaWdub3JlZCB5ZXQgLSBoYXBwZW5zIGluIF9pbmkgZnVuY3Rpb25zLiAqLwotCi0gICAvKiBOb3csIGlmIHJlcXVpcmVkLCBzZXQgdGhlIGdhbW1hIGFuZCBlbmNvZGluZyBmaWVsZHMuICovCi0gICBpZiAocG0tPmVuY29kaW5nX2NvdW50ZXIgPiAwKQotICAgewotICAgICAgLyogVGhlIGdhbW1hc1tdIGFycmF5IGlzIGFuIGFycmF5IG9mIHNjcmVlbiBnYW1tYXMsIG5vdCBlbmNvZGluZyBnYW1tYXMsCi0gICAgICAgKiBzbyB3ZSBuZWVkIHRoZSBpbnZlcnNlOgotICAgICAgICovCi0gICAgICBpZiAocG0tPmVuY29kaW5nX2NvdW50ZXIgPD0gcG0tPm5nYW1tYXMpCi0gICAgICAgICBwbS0+Y3VycmVudF9nYW1tYSA9IDEvcG0tPmdhbW1hc1twbS0+ZW5jb2RpbmdfY291bnRlci0xXTsKLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgdW5zaWduZWQgaW50IGkgPSBwbS0+ZW5jb2RpbmdfY291bnRlciAtIHBtLT5uZ2FtbWFzOwotCi0gICAgICAgICBpZiAoaSA+PSBwbS0+bmVuY29kaW5ncykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGkgJT0gcG0tPm5lbmNvZGluZ3M7Ci0gICAgICAgICAgICBwbS0+Y3VycmVudF9nYW1tYSA9IDE7IC8qIExpbmVhciwgb25seSBpbiB0aGUgMTYgYml0IGNhc2UgKi8KLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG0tPmN1cnJlbnRfZ2FtbWEgPSBwbS0+ZW5jb2RpbmdzW2ldLmdhbW1hOwotCi0gICAgICAgICBwbS0+Y3VycmVudF9lbmNvZGluZyA9IHBtLT5lbmNvZGluZ3MgKyBpOwotICAgICAgfQotICAgfQotfQotCi0vKiBFbnF1aXJ5IGZ1bmN0aW9ucyB0byBmaW5kIG91dCB3aGF0IGlzIHNldC4gIE5vdGljZSB0aGF0IHRoZXJlIGlzIGFuIGltcGxpY2l0Ci0gKiBhc3N1bXB0aW9uIGJlbG93IHRoYXQgdGhlIGZpcnN0IGVuY29kaW5nIGluIHRoZSBsaXN0IGlzIHRoZSBvbmUgZm9yIHNSR0IuCi0gKi8KLXN0YXRpYyBpbnQKLW1vZGlmaWVyX2NvbG9yX2VuY29kaW5nX2lzX3NSR0IoY29uc3QgcG5nX21vZGlmaWVyICpwbSkKLXsKLSAgIHJldHVybiBwbS0+Y3VycmVudF9lbmNvZGluZyAhPSAwICYmIHBtLT5jdXJyZW50X2VuY29kaW5nID09IHBtLT5lbmNvZGluZ3MgJiYKLSAgICAgIHBtLT5jdXJyZW50X2VuY29kaW5nLT5nYW1tYSA9PSBwbS0+Y3VycmVudF9nYW1tYTsKLX0KLQotc3RhdGljIGludAotbW9kaWZpZXJfY29sb3JfZW5jb2RpbmdfaXNfc2V0KGNvbnN0IHBuZ19tb2RpZmllciAqcG0pCi17Ci0gICByZXR1cm4gcG0tPmN1cnJlbnRfZ2FtbWEgIT0gMDsKLX0KLQotLyogVGhlIGd1dHMgb2YgbW9kaWZpY2F0aW9uIGFyZSBwZXJmb3JtZWQgZHVyaW5nIGEgcmVhZC4gKi8KLXN0YXRpYyB2b2lkCi1tb2RpZmllcl9jcmMocG5nX2J5dGVwIGJ1ZmZlcikKLXsKLSAgIC8qIFJlY2FsY3VsYXRlIHRoZSBjaHVuayBDUkMgLSBhIGNvbXBsZXRlIGNodW5rIG11c3QgYmUgaW4KLSAgICAqIHRoZSBidWZmZXIsIGF0IHRoZSBzdGFydC4KLSAgICAqLwotICAgdUludCBkYXRhbGVuID0gcG5nX2dldF91aW50XzMyKGJ1ZmZlcik7Ci0gICB1TG9uZyBjcmMgPSBjcmMzMigwLCBidWZmZXIrNCwgZGF0YWxlbis0KTsKLSAgIC8qIFRoZSBjYXN0IHRvIHBuZ191aW50XzMyIGlzIHNhZmUgYmVjYXVzZSBhIGNyYzMyIGlzIGFsd2F5cyBhIDMyIGJpdCB2YWx1ZS4KLSAgICAqLwotICAgcG5nX3NhdmVfdWludF8zMihidWZmZXIrZGF0YWxlbis4LCAocG5nX3VpbnRfMzIpY3JjKTsKLX0KLQotc3RhdGljIHZvaWQKLW1vZGlmaWVyX3NldGJ1ZmZlcihwbmdfbW9kaWZpZXIgKnBtKQotewotICAgbW9kaWZpZXJfY3JjKHBtLT5idWZmZXIpOwotICAgcG0tPmJ1ZmZlcl9jb3VudCA9IHBuZ19nZXRfdWludF8zMihwbS0+YnVmZmVyKSsxMjsKLSAgIHBtLT5idWZmZXJfcG9zaXRpb24gPSAwOwotfQotCi0vKiBTZXBhcmF0ZSB0aGUgY2FsbGJhY2sgaW50byB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uICh3aGljaCBpcyBwYXNzZWQgdGhlCi0gKiBwbmdfbW9kaWZpZXIgZXhwbGljaXRseSkgYW5kIHRoZSBjYWxsYmFjaywgd2hpY2ggZ2V0cyB0aGUgbW9kaWZpZXIgZnJvbSB0aGUKLSAqIHBuZ19zdHJ1Y3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1tb2RpZmllcl9yZWFkX2ltcChwbmdfbW9kaWZpZXIgKnBtLCBwbmdfYnl0ZXAgcGIsIHBuZ19zaXplX3Qgc3QpCi17Ci0gICB3aGlsZSAoc3QgPiAwKQotICAgewotICAgICAgc2l6ZV90IGNiOwotICAgICAgcG5nX3VpbnRfMzIgbGVuLCBjaHVuazsKLSAgICAgIHBuZ19tb2RpZmljYXRpb24gKm1vZDsKLQotICAgICAgaWYgKHBtLT5idWZmZXJfcG9zaXRpb24gPj0gcG0tPmJ1ZmZlcl9jb3VudCkgc3dpdGNoIChwbS0+c3RhdGUpCi0gICAgICB7Ci0gICAgICAgICBzdGF0aWMgcG5nX2J5dGUgc2lnbls4XSA9IHsgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMCB9OwotICAgICAgICAgY2FzZSBtb2RpZmllcl9zdGFydDoKLSAgICAgICAgICAgIHN0b3JlX3JlYWRfY2h1bmsoJnBtLT50aGlzLCBwbS0+YnVmZmVyLCA4LCA4KTsgLyogc2lnbmF0dXJlLiAqLwotICAgICAgICAgICAgcG0tPmJ1ZmZlcl9jb3VudCA9IDg7Ci0gICAgICAgICAgICBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKLQotICAgICAgICAgICAgaWYgKG1lbWNtcChwbS0+YnVmZmVyLCBzaWduLCA4KSAhPSAwKQotICAgICAgICAgICAgICAgcG5nX2Vycm9yKHBtLT50aGlzLnByZWFkLCAiaW52YWxpZCBQTkcgZmlsZSBzaWduYXR1cmUiKTsKLSAgICAgICAgICAgIHBtLT5zdGF0ZSA9IG1vZGlmaWVyX3NpZ25hdHVyZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIG1vZGlmaWVyX3NpZ25hdHVyZToKLSAgICAgICAgICAgIHN0b3JlX3JlYWRfY2h1bmsoJnBtLT50aGlzLCBwbS0+YnVmZmVyLCAxMysxMiwgMTMrMTIpOyAvKiBJSERSICovCi0gICAgICAgICAgICBwbS0+YnVmZmVyX2NvdW50ID0gMTMrMTI7Ci0gICAgICAgICAgICBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKLQotICAgICAgICAgICAgaWYgKHBuZ19nZXRfdWludF8zMihwbS0+YnVmZmVyKSAhPSAxMyB8fAotICAgICAgICAgICAgICAgIHBuZ19nZXRfdWludF8zMihwbS0+YnVmZmVyKzQpICE9IENIVU5LX0lIRFIpCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IocG0tPnRoaXMucHJlYWQsICJpbnZhbGlkIElIRFIiKTsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGxpc3Qgb2YgbW9kaWZpZXJzIGZvciBtb2RpZmljYXRpb25zIHRvIHRoZSBJSERSLiAqLwotICAgICAgICAgICAgbW9kID0gcG0tPm1vZGlmaWNhdGlvbnM7Ci0gICAgICAgICAgICB3aGlsZSAobW9kICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAobW9kLT5jaHVuayA9PSBDSFVOS19JSERSICYmIG1vZC0+bW9kaWZ5X2ZuICYmCi0gICAgICAgICAgICAgICAgICAgKCptb2QtPm1vZGlmeV9mbikocG0sIG1vZCwgMCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBtb2QtPm1vZGlmaWVkID0gMTsKLSAgICAgICAgICAgICAgICAgIG1vZGlmaWVyX3NldGJ1ZmZlcihwbSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIC8qIElnbm9yZSByZW1vdmFsIG9yIGFkZCBpZiBJSERSISAqLwotICAgICAgICAgICAgICAgbW9kID0gbW9kLT5uZXh0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDYWNoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBJSERSICh0aGUgbW9kaWZpZWQgb25lLikgKi8KLSAgICAgICAgICAgIHBtLT5iaXRfZGVwdGggPSBwbS0+YnVmZmVyWzgrOF07Ci0gICAgICAgICAgICBwbS0+Y29sb3VyX3R5cGUgPSBwbS0+YnVmZmVyWzgrOCsxXTsKLQotICAgICAgICAgICAgcG0tPnN0YXRlID0gbW9kaWZpZXJfSUhEUjsKLSAgICAgICAgICAgIHBtLT5mbHVzaCA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSBtb2RpZmllcl9JSERSOgotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIFJlYWQgYSBuZXcgY2h1bmsgYW5kIHByb2Nlc3MgaXQgdW50aWwgd2Ugc2VlIFBMVEUsIElEQVQgb3IKLSAgICAgICAgICAgICAqIElFTkQuICAnZmx1c2gnIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIHN0aWxsIHNvbWUgZGF0YSB0bwotICAgICAgICAgICAgICogb3V0cHV0IGZyb20gdGhlIHByZWNlZGluZyBjaHVuay4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChjYiA9IHBtLT5mbHVzaCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGNiID4gc3QpIGNiID0gc3Q7Ci0gICAgICAgICAgICAgICBwbS0+Zmx1c2ggLT0gY2I7Ci0gICAgICAgICAgICAgICBzdG9yZV9yZWFkX2NodW5rKCZwbS0+dGhpcywgcGIsIGNiLCBjYik7Ci0gICAgICAgICAgICAgICBwYiArPSBjYjsKLSAgICAgICAgICAgICAgIHN0IC09IGNiOwotICAgICAgICAgICAgICAgaWYgKHN0ID09IDApIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogTm8gbW9yZSBieXRlcyB0byBmbHVzaCwgcmVhZCBhIGhlYWRlciwgb3IgaGFuZGxlIGEgcGVuZGluZwotICAgICAgICAgICAgICogY2h1bmsuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwbS0+cGVuZGluZ19jaHVuayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyLCBwbS0+cGVuZGluZ19sZW4pOwotICAgICAgICAgICAgICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzQsIHBtLT5wZW5kaW5nX2NodW5rKTsKLSAgICAgICAgICAgICAgIHBtLT5wZW5kaW5nX2xlbiA9IDA7Ci0gICAgICAgICAgICAgICBwbS0+cGVuZGluZ19jaHVuayA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBzdG9yZV9yZWFkX2NodW5rKCZwbS0+dGhpcywgcG0tPmJ1ZmZlciwgOCwgOCk7Ci0KLSAgICAgICAgICAgIHBtLT5idWZmZXJfY291bnQgPSA4OwotICAgICAgICAgICAgcG0tPmJ1ZmZlcl9wb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIGZvciBzb21ldGhpbmcgdG8gbW9kaWZ5IG9yIGEgdGVybWluYXRvciBjaHVuay4gKi8KLSAgICAgICAgICAgIGxlbiA9IHBuZ19nZXRfdWludF8zMihwbS0+YnVmZmVyKTsKLSAgICAgICAgICAgIGNodW5rID0gcG5nX2dldF91aW50XzMyKHBtLT5idWZmZXIrNCk7Ci0KLSAgICAgICAgICAgIC8qIFRlcm1pbmF0b3JzIGZpcnN0LCB0aGV5IG1heSBoYXZlIHRvIGJlIGRlbGF5ZWQgZm9yIGFkZGVkCi0gICAgICAgICAgICAgKiBjaHVua3MKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGNodW5rID09IENIVU5LX1BMVEUgfHwgY2h1bmsgPT0gQ0hVTktfSURBVCB8fAotICAgICAgICAgICAgICAgIGNodW5rID09IENIVU5LX0lFTkQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBtb2QgPSBwbS0+bW9kaWZpY2F0aW9uczsKLQotICAgICAgICAgICAgICAgd2hpbGUgKG1vZCAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKChtb2QtPmFkZCA9PSBjaHVuayB8fAotICAgICAgICAgICAgICAgICAgICAgIChtb2QtPmFkZCA9PSBDSFVOS19QTFRFICYmIGNodW5rID09IENIVU5LX0lEQVQpKSAmJgotICAgICAgICAgICAgICAgICAgICAgIG1vZC0+bW9kaWZ5X2ZuICE9IE5VTEwgJiYgIW1vZC0+bW9kaWZpZWQgJiYgIW1vZC0+YWRkZWQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAvKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIG1vZGlmeSBmdW5jdGlvbiBkb2VzIGRvIG5vdCBydW4KLSAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgIG1vZC0+YWRkZWQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAoKCptb2QtPm1vZGlmeV9mbikocG0sIG1vZCwgMSAvKmFkZCovKSkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBDUkMgb24gYSBuZXcgY2h1bmsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbS0+YnVmZmVyX2NvdW50ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyX3NldGJ1ZmZlcihwbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtLT5idWZmZXJfcG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLT5yZW1vdmVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQgd2l0aCBzb21ldGhpbmcgKHdlIGFzc3VtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvIG91dHB1dCB0aGlzLiAgUGVuZCB0aGUgY3VycmVudCBjaHVuay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcG0tPnBlbmRpbmdfbGVuID0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgcG0tPnBlbmRpbmdfY2h1bmsgPSBjaHVuazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBvdXQgb2Ygd2hpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgbW9kID0gbW9kLT5uZXh0OwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAvKiBEb24ndCBkbyBhbnkgZnVydGhlciBwcm9jZXNzaW5nIGlmIHRoZSBidWZmZXIgd2FzIG1vZGlmaWVkIC0KLSAgICAgICAgICAgICAgICAqIG90aGVyd2lzZSB0aGUgY29kZSB3aWxsIGVuZCB1cCBtb2RpZnlpbmcgYSBjaHVuayB0aGF0IHdhcwotICAgICAgICAgICAgICAgICoganVzdCBhZGRlZC4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgaWYgKG1vZCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG91dCBvZiBzd2l0Y2ggKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogSWYgd2UgZ2V0IHRvIGhlcmUgdGhlbiB0aGlzIGNodW5rIG1heSBuZWVkIHRvIGJlIG1vZGlmaWVkLiAgVG8KLSAgICAgICAgICAgICAqIGRvIHRoaXMgaXQgbXVzdCBiZSBsZXNzIHRoYW4gMTAyNCBieXRlcyBpbiB0b3RhbCBzaXplLCBvdGhlcndpc2UKLSAgICAgICAgICAgICAqIGl0IGp1c3QgZ2V0cyBmbHVzaGVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobGVuKzEyIDw9IHNpemVvZiBwbS0+YnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3NpemVfdCBzID0gbGVuKzEyLXBtLT5idWZmZXJfY291bnQ7Ci0gICAgICAgICAgICAgICBzdG9yZV9yZWFkX2NodW5rKCZwbS0+dGhpcywgcG0tPmJ1ZmZlcitwbS0+YnVmZmVyX2NvdW50LCBzLCBzKTsKLSAgICAgICAgICAgICAgIHBtLT5idWZmZXJfY291bnQgPSBsZW4rMTI7Ci0KLSAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIG1vZGlmaWNhdGlvbiwgZWxzZSBsZWF2ZSBpdCBiZS4gKi8KLSAgICAgICAgICAgICAgIG1vZCA9IHBtLT5tb2RpZmljYXRpb25zOwotICAgICAgICAgICAgICAgd2hpbGUgKG1vZCAhPSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKG1vZC0+Y2h1bmsgPT0gY2h1bmspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobW9kLT5tb2RpZnlfZm4gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGlzIGNodW5rICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwbS0+YnVmZmVyX2NvdW50ID0gcG0tPmJ1ZmZlcl9wb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2QtPnJlbW92ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIFRlcm1pbmF0ZSB0aGUgd2hpbGUgbG9vcCAqLwotICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoKm1vZC0+bW9kaWZ5X2ZuKShwbSwgbW9kLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZC0+bW9kaWZpZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGNodW5rIG1heSBoYXZlIGJlZW4gcmVtb3ZlZDogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbS0+YnVmZmVyX2NvdW50ID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJfc2V0YnVmZmVyKHBtKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgbW9kID0gbW9kLT5uZXh0OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwbS0+Zmx1c2ggPSBsZW4rMTIgLSBwbS0+YnVmZmVyX2NvdW50OyAvKiBkYXRhICsgY3JjICovCi0KLSAgICAgICAgICAgIC8qIFRha2UgdGhlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIChpZiB0aGVyZSBpcyBhbnkpLiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEhlcmUgdG8gcmVhZCBmcm9tIHRoZSBtb2RpZmllciBidWZmZXIgKG5vdCBkaXJlY3RseSBmcm9tCi0gICAgICAgKiB0aGUgc3RvcmUsIGFzIGluIHRoZSBmbHVzaCBjYXNlIGFib3ZlLikKLSAgICAgICAqLwotICAgICAgY2IgPSBwbS0+YnVmZmVyX2NvdW50IC0gcG0tPmJ1ZmZlcl9wb3NpdGlvbjsKLQotICAgICAgaWYgKGNiID4gc3QpCi0gICAgICAgICBjYiA9IHN0OwotCi0gICAgICBtZW1jcHkocGIsIHBtLT5idWZmZXIgKyBwbS0+YnVmZmVyX3Bvc2l0aW9uLCBjYik7Ci0gICAgICBzdCAtPSBjYjsKLSAgICAgIHBiICs9IGNiOwotICAgICAgcG0tPmJ1ZmZlcl9wb3NpdGlvbiArPSBjYjsKLSAgIH0KLX0KLQotLyogVGhlIGNhbGxiYWNrOiAqLwotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLW1vZGlmaWVyX3JlYWQocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2J5dGVwIHBiLCBwbmdfc2l6ZV90IHN0KQotewotICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOwotICAgcG5nX21vZGlmaWVyICpwbSA9IHZvaWRjYXN0KHBuZ19tb2RpZmllciosIHBuZ19nZXRfaW9fcHRyKHBwKSk7Ci0KLSAgIGlmIChwbSA9PSBOVUxMIHx8IHBtLT50aGlzLnByZWFkICE9IHBwKQotICAgICAgcG5nX2Vycm9yKHBwLCAiYmFkIG1vZGlmaWVyX3JlYWQgY2FsbCIpOwotCi0gICBtb2RpZmllcl9yZWFkX2ltcChwbSwgcGIsIHN0KTsKLX0KLQotLyogTGlrZSBzdG9yZV9wcm9ncmVzc2l2ZV9yZWFkIGJ1dCB0aGUgZGF0YSBpcyBnZXR0aW5nIGNoYW5nZWQgYXMgd2UgZ28gc28gd2UKLSAqIG5lZWQgYSBsb2NhbCBidWZmZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1tb2RpZmllcl9wcm9ncmVzc2l2ZV9yZWFkKHBuZ19tb2RpZmllciAqcG0sIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBpZiAocG0tPnRoaXMucHJlYWQgIT0gcHAgfHwgcG0tPnRoaXMuY3VycmVudCA9PSBOVUxMIHx8Ci0gICAgICAgcG0tPnRoaXMubmV4dCA9PSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBwLCAic3RvcmUgc3RhdGUgZGFtYWdlZCAocHJvZ3Jlc3NpdmUpIik7Ci0KLSAgIC8qIFRoaXMgaXMgYW5vdGhlciBIb3Jvd2l0eiBhbmQgSGlsbCByYW5kb20gbm9pc2UgZ2VuZXJhdG9yLiAgSW4gdGhpcyBjYXNlCi0gICAgKiB0aGUgYWltIGlzIHRvIHN0cmVzcyB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIHdpdGggdHJ1bHkgaG9ycmlibGUgdmFyaWFibGUKLSAgICAqIGJ1ZmZlciBzaXplcyBpbiB0aGUgcmFuZ2UgMS4uNTAwLCBzbyBhIHNlcXVlbmNlIG9mIDkgYml0IHJhbmRvbSBudW1iZXJzCi0gICAgKiBpcyBnZW5lcmF0ZWQuICBXZSBjb3VsZCBwcm9iYWJseSBqdXN0IGNvdW50IGZyb20gMSB0byAzMjc2NyBhbmQgZ2V0IGFzCi0gICAgKiBnb29kIGEgcmVzdWx0LgotICAgICovCi0gICBmb3IgKDs7KQotICAgewotICAgICAgc3RhdGljIHBuZ191aW50XzMyIG5vaXNlID0gMTsKLSAgICAgIHBuZ19zaXplX3QgY2IsIGNiQXZhaWw7Ci0gICAgICBwbmdfYnl0ZSBidWZmZXJbNTEyXTsKLQotICAgICAgLyogR2VuZXJhdGUgMTUgbW9yZSBiaXRzIG9mIHN0dWZmOiAqLwotICAgICAgbm9pc2UgPSAobm9pc2UgPDwgOSkgfCAoKG5vaXNlIF4gKG5vaXNlID4+ICg5LTUpKSkgJiAweDFmZik7Ci0gICAgICBjYiA9IG5vaXNlICYgMHgxZmY7Ci0KLSAgICAgIC8qIENoZWNrIHRoYXQgdGhpcyBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZSAoaW4gdGhlIGN1cnJlbnQgYnVmZmVyLikKLSAgICAgICAqIChUaGlzIGRvZXNuJ3QgcXVpdGUgd29yayAtIHRoZSBtb2RpZmllciBtaWdodCBkZWxldGUgYSBjaHVuazsgdW5saWtlbHkKLSAgICAgICAqIGJ1dCBwb3NzaWJsZSwgaXQgZG9lc24ndCBoYXBwZW4gYXQgcHJlc2VudCBiZWNhdXNlIHRoZSBtb2RpZmllciBvbmx5Ci0gICAgICAgKiBhZGRzIGNodW5rcyB0byBzdGFuZGFyZCBpbWFnZXMuKQotICAgICAgICovCi0gICAgICBjYkF2YWlsID0gc3RvcmVfcmVhZF9idWZmZXJfYXZhaWwoJnBtLT50aGlzKTsKLSAgICAgIGlmIChwbS0+YnVmZmVyX2NvdW50ID4gcG0tPmJ1ZmZlcl9wb3NpdGlvbikKLSAgICAgICAgIGNiQXZhaWwgKz0gcG0tPmJ1ZmZlcl9jb3VudCAtIHBtLT5idWZmZXJfcG9zaXRpb247Ci0KLSAgICAgIGlmIChjYiA+IGNiQXZhaWwpCi0gICAgICB7Ci0gICAgICAgICAvKiBDaGVjayBmb3IgRU9GOiAqLwotICAgICAgICAgaWYgKGNiQXZhaWwgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYiA9IGNiQXZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIG1vZGlmaWVyX3JlYWRfaW1wKHBtLCBidWZmZXIsIGNiKTsKLSAgICAgIHBuZ19wcm9jZXNzX2RhdGEocHAsIHBpLCBidWZmZXIsIGNiKTsKLSAgIH0KLQotICAgLyogQ2hlY2sgdGhlIGludmFyaWFudHMgYXQgdGhlIGVuZCAoaWYgdGhpcyBmYWlscyBpdCdzIGEgcHJvYmxlbSBpbiB0aGlzCi0gICAgKiBmaWxlISkKLSAgICAqLwotICAgaWYgKHBtLT5idWZmZXJfY291bnQgPiBwbS0+YnVmZmVyX3Bvc2l0aW9uIHx8Ci0gICAgICAgcG0tPnRoaXMubmV4dCAhPSAmcG0tPnRoaXMuY3VycmVudC0+ZGF0YSB8fAotICAgICAgIHBtLT50aGlzLnJlYWRwb3MgPCBwbS0+dGhpcy5jdXJyZW50LT5kYXRhY291bnQpCi0gICAgICBwbmdfZXJyb3IocHAsICJwcm9ncmVzc2l2ZSByZWFkIGltcGxlbWVudGF0aW9uIGVycm9yIik7Ci19Ci0KLS8qIFNldCB1cCBhIG1vZGlmaWVyLiAqLwotc3RhdGljIHBuZ19zdHJ1Y3RwCi1zZXRfbW9kaWZpZXJfZm9yX3JlYWQocG5nX21vZGlmaWVyICpwbSwgcG5nX2luZm9wcCBwcGksIHBuZ191aW50XzMyIGlkLAotICAgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAvKiBEbyB0aGlzIGZpcnN0IHNvIHRoYXQgdGhlIG1vZGlmaWVyIGZpZWxkcyBhcmUgY2xlYXJlZCBldmVuIGlmIGFuIGVycm9yCi0gICAgKiBoYXBwZW5zIGFsbG9jYXRpbmcgdGhlIHBuZ19zdHJ1Y3QuICBObyBhbGxvY2F0aW9uIGlzIGRvbmUgaGVyZSBzbyBubwotICAgICogY2xlYW51cCBpcyByZXF1aXJlZC4KLSAgICAqLwotICAgcG0tPnN0YXRlID0gbW9kaWZpZXJfc3RhcnQ7Ci0gICBwbS0+Yml0X2RlcHRoID0gMDsKLSAgIHBtLT5jb2xvdXJfdHlwZSA9IDI1NTsKLQotICAgcG0tPnBlbmRpbmdfbGVuID0gMDsKLSAgIHBtLT5wZW5kaW5nX2NodW5rID0gMDsKLSAgIHBtLT5mbHVzaCA9IDA7Ci0gICBwbS0+YnVmZmVyX2NvdW50ID0gMDsKLSAgIHBtLT5idWZmZXJfcG9zaXRpb24gPSAwOwotCi0gICByZXR1cm4gc2V0X3N0b3JlX2Zvcl9yZWFkKCZwbS0+dGhpcywgcHBpLCBpZCwgbmFtZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1PRElGSUNBVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YW5kYXJkIG1vZGlmaWNhdGlvbnMgdG8gYWRkIGNodW5rcy4gIFRoZXNlIGRvIG5vdCByZXF1aXJlIHRoZSBfU1VQUE9SVEVECi0gKiBtYWNyb3MgYmVjYXVzZSB0aGUgY2h1bmtzIGNhbiBiZSB0aGVyZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzcGVjaWZpYwotICogbGlicG5nIHN1cHBvcnRzIHRoZW0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IGdhbWFfbW9kaWZpY2F0aW9uCi17Ci0gICBwbmdfbW9kaWZpY2F0aW9uIHRoaXM7Ci0gICBwbmdfZml4ZWRfcG9pbnQgIGdhbW1hOwotfSBnYW1hX21vZGlmaWNhdGlvbjsKLQotc3RhdGljIGludAotZ2FtYV9tb2RpZnkocG5nX21vZGlmaWVyICpwbSwgcG5nX21vZGlmaWNhdGlvbiAqbWUsIGludCBhZGQpCi17Ci0gICBVTlVTRUQoYWRkKQotICAgLyogVGhpcyBzaW1wbHkgZHVtcHMgdGhlIGdpdmVuIGdhbW1hIHZhbHVlIGludG8gdGhlIGJ1ZmZlci4gKi8KLSAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlciwgNCk7Ci0gICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrNCwgQ0hVTktfZ0FNQSk7Ci0gICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrOCwgKChnYW1hX21vZGlmaWNhdGlvbiopbWUpLT5nYW1tYSk7Ci0gICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLWdhbWFfbW9kaWZpY2F0aW9uX2luaXQoZ2FtYV9tb2RpZmljYXRpb24gKm1lLCBwbmdfbW9kaWZpZXIgKnBtLCBkb3VibGUgZ2FtbWFkKQotewotICAgZG91YmxlIGc7Ci0KLSAgIG1vZGlmaWNhdGlvbl9pbml0KCZtZS0+dGhpcyk7Ci0gICBtZS0+dGhpcy5jaHVuayA9IENIVU5LX2dBTUE7Ci0gICBtZS0+dGhpcy5tb2RpZnlfZm4gPSBnYW1hX21vZGlmeTsKLSAgIG1lLT50aGlzLmFkZCA9IENIVU5LX1BMVEU7Ci0gICBnID0gZml4KGdhbW1hZCk7Ci0gICBtZS0+Z2FtbWEgPSAocG5nX2ZpeGVkX3BvaW50KWc7Ci0gICBtZS0+dGhpcy5uZXh0ID0gcG0tPm1vZGlmaWNhdGlvbnM7Ci0gICBwbS0+bW9kaWZpY2F0aW9ucyA9ICZtZS0+dGhpczsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgY2hybV9tb2RpZmljYXRpb24KLXsKLSAgIHBuZ19tb2RpZmljYXRpb24gICAgICAgICAgdGhpczsKLSAgIGNvbnN0IGNvbG9yX2VuY29kaW5nICplbmNvZGluZzsKLSAgIHBuZ19maXhlZF9wb2ludCAgICAgICAgICAgd3gsIHd5LCByeCwgcnksIGd4LCBneSwgYngsIGJ5OwotfSBjaHJtX21vZGlmaWNhdGlvbjsKLQotc3RhdGljIGludAotY2hybV9tb2RpZnkocG5nX21vZGlmaWVyICpwbSwgcG5nX21vZGlmaWNhdGlvbiAqbWUsIGludCBhZGQpCi17Ci0gICBVTlVTRUQoYWRkKQotICAgLyogQXMgd2l0aCBnQU1BIHRoaXMganVzdCBhZGRzIHRoZSByZXF1aXJlZCBjSFJNIGNodW5rIHRvIHRoZSBidWZmZXIuICovCi0gICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIgICAsIDMyKTsKLSAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlcisgNCwgQ0hVTktfY0hSTSk7Ci0gICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrIDgsICgoY2hybV9tb2RpZmljYXRpb24qKW1lKS0+d3gpOwotICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzEyLCAoKGNocm1fbW9kaWZpY2F0aW9uKiltZSktPnd5KTsKLSAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlcisxNiwgKChjaHJtX21vZGlmaWNhdGlvbiopbWUpLT5yeCk7Ci0gICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrMjAsICgoY2hybV9tb2RpZmljYXRpb24qKW1lKS0+cnkpOwotICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzI0LCAoKGNocm1fbW9kaWZpY2F0aW9uKiltZSktPmd4KTsKLSAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlcisyOCwgKChjaHJtX21vZGlmaWNhdGlvbiopbWUpLT5neSk7Ci0gICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIrMzIsICgoY2hybV9tb2RpZmljYXRpb24qKW1lKS0+YngpOwotICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzM2LCAoKGNocm1fbW9kaWZpY2F0aW9uKiltZSktPmJ5KTsKLSAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotY2hybV9tb2RpZmljYXRpb25faW5pdChjaHJtX21vZGlmaWNhdGlvbiAqbWUsIHBuZ19tb2RpZmllciAqcG0sCi0gICBjb25zdCBjb2xvcl9lbmNvZGluZyAqZW5jb2RpbmcpCi17Ci0gICBDSUVfY29sb3Igd2hpdGUgPSB3aGl0ZV9wb2ludChlbmNvZGluZyk7Ci0KLSAgIC8qIE9yaWdpbmFsIGVuZCBwb2ludHM6ICovCi0gICBtZS0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKLQotICAgLyogQ2hyb21hdGljaXRpZXMgKGluIGZpeGVkIHBvaW50KTogKi8KLSAgIG1lLT53eCA9IGZpeChjaHJvbWF0aWNpdHlfeCh3aGl0ZSkpOwotICAgbWUtPnd5ID0gZml4KGNocm9tYXRpY2l0eV95KHdoaXRlKSk7Ci0KLSAgIG1lLT5yeCA9IGZpeChjaHJvbWF0aWNpdHlfeChlbmNvZGluZy0+cmVkKSk7Ci0gICBtZS0+cnkgPSBmaXgoY2hyb21hdGljaXR5X3koZW5jb2RpbmctPnJlZCkpOwotICAgbWUtPmd4ID0gZml4KGNocm9tYXRpY2l0eV94KGVuY29kaW5nLT5ncmVlbikpOwotICAgbWUtPmd5ID0gZml4KGNocm9tYXRpY2l0eV95KGVuY29kaW5nLT5ncmVlbikpOwotICAgbWUtPmJ4ID0gZml4KGNocm9tYXRpY2l0eV94KGVuY29kaW5nLT5ibHVlKSk7Ci0gICBtZS0+YnkgPSBmaXgoY2hyb21hdGljaXR5X3koZW5jb2RpbmctPmJsdWUpKTsKLQotICAgbW9kaWZpY2F0aW9uX2luaXQoJm1lLT50aGlzKTsKLSAgIG1lLT50aGlzLmNodW5rID0gQ0hVTktfY0hSTTsKLSAgIG1lLT50aGlzLm1vZGlmeV9mbiA9IGNocm1fbW9kaWZ5OwotICAgbWUtPnRoaXMuYWRkID0gQ0hVTktfUExURTsKLSAgIG1lLT50aGlzLm5leHQgPSBwbS0+bW9kaWZpY2F0aW9uczsKLSAgIHBtLT5tb2RpZmljYXRpb25zID0gJm1lLT50aGlzOwotfQotCi10eXBlZGVmIHN0cnVjdCBzcmdiX21vZGlmaWNhdGlvbgotewotICAgcG5nX21vZGlmaWNhdGlvbiB0aGlzOwotICAgcG5nX2J5dGUgICAgICAgICBpbnRlbnQ7Ci19IHNyZ2JfbW9kaWZpY2F0aW9uOwotCi1zdGF0aWMgaW50Ci1zcmdiX21vZGlmeShwbmdfbW9kaWZpZXIgKnBtLCBwbmdfbW9kaWZpY2F0aW9uICptZSwgaW50IGFkZCkKLXsKLSAgIFVOVVNFRChhZGQpCi0gICAvKiBBcyBhYm92ZSwgaWdub3JlIGFkZCBhbmQganVzdCBtYWtlIGEgbmV3IGNodW5rICovCi0gICBwbmdfc2F2ZV91aW50XzMyKHBtLT5idWZmZXIsIDEpOwotICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzQsIENIVU5LX3NSR0IpOwotICAgcG0tPmJ1ZmZlcls4XSA9ICgoc3JnYl9tb2RpZmljYXRpb24qKW1lKS0+aW50ZW50OwotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zcmdiX21vZGlmaWNhdGlvbl9pbml0KHNyZ2JfbW9kaWZpY2F0aW9uICptZSwgcG5nX21vZGlmaWVyICpwbSwgcG5nX2J5dGUgaW50ZW50KQotewotICAgbW9kaWZpY2F0aW9uX2luaXQoJm1lLT50aGlzKTsKLSAgIG1lLT50aGlzLmNodW5rID0gQ0hVTktfc0JJVDsKLQotICAgaWYgKGludGVudCA8PSAzKSAvKiBpZiB2YWxpZCwgZWxzZSAqZGVsZXRlKiBzUkdCIGNodW5rcyAqLwotICAgewotICAgICAgbWUtPnRoaXMubW9kaWZ5X2ZuID0gc3JnYl9tb2RpZnk7Ci0gICAgICBtZS0+dGhpcy5hZGQgPSBDSFVOS19QTFRFOwotICAgICAgbWUtPmludGVudCA9IGludGVudDsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgbWUtPnRoaXMubW9kaWZ5X2ZuID0gMDsKLSAgICAgIG1lLT50aGlzLmFkZCA9IDA7Ci0gICAgICBtZS0+aW50ZW50ID0gMDsKLSAgIH0KLQotICAgbWUtPnRoaXMubmV4dCA9IHBtLT5tb2RpZmljYXRpb25zOwotICAgcG0tPm1vZGlmaWNhdGlvbnMgPSAmbWUtPnRoaXM7Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQKLXR5cGVkZWYgc3RydWN0IHNiaXRfbW9kaWZpY2F0aW9uCi17Ci0gICBwbmdfbW9kaWZpY2F0aW9uIHRoaXM7Ci0gICBwbmdfYnl0ZSAgICAgICAgIHNiaXQ7Ci19IHNiaXRfbW9kaWZpY2F0aW9uOwotCi1zdGF0aWMgaW50Ci1zYml0X21vZGlmeShwbmdfbW9kaWZpZXIgKnBtLCBwbmdfbW9kaWZpY2F0aW9uICptZSwgaW50IGFkZCkKLXsKLSAgIHBuZ19ieXRlIHNiaXQgPSAoKHNiaXRfbW9kaWZpY2F0aW9uKiltZSktPnNiaXQ7Ci0gICBpZiAocG0tPmJpdF9kZXB0aCA+IHNiaXQpCi0gICB7Ci0gICAgICBpbnQgY2IgPSAwOwotICAgICAgc3dpdGNoIChwbS0+Y29sb3VyX3R5cGUpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBjYiA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSAyOgotICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgY2IgPSAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNiID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBjYiA9IDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBuZ19lcnJvcihwbS0+dGhpcy5wcmVhZCwKLSAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGNvbG91ciB0eXBlIGluIHNCSVQgbW9kaWZpY2F0aW9uIik7Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19zYXZlX3VpbnRfMzIocG0tPmJ1ZmZlciwgY2IpOwotICAgICAgcG5nX3NhdmVfdWludF8zMihwbS0+YnVmZmVyKzQsIENIVU5LX3NCSVQpOwotCi0gICAgICB3aGlsZSAoY2IgPiAwKQotICAgICAgICAgKHBtLT5idWZmZXIrOClbLS1jYl0gPSBzYml0OwotCi0gICAgICByZXR1cm4gMTsKLSAgIH0KLSAgIGVsc2UgaWYgKCFhZGQpCi0gICB7Ci0gICAgICAvKiBSZW1vdmUgdGhlIHNCSVQgY2h1bmsgKi8KLSAgICAgIHBtLT5idWZmZXJfY291bnQgPSBwbS0+YnVmZmVyX3Bvc2l0aW9uID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgfQotICAgZWxzZQotICAgICAgcmV0dXJuIDA7IC8qIGRvIG5vdGhpbmcgKi8KLX0KLQotc3RhdGljIHZvaWQKLXNiaXRfbW9kaWZpY2F0aW9uX2luaXQoc2JpdF9tb2RpZmljYXRpb24gKm1lLCBwbmdfbW9kaWZpZXIgKnBtLCBwbmdfYnl0ZSBzYml0KQotewotICAgbW9kaWZpY2F0aW9uX2luaXQoJm1lLT50aGlzKTsKLSAgIG1lLT50aGlzLmNodW5rID0gQ0hVTktfc0JJVDsKLSAgIG1lLT50aGlzLm1vZGlmeV9mbiA9IHNiaXRfbW9kaWZ5OwotICAgbWUtPnRoaXMuYWRkID0gQ0hVTktfUExURTsKLSAgIG1lLT5zYml0ID0gc2JpdDsKLSAgIG1lLT50aGlzLm5leHQgPSBwbS0+bW9kaWZpY2F0aW9uczsKLSAgIHBtLT5tb2RpZmljYXRpb25zID0gJm1lLT50aGlzOwotfQotI2VuZGlmIC8qIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCAqLwotI2VuZGlmIC8qIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEFOREFSRCBQTkcgRklMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGFuZGFyZCBmaWxlcyAtIHdyaXRlIGFuZCBzYXZlIHN0YW5kYXJkIGZpbGVzLiAqLwotLyogVGhlcmUgYXJlIHR3byBiYXNpYyBmb3JtcyBvZiBzdGFuZGFyZCBpbWFnZXMuICBUaG9zZSB3aGljaCBhdHRlbXB0IHRvIGhhdmUKLSAqIGFsbCB0aGUgcG9zc2libGUgcGl4ZWwgdmFsdWVzIChub3QgcG9zc2libGUgZm9yIDE2YnBwIGltYWdlcywgYnV0IGEgcmFuZ2Ugb2YKLSAqIHZhbHVlcyBhcmUgcHJvZHVjZWQpIGFuZCB0aG9zZSB3aGljaCBoYXZlIGEgcmFuZ2Ugb2YgaW1hZ2Ugc2l6ZXMuICBUaGUgZm9ybWVyCi0gKiBhcmUgdXNlZCBmb3IgdGVzdGluZyB0cmFuc2Zvcm1zLCBpbiBwYXJ0aWN1bGFyIGdhbW1hIGNvcnJlY3Rpb24gYW5kIGJpdAotICogcmVkdWN0aW9uIGFuZCBpbmNyZWFzZS4gIFRoZSBsYXR0ZXIgYXJlIHJlc2VydmVkIGZvciB0ZXN0aW5nIHRoZSBiZWhhdmlvciBvZgotICogbGlicG5nIHdpdGggcmVzcGVjdCB0byAnb2RkJyBpbWFnZSBzaXplcyAtIHBhcnRpY3VsYXJseSBzbWFsbCBpbWFnZXMgd2hlcmUKLSAqIHJvd3MgYmVjb21lIDEgYnl0ZSBhbmQgaW50ZXJsYWNlIHBhc3NlcyBkaXNhcHBlYXIuCi0gKgotICogVGhlIGZpcnN0LCBtb3N0IHVzZWZ1bCwgc2V0IGFyZSB0aGUgJ3RyYW5zZm9ybScgaW1hZ2VzLCB0aGUgc2Vjb25kIHNldCBvZgotICogc21hbGwgaW1hZ2VzIGFyZSB0aGUgJ3NpemUnIGltYWdlcy4KLSAqCi0gKiBUaGUgdHJhbnNmb3JtIGZpbGVzIGFyZSBjb25zdHJ1Y3RlZCB3aXRoIHJvd3Mgd2hpY2ggZml0IGludG8gYSAxMDI0IGJ5dGUgcm93Ci0gKiBidWZmZXIuICBUaGlzIG1ha2VzIGFsbG9jYXRpb24gZWFzaWVyIGJlbG93LiAgRnVydGhlciByZWdhcmRsZXNzIG9mIHRoZSBmaWxlCi0gKiBmb3JtYXQgZXZlcnkgcm93IGhhcyAxMjggcGl4ZWxzIChnaXZpbmcgMTAyNCBieXRlcyBmb3IgNjRicHAgZm9ybWF0cykuCi0gKgotICogRmlsZXMgYXJlIHN0b3JlZCB3aXRoIG5vIGdBTUEgb3Igc0JJVCBjaHVua3MsIHdpdGggYSBQTFRFIG9ubHkgd2hlbiBuZWVkZWQKLSAqIGFuZCB3aXRoIGFuIElEIGRlcml2ZWQgZnJvbSB0aGUgY29sb3VyIHR5cGUsIGJpdCBkZXB0aCBhbmQgaW50ZXJsYWNlIHR5cGUKLSAqIGFzIGFib3ZlIChGSUxFSUQpLiAgVGhlIHdpZHRoICgxMjgpIGFuZCBoZWlnaHQgKHZhcmlhYmxlKSBhcmUgbm90IHN0b3JlZCBpbgotICogdGhlIEZJTEVJRCAtIGluc3RlYWQgdGhlIGZpZWxkcyBhcmUgc2V0IHRvIDAsIGluZGljYXRpbmcgYSB0cmFuc2Zvcm0gZmlsZS4KLSAqCi0gKiBUaGUgc2l6ZSBmaWxlcyBhciBjb25zdHJ1Y3RlZCB3aXRoIHJvd3MgYSBtYXhpbXVtIG9mIDEyOCBieXRlcyB3aWRlLCBhbGxvd2luZwotICogYSBtYXhpbXVtIHdpZHRoIG9mIDE2IHBpeGVscyAoZm9yIHRoZSA2NGJwcCBjYXNlLikgIFRoZXkgYWxzbyBoYXZlIGEgbWF4aW11bQotICogaGVpZ2h0IG9mIDE2IHJvd3MuICBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgc3RvcmVkIGluIHRoZSBGSUxFSUQgYW5kLCBiZWluZwotICogbm9uLXplcm8sIGluZGljYXRlIGEgc2l6ZSBmaWxlLgotICoKLSAqIEJlY2F1c2UgdGhlIFBORyBmaWx0ZXIgY29kZSBpcyB0eXBpY2FsbHkgdGhlIGxhcmdlc3QgQ1BVIGNvbnN1bWVyIHdpdGhpbgotICogbGlicG5nIGl0c2VsZiB0aGVyZSBpcyBhIHRlbmRlbmN5IHRvIGF0dGVtcHQgdG8gb3B0aW1pemUgaXQuICBUaGlzIHJlc3VsdHMgaW4KLSAqIHNwZWNpYWwgY2FzZSBjb2RlIHdoaWNoIG5lZWRzIHRvIGJlIHZhbGlkYXRlZC4gIFRvIGNhdXNlIHRoaXMgdG8gaGFwcGVuIHRoZQotICogJ3NpemUnIGltYWdlcyBhcmUgbWFkZSB0byB1c2UgZWFjaCBwb3NzaWJsZSBmaWx0ZXIsIGluIHNvIGZhciBhcyB0aGlzIGlzCi0gKiBwb3NzaWJsZSBmb3Igc21hbGxlciBpbWFnZXMuCi0gKgotICogRm9yIHBhbGV0dGUgaW1hZ2UgKGNvbG91ciB0eXBlIDMpIG11bHRpcGxlIHRyYW5zZm9ybSBpbWFnZXMgYXJlIHN0b3JlZCB3aXRoCi0gKiB0aGUgc2FtZSBiaXQgZGVwdGggdG8gYWxsb3cgdGVzdGluZyBvZiBtb3JlIGNvbG91ciBjb21iaW5hdGlvbnMgLQotICogcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgdGVzdGluZyB0aGUgZ2FtbWEgY29kZSBiZWNhdXNlIGxpYnBuZyB1c2VzIGEKLSAqIGRpZmZlcmVudCBjb2RlIHBhdGggZm9yIHBhbGV0dGUgaW1hZ2VzLiAgRm9yIHNpemUgaW1hZ2VzIGEgc2luZ2xlIHBhbGV0dGUgaXMKLSAqIHVzZWQuCi0gKi8KLQotLyogTWFrZSBhICdzdGFuZGFyZCcgcGFsZXR0ZS4gIEJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgMjU2IGVudHJpZXMgaW4gYSBwYWxldHRlCi0gKiAobWF4aW11bSkgdGhpcyBhY3R1YWxseSBtYWtlcyBhIHJhbmRvbSBwYWxldHRlIGluIHRoZSBob3BlIHRoYXQgZW5vdWdoIHRlc3RzCi0gKiB3aWxsIGNhdGNoIGVub3VnaCBlcnJvcnMuICAoTm90ZSB0aGF0IHRoZSBzYW1lIHBhbGV0dGUgaXNuJ3QgcHJvZHVjZWQgZXZlcnkKLSAqIHRpbWUgZm9yIHRoZSBzYW1lIHRlc3QgLSBpdCBkZXBlbmRzIG9uIHdoYXQgcHJldmlvdXMgdGVzdHMgaGF2ZSBiZWVuIHJ1biAtCi0gKiBidXQgYSBnaXZlbiBzZXQgb2YgYXJndW1lbnRzIHRvIHBuZ3ZhbGlkIHdpbGwgYWx3YXlzIHByb2R1Y2UgdGhlIHNhbWUgcGFsZXR0ZQotICogYXQgdGhlIHNhbWUgdGVzdCEgIFRoaXMgaXMgd2h5IHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgYXJlIHVzZWZ1bCBmb3IKLSAqIHRlc3RpbmcuKQotICoKLSAqIFRoZSBzdG9yZSBtdXN0IGJlIG9wZW4gZm9yIHdyaXRlIHdoZW4gdGhpcyBpcyBjYWxsZWQsIG90aGVyd2lzZSBhbiBpbnRlcm5hbAotICogZXJyb3Igd2lsbCBvY2N1ci4gIFRoaXMgcm91dGluZSBjb250YWlucyBpdHMgb3duIG1hZ2ljIG51bWJlciBzZWVkLCBzbyB0aGUKLSAqIHBhbGV0dGVzIGdlbmVyYXRlZCBkb24ndCBjaGFuZ2UgaWYgdGhlcmUgYXJlIGludGVydmVuaW5nIGVycm9ycyAoY2hhbmdpbmcgdGhlCi0gKiBjYWxscyB0byB0aGUgc3RvcmVfbWFyayBzZWVkLikKLSAqLwotc3RhdGljIHN0b3JlX3BhbGV0dGVfZW50cnkgKgotbWFrZV9zdGFuZGFyZF9wYWxldHRlKHBuZ19zdG9yZSogcHMsIGludCBucGFsZXR0ZSwgaW50IGRvX3RSTlMpCi17Ci0gICBzdGF0aWMgcG5nX3VpbnRfMzIgcGFsZXR0ZV9zZWVkWzJdID0geyAweDg3NjU0MzIxLCA5IH07Ci0KLSAgIGludCBpID0gMDsKLSAgIHBuZ19ieXRlIHZhbHVlc1syNTZdWzRdOwotCi0gICAvKiBBbHdheXMgcHV0IGluIGJsYWNrIGFuZCB3aGl0ZSBwbHVzIHRoZSBzaXggcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGNvbG9ycy4KLSAgICAqLwotICAgZm9yICg7IGk8ODsgKytpKQotICAgewotICAgICAgdmFsdWVzW2ldWzFdID0gKHBuZ19ieXRlKSgoaSYxKSA/IDI1NVUgOiAwVSk7Ci0gICAgICB2YWx1ZXNbaV1bMl0gPSAocG5nX2J5dGUpKChpJjIpID8gMjU1VSA6IDBVKTsKLSAgICAgIHZhbHVlc1tpXVszXSA9IChwbmdfYnl0ZSkoKGkmNCkgPyAyNTVVIDogMFUpOwotICAgfQotCi0gICAvKiBUaGVuIGFkZCA2MiBncmF5cyAob25lIHF1YXJ0ZXIgb2YgdGhlIHJlbWFpbmluZyAyNTYgc2xvdHMpLiAqLwotICAgewotICAgICAgaW50IGogPSAwOwotICAgICAgcG5nX2J5dGUgcmFuZG9tX2J5dGVzWzRdOwotICAgICAgcG5nX2J5dGUgbmVlZFsyNTZdOwotCi0gICAgICBuZWVkWzBdID0gMDsgLypnb3QgYmxhY2sqLwotICAgICAgbWVtc2V0KG5lZWQrMSwgMSwgKHNpemVvZiBuZWVkKS0yKTsgLypuZWVkIHRoZXNlKi8KLSAgICAgIG5lZWRbMjU1XSA9IDA7IC8qYnV0IG5vdCB3aGl0ZSovCi0KLSAgICAgIHdoaWxlIChpPDcwKQotICAgICAgewotICAgICAgICAgcG5nX2J5dGUgYjsKLQotICAgICAgICAgaWYgKGo9PTApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBtYWtlX2ZvdXJfcmFuZG9tX2J5dGVzKHBhbGV0dGVfc2VlZCwgcmFuZG9tX2J5dGVzKTsKLSAgICAgICAgICAgIGogPSA0OwotICAgICAgICAgfQotCi0gICAgICAgICBiID0gcmFuZG9tX2J5dGVzWy0tal07Ci0gICAgICAgICBpZiAobmVlZFtiXSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlc1tpXVsxXSA9IGI7Ci0gICAgICAgICAgICB2YWx1ZXNbaV1bMl0gPSBiOwotICAgICAgICAgICAgdmFsdWVzW2krK11bM10gPSBiOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICAvKiBGaW5hbGx5IGFkZCAxOTIgY29sb3JzIGF0IHJhbmRvbSAtIGRvbid0IHdvcnJ5IGFib3V0IG1hdGNoZXMgdG8gdGhpbmdzIHdlCi0gICAgKiBhbHJlYWR5IGhhdmUsIGNoYW5jZSBpcyBsZXNzIHRoYW4gMS82NTUzNi4gIERvbid0IHdvcnJ5IGFib3V0IGdyYXlzLAotICAgICogY2hhbmNlIGlzIHRoZSBzYW1lLCBzbyB3ZSBnZXQgYSBkdXBsaWNhdGUgb3IgZXh0cmEgZ3JheSBsZXNzIHRoYW4gMSB0aW1lCi0gICAgKiBpbiAxNzAuCi0gICAgKi8KLSAgIGZvciAoOyBpPDI1NjsgKytpKQotICAgICAgbWFrZV9mb3VyX3JhbmRvbV9ieXRlcyhwYWxldHRlX3NlZWQsIHZhbHVlc1tpXSk7Ci0KLSAgIC8qIEZpbGwgaW4gdGhlIGFscGhhIHZhbHVlcyBpbiB0aGUgZmlyc3QgYnl0ZS4gIEp1c3QgdXNlIGFsbCBwb3NzaWJsZSB2YWx1ZXMKLSAgICAqICgwLi4yNTUpIGluIGFuIGFwcGFyZW50bHkgcmFuZG9tIG9yZGVyOgotICAgICovCi0gICB7Ci0gICAgICBzdG9yZV9wYWxldHRlX2VudHJ5ICpwYWxldHRlOwotICAgICAgcG5nX2J5dGUgc2VsZWN0b3JbNF07Ci0KLSAgICAgIG1ha2VfZm91cl9yYW5kb21fYnl0ZXMocGFsZXR0ZV9zZWVkLCBzZWxlY3Rvcik7Ci0KLSAgICAgIGlmIChkb190Uk5TKQotICAgICAgICAgZm9yIChpPTA7IGk8MjU2OyArK2kpCi0gICAgICAgICAgICB2YWx1ZXNbaV1bMF0gPSAocG5nX2J5dGUpKGkgXiBzZWxlY3RvclswXSk7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIGZvciAoaT0wOyBpPDI1NjsgKytpKQotICAgICAgICAgICAgdmFsdWVzW2ldWzBdID0gMjU1OyAvKiBubyB0cmFuc3BhcmVuY3kvdFJOUyBjaHVuayAqLwotCi0gICAgICAvKiAndmFsdWVzJyBjb250YWlucyAyNTYgQVJHQiB2YWx1ZXMsIGJ1dCB3ZSBvbmx5IG5lZWQgJ25wYWxldHRlJy4KLSAgICAgICAqICducGFsZXR0ZScgd2lsbCBhbHdheXMgYmUgYSBwb3dlciBvZiAyOiAyLCA0LCAxNiBvciAyNTYuICBJbiB0aGUgbG93Ci0gICAgICAgKiBiaXQgZGVwdGggY2FzZXMgc2VsZWN0IGNvbG9ycyBhdCByYW5kb20sIGVsc2UgaXQgaXMgZGlmZmljdWx0IHRvIGhhdmUKLSAgICAgICAqIGEgc2V0IG9mIGxvdyBiaXQgZGVwdGggcGFsZXR0ZSB0ZXN0IHdpdGggYW55IGNoYW5jZSBvZiBhIHJlYXNvbmFibGUKLSAgICAgICAqIHJhbmdlIG9mIGNvbG9ycy4gIERvIHRoaXMgYnkgcmFuZG9tbHkgcGVybXV0aW5nIHZhbHVlcyBpbnRvIHRoZSBsb3cKLSAgICAgICAqICducGFsZXR0ZScgZW50cmllcyB1c2luZyBhbiBYT1IgbWFzayBnZW5lcmF0ZWQgaGVyZS4gIFRoaXMgYWxzbwotICAgICAgICogcGVybXV0ZXMgdGhlIG5wYWxldHRlID09IDI1NiBjYXNlIGluIGEgcG90ZW50aWFsbHkgdXNlZnVsIHdheSAodGhlcmUgaXMKLSAgICAgICAqIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBhbGV0dGUgaW5kZXggYW5kIHRoZSBjb2xvciB2YWx1ZSB0aGVyZWluISkKLSAgICAgICAqLwotICAgICAgcGFsZXR0ZSA9IHN0b3JlX3dyaXRlX3BhbGV0dGUocHMsIG5wYWxldHRlKTsKLQotICAgICAgZm9yIChpPTA7IGk8bnBhbGV0dGU7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIHBhbGV0dGVbaV0uYWxwaGEgPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVswXTsKLSAgICAgICAgIHBhbGV0dGVbaV0ucmVkICAgPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVsxXTsKLSAgICAgICAgIHBhbGV0dGVbaV0uZ3JlZW4gPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVsyXTsKLSAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSAgPSB2YWx1ZXNbaSBeIHNlbGVjdG9yWzFdXVszXTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHBhbGV0dGU7Ci0gICB9Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBzdGFuZGFyZCBwYWxldHRlIG9uIGEgd3JpdGUgc3RyZWFtLiAgVGhlICdkb190Uk5TJyBhcmd1bWVudAotICogaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGFsc28gc2V0IHRoZSB0Uk5TIGNodW5rLgotICovCi0vKiBUT0RPOiB0aGUgcG5nX3N0cnVjdHAgaGVyZSBjYW4gcHJvYmFibHkgYmUgJ2NvbnN0JyBpbiB0aGUgZnV0dXJlICovCi1zdGF0aWMgdm9pZAotaW5pdF9zdGFuZGFyZF9wYWxldHRlKHBuZ19zdG9yZSAqcHMsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGksIGludCBucGFsZXR0ZSwKLSAgIGludCBkb190Uk5TKQotewotICAgc3RvcmVfcGFsZXR0ZV9lbnRyeSAqcHBhbCA9IG1ha2Vfc3RhbmRhcmRfcGFsZXR0ZShwcywgbnBhbGV0dGUsIGRvX3RSTlMpOwotCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHBuZ19jb2xvciBwYWxldHRlWzI1Nl07Ci0KLSAgICAgIC8qIFNldCBhbGwgZW50cmllcyB0byBkZXRlY3Qgb3ZlcnJlYWQgZXJyb3JzLiAqLwotICAgICAgZm9yIChpPTA7IGk8bnBhbGV0dGU7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIHBhbGV0dGVbaV0ucmVkID0gcHBhbFtpXS5yZWQ7Ci0gICAgICAgICBwYWxldHRlW2ldLmdyZWVuID0gcHBhbFtpXS5ncmVlbjsKLSAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBwYWxbaV0uYmx1ZTsKLSAgICAgIH0KLQotICAgICAgLyogSnVzdCBpbiBjYXNlIGZpbGwgaW4gdGhlIHJlc3Qgd2l0aCBkZXRlY3RhYmxlIHZhbHVlczogKi8KLSAgICAgIGZvciAoOyBpPDI1NjsgKytpKQotICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwYWxldHRlW2ldLmdyZWVuID0gcGFsZXR0ZVtpXS5ibHVlID0gNDI7Ci0KLSAgICAgIHBuZ19zZXRfUExURShwcCwgcGksIHBhbGV0dGUsIG5wYWxldHRlKTsKLSAgIH0KLQotICAgaWYgKGRvX3RSTlMpCi0gICB7Ci0gICAgICBpbnQgaSwgajsKLSAgICAgIHBuZ19ieXRlIHRSTlNbMjU2XTsKLQotICAgICAgLyogU2V0IGFsbCB0aGUgZW50cmllcywgYnV0IHNraXAgdHJhaWxpbmcgb3BhcXVlIGVudHJpZXMgKi8KLSAgICAgIGZvciAoaT1qPTA7IGk8bnBhbGV0dGU7ICsraSkKLSAgICAgICAgIGlmICgodFJOU1tpXSA9IHBwYWxbaV0uYWxwaGEpIDwgMjU1KQotICAgICAgICAgICAgaiA9IGkrMTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgcmVtYWluZGVyIHdpdGggYSBkZXRlY3RhYmxlIHZhbHVlOiAqLwotICAgICAgZm9yICg7IGk8MjU2OyArK2kpCi0gICAgICAgICB0Uk5TW2ldID0gMjQ7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKLSAgICAgIGlmIChqID4gMCkKLSAgICAgICAgIHBuZ19zZXRfdFJOUyhwcCwgcGksIHRSTlMsIGosIDAvKmNvbG9yKi8pOwotI2VuZGlmCi0gICB9Ci19Ci0KLSNpZmRlZiBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1zZXRfcmFuZG9tX3RSTlMocG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSwgY29uc3QgcG5nX2J5dGUgY29sb3VyX3R5cGUsCi0gICBjb25zdCBpbnQgYml0X2RlcHRoKQotewotICAgLyogVG8gbWFrZSB0aGlzIHVzZWZ1bCB0aGUgdFJOUyBjb2xvciBuZWVkcyB0byBtYXRjaCBhdCBsZWFzdCBvbmUgcGl4ZWwuCi0gICAgKiBSYW5kb20gdmFsdWVzIGFyZSBmaW5lIGZvciBncmF5LCBpbmNsdWRpbmcgdGhlIDE2LWJpdCBjYXNlIHdoZXJlIHdlIGtub3cKLSAgICAqIHRoYXQgdGhlIHRlc3QgaW1hZ2UgY29udGFpbnMgYWxsIHRoZSBncmF5IHZhbHVlcy4gIEZvciBSR0Igd2UgbmVlZCBtb3JlCi0gICAgKiBtZXRob2QgYXMgb25seSA2NTUzNiBkaWZmZXJlbnQgUkdCIHZhbHVlcyBhcmUgZ2VuZXJhdGVkLgotICAgICovCi0gICBwbmdfY29sb3JfMTYgdFJOUzsKLSAgIGNvbnN0IHBuZ191aW50XzE2IG1hc2sgPSAocG5nX3VpbnRfMTYpKCgxVSA8PCBiaXRfZGVwdGgpLTEpOwotCi0gICBSOCh0Uk5TKTsgLyogbWFrZXMgdW5zZXQgZmllbGRzIHJhbmRvbSAqLwotCi0gICBpZiAoY29sb3VyX3R5cGUgJiAyLypSR0IqLykKLSAgIHsKLSAgICAgIGlmIChiaXRfZGVwdGggPT0gOCkKLSAgICAgIHsKLSAgICAgICAgIHRSTlMucmVkID0gcmFuZG9tX3UxNigpOwotICAgICAgICAgdFJOUy5ncmVlbiA9IHJhbmRvbV91MTYoKTsKLSAgICAgICAgIHRSTlMuYmx1ZSA9IHRSTlMucmVkIF4gdFJOUy5ncmVlbjsKLSAgICAgICAgIHRSTlMucmVkICY9IG1hc2s7Ci0gICAgICAgICB0Uk5TLmdyZWVuICY9IG1hc2s7Ci0gICAgICAgICB0Uk5TLmJsdWUgJj0gbWFzazsKLSAgICAgIH0KLQotICAgICAgZWxzZSAvKiBiaXRfZGVwdGggPT0gMTYgKi8KLSAgICAgIHsKLSAgICAgICAgIHRSTlMucmVkID0gcmFuZG9tX3UxNigpOwotICAgICAgICAgdFJOUy5ncmVlbiA9IChwbmdfdWludF8xNikodFJOUy5yZWQgKiAyNTcpOwotICAgICAgICAgdFJOUy5ibHVlID0gKHBuZ191aW50XzE2KSh0Uk5TLmdyZWVuICogMTcpOwotICAgICAgfQotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICB0Uk5TLmdyYXkgPSByYW5kb21fdTE2KCk7Ci0gICAgICB0Uk5TLmdyYXkgJj0gbWFzazsKLSAgIH0KLQotICAgcG5nX3NldF90Uk5TKHBwLCBwaSwgTlVMTCwgMCwgJnRSTlMpOwotfQotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2YgcGFzc2VzIGlzIHJlbGF0ZWQgdG8gdGhlIGludGVybGFjZSB0eXBlLiBUaGVyZSB3YXMgbm8gbGlicG5nCi0gKiBBUEkgdG8gZGV0ZXJtaW5lIHRoaXMgcHJpb3IgdG8gMS41LCBzbyB3ZSBuZWVkIGFuIGlucXVpcnkgZnVuY3Rpb246Ci0gKi8KLXN0YXRpYyBpbnQKLW5wYXNzZXNfZnJvbV9pbnRlcmxhY2VfdHlwZShwbmdfY29uc3Rfc3RydWN0cCBwcCwgaW50IGludGVybGFjZV90eXBlKQotewotICAgc3dpdGNoIChpbnRlcmxhY2VfdHlwZSkKLSAgIHsKLSAgIGRlZmF1bHQ6Ci0gICAgICBwbmdfZXJyb3IocHAsICJpbnZhbGlkIGludGVybGFjZSB0eXBlIik7Ci0KLSAgIGNhc2UgUE5HX0lOVEVSTEFDRV9OT05FOgotICAgICAgcmV0dXJuIDE7Ci0KLSAgIGNhc2UgUE5HX0lOVEVSTEFDRV9BREFNNzoKLSAgICAgIHJldHVybiBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUzsKLSAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotYml0X3NpemUocG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICBzd2l0Y2ggKGNvbG91cl90eXBlKQotICAgewotICAgICAgZGVmYXVsdDogcG5nX2Vycm9yKHBwLCAiaW52YWxpZCBjb2xvciB0eXBlIik7Ci0KLSAgICAgIGNhc2UgMDogIHJldHVybiBiaXRfZGVwdGg7Ci0KLSAgICAgIGNhc2UgMjogIHJldHVybiAzKmJpdF9kZXB0aDsKLQotICAgICAgY2FzZSAzOiAgcmV0dXJuIGJpdF9kZXB0aDsKLQotICAgICAgY2FzZSA0OiAgcmV0dXJuIDIqYml0X2RlcHRoOwotCi0gICAgICBjYXNlIDY6ICByZXR1cm4gNCpiaXRfZGVwdGg7Ci0gICB9Ci19Ci0KLSNkZWZpbmUgVFJBTlNGT1JNX1dJRFRIICAxMjhVCi0jZGVmaW5lIFRSQU5TRk9STV9ST1dNQVggKFRSQU5TRk9STV9XSURUSCo4VSkKLSNkZWZpbmUgU0laRV9ST1dNQVggKDE2KjhVKSAvKiAxNiBwaXhlbHMsIG1heCA4IGJ5dGVzIGVhY2ggLSAxMjggYnl0ZXMgKi8KLSNkZWZpbmUgU1RBTkRBUkRfUk9XTUFYIFRSQU5TRk9STV9ST1dNQVggLyogVGhlIGxhcmdlciBvZiB0aGUgdHdvICovCi0jZGVmaW5lIFNJWkVfSEVJR0hUTUFYIDE2IC8qIE1heGltdW0gcmFuZ2Ugb2Ygc2l6ZSBpbWFnZXMgKi8KLQotc3RhdGljIHNpemVfdAotdHJhbnNmb3JtX3Jvd3NpemUocG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ19ieXRlIGNvbG91cl90eXBlLAotICAgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgcmV0dXJuIChUUkFOU0ZPUk1fV0lEVEggKiBiaXRfc2l6ZShwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkpIC8gODsKLX0KLQotLyogdHJhbnNmb3JtX3dpZHRoKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKSBjdXJyZW50IHJldHVybnMgdGhlIHNhbWUgbnVtYmVyCi0gKiBldmVyeSB0aW1lLCBzbyBqdXN0IHVzZSBhIG1hY3JvOgotICovCi0jZGVmaW5lIHRyYW5zZm9ybV93aWR0aChwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkgVFJBTlNGT1JNX1dJRFRICi0KLXN0YXRpYyBwbmdfdWludF8zMgotdHJhbnNmb3JtX2hlaWdodChwbmdfY29uc3Rfc3RydWN0cCBwcCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKLXsKLSAgIHN3aXRjaCAoYml0X3NpemUocHAsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpKQotICAgewotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSA0OgotICAgICAgICAgcmV0dXJuIDE7ICAgLyogVG90YWwgb2YgMTI4IHBpeGVscyAqLwotCi0gICAgICBjYXNlIDg6Ci0gICAgICAgICByZXR1cm4gMjsgICAvKiBUb3RhbCBvZiAyNTYgcGl4ZWxzL2J5dGVzICovCi0KLSAgICAgIGNhc2UgMTY6Ci0gICAgICAgICByZXR1cm4gNTEyOyAvKiBUb3RhbCBvZiA2NTUzNiBwaXhlbHMgKi8KLQotICAgICAgY2FzZSAyNDoKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgICByZXR1cm4gNTEyOyAvKiA2NTUzNiBwaXhlbHMgKi8KLQotICAgICAgY2FzZSA0ODoKLSAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICByZXR1cm4gMjA0ODsvKiA0IHggNjU1MzYgcGl4ZWxzLiAqLwotIyAgICAgICAgZGVmaW5lIFRSQU5TRk9STV9IRUlHSFRNQVggMjA0OAotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgcmV0dXJuIDA7ICAgLyogRXJyb3IsIHdpbGwgYmUgY2F1Z2h0IGxhdGVyICovCi0gICB9Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLS8qIFRoZSBmb2xsb3dpbmcgY2FuIG9ubHkgYmUgZGVmaW5lZCBoZXJlLCBub3cgd2UgaGF2ZSB0aGUgZGVmaW5pdGlvbnMKLSAqIG9mIHRoZSB0cmFuc2Zvcm0gaW1hZ2Ugc2l6ZXMuCi0gKi8KLXN0YXRpYyBwbmdfdWludF8zMgotc3RhbmRhcmRfd2lkdGgocG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ191aW50XzMyIGlkKQotewotICAgcG5nX3VpbnRfMzIgd2lkdGggPSBXSURUSF9GUk9NX0lEKGlkKTsKLSAgIFVOVVNFRChwcCkKLQotICAgaWYgKHdpZHRoID09IDApCi0gICAgICB3aWR0aCA9IHRyYW5zZm9ybV93aWR0aChwcCwgQ09MX0ZST01fSUQoaWQpLCBERVBUSF9GUk9NX0lEKGlkKSk7Ci0KLSAgIHJldHVybiB3aWR0aDsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyCi1zdGFuZGFyZF9oZWlnaHQocG5nX2NvbnN0X3N0cnVjdHAgcHAsIHBuZ191aW50XzMyIGlkKQotewotICAgcG5nX3VpbnRfMzIgaGVpZ2h0ID0gSEVJR0hUX0ZST01fSUQoaWQpOwotCi0gICBpZiAoaGVpZ2h0ID09IDApCi0gICAgICBoZWlnaHQgPSB0cmFuc2Zvcm1faGVpZ2h0KHBwLCBDT0xfRlJPTV9JRChpZCksIERFUFRIX0ZST01fSUQoaWQpKTsKLQotICAgcmV0dXJuIGhlaWdodDsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyCi1zdGFuZGFyZF9yb3dzaXplKHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfdWludF8zMiBpZCkKLXsKLSAgIHBuZ191aW50XzMyIHdpZHRoID0gc3RhbmRhcmRfd2lkdGgocHAsIGlkKTsKLQotICAgLyogVGhpcyB3b24ndCBvdmVyZmxvdzogKi8KLSAgIHdpZHRoICo9IGJpdF9zaXplKHBwLCBDT0xfRlJPTV9JRChpZCksIERFUFRIX0ZST01fSUQoaWQpKTsKLSAgIHJldHVybiAod2lkdGggKyA3KSAvIDg7Ci19Ci0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0KLXN0YXRpYyB2b2lkCi10cmFuc2Zvcm1fcm93KHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfYnl0ZSBidWZmZXJbVFJBTlNGT1JNX1JPV01BWF0sCi0gICBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoLCBwbmdfdWludF8zMiB5KQotewotICAgcG5nX3VpbnRfMzIgdiA9IHkgPDwgNzsKLSAgIHBuZ191aW50XzMyIGkgPSAwOwotCi0gICBzd2l0Y2ggKGJpdF9zaXplKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKSkKLSAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgIHdoaWxlIChpPDEyOC84KSBidWZmZXJbaV0gPSAocG5nX2J5dGUpKHYgJiAweGZmKSwgdiArPSAxNywgKytpOwotICAgICAgICAgcmV0dXJuOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICAgICB3aGlsZSAoaTwxMjgvNCkgYnVmZmVyW2ldID0gKHBuZ19ieXRlKSh2ICYgMHhmZiksIHYgKz0gMzMsICsraTsKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgY2FzZSA0OgotICAgICAgICAgd2hpbGUgKGk8MTI4LzIpIGJ1ZmZlcltpXSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpLCB2ICs9IDY1LCArK2k7Ci0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgODoKLSAgICAgICAgIC8qIDI1NiBieXRlcyB0b3RhbCwgMTI4IGJ5dGVzIGluIGVhY2ggcm93IHNldCBhcyBmb2xsb3dzOiAqLwotICAgICAgICAgd2hpbGUgKGk8MTI4KSBidWZmZXJbaV0gPSAocG5nX2J5dGUpKHYgJiAweGZmKSwgKyt2LCArK2k7Ci0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAvKiBHZW5lcmF0ZSBhbGwgNjU1MzYgcGl4ZWwgdmFsdWVzIGluIG9yZGVyLCB3aGljaCBpbmNsdWRlcyB0aGUgOCBiaXQKLSAgICAgICAgICAqIEdBIGNhc2UgYXMgd2VsbCBhcyB0aGUgMTYgYml0IEcgY2FzZS4KLSAgICAgICAgICAqLwotICAgICAgICAgd2hpbGUgKGk8MTI4KQotICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyWzIqaV0gPSAocG5nX2J5dGUpKCh2Pj44KSAmIDB4ZmYpOwotICAgICAgICAgICAgYnVmZmVyWzIqaSsxXSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgKyt2OwotICAgICAgICAgICAgKytpOwotICAgICAgICAgfQotCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAvKiA2NTUzNSBwaXhlbHMsIGJ1dCByb3RhdGUgdGhlIHZhbHVlcy4gKi8KLSAgICAgICAgIHdoaWxlIChpPDEyOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRocmVlIGJ5dGVzIHBlciBwaXhlbCwgciwgZywgYiwgbWFrZSBiIGJ5IHJeZyAqLwotICAgICAgICAgICAgYnVmZmVyWzMqaSswXSA9IChwbmdfYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGJ1ZmZlclszKmkrMV0gPSAocG5nX2J5dGUpKHYgJiAweGZmKTsKLSAgICAgICAgICAgIGJ1ZmZlclszKmkrMl0gPSAocG5nX2J5dGUpKCgodiA+PiA4KSBeIHYpICYgMHhmZik7Ci0gICAgICAgICAgICArK3Y7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHJldHVybjsKLQotICAgICAgY2FzZSAzMjoKLSAgICAgICAgIC8qIDY1NTM1IHBpeGVscywgciwgZywgYiwgYTsganVzdCByZXBsaWNhdGUgKi8KLSAgICAgICAgIHdoaWxlIChpPDEyOCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlcls0KmkrMF0gPSAocG5nX2J5dGUpKCh2ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICBidWZmZXJbNCppKzFdID0gKHBuZ19ieXRlKSh2ICYgMHhmZik7Ci0gICAgICAgICAgICBidWZmZXJbNCppKzJdID0gKHBuZ19ieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgYnVmZmVyWzQqaSszXSA9IChwbmdfYnl0ZSkodiAmIDB4ZmYpOwotICAgICAgICAgICAgKyt2OwotICAgICAgICAgICAgKytpOwotICAgICAgICAgfQotCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAvKiB5IGlzIG1heGltdW0gMjA0NywgZ2l2aW5nIDR4NjU1MzYgcGl4ZWxzLCBtYWtlICdyJyBpbmNyZWFzZSBieSAxIGF0Ci0gICAgICAgICAgKiBlYWNoIHBpeGVsLCBnIGluY3JlYXNlIGJ5IDI1NyAoMHgxMDEpIGFuZCAnYicgYnkgMHgxMTExOgotICAgICAgICAgICovCi0gICAgICAgICB3aGlsZSAoaTwxMjgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiB0ID0gdisrOwotICAgICAgICAgICAgYnVmZmVyWzYqaSswXSA9IChwbmdfYnl0ZSkoKHQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGJ1ZmZlcls2KmkrMV0gPSAocG5nX2J5dGUpKHQgJiAweGZmKTsKLSAgICAgICAgICAgIHQgKj0gMjU3OwotICAgICAgICAgICAgYnVmZmVyWzYqaSsyXSA9IChwbmdfYnl0ZSkoKHQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGJ1ZmZlcls2KmkrM10gPSAocG5nX2J5dGUpKHQgJiAweGZmKTsKLSAgICAgICAgICAgIHQgKj0gMTc7Ci0gICAgICAgICAgICBidWZmZXJbNippKzRdID0gKHBuZ19ieXRlKSgodCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgYnVmZmVyWzYqaSs1XSA9IChwbmdfYnl0ZSkodCAmIDB4ZmYpOwotICAgICAgICAgICAgKytpOwotICAgICAgICAgfQotCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICAvKiBBcyBhYm92ZSBpbiB0aGUgMzIgYml0IGNhc2UuICovCi0gICAgICAgICB3aGlsZSAoaTwxMjgpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiB0ID0gdisrOwotICAgICAgICAgICAgYnVmZmVyWzgqaSswXSA9IChwbmdfYnl0ZSkoKHQgPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGJ1ZmZlcls4KmkrMV0gPSAocG5nX2J5dGUpKHQgJiAweGZmKTsKLSAgICAgICAgICAgIGJ1ZmZlcls4KmkrNF0gPSAocG5nX2J5dGUpKCh0ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICBidWZmZXJbOCppKzVdID0gKHBuZ19ieXRlKSh0ICYgMHhmZik7Ci0gICAgICAgICAgICB0ICo9IDI1NzsKLSAgICAgICAgICAgIGJ1ZmZlcls4KmkrMl0gPSAocG5nX2J5dGUpKCh0ID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICBidWZmZXJbOCppKzNdID0gKHBuZ19ieXRlKSh0ICYgMHhmZik7Ci0gICAgICAgICAgICBidWZmZXJbOCppKzZdID0gKHBuZ19ieXRlKSgodCA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgYnVmZmVyWzgqaSs3XSA9IChwbmdfYnl0ZSkodCAmIDB4ZmYpOwotICAgICAgICAgICAgKytpOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIHBuZ19lcnJvcihwcCwgImludGVybmFsIGVycm9yIik7Ci19Ci0KLS8qIFRoaXMgaXMganVzdCB0byBkbyB0aGUgcmlnaHQgY2FzdCAtIGNvdWxkIGJlIGNoYW5nZWQgdG8gYSBmdW5jdGlvbiB0byBjaGVjawotICogJ2JkJyBidXQgdGhlcmUgaXNuJ3QgbXVjaCBwb2ludC4KLSAqLwotI2RlZmluZSBERVBUSChiZCkgKChwbmdfYnl0ZSkoMVUgPDwgKGJkKSkpCi0KLS8qIFRoaXMgaXMganVzdCBhIGhlbHBlciBmb3IgY29tcGlsaW5nIG9uIG1pbmltYWwgc3lzdGVtcyB3aXRoIG5vIHdyaXRlCi0gKiBpbnRlcmxhY2luZyBzdXBwb3J0LiAgSWYgdGhlcmUgaXMgbm8gd3JpdGUgaW50ZXJsYWNpbmcgd2UgY2FuJ3QgZ2VuZXJhdGUgdGVzdAotICogY2FzZXMgd2l0aCBpbnRlcmxhY2U6Ci0gKi8KLSNpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0jICBkZWZpbmUgSU5URVJMQUNFX0xBU1QgUE5HX0lOVEVSTEFDRV9MQVNUCi0jICBkZWZpbmUgY2hlY2tfaW50ZXJsYWNlX3R5cGUodHlwZSkgKCh2b2lkKSh0eXBlKSkKLSMgIGRlZmluZSBzZXRfd3JpdGVfaW50ZXJsYWNlX2hhbmRsaW5nKHBwLHR5cGUpIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBwKQotIyAgZGVmaW5lIGRvX293bl9pbnRlcmxhY2UgMAotI2VsaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAotIyAgZGVmaW5lIHNldF93cml0ZV9pbnRlcmxhY2VfaGFuZGxpbmcocHAsdHlwZSkgKDEpCi1zdGF0aWMgdm9pZAotY2hlY2tfaW50ZXJsYWNlX3R5cGUoaW50IGNvbnN0IGludGVybGFjZV90eXBlKQotewotICAgLyogUHJpb3IgdG8gMS43LjAgbGlicG5nIGRvZXMgbm90IHN1cHBvcnQgdGhlIHdyaXRlIG9mIGFuIGludGVybGFjZWQgaW1hZ2UKLSAgICAqIHVubGVzcyBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVELCBldmVuIHdpdGggZG9faW50ZXJsYWNlIHNvIHRoZQotICAgICogY29kZSBoZXJlIGRvZXMgdGhlIHBpeGVsIGludGVybGFjZSBpdHNlbGYsIHNvOgotICAgICovCi0gICBpZiAoaW50ZXJsYWNlX3R5cGUgIT0gUE5HX0lOVEVSTEFDRV9OT05FKQotICAgewotICAgICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciAtIC0taW50ZXJsYWNlIHRlc3RzIHNob3VsZCBiZSBza2lwcGVkLCBub3QKLSAgICAgICAqIGF0dGVtcHRlZC4KLSAgICAgICAqLwotICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogbm8gaW50ZXJsYWNlIHN1cHBvcnRcbiIpOwotICAgICAgZXhpdCg5OSk7Ci0gICB9Ci19Ci0jICBkZWZpbmUgSU5URVJMQUNFX0xBU1QgKFBOR19JTlRFUkxBQ0VfTk9ORSsxKQotIyAgZGVmaW5lIGRvX293bl9pbnRlcmxhY2UgMAotI2Vsc2UgLyogbGlicG5nIDEuNysgKi8KLSMgIGRlZmluZSBzZXRfd3JpdGVfaW50ZXJsYWNlX2hhbmRsaW5nKHBwLHR5cGUpXAotICAgICAgbnBhc3Nlc19mcm9tX2ludGVybGFjZV90eXBlKHBwLHR5cGUpCi0jICBkZWZpbmUgY2hlY2tfaW50ZXJsYWNlX3R5cGUodHlwZSkgKCh2b2lkKSh0eXBlKSkKLSMgIGRlZmluZSBJTlRFUkxBQ0VfTEFTVCBQTkdfSU5URVJMQUNFX0xBU1QKLSMgIGRlZmluZSBkb19vd25faW50ZXJsYWNlIDEKLSNlbmRpZiAvKiBXUklURV9JTlRFUkxBQ0lORyB0ZXN0cyAqLwotCi0jZGVmaW5lIENBTl9XUklURV9JTlRFUkxBQ0VcCi0gICBQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMCB8fCBkZWZpbmVkIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLQotLyogRG8gdGhlIHNhbWUgdGhpbmcgZm9yIHJlYWQgaW50ZXJsYWNpbmc7IHRoaXMgY29udHJvbHMgd2hldGhlciByZWFkIHRlc3RzIGRvCi0gKiB0aGVpciBvd24gZGUtaW50ZXJsYWNlIG9yIHVzZSBsaWJwbmcuCi0gKi8KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSMgIGRlZmluZSBkb19yZWFkX2ludGVybGFjZSAwCi0jZWxzZSAvKiBubyBsaWJwbmcgcmVhZCBpbnRlcmxhY2Ugc3VwcG9ydCAqLwotIyAgZGVmaW5lIGRvX3JlYWRfaW50ZXJsYWNlIDEKLSNlbmRpZgotLyogVGhlIGZvbGxvd2luZyB0d28gcm91dGluZXMgdXNlIHRoZSBQTkcgaW50ZXJsYWNlIHN1cHBvcnQgbWFjcm9zIGZyb20KLSAqIHBuZy5oIHRvIGludGVybGFjZSBvciBkZWludGVybGFjZSByb3dzLgotICovCi1zdGF0aWMgdm9pZAotaW50ZXJsYWNlX3JvdyhwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfY29uc3RfYnl0ZXAgaW1hZ2VSb3csCi0gICB1bnNpZ25lZCBpbnQgcGl4ZWxfc2l6ZSwgcG5nX3VpbnRfMzIgdywgaW50IHBhc3MsIGludCBsaXR0bGVlbmRpYW4pCi17Ci0gICBwbmdfdWludF8zMiB4aW4sIHhvdXQsIHhzdGVwOwotCi0gICAvKiBOb3RlIHRoYXQgdGhpcyBjYW4sIHRyaXZpYWxseSwgYmUgb3B0aW1pemVkIHRvIGEgbWVtY3B5IG9uIHBhc3MgNywgdGhlCi0gICAgKiBjb2RlIGlzIHByZXNlbnRlZCB0aGlzIHdheSB0byBtYWtlIGl0IGVhc2llciB0byB1bmRlcnN0YW5kLiAgSW4gcHJhY3RpY2UKLSAgICAqIGNvbnN1bHQgdGhlIGNvZGUgaW4gdGhlIGxpYnBuZyBzb3VyY2UgdG8gc2VlIG90aGVyIHdheXMgb2YgZG9pbmcgdGhpcy4KLSAgICAqCi0gICAgKiBJdCBpcyBPSyBmb3IgYnVmZmVyIGFuZCBpbWFnZVJvdyB0byBiZSBpZGVudGljYWwsIGJlY2F1c2UgJ3hpbicgbW92ZXMKLSAgICAqIGZhc3RlciB0aGFuICd4b3V0JyBhbmQgd2UgY29weSB1cC4KLSAgICAqLwotICAgeGluID0gUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpOwotICAgeHN0ZXAgPSAxVTw8UE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpOwotCi0gICBmb3IgKHhvdXQ9MDsgeGluPHc7IHhpbis9eHN0ZXApCi0gICB7Ci0gICAgICBwaXhlbF9jb3B5KGJ1ZmZlciwgeG91dCwgaW1hZ2VSb3csIHhpbiwgcGl4ZWxfc2l6ZSwgbGl0dGxlZW5kaWFuKTsKLSAgICAgICsreG91dDsKLSAgIH0KLX0KLQotI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLWRlaW50ZXJsYWNlX3JvdyhwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfY29uc3RfYnl0ZXAgcm93LAotICAgdW5zaWduZWQgaW50IHBpeGVsX3NpemUsIHBuZ191aW50XzMyIHcsIGludCBwYXNzLCBpbnQgbGl0dGxlZW5kaWFuKQotewotICAgLyogVGhlIGludmVyc2Ugb2YgdGhlIGFib3ZlLCAncm93JyBpcyBwYXJ0IG9mIHJvdyAneScgb2YgdGhlIG91dHB1dCBpbWFnZSwKLSAgICAqIGluICdidWZmZXInLiAgVGhlIGltYWdlIGlzICd3JyB3aWRlIGFuZCB0aGlzIGlzIHBhc3MgJ3Bhc3MnLCBkaXN0cmlidXRlCi0gICAgKiB0aGUgcGl4ZWxzIG9mIHJvdyBpbnRvIGJ1ZmZlciBhbmQgcmV0dXJuIHRoZSBudW1iZXIgd3JpdHRlbiAodG8gYWxsb3cKLSAgICAqIHRoaXMgdG8gYmUgY2hlY2tlZCkuCi0gICAgKi8KLSAgIHBuZ191aW50XzMyIHhpbiwgeG91dCwgeHN0ZXA7Ci0KLSAgIHhvdXQgPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7Ci0gICB4c3RlcCA9IDFVPDxQTkdfUEFTU19DT0xfU0hJRlQocGFzcyk7Ci0KLSAgIGZvciAoeGluPTA7IHhvdXQ8dzsgeG91dCs9eHN0ZXApCi0gICB7Ci0gICAgICBwaXhlbF9jb3B5KGJ1ZmZlciwgeG91dCwgcm93LCB4aW4sIHBpeGVsX3NpemUsIGxpdHRsZWVuZGlhbik7Ci0gICAgICArK3hpbjsKLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8KLQotLyogTWFrZSBhIHN0YW5kYXJkaXplZCBpbWFnZSBnaXZlbiBhbiBpbWFnZSBjb2xvdXIgdHlwZSwgYml0IGRlcHRoIGFuZAotICogaW50ZXJsYWNlIHR5cGUuICBUaGUgc3RhbmRhcmQgaW1hZ2VzIGhhdmUgYSB2ZXJ5IHJlc3RyaWN0ZWQgcmFuZ2Ugb2YKLSAqIHJvd3MgYW5kIGhlaWdodHMgYW5kIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHRyYW5zZm9ybXMgcmF0aGVyIHRoYW4gaW1hZ2UKLSAqIGxheW91dCBkZXRhaWxzLiAgU2VlIG1ha2Vfc2l6ZV9pbWFnZXMgYmVsb3cgZm9yIGEgd2F5IHRvIG1ha2UgaW1hZ2VzCi0gKiB0aGF0IHRlc3Qgb2RkIHNpemVzIGFsb25nIHdpdGggdGhlIGxpYnBuZyBpbnRlcmxhY2UgaGFuZGxpbmcuCi0gKi8KLSNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLWNob29zZV9yYW5kb21fZmlsdGVyKHBuZ19zdHJ1Y3RwIHBwLCBpbnQgc3RhcnQpCi17Ci0gICAvKiBDaG9vc2UgZmlsdGVycyByYW5kb21seSBleGNlcHQgdGhhdCBvbiB0aGUgdmVyeSBmaXJzdCByb3cgZW5zdXJlIHRoYXQKLSAgICAqIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmV2aW91cyByb3cgZmlsdGVyLgotICAgICovCi0gICBpbnQgZmlsdGVycyA9IFBOR19BTExfRklMVEVSUyAmIHJhbmRvbV9tb2QoMjU2VSk7Ci0KLSAgIC8qIFRoZXJlIG1heSBiZSBubyBmaWx0ZXJzOyBza2lwIHRoZSBzZXR0aW5nLiAqLwotICAgaWYgKGZpbHRlcnMgIT0gMCkKLSAgIHsKLSAgICAgIGlmIChzdGFydCAmJiBmaWx0ZXJzIDwgUE5HX0ZJTFRFUl9VUCkKLSAgICAgICAgIGZpbHRlcnMgfD0gUE5HX0ZJTFRFUl9VUDsKLQotICAgICAgcG5nX3NldF9maWx0ZXIocHAsIDAvKm1ldGhvZCovLCBmaWx0ZXJzKTsKLSAgIH0KLX0KLSNlbHNlIC8qICFXUklURV9GSUxURVIgKi8KLSMgIGRlZmluZSBjaG9vc2VfcmFuZG9tX2ZpbHRlcihwcCwgc3RhcnQpICgodm9pZCkwKQotI2VuZGlmIC8qICFXUklURV9GSUxURVIgKi8KLQotc3RhdGljIHZvaWQKLW1ha2VfdHJhbnNmb3JtX2ltYWdlKHBuZ19zdG9yZSogY29uc3QgcHMsIHBuZ19ieXRlIGNvbnN0IGNvbG91cl90eXBlLAotICAgIHBuZ19ieXRlIGNvbnN0IGJpdF9kZXB0aCwgdW5zaWduZWQgaW50IHBhbGV0dGVfbnVtYmVyLAotICAgIGludCBpbnRlcmxhY2VfdHlwZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUpCi17Ci0gICBjb250ZXh0KHBzLCBmYXVsdCk7Ci0KLSAgIGNoZWNrX2ludGVybGFjZV90eXBlKGludGVybGFjZV90eXBlKTsKLQotICAgVHJ5Ci0gICB7Ci0gICAgICBwbmdfaW5mb3AgcGk7Ci0gICAgICBwbmdfc3RydWN0cCBwcCA9IHNldF9zdG9yZV9mb3Jfd3JpdGUocHMsICZwaSwgbmFtZSk7Ci0gICAgICBwbmdfdWludF8zMiBoLCB3OwotCi0gICAgICAvKiBJbiB0aGUgZXZlbnQgb2YgYSBwcm9ibGVtIHJldHVybiBjb250cm9sIHRvIHRoZSBDYXRjaCBzdGF0ZW1lbnQgYmVsb3cKLSAgICAgICAqIHRvIGRvIHRoZSBjbGVhbiB1cCAtIGl0IGlzIG5vdCBwb3NzaWJsZSB0byAncmV0dXJuJyBkaXJlY3RseSBmcm9tIGEgVHJ5Ci0gICAgICAgKiBibG9jay4KLSAgICAgICAqLwotICAgICAgaWYgKHBwID09IE5VTEwpCi0gICAgICAgICBUaHJvdyBwczsKLQotICAgICAgdyA9IHRyYW5zZm9ybV93aWR0aChwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCk7Ci0gICAgICBoID0gdHJhbnNmb3JtX2hlaWdodChwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCk7Ci0KLSAgICAgIHBuZ19zZXRfSUhEUihwcCwgcGksIHcsIGgsIGJpdF9kZXB0aCwgY29sb3VyX3R5cGUsIGludGVybGFjZV90eXBlLAotICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOwotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0jICBpZiBkZWZpbmVkKFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19XUklURV96VFh0X1NVUFBPUlRFRCkKLSMgICAgIGRlZmluZSBURVhUX0NPTVBSRVNTSU9OIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLSMgIGVsc2UKLSMgICAgIGRlZmluZSBURVhUX0NPTVBSRVNTSU9OIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKLSMgIGVuZGlmCi0gICAgICB7Ci0gICAgICAgICBzdGF0aWMgY2hhciBrZXlbXSA9ICJpbWFnZSBuYW1lIjsgLyogbXVzdCBiZSB3cml0ZWFibGUgKi8KLSAgICAgICAgIHNpemVfdCBwb3M7Ci0gICAgICAgICBwbmdfdGV4dCB0ZXh0OwotICAgICAgICAgY2hhciBjb3B5W0ZJTEVfTkFNRV9TSVpFXTsKLQotICAgICAgICAgLyogVXNlIGEgY29tcHJlc3NlZCB0ZXh0IHN0cmluZyB0byB0ZXN0IHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIG9mIHRleHQKLSAgICAgICAgICAqIGNvbXByZXNzaW9uIGFuZCBJREFUIGNvbXByZXNzaW9uLgotICAgICAgICAgICovCi0gICAgICAgICB0ZXh0LmNvbXByZXNzaW9uID0gVEVYVF9DT01QUkVTU0lPTjsKLSAgICAgICAgIHRleHQua2V5ID0ga2V5OwotICAgICAgICAgLyogWXVjazogdGhlIHRleHQgbXVzdCBiZSB3cml0YWJsZSEgKi8KLSAgICAgICAgIHBvcyA9IHNhZmVjYXQoY29weSwgc2l6ZW9mIGNvcHksIDAsIHBzLT53bmFtZSk7Ci0gICAgICAgICB0ZXh0LnRleHQgPSBjb3B5OwotICAgICAgICAgdGV4dC50ZXh0X2xlbmd0aCA9IHBvczsKLSAgICAgICAgIHRleHQuaXR4dF9sZW5ndGggPSAwOwotICAgICAgICAgdGV4dC5sYW5nID0gMDsKLSAgICAgICAgIHRleHQubGFuZ19rZXkgPSAwOwotCi0gICAgICAgICBwbmdfc2V0X3RleHQocHAsIHBpLCAmdGV4dCwgMSk7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKGNvbG91cl90eXBlID09IDMpIC8qIHBhbGV0dGUgKi8KLSAgICAgICAgIGluaXRfc3RhbmRhcmRfcGFsZXR0ZShwcywgcHAsIHBpLCAxVSA8PCBiaXRfZGVwdGgsIDEvKmRvIHRSTlMqLyk7Ci0KLSMgICAgIGlmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRAotICAgICAgICAgZWxzZSBpZiAocGFsZXR0ZV9udW1iZXIpCi0gICAgICAgICAgICBzZXRfcmFuZG9tX3RSTlMocHAsIHBpLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKTsKLSMgICAgIGVuZGlmCi0KLSAgICAgIHBuZ193cml0ZV9pbmZvKHBwLCBwaSk7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3Jvd2J5dGVzKHBwLCBwaSkgIT0KLSAgICAgICAgICB0cmFuc2Zvcm1fcm93c2l6ZShwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkpCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJ0cmFuc2Zvcm0gcm93IHNpemUgaW5jb3JyZWN0Iik7Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8qIFNvbWV3aGF0IGNvbmZ1c2luZ2x5IHRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiBwbmdfd3JpdGVfaW5mbwotICAgICAgICAgICogYmVjYXVzZSBpZiBpdCBpcyBjYWxsZWQgYmVmb3JlLCB0aGUgaW5mb3JtYXRpb24gaW4gKnBwIGhhcyBub3QgYmVlbgotICAgICAgICAgICogdXBkYXRlZCB0byByZWZsZWN0IHRoZSBpbnRlcmxhY2VkIGltYWdlLgotICAgICAgICAgICovCi0gICAgICAgICBpbnQgbnBhc3NlcyA9IHNldF93cml0ZV9pbnRlcmxhY2VfaGFuZGxpbmcocHAsIGludGVybGFjZV90eXBlKTsKLSAgICAgICAgIGludCBwYXNzOwotCi0gICAgICAgICBpZiAobnBhc3NlcyAhPSBucGFzc2VzX2Zyb21faW50ZXJsYWNlX3R5cGUocHAsIGludGVybGFjZV90eXBlKSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgIndyaXRlOiBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyBmYWlsZWQiKTsKLQotICAgICAgICAgZm9yIChwYXNzPTA7IHBhc3M8bnBhc3NlczsgKytwYXNzKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMzIgeTsKLQotICAgICAgICAgICAgLyogZG9fb3duX2ludGVybGFjZSBpcyBhIHByZS1kZWZpbmVkIGJvb2xlYW4gKGEgI2RlZmluZSkgd2hpY2ggaXMKLSAgICAgICAgICAgICAqIHNldCBpZiB3ZSBoYXZlIHRvIHdvcmsgb3V0IHRoZSBpbnRlcmxhY2VkIHJvd3MgaGVyZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yICh5PTA7IHk8aDsgKyt5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX2J5dGUgYnVmZmVyW1RSQU5TRk9STV9ST1dNQVhdOwotCi0gICAgICAgICAgICAgICB0cmFuc2Zvcm1fcm93KHBwLCBidWZmZXIsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHkpOwotCi0jICAgICAgICAgICAgICBpZiBkb19vd25faW50ZXJsYWNlCi0gICAgICAgICAgICAgICAgICAvKiBJZiBkb19vd25faW50ZXJsYWNlICphbmQqIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkIHdlIG5lZWQgYQotICAgICAgICAgICAgICAgICAgICogcmVkdWNlZCBpbnRlcmxhY2Ugcm93OyB0aGlzIG1heSBiZSByZWR1Y2VkIHRvIGVtcHR5LgotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICBpZiAoaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSByb3cgbXVzdCBub3QgYmUgd3JpdHRlbiBpZiBpdCBkb2Vzbid0IGV4aXN0LCBub3RpY2UKLSAgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgdGhlcmUgYXJlIHR3byBjb25kaXRpb25zIGhlcmUsIGVpdGhlciB0aGUgcm93IGlzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgKiBldmVyIGluIHRoZSBwYXNzIG9yIHRoZSByb3cgd291bGQgYmUgYnV0IGlzbid0IHdpZGUKLSAgICAgICAgICAgICAgICAgICAgICAqIGVub3VnaCB0byBjb250cmlidXRlIGFueSBwaXhlbHMuICBJbiBmYWN0IHRoZSB3UGFzcyB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgKiBjYW4gYmUgdXNlZCB0byBza2lwIHRoZSB3aG9sZSB5IGxvb3AgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICBpZiAoUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBwYXNzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19QQVNTX0NPTFModywgcGFzcykgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlX3JvdyhidWZmZXIsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9zaXplKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKSwgdywgcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAvKmRhdGEgYWx3YXlzIGJpZ2VuZGlhbiovKTsKLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgfQotIyAgICAgICAgICAgICAgZW5kaWYgLyogZG9fb3duX2ludGVybGFjZSAqLwotCi0gICAgICAgICAgICAgICBjaG9vc2VfcmFuZG9tX2ZpbHRlcihwcCwgcGFzcyA9PSAwICYmIHkgPT0gMCk7Ci0gICAgICAgICAgICAgICBwbmdfd3JpdGVfcm93KHBwLCBidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0gICAgICB7Ci0gICAgICAgICBzdGF0aWMgY2hhciBrZXlbXSA9ICJlbmQgbWFya2VyIjsKLSAgICAgICAgIHN0YXRpYyBjaGFyIGNvbW1lbnRbXSA9ICJlbmQiOwotICAgICAgICAgcG5nX3RleHQgdGV4dDsKLQotICAgICAgICAgLyogVXNlIGEgY29tcHJlc3NlZCB0ZXh0IHN0cmluZyB0byB0ZXN0IHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIG9mIHRleHQKLSAgICAgICAgICAqIGNvbXByZXNzaW9uIGFuZCBJREFUIGNvbXByZXNzaW9uLgotICAgICAgICAgICovCi0gICAgICAgICB0ZXh0LmNvbXByZXNzaW9uID0gVEVYVF9DT01QUkVTU0lPTjsKLSAgICAgICAgIHRleHQua2V5ID0ga2V5OwotICAgICAgICAgdGV4dC50ZXh0ID0gY29tbWVudDsKLSAgICAgICAgIHRleHQudGV4dF9sZW5ndGggPSAoc2l6ZW9mIGNvbW1lbnQpLTE7Ci0gICAgICAgICB0ZXh0Lml0eHRfbGVuZ3RoID0gMDsKLSAgICAgICAgIHRleHQubGFuZyA9IDA7Ci0gICAgICAgICB0ZXh0Lmxhbmdfa2V5ID0gMDsKLQotICAgICAgICAgcG5nX3NldF90ZXh0KHBwLCBwaSwgJnRleHQsIDEpOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIHBuZ193cml0ZV9lbmQocHAsIHBpKTsKLQotICAgICAgLyogQW5kIHN0b3JlIHRoaXMgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIGlkLCB0aGVuIGNsZWFuIHVwLiAqLwotICAgICAgc3RvcmVfc3RvcmVmaWxlKHBzLCBGSUxFSUQoY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgcGFsZXR0ZV9udW1iZXIsCi0gICAgICAgICBpbnRlcmxhY2VfdHlwZSwgMCwgMCwgMCkpOwotCi0gICAgICBzdG9yZV93cml0ZV9yZXNldChwcyk7Ci0gICB9Ci0KLSAgIENhdGNoKGZhdWx0KQotICAgewotICAgICAgLyogVXNlIHRoZSBwbmdfc3RvcmUgcmV0dXJuZWQgYnkgdGhlIGV4Y2VwdGlvbi4gVGhpcyBtYXkgaGVscCB0aGUgY29tcGlsZXIKLSAgICAgICAqIGJlY2F1c2UgJ3BzJyBpcyBub3QgdXNlZCBpbiB0aGlzIGJyYW5jaCBvZiB0aGUgc2V0am1wLiAgTm90ZSB0aGF0IGZhdWx0Ci0gICAgICAgKiBhbmQgcHMgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgdmFsdWUuCi0gICAgICAgKi8KLSAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KGZhdWx0KTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfdHJhbnNmb3JtX2ltYWdlcyhwbmdfbW9kaWZpZXIgKnBtKQotewotICAgcG5nX2J5dGUgY29sb3VyX3R5cGUgPSAwOwotICAgcG5nX2J5dGUgYml0X2RlcHRoID0gMDsKLSAgIHVuc2lnbmVkIGludCBwYWxldHRlX251bWJlciA9IDA7Ci0KLSAgIC8qIFRoaXMgaXMgaW4gY2FzZSBvZiBlcnJvcnMuICovCi0gICBzYWZlY2F0KHBtLT50aGlzLnRlc3QsIHNpemVvZiBwbS0+dGhpcy50ZXN0LCAwLCAibWFrZSBzdGFuZGFyZCBpbWFnZXMiKTsKLQotICAgLyogVXNlIG5leHRfZm9ybWF0IHRvIGVudW1lcmF0ZSBhbGwgdGhlIGNvbWJpbmF0aW9ucyB3ZSB0ZXN0LCBpbmNsdWRpbmcKLSAgICAqIGdlbmVyYXRpbmcgbXVsdGlwbGUgbG93IGJpdCBkZXB0aCBwYWxldHRlIGltYWdlcy4gTm9uLUEgaW1hZ2VzIChwYWxldHRlCi0gICAgKiBhbmQgZGlyZWN0KSBhcmUgY3JlYXRlZCB3aXRoIGFuZCB3aXRob3V0IHRSTlMgY2h1bmtzLgotICAgICovCi0gICB3aGlsZSAobmV4dF9mb3JtYXQoJmNvbG91cl90eXBlLCAmYml0X2RlcHRoLCAmcGFsZXR0ZV9udW1iZXIsIDEsIDEpKQotICAgewotICAgICAgaW50IGludGVybGFjZV90eXBlOwotCi0gICAgICBmb3IgKGludGVybGFjZV90eXBlID0gUE5HX0lOVEVSTEFDRV9OT05FOwotICAgICAgICAgICBpbnRlcmxhY2VfdHlwZSA8IElOVEVSTEFDRV9MQVNUOyArK2ludGVybGFjZV90eXBlKQotICAgICAgewotICAgICAgICAgY2hhciBuYW1lW0ZJTEVfTkFNRV9TSVpFXTsKLQotICAgICAgICAgc3RhbmRhcmRfbmFtZShuYW1lLCBzaXplb2YgbmFtZSwgMCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwKLSAgICAgICAgICAgIHBhbGV0dGVfbnVtYmVyLCBpbnRlcmxhY2VfdHlwZSwgMCwgMCwgZG9fb3duX2ludGVybGFjZSk7Ci0gICAgICAgICBtYWtlX3RyYW5zZm9ybV9pbWFnZSgmcG0tPnRoaXMsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHBhbGV0dGVfbnVtYmVyLAotICAgICAgICAgICAgaW50ZXJsYWNlX3R5cGUsIG5hbWUpOwotICAgICAgfQotICAgfQotfQotCi0vKiBCdWlsZCBhIHNpbmdsZSByb3cgZm9yIHRoZSAnc2l6ZScgdGVzdCBpbWFnZXM7IHRoaXMgZmlsbHMgaW4gb25seSB0aGUKLSAqIGZpcnN0IGJpdF93aWR0aCBiaXRzIG9mIHRoZSBzYW1wbGUgcm93LgotICovCi1zdGF0aWMgdm9pZAotc2l6ZV9yb3cocG5nX2J5dGUgYnVmZmVyW1NJWkVfUk9XTUFYXSwgcG5nX3VpbnRfMzIgYml0X3dpZHRoLCBwbmdfdWludF8zMiB5KQotewotICAgLyogaGVpZ2h0IGlzIGluIHRoZSByYW5nZSAxIHRvIDE2LCBzbzogKi8KLSAgIHkgPSAoKHkgJiAxKSA8PCA3KSArICgoeSAmIDIpIDw8IDYpICsgKCh5ICYgNCkgPDwgNSkgKyAoKHkgJiA4KSA8PCA0KTsKLSAgIC8qIHRoZSBmb2xsb3dpbmcgZW5zdXJlcyBiaXRzIGFyZSBzZXQgaW4gc21hbGwgaW1hZ2VzOiAqLwotICAgeSBePSAweEE1OwotCi0gICB3aGlsZSAoYml0X3dpZHRoID49IDgpCi0gICAgICAqYnVmZmVyKysgPSAocG5nX2J5dGUpeSsrLCBiaXRfd2lkdGggLT0gODsKLQotICAgLyogVGhlcmUgbWF5IGJlIHVwIHRvIDcgcmVtYWluaW5nIGJpdHMsIHRoZXNlIGdvIGluIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0gICAgKiBiaXRzIG9mIHRoZSBieXRlLgotICAgICovCi0gICBpZiAoYml0X3dpZHRoID4gMCkKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIG1hc2sgPSAoMVU8PCg4LWJpdF93aWR0aCkpLTE7Ci0gICAgICAqYnVmZmVyID0gKHBuZ19ieXRlKSgoKmJ1ZmZlciAmIG1hc2spIHwgKHkgJiB+bWFzaykpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9zaXplX2ltYWdlKHBuZ19zdG9yZSogY29uc3QgcHMsIHBuZ19ieXRlIGNvbnN0IGNvbG91cl90eXBlLAotICAgIHBuZ19ieXRlIGNvbnN0IGJpdF9kZXB0aCwgaW50IGNvbnN0IGludGVybGFjZV90eXBlLAotICAgIHBuZ191aW50XzMyIGNvbnN0IHcsIHBuZ191aW50XzMyIGNvbnN0IGgsCi0gICAgaW50IGNvbnN0IGRvX2ludGVybGFjZSkKLXsKLSAgIGNvbnRleHQocHMsIGZhdWx0KTsKLQotICAgY2hlY2tfaW50ZXJsYWNlX3R5cGUoaW50ZXJsYWNlX3R5cGUpOwotCi0gICBUcnkKLSAgIHsKLSAgICAgIHBuZ19pbmZvcCBwaTsKLSAgICAgIHBuZ19zdHJ1Y3RwIHBwOwotICAgICAgdW5zaWduZWQgaW50IHBpeGVsX3NpemU7Ci0KLSAgICAgIC8qIE1ha2UgYSBuYW1lIGFuZCBnZXQgYW4gYXBwcm9wcmlhdGUgaWQgZm9yIHRoZSBzdG9yZTogKi8KLSAgICAgIGNoYXIgbmFtZVtGSUxFX05BTUVfU0laRV07Ci0gICAgICBjb25zdCBwbmdfdWludF8zMiBpZCA9IEZJTEVJRChjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCAwLypwYWxldHRlKi8sCi0gICAgICAgICBpbnRlcmxhY2VfdHlwZSwgdywgaCwgZG9faW50ZXJsYWNlKTsKLQotICAgICAgc3RhbmRhcmRfbmFtZV9mcm9tX2lkKG5hbWUsIHNpemVvZiBuYW1lLCAwLCBpZCk7Ci0gICAgICBwcCA9IHNldF9zdG9yZV9mb3Jfd3JpdGUocHMsICZwaSwgbmFtZSk7Ci0KLSAgICAgIC8qIEluIHRoZSBldmVudCBvZiBhIHByb2JsZW0gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIENhdGNoIHN0YXRlbWVudCBiZWxvdwotICAgICAgICogdG8gZG8gdGhlIGNsZWFuIHVwIC0gaXQgaXMgbm90IHBvc3NpYmxlIHRvICdyZXR1cm4nIGRpcmVjdGx5IGZyb20gYSBUcnkKLSAgICAgICAqIGJsb2NrLgotICAgICAgICovCi0gICAgICBpZiAocHAgPT0gTlVMTCkKLSAgICAgICAgIFRocm93IHBzOwotCi0gICAgICBwbmdfc2V0X0lIRFIocHAsIHBpLCB3LCBoLCBiaXRfZGVwdGgsIGNvbG91cl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsIFBOR19GSUxURVJfVFlQRV9CQVNFKTsKLQotI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAotICAgICAgewotICAgICAgICAgc3RhdGljIGNoYXIga2V5W10gPSAiaW1hZ2UgbmFtZSI7IC8qIG11c3QgYmUgd3JpdGVhYmxlICovCi0gICAgICAgICBzaXplX3QgcG9zOwotICAgICAgICAgcG5nX3RleHQgdGV4dDsKLSAgICAgICAgIGNoYXIgY29weVtGSUxFX05BTUVfU0laRV07Ci0KLSAgICAgICAgIC8qIFVzZSBhIGNvbXByZXNzZWQgdGV4dCBzdHJpbmcgdG8gdGVzdCB0aGUgY29ycmVjdCBpbnRlcmFjdGlvbiBvZiB0ZXh0Ci0gICAgICAgICAgKiBjb21wcmVzc2lvbiBhbmQgSURBVCBjb21wcmVzc2lvbi4KLSAgICAgICAgICAqLwotICAgICAgICAgdGV4dC5jb21wcmVzc2lvbiA9IFRFWFRfQ09NUFJFU1NJT047Ci0gICAgICAgICB0ZXh0LmtleSA9IGtleTsKLSAgICAgICAgIC8qIFl1Y2s6IHRoZSB0ZXh0IG11c3QgYmUgd3JpdGFibGUhICovCi0gICAgICAgICBwb3MgPSBzYWZlY2F0KGNvcHksIHNpemVvZiBjb3B5LCAwLCBwcy0+d25hbWUpOwotICAgICAgICAgdGV4dC50ZXh0ID0gY29weTsKLSAgICAgICAgIHRleHQudGV4dF9sZW5ndGggPSBwb3M7Ci0gICAgICAgICB0ZXh0Lml0eHRfbGVuZ3RoID0gMDsKLSAgICAgICAgIHRleHQubGFuZyA9IDA7Ci0gICAgICAgICB0ZXh0Lmxhbmdfa2V5ID0gMDsKLQotICAgICAgICAgcG5nX3NldF90ZXh0KHBwLCBwaSwgJnRleHQsIDEpOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChjb2xvdXJfdHlwZSA9PSAzKSAvKiBwYWxldHRlICovCi0gICAgICAgICBpbml0X3N0YW5kYXJkX3BhbGV0dGUocHMsIHBwLCBwaSwgMVUgPDwgYml0X2RlcHRoLCAwLypkbyB0Uk5TKi8pOwotCi0gICAgICBwbmdfd3JpdGVfaW5mbyhwcCwgcGkpOwotCi0gICAgICAvKiBDYWxjdWxhdGUgdGhlIGJpdCBzaXplLCBkaXZpZGUgYnkgOCB0byBnZXQgdGhlIGJ5dGUgc2l6ZSAtIHRoaXMgd29uJ3QKLSAgICAgICAqIG92ZXJmbG93IGJlY2F1c2Ugd2Uga25vdyB0aGUgdyB2YWx1ZXMgYXJlIGFsbCBzbWFsbCBlbm91Z2ggZXZlbiBmb3IKLSAgICAgICAqIGEgc3lzdGVtIHdoZXJlICd1bnNpZ25lZCBpbnQnIGlzIG9ubHkgMTYgYml0cy4KLSAgICAgICAqLwotICAgICAgcGl4ZWxfc2l6ZSA9IGJpdF9zaXplKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKTsKLSAgICAgIGlmIChwbmdfZ2V0X3Jvd2J5dGVzKHBwLCBwaSkgIT0gKCh3ICogcGl4ZWxfc2l6ZSkgKyA3KSAvIDgpCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJzaXplIHJvdyBzaXplIGluY29ycmVjdCIpOwotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbnQgbnBhc3NlcyA9IG5wYXNzZXNfZnJvbV9pbnRlcmxhY2VfdHlwZShwcCwgaW50ZXJsYWNlX3R5cGUpOwotICAgICAgICAgcG5nX3VpbnRfMzIgeTsKLSAgICAgICAgIGludCBwYXNzOwotICAgICAgICAgcG5nX2J5dGUgaW1hZ2VbMTZdW1NJWkVfUk9XTUFYXTsKLQotICAgICAgICAgLyogVG8gaGVscCBjb25zaXN0ZW50IGVycm9yIGRldGVjdGlvbiBtYWtlIHRoZSBwYXJ0cyBvZiB0aGlzIGJ1ZmZlcgotICAgICAgICAgICogdGhhdCBhcmVuJ3Qgc2V0IGJlbG93IGFsbCAnMSc6Ci0gICAgICAgICAgKi8KLSAgICAgICAgIG1lbXNldChpbWFnZSwgMHhmZiwgc2l6ZW9mIGltYWdlKTsKLQotICAgICAgICAgaWYgKCFkb19pbnRlcmxhY2UgJiYKLSAgICAgICAgICAgICBucGFzc2VzICE9IHNldF93cml0ZV9pbnRlcmxhY2VfaGFuZGxpbmcocHAsIGludGVybGFjZV90eXBlKSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgIndyaXRlOiBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyBmYWlsZWQiKTsKLQotICAgICAgICAgLyogUHJlcGFyZSB0aGUgd2hvbGUgaW1hZ2UgZmlyc3QgdG8gYXZvaWQgbWFraW5nIGl0IDcgdGltZXM6ICovCi0gICAgICAgICBmb3IgKHk9MDsgeTxoOyArK3kpCi0gICAgICAgICAgICBzaXplX3JvdyhpbWFnZVt5XSwgdyAqIHBpeGVsX3NpemUsIHkpOwotCi0gICAgICAgICBmb3IgKHBhc3M9MDsgcGFzczxucGFzc2VzOyArK3Bhc3MpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIHR3byBhcmUgZm9yIGNoZWNraW5nIHRoZSBtYWNyb3M6ICovCi0gICAgICAgICAgICBjb25zdCBwbmdfdWludF8zMiB3UGFzcyA9IFBOR19QQVNTX0NPTFModywgcGFzcyk7Ci0KLSAgICAgICAgICAgIC8qIElmIGRvX2ludGVybGFjZSBpcyBzZXQgd2UgZG9uJ3QgY2FsbCBwbmdfd3JpdGVfcm93IGZvciBldmVyeQotICAgICAgICAgICAgICogcm93IGJlY2F1c2Ugc29tZSBvZiB0aGVtIGFyZSBlbXB0eS4gIEluIGZhY3QsIGZvciBhIDF4MSBpbWFnZSwKLSAgICAgICAgICAgICAqIG1vc3Qgb2YgdGhlbSBhcmUgZW1wdHkhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoeT0wOyB5PGg7ICsreSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ19jb25zdF9ieXRlcCByb3cgPSBpbWFnZVt5XTsKLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHRlbXBSb3dbU0laRV9ST1dNQVhdOwotCi0gICAgICAgICAgICAgICAvKiBJZiBkb19pbnRlcmxhY2UgKmFuZCogdGhlIGltYWdlIGlzIGludGVybGFjZWQgd2UKLSAgICAgICAgICAgICAgICAqIG5lZWQgYSByZWR1Y2VkIGludGVybGFjZSByb3c7IHRoaXMgbWF5IGJlIHJlZHVjZWQKLSAgICAgICAgICAgICAgICAqIHRvIGVtcHR5LgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBpZiAoZG9faW50ZXJsYWNlICYmIGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBUaGUgcm93IG11c3Qgbm90IGJlIHdyaXR0ZW4gaWYgaXQgZG9lc24ndCBleGlzdCwgbm90aWNlCi0gICAgICAgICAgICAgICAgICAgKiB0aGF0IHRoZXJlIGFyZSB0d28gY29uZGl0aW9ucyBoZXJlLCBlaXRoZXIgdGhlIHJvdyBpc24ndAotICAgICAgICAgICAgICAgICAgICogZXZlciBpbiB0aGUgcGFzcyBvciB0aGUgcm93IHdvdWxkIGJlIGJ1dCBpc24ndCB3aWRlCi0gICAgICAgICAgICAgICAgICAgKiBlbm91Z2ggdG8gY29udHJpYnV0ZSBhbnkgcGl4ZWxzLiAgSW4gZmFjdCB0aGUgd1Bhc3MgdGVzdAotICAgICAgICAgICAgICAgICAgICogY2FuIGJlIHVzZWQgdG8gc2tpcCB0aGUgd2hvbGUgeSBsb29wIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgaWYgKFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1MoeSwgcGFzcykgJiYgd1Bhc3MgPiAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIGFsbCAxJ3MgZm9yIGVycm9yIGRldGVjdGlvbiAobGlicG5nIHRlbmRzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgKiBzZXQgdW5zZXQgdGhpbmdzIHRvIDApLgotICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGVtcFJvdywgMHhmZiwgc2l6ZW9mIHRlbXBSb3cpOwotICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlX3Jvdyh0ZW1wUm93LCByb3csIHBpeGVsX3NpemUsIHcsIHBhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLypkYXRhIGFsd2F5cyBiaWdlbmRpYW4qLyk7Ci0gICAgICAgICAgICAgICAgICAgICByb3cgPSB0ZW1wUm93OwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICB9Ci0KLSMgICAgICAgICAgIGlmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECi0gICAgICAgICAgICAgICAvKiBPbmx5IGdldCB0byBoZXJlIGlmIHRoZSByb3cgaGFzIHNvbWUgcGl4ZWxzIGluIGl0LCBzZXQgdGhlCi0gICAgICAgICAgICAgICAgKiBmaWx0ZXJzIHRvICdhbGwnIGZvciB0aGUgdmVyeSBmaXJzdCByb3cgYW5kIHRoZXJlYWZ0ZXIgdG8gYQotICAgICAgICAgICAgICAgICogc2luZ2xlIGZpbHRlci4gIEl0IGlzbid0IHdlbGwgZG9jdW1lbnRlZCwgYnV0IHBuZ19zZXRfZmlsdGVyCi0gICAgICAgICAgICAgICAgKiBkb2VzIGFjY2VwdCBhIGZpbHRlciBudW1iZXIgKHBlciB0aGUgc3BlYykgYXMgd2VsbCBhcyBhIGJpdAotICAgICAgICAgICAgICAgICogbWFzay4KLSAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgKiBUaGUgY29kZSBub3cgdXNlcyBmaWx0ZXJzIGF0IHJhbmRvbSwgZXhjZXB0IHRoYXQgb24gdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgKiByb3cgb2YgYW4gaW1hZ2UgaXQgZW5zdXJlcyB0aGF0IGEgcHJldmlvdXMgcm93IGZpbHRlciBpcyBpbgotICAgICAgICAgICAgICAgICogdGhlIHNldCBzbyB0aGF0IGxpYnBuZyBhbGxvY2F0ZXMgdGhlIHJvdyBidWZmZXIuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXJzID0gOCA8PCByYW5kb21fbW9kKFBOR19GSUxURVJfVkFMVUVfTEFTVCk7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDAgJiYgeSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgKGZpbHRlcnMgPCBQTkdfRklMVEVSX1VQIHx8IHcgPT0gMVUpKQotICAgICAgICAgICAgICAgICAgICAgZmlsdGVycyB8PSBQTkdfRklMVEVSX1VQOwotCi0gICAgICAgICAgICAgICAgICBwbmdfc2V0X2ZpbHRlcihwcCwgMC8qbWV0aG9kKi8sIGZpbHRlcnMpOwotICAgICAgICAgICAgICAgfQotIyAgICAgICAgICAgZW5kaWYKLQotICAgICAgICAgICAgICAgcG5nX3dyaXRlX3JvdyhwcCwgcm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLQotI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAotICAgICAgewotICAgICAgICAgc3RhdGljIGNoYXIga2V5W10gPSAiZW5kIG1hcmtlciI7Ci0gICAgICAgICBzdGF0aWMgY2hhciBjb21tZW50W10gPSAiZW5kIjsKLSAgICAgICAgIHBuZ190ZXh0IHRleHQ7Ci0KLSAgICAgICAgIC8qIFVzZSBhIGNvbXByZXNzZWQgdGV4dCBzdHJpbmcgdG8gdGVzdCB0aGUgY29ycmVjdCBpbnRlcmFjdGlvbiBvZiB0ZXh0Ci0gICAgICAgICAgKiBjb21wcmVzc2lvbiBhbmQgSURBVCBjb21wcmVzc2lvbi4KLSAgICAgICAgICAqLwotICAgICAgICAgdGV4dC5jb21wcmVzc2lvbiA9IFRFWFRfQ09NUFJFU1NJT047Ci0gICAgICAgICB0ZXh0LmtleSA9IGtleTsKLSAgICAgICAgIHRleHQudGV4dCA9IGNvbW1lbnQ7Ci0gICAgICAgICB0ZXh0LnRleHRfbGVuZ3RoID0gKHNpemVvZiBjb21tZW50KS0xOwotICAgICAgICAgdGV4dC5pdHh0X2xlbmd0aCA9IDA7Ci0gICAgICAgICB0ZXh0LmxhbmcgPSAwOwotICAgICAgICAgdGV4dC5sYW5nX2tleSA9IDA7Ci0KLSAgICAgICAgIHBuZ19zZXRfdGV4dChwcCwgcGksICZ0ZXh0LCAxKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBwbmdfd3JpdGVfZW5kKHBwLCBwaSk7Ci0KLSAgICAgIC8qIEFuZCBzdG9yZSB0aGlzIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBpZCwgdGhlbiBjbGVhbiB1cC4gKi8KLSAgICAgIHN0b3JlX3N0b3JlZmlsZShwcywgaWQpOwotCi0gICAgICBzdG9yZV93cml0ZV9yZXNldChwcyk7Ci0gICB9Ci0KLSAgIENhdGNoKGZhdWx0KQotICAgewotICAgICAgLyogVXNlIHRoZSBwbmdfc3RvcmUgcmV0dXJuZWQgYnkgdGhlIGV4Y2VwdGlvbi4gVGhpcyBtYXkgaGVscCB0aGUgY29tcGlsZXIKLSAgICAgICAqIGJlY2F1c2UgJ3BzJyBpcyBub3QgdXNlZCBpbiB0aGlzIGJyYW5jaCBvZiB0aGUgc2V0am1wLiAgTm90ZSB0aGF0IGZhdWx0Ci0gICAgICAgKiBhbmQgcHMgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgdmFsdWUuCi0gICAgICAgKi8KLSAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KGZhdWx0KTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1ha2Vfc2l6ZShwbmdfc3RvcmUqIGNvbnN0IHBzLCBwbmdfYnl0ZSBjb25zdCBjb2xvdXJfdHlwZSwgaW50IGJkbG8sCi0gICAgaW50IGNvbnN0IGJkaGkpCi17Ci0gICBmb3IgKDsgYmRsbyA8PSBiZGhpOyArK2JkbG8pCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiB3aWR0aDsKLQotICAgICAgZm9yICh3aWR0aCA9IDE7IHdpZHRoIDw9IDE2OyArK3dpZHRoKQotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgaGVpZ2h0OwotCi0gICAgICAgICBmb3IgKGhlaWdodCA9IDE7IGhlaWdodCA8PSAxNjsgKytoZWlnaHQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGUgZm91ciBjb21iaW5hdGlvbnMgb2YgRElZIGludGVybGFjZSBhbmQgaW50ZXJsYWNlIG9yIG5vdCAtCi0gICAgICAgICAgICAgKiBubyBpbnRlcmxhY2UgKyBESVkgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBubyBpbnRlcmxhY2Ugd2l0aAotICAgICAgICAgICAgICogbGlicG5nIGRvaW5nIGl0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtYWtlX3NpemVfaW1hZ2UocHMsIGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgUE5HX0lOVEVSTEFDRV9OT05FLAotICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMCk7Ci0gICAgICAgICAgICBtYWtlX3NpemVfaW1hZ2UocHMsIGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgUE5HX0lOVEVSTEFDRV9OT05FLAotICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMSk7Ci0jICAgICAgICBpZmRlZiBQTkdfV1JJVEVfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICAgICAgICAgICBtYWtlX3NpemVfaW1hZ2UocHMsIGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgUE5HX0lOVEVSTEFDRV9BREFNNywKLSAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDApOwotIyAgICAgICAgZW5kaWYKLSMgICAgICAgIGlmIENBTl9XUklURV9JTlRFUkxBQ0UKLSAgICAgICAgICAgIC8qIDEuNy4wIHJlbW92ZXMgdGhlIGhhY2sgdGhhdCBwcmV2ZW50ZWQgYXBwIHdyaXRlIG9mIGFuIGludGVybGFjZWQKLSAgICAgICAgICAgICAqIGltYWdlIGlmIFdSSVRFX0lOVEVSTEFDRSB3YXMgbm90IHN1cHBvcnRlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtYWtlX3NpemVfaW1hZ2UocHMsIGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgUE5HX0lOVEVSTEFDRV9BREFNNywKLSAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDEpOwotIyAgICAgICAgZW5kaWYKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1ha2Vfc2l6ZV9pbWFnZXMocG5nX3N0b3JlICpwcykKLXsKLSAgIC8qIFRoaXMgaXMgaW4gY2FzZSBvZiBlcnJvcnMuICovCi0gICBzYWZlY2F0KHBzLT50ZXN0LCBzaXplb2YgcHMtPnRlc3QsIDAsICJtYWtlIHNpemUgaW1hZ2VzIik7Ci0KLSAgIC8qIEFyZ3VtZW50cyBhcmUgY29sb3VyX3R5cGUsIGxvdyBiaXQgZGVwdGgsIGhpZ2ggYml0IGRlcHRoCi0gICAgKi8KLSAgIG1ha2Vfc2l6ZShwcywgMCwgMCwgV1JJVEVfQkRISSk7Ci0gICBtYWtlX3NpemUocHMsIDIsIDMsIFdSSVRFX0JESEkpOwotICAgbWFrZV9zaXplKHBzLCAzLCAwLCAzIC8qcGFsZXR0ZTogbWF4IDggYml0cyovKTsKLSAgIG1ha2Vfc2l6ZShwcywgNCwgMywgV1JJVEVfQkRISSk7Ci0gICBtYWtlX3NpemUocHMsIDYsIDMsIFdSSVRFX0JESEkpOwotfQotCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0vKiBSZXR1cm4gYSByb3cgYmFzZWQgb24gaW1hZ2UgaWQgYW5kICd5JyBmb3IgY2hlY2tpbmc6ICovCi1zdGF0aWMgdm9pZAotc3RhbmRhcmRfcm93KHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCBwbmdfYnl0ZSBzdGRbU1RBTkRBUkRfUk9XTUFYXSwKLSAgIHBuZ191aW50XzMyIGlkLCBwbmdfdWludF8zMiB5KQotewotICAgaWYgKFdJRFRIX0ZST01fSUQoaWQpID09IDApCi0gICAgICB0cmFuc2Zvcm1fcm93KHBwLCBzdGQsIENPTF9GUk9NX0lEKGlkKSwgREVQVEhfRlJPTV9JRChpZCksIHkpOwotICAgZWxzZQotICAgICAgc2l6ZV9yb3coc3RkLCBXSURUSF9GUk9NX0lEKGlkKSAqIGJpdF9zaXplKHBwLCBDT0xfRlJPTV9JRChpZCksCi0gICAgICAgICBERVBUSF9GUk9NX0lEKGlkKSksIHkpOwotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLwotCi0vKiBUZXN0cyAtIGluZGl2aWR1YWwgdGVzdCBjYXNlcyAqLwotLyogTGlrZSAnbWFrZV9zdGFuZGFyZCcgYnV0IGVycm9ycyBhcmUgZGVsaWJlcmF0ZWx5IGludHJvZHVjZWQgaW50byB0aGUgY2FsbHMKLSAqIHRvIGVuc3VyZSB0aGF0IHRoZXkgZ2V0IGRldGVjdGVkIC0gaXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byB3cml0ZSBhbgotICogaW52YWxpZCBpbWFnZSB3aXRoIGxpYnBuZyEKLSAqLwotLyogVE9ETzogdGhlICdzZXQnIGZ1bmN0aW9ucyBjYW4gcHJvYmFibHkgYWxsIGJlIG1hZGUgdG8gdGFrZSBhCi0gKiBwbmdfY29uc3Rfc3RydWN0cCByYXRoZXIgdGhhbiBhIG1vZGlmaWFibGUgb25lLgotICovCi0jaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLXNCSVQwX2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICAvKiAwIGlzIGludmFsaWQuLi4gKi8KLSAgIHBuZ19jb2xvcl84IGJhZDsKLSAgIGJhZC5yZWQgPSBiYWQuZ3JlZW4gPSBiYWQuYmx1ZSA9IGJhZC5ncmF5ID0gYmFkLmFscGhhID0gMDsKLSAgIHBuZ19zZXRfc0JJVChwcCwgcGksICZiYWQpOwotfQotCi1zdGF0aWMgdm9pZAotc0JJVF9lcnJvcl9mbihwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgcG5nX2J5dGUgYml0X2RlcHRoOwotICAgcG5nX2NvbG9yXzggYmFkOwotCi0gICBpZiAocG5nX2dldF9jb2xvcl90eXBlKHBwLCBwaSkgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIGJpdF9kZXB0aCA9IDg7Ci0KLSAgIGVsc2UKLSAgICAgIGJpdF9kZXB0aCA9IHBuZ19nZXRfYml0X2RlcHRoKHBwLCBwaSk7Ci0KLSAgIC8qIE5vdyB3ZSBrbm93IHRoZSBiaXQgZGVwdGggd2UgY2FuIGVhc2lseSBnZW5lcmF0ZSBhbiBpbnZhbGlkIHNCSVQgZW50cnkgKi8KLSAgIGJhZC5yZWQgPSBiYWQuZ3JlZW4gPSBiYWQuYmx1ZSA9IGJhZC5ncmF5ID0gYmFkLmFscGhhID0KLSAgICAgIChwbmdfYnl0ZSkoYml0X2RlcHRoKzEpOwotICAgcG5nX3NldF9zQklUKHBwLCBwaSwgJmJhZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLXsKLSAgIHZvaWQgICAgICAgICAgKCpmbikocG5nX3N0cnVjdHAsIHBuZ19pbmZvcCk7Ci0gICBjb25zdCBjaGFyICptc2c7Ci0gICB1bnNpZ25lZCBpbnQgICAgd2FybmluZyA6MTsgLyogdGhlIGVycm9yIGlzIGEgd2FybmluZy4uLiAqLwotfSBlcnJvcl90ZXN0W10gPQotICAgIHsKLSAgICAgICAvKiBubyB3YXJuaW5ncyBtYWtlcyB0aGVzZSBlcnJvcnMgdW5kZXRlY3RhYmxlIHByaW9yIHRvIDEuNy4wICovCi0gICAgICAgeyBzQklUMF9lcnJvcl9mbiwgInNCSVQoMCk6IGZhaWxlZCB0byBkZXRlY3QgZXJyb3IiLAotICAgICAgICAgUE5HX0xJQlBOR19WRVIgPCAxMDcwMCB9LAotCi0gICAgICAgeyBzQklUX2Vycm9yX2ZuLCAic0JJVCh0b28gYmlnKTogZmFpbGVkIHRvIGRldGVjdCBlcnJvciIsCi0gICAgICAgICBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwIH0sCi0gICAgfTsKLQotc3RhdGljIHZvaWQKLW1ha2VfZXJyb3IocG5nX3N0b3JlKiBjb25zdCBwcywgcG5nX2J5dGUgY29uc3QgY29sb3VyX3R5cGUsCi0gICAgcG5nX2J5dGUgYml0X2RlcHRoLCBpbnQgaW50ZXJsYWNlX3R5cGUsIGludCB0ZXN0LCBwbmdfY29uc3RfY2hhcnAgbmFtZSkKLXsKLSAgIGNvbnRleHQocHMsIGZhdWx0KTsKLQotICAgY2hlY2tfaW50ZXJsYWNlX3R5cGUoaW50ZXJsYWNlX3R5cGUpOwotCi0gICBUcnkKLSAgIHsKLSAgICAgIHBuZ19pbmZvcCBwaTsKLSAgICAgIGNvbnN0IHBuZ19zdHJ1Y3RwIHBwID0gc2V0X3N0b3JlX2Zvcl93cml0ZShwcywgJnBpLCBuYW1lKTsKLSAgICAgIHBuZ191aW50XzMyIHcsIGg7Ci0gICAgICBnbnVfdm9sYXRpbGUocHApCi0KLSAgICAgIGlmIChwcCA9PSBOVUxMKQotICAgICAgICAgVGhyb3cgcHM7Ci0KLSAgICAgIHcgPSB0cmFuc2Zvcm1fd2lkdGgocHAsIGNvbG91cl90eXBlLCBiaXRfZGVwdGgpOwotICAgICAgZ251X3ZvbGF0aWxlKHcpCi0gICAgICBoID0gdHJhbnNmb3JtX2hlaWdodChwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCk7Ci0gICAgICBnbnVfdm9sYXRpbGUoaCkKLSAgICAgIHBuZ19zZXRfSUhEUihwcCwgcGksIHcsIGgsIGJpdF9kZXB0aCwgY29sb3VyX3R5cGUsIGludGVybGFjZV90eXBlLAotICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOwotCi0gICAgICBpZiAoY29sb3VyX3R5cGUgPT0gMykgLyogcGFsZXR0ZSAqLwotICAgICAgICAgaW5pdF9zdGFuZGFyZF9wYWxldHRlKHBzLCBwcCwgcGksIDFVIDw8IGJpdF9kZXB0aCwgMC8qZG8gdFJOUyovKTsKLQotICAgICAgLyogVGltZSBmb3IgYSBmZXcgZXJyb3JzOyB0aGVzZSBhcmUgaW4gdmFyaW91cyBvcHRpb25hbCBjaHVua3MsIHRoZQotICAgICAgICogc3RhbmRhcmQgdGVzdHMgdGVzdCB0aGUgc3RhbmRhcmQgY2h1bmtzIHByZXR0eSB3ZWxsLgotICAgICAgICovCi0jICAgICBkZWZpbmUgZXhjZXB0aW9uX19wcmV2IGV4Y2VwdGlvbl9wcmV2XzEKLSMgICAgIGRlZmluZSBleGNlcHRpb25fX2VudiBleGNlcHRpb25fZW52XzEKLSAgICAgIFRyeQotICAgICAgewotICAgICAgICAgZ251X3ZvbGF0aWxlKGV4Y2VwdGlvbl9fcHJldikKLQotICAgICAgICAgLyogRXhwZWN0IHRoaXMgdG8gdGhyb3c6ICovCi0gICAgICAgICBwcy0+ZXhwZWN0X2Vycm9yID0gIWVycm9yX3Rlc3RbdGVzdF0ud2FybmluZzsKLSAgICAgICAgIHBzLT5leHBlY3Rfd2FybmluZyA9IGVycm9yX3Rlc3RbdGVzdF0ud2FybmluZzsKLSAgICAgICAgIHBzLT5zYXdfd2FybmluZyA9IDA7Ci0gICAgICAgICBlcnJvcl90ZXN0W3Rlc3RdLmZuKHBwLCBwaSk7Ci0KLSAgICAgICAgIC8qIE5vcm1hbGx5IHRoZSBlcnJvciBpcyBvbmx5IGRldGVjdGVkIGhlcmU6ICovCi0gICAgICAgICBwbmdfd3JpdGVfaW5mbyhwcCwgcGkpOwotCi0gICAgICAgICAvKiBBbmQgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGl0IHdhcyBvbmx5IGEgd2FybmluZzogKi8KLSAgICAgICAgIGlmIChwcy0+ZXhwZWN0X3dhcm5pbmcgJiYgcHMtPnNhd193YXJuaW5nKQotICAgICAgICAgICAgVGhyb3cgcHM7Ci0KLSAgICAgICAgIC8qIElmIHdlIGdldCBoZXJlIHRoZXJlIGlzIGEgcHJvYmxlbSwgd2UgaGF2ZSBzdWNjZXNzIC0gbm8gZXJyb3Igb3IKLSAgICAgICAgICAqIG5vIHdhcm5pbmcgLSB3aGVuIHdlIHNob3VsZG4ndCBoYXZlIHN1Y2Nlc3MuICBMb2cgYW4gZXJyb3IuCi0gICAgICAgICAgKi8KLSAgICAgICAgIHN0b3JlX2xvZyhwcywgcHAsIGVycm9yX3Rlc3RbdGVzdF0ubXNnLCAxIC8qZXJyb3IqLyk7Ci0gICAgICB9Ci0KLSAgICAgIENhdGNoIChmYXVsdCkKLSAgICAgIHsgLyogZXhwZWN0ZWQgZXhpdCAqLwotICAgICAgfQotI3VuZGVmIGV4Y2VwdGlvbl9fcHJldgotI3VuZGVmIGV4Y2VwdGlvbl9fZW52Ci0KLSAgICAgIC8qIEFuZCBjbGVhciB0aGVzZSBmbGFncyAqLwotICAgICAgcHMtPmV4cGVjdF93YXJuaW5nID0gMDsKLQotICAgICAgaWYgKHBzLT5leHBlY3RfZXJyb3IpCi0gICAgICAgICBwcy0+ZXhwZWN0X2Vycm9yID0gMDsKLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLyogTm93IHdyaXRlIHRoZSB3aG9sZSBpbWFnZSwganVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGV0ZWN0ZWQsIG9yCi0gICAgICAgICAgKiB1bmRldGVjdGVkLCBlcnJybyBoYXMgbm90IGNyZWF0ZWQgcHJvYmxlbXMgaW5zaWRlIGxpYnBuZy4gIFRoaXMKLSAgICAgICAgICAqIGRvZXNuJ3Qgd29yayBpZiB0aGVyZSB3YXMgYSBwbmdfZXJyb3IgaW4gcG5nX3dyaXRlX2luZm8gYmVjYXVzZSB0aGF0Ci0gICAgICAgICAgKiBjYW4gYWJvcnQgYmVmb3JlIFBMVEUgd2FzIHdyaXR0ZW4uCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChwbmdfZ2V0X3Jvd2J5dGVzKHBwLCBwaSkgIT0KLSAgICAgICAgICAgICB0cmFuc2Zvcm1fcm93c2l6ZShwcCwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkpCi0gICAgICAgICAgICBwbmdfZXJyb3IocHAsICJyb3cgc2l6ZSBpbmNvcnJlY3QiKTsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgaW50IG5wYXNzZXMgPSBzZXRfd3JpdGVfaW50ZXJsYWNlX2hhbmRsaW5nKHBwLCBpbnRlcmxhY2VfdHlwZSk7Ci0gICAgICAgICAgICBpbnQgcGFzczsKLQotICAgICAgICAgICAgaWYgKG5wYXNzZXMgIT0gbnBhc3Nlc19mcm9tX2ludGVybGFjZV90eXBlKHBwLCBpbnRlcmxhY2VfdHlwZSkpCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ3cml0ZTogcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcgZmFpbGVkIik7Ci0KLSAgICAgICAgICAgIGZvciAocGFzcz0wOyBwYXNzPG5wYXNzZXM7ICsrcGFzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHk7Ci0KLSAgICAgICAgICAgICAgIGZvciAoeT0wOyB5PGg7ICsreSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBuZ19ieXRlIGJ1ZmZlcltUUkFOU0ZPUk1fUk9XTUFYXTsKLQotICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3JvdyhwcCwgYnVmZmVyLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCB5KTsKLQotIyAgICAgICAgICAgICAgICAgaWYgZG9fb3duX2ludGVybGFjZQotICAgICAgICAgICAgICAgICAgICAgLyogSWYgZG9fb3duX2ludGVybGFjZSAqYW5kKiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCB3ZQotICAgICAgICAgICAgICAgICAgICAgICogbmVlZCBhIHJlZHVjZWQgaW50ZXJsYWNlIHJvdzsgdGhpcyBtYXkgYmUgcmVkdWNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICogZW1wdHkuCi0gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHJvdyBtdXN0IG5vdCBiZSB3cml0dGVuIGlmIGl0IGRvZXNuJ3QgZXhpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBub3RpY2UgdGhhdCB0aGVyZSBhcmUgdHdvIGNvbmRpdGlvbnMgaGVyZSwgZWl0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICogcm93IGlzbid0IGV2ZXIgaW4gdGhlIHBhc3Mgb3IgdGhlIHJvdyB3b3VsZCBiZSBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzbid0IHdpZGUgZW5vdWdoIHRvIGNvbnRyaWJ1dGUgYW55IHBpeGVscy4gIEluIGZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSB3UGFzcyB0ZXN0IGNhbiBiZSB1c2VkIHRvIHNraXAgdGhlIHdob2xlIHkgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgICogaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBwYXNzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19QQVNTX0NPTFModywgcGFzcykgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlX3JvdyhidWZmZXIsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9zaXplKHBwLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoKSwgdywgcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAvKmRhdGEgYWx3YXlzIGJpZ2VuZGlhbiovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgfQotIyAgICAgICAgICAgICAgICAgZW5kaWYgLyogZG9fb3duX2ludGVybGFjZSAqLwotCi0gICAgICAgICAgICAgICAgICBwbmdfd3JpdGVfcm93KHBwLCBidWZmZXIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfSAvKiBpbWFnZSB3cml0aW5nICovCi0KLSAgICAgICAgIHBuZ193cml0ZV9lbmQocHAsIHBpKTsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIGZvbGxvd2luZyBkZWxldGVzIHRoZSBmaWxlIHRoYXQgd2FzIGp1c3Qgd3JpdHRlbi4gKi8KLSAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KHBzKTsKLSAgIH0KLQotICAgQ2F0Y2goZmF1bHQpCi0gICB7Ci0gICAgICBzdG9yZV93cml0ZV9yZXNldChmYXVsdCk7Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQKLW1ha2VfZXJyb3JzKHBuZ19tb2RpZmllciogY29uc3QgcG0sIHBuZ19ieXRlIGNvbnN0IGNvbG91cl90eXBlLAotICAgIGludCBiZGxvLCBpbnQgY29uc3QgYmRoaSkKLXsKLSAgIGZvciAoOyBiZGxvIDw9IGJkaGk7ICsrYmRsbykKLSAgIHsKLSAgICAgIGludCBpbnRlcmxhY2VfdHlwZTsKLQotICAgICAgZm9yIChpbnRlcmxhY2VfdHlwZSA9IFBOR19JTlRFUkxBQ0VfTk9ORTsKLSAgICAgICAgICAgaW50ZXJsYWNlX3R5cGUgPCBJTlRFUkxBQ0VfTEFTVDsgKytpbnRlcmxhY2VfdHlwZSkKLSAgICAgIHsKLSAgICAgICAgIHVuc2lnbmVkIGludCB0ZXN0OwotICAgICAgICAgY2hhciBuYW1lW0ZJTEVfTkFNRV9TSVpFXTsKLQotICAgICAgICAgc3RhbmRhcmRfbmFtZShuYW1lLCBzaXplb2YgbmFtZSwgMCwgY29sb3VyX3R5cGUsIDE8PGJkbG8sIDAsCi0gICAgICAgICAgICBpbnRlcmxhY2VfdHlwZSwgMCwgMCwgZG9fb3duX2ludGVybGFjZSk7Ci0KLSAgICAgICAgIGZvciAodGVzdD0wOyB0ZXN0PEFSUkFZX1NJWkUoZXJyb3JfdGVzdCk7ICsrdGVzdCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG1ha2VfZXJyb3IoJnBtLT50aGlzLCBjb2xvdXJfdHlwZSwgREVQVEgoYmRsbyksIGludGVybGFjZV90eXBlLAotICAgICAgICAgICAgICAgdGVzdCwgbmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICByZXR1cm4gMTsgLyoga2VlcCBnb2luZyAqLwotfQotI2VuZGlmIC8qIFBOR19XQVJOSU5HU19TVVBQT1JURUQgKi8KLQotc3RhdGljIHZvaWQKLXBlcmZvcm1fZXJyb3JfdGVzdChwbmdfbW9kaWZpZXIgKnBtKQotewotI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQgLyogZWxzZSB0aGVyZSBhcmUgbm8gY2FzZXMgdGhhdCB3b3JrISAqLwotICAgLyogTmVlZCB0byBkbyB0aGlzIGhlcmUgYmVjYXVzZSB3ZSBqdXN0IHdyaXRlIGluIHRoaXMgdGVzdC4gKi8KLSAgIHNhZmVjYXQocG0tPnRoaXMudGVzdCwgc2l6ZW9mIHBtLT50aGlzLnRlc3QsIDAsICJlcnJvciB0ZXN0Iik7Ci0KLSAgIGlmICghbWFrZV9lcnJvcnMocG0sIDAsIDAsIFdSSVRFX0JESEkpKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoIW1ha2VfZXJyb3JzKHBtLCAyLCAzLCBXUklURV9CREhJKSkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKCFtYWtlX2Vycm9ycyhwbSwgMywgMCwgMykpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmICghbWFrZV9lcnJvcnMocG0sIDQsIDMsIFdSSVRFX0JESEkpKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoIW1ha2VfZXJyb3JzKHBtLCA2LCAzLCBXUklURV9CREhJKSkKLSAgICAgIHJldHVybjsKLSNlbHNlCi0gICBVTlVTRUQocG0pCi0jZW5kaWYKLX0KLQotLyogVGhpcyBpcyBqdXN0IHRvIHZhbGlkYXRlIHRoZSBpbnRlcm5hbCBQTkcgZm9ybWF0dGluZyBjb2RlIC0gaWYgdGhpcyBmYWlscwotICogdGhlbiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGUgbGlicmFyeSBvdXRwdXRzIHdpbGwgcHJvYmFibHkgYmUgZ2FyYmFnZS4KLSAqLwotc3RhdGljIHZvaWQKLXBlcmZvcm1fZm9ybWF0dGluZ190ZXN0KHBuZ19zdG9yZSAqcHMpCi17Ci0jaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQKLSAgIC8qIFRoZSBoYW5kbGUgaW50byB0aGUgZm9ybWF0dGluZyBjb2RlIGlzIHRoZSBSRkMxMTIzIHN1cHBvcnQ7IHRoaXMgdGVzdCBkb2VzCi0gICAgKiBub3RoaW5nIGlmIHRoYXQgaXMgY29tcGlsZWQgb3V0LgotICAgICovCi0gICBjb250ZXh0KHBzLCBmYXVsdCk7Ci0KLSAgIFRyeQotICAgewotICAgICAgcG5nX2NvbnN0X2NoYXJwIGNvcnJlY3QgPSAiMjkgQXVnIDIwNzkgMTM6NTM6NjAgKzAwMDAiOwotICAgICAgcG5nX2NvbnN0X2NoYXJwIHJlc3VsdDsKLSMgICAgIGlmIFBOR19MSUJQTkdfVkVSID49IDEwNjAwCi0gICAgICAgICBjaGFyIHRpbWVzdHJpbmdbMjldOwotIyAgICAgZW5kaWYKLSAgICAgIHBuZ19zdHJ1Y3RwIHBwOwotICAgICAgcG5nX3RpbWUgcHQ7Ci0KLSAgICAgIHBwID0gc2V0X3N0b3JlX2Zvcl93cml0ZShwcywgTlVMTCwgImxpYnBuZyBmb3JtYXR0aW5nIHRlc3QiKTsKLQotICAgICAgaWYgKHBwID09IE5VTEwpCi0gICAgICAgICBUaHJvdyBwczsKLQotCi0gICAgICAvKiBBcmJpdHJhcnkgc2V0dGluZ3M6ICovCi0gICAgICBwdC55ZWFyID0gMjA3OTsKLSAgICAgIHB0Lm1vbnRoID0gODsKLSAgICAgIHB0LmRheSA9IDI5OwotICAgICAgcHQuaG91ciA9IDEzOwotICAgICAgcHQubWludXRlID0gNTM7Ci0gICAgICBwdC5zZWNvbmQgPSA2MDsgLyogYSBsZWFwIHNlY29uZCAqLwotCi0jICAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNjAwCi0gICAgICAgICByZXN1bHQgPSBwbmdfY29udmVydF90b19yZmMxMTIzKHBwLCAmcHQpOwotIyAgICAgZWxzZQotICAgICAgICAgaWYgKHBuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyKHRpbWVzdHJpbmcsICZwdCkpCi0gICAgICAgICAgICByZXN1bHQgPSB0aW1lc3RyaW5nOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBOVUxMOwotIyAgICAgZW5kaWYKLQotICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgcG5nX2Vycm9yKHBwLCAicG5nX2NvbnZlcnRfdG9fcmZjMTEyMyBmYWlsZWQiKTsKLQotICAgICAgaWYgKHN0cmNtcChyZXN1bHQsIGNvcnJlY3QpICE9IDApCi0gICAgICB7Ci0gICAgICAgICBzaXplX3QgcG9zID0gMDsKLSAgICAgICAgIGNoYXIgbXNnWzEyOF07Ci0KLSAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJwbmdfY29udmVydF90b19yZmMxMTIzKCIpOwotICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgY29ycmVjdCk7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKSByZXR1cm5lZDogJyIpOwotICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgcmVzdWx0KTsKLSAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICInIik7Ci0KLSAgICAgICAgIHBuZ19lcnJvcihwcCwgbXNnKTsKLSAgICAgIH0KLQotICAgICAgc3RvcmVfd3JpdGVfcmVzZXQocHMpOwotICAgfQotCi0gICBDYXRjaChmYXVsdCkKLSAgIHsKLSAgICAgIHN0b3JlX3dyaXRlX3Jlc2V0KGZhdWx0KTsKLSAgIH0KLSNlbHNlCi0gICBVTlVTRUQocHMpCi0jZW5kaWYKLX0KLQotI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRAotLyogQmVjYXVzZSB3ZSB3YW50IHRvIHVzZSB0aGUgc2FtZSBjb2RlIGluIGJvdGggdGhlIHByb2dyZXNzaXZlIHJlYWRlciBhbmQgdGhlCi0gKiBzZXF1ZW50aWFsIHJlYWRlciBpdCBpcyBuZWNlc3NhcnkgdG8gZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQgdGhlIHByb2dyZXNzaXZlCi0gKiByZWFkZXIgY2FsbGJhY2tzIG9ubHkgaGF2ZSBvbmUgcGFyYW1ldGVyIChwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cigpKSwgc28gdGhpcwotICogbXVzdCBjb250YWluIGFsbCB0aGUgdGVzdCBwYXJhbWV0ZXJzIGFuZCBhbGwgdGhlIGxvY2FsIHZhcmlhYmxlcyBkaXJlY3RseQotICogYWNjZXNzaWJsZSB0byB0aGUgc2VxdWVudGlhbCByZWFkZXIgaW1wbGVtZW50YXRpb24uCi0gKgotICogVGhlIHRlY2huaXF1ZSBhZG9wdGVkIGlzIHRvIHJlaW52ZW50IHBhcnQgb2Ygd2hhdCBEaWprc3RyYSB0ZXJtZWQgYQotICogJ2Rpc3BsYXknOyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgc3RhY2sgZnJhbWVzIG9mIGVuY2xvc2luZyBmdW5jdGlvbnMgc28KLSAqIHRoYXQgYSBuZXN0ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCAoQyBhdXRvKSB2YXJpYWJsZXMgb2YKLSAqIHRoZSBmdW5jdGlvbnMgdGhhdCBjb250YWluIGl0cyBkZWZpbml0aW9uLiAgSW4gZmFjdCBDIHByb3ZpZGVzIHRoZSBmaXJzdAotICogcG9pbnRlciAodGhlIGxvY2FsIHZhcmlhYmxlcyAtIHRoZSBzdGFjayBmcmFtZSBwb2ludGVyKSBhbmQgdGhlIGxhc3QgKHRoZQotICogZ2xvYmFsIHZhcmlhYmxlcyAtIHRoZSBCQ1BMIGdsb2JhbCB2ZWN0b3IgdHlwaWNhbGx5IGltcGxlbWVudGVkIGFzIGdsb2JhbAotICogYWRkcmVzc2VzKSwgdGhpcyBjb2RlIHJlcXVpcmVzIG9uZSBtb3JlIHBvaW50ZXIgdG8gbWFrZSB0aGUgZGlzcGxheSAtIHRoZQotICogbG9jYWwgdmFyaWFibGVzIChhbmQgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXJzKSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseQotICogaW52b2tlcyBlaXRoZXIgdGhlIHByb2dyZXNzaXZlIG9yIHNlcXVlbnRpYWwgcmVhZGVyLgotICoKLSAqIFBlcmhhcHMgY29uZnVzaW5nbHkgdGhpcyB0ZWNobmlxdWUgaXMgY29uZm91bmRlZCB3aXRoIGNsYXNzZXMgLSB0aGUKLSAqICdzdGFuZGFyZF9kaXNwbGF5JyBkZWZpbmVkIGhlcmUgaXMgc3ViLWNsYXNzZWQgYXMgdGhlICdnYW1tYV9kaXNwbGF5JyBiZWxvdy4KLSAqIEEgZ2FtbWFfZGlzcGxheSBpcyBhIHN0YW5kYXJkX2Rpc3BsYXksIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIEFOU0ktQwotICogcmVxdWlyZW1lbnQgdGhhdCB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG11c3QgYmUgdGhlCi0gKiBzYW1lIGFzIHRoZSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUuICBUaGlzIGFsbG93cyB1cyB0byByZXVzZSBzdGFuZGFyZF8KLSAqIGZ1bmN0aW9ucyBpbiB0aGUgZ2FtbWEgdGVzdCBjb2RlOyBzb21ldGhpbmcgdGhhdCBjb3VsZCBub3QgYmUgZG9uZSB3aXRoCi0gKiBuZXN0ZWQgZnVuY3Rpb25zIQotICovCi10eXBlZGVmIHN0cnVjdCBzdGFuZGFyZF9kaXNwbGF5Ci17Ci0gICBwbmdfc3RvcmUqICBwczsgICAgICAgICAgICAgLyogVGVzdCBwYXJhbWV0ZXJzIChwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uKSAqLwotICAgcG5nX2J5dGUgICAgY29sb3VyX3R5cGU7Ci0gICBwbmdfYnl0ZSAgICBiaXRfZGVwdGg7Ci0gICBwbmdfYnl0ZSAgICByZWRfc0JJVDsgICAgICAgLyogSW5wdXQgZGF0YSBzQklUIHZhbHVlcy4gKi8KLSAgIHBuZ19ieXRlICAgIGdyZWVuX3NCSVQ7Ci0gICBwbmdfYnl0ZSAgICBibHVlX3NCSVQ7Ci0gICBwbmdfYnl0ZSAgICBhbHBoYV9zQklUOwotICAgcG5nX2J5dGUgICAgaW50ZXJsYWNlX3R5cGU7Ci0gICBwbmdfYnl0ZSAgICBmaWxsZXI7ICAgICAgICAgLyogT3V0cHV0IGhhcyBhIGZpbGxlciAqLwotICAgcG5nX3VpbnRfMzIgaWQ7ICAgICAgICAgICAgIC8qIENhbGN1bGF0ZWQgZmlsZSBJRCAqLwotICAgcG5nX3VpbnRfMzIgdzsgICAgICAgICAgICAgIC8qIFdpZHRoIG9mIGltYWdlICovCi0gICBwbmdfdWludF8zMiBoOyAgICAgICAgICAgICAgLyogSGVpZ2h0IG9mIGltYWdlICovCi0gICBpbnQgICAgICAgICBucGFzc2VzOyAgICAgICAgLyogTnVtYmVyIG9mIGludGVybGFjZWQgcGFzc2VzICovCi0gICBwbmdfdWludF8zMiBwaXhlbF9zaXplOyAgICAgLyogV2lkdGggb2Ygb25lIHBpeGVsIGluIGJpdHMgKi8KLSAgIHBuZ191aW50XzMyIGJpdF93aWR0aDsgICAgICAvKiBXaWR0aCBvZiBvdXRwdXQgcm93IGluIGJpdHMgKi8KLSAgIHNpemVfdCAgICAgIGNiUm93OyAgICAgICAgICAvKiBCeXRlcyBpbiBhIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICBpbnQgICAgICAgICBkb19pbnRlcmxhY2U7ICAgLyogRG8gaW50ZXJsYWNpbmcgaW50ZXJuYWxseSAqLwotICAgaW50ICAgICAgICAgbGl0dGxlZW5kaWFuOyAgIC8qIEFwcCAocm93KSBkYXRhIGlzIGxpdHRsZSBlbmRpYW4gKi8KLSAgIGludCAgICAgICAgIGlzX3RyYW5zcGFyZW50OyAvKiBUcmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gd2FzIHByZXNlbnQuICovCi0gICBpbnQgICAgICAgICBoYXNfdFJOUzsgICAgICAgLyogY29sb3IgdHlwZSBHUkFZIG9yIFJHQiB3aXRoIGEgdFJOUyBjaHVuay4gKi8KLSAgIGludCAgICAgICAgIHNwZWVkOyAgICAgICAgICAvKiBEb2luZyBhIHNwZWVkIHRlc3QgKi8KLSAgIGludCAgICAgICAgIHVzZV91cGRhdGVfaW5mbzsvKiBDYWxsIHVwZGF0ZV9pbmZvLCBub3Qgc3RhcnRfaW1hZ2UgKi8KLSAgIHN0cnVjdAotICAgewotICAgICAgcG5nX3VpbnRfMTYgcmVkOwotICAgICAgcG5nX3VpbnRfMTYgZ3JlZW47Ci0gICAgICBwbmdfdWludF8xNiBibHVlOwotICAgfSAgICAgICAgICAgdHJhbnNwYXJlbnQ7ICAgIC8qIFRoZSB0cmFuc3BhcmVudCBjb2xvciwgaWYgc2V0LiAqLwotICAgaW50ICAgICAgICAgbnBhbGV0dGU7ICAgICAgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwYWxldHRlLiAqLwotICAgc3RvcmVfcGFsZXR0ZQotICAgICAgICAgICAgICAgcGFsZXR0ZTsKLX0gc3RhbmRhcmRfZGlzcGxheTsKLQotc3RhdGljIHZvaWQKLXN0YW5kYXJkX2Rpc3BsYXlfaW5pdChzdGFuZGFyZF9kaXNwbGF5ICpkcCwgcG5nX3N0b3JlKiBwcywgcG5nX3VpbnRfMzIgaWQsCi0gICBpbnQgZG9faW50ZXJsYWNlLCBpbnQgdXNlX3VwZGF0ZV9pbmZvKQotewotICAgbWVtc2V0KGRwLCAwLCBzaXplb2YgKmRwKTsKLQotICAgZHAtPnBzID0gcHM7Ci0gICBkcC0+Y29sb3VyX3R5cGUgPSBDT0xfRlJPTV9JRChpZCk7Ci0gICBkcC0+Yml0X2RlcHRoID0gREVQVEhfRlJPTV9JRChpZCk7Ci0gICBpZiAoZHAtPmJpdF9kZXB0aCA8IDEgfHwgZHAtPmJpdF9kZXB0aCA+IDE2KQotICAgICAgaW50ZXJuYWxfZXJyb3IocHMsICJpbnRlcm5hbDogYmFkIGJpdCBkZXB0aCIpOwotICAgaWYgKGRwLT5jb2xvdXJfdHlwZSA9PSAzKQotICAgICAgZHAtPnJlZF9zQklUID0gZHAtPmJsdWVfc0JJVCA9IGRwLT5ncmVlbl9zQklUID0gZHAtPmFscGhhX3NCSVQgPSA4OwotICAgZWxzZQotICAgICAgZHAtPnJlZF9zQklUID0gZHAtPmJsdWVfc0JJVCA9IGRwLT5ncmVlbl9zQklUID0gZHAtPmFscGhhX3NCSVQgPQotICAgICAgICAgZHAtPmJpdF9kZXB0aDsKLSAgIGRwLT5pbnRlcmxhY2VfdHlwZSA9IElOVEVSTEFDRV9GUk9NX0lEKGlkKTsKLSAgIGNoZWNrX2ludGVybGFjZV90eXBlKGRwLT5pbnRlcmxhY2VfdHlwZSk7Ci0gICBkcC0+aWQgPSBpZDsKLSAgIC8qIEFsbCB0aGUgcmVzdCBhcmUgZmlsbGVkIGluIGFmdGVyIHRoZSByZWFkX2luZm86ICovCi0gICBkcC0+dyA9IDA7Ci0gICBkcC0+aCA9IDA7Ci0gICBkcC0+bnBhc3NlcyA9IDA7Ci0gICBkcC0+cGl4ZWxfc2l6ZSA9IDA7Ci0gICBkcC0+Yml0X3dpZHRoID0gMDsKLSAgIGRwLT5jYlJvdyA9IDA7Ci0gICBkcC0+ZG9faW50ZXJsYWNlID0gZG9faW50ZXJsYWNlOwotICAgZHAtPmxpdHRsZWVuZGlhbiA9IDA7Ci0gICBkcC0+aXNfdHJhbnNwYXJlbnQgPSAwOwotICAgZHAtPnNwZWVkID0gcHMtPnNwZWVkOwotICAgZHAtPnVzZV91cGRhdGVfaW5mbyA9IHVzZV91cGRhdGVfaW5mbzsKLSAgIGRwLT5ucGFsZXR0ZSA9IDA7Ci0gICAvKiBQcmVzZXQgdGhlIHRyYW5zcGFyZW50IGNvbG9yIHRvIGJsYWNrOiAqLwotICAgbWVtc2V0KCZkcC0+dHJhbnNwYXJlbnQsIDAsIHNpemVvZiBkcC0+dHJhbnNwYXJlbnQpOwotICAgLyogUHJlc2V0IHRoZSBwYWxldHRlIHRvIGZ1bGwgaW50ZW5zaXR5L29wYXF1ZSB0aHJvdWdvdXQ6ICovCi0gICBtZW1zZXQoZHAtPnBhbGV0dGUsIDB4ZmYsIHNpemVvZiBkcC0+cGFsZXR0ZSk7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIHBhbGV0dGUgZmllbGRzIC0gdGhpcyBtdXN0IGJlIGRvbmUgbGF0ZXIgYmVjYXVzZSB0aGUgcGFsZXR0ZQotICogY29tZXMgZnJvbSB0aGUgcGFydGljdWxhciBwbmdfc3RvcmVfZmlsZSB0aGF0IGlzIHNlbGVjdGVkLgotICovCi1zdGF0aWMgdm9pZAotc3RhbmRhcmRfcGFsZXR0ZV9pbml0KHN0YW5kYXJkX2Rpc3BsYXkgKmRwKQotewotICAgc3RvcmVfcGFsZXR0ZV9lbnRyeSAqcGFsZXR0ZSA9IHN0b3JlX2N1cnJlbnRfcGFsZXR0ZShkcC0+cHMsICZkcC0+bnBhbGV0dGUpOwotCi0gICAvKiBUaGUgcmVtYWluaW5nIGVudHJpZXMgcmVtYWluIHdoaXRlL29wYXF1ZS4gKi8KLSAgIGlmIChkcC0+bnBhbGV0dGUgPiAwKQotICAgewotICAgICAgaW50IGkgPSBkcC0+bnBhbGV0dGU7Ci0gICAgICBtZW1jcHkoZHAtPnBhbGV0dGUsIHBhbGV0dGUsIGkgKiBzaXplb2YgKnBhbGV0dGUpOwotCi0gICAgICAvKiBDaGVjayBmb3IgYSBub24tb3BhcXVlIHBhbGV0dGUgZW50cnk6ICovCi0gICAgICB3aGlsZSAoLS1pID49IDApCi0gICAgICAgICBpZiAocGFsZXR0ZVtpXS5hbHBoYSA8IDI1NSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0jICAgICBpZmRlZiBfX0dOVUNfXwotICAgICAgICAgLyogR0NDIGNhbid0IGhhbmRsZSB0aGUgbW9yZSBvYnZpb3VzbHkgb3B0aW1pemFibGUgdmVyc2lvbi4gKi8KLSAgICAgICAgIGlmIChpID49IDApCi0gICAgICAgICAgICBkcC0+aXNfdHJhbnNwYXJlbnQgPSAxOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZHAtPmlzX3RyYW5zcGFyZW50ID0gMDsKLSMgICAgIGVsc2UKLSAgICAgICAgIGRwLT5pc190cmFuc3BhcmVudCA9IChpID49IDApOwotIyAgICAgZW5kaWYKLSAgIH0KLX0KLQotLyogVXRpbGl0eSB0byByZWFkIHRoZSBwYWxldHRlIGZyb20gdGhlIFBORyBmaWxlIGFuZCBjb252ZXJ0IGl0IGludG8KLSAqIHN0b3JlX3BhbGV0dGUgZm9ybWF0LiAgVGhpcyByZXR1cm5zIDEgaWYgdGhlcmUgaXMgYW55IHRyYW5zcGFyZW5jeSBpbiB0aGUKLSAqIHBhbGV0dGUgKGl0IGRvZXMgbm90IGNoZWNrIGZvciBhIHRyYW5zcGFyZW50IGNvbG91ciBpbiB0aGUgbm9uLXBhbGV0dGUgY2FzZS4pCi0gKi8KLXN0YXRpYyBpbnQKLXJlYWRfcGFsZXR0ZShzdG9yZV9wYWxldHRlIHBhbGV0dGUsIGludCAqbnBhbGV0dGUsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAotICAgcG5nX2luZm9wIHBpKQotewotICAgcG5nX2NvbG9ycCBwYWw7Ci0gICBwbmdfYnl0ZXAgdHJhbnNfYWxwaGE7Ci0gICBpbnQgbnVtOwotCi0gICBwYWwgPSAwOwotICAgKm5wYWxldHRlID0gLTE7Ci0KLSAgIGlmIChwbmdfZ2V0X1BMVEUocHAsIHBpLCAmcGFsLCBucGFsZXR0ZSkgJiBQTkdfSU5GT19QTFRFKQotICAgewotICAgICAgaW50IGkgPSAqbnBhbGV0dGU7Ci0KLSAgICAgIGlmIChpIDw9IDAgfHwgaSA+IDI1NikKLSAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBpbnZhbGlkIFBMVEUgY291bnQiKTsKLQotICAgICAgd2hpbGUgKC0taSA+PSAwKQotICAgICAgewotICAgICAgICAgcGFsZXR0ZVtpXS5yZWQgPSBwYWxbaV0ucmVkOwotICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiA9IHBhbFtpXS5ncmVlbjsKLSAgICAgICAgIHBhbGV0dGVbaV0uYmx1ZSA9IHBhbFtpXS5ibHVlOwotICAgICAgfQotCi0gICAgICAvKiBNYXJrIHRoZSByZW1haW5kZXIgb2YgdGhlIGVudHJpZXMgd2l0aCBhIGZsYWcgdmFsdWUgKG90aGVyIHRoYW4KLSAgICAgICAqIHdoaXRlL29wYXF1ZSB3aGljaCBpcyB0aGUgZmxhZyB2YWx1ZSBzdG9yZWQgYWJvdmUuKQotICAgICAgICovCi0gICAgICBtZW1zZXQocGFsZXR0ZSArICpucGFsZXR0ZSwgMTI2LCAoMjU2LSpucGFsZXR0ZSkgKiBzaXplb2YgKnBhbGV0dGUpOwotICAgfQotCi0gICBlbHNlIC8qICFwbmdfZ2V0X1BMVEUgKi8KLSAgIHsKLSAgICAgIGlmICgqbnBhbGV0dGUgIT0gKC0xKSkKLSAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBpbnZhbGlkIFBMVEUgcmVzdWx0Iik7Ci0gICAgICAvKiBCdXQgdGhlcmUgaXMgbm8gcGFsZXR0ZSwgc28gcmVjb3JkIHRoaXM6ICovCi0gICAgICAqbnBhbGV0dGUgPSAwOwotICAgICAgbWVtc2V0KHBhbGV0dGUsIDExMywgc2l6ZW9mIChzdG9yZV9wYWxldHRlKSk7Ci0gICB9Ci0KLSAgIHRyYW5zX2FscGhhID0gMDsKLSAgIG51bSA9IDI7IC8qIGZvcmNlIGVycm9yIGJlbG93ICovCi0gICBpZiAoKHBuZ19nZXRfdFJOUyhwcCwgcGksICZ0cmFuc19hbHBoYSwgJm51bSwgMCkgJiBQTkdfSU5GT190Uk5TKSAhPSAwICYmCi0gICAgICAodHJhbnNfYWxwaGEgIT0gTlVMTCB8fCBudW0gIT0gMS8qcmV0dXJucyAxIGZvciBhIHRyYW5zcGFyZW50IGNvbG9yKi8pICYmCi0gICAgICAvKiBPb3BzLCBpZiBhIHBhbGV0dGUgdFJOUyBnZXRzIGV4cGFuZGVkIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIChhdCBsZWFzdCBzbwotICAgICAgICogZmFyIGFzIDEuNS40KSBkb2VzIG5vdCByZW1vdmUgdGhlIHRyYW5zX2FscGhhIHBvaW50ZXIsIG9ubHkgbnVtX3RyYW5zLAotICAgICAgICogc28gaW4gdGhlIGFib3ZlIGNhbGwgd2UgZ2V0IGEgc3VjY2Vzcywgd2UgZ2V0IGEgcG9pbnRlciAod2hvIGtub3dzIHdoYXQKLSAgICAgICAqIHRvKSBhbmQgd2UgZ2V0IG51bV90cmFucyA9PSAwOgotICAgICAgICovCi0gICAgICAhKHRyYW5zX2FscGhhICE9IE5VTEwgJiYgbnVtID09IDApKSAvKiBUT0RPOiBmaXggdGhpcyBpbiBsaWJwbmcuICovCi0gICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgLyogQW55IG9mIHRoZXNlIGFyZSBjcmFzaC13b3J0aHkgLSBnaXZlbiB0aGUgaW1wbGVtZW50YXRpb24gb2YKLSAgICAgICAqIHBuZ19nZXRfdFJOUyB1cCB0byAxLjUgYW4gYXBwIHdvbid0IGNyYXNoIGlmIGl0IGp1c3QgY2hlY2tzIHRoZQotICAgICAgICogcmVzdWx0IGFib3ZlIGFuZCBmYWlscyB0byBjaGVjayB0aGF0IHRoZSB2YXJpYWJsZXMgaXQgcGFzc2VkIGhhdmUKLSAgICAgICAqIGFjdHVhbGx5IGJlZW4gZmlsbGVkIGluISAgTm90ZSB0aGF0IGlmIHRoZSBhcHAgd2VyZSB0byBwYXNzIHRoZQotICAgICAgICogbGFzdCwgcG5nX2NvbG9yXzE2cCwgdmFyaWFibGUgdG9vIGl0IGNvdWxkbid0IHJlbHkgb24gdGhpcy4KLSAgICAgICAqLwotICAgICAgaWYgKHRyYW5zX2FscGhhID09IE5VTEwgfHwgbnVtIDw9IDAgfHwgbnVtID4gMjU2IHx8IG51bSA+ICpucGFsZXR0ZSkKLSAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiB1bmV4cGVjdGVkIHBuZ19nZXRfdFJOUyAocGFsZXR0ZSkgcmVzdWx0Iik7Ci0KLSAgICAgIGZvciAoaT0wOyBpPG51bTsgKytpKQotICAgICAgICAgcGFsZXR0ZVtpXS5hbHBoYSA9IHRyYW5zX2FscGhhW2ldOwotCi0gICAgICBmb3IgKG51bT0qbnBhbGV0dGU7IGk8bnVtOyArK2kpCi0gICAgICAgICBwYWxldHRlW2ldLmFscGhhID0gMjU1OwotCi0gICAgICBmb3IgKDsgaTwyNTY7ICsraSkKLSAgICAgICAgIHBhbGV0dGVbaV0uYWxwaGEgPSAzMzsgLyogZmxhZyB2YWx1ZSAqLwotCi0gICAgICByZXR1cm4gMTsgLyogdHJhbnNwYXJlbmN5ICovCi0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIC8qIE5vIHBhbGV0dGUgdHJhbnNwYXJlbmN5IC0ganVzdCBzZXQgdGhlIGFscGhhIGNoYW5uZWwgdG8gb3BhcXVlLiAqLwotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaT0wLCBudW09Km5wYWxldHRlOyBpPG51bTsgKytpKQotICAgICAgICAgcGFsZXR0ZVtpXS5hbHBoYSA9IDI1NTsKLQotICAgICAgZm9yICg7IGk8MjU2OyArK2kpCi0gICAgICAgICBwYWxldHRlW2ldLmFscGhhID0gNTU7IC8qIGZsYWcgdmFsdWUgKi8KLQotICAgICAgcmV0dXJuIDA7IC8qIG5vIHRyYW5zcGFyZW5jeSAqLwotICAgfQotfQotCi0vKiBVdGlsaXR5IHRvIHZhbGlkYXRlIHRoZSBwYWxldHRlIGlmIGl0IHNob3VsZCBub3QgaGF2ZSBjaGFuZ2VkICh0aGUKLSAqIG5vbi10cmFuc2Zvcm0gY2FzZSkuCi0gKi8KLXN0YXRpYyB2b2lkCi1zdGFuZGFyZF9wYWxldHRlX3ZhbGlkYXRlKHN0YW5kYXJkX2Rpc3BsYXkgKmRwLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgIHBuZ19pbmZvcCBwaSkKLXsKLSAgIGludCBucGFsZXR0ZTsKLSAgIHN0b3JlX3BhbGV0dGUgcGFsZXR0ZTsKLQotICAgaWYgKHJlYWRfcGFsZXR0ZShwYWxldHRlLCAmbnBhbGV0dGUsIHBwLCBwaSkgIT0gZHAtPmlzX3RyYW5zcGFyZW50KQotICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IHBhbGV0dGUgdHJhbnNwYXJlbmN5IGNoYW5nZWQiKTsKLQotICAgaWYgKG5wYWxldHRlICE9IGRwLT5ucGFsZXR0ZSkKLSAgIHsKLSAgICAgIHNpemVfdCBwb3MgPSAwOwotICAgICAgY2hhciBtc2dbNjRdOwotCi0gICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAidmFsaWRhdGU6IHBhbGV0dGUgc2l6ZSBjaGFuZ2VkOiAiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRuKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBkcC0+bnBhbGV0dGUpOwotICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiAtPiAiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRuKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBucGFsZXR0ZSk7Ci0gICAgICBwbmdfZXJyb3IocHAsIG1zZyk7Ci0gICB9Ci0KLSAgIHsKLSAgICAgIGludCBpID0gbnBhbGV0dGU7IC8qIG5wYWxldHRlIGlzIGFsaWFzZWQgKi8KLQotICAgICAgd2hpbGUgKC0taSA+PSAwKQotICAgICAgICAgaWYgKHBhbGV0dGVbaV0ucmVkICE9IGRwLT5wYWxldHRlW2ldLnJlZCB8fAotICAgICAgICAgICAgcGFsZXR0ZVtpXS5ncmVlbiAhPSBkcC0+cGFsZXR0ZVtpXS5ncmVlbiB8fAotICAgICAgICAgICAgcGFsZXR0ZVtpXS5ibHVlICE9IGRwLT5wYWxldHRlW2ldLmJsdWUgfHwKLSAgICAgICAgICAgIHBhbGV0dGVbaV0uYWxwaGEgIT0gZHAtPnBhbGV0dGVbaV0uYWxwaGEpCi0gICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogUExURSBvciB0Uk5TIGNodW5rIGNoYW5nZWQiKTsKLSAgIH0KLX0KLQotLyogQnkgcGFzc2luZyBhICdzdGFuZGFyZF9kaXNwbGF5JyB0aGUgcHJvZ3Jlc3NpdmUgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCi0gKiBkaXJlY3RseSBieSB0aGUgc2VxdWVudGlhbCBjb2RlLCB0aGUgZnVuY3Rpb25zIHN1ZmZpeGVkICJfaW1wIiBhcmUgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbnMsIHRoZSBmdW5jdGlvbnMgd2l0aG91dCB0aGUgc3VmZml4IGFyZSB0aGUgY2FsbGJhY2tzLgotICoKLSAqIFRoZSBjb2RlIGZvciB0aGUgaW5mbyBjYWxsYmFjayBpcyBzcGxpdCBpbnRvIHR3byBiZWNhdXNlIHRoaXMgY2FsbGJhY2sgY2FsbHMKLSAqIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIG9yIHBuZ19zdGFydF9yZWFkX2ltYWdlIGFuZCB3aGF0IGdldHMgY2FsbGVkIGRlcGVuZHMgb24KLSAqIHdoZXRoZXIgdGhlIGluZm8gbmVlZHMgdXBkYXRpbmcgKHdlIHdhbnQgdG8gdGVzdCBib3RoIGNhbGxzIGluIHBuZ3ZhbGlkLikKLSAqLwotc3RhdGljIHZvaWQKLXN0YW5kYXJkX2luZm9fcGFydDEoc3RhbmRhcmRfZGlzcGxheSAqZHAsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBpZiAocG5nX2dldF9iaXRfZGVwdGgocHAsIHBpKSAhPSBkcC0+Yml0X2RlcHRoKQotICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGJpdCBkZXB0aCBjaGFuZ2VkIik7Ci0KLSAgIGlmIChwbmdfZ2V0X2NvbG9yX3R5cGUocHAsIHBpKSAhPSBkcC0+Y29sb3VyX3R5cGUpCi0gICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogY29sb3IgdHlwZSBjaGFuZ2VkIik7Ci0KLSAgIGlmIChwbmdfZ2V0X2ZpbHRlcl90eXBlKHBwLCBwaSkgIT0gUE5HX0ZJTFRFUl9UWVBFX0JBU0UpCi0gICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogZmlsdGVyIHR5cGUgY2hhbmdlZCIpOwotCi0gICBpZiAocG5nX2dldF9pbnRlcmxhY2VfdHlwZShwcCwgcGkpICE9IGRwLT5pbnRlcmxhY2VfdHlwZSkKLSAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBpbnRlcmxhY2luZyBjaGFuZ2VkIik7Ci0KLSAgIGlmIChwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUocHAsIHBpKSAhPSBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFKQotICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGNvbXByZXNzaW9uIHR5cGUgY2hhbmdlZCIpOwotCi0gICBkcC0+dyA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgocHAsIHBpKTsKLQotICAgaWYgKGRwLT53ICE9IHN0YW5kYXJkX3dpZHRoKHBwLCBkcC0+aWQpKQotICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGltYWdlIHdpZHRoIGNoYW5nZWQiKTsKLQotICAgZHAtPmggPSBwbmdfZ2V0X2ltYWdlX2hlaWdodChwcCwgcGkpOwotCi0gICBpZiAoZHAtPmggIT0gc3RhbmRhcmRfaGVpZ2h0KHBwLCBkcC0+aWQpKQotICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGltYWdlIGhlaWdodCBjaGFuZ2VkIik7Ci0KLSAgIC8qIFJlY29yZCAoYnV0IGRvbid0IGNoZWNrIGF0IHByZXNlbnQpIHRoZSBpbnB1dCBzQklUIGFjY29yZGluZyB0byB0aGUgY29sb3VyCi0gICAgKiB0eXBlIGluZm9ybWF0aW9uLgotICAgICovCi0gICB7Ci0gICAgICBwbmdfY29sb3JfOHAgc0JJVCA9IDA7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3NCSVQocHAsIHBpLCAmc0JJVCkgJiBQTkdfSU5GT19zQklUKQotICAgICAgewotICAgICAgICAgaW50IHNCSVRfaW52YWxpZCA9IDA7Ci0KLSAgICAgICAgIGlmIChzQklUID09IDApCi0gICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogdW5leHBlY3RlZCBwbmdfZ2V0X3NCSVQgcmVzdWx0Iik7Ci0KLSAgICAgICAgIGlmIChkcC0+Y29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzQklULT5yZWQgPT0gMCB8fCBzQklULT5yZWQgPiBkcC0+Yml0X2RlcHRoKQotICAgICAgICAgICAgICAgc0JJVF9pbnZhbGlkID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGRwLT5yZWRfc0JJVCA9IHNCSVQtPnJlZDsKLQotICAgICAgICAgICAgaWYgKHNCSVQtPmdyZWVuID09IDAgfHwgc0JJVC0+Z3JlZW4gPiBkcC0+Yml0X2RlcHRoKQotICAgICAgICAgICAgICAgc0JJVF9pbnZhbGlkID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGRwLT5ncmVlbl9zQklUID0gc0JJVC0+Z3JlZW47Ci0KLSAgICAgICAgICAgIGlmIChzQklULT5ibHVlID09IDAgfHwgc0JJVC0+Ymx1ZSA+IGRwLT5iaXRfZGVwdGgpCi0gICAgICAgICAgICAgICBzQklUX2ludmFsaWQgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgZHAtPmJsdWVfc0JJVCA9IHNCSVQtPmJsdWU7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgLyogIUNPTE9SICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc0JJVC0+Z3JheSA9PSAwIHx8IHNCSVQtPmdyYXkgPiBkcC0+Yml0X2RlcHRoKQotICAgICAgICAgICAgICAgc0JJVF9pbnZhbGlkID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGRwLT5ibHVlX3NCSVQgPSBkcC0+Z3JlZW5fc0JJVCA9IGRwLT5yZWRfc0JJVCA9IHNCSVQtPmdyYXk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIEFsbCA4IGJpdHMgaW4gdFJOUyBmb3IgYSBwYWxldHRlIGltYWdlIGFyZSBzaWduaWZpY2FudCAtIHNlZSB0aGUKLSAgICAgICAgICAqIHNwZWMuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChkcC0+Y29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzQklULT5hbHBoYSA9PSAwIHx8IHNCSVQtPmFscGhhID4gZHAtPmJpdF9kZXB0aCkKLSAgICAgICAgICAgICAgIHNCSVRfaW52YWxpZCA9IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBkcC0+YWxwaGFfc0JJVCA9IHNCSVQtPmFscGhhOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAoc0JJVF9pbnZhbGlkKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IHNCSVQgdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIEltcG9ydGFudDogdGhpcyBpcyB2YWxpZGF0aW5nIHRoZSB2YWx1ZSAqYmVmb3JlKiBhbnkgdHJhbnNmb3JtcyBoYXZlIGJlZW4KLSAgICAqIHB1dCBpbiBwbGFjZS4gIEl0IGRvZXNuJ3QgbWF0dGVyIGZvciB0aGUgc3RhbmRhcmQgdGVzdHMsIHdoZXJlIHRoZXJlIGFyZQotICAgICogbm8gdHJhbnNmb3JtcywgYnV0IGl0IGRvZXMgZm9yIG90aGVyIHRlc3RzIHdoZXJlIHJvd2J5dGVzIG1heSBjaGFuZ2UgYWZ0ZXIKLSAgICAqIHBuZ19yZWFkX3VwZGF0ZV9pbmZvLgotICAgICovCi0gICBpZiAocG5nX2dldF9yb3dieXRlcyhwcCwgcGkpICE9IHN0YW5kYXJkX3Jvd3NpemUocHAsIGRwLT5pZCkpCi0gICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogcm93IHNpemUgY2hhbmdlZCIpOwotCi0gICAvKiBWYWxpZGF0ZSB0aGUgY29sb3VyIHR5cGUgMyBwYWxldHRlICh0aGlzIGNhbiBiZSBwcmVzZW50IG9uIG90aGVyIGNvbG9yCi0gICAgKiB0eXBlcy4pCi0gICAgKi8KLSAgIHN0YW5kYXJkX3BhbGV0dGVfdmFsaWRhdGUoZHAsIHBwLCBwaSk7Ci0KLSAgIC8qIEluIGFueSBjYXNlIGFsd2F5cyBjaGVjayBmb3IgYSB0cmFucGFyZW50IGNvbG9yIChub3RpY2UgdGhhdCB0aGUKLSAgICAqIGNvbG91ciB0eXBlIDMgY2FzZSBtdXN0IG5vdCBnaXZlIGEgc3VjY2Vzc2Z1bCByZXR1cm4gb24gdGhlIGdldF90Uk5TIGNhbGwKLSAgICAqIHdpdGggdGhlc2UgYXJndW1lbnRzISkKLSAgICAqLwotICAgewotICAgICAgcG5nX2NvbG9yXzE2cCB0cmFuc19jb2xvciA9IDA7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X3RSTlMocHAsIHBpLCAwLCAwLCAmdHJhbnNfY29sb3IpICYgUE5HX0lORk9fdFJOUykKLSAgICAgIHsKLSAgICAgICAgIGlmICh0cmFuc19jb2xvciA9PSAwKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IHVuZXhwZWN0ZWQgcG5nX2dldF90Uk5TIChjb2xvcikgcmVzdWx0Iik7Ci0KLSAgICAgICAgIHN3aXRjaCAoZHAtPmNvbG91cl90eXBlKQotICAgICAgICAgewotICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZHAtPnRyYW5zcGFyZW50LnJlZCA9IGRwLT50cmFuc3BhcmVudC5ncmVlbiA9IGRwLT50cmFuc3BhcmVudC5ibHVlID0KLSAgICAgICAgICAgICAgIHRyYW5zX2NvbG9yLT5ncmF5OwotICAgICAgICAgICAgZHAtPmhhc190Uk5TID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBkcC0+dHJhbnNwYXJlbnQucmVkID0gdHJhbnNfY29sb3ItPnJlZDsKLSAgICAgICAgICAgIGRwLT50cmFuc3BhcmVudC5ncmVlbiA9IHRyYW5zX2NvbG9yLT5ncmVlbjsKLSAgICAgICAgICAgIGRwLT50cmFuc3BhcmVudC5ibHVlID0gdHJhbnNfY29sb3ItPmJsdWU7Ci0gICAgICAgICAgICBkcC0+aGFzX3RSTlMgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIC8qIE5vdCBleHBlY3RlZCBiZWNhdXNlIGl0IHNob3VsZCByZXN1bHQgaW4gdGhlIGFycmF5IGNhc2UKLSAgICAgICAgICAgICAqIGFib3ZlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwbmdfZXJyb3IocHAsICJ2YWxpZGF0ZTogdW5leHBlY3RlZCBwbmdfZ2V0X3RSTlMgcmVzdWx0Iik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBpbnZhbGlkIHRSTlMgY2h1bmsgd2l0aCBhbHBoYSBpbWFnZSIpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICAvKiBSZWFkIHRoZSBudW1iZXIgb2YgcGFzc2VzIC0gZXhwZWN0ZWQgdG8gbWF0Y2ggdGhlIHZhbHVlIHVzZWQgd2hlbgotICAgICogY3JlYXRpbmcgdGhlIGltYWdlIChpbnRlcmxhY2VkIG9yIG5vdCkuICBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YKLSAgICAqIHR1cm5pbmcgb24gaW50ZXJsYWNlIGhhbmRsaW5nIChpZiBkb19pbnRlcmxhY2UgaXMgbm90IHNldC4pCi0gICAgKi8KLSAgIGRwLT5ucGFzc2VzID0gbnBhc3Nlc19mcm9tX2ludGVybGFjZV90eXBlKHBwLCBkcC0+aW50ZXJsYWNlX3R5cGUpOwotICAgaWYgKCFkcC0+ZG9faW50ZXJsYWNlKQotICAgewotIyAgICAgaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICAgICAgICBpZiAoZHAtPm5wYXNzZXMgIT0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocHApKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAidmFsaWRhdGU6IGZpbGUgY2hhbmdlZCBpbnRlcmxhY2UgdHlwZSIpOwotIyAgICAgZWxzZSAvKiAhUkVBRF9JTlRFUkxBQ0lORyAqLwotICAgICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOiB0aGUgcmVsZXZhbnQgdGVzdHMgKCFkb19pbnRlcmxhY2UpIHNob3VsZAotICAgICAgICAgICogbm90IGJlIHJ1bi4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGRwLT5ucGFzc2VzID4gMSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInZhbGlkYXRlOiBubyBsaWJwbmcgaW50ZXJsYWNlIHN1cHBvcnQiKTsKLSMgICAgIGVuZGlmIC8qICFSRUFEX0lOVEVSTEFDSU5HICovCi0gICB9Ci0KLSAgIC8qIENhbGxlciBjYWxscyBwbmdfcmVhZF91cGRhdGVfaW5mbyBvciBwbmdfc3RhcnRfcmVhZF9pbWFnZSBub3csIHRoZW4gY2FsbHMKLSAgICAqIHBhcnQyLgotICAgICovCi19Ci0KLS8qIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiB0aGUgcG5nX3JlYWRfdXBkYXRlX2luZm8gY2FsbCB0byBnZXQgdGhlIGNvcnJlY3QKLSAqICdyb3dieXRlcycgdmFsdWUsIG90aGVyd2lzZSBwbmdfZ2V0X3Jvd2J5dGVzIHdpbGwgcmVmZXIgdG8gdGhlIHVudHJhbnNmb3JtZWQKLSAqIGltYWdlLgotICovCi1zdGF0aWMgdm9pZAotc3RhbmRhcmRfaW5mb19wYXJ0MihzdGFuZGFyZF9kaXNwbGF5ICpkcCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgcG5nX2NvbnN0X2luZm9wIHBpLCBpbnQgbkltYWdlcykKLXsKLSAgIC8qIFJlY29yZCBjYlJvdyBub3cgdGhhdCBpdCBjYW4gYmUgZm91bmQuICovCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBjdCA9IHBuZ19nZXRfY29sb3JfdHlwZShwcCwgcGkpOwotICAgICAgcG5nX2J5dGUgYmQgPSBwbmdfZ2V0X2JpdF9kZXB0aChwcCwgcGkpOwotCi0gICAgICBpZiAoYmQgPj0gOCAmJiAoY3QgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8IGN0ID09IFBOR19DT0xPUl9UWVBFX0dSQVkpICYmCi0gICAgICAgICAgZHAtPmZpbGxlcikKLSAgICAgICAgICBjdCB8PSA0OyAvKiBoYW5kbGUgZmlsbGVyIGFzIGZha2VkIGFscGhhIGNoYW5uZWwgKi8KLQotICAgICAgZHAtPnBpeGVsX3NpemUgPSBiaXRfc2l6ZShwcCwgY3QsIGJkKTsKLSAgIH0KLSAgIGRwLT5iaXRfd2lkdGggPSBwbmdfZ2V0X2ltYWdlX3dpZHRoKHBwLCBwaSkgKiBkcC0+cGl4ZWxfc2l6ZTsKLSAgIGRwLT5jYlJvdyA9IHBuZ19nZXRfcm93Ynl0ZXMocHAsIHBpKTsKLQotICAgLyogVmFsaWRhdGUgdGhlIHJvd2J5dGVzIGhlcmUgYWdhaW4uICovCi0gICBpZiAoZHAtPmNiUm93ICE9IChkcC0+Yml0X3dpZHRoKzcpLzgpCi0gICAgICBwbmdfZXJyb3IocHAsICJiYWQgcG5nX2dldF9yb3dieXRlcyBjYWxjdWxhdGlvbiIpOwotCi0gICAvKiBUaGVuIGVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBvdXRwdXQgaW1hZ2UocykuICovCi0gICBzdG9yZV9lbnN1cmVfaW1hZ2UoZHAtPnBzLCBwcCwgbkltYWdlcywgZHAtPmNiUm93LCBkcC0+aCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdGFuZGFyZF9pbmZvX2ltcChzdGFuZGFyZF9kaXNwbGF5ICpkcCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSwKLSAgICBpbnQgbkltYWdlcykKLXsKLSAgIC8qIE5vdGUgdGhhdCB0aGUgdmFsaWRhdGlvbiByb3V0aW5lIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgdHVybmluZyBvbgotICAgICogaW50ZXJsYWNlIGhhbmRsaW5nIGluIHRoZSBzdWJzZXF1ZW50IGNvZGUuCi0gICAgKi8KLSAgIHN0YW5kYXJkX2luZm9fcGFydDEoZHAsIHBwLCBwaSk7Ci0KLSAgIC8qIEFuZCB0aGUgaW5mbyBjYWxsYmFjayBoYXMgdG8gY2FsbCB0aGlzIChvciBwbmdfcmVhZF91cGRhdGVfaW5mbyAtIHNlZQotICAgICogYmVsb3cgaW4gdGhlIHBuZ19tb2RpZmllciBjb2RlIGZvciB0aGF0IHZhcmlhbnQuCi0gICAgKi8KLSAgIGlmIChkcC0+dXNlX3VwZGF0ZV9pbmZvKQotICAgewotICAgICAgLyogRm9yIGRlYnVnZ2luZyB0aGUgZWZmZWN0IG9mIG11bHRpcGxlIGNhbGxzOiAqLwotICAgICAgaW50IGkgPSBkcC0+dXNlX3VwZGF0ZV9pbmZvOwotICAgICAgd2hpbGUgKGktLSA+IDApCi0gICAgICAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwcCwgcGkpOwotICAgfQotCi0gICBlbHNlCi0gICAgICBwbmdfc3RhcnRfcmVhZF9pbWFnZShwcCk7Ci0KLSAgIC8qIFZhbGlkYXRlIHRoZSBoZWlnaHQsIHdpZHRoIGFuZCByb3dieXRlcyBwbHVzIGVuc3VyZSB0aGF0IHN1ZmZpY2llbnQgYnVmZmVyCi0gICAgKiBleGlzdHMgZm9yIGRlY29kaW5nIHRoZSBpbWFnZS4KLSAgICAqLwotICAgc3RhbmRhcmRfaW5mb19wYXJ0MihkcCwgcHAsIHBpLCBuSW1hZ2VzKTsKLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLXN0YW5kYXJkX2luZm8ocG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHN0YW5kYXJkX2Rpc3BsYXkgKmRwID0gdm9pZGNhc3Qoc3RhbmRhcmRfZGlzcGxheSosCi0gICAgICBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwcCkpOwotCi0gICAvKiBDYWxsIHdpdGggbkltYWdlcz09MSBiZWNhdXNlIHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgY2FuIG9ubHkgcHJvZHVjZSBvbmUKLSAgICAqIGltYWdlLgotICAgICovCi0gICBzdGFuZGFyZF9pbmZvX2ltcChkcCwgcHAsIHBpLCAxIC8qb25seSBvbmUgaW1hZ2UqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi1wcm9ncmVzc2l2ZV9yb3cocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2J5dGVwIG5ld19yb3csIHBuZ191aW50XzMyIHksIGludCBwYXNzKQotewotICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOwotICAgY29uc3Qgc3RhbmRhcmRfZGlzcGxheSAqZHAgPSB2b2lkY2FzdChzdGFuZGFyZF9kaXNwbGF5KiwKLSAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBwKSk7Ci0KLSAgIC8qIFdoZW4gaGFuZGxpbmcgaW50ZXJsYWNpbmcgc29tZSByb3dzIHdpbGwgYmUgYWJzZW50IGluIGVhY2ggcGFzcywgdGhlCi0gICAgKiBjYWxsYmFjayBzdGlsbCBnZXRzIGNhbGxlZCwgYnV0IHdpdGggYSBOVUxMIHBvaW50ZXIuICBUaGlzIGlzIGNoZWNrZWQKLSAgICAqIGluIHRoZSAnZWxzZScgY2xhdXNlIGJlbG93LiAgV2UgbmVlZCBvdXIgb3duICdjYlJvdycsIGJ1dCB3ZSBjYW4ndCBjYWxsCi0gICAgKiBwbmdfZ2V0X3Jvd2J5dGVzIGJlY2F1c2Ugd2UgZ290IG5vIGluZm8gc3RydWN0dXJlLgotICAgICovCi0gICBpZiAobmV3X3JvdyAhPSBOVUxMKQotICAgewotICAgICAgcG5nX2J5dGVwIHJvdzsKLQotICAgICAgLyogSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJlYWRlciBkb2Vzbid0IGRvIHRoZSBpbnRlcmxhY2UgaXQgZ2l2ZXMKLSAgICAgICAqIHVzIHRoZSB5IGluIHRoZSBzdWItaW1hZ2U6Ci0gICAgICAgKi8KLSAgICAgIGlmIChkcC0+ZG9faW50ZXJsYWNlICYmIGRwLT5pbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQotICAgICAgewotI2lmZGVmIFBOR19VU0VSX1RSQU5TRk9STV9JTkZPX1NVUFBPUlRFRAotICAgICAgICAgLyogVXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gdmFsaWRhdGUgdGhlIHBuZyAnY3VycmVudCcgQVBJczogKi8KLSAgICAgICAgIGlmICh5ICE9IHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBwKSkKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyIGlzIGJyb2tlbiIpOwotCi0gICAgICAgICBpZiAocGFzcyAhPSBwbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIocHApKQotICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAicG5nX2dldF9jdXJyZW50X3Bhc3NfbnVtYmVyIGlzIGJyb2tlbiIpOwotI2VuZGlmIC8qIFVTRVJfVFJBTlNGT1JNX0lORk8gKi8KLQotICAgICAgICAgeSA9IFBOR19ST1dfRlJPTV9QQVNTX1JPVyh5LCBwYXNzKTsKLSAgICAgIH0KLQotICAgICAgLyogVmFsaWRhdGUgdGhpcyBqdXN0IGluIGNhc2UuICovCi0gICAgICBpZiAoeSA+PSBkcC0+aCkKLSAgICAgICAgIHBuZ19lcnJvcihwcCwgImludmFsaWQgeSB0byBwcm9ncmVzc2l2ZSByb3cgY2FsbGJhY2siKTsKLQotICAgICAgcm93ID0gc3RvcmVfaW1hZ2Vfcm93KGRwLT5wcywgcHAsIDAsIHkpOwotCi0gICAgICAvKiBDb21iaW5lIHRoZSBuZXcgcm93IGludG8gdGhlIG9sZDogKi8KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgICAgIGlmIChkcC0+ZG9faW50ZXJsYWNlKQotI2VuZGlmIC8qIFJFQURfSU5URVJMQUNJTkcgKi8KLSAgICAgIHsKLSAgICAgICAgIGlmIChkcC0+aW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykKLSAgICAgICAgICAgIGRlaW50ZXJsYWNlX3Jvdyhyb3csIG5ld19yb3csIGRwLT5waXhlbF9zaXplLCBkcC0+dywgcGFzcywKLSAgICAgICAgICAgICAgICAgIGRwLT5saXR0bGVlbmRpYW4pOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcm93X2NvcHkocm93LCBuZXdfcm93LCBkcC0+cGl4ZWxfc2l6ZSAqIGRwLT53LCBkcC0+bGl0dGxlZW5kaWFuKTsKLSAgICAgIH0KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgICAgIGVsc2UKLSAgICAgICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwcCwgcm93LCBuZXdfcm93KTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQgKi8KLSAgIH0KLQotICAgZWxzZSBpZiAoZHAtPmludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcgJiYKLSAgICAgICBQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKHksIHBhc3MpICYmCi0gICAgICAgUE5HX1BBU1NfQ09MUyhkcC0+dywgcGFzcykgPiAwKQotICAgICAgcG5nX2Vycm9yKHBwLCAibWlzc2luZyByb3cgaW4gcHJvZ3Jlc3NpdmUgZGUtaW50ZXJsYWNpbmciKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlcXVlbnRpYWxfcm93KHN0YW5kYXJkX2Rpc3BsYXkgKmRwLCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpLAotICAgIGNvbnN0IGludCBpSW1hZ2UsIGNvbnN0IGludCBpRGlzcGxheSkKLXsKLSAgIGNvbnN0IGludCAgICAgICAgIG5wYXNzZXMgPSBkcC0+bnBhc3NlczsKLSAgIGNvbnN0IGludCAgICAgICAgIGRvX2ludGVybGFjZSA9IGRwLT5kb19pbnRlcmxhY2UgJiYKLSAgICAgIGRwLT5pbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03OwotICAgY29uc3QgcG5nX3VpbnRfMzIgaGVpZ2h0ID0gc3RhbmRhcmRfaGVpZ2h0KHBwLCBkcC0+aWQpOwotICAgY29uc3QgcG5nX3VpbnRfMzIgd2lkdGggPSBzdGFuZGFyZF93aWR0aChwcCwgZHAtPmlkKTsKLSAgIGNvbnN0IHBuZ19zdG9yZSogIHBzID0gZHAtPnBzOwotICAgaW50IHBhc3M7Ci0KLSAgIGZvciAocGFzcz0wOyBwYXNzPG5wYXNzZXM7ICsrcGFzcykKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIHk7Ci0gICAgICBwbmdfdWludF8zMiB3UGFzcyA9IFBOR19QQVNTX0NPTFMod2lkdGgsIHBhc3MpOwotCi0gICAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7ICsreSkKLSAgICAgIHsKLSAgICAgICAgIGlmIChkb19pbnRlcmxhY2UpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiB3UGFzcyBtYXkgYmUgemVybyBvciB0aGlzIHJvdyBtYXkgbm90IGJlIGluIHRoaXMgcGFzcy4KLSAgICAgICAgICAgICAqIHBuZ19yZWFkX3JvdyBtdXN0IG5vdCBiZSBjYWxsZWQgaW4gZWl0aGVyIGNhc2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh3UGFzcyA+IDAgJiYgUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyh5LCBwYXNzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIHJvdyBpbnRvIGEgcGFpciBvZiB0ZW1wb3JhcnkgYnVmZmVycywgdGhlbiBkbyB0aGUKLSAgICAgICAgICAgICAgICAqIG1lcmdlIGhlcmUgaW50byB0aGUgb3V0cHV0IHJvd3MuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHBuZ19ieXRlIHJvd1tTVEFOREFSRF9ST1dNQVhdLCBkaXNwbGF5W1NUQU5EQVJEX1JPV01BWF07Ci0KLSAgICAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgYWlkcyAodG8gc29tZSBleHRlbnQpIGVycm9yIGRldGVjdGlvbiAtIHdlIGNhbgotICAgICAgICAgICAgICAgICogc2VlIHdoZXJlIHBuZ19yZWFkX3JvdyB3cm90ZS4gIFVzZSBvcHBvc2l0ZSB2YWx1ZXMgaW4gcm93IGFuZAotICAgICAgICAgICAgICAgICogZGlzcGxheSB0byBtYWtlIHRoaXMgZWFzaWVyLiAgRG9uJ3QgdXNlIDB4ZmYgKHdoaWNoIGlzIHVzZWQgaW4KLSAgICAgICAgICAgICAgICAqIHRoZSBpbWFnZSB3cml0ZSBjb2RlIHRvIGZpbGwgdW51c2VkIGJpdHMpIG9yIDAgKHdoaWNoIGlzIGEKLSAgICAgICAgICAgICAgICAqIGxpa2VseSB2YWx1ZSB0byBvdmVyd3JpdGUgdW51c2VkIGJpdHMgd2l0aCkuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIG1lbXNldChyb3csIDB4YzUsIHNpemVvZiByb3cpOwotICAgICAgICAgICAgICAgbWVtc2V0KGRpc3BsYXksIDB4NWMsIHNpemVvZiBkaXNwbGF5KTsKLQotICAgICAgICAgICAgICAgcG5nX3JlYWRfcm93KHBwLCByb3csIGRpc3BsYXkpOwotCi0gICAgICAgICAgICAgICBpZiAoaUltYWdlID49IDApCi0gICAgICAgICAgICAgICAgICBkZWludGVybGFjZV9yb3coc3RvcmVfaW1hZ2Vfcm93KHBzLCBwcCwgaUltYWdlLCB5KSwgcm93LAotICAgICAgICAgICAgICAgICAgICAgZHAtPnBpeGVsX3NpemUsIGRwLT53LCBwYXNzLCBkcC0+bGl0dGxlZW5kaWFuKTsKLQotICAgICAgICAgICAgICAgaWYgKGlEaXNwbGF5ID49IDApCi0gICAgICAgICAgICAgICAgICBkZWludGVybGFjZV9yb3coc3RvcmVfaW1hZ2Vfcm93KHBzLCBwcCwgaURpc3BsYXksIHkpLCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgZHAtPnBpeGVsX3NpemUsIGRwLT53LCBwYXNzLCBkcC0+bGl0dGxlZW5kaWFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwcCwKLSAgICAgICAgICAgICAgIGlJbWFnZSA+PSAwID8gc3RvcmVfaW1hZ2Vfcm93KHBzLCBwcCwgaUltYWdlLCB5KSA6IE5VTEwsCi0gICAgICAgICAgICAgICBpRGlzcGxheSA+PSAwID8gc3RvcmVfaW1hZ2Vfcm93KHBzLCBwcCwgaURpc3BsYXksIHkpIDogTlVMTCk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIEFuZCBmaW5pc2ggdGhlIHJlYWQgb3BlcmF0aW9uIChvbmx5IHJlYWxseSBuZWNlc3NhcnkgaWYgdGhlIGNhbGxlciB3YW50cwotICAgICogdG8gZmluZCBhZGRpdGlvbmFsIGRhdGEgaW4gcG5nX2luZm8gZnJvbSBjaHVua3MgYWZ0ZXIgdGhlIGxhc3QgSURBVC4pCi0gICAgKi8KLSAgIHBuZ19yZWFkX2VuZChwcCwgcGkpOwotfQotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotc3RhbmRhcmRfY2hlY2tfdGV4dChwbmdfY29uc3Rfc3RydWN0cCBwcCwgcG5nX2NvbnN0X3RleHRwIHRwLAotICAgcG5nX2NvbnN0X2NoYXJwIGtleXdvcmQsIHBuZ19jb25zdF9jaGFycCB0ZXh0KQotewotICAgY2hhciBtc2dbMTAyNF07Ci0gICBzaXplX3QgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIDAsICJ0ZXh0OiAiKTsKLSAgIHNpemVfdCBvazsKLQotICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywga2V5d29yZCk7Ci0gICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiOiAiKTsKLSAgIG9rID0gcG9zOwotCi0gICBpZiAodHAtPmNvbXByZXNzaW9uICE9IFRFWFRfQ09NUFJFU1NJT04pCi0gICB7Ci0gICAgICBjaGFyIGJ1Zls2NF07Ci0KLSAgICAgIHNwcmludGYoYnVmLCAiY29tcHJlc3Npb24gWyVkLT4lZF0sICIsIFRFWFRfQ09NUFJFU1NJT04sCi0gICAgICAgICB0cC0+Y29tcHJlc3Npb24pOwotICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgYnVmKTsKLSAgIH0KLQotICAgaWYgKHRwLT5rZXkgPT0gTlVMTCB8fCBzdHJjbXAodHAtPmtleSwga2V5d29yZCkgIT0gMCkKLSAgIHsKLSAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJrZXl3b3JkIFwiIik7Ci0gICAgICBpZiAodHAtPmtleSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgdHAtPmtleSk7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiXCIsICIpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAibnVsbCwgIik7Ci0gICB9Ci0KLSAgIGlmICh0cC0+dGV4dCA9PSBOVUxMKQotICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgInRleHQgbG9zdCwgIik7Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmICh0cC0+dGV4dF9sZW5ndGggIT0gc3RybGVuKHRleHQpKQotICAgICAgewotICAgICAgICAgY2hhciBidWZbNjRdOwotICAgICAgICAgc3ByaW50ZihidWYsICJ0ZXh0IGxlbmd0aCBjaGFuZ2VkWyVsdS0+JWx1XSwgIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXN0cmxlbih0ZXh0KSwgKHVuc2lnbmVkIGxvbmcpdHAtPnRleHRfbGVuZ3RoKTsKLSAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsIGJ1Zik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHJjbXAodHAtPnRleHQsIHRleHQpICE9IDApCi0gICAgICB7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAidGV4dCBiZWNvbWVzIFwiIik7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCB0cC0+dGV4dCk7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiXCIgKHdhcyBcIiIpOwotICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgdGV4dCk7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiXCIpLCAiKTsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKHRwLT5pdHh0X2xlbmd0aCAhPSAwKQotICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImlUWHQgbGVuZ3RoIHNldCwgIik7Ci0KLSAgIGlmICh0cC0+bGFuZyAhPSBOVUxMKQotICAgewotICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImlUWHQgbGFuZ3VhZ2UgXCIiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsIHRwLT5sYW5nKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJcIiwgIik7Ci0gICB9Ci0KLSAgIGlmICh0cC0+bGFuZ19rZXkgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJpVFh0IGtleXdvcmQgXCIiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsIHRwLT5sYW5nX2tleSk7Ci0gICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiXCIsICIpOwotICAgfQotCi0gICBpZiAocG9zID4gb2spCi0gICB7Ci0gICAgICBtc2dbcG9zLTJdID0gJ1wwJzsgLyogUmVtb3ZlIHRoZSAiLCAiIGF0IHRoZSBlbmQgKi8KLSAgICAgIHBuZ19lcnJvcihwcCwgbXNnKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0YW5kYXJkX3RleHRfdmFsaWRhdGUoc3RhbmRhcmRfZGlzcGxheSAqZHAsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAotICAgcG5nX2luZm9wIHBpLCBpbnQgY2hlY2tfZW5kKQotewotICAgcG5nX3RleHRwIHRwID0gTlVMTDsKLSAgIHBuZ191aW50XzMyIG51bV90ZXh0ID0gcG5nX2dldF90ZXh0KHBwLCBwaSwgJnRwLCBOVUxMKTsKLQotICAgaWYgKG51bV90ZXh0ID09IDIgJiYgdHAgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHN0YW5kYXJkX2NoZWNrX3RleHQocHAsIHRwLCAiaW1hZ2UgbmFtZSIsIGRwLT5wcy0+Y3VycmVudC0+bmFtZSk7Ci0KLSAgICAgIC8qIFRoaXMgZXhpc3RzIGJlY2F1c2UgcHJpb3IgdG8gMS41LjE4IHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgbGVmdCB0aGUKLSAgICAgICAqIHBuZ19zdHJ1Y3Qgel9zdHJlYW0gdW5yZXNldCBhdCB0aGUgZW5kIG9mIHRoZSBpbWFnZSwgc28gc3Vic2VxdWVudAotICAgICAgICogYXR0ZW1wdHMgdG8gdXNlIGl0IHNpbXBseSByZXR1cm5zIFpfU1RSRUFNX0VORC4KLSAgICAgICAqLwotICAgICAgaWYgKGNoZWNrX2VuZCkKLSAgICAgICAgIHN0YW5kYXJkX2NoZWNrX3RleHQocHAsIHRwKzEsICJlbmQgbWFya2VyIiwgImVuZCIpOwotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICBjaGFyIG1zZ1s2NF07Ci0KLSAgICAgIHNwcmludGYobXNnLCAiZXhwZWN0ZWQgdHdvIHRleHQgaXRlbXMsIGdvdCAlbHUiLAotICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbnVtX3RleHQpOwotICAgICAgcG5nX2Vycm9yKHBwLCBtc2cpOwotICAgfQotfQotI2Vsc2UKLSMgIGRlZmluZSBzdGFuZGFyZF90ZXh0X3ZhbGlkYXRlKGRwLHBwLHBpLGNoZWNrX2VuZCkgKCh2b2lkKTApCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXN0YW5kYXJkX3Jvd192YWxpZGF0ZShzdGFuZGFyZF9kaXNwbGF5ICpkcCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICBpbnQgaUltYWdlLCBpbnQgaURpc3BsYXksIHBuZ191aW50XzMyIHkpCi17Ci0gICBpbnQgd2hlcmU7Ci0gICBwbmdfYnl0ZSBzdGRbU1RBTkRBUkRfUk9XTUFYXTsKLQotICAgLyogVGhlIHJvdyBtdXN0IGJlIHByZS1pbml0aWFsaXplZCB0byB0aGUgbWFnaWMgbnVtYmVyIGhlcmUgZm9yIHRoZSBzaXplCi0gICAgKiB0ZXN0cyB0byBwYXNzOgotICAgICovCi0gICBtZW1zZXQoc3RkLCAxNzgsIHNpemVvZiBzdGQpOwotICAgc3RhbmRhcmRfcm93KHBwLCBzdGQsIGRwLT5pZCwgeSk7Ci0KLSAgIC8qIEF0IHRoZSBlbmQgYm90aCB0aGUgJ3JvdycgYW5kICdkaXNwbGF5JyBhcnJheXMgc2hvdWxkIGVuZCB1cCBpZGVudGljYWwuCi0gICAgKiBJbiBlYXJsaWVyIHBhc3NlcyAncm93JyB3aWxsIGJlIHBhcnRpYWxseSBmaWxsZWQgaW4sIHdpdGggb25seSB0aGUgcGl4ZWxzCi0gICAgKiB0aGF0IGhhdmUgYmVlbiByZWFkIHNvIGZhciwgYnV0ICdkaXNwbGF5JyB3aWxsIGhhdmUgdGhvc2UgcGl4ZWxzCi0gICAgKiByZXBsaWNhdGVkIHRvIGZpbGwgdGhlIHVucmVhZCBwaXhlbHMgd2hpbGUgcmVhZGluZyBhbiBpbnRlcmxhY2VkIGltYWdlLgotICAgICovCi0gICBpZiAoaUltYWdlID49IDAgJiYKLSAgICAgICh3aGVyZSA9IHBpeGVsX2NtcChzdGQsIHN0b3JlX2ltYWdlX3JvdyhkcC0+cHMsIHBwLCBpSW1hZ2UsIHkpLAotICAgICAgICAgICAgZHAtPmJpdF93aWR0aCkpICE9IDApCi0gICB7Ci0gICAgICBjaGFyIG1zZ1s2NF07Ci0gICAgICBzcHJpbnRmKG1zZywgIlBORyBpbWFnZSByb3dbJWx1XVslZF0gY2hhbmdlZCBmcm9tICUuMnggdG8gJS4yeCIsCi0gICAgICAgICAodW5zaWduZWQgbG9uZyl5LCB3aGVyZS0xLCBzdGRbd2hlcmUtMV0sCi0gICAgICAgICBzdG9yZV9pbWFnZV9yb3coZHAtPnBzLCBwcCwgaUltYWdlLCB5KVt3aGVyZS0xXSk7Ci0gICAgICBwbmdfZXJyb3IocHAsIG1zZyk7Ci0gICB9Ci0KLSAgIGlmIChpRGlzcGxheSA+PSAwICYmCi0gICAgICAod2hlcmUgPSBwaXhlbF9jbXAoc3RkLCBzdG9yZV9pbWFnZV9yb3coZHAtPnBzLCBwcCwgaURpc3BsYXksIHkpLAotICAgICAgICAgZHAtPmJpdF93aWR0aCkpICE9IDApCi0gICB7Ci0gICAgICBjaGFyIG1zZ1s2NF07Ci0gICAgICBzcHJpbnRmKG1zZywgImRpc3BsYXkgcm93WyVsdV1bJWRdIGNoYW5nZWQgZnJvbSAlLjJ4IHRvICUuMngiLAotICAgICAgICAgKHVuc2lnbmVkIGxvbmcpeSwgd2hlcmUtMSwgc3RkW3doZXJlLTFdLAotICAgICAgICAgc3RvcmVfaW1hZ2Vfcm93KGRwLT5wcywgcHAsIGlEaXNwbGF5LCB5KVt3aGVyZS0xXSk7Ci0gICAgICBwbmdfZXJyb3IocHAsIG1zZyk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdGFuZGFyZF9pbWFnZV92YWxpZGF0ZShzdGFuZGFyZF9kaXNwbGF5ICpkcCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIGludCBpSW1hZ2UsCi0gICAgaW50IGlEaXNwbGF5KQotewotICAgcG5nX3VpbnRfMzIgeTsKLQotICAgaWYgKGlJbWFnZSA+PSAwKQotICAgICAgc3RvcmVfaW1hZ2VfY2hlY2soZHAtPnBzLCBwcCwgaUltYWdlKTsKLQotICAgaWYgKGlEaXNwbGF5ID49IDApCi0gICAgICBzdG9yZV9pbWFnZV9jaGVjayhkcC0+cHMsIHBwLCBpRGlzcGxheSk7Ci0KLSAgIGZvciAoeT0wOyB5PGRwLT5oOyArK3kpCi0gICAgICBzdGFuZGFyZF9yb3dfdmFsaWRhdGUoZHAsIHBwLCBpSW1hZ2UsIGlEaXNwbGF5LCB5KTsKLQotICAgLyogVGhpcyBhdm9pZHMgZmFsc2UgcG9zaXRpdmVzIGlmIHRoZSB2YWxpZGF0aW9uIGNvZGUgaXMgbmV2ZXIgY2FsbGVkISAqLwotICAgZHAtPnBzLT52YWxpZGF0ZWQgPSAxOwotfQotCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotc3RhbmRhcmRfZW5kKHBuZ19zdHJ1Y3RwIHBwSW4sIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19jb25zdF9zdHJ1Y3RwIHBwID0gcHBJbjsKLSAgIHN0YW5kYXJkX2Rpc3BsYXkgKmRwID0gdm9pZGNhc3Qoc3RhbmRhcmRfZGlzcGxheSosCi0gICAgICBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwcCkpOwotCi0gICBVTlVTRUQocGkpCi0KLSAgIC8qIFZhbGlkYXRlIHRoZSBpbWFnZSAtIHByb2dyZXNzaXZlIHJlYWRpbmcgb25seSBwcm9kdWNlcyBvbmUgdmFyaWFudCBmb3IKLSAgICAqIGludGVybGFjZWQgaW1hZ2VzLgotICAgICovCi0gICBzdGFuZGFyZF90ZXh0X3ZhbGlkYXRlKGRwLCBwcCwgcGksCi0gICAgICBQTkdfTElCUE5HX1ZFUiA+PSAxMDUxOC8qY2hlY2tfZW5kOiBzZWUgY29tbWVudHMgYWJvdmUqLyk7Ci0gICBzdGFuZGFyZF9pbWFnZV92YWxpZGF0ZShkcCwgcHAsIDAsIC0xKTsKLX0KLQotLyogQSBzaW5nbGUgdGVzdCBydW4gY2hlY2tpbmcgdGhlIHN0YW5kYXJkIGltYWdlIHRvIGVuc3VyZSBpdCBpcyBub3QgZGFtYWdlZC4gKi8KLXN0YXRpYyB2b2lkCi1zdGFuZGFyZF90ZXN0KHBuZ19zdG9yZSogY29uc3QgcHNJbiwgcG5nX3VpbnRfMzIgY29uc3QgaWQsCi0gICBpbnQgZG9faW50ZXJsYWNlLCBpbnQgdXNlX3VwZGF0ZV9pbmZvKQotewotICAgc3RhbmRhcmRfZGlzcGxheSBkOwotICAgY29udGV4dChwc0luLCBmYXVsdCk7Ci0KLSAgIC8qIFNldCB1cCB0aGUgZGlzcGxheSAoc3RhY2sgZnJhbWUpIHZhcmlhYmxlcyBmcm9tIHRoZSBhcmd1bWVudHMgdG8gdGhlCi0gICAgKiBmdW5jdGlvbiBhbmQgaW5pdGlhbGl6ZSB0aGUgbG9jYWxzIHRoYXQgYXJlIGZpbGxlZCBpbiBsYXRlci4KLSAgICAqLwotICAgc3RhbmRhcmRfZGlzcGxheV9pbml0KCZkLCBwc0luLCBpZCwgZG9faW50ZXJsYWNlLCB1c2VfdXBkYXRlX2luZm8pOwotCi0gICAvKiBFdmVyeXRoaW5nIGlzIHByb3RlY3RlZCBieSBhIFRyeS9DYXRjaC4gIFRoZSBmdW5jdGlvbnMgY2FsbGVkIGFsc28KLSAgICAqIHR5cGljYWxseSBoYXZlIGxvY2FsIFRyeS9DYXRjaCBibG9ja3MuCi0gICAgKi8KLSAgIFRyeQotICAgewotICAgICAgcG5nX3N0cnVjdHAgcHA7Ci0gICAgICBwbmdfaW5mb3AgcGk7Ci0KLSAgICAgIC8qIEdldCBhIHBuZ19zdHJ1Y3QgZm9yIHJlYWRpbmcgdGhlIGltYWdlLiBUaGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgaXQKLSAgICAgICAqIGZhaWxzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSByZXN1bHQuCi0gICAgICAgKi8KLSAgICAgIHBwID0gc2V0X3N0b3JlX2Zvcl9yZWFkKGQucHMsICZwaSwgZC5pZCwKLSAgICAgICAgIGQuZG9faW50ZXJsYWNlID8gIChkLnBzLT5wcm9ncmVzc2l2ZSA/Ci0gICAgICAgICAgICAicG5ndmFsaWQgcHJvZ3Jlc3NpdmUgZGVpbnRlcmxhY2VyIiA6Ci0gICAgICAgICAgICAicG5ndmFsaWQgc2VxdWVudGlhbCBkZWludGVybGFjZXIiKSA6IChkLnBzLT5wcm9ncmVzc2l2ZSA/Ci0gICAgICAgICAgICAgICAicHJvZ3Jlc3NpdmUgcmVhZGVyIiA6ICJzZXF1ZW50aWFsIHJlYWRlciIpKTsKLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcGFsZXR0ZSBjb3JyZWN0bHkgZnJvbSB0aGUgcG5nX3N0b3JlX2ZpbGUuICovCi0gICAgICBzdGFuZGFyZF9wYWxldHRlX2luaXQoJmQpOwotCi0gICAgICAvKiBJbnRyb2R1Y2UgdGhlIGNvcnJlY3QgcmVhZCBmdW5jdGlvbi4gKi8KLSAgICAgIGlmIChkLnBzLT5wcm9ncmVzc2l2ZSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwcCwgJmQsIHN0YW5kYXJkX2luZm8sIHByb2dyZXNzaXZlX3JvdywKLSAgICAgICAgICAgIHN0YW5kYXJkX2VuZCk7Ci0KLSAgICAgICAgIC8qIE5vdyBmZWVkIGRhdGEgaW50byB0aGUgcmVhZGVyIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQ6ICovCi0gICAgICAgICBzdG9yZV9wcm9ncmVzc2l2ZV9yZWFkKGQucHMsIHBwLCBwaSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvKiBOb3RlIHRoYXQgdGhpcyB0YWtlcyB0aGUgc3RvcmUsIG5vdCB0aGUgZGlzcGxheS4gKi8KLSAgICAgICAgIHBuZ19zZXRfcmVhZF9mbihwcCwgZC5wcywgc3RvcmVfcmVhZCk7Ci0KLSAgICAgICAgIC8qIENoZWNrIHRoZSBoZWFkZXIgdmFsdWVzOiAqLwotICAgICAgICAgcG5nX3JlYWRfaW5mbyhwcCwgcGkpOwotCi0gICAgICAgICAvKiBUaGUgY29kZSB0ZXN0cyBib3RoIHZlcnNpb25zIG9mIHRoZSBpbWFnZXMgdGhhdCB0aGUgc2VxdWVudGlhbAotICAgICAgICAgICogcmVhZGVyIGNhbiBwcm9kdWNlLgotICAgICAgICAgICovCi0gICAgICAgICBzdGFuZGFyZF9pbmZvX2ltcCgmZCwgcHAsIHBpLCAyIC8qaW1hZ2VzKi8pOwotCi0gICAgICAgICAvKiBOZWVkIHRoZSB0b3RhbCBieXRlcyBpbiB0aGUgaW1hZ2UgYmVsb3c7IHdlIGNhbid0IGdldCB0byB0aGlzIHBvaW50Ci0gICAgICAgICAgKiB1bmxlc3MgdGhlIFBORyBmaWxlIHZhbHVlcyBoYXZlIGJlZW4gY2hlY2tlZCBhZ2FpbnN0IHRoZSBleHBlY3RlZAotICAgICAgICAgICogdmFsdWVzLgotICAgICAgICAgICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzZXF1ZW50aWFsX3JvdygmZCwgcHAsIHBpLCAwLCAxKTsKLQotICAgICAgICAgICAgLyogQWZ0ZXIgdGhlIGxhc3QgcGFzcyBsb29wIG92ZXIgdGhlIHJvd3MgYWdhaW4gdG8gY2hlY2sgdGhhdCB0aGUKLSAgICAgICAgICAgICAqIGltYWdlIGlzIGNvcnJlY3QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICghZC5zcGVlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN0YW5kYXJkX3RleHRfdmFsaWRhdGUoJmQsIHBwLCBwaSwgMS8qY2hlY2tfZW5kKi8pOwotICAgICAgICAgICAgICAgc3RhbmRhcmRfaW1hZ2VfdmFsaWRhdGUoJmQsIHBwLCAwLCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGQucHMtPnZhbGlkYXRlZCA9IDE7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIENoZWNrIGZvciB2YWxpZGF0aW9uLiAqLwotICAgICAgaWYgKCFkLnBzLT52YWxpZGF0ZWQpCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJpbWFnZSByZWFkIGZhaWxlZCBzaWxlbnRseSIpOwotCi0gICAgICAvKiBTdWNjZXNzZnVsIGNvbXBsZXRpb24uICovCi0gICB9Ci0KLSAgIENhdGNoKGZhdWx0KQotICAgICAgZC5wcyA9IGZhdWx0OyAvKiBtYWtlIHN1cmUgdGhpcyBoYXNuJ3QgYmVlbiBjbG9iYmVyZWQuICovCi0KLSAgIC8qIEluIGVpdGhlciBjYXNlIGNsZWFuIHVwIHRoZSBzdG9yZS4gKi8KLSAgIHN0b3JlX3JlYWRfcmVzZXQoZC5wcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXRlc3Rfc3RhbmRhcmQocG5nX21vZGlmaWVyKiBjb25zdCBwbSwgcG5nX2J5dGUgY29uc3QgY29sb3VyX3R5cGUsCi0gICAgaW50IGJkbG8sIGludCBjb25zdCBiZGhpKQotewotICAgZm9yICg7IGJkbG8gPD0gYmRoaTsgKytiZGxvKQotICAgewotICAgICAgaW50IGludGVybGFjZV90eXBlOwotCi0gICAgICBmb3IgKGludGVybGFjZV90eXBlID0gUE5HX0lOVEVSTEFDRV9OT05FOwotICAgICAgICAgICBpbnRlcmxhY2VfdHlwZSA8IElOVEVSTEFDRV9MQVNUOyArK2ludGVybGFjZV90eXBlKQotICAgICAgewotICAgICAgICAgc3RhbmRhcmRfdGVzdCgmcG0tPnRoaXMsIEZJTEVJRChjb2xvdXJfdHlwZSwgREVQVEgoYmRsbyksIDAvKnBhbGV0dGUqLywKLSAgICAgICAgICAgIGludGVybGFjZV90eXBlLCAwLCAwLCAwKSwgZG9fcmVhZF9pbnRlcmxhY2UsIHBtLT51c2VfdXBkYXRlX2luZm8pOwotCi0gICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIDE7IC8qIGtlZXAgZ29pbmcgKi8KLX0KLQotc3RhdGljIHZvaWQKLXBlcmZvcm1fc3RhbmRhcmRfdGVzdChwbmdfbW9kaWZpZXIgKnBtKQotewotICAgLyogVGVzdCBlYWNoIGNvbG91ciB0eXBlIG92ZXIgdGhlIHZhbGlkIHJhbmdlIG9mIGJpdCBkZXB0aHMgKGV4cHJlc3NlZCBhcwotICAgICogbG9nMihiaXRfZGVwdGgpIGluIHR1cm4sIHN0b3AgYXMgc29vbiBhcyBhbnkgZXJyb3IgaXMgZGV0ZWN0ZWQuCi0gICAgKi8KLSAgIGlmICghdGVzdF9zdGFuZGFyZChwbSwgMCwgMCwgUkVBRF9CREhJKSkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKCF0ZXN0X3N0YW5kYXJkKHBtLCAyLCAzLCBSRUFEX0JESEkpKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoIXRlc3Rfc3RhbmRhcmQocG0sIDMsIDAsIDMpKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoIXRlc3Rfc3RhbmRhcmQocG0sIDQsIDMsIFJFQURfQkRISSkpCi0gICAgICByZXR1cm47Ci0KLSAgIGlmICghdGVzdF9zdGFuZGFyZChwbSwgNiwgMywgUkVBRF9CREhJKSkKLSAgICAgIHJldHVybjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTSVpFIFRFU1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotdGVzdF9zaXplKHBuZ19tb2RpZmllciogY29uc3QgcG0sIHBuZ19ieXRlIGNvbnN0IGNvbG91cl90eXBlLAotICAgIGludCBiZGxvLCBpbnQgY29uc3QgYmRoaSkKLXsKLSAgIC8qIFJ1biB0aGUgdGVzdHMgb24gZWFjaCBjb21iaW5hdGlvbi4KLSAgICAqCi0gICAgKiBOT1RFOiBvbiBteSAzMiBiaXQgeDg2IGVhY2ggb2YgdGhlIGZvbGxvd2luZyBibG9ja3MgdGFrZXMKLSAgICAqIGEgdG90YWwgb2YgMy41IHNlY29uZHMgaWYgZG9uZSBhY3Jvc3MgZXZlcnkgY29tYm8gb2YgYml0IGRlcHRoCi0gICAgKiB3aWR0aCBhbmQgaGVpZ2h0LiAgVGhpcyBpcyBhIHdhc3RlIG9mIHRpbWUgaW4gcHJhY3RpY2UsIGhlbmNlIHRoZQotICAgICogaGluYyBhbmQgd2luYyBzdHVmZjoKLSAgICAqLwotICAgc3RhdGljIGNvbnN0IHBuZ19ieXRlIGhpbmNbXSA9IHsxLCAzLCAxMSwgMSwgNX07Ci0gICBzdGF0aWMgY29uc3QgcG5nX2J5dGUgd2luY1tdID0gezEsIDksIDUsIDcsIDF9OwotICAgY29uc3QgaW50IHNhdmVfYmRsbyA9IGJkbG87Ci0KLSAgIGZvciAoOyBiZGxvIDw9IGJkaGk7ICsrYmRsbykKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIGgsIHc7Ci0KLSAgICAgIGZvciAoaD0xOyBoPD0xNjsgaCs9aGluY1tiZGxvXSkgZm9yICh3PTE7IHc8PTE2OyB3Kz13aW5jW2JkbG9dKQotICAgICAgewotICAgICAgICAgLyogRmlyc3QgdGVzdCBhbGwgdGhlICdzaXplJyBpbWFnZXMgYWdhaW5zdCB0aGUgc2VxdWVudGlhbAotICAgICAgICAgICogcmVhZGVyIHVzaW5nIGxpYnBuZyB0byBkZWludGVybGFjZSAod2hlcmUgcmVxdWlyZWQuKSAgVGhpcwotICAgICAgICAgICogdmFsaWRhdGVzIHRoZSB3cml0ZSBzaWRlIG9mIGxpYnBuZy4gIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmlsaXRpZXMKLSAgICAgICAgICAqIHRvIHZhbGlkYXRlLgotICAgICAgICAgICovCi0gICAgICAgICBzdGFuZGFyZF90ZXN0KCZwbS0+dGhpcywgRklMRUlEKGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgMC8qcGFsZXR0ZSovLAotICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCB3LCBoLCAwKSwgMC8qZG9faW50ZXJsYWNlKi8sCi0gICAgICAgICAgICBwbS0+dXNlX3VwZGF0ZV9pbmZvKTsKLQotICAgICAgICAgaWYgKGZhaWwocG0pKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgIHN0YW5kYXJkX3Rlc3QoJnBtLT50aGlzLCBGSUxFSUQoY29sb3VyX3R5cGUsIERFUFRIKGJkbG8pLCAwLypwYWxldHRlKi8sCi0gICAgICAgICAgICBQTkdfSU5URVJMQUNFX05PTkUsIHcsIGgsIDEpLCAwLypkb19pbnRlcmxhY2UqLywKLSAgICAgICAgICAgIHBtLT51c2VfdXBkYXRlX2luZm8pOwotCi0gICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgLyogTm93IHZhbGlkYXRlIHRoZSBpbnRlcmxhY2VkIHJlYWQgc2lkZSAtIGRvX2ludGVybGFjZSB0cnVlLAotICAgICAgICAgICogaW4gdGhlIHByb2dyZXNzaXZlIGNhc2UgdGhpcyBkb2VzIGFjdHVhbGx5IG1ha2UgYSBkaWZmZXJlbmNlCi0gICAgICAgICAgKiB0byB0aGUgY29kZSB1c2VkIGluIHRoZSBub24taW50ZXJsYWNlZCBjYXNlIHRvby4KLSAgICAgICAgICAqLwotICAgICAgICAgc3RhbmRhcmRfdGVzdCgmcG0tPnRoaXMsIEZJTEVJRChjb2xvdXJfdHlwZSwgREVQVEgoYmRsbyksIDAvKnBhbGV0dGUqLywKLSAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgdywgaCwgMCksIDEvKmRvX2ludGVybGFjZSovLAotICAgICAgICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7Ci0KLSAgICAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0jICAgICBpZiBDQU5fV1JJVEVfSU5URVJMQUNFCi0gICAgICAgICAvKiBWYWxpZGF0ZSB0aGUgcG5ndmFsaWQgY29kZSBpdHNlbGY6ICovCi0gICAgICAgICBzdGFuZGFyZF90ZXN0KCZwbS0+dGhpcywgRklMRUlEKGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgMC8qcGFsZXR0ZSovLAotICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNywgdywgaCwgMSksIDEvKmRvX2ludGVybGFjZSovLAotICAgICAgICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7Ci0KLSAgICAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotIyAgICAgZW5kaWYKLSAgICAgIH0KLSAgIH0KLQotICAgLyogTm93IGRvIHRoZSB0ZXN0cyBvZiBsaWJwbmcgaW50ZXJsYWNlIGhhbmRsaW5nLCBhZnRlciB3ZSBoYXZlIG1hZGUgc3VyZQotICAgICogdGhhdCB0aGUgcG5ndmFsaWQgdmVyc2lvbiB3b3JrczoKLSAgICAqLwotICAgZm9yIChiZGxvID0gc2F2ZV9iZGxvOyBiZGxvIDw9IGJkaGk7ICsrYmRsbykKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIGgsIHc7Ci0KLSAgICAgIGZvciAoaD0xOyBoPD0xNjsgaCs9aGluY1tiZGxvXSkgZm9yICh3PTE7IHc8PTE2OyB3Kz13aW5jW2JkbG9dKQotICAgICAgewotIyAgICAgaWZkZWYgUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVECi0gICAgICAgICAvKiBUZXN0IHdpdGggcG5ndmFsaWQgZ2VuZXJhdGVkIGludGVybGFjZWQgaW1hZ2VzIGZpcnN0OyB3ZSBoYXZlCi0gICAgICAgICAgKiBhbHJlYWR5IHZlcmlmeSB0aGVzZSBhcmUgb2sgKHVubGVzcyBwbmd2YWxpZCBoYXMgc2VsZi1jb25zaXN0ZW50Ci0gICAgICAgICAgKiByZWFkL3dyaXRlIGVycm9ycywgd2hpY2ggaXMgdW5saWtlbHkpLCBzbyB0aGlzIGRldGVjdHMgZXJyb3JzIGluIHRoZQotICAgICAgICAgICogcmVhZCBzaWRlIGZpcnN0OgotICAgICAgICAgICovCi0jICAgICBpZiBDQU5fV1JJVEVfSU5URVJMQUNFCi0gICAgICAgICBzdGFuZGFyZF90ZXN0KCZwbS0+dGhpcywgRklMRUlEKGNvbG91cl90eXBlLCBERVBUSChiZGxvKSwgMC8qcGFsZXR0ZSovLAotICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNywgdywgaCwgMSksIDAvKmRvX2ludGVybGFjZSovLAotICAgICAgICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7Ci0KLSAgICAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotIyAgICAgZW5kaWYKLSMgICAgIGVuZGlmIC8qIFJFQURfSU5URVJMQUNJTkcgKi8KLQotIyAgICAgaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgICAgICAgLyogVGVzdCB0aGUgbGlicG5nIHdyaXRlIHNpZGUgYWdhaW5zdCB0aGUgcG5ndmFsaWQgcmVhZCBzaWRlOiAqLwotICAgICAgICAgc3RhbmRhcmRfdGVzdCgmcG0tPnRoaXMsIEZJTEVJRChjb2xvdXJfdHlwZSwgREVQVEgoYmRsbyksIDAvKnBhbGV0dGUqLywKLSAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfQURBTTcsIHcsIGgsIDApLCAxLypkb19pbnRlcmxhY2UqLywKLSAgICAgICAgICAgIHBtLT51c2VfdXBkYXRlX2luZm8pOwotCi0gICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSMgICAgIGVuZGlmCi0KLSMgICAgIGlmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotIyAgICAgaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRAotICAgICAgICAgLyogVGVzdCBib3RoIHRvZ2V0aGVyOiAqLwotICAgICAgICAgc3RhbmRhcmRfdGVzdCgmcG0tPnRoaXMsIEZJTEVJRChjb2xvdXJfdHlwZSwgREVQVEgoYmRsbyksIDAvKnBhbGV0dGUqLywKLSAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfQURBTTcsIHcsIGgsIDApLCAwLypkb19pbnRlcmxhY2UqLywKLSAgICAgICAgICAgIHBtLT51c2VfdXBkYXRlX2luZm8pOwotCi0gICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSMgICAgIGVuZGlmCi0jICAgICBlbmRpZiAvKiBSRUFEX0lOVEVSTEFDSU5HICovCi0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiAxOyAvKiBrZWVwIGdvaW5nICovCi19Ci0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX3NpemVfdGVzdChwbmdfbW9kaWZpZXIgKnBtKQotewotICAgLyogVGVzdCBlYWNoIGNvbG91ciB0eXBlIG92ZXIgdGhlIHZhbGlkIHJhbmdlIG9mIGJpdCBkZXB0aHMgKGV4cHJlc3NlZCBhcwotICAgICogbG9nMihiaXRfZGVwdGgpIGluIHR1cm4sIHN0b3AgYXMgc29vbiBhcyBhbnkgZXJyb3IgaXMgZGV0ZWN0ZWQuCi0gICAgKi8KLSAgIGlmICghdGVzdF9zaXplKHBtLCAwLCAwLCBSRUFEX0JESEkpKQotICAgICAgcmV0dXJuOwotCi0gICBpZiAoIXRlc3Rfc2l6ZShwbSwgMiwgMywgUkVBRF9CREhJKSkKLSAgICAgIHJldHVybjsKLQotICAgLyogRm9yIHRoZSBtb21lbnQgZG9uJ3QgZG8gdGhlIHBhbGV0dGUgdGVzdCAtIGl0J3MgYSB3YXN0ZSBvZiB0aW1lIHdoZW4KLSAgICAqIGNvbXBhcmVkIHRvIHRoZSBncmF5c2NhbGUgdGVzdC4KLSAgICAqLwotI2lmIDAKLSAgIGlmICghdGVzdF9zaXplKHBtLCAzLCAwLCAzKSkKLSAgICAgIHJldHVybjsKLSNlbmRpZgotCi0gICBpZiAoIXRlc3Rfc2l6ZShwbSwgNCwgMywgUkVBRF9CREhJKSkKLSAgICAgIHJldHVybjsKLQotICAgaWYgKCF0ZXN0X3NpemUocG0sIDYsIDMsIFJFQURfQkRISSkpCi0gICAgICByZXR1cm47Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFJBTlNGT1JNIFRFU1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRAotLyogQSBzZXQgb2YgdGVzdHMgdG8gdmFsaWRhdGUgbGlicG5nIGltYWdlIHRyYW5zZm9ybXMuICBUaGUgcG9zc2liaWxpdGllcyBoZXJlCi0gKiBhcmUgbGVnaW9uIGJlY2F1c2UgdGhlIHRyYW5zZm9ybXMgY2FuIGJlIGNvbWJpbmVkIGluIGEgY29tYmluYXRvcmlhbAotICogZmFzaGlvbi4gIFRvIGRlYWwgd2l0aCB0aGlzIHNvbWUgbWVhc3VyZSBvZiByZXN0cmFpbnQgaXMgcmVxdWlyZWQsIG90aGVyd2lzZQotICogdGhlIHRlc3RzIHdvdWxkIHRha2UgZm9yZXZlci4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfcGl4ZWwKLXsKLSAgIC8qIEEgbG9jYWwgKHBuZ3ZhbGlkKSByZXByZXNlbnRhdGlvbiBvZiBhIFBORyBwaXhlbCwgaW4gYWxsIGl0cwotICAgICogdmFyaW91cyBmb3Jtcy4KLSAgICAqLwotICAgdW5zaWduZWQgaW50IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOyAvKiBGb3Igbm9uLXBhbGV0dGUgaW1hZ2VzLiAqLwotICAgdW5zaWduZWQgaW50IHBhbGV0dGVfaW5kZXg7ICAgICAgICAgICAvKiBGb3IgYSBwYWxldHRlIGltYWdlLiAqLwotICAgcG5nX2J5dGUgICAgIGNvbG91cl90eXBlOyAgICAgICAgICAgICAvKiBBcyBpbiB0aGUgc3BlYy4gKi8KLSAgIHBuZ19ieXRlICAgICBiaXRfZGVwdGg7ICAgICAgICAgICAgICAgLyogRGVmaW5lcyBiaXQgc2l6ZSBpbiByb3cgKi8KLSAgIHBuZ19ieXRlICAgICBzYW1wbGVfZGVwdGg7ICAgICAgICAgICAgLyogU2NhbGUgb2Ygc2FtcGxlcyAqLwotICAgdW5zaWduZWQgaW50IGhhdmVfdFJOUyA6MTsgICAgICAgICAgICAvKiB0Uk5TIGNodW5rIG1heSBuZWVkIHByb2Nlc3NpbmcgKi8KLSAgIHVuc2lnbmVkIGludCBzd2FwX3JnYiA6MTsgICAgICAgICAgICAgLyogUkdCIHN3YXBwZWQgdG8gQkdSICovCi0gICB1bnNpZ25lZCBpbnQgYWxwaGFfZmlyc3QgOjE7ICAgICAgICAgIC8qIEFscGhhIGF0IHN0YXJ0LCBub3QgZW5kICovCi0gICB1bnNpZ25lZCBpbnQgYWxwaGFfaW52ZXJ0ZWQgOjE7ICAgICAgIC8qIEFscGhhIGNoYW5uZWwgaW52ZXJ0ZWQgKi8KLSAgIHVuc2lnbmVkIGludCBtb25vX2ludmVydGVkIDoxOyAgICAgICAgLyogR3JheSBjaGFubmVsIGludmVydGVkICovCi0gICB1bnNpZ25lZCBpbnQgc3dhcDE2IDoxOyAgICAgICAgICAgICAgIC8qIEJ5dGUgc3dhcCAxNi1iaXQgY29tcG9uZW50cyAqLwotICAgdW5zaWduZWQgaW50IGxpdHRsZWVuZGlhbiA6MTsgICAgICAgICAvKiBIaWdoIGJpdHMgb24gcmlnaHQgKi8KLSAgIHVuc2lnbmVkIGludCBzaWdfYml0cyA6MTsgICAgICAgICAgICAgLyogUGl4ZWwgc2hpZnRlZCAoc2lnIGJpdHMgb25seSkgKi8KLQotICAgLyogRm9yIGNoZWNraW5nIHRoZSBjb2RlIGNhbGN1bGF0ZXMgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZXMKLSAgICAqIGFsb25nIHdpdGggYW4gZXJyb3IgdmFsdWUsIGFjY3VtdWxhdGVkIGZyb20gdGhlIHRyYW5zZm9ybXMuICBCZWNhdXNlIGFuCi0gICAgKiBzQklUIHNldHRpbmcgYWxsb3dzIGxhcmdlciBlcnJvciBib3VuZHMgKGluZGVlZCwgYnkgdGhlIHNwZWMsIGFwcGFyZW50bHkKLSAgICAqIHVwIHRvIGp1c3QgbGVzcyB0aGFuICsvLTEgaW4gdGhlIHNjYWxlZCB2YWx1ZSkgdGhlICpsb3dlc3QqIHNCSVQgZm9yIGVhY2gKLSAgICAqIGNoYW5uZWwgaXMgc3RvcmVkLiAgVGhpcyBzQklUIHZhbHVlIGlzIGZvbGRlZCBpbiB0byB0aGUgc3RvcmVkIGVycm9yIHZhbHVlCi0gICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgdHJhbnNmb3JtcyB0byB0aGUgcGl4ZWwuCi0gICAgKgotICAgICogSWYgc2lnX2JpdHMgaXMgc2V0IGFib3ZlIHRoZSByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYSB2YWx1ZXMgaGF2ZSBiZWVuCi0gICAgKiBzY2FsZWQgc28gdGhleSBvbmx5IGNvbnRhaW4gdGhlIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGNvbXBvbmVudCB2YWx1ZXMuCi0gICAgKi8KLSAgIGRvdWJsZSAgIHJlZGYsIGdyZWVuZiwgYmx1ZWYsIGFscGhhZjsKLSAgIGRvdWJsZSAgIHJlZGUsIGdyZWVuZSwgYmx1ZWUsIGFscGhhZTsKLSAgIHBuZ19ieXRlIHJlZF9zQklULCBncmVlbl9zQklULCBibHVlX3NCSVQsIGFscGhhX3NCSVQ7Ci19IGltYWdlX3BpeGVsOwotCi0vKiBTaGFyZWQgdXRpbGl0eSBmdW5jdGlvbiwgc2VlIGJlbG93LiAqLwotc3RhdGljIHZvaWQKLWltYWdlX3BpeGVsX3NldGYoaW1hZ2VfcGl4ZWwgKnRoaXMsIHVuc2lnbmVkIGludCByTWF4LCB1bnNpZ25lZCBpbnQgZ01heCwKLSAgICAgICAgdW5zaWduZWQgaW50IGJNYXgsIHVuc2lnbmVkIGludCBhTWF4KQotewotICAgdGhpcy0+cmVkZiA9IHRoaXMtPnJlZCAvIChkb3VibGUpck1heDsKLSAgIHRoaXMtPmdyZWVuZiA9IHRoaXMtPmdyZWVuIC8gKGRvdWJsZSlnTWF4OwotICAgdGhpcy0+Ymx1ZWYgPSB0aGlzLT5ibHVlIC8gKGRvdWJsZSliTWF4OwotICAgdGhpcy0+YWxwaGFmID0gdGhpcy0+YWxwaGEgLyAoZG91YmxlKWFNYXg7Ci0KLSAgIGlmICh0aGlzLT5yZWQgPCByTWF4KQotICAgICAgdGhpcy0+cmVkZSA9IHRoaXMtPnJlZGYgKiBEQkxfRVBTSUxPTjsKLSAgIGVsc2UKLSAgICAgIHRoaXMtPnJlZGUgPSAwOwotICAgaWYgKHRoaXMtPmdyZWVuIDwgZ01heCkKLSAgICAgIHRoaXMtPmdyZWVuZSA9IHRoaXMtPmdyZWVuZiAqIERCTF9FUFNJTE9OOwotICAgZWxzZQotICAgICAgdGhpcy0+Z3JlZW5lID0gMDsKLSAgIGlmICh0aGlzLT5ibHVlIDwgYk1heCkKLSAgICAgIHRoaXMtPmJsdWVlID0gdGhpcy0+Ymx1ZWYgKiBEQkxfRVBTSUxPTjsKLSAgIGVsc2UKLSAgICAgIHRoaXMtPmJsdWVlID0gMDsKLSAgIGlmICh0aGlzLT5hbHBoYSA8IGFNYXgpCi0gICAgICB0aGlzLT5hbHBoYWUgPSB0aGlzLT5hbHBoYWYgKiBEQkxfRVBTSUxPTjsKLSAgIGVsc2UKLSAgICAgIHRoaXMtPmFscGhhZSA9IDA7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSBmb3IgdGhlIG5leHQgcGl4ZWwgLSBjYWxsIHRoaXMgYmVmb3JlIGRvaW5nIGFueQotICogdHJhbnNmb3JtcyBhbmQgY2FsbCBpdCBmb3IgZWFjaCBwaXhlbCBzaW5jZSBhbGwgdGhlIGZpZWxkcyBtYXkgbmVlZCB0byBiZQotICogcmVzZXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1pbWFnZV9waXhlbF9pbml0KGltYWdlX3BpeGVsICp0aGlzLCBwbmdfY29uc3RfYnl0ZXAgcm93LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwKLSAgICBwbmdfYnl0ZSBiaXRfZGVwdGgsIHBuZ191aW50XzMyIHgsIHN0b3JlX3BhbGV0dGUgcGFsZXR0ZSwKLSAgICBjb25zdCBpbWFnZV9waXhlbCAqZm9ybWF0IC8qZnJvbSBwbmd2YWxpZCB0cmFuc2Zvcm0gb2YgaW5wdXQqLykKLXsKLSAgIGNvbnN0IHBuZ19ieXRlIHNhbXBsZV9kZXB0aCA9IChwbmdfYnl0ZSkoY29sb3VyX3R5cGUgPT0KLSAgICAgIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgPyA4IDogYml0X2RlcHRoKTsKLSAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXggPSAoMVU8PHNhbXBsZV9kZXB0aCktMTsKLSAgIGNvbnN0IGludCBzd2FwMTYgPSAoZm9ybWF0ICE9IDAgJiYgZm9ybWF0LT5zd2FwMTYpOwotICAgY29uc3QgaW50IGxpdHRsZWVuZGlhbiA9IChmb3JtYXQgIT0gMCAmJiBmb3JtYXQtPmxpdHRsZWVuZGlhbik7Ci0gICBjb25zdCBpbnQgc2lnX2JpdHMgPSAoZm9ybWF0ICE9IDAgJiYgZm9ybWF0LT5zaWdfYml0cyk7Ci0KLSAgIC8qIEluaXRpYWxseSBqdXN0IHNldCBldmVyeXRoaW5nIHRvIHRoZSBzYW1lIG51bWJlciBhbmQgdGhlIGFscGhhIHRvIG9wYXF1ZS4KLSAgICAqIE5vdGUgdGhhdCB0aGlzIGN1cnJlbnRseSBhc3N1bWVzIGEgc2ltcGxlIHBhbGV0dGUgd2hlcmUgZW50cnkgeCBoYXMgY29sb3VyCi0gICAgKiByZ2IoeCx4LHgpIQotICAgICovCi0gICB0aGlzLT5wYWxldHRlX2luZGV4ID0gdGhpcy0+cmVkID0gdGhpcy0+Z3JlZW4gPSB0aGlzLT5ibHVlID0KLSAgICAgIHNhbXBsZShyb3csIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHgsIDAsIHN3YXAxNiwgbGl0dGxlZW5kaWFuKTsKLSAgIHRoaXMtPmFscGhhID0gbWF4OwotICAgdGhpcy0+cmVkX3NCSVQgPSB0aGlzLT5ncmVlbl9zQklUID0gdGhpcy0+Ymx1ZV9zQklUID0gdGhpcy0+YWxwaGFfc0JJVCA9Ci0gICAgICBzYW1wbGVfZGVwdGg7Ci0KLSAgIC8qIFRoZW4gb3ZlcnJpZGUgYXMgYXBwcm9wcmlhdGU6ICovCi0gICBpZiAoY29sb3VyX3R5cGUgPT0gMykgLyogcGFsZXR0ZSAqLwotICAgewotICAgICAgLyogVGhpcyBwZXJtaXRzIHRoZSBjYWxsZXIgdG8gZGVmYXVsdCB0byB0aGUgc2FtcGxlIHZhbHVlLiAqLwotICAgICAgaWYgKHBhbGV0dGUgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBpID0gdGhpcy0+cGFsZXR0ZV9pbmRleDsKLQotICAgICAgICAgdGhpcy0+cmVkID0gcGFsZXR0ZVtpXS5yZWQ7Ci0gICAgICAgICB0aGlzLT5ncmVlbiA9IHBhbGV0dGVbaV0uZ3JlZW47Ci0gICAgICAgICB0aGlzLT5ibHVlID0gcGFsZXR0ZVtpXS5ibHVlOwotICAgICAgICAgdGhpcy0+YWxwaGEgPSBwYWxldHRlW2ldLmFscGhhOwotICAgICAgfQotICAgfQotCi0gICBlbHNlIC8qIG5vdCBwYWxldHRlICovCi0gICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgICAgIGlmICgoY29sb3VyX3R5cGUgJiA0KSAhPSAwICYmIGZvcm1hdCAhPSAwICYmIGZvcm1hdC0+YWxwaGFfZmlyc3QpCi0gICAgICB7Ci0gICAgICAgICB0aGlzLT5hbHBoYSA9IHRoaXMtPnJlZDsKLSAgICAgICAgIC8qIFRoaXMgaGFuZGxlcyB0aGUgZ3JheSBjYXNlIGZvciAnQUcnIHBpeGVscyAqLwotICAgICAgICAgdGhpcy0+cGFsZXR0ZV9pbmRleCA9IHRoaXMtPnJlZCA9IHRoaXMtPmdyZWVuID0gdGhpcy0+Ymx1ZSA9Ci0gICAgICAgICAgICBzYW1wbGUocm93LCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCB4LCAxLCBzd2FwMTYsIGxpdHRsZWVuZGlhbik7Ci0gICAgICAgICBpID0gMTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNvbG91cl90eXBlICYgMikKLSAgICAgIHsKLSAgICAgICAgIC8qIEdyZWVuIGlzIHNlY29uZCBmb3IgYm90aCBCR1IgYW5kIFJHQjogKi8KLSAgICAgICAgIHRoaXMtPmdyZWVuID0gc2FtcGxlKHJvdywgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgeCwgKytpLCBzd2FwMTYsCi0gICAgICAgICAgICAgICAgIGxpdHRsZWVuZGlhbik7Ci0KLSAgICAgICAgIGlmIChmb3JtYXQgIT0gMCAmJiBmb3JtYXQtPnN3YXBfcmdiKSAvKiBCR1IgKi8KLSAgICAgICAgICAgICB0aGlzLT5yZWQgPSBzYW1wbGUocm93LCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCB4LCArK2ksIHN3YXAxNiwKLSAgICAgICAgICAgICAgICAgICAgIGxpdHRsZWVuZGlhbik7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICAgdGhpcy0+Ymx1ZSA9IHNhbXBsZShyb3csIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHgsICsraSwgc3dhcDE2LAotICAgICAgICAgICAgICAgICAgICAgbGl0dGxlZW5kaWFuKTsKLSAgICAgIH0KLQotICAgICAgZWxzZSAvKiBncmF5c2NhbGUgKi8gaWYgKGZvcm1hdCAhPSAwICYmIGZvcm1hdC0+bW9ub19pbnZlcnRlZCkKLSAgICAgICAgIHRoaXMtPnJlZCA9IHRoaXMtPmdyZWVuID0gdGhpcy0+Ymx1ZSA9IHRoaXMtPnJlZCBeIG1heDsKLQotICAgICAgaWYgKChjb2xvdXJfdHlwZSAmIDQpICE9IDApIC8qIGFscGhhICovCi0gICAgICB7Ci0gICAgICAgICBpZiAoZm9ybWF0ID09IDAgfHwgIWZvcm1hdC0+YWxwaGFfZmlyc3QpCi0gICAgICAgICAgICAgdGhpcy0+YWxwaGEgPSBzYW1wbGUocm93LCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCB4LCArK2ksIHN3YXAxNiwKLSAgICAgICAgICAgICAgICAgICAgIGxpdHRsZWVuZGlhbik7Ci0KLSAgICAgICAgIGlmIChmb3JtYXQgIT0gMCAmJiBmb3JtYXQtPmFscGhhX2ludmVydGVkKQotICAgICAgICAgICAgdGhpcy0+YWxwaGEgXj0gbWF4OwotICAgICAgfQotICAgfQotCi0gICAvKiBDYWxjdWxhdGUgdGhlIHNjYWxlZCB2YWx1ZXMsIHRoZXNlIGFyZSBzaW1wbHkgdGhlIHZhbHVlcyBkaXZpZGVkIGJ5Ci0gICAgKiAnbWF4JyBhbmQgdGhlIGVycm9yIGlzIGluaXRpYWxpemVkIHRvIHRoZSBkb3VibGUgcHJlY2lzaW9uIGVwc2lsb24gdmFsdWUKLSAgICAqIGZyb20gdGhlIGhlYWRlciBmaWxlLgotICAgICovCi0gICBpbWFnZV9waXhlbF9zZXRmKHRoaXMsCi0gICAgICBzaWdfYml0cyA/ICgxVSA8PCBmb3JtYXQtPnJlZF9zQklUKS0xIDogbWF4LAotICAgICAgc2lnX2JpdHMgPyAoMVUgPDwgZm9ybWF0LT5ncmVlbl9zQklUKS0xIDogbWF4LAotICAgICAgc2lnX2JpdHMgPyAoMVUgPDwgZm9ybWF0LT5ibHVlX3NCSVQpLTEgOiBtYXgsCi0gICAgICBzaWdfYml0cyA/ICgxVSA8PCBmb3JtYXQtPmFscGhhX3NCSVQpLTEgOiBtYXgpOwotCi0gICAvKiBTdG9yZSB0aGUgaW5wdXQgaW5mb3JtYXRpb24gZm9yIHVzZSBpbiB0aGUgdHJhbnNmb3JtcyAtIHRoZXNlIHdpbGwKLSAgICAqIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24uCi0gICAgKi8KLSAgIHRoaXMtPmNvbG91cl90eXBlID0gY29sb3VyX3R5cGU7Ci0gICB0aGlzLT5iaXRfZGVwdGggPSBiaXRfZGVwdGg7Ci0gICB0aGlzLT5zYW1wbGVfZGVwdGggPSBzYW1wbGVfZGVwdGg7Ci0gICB0aGlzLT5oYXZlX3RSTlMgPSAwOwotICAgdGhpcy0+c3dhcF9yZ2IgPSAwOwotICAgdGhpcy0+YWxwaGFfZmlyc3QgPSAwOwotICAgdGhpcy0+YWxwaGFfaW52ZXJ0ZWQgPSAwOwotICAgdGhpcy0+bW9ub19pbnZlcnRlZCA9IDA7Ci0gICB0aGlzLT5zd2FwMTYgPSAwOwotICAgdGhpcy0+bGl0dGxlZW5kaWFuID0gMDsKLSAgIHRoaXMtPnNpZ19iaXRzID0gMDsKLX0KLQotI2lmIGRlZmluZWQgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCB8fCBkZWZpbmVkIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRFwKLSAgIHx8IGRlZmluZWQgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCB8fCBkZWZpbmVkIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURURcCi0gICB8fCBkZWZpbmVkIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0vKiBDb252ZXJ0IGEgcGFsZXR0ZSBpbWFnZSB0byBhbiByZ2IgaW1hZ2UuICBUaGlzIG5lY2Vzc2FyaWx5IGNvbnZlcnRzIHRoZSB0Uk5TCi0gKiBjaHVuayBhdCB0aGUgc2FtZSB0aW1lLCBiZWNhdXNlIHRoZSB0Uk5TIHdpbGwgYmUgaW4gcGFsZXR0ZSBmb3JtLiAgVGhlIHdheQotICogcGFsZXR0ZSB2YWxpZGF0aW9uIHdvcmtzIG1lYW5zIHRoYXQgdGhlIG9yaWdpbmFsIHBhbGV0dGUgaXMgbmV2ZXIgdXBkYXRlZCwKLSAqIGluc3RlYWQgdGhlIGltYWdlX3BpeGVsIHZhbHVlIGZyb20gdGhlIHJvdyBjb250YWlucyB0aGUgUkdCIG9mIHRoZQotICogY29ycmVzcG9uZGluZyBwYWxldHRlIGVudHJ5IGFuZCAqdGhpcyogaXMgdXBkYXRlZC4gIENvbnNlcXVlbnRseSB0aGlzIHJvdXRpbmUKLSAqIG9ubHkgbmVlZHMgdG8gY2hhbmdlIHRoZSBjb2xvdXIgdHlwZSBpbmZvcm1hdGlvbi4KLSAqLwotc3RhdGljIHZvaWQKLWltYWdlX3BpeGVsX2NvbnZlcnRfUExURShpbWFnZV9waXhlbCAqdGhpcykKLXsKLSAgIGlmICh0aGlzLT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgewotICAgICAgaWYgKHRoaXMtPmhhdmVfdFJOUykKLSAgICAgIHsKLSAgICAgICAgIHRoaXMtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotICAgICAgICAgdGhpcy0+aGF2ZV90Uk5TID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIHRoaXMtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOwotCi0gICAgICAvKiBUaGUgYml0IGRlcHRoIG9mIHRoZSByb3cgY2hhbmdlcyBhdCB0aGlzIHBvaW50IHRvbyAobm90aWNlIHRoYXQgdGhpcyBpcwotICAgICAgICogdGhlIHJvdyBmb3JtYXQsIG5vdCB0aGUgc2FtcGxlIGRlcHRoLCB3aGljaCBpcyBzZXBhcmF0ZS4pCi0gICAgICAgKi8KLSAgICAgIHRoaXMtPmJpdF9kZXB0aCA9IDg7Ci0gICB9Ci19Ci0KLS8qIEFkZCBhbiBhbHBoYSBjaGFubmVsOyB0aGlzIHdpbGwgaW1wb3J0IHRoZSB0Uk5TIGluZm9ybWF0aW9uIGJlY2F1c2UgdFJOUyBpcwotICogbm90IHZhbGlkIGluIGFuIGFscGhhIGltYWdlLiAgVGhlIGJpdCBkZXB0aCB3aWxsIGludmFyaWFibHkgYmUgc2V0IHRvIGF0Ci0gKiBsZWFzdCA4IHByaW9yIHRvIDEuNy4wLiAgUGFsZXR0ZSBpbWFnZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYWxwaGEgKHVzaW5nCi0gKiB0aGUgYWJvdmUgQVBJKS4gIFdpdGggcG5nX3NldF9iYWNrZ3JvdW5kIHRoZSBhbHBoYSBjaGFubmVsIGlzIG5ldmVyIGV4cGFuZGVkCi0gKiBidXQgdGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgcG5ndmFsaWQgdG8gc2ltcGxpZnkgY29kZTsgJ2Zvcl9iYWNrZ3JvdW5kJwotICogcmVjb3JkcyB0aGlzLgotICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfcGl4ZWxfYWRkX2FscGhhKGltYWdlX3BpeGVsICp0aGlzLCBjb25zdCBzdGFuZGFyZF9kaXNwbGF5ICpkaXNwbGF5LAotICAgaW50IGZvcl9iYWNrZ3JvdW5kKQotewotICAgaWYgKHRoaXMtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICBpbWFnZV9waXhlbF9jb252ZXJ0X1BMVEUodGhpcyk7Ci0KLSAgIGlmICgodGhpcy0+Y29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgPT0gMCkKLSAgIHsKLSAgICAgIGlmICh0aGlzLT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgICAgewotIyAgICAgICAgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAotICAgICAgICAgICAgaWYgKCFmb3JfYmFja2dyb3VuZCAmJiB0aGlzLT5iaXRfZGVwdGggPCA4KQotICAgICAgICAgICAgICAgdGhpcy0+Yml0X2RlcHRoID0gdGhpcy0+c2FtcGxlX2RlcHRoID0gODsKLSMgICAgICAgIGVuZGlmCi0KLSAgICAgICAgIGlmICh0aGlzLT5oYXZlX3RSTlMpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBZnRlciAxLjcgdGhlIGV4cGFuc2lvbiBvZiBiaXQgZGVwdGggb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIGEKLSAgICAgICAgICAgICAqIHRSTlMgY2h1bmsgdG8gZXhwYW5kIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgICAgICAgKi8KLSMgICAgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSID49IDEwNzAwCi0gICAgICAgICAgICAgICBpZiAoIWZvcl9iYWNrZ3JvdW5kICYmIHRoaXMtPmJpdF9kZXB0aCA8IDgpCi0gICAgICAgICAgICAgICAgICB0aGlzLT5iaXRfZGVwdGggPSB0aGlzLT5zYW1wbGVfZGVwdGggPSA4OwotIyAgICAgICAgICAgZW5kaWYKLQotICAgICAgICAgICAgdGhpcy0+aGF2ZV90Uk5TID0gMDsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGlucHV0LCBvcmlnaW5hbCwgY2hhbm5lbCB2YWx1ZSBoZXJlIGFnYWluc3QgdGhlCi0gICAgICAgICAgICAgKiBvcmlnaW5hbCB0Uk5TIGdyYXkgY2h1bmsgdmFsaWUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh0aGlzLT5yZWQgPT0gZGlzcGxheS0+dHJhbnNwYXJlbnQucmVkKQotICAgICAgICAgICAgICAgdGhpcy0+YWxwaGFmID0gMDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHRoaXMtPmFscGhhZiA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aGlzLT5hbHBoYWYgPSAxOwotCi0gICAgICAgICB0aGlzLT5jb2xvdXJfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKHRoaXMtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikKLSAgICAgIHsKLSAgICAgICAgIGlmICh0aGlzLT5oYXZlX3RSTlMpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLT5oYXZlX3RSTlMgPSAwOwotCi0gICAgICAgICAgICAvKiBBZ2FpbiwgY2hlY2sgdGhlIGV4YWN0IGlucHV0IHZhbHVlcywgbm90IHRoZSBjdXJyZW50IHRyYW5zZm9ybWVkCi0gICAgICAgICAgICAgKiB2YWx1ZSEKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHRoaXMtPnJlZCA9PSBkaXNwbGF5LT50cmFuc3BhcmVudC5yZWQgJiYKLSAgICAgICAgICAgICAgIHRoaXMtPmdyZWVuID09IGRpc3BsYXktPnRyYW5zcGFyZW50LmdyZWVuICYmCi0gICAgICAgICAgICAgICB0aGlzLT5ibHVlID09IGRpc3BsYXktPnRyYW5zcGFyZW50LmJsdWUpCi0gICAgICAgICAgICAgICB0aGlzLT5hbHBoYWYgPSAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgdGhpcy0+YWxwaGFmID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRoaXMtPmFscGhhZiA9IDE7Ci0KLSAgICAgICAgIHRoaXMtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotICAgICAgfQotCi0gICAgICAvKiBUaGUgZXJyb3IgaW4gdGhlIGFscGhhIGlzIHplcm8gYW5kIHRoZSBzQklUIHZhbHVlIGNvbWVzIGZyb20gdGhlCi0gICAgICAgKiBvcmlnaW5hbCBzQklUIGRhdGEgKGFjdHVhbGx5IGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBvcmlnaW5hbCBiaXQgZGVwdGgpLgotICAgICAgICovCi0gICAgICB0aGlzLT5hbHBoYWUgPSAwOwotICAgICAgdGhpcy0+YWxwaGFfc0JJVCA9IGRpc3BsYXktPmFscGhhX3NCSVQ7Ci0gICB9Ci19Ci0jZW5kaWYgLyogdHJhbnNmb3JtcyB0aGF0IG5lZWQgaW1hZ2VfcGl4ZWxfYWRkX2FscGhhICovCi0KLXN0cnVjdCB0cmFuc2Zvcm1fZGlzcGxheTsKLXR5cGVkZWYgc3RydWN0IGltYWdlX3RyYW5zZm9ybQotewotICAgLyogVGhlIG5hbWUgb2YgdGhpcyB0cmFuc2Zvcm06IGEgc3RyaW5nLiAqLwotICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgLyogRWFjaCB0cmFuc2Zvcm0gY2FuIGJlIGRpc2FibGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZTogKi8KLSAgIGludCBlbmFibGU7Ci0KLSAgIC8qIFRoZSBnbG9iYWwgbGlzdCBvZiB0cmFuc2Zvcm1zOyByZWFkIG9ubHkuICovCi0gICBzdHJ1Y3QgaW1hZ2VfdHJhbnNmb3JtICpjb25zdCBsaXN0OwotCi0gICAvKiBUaGUgZ2xvYmFsIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyB0cmFuc2Zvcm0gaGFzIGJlZW4gc2V0IG9uIGFuCi0gICAgKiBpbWFnZS4KLSAgICAqLwotICAgdW5zaWduZWQgaW50IGdsb2JhbF91c2U7Ci0KLSAgIC8qIFRoZSBsb2NhbCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgdHJhbnNmb3JtIGhhcyBiZWVuIHNldC4gKi8KLSAgIHVuc2lnbmVkIGludCBsb2NhbF91c2U7Ci0KLSAgIC8qIFRoZSBuZXh0IHRyYW5zZm9ybSBpbiB0aGUgbGlzdCwgZWFjaCB0cmFuc2Zvcm0gbXVzdCBjYWxsIGl0cyBvd24gbmV4dAotICAgICogdHJhbnNmb3JtIGFmdGVyIGl0IGhhcyBwcm9jZXNzZWQgdGhlIHBpeGVsIHN1Y2Nlc3NmdWxseS4KLSAgICAqLwotICAgY29uc3Qgc3RydWN0IGltYWdlX3RyYW5zZm9ybSAqbmV4dDsKLQotICAgLyogQSBzaW5nbGUgdHJhbnNmb3JtIGZvciB0aGUgaW1hZ2UsIGV4cHJlc3NlZCBhcyBhIHNlcmllcyBvZiBmdW5jdGlvbgotICAgICogY2FsbGJhY2tzIGFuZCBzb21lIHNwYWNlIGZvciB2YWx1ZXMuCi0gICAgKgotICAgICogRmlyc3QgYSBjYWxsYmFjayB0byBhZGQgYW55IHJlcXVpcmVkIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHBuZ19tb2RpZmllcjsKLSAgICAqIHRoaXMgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIG1vZGlmaWVyIGlzIHNldCB1cCBmb3IgcmVhZC4KLSAgICAqLwotICAgdm9pZCAoKmluaSkoY29uc3Qgc3RydWN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICAgIHN0cnVjdCB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCk7Ci0KLSAgIC8qIEFuZCBhIGNhbGxiYWNrIHRvIHNldCB0aGUgdHJhbnNmb3JtIG9uIHRoZSBjdXJyZW50IHBuZ19yZWFkX3N0cnVjdDoKLSAgICAqLwotICAgdm9pZCAoKnNldCkoY29uc3Qgc3RydWN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICAgIHN0cnVjdCB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSk7Ci0KLSAgIC8qIFRoZW4gYSB0cmFuc2Zvcm0gdGhhdCB0YWtlcyBhbiBpbnB1dCBwaXhlbCBpbiBvbmUgUE5HIGZvcm1hdCBvciBhbm90aGVyCi0gICAgKiBhbmQgbW9kaWZpZXMgaXQgYnkgYSBwbmd2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhbnNmb3JtICh0aHVzCi0gICAgKiBkdXBsaWNhdGluZyB0aGUgbGlicG5nIGludGVudCB3aXRob3V0LCB3ZSBob3BlLCBkdXBsaWNhdGluZyB0aGUgYnVncwotICAgICogaW4gdGhlIGxpYnBuZyBpbXBsZW1lbnRhdGlvbiEpICBUaGUgcG5nX3N0cnVjdHAgaXMgc29sZWx5IHRvIGFsbG93IGVycm9yCi0gICAgKiByZXBvcnRpbmcgdmlhIHBuZ19lcnJvciBhbmQgcG5nX3dhcm5pbmcuCi0gICAgKi8KLSAgIHZvaWQgKCptb2QpKGNvbnN0IHN0cnVjdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsIGltYWdlX3BpeGVsICp0aGF0LAotICAgICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAsIGNvbnN0IHN0cnVjdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSk7Ci0KLSAgIC8qIEFkZCB0aGlzIHRyYW5zZm9ybSB0byB0aGUgbGlzdCBhbmQgcmV0dXJuIHRydWUgaWYgdGhlIHRyYW5zZm9ybSBpcwotICAgICogbWVhbmluZ2Z1bCBmb3IgdGhpcyBjb2xvdXIgdHlwZSBhbmQgYml0IGRlcHRoIC0gaWYgZmFsc2UgdGhlbiB0aGUKLSAgICAqIHRyYW5zZm9ybSBzaG91bGQgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIGltYWdlIHNvIHRoZXJlJ3Mgbm90IGEgbG90IG9mCi0gICAgKiBwb2ludCBydW5uaW5nIGl0LgotICAgICovCi0gICBpbnQgKCphZGQpKHN0cnVjdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgICBjb25zdCBzdHJ1Y3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsCi0gICAgICBwbmdfYnl0ZSBiaXRfZGVwdGgpOwotfSBpbWFnZV90cmFuc2Zvcm07Ci0KLXR5cGVkZWYgc3RydWN0IHRyYW5zZm9ybV9kaXNwbGF5Ci17Ci0gICBzdGFuZGFyZF9kaXNwbGF5IHRoaXM7Ci0KLSAgIC8qIFBhcmFtZXRlcnMgKi8KLSAgIHBuZ19tb2RpZmllciogICAgICAgICAgICAgIHBtOwotICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtKiB0cmFuc2Zvcm1fbGlzdDsKLSAgIHVuc2lnbmVkIGludCBtYXhfZ2FtbWFfODsKLQotICAgLyogTG9jYWwgdmFyaWFibGVzICovCi0gICBwbmdfYnl0ZSBvdXRwdXRfY29sb3VyX3R5cGU7Ci0gICBwbmdfYnl0ZSBvdXRwdXRfYml0X2RlcHRoOwotICAgcG5nX2J5dGUgdW5wYWNrZWQ7Ci0KLSAgIC8qIE1vZGlmaWNhdGlvbnMgKG5vdCBuZWNlc3NhcmlseSB1c2VkLikgKi8KLSAgIGdhbWFfbW9kaWZpY2F0aW9uIGdhbWFfbW9kOwotICAgY2hybV9tb2RpZmljYXRpb24gY2hybV9tb2Q7Ci0gICBzcmdiX21vZGlmaWNhdGlvbiBzcmdiX21vZDsKLX0gdHJhbnNmb3JtX2Rpc3BsYXk7Ci0KLS8qIFNldCBzUkdCLCBjSFJNIGFuZCBnQU1BIHRyYW5zZm9ybXMgYXMgcmVxdWlyZWQgYnkgdGhlIGN1cnJlbnQgZW5jb2RpbmcuICovCi1zdGF0aWMgdm9pZAotdHJhbnNmb3JtX3NldF9lbmNvZGluZyh0cmFuc2Zvcm1fZGlzcGxheSAqdGhpcykKLXsKLSAgIC8qIFNldCB1cCB0aGUgcG5nX21vZGlmaWVyICdfY3VycmVudCcgZmllbGRzIHRoZW4gdXNlIHRoZXNlIHRvIGRldGVybWluZSBob3cKLSAgICAqIHRvIGFkZCBhcHByb3ByaWF0ZSBjaHVua3MuCi0gICAgKi8KLSAgIHBuZ19tb2RpZmllciAqcG0gPSB0aGlzLT5wbTsKLQotICAgbW9kaWZpZXJfc2V0X2VuY29kaW5nKHBtKTsKLQotICAgaWYgKG1vZGlmaWVyX2NvbG9yX2VuY29kaW5nX2lzX3NldChwbSkpCi0gICB7Ci0gICAgICBpZiAobW9kaWZpZXJfY29sb3JfZW5jb2RpbmdfaXNfc1JHQihwbSkpCi0gICAgICAgICBzcmdiX21vZGlmaWNhdGlvbl9pbml0KCZ0aGlzLT5zcmdiX21vZCwgcG0sIFBOR19zUkdCX0lOVEVOVF9BQlNPTFVURSk7Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8qIFNldCBnQU1BIGFuZCBjSFJNIHNlcGFyYXRlbHkuICovCi0gICAgICAgICBnYW1hX21vZGlmaWNhdGlvbl9pbml0KCZ0aGlzLT5nYW1hX21vZCwgcG0sIHBtLT5jdXJyZW50X2dhbW1hKTsKLQotICAgICAgICAgaWYgKHBtLT5jdXJyZW50X2VuY29kaW5nICE9IDApCi0gICAgICAgICAgICBjaHJtX21vZGlmaWNhdGlvbl9pbml0KCZ0aGlzLT5jaHJtX21vZCwgcG0sIHBtLT5jdXJyZW50X2VuY29kaW5nKTsKLSAgICAgIH0KLSAgIH0KLX0KLQotLyogVGhyZWUgZnVuY3Rpb25zIHRvIGVuZCB0aGUgbGlzdDogKi8KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1faW5pX2VuZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCkKLXsKLSAgIFVOVVNFRCh0aGlzKQotICAgVU5VU0VEKHRoYXQpCi19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fc2V0X2VuZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIFVOVVNFRCh0aGlzKQotICAgVU5VU0VEKHRoYXQpCi0gICBVTlVTRUQocHApCi0gICBVTlVTRUQocGkpCi19Ci0KLS8qIEF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgcmVjYWxjdWxhdGUgdGhlIG91dHB1dCBpbWFnZSBwaXhlbCB2YWx1ZSBmcm9tIHRoZQotICogZG91YmxlIHByZWNpc2lvbiB2YWx1ZXMgc2V0IHVwIGJ5IHRoZSBwcmVjZWRpbmcgJ21vZCcgY2FsbHM6Ci0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNhbXBsZV9zY2FsZShkb3VibGUgc2FtcGxlX3ZhbHVlLCB1bnNpZ25lZCBpbnQgc2NhbGUpCi17Ci0gICBzYW1wbGVfdmFsdWUgPSBmbG9vcihzYW1wbGVfdmFsdWUgKiBzY2FsZSArIC41KTsKLQotICAgLyogUmV0dXJuIE5hTiBhcyAwOiAqLwotICAgaWYgKCEoc2FtcGxlX3ZhbHVlID4gMCkpCi0gICAgICBzYW1wbGVfdmFsdWUgPSAwOwotICAgZWxzZSBpZiAoc2FtcGxlX3ZhbHVlID4gc2NhbGUpCi0gICAgICBzYW1wbGVfdmFsdWUgPSBzY2FsZTsKLQotICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpc2FtcGxlX3ZhbHVlOwotfQotCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX21vZF9lbmQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLCBpbWFnZV9waXhlbCAqdGhhdCwKLSAgICBwbmdfY29uc3Rfc3RydWN0cCBwcCwgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICBjb25zdCB1bnNpZ25lZCBpbnQgc2NhbGUgPSAoMVU8PHRoYXQtPnNhbXBsZV9kZXB0aCktMTsKLSAgIGNvbnN0IGludCBzaWdfYml0cyA9IHRoYXQtPnNpZ19iaXRzOwotCi0gICBVTlVTRUQodGhpcykKLSAgIFVOVVNFRChwcCkKLSAgIFVOVVNFRChkaXNwbGF5KQotCi0gICAvKiBBdCB0aGUgZW5kIHJlY2FsY3VsYXRlIHRoZSBkaWdpdGl6ZWQgcmVkIGdyZWVuIGFuZCBibHVlIHZhbHVlcyBhY2NvcmRpbmcKLSAgICAqIHRvIHRoZSBjdXJyZW50IHNhbXBsZV9kZXB0aCBvZiB0aGUgcGl4ZWwuCi0gICAgKgotICAgICogVGhlIHNhbXBsZSB2YWx1ZSBpcyBzaW1wbHkgc2NhbGVkIHRvIHRoZSBtYXhpbXVtLCBjaGVja2luZyBmb3Igb3ZlcgotICAgICogYW5kIHVuZGVyZmxvdyAod2hpY2ggY2FuIGJvdGggaGFwcGVuIGZvciBzb21lIGltYWdlIHRyYW5zZm9ybXMsCi0gICAgKiBpbmNsdWRpbmcgc2ltcGxlIHNpemUgc2NhbGluZywgdGhvdWdoIGxpYnBuZyBkb2Vzbid0IGRvIHRoYXQgYXQgcHJlc2VudC4KLSAgICAqLwotICAgdGhhdC0+cmVkID0gc2FtcGxlX3NjYWxlKHRoYXQtPnJlZGYsIHNjYWxlKTsKLQotICAgLyogVGhpcyBpcyBhIGJpdCBib2d1czsgcmVhbGx5IHRoZSBhYm92ZSBjYWxjdWxhdGlvbiBzaG91bGQgdXNlIHRoZSByZWRfc0JJVAotICAgICogdmFsdWUsIG5vdCBzYW1wbGVfZGVwdGgsIGJ1dCBiZWNhdXNlIGxpYnBuZyBkb2VzIHBuZ19zZXRfc2hpZnQgYnkganVzdAotICAgICogc2hpZnRpbmcgdGhlIGJpdHMgd2UgZ2V0IGVycm9ycyBpZiB3ZSBkb24ndCBkbyBpdCB0aGUgc2FtZSB3YXkuCi0gICAgKi8KLSAgIGlmIChzaWdfYml0cyAmJiB0aGF0LT5yZWRfc0JJVCA8IHRoYXQtPnNhbXBsZV9kZXB0aCkKLSAgICAgIHRoYXQtPnJlZCA+Pj0gdGhhdC0+c2FtcGxlX2RlcHRoIC0gdGhhdC0+cmVkX3NCSVQ7Ci0KLSAgIC8qIFRoZSBlcnJvciB2YWx1ZSBpcyBpbmNyZWFzZWQsIGF0IHRoZSBlbmQsIGFjY29yZGluZyB0byB0aGUgbG93ZXN0IHNCSVQKLSAgICAqIHZhbHVlIHNlZW4uICBDb21tb24gc2Vuc2UgdGVsbHMgdXMgdGhhdCB0aGUgaW50ZXJtZWRpYXRlIGludGVnZXIKLSAgICAqIHJlcHJlc2VudGF0aW9ucyBhcmUgbm8gbW9yZSBhY2N1cmF0ZSB0aGFuICsvLSAwLjUgaW4gdGhlIGludGVncmFsIHZhbHVlcywKLSAgICAqIHRoZSBzQklUIGFsbG93cyB0aGUgaW1wbGVtZW50YXRpb24gdG8gYmUgd29yc2UgdGhhbiB0aGlzLiAgSW4gYWRkaXRpb24gdGhlCi0gICAgKiBQTkcgc3BlY2lmaWNhdGlvbiBhY3R1YWxseSBwZXJtaXRzIGFueSBlcnJvciB3aXRoaW4gdGhlIHJhbmdlICgtMS4uKzEpLAotICAgICogYnV0IHRoYXQgaXMgaWdub3JlZCBoZXJlLiAgSW5zdGVhZCB0aGUgZmluYWwgZGlnaXRpemVkIHZhbHVlIGlzIGNvbXBhcmVkLAotICAgICogYmVsb3cgdG8gdGhlIGRpZ2l0aXplZCB2YWx1ZSBvZiB0aGUgZXJyb3IgbGltaXRzIC0gdGhpcyBoYXMgdGhlIG5ldCBlZmZlY3QKLSAgICAqIG9mIGFsbG93aW5nIChhbG1vc3QpICsvLTEgaW4gdGhlIG91dHB1dCB2YWx1ZS4gIEl0J3MgZGlmZmljdWx0IHRvIHNlZSBob3cKLSAgICAqIGFueSBhbGdvcml0aG0gdGhhdCBkaWdpdGl6ZXMgaW50ZXJtZWRpYXRlIHJlc3VsdHMgY2FuIGJlIG1vcmUgYWNjdXJhdGUuCi0gICAgKi8KLSAgIHRoYXQtPnJlZGUgKz0gMS4vKDIqKCgxVTw8dGhhdC0+cmVkX3NCSVQpLTEpKTsKLQotICAgaWYgKHRoYXQtPmNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICB7Ci0gICAgICB0aGF0LT5ncmVlbiA9IHNhbXBsZV9zY2FsZSh0aGF0LT5ncmVlbmYsIHNjYWxlKTsKLSAgICAgIGlmIChzaWdfYml0cyAmJiB0aGF0LT5ncmVlbl9zQklUIDwgdGhhdC0+c2FtcGxlX2RlcHRoKQotICAgICAgICAgdGhhdC0+Z3JlZW4gPj49IHRoYXQtPnNhbXBsZV9kZXB0aCAtIHRoYXQtPmdyZWVuX3NCSVQ7Ci0KLSAgICAgIHRoYXQtPmJsdWUgPSBzYW1wbGVfc2NhbGUodGhhdC0+Ymx1ZWYsIHNjYWxlKTsKLSAgICAgIGlmIChzaWdfYml0cyAmJiB0aGF0LT5ibHVlX3NCSVQgPCB0aGF0LT5zYW1wbGVfZGVwdGgpCi0gICAgICAgICB0aGF0LT5ibHVlID4+PSB0aGF0LT5zYW1wbGVfZGVwdGggLSB0aGF0LT5ibHVlX3NCSVQ7Ci0KLSAgICAgIHRoYXQtPmdyZWVuZSArPSAxLi8oMiooKDFVPDx0aGF0LT5ncmVlbl9zQklUKS0xKSk7Ci0gICAgICB0aGF0LT5ibHVlZSArPSAxLi8oMiooKDFVPDx0aGF0LT5ibHVlX3NCSVQpLTEpKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHRoYXQtPmJsdWUgPSB0aGF0LT5ncmVlbiA9IHRoYXQtPnJlZDsKLSAgICAgIHRoYXQtPmJsdWVmID0gdGhhdC0+Z3JlZW5mID0gdGhhdC0+cmVkZjsKLSAgICAgIHRoYXQtPmJsdWVlID0gdGhhdC0+Z3JlZW5lID0gdGhhdC0+cmVkZTsKLSAgIH0KLQotICAgaWYgKCh0aGF0LT5jb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSB8fAotICAgICAgdGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgIHsKLSAgICAgIHRoYXQtPmFscGhhID0gc2FtcGxlX3NjYWxlKHRoYXQtPmFscGhhZiwgc2NhbGUpOwotICAgICAgdGhhdC0+YWxwaGFlICs9IDEuLygyKigoMVU8PHRoYXQtPmFscGhhX3NCSVQpLTEpKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHRoYXQtPmFscGhhID0gc2NhbGU7IC8qIG9wYXF1ZSAqLwotICAgICAgdGhhdC0+YWxwaGFmID0gMTsgICAgLyogT3ZlcnJpZGUgdGhpcy4gKi8KLSAgICAgIHRoYXQtPmFscGhhZSA9IDA7ICAgIC8qIEl0J3MgZXhhY3QgOy0pICovCi0gICB9Ci0KLSAgIGlmIChzaWdfYml0cyAmJiB0aGF0LT5hbHBoYV9zQklUIDwgdGhhdC0+c2FtcGxlX2RlcHRoKQotICAgICAgdGhhdC0+YWxwaGEgPj49IHRoYXQtPnNhbXBsZV9kZXB0aCAtIHRoYXQtPmFscGhhX3NCSVQ7Ci19Ci0KLS8qIFN0YXRpYyAnZW5kJyBzdHJ1Y3R1cmU6ICovCi1zdGF0aWMgaW1hZ2VfdHJhbnNmb3JtIGltYWdlX3RyYW5zZm9ybV9lbmQgPQotewotICAgIihlbmQpIiwgLyogbmFtZSAqLwotICAgMSwgLyogZW5hYmxlICovCi0gICAwLCAvKiBsaXN0ICovCi0gICAwLCAvKiBnbG9iYWxfdXNlICovCi0gICAwLCAvKiBsb2NhbF91c2UgKi8KLSAgIDAsIC8qIG5leHQgKi8KLSAgIGltYWdlX3RyYW5zZm9ybV9pbmlfZW5kLAotICAgaW1hZ2VfdHJhbnNmb3JtX3NldF9lbmQsCi0gICBpbWFnZV90cmFuc2Zvcm1fbW9kX2VuZCwKLSAgIDAgLyogbmV2ZXIgY2FsbGVkLCBJIHdhbnQgaXQgdG8gY3Jhc2ggaWYgaXQgaXMhICovCi19OwotCi0vKiBSZWFkZXIgY2FsbGJhY2tzIGFuZCBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIHRoZXkgZGlmZmVyIGZyb20gdGhlIHN0YW5kYXJkCi0gKiBvbmVzLgotICovCi1zdGF0aWMgdm9pZAotdHJhbnNmb3JtX2Rpc3BsYXlfaW5pdCh0cmFuc2Zvcm1fZGlzcGxheSAqZHAsIHBuZ19tb2RpZmllciAqcG0sIHBuZ191aW50XzMyIGlkLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdHJhbnNmb3JtX2xpc3QpCi17Ci0gICBtZW1zZXQoZHAsIDAsIHNpemVvZiAqZHApOwotCi0gICAvKiBTdGFuZGFyZCBmaWVsZHMgKi8KLSAgIHN0YW5kYXJkX2Rpc3BsYXlfaW5pdCgmZHAtPnRoaXMsICZwbS0+dGhpcywgaWQsIGRvX3JlYWRfaW50ZXJsYWNlLAotICAgICAgcG0tPnVzZV91cGRhdGVfaW5mbyk7Ci0KLSAgIC8qIFBhcmFtZXRlciBmaWVsZHMgKi8KLSAgIGRwLT5wbSA9IHBtOwotICAgZHAtPnRyYW5zZm9ybV9saXN0ID0gdHJhbnNmb3JtX2xpc3Q7Ci0gICBkcC0+bWF4X2dhbW1hXzggPSAxNjsKLQotICAgLyogTG9jYWwgdmFyaWFibGUgZmllbGRzICovCi0gICBkcC0+b3V0cHV0X2NvbG91cl90eXBlID0gMjU1OyAvKiBpbnZhbGlkICovCi0gICBkcC0+b3V0cHV0X2JpdF9kZXB0aCA9IDI1NTsgIC8qIGludmFsaWQgKi8KLSAgIGRwLT51bnBhY2tlZCA9IDA7IC8qIG5vdCB1bnBhY2tlZCAqLwotfQotCi1zdGF0aWMgdm9pZAotdHJhbnNmb3JtX2luZm9faW1wKHRyYW5zZm9ybV9kaXNwbGF5ICpkcCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIC8qIFJldXNlIHRoZSBzdGFuZGFyZCBzdHVmZiBhcyBhcHByb3ByaWF0ZS4gKi8KLSAgIHN0YW5kYXJkX2luZm9fcGFydDEoJmRwLT50aGlzLCBwcCwgcGkpOwotCi0gICAvKiBOb3cgc2V0IHRoZSBsaXN0IG9mIHRyYW5zZm9ybXMuICovCi0gICBkcC0+dHJhbnNmb3JtX2xpc3QtPnNldChkcC0+dHJhbnNmb3JtX2xpc3QsIGRwLCBwcCwgcGkpOwotCi0gICAvKiBVcGRhdGUgdGhlIGluZm8gc3RydWN0dXJlIGZvciB0aGVzZSB0cmFuc2Zvcm1zOiAqLwotICAgewotICAgICAgaW50IGkgPSBkcC0+dGhpcy51c2VfdXBkYXRlX2luZm87Ci0gICAgICAvKiBBbHdheXMgZG8gb25lIGNhbGwsIGV2ZW4gaWYgdXNlX3VwZGF0ZV9pbmZvIGlzIDAuICovCi0gICAgICBkbwotICAgICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocHAsIHBpKTsKLSAgICAgIHdoaWxlICgtLWkgPiAwKTsKLSAgIH0KLQotICAgLyogQW5kIGdldCB0aGUgb3V0cHV0IGluZm9ybWF0aW9uIGludG8gdGhlIHN0YW5kYXJkX2Rpc3BsYXkgKi8KLSAgIHN0YW5kYXJkX2luZm9fcGFydDIoJmRwLT50aGlzLCBwcCwgcGksIDEvKmltYWdlcyovKTsKLQotICAgLyogUGx1cyB0aGUgZXh0cmEgc3R1ZmYgd2UgbmVlZCBmb3IgdGhlIHRyYW5zZm9ybSB0ZXN0czogKi8KLSAgIGRwLT5vdXRwdXRfY29sb3VyX3R5cGUgPSBwbmdfZ2V0X2NvbG9yX3R5cGUocHAsIHBpKTsKLSAgIGRwLT5vdXRwdXRfYml0X2RlcHRoID0gcG5nX2dldF9iaXRfZGVwdGgocHAsIHBpKTsKLQotICAgLyogSWYgcG5nX3NldF9maWxsZXIgaXMgaW4gYWN0aW9uIHRoZW4gZmFrZSB0aGUgb3V0cHV0IGNvbG9yIHR5cGUgdG8gaW5jbHVkZQotICAgICogYW4gYWxwaGEgY2hhbm5lbCB3aGVyZSBhcHByb3ByaWF0ZS4KLSAgICAqLwotICAgaWYgKGRwLT5vdXRwdXRfYml0X2RlcHRoID49IDggJiYKLSAgICAgICAoZHAtPm91dHB1dF9jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgZHAtPm91dHB1dF9jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKSAmJiBkcC0+dGhpcy5maWxsZXIpCi0gICAgICAgZHAtPm91dHB1dF9jb2xvdXJfdHlwZSB8PSA0OwotCi0gICAvKiBWYWxpZGF0ZSB0aGUgY29tYmluYXRpb24gb2YgY29sb3VyIHR5cGUgYW5kIGJpdCBkZXB0aCB0aGF0IHdlIGFyZSBnZXR0aW5nCi0gICAgKiBvdXQgb2YgbGlicG5nOyB0aGUgc2VtYW50aWNzIG9mIHNvbWV0aGluZyBub3QgaW4gdGhlIFBORyBzcGVjIGFyZSwgYXQKLSAgICAqIGJlc3QsIHVuY2xlYXIuCi0gICAgKi8KLSAgIHN3aXRjaCAoZHAtPm91dHB1dF9jb2xvdXJfdHlwZSkKLSAgIHsKLSAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKLSAgICAgIGlmIChkcC0+b3V0cHV0X2JpdF9kZXB0aCA+IDgpIGdvdG8gZXJyb3I7Ci0gICAgICAvKkZBTEwgVEhST1VHSCovCi0gICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6Ci0gICAgICBpZiAoZHAtPm91dHB1dF9iaXRfZGVwdGggPT0gMSB8fCBkcC0+b3V0cHV0X2JpdF9kZXB0aCA9PSAyIHx8Ci0gICAgICAgICBkcC0+b3V0cHV0X2JpdF9kZXB0aCA9PSA0KQotICAgICAgICAgYnJlYWs7Ci0gICAgICAvKkZBTEwgVEhST1VHSCovCi0gICBkZWZhdWx0OgotICAgICAgaWYgKGRwLT5vdXRwdXRfYml0X2RlcHRoID09IDggfHwgZHAtPm91dHB1dF9iaXRfZGVwdGggPT0gMTYpCi0gICAgICAgICBicmVhazsKLSAgICAgIC8qRkFMTCBUSFJPVUdIKi8KLSAgIGVycm9yOgotICAgICAgewotICAgICAgICAgY2hhciBtZXNzYWdlWzEyOF07Ci0gICAgICAgICBzaXplX3QgcG9zOwotCi0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCAwLAotICAgICAgICAgICAgImludmFsaWQgZmluYWwgYml0IGRlcHRoOiBjb2xvdXIgdHlwZSgiKTsKLSAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIGRwLT5vdXRwdXRfY29sb3VyX3R5cGUpOwotICAgICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiKSB3aXRoIGJpdCBkZXB0aDogIik7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBkcC0+b3V0cHV0X2JpdF9kZXB0aCk7Ci0KLSAgICAgICAgIHBuZ19lcnJvcihwcCwgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIFVzZSBhIHRlc3QgcGl4ZWwgdG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGFncmVlcyB3aXRoIHdoYXQgd2UgZXhwZWN0IC0KLSAgICAqIHRoaXMgYXZvaWRzIHJ1bm5pbmcgdGhlIHdob2xlIHRlc3QgaWYgdGhlIG91dHB1dCBpcyB1bmV4cGVjdGVkLiAgVGhpcyBhbHNvCi0gICAgKiBjaGVja3MgZm9yIGludGVybmFsIGVycm9ycy4KLSAgICAqLwotICAgewotICAgICAgaW1hZ2VfcGl4ZWwgdGVzdF9waXhlbDsKLQotICAgICAgbWVtc2V0KCZ0ZXN0X3BpeGVsLCAwLCBzaXplb2YgdGVzdF9waXhlbCk7Ci0gICAgICB0ZXN0X3BpeGVsLmNvbG91cl90eXBlID0gZHAtPnRoaXMuY29sb3VyX3R5cGU7IC8qIGlucHV0ICovCi0gICAgICB0ZXN0X3BpeGVsLmJpdF9kZXB0aCA9IGRwLT50aGlzLmJpdF9kZXB0aDsKLSAgICAgIGlmICh0ZXN0X3BpeGVsLmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgICB0ZXN0X3BpeGVsLnNhbXBsZV9kZXB0aCA9IDg7Ci0gICAgICBlbHNlCi0gICAgICAgICB0ZXN0X3BpeGVsLnNhbXBsZV9kZXB0aCA9IHRlc3RfcGl4ZWwuYml0X2RlcHRoOwotICAgICAgLyogRG9uJ3QgbmVlZCBzQklUIGhlcmUsIGJ1dCBpdCBtdXN0IGJlIHNldCB0byBub24temVybyB0byBhdm9pZAotICAgICAgICogYXJpdGhtZXRpYyBvdmVyZmxvd3MuCi0gICAgICAgKi8KLSAgICAgIHRlc3RfcGl4ZWwuaGF2ZV90Uk5TID0gZHAtPnRoaXMuaXNfdHJhbnNwYXJlbnQgIT0gMDsKLSAgICAgIHRlc3RfcGl4ZWwucmVkX3NCSVQgPSB0ZXN0X3BpeGVsLmdyZWVuX3NCSVQgPSB0ZXN0X3BpeGVsLmJsdWVfc0JJVCA9Ci0gICAgICAgICB0ZXN0X3BpeGVsLmFscGhhX3NCSVQgPSB0ZXN0X3BpeGVsLnNhbXBsZV9kZXB0aDsKLQotICAgICAgZHAtPnRyYW5zZm9ybV9saXN0LT5tb2QoZHAtPnRyYW5zZm9ybV9saXN0LCAmdGVzdF9waXhlbCwgcHAsIGRwKTsKLQotICAgICAgaWYgKHRlc3RfcGl4ZWwuY29sb3VyX3R5cGUgIT0gZHAtPm91dHB1dF9jb2xvdXJfdHlwZSkKLSAgICAgIHsKLSAgICAgICAgIGNoYXIgbWVzc2FnZVsxMjhdOwotICAgICAgICAgc2l6ZV90IHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIDAsICJjb2xvdXIgdHlwZSAiKTsKLQotICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgZHAtPm91dHB1dF9jb2xvdXJfdHlwZSk7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIgZXhwZWN0ZWQgIik7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCB0ZXN0X3BpeGVsLmNvbG91cl90eXBlKTsKLQotICAgICAgICAgcG5nX2Vycm9yKHBwLCBtZXNzYWdlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHRlc3RfcGl4ZWwuYml0X2RlcHRoICE9IGRwLT5vdXRwdXRfYml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgY2hhciBtZXNzYWdlWzEyOF07Ci0gICAgICAgICBzaXplX3QgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgMCwgImJpdCBkZXB0aCAiKTsKLQotICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgZHAtPm91dHB1dF9iaXRfZGVwdGgpOwotICAgICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiIGV4cGVjdGVkICIpOwotICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgdGVzdF9waXhlbC5iaXRfZGVwdGgpOwotCi0gICAgICAgICBwbmdfZXJyb3IocHAsIG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgICAvKiBJZiBib3RoIGJpdCBkZXB0aCBhbmQgY29sb3VyIHR5cGUgYXJlIGNvcnJlY3QgY2hlY2sgdGhlIHNhbXBsZSBkZXB0aC4KLSAgICAgICAqLwotICAgICAgaWYgKHRlc3RfcGl4ZWwuY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgotICAgICAgICAgIHRlc3RfcGl4ZWwuc2FtcGxlX2RlcHRoICE9IDgpIC8qIG9vcHMgLSBpbnRlcm5hbCBlcnJvciEgKi8KLSAgICAgICAgIHBuZ19lcnJvcihwcCwgInBuZ3ZhbGlkOiBpbnRlcm5hbDogcGFsZXR0ZSBzYW1wbGUgZGVwdGggbm90IDgiKTsKLSAgICAgIGVsc2UgaWYgKGRwLT51bnBhY2tlZCAmJiB0ZXN0X3BpeGVsLmJpdF9kZXB0aCAhPSA4KQotICAgICAgICAgcG5nX2Vycm9yKHBwLCAicG5ndmFsaWQ6IGludGVybmFsOiBiYWQgdW5wYWNrZWQgcGl4ZWwgZGVwdGgiKTsKLSAgICAgIGVsc2UgaWYgKCFkcC0+dW5wYWNrZWQgJiYgdGVzdF9waXhlbC5jb2xvdXJfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFCi0gICAgICAgICAgICAgICYmIHRlc3RfcGl4ZWwuYml0X2RlcHRoICE9IHRlc3RfcGl4ZWwuc2FtcGxlX2RlcHRoKQotICAgICAgewotICAgICAgICAgY2hhciBtZXNzYWdlWzEyOF07Ci0gICAgICAgICBzaXplX3QgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgMCwKLSAgICAgICAgICAgICJpbnRlcm5hbDogc2FtcGxlIGRlcHRoICIpOwotCi0gICAgICAgICAvKiBCZWNhdXNlIHVubGVzcyBzb21ldGhpbmcgaGFzIHNldCAndW5wYWNrZWQnIG9yIHRoZSBpbWFnZSBpcyBwYWxldHRlCi0gICAgICAgICAgKiBtYXBwZWQgd2UgZXhwZWN0IHRoZSB0cmFuc2Zvcm0gdG8ga2VlcCBzYW1wbGUgZGVwdGggYW5kIGJpdCBkZXB0aAotICAgICAgICAgICogdGhlIHNhbWUuCi0gICAgICAgICAgKi8KLSAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIHRlc3RfcGl4ZWwuc2FtcGxlX2RlcHRoKTsKLSAgICAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiBleHBlY3RlZCAiKTsKLSAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIHRlc3RfcGl4ZWwuYml0X2RlcHRoKTsKLQotICAgICAgICAgcG5nX2Vycm9yKHBwLCBtZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRlc3RfcGl4ZWwuYml0X2RlcHRoICE9IGRwLT5vdXRwdXRfYml0X2RlcHRoKQotICAgICAgewotICAgICAgICAgLyogVGhpcyBjb3VsZCBiZSBhIGxpYnBuZyBlcnJvciB0b287IGxpYnBuZyBoYXMgbm90IHByb2R1Y2VkIHdoYXQgd2UKLSAgICAgICAgICAqIGV4cGVjdCBmb3IgdGhlIG91dHB1dCBiaXQgZGVwdGguCi0gICAgICAgICAgKi8KLSAgICAgICAgIGNoYXIgbWVzc2FnZVsxMjhdOwotICAgICAgICAgc2l6ZV90IHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIDAsCi0gICAgICAgICAgICAiaW50ZXJuYWw6IGJpdCBkZXB0aCAiKTsKLQotICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgZHAtPm91dHB1dF9iaXRfZGVwdGgpOwotICAgICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiIGV4cGVjdGVkICIpOwotICAgICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgdGVzdF9waXhlbC5iaXRfZGVwdGgpOwotCi0gICAgICAgICBwbmdfZXJyb3IocHAsIG1lc3NhZ2UpOwotICAgICAgfQotICAgfQotfQotCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotdHJhbnNmb3JtX2luZm8ocG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHRyYW5zZm9ybV9pbmZvX2ltcCh2b2lkY2FzdCh0cmFuc2Zvcm1fZGlzcGxheSosIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBwKSksCi0gICAgICBwcCwgcGkpOwotfQotCi1zdGF0aWMgdm9pZAotdHJhbnNmb3JtX3JhbmdlX2NoZWNrKHBuZ19jb25zdF9zdHJ1Y3RwIHBwLCB1bnNpZ25lZCBpbnQgciwgdW5zaWduZWQgaW50IGcsCi0gICB1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBpbl9kaWdpdGl6ZWQsIGRvdWJsZSBpbiwKLSAgIHVuc2lnbmVkIGludCBvdXQsIHBuZ19ieXRlIHNhbXBsZV9kZXB0aCwgZG91YmxlIGVyciwgZG91YmxlIGxpbWl0LAotICAgY29uc3QgY2hhciAqbmFtZSwgZG91YmxlIGRpZ2l0aXphdGlvbl9lcnJvcikKLXsKLSAgIC8qIENvbXBhcmUgdGhlIHNjYWxlZCwgZGlnaXR6ZWQsIHZhbHVlcyBvZiBvdXIgbG9jYWwgY2FsY3VsYXRpb24gKGluKy1lcnIpCi0gICAgKiB3aXRoIHRoZSBkaWdpdGl6ZWQgdmFsdWVzIGxpYnBuZyBwcm9kdWNlZDsgICdzYW1wbGVfZGVwdGgnIGlzIHRoZSBhY3R1YWwKLSAgICAqIGRpZ2l0aXphdGlvbiBkZXB0aCBvZiB0aGUgbGlicG5nIG91dHB1dCBjb2xvcnMgKHRoZSBiaXQgZGVwdGggZXhjZXB0IGZvcgotICAgICogcGFsZXR0ZSBpbWFnZXMgd2hlcmUgaXQgaXMgYWx3YXlzIDguKSAgVGhlIGNoZWNrIG9uICdlcnInIGlzIHRvIGRldGVjdAotICAgICogaW50ZXJuYWwgZXJyb3JzIGluIHBuZ3ZhbGlkIGl0c2VsZi4KLSAgICAqLwotICAgdW5zaWduZWQgaW50IG1heCA9ICgxVTw8c2FtcGxlX2RlcHRoKS0xOwotICAgZG91YmxlIGluX21pbiA9IGNlaWwoKGluLWVycikqbWF4IC0gZGlnaXRpemF0aW9uX2Vycm9yKTsKLSAgIGRvdWJsZSBpbl9tYXggPSBmbG9vcigoaW4rZXJyKSptYXggKyBkaWdpdGl6YXRpb25fZXJyb3IpOwotICAgaWYgKGRlYnVnb25seShlcnIgPiBsaW1pdCB8fCkgIShvdXQgPj0gaW5fbWluICYmIG91dCA8PSBpbl9tYXgpKQotICAgewotICAgICAgY2hhciBtZXNzYWdlWzI1Nl07Ci0gICAgICBzaXplX3QgcG9zOwotCi0gICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCAwLCBuYW1lKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiBvdXRwdXQgdmFsdWUgZXJyb3I6IHJnYmEoIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCByKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiwiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRuKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIGcpOwotICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiLCIpOwotICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgYik7Ci0gICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIsIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBhKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIik6ICIpOwotICAgICAgcG9zID0gc2FmZWNhdG4obWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgb3V0KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIiBleHBlY3RlZDogIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0bihtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCBpbl9kaWdpdGl6ZWQpOwotICAgICAgcG9zID0gc2FmZWNhdChtZXNzYWdlLCBzaXplb2YgbWVzc2FnZSwgcG9zLCAiICgiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRkKG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsIChpbi1lcnIpKm1heCwgMyk7Ci0gICAgICBwb3MgPSBzYWZlY2F0KG1lc3NhZ2UsIHNpemVvZiBtZXNzYWdlLCBwb3MsICIuLiIpOwotICAgICAgcG9zID0gc2FmZWNhdGQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgKGluK2VycikqbWF4LCAzKTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobWVzc2FnZSwgc2l6ZW9mIG1lc3NhZ2UsIHBvcywgIikiKTsKLQotICAgICAgcG5nX2Vycm9yKHBwLCBtZXNzYWdlKTsKLSAgIH0KLQotICAgVU5VU0VEKGxpbWl0KQotfQotCi1zdGF0aWMgdm9pZAotdHJhbnNmb3JtX2ltYWdlX3ZhbGlkYXRlKHRyYW5zZm9ybV9kaXNwbGF5ICpkcCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICBwbmdfaW5mb3AgcGkpCi17Ci0gICAvKiBDb25zdGFudHMgZm9yIHRoZSBsb29wIGJlbG93OiAqLwotICAgY29uc3QgcG5nX3N0b3JlKiBjb25zdCBwcyA9IGRwLT50aGlzLnBzOwotICAgY29uc3QgcG5nX2J5dGUgaW5fY3QgPSBkcC0+dGhpcy5jb2xvdXJfdHlwZTsKLSAgIGNvbnN0IHBuZ19ieXRlIGluX2JkID0gZHAtPnRoaXMuYml0X2RlcHRoOwotICAgY29uc3QgcG5nX3VpbnRfMzIgdyA9IGRwLT50aGlzLnc7Ci0gICBjb25zdCBwbmdfdWludF8zMiBoID0gZHAtPnRoaXMuaDsKLSAgIGNvbnN0IHBuZ19ieXRlIG91dF9jdCA9IGRwLT5vdXRwdXRfY29sb3VyX3R5cGU7Ci0gICBjb25zdCBwbmdfYnl0ZSBvdXRfYmQgPSBkcC0+b3V0cHV0X2JpdF9kZXB0aDsKLSAgIGNvbnN0IHBuZ19ieXRlIHNhbXBsZV9kZXB0aCA9IChwbmdfYnl0ZSkob3V0X2N0ID09Ci0gICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFID8gOCA6IG91dF9iZCk7Ci0gICBjb25zdCBwbmdfYnl0ZSByZWRfc0JJVCA9IGRwLT50aGlzLnJlZF9zQklUOwotICAgY29uc3QgcG5nX2J5dGUgZ3JlZW5fc0JJVCA9IGRwLT50aGlzLmdyZWVuX3NCSVQ7Ci0gICBjb25zdCBwbmdfYnl0ZSBibHVlX3NCSVQgPSBkcC0+dGhpcy5ibHVlX3NCSVQ7Ci0gICBjb25zdCBwbmdfYnl0ZSBhbHBoYV9zQklUID0gZHAtPnRoaXMuYWxwaGFfc0JJVDsKLSAgIGNvbnN0IGludCBoYXZlX3RSTlMgPSBkcC0+dGhpcy5pc190cmFuc3BhcmVudDsKLSAgIGRvdWJsZSBkaWdpdGl6YXRpb25fZXJyb3I7Ci0KLSAgIHN0b3JlX3BhbGV0dGUgb3V0X3BhbGV0dGU7Ci0gICBwbmdfdWludF8zMiB5OwotCi0gICBVTlVTRUQocGkpCi0KLSAgIC8qIENoZWNrIGZvciByb3cgb3ZlcndyaXRlIGVycm9ycyAqLwotICAgc3RvcmVfaW1hZ2VfY2hlY2soZHAtPnRoaXMucHMsIHBwLCAwKTsKLQotICAgLyogUmVhZCB0aGUgcGFsZXR0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQgaWYgdGhlIG91dHB1dCBjb2xvdXIgdHlwZQotICAgICogaW5kaWNhdGVzIGEgcGFsZXR0ZSwgb3RoZXdpc2Ugc2V0IG91dF9wYWxldHRlIHRvIGdhcmJhZ2UuCi0gICAgKi8KLSAgIGlmIChvdXRfY3QgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgIHsKLSAgICAgIC8qIFZhbGlkYXRlIHRoYXQgdGhlIHBhbGV0dGUgY291bnQgaXRzZWxmIGhhcyBub3QgY2hhbmdlZCAtIHRoaXMgaXMgbm90Ci0gICAgICAgKiBleHBlY3RlZC4KLSAgICAgICAqLwotICAgICAgaW50IG5wYWxldHRlID0gKC0xKTsKLQotICAgICAgKHZvaWQpcmVhZF9wYWxldHRlKG91dF9wYWxldHRlLCAmbnBhbGV0dGUsIHBwLCBwaSk7Ci0gICAgICBpZiAobnBhbGV0dGUgIT0gZHAtPnRoaXMubnBhbGV0dGUpCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJ1bmV4cGVjdGVkIGNoYW5nZSBpbiBwYWxldHRlIHNpemUiKTsKLQotICAgICAgZGlnaXRpemF0aW9uX2Vycm9yID0gLjU7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBpbl9zYW1wbGVfZGVwdGg7Ci0KLSAgICAgIG1lbXNldChvdXRfcGFsZXR0ZSwgMHg1ZSwgc2l6ZW9mIG91dF9wYWxldHRlKTsKLQotICAgICAgLyogdXNlLWlucHV0LXByZWNpc2lvbiBtZWFucyBhc3N1bWUgdGhhdCBpZiB0aGUgaW5wdXQgaGFzIDggYml0IChvciBsZXNzKQotICAgICAgICogc2FtcGxlcyBhbmQgdGhlIG91dHB1dCBoYXMgMTYgYml0IHNhbXBsZXMgdGhlIGNhbGN1bGF0aW9ucyB3aWxsIGJlIGRvbmUKLSAgICAgICAqIHdpdGggOCBiaXQgcHJlY2lzaW9uLCBub3QgMTYuCi0gICAgICAgKi8KLSAgICAgIGlmIChpbl9jdCA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFIHx8IGluX2JkIDwgMTYpCi0gICAgICAgICBpbl9zYW1wbGVfZGVwdGggPSA4OwotICAgICAgZWxzZQotICAgICAgICAgaW5fc2FtcGxlX2RlcHRoID0gaW5fYmQ7Ci0KLSAgICAgIGlmIChzYW1wbGVfZGVwdGggIT0gMTYgfHwgaW5fc2FtcGxlX2RlcHRoID4gOCB8fAotICAgICAgICAgIWRwLT5wbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24pCi0gICAgICAgICBkaWdpdGl6YXRpb25fZXJyb3IgPSAuNTsKLQotICAgICAgLyogRWxzZSBjYWxjdWxhdGlvbnMgYXJlIGF0IDggYml0IHByZWNpc2lvbiwgYW5kIHRoZSBvdXRwdXQgYWN0dWFsbHkKLSAgICAgICAqIGNvbnNpc3RzIG9mIHNjYWxlZCA4LWJpdCB2YWx1ZXMsIHNvIHNjYWxlIC41IGluIDggYml0cyB0byB0aGUgMTYgYml0czoKLSAgICAgICAqLwotICAgICAgZWxzZQotICAgICAgICAgZGlnaXRpemF0aW9uX2Vycm9yID0gLjUgKiAyNTc7Ci0gICB9Ci0KLSAgIGZvciAoeT0wOyB5PGg7ICsreSkKLSAgIHsKLSAgICAgIHBuZ19jb25zdF9ieXRlcCBjb25zdCBwUm93ID0gc3RvcmVfaW1hZ2Vfcm93KHBzLCBwcCwgMCwgeSk7Ci0gICAgICBwbmdfdWludF8zMiB4OwotCi0gICAgICAvKiBUaGUgb3JpZ2luYWwsIHN0YW5kYXJkLCByb3cgcHJlLXRyYW5zZm9ybXMuICovCi0gICAgICBwbmdfYnl0ZSBzdGRbU1RBTkRBUkRfUk9XTUFYXTsKLQotICAgICAgdHJhbnNmb3JtX3JvdyhwcCwgc3RkLCBpbl9jdCwgaW5fYmQsIHkpOwotCi0gICAgICAvKiBHbyB0aHJvdWdoIGVhY2ggb3JpZ2luYWwgcGl4ZWwgdHJhbnNmb3JtaW5nIGl0IGFuZCBjb21wYXJpbmcgd2l0aCB3aGF0Ci0gICAgICAgKiBsaWJwbmcgZGlkIHRvIHRoZSBzYW1lIHBpeGVsLgotICAgICAgICovCi0gICAgICBmb3IgKHg9MDsgeDx3OyArK3gpCi0gICAgICB7Ci0gICAgICAgICBpbWFnZV9waXhlbCBpbl9waXhlbCwgb3V0X3BpeGVsOwotICAgICAgICAgdW5zaWduZWQgaW50IHIsIGcsIGIsIGE7Ci0KLSAgICAgICAgIC8qIEZpbmQgb3V0IHdoYXQgd2UgdGhpbmsgdGhlIHBpeGVsIHNob3VsZCBiZTogKi8KLSAgICAgICAgIGltYWdlX3BpeGVsX2luaXQoJmluX3BpeGVsLCBzdGQsIGluX2N0LCBpbl9iZCwgeCwgZHAtPnRoaXMucGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICAgICAgIGluX3BpeGVsLnJlZF9zQklUID0gcmVkX3NCSVQ7Ci0gICAgICAgICBpbl9waXhlbC5ncmVlbl9zQklUID0gZ3JlZW5fc0JJVDsKLSAgICAgICAgIGluX3BpeGVsLmJsdWVfc0JJVCA9IGJsdWVfc0JJVDsKLSAgICAgICAgIGluX3BpeGVsLmFscGhhX3NCSVQgPSBhbHBoYV9zQklUOwotICAgICAgICAgaW5fcGl4ZWwuaGF2ZV90Uk5TID0gaGF2ZV90Uk5TICE9IDA7Ci0KLSAgICAgICAgIC8qIEZvciBlcnJvciBkZXRlY3Rpb24sIGJlbG93LiAqLwotICAgICAgICAgciA9IGluX3BpeGVsLnJlZDsKLSAgICAgICAgIGcgPSBpbl9waXhlbC5ncmVlbjsKLSAgICAgICAgIGIgPSBpbl9waXhlbC5ibHVlOwotICAgICAgICAgYSA9IGluX3BpeGVsLmFscGhhOwotCi0gICAgICAgICAvKiBUaGlzIGFwcGxpZXMgdGhlIHRyYW5zZm9ybXMgdG8gdGhlIGlucHV0IGRhdGEsIGluY2x1ZGluZyBvdXRwdXQKLSAgICAgICAgICAqIGZvcm1hdCBvcGVyYXRpb25zIHdoaWNoIG11c3QgYmUgdXNlZCB3aGVuIHJlYWRpbmcgdGhlIG91dHB1dAotICAgICAgICAgICogcGl4ZWwgdGhhdCBsaWJwbmcgcHJvZHVjZXMuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGRwLT50cmFuc2Zvcm1fbGlzdC0+bW9kKGRwLT50cmFuc2Zvcm1fbGlzdCwgJmluX3BpeGVsLCBwcCwgZHApOwotCi0gICAgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgcGl4ZWwgYW5kIGNvbXBhcmUgaXQgdG8gd2hhdCB3ZSBnb3QsIHdlIGRvbid0Ci0gICAgICAgICAgKiB1c2UgdGhlIGVycm9yIGZpZWxkIGhlcmUsIHNvIG5vIG5lZWQgdG8gdXBkYXRlIHNCSVQuICBpbl9waXhlbAotICAgICAgICAgICogc2F5cyB3aGV0aGVyIHdlIGV4cGVjdCBsaWJwbmcgdG8gY2hhbmdlIHRoZSBvdXRwdXQgZm9ybWF0LgotICAgICAgICAgICovCi0gICAgICAgICBpbWFnZV9waXhlbF9pbml0KCZvdXRfcGl4ZWwsIHBSb3csIG91dF9jdCwgb3V0X2JkLCB4LCBvdXRfcGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgJmluX3BpeGVsKTsKLQotICAgICAgICAgLyogV2UgZG9uJ3QgZXhwZWN0IGNoYW5nZXMgdG8gdGhlIGluZGV4IGhlcmUgZXZlbiBpZiB0aGUgYml0IGRlcHRoIGlzCi0gICAgICAgICAgKiBjaGFuZ2VkLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoaW5fY3QgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgotICAgICAgICAgICAgb3V0X2N0ID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW5fcGl4ZWwucGFsZXR0ZV9pbmRleCAhPSBvdXRfcGl4ZWwucGFsZXR0ZV9pbmRleCkKLSAgICAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInVuZXhwZWN0ZWQgdHJhbnNmb3JtZWQgcGFsZXR0ZSBpbmRleCIpOwotICAgICAgICAgfQotCi0gICAgICAgICAvKiBDaGVjayB0aGUgY29sb3VycyBmb3IgcGFsZXR0ZSBpbWFnZXMgdG9vIC0gaW4gZmFjdCB0aGUgcGFsZXR0ZSBjb3VsZAotICAgICAgICAgICogYmUgc2VwYXJhdGVseSB2ZXJpZmllZCBpdHNlbGYgaW4gbW9zdCBjYXNlcy4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGluX3BpeGVsLnJlZCAhPSBvdXRfcGl4ZWwucmVkKQotICAgICAgICAgICAgdHJhbnNmb3JtX3JhbmdlX2NoZWNrKHBwLCByLCBnLCBiLCBhLCBpbl9waXhlbC5yZWQsIGluX3BpeGVsLnJlZGYsCi0gICAgICAgICAgICAgICBvdXRfcGl4ZWwucmVkLCBzYW1wbGVfZGVwdGgsIGluX3BpeGVsLnJlZGUsCi0gICAgICAgICAgICAgICBkcC0+cG0tPmxpbWl0ICsgMS4vKDIqKCgxVTw8aW5fcGl4ZWwucmVkX3NCSVQpLTEpKSwgInJlZC9ncmF5IiwKLSAgICAgICAgICAgICAgIGRpZ2l0aXphdGlvbl9lcnJvcik7Ci0KLSAgICAgICAgIGlmICgob3V0X2N0ICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpICE9IDAgJiYKLSAgICAgICAgICAgIGluX3BpeGVsLmdyZWVuICE9IG91dF9waXhlbC5ncmVlbikKLSAgICAgICAgICAgIHRyYW5zZm9ybV9yYW5nZV9jaGVjayhwcCwgciwgZywgYiwgYSwgaW5fcGl4ZWwuZ3JlZW4sCi0gICAgICAgICAgICAgICBpbl9waXhlbC5ncmVlbmYsIG91dF9waXhlbC5ncmVlbiwgc2FtcGxlX2RlcHRoLCBpbl9waXhlbC5ncmVlbmUsCi0gICAgICAgICAgICAgICBkcC0+cG0tPmxpbWl0ICsgMS4vKDIqKCgxVTw8aW5fcGl4ZWwuZ3JlZW5fc0JJVCktMSkpLCAiZ3JlZW4iLAotICAgICAgICAgICAgICAgZGlnaXRpemF0aW9uX2Vycm9yKTsKLQotICAgICAgICAgaWYgKChvdXRfY3QgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgIT0gMCAmJgotICAgICAgICAgICAgaW5fcGl4ZWwuYmx1ZSAhPSBvdXRfcGl4ZWwuYmx1ZSkKLSAgICAgICAgICAgIHRyYW5zZm9ybV9yYW5nZV9jaGVjayhwcCwgciwgZywgYiwgYSwgaW5fcGl4ZWwuYmx1ZSwgaW5fcGl4ZWwuYmx1ZWYsCi0gICAgICAgICAgICAgICBvdXRfcGl4ZWwuYmx1ZSwgc2FtcGxlX2RlcHRoLCBpbl9waXhlbC5ibHVlZSwKLSAgICAgICAgICAgICAgIGRwLT5wbS0+bGltaXQgKyAxLi8oMiooKDFVPDxpbl9waXhlbC5ibHVlX3NCSVQpLTEpKSwgImJsdWUiLAotICAgICAgICAgICAgICAgZGlnaXRpemF0aW9uX2Vycm9yKTsKLQotICAgICAgICAgaWYgKChvdXRfY3QgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgIT0gMCAmJgotICAgICAgICAgICAgaW5fcGl4ZWwuYWxwaGEgIT0gb3V0X3BpeGVsLmFscGhhKQotICAgICAgICAgICAgdHJhbnNmb3JtX3JhbmdlX2NoZWNrKHBwLCByLCBnLCBiLCBhLCBpbl9waXhlbC5hbHBoYSwKLSAgICAgICAgICAgICAgIGluX3BpeGVsLmFscGhhZiwgb3V0X3BpeGVsLmFscGhhLCBzYW1wbGVfZGVwdGgsIGluX3BpeGVsLmFscGhhZSwKLSAgICAgICAgICAgICAgIGRwLT5wbS0+bGltaXQgKyAxLi8oMiooKDFVPDxpbl9waXhlbC5hbHBoYV9zQklUKS0xKSksICJhbHBoYSIsCi0gICAgICAgICAgICAgICBkaWdpdGl6YXRpb25fZXJyb3IpOwotICAgICAgfSAvKiBwaXhlbCAoeCkgbG9vcCAqLwotICAgfSAvKiByb3cgKHkpIGxvb3AgKi8KLQotICAgLyogUmVjb3JkIHRoYXQgc29tZXRoaW5nIHdhcyBhY3R1YWxseSBjaGVja2VkIHRvIGF2b2lkIGEgZmFsc2UgcG9zaXRpdmUuICovCi0gICBkcC0+dGhpcy5wcy0+dmFsaWRhdGVkID0gMTsKLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLXRyYW5zZm9ybV9lbmQocG5nX3N0cnVjdHAgcHBJbiwgcG5nX2luZm9wIHBpKQotewotICAgcG5nX2NvbnN0X3N0cnVjdHAgcHAgPSBwcEluOwotICAgdHJhbnNmb3JtX2Rpc3BsYXkgKmRwID0gdm9pZGNhc3QodHJhbnNmb3JtX2Rpc3BsYXkqLAotICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocHApKTsKLQotICAgaWYgKCFkcC0+dGhpcy5zcGVlZCkKLSAgICAgIHRyYW5zZm9ybV9pbWFnZV92YWxpZGF0ZShkcCwgcHAsIHBpKTsKLSAgIGVsc2UKLSAgICAgIGRwLT50aGlzLnBzLT52YWxpZGF0ZWQgPSAxOwotfQotCi0vKiBBIHNpbmdsZSB0ZXN0IHJ1bi4gKi8KLXN0YXRpYyB2b2lkCi10cmFuc2Zvcm1fdGVzdChwbmdfbW9kaWZpZXIgKnBtSW4sIGNvbnN0IHBuZ191aW50XzMyIGlkSW4sCi0gICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtKiB0cmFuc2Zvcm1fbGlzdEluLCBjb25zdCBjaGFyICogY29uc3QgbmFtZSkKLXsKLSAgIHRyYW5zZm9ybV9kaXNwbGF5IGQ7Ci0gICBjb250ZXh0KCZwbUluLT50aGlzLCBmYXVsdCk7Ci0KLSAgIHRyYW5zZm9ybV9kaXNwbGF5X2luaXQoJmQsIHBtSW4sIGlkSW4sIHRyYW5zZm9ybV9saXN0SW4pOwotCi0gICBUcnkKLSAgIHsKLSAgICAgIHNpemVfdCBwb3MgPSAwOwotICAgICAgcG5nX3N0cnVjdHAgcHA7Ci0gICAgICBwbmdfaW5mb3AgcGk7Ci0gICAgICBjaGFyIGZ1bGxfbmFtZVsyNTZdOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIGZpZWxkcyBhcmUgY29ycmVjdCBhbmQgZW50ZXIgdGhlIHJlcXVpcmVkCi0gICAgICAgKiBtb2RpZmljYXRpb25zLgotICAgICAgICovCi0gICAgICB0cmFuc2Zvcm1fc2V0X2VuY29kaW5nKCZkKTsKLQotICAgICAgLyogQWRkIGFueSBtb2RpZmljYXRpb25zIHJlcXVpcmVkIGJ5IHRoZSB0cmFuc2Zvcm0gbGlzdC4gKi8KLSAgICAgIGQudHJhbnNmb3JtX2xpc3QtPmluaShkLnRyYW5zZm9ybV9saXN0LCAmZCk7Ci0KLSAgICAgIC8qIEFkZCB0aGUgY29sb3Igc3BhY2UgaW5mb3JtYXRpb24sIGlmIGFueSwgdG8gdGhlIG5hbWUuICovCi0gICAgICBwb3MgPSBzYWZlY2F0KGZ1bGxfbmFtZSwgc2l6ZW9mIGZ1bGxfbmFtZSwgcG9zLCBuYW1lKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRfY3VycmVudF9lbmNvZGluZyhmdWxsX25hbWUsIHNpemVvZiBmdWxsX25hbWUsIHBvcywgZC5wbSk7Ci0KLSAgICAgIC8qIEdldCBhIHBuZ19zdHJ1Y3QgZm9yIHJlYWRpbmcgdGhlIGltYWdlLiAqLwotICAgICAgcHAgPSBzZXRfbW9kaWZpZXJfZm9yX3JlYWQoZC5wbSwgJnBpLCBkLnRoaXMuaWQsIGZ1bGxfbmFtZSk7Ci0gICAgICBzdGFuZGFyZF9wYWxldHRlX2luaXQoJmQudGhpcyk7Ci0KLSMgICAgIGlmIDAKLSAgICAgICAgIC8qIExvZ2dpbmcgKGRlYnVnZ2luZyBvbmx5KSAqLwotICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKLQotICAgICAgICAgICAgKHZvaWQpc3RvcmVfbWVzc2FnZSgmZC5wbS0+dGhpcywgcHAsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICJydW5uaW5nIHRlc3QiKTsKLQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVmZmVyKTsKLSAgICAgICAgIH0KLSMgICAgIGVuZGlmCi0KLSAgICAgIC8qIEludHJvZHVjZSB0aGUgY29ycmVjdCByZWFkIGZ1bmN0aW9uLiAqLwotICAgICAgaWYgKGQucG0tPnRoaXMucHJvZ3Jlc3NpdmUpCi0gICAgICB7Ci0gICAgICAgICAvKiBTaGFyZSB0aGUgcm93IGZ1bmN0aW9uIHdpdGggdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uLiAqLwotICAgICAgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBwLCAmZCwgdHJhbnNmb3JtX2luZm8sIHByb2dyZXNzaXZlX3JvdywKLSAgICAgICAgICAgIHRyYW5zZm9ybV9lbmQpOwotCi0gICAgICAgICAvKiBOb3cgZmVlZCBkYXRhIGludG8gdGhlIHJlYWRlciB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kOiAqLwotICAgICAgICAgbW9kaWZpZXJfcHJvZ3Jlc3NpdmVfcmVhZChkLnBtLCBwcCwgcGkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLyogbW9kaWZpZXJfcmVhZCBleHBlY3RzIGEgcG5nX21vZGlmaWVyKiAqLwotICAgICAgICAgcG5nX3NldF9yZWFkX2ZuKHBwLCBkLnBtLCBtb2RpZmllcl9yZWFkKTsKLQotICAgICAgICAgLyogQ2hlY2sgdGhlIGhlYWRlciB2YWx1ZXM6ICovCi0gICAgICAgICBwbmdfcmVhZF9pbmZvKHBwLCBwaSk7Ci0KLSAgICAgICAgIC8qIFByb2Nlc3MgdGhlICdpbmZvJyByZXF1aXJlbWVudHMuIE9ubHkgb25lIGltYWdlIGlzIGdlbmVyYXRlZCAqLwotICAgICAgICAgdHJhbnNmb3JtX2luZm9faW1wKCZkLCBwcCwgcGkpOwotCi0gICAgICAgICBzZXF1ZW50aWFsX3JvdygmZC50aGlzLCBwcCwgcGksIC0xLCAwKTsKLQotICAgICAgICAgaWYgKCFkLnRoaXMuc3BlZWQpCi0gICAgICAgICAgICB0cmFuc2Zvcm1faW1hZ2VfdmFsaWRhdGUoJmQsIHBwLCBwaSk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBkLnRoaXMucHMtPnZhbGlkYXRlZCA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIG1vZGlmaWVyX3Jlc2V0KGQucG0pOwotICAgfQotCi0gICBDYXRjaChmYXVsdCkKLSAgIHsKLSAgICAgIG1vZGlmaWVyX3Jlc2V0KHZvaWRjYXN0KHBuZ19tb2RpZmllciosKHZvaWQqKWZhdWx0KSk7Ci0gICB9Ci19Ci0KLS8qIFRoZSB0cmFuc2Zvcm1zOiAqLwotI2RlZmluZSBJVFNUUlVDVChuYW1lKSBpbWFnZV90cmFuc2Zvcm1fIyNuYW1lCi0jZGVmaW5lIElUREFUQShuYW1lKSBpbWFnZV90cmFuc2Zvcm1fZGF0YV8jI25hbWUKLSNkZWZpbmUgaW1hZ2VfdHJhbnNmb3JtX2luaSBpbWFnZV90cmFuc2Zvcm1fZGVmYXVsdF9pbmkKLSNkZWZpbmUgSVQobmFtZSlcCi1zdGF0aWMgaW1hZ2VfdHJhbnNmb3JtIElUU1RSVUNUKG5hbWUpID1cCi17XAotICAgI25hbWUsXAotICAgMSwgLyplbmFibGUqL1wKLSAgICZQVCwgLypsaXN0Ki9cCi0gICAwLCAvKmdsb2JhbF91c2UqL1wKLSAgIDAsIC8qbG9jYWxfdXNlKi9cCi0gICAwLCAvKm5leHQqL1wKLSAgIGltYWdlX3RyYW5zZm9ybV9pbmksXAotICAgaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfIyNuYW1lIyNfc2V0LFwKLSAgIGltYWdlX3RyYW5zZm9ybV9wbmdfc2V0XyMjbmFtZSMjX21vZCxcCi0gICBpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF8jI25hbWUjI19hZGRcCi19Ci0jZGVmaW5lIFBUIElUU1RSVUNUKGVuZCkgLyogc3RvcmVzIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm0gKi8KLQotLyogVG8gc2F2ZSBjb2RlOiAqLwotZXh0ZXJuIHZvaWQgaW1hZ2VfdHJhbnNmb3JtX2RlZmF1bHRfaW5pKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0KTsgLyogc2lsZW5jZSBHQ0Mgd2FybmluZ3MgKi8KLQotdm9pZCAvKiBwcml2YXRlLCBidXQgYWxtb3N0IGFsd2F5cyBuZWVkZWQgKi8KLWltYWdlX3RyYW5zZm9ybV9kZWZhdWx0X2luaShjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQpCi17Ci0gICB0aGlzLT5uZXh0LT5pbmkodGhpcy0+bmV4dCwgdGhhdCk7Ci19Ci0KLSNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX2RlZmF1bHRfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgVU5VU0VEKGNvbG91cl90eXBlKQotICAgVU5VU0VEKGJpdF9kZXB0aCkKLQotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICByZXR1cm4gMTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAotLyogcG5nX3NldF9wYWxldHRlX3RvX3JnYiAqLwotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhbGV0dGVfdG9fcmdiX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHBwKTsKLSAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOwotfQotCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcGFsZXR0ZV90b19yZ2JfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIGltYWdlX3BpeGVsX2NvbnZlcnRfUExURSh0aGF0KTsKLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcGFsZXR0ZV90b19yZ2JfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgVU5VU0VEKGJpdF9kZXB0aCkKLQotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICByZXR1cm4gY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURTsKLX0KLQotSVQocGFsZXR0ZV90b19yZ2IpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKHBhbGV0dGVfdG9fcmdiKQotI2VuZGlmIC8qIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQKLS8qIHBuZ19zZXRfdFJOU190b19hbHBoYSAqLwotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3RSTlNfdG9fYWxwaGFfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBwKTsKLQotICAgLyogSWYgdGhlcmUgd2FzIGEgdFJOUyBjaHVuayB0aGF0IHdvdWxkIGdldCBleHBhbmRlZCBhbmQgYWRkIGFuIGFscGhhCi0gICAgKiBjaGFubmVsIGlzX3RyYW5zcGFyZW50IG11c3QgYmUgdXBkYXRlZDoKLSAgICAqLwotICAgaWYgKHRoYXQtPnRoaXMuaGFzX3RSTlMpCi0gICAgICB0aGF0LT50aGlzLmlzX3RyYW5zcGFyZW50ID0gMTsKLQotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF90Uk5TX3RvX2FscGhhX21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCi0gICAvKiBMSUJQTkcgQlVHOiB0aGlzIGFsd2F5cyBmb3JjZXMgcGFsZXR0ZSBpbWFnZXMgdG8gUkdCLiAqLwotICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICBpbWFnZV9waXhlbF9jb252ZXJ0X1BMVEUodGhhdCk7Ci0jZW5kaWYKLQotICAgLyogVGhpcyBlZmZlY3RpdmVseSBkb2VzIGFuICdleHBhbmQnIG9ubHkgaWYgdGhlcmUgaXMgc29tZSB0cmFuc3BhcmVuY3kgdG8KLSAgICAqIGNvbnZlcnQgdG8gYW4gYWxwaGEgY2hhbm5lbC4KLSAgICAqLwotICAgaWYgKHRoYXQtPmhhdmVfdFJOUykKLSMgICAgIGlmIFBOR19MSUJQTkdfVkVSID49IDEwNzAwCi0gICAgICAgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJgotICAgICAgICAgICAgICh0aGF0LT5jb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSA9PSAwKQotIyAgICAgZW5kaWYKLSAgICAgIGltYWdlX3BpeGVsX2FkZF9hbHBoYSh0aGF0LCAmZGlzcGxheS0+dGhpcywgMC8qIWZvciBiYWNrZ3JvdW5kKi8pOwotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAotICAgLyogTElCUE5HIEJVRzogb3RoZXJ3aXNlIGxpYnBuZyBzdGlsbCBleHBhbmRzIHRvIDggYml0cyEgKi8KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmICh0aGF0LT5iaXRfZGVwdGggPCA4KQotICAgICAgICAgdGhhdC0+Yml0X2RlcHRoID04OwotICAgICAgaWYgKHRoYXQtPnNhbXBsZV9kZXB0aCA8IDgpCi0gICAgICAgICB0aGF0LT5zYW1wbGVfZGVwdGggPSA4OwotICAgfQotI2VuZGlmCi0KLSAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3RSTlNfdG9fYWxwaGFfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgVU5VU0VEKGJpdF9kZXB0aCkKLQotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICAvKiBXZSBkb24ndCBrbm93IHlldCB3aGV0aGVyIHRoZXJlIHdpbGwgYmUgYSB0Uk5TIGNodW5rLCBidXQgd2Uga25vdyB0aGF0Ci0gICAgKiB0aGlzIHRyYW5zZm9ybWF0aW9uIHNob3VsZCBkbyBub3RoaW5nIGlmIHRoZXJlIGFscmVhZHkgaXMgYW4gYWxwaGEKLSAgICAqIGNoYW5uZWwuICBJbiBhZGRpdGlvbiwgYWZ0ZXIgdGhlIGJ1ZyBmaXggaW4gMS43LjAsIHRoZXJlIGlzIG5vIGxvbmdlcgotICAgICogYW55IGFjdGlvbiBvbiBhIHBhbGV0dGUgaW1hZ2UuCi0gICAgKi8KLSAgIHJldHVybgotIyAgaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA3MDAKLSAgICAgIGNvbG91cl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgJiYKLSMgIGVuZGlmCi0gICAoY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgPT0gMDsKLX0KLQotSVQodFJOU190b19hbHBoYSk7Ci0jdW5kZWYgUFQKLSNkZWZpbmUgUFQgSVRTVFJVQ1QodFJOU190b19hbHBoYSkKLSNlbmRpZiAvKiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQKLS8qIHBuZ19zZXRfZ3JheV90b19yZ2IgKi8KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9ncmF5X3RvX3JnYl9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgcG5nX3NldF9ncmF5X3RvX3JnYihwcCk7Ci0gICAvKiBOT1RFOiB0aGlzIGRvZXNuJ3QgcmVzdWx0IGluIHRSTlMgZXhwYW5zaW9uLiAqLwotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9ncmF5X3RvX3JnYl9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIC8qIE5PVEU6IHdlIGNhbiBhY3R1YWxseSBwZW5kIHRoZSB0Uk5TIHByb2Nlc3NpbmcgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHdlCi0gICAgKiBjYW4gY29ycmVjdGx5IHJlY29nbml6ZSB0aGUgb3JpZ2luYWwgcGl4ZWwgdmFsdWUgZXZlbiB0aG91Z2ggd2UgaGF2ZQotICAgICogbWFwcGVkIHRoZSBvbmUgZ3JheSBjaGFubmVsIHRvIHRoZSB0aHJlZSBSR0Igb25lcywgYnV0IGluIGZhY3QgbGlicG5nCi0gICAgKiBkb2Vzbid0IGRvIHRoaXMsIHNvIHdlIGRvbid0IGVpdGhlci4KLSAgICAqLwotICAgaWYgKCh0aGF0LT5jb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSA9PSAwICYmIHRoYXQtPmhhdmVfdFJOUykKLSAgICAgIGltYWdlX3BpeGVsX2FkZF9hbHBoYSh0aGF0LCAmZGlzcGxheS0+dGhpcywgMC8qIWZvciBiYWNrZ3JvdW5kKi8pOwotCi0gICAvKiBTaW1wbHkgZXhwYW5kIHRoZSBiaXQgZGVwdGggYW5kIGFsdGVyIHRoZSBjb2xvdXIgdHlwZSBhcyByZXF1aXJlZC4gKi8KLSAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgewotICAgICAgLyogUkdCIGltYWdlcyBoYXZlIGEgYml0IGRlcHRoIGF0IGxlYXN0IGVxdWFsIHRvICc4JyAqLwotICAgICAgaWYgKHRoYXQtPmJpdF9kZXB0aCA8IDgpCi0gICAgICAgICB0aGF0LT5zYW1wbGVfZGVwdGggPSB0aGF0LT5iaXRfZGVwdGggPSA4OwotCi0gICAgICAvKiBBbmQganVzdCBjaGFuZ2luZyB0aGUgY29sb3VyIHR5cGUgd29ya3MgaGVyZSBiZWNhdXNlIHRoZSBncmVlbiBhbmQgYmx1ZQotICAgICAgICogY2hhbm5lbHMgYXJlIGJlaW5nIG1haW50YWluZWQgaW4gbG9jay1zdGVwIHdpdGggdGhlIHJlZC9ncmF5OgotICAgICAgICovCi0gICAgICB0aGF0LT5jb2xvdXJfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKLSAgIH0KLQotICAgZWxzZSBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotCi0gICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOwotfQotCi1zdGF0aWMgaW50Ci1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9ncmF5X3RvX3JnYl9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICBVTlVTRUQoYml0X2RlcHRoKQotCi0gICB0aGlzLT5uZXh0ID0gKnRoYXQ7Ci0gICAqdGhhdCA9IHRoaXM7Ci0KLSAgIHJldHVybiAoY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgPT0gMDsKLX0KLQotSVQoZ3JheV90b19yZ2IpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKGdyYXlfdG9fcmdiKQotI2VuZGlmIC8qIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAotLyogcG5nX3NldF9leHBhbmQgKi8KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19zZXRfZXhwYW5kKHBwKTsKLQotICAgaWYgKHRoYXQtPnRoaXMuaGFzX3RSTlMpCi0gICAgICB0aGF0LT50aGlzLmlzX3RyYW5zcGFyZW50ID0gMTsKLQotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICAvKiBUaGUgZ2VuZXJhbCBleHBhbmQgY2FzZSBkZXBlbmRzIG9uIHdoYXQgdGhlIGNvbG91ciB0eXBlIGlzOiAqLwotICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICBpbWFnZV9waXhlbF9jb252ZXJ0X1BMVEUodGhhdCk7Ci0gICBlbHNlIGlmICh0aGF0LT5iaXRfZGVwdGggPCA4KSAvKiBncmF5c2NhbGUgKi8KLSAgICAgIHRoYXQtPnNhbXBsZV9kZXB0aCA9IHRoYXQtPmJpdF9kZXB0aCA9IDg7Ci0KLSAgIGlmICh0aGF0LT5oYXZlX3RSTlMpCi0gICAgICBpbWFnZV9waXhlbF9hZGRfYWxwaGEodGhhdCwgJmRpc3BsYXktPnRoaXMsIDAvKiFmb3IgYmFja2dyb3VuZCovKTsKLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZXhwYW5kX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKLXsKLSAgIFVOVVNFRChiaXRfZGVwdGgpCi0KLSAgIHRoaXMtPm5leHQgPSAqdGhhdDsKLSAgICp0aGF0ID0gdGhpczsKLQotICAgLyogJ2V4cGFuZCcgc2hvdWxkIGRvIG5vdGhpbmcgZm9yIFJHQkEgb3IgR0EgaW5wdXQgLSBubyB0Uk5TIGFuZCB0aGUgYml0Ci0gICAgKiBkZXB0aCBpcyBhdCBsZWFzdCA4IGFscmVhZHkuCi0gICAgKi8KLSAgIHJldHVybiAoY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgPT0gMDsKLX0KLQotSVQoZXhwYW5kKTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChleHBhbmQpCi0jZW5kaWYgLyogUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAotLyogcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184Ci0gKiBQcmUgMS43LjAgTElCUE5HIEJVRzogdGhpcyBqdXN0IGRvZXMgYW4gJ2V4cGFuZCcKLSAqLwotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzhfc2V0KAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLAotICAgIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwcCk7Ci0gICAvKiBOT1RFOiBkb24ndCBleHBlY3QgdGhpcyB0byBleHBhbmQgdFJOUyAqLwotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184X21vZCgKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCi0gICBpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfbW9kKHRoaXMsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLSNlbHNlCi0gICAvKiBPbmx5IGV4cGFuZCBncmF5c2NhbGUgb2YgYml0IGRlcHRoIGxlc3MgdGhhbiA4OiAqLwotICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYKLSAgICAgICB0aGF0LT5iaXRfZGVwdGggPCA4KQotICAgICAgdGhhdC0+c2FtcGxlX2RlcHRoID0gdGhhdC0+Yml0X2RlcHRoID0gODsKLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLSNlbmRpZiAvKiAxLjcgb3IgbGF0ZXIgKi8KLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOF9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAotICAgcmV0dXJuIGltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2V4cGFuZF9hZGQodGhpcywgdGhhdCwgY29sb3VyX3R5cGUsCi0gICAgICBiaXRfZGVwdGgpOwotI2Vsc2UKLSAgIFVOVVNFRChiaXRfZGVwdGgpCi0KLSAgIHRoaXMtPm5leHQgPSAqdGhhdDsKLSAgICp0aGF0ID0gdGhpczsKLQotICAgLyogVGhpcyBzaG91bGQgZG8gbm90aGluZyB1bmxlc3MgdGhlIGNvbG9yIHR5cGUgaXMgZ3JheSBhbmQgdGhlIGJpdCBkZXB0aCBpcwotICAgICogbGVzcyB0aGFuIDg6Ci0gICAgKi8KLSAgIHJldHVybiBjb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDg7Ci0jZW5kaWYgLyogMS43IG9yIGxhdGVyICovCi19Ci0KLUlUKGV4cGFuZF9ncmF5XzFfMl80X3RvXzgpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKGV4cGFuZF9ncmF5XzFfMl80X3RvXzgpCi0jZW5kaWYgLyogUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRAotLyogcG5nX3NldF9leHBhbmRfMTYgKi8KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9leHBhbmRfMTZfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19zZXRfZXhwYW5kXzE2KHBwKTsKLQotICAgLyogTk9URTogcHJpb3IgdG8gMS43IGxpYnBuZyBkb2VzIFNFVF9FWFBBTkQgYXMgd2VsbCwgc28gdFJOUyBpcyBleHBhbmRlZC4gKi8KLSMgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSAgICAgIGlmICh0aGF0LT50aGlzLmhhc190Uk5TKQotICAgICAgICAgdGhhdC0+dGhpcy5pc190cmFuc3BhcmVudCA9IDE7Ci0jICBlbmRpZgotCi0gICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKLX0KLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2V4cGFuZF8xNl9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIC8qIEV4cGVjdCBleHBhbmRfMTYgdG8gZXhwYW5kIGV2ZXJ5dGhpbmcgdG8gMTYgYml0cyBhcyBhIHJlc3VsdCBvZiBhbHNvCi0gICAgKiBjYXVzaW5nICdleHBhbmQnIHRvIGhhcHBlbi4KLSAgICAqLwotICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCi0gICAgICBpbWFnZV9waXhlbF9jb252ZXJ0X1BMVEUodGhhdCk7Ci0KLSAgIGlmICh0aGF0LT5oYXZlX3RSTlMpCi0gICAgICBpbWFnZV9waXhlbF9hZGRfYWxwaGEodGhhdCwgJmRpc3BsYXktPnRoaXMsIDAvKiFmb3IgYmFja2dyb3VuZCovKTsKLQotICAgaWYgKHRoYXQtPmJpdF9kZXB0aCA8IDE2KQotICAgICAgdGhhdC0+c2FtcGxlX2RlcHRoID0gdGhhdC0+Yml0X2RlcHRoID0gMTY7Ci0KLSAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2V4cGFuZF8xNl9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICBVTlVTRUQoY29sb3VyX3R5cGUpCi0KLSAgIHRoaXMtPm5leHQgPSAqdGhhdDsKLSAgICp0aGF0ID0gdGhpczsKLQotICAgLyogZXhwYW5kXzE2IGRvZXMgc29tZXRoaW5nIHVubGVzcyB0aGUgYml0IGRlcHRoIGlzIGFscmVhZHkgMTYuICovCi0gICByZXR1cm4gYml0X2RlcHRoIDwgMTY7Ci19Ci0KLUlUKGV4cGFuZF8xNik7Ci0jdW5kZWYgUFQKLSNkZWZpbmUgUFQgSVRTVFJVQ1QoZXhwYW5kXzE2KQotI2VuZGlmIC8qIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVEICAvKiBBUEkgYWRkZWQgaW4gMS41LjQgKi8KLS8qIHBuZ19zZXRfc2NhbGVfMTYgKi8KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zY2FsZV8xNl9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgcG5nX3NldF9zY2FsZV8xNihwcCk7Ci0jICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCi0gICAgICAvKiBsaWJwbmcgd2lsbCBsaW1pdCB0aGUgZ2FtbWEgdGFibGUgc2l6ZTogKi8KLSAgICAgIHRoYXQtPm1heF9nYW1tYV84ID0gUE5HX01BWF9HQU1NQV84OwotIyAgZW5kaWYKLSAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOwotfQotCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc2NhbGVfMTZfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICBpZiAodGhhdC0+Yml0X2RlcHRoID09IDE2KQotICAgewotICAgICAgdGhhdC0+c2FtcGxlX2RlcHRoID0gdGhhdC0+Yml0X2RlcHRoID0gODsKLSAgICAgIGlmICh0aGF0LT5yZWRfc0JJVCA+IDgpIHRoYXQtPnJlZF9zQklUID0gODsKLSAgICAgIGlmICh0aGF0LT5ncmVlbl9zQklUID4gOCkgdGhhdC0+Z3JlZW5fc0JJVCA9IDg7Ci0gICAgICBpZiAodGhhdC0+Ymx1ZV9zQklUID4gOCkgdGhhdC0+Ymx1ZV9zQklUID0gODsKLSAgICAgIGlmICh0aGF0LT5hbHBoYV9zQklUID4gOCkgdGhhdC0+YWxwaGFfc0JJVCA9IDg7Ci0gICB9Ci0KLSAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3NjYWxlXzE2X2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKLXsKLSAgIFVOVVNFRChjb2xvdXJfdHlwZSkKLQotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICByZXR1cm4gYml0X2RlcHRoID4gODsKLX0KLQotSVQoc2NhbGVfMTYpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKHNjYWxlXzE2KQotI2VuZGlmIC8qIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVEICgxLjUuNCBvbikgKi8KLQotI2lmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVEIC8qIHRoZSBkZWZhdWx0IGJlZm9yZSAxLjUuNCAqLwotLyogcG5nX3NldF9zdHJpcF8xNiAqLwotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3N0cmlwXzE2X3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBwbmdfc2V0X3N0cmlwXzE2KHBwKTsKLSMgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSAgICAgIC8qIGxpYnBuZyB3aWxsIGxpbWl0IHRoZSBnYW1tYSB0YWJsZSBzaXplOiAqLwotICAgICAgdGhhdC0+bWF4X2dhbW1hXzggPSBQTkdfTUFYX0dBTU1BXzg7Ci0jICBlbmRpZgotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zdHJpcF8xNl9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5iaXRfZGVwdGggPT0gMTYpCi0gICB7Ci0gICAgICB0aGF0LT5zYW1wbGVfZGVwdGggPSB0aGF0LT5iaXRfZGVwdGggPSA4OwotICAgICAgaWYgKHRoYXQtPnJlZF9zQklUID4gOCkgdGhhdC0+cmVkX3NCSVQgPSA4OwotICAgICAgaWYgKHRoYXQtPmdyZWVuX3NCSVQgPiA4KSB0aGF0LT5ncmVlbl9zQklUID0gODsKLSAgICAgIGlmICh0aGF0LT5ibHVlX3NCSVQgPiA4KSB0aGF0LT5ibHVlX3NCSVQgPSA4OwotICAgICAgaWYgKHRoYXQtPmFscGhhX3NCSVQgPiA4KSB0aGF0LT5hbHBoYV9zQklUID0gODsKLQotICAgICAgLyogUHJpb3IgdG8gMS41LjQgcG5nX3NldF9zdHJpcF8xNiB3b3VsZCB1c2UgYW4gJ2FjY3VyYXRlJyBtZXRob2QgaWYgdGhpcwotICAgICAgICogY29uZmlndXJhdGlvbiBvcHRpb24gaXMgc2V0LiAgRnJvbSAxLjUuNCB0aGUgZmxhZyBpcyBuZXZlciBzZXQgYW5kIHRoZQotICAgICAgICogJ3NjYWxlJyBBUEkgKGFib3ZlKSBtdXN0IGJlIHVzZWQuCi0gICAgICAgKi8KLSMgICAgIGlmZGVmIFBOR19SRUFEX0FDQ1VSQVRFX1NDQUxFX1NVUFBPUlRFRAotIyAgICAgICAgaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA1MDQKLSMgICAgICAgICAgIGVycm9yIFBOR19SRUFEX0FDQ1VSQVRFX1NDQUxFIHNob3VsZCBub3QgYmUgc2V0Ci0jICAgICAgICBlbmRpZgotCi0gICAgICAgICAvKiBUaGUgc3RyaXAgMTYgYWxnb3JpdGhtIGRyb3BzIHRoZSBsb3cgOCBiaXRzIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nCi0gICAgICAgICAgKiAxLzI1Nywgc28gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHBlcm1pdHRlZCBlcnJvcnMgYXBwcm9wcmlhdGVseToKLSAgICAgICAgICAqIE5vdGljZSB0aGF0IHRoaXMgaXMgb25seSByZWxldmFudCBwcmlvciB0byB0aGUgYWRkaXRpb24gb2YgdGhlCi0gICAgICAgICAgKiBwbmdfc2V0X3NjYWxlXzE2IEFQSSBpbiAxLjUuNCAoYnV0IDEuNS40KyBhbHdheXMgZGVmaW5lcyB0aGUgYWJvdmUhKQotICAgICAgICAgICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBkb3VibGUgZCA9ICgyNTUtMTI4LjUpLzY1NTM1OwotICAgICAgICAgICAgdGhhdC0+cmVkZSArPSBkOwotICAgICAgICAgICAgdGhhdC0+Z3JlZW5lICs9IGQ7Ci0gICAgICAgICAgICB0aGF0LT5ibHVlZSArPSBkOwotICAgICAgICAgICAgdGhhdC0+YWxwaGFlICs9IGQ7Ci0gICAgICAgICB9Ci0jICAgICBlbmRpZgotICAgfQotCi0gICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOwotfQotCi1zdGF0aWMgaW50Ci1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zdHJpcF8xNl9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICBVTlVTRUQoY29sb3VyX3R5cGUpCi0KLSAgIHRoaXMtPm5leHQgPSAqdGhhdDsKLSAgICp0aGF0ID0gdGhpczsKLQotICAgcmV0dXJuIGJpdF9kZXB0aCA+IDg7Ci19Ci0KLUlUKHN0cmlwXzE2KTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChzdHJpcF8xNikKLSNlbmRpZiAvKiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVECi0vKiBwbmdfc2V0X3N0cmlwX2FscGhhICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3RyaXBfYWxwaGFfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocHApOwotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zdHJpcF9hbHBoYV9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgdGhhdC0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOwotICAgZWxzZSBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgdGhhdC0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7Ci0KLSAgIHRoYXQtPmhhdmVfdFJOUyA9IDA7Ci0gICB0aGF0LT5hbHBoYWYgPSAxOwotCi0gICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOwotfQotCi1zdGF0aWMgaW50Ci1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zdHJpcF9hbHBoYV9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICBVTlVTRUQoYml0X2RlcHRoKQotCi0gICB0aGlzLT5uZXh0ID0gKnRoYXQ7Ci0gICAqdGhhdCA9IHRoaXM7Ci0KLSAgIHJldHVybiAoY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgIT0gMDsKLX0KLQotSVQoc3RyaXBfYWxwaGEpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKHN0cmlwX2FscGhhKQotI2VuZGlmIC8qIFBOR19SRUFEX1NUUklQX0FMUEhBX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVECi0vKiBwbmdfc2V0X3JnYl90b19ncmF5KHBuZ19zdHJ1Y3RwLCBpbnQgZXJyX2FjdGlvbiwgZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuKQotICogcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZChwbmdfc3RydWN0cCwgaW50IGVycl9hY3Rpb24sIHBuZ19maXhlZF9wb2ludCByZWQsCi0gKiAgICBwbmdfZml4ZWRfcG9pbnQgZ3JlZW4pCi0gKiBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cwotICoKLSAqIFRoZSAnZGVmYXVsdCcgdGVzdCBoZXJlIHVzZXMgdmFsdWVzIGtub3duIHRvIGJlIHVzZWQgaW5zaWRlIGxpYnBuZyBwcmlvciB0bwotICogMS43LjA6Ci0gKgotICogICByZWQ6ICAgIDY5NjgKLSAqICAgZ3JlZW46IDIzNDM0Ci0gKiAgIGJsdWU6ICAgMjM2NgotICoKLSAqIFRoZXNlIHZhbHVlcyBhcmUgYmVpbmcgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHksIGFsb25nIHdpdGggdGhlIHNvbWV3aGF0Ci0gKiBicm9rZW4gdHJ1bmNhdGlvbiBjYWxjdWxhdGlvbiBpbiB0aGUgZmFzdC1hbmQtaW5hY2N1cmF0ZSBjb2RlIHBhdGguICBPbGRlcgotICogdmVyc2lvbnMgb2YgbGlicG5nIHdpbGwgZmFpbCB0aGUgYWNjdXJhY3kgdGVzdHMgYmVsb3cgYmVjYXVzZSB0aGV5IHVzZSB0aGUKLSAqIHRydW5jYXRpb24gYWxnb3JpdGhtIGV2ZXJ5d2hlcmUuCi0gKi8KLSNkZWZpbmUgZGF0YSBJVERBVEEocmdiX3RvX2dyYXkpCi1zdGF0aWMgc3RydWN0Ci17Ci0gICBkb3VibGUgZ2FtbWE7ICAgICAgLyogRmlsZSBnYW1tYSB0byB1c2UgaW4gcHJvY2Vzc2luZyAqLwotCi0gICAvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgcGFyYW1ldGVycyBmb3IgcG5nX3NldF9yZ2JfdG9fZ3JheTogKi8KLSMgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgIGRvdWJsZSByZWRfdG9fc2V0OwotICAgICAgZG91YmxlIGdyZWVuX3RvX3NldDsKLSMgIGVsc2UKLSAgICAgIHBuZ19maXhlZF9wb2ludCByZWRfdG9fc2V0OwotICAgICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3RvX3NldDsKLSMgIGVuZGlmCi0KLSAgIC8qIFRoZSBhY3R1YWwgY29lZmZpY2llbnRzOiAqLwotICAgZG91YmxlIHJlZF9jb2VmZmljaWVudDsKLSAgIGRvdWJsZSBncmVlbl9jb2VmZmljaWVudDsKLSAgIGRvdWJsZSBibHVlX2NvZWZmaWNpZW50OwotCi0gICAvKiBTZXQgaWYgdGhlIGNvZWVmZmljaWVudHMgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uICovCi0gICBpbnQgY29lZmZpY2llbnRzX292ZXJyaWRkZW47Ci19IGRhdGE7Ci0KLSN1bmRlZiBpbWFnZV90cmFuc2Zvcm1faW5pCi0jZGVmaW5lIGltYWdlX3RyYW5zZm9ybV9pbmkgaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcmdiX3RvX2dyYXlfaW5pCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcmdiX3RvX2dyYXlfaW5pKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCkKLXsKLSAgIHBuZ19tb2RpZmllciAqcG0gPSB0aGF0LT5wbTsKLSAgIGNvbnN0IGNvbG9yX2VuY29kaW5nICplID0gcG0tPmN1cnJlbnRfZW5jb2Rpbmc7Ci0KLSAgIFVOVVNFRCh0aGlzKQotCi0gICAvKiBTaW5jZSB3ZSBjaGVjayB0aGUgZW5jb2RpbmcgdGhpcyBmbGFnIG11c3QgYmUgc2V0OiAqLwotICAgcG0tPnRlc3RfdXNlc19lbmNvZGluZyA9IDE7Ci0KLSAgIC8qIElmICdlJyBpcyBub3QgTlVMTCBjaHJvbWF0aWNpdHkgaW5mb3JtYXRpb24gaXMgcHJlc2VudCBhbmQgZWl0aGVyIGEgY0hSTQotICAgICogb3IgYW4gc1JHQiBjaHVuayB3aWxsIGJlIGluc2VydGVkLgotICAgICovCi0gICBpZiAoZSAhPSAwKQotICAgewotICAgICAgLyogQ29lZmZpY2llbnRzIGNvbWUgZnJvbSB0aGUgZW5jb2RpbmcsIGJ1dCBtYXkgbmVlZCB0byBiZSBub3JtYWxpemVkIHRvIGEKLSAgICAgICAqIHdoaXRlIHBvaW50IFkgb2YgMS4wCi0gICAgICAgKi8KLSAgICAgIGNvbnN0IGRvdWJsZSB3aGl0ZVkgPSBlLT5yZWQuWSArIGUtPmdyZWVuLlkgKyBlLT5ibHVlLlk7Ci0KLSAgICAgIGRhdGEucmVkX2NvZWZmaWNpZW50ID0gZS0+cmVkLlk7Ci0gICAgICBkYXRhLmdyZWVuX2NvZWZmaWNpZW50ID0gZS0+Z3JlZW4uWTsKLSAgICAgIGRhdGEuYmx1ZV9jb2VmZmljaWVudCA9IGUtPmJsdWUuWTsKLQotICAgICAgaWYgKHdoaXRlWSAhPSAxKQotICAgICAgewotICAgICAgICAgZGF0YS5yZWRfY29lZmZpY2llbnQgLz0gd2hpdGVZOwotICAgICAgICAgZGF0YS5ncmVlbl9jb2VmZmljaWVudCAvPSB3aGl0ZVk7Ci0gICAgICAgICBkYXRhLmJsdWVfY29lZmZpY2llbnQgLz0gd2hpdGVZOwotICAgICAgfQotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICAvKiBUaGUgZGVmYXVsdCAoYnVpbHQgaW4pIGNvZWZmY2llbnRzLCBhcyBhYm92ZTogKi8KLSMgICAgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSAgICAgICAgIGRhdGEucmVkX2NvZWZmaWNpZW50ID0gNjk2OCAvIDMyNzY4LjsKLSAgICAgICAgIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQgPSAyMzQzNCAvIDMyNzY4LjsKLSAgICAgICAgIGRhdGEuYmx1ZV9jb2VmZmljaWVudCA9IDIzNjYgLyAzMjc2OC47Ci0jICAgICBlbHNlCi0gICAgICAgICBkYXRhLnJlZF9jb2VmZmljaWVudCA9IC4yMTI2OwotICAgICAgICAgZGF0YS5ncmVlbl9jb2VmZmljaWVudCA9IC43MTUyOwotICAgICAgICAgZGF0YS5ibHVlX2NvZWZmaWNpZW50ID0gLjA3MjI7Ci0jICAgICBlbmRpZgotICAgfQotCi0gICBkYXRhLmdhbW1hID0gcG0tPmN1cnJlbnRfZ2FtbWE7Ci0KLSAgIC8qIElmIG5vdCBzZXQgdGhlbiB0aGUgY2FsY3VsYXRpb25zIGFzc3VtZSBsaW5lYXIgZW5jb2RpbmcgKGltcGxpY2l0bHkpOiAqLwotICAgaWYgKGRhdGEuZ2FtbWEgPT0gMCkKLSAgICAgIGRhdGEuZ2FtbWEgPSAxOwotCi0gICAvKiBUaGUgYXJndW1lbnRzIHRvIHBuZ19zZXRfcmdiX3RvX2dyYXkgY2FuIG92ZXJyaWRlIHRoZSBjb2VmZmljaWVudHMgaW1wbGllZAotICAgICogYnkgdGhlIGNvbG9yIHNwYWNlIGVuY29kaW5nLiAgSWYgZG9pbmcgZXhoYXVzdGl2ZSBjaGVja3MgZG8gdGhlIG92ZXJyaWRlCi0gICAgKiBpbiBlYWNoIGNhc2UsIG90aGVyd2lzZSBkbyBpdCByYW5kb21seS4KLSAgICAqLwotICAgaWYgKHBtLT50ZXN0X2V4aGF1c3RpdmUpCi0gICB7Ci0gICAgICAvKiBGaXJzdCB0aW1lIGluIGNvZWZmaWNpZW50c19vdmVycmlkZGVuIGlzIDAsIHRoZSBmb2xsb3dpbmcgc2V0cyBpdCB0byAxLAotICAgICAgICogc28gcmVwZWF0IGlmIGl0IGlzIHNldC4gIElmIGEgdGVzdCBmYWlscyB0aGlzIG1heSBtZWFuIHdlIHN1YnNlcXVlbnRseQotICAgICAgICogc2tpcCBhIG5vbi1vdmVycmlkZSB0ZXN0LCBpZ25vcmUgdGhhdC4KLSAgICAgICAqLwotICAgICAgZGF0YS5jb2VmZmljaWVudHNfb3ZlcnJpZGRlbiA9ICFkYXRhLmNvZWZmaWNpZW50c19vdmVycmlkZGVuOwotICAgICAgcG0tPnJlcGVhdCA9IGRhdGEuY29lZmZpY2llbnRzX292ZXJyaWRkZW4gIT0gMDsKLSAgIH0KLQotICAgZWxzZQotICAgICAgZGF0YS5jb2VmZmljaWVudHNfb3ZlcnJpZGRlbiA9IHJhbmRvbV9jaG9pY2UoKTsKLQotICAgaWYgKGRhdGEuY29lZmZpY2llbnRzX292ZXJyaWRkZW4pCi0gICB7Ci0gICAgICAvKiBUaGVzZSB2YWx1ZXMgb3ZlcnJpZGUgdGhlIGNvbG9yIGVuY29kaW5nIGRlZmF1bHRzLCBzaW1wbHkgdXNlIHJhbmRvbQotICAgICAgICogbnVtYmVycy4KLSAgICAgICAqLwotICAgICAgcG5nX3VpbnRfMzIgcnU7Ci0gICAgICBkb3VibGUgdG90YWw7Ci0KLSAgICAgIHJ1ID0gcmFuZG9tX3UzMigpOwotICAgICAgZGF0YS5ncmVlbl9jb2VmZmljaWVudCA9IHRvdGFsID0gKHJ1ICYgMHhmZmZmKSAvIDY1NTM1LjsKLSAgICAgIHJ1ID4+PSAxNjsKLSAgICAgIGRhdGEucmVkX2NvZWZmaWNpZW50ID0gKDEgLSB0b3RhbCkgKiAocnUgJiAweGZmZmYpIC8gNjU1MzUuOwotICAgICAgdG90YWwgKz0gZGF0YS5yZWRfY29lZmZpY2llbnQ7Ci0gICAgICBkYXRhLmJsdWVfY29lZmZpY2llbnQgPSAxIC0gdG90YWw7Ci0KLSMgICAgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgICAgIGRhdGEucmVkX3RvX3NldCA9IGRhdGEucmVkX2NvZWZmaWNpZW50OwotICAgICAgICAgZGF0YS5ncmVlbl90b19zZXQgPSBkYXRhLmdyZWVuX2NvZWZmaWNpZW50OwotIyAgICAgZWxzZQotICAgICAgICAgZGF0YS5yZWRfdG9fc2V0ID0gZml4KGRhdGEucmVkX2NvZWZmaWNpZW50KTsKLSAgICAgICAgIGRhdGEuZ3JlZW5fdG9fc2V0ID0gZml4KGRhdGEuZ3JlZW5fY29lZmZpY2llbnQpOwotIyAgICAgZW5kaWYKLQotICAgICAgLyogVGhlIGZvbGxvd2luZyBqdXN0IGNoYW5nZXMgdGhlIGVycm9yIG1lc3NhZ2VzOiAqLwotICAgICAgcG0tPmVuY29kaW5nX2lnbm9yZWQgPSAxOwotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICBkYXRhLnJlZF90b19zZXQgPSAtMTsKLSAgICAgIGRhdGEuZ3JlZW5fdG9fc2V0ID0gLTE7Ci0gICB9Ci0KLSAgIC8qIEFkanVzdCB0aGUgZXJyb3IgbGltaXQgaW4gdGhlIHBuZ19tb2RpZmllciBiZWNhdXNlIG9mIHRoZSBsYXJnZXIgZXJyb3JzCi0gICAgKiBwcm9kdWNlZCBpbiB0aGUgZGlnaXRpemF0aW9uIGR1cmluZyB0aGUgZ2FtbWEgaGFuZGxpbmcuCi0gICAgKi8KLSAgIGlmIChkYXRhLmdhbW1hICE9IDEpIC8qIFVzZSBnYW1tYSB0YWJsZXMgKi8KLSAgIHsKLSAgICAgIGlmICh0aGF0LT50aGlzLmJpdF9kZXB0aCA9PSAxNiB8fCBwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGUgY29tcHV0YXRpb25zIGhhdmUgdGhlIGZvcm06Ci0gICAgICAgICAgKgotICAgICAgICAgICogICAgciAqIHJjICsgZyAqIGdjICsgYiAqIGJjCi0gICAgICAgICAgKgotICAgICAgICAgICogIEVhY2ggY29tcG9uZW50IG9mIHdoaWNoIGlzICsvLTEvNjU1MzUgZnJvbSB0aGUgZ2FtbWFfdG9fMSB0YWJsZQotICAgICAgICAgICogIGxvb2t1cCwgcmVzdWx0aW5nIGluIGEgYmFzZSBlcnJvciBvZiArLy02LiAgVGhlIGdhbW1hX2Zyb21fMQotICAgICAgICAgICogIGNvbnZlcnNpb24gYWRkcyBhbm90aGVyICsvLTIgaW4gdGhlIDE2LWJpdCBjYXNlIGFuZAotICAgICAgICAgICogICsvLSgxPDwoMTUtUE5HX01BWF9HQU1NQV84KSkgaW4gdGhlIDgtYml0IGNhc2UuCi0gICAgICAgICAgKi8KLSMgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSAgICAgICAgICAgIGlmICh0aGF0LT50aGlzLmJpdF9kZXB0aCA8IDE2KQotICAgICAgICAgICAgICAgdGhhdC0+bWF4X2dhbW1hXzggPSBQTkdfTUFYX0dBTU1BXzg7Ci0jICAgICAgICBlbmRpZgotICAgICAgICAgdGhhdC0+cG0tPmxpbWl0ICs9IHBvdygKLSAgICAgICAgICAgICh0aGF0LT50aGlzLmJpdF9kZXB0aCA9PSAxNiB8fCB0aGF0LT5tYXhfZ2FtbWFfOCA+IDE0ID8KLSAgICAgICAgICAgICAgIDguIDoKLSAgICAgICAgICAgICAgIDYuICsgKDE8PCgxNS10aGF0LT5tYXhfZ2FtbWFfOCkpCi0gICAgICAgICAgICApLzY1NTM1LCBkYXRhLmdhbW1hKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLyogUm91bmRpbmcgdG8gOCBiaXRzIGluIHRoZSBsaW5lYXIgc3BhY2UgY2F1c2VzIG1hc3NpdmUgZXJyb3JzIHdoaWNoCi0gICAgICAgICAgKiB3aWxsIHRyaWdnZXIgdGhlIGVycm9yIGNoZWNrIGluIHRyYW5zZm9ybV9yYW5nZV9jaGVjay4gIEZpeCB0aGF0Ci0gICAgICAgICAgKiBoZXJlIGJ5IHRha2luZyB0aGUgZ2FtbWEgZW5jb2RpbmcgaW50byBhY2NvdW50LgotICAgICAgICAgICoKLSAgICAgICAgICAqIFdoZW4gRElHSVRJWkUgaXMgc2V0IGJlY2F1c2UgYSBwcmUtMS43IHZlcnNpb24gb2YgbGlicG5nIGlzIGJlaW5nCi0gICAgICAgICAgKiB0ZXN0ZWQgYWxsb3cgYSBiaWdnZXIgc2xhY2suCi0gICAgICAgICAgKgotICAgICAgICAgICogTk9URTogdGhpcyBudW1iZXIgb25seSBhZmZlY3RzIHRoZSBpbnRlcm5hbCBsaW1pdCBjaGVjayBpbiBwbmd2YWxpZCwKLSAgICAgICAgICAqIGl0IGhhcyBubyBlZmZlY3Qgb24gdGhlIGxpbWl0cyBhcHBsaWVkIHRvIHRoZSBsaWJwbmcgdmFsdWVzLgotICAgICAgICAgICovCi0gICAgICAgICB0aGF0LT5wbS0+bGltaXQgKz0gcG93KAotIyAgICAgICAgaWYgRElHSVRJWkUKLSAgICAgICAgICAgIDIuMAotIyAgICAgICAgZWxzZQotICAgICAgICAgICAgMS4wCi0jICAgICAgICBlbmRpZgotICAgICAgICAgICAgLzI1NSwgZGF0YS5nYW1tYSk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIC8qIFdpdGggbm8gZ2FtbWEgY29ycmVjdGlvbiBhIGxhcmdlIGVycm9yIGNvbWVzIGZyb20gdGhlIHRydW5jYXRpb24gb2YgdGhlCi0gICAgICAgKiBjYWxjdWxhdGlvbiBpbiB0aGUgOCBiaXQgY2FzZSwgYWxsb3cgZm9yIHRoYXQgaGVyZS4KLSAgICAgICAqLwotICAgICAgaWYgKHRoYXQtPnRoaXMuYml0X2RlcHRoICE9IDE2ICYmICFwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMpCi0gICAgICAgICB0aGF0LT5wbS0+bGltaXQgKz0gNEUtMzsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3JnYl90b19ncmF5X3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBjb25zdCBpbnQgZXJyb3JfYWN0aW9uID0gMTsgLyogbm8gZXJyb3IsIG5vIGRlZmluZXMgaW4gcG5nLmggKi8KLQotIyAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgICAgcG5nX3NldF9yZ2JfdG9fZ3JheShwcCwgZXJyb3JfYWN0aW9uLCBkYXRhLnJlZF90b19zZXQsIGRhdGEuZ3JlZW5fdG9fc2V0KTsKLSMgIGVsc2UKLSAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXlfZml4ZWQocHAsIGVycm9yX2FjdGlvbiwgZGF0YS5yZWRfdG9fc2V0LAotICAgICAgICAgZGF0YS5ncmVlbl90b19zZXQpOwotIyAgZW5kaWYKLQotIyAgaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQKLSAgICAgIGlmICh0aGF0LT5wbS0+Y3VycmVudF9lbmNvZGluZyAhPSAwKQotICAgICAgewotICAgICAgICAgLyogV2UgaGF2ZSBhbiBlbmNvZGluZyBzbyBhIGNIUk0gY2h1bmsgbWF5IGhhdmUgYmVlbiBzZXQ7IGlmIHNvIHRoZW4KLSAgICAgICAgICAqIGNoZWNrIHRoYXQgdGhlIGxpYnBuZyBBUElzIGdpdmUgdGhlIGNvcnJlY3QgKFgsWSxaKSB2YWx1ZXMgd2l0aGluCi0gICAgICAgICAgKiBzb21lIG1hcmdpbiBvZiBlcnJvciBmb3IgdGhlIHJvdW5kIHRyaXAgdGhyb3VnaCB0aGUgY2hyb21hdGljaXR5Ci0gICAgICAgICAgKiBmb3JtLgotICAgICAgICAgICovCi0jICAgICAgICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0jICAgICAgICAgICBkZWZpbmUgQVBJX2Z1bmN0aW9uIHBuZ19nZXRfY0hSTV9YWVoKLSMgICAgICAgICAgIGRlZmluZSBBUElfZm9ybSAiRlAiCi0jICAgICAgICAgICBkZWZpbmUgQVBJX3R5cGUgZG91YmxlCi0jICAgICAgICAgICBkZWZpbmUgQVBJX2N2dCh4KSAoeCkKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgIGRlZmluZSBBUElfZnVuY3Rpb24gcG5nX2dldF9jSFJNX1hZWl9maXhlZAotIyAgICAgICAgICAgZGVmaW5lIEFQSV9mb3JtICJmaXhlZCIKLSMgICAgICAgICAgIGRlZmluZSBBUElfdHlwZSBwbmdfZml4ZWRfcG9pbnQKLSMgICAgICAgICAgIGRlZmluZSBBUElfY3Z0KHgpICgoZG91YmxlKSh4KS9QTkdfRlBfMSkKLSMgICAgICAgIGVuZGlmCi0KLSAgICAgICAgIEFQSV90eXBlIHJYLCBnWCwgYlg7Ci0gICAgICAgICBBUElfdHlwZSByWSwgZ1ksIGJZOwotICAgICAgICAgQVBJX3R5cGUgclosIGdaLCBiWjsKLQotICAgICAgICAgaWYgKChBUElfZnVuY3Rpb24ocHAsIHBpLCAmclgsICZyWSwgJnJaLCAmZ1gsICZnWSwgJmdaLCAmYlgsICZiWSwgJmJaKQotICAgICAgICAgICAgICAgJiBQTkdfSU5GT19jSFJNKSAhPSAwKQotICAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIG1heGU7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICplbDsKLSAgICAgICAgICAgIGNvbG9yX2VuY29kaW5nIGUsIG87Ci0KLSAgICAgICAgICAgIC8qIEV4cGVjdCBsaWJwbmcgdG8gcmV0dXJuIGEgbm9ybWFsaXplZCByZXN1bHQsIGJ1dCB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAqIGNvbG9yIHNwYWNlIGVuY29kaW5nIG1heSBub3QgYmUgbm9ybWFsaXplZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbW9kaWZpZXJfY3VycmVudF9lbmNvZGluZyh0aGF0LT5wbSwgJm8pOwotICAgICAgICAgICAgbm9ybWFsaXplX2NvbG9yX2VuY29kaW5nKCZvKTsKLQotICAgICAgICAgICAgLyogU2FuaXR5IGNoZWNrIHRoZSBwbmd2YWxpZCBjb2RlIC0gdGhlIGNvZWZmaWNpZW50cyBzaG91bGQgbWF0Y2gKLSAgICAgICAgICAgICAqIHRoZSBub3JtYWxpemVkIFkgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyB1bmxlc3MgdGhleSB3ZXJlCi0gICAgICAgICAgICAgKiBvdmVycmlkZGVuLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoZGF0YS5yZWRfdG9fc2V0ID09IC0xICYmIGRhdGEuZ3JlZW5fdG9fc2V0ID09IC0xICYmCi0gICAgICAgICAgICAgICAoZmFicyhvLnJlZC5ZIC0gZGF0YS5yZWRfY29lZmZpY2llbnQpID4gREJMX0VQU0lMT04gfHwKLSAgICAgICAgICAgICAgIGZhYnMoby5ncmVlbi5ZIC0gZGF0YS5ncmVlbl9jb2VmZmljaWVudCkgPiBEQkxfRVBTSUxPTiB8fAotICAgICAgICAgICAgICAgZmFicyhvLmJsdWUuWSAtIGRhdGEuYmx1ZV9jb2VmZmljaWVudCkgPiBEQkxfRVBTSUxPTikpCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IocHAsICJpbnRlcm5hbCBwbmd2YWxpZCBjSFJNIGNvZWZmaWNpZW50IGVycm9yIik7Ci0KLSAgICAgICAgICAgIC8qIEdlbmVyYXRlIGEgY29sb3VyIHNwYWNlIGVuY29kaW5nLiAqLwotICAgICAgICAgICAgZS5nYW1tYSA9IG8uZ2FtbWE7IC8qIG5vdCB1c2VkICovCi0gICAgICAgICAgICBlLnJlZC5YID0gQVBJX2N2dChyWCk7Ci0gICAgICAgICAgICBlLnJlZC5ZID0gQVBJX2N2dChyWSk7Ci0gICAgICAgICAgICBlLnJlZC5aID0gQVBJX2N2dChyWik7Ci0gICAgICAgICAgICBlLmdyZWVuLlggPSBBUElfY3Z0KGdYKTsKLSAgICAgICAgICAgIGUuZ3JlZW4uWSA9IEFQSV9jdnQoZ1kpOwotICAgICAgICAgICAgZS5ncmVlbi5aID0gQVBJX2N2dChnWik7Ci0gICAgICAgICAgICBlLmJsdWUuWCA9IEFQSV9jdnQoYlgpOwotICAgICAgICAgICAgZS5ibHVlLlkgPSBBUElfY3Z0KGJZKTsKLSAgICAgICAgICAgIGUuYmx1ZS5aID0gQVBJX2N2dChiWik7Ci0KLSAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBvcmlnaW5hbCBvbmUgZnJvbSB0aGUgcG5nX21vZGlmaWVyLCB3aXRoaW4KLSAgICAgICAgICAgICAqIHRoZSByYW5nZSBwZXJtaXR0ZWQgYnkgdGhlIGxpYnBuZyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbWF4ZSA9IDA7Ci0gICAgICAgICAgICBlbCA9ICItIjsgLyogU2V0IHRvIGVsZW1lbnQgbmFtZSB3aXRoIGVycm9yICovCi0KLSMgICAgICAgICAgIGRlZmluZSBDSEVDSyhjb2wseClcCi0gICAgICAgICAgICB7XAotICAgICAgICAgICAgICAgZG91YmxlIGVyciA9IGZhYnMoby5jb2wueCAtIGUuY29sLngpO1wKLSAgICAgICAgICAgICAgIGlmIChlcnIgPiBtYXhlKVwKLSAgICAgICAgICAgICAgIHtcCi0gICAgICAgICAgICAgICAgICBtYXhlID0gZXJyO1wKLSAgICAgICAgICAgICAgICAgIGVsID0gI2NvbCAiKCIgI3ggIikiO1wKLSAgICAgICAgICAgICAgIH1cCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKHJlZCxYKQotICAgICAgICAgICAgQ0hFQ0socmVkLFkpCi0gICAgICAgICAgICBDSEVDSyhyZWQsWikKLSAgICAgICAgICAgIENIRUNLKGdyZWVuLFgpCi0gICAgICAgICAgICBDSEVDSyhncmVlbixZKQotICAgICAgICAgICAgQ0hFQ0soZ3JlZW4sWikKLSAgICAgICAgICAgIENIRUNLKGJsdWUsWCkKLSAgICAgICAgICAgIENIRUNLKGJsdWUsWSkKLSAgICAgICAgICAgIENIRUNLKGJsdWUsWikKLQotICAgICAgICAgICAgLyogSGVyZSBpbiBib3RoIGZpeGVkIGFuZCBmbG9hdGluZyBjYXNlcyB0byBjaGVjayB0aGUgdmFsdWVzIHJlYWQKLSAgICAgICAgICAgICAqIGZyb20gdGhlIGNIUm0gY2h1bmsuICBQTkcgdXNlcyBmaXhlZCBwb2ludCBpbiB0aGUgY0hSTSBjaHVuaywgc28KLSAgICAgICAgICAgICAqIHdlIGNhbid0IGV4cGVjdCBiZXR0ZXIgdGhhbiArLy0uNUUtNSBvbiB0aGUgcmVzdWx0LCBhbGxvdyAxRS01LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobWF4ZSA+PSAxRS01KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2l6ZV90IHBvcyA9IDA7Ci0gICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwotCi0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCBBUElfZm9ybSk7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAiIGNIUk0gIik7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCBlbCk7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAiIGVycm9yOiAiKTsKLSAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCBtYXhlLCA3KTsKLSAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBwb3MsICIgIik7Ci0gICAgICAgICAgICAgICAvKiBQcmludCB0aGUgY29sb3Igc3BhY2Ugd2l0aG91dCB0aGUgZ2FtbWEgdmFsdWU6ICovCi0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0X2NvbG9yX2VuY29kaW5nKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAmbywgMCk7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAiIC0+ICIpOwotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdF9jb2xvcl9lbmNvZGluZyhidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgJmUsIDApOwotCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IocHAsIGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0jICBlbmRpZiAvKiBSRUFEX2NIUk0gKi8KLQotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9yZ2JfdG9fZ3JheV9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICgodGhhdC0+Y29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgIT0gMCkKLSAgIHsKLSAgICAgIGRvdWJsZSBncmF5LCBlcnI7Ci0KLSMgICAgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSAgICAgICAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICAgICAgaW1hZ2VfcGl4ZWxfY29udmVydF9QTFRFKHRoYXQpOwotIyAgICAgZW5kaWYKLQotICAgICAgLyogSW1hZ2Ugbm93IGhhcyBSR0IgY2hhbm5lbHMuLi4gKi8KLSMgIGlmIERJR0lUSVpFCi0gICAgICB7Ci0gICAgICAgICBwbmdfbW9kaWZpZXIgKnBtID0gZGlzcGxheS0+cG07Ci0gICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2FtcGxlX2RlcHRoID0gdGhhdC0+c2FtcGxlX2RlcHRoOwotICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGNhbGNfZGVwdGggPSAocG0tPmFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zID8gMTYgOgotICAgICAgICAgICAgc2FtcGxlX2RlcHRoKTsKLSAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBnYW1tYV9kZXB0aCA9Ci0gICAgICAgICAgICAoc2FtcGxlX2RlcHRoID09IDE2ID8KLSAgICAgICAgICAgICAgIGRpc3BsYXktPm1heF9nYW1tYV84IDoKLSAgICAgICAgICAgICAgIChwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgPwotICAgICAgICAgICAgICAgICAgZGlzcGxheS0+bWF4X2dhbW1hXzggOgotICAgICAgICAgICAgICAgICAgc2FtcGxlX2RlcHRoKSk7Ci0gICAgICAgICBpbnQgaXNncmF5OwotICAgICAgICAgZG91YmxlIHIsIGcsIGI7Ci0gICAgICAgICBkb3VibGUgcmxvLCByaGksIGdsbywgZ2hpLCBibG8sIGJoaSwgZ3JheWxvLCBncmF5aGk7Ci0KLSAgICAgICAgIC8qIERvIHRoaXMgdXNpbmcgaW50ZXJ2YWwgYXJpdGhtZXRpYywgb3RoZXJ3aXNlIGl0IGlzIHRvbyBkaWZmaWN1bHQgdG8KLSAgICAgICAgICAqIGhhbmRsZSB0aGUgZXJyb3JzIGNvcnJlY3RseS4KLSAgICAgICAgICAqCi0gICAgICAgICAgKiBUbyBoYW5kbGUgdGhlIGdhbW1hIGNvcnJlY3Rpb24gd29yayBvdXQgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMKLSAgICAgICAgICAqIG9mIHRoZSBkaWdpdGl6ZWQgdmFsdWUuICBBc3N1bWUgcm91bmRpbmcgaGVyZSAtIG5vcm1hbGx5IHRoZSB2YWx1ZXMKLSAgICAgICAgICAqIHdpbGwgYmUgaWRlbnRpY2FsIGFmdGVyIHRoaXMgb3BlcmF0aW9uIGlmIHRoZXJlIGlzIG9ubHkgb25lCi0gICAgICAgICAgKiB0cmFuc2Zvcm0sIGZlZWwgZnJlZSB0byBkZWxldGUgdGhlIHBuZ19lcnJvciBjaGVja3Mgb24gdGhpcyBiZWxvdyBpbgotICAgICAgICAgICogdGhlIGZ1dHVyZSAodGhpcyBpcyBqdXN0IG1lIHRyeWluZyB0byBlbnN1cmUgaXQgd29ya3MhKQotICAgICAgICAgICoKLSAgICAgICAgICAqIEludGVydmFsIGFyaXRobWV0aWMgaXMgZXhhY3QsIGJ1dCB0byBpbXBsZW1lbnQgaXQgaXQgbXVzdCBiZQotICAgICAgICAgICogcG9zc2libGUgdG8gY29udHJvbCB0aGUgZmxvYXRpbmcgcG9pbnQgaW1wbGVtZW50YXRpb24gcm91bmRpbmcgbW9kZS4KLSAgICAgICAgICAqIFRoaXMgY2Fubm90IGJlIGRvbmUgaW4gQU5TSS1DLCBzbyBpbnN0ZWFkIEkgcmVkdWNlIHRoZSAnbG8nIHZhbHVlcwotICAgICAgICAgICogYnkgREJMX0VQU0lMT04gYW5kIGluY3JlYXNlIHRoZSAnaGknIHZhbHVlcyBieSB0aGUgc2FtZS4KLSAgICAgICAgICAqLwotIyAgICAgICAgZGVmaW5lIEREKHYsZCxyKSAoZGlnaXRpemUodiooMS1EQkxfRVBTSUxPTiksIGQsIHIpICogKDEtREJMX0VQU0lMT04pKQotIyAgICAgICAgZGVmaW5lIERVKHYsZCxyKSAoZGlnaXRpemUodiooMStEQkxfRVBTSUxPTiksIGQsIHIpICogKDErREJMX0VQU0lMT04pKQotCi0gICAgICAgICByID0gcmxvID0gcmhpID0gdGhhdC0+cmVkZjsKLSAgICAgICAgIHJsbyAtPSB0aGF0LT5yZWRlOwotICAgICAgICAgcmxvID0gREQocmxvLCBjYWxjX2RlcHRoLCAxLypyb3VuZCovKTsKLSAgICAgICAgIHJoaSArPSB0aGF0LT5yZWRlOwotICAgICAgICAgcmhpID0gRFUocmhpLCBjYWxjX2RlcHRoLCAxLypyb3VuZCovKTsKLQotICAgICAgICAgZyA9IGdsbyA9IGdoaSA9IHRoYXQtPmdyZWVuZjsKLSAgICAgICAgIGdsbyAtPSB0aGF0LT5ncmVlbmU7Ci0gICAgICAgICBnbG8gPSBERChnbG8sIGNhbGNfZGVwdGgsIDEvKnJvdW5kKi8pOwotICAgICAgICAgZ2hpICs9IHRoYXQtPmdyZWVuZTsKLSAgICAgICAgIGdoaSA9IERVKGdoaSwgY2FsY19kZXB0aCwgMS8qcm91bmQqLyk7Ci0KLSAgICAgICAgIGIgPSBibG8gPSBiaGkgPSB0aGF0LT5ibHVlZjsKLSAgICAgICAgIGJsbyAtPSB0aGF0LT5ibHVlZTsKLSAgICAgICAgIGJsbyA9IEREKGJsbywgY2FsY19kZXB0aCwgMS8qcm91bmQqLyk7Ci0gICAgICAgICBiaGkgKz0gdGhhdC0+Ymx1ZWU7Ci0gICAgICAgICBiaGkgPSBEVShiaGksIGNhbGNfZGVwdGgsIDEvKnJvdW5kKi8pOwotCi0gICAgICAgICBpc2dyYXkgPSByPT1nICYmIGc9PWI7Ci0KLSAgICAgICAgIGlmIChkYXRhLmdhbW1hICE9IDEpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBkb3VibGUgcG93ZXIgPSAxL2RhdGEuZ2FtbWE7Ci0gICAgICAgICAgICBjb25zdCBkb3VibGUgYWJzZSA9IC41LyhzYW1wbGVfZGVwdGggPT0gMTYgPyA2NTUzNSA6IDI1NSk7Ci0KLSAgICAgICAgICAgIC8qIElmIGEgZ2FtbWEgY2FsY3VsYXRpb24gaXMgZG9uZSBpdCBpcyBkb25lIHVzaW5nIGxvb2t1cCB0YWJsZXMgb2YKLSAgICAgICAgICAgICAqIHByZWNpc2lvbiBnYW1tYV9kZXB0aCwgc28gdGhlIGFscmVhZHkgZGlnaXRpemVkIHZhbHVlIGFib3ZlIG1heQotICAgICAgICAgICAgICogbmVlZCB0byBiZSBmdXJ0aGVyIGRpZ2l0aXplZCBoZXJlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoZ2FtbWFfZGVwdGggIT0gY2FsY19kZXB0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJsbyA9IEREKHJsbywgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOwotICAgICAgICAgICAgICAgcmhpID0gRFUocmhpLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7Ci0gICAgICAgICAgICAgICBnbG8gPSBERChnbG8sIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKLSAgICAgICAgICAgICAgIGdoaSA9IERVKGdoaSwgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOwotICAgICAgICAgICAgICAgYmxvID0gREQoYmxvLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7Ci0gICAgICAgICAgICAgICBiaGkgPSBEVShiaGksIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogJ2Fic2UnIGlzIHRoZSBlcnJvciBpbiB0aGUgZ2FtbWEgdGFibGUgY2FsY3VsYXRpb24gaXRzZWxmLiAqLwotICAgICAgICAgICAgciA9IHBvdyhyLCBwb3dlcik7Ci0gICAgICAgICAgICBybG8gPSBERChwb3cocmxvLCBwb3dlciktYWJzZSwgY2FsY19kZXB0aCwgMSk7Ci0gICAgICAgICAgICByaGkgPSBEVShwb3cocmhpLCBwb3dlcikrYWJzZSwgY2FsY19kZXB0aCwgMSk7Ci0KLSAgICAgICAgICAgIGcgPSBwb3coZywgcG93ZXIpOwotICAgICAgICAgICAgZ2xvID0gREQocG93KGdsbywgcG93ZXIpLWFic2UsIGNhbGNfZGVwdGgsIDEpOwotICAgICAgICAgICAgZ2hpID0gRFUocG93KGdoaSwgcG93ZXIpK2Fic2UsIGNhbGNfZGVwdGgsIDEpOwotCi0gICAgICAgICAgICBiID0gcG93KGIsIHBvd2VyKTsKLSAgICAgICAgICAgIGJsbyA9IEREKHBvdyhibG8sIHBvd2VyKS1hYnNlLCBjYWxjX2RlcHRoLCAxKTsKLSAgICAgICAgICAgIGJoaSA9IERVKHBvdyhiaGksIHBvd2VyKSthYnNlLCBjYWxjX2RlcHRoLCAxKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogTm93IGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGdyYXkgdmFsdWVzLiAgQWx0aG91Z2ggdGhlIGVycm9yIGluIHRoZQotICAgICAgICAgICogY29lZmZpY2llbnRzIGRlcGVuZHMgb24gd2hldGhlciB0aGV5IHdlcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCi0gICAgICAgICAgKiBsaW5lIChpbiB3aGljaCBjYXNlIHRydW5jYXRpb24gdG8gMTUgYml0cyBoYXBwZW5lZCkgb3Igbm90IChyb3VuZGluZwotICAgICAgICAgICogd2FzIHVzZWQpIHRoZSBtYXhpdW0gZXJyb3IgaW4gYW4gaW5kaXZpZHVhbCBjb2VmZmljaWVudCBpcyBhbHdheXMKLSAgICAgICAgICAqIDIvMzI3NjgsIGJlY2F1c2UgZXZlbiBpbiB0aGUgcm91bmRpbmcgY2FzZSB0aGUgcmVxdWlyZW1lbnQgdGhhdAotICAgICAgICAgICogY29lZmZpY2llbnRzIGFkZCB1cCB0byAzMjc2OCBjYW4gY2F1c2UgYSBsYXJnZXIgcm91bmRpbmcgZXJyb3IuCi0gICAgICAgICAgKgotICAgICAgICAgICogVGhlIG9ubHkgdGltZSB3aGVuIHJvdW5kaW5nIGRvZXNuJ3Qgb2NjdXIgaW4gMS41LjUgYW5kIGxhdGVyIGlzIHdoZW4KLSAgICAgICAgICAqIHRoZSBub24tZ2FtbWEgY29kZSBwYXRoIGlzIHVzZWQgZm9yIGxlc3MgdGhhbiAxNiBiaXQgZGF0YS4KLSAgICAgICAgICAqLwotICAgICAgICAgZ3JheSA9IHIgKiBkYXRhLnJlZF9jb2VmZmljaWVudCArIGcgKiBkYXRhLmdyZWVuX2NvZWZmaWNpZW50ICsKLSAgICAgICAgICAgIGIgKiBkYXRhLmJsdWVfY29lZmZpY2llbnQ7Ci0KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBkb19yb3VuZCA9IGRhdGEuZ2FtbWEgIT0gMSB8fCBjYWxjX2RlcHRoID09IDE2OwotICAgICAgICAgICAgY29uc3QgZG91YmxlIGNlID0gMi4gLyAzMjc2ODsKLQotICAgICAgICAgICAgZ3JheWxvID0gREQocmxvICogKGRhdGEucmVkX2NvZWZmaWNpZW50LWNlKSArCi0gICAgICAgICAgICAgICBnbG8gKiAoZGF0YS5ncmVlbl9jb2VmZmljaWVudC1jZSkgKwotICAgICAgICAgICAgICAgYmxvICogKGRhdGEuYmx1ZV9jb2VmZmljaWVudC1jZSksIGNhbGNfZGVwdGgsIGRvX3JvdW5kKTsKLSAgICAgICAgICAgIGlmIChncmF5bG8gPiBncmF5KSAvKiBhbHdheXMgYWNjZXB0IHRoZSByaWdodCBhbnN3ZXIgKi8KLSAgICAgICAgICAgICAgIGdyYXlsbyA9IGdyYXk7Ci0KLSAgICAgICAgICAgIGdyYXloaSA9IERVKHJoaSAqIChkYXRhLnJlZF9jb2VmZmljaWVudCtjZSkgKwotICAgICAgICAgICAgICAgZ2hpICogKGRhdGEuZ3JlZW5fY29lZmZpY2llbnQrY2UpICsKLSAgICAgICAgICAgICAgIGJoaSAqIChkYXRhLmJsdWVfY29lZmZpY2llbnQrY2UpLCBjYWxjX2RlcHRoLCBkb19yb3VuZCk7Ci0gICAgICAgICAgICBpZiAoZ3JheWhpIDwgZ3JheSkKLSAgICAgICAgICAgICAgIGdyYXloaSA9IGdyYXk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIEFuZCBpbnZlcnQgdGhlIGdhbW1hLiAqLwotICAgICAgICAgaWYgKGRhdGEuZ2FtbWEgIT0gMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwb3dlciA9IGRhdGEuZ2FtbWE7Ci0KLSAgICAgICAgICAgIC8qIEFuZCB0aGlzIGhhcHBlbnMgeWV0IGFnYWluLCBzaGlmdGluZyB0aGUgdmFsdWVzIG9uY2UgbW9yZS4gKi8KLSAgICAgICAgICAgIGlmIChnYW1tYV9kZXB0aCAhPSBzYW1wbGVfZGVwdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBybG8gPSBERChybG8sIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKLSAgICAgICAgICAgICAgIHJoaSA9IERVKHJoaSwgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOwotICAgICAgICAgICAgICAgZ2xvID0gREQoZ2xvLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7Ci0gICAgICAgICAgICAgICBnaGkgPSBEVShnaGksIGdhbW1hX2RlcHRoLCAwLyp0cnVuY2F0ZSovKTsKLSAgICAgICAgICAgICAgIGJsbyA9IEREKGJsbywgZ2FtbWFfZGVwdGgsIDAvKnRydW5jYXRlKi8pOwotICAgICAgICAgICAgICAgYmhpID0gRFUoYmhpLCBnYW1tYV9kZXB0aCwgMC8qdHJ1bmNhdGUqLyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGdyYXkgPSBwb3coZ3JheSwgcG93ZXIpOwotICAgICAgICAgICAgZ3JheWxvID0gREQocG93KGdyYXlsbywgcG93ZXIpLCBzYW1wbGVfZGVwdGgsIDEpOwotICAgICAgICAgICAgZ3JheWhpID0gRFUocG93KGdyYXloaSwgcG93ZXIpLCBzYW1wbGVfZGVwdGgsIDEpOwotICAgICAgICAgfQotCi0jICAgICAgICB1bmRlZiBERAotIyAgICAgICAgdW5kZWYgRFUKLQotICAgICAgICAgLyogTm93IHRoZSBlcnJvciBjYW4gYmUgY2FsY3VsYXRlZC4KLSAgICAgICAgICAqCi0gICAgICAgICAgKiBJZiByPT1nPT1iIGJlY2F1c2UgdGhlcmUgaXMgbm8gb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIGxpYnBuZwotICAgICAgICAgICogY3VycmVudGx5IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgdmFsdWUuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChpc2dyYXkpCi0gICAgICAgICAgICBlcnIgPSAodGhhdC0+cmVkZSArIHRoYXQtPmdyZWVuZSArIHRoYXQtPmJsdWVlKS8zOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBmYWJzKGdyYXloaS1ncmF5KTsKLQotICAgICAgICAgICAgaWYgKGZhYnMoZ3JheSAtIGdyYXlsbykgPiBlcnIpCi0gICAgICAgICAgICAgICBlcnIgPSBmYWJzKGdyYXlsby1ncmF5KTsKLQotI2lmICFSRUxFQVNFX0JVSUxECi0gICAgICAgICAgICAvKiBDaGVjayB0aGF0IHRoaXMgd29ya2VkOiAqLwotICAgICAgICAgICAgaWYgKGVyciA+IHBtLT5saW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNpemVfdCBwb3MgPSAwOwotICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKLQotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgInJnYl90b19ncmF5IGVycm9yICIpOwotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBwb3MsIGVyciwgNik7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAiIGV4Y2VlZHMgbGltaXQgIik7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgcG0tPmxpbWl0LCA2KTsKLSAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBwLCBidWZmZXIpOwotICAgICAgICAgICAgICAgcG0tPmxpbWl0ID0gZXJyOwotICAgICAgICAgICAgfQotI2VuZGlmIC8qICFSRUxFQVNFX0JVSUxEICovCi0gICAgICAgICB9Ci0gICAgICB9Ci0jICBlbHNlICAvKiAhRElHSVRJWkUgKi8KLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSByID0gdGhhdC0+cmVkZjsKLSAgICAgICAgIGRvdWJsZSByZSA9IHRoYXQtPnJlZGU7Ci0gICAgICAgICBkb3VibGUgZyA9IHRoYXQtPmdyZWVuZjsKLSAgICAgICAgIGRvdWJsZSBnZSA9IHRoYXQtPmdyZWVuZTsKLSAgICAgICAgIGRvdWJsZSBiID0gdGhhdC0+Ymx1ZWY7Ci0gICAgICAgICBkb3VibGUgYmUgPSB0aGF0LT5ibHVlZTsKLQotIyAgICAgICAgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAotICAgICAgICAgICAgLyogVGhlIHRydWUgZ3JheSBjYXNlIGludm9sdmVzIG5vIG1hdGggaW4gZWFybGllciB2ZXJzaW9ucyAobm90Ci0gICAgICAgICAgICAgKiB0cnVlLCB0aGVyZSB3YXMgc29tZSBpZiBnYW1tYSBjb3JyZWN0aW9uIHdhcyBoYXBwZW5pbmcgdG9vLikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHIgPT0gZyAmJiByID09IGIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBncmF5ID0gcjsKLSAgICAgICAgICAgICAgIGVyciA9IHJlOwotICAgICAgICAgICAgICAgaWYgKGVyciA8IGdlKSBlcnIgPSBnZTsKLSAgICAgICAgICAgICAgIGlmIChlcnIgPCBiZSkgZXJyID0gYmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSMgICAgICAgIGVuZGlmIC8qIGJlZm9yZSAxLjcgKi8KLSAgICAgICAgIGlmIChkYXRhLmdhbW1hID09IDEpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGVyZSBpcyBubyBuZWVkIHRvIGRvIHRoZSBjb252ZXJzaW9ucyB0byBhbmQgZnJvbSBsaW5lYXIgc3BhY2UsCi0gICAgICAgICAgICAgKiBzbyB0aGUgY2FsY3VsYXRpb24gc2hvdWxkIGJlIGEgbG90IG1vcmUgYWNjdXJhdGUuICBUaGVyZSBpcyBhCi0gICAgICAgICAgICAgKiBidWlsdCBpbiBlcnJvciBpbiB0aGUgY29lZmZpY2llbnRzIGJlY2F1c2UgdGhleSBvbmx5IGhhdmUgMTUgYml0cwotICAgICAgICAgICAgICogYW5kIGFyZSBhZGp1c3RlZCB0byBtYWtlIHN1cmUgdGhleSBhZGQgdXAgdG8gMzI3NjguICBUaGlzCi0gICAgICAgICAgICAgKiBpbnZvbHZlcyBhIGludGVnZXIgY2FsY3VsYXRpb24gd2l0aCB0cnVuY2F0aW9uIG9mIHRoZSBmb3JtOgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAgICAoKGludCkoY29lZmZpY2llbnQgKiAxMDAwMDApICogMzI3NjgpLzEwMDAwMAotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFRoaXMgaXMgZG9uZSB0byB0aGUgcmVkIGFuZCBncmVlbiBjb2VmZmljaWVudHMgKHRoZSBvbmVzCi0gICAgICAgICAgICAgKiBwcm92aWRlZCB0byB0aGUgQVBJKSB0aGVuIGJsdWUgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZW0gc28gdGhlCi0gICAgICAgICAgICAgKiByZXN1bHQgYWRkcyB1cCB0byAzMjc2OC4gIEluIHRoZSB3b3JzdCBjYXNlIHRoaXMgY2FuIHJlc3VsdCBpbgotICAgICAgICAgICAgICogYSAtMSBlcnJvciBpbiByZWQgYW5kIGdyZWVuIGFuZCBhICsyIGVycm9yIGluIGJsdWUuICBDb25zZXF1ZW50bHkKLSAgICAgICAgICAgICAqIHRoZSB3b3JzdCBjYXNlIGluIHRoZSBjYWxjdWxhdGlvbiBiZWxvdyBpcyAyLzMyNzY4IGVycm9yLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFRPRE86IGNvbnNpZGVyIGZpeGluZyB0aGlzIGluIGxpYnBuZyBieSByb3VuZGluZyB0aGUgY2FsY3VsYXRpb24KLSAgICAgICAgICAgICAqIGxpbWl0aW5nIHRoZSBlcnJvciB0byAxLzMyNzY4LgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEhhbmRsaW5nIHRoaXMgYnkgYWRkaW5nIDIvMzI3NjggaGVyZSBhdm9pZHMgbmVlZGluZyB0byBpbmNyZWFzZQotICAgICAgICAgICAgICogdGhlIGdsb2JhbCBlcnJvciBsaW1pdHMgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudC4pCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGdyYXkgPSByICogZGF0YS5yZWRfY29lZmZpY2llbnQgKyBnICogZGF0YS5ncmVlbl9jb2VmZmljaWVudCArCi0gICAgICAgICAgICAgICBiICogZGF0YS5ibHVlX2NvZWZmaWNpZW50OwotICAgICAgICAgICAgZXJyID0gcmUgKiBkYXRhLnJlZF9jb2VmZmljaWVudCArIGdlICogZGF0YS5ncmVlbl9jb2VmZmljaWVudCArCi0gICAgICAgICAgICAgICBiZSAqIGRhdGEuYmx1ZV9jb2VmZmljaWVudCArIDIuLzMyNzY4ICsgZ3JheSAqIDUgKiBEQkxfRVBTSUxPTjsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIGNhbGN1bGF0aW9uIGhhcHBlbnMgaW4gbGluZWFyIHNwYWNlLCBhbmQgdGhpcyBwcm9kdWNlcyBtdWNoCi0gICAgICAgICAgICAgKiB3aWRlciBlcnJvcnMgaW4gdGhlIGVuY29kZWQgc3BhY2UuICBUaGVzZSBhcmUgaGFuZGxlZCBoZXJlIGJ5Ci0gICAgICAgICAgICAgKiBmYWN0b3JpbmcgdGhlIGVycm9ycyBpbiB0byB0aGUgY2FsY3VsYXRpb24uICBUaGVyZSBhcmUgdHdvIHRhYmxlCi0gICAgICAgICAgICAgKiBsb29rdXBzIGluIHRoZSBjYWxjdWxhdGlvbiBhbmQgZWFjaCBpbnRyb2R1Y2VzIGEgcXVhbnRpemF0aW9uCi0gICAgICAgICAgICAgKiBlcnJvciBkZWZpbmVkIGJ5IHRoZSB0YWJsZSBzaXplLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwbmdfbW9kaWZpZXIgKnBtID0gZGlzcGxheS0+cG07Ci0gICAgICAgICAgICBkb3VibGUgaW5fcWUgPSAodGhhdC0+c2FtcGxlX2RlcHRoID4gOCA/IC41LzY1NTM1IDogLjUvMjU1KTsKLSAgICAgICAgICAgIGRvdWJsZSBvdXRfcWUgPSAodGhhdC0+c2FtcGxlX2RlcHRoID4gOCA/IC41LzY1NTM1IDoKLSAgICAgICAgICAgICAgIChwbS0+YXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgPyAuNS8oMTw8ZGlzcGxheS0+bWF4X2dhbW1hXzgpIDoKLSAgICAgICAgICAgICAgIC41LzI1NSkpOwotICAgICAgICAgICAgZG91YmxlIHJoaSwgZ2hpLCBiaGksIGdyYXloaTsKLSAgICAgICAgICAgIGRvdWJsZSBnMSA9IDEvZGF0YS5nYW1tYTsKLQotICAgICAgICAgICAgcmhpID0gciArIHJlICsgaW5fcWU7IGlmIChyaGkgPiAxKSByaGkgPSAxOwotICAgICAgICAgICAgciAtPSByZSArIGluX3FlOyBpZiAociA8IDApIHIgPSAwOwotICAgICAgICAgICAgZ2hpID0gZyArIGdlICsgaW5fcWU7IGlmIChnaGkgPiAxKSBnaGkgPSAxOwotICAgICAgICAgICAgZyAtPSBnZSArIGluX3FlOyBpZiAoZyA8IDApIGcgPSAwOwotICAgICAgICAgICAgYmhpID0gYiArIGJlICsgaW5fcWU7IGlmIChiaGkgPiAxKSBiaGkgPSAxOwotICAgICAgICAgICAgYiAtPSBiZSArIGluX3FlOyBpZiAoYiA8IDApIGIgPSAwOwotCi0gICAgICAgICAgICByID0gcG93KHIsIGcxKSooMS1EQkxfRVBTSUxPTik7IHJoaSA9IHBvdyhyaGksIGcxKSooMStEQkxfRVBTSUxPTik7Ci0gICAgICAgICAgICBnID0gcG93KGcsIGcxKSooMS1EQkxfRVBTSUxPTik7IGdoaSA9IHBvdyhnaGksIGcxKSooMStEQkxfRVBTSUxPTik7Ci0gICAgICAgICAgICBiID0gcG93KGIsIGcxKSooMS1EQkxfRVBTSUxPTik7IGJoaSA9IHBvdyhiaGksIGcxKSooMStEQkxfRVBTSUxPTik7Ci0KLSAgICAgICAgICAgIC8qIFdvcmsgb3V0IHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmRzIGZvciB0aGUgZ3JheSB2YWx1ZSBpbiB0aGUKLSAgICAgICAgICAgICAqIGVuY29kZWQgc3BhY2UsIHRoZW4gd29yayBvdXQgYW4gYXZlcmFnZSBhbmQgZXJyb3IuICBSZW1vdmUgdGhlCi0gICAgICAgICAgICAgKiBwcmV2aW91c2x5IGFkZGVkIGlucHV0IHF1YW50aXphdGlvbiBlcnJvciBhdCB0aGlzIHBvaW50LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBncmF5ID0gciAqIGRhdGEucmVkX2NvZWZmaWNpZW50ICsgZyAqIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQgKwotICAgICAgICAgICAgICAgYiAqIGRhdGEuYmx1ZV9jb2VmZmljaWVudCAtIDIuLzMyNzY4IC0gb3V0X3FlOwotICAgICAgICAgICAgaWYgKGdyYXkgPD0gMCkKLSAgICAgICAgICAgICAgIGdyYXkgPSAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZ3JheSAqPSAoMSAtIDYgKiBEQkxfRVBTSUxPTik7Ci0gICAgICAgICAgICAgICBncmF5ID0gcG93KGdyYXksIGRhdGEuZ2FtbWEpICogKDEtREJMX0VQU0lMT04pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBncmF5aGkgPSByaGkgKiBkYXRhLnJlZF9jb2VmZmljaWVudCArIGdoaSAqIGRhdGEuZ3JlZW5fY29lZmZpY2llbnQgKwotICAgICAgICAgICAgICAgYmhpICogZGF0YS5ibHVlX2NvZWZmaWNpZW50ICsgMi4vMzI3NjggKyBvdXRfcWU7Ci0gICAgICAgICAgICBncmF5aGkgKj0gKDEgKyA2ICogREJMX0VQU0lMT04pOwotICAgICAgICAgICAgaWYgKGdyYXloaSA+PSAxKQotICAgICAgICAgICAgICAgZ3JheWhpID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGdyYXloaSA9IHBvdyhncmF5aGksIGRhdGEuZ2FtbWEpICogKDErREJMX0VQU0lMT04pOwotCi0gICAgICAgICAgICBlcnIgPSAoZ3JheWhpIC0gZ3JheSkgLyAyOwotICAgICAgICAgICAgZ3JheSA9IChncmF5aGkgKyBncmF5KSAvIDI7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPD0gaW5fcWUpCi0gICAgICAgICAgICAgICBlcnIgPSBncmF5ICogREJMX0VQU0lMT047Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGVyciAtPSBpbl9xZTsKLQotI2lmICFSRUxFQVNFX0JVSUxECi0gICAgICAgICAgICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSBlcnJvciBpcyB3aXRoaW4gbGltaXRzICh0aGlzIGhhcyBjYXVzZWQKLSAgICAgICAgICAgICAqIHByb2JsZW1zIGJlZm9yZSwgaXQncyBtdWNoIGVhc2llciB0byBkZXRlY3QgdGhlbSBoZXJlLikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGVyciA+IHBtLT5saW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNpemVfdCBwb3MgPSAwOwotICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMTI4XTsKLQotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgInJnYl90b19ncmF5IGVycm9yICIpOwotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBwb3MsIGVyciwgNik7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgcG9zLCAiIGV4Y2VlZHMgbGltaXQgIik7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChidWZmZXIsIHNpemVvZiBidWZmZXIsIHBvcywgcG0tPmxpbWl0LCA2KTsKLSAgICAgICAgICAgICAgIHBuZ193YXJuaW5nKHBwLCBidWZmZXIpOwotICAgICAgICAgICAgICAgcG0tPmxpbWl0ID0gZXJyOwotICAgICAgICAgICAgfQotI2VuZGlmIC8qICFSRUxFQVNFX0JVSUxEICovCi0gICAgICAgICB9Ci0gICAgICB9Ci0jICBlbmRpZiAvKiAhRElHSVRJWkUgKi8KLQotICAgICAgdGhhdC0+Ymx1ZWYgPSB0aGF0LT5ncmVlbmYgPSB0aGF0LT5yZWRmID0gZ3JheTsKLSAgICAgIHRoYXQtPmJsdWVlID0gdGhhdC0+Z3JlZW5lID0gdGhhdC0+cmVkZSA9IGVycjsKLQotICAgICAgLyogVGhlIHNCSVQgaXMgdGhlIG1pbml1bSBvZiB0aGUgdGhyZWUgY29sb3VyIGNoYW5uZWwgc0JJVHMuICovCi0gICAgICBpZiAodGhhdC0+cmVkX3NCSVQgPiB0aGF0LT5ncmVlbl9zQklUKQotICAgICAgICAgdGhhdC0+cmVkX3NCSVQgPSB0aGF0LT5ncmVlbl9zQklUOwotICAgICAgaWYgKHRoYXQtPnJlZF9zQklUID4gdGhhdC0+Ymx1ZV9zQklUKQotICAgICAgICAgdGhhdC0+cmVkX3NCSVQgPSB0aGF0LT5ibHVlX3NCSVQ7Ci0gICAgICB0aGF0LT5ibHVlX3NCSVQgPSB0aGF0LT5ncmVlbl9zQklUID0gdGhhdC0+cmVkX3NCSVQ7Ci0KLSAgICAgIC8qIEFuZCByZW1vdmUgdGhlIGNvbG91ciBiaXQgaW4gdGhlIHR5cGU6ICovCi0gICAgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgICAgdGhhdC0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOwotICAgICAgZWxzZSBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgICAgdGhhdC0+Y29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOwotICAgfQotCi0gICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOwotfQotCi1zdGF0aWMgaW50Ci1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9yZ2JfdG9fZ3JheV9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICBVTlVTRUQoYml0X2RlcHRoKQotCi0gICB0aGlzLT5uZXh0ID0gKnRoYXQ7Ci0gICAqdGhhdCA9IHRoaXM7Ci0KLSAgIHJldHVybiAoY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikgIT0gMDsKLX0KLQotI3VuZGVmIGRhdGEKLUlUKHJnYl90b19ncmF5KTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChyZ2JfdG9fZ3JheSkKLSN1bmRlZiBpbWFnZV90cmFuc2Zvcm1faW5pCi0jZGVmaW5lIGltYWdlX3RyYW5zZm9ybV9pbmkgaW1hZ2VfdHJhbnNmb3JtX2RlZmF1bHRfaW5pCi0jZW5kaWYgLyogUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAotLyogcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19zdHJ1Y3RwLCBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmRfY29sb3IsCi0gKiAgICBpbnQgYmFja2dyb3VuZF9nYW1tYV9jb2RlLCBpbnQgbmVlZF9leHBhbmQsIGRvdWJsZSBiYWNrZ3JvdW5kX2dhbW1hKQotICogcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19zdHJ1Y3RwLCBwbmdfY29uc3RfY29sb3JfMTZwIGJhY2tncm91bmRfY29sb3IsCi0gKiAgICBpbnQgYmFja2dyb3VuZF9nYW1tYV9jb2RlLCBpbnQgbmVlZF9leHBhbmQsCi0gKiAgICBwbmdfZml4ZWRfcG9pbnQgYmFja2dyb3VuZF9nYW1tYSkKLSAqCi0gKiBUaGlzIGlnbm9yZXMgdGhlIGdhbW1hIChhdCBwcmVzZW50LikKLSovCi0jZGVmaW5lIGRhdGEgSVREQVRBKGJhY2tncm91bmQpCi1zdGF0aWMgaW1hZ2VfcGl4ZWwgZGF0YTsKLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2JhY2tncm91bmRfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19ieXRlIGNvbG91cl90eXBlLCBiaXRfZGVwdGg7Ci0gICBwbmdfYnl0ZSByYW5kb21fYnl0ZXNbOF07IC8qIDggYnl0ZXMgLSA2NCBiaXRzIC0gdGhlIGJpZ2dlc3QgcGl4ZWwgKi8KLSAgIGludCBleHBhbmQ7Ci0gICBwbmdfY29sb3JfMTYgYmFjazsKLQotICAgLyogV2UgbmVlZCBhIGJhY2tncm91bmQgY29sb3VyLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgZXhhY3RseSB3aGF0IHRyYW5zZm9ybXMKLSAgICAqIGhhdmUgYmVlbiBzZXQgd2UgaGF2ZSB0byBzdXBwbHkgdGhlIGNvbG91ciBpbiB0aGUgb3JpZ2luYWwgZmlsZSBmb3JtYXQgYW5kCi0gICAgKiBzbyB3ZSBuZWVkIHRvIGtub3cgd2hhdCB0aGF0IGlzISAgVGhlIGJhY2tncm91bmQgY29sb3VyIGlzIHN0b3JlZCBpbiB0aGUKLSAgICAqIHRyYW5zZm9ybV9kaXNwbGF5LgotICAgICovCi0gICBSOChyYW5kb21fYnl0ZXMpOwotCi0gICAvKiBSZWFkIHRoZSByYW5kb20gdmFsdWUsIGZvciBjb2xvdXIgdHlwZSAzIHRoZSBiYWNrZ3JvdW5kIGNvbG91ciBpcyBhY3R1YWxseQotICAgICogZXhwcmVzc2VkIGFzIGEgMjRiaXQgcmdiLCBub3QgYW4gaW5kZXguCi0gICAgKi8KLSAgIGNvbG91cl90eXBlID0gdGhhdC0+dGhpcy5jb2xvdXJfdHlwZTsKLSAgIGlmIChjb2xvdXJfdHlwZSA9PSAzKQotICAgewotICAgICAgY29sb3VyX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7Ci0gICAgICBiaXRfZGVwdGggPSA4OwotICAgICAgZXhwYW5kID0gMDsgLyogcGFzc2luZyBpbiBhbiBSR0Igbm90IGEgcGl4ZWwgaW5kZXggKi8KLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgaWYgKHRoYXQtPnRoaXMuaGFzX3RSTlMpCi0gICAgICAgICB0aGF0LT50aGlzLmlzX3RyYW5zcGFyZW50ID0gMTsKLQotICAgICAgYml0X2RlcHRoID0gdGhhdC0+dGhpcy5iaXRfZGVwdGg7Ci0gICAgICBleHBhbmQgPSAxOwotICAgfQotCi0gICBpbWFnZV9waXhlbF9pbml0KCZkYXRhLCByYW5kb21fYnl0ZXMsIGNvbG91cl90eXBlLAotICAgICAgYml0X2RlcHRoLCAwLyp4Ki8sIDAvKnVudXNlZDogcGFsZXR0ZSovLCBOVUxMLypmb3JtYXQqLyk7Ci0KLSAgIC8qIEV4dHJhY3QgdGhlIGJhY2tncm91bmQgY29sb3VyIGZyb20gdGhpcyBpbWFnZV9waXhlbCwgYnV0IG1ha2Ugc3VyZSB0aGUKLSAgICAqIHVudXNlZCBmaWVsZHMgb2YgJ2JhY2snIGFyZSBnYXJiYWdlLgotICAgICovCi0gICBSOChiYWNrKTsKLQotICAgaWYgKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICB7Ci0gICAgICBiYWNrLnJlZCA9IChwbmdfdWludF8xNilkYXRhLnJlZDsKLSAgICAgIGJhY2suZ3JlZW4gPSAocG5nX3VpbnRfMTYpZGF0YS5ncmVlbjsKLSAgICAgIGJhY2suYmx1ZSA9IChwbmdfdWludF8xNilkYXRhLmJsdWU7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIGJhY2suZ3JheSA9IChwbmdfdWludF8xNilkYXRhLnJlZDsKLQotI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgIHBuZ19zZXRfYmFja2dyb3VuZChwcCwgJmJhY2ssIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUsIGV4cGFuZCwgMCk7Ci0jZWxzZQotICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBwLCAmYmFjaywgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfRklMRSwgZXhwYW5kLCAwKTsKLSNlbmRpZgotCi0gICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKLX0KLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2JhY2tncm91bmRfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICAvKiBDaGVjayBmb3IgdFJOUyBmaXJzdDogKi8KLSAgIGlmICh0aGF0LT5oYXZlX3RSTlMgJiYgdGhhdC0+Y29sb3VyX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgIGltYWdlX3BpeGVsX2FkZF9hbHBoYSh0aGF0LCAmZGlzcGxheS0+dGhpcywgMS8qZm9yIGJhY2tncm91bmQqLyk7Ci0KLSAgIC8qIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgdGhlIGFscGhhIHZhbHVlIGlzIGxlc3MgdGhhbiAxLiAqLwotICAgaWYgKHRoYXQtPmFscGhhZiA8IDEpCi0gICB7Ci0gICAgICAvKiBOb3cgd2UgZG8gdGhlIGJhY2tncm91bmQgY2FsY3VsYXRpb24gd2l0aG91dCBhbnkgZ2FtbWEgY29ycmVjdGlvbi4gKi8KLSAgICAgIGlmICh0aGF0LT5hbHBoYWYgPD0gMCkKLSAgICAgIHsKLSAgICAgICAgIHRoYXQtPnJlZGYgPSBkYXRhLnJlZGY7Ci0gICAgICAgICB0aGF0LT5ncmVlbmYgPSBkYXRhLmdyZWVuZjsKLSAgICAgICAgIHRoYXQtPmJsdWVmID0gZGF0YS5ibHVlZjsKLQotICAgICAgICAgdGhhdC0+cmVkZSA9IGRhdGEucmVkZTsKLSAgICAgICAgIHRoYXQtPmdyZWVuZSA9IGRhdGEuZ3JlZW5lOwotICAgICAgICAgdGhhdC0+Ymx1ZWUgPSBkYXRhLmJsdWVlOwotCi0gICAgICAgICB0aGF0LT5yZWRfc0JJVD0gZGF0YS5yZWRfc0JJVDsKLSAgICAgICAgIHRoYXQtPmdyZWVuX3NCSVQ9IGRhdGEuZ3JlZW5fc0JJVDsKLSAgICAgICAgIHRoYXQtPmJsdWVfc0JJVD0gZGF0YS5ibHVlX3NCSVQ7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgLyogMCA8IGFscGhhIDwgMSAqLwotICAgICAgewotICAgICAgICAgZG91YmxlIGFsZiA9IDEgLSB0aGF0LT5hbHBoYWY7Ci0KLSAgICAgICAgIHRoYXQtPnJlZGYgPSB0aGF0LT5yZWRmICogdGhhdC0+YWxwaGFmICsgZGF0YS5yZWRmICogYWxmOwotICAgICAgICAgdGhhdC0+cmVkZSA9IHRoYXQtPnJlZGUgKiB0aGF0LT5hbHBoYWYgKyBkYXRhLnJlZGUgKiBhbGYgKwotICAgICAgICAgICAgREJMX0VQU0lMT047Ci0gICAgICAgICB0aGF0LT5ncmVlbmYgPSB0aGF0LT5ncmVlbmYgKiB0aGF0LT5hbHBoYWYgKyBkYXRhLmdyZWVuZiAqIGFsZjsKLSAgICAgICAgIHRoYXQtPmdyZWVuZSA9IHRoYXQtPmdyZWVuZSAqIHRoYXQtPmFscGhhZiArIGRhdGEuZ3JlZW5lICogYWxmICsKLSAgICAgICAgICAgIERCTF9FUFNJTE9OOwotICAgICAgICAgdGhhdC0+Ymx1ZWYgPSB0aGF0LT5ibHVlZiAqIHRoYXQtPmFscGhhZiArIGRhdGEuYmx1ZWYgKiBhbGY7Ci0gICAgICAgICB0aGF0LT5ibHVlZSA9IHRoYXQtPmJsdWVlICogdGhhdC0+YWxwaGFmICsgZGF0YS5ibHVlZSAqIGFsZiArCi0gICAgICAgICAgICBEQkxfRVBTSUxPTjsKLSAgICAgIH0KLQotICAgICAgLyogUmVtb3ZlIHRoZSBhbHBoYSB0eXBlIGFuZCBzZXQgdGhlIGFscGhhIChub3QgaW4gdGhhdCBvcmRlci4pICovCi0gICAgICB0aGF0LT5hbHBoYWYgPSAxOwotICAgICAgdGhhdC0+YWxwaGFlID0gMDsKLSAgIH0KLQotICAgaWYgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOwotICAgZWxzZSBpZiAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKLSAgICAgIHRoYXQtPmNvbG91cl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKLSAgIC8qIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgaXMgbm90IGNoYW5nZWQgKi8KLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotI2RlZmluZSBpbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9iYWNrZ3JvdW5kX2FkZCBpbWFnZV90cmFuc2Zvcm1fZGVmYXVsdF9hZGQKLQotI3VuZGVmIGRhdGEKLUlUKGJhY2tncm91bmQpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKGJhY2tncm91bmQpCi0jZW5kaWYgLyogUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQgKi8KLQotLyogcG5nX3NldF9xdWFudGl6ZShwbmdfc3RydWN0cCwgcG5nX2NvbG9ycCBwYWxldHRlLCBpbnQgbnVtX3BhbGV0dGUsCi0gKiAgICBpbnQgbWF4aW11bV9jb2xvcnMsIHBuZ19jb25zdF91aW50XzE2cCBoaXN0b2dyYW0sIGludCBmdWxsX3F1YW50aXplKQotICoKLSAqIFZlcnkgZGlmZmljdWx0IHRvIHZhbGlkYXRlIHRoaXMhCi0gKi8KLS8qTk9URTogVEJEIE5ZSSAqLwotCi0vKiBUaGUgZGF0YSBsYXlvdXQgdHJhbnNmb3JtcyBhcmUgaGFuZGxlZCBieSBzd2FwcGluZyBvdXIgb3duIGNoYW5uZWwgZGF0YSwKLSAqIG5lY2Vzc2FyaWx5IHRoZXNlIG5lZWQgdG8gaGFwcGVuIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zZm9ybSBsaXN0IGJlY2F1c2UgdGhlCi0gKiBzZW1hbnRpYyBvZiB0aGUgY2hhbm5lbHMgY2hhbmdlcyBhZnRlciB0aGVzZSBhcmUgZXhlY3V0ZWQuICBTb21lIG9mIHRoZXNlLAotICogbGlrZSBzZXRfc2hpZnQgYW5kIHNldF9wYWNraW5nLCBjYW4ndCBiZSBkb25lIGF0IHByZXNlbnQgYmVjYXVzZSB0aGV5IGNoYW5nZQotICogdGhlIGxheW91dCBvZiB0aGUgZGF0YSBhdCB0aGUgc3ViLXNhbXBsZSBsZXZlbCBzbyBzYW1wbGUoKSB3b24ndCBnZXQgdGhlCi0gKiByaWdodCBhbnN3ZXIuCi0gKi8KLS8qIHBuZ19zZXRfaW52ZXJ0X2FscGhhICovCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotLyogSW52ZXJ0IHRoZSBhbHBoYSBjaGFubmVsCi0gKgotICogIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQotICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfaW52ZXJ0X2FscGhhX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBwbmdfc2V0X2ludmVydF9hbHBoYShwcCk7Ci0gICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKLX0KLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2ludmVydF9hbHBoYV9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSAmIDQpCi0gICAgICB0aGF0LT5hbHBoYV9pbnZlcnRlZCA9IDE7Ci0KLSAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2ludmVydF9hbHBoYV9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICBVTlVTRUQoYml0X2RlcHRoKQotCi0gICB0aGlzLT5uZXh0ID0gKnRoYXQ7Ci0gICAqdGhhdCA9IHRoaXM7Ci0KLSAgIC8qIE9ubHkgaGFzIGFuIGVmZmVjdCBvbiBwaXhlbHMgd2l0aCBhbHBoYTogKi8KLSAgIHJldHVybiAoY29sb3VyX3R5cGUgJiA0KSAhPSAwOwotfQotCi1JVChpbnZlcnRfYWxwaGEpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKGludmVydF9hbHBoYSkKLQotI2VuZGlmIC8qIFBOR19SRUFEX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQgKi8KLQotLyogcG5nX3NldF9iZ3IgKi8KLSNpZmRlZiBQTkdfUkVBRF9CR1JfU1VQUE9SVEVECi0vKiBTd2FwIFIsRyxCIGNoYW5uZWxzIHRvIG9yZGVyIEIsRyxSLgotICoKLSAqICBwbmdfc2V0X2Jncihwbmdfc3RydWN0cnAgcG5nX3B0cikKLSAqCi0gKiBUaGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBvbiBSR0IgYW5kIFJHQkEgcGl4ZWxzLgotICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfYmdyX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBwbmdfc2V0X2JncihwcCk7Ci0gICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKLX0KLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2Jncl9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICB0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JBKQotICAgICAgIHRoYXQtPnN3YXBfcmdiID0gMTsKLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfYmdyX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKLXsKLSAgIFVOVVNFRChiaXRfZGVwdGgpCi0KLSAgIHRoaXMtPm5leHQgPSAqdGhhdDsKLSAgICp0aGF0ID0gdGhpczsKLQotICAgcmV0dXJuIGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgIGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQkE7Ci19Ci0KLUlUKGJncik7Ci0jdW5kZWYgUFQKLSNkZWZpbmUgUFQgSVRTVFJVQ1QoYmdyKQotCi0jZW5kaWYgLyogUE5HX1JFQURfQkdSX1NVUFBPUlRFRCAqLwotCi0vKiBwbmdfc2V0X3N3YXBfYWxwaGEgKi8KLSNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRAotLyogUHV0IHRoZSBhbHBoYSBjaGFubmVsIGZpcnN0LgotICoKLSAqICBwbmdfc2V0X3N3YXBfYWxwaGEocG5nX3N0cnVjdHJwIHBuZ19wdHIpCi0gKgotICogVGhpcyBvbmx5IGhhcyBhbiBlZmZlY3Qgb24gR0EgYW5kIFJHQkEgcGl4ZWxzLgotICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9hbHBoYV9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgcG5nX3NldF9zd2FwX2FscGhhKHBwKTsKLSAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOwotfQotCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9hbHBoYV9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HQSB8fAotICAgICAgIHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQkEpCi0gICAgICB0aGF0LT5hbHBoYV9maXJzdCA9IDE7Ci0KLSAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3N3YXBfYWxwaGFfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgVU5VU0VEKGJpdF9kZXB0aCkKLQotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICByZXR1cm4gY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR0EgfHwKLSAgICAgICBjb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JBOwotfQotCi1JVChzd2FwX2FscGhhKTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChzd2FwX2FscGhhKQotCi0jZW5kaWYgLyogUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQgKi8KLQotLyogcG5nX3NldF9zd2FwICovCi0jaWZkZWYgUE5HX1JFQURfU1dBUF9TVVBQT1JURUQKLS8qIEJ5dGUgc3dhcCAxNi1iaXQgY29tcG9uZW50cy4KLSAqCi0gKiAgcG5nX3NldF9zd2FwKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQotICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgcG5nX3NldF9zd2FwKHBwKTsKLSAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOwotfQotCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc3dhcF9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5iaXRfZGVwdGggPT0gMTYpCi0gICAgICB0aGF0LT5zd2FwMTYgPSAxOwotCi0gICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOwotfQotCi1zdGF0aWMgaW50Ci1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9zd2FwX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKLXsKLSAgIFVOVVNFRChjb2xvdXJfdHlwZSkKLQotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICByZXR1cm4gYml0X2RlcHRoID09IDE2OwotfQotCi1JVChzd2FwKTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChzd2FwKQotCi0jZW5kaWYgLyogUE5HX1JFQURfU1dBUF9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQKLS8qIEFkZCBhIGZpbGxlciBieXRlIHRvIDgtYml0IEdyYXkgb3IgMjQtYml0IFJHQiBpbWFnZXMuCi0gKgotICogIHBuZ19zZXRfZmlsbGVyLCAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgZmlsbGVyLCBpbnQgZmxhZ3MpKTsKLSAqCi0gKiBGbGFnczoKLSAqCi0gKiAgUE5HX0ZJTExFUl9CRUZPUkUKLSAqICBQTkdfRklMTEVSX0FGVEVSCi0gKi8KLSNkZWZpbmUgZGF0YSBJVERBVEEoZmlsbGVyKQotc3RhdGljIHN0cnVjdAotewotICAgcG5nX3VpbnRfMzIgZmlsbGVyOwotICAgaW50ICAgICAgICAgZmxhZ3M7Ci19IGRhdGE7Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9maWxsZXJfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIC8qIE5lZWQgYSByYW5kb20gY2hvaWNlIGZvciAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBhcyB3ZWxsIGFzIGZvciB0aGUKLSAgICAqIGZpbGxlci4gIFRoZSAnZmlsbGVyJyB2YWx1ZSBoYXMgYWxsIDMyIGJpdHMgc2V0LCBidXQgb25seSBiaXRfZGVwdGgKLSAgICAqIHdpbGwgYmUgdXNlZC4gIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyBiaXRfZGVwdGguCi0gICAgKi8KLSAgIGRhdGEuZmlsbGVyID0gcmFuZG9tX3UzMigpOwotICAgZGF0YS5mbGFncyA9IHJhbmRvbV9jaG9pY2UoKTsKLQotICAgcG5nX3NldF9maWxsZXIocHAsIGRhdGEuZmlsbGVyLCBkYXRhLmZsYWdzKTsKLQotICAgLyogVGhlIHN0YW5kYXJkIGRpc3BsYXkgaGFuZGxpbmcgc3R1ZmYgYWxzbyBuZWVkcyB0byBrbm93IHRoYXQKLSAgICAqIHRoZXJlIGlzIGEgZmlsbGVyLCBzbyBzZXQgdGhhdCBoZXJlLgotICAgICovCi0gICB0aGF0LT50aGlzLmZpbGxlciA9IDE7Ci0KLSAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOwotfQotCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfZmlsbGVyX21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAotICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQotewotICAgaWYgKHRoYXQtPmJpdF9kZXB0aCA+PSA4ICYmCi0gICAgICAgKHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICB0aGF0LT5jb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKSkKLSAgIHsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXggPSAoMVUgPDwgdGhhdC0+Yml0X2RlcHRoKS0xOwotICAgICAgdGhhdC0+YWxwaGEgPSBkYXRhLmZpbGxlciAmIG1heDsKLSAgICAgIHRoYXQtPmFscGhhZiA9ICgoZG91YmxlKXRoYXQtPmFscGhhKSAvIG1heDsKLSAgICAgIHRoYXQtPmFscGhhZSA9IDA7Ci0KLSAgICAgIC8qIFRoZSBmaWxsZXIgaGFzIGJlZW4gc3RvcmVkIGluIHRoZSBhbHBoYSBjaGFubmVsLCB3ZSBtdXN0IHJlY29yZAotICAgICAgICogdGhhdCB0aGlzIGhhcyBiZWVuIGRvbmUgZm9yIHRoZSBjaGVja2luZyBsYXRlciBvbiwgdGhlIGNvbG9yCi0gICAgICAgKiB0eXBlIGlzIGZha2VkIHRvIGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgYnV0IGxpYnBuZyB3b24ndCByZXBvcnQKLSAgICAgICAqIHRoaXM7IHRoZSBhcHAgaGFzIHRvIGtub3cgdGhlIGV4dHJhIGNoYW5uZWwgaXMgdGhlcmUgYW5kIHRoaXMKLSAgICAgICAqIHdhcyByZWNvcmRpbmcgaW4gc3RhbmRhcmRfZGlzcGxheTo6ZmlsbGVyIGFib3ZlLgotICAgICAgICovCi0gICAgICB0aGF0LT5jb2xvdXJfdHlwZSB8PSA0OyAvKiBhbHBoYSBhZGRlZCAqLwotICAgICAgdGhhdC0+YWxwaGFfZmlyc3QgPSBkYXRhLmZsYWdzID09IFBOR19GSUxMRVJfQkVGT1JFOwotICAgfQotCi0gICB0aGlzLT5uZXh0LT5tb2QodGhpcy0+bmV4dCwgdGhhdCwgcHAsIGRpc3BsYXkpOwotfQotCi1zdGF0aWMgaW50Ci1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9maWxsZXJfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICByZXR1cm4gYml0X2RlcHRoID49IDggJiYgKGNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICAgICBjb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKTsKLX0KLQotI3VuZGVmIGRhdGEKLUlUKGZpbGxlcik7Ci0jdW5kZWYgUFQKLSNkZWZpbmUgUFQgSVRTVFJVQ1QoZmlsbGVyKQotCi0vKiBwbmdfc2V0X2FkZF9hbHBoYSwgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIGZpbGxlciwgaW50IGZsYWdzKSk7ICovCi0vKiBBZGQgYW4gYWxwaGEgYnl0ZSB0byA4LWJpdCBHcmF5IG9yIDI0LWJpdCBSR0IgaW1hZ2VzLiAqLwotI2RlZmluZSBkYXRhIElUREFUQShhZGRfYWxwaGEpCi1zdGF0aWMgc3RydWN0Ci17Ci0gICBwbmdfdWludF8zMiBmaWxsZXI7Ci0gICBpbnQgICAgICAgICBmbGFnczsKLX0gZGF0YTsKLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X2FkZF9hbHBoYV9zZXQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIHRyYW5zZm9ybV9kaXNwbGF5ICp0aGF0LCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgLyogTmVlZCBhIHJhbmRvbSBjaG9pY2UgZm9yICdiZWZvcmUnIGFuZCAnYWZ0ZXInIGFzIHdlbGwgYXMgZm9yIHRoZQotICAgICogZmlsbGVyLiAgVGhlICdmaWxsZXInIHZhbHVlIGhhcyBhbGwgMzIgYml0cyBzZXQsIGJ1dCBvbmx5IGJpdF9kZXB0aAotICAgICogd2lsbCBiZSB1c2VkLiAgQXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93IGJpdF9kZXB0aC4KLSAgICAqLwotICAgZGF0YS5maWxsZXIgPSByYW5kb21fdTMyKCk7Ci0gICBkYXRhLmZsYWdzID0gcmFuZG9tX2Nob2ljZSgpOwotCi0gICBwbmdfc2V0X2FkZF9hbHBoYShwcCwgZGF0YS5maWxsZXIsIGRhdGEuZmxhZ3MpOwotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9hZGRfYWxwaGFfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICBpZiAodGhhdC0+Yml0X2RlcHRoID49IDggJiYKLSAgICAgICAodGhhdC0+Y29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgIHRoYXQtPmNvbG91cl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpKQotICAgewotICAgICAgY29uc3QgdW5zaWduZWQgaW50IG1heCA9ICgxVSA8PCB0aGF0LT5iaXRfZGVwdGgpLTE7Ci0gICAgICB0aGF0LT5hbHBoYSA9IGRhdGEuZmlsbGVyICYgbWF4OwotICAgICAgdGhhdC0+YWxwaGFmID0gKChkb3VibGUpdGhhdC0+YWxwaGEpIC8gbWF4OwotICAgICAgdGhhdC0+YWxwaGFlID0gMDsKLQotICAgICAgdGhhdC0+Y29sb3VyX3R5cGUgfD0gNDsgLyogYWxwaGEgYWRkZWQgKi8KLSAgICAgIHRoYXQtPmFscGhhX2ZpcnN0ID0gZGF0YS5mbGFncyA9PSBQTkdfRklMTEVSX0JFRk9SRTsKLSAgIH0KLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfYWRkX2FscGhhX2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKLXsKLSAgIHRoaXMtPm5leHQgPSAqdGhhdDsKLSAgICp0aGF0ID0gdGhpczsKLQotICAgcmV0dXJuIGJpdF9kZXB0aCA+PSA4ICYmIChjb2xvdXJfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICAgICAgY29sb3VyX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSk7Ci19Ci0KLSN1bmRlZiBkYXRhCi1JVChhZGRfYWxwaGEpOwotI3VuZGVmIFBUCi0jZGVmaW5lIFBUIElUU1RSVUNUKGFkZF9hbHBoYSkKLQotI2VuZGlmIC8qIFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQgKi8KLQotLyogcG5nX3NldF9wYWNraW5nICovCi0jaWZkZWYgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKLS8qIFVzZSAxIGJ5dGUgcGVyIHBpeGVsIGluIDEsIDIsIG9yIDQtYml0IGRlcHRoIGZpbGVzLgotICoKLSAqICBwbmdfc2V0X3BhY2tpbmcocG5nX3N0cnVjdHJwIHBuZ19wdHIpCi0gKgotICogVGhpcyBzaG91bGQgb25seSBhZmZlY3QgZ3JheXNjYWxlIGFuZCBwYWxldHRlIGltYWdlcyB3aXRoIGxlc3MgdGhhbiA4IGJpdHMKLSAqIHBlciBwaXhlbC4KLSAqLwotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhY2tpbmdfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19zZXRfcGFja2luZyhwcCk7Ci0gICB0aGF0LT51bnBhY2tlZCA9IDE7Ci0gICB0aGlzLT5uZXh0LT5zZXQodGhpcy0+bmV4dCwgdGhhdCwgcHAsIHBpKTsKLX0KLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhY2tpbmdfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICAvKiBUaGUgZ2VuZXJhbCBleHBhbmQgY2FzZSBkZXBlbmRzIG9uIHdoYXQgdGhlIGNvbG91ciB0eXBlIGlzLAotICAgICogbG93IGJpdC1kZXB0aCBwaXhlbCB2YWx1ZXMgYXJlIHVucGFja2VkIGludG8gYnl0ZXMgd2l0aG91dAotICAgICogc2NhbGluZywgc28gc2FtcGxlX2RlcHRoIGlzIG5vdCBjaGFuZ2VkLgotICAgICovCi0gICBpZiAodGhhdC0+Yml0X2RlcHRoIDwgOCkgLyogZ3JheXNjYWxlIG9yIHBhbGV0dGUgKi8KLSAgICAgIHRoYXQtPmJpdF9kZXB0aCA9IDg7Ci0KLSAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3BhY2tpbmdfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgVU5VU0VEKGNvbG91cl90eXBlKQotCi0gICB0aGlzLT5uZXh0ID0gKnRoYXQ7Ci0gICAqdGhhdCA9IHRoaXM7Ci0KLSAgIC8qIE5vdGhpbmcgc2hvdWxkIGhhcHBlbiB1bmxlc3MgdGhlIGJpdCBkZXB0aCBpcyBsZXNzIHRoYW4gODogKi8KLSAgIHJldHVybiBiaXRfZGVwdGggPCA4OwotfQotCi1JVChwYWNraW5nKTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChwYWNraW5nKQotCi0jZW5kaWYgLyogUE5HX1JFQURfUEFDS19TVVBQT1JURUQgKi8KLQotLyogcG5nX3NldF9wYWNrc3dhcCAqLwotI2lmZGVmIFBOR19SRUFEX1BBQ0tTV0FQX1NVUFBPUlRFRAotLyogU3dhcCBwaXhlbHMgcGFja2VkIGludG8gYnl0ZXM7IHJldmVyc2VzIHRoZSBvcmRlciBvbiBzY3JlZW4gc28gdGhhdAotICogdGhlIGhpZ2ggb3JkZXIgYml0cyBjb3JyZXNwb25kIHRvIHRoZSByaWdodG1vc3QgcGl4ZWxzLgotICoKLSAqICBwbmdfc2V0X3BhY2tzd2FwKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQotICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcGFja3N3YXBfc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19zZXRfcGFja3N3YXAocHApOwotICAgdGhhdC0+dGhpcy5saXR0bGVlbmRpYW4gPSAxOwotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9wYWNrc3dhcF9tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5iaXRfZGVwdGggPCA4KQotICAgICAgdGhhdC0+bGl0dGxlZW5kaWFuID0gMTsKLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfcGFja3N3YXBfYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgVU5VU0VEKGNvbG91cl90eXBlKQotCi0gICB0aGlzLT5uZXh0ID0gKnRoYXQ7Ci0gICAqdGhhdCA9IHRoaXM7Ci0KLSAgIHJldHVybiBiaXRfZGVwdGggPCA4OwotfQotCi1JVChwYWNrc3dhcCk7Ci0jdW5kZWYgUFQKLSNkZWZpbmUgUFQgSVRTVFJVQ1QocGFja3N3YXApCi0KLSNlbmRpZiAvKiBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQgKi8KLQotCi0vKiBwbmdfc2V0X2ludmVydF9tb25vICovCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX01PTk9fU1VQUE9SVEVECi0vKiBJbnZlcnQgdGhlIGdyYXkgY2hhbm5lbAotICoKLSAqICBwbmdfc2V0X2ludmVydF9tb25vKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKQotICovCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfaW52ZXJ0X21vbm9fc2V0KGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICB0cmFuc2Zvcm1fZGlzcGxheSAqdGhhdCwgcG5nX3N0cnVjdHAgcHAsIHBuZ19pbmZvcCBwaSkKLXsKLSAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocHApOwotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9pbnZlcnRfbW9ub19tb2QoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGltYWdlX3BpeGVsICp0aGF0LCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBjb25zdCB0cmFuc2Zvcm1fZGlzcGxheSAqZGlzcGxheSkKLXsKLSAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSAmIDQpCi0gICAgICB0aGF0LT5tb25vX2ludmVydGVkID0gMTsKLQotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfaW52ZXJ0X21vbm9fYWRkKGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBjb25zdCBpbWFnZV90cmFuc2Zvcm0gKip0aGF0LCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgVU5VU0VEKGJpdF9kZXB0aCkKLQotICAgdGhpcy0+bmV4dCA9ICp0aGF0OwotICAgKnRoYXQgPSB0aGlzOwotCi0gICAvKiBPbmx5IGhhcyBhbiBlZmZlY3Qgb24gcGl4ZWxzIHdpdGggbm8gY29sb3VyOiAqLwotICAgcmV0dXJuIChjb2xvdXJfdHlwZSAmIDIpID09IDA7Ci19Ci0KLUlUKGludmVydF9tb25vKTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChpbnZlcnRfbW9ubykKLQotI2VuZGlmIC8qIFBOR19SRUFEX0lOVkVSVF9NT05PX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVECi0vKiBwbmdfc2V0X3NoaWZ0KHBuZ19zdHJ1Y3RwLCBwbmdfY29uc3RfY29sb3JfOHAgdHJ1ZV9iaXRzKQotICoKLSAqIFRoZSBvdXRwdXQgcGl4ZWxzIHdpbGwgYmUgc2hpZnRlZCBieSB0aGUgZ2l2ZW4gdHJ1ZV9iaXRzCi0gKiB2YWx1ZXMuCi0gKi8KLSNkZWZpbmUgZGF0YSBJVERBVEEoc2hpZnQpCi1zdGF0aWMgcG5nX2NvbG9yXzggZGF0YTsKLQotc3RhdGljIHZvaWQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3NoaWZ0X3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICAvKiBHZXQgYSByYW5kb20gc2V0IG9mIHNoaWZ0cy4gIFRoZSBzaGlmdHMgbmVlZCB0byBkbyBzb21ldGhpbmcKLSAgICAqIHRvIHRlc3QgdGhlIHRyYW5zZm9ybSwgc28gdGhleSBhcmUgbGltaXRlZCB0byB0aGUgYml0IGRlcHRoCi0gICAgKiBvZiB0aGUgaW5wdXQgaW1hZ2UuICBOb3RpY2UgdGhhdCBpbiB0aGUgZm9sbG93aW5nIHRoZSAnZ3JheScKLSAgICAqIGZpZWxkIGlzIHJhbmRvbWl6ZWQgaW5kZXBlbmRlbnRseS4gIFRoaXMgYWN0cyBhcyBhIGNoZWNrIHRoYXQKLSAgICAqIGxpYnBuZyBkb2VzIHVzZSB0aGUgY29ycmVjdCBmaWVsZC4KLSAgICAqLwotICAgY29uc3QgdW5zaWduZWQgaW50IGRlcHRoID0gdGhhdC0+dGhpcy5iaXRfZGVwdGg7Ci0KLSAgIGRhdGEucmVkID0gKHBuZ19ieXRlKS8qU0FGRSovKHJhbmRvbV9tb2QoZGVwdGgpKzEpOwotICAgZGF0YS5ncmVlbiA9IChwbmdfYnl0ZSkvKlNBRkUqLyhyYW5kb21fbW9kKGRlcHRoKSsxKTsKLSAgIGRhdGEuYmx1ZSA9IChwbmdfYnl0ZSkvKlNBRkUqLyhyYW5kb21fbW9kKGRlcHRoKSsxKTsKLSAgIGRhdGEuZ3JheSA9IChwbmdfYnl0ZSkvKlNBRkUqLyhyYW5kb21fbW9kKGRlcHRoKSsxKTsKLSAgIGRhdGEuYWxwaGEgPSAocG5nX2J5dGUpLypTQUZFKi8ocmFuZG9tX21vZChkZXB0aCkrMSk7Ci0KLSAgIHBuZ19zZXRfc2hpZnQocHAsICZkYXRhKTsKLSAgIHRoaXMtPm5leHQtPnNldCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgcGkpOwotfQotCi1zdGF0aWMgdm9pZAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfc2hpZnRfbW9kKGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqdGhpcywKLSAgICBpbWFnZV9waXhlbCAqdGhhdCwgcG5nX2NvbnN0X3N0cnVjdHAgcHAsCi0gICAgY29uc3QgdHJhbnNmb3JtX2Rpc3BsYXkgKmRpc3BsYXkpCi17Ci0gICAvKiBDb3B5IHRoZSBjb3JyZWN0IHZhbHVlcyBpbnRvIHRoZSBzQklUIGZpZWxkcywgbGlicG5nIGRvZXMgbm90IGRvCi0gICAgKiBhbnl0aGluZyB0byBwYWxldHRlIGRhdGE6Ci0gICAgKi8KLSAgIGlmICh0aGF0LT5jb2xvdXJfdHlwZSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgewotICAgICAgIHRoYXQtPnNpZ19iaXRzID0gMTsKLQotICAgICAgIC8qIFRoZSBzQklUIGZpZWxkcyBhcmUgcmVzZXQgdG8gdGhlIHZhbHVlcyBwcmV2aW91c2x5IHNlbnQgdG8KLSAgICAgICAgKiBwbmdfc2V0X3NoaWZ0IGFjY29yZGluZyB0byB0aGUgY29sb3VyIHR5cGUuCi0gICAgICAgICogZG9lcy4KLSAgICAgICAgKi8KLSAgICAgICBpZiAodGhhdC0+Y29sb3VyX3R5cGUgJiAyKSAvKiBSR0IgY2hhbm5lbHMgKi8KLSAgICAgICB7Ci0gICAgICAgICAgdGhhdC0+cmVkX3NCSVQgPSBkYXRhLnJlZDsKLSAgICAgICAgICB0aGF0LT5ncmVlbl9zQklUID0gZGF0YS5ncmVlbjsKLSAgICAgICAgICB0aGF0LT5ibHVlX3NCSVQgPSBkYXRhLmJsdWU7Ci0gICAgICAgfQotCi0gICAgICAgZWxzZSAvKiBPbmUgZ3JleSBjaGFubmVsICovCi0gICAgICAgICAgdGhhdC0+cmVkX3NCSVQgPSB0aGF0LT5ncmVlbl9zQklUID0gdGhhdC0+Ymx1ZV9zQklUID0gZGF0YS5ncmF5OwotCi0gICAgICAgdGhhdC0+YWxwaGFfc0JJVCA9IGRhdGEuYWxwaGE7Ci0gICB9Ci0KLSAgIHRoaXMtPm5leHQtPm1vZCh0aGlzLT5uZXh0LCB0aGF0LCBwcCwgZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWltYWdlX3RyYW5zZm9ybV9wbmdfc2V0X3NoaWZ0X2FkZChpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhhdCwgcG5nX2J5dGUgY29sb3VyX3R5cGUsIHBuZ19ieXRlIGJpdF9kZXB0aCkKLXsKLSAgIFVOVVNFRChiaXRfZGVwdGgpCi0KLSAgIHRoaXMtPm5leHQgPSAqdGhhdDsKLSAgICp0aGF0ID0gdGhpczsKLQotICAgcmV0dXJuIGNvbG91cl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7Ci19Ci0KLUlUKHNoaWZ0KTsKLSN1bmRlZiBQVAotI2RlZmluZSBQVCBJVFNUUlVDVChzaGlmdCkKLQotI2VuZGlmIC8qIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgVEhJU19JU19USEVfUFJPRk9STUEKLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9AX3NldChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgdHJhbnNmb3JtX2Rpc3BsYXkgKnRoYXQsIHBuZ19zdHJ1Y3RwIHBwLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBwbmdfc2V0X0AocHApOwotICAgdGhpcy0+bmV4dC0+c2V0KHRoaXMtPm5leHQsIHRoYXQsIHBwLCBwaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcG5nX3NldF9AX21vZChjb25zdCBpbWFnZV90cmFuc2Zvcm0gKnRoaXMsCi0gICAgaW1hZ2VfcGl4ZWwgKnRoYXQsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAotICAgIGNvbnN0IHRyYW5zZm9ybV9kaXNwbGF5ICpkaXNwbGF5KQotewotICAgdGhpcy0+bmV4dC0+bW9kKHRoaXMtPm5leHQsIHRoYXQsIHBwLCBkaXNwbGF5KTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3BuZ19zZXRfQF9hZGQoaW1hZ2VfdHJhbnNmb3JtICp0aGlzLAotICAgIGNvbnN0IGltYWdlX3RyYW5zZm9ybSAqKnRoYXQsIHBuZ19ieXRlIGNvbG91cl90eXBlLCBwbmdfYnl0ZSBiaXRfZGVwdGgpCi17Ci0gICB0aGlzLT5uZXh0ID0gKnRoYXQ7Ci0gICAqdGhhdCA9IHRoaXM7Ci0KLSAgIHJldHVybiAxOwotfQotCi1JVChAKTsKLSNlbmRpZgotCi0KLS8qIFRoaXMgbWF5IGp1c3QgYmUgJ2VuZCcgaWYgYWxsIHRoZSB0cmFuc2Zvcm1zIGFyZSBkaXNhYmxlZCEgKi8KLXN0YXRpYyBpbWFnZV90cmFuc2Zvcm0gKmNvbnN0IGltYWdlX3RyYW5zZm9ybV9maXJzdCA9ICZQVDsKLQotc3RhdGljIHZvaWQKLXRyYW5zZm9ybV9lbmFibGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgIC8qIEV2ZXJ5dGhpbmcgc3RhcnRzIG91dCBlbmFibGVkLCBzbyBpZiB3ZSBzZWUgYW4gJ2VuYWJsZScgZGlzYWJsZWQKLSAgICAqIGV2ZXJ5dGhpbmcgZWxzZSB0aGUgZmlyc3QgdGltZSByb3VuZC4KLSAgICAqLwotICAgc3RhdGljIGludCBhbGxfZGlzYWJsZWQgPSAwOwotICAgaW50IGZvdW5kX2l0ID0gMDsKLSAgIGltYWdlX3RyYW5zZm9ybSAqbGlzdCA9IGltYWdlX3RyYW5zZm9ybV9maXJzdDsKLQotICAgd2hpbGUgKGxpc3QgIT0gJmltYWdlX3RyYW5zZm9ybV9lbmQpCi0gICB7Ci0gICAgICBpZiAoc3RyY21wKGxpc3QtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICB7Ci0gICAgICAgICBsaXN0LT5lbmFibGUgPSAxOwotICAgICAgICAgZm91bmRfaXQgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIWFsbF9kaXNhYmxlZCkKLSAgICAgICAgIGxpc3QtPmVuYWJsZSA9IDA7Ci0KLSAgICAgIGxpc3QgPSBsaXN0LT5saXN0OwotICAgfQotCi0gICBhbGxfZGlzYWJsZWQgPSAxOwotCi0gICBpZiAoIWZvdW5kX2l0KQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogLS10cmFuc2Zvcm0tZW5hYmxlPSVzOiB1bmtub3duIHRyYW5zZm9ybVxuIiwKLSAgICAgICAgIG5hbWUpOwotICAgICAgZXhpdCg5OSk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi10cmFuc2Zvcm1fZGlzYWJsZShjb25zdCBjaGFyICpuYW1lKQotewotICAgaW1hZ2VfdHJhbnNmb3JtICpsaXN0ID0gaW1hZ2VfdHJhbnNmb3JtX2ZpcnN0OwotCi0gICB3aGlsZSAobGlzdCAhPSAmaW1hZ2VfdHJhbnNmb3JtX2VuZCkKLSAgIHsKLSAgICAgIGlmIChzdHJjbXAobGlzdC0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGxpc3QtPmVuYWJsZSA9IDA7Ci0gICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGxpc3QgPSBsaXN0LT5saXN0OwotICAgfQotCi0gICBmcHJpbnRmKHN0ZGVyciwgInBuZ3ZhbGlkOiAtLXRyYW5zZm9ybS1kaXNhYmxlPSVzOiB1bmtub3duIHRyYW5zZm9ybVxuIiwKLSAgICAgIG5hbWUpOwotICAgZXhpdCg5OSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbWFnZV90cmFuc2Zvcm1fcmVzZXRfY291bnQodm9pZCkKLXsKLSAgIGltYWdlX3RyYW5zZm9ybSAqbmV4dCA9IGltYWdlX3RyYW5zZm9ybV9maXJzdDsKLSAgIGludCBjb3VudCA9IDA7Ci0KLSAgIHdoaWxlIChuZXh0ICE9ICZpbWFnZV90cmFuc2Zvcm1fZW5kKQotICAgewotICAgICAgbmV4dC0+bG9jYWxfdXNlID0gMDsKLSAgICAgIG5leHQtPm5leHQgPSAwOwotICAgICAgbmV4dCA9IG5leHQtPmxpc3Q7Ci0gICAgICArK2NvdW50OwotICAgfQotCi0gICAvKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB3ZSBldmVyeSBoYXZlIG1vcmUgdGhhbiAzMiB0cmFuc2Zvcm1zIChleGNsdWRpbmcKLSAgICAqIHRoZSBlbmQpIGluIHRoZSBsaXN0LgotICAgICovCi0gICBpZiAoY291bnQgPiAzMikgYWJvcnQoKTsKLX0KLQotc3RhdGljIGludAotaW1hZ2VfdHJhbnNmb3JtX3Rlc3RfY291bnRlcihwbmdfdWludF8zMiBjb3VudGVyLCB1bnNpZ25lZCBpbnQgbWF4KQotewotICAgLyogVGVzdCB0aGUgbGlzdCB0byBzZWUgaWYgdGhlcmUgaXMgYW55IHBvaW50IGNvbnRpbmluZywgZ2l2ZW4gYSBjdXJyZW50Ci0gICAgKiBjb3VudGVyIGFuZCBhICdtYXgnIHZhbHVlLgotICAgICovCi0gICBpbWFnZV90cmFuc2Zvcm0gKm5leHQgPSBpbWFnZV90cmFuc2Zvcm1fZmlyc3Q7Ci0KLSAgIHdoaWxlIChuZXh0ICE9ICZpbWFnZV90cmFuc2Zvcm1fZW5kKQotICAgewotICAgICAgLyogRm9yIG1heCAwIG9yIDEgY29udGludWUgdW50aWwgdGhlIGNvdW50ZXIgb3ZlcmZsb3dzOiAqLwotICAgICAgY291bnRlciA+Pj0gMTsKLQotICAgICAgLyogQ29udGludWUgaWYgYW55IGVudHJ5IGhhc24ndCByZWFja2VkIHRoZSBtYXguICovCi0gICAgICBpZiAobWF4ID4gMSAmJiBuZXh0LT5sb2NhbF91c2UgPCBtYXgpCi0gICAgICAgICByZXR1cm4gMTsKLSAgICAgIG5leHQgPSBuZXh0LT5saXN0OwotICAgfQotCi0gICByZXR1cm4gbWF4IDw9IDEgJiYgY291bnRlciA9PSAwOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIKLWltYWdlX3RyYW5zZm9ybV9hZGQoY29uc3QgaW1hZ2VfdHJhbnNmb3JtICoqdGhpcywgdW5zaWduZWQgaW50IG1heCwKLSAgIHBuZ191aW50XzMyIGNvdW50ZXIsIGNoYXIgKm5hbWUsIHNpemVfdCBzaXplb2ZfbmFtZSwgc2l6ZV90ICpwb3MsCi0gICBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwgcG5nX2J5dGUgYml0X2RlcHRoKQotewotICAgZm9yICg7OykgLyogdW50aWwgd2UgbWFuYWdlIHRvIGFkZCBzb21ldGhpbmcgKi8KLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIG1hc2s7Ci0gICAgICBpbWFnZV90cmFuc2Zvcm0gKmxpc3Q7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIG5leHQgY291bnRlciB2YWx1ZSwgaWYgdGhlIGNvdW50ZXIgaXMgemVybyB0aGlzIGlzIHRoZSBzdGFydAotICAgICAgICogb2YgdGhlIGxpc3QuICBUaGlzIHJvdXRpbmUgYWx3YXlzIHJldHVybnMgdGhlIGN1cnJlbnQgY291bnRlciAobm90IHRoZQotICAgICAgICogbmV4dCkgc28gaXQgcmV0dXJucyAwIGF0IHRoZSBlbmQgYW5kIGV4cGVjdHMgMCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAgICovCi0gICAgICBpZiAoY291bnRlciA9PSAwKSAvKiBmaXJzdCB0aW1lICovCi0gICAgICB7Ci0gICAgICAgICBpbWFnZV90cmFuc2Zvcm1fcmVzZXRfY291bnQoKTsKLSAgICAgICAgIGlmIChtYXggPD0gMSkKLSAgICAgICAgICAgIGNvdW50ZXIgPSAxOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgY291bnRlciA9IHJhbmRvbV8zMigpOwotICAgICAgfQotICAgICAgZWxzZSAvKiBhZHZhbmNlIHRoZSBjb3VudGVyICovCi0gICAgICB7Ci0gICAgICAgICBzd2l0Y2ggKG1heCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDogICsrY291bnRlcjsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6ICBjb3VudGVyIDw8PSAxOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IGNvdW50ZXIgPSByYW5kb21fMzIoKTsgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdyBhZGQgYWxsIHRoZXNlIGl0ZW1zLCBpZiBwb3NzaWJsZSAqLwotICAgICAgKnRoaXMgPSAmaW1hZ2VfdHJhbnNmb3JtX2VuZDsKLSAgICAgIGxpc3QgPSBpbWFnZV90cmFuc2Zvcm1fZmlyc3Q7Ci0gICAgICBtYXNrID0gMTsKLQotICAgICAgLyogR28gdGhyb3VnaCB0aGUgd2hvbGUgbGlzdCBhZGRpbmcgYW55dGhpbmcgdGhhdCB0aGUgY291bnRlciBzZWxlY3RzOiAqLwotICAgICAgd2hpbGUgKGxpc3QgIT0gJmltYWdlX3RyYW5zZm9ybV9lbmQpCi0gICAgICB7Ci0gICAgICAgICBpZiAoKGNvdW50ZXIgJiBtYXNrKSAhPSAwICYmIGxpc3QtPmVuYWJsZSAmJgotICAgICAgICAgICAgIChtYXggPT0gMCB8fCBsaXN0LT5sb2NhbF91c2UgPCBtYXgpKQotICAgICAgICAgewotICAgICAgICAgICAgLyogQ2FuZGlkYXRlIHRvIGFkZDogKi8KLSAgICAgICAgICAgIGlmIChsaXN0LT5hZGQobGlzdCwgdGhpcywgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCkgfHwgbWF4ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBBZGRlZCwgc28gYWRkIHRvIHRoZSBuYW1lIHRvby4gKi8KLSAgICAgICAgICAgICAgICpwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZl9uYW1lLCAqcG9zLCAiICsiKTsKLSAgICAgICAgICAgICAgICpwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZl9uYW1lLCAqcG9zLCBsaXN0LT5uYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogTm90IHVzZWZ1bCBhbmQgbWF4PjAsIHNvIHJlbW92ZSBpdCBmcm9tICp0aGlzOiAqLwotICAgICAgICAgICAgICAgKnRoaXMgPSBsaXN0LT5uZXh0OwotICAgICAgICAgICAgICAgbGlzdC0+bmV4dCA9IDA7Ci0KLSAgICAgICAgICAgICAgIC8qIEFuZCwgc2luY2Ugd2Uga25vdyBpdCBpc24ndCB1c2VmdWwsIHN0b3AgaXQgYmVpbmcgYWRkZWQgYWdhaW4KLSAgICAgICAgICAgICAgICAqIGluIHRoaXMgcnVuOgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBsaXN0LT5sb2NhbF91c2UgPSBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIG1hc2sgPDw9IDE7Ci0gICAgICAgICBsaXN0ID0gbGlzdC0+bGlzdDsKLSAgICAgIH0KLQotICAgICAgLyogTm93IGlmIGFueXRoaW5nIHdhcyBhZGRlZCB3ZSBoYXZlIHNvbWV0aGluZyB0byBkby4gKi8KLSAgICAgIGlmICgqdGhpcyAhPSAmaW1hZ2VfdHJhbnNmb3JtX2VuZCkKLSAgICAgICAgIHJldHVybiBjb3VudGVyOwotCi0gICAgICAvKiBOb3RoaW5nIGFkZGVkLCBidXQgd2FzIHRoZXJlIGFueXRoaW5nIGluIHRoZXJlIHRvIGFkZD8gKi8KLSAgICAgIGlmICghaW1hZ2VfdHJhbnNmb3JtX3Rlc3RfY291bnRlcihjb3VudGVyLCBtYXgpKQotICAgICAgICAgcmV0dXJuIDA7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX3RyYW5zZm9ybV90ZXN0KHBuZ19tb2RpZmllciAqcG0pCi17Ci0gICBwbmdfYnl0ZSBjb2xvdXJfdHlwZSA9IDA7Ci0gICBwbmdfYnl0ZSBiaXRfZGVwdGggPSAwOwotICAgdW5zaWduZWQgaW50IHBhbGV0dGVfbnVtYmVyID0gMDsKLQotICAgd2hpbGUgKG5leHRfZm9ybWF0KCZjb2xvdXJfdHlwZSwgJmJpdF9kZXB0aCwgJnBhbGV0dGVfbnVtYmVyLCBwbS0+dGVzdF9sYmcsCi0gICAgICAgICAgICBwbS0+dGVzdF90Uk5TKSkKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIGNvdW50ZXIgPSAwOwotICAgICAgc2l6ZV90IGJhc2VfcG9zOwotICAgICAgY2hhciBuYW1lWzY0XTsKLQotICAgICAgYmFzZV9wb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZiBuYW1lLCAwLCAidHJhbnNmb3JtOiIpOwotCi0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICAgc2l6ZV90IHBvcyA9IGJhc2VfcG9zOwotICAgICAgICAgY29uc3QgaW1hZ2VfdHJhbnNmb3JtICpsaXN0ID0gMDsKLQotICAgICAgICAgLyogJ21heCcgaXMgY3VycmVudGx5IGhhcmR3aXJlZCB0byAnMSc7IHRoaXMgc2hvdWxkIGJlIHNldHRhYmxlIG9uIHRoZQotICAgICAgICAgICogY29tbWFuZCBsaW5lLgotICAgICAgICAgICovCi0gICAgICAgICBjb3VudGVyID0gaW1hZ2VfdHJhbnNmb3JtX2FkZCgmbGlzdCwgMS8qbWF4Ki8sIGNvdW50ZXIsCi0gICAgICAgICAgICBuYW1lLCBzaXplb2YgbmFtZSwgJnBvcywgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCk7Ci0KLSAgICAgICAgIGlmIChjb3VudGVyID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgLyogVGhlIGNvbW1hbmQgbGluZSBjYW4gY2hhbmdlIHRoaXMgdG8gY2hlY2tpbmcgaW50ZXJsYWNlZCBpbWFnZXMuICovCi0gICAgICAgICBkbwotICAgICAgICAgewotICAgICAgICAgICAgcG0tPnJlcGVhdCA9IDA7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1fdGVzdChwbSwgRklMRUlEKGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHBhbGV0dGVfbnVtYmVyLAotICAgICAgICAgICAgICAgcG0tPmludGVybGFjZV90eXBlLCAwLCAwLCAwKSwgbGlzdCwgbmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlIChwbS0+cmVwZWF0KTsKLSAgICAgIH0KLSAgIH0KLX0KLSNlbmRpZiAvKiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdBTU1BIFRFU1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotLyogUmVhZGVyIGNhbGxiYWNrcyBhbmQgaW1wbGVtZW50YXRpb25zLCB3aGVyZSB0aGV5IGRpZmZlciBmcm9tIHRoZSBzdGFuZGFyZAotICogb25lcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZ2FtbWFfZGlzcGxheQotewotICAgc3RhbmRhcmRfZGlzcGxheSB0aGlzOwotCi0gICAvKiBQYXJhbWV0ZXJzICovCi0gICBwbmdfbW9kaWZpZXIqICAgIHBtOwotICAgZG91YmxlICAgICAgICAgICBmaWxlX2dhbW1hOwotICAgZG91YmxlICAgICAgICAgICBzY3JlZW5fZ2FtbWE7Ci0gICBkb3VibGUgICAgICAgICAgIGJhY2tncm91bmRfZ2FtbWE7Ci0gICBwbmdfYnl0ZSAgICAgICAgIHNiaXQ7Ci0gICBpbnQgICAgICAgICAgICAgIHRocmVzaG9sZF90ZXN0OwotICAgaW50ICAgICAgICAgICAgICB1c2VfaW5wdXRfcHJlY2lzaW9uOwotICAgaW50ICAgICAgICAgICAgICBzY2FsZTE2OwotICAgaW50ICAgICAgICAgICAgICBleHBhbmQxNjsKLSAgIGludCAgICAgICAgICAgICAgZG9fYmFja2dyb3VuZDsKLSAgIHBuZ19jb2xvcl8xNiAgICAgYmFja2dyb3VuZF9jb2xvcjsKLQotICAgLyogTG9jYWwgdmFyaWFibGVzICovCi0gICBkb3VibGUgICAgICAgbWF4ZXJyb3V0OwotICAgZG91YmxlICAgICAgIG1heGVycnBjOwotICAgZG91YmxlICAgICAgIG1heGVycmFiczsKLX0gZ2FtbWFfZGlzcGxheTsKLQotI2RlZmluZSBBTFBIQV9NT0RFX09GRlNFVCA0Ci0KLXN0YXRpYyB2b2lkCi1nYW1tYV9kaXNwbGF5X2luaXQoZ2FtbWFfZGlzcGxheSAqZHAsIHBuZ19tb2RpZmllciAqcG0sIHBuZ191aW50XzMyIGlkLAotICAgIGRvdWJsZSBmaWxlX2dhbW1hLCBkb3VibGUgc2NyZWVuX2dhbW1hLCBwbmdfYnl0ZSBzYml0LCBpbnQgdGhyZXNob2xkX3Rlc3QsCi0gICAgaW50IHVzZV9pbnB1dF9wcmVjaXNpb24sIGludCBzY2FsZTE2LCBpbnQgZXhwYW5kMTYsCi0gICAgaW50IGRvX2JhY2tncm91bmQsIGNvbnN0IHBuZ19jb2xvcl8xNiAqcG9pbnRlcl90b190aGVfYmFja2dyb3VuZF9jb2xvciwKLSAgICBkb3VibGUgYmFja2dyb3VuZF9nYW1tYSkKLXsKLSAgIC8qIFN0YW5kYXJkIGZpZWxkcyAqLwotICAgc3RhbmRhcmRfZGlzcGxheV9pbml0KCZkcC0+dGhpcywgJnBtLT50aGlzLCBpZCwgZG9fcmVhZF9pbnRlcmxhY2UsCi0gICAgICBwbS0+dXNlX3VwZGF0ZV9pbmZvKTsKLQotICAgLyogUGFyYW1ldGVyIGZpZWxkcyAqLwotICAgZHAtPnBtID0gcG07Ci0gICBkcC0+ZmlsZV9nYW1tYSA9IGZpbGVfZ2FtbWE7Ci0gICBkcC0+c2NyZWVuX2dhbW1hID0gc2NyZWVuX2dhbW1hOwotICAgZHAtPmJhY2tncm91bmRfZ2FtbWEgPSBiYWNrZ3JvdW5kX2dhbW1hOwotICAgZHAtPnNiaXQgPSBzYml0OwotICAgZHAtPnRocmVzaG9sZF90ZXN0ID0gdGhyZXNob2xkX3Rlc3Q7Ci0gICBkcC0+dXNlX2lucHV0X3ByZWNpc2lvbiA9IHVzZV9pbnB1dF9wcmVjaXNpb247Ci0gICBkcC0+c2NhbGUxNiA9IHNjYWxlMTY7Ci0gICBkcC0+ZXhwYW5kMTYgPSBleHBhbmQxNjsKLSAgIGRwLT5kb19iYWNrZ3JvdW5kID0gZG9fYmFja2dyb3VuZDsKLSAgIGlmIChkb19iYWNrZ3JvdW5kICYmIHBvaW50ZXJfdG9fdGhlX2JhY2tncm91bmRfY29sb3IgIT0gMCkKLSAgICAgIGRwLT5iYWNrZ3JvdW5kX2NvbG9yID0gKnBvaW50ZXJfdG9fdGhlX2JhY2tncm91bmRfY29sb3I7Ci0gICBlbHNlCi0gICAgICBtZW1zZXQoJmRwLT5iYWNrZ3JvdW5kX2NvbG9yLCAwLCBzaXplb2YgZHAtPmJhY2tncm91bmRfY29sb3IpOwotCi0gICAvKiBMb2NhbCB2YXJpYWJsZSBmaWVsZHMgKi8KLSAgIGRwLT5tYXhlcnJvdXQgPSBkcC0+bWF4ZXJycGMgPSBkcC0+bWF4ZXJyYWJzID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWdhbW1hX2luZm9faW1wKGdhbW1hX2Rpc3BsYXkgKmRwLCBwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgLyogUmV1c2UgdGhlIHN0YW5kYXJkIHN0dWZmIGFzIGFwcHJvcHJpYXRlLiAqLwotICAgc3RhbmRhcmRfaW5mb19wYXJ0MSgmZHAtPnRoaXMsIHBwLCBwaSk7Ci0KLSAgIC8qIElmIHJlcXVlc3RlZCBzdHJpcCAxNiB0byA4IGJpdHMgLSB0aGlzIGlzIGhhbmRsZWQgYXV0b21hZ2ljYWxseSBiZWxvdwotICAgICogYmVjYXVzZSB0aGUgb3V0cHV0IGJpdCBkZXB0aCBpcyByZWFkIGZyb20gdGhlIGxpYnJhcnkuICBOb3RlIHRoYXQgdGhlcmUKLSAgICAqIGFyZSBpbnRlcmFjdGlvbnMgd2l0aCBzQklUIGJ1dCwgaW50ZXJuYWxseSwgbGlicG5nIG1ha2VzIHNiaXQgYXQgbW9zdAotICAgICogUE5HX01BWF9HQU1NQV84IHByaW9yIHRvIDEuNyB3aGVuIGRvaW5nIHRoZSBmb2xsb3dpbmcuCi0gICAgKi8KLSAgIGlmIChkcC0+c2NhbGUxNikKLSMgICAgIGlmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVECi0gICAgICAgICBwbmdfc2V0X3NjYWxlXzE2KHBwKTsKLSMgICAgIGVsc2UKLSAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgd29ya3MgYm90aCBpbiAxLjUuNCBhbmQgZWFybGllciB2ZXJzaW9uczogKi8KLSMgICAgICAgIGlmZGVmIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVECi0gICAgICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBwKTsKLSMgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19lcnJvcihwcCwgInNjYWxlMTYgKDE2IHRvIDggYml0IGNvbnZlcnNpb24pIG5vdCBzdXBwb3J0ZWQiKTsKLSMgICAgICAgIGVuZGlmCi0jICAgICBlbmRpZgotCi0gICBpZiAoZHAtPmV4cGFuZDE2KQotIyAgICAgaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRAotICAgICAgICAgcG5nX3NldF9leHBhbmRfMTYocHApOwotIyAgICAgZWxzZQotICAgICAgICAgcG5nX2Vycm9yKHBwLCAiZXhwYW5kMTYgKDggdG8gMTYgYml0IGNvbnZlcnNpb24pIG5vdCBzdXBwb3J0ZWQiKTsKLSMgICAgIGVuZGlmCi0KLSAgIGlmIChkcC0+ZG9fYmFja2dyb3VuZCA+PSBBTFBIQV9NT0RFX09GRlNFVCkKLSAgIHsKLSMgICAgIGlmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECi0gICAgICB7Ci0gICAgICAgICAvKiBUaGlzIHRlc3RzIHRoZSBhbHBoYSBtb2RlIGhhbmRsaW5nLCBpZiBzdXBwb3J0ZWQuICovCi0gICAgICAgICBpbnQgbW9kZSA9IGRwLT5kb19iYWNrZ3JvdW5kIC0gQUxQSEFfTU9ERV9PRkZTRVQ7Ci0KLSAgICAgICAgIC8qIFRoZSBnYW1tYSB2YWx1ZSBpcyB0aGUgb3V0cHV0IGdhbW1hLCBhbmQgaXMgaW4gdGhlIHN0YW5kYXJkLAotICAgICAgICAgICogbm9uLWludmVydGVkLCByZXByZXNlbmF0aW9uLiAgSXQgcHJvdmlkZXMgYSBkZWZhdWx0IGZvciB0aGUgUE5HIGZpbGUKLSAgICAgICAgICAqIGdhbW1hLCBidXQgc2luY2UgdGhlIGZpbGUgaGFzIGEgZ0FNQSBjaHVuayB0aGlzIGRvZXMgbm90IG1hdHRlci4KLSAgICAgICAgICAqLwotICAgICAgICAgY29uc3QgZG91YmxlIHNnID0gZHAtPnNjcmVlbl9nYW1tYTsKLSMgICAgICAgIGlmbmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICAgICAgICBjb25zdCBwbmdfZml4ZWRfcG9pbnQgZyA9IGZpeChzZyk7Ci0jICAgICAgICBlbmRpZgotCi0jICAgICAgICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICAgICAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIG1vZGUsIHNnKTsKLSMgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBuZ19zZXRfYWxwaGFfbW9kZV9maXhlZChwcCwgbW9kZSwgZyk7Ci0jICAgICAgICBlbmRpZgotCi0gICAgICAgICAvKiBIb3dldmVyLCBmb3IgdGhlIHN0YW5kYXJkIFBvcnRlci1EdWZmIGFsZ29yaXRobSB0aGUgb3V0cHV0IGRlZmF1bHRzCi0gICAgICAgICAgKiB0byBiZSBsaW5lYXIsIHNvIGlmIHRoZSB0ZXN0IHJlcXVpcmVzIG5vbi1saW5lYXIgb3V0cHV0IGl0IG11c3QgYmUKLSAgICAgICAgICAqIGNvcnJlY3RlZCBoZXJlLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAobW9kZSA9PSBQTkdfQUxQSEFfU1RBTkRBUkQgJiYgc2cgIT0gMSkKLSAgICAgICAgIHsKLSMgICAgICAgICAgIGlmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQKLSAgICAgICAgICAgICAgIHBuZ19zZXRfZ2FtbWEocHAsIHNnLCBkcC0+ZmlsZV9nYW1tYSk7Ci0jICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwbmdfZml4ZWRfcG9pbnQgZiA9IGZpeChkcC0+ZmlsZV9nYW1tYSk7Ci0gICAgICAgICAgICAgICBwbmdfc2V0X2dhbW1hX2ZpeGVkKHBwLCBnLCBmKTsKLSMgICAgICAgICAgIGVuZGlmCi0gICAgICAgICB9Ci0gICAgICB9Ci0jICAgICBlbHNlCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJhbHBoYSBtb2RlIGhhbmRsaW5nIG5vdCBzdXBwb3J0ZWQiKTsKLSMgICAgIGVuZGlmCi0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIC8qIFNldCB1cCBnYW1tYSBwcm9jZXNzaW5nLiAqLwotIyAgICAgaWZkZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRAotICAgICAgICAgcG5nX3NldF9nYW1tYShwcCwgZHAtPnNjcmVlbl9nYW1tYSwgZHAtPmZpbGVfZ2FtbWEpOwotIyAgICAgZWxzZQotICAgICAgewotICAgICAgICAgcG5nX2ZpeGVkX3BvaW50IHMgPSBmaXgoZHAtPnNjcmVlbl9nYW1tYSk7Ci0gICAgICAgICBwbmdfZml4ZWRfcG9pbnQgZiA9IGZpeChkcC0+ZmlsZV9nYW1tYSk7Ci0gICAgICAgICBwbmdfc2V0X2dhbW1hX2ZpeGVkKHBwLCBzLCBmKTsKLSAgICAgIH0KLSMgICAgIGVuZGlmCi0KLSAgICAgIGlmIChkcC0+ZG9fYmFja2dyb3VuZCkKLSAgICAgIHsKLSMgICAgIGlmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0gICAgICAgICAvKiBOT1RFOiB0aGlzIGFzc3VtZXMgdGhlIGNhbGxlciBwcm92aWRlZCB0aGUgY29ycmVjdCBiYWNrZ3JvdW5kIGdhbW1hIQotICAgICAgICAgICovCi0gICAgICAgICBjb25zdCBkb3VibGUgYmcgPSBkcC0+YmFja2dyb3VuZF9nYW1tYTsKLSMgICAgICAgIGlmbmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICAgICAgICBjb25zdCBwbmdfZml4ZWRfcG9pbnQgZyA9IGZpeChiZyk7Ci0jICAgICAgICBlbmRpZgotCi0jICAgICAgICBpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVECi0gICAgICAgICAgICBwbmdfc2V0X2JhY2tncm91bmQocHAsICZkcC0+YmFja2dyb3VuZF9jb2xvciwgZHAtPmRvX2JhY2tncm91bmQsCi0gICAgICAgICAgICAgICAwLypuZWVkX2V4cGFuZCovLCBiZyk7Ci0jICAgICAgICBlbHNlCi0gICAgICAgICAgICBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQocHAsICZkcC0+YmFja2dyb3VuZF9jb2xvciwKLSAgICAgICAgICAgICAgIGRwLT5kb19iYWNrZ3JvdW5kLCAwLypuZWVkX2V4cGFuZCovLCBnKTsKLSMgICAgICAgIGVuZGlmCi0jICAgICBlbHNlCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJwbmdfc2V0X2JhY2tncm91bmQgbm90IHN1cHBvcnRlZCIpOwotIyAgICAgZW5kaWYKLSAgICAgIH0KLSAgIH0KLQotICAgewotICAgICAgaW50IGkgPSBkcC0+dGhpcy51c2VfdXBkYXRlX2luZm87Ci0gICAgICAvKiBBbHdheXMgZG8gb25lIGNhbGwsIGV2ZW4gaWYgdXNlX3VwZGF0ZV9pbmZvIGlzIDAuICovCi0gICAgICBkbwotICAgICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocHAsIHBpKTsKLSAgICAgIHdoaWxlICgtLWkgPiAwKTsKLSAgIH0KLQotICAgLyogTm93IHdlIG1heSBnZXQgYSBkaWZmZXJlbnQgY2JSb3c6ICovCi0gICBzdGFuZGFyZF9pbmZvX3BhcnQyKCZkcC0+dGhpcywgcHAsIHBpLCAxIC8qaW1hZ2VzKi8pOwotfQotCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotZ2FtbWFfaW5mbyhwbmdfc3RydWN0cCBwcCwgcG5nX2luZm9wIHBpKQotewotICAgZ2FtbWFfaW5mb19pbXAodm9pZGNhc3QoZ2FtbWFfZGlzcGxheSosIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBwKSksIHBwLAotICAgICAgcGkpOwotfQotCi0vKiBWYWxpZGF0ZSBhIHNpbmdsZSBjb21wb25lbnQgdmFsdWUgLSB0aGUgcm91dGluZSBnZXRzIHRoZSBpbnB1dCBhbmQgb3V0cHV0Ci0gKiBzYW1wbGUgdmFsdWVzIGFzIHVuc2NhbGVkIFBORyBjb21wb25lbnQgdmFsdWVzIGFsb25nIHdpdGggYSBjYWNoZSBvZiBhbGwgdGhlCi0gKiBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byB2YWxpZGF0ZSB0aGUgdmFsdWVzLgotICovCi10eXBlZGVmIHN0cnVjdCB2YWxpZGF0ZV9pbmZvCi17Ci0gICBwbmdfY29uc3Rfc3RydWN0cCAgcHA7Ci0gICBnYW1tYV9kaXNwbGF5ICpkcDsKLSAgIHBuZ19ieXRlIHNiaXQ7Ci0gICBpbnQgdXNlX2lucHV0X3ByZWNpc2lvbjsKLSAgIGludCBkb19iYWNrZ3JvdW5kOwotICAgaW50IHNjYWxlMTY7Ci0gICB1bnNpZ25lZCBpbnQgc2JpdF9tYXg7Ci0gICB1bnNpZ25lZCBpbnQgaXNiaXRfc2hpZnQ7Ci0gICB1bnNpZ25lZCBpbnQgb3V0bWF4OwotCi0gICBkb3VibGUgZ2FtbWFfY29ycmVjdGlvbjsgLyogT3ZlcmFsbCBjb3JyZWN0aW9uIHJlcXVpcmVkLiAqLwotICAgZG91YmxlIGZpbGVfaW52ZXJzZTsgICAgIC8qIEludmVyc2Ugb2YgZmlsZSBnYW1tYS4gKi8KLSAgIGRvdWJsZSBzY3JlZW5fZ2FtbWE7Ci0gICBkb3VibGUgc2NyZWVuX2ludmVyc2U7ICAgLyogSW52ZXJzZSBvZiBzY3JlZW4gZ2FtbWEuICovCi0KLSAgIGRvdWJsZSBiYWNrZ3JvdW5kX3JlZDsgICAvKiBMaW5lYXIgYmFja2dyb3VuZCB2YWx1ZSwgcmVkIG9yIGdyYXkuICovCi0gICBkb3VibGUgYmFja2dyb3VuZF9ncmVlbjsKLSAgIGRvdWJsZSBiYWNrZ3JvdW5kX2JsdWU7Ci0KLSAgIGRvdWJsZSBtYXhhYnM7Ci0gICBkb3VibGUgbWF4cGM7Ci0gICBkb3VibGUgbWF4Y2FsYzsKLSAgIGRvdWJsZSBtYXhvdXQ7Ci0gICBkb3VibGUgbWF4b3V0X3RvdGFsOyAgICAgLyogVG90YWwgaW5jbHVkaW5nIHF1YW50aXphdGlvbiBlcnJvciAqLwotICAgZG91YmxlIG91dGxvZzsKLSAgIGludCAgICBvdXRxdWFudDsKLX0KLXZhbGlkYXRlX2luZm87Ci0KLXN0YXRpYyB2b2lkCi1pbml0X3ZhbGlkYXRlX2luZm8odmFsaWRhdGVfaW5mbyAqdmksIGdhbW1hX2Rpc3BsYXkgKmRwLCBwbmdfY29uc3Rfc3RydWN0cCBwcCwKLSAgICBpbnQgaW5fZGVwdGgsIGludCBvdXRfZGVwdGgpCi17Ci0gICBjb25zdCB1bnNpZ25lZCBpbnQgb3V0bWF4ID0gKDFVPDxvdXRfZGVwdGgpLTE7Ci0KLSAgIHZpLT5wcCA9IHBwOwotICAgdmktPmRwID0gZHA7Ci0KLSAgIGlmIChkcC0+c2JpdCA+IDAgJiYgZHAtPnNiaXQgPCBpbl9kZXB0aCkKLSAgIHsKLSAgICAgIHZpLT5zYml0ID0gZHAtPnNiaXQ7Ci0gICAgICB2aS0+aXNiaXRfc2hpZnQgPSBpbl9kZXB0aCAtIGRwLT5zYml0OwotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICB2aS0+c2JpdCA9IChwbmdfYnl0ZSlpbl9kZXB0aDsKLSAgICAgIHZpLT5pc2JpdF9zaGlmdCA9IDA7Ci0gICB9Ci0KLSAgIHZpLT5zYml0X21heCA9ICgxVSA8PCB2aS0+c2JpdCktMTsKLQotICAgLyogVGhpcyBtaW1pY3MgdGhlIGxpYnBuZyB0aHJlc2hvbGQgdGVzdCwgJzAnIGlzIHVzZWQgdG8gcHJldmVudCBnYW1tYQotICAgICogY29ycmVjdGlvbiBpbiB0aGUgdmFsaWRhdGlvbiB0ZXN0LgotICAgICovCi0gICB2aS0+c2NyZWVuX2dhbW1hID0gZHAtPnNjcmVlbl9nYW1tYTsKLSAgIGlmIChmYWJzKHZpLT5zY3JlZW5fZ2FtbWEtMSkgPCBQTkdfR0FNTUFfVEhSRVNIT0xEKQotICAgICAgdmktPnNjcmVlbl9nYW1tYSA9IHZpLT5zY3JlZW5faW52ZXJzZSA9IDA7Ci0gICBlbHNlCi0gICAgICB2aS0+c2NyZWVuX2ludmVyc2UgPSAxL3ZpLT5zY3JlZW5fZ2FtbWE7Ci0KLSAgIHZpLT51c2VfaW5wdXRfcHJlY2lzaW9uID0gZHAtPnVzZV9pbnB1dF9wcmVjaXNpb247Ci0gICB2aS0+b3V0bWF4ID0gb3V0bWF4OwotICAgdmktPm1heGFicyA9IGFic2VycihkcC0+cG0sIGluX2RlcHRoLCBvdXRfZGVwdGgpOwotICAgdmktPm1heHBjID0gcGNlcnIoZHAtPnBtLCBpbl9kZXB0aCwgb3V0X2RlcHRoKTsKLSAgIHZpLT5tYXhjYWxjID0gY2FsY2VycihkcC0+cG0sIGluX2RlcHRoLCBvdXRfZGVwdGgpOwotICAgdmktPm1heG91dCA9IG91dGVycihkcC0+cG0sIGluX2RlcHRoLCBvdXRfZGVwdGgpOwotICAgdmktPm91dHF1YW50ID0gb3V0cHV0X3F1YW50aXphdGlvbl9mYWN0b3IoZHAtPnBtLCBpbl9kZXB0aCwgb3V0X2RlcHRoKTsKLSAgIHZpLT5tYXhvdXRfdG90YWwgPSB2aS0+bWF4b3V0ICsgdmktPm91dHF1YW50ICogLjU7Ci0gICB2aS0+b3V0bG9nID0gb3V0bG9nKGRwLT5wbSwgaW5fZGVwdGgsIG91dF9kZXB0aCk7Ci0KLSAgIGlmICgoZHAtPnRoaXMuY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgIT0gMCB8fAotICAgICAgKGRwLT50aGlzLmNvbG91cl90eXBlID09IDMgJiYgZHAtPnRoaXMuaXNfdHJhbnNwYXJlbnQpIHx8Ci0gICAgICAoKGRwLT50aGlzLmNvbG91cl90eXBlID09IDAgfHwgZHAtPnRoaXMuY29sb3VyX3R5cGUgPT0gMikgJiYKLSAgICAgICBkcC0+dGhpcy5oYXNfdFJOUykpCi0gICB7Ci0gICAgICB2aS0+ZG9fYmFja2dyb3VuZCA9IGRwLT5kb19iYWNrZ3JvdW5kOwotCi0gICAgICBpZiAodmktPmRvX2JhY2tncm91bmQgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGNvbnN0IGRvdWJsZSBiZ19pbnZlcnNlID0gMS9kcC0+YmFja2dyb3VuZF9nYW1tYTsKLSAgICAgICAgIGRvdWJsZSByLCBnLCBiOwotCi0gICAgICAgICAvKiBDYWxsZXIgbXVzdCBhdCBsZWFzdCBwdXQgdGhlIGdyYXkgdmFsdWUgaW50byB0aGUgcmVkIGNoYW5uZWwgKi8KLSAgICAgICAgIHIgPSBkcC0+YmFja2dyb3VuZF9jb2xvci5yZWQ7IHIgLz0gb3V0bWF4OwotICAgICAgICAgZyA9IGRwLT5iYWNrZ3JvdW5kX2NvbG9yLmdyZWVuOyBnIC89IG91dG1heDsKLSAgICAgICAgIGIgPSBkcC0+YmFja2dyb3VuZF9jb2xvci5ibHVlOyBiIC89IG91dG1heDsKLQotIyAgICAgaWYgMAotICAgICAgICAgLyogbGlicG5nIGRvZXNuJ3QgZG8gdGhpcyBvcHRpbWl6YXRpb24sIGlmIHdlIGRvIHBuZ3ZhbGlkIHdpbGwgZmFpbC4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGZhYnMoYmdfaW52ZXJzZS0xKSA+PSBQTkdfR0FNTUFfVEhSRVNIT0xEKQotIyAgICAgZW5kaWYKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHIgPSBwb3cociwgYmdfaW52ZXJzZSk7Ci0gICAgICAgICAgICBnID0gcG93KGcsIGJnX2ludmVyc2UpOwotICAgICAgICAgICAgYiA9IHBvdyhiLCBiZ19pbnZlcnNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgdmktPmJhY2tncm91bmRfcmVkID0gcjsKLSAgICAgICAgIHZpLT5iYWNrZ3JvdW5kX2dyZWVuID0gZzsKLSAgICAgICAgIHZpLT5iYWNrZ3JvdW5kX2JsdWUgPSBiOwotICAgICAgfQotICAgfQotICAgZWxzZSAvKiBEbyBub3QgZXhwZWN0IGFueSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgKi8KLSAgICAgIHZpLT5kb19iYWNrZ3JvdW5kID0gMDsKLQotICAgaWYgKHZpLT5kb19iYWNrZ3JvdW5kID09IDApCi0gICAgICB2aS0+YmFja2dyb3VuZF9yZWQgPSB2aS0+YmFja2dyb3VuZF9ncmVlbiA9IHZpLT5iYWNrZ3JvdW5kX2JsdWUgPSAwOwotCi0gICB2aS0+Z2FtbWFfY29ycmVjdGlvbiA9IDEvKGRwLT5maWxlX2dhbW1hKmRwLT5zY3JlZW5fZ2FtbWEpOwotICAgaWYgKGZhYnModmktPmdhbW1hX2NvcnJlY3Rpb24tMSkgPCBQTkdfR0FNTUFfVEhSRVNIT0xEKQotICAgICAgdmktPmdhbW1hX2NvcnJlY3Rpb24gPSAwOwotCi0gICB2aS0+ZmlsZV9pbnZlcnNlID0gMS9kcC0+ZmlsZV9nYW1tYTsKLSAgIGlmIChmYWJzKHZpLT5maWxlX2ludmVyc2UtMSkgPCBQTkdfR0FNTUFfVEhSRVNIT0xEKQotICAgICAgdmktPmZpbGVfaW52ZXJzZSA9IDA7Ci0KLSAgIHZpLT5zY2FsZTE2ID0gZHAtPnNjYWxlMTY7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBjb21wb3NpdGlvbiBvZiBhIHNpbmdsZSBub24tYWxwaGEgY29tcG9uZW50LiAgVGhlCi0gKiBhcmd1bWVudCBpcyB0aGUgaW5wdXQgc2FtcGxlIHZhbHVlLCBpbiB0aGUgcmFuZ2UgMC4uMSwgYW5kIHRoZSBhbHBoYSB2YWx1ZS4KLSAqIFRoZSByZXN1bHQgaXMgdGhlIGNvbXBvc2VkLCBsaW5lYXIsIGlucHV0IHNhbXBsZS4gIElmIGFscGhhIGlzIGxlc3MgdGhhbiB6ZXJvCi0gKiB0aGlzIGlzIHRoZSBhbHBoYSBjb21wb25lbnQgYW5kIHRoZSBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCEKLSAqLwotc3RhdGljIGRvdWJsZQotZ2FtbWFfY29tcG9uZW50X2NvbXBvc2UoaW50IGRvX2JhY2tncm91bmQsIGRvdWJsZSBpbnB1dF9zYW1wbGUsIGRvdWJsZSBhbHBoYSwKLSAgIGRvdWJsZSBiYWNrZ3JvdW5kLCBpbnQgKmNvbXBvc2UpCi17Ci0gICBzd2l0Y2ggKGRvX2JhY2tncm91bmQpCi0gICB7Ci0jaWZkZWYgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKLSAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOOgotICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFOgotICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9VTklRVUU6Ci0gICAgICAgICAvKiBTdGFuZGFyZCBQTkcgYmFja2dyb3VuZCBwcm9jZXNzaW5nLiAqLwotICAgICAgICAgaWYgKGFscGhhIDwgMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbHBoYSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnB1dF9zYW1wbGUgPSBpbnB1dF9zYW1wbGUgKiBhbHBoYSArIGJhY2tncm91bmQgKiAoMS1hbHBoYSk7Ci0gICAgICAgICAgICAgICBpZiAoY29tcG9zZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgKmNvbXBvc2UgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBpbnB1dF9zYW1wbGUgPSBiYWNrZ3JvdW5kOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECi0gICAgICBjYXNlIEFMUEhBX01PREVfT0ZGU0VUICsgUE5HX0FMUEhBX1NUQU5EQVJEOgotICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9CUk9LRU46Ci0gICAgICAgICAvKiBUaGUgY29tcG9uZW50cyBhcmUgcHJlbXVsdGlwbGllZCBpbiBlaXRoZXIgY2FzZSBhbmQgdGhlIG91dHB1dCBpcwotICAgICAgICAgICogZ2FtbWEgZW5jb2RlZCAodG8gZ2V0IHN0YW5kYXJkIFBvcnRlci1EdWZmIHdlIGV4cGVjdCB0aGUgb3V0cHV0Ci0gICAgICAgICAgKiBnYW1tYSB0byBiZSBzZXQgdG8gMS4wISkKLSAgICAgICAgICAqLwotICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9PUFRJTUlaRUQ6Ci0gICAgICAgICAvKiBUaGUgb3B0aW1pemF0aW9uIGlzIHRoYXQgdGhlIHBhcnRpYWwtYWxwaGEgZW50cmllcyBhcmUgbGluZWFyCi0gICAgICAgICAgKiB3aGlsZSB0aGUgb3BhcXVlIHBpeGVscyBhcmUgZ2FtbWEgZW5jb2RlZCwgYnV0IHRoaXMgb25seSBhZmZlY3RzIHRoZQotICAgICAgICAgICogb3V0cHV0IGVuY29kaW5nLgotICAgICAgICAgICovCi0gICAgICAgICBpZiAoYWxwaGEgPCAxKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGFscGhhID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlucHV0X3NhbXBsZSAqPSBhbHBoYTsKLSAgICAgICAgICAgICAgIGlmIChjb21wb3NlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAqY29tcG9zZSA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGlucHV0X3NhbXBsZSA9IDA7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgLyogU3RhbmRhcmQgY2FzZXMgd2hlcmUgbm8gY29tcG9zaXRpbmcgaXMgZG9uZSAoc28gdGhlIGNvbXBvbmVudAotICAgICAgICAgICogdmFsdWUgaXMgYWxyZWFkeSBjb3JyZWN0LikKLSAgICAgICAgICAqLwotICAgICAgICAgVU5VU0VEKGFscGhhKQotICAgICAgICAgVU5VU0VEKGJhY2tncm91bmQpCi0gICAgICAgICBVTlVTRUQoY29tcG9zZSkKLSAgICAgICAgIGJyZWFrOwotICAgfQotCi0gICByZXR1cm4gaW5wdXRfc2FtcGxlOwotfQotCi0vKiBUaGlzIEFQSSByZXR1cm5zIHRoZSBlbmNvZGVkICppbnB1dCogY29tcG9uZW50LCBpbiB0aGUgcmFuZ2UgMC4uMSAqLwotc3RhdGljIGRvdWJsZQotZ2FtbWFfY29tcG9uZW50X3ZhbGlkYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZhbGlkYXRlX2luZm8gKnZpLAotICAgIGNvbnN0IHVuc2lnbmVkIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50IG9kLAotICAgIGNvbnN0IGRvdWJsZSBhbHBoYSAvKiA8MCBmb3IgdGhlIGFscGhhIGNoYW5uZWwgaXRzZWxmICovLAotICAgIGNvbnN0IGRvdWJsZSBiYWNrZ3JvdW5kIC8qIGNvbXBvbmVudCBiYWNrZ3JvdW5kIHZhbHVlICovKQotewotICAgY29uc3QgdW5zaWduZWQgaW50IGlzYml0ID0gaWQgPj4gdmktPmlzYml0X3NoaWZ0OwotICAgY29uc3QgdW5zaWduZWQgaW50IHNiaXRfbWF4ID0gdmktPnNiaXRfbWF4OwotICAgY29uc3QgdW5zaWduZWQgaW50IG91dG1heCA9IHZpLT5vdXRtYXg7Ci0gICBjb25zdCBpbnQgZG9fYmFja2dyb3VuZCA9IHZpLT5kb19iYWNrZ3JvdW5kOwotCi0gICBkb3VibGUgaTsKLQotICAgLyogRmlyc3QgY2hlY2sgb24gdGhlICdwZXJmZWN0JyByZXN1bHQgb2J0YWluZWQgZnJvbSB0aGUgZGlnaXRpemVkIGlucHV0Ci0gICAgKiB2YWx1ZSwgaWQsIGFuZCBjb21wYXJlIHRoaXMgYWdhaW5zdCB0aGUgYWN0dWFsIGRpZ2l0aXplZCByZXN1bHQsICdvZCcuCi0gICAgKiAnaScgaXMgdGhlIGlucHV0IHJlc3VsdCBpbiB0aGUgcmFuZ2UgMC4uMToKLSAgICAqLwotICAgaSA9IGlzYml0OyBpIC89IHNiaXRfbWF4OwotCi0gICAvKiBDaGVjayBmb3IgdGhlIGZhc3Qgcm91dGU6IGlmIHdlIGRvbid0IGRvIGFueSBiYWNrZ3JvdW5kIGNvbXBvc2l0aW9uIG9yIGlmCi0gICAgKiB0aGlzIGlzIHRoZSBhbHBoYSBjaGFubmVsICgnYWxwaGEnIDwgMCkgb3IgaWYgdGhlIHBpeGVsIGlzIG9wYXF1ZSB0aGVuCi0gICAgKiBqdXN0IHVzZSB0aGUgZ2FtbWFfY29ycmVjdGlvbiBmaWVsZCB0byBjb3JyZWN0IHRvIHRoZSBmaW5hbCBvdXRwdXQgZ2FtbWEuCi0gICAgKi8KLSAgIGlmIChhbHBoYSA9PSAxIC8qIG9wYXF1ZSBwaXhlbCBjb21wb25lbnQgKi8gfHwgIWRvX2JhY2tncm91bmQKLSNpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAotICAgICAgfHwgZG9fYmFja2dyb3VuZCA9PSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9QTkcKLSNlbmRpZgotICAgICAgfHwgKGFscGhhIDwgMCAvKiBhbHBoYSBjaGFubmVsICovCi0jaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQKLSAgICAgICYmIGRvX2JhY2tncm91bmQgIT0gQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfQlJPS0VOCi0jZW5kaWYKLSAgICAgICkpCi0gICB7Ci0gICAgICAvKiBUaGVuIGdldCB0aGUgZ2FtbWEgY29ycmVjdGVkIHZlcnNpb24gb2YgJ2knIGFuZCBjb21wYXJlIHRvICdvZCcsIGFueQotICAgICAgICogZXJyb3IgbGVzcyB0aGFuIC41IGlzIGluc2lnbmlmaWNhbnQgLSBqdXN0IHF1YW50aXphdGlvbiBvZiB0aGUgb3V0cHV0Ci0gICAgICAgKiB2YWx1ZSB0byB0aGUgbmVhcmVzdCBkaWdpdGFsIHZhbHVlIChuZXZlcnRoZWxlc3MgdGhlIGVycm9yIGlzIHN0aWxsCi0gICAgICAgKiByZWNvcmRlZCAtIGl0J3MgaW50ZXJlc3RpbmcgOy0pCi0gICAgICAgKi8KLSAgICAgIGRvdWJsZSBlbmNvZGVkX3NhbXBsZSA9IGk7Ci0gICAgICBkb3VibGUgZW5jb2RlZF9lcnJvcjsKLQotICAgICAgLyogYWxwaGEgbGVzcyB0aGFuIDAgaW5kaWNhdGVzIHRoZSBhbHBoYSBjaGFubmVsLCB3aGljaCBpcyBhbHdheXMgbGluZWFyCi0gICAgICAgKi8KLSAgICAgIGlmIChhbHBoYSA+PSAwICYmIHZpLT5nYW1tYV9jb3JyZWN0aW9uID4gMCkKLSAgICAgICAgIGVuY29kZWRfc2FtcGxlID0gcG93KGVuY29kZWRfc2FtcGxlLCB2aS0+Z2FtbWFfY29ycmVjdGlvbik7Ci0gICAgICBlbmNvZGVkX3NhbXBsZSAqPSBvdXRtYXg7Ci0KLSAgICAgIGVuY29kZWRfZXJyb3IgPSBmYWJzKG9kLWVuY29kZWRfc2FtcGxlKTsKLQotICAgICAgaWYgKGVuY29kZWRfZXJyb3IgPiB2aS0+ZHAtPm1heGVycm91dCkKLSAgICAgICAgIHZpLT5kcC0+bWF4ZXJyb3V0ID0gZW5jb2RlZF9lcnJvcjsKLQotICAgICAgaWYgKGVuY29kZWRfZXJyb3IgPCB2aS0+bWF4b3V0X3RvdGFsICYmIGVuY29kZWRfZXJyb3IgPCB2aS0+b3V0bG9nKQotICAgICAgICAgcmV0dXJuIGk7Ci0gICB9Ci0KLSAgIC8qIFRoZSBzbG93IHJvdXRlIC0gYXR0ZW1wdCB0byBkbyBsaW5lYXIgY2FsY3VsYXRpb25zLiAqLwotICAgLyogVGhlcmUgbWF5IGJlIGFuIGVycm9yLCBvciBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQsIHNvIGNhbGN1bGF0ZQotICAgICogdGhlIGFjdHVhbCBzYW1wbGUgdmFsdWVzIC0gdW5lbmNvZGVkIGxpZ2h0IGludGVuc2l0eSB2YWx1ZXMuICBOb3RlIHRoYXQgaW4KLSAgICAqIHByYWN0aWNlIHRoZXNlIGFyZSBub3QgY29tcGxldGVseSB1bmVuY29kZWQgYmVjYXVzZSB0aGV5IGluY2x1ZGUgYQotICAgICogJ3ZpZXdpbmcgY29ycmVjdGlvbicgdG8gZGVjcmVhc2Ugb3IgKG5vcm1hbGx5KSBpbmNyZWFzZSB0aGUgcGVyY2VwdHVhbAotICAgICogY29udHJhc3Qgb2YgdGhlIGltYWdlLiAgVGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGlzIC0gd2UgZG9uJ3QKLSAgICAqIGtub3cgd2hhdCBpdCBpcyAtIHNvIGFzc3VtZSB0aGUgdW5lbmNvZGVkIHZhbHVlIGlzIHBlcmNlcHR1YWxseSBsaW5lYXIuCi0gICAgKi8KLSAgIHsKLSAgICAgIGRvdWJsZSBpbnB1dF9zYW1wbGUgPSBpOyAvKiBJbiByYW5nZSAwLi4xICovCi0gICAgICBkb3VibGUgb3V0cHV0LCBlcnJvciwgZW5jb2RlZF9zYW1wbGUsIGVuY29kZWRfZXJyb3I7Ci0gICAgICBkb3VibGUgZXNfbG8sIGVzX2hpOwotICAgICAgaW50IGNvbXBvc2UgPSAwOyAgICAgICAgICAgLyogU2V0IHRvIG9uZSBpZiBjb21wb3NpdGlvbiBkb25lICovCi0gICAgICBpbnQgb3V0cHV0X2lzX2VuY29kZWQ7ICAgICAvKiBTZXQgaWYgZW5jb2RlZCB0byBzY3JlZW4gZ2FtbWEgKi8KLSAgICAgIGludCBsb2dfbWF4X2Vycm9yID0gMTsgICAgIC8qIENoZWNrIG1heGltdW0gZXJyb3IgdmFsdWVzICovCi0gICAgICBwbmdfY29uc3RfY2hhcnAgcGFzcyA9IDA7ICAvKiBSZWFzb24gdGVzdCBwYXNzZXMgKG9yIDAgZm9yIGZhaWwpICovCi0KLSAgICAgIC8qIENvbnZlcnQgdG8gbGluZWFyIGxpZ2h0ICh3aXRoIHRoZSBhYm92ZSBjYXZlYXQuKSAgVGhlIGFscGhhIGNoYW5uZWwgaXMKLSAgICAgICAqIGFscmVhZHkgbGluZWFyLgotICAgICAgICovCi0gICAgICBpZiAoYWxwaGEgPj0gMCkKLSAgICAgIHsKLSAgICAgICAgIGludCB0Y29tcG9zZTsKLQotICAgICAgICAgaWYgKHZpLT5maWxlX2ludmVyc2UgPiAwKQotICAgICAgICAgICAgaW5wdXRfc2FtcGxlID0gcG93KGlucHV0X3NhbXBsZSwgdmktPmZpbGVfaW52ZXJzZSk7Ci0KLSAgICAgICAgIC8qIEhhbmRsZSB0aGUgY29tcG9zZSBwcm9jZXNzaW5nOiAqLwotICAgICAgICAgdGNvbXBvc2UgPSAwOwotICAgICAgICAgaW5wdXRfc2FtcGxlID0gZ2FtbWFfY29tcG9uZW50X2NvbXBvc2UoZG9fYmFja2dyb3VuZCwgaW5wdXRfc2FtcGxlLAotICAgICAgICAgICAgYWxwaGEsIGJhY2tncm91bmQsICZ0Y29tcG9zZSk7Ci0KLSAgICAgICAgIGlmICh0Y29tcG9zZSkKLSAgICAgICAgICAgIGNvbXBvc2UgPSAxOwotICAgICAgfQotCi0gICAgICAvKiBBbmQgc2ltaWxhcmx5IGZvciB0aGUgb3V0cHV0IHZhbHVlLCBidXQgd2UgbmVlZCB0byBjaGVjayB0aGUgYmFja2dyb3VuZAotICAgICAgICogaGFuZGxpbmcgdG8gbGluZWFyaXplIGl0IGNvcnJlY3RseS4KLSAgICAgICAqLwotICAgICAgb3V0cHV0ID0gb2Q7Ci0gICAgICBvdXRwdXQgLz0gb3V0bWF4OwotCi0gICAgICBvdXRwdXRfaXNfZW5jb2RlZCA9IHZpLT5zY3JlZW5fZ2FtbWEgPiAwOwotCi0gICAgICBpZiAoYWxwaGEgPCAwKSAvKiBUaGUgYWxwaGEgY2hhbm5lbCAqLwotICAgICAgewotI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECi0gICAgICAgICBpZiAoZG9fYmFja2dyb3VuZCAhPSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9CUk9LRU4pCi0jZW5kaWYKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluIGFsbCBvdGhlciBjYXNlcyB0aGUgb3V0cHV0IGFscGhhIGNoYW5uZWwgaXMgbGluZWFyIGFscmVhZHksCi0gICAgICAgICAgICAgKiBkb24ndCBsb2cgZXJyb3JzIGhlcmUsIHRoZXkgYXJlIG11Y2ggbGFyZ2VyIGluIGxpbmVhciBkYXRhLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBvdXRwdXRfaXNfZW5jb2RlZCA9IDA7Ci0gICAgICAgICAgICBsb2dfbWF4X2Vycm9yID0gMDsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECi0gICAgICBlbHNlIC8qIEEgY29tcG9uZW50ICovCi0gICAgICB7Ci0gICAgICAgICBpZiAoZG9fYmFja2dyb3VuZCA9PSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9PUFRJTUlaRUQgJiYKLSAgICAgICAgICAgIGFscGhhIDwgMSkgLyogdGhlIG9wdGltaXplZCBjYXNlIC0gbGluZWFyIG91dHB1dCAqLwotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGFscGhhID4gMCkgbG9nX21heF9lcnJvciA9IDA7Ci0gICAgICAgICAgICBvdXRwdXRfaXNfZW5jb2RlZCA9IDA7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKG91dHB1dF9pc19lbmNvZGVkKQotICAgICAgICAgb3V0cHV0ID0gcG93KG91dHB1dCwgdmktPnNjcmVlbl9nYW1tYSk7Ci0KLSAgICAgIC8qIENhbGN1bGF0ZSAob3IgcmVjYWxjdWxhdGUpIHRoZSBlbmNvZGVkX3NhbXBsZSB2YWx1ZSBhbmQgcmVwZWF0IHRoZQotICAgICAgICogY2hlY2sgYWJvdmUgKHVubmVjZXNzYXJ5IGlmIHdlIHRvb2sgdGhlIGZhc3Qgcm91dGUsIGJ1dCBoYXJtbGVzcy4pCi0gICAgICAgKi8KLSAgICAgIGVuY29kZWRfc2FtcGxlID0gaW5wdXRfc2FtcGxlOwotICAgICAgaWYgKG91dHB1dF9pc19lbmNvZGVkKQotICAgICAgICAgZW5jb2RlZF9zYW1wbGUgPSBwb3coZW5jb2RlZF9zYW1wbGUsIHZpLT5zY3JlZW5faW52ZXJzZSk7Ci0gICAgICBlbmNvZGVkX3NhbXBsZSAqPSBvdXRtYXg7Ci0KLSAgICAgIGVuY29kZWRfZXJyb3IgPSBmYWJzKG9kLWVuY29kZWRfc2FtcGxlKTsKLQotICAgICAgLyogRG9uJ3QgbG9nIGVycm9ycyBpbiB0aGUgYWxwaGEgY2hhbm5lbCwgb3IgdGhlICdvcHRpbWl6ZWQnIGNhc2UsCi0gICAgICAgKiBuZWl0aGVyIGFyZSBzaWduaWZpY2FudCB0byB0aGUgb3ZlcmFsbCBwZXJjZXB0aW9uLgotICAgICAgICovCi0gICAgICBpZiAobG9nX21heF9lcnJvciAmJiBlbmNvZGVkX2Vycm9yID4gdmktPmRwLT5tYXhlcnJvdXQpCi0gICAgICAgICB2aS0+ZHAtPm1heGVycm91dCA9IGVuY29kZWRfZXJyb3I7Ci0KLSAgICAgIGlmIChlbmNvZGVkX2Vycm9yIDwgdmktPm1heG91dF90b3RhbCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChlbmNvZGVkX2Vycm9yIDwgdmktPm91dGxvZykKLSAgICAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgICAvKiBUZXN0IHBhc3NlZCBidXQgZXJyb3IgaXMgYmlnZ2VyIHRoYW4gdGhlIGxvZyBsaW1pdCwgcmVjb3JkIHdoeSB0aGUKLSAgICAgICAgICAqIHRlc3QgcGFzc2VkOgotICAgICAgICAgICovCi0gICAgICAgICBwYXNzID0gImxlc3MgdGhhbiBtYXhvdXQ6XG4iOwotICAgICAgfQotCi0gICAgICAvKiBpOiB0aGUgb3JpZ2luYWwgaW5wdXQgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjEKLSAgICAgICAqCi0gICAgICAgKiBwbmd2YWxpZCBjYWxjdWxhdGlvbnM6Ci0gICAgICAgKiAgaW5wdXRfc2FtcGxlOiBsaW5lYXIgcmVzdWx0OyBpIGxpbmVhcml6ZWQgYW5kIGNvbXBvc2VkLCByYW5nZSAwLi4xCi0gICAgICAgKiAgZW5jb2RlZF9zYW1wbGU6IGVuY29kZWQgcmVzdWx0OyBpbnB1dF9zYW1wbGUgc2NhbGVkIHRvIG91cHV0IGJpdCBkZXB0aAotICAgICAgICoKLSAgICAgICAqIGxpYnBuZyBjYWxjdWxhdGlvbnM6Ci0gICAgICAgKiAgb3V0cHV0OiBsaW5lYXIgcmVzdWx0OyBvZCBzY2FsZWQgdG8gMC4uMSBhbmQgbGluZWFyaXplZAotICAgICAgICogIG9kOiBlbmNvZGVkIHJlc3VsdCBmcm9tIGxpYnBuZwotICAgICAgICovCi0KLSAgICAgIC8qIE5vdyB3ZSBoYXZlIHRoZSBudW1iZXJzIGZvciByZWFsIGVycm9ycywgYm90aCBhYnNvbHV0ZSB2YWx1ZXMgYXMgYXMgYQotICAgICAgICogcGVyY2VudGFnZSBvZiB0aGUgY29ycmVjdCB2YWx1ZSAob3V0cHV0KToKLSAgICAgICAqLwotICAgICAgZXJyb3IgPSBmYWJzKGlucHV0X3NhbXBsZS1vdXRwdXQpOwotCi0gICAgICBpZiAobG9nX21heF9lcnJvciAmJiBlcnJvciA+IHZpLT5kcC0+bWF4ZXJyYWJzKQotICAgICAgICAgdmktPmRwLT5tYXhlcnJhYnMgPSBlcnJvcjsKLQotICAgICAgLyogVGhlIGZvbGxvd2luZyBpcyBhbiBhdHRlbXB0IHRvIGlnbm9yZSB0aGUgdGVuZGVuY3kgb2YgcXVhbnRpemF0aW9uIHRvCi0gICAgICAgKiBkb21pbmF0ZSB0aGUgcGVyY2VudGFnZSBlcnJvcnMgZm9yIGxvd2VyIHJlc3VsdCB2YWx1ZXM6Ci0gICAgICAgKi8KLSAgICAgIGlmIChsb2dfbWF4X2Vycm9yICYmIGlucHV0X3NhbXBsZSA+IC41KQotICAgICAgewotICAgICAgICAgZG91YmxlIHBlcmNlbnRhZ2VfZXJyb3IgPSBlcnJvci9pbnB1dF9zYW1wbGU7Ci0gICAgICAgICBpZiAocGVyY2VudGFnZV9lcnJvciA+IHZpLT5kcC0+bWF4ZXJycGMpCi0gICAgICAgICAgICB2aS0+ZHAtPm1heGVycnBjID0gcGVyY2VudGFnZV9lcnJvcjsKLSAgICAgIH0KLQotICAgICAgLyogTm93IGNhbGN1bGF0ZSB0aGUgZGlnaXRpemF0aW9uIGxpbWl0cyBmb3IgJ2VuY29kZWRfc2FtcGxlJyB1c2luZyB0aGUKLSAgICAgICAqICdtYXgnIHZhbHVlcy4gIE5vdGUgdGhhdCBtYXhvdXQgaXMgaW4gdGhlIGVuY29kZWQgc3BhY2UgYnV0IG1heHBjIGFuZAotICAgICAgICogbWF4YWJzIGFyZSBpbiBsaW5lYXIgbGlnaHQgc3BhY2UuCi0gICAgICAgKgotICAgICAgICogRmlyc3QgZmluZCB0aGUgbWF4aW11bSBlcnJvciBpbiBsaW5lYXIgbGlnaHQgc3BhY2UsIHJhbmdlIDAuLjE6Ci0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSB0bXAgPSBpbnB1dF9zYW1wbGUgKiB2aS0+bWF4cGM7Ci0gICAgICAgICBpZiAodG1wIDwgdmktPm1heGFicykgdG1wID0gdmktPm1heGFiczsKLSAgICAgICAgIC8qIElmICdjb21wb3NlJyBpcyB0cnVlIHRoZSBjb21wb3NpdGlvbiB3YXMgZG9uZSBpbiBsaW5lYXIgc3BhY2UgdXNpbmcKLSAgICAgICAgICAqIGludGVnZXIgYXJpdGhtZXRpYy4gIFRoaXMgaW50cm9kdWNlcyBhbiBleHRyYSBlcnJvciBvZiArLy0gMC41IChhdAotICAgICAgICAgICogbGVhc3QpIGluIHRoZSBpbnRlZ2VyIHNwYWNlIHVzZWQuICAnbWF4Y2FsYycgcmVjb3JkcyB0aGlzLCB0YWtpbmcKLSAgICAgICAgICAqIGludG8gYWNjb3VudCB0aGUgcG9zc2liaWxpdHkgdGhhdCBldmVuIGZvciAxNiBiaXQgb3V0cHV0IDggYml0IHNwYWNlCi0gICAgICAgICAgKiBtYXkgaGF2ZSBiZWVuIHVzZWQuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChjb21wb3NlICYmIHRtcCA8IHZpLT5tYXhjYWxjKSB0bXAgPSB2aS0+bWF4Y2FsYzsKLQotICAgICAgICAgLyogVGhlICdtYXhvdXQnIHZhbHVlIHJlZmVycyB0byB0aGUgZW5jb2RlZCByZXN1bHQsIHRvIGNvbXBhcmUgd2l0aAotICAgICAgICAgICogdGhpcyBlbmNvZGUgaW5wdXRfc2FtcGxlIGFkanVzdGVkIGJ5IHRoZSBtYXhpbXVtIGVycm9yICh0bXApIGFib3ZlLgotICAgICAgICAgICovCi0gICAgICAgICBlc19sbyA9IGVuY29kZWRfc2FtcGxlIC0gdmktPm1heG91dDsKLQotICAgICAgICAgaWYgKGVzX2xvID4gMCAmJiBpbnB1dF9zYW1wbGUtdG1wID4gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBsb3dfdmFsdWUgPSBpbnB1dF9zYW1wbGUtdG1wOwotICAgICAgICAgICAgaWYgKG91dHB1dF9pc19lbmNvZGVkKQotICAgICAgICAgICAgICAgbG93X3ZhbHVlID0gcG93KGxvd192YWx1ZSwgdmktPnNjcmVlbl9pbnZlcnNlKTsKLSAgICAgICAgICAgIGxvd192YWx1ZSAqPSBvdXRtYXg7Ci0gICAgICAgICAgICBpZiAobG93X3ZhbHVlIDwgZXNfbG8pIGVzX2xvID0gbG93X3ZhbHVlOwotCi0gICAgICAgICAgICAvKiBRdWFudGl6ZSB0aGlzIGFwcHJvcHJpYXRlbHk6ICovCi0gICAgICAgICAgICBlc19sbyA9IGNlaWwoZXNfbG8gLyB2aS0+b3V0cXVhbnQgLSAuNSkgKiB2aS0+b3V0cXVhbnQ7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVzX2xvID0gMDsKLQotICAgICAgICAgZXNfaGkgPSBlbmNvZGVkX3NhbXBsZSArIHZpLT5tYXhvdXQ7Ci0KLSAgICAgICAgIGlmIChlc19oaSA8IG91dG1heCAmJiBpbnB1dF9zYW1wbGUrdG1wIDwgMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBoaWdoX3ZhbHVlID0gaW5wdXRfc2FtcGxlK3RtcDsKLSAgICAgICAgICAgIGlmIChvdXRwdXRfaXNfZW5jb2RlZCkKLSAgICAgICAgICAgICAgIGhpZ2hfdmFsdWUgPSBwb3coaGlnaF92YWx1ZSwgdmktPnNjcmVlbl9pbnZlcnNlKTsKLSAgICAgICAgICAgIGhpZ2hfdmFsdWUgKj0gb3V0bWF4OwotICAgICAgICAgICAgaWYgKGhpZ2hfdmFsdWUgPiBlc19oaSkgZXNfaGkgPSBoaWdoX3ZhbHVlOwotCi0gICAgICAgICAgICBlc19oaSA9IGZsb29yKGVzX2hpIC8gdmktPm91dHF1YW50ICsgLjUpICogdmktPm91dHF1YW50OwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBlc19oaSA9IG91dG1heDsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIHByaW1hcnkgdGVzdCBpcyB0aGF0IHRoZSBmaW5hbCBlbmNvZGVkIHZhbHVlIHJldHVybmVkIGJ5IHRoZQotICAgICAgICogbGlicmFyeSBzaG91bGQgYmUgYmV0d2VlbiB0aGUgdHdvIGxpbWl0cyAoaW5jbHVzaXZlKSB0aGF0IHdlcmUKLSAgICAgICAqIGNhbGN1bGF0ZWQgYWJvdmUuCi0gICAgICAgKi8KLSAgICAgIGlmIChvZCA+PSBlc19sbyAmJiBvZCA8PSBlc19oaSkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoZSB2YWx1ZSBwYXNzZXMsIGJ1dCB3ZSBtYXkgbmVlZCB0byBsb2cgdGhlIGluZm9ybWF0aW9uIGFueXdheS4gKi8KLSAgICAgICAgIGlmIChlbmNvZGVkX2Vycm9yIDwgdmktPm91dGxvZykKLSAgICAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgICBpZiAocGFzcyA9PSAwKQotICAgICAgICAgICAgcGFzcyA9ICJ3aXRoaW4gZGlnaXRpemF0aW9uIGxpbWl0czpcbiI7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgIC8qIFRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGluIHByb2Nlc3NpbmcsIG9yIHdlIG5lZWQgdG8gbG9nIHRoaXMKLSAgICAgICAgICAqIHZhbHVlLgotICAgICAgICAgICovCi0gICAgICAgICBkb3VibGUgaXNfbG8sIGlzX2hpOwotCi0gICAgICAgICAvKiBwYXNzIGlzIHNldCBhdCB0aGlzIHBvaW50IGlmIGVpdGhlciBvZiB0aGUgdGVzdHMgYWJvdmUgd291bGQgaGF2ZQotICAgICAgICAgICogcGFzc2VkLiAgRG9uJ3QgZG8gdGhlc2UgYWRkaXRpb25hbCB0ZXN0cyBoZXJlIC0ganVzdCBsb2cgdGhlCi0gICAgICAgICAgKiBvcmlnaW5hbCBbZXNfbG8uLmVzX2hpXSB2YWx1ZXMuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChwYXNzID09IDAgJiYgdmktPnVzZV9pbnB1dF9wcmVjaXNpb24gJiYgdmktPmRwLT5zYml0KQotICAgICAgICAgewotICAgICAgICAgICAgLyogT2ssIHNvbWV0aGluZyBpcyB3cm9uZyAtIHRoaXMgYWN0dWFsbHkgaGFwcGVucyBpbiBjdXJyZW50IGxpYnBuZwotICAgICAgICAgICAgICogMTYtdG8tOCBwcm9jZXNzaW5nLiAgQXNzdW1lIHRoYXQgdGhlIGlucHV0IHZhbHVlIChpZCwgYWRqdXN0ZWQKLSAgICAgICAgICAgICAqIGZvciBzYml0KSBjYW4gYmUgYW55d2hlcmUgYmV0d2VlbiB2YWx1ZS0uNSBhbmQgdmFsdWUrLjUgLSBxdWl0ZSBhCi0gICAgICAgICAgICAgKiBsYXJnZSByYW5nZSBpZiBzYml0IGlzIGxvdy4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBOT1RFOiBhdCBwcmVzZW50IGJlY2F1c2UgdGhlIGxpYnBuZyBnYW1tYSB0YWJsZSBzdHVmZiBoYXMgYmVlbgotICAgICAgICAgICAgICogY2hhbmdlZCB0byB1c2UgYSByb3VuZGluZyBhbGdvcml0aG0gdG8gY29ycmVjdCBlcnJvcnMgaW4gOC1iaXQKLSAgICAgICAgICAgICAqIGNhbGN1bGF0aW9ucyB0aGUgcHJlY2lzZSBzYml0IGNhbGN1bGF0aW9uIChhIHNoaWZ0KSBoYXMgYmVlbgotICAgICAgICAgICAgICogbG9zdC4gIFRoaXMgY2FuIHJlc3VsdCBpbiB1cCB0byBhICsvLTEgZXJyb3IgaW4gdGhlIHByZXNlbmNlIG9mCi0gICAgICAgICAgICAgKiBhbiBzYml0IGxlc3MgdGhhbiB0aGUgYml0IGRlcHRoLgotICAgICAgICAgICAgICovCi0jICAgICAgICAgICBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwCi0jICAgICAgICAgICAgICBkZWZpbmUgU0JJVF9FUlJPUiAuNQotIyAgICAgICAgICAgZWxzZQotIyAgICAgICAgICAgICAgZGVmaW5lIFNCSVRfRVJST1IgMS4KLSMgICAgICAgICAgIGVuZGlmCi0gICAgICAgICAgICBkb3VibGUgdG1wID0gKGlzYml0IC0gU0JJVF9FUlJPUikvc2JpdF9tYXg7Ci0KLSAgICAgICAgICAgIGlmICh0bXAgPD0gMCkKLSAgICAgICAgICAgICAgIHRtcCA9IDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFscGhhID49IDAgJiYgdmktPmZpbGVfaW52ZXJzZSA+IDAgJiYgdG1wIDwgMSkKLSAgICAgICAgICAgICAgIHRtcCA9IHBvdyh0bXAsIHZpLT5maWxlX2ludmVyc2UpOwotCi0gICAgICAgICAgICB0bXAgPSBnYW1tYV9jb21wb25lbnRfY29tcG9zZShkb19iYWNrZ3JvdW5kLCB0bXAsIGFscGhhLCBiYWNrZ3JvdW5kLAotICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRwdXRfaXNfZW5jb2RlZCAmJiB0bXAgPiAwICYmIHRtcCA8IDEpCi0gICAgICAgICAgICAgICB0bXAgPSBwb3codG1wLCB2aS0+c2NyZWVuX2ludmVyc2UpOwotCi0gICAgICAgICAgICBpc19sbyA9IGNlaWwob3V0bWF4ICogdG1wIC0gdmktPm1heG91dF90b3RhbCk7Ci0KLSAgICAgICAgICAgIGlmIChpc19sbyA8IDApCi0gICAgICAgICAgICAgICBpc19sbyA9IDA7Ci0KLSAgICAgICAgICAgIHRtcCA9IChpc2JpdCArIFNCSVRfRVJST1IpL3NiaXRfbWF4OwotCi0gICAgICAgICAgICBpZiAodG1wID49IDEpCi0gICAgICAgICAgICAgICB0bXAgPSAxOwotCi0gICAgICAgICAgICBlbHNlIGlmIChhbHBoYSA+PSAwICYmIHZpLT5maWxlX2ludmVyc2UgPiAwICYmIHRtcCA8IDEpCi0gICAgICAgICAgICAgICB0bXAgPSBwb3codG1wLCB2aS0+ZmlsZV9pbnZlcnNlKTsKLQotICAgICAgICAgICAgdG1wID0gZ2FtbWFfY29tcG9uZW50X2NvbXBvc2UoZG9fYmFja2dyb3VuZCwgdG1wLCBhbHBoYSwgYmFja2dyb3VuZCwKLSAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgICAgICAgICBpZiAob3V0cHV0X2lzX2VuY29kZWQgJiYgdG1wID4gMCAmJiB0bXAgPCAxKQotICAgICAgICAgICAgICAgdG1wID0gcG93KHRtcCwgdmktPnNjcmVlbl9pbnZlcnNlKTsKLQotICAgICAgICAgICAgaXNfaGkgPSBmbG9vcihvdXRtYXggKiB0bXAgKyB2aS0+bWF4b3V0X3RvdGFsKTsKLQotICAgICAgICAgICAgaWYgKGlzX2hpID4gb3V0bWF4KQotICAgICAgICAgICAgICAgaXNfaGkgPSBvdXRtYXg7Ci0KLSAgICAgICAgICAgIGlmICghKG9kIDwgaXNfbG8gfHwgb2QgPiBpc19oaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoZW5jb2RlZF9lcnJvciA8IHZpLT5vdXRsb2cpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLQotICAgICAgICAgICAgICAgcGFzcyA9ICJ3aXRoaW4gaW5wdXQgcHJlY2lzaW9uIGxpbWl0czpcbiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIE9uZSBsYXN0IGNoYW5jZS4gIElmIHRoaXMgaXMgYW4gYWxwaGEgY2hhbm5lbCBhbmQgdGhlIDE2dG84Ci0gICAgICAgICAgICAgKiBvcHRpb24gaGFzIGJlZW4gdXNlZCBhbmQgJ2luYWNjdXJhdGUnIHNjYWxpbmcgaXMgdXNlZCB0aGVuIHRoZQotICAgICAgICAgICAgICogYml0IHJlZHVjdGlvbiBpcyBvYnRhaW5lZCBieSBzaW1wbHkgdXNpbmcgdGhlIHRvcCA4IGJpdHMgb2YgdGhlCi0gICAgICAgICAgICAgKiB2YWx1ZS4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgZG9uZSBmb3Igb2xkZXIgbGlicG5nIHZlcnNpb25zIHdoZW4gdGhlICdpbmFjY3VyYXRlJwotICAgICAgICAgICAgICogKGNob3ApIG1ldGhvZCBvZiBzY2FsaW5nIHdhcyB1c2VkLgotICAgICAgICAgICAgICovCi0jICAgICAgICAgICBpZm5kZWYgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKLSMgICAgICAgICAgICAgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA1MDQKLSAgICAgICAgICAgICAgICAgIC8qIFRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBvdGhlciBjb21wb25lbnRzIGluIHRoZSBmdXR1cmUsCi0gICAgICAgICAgICAgICAgICAgKiBidXQgYXQgcHJlc2VudCB0aGUgcHJlc2VuY2Ugb2YgZ2FtbWEgY29ycmVjdGlvbiBlZmZlY3RpdmVseQotICAgICAgICAgICAgICAgICAgICogcHJldmVudHMgdGhlIGVycm9ycyBpbiB0aGUgY29tcG9uZW50IHNjYWxpbmcgKEkgZG9uJ3QgcXVpdGUKLSAgICAgICAgICAgICAgICAgICAqIHVuZGVyc3RhbmQgd2h5LCBidXQgc2luY2UgaXQncyBiZXR0ZXIgdGhpcyB3YXkgSSBjYXJlIG5vdAotICAgICAgICAgICAgICAgICAgICogdG8gYXNrLCBKQiAyMDExMDQxOS4pCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDAgJiYgYWxwaGEgPCAwICYmIHZpLT5zY2FsZTE2ICYmIHZpLT5zYml0ID4gOCAmJgotICAgICAgICAgICAgICAgICAgICAgdmktPnNiaXQgKyB2aS0+aXNiaXRfc2hpZnQgPT0gMTYpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKGlkID4+IDgpIC0gLjUpLzI1NTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc19sbyA9IGNlaWwob3V0bWF4ICogdG1wIC0gdmktPm1heG91dF90b3RhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbG8gPCAwKSBpc19sbyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xvID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgdG1wID0gKChpZCA+PiA4KSArIC41KS8yNTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPCAxKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNfaGkgPSBmbG9vcihvdXRtYXggKiB0bXAgKyB2aS0+bWF4b3V0X3RvdGFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19oaSA+IG91dG1heCkgaXNfaGkgPSBvdXRtYXg7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzX2hpID0gb3V0bWF4OwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAoIShvZCA8IGlzX2xvIHx8IG9kID4gaXNfaGkpKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZWRfZXJyb3IgPCB2aS0+b3V0bG9nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSAid2l0aGluIDggYml0IGxpbWl0czpcbiI7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0jICAgICAgICAgICAgICBlbmRpZgotIyAgICAgICAgICAgZW5kaWYKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgLyogIXVzZV9pbnB1dF9wcmVjaXNpb24gKi8KLSAgICAgICAgICAgIGlzX2xvID0gZXNfbG8sIGlzX2hpID0gZXNfaGk7Ci0KLSAgICAgICAgIC8qIEF0dGVtcHQgdG8gb3V0cHV0IGEgbWVhbmluZ2Z1bCBlcnJvci93YXJuaW5nIG1lc3NhZ2U6IHRoZSBtZXNzYWdlCi0gICAgICAgICAgKiBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgYmFja2dyb3VuZC9jb21wb3NpdGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZAotICAgICAgICAgICogYmVjYXVzZSB0aGlzIGNoYW5nZXMgd2hhdCBwYXJhbWV0ZXJzIHdlcmUgYWN0dWFsbHkgdXNlZCBhYm92ZS4KLSAgICAgICAgICAqLwotICAgICAgICAgewotICAgICAgICAgICAgc2l6ZV90IHBvcyA9IDA7Ci0gICAgICAgICAgICAvKiBOZWVkIGVpdGhlciAxLzI1NSBvciAxLzY1NTM1IHByZWNpc2lvbiBoZXJlOyAzIG9yIDYgZGVjaW1hbAotICAgICAgICAgICAgICogcGxhY2VzLiAgSnVzdCB1c2Ugb3V0bWF4IHRvIHdvcmsgb3V0IHdoaWNoLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgcHJlY2lzaW9uID0gKG91dG1heCA+PSAxMDAwID8gNiA6IDMpOwotICAgICAgICAgICAgaW50IHVzZV9pbnB1dD0xLCB1c2VfYmFja2dyb3VuZD0wLCBkb19jb21wb3NlPTA7Ci0gICAgICAgICAgICBjaGFyIG1zZ1syNTZdOwotCi0gICAgICAgICAgICBpZiAocGFzcyAhPSAwKQotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIlxuXHQiKTsKLQotICAgICAgICAgICAgLyogU2V0IHVwIHRoZSB2YXJpb3VzIGZsYWdzLCB0aGUgb3V0cHV0X2lzX2VuY29kZWQgZmxhZyBhYm92ZQotICAgICAgICAgICAgICogaXMgYWxzbyB1c2VkIGJlbG93LiAgZG9fY29tcG9zZSBpcyBqdXN0IGEgZG91YmxlIGNoZWNrLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzd2l0Y2ggKGRvX2JhY2tncm91bmQpCi0gICAgICAgICAgICB7Ci0jICAgICAgICAgICBpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgY2FzZSBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU46Ci0gICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEU6Ci0gICAgICAgICAgICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRToKLSAgICAgICAgICAgICAgICAgIHVzZV9iYWNrZ3JvdW5kID0gKGFscGhhID49IDAgJiYgYWxwaGEgPCAxKTsKLSAgICAgICAgICAgICAgICAgIC8qRkFMTCBUSFJPVUdIKi8KLSMgICAgICAgICAgIGVuZGlmCi0jICAgICAgICAgICBpZmRlZiBQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9TVEFOREFSRDoKLSAgICAgICAgICAgICAgIGNhc2UgQUxQSEFfTU9ERV9PRkZTRVQgKyBQTkdfQUxQSEFfQlJPS0VOOgotICAgICAgICAgICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9PUFRJTUlaRUQ6Ci0jICAgICAgICAgICBlbmRpZiAvKiBBTFBIQV9NT0RFX1NVUFBPUlRFRCAqLwotICAgICAgICAgICAgICAgZG9fY29tcG9zZSA9IChhbHBoYSA+IDAgJiYgYWxwaGEgPCAxKTsKLSAgICAgICAgICAgICAgIHVzZV9pbnB1dCA9IChhbHBoYSAhPSAwKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIHRoZSAnY29tcG9zZScgZmxhZyAqLwotICAgICAgICAgICAgaWYgKGNvbXBvc2UgIT0gZG9fY29tcG9zZSkKLSAgICAgICAgICAgICAgIHBuZ19lcnJvcih2aS0+cHAsICJpbnRlcm5hbCBlcnJvciAoY29tcG9zZSkiKTsKLQotICAgICAgICAgICAgLyogJ25hbWUnIGlzIHRoZSBjb21wb25lbnQgbmFtZSAqLwotICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgbmFtZSk7Ci0gICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKCIpOwotICAgICAgICAgICAgcG9zID0gc2FmZWNhdG4obXNnLCBzaXplb2YgbXNnLCBwb3MsIGlkKTsKLSAgICAgICAgICAgIGlmICh1c2VfaW5wdXQgfHwgcGFzcyAhPSAwLypsb2dnaW5nKi8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoaXNiaXQgIT0gaWQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBzQklUIGhhcyByZWR1Y2VkIHRoZSBwcmVjaXNpb24gb2YgdGhlIGlucHV0OiAqLwotICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiwgc2JpdCgiKTsKLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1zZywgc2l6ZW9mIG1zZywgcG9zLCB2aS0+c2JpdCk7Ci0gICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKTogIik7Ci0gICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0bihtc2csIHNpemVvZiBtc2csIHBvcywgaXNiaXQpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIi8iKTsKLSAgICAgICAgICAgICAgIC8qIFRoZSBvdXRwdXQgaXMgZWl0aGVyICJpZC9tYXgiIG9yICJpZCBzYml0KHNiaXQpOiBpc2JpdC9tYXgiICovCi0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0bihtc2csIHNpemVvZiBtc2csIHBvcywgdmktPnNiaXRfbWF4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIpIik7Ci0KLSAgICAgICAgICAgIC8qIEEgY29tcG9uZW50IG1heSBoYXZlIGJlZW4gbXVsdGlwbGllZCAoaW4gbGluZWFyIHNwYWNlKSBieSB0aGUKLSAgICAgICAgICAgICAqIGFscGhhIHZhbHVlLCAnY29tcG9zZScgc2F5cyB3aGV0aGVyIHRoaXMgaXMgcmVsZXZhbnQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChjb21wb3NlIHx8IHBhc3MgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIElmIGFueSBmb3JtIG9mIGNvbXBvc2l0aW9uIGlzIGJlaW5nIGRvbmUgcmVwb3J0IG91cgotICAgICAgICAgICAgICAgICogY2FsY3VsYXRlZCBsaW5lYXIgdmFsdWUgaGVyZSAodGhlIGNvZGUgYWJvdmUgZG9lc24ndCByZWNvcmQKLSAgICAgICAgICAgICAgICAqIHRoZSBpbnB1dCB2YWx1ZSBiZWZvcmUgY29tcG9zaXRpb24gaXMgcGVyZm9ybWVkLCBzbyB3aGF0Ci0gICAgICAgICAgICAgICAgKiBnZXRzIHJlcG9ydGVkIGlzIHRoZSB2YWx1ZSBhZnRlciBjb21wb3NpdGlvbi4pCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGlmICh1c2VfaW5wdXQgfHwgcGFzcyAhPSAwKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHZpLT5maWxlX2ludmVyc2UgPiAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIl4iKTsKLSAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKG1zZywgc2l6ZW9mIG1zZywgcG9zLCB2aS0+ZmlsZV9pbnZlcnNlLCAyKTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIltsaW5lYXJdIik7Ci0KLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIqKGFscGhhKSIpOwotICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQobXNnLCBzaXplb2YgbXNnLCBwb3MsIGFscGhhLCBwcmVjaXNpb24pOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAvKiBOb3cgcmVjb3JkIHRoZSAqbGluZWFyKiBiYWNrZ3JvdW5kIHZhbHVlIGlmIGl0IHdhcyB1c2VkCi0gICAgICAgICAgICAgICAgKiAodGhpcyBmdW5jdGlvbiBpcyBub3QgcGFzc2VkIHRoZSBvcmlnaW5hbCwgbm9uLWxpbmVhciwKLSAgICAgICAgICAgICAgICAqIHZhbHVlIGJ1dCBpdCBpcyBjb250YWluZWQgaW4gdGhlIHRlc3QgbmFtZS4pCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGlmICh1c2VfYmFja2dyb3VuZCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsIHVzZV9pbnB1dCA/ICIrIiA6ICIgIik7Ci0gICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKGJhY2tncm91bmQpIik7Ci0gICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgYmFja2dyb3VuZCwgcHJlY2lzaW9uKTsKLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIqIik7Ci0gICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgMS1hbHBoYSwgcHJlY2lzaW9uKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBjYWxjdWxhdGVkIHZhbHVlIChpbnB1dF9zYW1wbGUpIGFuZCB0aGUgbGluZWFyaXplZAotICAgICAgICAgICAgICogbGlicG5nIHZhbHVlIChvdXRwdXQpIHVubGVzcyB0aGlzIGlzIGp1c3QgYSBjb21wb25lbnQgZ2FtbWEKLSAgICAgICAgICAgICAqIGNvcnJlY3Rpb24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChjb21wb3NlIHx8IGFscGhhIDwgMCB8fCBwYXNzICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLAotICAgICAgICAgICAgICAgICAgcGFzcyAhPSAwID8gIiA9XG5cdCIgOiAiID0gIik7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgaW5wdXRfc2FtcGxlLCBwcmVjaXNpb24pOwotICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiAobGlicG5nOiAiKTsKLSAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBvdXRwdXQsIHByZWNpc2lvbik7Ci0gICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiKSIpOwotCi0gICAgICAgICAgICAgICAvKiBGaW5hbGx5IHJlcG9ydCB0aGUgb3V0cHV0IGdhbW1hIGVuY29kaW5nLCBpZiBhbnkuICovCi0gICAgICAgICAgICAgICBpZiAob3V0cHV0X2lzX2VuY29kZWQpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiIF4iKTsKLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKG1zZywgc2l6ZW9mIG1zZywgcG9zLCB2aS0+c2NyZWVuX2ludmVyc2UsIDIpOwotICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIih0byBzY3JlZW4pID0iKTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIiBbc2NyZWVuIGlzIGxpbmVhcl0gPSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKCFjb21wb3NlICYmIGFscGhhID49IDApIHx8IHBhc3MgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChwYXNzICE9IDApIC8qIGxvZ2dpbmcgKi8KLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJcblx0W292ZXJhbGw6Iik7Ci0KLSAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIG5vbi1jb21wb3NpdGlvbiBjYXNlLCB0aGUgaW50ZXJuYWwgbGluZWFyCi0gICAgICAgICAgICAgICAgKiB2YWx1ZXMgYXJlIGlycmVsZXZhbnQgKHRob3VnaCB0aGUgbG9nIGJlbG93IHdpbGwgcmV2ZWFsCi0gICAgICAgICAgICAgICAgKiB0aGVtLikgIE91dHB1dCBhIG11Y2ggc2hvcnRlciB3YXJuaW5nL2Vycm9yIG1lc3NhZ2UgYW5kIHJlcG9ydAotICAgICAgICAgICAgICAgICogdGhlIG92ZXJhbGwgZ2FtbWEgY29ycmVjdGlvbi4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgaWYgKHZpLT5nYW1tYV9jb3JyZWN0aW9uID4gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIgXiIpOwotICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQobXNnLCBzaXplb2YgbXNnLCBwb3MsIHZpLT5nYW1tYV9jb3JyZWN0aW9uLCAyKTsKLSAgICAgICAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIoZ2FtbWEgY29ycmVjdGlvbikgPSIpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLAotICAgICAgICAgICAgICAgICAgICAgIiBbbm8gZ2FtbWEgY29ycmVjdGlvbl0gPSIpOwotCi0gICAgICAgICAgICAgICBpZiAocGFzcyAhPSAwKQotICAgICAgICAgICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgIl0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogVGhpcyBpcyBvdXIgY2FsY3VsYXRlZCBlbmNvZGVkX3NhbXBsZSB3aGljaCBzaG91bGQgKGJ1dCBkb2VzCi0gICAgICAgICAgICAgKiBub3QpIG1hdGNoIG9kOgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCBwYXNzICE9IDAgPyAiXG5cdCIgOiAiICIpOwotICAgICAgICAgICAgcG9zID0gc2FmZWNhdGQobXNnLCBzaXplb2YgbXNnLCBwb3MsIGlzX2xvLCAxKTsKLSAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIgPCAiKTsKLSAgICAgICAgICAgIHBvcyA9IHNhZmVjYXRkKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBlbmNvZGVkX3NhbXBsZSwgMSk7Ci0gICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiIChsaWJwbmc6ICIpOwotICAgICAgICAgICAgcG9zID0gc2FmZWNhdG4obXNnLCBzaXplb2YgbXNnLCBwb3MsIG9kKTsKLSAgICAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICIpIik7Ci0gICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiLyIpOwotICAgICAgICAgICAgcG9zID0gc2FmZWNhdG4obXNnLCBzaXplb2YgbXNnLCBwb3MsIG91dG1heCk7Ci0gICAgICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiIDwgIik7Ci0gICAgICAgICAgICBwb3MgPSBzYWZlY2F0ZChtc2csIHNpemVvZiBtc2csIHBvcywgaXNfaGksIDEpOwotCi0gICAgICAgICAgICBpZiAocGFzcyA9PSAwKSAvKiBUaGUgZXJyb3IgY29uZGl0aW9uICovCi0gICAgICAgICAgICB7Ci0jICAgICAgICAgICAgICBpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVECi0gICAgICAgICAgICAgICAgICBwbmdfd2FybmluZyh2aS0+cHAsIG1zZyk7Ci0jICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzdG9yZV93YXJuaW5nKHZpLT5wcCwgbXNnKTsKLSMgICAgICAgICAgICAgIGVuZGlmCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgLyogbG9nZ2luZyB0aGlzIHZhbHVlICovCi0gICAgICAgICAgICAgICBzdG9yZV92ZXJib3NlKCZ2aS0+ZHAtPnBtLT50aGlzLCB2aS0+cHAsIHBhc3MsIG1zZyk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBpOwotfQotCi1zdGF0aWMgdm9pZAotZ2FtbWFfaW1hZ2VfdmFsaWRhdGUoZ2FtbWFfZGlzcGxheSAqZHAsIHBuZ19jb25zdF9zdHJ1Y3RwIHBwLAotICAgcG5nX2luZm9wIHBpKQotewotICAgLyogR2V0IHNvbWUgY29uc3RhbnRzIGRlcml2ZWQgZnJvbSB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlIGZvcm1hdHM6ICovCi0gICBjb25zdCBwbmdfc3RvcmUqIGNvbnN0IHBzID0gZHAtPnRoaXMucHM7Ci0gICBjb25zdCBwbmdfYnl0ZSBpbl9jdCA9IGRwLT50aGlzLmNvbG91cl90eXBlOwotICAgY29uc3QgcG5nX2J5dGUgaW5fYmQgPSBkcC0+dGhpcy5iaXRfZGVwdGg7Ci0gICBjb25zdCBwbmdfdWludF8zMiB3ID0gZHAtPnRoaXMudzsKLSAgIGNvbnN0IHBuZ191aW50XzMyIGggPSBkcC0+dGhpcy5oOwotICAgY29uc3Qgc2l6ZV90IGNiUm93ID0gZHAtPnRoaXMuY2JSb3c7Ci0gICBjb25zdCBwbmdfYnl0ZSBvdXRfY3QgPSBwbmdfZ2V0X2NvbG9yX3R5cGUocHAsIHBpKTsKLSAgIGNvbnN0IHBuZ19ieXRlIG91dF9iZCA9IHBuZ19nZXRfYml0X2RlcHRoKHBwLCBwaSk7Ci0KLSAgIC8qIFRoZXJlIGFyZSB0aHJlZSBzb3VyY2VzIG9mIGVycm9yLCBmaXJzdGx5IHRoZSBxdWFudGl6YXRpb24gaW4gdGhlCi0gICAgKiBmaWxlIGVuY29kaW5nLCBkZXRlcm1pbmVkIGJ5IHNiaXQgYW5kL29yIHRoZSBmaWxlIGRlcHRoLCBzZWNvbmRseQotICAgICogdGhlIG91dHB1dCAoc2NyZWVuKSBnYW1tYSBhbmQgdGhpcmRseSB0aGUgb3V0cHV0IGZpbGUgZW5jb2RpbmcuCi0gICAgKgotICAgICogU2luY2UgdGhpcyBBUEkgcmVjZWl2ZXMgdGhlIHNjcmVlbiBhbmQgZmlsZSBnYW1tYSBpbiBkb3VibGUKLSAgICAqIHByZWNpc2lvbiBpdCBpcyBwb3NzaWJsZSB0byBjYWxjdWxhdGUgYW4gZXhhY3QgYW5zd2VyIGdpdmVuIGFuIGlucHV0Ci0gICAgKiBwaXhlbCB2YWx1ZS4gIFRoZXJlZm9yZSB3ZSBhc3N1bWUgdGhhdCB0aGUgKmlucHV0KiB2YWx1ZSBpcyBleGFjdCAtCi0gICAgKiBzYW1wbGUvbWF4c2FtcGxlIC0gY2FsY3VsYXRlIHRoZSBjb3JyZXNwb25kaW5nIGdhbW1hIGNvcnJlY3RlZAotICAgICogb3V0cHV0IHRvIHRoZSBsaW1pdHMgb2YgZG91YmxlIHByZWNpc2lvbiBhcml0aG1ldGljIGFuZCBjb21wYXJlIHdpdGgKLSAgICAqIHdoYXQgbGlicG5nIHJldHVybnMuCi0gICAgKgotICAgICogU2luY2UgdGhlIGxpYnJhcnkgbXVzdCBxdWFudGl6ZSB0aGUgb3V0cHV0IHRvIDggb3IgMTYgYml0cyB0aGVyZSBpcwotICAgICogYSBmdW5kYW1lbnRhbCBsaW1pdCBvbiB0aGUgYWNjdXJhY3kgb2YgdGhlIG91dHB1dCBvZiArLy0uNSAtIHRoaXMKLSAgICAqIHF1YW50aXphdGlvbiBsaW1pdCBpcyBpbmNsdWRlZCBpbiBhZGRpdGlvbiB0byB0aGUgb3RoZXIgbGltaXRzCi0gICAgKiBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtYXRlcnMgdG8gdGhlIEFQSS4gIChFZmZlY3RpdmVseSwgYWRkIC41Ci0gICAgKiBldmVyeXdoZXJlLikKLSAgICAqCi0gICAgKiBUaGUgYmVoYXZpb3Igb2YgdGhlICdzYml0JyBwYXJhbXRlciBpcyBkZWZpbmVkIGJ5IHNlY3Rpb24gMTIuNQotICAgICogKHNhbXBsZSBkZXB0aCBzY2FsaW5nKSBvZiB0aGUgUE5HIHNwZWMuICBUaGF0IHNlY3Rpb24gZm9yY2VzIHRoZQotICAgICogZGVjb2RlciB0byBhc3N1bWUgdGhhdCB0aGUgUE5HIHZhbHVlcyBoYXZlIGJlZW4gc2NhbGVkIGlmIHNCSVQgaXMKLSAgICAqIHByZXNlbnQ6Ci0gICAgKgotICAgICogICAgIHBuZy1zYW1wbGUgPSBmbG9vciggaW5wdXQtc2FtcGxlICogKG1heC1vdXQvbWF4LWluKSArIC41KTsKLSAgICAqCi0gICAgKiBUaGlzIG1lYW5zIHRoYXQgb25seSBhIHN1YnNldCBvZiB0aGUgcG9zc2libGUgUE5HIHZhbHVlcyBzaG91bGQKLSAgICAqIGFwcGVhciBpbiB0aGUgaW5wdXQuIEhvd2V2ZXIsIHRoZSBzcGVjIGFsbG93cyB0aGUgZW5jb2RlciB0byB1c2UgYQotICAgICogdmFyaWV0eSBvZiBhcHByb3hpbWF0aW9ucyB0byB0aGUgYWJvdmUgYW5kIGRvZXNuJ3QgcmVxdWlyZSBhbnkKLSAgICAqIHJlc3RyaWN0aW9uIG9mIHRoZSB2YWx1ZXMgcHJvZHVjZWQuCi0gICAgKgotICAgICogTmV2ZXJ0aGVsZXNzIHRoZSBzcGVjIHJlcXVpcmVzIHRoYXQgdGhlIHVwcGVyICdzQklUJyBiaXRzIG9mIHRoZQotICAgICogdmFsdWUgc3RvcmVkIGluIGEgUE5HIGZpbGUgYmUgdGhlIG9yaWdpbmFsIHNhbXBsZSBiaXRzLgotICAgICogQ29uc2VxdWVudGx5IHRoZSBjb2RlIGJlbG93IHNpbXBseSBzY2FsZXMgdGhlIHRvcCBzYml0IGJpdHMgYnkKLSAgICAqICgxPDxzYml0KS0xIHRvIG9idGFpbiBhbiBvcmlnaW5hbCBzYW1wbGUgdmFsdWUuCi0gICAgKgotICAgICogQmVjYXVzZSB0aGVyZSBpcyBsaW1pdGVkIHByZWNpc2lvbiBpbiB0aGUgaW5wdXQgaXQgaXMgYXJndWFibGUgdGhhdAotICAgICogYW4gYWNjZXB0YWJsZSByZXN1bHQgaXMgYW55IHZhbGlkIHJlc3VsdCBmcm9tIGlucHV0LS41IHRvIGlucHV0Ky41LgotICAgICogVGhlIGJhc2ljIHRlc3RzIGJlbG93IGRvIG5vdCBkbyB0aGlzLCBob3dldmVyIGlmICd1c2VfaW5wdXRfcHJlY2lzaW9uJwotICAgICogaXMgc2V0IGEgc3Vic2VxdWVudCB0ZXN0IGlzIHBlcmZvcm1lZCBhYm92ZS4KLSAgICAqLwotICAgY29uc3QgdW5zaWduZWQgaW50IHNhbXBsZXNfcGVyX3BpeGVsID0gKG91dF9jdCAmIDJVKSA/IDNVIDogMVU7Ci0gICBpbnQgcHJvY2Vzc2luZzsKLSAgIHBuZ191aW50XzMyIHk7Ci0gICBjb25zdCBzdG9yZV9wYWxldHRlX2VudHJ5ICppbl9wYWxldHRlID0gZHAtPnRoaXMucGFsZXR0ZTsKLSAgIGNvbnN0IGludCBpbl9pc190cmFuc3BhcmVudCA9IGRwLT50aGlzLmlzX3RyYW5zcGFyZW50OwotICAgaW50IHByb2Nlc3NfdFJOUzsKLSAgIGludCBvdXRfbnBhbGV0dGUgPSAtMTsKLSAgIGludCBvdXRfaXNfdHJhbnNwYXJlbnQgPSAwOyAvKiBKdXN0IHJlZmVycyB0byB0aGUgcGFsZXR0ZSBjYXNlICovCi0gICBzdG9yZV9wYWxldHRlIG91dF9wYWxldHRlOwotICAgdmFsaWRhdGVfaW5mbyB2aTsKLQotICAgLyogQ2hlY2sgZm9yIHJvdyBvdmVyd3JpdGUgZXJyb3JzICovCi0gICBzdG9yZV9pbWFnZV9jaGVjayhkcC0+dGhpcy5wcywgcHAsIDApOwotCi0gICAvKiBTdXBwbHkgdGhlIGlucHV0IGFuZCBvdXRwdXQgc2FtcGxlIGRlcHRocyBoZXJlIC0gOCBmb3IgYW4gaW5kZXhlZCBpbWFnZSwKLSAgICAqIG90aGVyd2lzZSB0aGUgYml0IGRlcHRoLgotICAgICovCi0gICBpbml0X3ZhbGlkYXRlX2luZm8oJnZpLCBkcCwgcHAsIGluX2N0PT0zPzg6aW5fYmQsIG91dF9jdD09Mz84Om91dF9iZCk7Ci0KLSAgIHByb2Nlc3NpbmcgPSAodmkuZ2FtbWFfY29ycmVjdGlvbiA+IDAgJiYgIWRwLT50aHJlc2hvbGRfdGVzdCkKLSAgICAgIHx8IGluX2JkICE9IG91dF9iZCB8fCBpbl9jdCAhPSBvdXRfY3QgfHwgdmkuZG9fYmFja2dyb3VuZDsKLSAgIHByb2Nlc3NfdFJOUyA9IGRwLT50aGlzLmhhc190Uk5TICYmIHZpLmRvX2JhY2tncm91bmQ7Ci0KLSAgIC8qIFRPRE86IEZJWCBUSElTOiBNQUpPUiBCVUchICBJZiB0aGUgdHJhbnNmb3JtYXRpb25zIGFsbCBoYXBwZW4gaW5zaWRlCi0gICAgKiB0aGUgcGFsZXR0ZSB0aGVyZSBpcyBubyB3YXkgb2YgZmluZGluZyBvdXQsIGJlY2F1c2UgbGlicG5nIGZhaWxzIHRvCi0gICAgKiB1cGRhdGUgdGhlIHBhbGV0dGUgb24gcG5nX3JlYWRfdXBkYXRlX2luZm8uICBJbmRlZWQsIGxpYnBuZyBkb2Vzbid0Ci0gICAgKiBldmVuIGRvIHRoZSByZXF1aXJlZCB3b3JrIHVudGlsIG11Y2ggbGF0ZXIsIHdoZW4gaXQgZG9lc24ndCBoYXZlIGFueQotICAgICogaW5mbyBwb2ludGVyLiAgT29wcy4gIEZvciB0aGUgbW9tZW50ICdwcm9jZXNzaW5nJyBpcyB0dXJuZWQgb2ZmIGlmCi0gICAgKiBvdXRfY3QgaXMgcGFsZXR0ZS4KLSAgICAqLwotICAgaWYgKGluX2N0ID09IDMgJiYgb3V0X2N0ID09IDMpCi0gICAgICBwcm9jZXNzaW5nID0gMDsKLQotICAgaWYgKHByb2Nlc3NpbmcgJiYgb3V0X2N0ID09IDMpCi0gICAgICBvdXRfaXNfdHJhbnNwYXJlbnQgPSByZWFkX3BhbGV0dGUob3V0X3BhbGV0dGUsICZvdXRfbnBhbGV0dGUsIHBwLCBwaSk7Ci0KLSAgIGZvciAoeT0wOyB5PGg7ICsreSkKLSAgIHsKLSAgICAgIHBuZ19jb25zdF9ieXRlcCBwUm93ID0gc3RvcmVfaW1hZ2Vfcm93KHBzLCBwcCwgMCwgeSk7Ci0gICAgICBwbmdfYnl0ZSBzdGRbU1RBTkRBUkRfUk9XTUFYXTsKLQotICAgICAgdHJhbnNmb3JtX3JvdyhwcCwgc3RkLCBpbl9jdCwgaW5fYmQsIHkpOwotCi0gICAgICBpZiAocHJvY2Vzc2luZykKLSAgICAgIHsKLSAgICAgICAgIHVuc2lnbmVkIGludCB4OwotCi0gICAgICAgICBmb3IgKHg9MDsgeDx3OyArK3gpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgYWxwaGEgPSAxOyAvKiBzZXJ2ZXMgYXMgYSBmbGFnIHZhbHVlICovCi0KLSAgICAgICAgICAgIC8qIFJlY29yZCB0aGUgcGFsZXR0ZSBpbmRleCBmb3IgaW5kZXggaW1hZ2VzLiAqLwotICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGluX2luZGV4ID0KLSAgICAgICAgICAgICAgIGluX2N0ID09IDMgPyBzYW1wbGUoc3RkLCAzLCBpbl9iZCwgeCwgMCwgMCwgMCkgOiAyNTY7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgb3V0X2luZGV4ID0KLSAgICAgICAgICAgICAgIG91dF9jdCA9PSAzID8gc2FtcGxlKHN0ZCwgMywgb3V0X2JkLCB4LCAwLCAwLCAwKSA6IDI1NjsKLQotICAgICAgICAgICAgLyogSGFuZGxlIGlucHV0IGFscGhhIC0gcG5nX3NldF9iYWNrZ3JvdW5kIHdpbGwgY2F1c2UgdGhlIG91dHB1dAotICAgICAgICAgICAgICogYWxwaGEgdG8gZGlzYXBwZWFyIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2suCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgoaW5fY3QgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgIT0gMCB8fAotICAgICAgICAgICAgICAgIChpbl9jdCA9PSAzICYmIGluX2lzX3RyYW5zcGFyZW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBpbnB1dF9hbHBoYSA9IGluX2N0ID09IDMgPwotICAgICAgICAgICAgICAgICAgZHAtPnRoaXMucGFsZXR0ZVtpbl9pbmRleF0uYWxwaGEgOgotICAgICAgICAgICAgICAgICAgc2FtcGxlKHN0ZCwgaW5fY3QsIGluX2JkLCB4LCBzYW1wbGVzX3Blcl9waXhlbCwgMCwgMCk7Ci0KLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvdXRwdXRfYWxwaGEgPSA2NTUzNiAvKiBhcyBhIGZsYWcgdmFsdWUgKi87Ci0KLSAgICAgICAgICAgICAgIGlmIChvdXRfY3QgPT0gMykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChvdXRfaXNfdHJhbnNwYXJlbnQpCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYWxwaGEgPSBvdXRfcGFsZXR0ZVtvdXRfaW5kZXhdLmFscGhhOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBlbHNlIGlmICgob3V0X2N0ICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDApCi0gICAgICAgICAgICAgICAgICBvdXRwdXRfYWxwaGEgPSBzYW1wbGUocFJvdywgb3V0X2N0LCBvdXRfYmQsIHgsCi0gICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX3Blcl9waXhlbCwgMCwgMCk7Ci0KLSAgICAgICAgICAgICAgIGlmIChvdXRwdXRfYWxwaGEgIT0gNjU1MzYpCi0gICAgICAgICAgICAgICAgICBhbHBoYSA9IGdhbW1hX2NvbXBvbmVudF92YWxpZGF0ZSgiYWxwaGEiLCAmdmksIGlucHV0X2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2FscGhhLCAtMS8qYWxwaGEqLywgMC8qYmFja2dyb3VuZCovKTsKLQotICAgICAgICAgICAgICAgZWxzZSAvKiBubyBhbHBoYSBpbiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiAnaScgYWJvdmUgaW4gb3JkZXIgdG8KLSAgICAgICAgICAgICAgICAgICAqIGhhdmUgdGhlIGFscGhhIHZhbHVlIHRvIHVzZSBpbiB0aGUgYmFja2dyb3VuZCBjYWxjdWxhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgYWxwaGEgPSBpbnB1dF9hbHBoYSA+PiB2aS5pc2JpdF9zaGlmdDsKLSAgICAgICAgICAgICAgICAgIGFscGhhIC89IHZpLnNiaXRfbWF4OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChwcm9jZXNzX3RSTlMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBhbHBoYSBuZWVkcyB0byBiZSBzZXQgYXBwcm9wcmlhdGVseSBmb3IgdGhpcyBwaXhlbCwgaXQgaXMKLSAgICAgICAgICAgICAgICAqIGN1cnJlbnRseSAxIGFuZCBuZWVkcyB0byBiZSAwIGZvciBhbiBpbnB1dCBwaXhlbCB3aGljaCBtYXRjaGVzCi0gICAgICAgICAgICAgICAgKiB0aGUgdmFsdWVzIGluIHRSTlMuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHN3aXRjaCAoaW5fY3QpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIGdyYXkgKi8KLSAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGUoc3RkLCBpbl9jdCwgaW5fYmQsIHgsIDAsIDAsIDApID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+dGhpcy50cmFuc3BhcmVudC5yZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBSR0IgKi8KLSAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGUoc3RkLCBpbl9jdCwgaW5fYmQsIHgsIDAsIDAsIDApID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+dGhpcy50cmFuc3BhcmVudC5yZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUoc3RkLCBpbl9jdCwgaW5fYmQsIHgsIDEsIDAsIDApID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+dGhpcy50cmFuc3BhcmVudC5ncmVlbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZShzdGQsIGluX2N0LCBpbl9iZCwgeCwgMiwgMCwgMCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLT50aGlzLnRyYW5zcGFyZW50LmJsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBIYW5kbGUgZ3JheXNjYWxlIG9yIFJHQiBjb21wb25lbnRzLiAqLwotICAgICAgICAgICAgaWYgKChpbl9jdCAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSA9PSAwKSAvKiBncmF5c2NhbGUgKi8KLSAgICAgICAgICAgICAgICh2b2lkKWdhbW1hX2NvbXBvbmVudF92YWxpZGF0ZSgiZ3JheSIsICZ2aSwKLSAgICAgICAgICAgICAgICAgIHNhbXBsZShzdGQsIGluX2N0LCBpbl9iZCwgeCwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgICBzYW1wbGUocFJvdywgb3V0X2N0LCBvdXRfYmQsIHgsIDAsIDAsIDApLAotICAgICAgICAgICAgICAgICAgYWxwaGEvKmNvbXBvbmVudCovLCB2aS5iYWNrZ3JvdW5kX3JlZCk7Ci0gICAgICAgICAgICBlbHNlIC8qIFJHQiBvciBwYWxldHRlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAodm9pZClnYW1tYV9jb21wb25lbnRfdmFsaWRhdGUoInJlZCIsICZ2aSwKLSAgICAgICAgICAgICAgICAgIGluX2N0ID09IDMgPyBpbl9wYWxldHRlW2luX2luZGV4XS5yZWQgOgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxlKHN0ZCwgaW5fY3QsIGluX2JkLCB4LCAwLCAwLCAwKSwKLSAgICAgICAgICAgICAgICAgIG91dF9jdCA9PSAzID8gb3V0X3BhbGV0dGVbb3V0X2luZGV4XS5yZWQgOgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxlKHBSb3csIG91dF9jdCwgb3V0X2JkLCB4LCAwLCAwLCAwKSwKLSAgICAgICAgICAgICAgICAgIGFscGhhLypjb21wb25lbnQqLywgdmkuYmFja2dyb3VuZF9yZWQpOwotCi0gICAgICAgICAgICAgICAodm9pZClnYW1tYV9jb21wb25lbnRfdmFsaWRhdGUoImdyZWVuIiwgJnZpLAotICAgICAgICAgICAgICAgICAgaW5fY3QgPT0gMyA/IGluX3BhbGV0dGVbaW5faW5kZXhdLmdyZWVuIDoKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZShzdGQsIGluX2N0LCBpbl9iZCwgeCwgMSwgMCwgMCksCi0gICAgICAgICAgICAgICAgICBvdXRfY3QgPT0gMyA/IG91dF9wYWxldHRlW291dF9pbmRleF0uZ3JlZW4gOgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxlKHBSb3csIG91dF9jdCwgb3V0X2JkLCB4LCAxLCAwLCAwKSwKLSAgICAgICAgICAgICAgICAgIGFscGhhLypjb21wb25lbnQqLywgdmkuYmFja2dyb3VuZF9ncmVlbik7Ci0KLSAgICAgICAgICAgICAgICh2b2lkKWdhbW1hX2NvbXBvbmVudF92YWxpZGF0ZSgiYmx1ZSIsICZ2aSwKLSAgICAgICAgICAgICAgICAgIGluX2N0ID09IDMgPyBpbl9wYWxldHRlW2luX2luZGV4XS5ibHVlIDoKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZShzdGQsIGluX2N0LCBpbl9iZCwgeCwgMiwgMCwgMCksCi0gICAgICAgICAgICAgICAgICBvdXRfY3QgPT0gMyA/IG91dF9wYWxldHRlW291dF9pbmRleF0uYmx1ZSA6Ci0gICAgICAgICAgICAgICAgICAgICBzYW1wbGUocFJvdywgb3V0X2N0LCBvdXRfYmQsIHgsIDIsIDAsIDApLAotICAgICAgICAgICAgICAgICAgYWxwaGEvKmNvbXBvbmVudCovLCB2aS5iYWNrZ3JvdW5kX2JsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChtZW1jbXAoc3RkLCBwUm93LCBjYlJvdykgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGNoYXIgbXNnWzY0XTsKLQotICAgICAgICAgLyogTm8gdHJhbnNmb3JtIGlzIGV4cGVjdGVkIG9uIHRoZSB0aHJlc2hvbGQgdGVzdHMuICovCi0gICAgICAgICBzcHJpbnRmKG1zZywgImdhbW1hOiBiZWxvdyB0aHJlc2hvbGQgcm93ICVsdSBjaGFuZ2VkIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXkpOwotCi0gICAgICAgICBwbmdfZXJyb3IocHAsIG1zZyk7Ci0gICAgICB9Ci0gICB9IC8qIHJvdyAoeSkgbG9vcCAqLwotCi0gICBkcC0+dGhpcy5wcy0+dmFsaWRhdGVkID0gMTsKLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLWdhbW1hX2VuZChwbmdfc3RydWN0cCBwcEluLCBwbmdfaW5mb3AgcGkpCi17Ci0gICBwbmdfY29uc3Rfc3RydWN0cCBwcCA9IHBwSW47Ci0gICBnYW1tYV9kaXNwbGF5ICpkcCA9IHZvaWRjYXN0KGdhbW1hX2Rpc3BsYXkqLCBwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwcCkpOwotCi0gICBpZiAoIWRwLT50aGlzLnNwZWVkKQotICAgICAgZ2FtbWFfaW1hZ2VfdmFsaWRhdGUoZHAsIHBwLCBwaSk7Ci0gICBlbHNlCi0gICAgICBkcC0+dGhpcy5wcy0+dmFsaWRhdGVkID0gMTsKLX0KLQotLyogQSBzaW5nbGUgdGVzdCBydW4gY2hlY2tpbmcgYSBnYW1tYSB0cmFuc2Zvcm1hdGlvbi4KLSAqCi0gKiBtYXhhYnM6IG1heGltdW0gYWJzb2x1dGUgZXJyb3IgYXMgYSBmcmFjdGlvbgotICogbWF4b3V0OiBtYXhpbXVtIG91dHB1dCBlcnJvciBpbiB0aGUgb3V0cHV0IHVuaXRzCi0gKiBtYXhwYzogIG1heGltdW0gcGVyY2VudGFnZSBlcnJvciAoYXMgYSBwZXJjZW50YWdlKQotICovCi1zdGF0aWMgdm9pZAotZ2FtbWFfdGVzdChwbmdfbW9kaWZpZXIgKnBtSW4sIGNvbnN0IHBuZ19ieXRlIGNvbG91cl90eXBlSW4sCi0gICAgY29uc3QgcG5nX2J5dGUgYml0X2RlcHRoSW4sIGNvbnN0IGludCBwYWxldHRlX251bWJlckluLAotICAgIGNvbnN0IGludCBpbnRlcmxhY2VfdHlwZUluLAotICAgIGNvbnN0IGRvdWJsZSBmaWxlX2dhbW1hSW4sIGNvbnN0IGRvdWJsZSBzY3JlZW5fZ2FtbWFJbiwKLSAgICBjb25zdCBwbmdfYnl0ZSBzYml0SW4sIGNvbnN0IGludCB0aHJlc2hvbGRfdGVzdEluLAotICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgY29uc3QgaW50IHVzZV9pbnB1dF9wcmVjaXNpb25JbiwgY29uc3QgaW50IHNjYWxlMTZJbiwKLSAgICBjb25zdCBpbnQgZXhwYW5kMTZJbiwgY29uc3QgaW50IGRvX2JhY2tncm91bmRJbiwKLSAgICBjb25zdCBwbmdfY29sb3JfMTYgKmJrZ2RfY29sb3JJbiwgZG91YmxlIGJrZ2RfZ2FtbWFJbikKLXsKLSAgIGdhbW1hX2Rpc3BsYXkgZDsKLSAgIGNvbnRleHQoJnBtSW4tPnRoaXMsIGZhdWx0KTsKLQotICAgZ2FtbWFfZGlzcGxheV9pbml0KCZkLCBwbUluLCBGSUxFSUQoY29sb3VyX3R5cGVJbiwgYml0X2RlcHRoSW4sCi0gICAgICBwYWxldHRlX251bWJlckluLCBpbnRlcmxhY2VfdHlwZUluLCAwLCAwLCAwKSwKLSAgICAgIGZpbGVfZ2FtbWFJbiwgc2NyZWVuX2dhbW1hSW4sIHNiaXRJbiwKLSAgICAgIHRocmVzaG9sZF90ZXN0SW4sIHVzZV9pbnB1dF9wcmVjaXNpb25Jbiwgc2NhbGUxNkluLAotICAgICAgZXhwYW5kMTZJbiwgZG9fYmFja2dyb3VuZEluLCBia2dkX2NvbG9ySW4sIGJrZ2RfZ2FtbWFJbik7Ci0KLSAgIFRyeQotICAgewotICAgICAgcG5nX3N0cnVjdHAgcHA7Ci0gICAgICBwbmdfaW5mb3AgcGk7Ci0gICAgICBnYW1hX21vZGlmaWNhdGlvbiBnYW1hX21vZDsKLSAgICAgIHNyZ2JfbW9kaWZpY2F0aW9uIHNyZ2JfbW9kOwotICAgICAgc2JpdF9tb2RpZmljYXRpb24gc2JpdF9tb2Q7Ci0KLSAgICAgIC8qIEZvciB0aGUgbW9tZW50IGRvbid0IHVzZSB0aGUgcG5nX21vZGlmaWVyIHN1cHBvcnQgaGVyZS4gKi8KLSAgICAgIGQucG0tPmVuY29kaW5nX2NvdW50ZXIgPSAwOwotICAgICAgbW9kaWZpZXJfc2V0X2VuY29kaW5nKGQucG0pOyAvKiBKdXN0IHJlc2V0cyBldmVyeXRoaW5nICovCi0gICAgICBkLnBtLT5jdXJyZW50X2dhbW1hID0gZC5maWxlX2dhbW1hOwotCi0gICAgICAvKiBNYWtlIGFuIGFwcHJvcHJpYXRlIG1vZGlmaWVyIHRvIHNldCB0aGUgUE5HIGZpbGUgZ2FtbWEgdG8gdGhlCi0gICAgICAgKiBnaXZlbiBnYW1tYSB2YWx1ZSBhbmQgdGhlIHNCSVQgY2h1bmsgdG8gdGhlIGdpdmVuIHByZWNpc2lvbi4KLSAgICAgICAqLwotICAgICAgZC5wbS0+bW9kaWZpY2F0aW9ucyA9IE5VTEw7Ci0gICAgICBnYW1hX21vZGlmaWNhdGlvbl9pbml0KCZnYW1hX21vZCwgZC5wbSwgZC5maWxlX2dhbW1hKTsKLSAgICAgIHNyZ2JfbW9kaWZpY2F0aW9uX2luaXQoJnNyZ2JfbW9kLCBkLnBtLCAxMjcgLypkZWxldGUqLyk7Ci0gICAgICBpZiAoZC5zYml0ID4gMCkKLSAgICAgICAgIHNiaXRfbW9kaWZpY2F0aW9uX2luaXQoJnNiaXRfbW9kLCBkLnBtLCBkLnNiaXQpOwotCi0gICAgICBtb2RpZmljYXRpb25fcmVzZXQoZC5wbS0+bW9kaWZpY2F0aW9ucyk7Ci0KLSAgICAgIC8qIEdldCBhIHBuZ19zdHJ1Y3QgZm9yIHJlYWRpbmcgdGhlIGltYWdlLiAqLwotICAgICAgcHAgPSBzZXRfbW9kaWZpZXJfZm9yX3JlYWQoZC5wbSwgJnBpLCBkLnRoaXMuaWQsIG5hbWUpOwotICAgICAgc3RhbmRhcmRfcGFsZXR0ZV9pbml0KCZkLnRoaXMpOwotCi0gICAgICAvKiBJbnRyb2R1Y2UgdGhlIGNvcnJlY3QgcmVhZCBmdW5jdGlvbi4gKi8KLSAgICAgIGlmIChkLnBtLT50aGlzLnByb2dyZXNzaXZlKQotICAgICAgewotICAgICAgICAgLyogU2hhcmUgdGhlIHJvdyBmdW5jdGlvbiB3aXRoIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbi4gKi8KLSAgICAgICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwcCwgJmQsIGdhbW1hX2luZm8sIHByb2dyZXNzaXZlX3JvdywKLSAgICAgICAgICAgIGdhbW1hX2VuZCk7Ci0KLSAgICAgICAgIC8qIE5vdyBmZWVkIGRhdGEgaW50byB0aGUgcmVhZGVyIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQ6ICovCi0gICAgICAgICBtb2RpZmllcl9wcm9ncmVzc2l2ZV9yZWFkKGQucG0sIHBwLCBwaSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvKiBtb2RpZmllcl9yZWFkIGV4cGVjdHMgYSBwbmdfbW9kaWZpZXIqICovCi0gICAgICAgICBwbmdfc2V0X3JlYWRfZm4ocHAsIGQucG0sIG1vZGlmaWVyX3JlYWQpOwotCi0gICAgICAgICAvKiBDaGVjayB0aGUgaGVhZGVyIHZhbHVlczogKi8KLSAgICAgICAgIHBuZ19yZWFkX2luZm8ocHAsIHBpKTsKLQotICAgICAgICAgLyogUHJvY2VzcyB0aGUgJ2luZm8nIHJlcXVpcmVtZW50cy4gT25seSBvbmUgaW1hZ2UgaXMgZ2VuZXJhdGVkICovCi0gICAgICAgICBnYW1tYV9pbmZvX2ltcCgmZCwgcHAsIHBpKTsKLQotICAgICAgICAgc2VxdWVudGlhbF9yb3coJmQudGhpcywgcHAsIHBpLCAtMSwgMCk7Ci0KLSAgICAgICAgIGlmICghZC50aGlzLnNwZWVkKQotICAgICAgICAgICAgZ2FtbWFfaW1hZ2VfdmFsaWRhdGUoJmQsIHBwLCBwaSk7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBkLnRoaXMucHMtPnZhbGlkYXRlZCA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIG1vZGlmaWVyX3Jlc2V0KGQucG0pOwotCi0gICAgICBpZiAoZC5wbS0+bG9nICYmICFkLnRocmVzaG9sZF90ZXN0ICYmICFkLnRoaXMuc3BlZWQpCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkIGJpdCAlcyAlczogbWF4IGVycm9yICVmICglLjJnLCAlMmclJSlcbiIsCi0gICAgICAgICAgICBkLnRoaXMuYml0X2RlcHRoLCBjb2xvdXJfdHlwZXNbZC50aGlzLmNvbG91cl90eXBlXSwgbmFtZSwKLSAgICAgICAgICAgIGQubWF4ZXJyb3V0LCBkLm1heGVycmFicywgMTAwKmQubWF4ZXJycGMpOwotCi0gICAgICAvKiBMb2cgdGhlIHN1bW1hcnkgdmFsdWVzIHRvby4gKi8KLSAgICAgIGlmIChkLnRoaXMuY29sb3VyX3R5cGUgPT0gMCB8fCBkLnRoaXMuY29sb3VyX3R5cGUgPT0gNCkKLSAgICAgIHsKLSAgICAgICAgIHN3aXRjaCAoZC50aGlzLmJpdF9kZXB0aCkKLSAgICAgICAgIHsKLSAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoZC5tYXhlcnJvdXQgPiBkLnBtLT5lcnJvcl9ncmF5XzIpCi0gICAgICAgICAgICAgICBkLnBtLT5lcnJvcl9ncmF5XzIgPSBkLm1heGVycm91dDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmIChkLm1heGVycm91dCA+IGQucG0tPmVycm9yX2dyYXlfNCkKLSAgICAgICAgICAgICAgIGQucG0tPmVycm9yX2dyYXlfNCA9IGQubWF4ZXJyb3V0OwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgaWYgKGQubWF4ZXJyb3V0ID4gZC5wbS0+ZXJyb3JfZ3JheV84KQotICAgICAgICAgICAgICAgZC5wbS0+ZXJyb3JfZ3JheV84ID0gZC5tYXhlcnJvdXQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgaWYgKGQubWF4ZXJyb3V0ID4gZC5wbS0+ZXJyb3JfZ3JheV8xNikKLSAgICAgICAgICAgICAgIGQucG0tPmVycm9yX2dyYXlfMTYgPSBkLm1heGVycm91dDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwbmdfZXJyb3IocHAsICJiYWQgYml0IGRlcHRoIChpbnRlcm5hbDogMSkiKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoZC50aGlzLmNvbG91cl90eXBlID09IDIgfHwgZC50aGlzLmNvbG91cl90eXBlID09IDYpCi0gICAgICB7Ci0gICAgICAgICBzd2l0Y2ggKGQudGhpcy5iaXRfZGVwdGgpCi0gICAgICAgICB7Ci0gICAgICAgICBjYXNlIDg6Ci0KLSAgICAgICAgICAgIGlmIChkLm1heGVycm91dCA+IGQucG0tPmVycm9yX2NvbG9yXzgpCi0gICAgICAgICAgICAgICBkLnBtLT5lcnJvcl9jb2xvcl84ID0gZC5tYXhlcnJvdXQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDE2OgotCi0gICAgICAgICAgICBpZiAoZC5tYXhlcnJvdXQgPiBkLnBtLT5lcnJvcl9jb2xvcl8xNikKLSAgICAgICAgICAgICAgIGQucG0tPmVycm9yX2NvbG9yXzE2ID0gZC5tYXhlcnJvdXQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcG5nX2Vycm9yKHBwLCAiYmFkIGJpdCBkZXB0aCAoaW50ZXJuYWw6IDIpIik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGQudGhpcy5jb2xvdXJfdHlwZSA9PSAzKQotICAgICAgewotICAgICAgICAgaWYgKGQubWF4ZXJyb3V0ID4gZC5wbS0+ZXJyb3JfaW5kZXhlZCkKLSAgICAgICAgICAgIGQucG0tPmVycm9yX2luZGV4ZWQgPSBkLm1heGVycm91dDsKLSAgICAgIH0KLSAgIH0KLQotICAgQ2F0Y2goZmF1bHQpCi0gICAgICBtb2RpZmllcl9yZXNldCh2b2lkY2FzdChwbmdfbW9kaWZpZXIqLCh2b2lkKilmYXVsdCkpOwotfQotCi1zdGF0aWMgdm9pZCBnYW1tYV90aHJlc2hvbGRfdGVzdChwbmdfbW9kaWZpZXIgKnBtLCBwbmdfYnl0ZSBjb2xvdXJfdHlwZSwKLSAgICBwbmdfYnl0ZSBiaXRfZGVwdGgsIGludCBpbnRlcmxhY2VfdHlwZSwgZG91YmxlIGZpbGVfZ2FtbWEsCi0gICAgZG91YmxlIHNjcmVlbl9nYW1tYSkKLXsKLSAgIHNpemVfdCBwb3MgPSAwOwotICAgY2hhciBuYW1lWzY0XTsKLSAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgInRocmVzaG9sZCAiKTsKLSAgIHBvcyA9IHNhZmVjYXRkKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIGZpbGVfZ2FtbWEsIDMpOwotICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiLyIpOwotICAgcG9zID0gc2FmZWNhdGQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgc2NyZWVuX2dhbW1hLCAzKTsKLQotICAgKHZvaWQpZ2FtbWFfdGVzdChwbSwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgMC8qcGFsZXR0ZSovLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgIGZpbGVfZ2FtbWEsIHNjcmVlbl9nYW1tYSwgMC8qc0JJVCovLCAxLyp0aHJlc2hvbGQgdGVzdCovLCBuYW1lLAotICAgICAgMCAvKm5vIGlucHV0IHByZWNpc2lvbiovLAotICAgICAgMCAvKm5vIHNjYWxlMTYqLywgMCAvKm5vIGV4cGFuZDE2Ki8sIDAgLypubyBiYWNrZ3JvdW5kKi8sIDAgLypoZW5jZSovLAotICAgICAgMCAvKm5vIGJhY2tncm91bmQgZ2FtbWEqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX2dhbW1hX3RocmVzaG9sZF90ZXN0cyhwbmdfbW9kaWZpZXIgKnBtKQotewotICAgcG5nX2J5dGUgY29sb3VyX3R5cGUgPSAwOwotICAgcG5nX2J5dGUgYml0X2RlcHRoID0gMDsKLSAgIHVuc2lnbmVkIGludCBwYWxldHRlX251bWJlciA9IDA7Ci0KLSAgIC8qIERvbid0IHRlc3QgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiBlYWNoIHBhbGV0dGUgLSBpdCdzIHBvaW50bGVzcywgaW4KLSAgICAqIGZhY3QgdGhpcyB0ZXN0IGlzIHNvbWV3aGF0IGV4Y2Vzc2l2ZSBzaW5jZSBsaWJwbmcgZG9lc24ndCBtYWtlIHRoaXMKLSAgICAqIGRlY2lzaW9uIGJhc2VkIG9uIGNvbG91ciB0eXBlIG9yIGJpdCBkZXB0aCEKLSAgICAqCi0gICAgKiBDSEFOR0VEOiBub3cgdGVzdCB0d28gcGFsZXR0ZXMgYW5kLCBhcyBhIHNpZGUgZWZmZWN0LCBpbWFnZXMgd2l0aCBhbmQKLSAgICAqIHdpdGhvdXQgdFJOUy4KLSAgICAqLwotICAgd2hpbGUgKG5leHRfZm9ybWF0KCZjb2xvdXJfdHlwZSwgJmJpdF9kZXB0aCwgJnBhbGV0dGVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgIHBtLT50ZXN0X2xiZ19nYW1tYV90aHJlc2hvbGQsIHBtLT50ZXN0X3RSTlMpKQotICAgICAgaWYgKHBhbGV0dGVfbnVtYmVyIDwgMikKLSAgIHsKLSAgICAgIGRvdWJsZSB0ZXN0X2dhbW1hID0gMS4wOwotICAgICAgd2hpbGUgKHRlc3RfZ2FtbWEgPj0gLjQpCi0gICAgICB7Ci0gICAgICAgICAvKiBUaGVyZSdzIGxpdHRsZSBwb2ludCB0ZXN0aW5nIHRoZSBpbnRlcmxhY2luZyB2cyBub24taW50ZXJsYWNpbmcsCi0gICAgICAgICAgKiBidXQgdGhpcyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgICAgICAqLwotICAgICAgICAgZ2FtbWFfdGhyZXNob2xkX3Rlc3QocG0sIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHBtLT5pbnRlcmxhY2VfdHlwZSwKLSAgICAgICAgICAgIHRlc3RfZ2FtbWEsIDEvdGVzdF9nYW1tYSk7Ci0gICAgICAgICB0ZXN0X2dhbW1hICo9IC45NTsKLSAgICAgIH0KLQotICAgICAgLyogQW5kIGEgc3BlY2lhbCB0ZXN0IGZvciBzUkdCICovCi0gICAgICBnYW1tYV90aHJlc2hvbGRfdGVzdChwbSwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgcG0tPmludGVybGFjZV90eXBlLAotICAgICAgICAgIC40NTQ1NSwgMi4yKTsKLQotICAgICAgaWYgKGZhaWwocG0pKQotICAgICAgICAgcmV0dXJuOwotICAgfQotfQotCi1zdGF0aWMgdm9pZCBnYW1tYV90cmFuc2Zvcm1fdGVzdChwbmdfbW9kaWZpZXIgKnBtLAotICAgY29uc3QgcG5nX2J5dGUgY29sb3VyX3R5cGUsIGNvbnN0IHBuZ19ieXRlIGJpdF9kZXB0aCwKLSAgIGNvbnN0IGludCBwYWxldHRlX251bWJlciwKLSAgIGNvbnN0IGludCBpbnRlcmxhY2VfdHlwZSwgY29uc3QgZG91YmxlIGZpbGVfZ2FtbWEsCi0gICBjb25zdCBkb3VibGUgc2NyZWVuX2dhbW1hLCBjb25zdCBwbmdfYnl0ZSBzYml0LAotICAgY29uc3QgaW50IHVzZV9pbnB1dF9wcmVjaXNpb24sIGNvbnN0IGludCBzY2FsZTE2KQotewotICAgc2l6ZV90IHBvcyA9IDA7Ci0gICBjaGFyIG5hbWVbNjRdOwotCi0gICBpZiAoc2JpdCAhPSBiaXRfZGVwdGggJiYgc2JpdCAhPSAwKQotICAgewotICAgICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAic2JpdCgiKTsKLSAgICAgIHBvcyA9IHNhZmVjYXRuKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIHNiaXQpOwotICAgICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiKSAiKTsKLSAgIH0KLQotICAgZWxzZQotICAgICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiZ2FtbWEgIik7Ci0KLSAgIGlmIChzY2FsZTE2KQotICAgICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiMTZ0bzggIik7Ci0KLSAgIHBvcyA9IHNhZmVjYXRkKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIGZpbGVfZ2FtbWEsIDMpOwotICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiLT4iKTsKLSAgIHBvcyA9IHNhZmVjYXRkKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIHNjcmVlbl9nYW1tYSwgMyk7Ci0KLSAgIGdhbW1hX3Rlc3QocG0sIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHBhbGV0dGVfbnVtYmVyLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgIGZpbGVfZ2FtbWEsIHNjcmVlbl9nYW1tYSwgc2JpdCwgMCwgbmFtZSwgdXNlX2lucHV0X3ByZWNpc2lvbiwKLSAgICAgIHNjYWxlMTYsIHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2LCAwICwgMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1fZ2FtbWFfdHJhbnNmb3JtX3Rlc3RzKHBuZ19tb2RpZmllciAqcG0pCi17Ci0gICBwbmdfYnl0ZSBjb2xvdXJfdHlwZSA9IDA7Ci0gICBwbmdfYnl0ZSBiaXRfZGVwdGggPSAwOwotICAgdW5zaWduZWQgaW50IHBhbGV0dGVfbnVtYmVyID0gMDsKLQotICAgd2hpbGUgKG5leHRfZm9ybWF0KCZjb2xvdXJfdHlwZSwgJmJpdF9kZXB0aCwgJnBhbGV0dGVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgIHBtLT50ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0sIHBtLT50ZXN0X3RSTlMpKQotICAgewotICAgICAgdW5zaWduZWQgaW50IGksIGo7Ci0KLSAgICAgIGZvciAoaT0wOyBpPHBtLT5uZ2FtbWFfdGVzdHM7ICsraSkgZm9yIChqPTA7IGo8cG0tPm5nYW1tYV90ZXN0czsgKytqKQotICAgICAgICAgaWYgKGkgIT0gaikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGdhbW1hX3RyYW5zZm9ybV90ZXN0KHBtLCBjb2xvdXJfdHlwZSwgYml0X2RlcHRoLCBwYWxldHRlX251bWJlciwKLSAgICAgICAgICAgICAgIHBtLT5pbnRlcmxhY2VfdHlwZSwgMS9wbS0+Z2FtbWFzW2ldLCBwbS0+Z2FtbWFzW2pdLCAwLypzQklUKi8sCi0gICAgICAgICAgICAgICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbiwgMCAvKmRvIG5vdCBzY2FsZTE2Ki8pOwotCi0gICAgICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICB9Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1fZ2FtbWFfc2JpdF90ZXN0cyhwbmdfbW9kaWZpZXIgKnBtKQotewotICAgcG5nX2J5dGUgc2JpdDsKLQotICAgLyogVGhlIG9ubHkgaW50ZXJlc3RpbmcgY2FzZXMgYXJlIGNvbG91ciBhbmQgZ3JheXNjYWxlLCBhbHBoYSBpcyBpZ25vcmVkIGhlcmUKLSAgICAqIGZvciBvdmVyYWxsIHNwZWVkLiAgT25seSBiaXQgZGVwdGhzIHdoZXJlIHNiaXQgaXMgbGVzcyB0aGFuIHRoZSBiaXQgZGVwdGgKLSAgICAqIGFyZSB0ZXN0ZWQuCi0gICAgKi8KLSAgIGZvciAoc2JpdD1wbS0+c2JpdGxvdzsgc2JpdDwoMTw8UkVBRF9CREhJKTsgKytzYml0KQotICAgewotICAgICAgcG5nX2J5dGUgY29sb3VyX3R5cGUgPSAwLCBiaXRfZGVwdGggPSAwOwotICAgICAgdW5zaWduZWQgaW50IG5wYWxldHRlID0gMDsKLQotICAgICAgd2hpbGUgKG5leHRfZm9ybWF0KCZjb2xvdXJfdHlwZSwgJmJpdF9kZXB0aCwgJm5wYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBtLT50ZXN0X2xiZ19nYW1tYV9zYml0LCBwbS0+dGVzdF90Uk5TKSkKLSAgICAgICAgIGlmICgoY29sb3VyX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkgPT0gMCAmJgotICAgICAgICAgICAgKChjb2xvdXJfdHlwZSA9PSAzICYmIHNiaXQgPCA4KSB8fAotICAgICAgICAgICAgKGNvbG91cl90eXBlICE9IDMgJiYgc2JpdCA8IGJpdF9kZXB0aCkpKQotICAgICAgewotICAgICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgICAgIGZvciAoaT0wOyBpPHBtLT5uZ2FtbWFfdGVzdHM7ICsraSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAgICAgICBmb3IgKGo9MDsgajxwbS0+bmdhbW1hX3Rlc3RzOyArK2opIGlmIChpICE9IGopCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBnYW1tYV90cmFuc2Zvcm1fdGVzdChwbSwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgbnBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICBwbS0+aW50ZXJsYWNlX3R5cGUsIDEvcG0tPmdhbW1hc1tpXSwgcG0tPmdhbW1hc1tqXSwKLSAgICAgICAgICAgICAgICAgIHNiaXQsIHBtLT51c2VfaW5wdXRfcHJlY2lzaW9uX3NiaXQsIDAgLypzY2FsZTE2Ki8pOwotCi0gICAgICAgICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci19Ci0KLS8qIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgMTYgYml0IHNvdXJjZSBpbWFnZSBidXQgcHJvZHVjZXMgOCBiaXQgb3V0cHV0LCBzbwotICogd2Ugb25seSBuZWVkIHRoZSAxNmJpdCB3cml0ZSBzdXBwb3J0LCBidXQgdGhlIDE2IGJpdCBpbWFnZXMgYXJlIG9ubHkKLSAqIGdlbmVyYXRlZCBpZiBET18xNkJJVCBpcyBkZWZpbmVkLgotICovCi0jaWZkZWYgRE9fMTZCSVQKLXN0YXRpYyB2b2lkIHBlcmZvcm1fZ2FtbWFfc2NhbGUxNl90ZXN0cyhwbmdfbW9kaWZpZXIgKnBtKQotewotIyAgaWZuZGVmIFBOR19NQVhfR0FNTUFfOAotIyAgICAgZGVmaW5lIFBOR19NQVhfR0FNTUFfOCAxMQotIyAgZW5kaWYKLSMgIGlmIGRlZmluZWQgUE5HX01BWF9HQU1NQV84IHx8IFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSMgICAgIGRlZmluZSBTQklUXzE2X1RPXzggUE5HX01BWF9HQU1NQV84Ci0jICBlbHNlCi0jICAgICBkZWZpbmUgU0JJVF8xNl9UT184IDE2Ci0jICBlbmRpZgotICAgLyogSW5jbHVkZSB0aGUgYWxwaGEgY2FzZXMgaGVyZS4gTm90ZSB0aGF0IHNiaXQgbWF0Y2hlcyB0aGUgaW50ZXJuYWwgdmFsdWUKLSAgICAqIHVzZWQgYnkgdGhlIGxpYnJhcnkgLSBvdGhlcndpc2Ugd2Ugd2lsbCBnZXQgc3B1cmlvdXMgZXJyb3JzIGZyb20gdGhlCi0gICAgKiBpbnRlcm5hbCBzYml0IHN0eWxlIGFwcHJveGltYXRpb24uCi0gICAgKgotICAgICogVGhlIHRocmVzaG9sZCB0ZXN0IGlzIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgdGhlIDE2IHRvIDggY29udmVyc2lvbiB3aWxsCi0gICAgKiBwcm9jZWVkICp3aXRob3V0KiBnYW1tYSBjb3JyZWN0aW9uLCBhbmQgdGhlIHRlc3RzIGFib3ZlIHdpbGwgZmFpbCAoYnV0IG5vdAotICAgICogYnkgbXVjaCkgLSB0aGlzIGNvdWxkIGJlIGZpeGVkLCBpdCBvbmx5IGFwcGVhcnMgd2l0aCB0aGUgLWcgb3B0aW9uLgotICAgICovCi0gICB1bnNpZ25lZCBpbnQgaSwgajsKLSAgIGZvciAoaT0wOyBpPHBtLT5uZ2FtbWFfdGVzdHM7ICsraSkKLSAgIHsKLSAgICAgIGZvciAoaj0wOyBqPHBtLT5uZ2FtbWFfdGVzdHM7ICsraikKLSAgICAgIHsKLSAgICAgICAgIGlmIChpICE9IGogJiYKLSAgICAgICAgICAgICBmYWJzKHBtLT5nYW1tYXNbal0vcG0tPmdhbW1hc1tpXS0xKSA+PSBQTkdfR0FNTUFfVEhSRVNIT0xEKQotICAgICAgICAgewotICAgICAgICAgICAgZ2FtbWFfdHJhbnNmb3JtX3Rlc3QocG0sIDAsIDE2LCAwLCBwbS0+aW50ZXJsYWNlX3R5cGUsCi0gICAgICAgICAgICAgICAxL3BtLT5nYW1tYXNbaV0sIHBtLT5nYW1tYXNbal0sIFNCSVRfMTZfVE9fOCwKLSAgICAgICAgICAgICAgIHBtLT51c2VfaW5wdXRfcHJlY2lzaW9uXzE2dG84LCAxIC8qc2NhbGUxNiovKTsKLQotICAgICAgICAgICAgaWYgKGZhaWwocG0pKQotICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBnYW1tYV90cmFuc2Zvcm1fdGVzdChwbSwgMiwgMTYsIDAsIHBtLT5pbnRlcmxhY2VfdHlwZSwKLSAgICAgICAgICAgICAgIDEvcG0tPmdhbW1hc1tpXSwgcG0tPmdhbW1hc1tqXSwgU0JJVF8xNl9UT184LAotICAgICAgICAgICAgICAgcG0tPnVzZV9pbnB1dF9wcmVjaXNpb25fMTZ0bzgsIDEgLypzY2FsZTE2Ki8pOwotCi0gICAgICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGdhbW1hX3RyYW5zZm9ybV90ZXN0KHBtLCA0LCAxNiwgMCwgcG0tPmludGVybGFjZV90eXBlLAotICAgICAgICAgICAgICAgMS9wbS0+Z2FtbWFzW2ldLCBwbS0+Z2FtbWFzW2pdLCBTQklUXzE2X1RPXzgsCi0gICAgICAgICAgICAgICBwbS0+dXNlX2lucHV0X3ByZWNpc2lvbl8xNnRvOCwgMSAvKnNjYWxlMTYqLyk7Ci0KLSAgICAgICAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgZ2FtbWFfdHJhbnNmb3JtX3Rlc3QocG0sIDYsIDE2LCAwLCBwbS0+aW50ZXJsYWNlX3R5cGUsCi0gICAgICAgICAgICAgICAxL3BtLT5nYW1tYXNbaV0sIHBtLT5nYW1tYXNbal0sIFNCSVRfMTZfVE9fOCwKLSAgICAgICAgICAgICAgIHBtLT51c2VfaW5wdXRfcHJlY2lzaW9uXzE2dG84LCAxIC8qc2NhbGUxNiovKTsKLQotICAgICAgICAgICAgaWYgKGZhaWwocG0pKQotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotI2VuZGlmIC8qIDE2IHRvIDggYml0IGNvbnZlcnNpb24gKi8KLQotI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XAotICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkKLXN0YXRpYyB2b2lkIGdhbW1hX2NvbXBvc2l0aW9uX3Rlc3QocG5nX21vZGlmaWVyICpwbSwKLSAgIGNvbnN0IHBuZ19ieXRlIGNvbG91cl90eXBlLCBjb25zdCBwbmdfYnl0ZSBiaXRfZGVwdGgsCi0gICBjb25zdCBpbnQgcGFsZXR0ZV9udW1iZXIsCi0gICBjb25zdCBpbnQgaW50ZXJsYWNlX3R5cGUsIGNvbnN0IGRvdWJsZSBmaWxlX2dhbW1hLAotICAgY29uc3QgZG91YmxlIHNjcmVlbl9nYW1tYSwKLSAgIGNvbnN0IGludCB1c2VfaW5wdXRfcHJlY2lzaW9uLCBjb25zdCBpbnQgZG9fYmFja2dyb3VuZCwKLSAgIGNvbnN0IGludCBleHBhbmRfMTYpCi17Ci0gICBzaXplX3QgcG9zID0gMDsKLSAgIHBuZ19jb25zdF9jaGFycCBiYXNlOwotICAgZG91YmxlIGJnOwotICAgY2hhciBuYW1lWzEyOF07Ci0gICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZDsKLQotICAgLyogTWFrZSB1cCBhIG5hbWUgYW5kIGdldCBhbiBhcHByb3ByaWF0ZSBiYWNrZ3JvdW5kIGdhbW1hIHZhbHVlLiAqLwotICAgc3dpdGNoIChkb19iYWNrZ3JvdW5kKQotICAgewotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGJhc2UgPSAiIjsKLSAgICAgICAgIGJnID0gNDsgLyogc2hvdWxkIG5vdCBiZSB1c2VkICovCi0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfU0NSRUVOOgotICAgICAgICAgYmFzZSA9ICIgYmNrZyhTY3JlZW4pOiI7Ci0gICAgICAgICBiZyA9IDEvc2NyZWVuX2dhbW1hOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEU6Ci0gICAgICAgICBiYXNlID0gIiBiY2tnKEZpbGUpOiI7Ci0gICAgICAgICBiZyA9IGZpbGVfZ2FtbWE7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFOgotICAgICAgICAgYmFzZSA9ICIgYmNrZyhVbmlxdWUpOiI7Ci0gICAgICAgICAvKiBUaGlzIHRlc3RzIHRoZSBoYW5kbGluZyBvZiBhIHVuaXF1ZSB2YWx1ZSwgdGhlIG1hdGggaXMgc3VjaCB0aGF0IHRoZQotICAgICAgICAgICogdmFsdWUgdGVuZHMgdG8gYmUgPDEsIGJ1dCBpcyBuZWl0aGVyIHNjcmVlbiBub3IgZmlsZSAoZXZlbiBpZiB0aGV5Ci0gICAgICAgICAgKiBtYXRjaCEpCi0gICAgICAgICAgKi8KLSAgICAgICAgIGJnID0gKGZpbGVfZ2FtbWEgKyBzY3JlZW5fZ2FtbWEpIC8gMzsKLSAgICAgICAgIGJyZWFrOwotI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECi0gICAgICBjYXNlIEFMUEhBX01PREVfT0ZGU0VUICsgUE5HX0FMUEhBX1BORzoKLSAgICAgICAgIGJhc2UgPSAiIGFscGhhKFBORykiOwotICAgICAgICAgYmcgPSA0OyAvKiBzaG91bGQgbm90IGJlIHVzZWQgKi8KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9TVEFOREFSRDoKLSAgICAgICAgIGJhc2UgPSAiIGFscGhhKFBvcnRlci1EdWZmKSI7Ci0gICAgICAgICBiZyA9IDQ7IC8qIHNob3VsZCBub3QgYmUgdXNlZCAqLwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFMUEhBX01PREVfT0ZGU0VUICsgUE5HX0FMUEhBX09QVElNSVpFRDoKLSAgICAgICAgIGJhc2UgPSAiIGFscGhhKE9wdGltaXplZCkiOwotICAgICAgICAgYmcgPSA0OyAvKiBzaG91bGQgbm90IGJlIHVzZWQgKi8KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9CUk9LRU46Ci0gICAgICAgICBiYXNlID0gIiBhbHBoYShCcm9rZW4pIjsKLSAgICAgICAgIGJnID0gNDsgLyogc2hvdWxkIG5vdCBiZSB1c2VkICovCi0gICAgICAgICBicmVhazsKLSNlbmRpZgotICAgfQotCi0gICAvKiBVc2UgcmFuZG9tIGJhY2tncm91bmQgdmFsdWVzIC0gdGhlIGJhY2tncm91bmQgaXMgYWx3YXlzIHByZXNlbnRlZCBpbiB0aGUKLSAgICAqIG91dHB1dCBzcGFjZSAoOCBvciAxNiBiaXQgY29tcG9uZW50cykuCi0gICAgKi8KLSAgIGlmIChleHBhbmRfMTYgfHwgYml0X2RlcHRoID09IDE2KQotICAgewotICAgICAgcG5nX3VpbnRfMzIgciA9IHJhbmRvbV8zMigpOwotCi0gICAgICBiYWNrZ3JvdW5kLnJlZCA9IChwbmdfdWludF8xNilyOwotICAgICAgYmFja2dyb3VuZC5ncmVlbiA9IChwbmdfdWludF8xNikociA+PiAxNik7Ci0gICAgICByID0gcmFuZG9tXzMyKCk7Ci0gICAgICBiYWNrZ3JvdW5kLmJsdWUgPSAocG5nX3VpbnRfMTYpcjsKLSAgICAgIGJhY2tncm91bmQuZ3JheSA9IChwbmdfdWludF8xNikociA+PiAxNik7Ci0KLSAgICAgIC8qIEluIGVhcmxpZXIgbGlicG5nIHZlcnNpb25zLCB0aG9zZSB3aGVyZSBESUdJVElaRSBpcyBzZXQsIGFueSBiYWNrZ3JvdW5kCi0gICAgICAgKiBnYW1tYSBjb3JyZWN0aW9uIGluIHRoZSBleHBhbmQxNiBjYXNlIHdhcyBkb25lIHVzaW5nIDgtYml0IGdhbW1hCi0gICAgICAgKiBjb3JyZWN0aW9uIHRhYmxlcywgcmVzdWx0aW5nIGluIGxhcmdlciBlcnJvcnMuICBUbyBjb3BlIHdpdGggdGhvc2UKLSAgICAgICAqIGNhc2VzIHVzZSBhIDE2LWJpdCBiYWNrZ3JvdW5kIHZhbHVlIHdoaWNoIHdpbGwgaGFuZGxlIHRoaXMgZ2FtbWEKLSAgICAgICAqIGNvcnJlY3Rpb24uCi0gICAgICAgKi8KLSMgICAgIGlmIERJR0lUSVpFCi0gICAgICAgICBpZiAoZXhwYW5kXzE2ICYmIChkb19iYWNrZ3JvdW5kID09IFBOR19CQUNLR1JPVU5EX0dBTU1BX1VOSVFVRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fYmFja2dyb3VuZCA9PSBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFKSAmJgotICAgICAgICAgICAgZmFicyhiZypzY3JlZW5fZ2FtbWEtMSkgPiBQTkdfR0FNTUFfVEhSRVNIT0xEKQotICAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIGJhY2tncm91bmQgdmFsdWVzIHdpbGwgYmUgbG9va2VkIHVwIGluIGFuIDgtYml0IHRhYmxlIHRvIGRvCi0gICAgICAgICAgICAgKiB0aGUgZ2FtbWEgY29ycmVjdGlvbiwgc28gb25seSBzZWxlY3QgdmFsdWVzIHdoaWNoIGFyZSBhbiBleGFjdAotICAgICAgICAgICAgICogbWF0Y2ggZm9yIHRoZSA4LWJpdCB0YWJsZSBlbnRyaWVzOgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBiYWNrZ3JvdW5kLnJlZCA9IChwbmdfdWludF8xNikoKGJhY2tncm91bmQucmVkID4+IDgpICogMjU3KTsKLSAgICAgICAgICAgIGJhY2tncm91bmQuZ3JlZW4gPSAocG5nX3VpbnRfMTYpKChiYWNrZ3JvdW5kLmdyZWVuID4+IDgpICogMjU3KTsKLSAgICAgICAgICAgIGJhY2tncm91bmQuYmx1ZSA9IChwbmdfdWludF8xNikoKGJhY2tncm91bmQuYmx1ZSA+PiA4KSAqIDI1Nyk7Ci0gICAgICAgICAgICBiYWNrZ3JvdW5kLmdyYXkgPSAocG5nX3VpbnRfMTYpKChiYWNrZ3JvdW5kLmdyYXkgPj4gOCkgKiAyNTcpOwotICAgICAgICAgfQotIyAgICAgZW5kaWYKLSAgIH0KLQotICAgZWxzZSAvKiA4IGJpdCBjb2xvcnMgKi8KLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIHIgPSByYW5kb21fMzIoKTsKLQotICAgICAgYmFja2dyb3VuZC5yZWQgPSAocG5nX2J5dGUpcjsKLSAgICAgIGJhY2tncm91bmQuZ3JlZW4gPSAocG5nX2J5dGUpKHIgPj4gOCk7Ci0gICAgICBiYWNrZ3JvdW5kLmJsdWUgPSAocG5nX2J5dGUpKHIgPj4gMTYpOwotICAgICAgYmFja2dyb3VuZC5ncmF5ID0gKHBuZ19ieXRlKShyID4+IDI0KTsKLSAgIH0KLQotICAgYmFja2dyb3VuZC5pbmRleCA9IDE5MzsgLyogcmdiKDE5MywxOTMsMTkzKSB0byBkZXRlY3QgZXJyb3JzICovCi0KLSAgIGlmICghKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpKQotICAgewotICAgICAgLyogQmVjYXVzZSwgY3VycmVudGx5LCBwbmdfc2V0X2JhY2tncm91bmQgaXMgYWx3YXlzIGNhbGxlZCB3aXRoCi0gICAgICAgKiAnbmVlZF9leHBhbmQnIGZhbHNlIGluIHRoaXMgY2FzZSBhbmQgYmVjYXVzZSB0aGUgZ2FtbWEgdGVzdCBpdHNlbGYKLSAgICAgICAqIGRvZXNuJ3QgY2F1c2UgYW4gZXhwYW5kIHRvIDgtYml0IGZvciBsb3dlciBiaXQgZGVwdGhzIHRoZSBjb2xvdXIgbXVzdAotICAgICAgICogYmUgcmVkdWNlZCB0byB0aGUgY29ycmVjdCByYW5nZS4KLSAgICAgICAqLwotICAgICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgICBiYWNrZ3JvdW5kLmdyYXkgJj0gKHBuZ191aW50XzE2KSgoMVUgPDwgYml0X2RlcHRoKS0xKTsKLQotICAgICAgLyogR3JheXNjYWxlIGlucHV0LCB3ZSBkbyBub3QgY29udmVydCB0byBSR0IgKFRCRCksIHNvIHdlIG11c3Qgc2V0IHRoZQotICAgICAgICogYmFja2dyb3VuZCB0byBncmF5IC0gZWxzZSBsaWJwbmcgc2VlbXMgdG8gZmFpbC4KLSAgICAgICAqLwotICAgICAgYmFja2dyb3VuZC5yZWQgPSBiYWNrZ3JvdW5kLmdyZWVuID0gYmFja2dyb3VuZC5ibHVlID0gYmFja2dyb3VuZC5ncmF5OwotICAgfQotCi0gICBwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsICJnYW1tYSAiKTsKLSAgIHBvcyA9IHNhZmVjYXRkKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIGZpbGVfZ2FtbWEsIDMpOwotICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiLT4iKTsKLSAgIHBvcyA9IHNhZmVjYXRkKG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsIHNjcmVlbl9nYW1tYSwgMyk7Ci0KLSAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgYmFzZSk7Ci0gICBpZiAoZG9fYmFja2dyb3VuZCA8IEFMUEhBX01PREVfT0ZGU0VUKQotICAgewotICAgICAgLyogSW5jbHVkZSB0aGUgYmFja2dyb3VuZCBjb2xvciBhbmQgZ2FtbWEgaW4gdGhlIG5hbWU6ICovCi0gICAgICBwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsICIoIik7Ci0gICAgICAvKiBUaGlzIGFzc3VtZXMgbm8gZXhwYW5kIGdyYXktPnJnYiAtIHRoZSBjdXJyZW50IGNvZGUgd29uJ3QgaGFuZGxlIHRoYXQhCi0gICAgICAgKi8KLSAgICAgIGlmIChjb2xvdXJfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKQotICAgICAgewotICAgICAgICAgcG9zID0gc2FmZWNhdG4obmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgYmFja2dyb3VuZC5yZWQpOwotICAgICAgICAgcG9zID0gc2FmZWNhdChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCAiLCIpOwotICAgICAgICAgcG9zID0gc2FmZWNhdG4obmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgYmFja2dyb3VuZC5ncmVlbik7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG5hbWUsIHNpemVvZiBuYW1lLCBwb3MsICIsIik7Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0bihuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBiYWNrZ3JvdW5kLmJsdWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgcG9zID0gc2FmZWNhdG4obmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgYmFja2dyb3VuZC5ncmF5KTsKLSAgICAgIHBvcyA9IHNhZmVjYXQobmFtZSwgc2l6ZW9mIG5hbWUsIHBvcywgIileIik7Ci0gICAgICBwb3MgPSBzYWZlY2F0ZChuYW1lLCBzaXplb2YgbmFtZSwgcG9zLCBiZywgMyk7Ci0gICB9Ci0KLSAgIGdhbW1hX3Rlc3QocG0sIGNvbG91cl90eXBlLCBiaXRfZGVwdGgsIHBhbGV0dGVfbnVtYmVyLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgIGZpbGVfZ2FtbWEsIHNjcmVlbl9nYW1tYSwgMC8qc0JJVCovLCAwLCBuYW1lLCB1c2VfaW5wdXRfcHJlY2lzaW9uLAotICAgICAgMC8qc3RyaXAgMTYqLywgZXhwYW5kXzE2LCBkb19iYWNrZ3JvdW5kLCAmYmFja2dyb3VuZCwgYmcpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX2dhbW1hX2NvbXBvc2l0aW9uX3Rlc3RzKHBuZ19tb2RpZmllciAqcG0sIGludCBkb19iYWNrZ3JvdW5kLAotICAgaW50IGV4cGFuZF8xNikKLXsKLSAgIHBuZ19ieXRlIGNvbG91cl90eXBlID0gMDsKLSAgIHBuZ19ieXRlIGJpdF9kZXB0aCA9IDA7Ci0gICB1bnNpZ25lZCBpbnQgcGFsZXR0ZV9udW1iZXIgPSAwOwotCi0gICAvKiBTa2lwIHRoZSBub24tYWxwaGEgY2FzZXMgLSB0aGVyZSBpcyBubyBzZXR0aW5nIG9mIGEgdHJhbnNwYXJlbmN5IGNvbG91ciBhdAotICAgICogcHJlc2VudC4KLSAgICAqCi0gICAgKiBUT0RPOiBpbmNvcnJlY3Q7IHRoZSBwYWxldHRlIGNhc2Ugc2V0cyB0Uk5TIGFuZCwgbm93IFJHQiBhbmQgZ3JheSBkbywKLSAgICAqIGhvd2V2ZXIgdGhlIHBhbGV0dGUgY2FzZSBmYWlscyBtaXNlcmFibHkgc28gaXMgY29tbWVudGVkIG91dCBiZWxvdy4KLSAgICAqLwotICAgd2hpbGUgKG5leHRfZm9ybWF0KCZjb2xvdXJfdHlwZSwgJmJpdF9kZXB0aCwgJnBhbGV0dGVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgIHBtLT50ZXN0X2xiZ19nYW1tYV9jb21wb3NpdGlvbiwgcG0tPnRlc3RfdFJOUykpCi0gICAgICBpZiAoKGNvbG91cl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpICE9IDAKLSNpZiAwIC8qIFRPRE86IEZJWE1FICovCi0gICAgICAgICAgLypUT0RPOiBGSVhNRTogdGhpcyBzaG91bGQgd29yayAqLwotICAgICAgICAgIHx8IGNvbG91cl90eXBlID09IDMKLSNlbmRpZgotICAgICAgICAgIHx8IChjb2xvdXJfdHlwZSAhPSAzICYmIHBhbGV0dGVfbnVtYmVyICE9IDApKQotICAgewotICAgICAgdW5zaWduZWQgaW50IGksIGo7Ci0KLSAgICAgIC8qIERvbid0IHNraXAgdGhlIGk9PWogY2FzZSBoZXJlIC0gaXQncyByZWxldmFudC4gKi8KLSAgICAgIGZvciAoaT0wOyBpPHBtLT5uZ2FtbWFfdGVzdHM7ICsraSkgZm9yIChqPTA7IGo8cG0tPm5nYW1tYV90ZXN0czsgKytqKQotICAgICAgewotICAgICAgICAgZ2FtbWFfY29tcG9zaXRpb25fdGVzdChwbSwgY29sb3VyX3R5cGUsIGJpdF9kZXB0aCwgcGFsZXR0ZV9udW1iZXIsCi0gICAgICAgICAgICBwbS0+aW50ZXJsYWNlX3R5cGUsIDEvcG0tPmdhbW1hc1tpXSwgcG0tPmdhbW1hc1tqXSwKLSAgICAgICAgICAgIHBtLT51c2VfaW5wdXRfcHJlY2lzaW9uLCBkb19iYWNrZ3JvdW5kLCBleHBhbmRfMTYpOwotCi0gICAgICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci19Ci0jZW5kaWYgLyogUkVBRF9CQUNLR1JPVU5EIHx8IFJFQURfQUxQSEFfTU9ERSAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF9nYW1tYV9lcnJvcnMocG5nX21vZGlmaWVyICpwbSkKLXsKLSAgIC8qIFVzZSAtMSB0byBjYXRjaCB0ZXN0cyB0aGF0IHdlcmUgbm90IGFjdHVhbGx5IHJ1biAqLwotICAgcG0tPmVycm9yX2dyYXlfMiA9IHBtLT5lcnJvcl9ncmF5XzQgPSBwbS0+ZXJyb3JfZ3JheV84ID0gLTEuOwotICAgcG0tPmVycm9yX2NvbG9yXzggPSAtMS47Ci0gICBwbS0+ZXJyb3JfaW5kZXhlZCA9IC0xLjsKLSAgIHBtLT5lcnJvcl9ncmF5XzE2ID0gcG0tPmVycm9yX2NvbG9yXzE2ID0gLTEuOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb25lKGNvbnN0IGNoYXIgKmxlYWRlciwgZG91YmxlIGVycikKLXsKLSAgIGlmIChlcnIgIT0gLTEuKQotICAgICAgcHJpbnRmKCIgJXMgJS41ZlxuIiwgbGVhZGVyLCBlcnIpOwotfQotCi1zdGF0aWMgdm9pZAotc3VtbWFyaXplX2dhbW1hX2Vycm9ycyhwbmdfbW9kaWZpZXIgKnBtLCBwbmdfY29uc3RfY2hhcnAgd2hvLCBpbnQgbG93X2JpdF9kZXB0aCwKLSAgIGludCBpbmRleGVkKQotewotICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgIGlmICh3aG8pCi0gICAgICBwcmludGYoIlxuR2FtbWEgY29ycmVjdGlvbiB3aXRoICVzOlxuIiwgd2hvKTsKLQotICAgZWxzZQotICAgICAgcHJpbnRmKCJcbkJhc2ljIGdhbW1hIGNvcnJlY3Rpb246XG4iKTsKLQotICAgaWYgKGxvd19iaXRfZGVwdGgpCi0gICB7Ci0gICAgICBwcmludF9vbmUoIiAyIGJpdCBncmF5OiAiLCBwbS0+ZXJyb3JfZ3JheV8yKTsKLSAgICAgIHByaW50X29uZSgiIDQgYml0IGdyYXk6ICIsIHBtLT5lcnJvcl9ncmF5XzQpOwotICAgICAgcHJpbnRfb25lKCIgOCBiaXQgZ3JheTogIiwgcG0tPmVycm9yX2dyYXlfOCk7Ci0gICAgICBwcmludF9vbmUoIiA4IGJpdCBjb2xvcjoiLCBwbS0+ZXJyb3JfY29sb3JfOCk7Ci0gICAgICBpZiAoaW5kZXhlZCkKLSAgICAgICAgIHByaW50X29uZSgiIGluZGV4ZWQ6ICAgICIsIHBtLT5lcnJvcl9pbmRleGVkKTsKLSAgIH0KLQotICAgcHJpbnRfb25lKCIxNiBiaXQgZ3JheTogIiwgcG0tPmVycm9yX2dyYXlfMTYpOwotICAgcHJpbnRfb25lKCIxNiBiaXQgY29sb3I6IiwgcG0tPmVycm9yX2NvbG9yXzE2KTsKLQotICAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZXJmb3JtX2dhbW1hX3Rlc3QocG5nX21vZGlmaWVyICpwbSwgaW50IHN1bW1hcnkpCi17Ci0gICAvKlRPRE86IHJlbW92ZSB0aGlzKi8KLSAgIC8qIFNhdmUgY2VydGFpbiB2YWx1ZXMgZm9yIHRoZSB0ZW1wb3Jhcnkgb3ZlcnJpZGVzIGJlbG93LiAqLwotICAgdW5zaWduZWQgaW50IGNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID0KLSAgICAgIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbjsKLSMgIGlmZGVmIFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVECi0gICAgICBkb3VibGUgbWF4b3V0OCA9IHBtLT5tYXhvdXQ4OwotIyAgZW5kaWYKLQotICAgLyogRmlyc3Qgc29tZSBhcmJpdHJhcnkgbm8tdHJhbnNmb3JtIHRlc3RzOiAqLwotICAgaWYgKCFwbS0+dGhpcy5zcGVlZCAmJiBwbS0+dGVzdF9nYW1tYV90aHJlc2hvbGQpCi0gICB7Ci0gICAgICBwZXJmb3JtX2dhbW1hX3RocmVzaG9sZF90ZXN0cyhwbSk7Ci0KLSAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgIHJldHVybjsKLSAgIH0KLQotICAgLyogTm93IHNvbWUgcmVhbCB0cmFuc2Zvcm1zLiAqLwotICAgaWYgKHBtLT50ZXN0X2dhbW1hX3RyYW5zZm9ybSkKLSAgIHsKLSAgICAgIGlmIChzdW1tYXJ5KQotICAgICAgewotICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICBwcmludGYoIkdhbW1hIGNvcnJlY3Rpb24gZXJyb3Igc3VtbWFyeVxuXG4iKTsKLSAgICAgICAgIHByaW50ZigiVGhlIHByaW50ZWQgdmFsdWUgaXMgdGhlIG1heGltdW0gZXJyb3IgaW4gdGhlIHBpeGVsIHZhbHVlc1xuIik7Ci0gICAgICAgICBwcmludGYoImNhbGN1bGF0ZWQgYnkgdGhlIGxpYnBuZyBnYW1tYSBjb3JyZWN0aW9uIGNvZGUuICBUaGUgZXJyb3JcbiIpOwotICAgICAgICAgcHJpbnRmKCJpcyBjYWxjdWxhdGVkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG91dHB1dCBwaXhlbFxuIik7Ci0gICAgICAgICBwcmludGYoInZhbHVlIChhbHdheXMgYW4gaW50ZWdlcikgYW5kIHRoZSBpZGVhbCB2YWx1ZSBmcm9tIHRoZVxuIik7Ci0gICAgICAgICBwcmludGYoImxpYnBuZyBzcGVjaWZpY2F0aW9uICh0eXBpY2FsbHkgbm90IGFuIGludGVnZXIpLlxuXG4iKTsKLQotICAgICAgICAgcHJpbnRmKCJFeHBlY3QgdGhpcyB2YWx1ZSB0byBiZSBsZXNzIHRoYW4gLjUgZm9yIDggYml0IGZvcm1hdHMsXG4iKTsKLSAgICAgICAgIHByaW50ZigibGVzcyB0aGFuIDEgZm9yIGZvcm1hdHMgd2l0aCBmZXdlciB0aGFuIDggYml0cyBhbmQgYSBzbWFsbFxuIik7Ci0gICAgICAgICBwcmludGYoIm51bWJlciAodHlwaWNhbGx5IGxlc3MgdGhhbiA1KSBmb3IgdGhlIDE2IGJpdCBmb3JtYXRzLlxuIik7Ci0gICAgICAgICBwcmludGYoIkZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZSB2YWx1ZSBmb3IgMTYgYml0IGZvcm1hdHNcbiIpOwotICAgICAgICAgcHJpbnRmKCJpbmNyZWFzZXMgd2hlbiB0aGUgaW1hZ2UgZmlsZSBpbmNsdWRlcyBhbiBzQklUIGNodW5rLlxuIik7Ci0gICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgIH0KLQotICAgICAgaW5pdF9nYW1tYV9lcnJvcnMocG0pOwotICAgICAgLypUT0RPOiByZW1vdmUgdGhpcy4gIE5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBjdXJyZW50IGxpYnBuZwotICAgICAgICogaW1wbGVtZW50YXRpb24gd29ya3MgaW4gOCBiaXRzOgotICAgICAgICovCi0gICAgICBpZiAocG0tPnRlc3RfZ2FtbWFfZXhwYW5kMTYpCi0gICAgICAgICBwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPSAxOwotICAgICAgcGVyZm9ybV9nYW1tYV90cmFuc2Zvcm1fdGVzdHMocG0pOwotICAgICAgaWYgKCFjYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbikKLSAgICAgICAgIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9IDA7Ci0KLSAgICAgIGlmIChzdW1tYXJ5KQotICAgICAgICAgc3VtbWFyaXplX2dhbW1hX2Vycm9ycyhwbSwgMC8qd2hvKi8sIDEvKmxvdyBiaXQgZGVwdGgqLywgMS8qaW5kZXhlZCovKTsKLQotICAgICAgaWYgKGZhaWwocG0pKQotICAgICAgICAgcmV0dXJuOwotICAgfQotCi0gICAvKiBUaGUgc2JpdCB0ZXN0cyBwcm9kdWNlIG11Y2ggbGFyZ2VyIGVycm9yczogKi8KLSAgIGlmIChwbS0+dGVzdF9nYW1tYV9zYml0KQotICAgewotICAgICAgaW5pdF9nYW1tYV9lcnJvcnMocG0pOwotICAgICAgcGVyZm9ybV9nYW1tYV9zYml0X3Rlc3RzKHBtKTsKLQotICAgICAgaWYgKHN1bW1hcnkpCi0gICAgICAgICBzdW1tYXJpemVfZ2FtbWFfZXJyb3JzKHBtLCAic0JJVCIsIHBtLT5zYml0bG93IDwgOFUsIDEvKmluZGV4ZWQqLyk7Ci0KLSAgICAgIGlmIChmYWlsKHBtKSkKLSAgICAgICAgIHJldHVybjsKLSAgIH0KLQotI2lmZGVmIERPXzE2QklUIC8qIFNob3VsZCBiZSBSRUFEXzE2QklUX1NVUFBPUlRFRCAqLwotICAgaWYgKHBtLT50ZXN0X2dhbW1hX3NjYWxlMTYpCi0gICB7Ci0gICAgICAvKiBUaGUgMTYgdG8gOCBiaXQgc3RyaXAgb3BlcmF0aW9uczogKi8KLSAgICAgIGluaXRfZ2FtbWFfZXJyb3JzKHBtKTsKLSAgICAgIHBlcmZvcm1fZ2FtbWFfc2NhbGUxNl90ZXN0cyhwbSk7Ci0KLSAgICAgIGlmIChzdW1tYXJ5KQotICAgICAgewotICAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgICBwcmludGYoIlxuR2FtbWEgY29ycmVjdGlvbiB3aXRoIDE2IHRvIDggYml0IHJlZHVjdGlvbjpcbiIpOwotICAgICAgICAgcHJpbnRmKCIgMTYgYml0IGdyYXk6ICAlLjVmXG4iLCBwbS0+ZXJyb3JfZ3JheV8xNik7Ci0gICAgICAgICBwcmludGYoIiAxNiBiaXQgY29sb3I6ICUuNWZcbiIsIHBtLT5lcnJvcl9jb2xvcl8xNik7Ci0gICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGZhaWwocG0pKQotICAgICAgICAgcmV0dXJuOwotICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRAotICAgaWYgKHBtLT50ZXN0X2dhbW1hX2JhY2tncm91bmQpCi0gICB7Ci0gICAgICBpbml0X2dhbW1hX2Vycm9ycyhwbSk7Ci0KLSAgICAgIC8qVE9ETzogcmVtb3ZlIHRoaXMuICBOZWNlc3NhcnkgYmVjYXVzZSB0aGUgY3VycmVudCBsaWJwbmcKLSAgICAgICAqIGltcGxlbWVudGF0aW9uIHdvcmtzIGluIDggYml0czoKLSAgICAgICAqLwotICAgICAgaWYgKHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2KQotICAgICAgewotICAgICAgICAgcG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID0gMTsKLSAgICAgICAgIHBtLT5tYXhvdXQ4ID0gLjQ5OTsgLyogYmVjYXVzZSB0aGUgMTYgYml0IGJhY2tncm91bmQgaXMgc21hc2hlZCAqLwotICAgICAgfQotICAgICAgcGVyZm9ybV9nYW1tYV9jb21wb3NpdGlvbl90ZXN0cyhwbSwgUE5HX0JBQ0tHUk9VTkRfR0FNTUFfVU5JUVVFLAotICAgICAgICAgcG0tPnRlc3RfZ2FtbWFfZXhwYW5kMTYpOwotICAgICAgaWYgKCFjYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbikKLSAgICAgICAgIHBtLT5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9IDA7Ci0gICAgICBwbS0+bWF4b3V0OCA9IG1heG91dDg7Ci0KLSAgICAgIGlmIChzdW1tYXJ5KQotICAgICAgICAgc3VtbWFyaXplX2dhbW1hX2Vycm9ycyhwbSwgImJhY2tncm91bmQiLCAxLCAwLyppbmRleGVkKi8pOwotCi0gICAgICBpZiAoZmFpbChwbSkpCi0gICAgICAgICByZXR1cm47Ci0gICB9Ci0jZW5kaWYKLQotI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVECi0gICBpZiAocG0tPnRlc3RfZ2FtbWFfYWxwaGFfbW9kZSkKLSAgIHsKLSAgICAgIGludCBkb19iYWNrZ3JvdW5kOwotCi0gICAgICBpbml0X2dhbW1hX2Vycm9ycyhwbSk7Ci0KLSAgICAgIC8qVE9ETzogcmVtb3ZlIHRoaXMuICBOZWNlc3NhcnkgYmVjYXVzZSB0aGUgY3VycmVudCBsaWJwbmcKLSAgICAgICAqIGltcGxlbWVudGF0aW9uIHdvcmtzIGluIDggYml0czoKLSAgICAgICAqLwotICAgICAgaWYgKHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2KQotICAgICAgICAgcG0tPmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID0gMTsKLSAgICAgIGZvciAoZG9fYmFja2dyb3VuZCA9IEFMUEhBX01PREVfT0ZGU0VUICsgUE5HX0FMUEhBX1NUQU5EQVJEOwotICAgICAgICAgZG9fYmFja2dyb3VuZCA8PSBBTFBIQV9NT0RFX09GRlNFVCArIFBOR19BTFBIQV9CUk9LRU4gJiYgIWZhaWwocG0pOwotICAgICAgICAgKytkb19iYWNrZ3JvdW5kKQotICAgICAgICAgcGVyZm9ybV9nYW1tYV9jb21wb3NpdGlvbl90ZXN0cyhwbSwgZG9fYmFja2dyb3VuZCwKLSAgICAgICAgICAgIHBtLT50ZXN0X2dhbW1hX2V4cGFuZDE2KTsKLSAgICAgIGlmICghY2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24pCi0gICAgICAgICBwbS0+Y2FsY3VsYXRpb25zX3VzZV9pbnB1dF9wcmVjaXNpb24gPSAwOwotCi0gICAgICBpZiAoc3VtbWFyeSkKLSAgICAgICAgIHN1bW1hcml6ZV9nYW1tYV9lcnJvcnMocG0sICJhbHBoYSBtb2RlIiwgMSwgMC8qaW5kZXhlZCovKTsKLQotICAgICAgaWYgKGZhaWwocG0pKQotICAgICAgICAgcmV0dXJuOwotICAgfQotI2VuZGlmCi19Ci0jZW5kaWYgLyogUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEICovCi0jZW5kaWYgLyogUE5HX1JFQURfU1VQUE9SVEVEICovCi0KLS8qIElOVEVSTEFDRSBNQUNSTyBWQUxJREFUSU9OICovCi0vKiBUaGlzIGlzIGNvcGllZCB2ZXJiYXRpbSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLCBpdCBpcyBzaW1wbHkgdGhlIHBhc3MKLSAqIG51bWJlciBpbiB3aGljaCBlYWNoIHBpeGVsIGluIGVhY2ggOHg4IHRpbGUgYXBwZWFycy4gIFRoZSBhcnJheSBtdXN0Ci0gKiBiZSBpbmRleGVkIGFkYW03W3ldW3hdIGFuZCBub3RpY2UgdGhhdCB0aGUgcGFzcyBudW1iZXJzIGFyZSBiYXNlZCBhdAotICogMSwgbm90IDAgLSB0aGUgYmFzZSBsaWJwbmcgdXNlcy4KLSAqLwotc3RhdGljIGNvbnN0Ci1wbmdfYnl0ZSBhZGFtN1s4XVs4XSA9Ci17Ci0gICB7IDEsNiw0LDYsMiw2LDQsNiB9LAotICAgeyA3LDcsNyw3LDcsNyw3LDcgfSwKLSAgIHsgNSw2LDUsNiw1LDYsNSw2IH0sCi0gICB7IDcsNyw3LDcsNyw3LDcsNyB9LAotICAgeyAzLDYsNCw2LDMsNiw0LDYgfSwKLSAgIHsgNyw3LDcsNyw3LDcsNyw3IH0sCi0gICB7IDUsNiw1LDYsNSw2LDUsNiB9LAotICAgeyA3LDcsNyw3LDcsNyw3LDcgfQotfTsKLQotLyogVGhpcyByb3V0aW5lIHZhbGlkYXRlcyBhbGwgdGhlIGludGVybGFjZSBzdXBwb3J0IG1hY3JvcyBpbiBwbmcuaCBmb3IKLSAqIGEgdmFyaWV0eSBvZiB2YWxpZCBQTkcgd2lkdGhzIGFuZCBoZWlnaHRzLiAgSXQgdXNlcyBhIG51bWJlciBvZiBzaW1pbGFybHkKLSAqIG5hbWVkIGludGVybmFsIHJvdXRpbmVzIHRoYXQgZmVlZCBvZmYgdGhlIGFib3ZlIGFycmF5LgotICovCi1zdGF0aWMgcG5nX3VpbnRfMzIKLXBuZ19wYXNzX3N0YXJ0X3JvdyhpbnQgcGFzcykKLXsKLSAgIGludCB4LCB5OwotICAgKytwYXNzOwotICAgZm9yICh5PTA7IHk8ODsgKyt5KSBmb3IgKHg9MDsgeDw4OyArK3gpIGlmIChhZGFtN1t5XVt4XSA9PSBwYXNzKQotICAgICAgcmV0dXJuIHk7Ci0gICByZXR1cm4gMHhmOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIKLXBuZ19wYXNzX3N0YXJ0X2NvbChpbnQgcGFzcykKLXsKLSAgIGludCB4LCB5OwotICAgKytwYXNzOwotICAgZm9yICh4PTA7IHg8ODsgKyt4KSBmb3IgKHk9MDsgeTw4OyArK3kpIGlmIChhZGFtN1t5XVt4XSA9PSBwYXNzKQotICAgICAgcmV0dXJuIHg7Ci0gICByZXR1cm4gMHhmOwotfQotCi1zdGF0aWMgaW50Ci1wbmdfcGFzc19yb3dfc2hpZnQoaW50IHBhc3MpCi17Ci0gICBpbnQgeCwgeSwgYmFzZT0oLTEpLCBpbmM9ODsKLSAgICsrcGFzczsKLSAgIGZvciAoeT0wOyB5PDg7ICsreSkgZm9yICh4PTA7IHg8ODsgKyt4KSBpZiAoYWRhbTdbeV1beF0gPT0gcGFzcykKLSAgIHsKLSAgICAgIGlmIChiYXNlID09ICgtMSkpCi0gICAgICAgICBiYXNlID0geTsKLSAgICAgIGVsc2UgaWYgKGJhc2UgPT0geSkKLSAgICAgICAgIHt9Ci0gICAgICBlbHNlIGlmIChpbmMgPT0geS1iYXNlKQotICAgICAgICAgYmFzZT15OwotICAgICAgZWxzZSBpZiAoaW5jID09IDgpCi0gICAgICAgICBpbmMgPSB5LWJhc2UsIGJhc2U9eTsKLSAgICAgIGVsc2UgaWYgKGluYyAhPSB5LWJhc2UpCi0gICAgICAgICByZXR1cm4gMHhmZjsgLyogZXJyb3IgLSBtb3JlIHRoYW4gb25lICdpbmMnIHZhbHVlISAqLwotICAgfQotCi0gICBpZiAoYmFzZSA9PSAoLTEpKSByZXR1cm4gMHhmZTsgLyogZXJyb3IgLSBubyByb3cgaW4gcGFzcyEgKi8KLQotICAgLyogVGhlIHNoaWZ0IGlzIGFsd2F5cyAxLCAyIG9yIDMgLSBubyBwYXNzIGhhcyBhbGwgdGhlIHJvd3MhICovCi0gICBzd2l0Y2ggKGluYykKLSAgIHsKLWNhc2UgMjogcmV0dXJuIDE7Ci1jYXNlIDQ6IHJldHVybiAyOwotY2FzZSA4OiByZXR1cm4gMzsKLWRlZmF1bHQ6IGJyZWFrOwotICAgfQotCi0gICAvKiBlcnJvciAtIHVucmVjb2duaXplZCAnaW5jJyAqLwotICAgcmV0dXJuIChpbmMgPDwgOCkgKyAweGZkOwotfQotCi1zdGF0aWMgaW50Ci1wbmdfcGFzc19jb2xfc2hpZnQoaW50IHBhc3MpCi17Ci0gICBpbnQgeCwgeSwgYmFzZT0oLTEpLCBpbmM9ODsKLSAgICsrcGFzczsKLSAgIGZvciAoeD0wOyB4PDg7ICsreCkgZm9yICh5PTA7IHk8ODsgKyt5KSBpZiAoYWRhbTdbeV1beF0gPT0gcGFzcykKLSAgIHsKLSAgICAgIGlmIChiYXNlID09ICgtMSkpCi0gICAgICAgICBiYXNlID0geDsKLSAgICAgIGVsc2UgaWYgKGJhc2UgPT0geCkKLSAgICAgICAgIHt9Ci0gICAgICBlbHNlIGlmIChpbmMgPT0geC1iYXNlKQotICAgICAgICAgYmFzZT14OwotICAgICAgZWxzZSBpZiAoaW5jID09IDgpCi0gICAgICAgICBpbmMgPSB4LWJhc2UsIGJhc2U9eDsKLSAgICAgIGVsc2UgaWYgKGluYyAhPSB4LWJhc2UpCi0gICAgICAgICByZXR1cm4gMHhmZjsgLyogZXJyb3IgLSBtb3JlIHRoYW4gb25lICdpbmMnIHZhbHVlISAqLwotICAgfQotCi0gICBpZiAoYmFzZSA9PSAoLTEpKSByZXR1cm4gMHhmZTsgLyogZXJyb3IgLSBubyByb3cgaW4gcGFzcyEgKi8KLQotICAgLyogVGhlIHNoaWZ0IGlzIGFsd2F5cyAxLCAyIG9yIDMgLSBubyBwYXNzIGhhcyBhbGwgdGhlIHJvd3MhICovCi0gICBzd2l0Y2ggKGluYykKLSAgIHsKLWNhc2UgMTogcmV0dXJuIDA7IC8qIHBhc3MgNyBoYXMgYWxsIHRoZSBjb2x1bW5zICovCi1jYXNlIDI6IHJldHVybiAxOwotY2FzZSA0OiByZXR1cm4gMjsKLWNhc2UgODogcmV0dXJuIDM7Ci1kZWZhdWx0OiBicmVhazsKLSAgIH0KLQotICAgLyogZXJyb3IgLSB1bnJlY29nbml6ZWQgJ2luYycgKi8KLSAgIHJldHVybiAoaW5jIDw8IDgpICsgMHhmZDsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyCi1wbmdfcm93X2Zyb21fcGFzc19yb3cocG5nX3VpbnRfMzIgeUluLCBpbnQgcGFzcykKLXsKLSAgIC8qIEJ5IGV4YW1pbmF0aW9uIG9mIHRoZSBhcnJheTogKi8KLSAgIHN3aXRjaCAocGFzcykKLSAgIHsKLWNhc2UgMDogcmV0dXJuIHlJbiAqIDg7Ci1jYXNlIDE6IHJldHVybiB5SW4gKiA4OwotY2FzZSAyOiByZXR1cm4geUluICogOCArIDQ7Ci1jYXNlIDM6IHJldHVybiB5SW4gKiA0OwotY2FzZSA0OiByZXR1cm4geUluICogNCArIDI7Ci1jYXNlIDU6IHJldHVybiB5SW4gKiAyOwotY2FzZSA2OiByZXR1cm4geUluICogMiArIDE7Ci1kZWZhdWx0OiBicmVhazsKLSAgIH0KLQotICAgcmV0dXJuIDB4ZmY7IC8qIGJhZCBwYXNzIG51bWJlciAqLwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIKLXBuZ19jb2xfZnJvbV9wYXNzX2NvbChwbmdfdWludF8zMiB4SW4sIGludCBwYXNzKQotewotICAgLyogQnkgZXhhbWluYXRpb24gb2YgdGhlIGFycmF5OiAqLwotICAgc3dpdGNoIChwYXNzKQotICAgewotY2FzZSAwOiByZXR1cm4geEluICogODsKLWNhc2UgMTogcmV0dXJuIHhJbiAqIDggKyA0OwotY2FzZSAyOiByZXR1cm4geEluICogNDsKLWNhc2UgMzogcmV0dXJuIHhJbiAqIDQgKyAyOwotY2FzZSA0OiByZXR1cm4geEluICogMjsKLWNhc2UgNTogcmV0dXJuIHhJbiAqIDIgKyAxOwotY2FzZSA2OiByZXR1cm4geEluOwotZGVmYXVsdDogYnJlYWs7Ci0gICB9Ci0KLSAgIHJldHVybiAweGZmOyAvKiBiYWQgcGFzcyBudW1iZXIgKi8KLX0KLQotc3RhdGljIGludAotcG5nX3Jvd19pbl9pbnRlcmxhY2VfcGFzcyhwbmdfdWludF8zMiB5LCBpbnQgcGFzcykKLXsKLSAgIC8qIElzIHJvdyAneScgaW4gcGFzcyAncGFzcyc/ICovCi0gICBpbnQgeDsKLSAgIHkgJj0gNzsKLSAgICsrcGFzczsKLSAgIGZvciAoeD0wOyB4PDg7ICsreCkgaWYgKGFkYW03W3ldW3hdID09IHBhc3MpCi0gICAgICByZXR1cm4gMTsKLQotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXBuZ19jb2xfaW5faW50ZXJsYWNlX3Bhc3MocG5nX3VpbnRfMzIgeCwgaW50IHBhc3MpCi17Ci0gICAvKiBJcyBjb2x1bW4gJ3gnIGluIHBhc3MgJ3Bhc3MnPyAqLwotICAgaW50IHk7Ci0gICB4ICY9IDc7Ci0gICArK3Bhc3M7Ci0gICBmb3IgKHk9MDsgeTw4OyArK3kpIGlmIChhZGFtN1t5XVt4XSA9PSBwYXNzKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIKLXBuZ19wYXNzX3Jvd3MocG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgcGFzcykKLXsKLSAgIHBuZ191aW50XzMyIHRpbGVzID0gaGVpZ2h0Pj4zOwotICAgcG5nX3VpbnRfMzIgcm93cyA9IDA7Ci0gICB1bnNpZ25lZCBpbnQgeCwgeTsKLQotICAgaGVpZ2h0ICY9IDc7Ci0gICArK3Bhc3M7Ci0gICBmb3IgKHk9MDsgeTw4OyArK3kpIGZvciAoeD0wOyB4PDg7ICsreCkgaWYgKGFkYW03W3ldW3hdID09IHBhc3MpCi0gICB7Ci0gICAgICByb3dzICs9IHRpbGVzOwotICAgICAgaWYgKHkgPCBoZWlnaHQpICsrcm93czsKLSAgICAgIGJyZWFrOyAvKiBpLmUuIGJyZWFrIHRoZSAneCcsIGNvbHVtbiwgbG9vcC4gKi8KLSAgIH0KLQotICAgcmV0dXJuIHJvd3M7Ci19Ci0KLXN0YXRpYyBwbmdfdWludF8zMgotcG5nX3Bhc3NfY29scyhwbmdfdWludF8zMiB3aWR0aCwgaW50IHBhc3MpCi17Ci0gICBwbmdfdWludF8zMiB0aWxlcyA9IHdpZHRoPj4zOwotICAgcG5nX3VpbnRfMzIgY29scyA9IDA7Ci0gICB1bnNpZ25lZCBpbnQgeCwgeTsKLQotICAgd2lkdGggJj0gNzsKLSAgICsrcGFzczsKLSAgIGZvciAoeD0wOyB4PDg7ICsreCkgZm9yICh5PTA7IHk8ODsgKyt5KSBpZiAoYWRhbTdbeV1beF0gPT0gcGFzcykKLSAgIHsKLSAgICAgIGNvbHMgKz0gdGlsZXM7Ci0gICAgICBpZiAoeCA8IHdpZHRoKSArK2NvbHM7Ci0gICAgICBicmVhazsgLyogaS5lLiBicmVhayB0aGUgJ3knLCByb3csIGxvb3AuICovCi0gICB9Ci0KLSAgIHJldHVybiBjb2xzOwotfQotCi1zdGF0aWMgdm9pZAotcGVyZm9ybV9pbnRlcmxhY2VfbWFjcm9fdmFsaWRhdGlvbih2b2lkKQotewotICAgLyogVGhlIG1hY3JvcyB0byB2YWxpZGF0ZSwgZmlyc3QgdGhvc2UgdGhhdCBkZXBlbmQgb25seSBvbiBwYXNzOgotICAgICoKLSAgICAqIFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKQotICAgICogUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpCi0gICAgKiBQTkdfUEFTU19ST1dfU0hJRlQocGFzcykKLSAgICAqIFBOR19QQVNTX0NPTF9TSElGVChwYXNzKQotICAgICovCi0gICBpbnQgcGFzczsKLQotICAgZm9yIChwYXNzPTA7IHBhc3M8NzsgKytwYXNzKQotICAgewotICAgICAgcG5nX3VpbnRfMzIgbSwgZiwgdjsKLQotICAgICAgbSA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsKLSAgICAgIGYgPSBwbmdfcGFzc19zdGFydF9yb3cocGFzcyk7Ci0gICAgICBpZiAobSAhPSBmKQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfUEFTU19TVEFSVF9ST1coJWQpID0gJXUgIT0gJXhcbiIsIHBhc3MsIG0sIGYpOwotICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICB9Ci0KLSAgICAgIG0gPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7Ci0gICAgICBmID0gcG5nX3Bhc3Nfc3RhcnRfY29sKHBhc3MpOwotICAgICAgaWYgKG0gIT0gZikKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUE5HX1BBU1NfU1RBUlRfQ09MKCVkKSA9ICV1ICE9ICV4XG4iLCBwYXNzLCBtLCBmKTsKLSAgICAgICAgIGV4aXQoOTkpOwotICAgICAgfQotCi0gICAgICBtID0gUE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpOwotICAgICAgZiA9IHBuZ19wYXNzX3Jvd19zaGlmdChwYXNzKTsKLSAgICAgIGlmIChtICE9IGYpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBOR19QQVNTX1JPV19TSElGVCglZCkgPSAldSAhPSAleFxuIiwgcGFzcywgbSwgZik7Ci0gICAgICAgICBleGl0KDk5KTsKLSAgICAgIH0KLQotICAgICAgbSA9IFBOR19QQVNTX0NPTF9TSElGVChwYXNzKTsKLSAgICAgIGYgPSBwbmdfcGFzc19jb2xfc2hpZnQocGFzcyk7Ci0gICAgICBpZiAobSAhPSBmKQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfUEFTU19DT0xfU0hJRlQoJWQpID0gJXUgIT0gJXhcbiIsIHBhc3MsIG0sIGYpOwotICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE1hY3JvcyB0aGF0IGRlcGVuZCBvbiB0aGUgaW1hZ2Ugb3Igc3ViLWltYWdlIGhlaWdodCB0b286Ci0gICAgICAgKgotICAgICAgICogUE5HX1BBU1NfUk9XUyhoZWlnaHQsIHBhc3MpCi0gICAgICAgKiBQTkdfUEFTU19DT0xTKHdpZHRoLCBwYXNzKQotICAgICAgICogUE5HX1JPV19GUk9NX1BBU1NfUk9XKHlJbiwgcGFzcykKLSAgICAgICAqIFBOR19DT0xfRlJPTV9QQVNTX0NPTCh4SW4sIHBhc3MpCi0gICAgICAgKiBQTkdfUk9XX0lOX0lOVEVSTEFDRV9QQVNTKHksIHBhc3MpCi0gICAgICAgKiBQTkdfQ09MX0lOX0lOVEVSTEFDRV9QQVNTKHgsIHBhc3MpCi0gICAgICAgKi8KLSAgICAgIGZvciAodj0wOzspCi0gICAgICB7Ci0gICAgICAgICAvKiBGaXJzdCB0aGUgYmFzZSAwIHN0dWZmOiAqLwotICAgICAgICAgbSA9IFBOR19ST1dfRlJPTV9QQVNTX1JPVyh2LCBwYXNzKTsKLSAgICAgICAgIGYgPSBwbmdfcm93X2Zyb21fcGFzc19yb3codiwgcGFzcyk7Ci0gICAgICAgICBpZiAobSAhPSBmKQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfUk9XX0ZST01fUEFTU19ST1coJXUsICVkKSA9ICV1ICE9ICV4XG4iLAotICAgICAgICAgICAgICAgdiwgcGFzcywgbSwgZik7Ci0gICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgbSA9IFBOR19DT0xfRlJPTV9QQVNTX0NPTCh2LCBwYXNzKTsKLSAgICAgICAgIGYgPSBwbmdfY29sX2Zyb21fcGFzc19jb2wodiwgcGFzcyk7Ci0gICAgICAgICBpZiAobSAhPSBmKQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQTkdfQ09MX0ZST01fUEFTU19DT0woJXUsICVkKSA9ICV1ICE9ICV4XG4iLAotICAgICAgICAgICAgICAgdiwgcGFzcywgbSwgZik7Ci0gICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgbSA9IFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1ModiwgcGFzcyk7Ci0gICAgICAgICBmID0gcG5nX3Jvd19pbl9pbnRlcmxhY2VfcGFzcyh2LCBwYXNzKTsKLSAgICAgICAgIGlmIChtICE9IGYpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1MoJXUsICVkKSA9ICV1ICE9ICV4XG4iLAotICAgICAgICAgICAgICAgdiwgcGFzcywgbSwgZik7Ci0gICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgbSA9IFBOR19DT0xfSU5fSU5URVJMQUNFX1BBU1ModiwgcGFzcyk7Ci0gICAgICAgICBmID0gcG5nX2NvbF9pbl9pbnRlcmxhY2VfcGFzcyh2LCBwYXNzKTsKLSAgICAgICAgIGlmIChtICE9IGYpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBOR19DT0xfSU5fSU5URVJMQUNFX1BBU1MoJXUsICVkKSA9ICV1ICE9ICV4XG4iLAotICAgICAgICAgICAgICAgdiwgcGFzcywgbSwgZik7Ci0gICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogVGhlbiB0aGUgYmFzZSAxIHN0dWZmOiAqLwotICAgICAgICAgKyt2OwotICAgICAgICAgbSA9IFBOR19QQVNTX1JPV1ModiwgcGFzcyk7Ci0gICAgICAgICBmID0gcG5nX3Bhc3Nfcm93cyh2LCBwYXNzKTsKLSAgICAgICAgIGlmIChtICE9IGYpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBOR19QQVNTX1JPV1MoJXUsICVkKSA9ICV1ICE9ICV4XG4iLAotICAgICAgICAgICAgICAgdiwgcGFzcywgbSwgZik7Ci0gICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgbSA9IFBOR19QQVNTX0NPTFModiwgcGFzcyk7Ci0gICAgICAgICBmID0gcG5nX3Bhc3NfY29scyh2LCBwYXNzKTsKLSAgICAgICAgIGlmIChtICE9IGYpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBOR19QQVNTX0NPTFMoJXUsICVkKSA9ICV1ICE9ICV4XG4iLAotICAgICAgICAgICAgICAgdiwgcGFzcywgbSwgZik7Ci0gICAgICAgICAgICBleGl0KDk5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogTW92ZSB0byB0aGUgbmV4dCB2IC0gdGhlIHN0ZXBwaW5nIGFsZ29yaXRobSBzdGFydHMgc2tpcHBpbmcKLSAgICAgICAgICAqIHZhbHVlcyBhYm92ZSAxMDI0LgotICAgICAgICAgICovCi0gICAgICAgICBpZiAodiA+IDEwMjQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodiA9PSBQTkdfVUlOVF8zMV9NQVgpCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdiA9ICh2IDw8IDEpIF4gdjsKLSAgICAgICAgICAgIGlmICh2ID49IFBOR19VSU5UXzMxX01BWCkKLSAgICAgICAgICAgICAgIHYgPSBQTkdfVUlOVF8zMV9NQVgtMTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLQotLyogVGVzdCBjb2xvciBlbmNvZGluZ3MuIFRoZXNlIHZhbHVlcyBhcmUgYmFjay1jYWxjdWxhdGVkIGZyb20gdGhlIHB1Ymxpc2hlZAotICogY2hyb21hdGljaXRpZXMuICBUaGUgdmFsdWVzIGFyZSBhY2N1cmF0ZSB0byBhYm91dCAxNCBkZWNpbWFsIHBsYWNlczsgMTUgYXJlCi0gKiBnaXZlbi4gIFRoZXNlIHZhbHVlcyBhcmUgbXVjaCBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIG9uZXMgZ2l2ZW4gaW4gdGhlIHNwZWMsCi0gKiB3aGljaCB0eXBpY2FsbHkgZG9uJ3QgZXhjZWVkIDQgZGVjaW1hbCBwbGFjZXMuICBUaGlzIGFsbG93cyB0ZXN0aW5nIG9mIHRoZQotICogbGlicG5nIGNvZGUgdG8gaXRzIHRoZW9yZXRpY2FsIGFjY3VyYWN5IG9mIDQgZGVjaW1hbCBwbGFjZXMuICAoSWYgcG5ndmFsaWQKLSAqIHVzZWQgdGhlIHB1Ymxpc2hlZCBlcnJvcnMgdGhlICdzbGFjaycgcGVybWl0dGVkIHdvdWxkIGhhdmUgdG8gYmUgKy8tLjVFLTQgb3IKLSAqIG1vcmUuKQotICoKLSAqIFRoZSBwbmdfbW9kaWZpZXIgY29kZSBhc3N1bWVzIHRoYXQgZW5jb2RpbmdzWzBdIGlzIHNSR0IgYW5kIHRyZWF0cyBpdAotICogc3BlY2lhbGx5OiBkbyBub3QgY2hhbmdlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGlzIGxpc3QhCi0gKi8KLXN0YXRpYyBjb25zdCBjb2xvcl9lbmNvZGluZyB0ZXN0X2VuY29kaW5nc1tdID0KLXsKLS8qIHNSR0I6IG11c3QgYmUgZmlyc3QgaW4gdGhpcyBsaXN0ISAqLwotLypnYW1tYToqLyB7IDEvMi4yLAotLypyZWQ6ICAqLyB7IDAuNDEyMzkwNzk5MjY1OTU5LCAwLjIxMjYzOTAwNTg3MTUxMCwgMC4wMTkzMzA4MTg3MTU1OTIgfSwKLS8qZ3JlZW46Ki8geyAwLjM1NzU4NDMzOTM4Mzg3OCwgMC43MTUxNjg2Nzg3Njc3NTYsIDAuMTE5MTk0Nzc5Nzk0NjI2IH0sCi0vKmJsdWU6ICovIHsgMC4xODA0ODA3ODg0MDE4MzQsIDAuMDcyMTkyMzE1MzYwNzM0LCAwLjk1MDUzMjE1MjI0OTY2MH0gfSwKLS8qIEtvZGFrIFByb1Bob3RvICh3aWRlIGdhbXV0KSAqLwotLypnYW1tYToqLyB7IDEvMS42IC8qYXBwcm94aW1hdGU6IHVzZXMgMS44IHBvd2VyIGxhdyBjb21wYXJlZCB0byBzUkdCIDIuNCovLAotLypyZWQ6ICAqLyB7IDAuNzk3NzYwNDg5NjcyMzAzLCAwLjI4ODA3MTEyODIyOTI5MywgMC4wMDAwMDAwMDAwMDAwMDAgfSwKLS8qZ3JlZW46Ki8geyAwLjEzNTE4NTgzNzE3NTc0MCwgMC43MTE4NDMyMTc4MTAxMDIsIDAuMDAwMDAwMDAwMDAwMDAwIH0sCi0vKmJsdWU6ICovIHsgMC4wMzEzNDkzNDk1ODE1MjUsIDAuMDAwMDg1NjUzOTYwNjA1LCAwLjgyNTEwNDYwMjUxMDQ2MH0gfSwKLS8qIEFkb2JlIFJHQiAoMTk5OCkgKi8KLS8qZ2FtbWE6Ki8geyAxLygyKzUxLi8yNTYpLAotLypyZWQ6ICAqLyB7IDAuNTc2NjY5MDQyOTEwMTMxLCAwLjI5NzM0NDk3NTI1MDUzNiwgMC4wMjcwMzEzNjEzODY0MTIgfSwKLS8qZ3JlZW46Ki8geyAwLjE4NTU1ODIzNzkwNjU0NiwgMC42MjczNjM1NjYyNTU0NjYsIDAuMDcwNjg4ODUyNTM1ODI3IH0sCi0vKmJsdWU6ICovIHsgMC4xODgyMjg2NDYyMzQ5OTUsIDAuMDc1MjkxNDU4NDkzOTk4LCAwLjk5MTMzNzUzNjgzNzYzOX0gfSwKLS8qIEFkb2JlIFdpZGUgR2FtdXQgUkdCICovCi0vKmdhbW1hOiovIHsgMS8oMis1MS4vMjU2KSwKLS8qcmVkOiAgKi8geyAwLjcxNjUwMDcxNjc3OTM4NiwgMC4yNTg3MjgyNDMwNDAxMTMsIDAuMDAwMDAwMDAwMDAwMDAwIH0sCi0vKmdyZWVuOiovIHsgMC4xMDEwMjA1NzQzOTc0NzcsIDAuNzI0NjgyMzE0OTQ4NTY2LCAwLjA1MTIxMTgxODk2NTM4OCB9LAotLypibHVlOiAqLyB7IDAuMTQ2Nzc0Mzg1MjUyNzA1LCAwLjAxNjU4OTQ0MjAxMTMyMSwgMC43NzM4OTI3ODM1NDUwNzN9IH0sCi0vKiBGYWtlIGVuY29kaW5nIHdoaWNoIHNlbGVjdHMganVzdCB0aGUgZ3JlZW4gY2hhbm5lbCAqLwotLypnYW1tYToqLyB7IDEuNDUvMi4yLCAvKiB0aGUgJ01hYycgZ2FtbWEgKi8KLS8qcmVkOiAgKi8geyAwLjcxNjUwMDcxNjc3OTM4NiwgMC4wMDAwMDAwMDAwMDAwMDAsIDAuMDAwMDAwMDAwMDAwMDAwIH0sCi0vKmdyZWVuOiovIHsgMC4xMDEwMjA1NzQzOTc0NzcsIDEuMDAwMDAwMDAwMDAwMDAwLCAwLjA1MTIxMTgxODk2NTM4OCB9LAotLypibHVlOiAqLyB7IDAuMTQ2Nzc0Mzg1MjUyNzA1LCAwLjAwMDAwMDAwMDAwMDAwMCwgMC43NzM4OTI3ODM1NDUwNzN9IH0sCi19OwotCi0vKiBzaWduYWwgaGFuZGxlcgotICoKLSAqIFRoaXMgYXR0ZW1wdHMgdG8gdHJhcCBzaWduYWxzIGFuZCBlc2NhcGUgd2l0aG91dCBjcmFzaGluZy4gIEl0IG5lZWRzIGEKLSAqIGNvbnRleHQgcG9pbnRlciBzbyB0aGF0IGl0IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gKGNhbGwgbG9uZ2ptcCkgdG8gcmVjb3ZlcgotICogZnJvbSB0aGUgY29uZGl0aW9uOyB0aGlzIGlzIGhhbmRsZWQgYnkgbWFraW5nIHRoZSBwbmdfbW9kaWZpZXIgdXNlZCBieSAnbWFpbicKLSAqIGludG8gYSBnbG9iYWwgdmFyaWFibGUuCi0gKi8KLXN0YXRpYyBwbmdfbW9kaWZpZXIgcG07Ci0KLXN0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWdudW0pCi17Ci0KLSAgIHNpemVfdCBwb3MgPSAwOwotICAgY2hhciBtc2dbNjRdOwotCi0gICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiY2F1Z2h0IHNpZ25hbDogIik7Ci0KLSAgIHN3aXRjaCAoc2lnbnVtKQotICAgewotICAgICAgY2FzZSBTSUdBQlJUOgotICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImFib3J0Iik7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTSUdGUEU6Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIik7Ci0gICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBTSUdJTEw6Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAiaWxsZWdhbCBpbnN0cnVjdGlvbiIpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgU0lHSU5UOgotICAgICAgICAgcG9zID0gc2FmZWNhdChtc2csIHNpemVvZiBtc2csIHBvcywgImludGVycnVwdCIpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgU0lHU0VHVjoKLSAgICAgICAgIHBvcyA9IHNhZmVjYXQobXNnLCBzaXplb2YgbXNnLCBwb3MsICJpbnZhbGlkIG1lbW9yeSBhY2Nlc3MiKTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFNJR1RFUk06Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAidGVybWluYXRpb24gcmVxdWVzdCIpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBwb3MgPSBzYWZlY2F0KG1zZywgc2l6ZW9mIG1zZywgcG9zLCAidW5rbm93biAiKTsKLSAgICAgICAgIHBvcyA9IHNhZmVjYXRuKG1zZywgc2l6ZW9mIG1zZywgcG9zLCBzaWdudW0pOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIHN0b3JlX2xvZygmcG0udGhpcywgTlVMTC8qcG5nX3N0cnVjdHAqLywgbXNnLCAxLyplcnJvciovKTsKLQotICAgLyogQW5kIGZpbmFsbHkgdGhyb3cgYW4gZXhjZXB0aW9uIHNvIHdlIGNhbiBrZWVwIGdvaW5nLCB1bmxlc3MgdGhpcyBpcwotICAgICogU0lHVEVSTSBpbiB3aGljaCBjYXNlIHN0b3Agbm93LgotICAgICovCi0gICBpZiAoc2lnbnVtICE9IFNJR1RFUk0pCi0gICB7Ci0gICAgICBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgKnRoZV9leGNlcHRpb25fY29udGV4dCA9Ci0gICAgICAgICAmcG0udGhpcy5leGNlcHRpb25fY29udGV4dDsKLQotICAgICAgVGhyb3cgJnBtLnRoaXM7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIGV4aXQoMSk7Ci19Ci0KLS8qIG1haW4gcHJvZ3JhbSAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgaW50IHN1bW1hcnkgPSAxOyAgLyogUHJpbnQgdGhlIGVycm9yIHN1bW1hcnkgYXQgdGhlIGVuZCAqLwotICAgaW50IG1lbXN0YXRzID0gMDsgLyogUHJpbnQgbWVtb3J5IHN0YXRpc3RpY3MgYXQgdGhlIGVuZCAqLwotCi0gICAvKiBDcmVhdGUgdGhlIGdpdmVuIG91dHB1dCBmaWxlIG9uIHN1Y2Nlc3M6ICovCi0gICBjb25zdCBjaGFyICp0b3VjaCA9IE5VTEw7Ci0KLSAgIC8qIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RhbmRhcmQgZ2FtbWEgdmFsdWVzIChiZWxpZXZlIGl0IG9yIG5vdCBJJ3ZlIHNlZW4KLSAgICAqIGV2ZXJ5IG9uZSBvZiB0aGVzZSBtZW50aW9uZWQgc29tZXdoZXJlLikKLSAgICAqCi0gICAgKiBJbiB0aGUgZm9sbG93aW5nIGxpc3QgdGhlIG1vc3QgdXNlZnVsIHZhbHVlcyBhcmUgZmlyc3QhCi0gICAgKi8KLSAgIHN0YXRpYyBkb3VibGUKLSAgICAgIGdhbW1hc1tdPXsyLjIsIDEuMCwgMi4yLzEuNDUsIDEuOCwgMS41LCAyLjQsIDIuNSwgMi42MiwgMi45fTsKLQotICAgLyogVGhpcyByZWNvcmRzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHM6ICovCi0gICBzaXplX3QgY3AgPSAwOwotICAgY2hhciBjb21tYW5kWzEwMjRdOwotCi0gICBhbm9uX2NvbnRleHQoJnBtLnRoaXMpOwotCi0gICBnbnVfdm9sYXRpbGUoc3VtbWFyeSkKLSAgIGdudV92b2xhdGlsZShtZW1zdGF0cykKLSAgIGdudV92b2xhdGlsZSh0b3VjaCkKLQotICAgLyogQWRkIGFwcHJvcHJpYXRlIHNpZ25hbCBoYW5kbGVycywganVzdCB0aGUgQU5TSSBzcGVjaWZpZWQgb25lczogKi8KLSAgIHNpZ25hbChTSUdBQlJULCBzaWduYWxfaGFuZGxlcik7Ci0gICBzaWduYWwoU0lHRlBFLCBzaWduYWxfaGFuZGxlcik7Ci0gICBzaWduYWwoU0lHSUxMLCBzaWduYWxfaGFuZGxlcik7Ci0gICBzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7Ci0gICBzaWduYWwoU0lHU0VHViwgc2lnbmFsX2hhbmRsZXIpOwotICAgc2lnbmFsKFNJR1RFUk0sIHNpZ25hbF9oYW5kbGVyKTsKLQotI2lmZGVmIEhBVkVfRkVFTkFCTEVFWENFUFQKLSAgIC8qIE9ubHkgcmVxdWlyZWQgdG8gZW5hYmxlIEZQIGV4Y2VwdGlvbnMgb24gcGxhdGZvcm1zIHdoZXJlIHRoZXkgc3RhcnQgb2ZmCi0gICAgKiBkaXNhYmxlZDsgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGJ1dCBpZiBpdCBpcyBub3QgZG9uZSBwbmd2YWxpZCB3aWxsIGxpa2VseQotICAgICogZW5kIHVwIGlnbm9yaW5nIEZQIGNvbmRpdGlvbnMgdGhhdCBvdGhlciBwbGF0Zm9ybXMgZmF1bHQuCi0gICAgKi8KLSAgIGZlZW5hYmxlZXhjZXB0KEZFX0RJVkJZWkVSTyB8IEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyk7Ci0jZW5kaWYKLQotICAgbW9kaWZpZXJfaW5pdCgmcG0pOwotCi0gICAvKiBQcmVhbGxvY2F0ZSB0aGUgaW1hZ2UgYnVmZmVyLCBiZWNhdXNlIHdlIGtub3cgaG93IGJpZyBpdCBuZWVkcyB0byBiZSwKLSAgICAqIG5vdGUgdGhhdCwgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGl0IGlzIGRlbGliZXJhdGVseSBtaXMtYWxpZ25lZCBieSB0YWcKLSAgICAqIGJ5dGVzIGVpdGhlciBzaWRlLiAgQWxsIHJvd3MgaGF2ZSBhbiBhZGRpdGlvbmFsIGZpdmUgYnl0ZXMgb2YgcGFkZGluZyBmb3IKLSAgICAqIG92ZXJ3cml0ZSBjaGVja2luZy4KLSAgICAqLwotICAgc3RvcmVfZW5zdXJlX2ltYWdlKCZwbS50aGlzLCBOVUxMLCAyLCBUUkFOU0ZPUk1fUk9XTUFYLCBUUkFOU0ZPUk1fSEVJR0hUTUFYKTsKLQotICAgLyogRG9uJ3QgZ2l2ZSBhcmd2WzBdLCBpdCdzIG5vcm1hbGx5IHNvbWUgaG9ycmlibGUgbGlidG9vbCBzdHJpbmc6ICovCi0gICBjcCA9IHNhZmVjYXQoY29tbWFuZCwgc2l6ZW9mIGNvbW1hbmQsIGNwLCAicG5ndmFsaWQiKTsKLQotICAgLyogRGVmYXVsdCB0byBlcnJvciBvbiB3YXJuaW5nOiAqLwotICAgcG0udGhpcy50cmVhdF93YXJuaW5nc19hc19lcnJvcnMgPSAxOwotCi0gICAvKiBEZWZhdWx0IGFzc3VtZV8xNl9iaXRfY2FsY3VsYXRpb25zIGFwcHJvcHJpYXRlbHk7IHRoaXMgdGVsbHMgdGhlIGNoZWNraW5nCi0gICAgKiBjb2RlIHRoYXQgMTYtYml0IGFyaXRobWV0aWMgaXMgdXNlZCBmb3IgOC1iaXQgc2FtcGxlcyB3aGVuIGl0IHdvdWxkIG1ha2UgYQotICAgICogZGlmZmVyZW5jZS4KLSAgICAqLwotICAgcG0uYXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgPSBQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMDsKLQotICAgLyogQ3VycmVudGx5IDE2IGJpdCBleHBhbnNpb24gaGFwcGVucyBhdCB0aGUgZW5kIG9mIHRoZSBwaXBlbGluZSwgc28gdGhlCi0gICAgKiBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgaW4gdGhlIGlucHV0IGJpdCBkZXB0aCBub3QgdGhlIG91dHB1dC4KLSAgICAqCi0gICAgKiBUT0RPOiBmaXggdGhpcwotICAgICovCi0gICBwbS5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9IDFVOwotCi0gICAvKiBTdG9yZSB0aGUgdGVzdCBnYW1tYXMgKi8KLSAgIHBtLmdhbW1hcyA9IGdhbW1hczsKLSAgIHBtLm5nYW1tYXMgPSBBUlJBWV9TSVpFKGdhbW1hcyk7Ci0gICBwbS5uZ2FtbWFfdGVzdHMgPSAwOyAvKiBkZWZhdWx0IHRvIG9mZiAqLwotCi0gICAvKiBMb3cgYml0IGRlcHRoIGdyYXkgaW1hZ2VzIGRvbid0IGRvIHdlbGwgaW4gdGhlIGdhbW1hIHRlc3RzLCB1bnRpbAotICAgICogdGhpcyBpcyBmaXhlZCB0dXJuIHRoZW0gb2ZmIGZvciBzb21lIGdhbW1hIGNhc2VzOgotICAgICovCi0jICBpZmRlZiBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKLSAgICAgIHBtLnRlc3RfdFJOUyA9IDE7Ci0jICBlbmRpZgotICAgcG0udGVzdF9sYmcgPSBQTkdfTElCUE5HX1ZFUiA+PSAxMDYwMDsKLSAgIHBtLnRlc3RfbGJnX2dhbW1hX3RocmVzaG9sZCA9IDE7Ci0gICBwbS50ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0gPSBQTkdfTElCUE5HX1ZFUiA+PSAxMDYwMDsKLSAgIHBtLnRlc3RfbGJnX2dhbW1hX3NiaXQgPSAxOwotICAgcG0udGVzdF9sYmdfZ2FtbWFfY29tcG9zaXRpb24gPSBQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMDsKLQotICAgLyogQW5kIHRoZSB0ZXN0IGVuY29kaW5ncyAqLwotICAgcG0uZW5jb2RpbmdzID0gdGVzdF9lbmNvZGluZ3M7Ci0gICBwbS5uZW5jb2RpbmdzID0gQVJSQVlfU0laRSh0ZXN0X2VuY29kaW5ncyk7Ci0KLSMgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSAgICAgIHBtLnNiaXRsb3cgPSA4VTsgLyogYmVjYXVzZSBsaWJwbmcgZG9lc24ndCBkbyBzQklUIGJlbG93IDghICovCi0jICBlbHNlCi0gICAgICBwbS5zYml0bG93ID0gMVU7Ci0jICBlbmRpZgotCi0gICAvKiBUaGUgZm9sbG93aW5nIGFsbG93cyByZXN1bHRzIHRvIHBhc3MgaWYgdGhleSBjb3JyZXNwb25kIHRvIGFueXRoaW5nIGluIHRoZQotICAgICogdHJhbnNmb3JtZWQgcmFuZ2UgW2lucHV0LS41LGlucHV0Ky41XTsgdGhpcyBpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZQotICAgICogd2F5IGxpYnBuZyB0cmVhdGVzIHRoZSAxNl9UT184IGZsYWcgd2hlbiBidWlsZGluZyB0aGUgZ2FtbWEgdGFibGVzIGluCi0gICAgKiByZWxlYXNlcyB1cCB0byAxLjYuMC4KLSAgICAqCi0gICAgKiBUT0RPOiByZXZpZXcgdGhpcwotICAgICovCi0gICBwbS51c2VfaW5wdXRfcHJlY2lzaW9uXzE2dG84ID0gMVU7Ci0gICBwbS51c2VfaW5wdXRfcHJlY2lzaW9uX3NiaXQgPSAxVTsgLyogYmVjYXVzZSBsaWJwbmcgbm93IHJvdW5kcyBzQklUICovCi0KLSAgIC8qIFNvbWUgZGVmYXVsdCB2YWx1ZXMgKHNldCB0aGUgYmVoYXZpb3IgZm9yICdtYWtlIGNoZWNrJyBoZXJlKS4KLSAgICAqIFRoZXNlIHZhbHVlcyBzaW1wbHkgY29udHJvbCB0aGUgbWF4aW11bSBlcnJvciBwZXJtaXR0ZWQgaW4gdGhlIGdhbW1hCi0gICAgKiB0cmFuc2Zvcm1hdGlvbnMuICBUaGUgcHJhY3RpYWwgbGltaXRzIGZvciBodW1hbiBwZXJjZXB0aW9uIGFyZSBkZXNjcmliZWQKLSAgICAqIGJlbG93ICh0aGUgc2V0dGluZyBmb3IgbWF4cGMxNiksIGhvd2V2ZXIgZm9yIDggYml0IGVuY29kaW5ncyBpdCBpc24ndAotICAgICogcG9zc2libGUgdG8gbWVldCB0aGUgYWNjZXB0ZWQgY2FwYWJpbGl0aWVzIG9mIGh1bWFuIHZpc2lvbiAtIGkuZS4gOCBiaXQKLSAgICAqIGltYWdlcyBjYW4gbmV2ZXIgYmUgZ29vZCBlbm91Z2gsIHJlZ2FyZGxlc3Mgb2YgZW5jb2RpbmcuCi0gICAgKi8KLSAgIHBtLm1heG91dDggPSAuMTsgICAgIC8qIEFyaXRobWV0aWMgZXJyb3IgaW4gKmVuY29kZWQqIHZhbHVlICovCi0gICBwbS5tYXhhYnM4ID0gLjAwMDA1OyAvKiAxLzIwMDAwICovCi0gICBwbS5tYXhjYWxjOCA9IDEuLzI1NTsgIC8qICsvLTEgaW4gOCBiaXRzIGZvciBjb21wb3NlIGVycm9ycyAqLwotICAgcG0ubWF4cGM4ID0gLjQ5OTsgICAgLyogSS5lLiwgLjQ5OSUgZnJhY3Rpb25hbCBlcnJvciAqLwotICAgcG0ubWF4b3V0MTYgPSAuNDk5OyAgLyogRXJyb3IgaW4gKmVuY29kZWQqIHZhbHVlICovCi0gICBwbS5tYXhhYnMxNiA9IC4wMDAwNTsvKiAxLzIwMDAwICovCi0gICBwbS5tYXhjYWxjMTYgPTEuLzY1NTM1Oy8qICsvLTEgaW4gMTYgYml0cyBmb3IgY29tcG9zZSBlcnJvcnMgKi8KLSMgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLSAgICAgIHBtLm1heGNhbGNHID0gMS4vKCgxPDxQTkdfTUFYX0dBTU1BXzgpLTEpOwotIyAgZWxzZQotICAgICAgcG0ubWF4Y2FsY0cgPSAxLi8oKDE8PDE2KS0xKTsKLSMgIGVuZGlmCi0KLSAgIC8qIE5PVEU6IHRoaXMgaXMgYSByZWFzb25hYmxlIHBlcmNlcHR1YWwgbGltaXQuIFdlIGFzc3VtZSB0aGF0IGh1bWFucyBjYW4KLSAgICAqIHBlcmNlaXZlIGxpZ2h0IGxldmVsIGRpZmZlcmVuY2VzIG9mIDElIG92ZXIgYSAxMDA6MSByYW5nZSwgc28gd2UgbmVlZCB0bwotICAgICogbWFpbnRhaW4gMSBpbiAxMDAwMCBhY2N1cmFjeSAoaW4gbGluZWFyIGxpZ2h0IHNwYWNlKSwgd2hpY2ggaXMgd2hhdCB0aGUKLSAgICAqIGZvbGxvd2luZyBndWFyYW50ZWVzLiAgSXQgYWxzbyBhbGxvd3Mgc2lnbmlmaWNhbnRseSBoaWdoZXIgZXJyb3JzIGF0Ci0gICAgKiBoaWdoZXIgMTYgYml0IHZhbHVlcywgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBwZXJmb3JtYW5jZS4gIFRoZSBhY3R1YWwKLSAgICAqIG1heGltdW0gMTYgYml0IGVycm9yIGlzIGFib3V0ICsvLTEuOSBpbiB0aGUgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gYnV0Ci0gICAgKiB0aGlzIGlzIG9ubHkgYWxsb3dlZCBmb3IgdmFsdWVzID4zODE0OSBieSB0aGUgZm9sbG93aW5nOgotICAgICovCi0gICBwbS5tYXhwYzE2ID0gLjAwNTsgICAvKiBJLmUuLCAxLzIwMCUgLSAxLzIwMDAwICovCi0KLSAgIC8qIE5vdyBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCi0gICB3aGlsZSAoLS1hcmdjID49IDEpCi0gICB7Ci0gICAgICBpbnQgY2F0bW9yZSA9IDA7IC8qIFNldCBpZiB0aGUgYXJndW1lbnQgaGFzIGFuIGFyZ3VtZW50LiAqLwotCi0gICAgICAvKiBSZWNvcmQgZWFjaCBhcmd1bWVudCBmb3IgcG9zdGVyaXR5OiAqLwotICAgICAgY3AgPSBzYWZlY2F0KGNvbW1hbmQsIHNpemVvZiBjb21tYW5kLCBjcCwgIiAiKTsKLSAgICAgIGNwID0gc2FmZWNhdChjb21tYW5kLCBzaXplb2YgY29tbWFuZCwgY3AsICorK2FyZ3YpOwotCi0gICAgICBpZiAoc3RyY21wKCphcmd2LCAiLXYiKSA9PSAwKQotICAgICAgICAgcG0udGhpcy52ZXJib3NlID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWwiKSA9PSAwKQotICAgICAgICAgcG0ubG9nID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXEiKSA9PSAwKQotICAgICAgICAgc3VtbWFyeSA9IHBtLnRoaXMudmVyYm9zZSA9IHBtLmxvZyA9IDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi13IikgPT0gMCB8fAotICAgICAgICAgICAgICAgc3RyY21wKCphcmd2LCAiLS1zdHJpY3QiKSA9PSAwKQotICAgICAgICAgcG0udGhpcy50cmVhdF93YXJuaW5nc19hc19lcnJvcnMgPSAxOyAvKiBOT1RFOiB0aGlzIGlzIHRoZSBkZWZhdWx0ISAqLwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLW5vc3RyaWN0IikgPT0gMCkKLSAgICAgICAgIHBtLnRoaXMudHJlYXRfd2FybmluZ3NfYXNfZXJyb3JzID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zcGVlZCIpID09IDApCi0gICAgICAgICBwbS50aGlzLnNwZWVkID0gMSwgcG0ubmdhbW1hX3Rlc3RzID0gcG0ubmdhbW1hcywgcG0udGVzdF9zdGFuZGFyZCA9IDAsCi0gICAgICAgICAgICBzdW1tYXJ5ID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1tZW1vcnkiKSA9PSAwKQotICAgICAgICAgbWVtc3RhdHMgPSAxOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXNpemUiKSA9PSAwKQotICAgICAgICAgcG0udGVzdF9zaXplID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub3NpemUiKSA9PSAwKQotICAgICAgICAgcG0udGVzdF9zaXplID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdGFuZGFyZCIpID09IDApCi0gICAgICAgICBwbS50ZXN0X3N0YW5kYXJkID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub3N0YW5kYXJkIikgPT0gMCkKLSAgICAgICAgIHBtLnRlc3Rfc3RhbmRhcmQgPSAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXRyYW5zZm9ybSIpID09IDApCi0gICAgICAgICBwbS50ZXN0X3RyYW5zZm9ybSA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm90cmFuc2Zvcm0iKSA9PSAwKQotICAgICAgICAgcG0udGVzdF90cmFuc2Zvcm0gPSAwOwotCi0jaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKmFyZ3YsICItLXRyYW5zZm9ybS1kaXNhYmxlPSIsCi0gICAgICAgICBzaXplb2YgIi0tdHJhbnNmb3JtLWRpc2FibGUiKSA9PSAwKQotICAgICAgICAgewotICAgICAgICAgcG0udGVzdF90cmFuc2Zvcm0gPSAxOwotICAgICAgICAgdHJhbnNmb3JtX2Rpc2FibGUoKmFyZ3YgKyBzaXplb2YgIi0tdHJhbnNmb3JtLWRpc2FibGUiKTsKLSAgICAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoc3RybmNtcCgqYXJndiwgIi0tdHJhbnNmb3JtLWVuYWJsZT0iLAotICAgICAgICAgc2l6ZW9mICItLXRyYW5zZm9ybS1lbmFibGUiKSA9PSAwKQotICAgICAgICAgewotICAgICAgICAgcG0udGVzdF90cmFuc2Zvcm0gPSAxOwotICAgICAgICAgdHJhbnNmb3JtX2VuYWJsZSgqYXJndiArIHNpemVvZiAiLS10cmFuc2Zvcm0tZW5hYmxlIik7Ci0gICAgICAgICB9Ci0jZW5kaWYgLyogUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1nYW1tYSIpID09IDApCi0gICAgICAgICB7Ci0gICAgICAgICAvKiBKdXN0IGRvIHR3byBnYW1tYSB0ZXN0cyBoZXJlICgyLjIgYW5kIGxpbmVhcikgZm9yIHNwZWVkOiAqLwotICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlU7Ci0gICAgICAgICBwbS50ZXN0X2dhbW1hX3RocmVzaG9sZCA9IDE7Ci0gICAgICAgICBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDE7Ci0gICAgICAgICBwbS50ZXN0X2dhbW1hX3NiaXQgPSAxOwotICAgICAgICAgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMTsKLSAgICAgICAgIHBtLnRlc3RfZ2FtbWFfYmFja2dyb3VuZCA9IDE7IC8qIGNvbXBvc2l0aW9uICovCi0gICAgICAgICBwbS50ZXN0X2dhbW1hX2FscGhhX21vZGUgPSAxOwotICAgICAgICAgfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLW5vZ2FtbWEiKSA9PSAwKQotICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1nYW1tYS10aHJlc2hvbGQiKSA9PSAwKQotICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlUsIHBtLnRlc3RfZ2FtbWFfdGhyZXNob2xkID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub2dhbW1hLXRocmVzaG9sZCIpID09IDApCi0gICAgICAgICBwbS50ZXN0X2dhbW1hX3RocmVzaG9sZCA9IDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZ2FtbWEtdHJhbnNmb3JtIikgPT0gMCkKLSAgICAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IDJVLCBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9nYW1tYS10cmFuc2Zvcm0iKSA9PSAwKQotICAgICAgICAgcG0udGVzdF9nYW1tYV90cmFuc2Zvcm0gPSAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWdhbW1hLXNiaXQiKSA9PSAwKQotICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlUsIHBtLnRlc3RfZ2FtbWFfc2JpdCA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9nYW1tYS1zYml0IikgPT0gMCkKLSAgICAgICAgIHBtLnRlc3RfZ2FtbWFfc2JpdCA9IDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZ2FtbWEtMTYtdG8tOCIpID09IDApCi0gICAgICAgICBwbS5uZ2FtbWFfdGVzdHMgPSAyVSwgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub2dhbW1hLTE2LXRvLTgiKSA9PSAwKQotICAgICAgICAgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1nYW1tYS1iYWNrZ3JvdW5kIikgPT0gMCkKLSAgICAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IDJVLCBwbS50ZXN0X2dhbW1hX2JhY2tncm91bmQgPSAxOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLW5vZ2FtbWEtYmFja2dyb3VuZCIpID09IDApCi0gICAgICAgICBwbS50ZXN0X2dhbW1hX2JhY2tncm91bmQgPSAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWdhbW1hLWFscGhhLW1vZGUiKSA9PSAwKQotICAgICAgICAgcG0ubmdhbW1hX3Rlc3RzID0gMlUsIHBtLnRlc3RfZ2FtbWFfYWxwaGFfbW9kZSA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9nYW1tYS1hbHBoYS1tb2RlIikgPT0gMCkKLSAgICAgICAgIHBtLnRlc3RfZ2FtbWFfYWxwaGFfbW9kZSA9IDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZXhwYW5kMTYiKSA9PSAwKQotICAgICAgICAgcG0udGVzdF9nYW1tYV9leHBhbmQxNiA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbm9leHBhbmQxNiIpID09IDApCi0gICAgICAgICBwbS50ZXN0X2dhbW1hX2V4cGFuZDE2ID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1sb3ctZGVwdGgtZ3JheSIpID09IDApCi0gICAgICAgICBwbS50ZXN0X2xiZyA9IHBtLnRlc3RfbGJnX2dhbW1hX3RocmVzaG9sZCA9Ci0gICAgICAgICAgICBwbS50ZXN0X2xiZ19nYW1tYV90cmFuc2Zvcm0gPSBwbS50ZXN0X2xiZ19nYW1tYV9zYml0ID0KLSAgICAgICAgICAgIHBtLnRlc3RfbGJnX2dhbW1hX2NvbXBvc2l0aW9uID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub2xvdy1kZXB0aC1ncmF5IikgPT0gMCkKLSAgICAgICAgIHBtLnRlc3RfbGJnID0gcG0udGVzdF9sYmdfZ2FtbWFfdGhyZXNob2xkID0KLSAgICAgICAgICAgIHBtLnRlc3RfbGJnX2dhbW1hX3RyYW5zZm9ybSA9IHBtLnRlc3RfbGJnX2dhbW1hX3NiaXQgPQotICAgICAgICAgICAgcG0udGVzdF9sYmdfZ2FtbWFfY29tcG9zaXRpb24gPSAwOwotCi0jICAgICBpZmRlZiBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKLSAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tdFJOUyIpID09IDApCi0gICAgICAgICAgICBwbS50ZXN0X3RSTlMgPSAxOwotIyAgICAgZW5kaWYKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1ub3RSTlMiKSA9PSAwKQotICAgICAgICAgcG0udGVzdF90Uk5TID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1tb3JlLWdhbW1hcyIpID09IDApCi0gICAgICAgICBwbS5uZ2FtbWFfdGVzdHMgPSAzVTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1hbGwtZ2FtbWFzIikgPT0gMCkKLSAgICAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IHBtLm5nYW1tYXM7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tcHJvZ3Jlc3NpdmUtcmVhZCIpID09IDApCi0gICAgICAgICBwbS50aGlzLnByb2dyZXNzaXZlID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS11c2UtdXBkYXRlLWluZm8iKSA9PSAwKQotICAgICAgICAgKytwbS51c2VfdXBkYXRlX2luZm87IC8qIENhbiBjYWxsIG11bHRpcGxlIHRpbWVzICovCi0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0taW50ZXJsYWNlIikgPT0gMCkKLSAgICAgIHsKLSMgICAgICAgIGlmIENBTl9XUklURV9JTlRFUkxBQ0UKLSAgICAgICAgICAgIHBtLmludGVybGFjZV90eXBlID0gUE5HX0lOVEVSTEFDRV9BREFNNzsKLSMgICAgICAgIGVsc2UgLyogIUNBTl9XUklURV9JTlRFUkxBQ0UgKi8KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6IG5vIHdyaXRlIGludGVybGFjZSBzdXBwb3J0XG4iKTsKLSAgICAgICAgICAgIHJldHVybiBTS0lQOwotIyAgICAgICAgZW5kaWYgLyogIUNBTl9XUklURV9JTlRFUkxBQ0UgKi8KLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS11c2UtaW5wdXQtcHJlY2lzaW9uIikgPT0gMCkKLSAgICAgICAgIHBtLnVzZV9pbnB1dF9wcmVjaXNpb24gPSAxVTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS11c2UtY2FsY3VsYXRpb24tcHJlY2lzaW9uIikgPT0gMCkKLSAgICAgICAgIHBtLnVzZV9pbnB1dF9wcmVjaXNpb24gPSAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWNhbGN1bGF0aW9ucy11c2UtaW5wdXQtcHJlY2lzaW9uIikgPT0gMCkKLSAgICAgICAgIHBtLmNhbGN1bGF0aW9uc191c2VfaW5wdXRfcHJlY2lzaW9uID0gMVU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tYXNzdW1lLTE2LWJpdC1jYWxjdWxhdGlvbnMiKSA9PSAwKQotICAgICAgICAgcG0uYXNzdW1lXzE2X2JpdF9jYWxjdWxhdGlvbnMgPSAxVTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1jYWxjdWxhdGlvbnMtZm9sbG93LWJpdC1kZXB0aCIpID09IDApCi0gICAgICAgICBwbS5jYWxjdWxhdGlvbnNfdXNlX2lucHV0X3ByZWNpc2lvbiA9Ci0gICAgICAgICAgICBwbS5hc3N1bWVfMTZfYml0X2NhbGN1bGF0aW9ucyA9IDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tZXhoYXVzdGl2ZSIpID09IDApCi0gICAgICAgICBwbS50ZXN0X2V4aGF1c3RpdmUgPSAxOwotCi0gICAgICBlbHNlIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoKmFyZ3YsICItLXNiaXRsb3ciKSA9PSAwKQotICAgICAgICAgLS1hcmdjLCBwbS5zYml0bG93ID0gKHBuZ19ieXRlKWF0b2koKisrYXJndiksIGNhdG1vcmUgPSAxOwotCi0gICAgICBlbHNlIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoKmFyZ3YsICItLXRvdWNoIikgPT0gMCkKLSAgICAgICAgIC0tYXJnYywgdG91Y2ggPSAqKythcmd2LCBjYXRtb3JlID0gMTsKLQotICAgICAgZWxzZSBpZiAoYXJnYyA+IDEgJiYgc3RybmNtcCgqYXJndiwgIi0tbWF4IiwgNSkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIC0tYXJnYzsKLQotICAgICAgICAgaWYgKHN0cmNtcCg1Kyphcmd2LCAiYWJzOCIpID09IDApCi0gICAgICAgICAgICBwbS5tYXhhYnM4ID0gYXRvZigqKythcmd2KTsKLQotICAgICAgICAgZWxzZSBpZiAoc3RyY21wKDUrKmFyZ3YsICJhYnMxNiIpID09IDApCi0gICAgICAgICAgICBwbS5tYXhhYnMxNiA9IGF0b2YoKisrYXJndik7Ci0KLSAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCg1Kyphcmd2LCAiY2FsYzgiKSA9PSAwKQotICAgICAgICAgICAgcG0ubWF4Y2FsYzggPSBhdG9mKCorK2FyZ3YpOwotCi0gICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgImNhbGMxNiIpID09IDApCi0gICAgICAgICAgICBwbS5tYXhjYWxjMTYgPSBhdG9mKCorK2FyZ3YpOwotCi0gICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgIm91dDgiKSA9PSAwKQotICAgICAgICAgICAgcG0ubWF4b3V0OCA9IGF0b2YoKisrYXJndik7Ci0KLSAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCg1Kyphcmd2LCAib3V0MTYiKSA9PSAwKQotICAgICAgICAgICAgcG0ubWF4b3V0MTYgPSBhdG9mKCorK2FyZ3YpOwotCi0gICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgInBjOCIpID09IDApCi0gICAgICAgICAgICBwbS5tYXhwYzggPSBhdG9mKCorK2FyZ3YpOwotCi0gICAgICAgICBlbHNlIGlmIChzdHJjbXAoNSsqYXJndiwgInBjMTYiKSA9PSAwKQotICAgICAgICAgICAgcG0ubWF4cGMxNiA9IGF0b2YoKisrYXJndik7Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6ICVzOiB1bmtub3duICdtYXgnIG9wdGlvblxuIiwgKmFyZ3YpOwotICAgICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNhdG1vcmUgPSAxOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWxvZzgiKSA9PSAwKQotICAgICAgICAgLS1hcmdjLCBwbS5sb2c4ID0gYXRvZigqKythcmd2KSwgY2F0bW9yZSA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tbG9nMTYiKSA9PSAwKQotICAgICAgICAgLS1hcmdjLCBwbS5sb2cxNiA9IGF0b2YoKisrYXJndiksIGNhdG1vcmUgPSAxOwotCi0jaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVECi0gICAgICBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAiLS1vcHRpb249IiwgOSkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIC8qIFN5bnRheCBvZiB0aGUgYXJndW1lbnQgaXMgPG9wdGlvbj46e29ufG9mZn0gKi8KLSAgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IDkrKmFyZ3Y7Ci0gICAgICAgICB1bnNpZ25lZCBjaGFyIG9wdGlvbj0wLCBzZXR0aW5nPTA7Ci0KLSNpZmRlZiBQTkdfQVJNX05FT04KLSAgICAgICAgIGlmIChzdHJuY21wKGFyZywgImFybS1uZW9uOiIsIDkpID09IDApCi0gICAgICAgICAgICBvcHRpb24gPSBQTkdfQVJNX05FT04sIGFyZyArPSA5OwotCi0gICAgICAgICBlbHNlCi0jZW5kaWYKLSNpZmRlZiBQTkdfRVhURU5TSU9OUwotICAgICAgICAgaWYgKHN0cm5jbXAoYXJnLCAiZXh0ZW5zaW9uczoiLCAxMSkgPT0gMCkKLSAgICAgICAgICAgIG9wdGlvbiA9IFBOR19FWFRFTlNJT05TLCBhcmcgKz0gMTE7Ci0KLSAgICAgICAgIGVsc2UKLSNlbmRpZgotI2lmZGVmIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XCi0gICAgICAgICBpZiAoc3RybmNtcChhcmcsICJtYXgtaW5mbGF0ZS13aW5kb3c6IiwgMTkpID09IDApCi0gICAgICAgICAgICBvcHRpb24gPSBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVywgYXJnICs9IDE5OwotCi0gICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicG5ndmFsaWQ6ICVzOiAlczogdW5rbm93biBvcHRpb25cbiIsICphcmd2LCBhcmcpOwotICAgICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChzdHJjbXAoYXJnLCAib2ZmIikgPT0gMCkKLSAgICAgICAgICAgIHNldHRpbmcgPSBQTkdfT1BUSU9OX09GRjsKLQotICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIm9uIikgPT0gMCkKLSAgICAgICAgICAgIHNldHRpbmcgPSBQTkdfT1BUSU9OX09OOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICJwbmd2YWxpZDogJXM6ICVzOiB1bmtub3duIHNldHRpbmcgKHVzZSAnb24nIG9yICdvZmYnKVxuIiwKLSAgICAgICAgICAgICAgICphcmd2LCBhcmcpOwotICAgICAgICAgICAgZXhpdCg5OSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHBtLnRoaXMub3B0aW9uc1twbS50aGlzLm5vcHRpb25zXS5vcHRpb24gPSBvcHRpb247Ci0gICAgICAgICBwbS50aGlzLm9wdGlvbnNbcG0udGhpcy5ub3B0aW9ucysrXS5zZXR0aW5nID0gc2V0dGluZzsKLSAgICAgIH0KLSNlbmRpZiAvKiBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQgKi8KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogJXM6IHVua25vd24gYXJndW1lbnRcbiIsICphcmd2KTsKLSAgICAgICAgIGV4aXQoOTkpOwotICAgICAgfQotCi0gICAgICBpZiAoY2F0bW9yZSkgLyogY29uc3VtZWQgYW4gZXh0cmEgKmFyZ3YgKi8KLSAgICAgIHsKLSAgICAgICAgIGNwID0gc2FmZWNhdChjb21tYW5kLCBzaXplb2YgY29tbWFuZCwgY3AsICIgIik7Ci0gICAgICAgICBjcCA9IHNhZmVjYXQoY29tbWFuZCwgc2l6ZW9mIGNvbW1hbmQsIGNwLCAqYXJndik7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIElmIHBuZ3ZhbGlkIGlzIHJ1biB3aXRoIG5vIGFyZ3VtZW50cyBkZWZhdWx0IHRvIGEgcmVhc29uYWJsZSBzZXQgb2YgdGhlCi0gICAgKiB0ZXN0cy4KLSAgICAqLwotICAgaWYgKHBtLnRlc3Rfc3RhbmRhcmQgPT0gMCAmJiBwbS50ZXN0X3NpemUgPT0gMCAmJiBwbS50ZXN0X3RyYW5zZm9ybSA9PSAwICYmCi0gICAgICBwbS5uZ2FtbWFfdGVzdHMgPT0gMCkKLSAgIHsKLSAgICAgIC8qIE1ha2UgdGhpcyBkbyBhbGwgdGhlIHRlc3RzIGRvbmUgaW4gdGhlIHRlc3Qgc2hlbGwgc2NyaXB0cyB3aXRoIHRoZSBzYW1lCi0gICAgICAgKiBwYXJhbWV0ZXJzLCB3aGVyZSBwb3NzaWJsZS4gIFRoZSBsaW1pdGF0aW9uIGlzIHRoYXQgYWxsIHRoZSBwcm9ncmVzc2l2ZQotICAgICAgICogcmVhZCBhbmQgaW50ZXJsYWNlIHN0dWZmIGhhcyB0byBiZSBkb25lIGluIHNlcGFyYXRlIHJ1bnMsIHNvIG9ubHkgdGhlCi0gICAgICAgKiBiYXNpYyAnc3RhbmRhcmQnIGFuZCAnc2l6ZScgdGVzdHMgYXJlIGRvbmUuCi0gICAgICAgKi8KLSAgICAgIHBtLnRlc3Rfc3RhbmRhcmQgPSAxOwotICAgICAgcG0udGVzdF9zaXplID0gMTsKLSAgICAgIHBtLnRlc3RfdHJhbnNmb3JtID0gMTsKLSAgICAgIHBtLm5nYW1tYV90ZXN0cyA9IDJVOwotICAgfQotCi0gICBpZiAocG0ubmdhbW1hX3Rlc3RzID4gMCAmJgotICAgICAgcG0udGVzdF9nYW1tYV90aHJlc2hvbGQgPT0gMCAmJiBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9PSAwICYmCi0gICAgICBwbS50ZXN0X2dhbW1hX3NiaXQgPT0gMCAmJiBwbS50ZXN0X2dhbW1hX3NjYWxlMTYgPT0gMCAmJgotICAgICAgcG0udGVzdF9nYW1tYV9iYWNrZ3JvdW5kID09IDAgJiYgcG0udGVzdF9nYW1tYV9hbHBoYV9tb2RlID09IDApCi0gICB7Ci0gICAgICBwbS50ZXN0X2dhbW1hX3RocmVzaG9sZCA9IDE7Ci0gICAgICBwbS50ZXN0X2dhbW1hX3RyYW5zZm9ybSA9IDE7Ci0gICAgICBwbS50ZXN0X2dhbW1hX3NiaXQgPSAxOwotICAgICAgcG0udGVzdF9nYW1tYV9zY2FsZTE2ID0gMTsKLSAgICAgIHBtLnRlc3RfZ2FtbWFfYmFja2dyb3VuZCA9IDE7Ci0gICAgICBwbS50ZXN0X2dhbW1hX2FscGhhX21vZGUgPSAxOwotICAgfQotCi0gICBlbHNlIGlmIChwbS5uZ2FtbWFfdGVzdHMgPT0gMCkKLSAgIHsKLSAgICAgIC8qIE5vdGhpbmcgdG8gdGVzdCBzbyB0dXJuIGV2ZXJ5dGhpbmcgb2ZmOiAqLwotICAgICAgcG0udGVzdF9nYW1tYV90aHJlc2hvbGQgPSAwOwotICAgICAgcG0udGVzdF9nYW1tYV90cmFuc2Zvcm0gPSAwOwotICAgICAgcG0udGVzdF9nYW1tYV9zYml0ID0gMDsKLSAgICAgIHBtLnRlc3RfZ2FtbWFfc2NhbGUxNiA9IDA7Ci0gICAgICBwbS50ZXN0X2dhbW1hX2JhY2tncm91bmQgPSAwOwotICAgICAgcG0udGVzdF9nYW1tYV9hbHBoYV9tb2RlID0gMDsKLSAgIH0KLQotICAgVHJ5Ci0gICB7Ci0gICAgICAvKiBNYWtlIHVzZWZ1bCBiYXNlIGltYWdlcyAqLwotICAgICAgbWFrZV90cmFuc2Zvcm1faW1hZ2VzKCZwbSk7Ci0KLSAgICAgIC8qIFBlcmZvcm0gdGhlIHN0YW5kYXJkIGFuZCBnYW1tYSB0ZXN0cy4gKi8KLSAgICAgIGlmIChwbS50ZXN0X3N0YW5kYXJkKQotICAgICAgewotICAgICAgICAgcGVyZm9ybV9pbnRlcmxhY2VfbWFjcm9fdmFsaWRhdGlvbigpOwotICAgICAgICAgcGVyZm9ybV9mb3JtYXR0aW5nX3Rlc3QoJnBtLnRoaXMpOwotIyAgICAgICAgaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVECi0gICAgICAgICAgICBwZXJmb3JtX3N0YW5kYXJkX3Rlc3QoJnBtKTsKLSMgICAgICAgIGVuZGlmCi0gICAgICAgICBwZXJmb3JtX2Vycm9yX3Rlc3QoJnBtKTsKLSAgICAgIH0KLQotICAgICAgLyogVmFyaW91cyBvZGRseSBzaXplZCBpbWFnZXM6ICovCi0gICAgICBpZiAocG0udGVzdF9zaXplKQotICAgICAgewotICAgICAgICAgbWFrZV9zaXplX2ltYWdlcygmcG0udGhpcyk7Ci0jICAgICAgICBpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQKLSAgICAgICAgICAgIHBlcmZvcm1fc2l6ZV90ZXN0KCZwbSk7Ci0jICAgICAgICBlbmRpZgotICAgICAgfQotCi0jaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQKLSAgICAgIC8qIENvbWJpbmF0b3JpYWwgdHJhbnNmb3JtczogKi8KLSAgICAgIGlmIChwbS50ZXN0X3RyYW5zZm9ybSkKLSAgICAgICAgIHBlcmZvcm1fdHJhbnNmb3JtX3Rlc3QoJnBtKTsKLSNlbmRpZiAvKiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVECi0gICAgICBpZiAocG0ubmdhbW1hX3Rlc3RzID4gMCkKLSAgICAgICAgIHBlcmZvcm1fZ2FtbWFfdGVzdCgmcG0sIHN1bW1hcnkpOwotI2VuZGlmCi0gICB9Ci0KLSAgIENhdGNoX2Fub255bW91cwotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogdGVzdCBhYm9ydGVkIChwcm9iYWJseSBmYWlsZWQgaW4gY2xlYW51cClcbiIpOwotICAgICAgaWYgKCFwbS50aGlzLnZlcmJvc2UpCi0gICAgICB7Ci0gICAgICAgICBpZiAocG0udGhpcy5lcnJvclswXSAhPSAwKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogZmlyc3QgZXJyb3I6ICVzXG4iLCBwbS50aGlzLmVycm9yKTsKLQotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogcnVuIHdpdGggLXYgdG8gc2VlIHdoYXQgaGFwcGVuZWRcbiIpOwotICAgICAgfQotICAgICAgZXhpdCgxKTsKLSAgIH0KLQotICAgaWYgKHN1bW1hcnkpCi0gICB7Ci0gICAgICBwcmludGYoIiVzOiAlcyAoJXMgcG9pbnQgYXJpdGhtZXRpYylcbiIsCi0gICAgICAgICAocG0udGhpcy5uZXJyb3JzIHx8IChwbS50aGlzLnRyZWF0X3dhcm5pbmdzX2FzX2Vycm9ycyAmJgotICAgICAgICAgICAgcG0udGhpcy5ud2FybmluZ3MpKSA/ICJGQUlMIiA6ICJQQVNTIiwKLSAgICAgICAgIGNvbW1hbmQsCi0jaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQpIHx8IFBOR19MSUJQTkdfVkVSIDwgMTA1MDAKLSAgICAgICAgICJmbG9hdGluZyIKLSNlbHNlCi0gICAgICAgICAiZml4ZWQiCi0jZW5kaWYKLSAgICAgICAgICk7Ci0gICB9Ci0KLSAgIGlmIChtZW1zdGF0cykKLSAgIHsKLSAgICAgIHByaW50ZigiQWxsb2NhdGVkIG1lbW9yeSBzdGF0aXN0aWNzIChpbiBieXRlcyk6XG4iCi0gICAgICAgICAiXHRyZWFkICAlbHUgbWF4aW11bSBzaW5nbGUsICVsdSBwZWFrLCAlbHUgdG90YWxcbiIKLSAgICAgICAgICJcdHdyaXRlICVsdSBtYXhpbXVtIHNpbmdsZSwgJWx1IHBlYWssICVsdSB0b3RhbFxuIiwKLSAgICAgICAgICh1bnNpZ25lZCBsb25nKXBtLnRoaXMucmVhZF9tZW1vcnlfcG9vbC5tYXhfbWF4LAotICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcG0udGhpcy5yZWFkX21lbW9yeV9wb29sLm1heF9saW1pdCwKLSAgICAgICAgICh1bnNpZ25lZCBsb25nKXBtLnRoaXMucmVhZF9tZW1vcnlfcG9vbC5tYXhfdG90YWwsCi0gICAgICAgICAodW5zaWduZWQgbG9uZylwbS50aGlzLndyaXRlX21lbW9yeV9wb29sLm1heF9tYXgsCi0gICAgICAgICAodW5zaWduZWQgbG9uZylwbS50aGlzLndyaXRlX21lbW9yeV9wb29sLm1heF9saW1pdCwKLSAgICAgICAgICh1bnNpZ25lZCBsb25nKXBtLnRoaXMud3JpdGVfbWVtb3J5X3Bvb2wubWF4X3RvdGFsKTsKLSAgIH0KLQotICAgLyogRG8gdGhpcyBoZXJlIHRvIHByb3Zva2UgbWVtb3J5IGNvcnJ1cHRpb24gZXJyb3JzIGluIG1lbW9yeSBub3QgZGlyZWN0bHkKLSAgICAqIGFsbG9jYXRlZCBieSBsaWJwbmcgLSBub3QgYSBjb21wbGV0ZSB0ZXN0LCBidXQgYmV0dGVyIHRoYW4gbm90aGluZy4KLSAgICAqLwotICAgc3RvcmVfZGVsZXRlKCZwbS50aGlzKTsKLQotICAgLyogRXJyb3IgZXhpdCBpZiB0aGVyZSBhcmUgYW55IGVycm9ycywgYW5kIG1heWJlIGlmIHRoZXJlIGFyZSBhbnkKLSAgICAqIHdhcm5pbmdzLgotICAgICovCi0gICBpZiAocG0udGhpcy5uZXJyb3JzIHx8IChwbS50aGlzLnRyZWF0X3dhcm5pbmdzX2FzX2Vycm9ycyAmJgotICAgICAgIHBtLnRoaXMubndhcm5pbmdzKSkKLSAgIHsKLSAgICAgIGlmICghcG0udGhpcy52ZXJib3NlKQotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbmd2YWxpZDogJXNcbiIsIHBtLnRoaXMuZXJyb3IpOwotCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ3ZhbGlkOiAlZCBlcnJvcnMsICVkIHdhcm5pbmdzXG4iLCBwbS50aGlzLm5lcnJvcnMsCi0gICAgICAgICAgcG0udGhpcy5ud2FybmluZ3MpOwotCi0gICAgICBleGl0KDEpOwotICAgfQotCi0gICAvKiBTdWNjZXNzIGNhc2UuICovCi0gICBpZiAodG91Y2ggIT0gTlVMTCkKLSAgIHsKLSAgICAgIEZJTEUgKmZzdWNjZXNzID0gZm9wZW4odG91Y2gsICJ3dCIpOwotCi0gICAgICBpZiAoZnN1Y2Nlc3MgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIGludCBlcnJvciA9IDA7Ci0gICAgICAgICBmcHJpbnRmKGZzdWNjZXNzLCAiUE5HIHZhbGlkYXRpb24gc3VjY2VlZGVkXG4iKTsKLSAgICAgICAgIGZmbHVzaChmc3VjY2Vzcyk7Ci0gICAgICAgICBlcnJvciA9IGZlcnJvcihmc3VjY2Vzcyk7Ci0KLSAgICAgICAgIGlmIChmY2xvc2UoZnN1Y2Nlc3MpIHx8IGVycm9yKQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZmFpbGVkXG4iLCB0b3VjaCk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuIGZhaWxlZFxuIiwgdG91Y2gpOwotICAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHNvbWUgdmVyeSBtaW5pbWFsIGNvbmZpZ3VyYXRpb25zIGRvIG5vdCB1c2UgaXQ6Ci0gICAgKi8KLSAgIFVOVVNFRChmYWlsKQotICAgcmV0dXJuIDA7Ci19Ci0jZWxzZSAvKiB3cml0ZSBvciBsb3cgbGV2ZWwgQVBJcyBub3Qgc3VwcG9ydGVkICovCi1pbnQgbWFpbih2b2lkKQotewotICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAicG5ndmFsaWQ6IG5vIGxvdyBsZXZlbCB3cml0ZSBzdXBwb3J0IGluIGxpYnBuZywgYWxsIHRlc3RzIHNraXBwZWRcbiIpOwotICAgLyogU28gdGhlIHRlc3QgaXMgc2tpcHBlZDogKi8KLSAgIHJldHVybiBTS0lQOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb250cmliL2xpYnRlc3RzL3JlYWRwbmcuYyBiL2NvbnRyaWIvbGlidGVzdHMvcmVhZHBuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM2ZDRlLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvbGlidGVzdHMvcmVhZHBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qIHJlYWRwbmcuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMyBKb2huIEN1bm5pbmdoYW0gQm93bGVyCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMSBbTWFyY2ggMjgsIDIwMTNdCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogTG9hZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFBORyBmaWxlcyAoZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBvciwgaWYgdGhlcmUKLSAqIGFyZSBubyBhcmd1bWVudHMgb24gdGhlIGNvbW1hbmQgbGluZSwgZnJvbSBzdGRpbikgdGhlbiBydW4gYSB0aW1lIHRlc3QgYnkKLSAqIHJlYWRpbmcgZWFjaCBmaWxlIGJ5IHJvdy4gIFRoZSB0ZXN0IGRvZXMgbm90aGluZyB3aXRoIHRoZSByZWFkIHJlc3VsdCBhbmQKLSAqIGRvZXMgbm8gdHJhbnNmb3Jtcy4gIFRoZSBvbmx5IG91dHB1dCBpcyBhIHRpbWUgYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgb2YKLSAqIHNlY29uZHMgd2l0aCA5IGRlY2ltYWwgZGlnaXRzLgotICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoaXMgdGVzdCBhZ2FpbnN0IHlvdXIgaW5zdGFsbGVkIGxpYnBuZywgcmF0aGVyCi0gKiB0aGFuIHRoZSBvbmUgYmVpbmcgYnVpbHQgaGVyZToKLSAqLwotI2lmZGVmIFBOR19GUkVFU1RBTkRJTkdfVEVTVFMKLSMgIGluY2x1ZGUgPHBuZy5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgIi4uLy4uL3BuZy5oIgotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLXJlYWRfcG5nKEZJTEUgKmZwKQotewotICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLDAsMCwwKTsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7Ci0gICBwbmdfYnl0ZXAgcm93ID0gTlVMTCwgZGlzcGxheSA9IE5VTEw7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gMDsKLQotICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgIHsKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgaWYgKHJvdyAhPSBOVUxMKSBmcmVlKHJvdyk7Ci0gICAgICBpZiAoZGlzcGxheSAhPSBOVUxMKSBmcmVlKGRpc3BsYXkpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKLQotICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgaWYgKGluZm9fcHRyID09IE5VTEwpCi0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk9PTSBhbGxvY2F0aW5nIGluZm8gc3RydWN0dXJlIik7Ci0KLSAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBQTkdfSEFORExFX0NIVU5LX0FMV0FZUywgTlVMTCwgMCk7Ci0KLSAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICB7Ci0gICAgICBwbmdfc2l6ZV90IHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICAgIC8qIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGVzZSBpcyBoYXJtbGVzcyAqLwotICAgICAgcm93ID0gbWFsbG9jKHJvd2J5dGVzKTsKLSAgICAgIGRpc3BsYXkgPSBtYWxsb2Mocm93Ynl0ZXMpOwotCi0gICAgICBpZiAocm93ID09IE5VTEwgfHwgZGlzcGxheSA9PSBOVUxMKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyByb3cgYnVmZmVycyIpOwotCi0gICAgICB7Ci0gICAgICAgICBwbmdfdWludF8zMiBoZWlnaHQgPSBwbmdfZ2V0X2ltYWdlX2hlaWdodChwbmdfcHRyLCBpbmZvX3B0cik7Ci0jICAgICAgICBpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgICAgICAgICAgIGludCBwYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLSMgICAgICAgIGVsc2UgLyogIVJFQURfSU5URVJMQUNJTkcgKi8KLSAgICAgICAgICAgIGludCBwYXNzZXMgPSBwbmdfZ2V0X2ludGVybGFjZV90eXBlKHBuZ19wdHIsIGluZm9fcHRyKSA9PQotICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9BREFNNyA/IFBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTIDogMTsKLSMgICAgICAgIGVuZGlmIC8qICFSRUFEX0lOVEVSTEFDSU5HICovCi0gICAgICAgICBpbnQgcGFzczsKLQotICAgICAgICAgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UocG5nX3B0cik7Ci0KLSAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBwYXNzZXM7ICsrcGFzcykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ191aW50XzMyIHkgPSBoZWlnaHQ7Ci0KLSMgICAgICAgICAgIGlmbmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKLSAgICAgICAgICAgICAgIGlmIChwYXNzZXMgPT0gUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMpCi0gICAgICAgICAgICAgICAgICB5ID0gUE5HX1BBU1NfUk9XUyh5LCBwYXNzKTsKLSMgICAgICAgICAgIGVuZGlmIC8qIFJFQURfSU5URVJMQUNJTkcgKi8KLQotICAgICAgICAgICAgLyogTk9URTogdGhpcyB0cmFzaGVzIHRoZSByb3cgZWFjaCB0aW1lOyBpbnRlcmxhY2UgaGFuZGxpbmcgd29uJ3QKLSAgICAgICAgICAgICAqIHdvcmssIGJ1dCB0aGlzIGF2b2lkcyBtZW1vcnkgdGhyYXNoaW5nIGZvciBzcGVlZCB0ZXN0aW5nLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAoeS0tID4gMCkKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCByb3csIGRpc3BsYXkpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICAvKiBNYWtlIHN1cmUgdG8gcmVhZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlOiAqLwotICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgZnJlZShyb3cpOwotICAgZnJlZShkaXNwbGF5KTsKLSAgIHJldHVybiAxOwotfQotCi1pbnQKLW1haW4odm9pZCkKLXsKLSAgIC8qIEV4aXQgY29kZSAwIG9uIHN1Y2Nlc3MuICovCi0gICByZXR1cm4gIXJlYWRfcG5nKHN0ZGluKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbGlidGVzdHMvdGFyaXRoLmMgYi9jb250cmliL2xpYnRlc3RzL3Rhcml0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3ZmZhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvbGlidGVzdHMvdGFyaXRoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTkgKzAsMCBAQAotCi0vKiB0YXJpdGguYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBUZXN0IGludGVybmFsIGFyaXRobWV0aWMgZnVuY3Rpb25zIG9mIGxpYnBuZy4KLSAqCi0gKiBUaGlzIGNvZGUgbXVzdCBiZSBsaW5rZWQgYWdhaW5zdCBhIG1hdGggbGlicmFyeSAoLWxtKSwgYnV0IGRvZXMgbm90IHJlcXVpcmUKLSAqIGxpYnBuZyBvciB6bGliIHRvIHdvcmsuICBCZWNhdXNlIGl0IGluY2x1ZGVzIHRoZSBjb21wbGV0ZSBzb3VyY2Ugb2YgJ3BuZy5jJwotICogaXQgdGVzdHMgdGhlIGNvZGUgd2l0aCB3aGF0ZXZlciBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkIHRvIGJ1aWxkIGl0LgotICogQ2hhbmdpbmcgdGhlc2Ugb3B0aW9ucyBjYW4gc3Vic3RhbnRpYWxseSBjaGFuZ2UgdGhlIGVycm9ycyBpbiB0aGUKLSAqIGNhbGN1bGF0aW9ucyB0aGF0IHRoZSBjb21waWxlciBjaG9vc2VzIQotICovCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotI2RlZmluZSBfSVNPQzk5X1NPVVJDRSAxCi0KLS8qIE9idGFpbiBhIGNvcHkgb2YgdGhlIGNvZGUgdG8gYmUgdGVzdGVkIChwbHVzIG90aGVyIHRoaW5ncyksIGRpc2FibGluZwotICogc3R1ZmYgdGhhdCBpcyBub3QgcmVxdWlyZWQuCi0gKi8KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgIi4uLy4uL3BuZ3ByaXYuaCIKLQotI2RlZmluZSBwbmdfZXJyb3IgcG5nX3dhcm5pbmcKLQotdm9pZCBwbmdfd2FybmluZyhwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIG1zZykKLXsKLSAgIGZwcmludGYoc3RkZXJyLCAidmFsaWRhdGlvbjogJXNcbiIsIG1zZyk7Ci19Ci0KLSNkZWZpbmUgcG5nX2ZpeGVkX2Vycm9yIHBuZ19maXhlZF93YXJuaW5nCi0KLXZvaWQgcG5nX2ZpeGVkX3dhcm5pbmcocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCi17Ci0gICBmcHJpbnRmKHN0ZGVyciwgIm92ZXJmbG93IGluOiAlc1xuIiwgbXNnKTsKLX0KLQotI2RlZmluZSBwbmdfc2V0X2Vycm9yX2ZuKHBwLCBlcCwgZWZwLCB3ZnApICgodm9pZCkwKQotI2RlZmluZSBwbmdfbWFsbG9jKHBwLCBzKSBtYWxsb2MocykKLSNkZWZpbmUgcG5nX21hbGxvY193YXJuKHBwLCBzKSBtYWxsb2MocykKLSNkZWZpbmUgcG5nX21hbGxvY19iYXNlKHBwLCBzKSBtYWxsb2MocykKLSNkZWZpbmUgcG5nX2NhbGxvYyhwcCwgcykgY2FsbG9jKDEsIChzKSkKLSNkZWZpbmUgcG5nX2ZyZWUocHAsIHMpIGZyZWUocykKLQotI2RlZmluZSBwbmdfc2FmZWNhdChiLCBzYiwgcG9zLCBzdHIpIChwb3MpCi0jZGVmaW5lIHBuZ19mb3JtYXRfbnVtYmVyKHN0YXJ0LCBlbmQsIGZvcm1hdCwgbnVtYmVyKSAoc3RhcnQpCi0KLSNkZWZpbmUgY3JjMzIoY3JjLCBwcCwgcykgKGNyYykKLSNkZWZpbmUgaW5mbGF0ZVJlc2V0KHpzKSBaX09LCi0KLSNkZWZpbmUgcG5nX2NyZWF0ZV9zdHJ1Y3QodHlwZSkgKDApCi0jZGVmaW5lIHBuZ19kZXN0cm95X3N0cnVjdChwcCkgKCh2b2lkKTApCi0jZGVmaW5lIHBuZ19jcmVhdGVfc3RydWN0XzIodHlwZSwgbSwgbW0pICgwKQotI2RlZmluZSBwbmdfZGVzdHJveV9zdHJ1Y3RfMihwcCwgZiwgbW0pICgodm9pZCkwKQotCi0jdW5kZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQKLSN1bmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQKLSN1bmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECi0KLSNpbmNsdWRlICIuLi8uLi9wbmcuYyIKLQotLyogVmFsaWRhdGUgQVNDSUkgdG8gZnAgcm91dGluZXMuICovCi1zdGF0aWMgaW50IHZlcmJvc2UgPSAwOwotCi1pbnQgdmFsaWRhdGlvbl9hc2NpaV90b19mcChpbnQgY291bnQsIGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgIGludCAgICBzaG93YWxsID0gMDsKLSAgIGRvdWJsZSBtYXhfZXJyb3I9MjsgICAgICAvKiBBcyBhIHBlcmNlbnRhZ2UgZXJyb3ItaW4tbGFzdC1kaWdpdC8uNSAqLwotICAgZG91YmxlIG1heF9lcnJvcl9hYnM9MTc7IC8qIFVzZWQgd2hlbiBwcmVjaXNpb24gaXMgREJMX0RJRyAqLwotICAgZG91YmxlIG1heCA9IDA7Ci0gICBkb3VibGUgbWF4X2FicyA9IDA7Ci0gICBkb3VibGUgdGVzdCA9IDA7IC8qIEltcG9ydGFudCB0byB0ZXN0IHRoaXMuICovCi0gICBpbnQgICAgcHJlY2lzaW9uID0gNTsKLSAgIGludCAgICBub25maW5pdGUgPSAwOwotICAgaW50ICAgIGZpbml0ZSA9IDA7Ci0gICBpbnQgICAgb2sgPSAwOwotICAgaW50ICAgIGZhaWxjb3VudCA9IDA7Ci0gICBpbnQgICAgbWlub3Jhcml0aCA9IDA7Ci0KLSAgIHdoaWxlICgtLWFyZ2MgPiAwKQotICAgICAgaWYgKHN0cmNtcCgqKythcmd2LCAiLWEiKSA9PSAwKQotICAgICAgICAgc2hvd2FsbCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZSIpID09IDAgJiYgYXJnYyA+IDApCi0gICAgICB7Ci0gICAgICAgICAtLWFyZ2M7Ci0gICAgICAgICBtYXhfZXJyb3IgPSBhdG9mKCorK2FyZ3YpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLUUiKSA9PSAwICYmIGFyZ2MgPiAwKQotICAgICAgewotICAgICAgICAgLS1hcmdjOwotICAgICAgICAgbWF4X2Vycm9yX2FicyA9IGF0b2YoKisrYXJndik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gYXJndW1lbnQgJXNcbiIsICphcmd2KTsKLSAgICAgICAgIHJldHVybiAxOwotICAgICAgfQotCi0gICBkbwotICAgewotICAgICAgcG5nX3NpemVfdCBpbmRleDsKLSAgICAgIGludCBzdGF0ZSwgZmFpbGVkID0gMDsKLSAgICAgIGNoYXIgYnVmZmVyWzY0XTsKLQotICAgICAgaWYgKGlzZmluaXRlKHRlc3QpKQotICAgICAgICAgKytmaW5pdGU7Ci0gICAgICBlbHNlCi0gICAgICAgICArK25vbmZpbml0ZTsKLQotICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUuKmcgJWRcbiIsIERCTF9ESUcsIHRlc3QsIHByZWNpc2lvbik7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyBpbiB0aGUgYnVmZmVyIGJ5IHNldHRpbmcgYSBtYXJrZXIuICovCi0gICAgICBtZW1zZXQoYnVmZmVyLCA3MSwgc2l6ZW9mIGJ1ZmZlcik7Ci0KLSAgICAgIHBuZ19hc2NpaV9mcm9tX2ZwKDAsIGJ1ZmZlciwgcHJlY2lzaW9uKzEwLCB0ZXN0LCBwcmVjaXNpb24pOwotCi0gICAgICAvKiBBbGxvdyBmb3IgYSB0aHJlZSBkaWdpdCBleHBvbmVudCwgdGhpcyBzdHVmZiB3aWxsIGZhaWwgaWYKLSAgICAgICAqIHRoZSBleHBvbmVudCBpcyBiaWdnZXIgdGhhbiB0aGlzIQotICAgICAgICovCi0gICAgICBpZiAoYnVmZmVyW3ByZWNpc2lvbis3XSAhPSA3MSkKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWdbJWRdIC0+ICclcydbJWx1XSBidWZmZXIgb3ZlcmZsb3dcbiIsIHRlc3QsCi0gICAgICAgICAgICBwcmVjaXNpb24sIGJ1ZmZlciwgKHVuc2lnbmVkIGxvbmcpc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgZmFpbGVkID0gMTsKLSAgICAgIH0KLQotICAgICAgLyogRm9sbG93aW5nIGFyZSB1c2VkIGZvciB0aGUgbnVtYmVyIHBhcnNlciBiZWxvdyBhbmQgbXVzdCBiZQotICAgICAgICogaW5pdGlhbGl6ZWQgdG8gemVyby4KLSAgICAgICAqLwotICAgICAgc3RhdGUgPSAwOwotICAgICAgaW5kZXggPSAwOwotICAgICAgaWYgKCFpc2Zpbml0ZSh0ZXN0KSkKLSAgICAgIHsKLSAgICAgICAgIC8qIEV4cGVjdCAnaW5mJyAqLwotICAgICAgICAgaWYgKHRlc3QgPj0gMCAmJiBzdHJjbXAoYnVmZmVyLCAiaW5mIikgfHwKLSAgICAgICAgICAgICB0ZXN0IDwgIDAgJiYgc3RyY21wKGJ1ZmZlciwgIi1pbmYiKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWdbJWRdIC0+ICclcycgYnV0IGV4cGVjdGVkICdpbmYnXG4iLCB0ZXN0LAotICAgICAgICAgICAgICAgcHJlY2lzaW9uLCBidWZmZXIpOwotICAgICAgICAgICAgZmFpbGVkID0gMTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFwbmdfY2hlY2tfZnBfbnVtYmVyKGJ1ZmZlciwgcHJlY2lzaW9uKzEwLCAmc3RhdGUsICZpbmRleCkgfHwKLSAgICAgICAgICBidWZmZXJbaW5kZXhdICE9IDApCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVnWyVkXSAtPiAnJXMnIGJ1dCBoYXMgYmFkIGZvcm1hdCAoJyVjJylcbiIsIHRlc3QsCi0gICAgICAgICBwcmVjaXNpb24sIGJ1ZmZlciwgYnVmZmVyW2luZGV4XSk7Ci0gICAgICAgICBmYWlsZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUE5HX0ZQX0lTX05FR0FUSVZFKHN0YXRlKSAmJiAhKHRlc3QgPCAwKSkKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWdbJWRdIC0+ICclcycgYnV0IG5lZ2F0aXZlIHZhbHVlIG5vdCBzbyByZXBvcnRlZFxuIiwKLSAgICAgICAgICAgIHRlc3QsIHByZWNpc2lvbiwgYnVmZmVyKTsKLSAgICAgICAgIGZhaWxlZCA9IDE7Ci0gICAgICAgICBhc3NlcnQoIVBOR19GUF9JU19aRVJPKHN0YXRlKSk7Ci0gICAgICAgICBhc3NlcnQoIVBOR19GUF9JU19QT1NJVElWRShzdGF0ZSkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUE5HX0ZQX0lTX1pFUk8oc3RhdGUpICYmICEodGVzdCA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWdbJWRdIC0+ICclcycgYnV0IHplcm8gdmFsdWUgbm90IHNvIHJlcG9ydGVkXG4iLAotICAgICAgICAgICAgdGVzdCwgcHJlY2lzaW9uLCBidWZmZXIpOwotICAgICAgICAgZmFpbGVkID0gMTsKLSAgICAgICAgIGFzc2VydCghUE5HX0ZQX0lTX05FR0FUSVZFKHN0YXRlKSk7Ci0gICAgICAgICBhc3NlcnQoIVBOR19GUF9JU19QT1NJVElWRShzdGF0ZSkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUE5HX0ZQX0lTX1BPU0lUSVZFKHN0YXRlKSAmJiAhKHRlc3QgPiAwKSkKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWdbJWRdIC0+ICclcycgYnV0IHBvc3RpdmUgdmFsdWUgbm90IHNvIHJlcG9ydGVkXG4iLAotICAgICAgICAgICAgdGVzdCwgcHJlY2lzaW9uLCBidWZmZXIpOwotICAgICAgICAgZmFpbGVkID0gMTsKLSAgICAgICAgIGFzc2VydCghUE5HX0ZQX0lTX05FR0FUSVZFKHN0YXRlKSk7Ci0gICAgICAgICBhc3NlcnQoIVBOR19GUF9JU19aRVJPKHN0YXRlKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvKiBDaGVjayB0aGUgcmVzdWx0IGFnYWluc3QgdGhlIG9yaWdpbmFsLiAqLwotICAgICAgICAgZG91YmxlIG91dCA9IGF0b2YoYnVmZmVyKTsKLSAgICAgICAgIGRvdWJsZSBjaGFuZ2UgPSBmYWJzKChvdXQgLSB0ZXN0KS90ZXN0KTsKLSAgICAgICAgIGRvdWJsZSBhbGxvdyA9IC41L3BvdygxMCwKLSAgICAgICAgICAgIChwcmVjaXNpb24gPj0gREJMX0RJRykgPyBEQkxfRElHLTEgOiBwcmVjaXNpb24tMSk7Ci0KLSAgICAgICAgIC8qIE5PVEU6IGlmIHlvdSBoaXQgdGhpcyBlcnJvciBjYXNlIGFyZSB5b3UgY29tcGlsaW5nIHdpdGggZ2NjCi0gICAgICAgICAgKiBhbmQgLU8wPyAgVHJ5IC1PMiAtIHRoZSBlcnJvcnMgY2FuIGFjY3VtdWxhdGUgaWYgdGhlIEZQCi0gICAgICAgICAgKiBjb2RlIGFib3ZlIGlzIG5vdCBvcHRpbWl6ZWQgYW5kIG1heSBkcmlmdCBvdXRzaWRlIHRoZSAuNSBpbgotICAgICAgICAgICogREJMX0RJRyBhbGxvd2VkLiAgSW4gYW55IGNhc2UgYSBzbWFsbCBudW1iZXIgb2YgZXJyb3JzIG1heQotICAgICAgICAgICogb2NjdXIgKHZlcnkgc21hbGwgb25lcyAtIDEgb3IgMiUpIGJlY2F1c2Ugb2Ygcm91bmRpbmcgaW4gdGhlCi0gICAgICAgICAgKiBjYWxjdWxhdGlvbnMsIGVpdGhlciBpbiB0aGUgY29udmVyc2lvbiBBUEkgb3IgaW4gYXRvZi4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGNoYW5nZSA+PSBhbGxvdyAmJiAoaXNmaW5pdGUob3V0KSB8fAotICAgICAgICAgICAgIGZhYnModGVzdC9EQkxfTUFYKSA8PSAxLWFsbG93KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJjZW50ID0gKHByZWNpc2lvbiA+PSBEQkxfRElHKSA/IG1heF9lcnJvcl9hYnMgOiBtYXhfZXJyb3I7Ci0gICAgICAgICAgICBkb3VibGUgYWxsb3dwID0gKGNoYW5nZS1hbGxvdykqMTAwL2FsbG93OwotCi0gICAgICAgICAgICBpZiAocHJlY2lzaW9uID49IERCTF9ESUcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAobWF4X2FicyA8IGFsbG93cCkgbWF4X2FicyA9IGFsbG93cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKG1heCA8IGFsbG93cCkgbWF4ID0gYWxsb3dwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2hvd2FsbCB8fCBhbGxvd3AgPj0gcGVyY2VudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICAgIiUuKmdbJWRdIC0+ICclcycgLT4gJS4qZyBudW1iZXIgY2hhbmdlZCAoJWcgPiAlZyAoJWQlJSkpXG4iLAotICAgICAgICAgICAgICAgICAgREJMX0RJRywgdGVzdCwgcHJlY2lzaW9uLCBidWZmZXIsIERCTF9ESUcsIG91dCwgY2hhbmdlLCBhbGxvdywKLSAgICAgICAgICAgICAgICAgIChpbnQpcm91bmQoYWxsb3dwKSk7Ci0gICAgICAgICAgICAgICBmYWlsZWQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgKyttaW5vcmFyaXRoOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZmFpbGVkKQotICAgICAgICAgKytmYWlsY291bnQ7Ci0gICAgICBlbHNlCi0gICAgICAgICArK29rOwotCi1za2lwOgotICAgICAgLyogR2VuZXJhdGUgYSBuZXcgbnVtYmVyIGFuZCBwcmVjaXNpb24uICovCi0gICAgICBwcmVjaXNpb24gPSByYW5kKCk7Ci0gICAgICBpZiAocHJlY2lzaW9uICYgMSkgdGVzdCA9IC10ZXN0OwotICAgICAgcHJlY2lzaW9uID4+PSAxOwotCi0gICAgICAvKiBHZW5lcmF0ZSByYW5kb20gbnVtYmVycy4gKi8KLSAgICAgIGlmICh0ZXN0ID09IDAgfHwgIWlzZmluaXRlKHRlc3QpKQotICAgICAgICAgdGVzdCA9IHByZWNpc2lvbisxOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLyogRGVyaXZlIHRoZSBleHBvbmVudCBmcm9tIHRoZSBwcmV2aW91cyByYW5kKCkgdmFsdWUuICovCi0gICAgICAgICBpbnQgZXhwb25lbnQgPSBwcmVjaXNpb24gJSAoREJMX01BWF9FWFAgLSBEQkxfTUlOX0VYUCkgKyBEQkxfTUlOX0VYUDsKLSAgICAgICAgIGludCB0bXA7Ci0gICAgICAgICB0ZXN0ID0gZnJleHAodGVzdCAqIHJhbmQoKSwgJnRtcCk7Ci0gICAgICAgICB0ZXN0ID0gbGRleHAodGVzdCwgZXhwb25lbnQpOwotICAgICAgICAgcHJlY2lzaW9uID4+PSA4OyAvKiBhcmJpdHJhcnkgKi8KLSAgICAgIH0KLQotICAgICAgLyogVGhpcyBsaW1pdHMgdGhlIHByZWNpc2lvbiB0byAzMiBkaWdpdHMsIGVub3VnaCBmb3Igc3RhbmRhcmQKLSAgICAgICAqIElFRUUgaW1wbGVtZW50YXRpb25zIHdoaWNoIGhhdmUgYXQgbW9zdCAxNSBkaWdpdHMuCi0gICAgICAgKi8KLSAgICAgIHByZWNpc2lvbiA9IChwcmVjaXNpb24gJiAweDFmKSArIDE7Ci0gICB9Ci0gICB3aGlsZSAoLS1jb3VudCk7Ci0KLSAgIHByaW50ZigiVGVzdGVkICVkIGZpbml0ZSB2YWx1ZXMsICVkIG5vbi1maW5pdGUsICVkIE9LICglZCBmYWlsZWQpICVkIG1pbm9yICIKLSAgICAgICJhcml0aG1ldGljIGVycm9yc1xuIiwgZmluaXRlLCBub25maW5pdGUsIG9rLCBmYWlsY291bnQsIG1pbm9yYXJpdGgpOwotICAgcHJpbnRmKCIgRXJyb3Igd2l0aCA+PSVkIGRpZ2l0IHByZWNpc2lvbiAlLjJmJSVcbiIsIERCTF9ESUcsIG1heF9hYnMpOwotICAgcHJpbnRmKCIgRXJyb3Igd2l0aCA8ICVkIGRpZ2l0IHByZWNpc2lvbiAlLjJmJSVcbiIsIERCTF9ESUcsIG1heCk7Ci0KLSAgIHJldHVybiAwOwotfQotCi0vKiBPYnNlcnZlIHRoYXQgdmFsaWQgRlAgbnVtYmVycyBoYXZlIHRoZSBmb3JtcyBsaXN0ZWQgaW4gdGhlIFBORyBleHRlbnNpb25zCi0gKiBzcGVjaWZpY2F0aW9uOgotICoKLSAqIFsrLC1de2ludGVnZXIsaW50ZWdlci5mcmFjdGlvbiwuZnJhY3Rpb259W3tlLEV9WyssLV1pbnRlZ2VyXQotICoKLSAqIFRlc3QgZWFjaCBvZiB0aGVzZSBpbiB0dXJuLCBpbmNsdWRpbmcgaW52YWxpZCBjYXNlcy4KLSAqLwotdHlwZWRlZiBlbnVtIGNoZWNrZnBfc3RhdGUKLXsKLSAgIHN0YXJ0LCBmcmFjdGlvbiwgZXhwb25lbnQsIHN0YXRlcwotfSBjaGVja2ZwX3N0YXRlOwotCi0vKiBUaGUgY2hhcmFjdGVycyAob3RoZXIgdGhhbiBkaWdpdHMpIHRoYXQgY2hhcmFjdGVyaXplIHRoZSBzdGF0ZXM6ICovCi1zdGF0aWMgY29uc3QgY2hhciBub25lW10gPSAiIjsKLXN0YXRpYyBjb25zdCBjaGFyIGhleGRpZ2l0c1sxNl0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLXsKLSAgIGNvbnN0IGNoYXIgKnN0YXJ0OyAvKiBDaGFyYWN0ZXJzIHZhbGlkIGF0IHRoZSBzdGFydCAqLwotICAgY29uc3QgY2hhciAqZW5kOyAgIC8qIFZhbGlkIGNoYXJhY3RlcnMgdGhhdCBlbmQgdGhlIHN0YXRlICovCi0gICBjb25zdCBjaGFyICp0ZXN0czsgLyogQ2hhcmFjdGVycyB0byB0ZXN0IGFmdGVyIDIgZGlnaXRzIHNlZW4gKi8KLX0KLXN0YXRlX2NoYXJhY3RlcnNbc3RhdGVzXSA9Ci17Ci0gICAvKiBzdGFydDogICAgKi8geyAiKy0uIiwgIi5lRSIsICIrLS5lKjAzNjkiIH0sCi0gICAvKiBmcmFjdGlvbjogKi8geyBub25lLCAiZUUiLCAgIistLkUjMDE0NyIgfSwKLSAgIC8qIGV4cG9uZW50OiAqLyB7ICIrLSIsIG5vbmUsICAiKy0uZUVeMDI1OCIgfQotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIGNoYXIgbnVtYmVyWzEwMjRdOyAgLyogQnVmZmVyIGZvciBudW1iZXIgYmVpbmcgdGVzdGVkICovCi0gICBpbnQgIGxpbWl0OyAgICAgICAgIC8qIENvbW1hbmQgbGluZSBsaW1pdCAqLwotICAgaW50ICB2ZXJib3NlOyAgICAgICAvKiBTaGFkb3dzIGdsb2JhbCB2YXJpYWJsZSAqLwotICAgaW50ICBjdGltZXM7ICAgICAgICAvKiBOdW1iZXIgb2YgbnVtYmVycyB0ZXN0ZWQgKi8KLSAgIGludCAgY21pbGxpb25zOyAgICAgLyogQ291bnQgb2YgbWlsbGlvbnMgb2YgbnVtYmVycyAqLwotICAgaW50ICBjaW52YWxpZDsgICAgICAvKiBJbnZhbGlkIHN0cmluZ3MgY2hlY2tlZCAqLwotICAgaW50ICBjbm9hY2NlcHQ7ICAgICAvKiBDaGFyYWN0ZXJzIG5vdCBhY2NlcHRlZCAqLwotfQotY2hlY2tmcF9jb21tYW5kOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgaW50ICAgICAgICAgICBjbnVtYmVyOyAgICAgICAgICAvKiBJbmRleCBpbnRvIG51bWJlciBzdHJpbmcgKi8KLSAgIGNoZWNrZnBfc3RhdGUgY2hlY2tfc3RhdGU7ICAgICAgLyogQ3VycmVudCBudW1iZXIgc3RhdGUgKi8KLSAgIGludCAgICAgICAgICAgYXRfc3RhcnQ7ICAgICAgICAgLyogQXQgc3RhcnQgKGZpcnN0IGNoYXJhY3Rlcikgb2Ygc3RhdGUgKi8KLSAgIGludCAgICAgICAgICAgY2RpZ2l0c19pbl9zdGF0ZTsgLyogRGlnaXRzIHNlZW4gaW4gdGhhdCBzdGF0ZSAqLwotICAgaW50ICAgICAgICAgICBsaW1pdDsgICAgICAgICAgICAvKiBMaW1pdCBvbiBzYW1lIGZvciBjaGVja2luZyBhbGwgY2hhcnMgKi8KLSAgIGludCAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAgLyogQ3VycmVudCBwYXJzZXIgc3RhdGUgKi8KLSAgIGludCAgICAgICAgICAgaXNfbmVnYXRpdmU7ICAgICAgLyogTnVtYmVyIGlzIG5lZ2F0aXZlICovCi0gICBpbnQgICAgICAgICAgIGlzX3plcm87ICAgICAgICAgIC8qIE51bWJlciBpcyAoc3RpbGwpIHplcm8gKi8KLSAgIGludCAgICAgICAgICAgbnVtYmVyX3dhc192YWxpZDsgLyogUHJldmlvdXMgY2hhcmFjdGVyIHZhbGlkaXR5ICovCi19Ci1jaGVja2ZwX2NvbnRyb2w7Ci0KLXN0YXRpYyBpbnQgY2hlY2tfYWxsX2NoYXJhY3RlcnMoY2hlY2tmcF9jb21tYW5kICpjbywgY2hlY2tmcF9jb250cm9sIGMpOwotCi1zdGF0aWMgaW50IGNoZWNrX3NvbWVfY2hhcmFjdGVycyhjaGVja2ZwX2NvbW1hbmQgKmNvLCBjaGVja2ZwX2NvbnRyb2wgYywKLSAgIGNvbnN0IGNoYXIgKnRlc3RzKTsKLQotc3RhdGljIGludCBjaGVja19vbmVfY2hhcmFjdGVyKGNoZWNrZnBfY29tbWFuZCAqY28sIGNoZWNrZnBfY29udHJvbCBjLCBpbnQgY2gpCi17Ci0gICAvKiBUZXN0IHRoaXMgY2hhcmFjdGVyIChjaCkgdG8gZW5zdXJlIHRoZSBwYXJzZXIgZG9lcyB0aGUgY29ycmVjdCB0aGluZy4KLSAgICAqLwotICAgcG5nX3NpemVfdCBpbmRleCA9IDA7Ci0gICBjb25zdCBjaGFyIHRlc3QgPSAoY2hhciljaDsKLSAgIGNvbnN0IGludCBudW1iZXJfaXNfdmFsaWQgPSBwbmdfY2hlY2tfZnBfbnVtYmVyKCZ0ZXN0LCAxLCAmYy5zdGF0ZSwgJmluZGV4KTsKLSAgIGNvbnN0IGludCBjaGFyYWN0ZXJfYWNjZXB0ZWQgPSAoaW5kZXggPT0gMSk7Ci0KLSAgIGlmIChjLmNoZWNrX3N0YXRlICE9IGV4cG9uZW50ICYmIGlzZGlnaXQoY2gpICYmIGNoICE9ICcwJykKLSAgICAgIGMuaXNfemVybyA9IDA7Ci0KLSAgIGlmIChjLmNoZWNrX3N0YXRlID09IHN0YXJ0ICYmIGMuYXRfc3RhcnQgJiYgY2ggPT0gJy0nKQotICAgICAgYy5pc19uZWdhdGl2ZSA9IDE7Ci0KLSAgIGlmIChpc3ByaW50KGNoKSkKLSAgICAgIGNvLT5udW1iZXJbYy5jbnVtYmVyKytdID0gKGNoYXIpY2g7Ci0gICBlbHNlCi0gICB7Ci0gICAgICBjby0+bnVtYmVyW2MuY251bWJlcisrXSA9ICc8JzsKLSAgICAgIGNvLT5udW1iZXJbYy5jbnVtYmVyKytdID0gaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4Zl07Ci0gICAgICBjby0+bnVtYmVyW2MuY251bWJlcisrXSA9IGhleGRpZ2l0c1tjaCAmIDB4Zl07Ci0gICAgICBjby0+bnVtYmVyW2MuY251bWJlcisrXSA9ICc+JzsKLSAgIH0KLSAgIGNvLT5udW1iZXJbYy5jbnVtYmVyXSA9IDA7Ci0KLSAgIGlmIChjby0+dmVyYm9zZSA+IDEpCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBjby0+bnVtYmVyKTsKLQotICAgaWYgKCsrKGNvLT5jdGltZXMpID09IDEwMDAwMDApCi0gICB7Ci0gICAgICBpZiAoY28tPnZlcmJvc2UgPT0gMSkKLSAgICAgICAgIGZwdXRjKCcuJywgc3RkZXJyKTsKLSAgICAgIGNvLT5jdGltZXMgPSAwOwotICAgICAgKysoY28tPmNtaWxsaW9ucyk7Ci0gICB9Ci0KLSAgIGlmICghbnVtYmVyX2lzX3ZhbGlkKQotICAgICAgKysoY28tPmNpbnZhbGlkKTsKLQotICAgaWYgKCFjaGFyYWN0ZXJfYWNjZXB0ZWQpCi0gICAgICArKyhjby0+Y25vYWNjZXB0KTsKLQotICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgZmFpbCAoaXQncyBhIHNlcmlvdXMgYnVnIGlmIGl0IGRvZXMpOiAqLwotICAgaWYgKGluZGV4ICE9IDAgJiYgaW5kZXggIT0gMSkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHJlYWQgYmV5b25kIGVuZCBvZiBzdHJpbmcgKCVsdSlcbiIsIGNvLT5udW1iZXIsCi0gICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCk7Ci0gICAgICByZXR1cm4gMDsKLSAgIH0KLQotICAgLyogVmFsaWRhdGUgdGhlIG5ldyBzdGF0ZSwgbm90ZSB0aGF0IHRoZSBQTkdfRlBfSVNfIG1hY3JvcyBhbGwgcmV0dXJuCi0gICAgKiBmYWxzZSB1bmxlc3MgdGhlIG51bWJlciBpcyB2YWxpZC4KLSAgICAqLwotICAgaWYgKFBOR19GUF9JU19ORUdBVElWRShjLnN0YXRlKSAhPQotICAgICAgKG51bWJlcl9pc192YWxpZCAmJiAhYy5pc196ZXJvICYmIGMuaXNfbmVnYXRpdmUpKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbmVnYXRpdmUgd2hlbiBpdCBpcyBub3RcbiIsIGNvLT5udW1iZXIpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIGlmIChQTkdfRlBfSVNfWkVSTyhjLnN0YXRlKSAhPSAobnVtYmVyX2lzX3ZhbGlkICYmIGMuaXNfemVybykpCi0gICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB6ZXJvIHdoZW4gaXQgaXMgbm90XG4iLCBjby0+bnVtYmVyKTsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICBpZiAoUE5HX0ZQX0lTX1BPU0lUSVZFKGMuc3RhdGUpICE9Ci0gICAgICAobnVtYmVyX2lzX3ZhbGlkICYmICFjLmlzX3plcm8gJiYgIWMuaXNfbmVnYXRpdmUpKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogcG9zaXRpdmUgd2hlbiBpdCBpcyBub3RcbiIsIGNvLT5udW1iZXIpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIC8qIFRlc3RpbmcgYSBkaWdpdCAqLwotICAgaWYgKGlzZGlnaXQoY2gpKQotICAgewotICAgICAgaWYgKCFjaGFyYWN0ZXJfYWNjZXB0ZWQpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBkaWdpdCAnJWMnIG5vdCBhY2NlcHRlZFxuIiwgY28tPm51bWJlciwgY2gpOwotICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghbnVtYmVyX2lzX3ZhbGlkKQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc2F3IGEgZGlnaXQgKCVjKSBidXQgbnVtYmVyIG5vdCB2YWxpZFxuIiwKLSAgICAgICAgICAgIGNvLT5udW1iZXIsIGNoKTsKLSAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICArK2MuY2RpZ2l0c19pbl9zdGF0ZTsKLSAgICAgIGMuYXRfc3RhcnQgPSAwOwotICAgICAgYy5udW1iZXJfd2FzX3ZhbGlkID0gMTsKLQotICAgICAgLyogQ29udGludWUgdGVzdGluZyBjaGFyYWN0ZXJzIGluIHRoaXMgc3RhdGUuICBFaXRoZXIgdGVzdCBhbGwgb2YKLSAgICAgICAqIHRoZW0gb3IsIGlmIHdlIGhhdmUgYWxyZWFkeSBzZWVuIG9uZSBkaWdpdCBpbiB0aGlzIHN0YXRlLCBqdXN0IHRlc3QgYQotICAgICAgICogbGltaXRlZCBzZXQuCi0gICAgICAgKi8KLSAgICAgIGlmIChjLmNkaWdpdHNfaW5fc3RhdGUgPCAxKQotICAgICAgICAgcmV0dXJuIGNoZWNrX2FsbF9jaGFyYWN0ZXJzKGNvLCBjKTsKLQotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIGNoZWNrX3NvbWVfY2hhcmFjdGVycyhjbywgYywKLSAgICAgICAgICAgIHN0YXRlX2NoYXJhY3RlcnNbYy5jaGVja19zdGF0ZV0udGVzdHMpOwotICAgfQotCi0gICAvKiBBIG5vbi1kaWdpdDsgaXMgaXQgYWxsb3dlZCBoZXJlPyAqLwotICAgZWxzZSBpZiAoKChjaCA9PSAnKycgfHwgY2ggPT0gJy0nKSAmJiBjLmNoZWNrX3N0YXRlICE9IGZyYWN0aW9uICYmCi0gICAgICAgICAgICAgICBjLmF0X3N0YXJ0KSB8fAotICAgICAgICAgICAgKGNoID09ICcuJyAmJiBjLmNoZWNrX3N0YXRlID09IHN0YXJ0KSB8fAotICAgICAgICAgICAgKChjaCA9PSAnZScgfHwgY2ggPT0gJ0UnKSAmJiBjLm51bWJlcl93YXNfdmFsaWQgJiYKLSAgICAgICAgICAgICAgIGMuY2hlY2tfc3RhdGUgIT0gZXhwb25lbnQpKQotICAgewotICAgICAgaWYgKCFjaGFyYWN0ZXJfYWNjZXB0ZWQpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjaGFyYWN0ZXIgJyVjJyBub3QgYWNjZXB0ZWRcbiIsIGNvLT5udW1iZXIsIGNoKTsKLSAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICAvKiBUaGUgbnVtYmVyIHJlbWFpbnMgdmFsaWQgYWZ0ZXIgc3RhcnQgb2YgZnJhY3Rpb24gYnV0IG5vd2hlcmUgZWxzZS4gKi8KLSAgICAgIGlmIChudW1iZXJfaXNfdmFsaWQgJiYgKGMuY2hlY2tfc3RhdGUgIT0gc3RhcnQgfHwgY2ggIT0gJy4nKSkKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNhdyBhIG5vbi1kaWdpdCAoJWMpIGJ1dCBudW1iZXIgdmFsaWRcbiIsCi0gICAgICAgICAgICBjby0+bnVtYmVyLCBjaCk7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgYy5udW1iZXJfd2FzX3ZhbGlkID0gbnVtYmVyX2lzX3ZhbGlkOwotCi0gICAgICAvKiBDaGVjayBmb3IgYSBzdGF0ZSBjaGFuZ2UuICBXaGVuIGNoYW5naW5nIHRvICdmcmFjdGlvbicgaWYgdGhlIG51bWJlcgotICAgICAgICogaXMgdmFsaWQgYXQgdGhpcyBwb2ludCBzZXQgdGhlIGF0X3N0YXJ0IHRvIGZhbHNlIHRvIGFsbG93IGFuIGV4cG9uZW50Ci0gICAgICAgKiAnZScgdG8gY29tZSBuZXh0LgotICAgICAgICovCi0gICAgICBpZiAoYy5jaGVja19zdGF0ZSA9PSBzdGFydCAmJiBjaCA9PSAnLicpCi0gICAgICB7Ci0gICAgICAgICBjLmNoZWNrX3N0YXRlID0gZnJhY3Rpb247Ci0gICAgICAgICBjLmF0X3N0YXJ0ID0gIW51bWJlcl9pc192YWxpZDsKLSAgICAgICAgIGMuY2RpZ2l0c19pbl9zdGF0ZSA9IDA7Ci0gICAgICAgICBjLmxpbWl0ID0gY28tPmxpbWl0OwotICAgICAgICAgcmV0dXJuIGNoZWNrX2FsbF9jaGFyYWN0ZXJzKGNvLCBjKTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoYy5jaGVja19zdGF0ZSA8IGV4cG9uZW50ICYmIChjaCA9PSAnZScgfHwgY2ggPT0gJ0UnKSkKLSAgICAgIHsKLSAgICAgICAgIGMuY2hlY2tfc3RhdGUgPSBleHBvbmVudDsKLSAgICAgICAgIGMuYXRfc3RhcnQgPSAxOwotICAgICAgICAgYy5jZGlnaXRzX2luX3N0YXRlID0gMDsKLSAgICAgICAgIGMubGltaXQgPSBjby0+bGltaXQ7Ci0gICAgICAgICByZXR1cm4gY2hlY2tfYWxsX2NoYXJhY3RlcnMoY28sIGMpOwotICAgICAgfQotCi0gICAgICAvKiBFbHNlIGl0IHdhcyBhIHNpZ24sIGFuZCB0aGUgc3RhdGUgZG9lc24ndCBjaGFuZ2UuICovCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAoY2ggIT0gJy0nICYmIGNoICE9ICcrJykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2hlY2tmcDogaW50ZXJuYWwgZXJyb3IgKDEpXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgfQotCi0gICAgICAgICBjLmF0X3N0YXJ0ID0gMDsKLSAgICAgICAgIHJldHVybiBjaGVja19hbGxfY2hhcmFjdGVycyhjbywgYyk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIFRlc3RpbmcgYW4gaW52YWxpZCBjaGFyYWN0ZXIgKi8KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChjaGFyYWN0ZXJfYWNjZXB0ZWQpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjaGFyYWN0ZXIgJyVjJyBbMHglLjJ4XSBhY2NlcHRlZFxuIiwgY28tPm51bWJlciwKLSAgICAgICAgICAgIGNoLCBjaCk7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgaWYgKG51bWJlcl9pc192YWxpZCAhPSBjLm51bWJlcl93YXNfdmFsaWQpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICIlczogY2hhcmFjdGVyICclYycgWzB4JS4yeF0gY2hhbmdlZCBudW1iZXIgdmFsaWRpdHlcbiIsIGNvLT5udW1iZXIsCi0gICAgICAgICAgICBjaCwgY2gpOwotICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIERvIG5vdGhpbmcgLSB0aGUgcGFyc2VyIGhhcyBzdHVjazsgcmV0dXJuIHN1Y2Nlc3MgYW5kIGtlZXAgZ29pbmcgd2l0aAotICAgICAgICogdGhlIG5leHQgY2hhcmFjdGVyLgotICAgICAgICovCi0gICB9Ci0KLSAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuICh0aGUgY2FsbGVyIHdpbGwgdHJ5IHRoZSBuZXh0IGNoYXJhY3Rlci4pICovCi0gICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBjaGVja19hbGxfY2hhcmFjdGVycyhjaGVja2ZwX2NvbW1hbmQgKmNvLCBjaGVja2ZwX2NvbnRyb2wgYykKLXsKLSAgIGludCBjaDsKLQotICAgaWYgKGMuY251bWJlcis0IDwgc2l6ZW9mIGNvLT5udW1iZXIpIGZvciAoY2g9MDsgY2g8MjU2OyArK2NoKQotICAgewotICAgICAgaWYgKCFjaGVja19vbmVfY2hhcmFjdGVyKGNvLCBjLCBjaCkpCi0gICAgICAgICByZXR1cm4gMDsKLSAgIH0KLQotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfc29tZV9jaGFyYWN0ZXJzKGNoZWNrZnBfY29tbWFuZCAqY28sIGNoZWNrZnBfY29udHJvbCBjLAotICAgY29uc3QgY2hhciAqdGVzdHMpCi17Ci0gICBpbnQgaTsKLQotICAgLS0oYy5saW1pdCk7Ci0KLSAgIGlmIChjLmNudW1iZXIrNCA8IHNpemVvZiBjby0+bnVtYmVyICYmIGMubGltaXQgPj0gMCkKLSAgIHsKLSAgICAgIGlmIChjLmxpbWl0ID4gMCkgZm9yIChpPTA7IHRlc3RzW2ldOyArK2kpCi0gICAgICB7Ci0gICAgICAgICBpZiAoIWNoZWNrX29uZV9jaGFyYWN0ZXIoY28sIGMsIHRlc3RzW2ldKSkKLSAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICAvKiBBdCB0aGUgZW5kIGNoZWNrIGFsbCB0aGUgY2hhcmFjdGVycy4gKi8KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBjaGVja19hbGxfY2hhcmFjdGVycyhjbywgYyk7Ci0gICB9Ci0KLSAgIHJldHVybiAxOwotfQotCi1pbnQgdmFsaWRhdGlvbl9jaGVja2ZwKGludCBjb3VudCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgaW50IHJlc3VsdDsKLSAgIGNoZWNrZnBfY29tbWFuZCBjb21tYW5kOwotICAgY2hlY2tmcF9jb250cm9sIGNvbnRyb2w7Ci0KLSAgIGNvbW1hbmQubnVtYmVyWzBdID0gMDsKLSAgIGNvbW1hbmQubGltaXQgPSAzOwotICAgY29tbWFuZC52ZXJib3NlID0gdmVyYm9zZTsKLSAgIGNvbW1hbmQuY3RpbWVzID0gMDsKLSAgIGNvbW1hbmQuY21pbGxpb25zID0gMDsKLSAgIGNvbW1hbmQuY2ludmFsaWQgPSAwOwotICAgY29tbWFuZC5jbm9hY2NlcHQgPSAwOwotCi0gICB3aGlsZSAoLS1hcmdjID4gMCkKLSAgIHsKLSAgICAgICsrYXJndjsKLSAgICAgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoKmFyZ3YsICItbCIpID09IDApCi0gICAgICB7Ci0gICAgICAgICAtLWFyZ2M7Ci0gICAgICAgICBjb21tYW5kLmxpbWl0ID0gYXRvaSgqKythcmd2KTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGFyZ3VtZW50ICVzXG4iLCAqYXJndik7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgIH0KLQotICAgY29udHJvbC5jbnVtYmVyID0gMDsKLSAgIGNvbnRyb2wuY2hlY2tfc3RhdGUgPSBzdGFydDsKLSAgIGNvbnRyb2wuYXRfc3RhcnQgPSAxOwotICAgY29udHJvbC5jZGlnaXRzX2luX3N0YXRlID0gMDsKLSAgIGNvbnRyb2wubGltaXQgPSBjb21tYW5kLmxpbWl0OwotICAgY29udHJvbC5zdGF0ZSA9IDA7Ci0gICBjb250cm9sLmlzX25lZ2F0aXZlID0gMDsKLSAgIGNvbnRyb2wuaXNfemVybyA9IDE7Ci0gICBjb250cm9sLm51bWJlcl93YXNfdmFsaWQgPSAwOwotCi0gICByZXN1bHQgPSBjaGVja19hbGxfY2hhcmFjdGVycygmY29tbWFuZCwgY29udHJvbCk7Ci0KLSAgIHByaW50ZigiY2hlY2tmcDogJXM6IGNoZWNrZWQgJWQsJS4zZCwlLjNkLCUuM2Qgc3RyaW5ncyAoJWQgaW52YWxpZClcbiIsCi0gICAgICByZXN1bHQgPyAicGFzcyIgOiAiRkFJTCIsIGNvbW1hbmQuY21pbGxpb25zIC8gMTAwMCwKLSAgICAgIGNvbW1hbmQuY21pbGxpb25zICUgMTAwMCwgY29tbWFuZC5jdGltZXMgLyAxMDAwLCBjb21tYW5kLmN0aW1lcyAlIDEwMDAsCi0gICAgICBjb21tYW5kLmNpbnZhbGlkKTsKLQotICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHZhbGlkYXRpb25fbXVsZGl2KGludCBjb3VudCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgaW50IHRlc3RlZCA9IDA7Ci0gICBpbnQgb3ZlcmZsb3cgPSAwOwotICAgaW50IGVycm9yID0gMDsKLSAgIGludCBlcnJvcjY0ID0gMDsKLSAgIGludCBwYXNzZWQgPSAwOwotICAgaW50IHJhbmRiaXRzID0gMDsKLSAgIHBuZ191aW50XzMyIHJhbmRidWZmZXI7Ci0gICBwbmdfZml4ZWRfcG9pbnQgYTsKLSAgIHBuZ19pbnRfMzIgdGltZXMsIGRpdjsKLQotICAgd2hpbGUgKC0tYXJnYyA+IDApCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gYXJndW1lbnQgJXNcbiIsICorK2FyZ3YpOwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0KLSAgIC8qIEZpbmQgb3V0IGFib3V0IHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gKi8KLSAgIHJhbmRidWZmZXIgPSBSQU5EX01BWDsKLSAgIHdoaWxlIChyYW5kYnVmZmVyICE9IDApICsrcmFuZGJpdHMsIHJhbmRidWZmZXIgPj49IDE7Ci0gICBwcmludGYoIlVzaW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoYXQgbWFrZXMgJWQgYml0c1xuIiwgcmFuZGJpdHMpOwotICAgZm9yIChkaXY9MDsgZGl2PDMyOyBkaXYgKz0gcmFuZGJpdHMpCi0gICAgICByYW5kYnVmZmVyID0gKHJhbmRidWZmZXIgPDwgcmFuZGJpdHMpIF4gcmFuZCgpOwotCi0gICBhID0gMDsKLSAgIHRpbWVzID0gZGl2ID0gMDsKLSAgIGRvCi0gICB7Ci0gICAgICBwbmdfZml4ZWRfcG9pbnQgcmVzdWx0OwotICAgICAgLyogTk9URTogeW91ciBtaWxlYWdlIG1heSB2YXJ5LCBhIHR5cGUgaXMgcmVxdWlyZWQgYmVsb3cgdGhhdCBjYW4KLSAgICAgICAqIGhvbGQgNjQgYml0cyBvciBtb3JlLCBpZiBmbG9hdGluZyBwb2ludCBpcyB1c2VkIGEgNjQtYml0IG9yCi0gICAgICAgKiBiZXR0ZXIgbWFudGlzc2EgaXMgcmVxdWlyZWQuCi0gICAgICAgKi8KLSAgICAgIGxvbmcgbG9uZyBpbnQgZnAsIGZwcm91bmQ7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhpLCBsbzsKLSAgICAgIGludCBvazsKLQotICAgICAgLyogQ2hlY2sgdGhlIHZhbHVlcywgcG5nXzY0Yml0X3Byb2R1Y3QgY2FuIG9ubHkgaGFuZGxlIHBvc2l0aXZlCi0gICAgICAgKiBudW1iZXJzLCBzbyBjb3JyZWN0IGZvciB0aGF0IGhlcmUuCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgIGxvbmcgdTEsIHUyOwotICAgICAgICAgaW50IG4gPSAwOwotICAgICAgICAgaWYgKGEgPCAwKSB1MSA9IC1hLCBuID0gMTsgZWxzZSB1MSA9IGE7Ci0gICAgICAgICBpZiAodGltZXMgPCAwKSB1MiA9IC10aW1lcywgbiA9ICFuOyBlbHNlIHUyID0gdGltZXM7Ci0gICAgICAgICBwbmdfNjRiaXRfcHJvZHVjdCh1MSwgdTIsICZoaSwgJmxvKTsKLSAgICAgICAgIGlmIChuKQotICAgICAgICAgewotICAgICAgICAgICAgLyogLXggPSB+eCsxICovCi0gICAgICAgICAgICBsbyA9ICgofmxvKSArIDEpICYgMHhmZmZmZmZmZjsKLSAgICAgICAgICAgIGhpID0gfmhpOwotICAgICAgICAgICAgaWYgKGxvID09IDApICsraGk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZwID0gYTsKLSAgICAgIGZwICo9IHRpbWVzOwotICAgICAgaWYgKChmcCAmIDB4ZmZmZmZmZmYpICE9IGxvIHx8ICgoZnAgPj4gMzIpICYgMHhmZmZmZmZmZikgIT0gaGkpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBuZ182NGJpdF9wcm9kdWN0ICVkICogJWQgLT4gJWx4fCUuOGx4IG5vdCAlbGx4XG4iLAotICAgICAgICAgICAgYSwgdGltZXMsIGhpLCBsbywgZnApOwotICAgICAgICAgKytlcnJvcjY0OwotICAgICAgfQotCi0gICAgICBpZiAoZGl2ICE9IDApCi0gICAgICB7Ci0gICAgICAgICAvKiBSb3VuZCAtIHRoaXMgaXMgQyByb3VuZCB0byB6ZXJvLiAqLwotICAgICAgICAgaWYgKChmcCA8IDApICE9IChkaXYgPCAwKSkKLSAgICAgICAgICAgZnAgLT0gZGl2LzI7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgIGZwICs9IGRpdi8yOwotCi0gICAgICAgICBmcCAvPSBkaXY7Ci0gICAgICAgICBmcHJvdW5kID0gZnA7Ci0gICAgICAgICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaGVyZTogKi8KLSAgICAgICAgIG9rID0gZnByb3VuZCA8PSBQTkdfVUlOVF8zMV9NQVggJiYKLSAgICAgICAgICAgICAgZnByb3VuZCA+PSAtMS0obG9uZyBsb25nIGludClQTkdfVUlOVF8zMV9NQVg7Ci0gICAgICAgICBpZiAoIW9rKSArK292ZXJmbG93OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBvayA9IDAsICsrb3ZlcmZsb3csIGZwcm91bmQgPSBmcC8qbWlzbGVhZGluZyovOwotCi0gICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVEVTVCAlZCAqICVkIC8gJWQgLT4gJWxsZCAoJXMpXG4iLCBhLCB0aW1lcywgZGl2LAotICAgICAgICAgICAgZnAsIG9rID8gIm9rIiA6ICJvdmVyZmxvdyIpOwotCi0gICAgICArK3Rlc3RlZDsKLSAgICAgIGlmIChwbmdfbXVsZGl2KCZyZXN1bHQsIGEsIHRpbWVzLCBkaXYpICE9IG9rKQotICAgICAgewotICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgIGlmIChvaykKLSAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkICogJWQgLyAlZCAtPiBvdmVyZmxvdyAoZXhwZWN0ZWQgJWxsZClcbiIsIGEsCi0gICAgICAgICAgICAgICAgdGltZXMsIGRpdiwgZnApOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQgKiAlZCAvICVkIC0+ICVkIChleHBlY3RlZCBvdmVyZmxvdyAlbGxkKVxuIiwgYSwKLSAgICAgICAgICAgICAgICB0aW1lcywgZGl2LCByZXN1bHQsIGZwKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9rICYmIHJlc3VsdCAhPSBmcHJvdW5kKQotICAgICAgewotICAgICAgICAgKytlcnJvcjsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQgKiAlZCAvICVkIC0+ICVkIG5vdCAlbGxkXG4iLCBhLCB0aW1lcywgZGl2LCByZXN1bHQsCi0gICAgICAgICAgICBmcCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICArK3Bhc3NlZDsKLQotICAgICAgLyogR2VuZXJhdGUgdGhyZWUgbmV3IHZhbHVlcywgdGhpcyB1c2VzIHJhbmQoKSBhbmQgcmFuZCgpIG9ubHkgcmV0dXJucwotICAgICAgICogdXAgdG8gUkFORF9NQVguCi0gICAgICAgKi8KLSAgICAgIC8qIENSVURFICovCi0gICAgICBhICs9IHRpbWVzOwotICAgICAgdGltZXMgKz0gZGl2OwotICAgICAgZGl2ID0gcmFuZGJ1ZmZlcjsKLSAgICAgIHJhbmRidWZmZXIgPSAocmFuZGJ1ZmZlciA8PCByYW5kYml0cykgXiByYW5kKCk7Ci0gICB9Ci0gICB3aGlsZSAoLS1jb3VudCA+IDApOwotCi0gICBwcmludGYoIiVkIHRlc3RzIGluY2x1ZGluZyAlZCBvdmVyZmxvd3MsICVkIHBhc3NlZCwgJWQgZmFpbGVkICglZCA2NC1iaXQgIgotICAgICAgImVycm9ycylcbiIsIHRlc3RlZCwgb3ZlcmZsb3csIHBhc3NlZCwgZXJyb3IsIGVycm9yNjQpOwotICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdoZW4gRlAgaXMgb24gdGhpcyBqdXN0IGJlY29tZXMgYSBzcGVlZCB0ZXN0IC0gY29tcGlsZSB3aXRob3V0IEZQIHRvIGdldCByZWFsCi0gKiB2YWxpZGF0aW9uLgotICovCi0jaWZkZWYgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVECi0jZGVmaW5lIExOMiAuMDAwMDEwNTc2NTg2NjE3NDMwODA2MTEyOTMzODM5IC8qIGxvZygyKS82NTUzNiAqLwotI2RlZmluZSBMMklOViA5NDU0OC40NjIxOTk2OTkxMDU4NjU3MjY1MSAgICAvKiA2NTUzNi9sb2coMikgKi8KLQotLyogRm9yIHNwZWVkIHRlc3RpbmcsIG5lZWQgdGhlIGludGVybmFsIGZ1bmN0aW9ucyB0b286ICovCi1zdGF0aWMgcG5nX3VpbnRfMzIgcG5nX2xvZzhiaXQodW5zaWduZWQgeCkKLXsKLSAgIGlmICh4ID4gMCkKLSAgICAgIHJldHVybiAocG5nX3VpbnRfMzIpZmxvb3IoLjUtbG9nKHgvMjU1LikqTDJJTlYpOwotCi0gICByZXR1cm4gMHhmZmZmZmZmZjsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyIHBuZ19sb2cxNmJpdChwbmdfdWludF8zMiB4KQotewotICAgaWYgKHggPiAwKQotICAgICAgcmV0dXJuIChwbmdfdWludF8zMilmbG9vciguNS1sb2coeC82NTUzNS4pKkwySU5WKTsKLQotICAgcmV0dXJuIDB4ZmZmZmZmZmY7Ci19Ci0KLXN0YXRpYyBwbmdfdWludF8zMiBwbmdfZXhwKHBuZ191aW50XzMyIHgpCi17Ci0gICByZXR1cm4gKHBuZ191aW50XzMyKWZsb29yKC41ICsgZXhwKHggKiAtTE4yKSAqIDB4ZmZmZmZmZmZVKTsKLX0KLQotc3RhdGljIHBuZ19ieXRlIHBuZ19leHA4Yml0KHBuZ191aW50XzMyIGxvZykKLXsKLSAgIHJldHVybiAocG5nX2J5dGUpZmxvb3IoLjUgKyBleHAobG9nICogLUxOMikgKiAyNTUpOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMTYgcG5nX2V4cDE2Yml0KHBuZ191aW50XzMyIGxvZykKLXsKLSAgIHJldHVybiAocG5nX3VpbnRfMTYpZmxvb3IoLjUgKyBleHAobG9nICogLUxOMikgKiA2NTUzNSk7Ci19Ci0jZW5kaWYgLyogRkxPQVRJTkdfQVJJVEhNRVRJQyAqLwotCi1pbnQgdmFsaWRhdGlvbl9nYW1tYShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICBkb3VibGUgZ2FtbWFbOV0gPSB7IDIuMiwgMS44LCAxLjUyLCAxLjQ1LCAxLiwgMS8xLjQ1LCAxLzEuNTIsIDEvMS44LCAxLzIuMiB9OwotICAgZG91YmxlIG1heGVycjsKLSAgIGludCBpLCBzaWxlbnQ9MCwgb25seWdhbW1hPTA7Ci0KLSAgIC8qIFNpbGVuY2UgdGhlIG91dHB1dCB3aXRoIC1zLCBqdXN0IHRlc3QgdGhlIGdhbW1hIGZ1bmN0aW9ucyB3aXRoIC1nOiAqLwotICAgd2hpbGUgKC0tYXJnYyA+IDApCi0gICAgICBpZiAoc3RyY21wKCorK2FyZ3YsICItcyIpID09IDApCi0gICAgICAgICBzaWxlbnQgPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWciKSA9PSAwKQotICAgICAgICAgb25seWdhbW1hID0gMTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBhcmd1bWVudCAlc1xuIiwgKmFyZ3YpOwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0KLSAgIGlmICghb25seWdhbW1hKQotICAgewotICAgICAgLyogRmlyc3QgdmFsaWRhdGUgdGhlIGxvZyBmdW5jdGlvbnM6ICovCi0gICAgICBtYXhlcnIgPSAwOwotICAgICAgZm9yIChpPTA7IGk8MjU2OyArK2kpCi0gICAgICB7Ci0gICAgICAgICBkb3VibGUgY29ycmVjdCA9IC1sb2coaS8yNTUuKS9sb2coMi4pKjY1NTM2OwotICAgICAgICAgZG91YmxlIGVycm9yID0gcG5nX2xvZzhiaXQoaSkgLSBjb3JyZWN0OwotCi0gICAgICAgICBpZiAoaSAhPSAwICYmIGZhYnMoZXJyb3IpID4gbWF4ZXJyKQotICAgICAgICAgICAgbWF4ZXJyID0gZmFicyhlcnJvcik7Ci0KLSAgICAgICAgIGlmIChpID09IDAgJiYgcG5nX2xvZzhiaXQoaSkgIT0gMHhmZmZmZmZmZiB8fAotICAgICAgICAgICAgIGkgIT0gMCAmJiBwbmdfbG9nOGJpdChpKSAhPSBmbG9vcihjb3JyZWN0Ky41KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiOC1iaXQgbG9nIGVycm9yOiAlZDogZ290ICV1LCBleHBlY3RlZCAlZlxuIiwKLSAgICAgICAgICAgICAgIGksIHBuZ19sb2c4Yml0KGkpLCBjb3JyZWN0KTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFzaWxlbnQpCi0gICAgICAgICBwcmludGYoIm1heGltdW0gOC1iaXQgbG9nIGVycm9yID0gJWZcbiIsIG1heGVycik7Ci0KLSAgICAgIG1heGVyciA9IDA7Ci0gICAgICBmb3IgKGk9MDsgaTw2NTUzNjsgKytpKQotICAgICAgewotICAgICAgICAgZG91YmxlIGNvcnJlY3QgPSAtbG9nKGkvNjU1MzUuKS9sb2coMi4pKjY1NTM2OwotICAgICAgICAgZG91YmxlIGVycm9yID0gcG5nX2xvZzE2Yml0KGkpIC0gY29ycmVjdDsKLQotICAgICAgICAgaWYgKGkgIT0gMCAmJiBmYWJzKGVycm9yKSA+IG1heGVycikKLSAgICAgICAgICAgIG1heGVyciA9IGZhYnMoZXJyb3IpOwotCi0gICAgICAgICBpZiAoaSA9PSAwICYmIHBuZ19sb2cxNmJpdChpKSAhPSAweGZmZmZmZmZmIHx8Ci0gICAgICAgICAgICAgaSAhPSAwICYmIHBuZ19sb2cxNmJpdChpKSAhPSBmbG9vcihjb3JyZWN0Ky41KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlcnJvciA+IC42OCkgLyogQnkgZXhwZXJpbWVudCBlcnJvciBpcyBsZXNzIHRoYW4gLjY4ICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjE2LWJpdCBsb2cgZXJyb3I6ICVkOiBnb3QgJXUsIGV4cGVjdGVkICVmIgotICAgICAgICAgICAgICAgICAgIiBlcnJvcjogJWZcbiIsIGksIHBuZ19sb2cxNmJpdChpKSwgY29ycmVjdCwgZXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIXNpbGVudCkKLSAgICAgICAgIHByaW50ZigibWF4aW11bSAxNi1iaXQgbG9nIGVycm9yID0gJWZcbiIsIG1heGVycik7Ci0KLSAgICAgIC8qIE5vdyBleHBvbmVudGlhdGlvbnMuICovCi0gICAgICBtYXhlcnIgPSAwOwotICAgICAgZm9yIChpPTA7IGk8PTB4ZmZmZmY7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSBjb3JyZWN0ID0gZXhwKC1pLzY1NTM2LiAqIGxvZygyLikpICogKDY1NTM2LiAqIDY1NTM2KTsKLSAgICAgICAgIGRvdWJsZSBlcnJvciA9IHBuZ19leHAoaSkgLSBjb3JyZWN0OwotCi0gICAgICAgICBpZiAoZmFicyhlcnJvcikgPiBtYXhlcnIpCi0gICAgICAgICAgICBtYXhlcnIgPSBmYWJzKGVycm9yKTsKLSAgICAgICAgIGlmIChmYWJzKGVycm9yKSA+IDE4ODMpIC8qIEJ5IGV4cGVyaW1lbnQuICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjMyLWJpdCBleHAgZXJyb3I6ICVkOiBnb3QgJXUsIGV4cGVjdGVkICVmIgotICAgICAgICAgICAgICAgICAgIiBlcnJvcjogJWZcbiIsIGksIHBuZ19leHAoaSksIGNvcnJlY3QsIGVycm9yKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFzaWxlbnQpCi0gICAgICAgICBwcmludGYoIm1heGltdW0gMzItYml0IGV4cCBlcnJvciA9ICVmXG4iLCBtYXhlcnIpOwotCi0gICAgICBtYXhlcnIgPSAwOwotICAgICAgZm9yIChpPTA7IGk8PTB4ZmZmZmY7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSBjb3JyZWN0ID0gZXhwKC1pLzY1NTM2LiAqIGxvZygyLikpICogMjU1OwotICAgICAgICAgZG91YmxlIGVycm9yID0gcG5nX2V4cDhiaXQoaSkgLSBjb3JyZWN0OwotCi0gICAgICAgICBpZiAoZmFicyhlcnJvcikgPiBtYXhlcnIpCi0gICAgICAgICAgICBtYXhlcnIgPSBmYWJzKGVycm9yKTsKLSAgICAgICAgIGlmIChmYWJzKGVycm9yKSA+IC41MDAwMikgLyogQnkgZXhwZXJpbWVudCAqLwotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICI4LWJpdCBleHAgZXJyb3I6ICVkOiBnb3QgJXUsIGV4cGVjdGVkICVmIgotICAgICAgICAgICAgICAgICAgIiBlcnJvcjogJWZcbiIsIGksIHBuZ19leHA4Yml0KGkpLCBjb3JyZWN0LCBlcnJvcik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghc2lsZW50KQotICAgICAgICAgcHJpbnRmKCJtYXhpbXVtIDgtYml0IGV4cCBlcnJvciA9ICVmXG4iLCBtYXhlcnIpOwotCi0gICAgICBtYXhlcnIgPSAwOwotICAgICAgZm9yIChpPTA7IGk8PTB4ZmZmZmY7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSBjb3JyZWN0ID0gZXhwKC1pLzY1NTM2LiAqIGxvZygyLikpICogNjU1MzU7Ci0gICAgICAgICBkb3VibGUgZXJyb3IgPSBwbmdfZXhwMTZiaXQoaSkgLSBjb3JyZWN0OwotCi0gICAgICAgICBpZiAoZmFicyhlcnJvcikgPiBtYXhlcnIpCi0gICAgICAgICAgICBtYXhlcnIgPSBmYWJzKGVycm9yKTsKLSAgICAgICAgIGlmIChmYWJzKGVycm9yKSA+IC41MjQpIC8qIEJ5IGV4cGVyaW1lbnQgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiMTYtYml0IGV4cCBlcnJvcjogJWQ6IGdvdCAldSwgZXhwZWN0ZWQgJWYiCi0gICAgICAgICAgICAgICAgICAiIGVycm9yOiAlZlxuIiwgaSwgcG5nX2V4cDE2Yml0KGkpLCBjb3JyZWN0LCBlcnJvcik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghc2lsZW50KQotICAgICAgICAgcHJpbnRmKCJtYXhpbXVtIDE2LWJpdCBleHAgZXJyb3IgPSAlZlxuIiwgbWF4ZXJyKTsKLSAgIH0gLyogIW9ubHlnYW1tYSAqLwotCi0gICAvKiBUZXN0IHRoZSBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24uICovCi0gICBmb3IgKGk9MDsgaTw5OyArK2kpCi0gICB7Ci0gICAgICB1bnNpZ25lZCBqOwotICAgICAgZG91YmxlIGcgPSBnYW1tYVtpXTsKLSAgICAgIHBuZ19maXhlZF9wb2ludCBnZnAgPSBmbG9vcihnICogUE5HX0ZQXzEgKyAuNSk7Ci0KLSAgICAgIGlmICghc2lsZW50KQotICAgICAgICAgcHJpbnRmKCJUZXN0IGdhbW1hICVmXG4iLCBnKTsKLQotICAgICAgbWF4ZXJyID0gMDsKLSAgICAgIGZvciAoaj0wOyBqPDI1NjsgKytqKQotICAgICAgewotICAgICAgICAgZG91YmxlIGNvcnJlY3QgPSBwb3coai8yNTUuLCBnKSAqIDI1NTsKLSAgICAgICAgIHBuZ19ieXRlIG91dCA9IHBuZ19nYW1tYV84Yml0X2NvcnJlY3QoaiwgZ2ZwKTsKLSAgICAgICAgIGRvdWJsZSBlcnJvciA9IG91dCAtIGNvcnJlY3Q7Ci0KLSAgICAgICAgIGlmIChmYWJzKGVycm9yKSA+IG1heGVycikKLSAgICAgICAgICAgIG1heGVyciA9IGZhYnMoZXJyb3IpOwotICAgICAgICAgaWYgKG91dCAhPSBmbG9vcihjb3JyZWN0Ky41KSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiOGJpdCAlZCBeICVmOiBnb3QgJWQgZXhwZWN0ZWQgJWYgZXJyb3IgJWZcbiIsCi0gICAgICAgICAgICAgICBqLCBnLCBvdXQsIGNvcnJlY3QsIGVycm9yKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFzaWxlbnQpCi0gICAgICAgICBwcmludGYoImdhbW1hICVmOiBtYXhpbXVtIDgtYml0IGVycm9yICVmXG4iLCBnLCBtYXhlcnIpOwotCi0gICAgICBtYXhlcnIgPSAwOwotICAgICAgZm9yIChqPTA7IGo8NjU1MzY7ICsraikKLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSBjb3JyZWN0ID0gcG93KGovNjU1MzUuLCBnKSAqIDY1NTM1OwotICAgICAgICAgcG5nX3VpbnRfMTYgb3V0ID0gcG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QoaiwgZ2ZwKTsKLSAgICAgICAgIGRvdWJsZSBlcnJvciA9IG91dCAtIGNvcnJlY3Q7Ci0KLSAgICAgICAgIGlmIChmYWJzKGVycm9yKSA+IG1heGVycikKLSAgICAgICAgICAgIG1heGVyciA9IGZhYnMoZXJyb3IpOwotICAgICAgICAgaWYgKGZhYnMoZXJyb3IpID4gMS42MikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiMTZiaXQgJWQgXiAlZjogZ290ICVkIGV4cGVjdGVkICVmIGVycm9yICVmXG4iLAotICAgICAgICAgICAgICAgaiwgZywgb3V0LCBjb3JyZWN0LCBlcnJvcik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghc2lsZW50KQotICAgICAgICAgcHJpbnRmKCJnYW1tYSAlZjogbWF4aW11bSAxNi1iaXQgZXJyb3IgJWZcbiIsIGcsIG1heGVycik7Ci0gICB9Ci0KLSAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWQUxJREFUSU9OIFRFU1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVmFyaW91cyB2YWxpZGF0aW9uIHJvdXRpbmVzIGFyZSBpbmNsdWRlZCBoZXJlaW4sIHRoZXkgcmVxdWlyZSBzb21lCi0gKiBkZWZpbml0aW9uIGZvciBwbmdfd2FybmluZyBhbmQgcG5nX2Vycm9yLCBzZWV0aW5ncyBvZiBWQUxJREFUSU9OOgotICoKLSAqIDE6IHZhbGlkYXRlcyB0aGUgQVNDSUkgdG8gZmxvYXRpbmcgcG9pbnQgY29udmVyc2lvbnMKLSAqIDI6IHZhbGlkYXRlcyBwbmdfbXVsZGl2Ci0gKiAzOiBhY2N1cmFjeSB0ZXN0IG9mIGZpeGVkIHBvaW50IGdhbW1hIHRhYmxlcwotICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgQ09VTlQgKDEwXjgpIHRha2VzIGFib3V0IDEgaG91ciBvbiBhIDFHSHogUGVudGl1bSBJVgotICogcHJvY2Vzc29yLgotICovCi0jZGVmaW5lIENPVU5UIDEwMDAwMDAwMDAKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgaW50IGNvdW50ID0gQ09VTlQ7Ci0KLSAgIHdoaWxlIChhcmdjID4gMSkKLSAgIHsKLSAgICAgIGlmIChhcmdjID4gMiAmJiBzdHJjbXAoYXJndlsxXSwgIi1jIikgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGNvdW50ID0gYXRvaShhcmd2WzJdKTsKLSAgICAgICAgIGFyZ2MgLT0gMjsKLSAgICAgICAgIGFyZ3YgKz0gMjsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICItdiIpID09IDApCi0gICAgICB7Ci0gICAgICAgICArK3ZlcmJvc2U7Ci0gICAgICAgICAtLWFyZ2M7Ci0gICAgICAgICArK2FyZ3Y7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIGJyZWFrOwotICAgfQotCi0gICBpZiAoY291bnQgPiAwICYmIGFyZ2MgPiAxKQotICAgewotICAgICAgaWYgKHN0cmNtcChhcmd2WzFdLCAiYXNjaWkiKSA9PSAwKQotICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25fYXNjaWlfdG9fZnAoY291bnQsIGFyZ2MtMSwgYXJndisxKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiY2hlY2tmcCIpID09IDApCi0gICAgICAgICByZXR1cm4gdmFsaWRhdGlvbl9jaGVja2ZwKGNvdW50LCBhcmdjLTEsIGFyZ3YrMSk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIm11bGRpdiIpID09IDApCi0gICAgICAgICByZXR1cm4gdmFsaWRhdGlvbl9tdWxkaXYoY291bnQsIGFyZ2MtMSwgYXJndisxKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZ2FtbWEiKSA9PSAwKQotICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25fZ2FtbWEoYXJnYy0xLCBhcmd2KzEpOwotICAgfQotCi0gICAvKiBCYWQgYXJndW1lbnQ6ICovCi0gICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICJ1c2FnZTogdGFyaXRoIFstdl0gWy1jIGNvdW50XSB7YXNjaWksbXVsZGl2LGdhbW1hfSBbYXJnc11cbiIpOwotICAgZnByaW50ZihzdGRlcnIsICIgYXJndW1lbnRzOiBhc2NpaSBbLWEgKGFsbCByZXN1bHRzKV0gWy1lIGVycm9yJSVdXG4iKTsKLSAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgY2hlY2tmcCBbLWwgbWF4LW51bWJlci1jaGFyc11cbiIpOwotICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICBtdWxkaXZcbiIpOwotICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICBnYW1tYSAtcyAoc2lsZW50KSAtZyAob25seSBnYW1tYTsgbm8gbG9nKVxuIik7Ci0gICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbGlidGVzdHMvdGltZXBuZy5jIGIvY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2ZkZTUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLyogdGltZXBuZy5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEzLDIwMTYgSm9obiBDdW5uaW5naGFtIEJvd2xlcgotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjIyIFtNYXkgMjYsIDIwMTZdCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogTG9hZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFBORyBmaWxlcyAoZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBvciwgaWYgdGhlcmUKLSAqIGFyZSBubyBhcmd1bWVudHMgb24gdGhlIGNvbW1hbmQgbGluZSwgZnJvbSBzdGRpbikgdGhlbiBydW4gYSB0aW1lIHRlc3QgYnkKLSAqIHJlYWRpbmcgZWFjaCBmaWxlIGJ5IHJvdyBvciBieSBpbWFnZSAocG9zc2libHkgd2l0aCB0cmFuc2Zvcm1zIGluIHRoZSBsYXR0ZXIKLSAqIGNhc2UpLiAgVGhlIG9ubHkgb3V0cHV0IGlzIGEgdGltZSBhcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBvZiBzZWNvbmRzIHdpdGgKLSAqIDkgZGVjaW1hbCBkaWdpdHMuCi0gKi8KLSNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDE5OTMwOUwgLyogZm9yIGNsb2NrX2dldHRpbWUgKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoaXMgdGVzdCBhZ2FpbnN0IHlvdXIgaW5zdGFsbGVkIGxpYnBuZywgcmF0aGVyCi0gKiB0aGFuIHRoZSBvbmUgYmVpbmcgYnVpbHQgaGVyZToKLSAqLwotI2lmZGVmIFBOR19GUkVFU1RBTkRJTkdfVEVTVFMKLSMgIGluY2x1ZGUgPHBuZy5oPgotI2Vsc2UKLSMgIGluY2x1ZGUgIi4uLy4uL3BuZy5oIgotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgdG8gc3VwcG9ydCBkaXJlY3QgY29tcGlsYXRpb24gb2YgdGhpcyBmaWxlIGFzIEMrKyAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jICBkZWZpbmUgdm9pZGNhc3QodHlwZSwgdmFsdWUpIHN0YXRpY19jYXN0PHR5cGU+KHZhbHVlKQotI2Vsc2UKLSMgIGRlZmluZSB2b2lkY2FzdCh0eXBlLCB2YWx1ZSkgKHZhbHVlKQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qICdDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQnIGlzIG9uZSBvZiB0aGUgY2xvY2sgdGltZXJzIGZvciBjbG9ja19nZXR0aW1lLiAgSXQKLSAqIG5lZWQgbm90IGJlIHN1cHBvcnRlZCBldmVuIHdoZW4gY2xvY2tfZ2V0dGltZSBpcyBhdmFpbGFibGUuICBJdCByZXR1cm5zIHRoZQotICogJ0NQVScgdGltZSB0aGUgcHJvY2VzcyBoYXMgY29uc3VtZWQuICAnQ1BVJyB0aW1lIGlzIGFzc3VtZWQgdG8gaW5jbHVkZSB0aW1lCi0gKiB3aGVuIHRoZSBDUFUgaXMgYWN0dWFsbHkgYmxvY2tlZCBieSBhIHBlbmRpbmcgY2FjaGUgZmlsbCBidXQgbm90IHRpbWUKLSAqIHdhaXRpbmcgZm9yIHBhZ2UgZmF1bHRzLiAgVGhlIGF0dGVtcHQgaXMgdG8gZ2V0IGEgbWVhc3VyZSBvZiB0aGUgYWN0dWFsIHRpbWUKLSAqIHRoZSBpbXBsZW1lbnRhdGlvbiB0YWtlcyB0byByZWFkIGEgUE5HIGlnbm9yaW5nIHRoZSBwb3RlbnRpYWxseSB2ZXJ5IGxhcmdlIElPCi0gKiBvdmVyaGVhZC4KLSAqLwotI2lmIGRlZmluZWQgKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCkgJiYgZGVmaW5lZChQTkdfU1RESU9fU1VQUE9SVEVEKSAmJlwKLSAgICBkZWZpbmVkKFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQpICYmXAotICAgIChQTkdfTElCUE5HX1ZFUiA+PSAxMDcwMCA/IGRlZmluZWQoUE5HX1JFQURfUE5HX1NVUFBPUlRFRCkgOlwKLSAgICAgZGVmaW5lZCAoUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQpICYmXAotICAgICBkZWZpbmVkKFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRCkpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBGSUxFICppbnB1dDsKLSAgIEZJTEUgKm91dHB1dDsKLX0gIGlvX2RhdGE7Ci0KLXN0YXRpYyBQTkdfQ0FMTEJBQ0sodm9pZCwgcmVhZF9hbmRfY29weSwKLSAgICAgIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGNiKSkKLXsKLSAgIGlvX2RhdGEgKmlvID0gKGlvX2RhdGEqKXBuZ19nZXRfaW9fcHRyKHBuZ19wdHIpOwotCi0gICBpZiAoZnJlYWQoYnVmZmVyLCBjYiwgMSwgaW8tPmlucHV0KSAhPSAxKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgIGlmIChmd3JpdGUoYnVmZmVyLCBjYiwgMSwgaW8tPm91dHB1dCkgIT0gMSkKLSAgIHsKLSAgICAgIHBlcnJvcigidGVtcG9yYXJ5IGZpbGUiKTsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAidGVtcG9yYXJ5IGZpbGUgUE5HIHdyaXRlIGZhaWxlZFxuIik7Ci0gICAgICBleGl0KDEpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZCByZWFkX2J5X3Jvdyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mb19wdHIsCi0gICAgICBGSUxFICp3cml0ZV9wdHIsIEZJTEUgKnJlYWRfcHRyKQotewotICAgLyogVGhlc2UgZG9uJ3QgZ2V0IGZyZWVkIG9uIGVycm9yLCB0aGlzIGlzIGZpbmU7IHRoZSBwcm9ncmFtIGltbWVkaWF0ZWx5Ci0gICAgKiBleGl0cy4KLSAgICAqLwotICAgcG5nX2J5dGVwIHJvdyA9IE5VTEwsIGRpc3BsYXkgPSBOVUxMOwotICAgaW9fZGF0YSBpb19jb3B5OwotCi0gICBpZiAod3JpdGVfcHRyICE9IE5VTEwpCi0gICB7Ci0gICAgICAvKiBTZXQgdXAgZm9yIGEgY29weSB0byB0aGUgdGVtcG9yYXJ5IGZpbGU6ICovCi0gICAgICBpb19jb3B5LmlucHV0ID0gcmVhZF9wdHI7Ci0gICAgICBpb19jb3B5Lm91dHB1dCA9IHdyaXRlX3B0cjsKLSAgICAgIHBuZ19zZXRfcmVhZF9mbihwbmdfcHRyLCAmaW9fY29weSwgcmVhZF9hbmRfY29weSk7Ci0gICB9Ci0KLSAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICB7Ci0gICAgICBwbmdfc2l6ZV90IHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICAgIHJvdyA9IHZvaWRjYXN0KHBuZ19ieXRlcCxtYWxsb2Mocm93Ynl0ZXMpKTsKLSAgICAgIGRpc3BsYXkgPSB2b2lkY2FzdChwbmdfYnl0ZXAsbWFsbG9jKHJvd2J5dGVzKSk7Ci0KLSAgICAgIGlmIChyb3cgPT0gTlVMTCB8fCBkaXNwbGF5ID09IE5VTEwpCi0gICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIk9PTSBhbGxvY2F0aW5nIHJvdyBidWZmZXJzIik7Ci0KLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzMyIGhlaWdodCA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgIGludCBwYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLSAgICAgICAgIGludCBwYXNzOwotCi0gICAgICAgICBwbmdfc3RhcnRfcmVhZF9pbWFnZShwbmdfcHRyKTsKLQotICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IHBhc3NlczsgKytwYXNzKQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMzIgeSA9IGhlaWdodDsKLQotICAgICAgICAgICAgLyogTk9URTogdGhpcyB0cmFzaGVzIHRoZSByb3cgZWFjaCB0aW1lOyBpbnRlcmxhY2UgaGFuZGxpbmcgd29uJ3QKLSAgICAgICAgICAgICAqIHdvcmssIGJ1dCB0aGlzIGF2b2lkcyBtZW1vcnkgdGhyYXNoaW5nIGZvciBzcGVlZCB0ZXN0aW5nIGFuZCBpcwotICAgICAgICAgICAgICogc29tZXdoYXQgcmVwcmVzZW50YXRpdmUgb2YgYW4gYXBwbGljYXRpb24gdGhhdCB3b3JrcyByb3ctYnktcm93LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAoeS0tID4gMCkKLSAgICAgICAgICAgICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCByb3csIGRpc3BsYXkpOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICAvKiBNYWtlIHN1cmUgdG8gcmVhZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlOiAqLwotICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgLyogRnJlZSB0aGlzIHVwOiAqLwotICAgZnJlZShyb3cpOwotICAgZnJlZShkaXNwbGF5KTsKLX0KLQotc3RhdGljIFBOR19DQUxMQkFDSyh2b2lkLCBub193YXJuaW5ncywgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZykpCi17Ci0gICAodm9pZClwbmdfcHRyOwotICAgKHZvaWQpd2FybmluZzsKLX0KLQotc3RhdGljIGludCByZWFkX3BuZyhGSUxFICpmcCwgcG5nX2ludF8zMiB0cmFuc2Zvcm1zLCBGSUxFICp3cml0ZV9maWxlKQotewotICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLDAsMCwKLSAgICAgICAgIG5vX3dhcm5pbmdzKTsKLSAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7Ci0KLSAgIGlmIChwbmdfcHRyID09IE5VTEwpCi0gICAgICByZXR1cm4gMDsKLQotICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgIHsKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSMgIGlmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRAotICAgICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzKHBuZ19wdHIsIDEvKmFsbG93ZWQqLyk7Ci0jICBlbmRpZgotICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi0gICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0KLSAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyBpbmZvIHN0cnVjdHVyZSIpOwotCi0gICBpZiAodHJhbnNmb3JtcyA8IDApCi0gICAgICByZWFkX2J5X3JvdyhwbmdfcHRyLCBpbmZvX3B0ciwgd3JpdGVfZmlsZSwgZnApOwotCi0gICBlbHNlCi0gICAgICBwbmdfcmVhZF9wbmcocG5nX3B0ciwgaW5mb19wdHIsIHRyYW5zZm9ybXMsIE5VTEwvKnBhcmFtcyovKTsKLQotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBteXRpbWUoc3RydWN0IHRpbWVzcGVjICp0KQotewotICAgLyogRG8gdGhlIHRpbWluZyB1c2luZyBjbG9ja19nZXR0aW1lIGFuZCB0aGUgcGVyLXByb2Nlc3MgdGltZXIuICovCi0gICBpZiAoIWNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCB0KSkKLSAgICAgIHJldHVybiAxOwotCi0gICBwZXJyb3IoIkNMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCIpOwotICAgZnByaW50ZihzdGRlcnIsICJ0aW1lcG5nOiBjb3VsZCBub3QgZ2V0IHRoZSB0aW1lXG4iKTsKLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBlcmZvcm1fb25lX3Rlc3QoRklMRSAqZnAsIGludCBuZmlsZXMsIHBuZ19pbnRfMzIgdHJhbnNmb3JtcykKLXsKLSAgIGludCBpOwotICAgc3RydWN0IHRpbWVzcGVjIGJlZm9yZSwgYWZ0ZXI7Ci0KLSAgIC8qIENsZWFyIG91dCBhbGwgZXJyb3JzOiAqLwotICAgcmV3aW5kKGZwKTsKLQotICAgaWYgKG15dGltZSgmYmVmb3JlKSkKLSAgIHsKLSAgICAgIGZvciAoaT0wOyBpPG5maWxlczsgKytpKQotICAgICAgewotICAgICAgICAgaWYgKHJlYWRfcG5nKGZwLCB0cmFuc2Zvcm1zLCBOVUxMLyp3cml0ZSovKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmZXJyb3IoZnApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcGVycm9yKCJ0ZW1wb3JhcnkgZmlsZSIpOwotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmaWxlICVkOiBlcnJvciByZWFkaW5nIFBORyBkYXRhXG4iLCBpKTsKLSAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwZXJyb3IoInRlbXBvcmFyeSBmaWxlIik7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZpbGUgJWQ6IGVycm9yIGZyb20gbGlicG5nXG4iLCBpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICBlbHNlCi0gICAgICByZXR1cm4gMDsKLQotICAgaWYgKG15dGltZSgmYWZ0ZXIpKQotICAgewotICAgICAgLyogV29yayBvdXQgdGhlIHRpbWUgZGlmZmVyZW5jZSBhbmQgcHJpbnQgaXQgLSB0aGlzIGlzIHRoZSBvbmx5IG91dHB1dCwKLSAgICAgICAqIHNvIGZsdXNoIGl0IGltbWVkaWF0ZWx5LgotICAgICAgICovCi0gICAgICB1bnNpZ25lZCBsb25nIHMgPSBhZnRlci50dl9zZWMgLSBiZWZvcmUudHZfc2VjOwotICAgICAgbG9uZyBucyA9IGFmdGVyLnR2X25zZWMgLSBiZWZvcmUudHZfbnNlYzsKLQotICAgICAgaWYgKG5zIDwgMCkKLSAgICAgIHsKLSAgICAgICAgIC0tczsKLSAgICAgICAgIG5zICs9IDEwMDAwMDAwMDA7Ci0KLSAgICAgICAgIGlmIChucyA8IDApCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRpbWVwbmc6IGJhZCBjbG9jayBmcm9tIGtlcm5lbFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJpbnRmKCIlbHUuJS45bGRcbiIsIHMsIG5zKTsKLSAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgaWYgKGZlcnJvcihzdGRvdXQpKQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0aW1lcG5nOiBlcnJvciB3cml0aW5nIG91dHB1dFxuIik7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gKi8KLSAgICAgIHJldHVybiAxOwotICAgfQotCi0gICBlbHNlCi0gICAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZGRfb25lX2ZpbGUoRklMRSAqZnAsIGNoYXIgKm5hbWUpCi17Ci0gICBGSUxFICppcCA9IGZvcGVuKG5hbWUsICJyYiIpOwotCi0gICBpZiAoaXAgIT0gTlVMTCkKLSAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIGZpbGUgdXNpbmcgbGlicG5nOyB0aGlzIGRldGVjdHMgZXJyb3JzIGFuZCBhbHNvIGRlYWxzIHdpdGgKLSAgICAgICAqIGZpbGVzIHdoaWNoIGNvbnRhaW4gZGF0YSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICAgICAqLwotICAgICAgaW50IG9rID0gMDsKLSAgICAgIGZwb3NfdCBwb3M7Ci0KLSAgICAgIGlmIChmZ2V0cG9zKGZwLCAmcG9zKSkKLSAgICAgIHsKLSAgICAgICAgIC8qIEZhdGFsIGVycm9yIHJlYWRpbmcgdGhlIHN0YXJ0OiAqLwotICAgICAgICAgcGVycm9yKCJ0ZW1wb3JhcnkgZmlsZSIpOwotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0ZW1wb3JhcnkgZmlsZSBmZ2V0cG9zIGVycm9yXG4iKTsKLSAgICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZWFkX3BuZyhpcCwgLTEvKmJ5IHJvdyovLCBmcC8qb3V0cHV0Ki8pKQotICAgICAgewotICAgICAgICAgaWYgKGZlcnJvcihpcCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwZXJyb3IobmFtZSk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiByZWFkIGVycm9yXG4iLCBuYW1lKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgb2sgPSAxOyAvKiByZWFkIG9rICovCi0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGZpbGUgbm90IGFkZGVkXG4iLCBuYW1lKTsKLQotICAgICAgKHZvaWQpZmNsb3NlKGlwKTsKLQotICAgICAgLyogQW4gZXJyb3IgaW4gdGhlIG91dHB1dCBpcyBmYXRhbDsgZXhpdCBpbW1lZGlhdGVseTogKi8KLSAgICAgIGlmIChmZXJyb3IoZnApKQotICAgICAgewotICAgICAgICAgcGVycm9yKCJ0ZW1wb3JhcnkgZmlsZSIpOwotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0ZW1wb3JhcnkgZmlsZSB3cml0ZSBlcnJvclxuIik7Ci0gICAgICAgICBleGl0KDEpOwotICAgICAgfQotCi0gICAgICBpZiAob2spCi0gICAgICAgICByZXR1cm4gMTsKLQotICAgICAgLyogRGlkIG5vdCByZWFkIHRoZSBmaWxlIHN1Y2Nlc3NmdWxseSwgc2ltcGx5IHJld2luZCB0aGUgdGVtcG9yYXJ5Ci0gICAgICAgKiBmaWxlLiAgVGhpcyBtdXN0IGhhcHBlbiBhZnRlciB0aGUgZmVycm9yIGNoZWNrIGFib3ZlIHRvIGF2b2lkIGNsZWFyaW5nCi0gICAgICAgKiB0aGUgZXJyb3IuCi0gICAgICAgKi8KLSAgICAgIGlmIChmc2V0cG9zKGZwLCAmcG9zKSkKLSAgICAgIHsKLSAgICAgICAgIHBlcnJvcigidGVtcG9yYXJ5IGZpbGUiKTsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGVtcG9yYXJ5IGZpbGUgZnNldHBvcyBlcnJvclxuIik7Ci0gICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICAvKiBmaWxlIG9wZW4gZXJyb3I6ICovCi0gICAgICBwZXJyb3IobmFtZSk7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuIGZhaWxlZFxuIiwgbmFtZSk7Ci0gICB9Ci0KLSAgIHJldHVybiAwOyAvKiBmaWxlIG5vdCBhZGRlZCAqLwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UoRklMRSAqZnApCi17Ci0gICBpZiAoZnAgIT0gTlVMTCkgZmNsb3NlKGZwKTsKLQotICAgZnByaW50ZihzdGRlcnIsCi0iVXNhZ2U6XG4iCi0iIHRpbWVwbmcgLS1hc3NlbWJsZSA8YXNzZW1ibHk+IHtmaWxlc31cbiIKLSIgIFJlYWQgdGhlIGZpbGVzIGludG8gPGFzc2VtYmx5Piwgb3V0cHV0IHRoZSBjb3VudC4gIE9wdGlvbnMgYXJlIGlnbm9yZWQuXG4iCi0iIHRpbWVwbmcgLS1kaXNzZW1ibGUgPGFzc2VtYmx5PiA8Y291bnQ+IFtvcHRpb25zXVxuIgotIiAgVGltZSA8Y291bnQ+IGZpbGVzIGZyb20gPGFzc2VtYmx5PiwgYWRkaXRpb25hbCBmaWxlcyBtYXkgbm90IGJlIGdpdmVuLlxuIgotIiBPdGhlcndpc2U6XG4iCi0iICBSZWFkIHRoZSBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIHRpbWUgdGhlIGRlY29kZVxuIgotIlRyYW5zZm9ybXM6XG4iCi0iICAtLWJ5LWltYWdlOiByZWFkIGJ5IGltYWdlIHdpdGggcG5nX3JlYWRfcG5nXG4iCi0iICAtLTx0cmFuc2Zvcm0+OiBpbXBsaWVzIGJ5LWltYWdlLCB1c2UgUE5HX1RSQU5TRk9STV88dHJhbnNmb3JtPlxuIgotIiAgT3RoZXJ3aXNlOiByZWFkIGJ5IHJvdyB1c2luZyBwbmdfcmVhZF9yb3cgKHRvIGEgc2luZ2xlIHJvdyBidWZmZXIpXG4iCi0gICAvKiBJU08gQzkwIHN0cmluZyBsZW5ndGggbWF4IDUwOSAqLyk7ZnByaW50ZihzdGRlcnIsCi0ie2ZpbGVzfTpcbiIKLSIgIFBORyBmaWxlcyB0byBjb3B5IGludG8gdGhlIGFzc2VtYmx5IGFuZCB0aW1lLiAgSW52YWxpZCBmaWxlcyBhcmUgc2tpcHBlZFxuIgotIiAgd2l0aCBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlcy4gIElmIG5vIGZpbGVzIGFyZSBnaXZlbiB0aGUgbGlzdCBvZiBmaWxlc1xuIgotIiAgaXMgcmVhZCBmcm9tIHN0ZGluIHdpdGggZWFjaCBmaWxlIG5hbWUgdGVybWluYXRlZCBieSBhIG5ld2xpbmVcbiIKLSJPdXRwdXQ6XG4iCi0iICBGb3IgLS1hc3NlbWJsZSB0aGUgb3V0cHV0IGlzIHRoZSBuYW1lIG9mIHRoZSBhc3NlbWJseSBmaWxlIGZvbGxvd2VkIGJ5IHRoZVxuIgotIiAgY291bnQgb2YgdGhlIGZpbGVzIGl0IGNvbnRhaW5zOyB0aGUgYXJndW1lbnRzIGZvciAtLWRpc3NlbWJsZS4gIE90aGVyd2lzZVxuIgotIiAgdGhlIG91dHB1dCBpcyB0aGUgdG90YWwgZGVjb2RlIHRpbWUgaW4gc2Vjb25kcy5cbiIpOwotCi0gICBleGl0KDk5KTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgaW50IG9rID0gMDsKLSAgIGludCBlcnIgPSAwOwotICAgaW50IG5maWxlcyA9IDA7Ci0gICBpbnQgdHJhbnNmb3JtcyA9IC0xOyAvKiBieSByb3cgKi8KLSAgIGNvbnN0IGNoYXIgKmFzc2VtYmx5ID0gTlVMTDsKLSAgIEZJTEUgKmZwOwotCi0gICBpZiAoYXJnYyA+IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWFzc2VtYmxlIikgPT0gMCkKLSAgIHsKLSAgICAgIC8qIEp1c3QgYnVpbGQgdGhlIHRlc3QgZmlsZSwgYXJndlsyXSBpcyB0aGUgZmlsZSBuYW1lLiAqLwotICAgICAgYXNzZW1ibHkgPSBhcmd2WzJdOwotICAgICAgZnAgPSBmb3Blbihhc3NlbWJseSwgIndiIik7Ci0gICAgICBpZiAoZnAgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHBlcnJvcihhc3NlbWJseSk7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRpbWVwbmcgLS1hc3NlbWJsZSAlczogY291bGQgbm90IG9wZW4gZm9yIHdyaXRlXG4iLAotICAgICAgICAgICAgICAgYXNzZW1ibHkpOwotICAgICAgICAgdXNhZ2UoTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIGFyZ3YgKz0gMjsKLSAgICAgIGFyZ2MgLT0gMjsKLSAgIH0KLQotICAgZWxzZSBpZiAoYXJnYyA+IDMgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWRpc3NlbWJsZSIpID09IDApCi0gICB7Ci0gICAgICBmcCA9IGZvcGVuKGFyZ3ZbMl0sICJyYiIpOwotCi0gICAgICBpZiAoZnAgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHBlcnJvcihhcmd2WzJdKTsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGltZXBuZyAtLWRpc3NlbWJsZSAlczogY291bGQgbm90IG9wZW4gZm9yIHJlYWRcbiIsCi0gICAgICAgICAgICAgICBhcmd2WzJdKTsKLSAgICAgICAgIHVzYWdlKE5VTEwpOwotICAgICAgfQotCi0gICAgICBuZmlsZXMgPSBhdG9pKGFyZ3ZbM10pOwotICAgICAgaWYgKG5maWxlcyA8PSAwKQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAidGltZXBuZyAtLWRpc3NlbWJsZSA8ZmlsZT4gPGNvdW50PjogJXMgaXMgbm90IGEgY291bnRcbiIsCi0gICAgICAgICAgICAgICBhcmd2WzNdKTsKLSAgICAgICAgIGV4aXQoOTkpOwotICAgICAgfQotI2lmZGVmIF9fQ09WRVJJVFlfXwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgbmZpbGVzICY9IFBOR19VSU5UXzMxX01BWDsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBhcmd2ICs9IDM7Ci0gICAgICBhcmdjIC09IDM7Ci0gICB9Ci0KLSAgIGVsc2UgLyogRWxzZSB1c2UgYSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgewotI2lmbmRlZiBfX0NPVkVSSVRZX18KLSAgICAgIGZwID0gdG1wZmlsZSgpOwotI2Vsc2UKLSAgICAgIC8qIEV4cGVyaW1lbnRhbC4gQ292ZXJpdHkgc2F5cyB0bXBmaWxlKCkgaXMgaW5zZWN1cmUgYmVjYXVzZSBpdAotICAgICAgICogZ2VuZXJhdGVzIHByZWRpY3RhYmxlIG5hbWVzLgotICAgICAgICoKLSAgICAgICAqIEl0IGlzIHBvc3NpYmxlIHRvIHNhdGlzZnkgQ292ZXJpdHkgYnkgdXNpbmcgbWtzdGVtcCgpOyBob3dldmVyLAotICAgICAgICogYW55IHBsYXRmb3JtIHN1cHBvcnRpbmcgbWtzdGVtcCgpIHVuZG91YnRlZGx5IGhhcyBhIHNlY3VyZSB0bXBmaWxlKCkKLSAgICAgICAqIGltcGxlbWVudGF0aW9uIGFzIHdlbGwsIGFuZCBkb2Vzbid0IG5lZWQgdGhlIGZpeC4gIE5vdGUgdGhhdAotICAgICAgICogdGhlIGZpeCB3b24ndCB3b3JrIG9uIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgbWtzdGVtcCgpLgotICAgICAgICoKLSAgICAgICAqIGh0dHBzOi8vd3d3LnNlY3VyZWNvZGluZy5jZXJ0Lm9yZy9jb25mbHVlbmNlL2Rpc3BsYXkvYy8KLSAgICAgICAqIEZJTzIxLUMuK0RvK25vdCtjcmVhdGUrdGVtcG9yYXJ5K2ZpbGVzK2luK3NoYXJlZCtkaXJlY3RvcmllcwotICAgICAgICogc2F5cyB0aGF0IG1vc3QgaGlzdG9yaWMgaW1wbGVtZW50YXRpb25zIG9mIHRtcGZpbGUoKSBwcm92aWRlCi0gICAgICAgKiBvbmx5IGEgbGltaXRlZCBudW1iZXIgb2YgcG9zc2libGUgdGVtcG9yYXJ5IGZpbGUgbmFtZXMKLSAgICAgICAqICh1c3VhbGx5IDI2KSBiZWZvcmUgZmlsZSBuYW1lcyBhcmUgcmVjeWNsZWQuIFRoYXQgYXJ0aWNsZSBhbHNvCi0gICAgICAgKiBwcm92aWRlcyBhIHNlY3VyZSBzb2x1dGlvbiB0aGF0IHVuZm9ydHVuYXRlbHkgZGVwZW5kcyB1cG9uIG1rc3RlbXAoKS4KLSAgICAgICAqLwotICAgICAgY2hhciB0bXBmaWxlW10gPSAidGltZXBuZy1YWFhYWFgiOwotICAgICAgaW50IGZpbGVkZXM7Ci0gICAgICB1bWFzaygwMTc3KTsKLSAgICAgIGZpbGVkZXMgPSBta3N0ZW1wKHRtcGZpbGUpOwotICAgICAgaWYgKGZpbGVkZXMgPCAwKQotICAgICAgICBmcCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZwID0gZmRvcGVuKGZpbGVkZXMsIncrIik7Ci0gICAgICAgIC8qIEhpZGUgdGhlIGZpbGVuYW1lIGltbWVkaWF0ZWx5IGFuZCBlbnN1cmUgdGhhdCB0aGUgZmlsZSBkb2VzCi0gICAgICAgICAqIG5vdCBleGlzdCBhZnRlciB0aGUgcHJvZ3JhbSBlbmRzCi0gICAgICAgICAqLwotICAgICAgICAodm9pZCkgdW5saW5rKHRtcGZpbGUpOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChmcCA9PSBOVUxMKQotICAgICAgewotICAgICAgICAgcGVycm9yKCJ0bXBmaWxlIik7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRpbWVwbmc6IGNvdWxkIG5vdCBvcGVuIHRoZSB0ZW1wb3JhcnkgZmlsZVxuIik7Ci0gICAgICAgICBleGl0KDEpOyAvKiBub3QgYSB1c2VyIGVycm9yICovCi0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIEhhbmRsZSB0aGUgdHJhbnNmb3JtczogKi8KLSAgIHdoaWxlIChhcmdjID4gMSAmJiBhcmd2WzFdWzBdID09ICctJyAmJiBhcmd2WzFdWzFdID09ICctJykKLSAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm9wdCA9ICorK2FyZ3YgKyAyOwotCi0gICAgICAtLWFyZ2M7Ci0KLSAgICAgIC8qIFRyYW5zZm9ybXMgdHVybiBvbiB0aGUgYnktaW1hZ2UgcHJvY2Vzc2luZyBhbmQgbWF5YmUgc2V0IHNvbWUKLSAgICAgICAqIHRyYW5zZm9ybXM6Ci0gICAgICAgKi8KLSAgICAgIGlmICh0cmFuc2Zvcm1zID09IC0xKQotICAgICAgICAgdHJhbnNmb3JtcyA9IFBOR19UUkFOU0ZPUk1fSURFTlRJVFk7Ci0KLSAgICAgIGlmIChzdHJjbXAob3B0LCAiYnktaW1hZ2UiKSA9PSAwKQotICAgICAgewotICAgICAgICAgLyogaGFuZGxlZCBhYm92ZSAqLwotICAgICAgfQotCi0jICAgICAgICBkZWZpbmUgT1BUKG5hbWUpIGVsc2UgaWYgKHN0cmNtcChvcHQsICNuYW1lKSA9PSAwKVwKLSAgICAgICAgIHRyYW5zZm9ybXMgfD0gUE5HX1RSQU5TRk9STV8gIyMgbmFtZQotCi0gICAgICBPUFQoU1RSSVBfMTYpOwotICAgICAgT1BUKFNUUklQX0FMUEhBKTsKLSAgICAgIE9QVChQQUNLSU5HKTsKLSAgICAgIE9QVChQQUNLU1dBUCk7Ci0gICAgICBPUFQoRVhQQU5EKTsKLSAgICAgIE9QVChJTlZFUlRfTU9OTyk7Ci0gICAgICBPUFQoU0hJRlQpOwotICAgICAgT1BUKEJHUik7Ci0gICAgICBPUFQoU1dBUF9BTFBIQSk7Ci0gICAgICBPUFQoU1dBUF9FTkRJQU4pOwotICAgICAgT1BUKElOVkVSVF9BTFBIQSk7Ci0gICAgICBPUFQoU1RSSVBfRklMTEVSKTsKLSAgICAgIE9QVChTVFJJUF9GSUxMRVJfQkVGT1JFKTsKLSAgICAgIE9QVChTVFJJUF9GSUxMRVJfQUZURVIpOwotICAgICAgT1BUKEdSQVlfVE9fUkdCKTsKLSAgICAgIE9QVChFWFBBTkRfMTYpOwotICAgICAgT1BUKFNDQUxFXzE2KTsKLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0aW1lcG5nICVzOiB1bnJlY29nbml6ZWQgdHJhbnNmb3JtXG4iLCBvcHQpOwotICAgICAgICAgdXNhZ2UoZnApOwotICAgICAgfQotICAgfQotCi0gICAvKiBIYW5kbGUgdGhlIGZpbGVzOiAqLwotICAgaWYgKGFyZ2MgPiAxICYmIG5maWxlcyA+IDApCi0gICAgICB1c2FnZShmcCk7IC8qIEFkZGl0aW9uYWwgZmlsZXMgbm90IHZhbGlkIHdpdGggLS1kaXNzZW1ibGUgKi8KLQotICAgZWxzZSBpZiAoYXJnYyA+IDEpCi0gICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpPTE7IGk8YXJnYzsgKytpKQotICAgICAgewotICAgICAgICAgaWYgKG5maWxlcyA9PSBJTlRfTUFYKQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc2tpcHBlZCwgdG9vIG1hbnkgZmlsZXNcbiIsIGFyZ3ZbaV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgaWYgKGFkZF9vbmVfZmlsZShmcCwgYXJndltpXSkpCi0gICAgICAgICAgICArK25maWxlczsKLSAgICAgIH0KLSAgIH0KLQotICAgZWxzZSBpZiAobmZpbGVzID09IDApIC8qIFJlYWQgZnJvbSBzdGRpbiB3aXRob291dCAtLWRpc3NlbWJsZSAqLwotICAgewotICAgICAgY2hhciBmaWxlbmFtZVtGSUxFTkFNRV9NQVgrMV07Ci0KLSAgICAgIHdoaWxlIChmZ2V0cyhmaWxlbmFtZSwgRklMRU5BTUVfTUFYKzEsIHN0ZGluKSkKLSAgICAgIHsKLSAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotCi0gICAgICAgICBpZiAoZmlsZW5hbWVbbGVuLTFdID09ICdcbicpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlbmFtZVtsZW4tMV0gPSAwOwotICAgICAgICAgICAgaWYgKG5maWxlcyA9PSBJTlRfTUFYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc2tpcHBlZCwgdG9vIG1hbnkgZmlsZXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChhZGRfb25lX2ZpbGUoZnAsIGZpbGVuYW1lKSkKLSAgICAgICAgICAgICAgICsrbmZpbGVzOwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRpbWVwbmc6IGZpbGUgbmFtZSB0b28gbG9uZzogLi4uJXNcbiIsCi0gICAgICAgICAgICAgICBmaWxlbmFtZStsZW4tMzIpOwotICAgICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZmVycm9yKHN0ZGluKSkKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidGltZXBuZzogc3RkaW46IHJlYWQgZXJyb3JcbiIpOwotICAgICAgICAgZXJyID0gMTsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogUGVyZm9ybSB0aGUgdGVzdCwgb3IgcHJvZHVjZSB0aGUgLS1hc3NlbWJsZSBvdXRwdXQ6ICovCi0gICBpZiAoIWVycikKLSAgIHsKLSAgICAgIGlmIChuZmlsZXMgPiAwKQotICAgICAgewotICAgICAgICAgaWYgKGFzc2VtYmx5ICE9IE5VTEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmZsdXNoKGZwKSAmJiAhZmVycm9yKGZwKSAmJiBmY2xvc2UoZnApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcGVycm9yKGFzc2VtYmx5KTsKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNsb3NlIGZhaWxlZFxuIiwgYXNzZW1ibHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGYoIiVzICVkXG4iLCBhc3NlbWJseSwgbmZpbGVzKTsKLSAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgICAgICAgb2sgPSAhZmVycm9yKHN0ZG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG9rID0gcGVyZm9ybV9vbmVfdGVzdChmcCwgbmZpbGVzLCB0cmFuc2Zvcm1zKTsKLSAgICAgICAgICAgICh2b2lkKWZjbG9zZShmcCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIHVzYWdlKGZwKTsKLSAgIH0KLQotICAgZWxzZQotICAgICAgKHZvaWQpZmNsb3NlKGZwKTsKLQotICAgLyogRXhpdCBjb2RlIDAgb24gc3VjY2Vzcy4gKi8KLSAgIHJldHVybiBvayA9PSAwOwotfQotI2Vsc2UgLyogIXN1ZmZpY2llbnQgc3VwcG9ydCAqLwotaW50IG1haW4odm9pZCkgeyByZXR1cm4gNzc7IH0KLSNlbmRpZiAvKiAhc3VmZmljaWVudCBzdXBwb3J0ICovCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbmltL1JFQURNRSBiL2NvbnRyaWIvcG5nbWluaW0vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTdmZTM1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWluaW0vUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0KLVRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgUE5HX1VTRVJfQ09ORklHLCBwbmd1c3IuaCBhbmQgcG5ndXNyLmRmYQotdG8gYnVpbGQgbWluaW1hbCBkZWNvZGVyLCBlbmNvZGVyLCBhbmQgcHJvZ3Jlc3NpdmUgcmVhZGVyIGFwcGxpY2F0aW9ucy4KLQotU2VlIHRoZSBpbmRpdmlkdWFsIFJFQURNRSBhbmQgcG5ndXNyLmRmYSBmaWxlcyBmb3IgbW9yZSBleHBsYW5hdGlvbi4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9SRUFETUUgYi9jb250cmliL3BuZ21pbmltL2RlY29kZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk3OWZjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1UaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFBOR19VU0VSX0NPTkZJRywgcG5ndXNyLmggYW5kIHBuZ3Vzci5kZmEKLQotVGhlIG1ha2VmaWxlIGJ1aWxkcyBhIG1pbmltYWwgcmVhZC1vbmx5IGRlY29kZXIgd2l0aCBlbWJlZGRlZCBsaWJwbmcKLWFuZCB6bGliLgotCi1TcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgemxpYiBzb3VyY2UgKDEuMi4xIG9yIGxhdGVyKSBhcyBaTElCU1JDCi1vbiB0aGUgbWFrZSBjb21tYW5kIGxpbmUuCi0KLUlmIHlvdSBwcmVmZXIgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyaWVzLCBnbyB0byBjb250cmliL3BuZ21pbnVzCi1hbmQgYnVpbGQgdGhlIHBuZzJwbm0gYXBwbGljYXRpb24gdGhlcmUuCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbmltL2RlY29kZXIvbWFrZWZpbGUgYi9jb250cmliL3BuZ21pbmltL2RlY29kZXIvbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhY2YzYzEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL21ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIFBuZ01pbnVzIChwbmdtMnBubSkKLSMgTGludXggLyBVbml4Ci0KLSNDQz1jYwotQ0M9Z2NjCi1MRD0kKENDKQotCi0jIElmIGF3ayBmYWlscyB0cnkKLSMgbWFrZSBBV0s9bmF3awotCi0jIElmIGNwcCBmYWlscyB0cnkKLSMgbWFrZSBDUFA9L2xpYi9jcHAKLQotUk09cm0gLWYKLUNPUFk9Y3AKLQotQ1BQRkxBR1M9LUkuIC1EUE5HX1VTRVJfQ09ORklHIC1ETk9fR1pDT01QUkVTUyAtRFpfU09MTyAtRE5PX0daSVAKLUNGTEFHUz0tTzEgLVdhbGwKLQotQz0uYwotTz0ubwotTD0uYQotRT0KLQotIyBXaGVyZSB0byBmaW5kIHRoZSBzb3VyY2UgY29kZToKLVBOR1NSQyA9Li4vLi4vLi4KLVpMSUJTUkM9JChQTkdTUkMpLy4uL3psaWIKLVBST0dTUkM9JChQTkdTUkMpL2NvbnRyaWIvcG5nbWludXMKLQotIyBabGliIChtaW5pbWFsIGluZmxhdGUgcmVxdWlyZW1lbnRzIC0gY3JjMzIgaXMgdXNlZCBieSBsaWJwbmcpCi0jIHp1dGlsIGNhbiBiZSBlbGltaW5hdGVkIGlmIHlvdSBwcm92aWRlIHlvdXIgb3duIHpjYWxsb2MgYW5kIHpjZnJlZQotWlNSQ1MgID0gYWRsZXIzMiQoQykgY3JjMzIkKEMpIFwKLQkgaW5mZmFzdCQoQykgaW5mbGF0ZSQoQykgaW5mdHJlZXMkKEMpIFwKLQkgenV0aWwkKEMpCi0KLSMgU3RhbmRhcmQgaGVhZGVycwotWkggICAgID0gemxpYi5oIGNyYzMyLmggaW5mZmFzdC5oIGluZmZpeGVkLmggXAotCSBpbmZsYXRlLmggaW5mdHJlZXMuaCB6dXRpbC5oCi0KLSMgTWFjaGluZSBnZW5lcmF0ZWQgaGVhZGVycwotWkNPTkYgID0gemNvbmYuaAotCi0jIEhlYWRlcnMgY2FsbGVycyB1c2UKLVpJTkMgICA9IHpsaWIuaCAkKFpDT05GKQotCi0jIEhlYWRlcnMgdGhlIFpsaWIgc291cmNlIHVzZXMKLVpIRFJTICA9ICQoWkgpICQoWkNPTkYpCi0KLVpPQkpTICA9IGFkbGVyMzIkKE8pIGNyYzMyJChPKSBcCi0JIGluZmZhc3QkKE8pIGluZmxhdGUkKE8pIGluZnRyZWVzJChPKSBcCi0JIHp1dGlsJChPKQotCi0jIGxpYnBuZwotUE5HU1JDUz1wbmckKEMpIHBuZ2Vycm9yJChDKSBwbmdnZXQkKEMpIHBuZ21lbSQoQykgXAotCXBuZ3JlYWQkKEMpIHBuZ3JpbyQoQykgcG5ncnRyYW4kKEMpIHBuZ3J1dGlsJChDKSBcCi0JcG5nc2V0JChDKSBwbmd0cmFucyQoQykKLQkKLSMgU3RhbmRhcmQgaGVhZGVycwotUE5HSCAgID1wbmcuaCBwbmdjb25mLmggcG5nZGVidWcuaCBwbmdpbmZvLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oCi0KLSMgTWFjaGluZSBnZW5lcmF0ZWQgaGVhZGVycwotUE5HQ09ORj1wbmdsaWJjb25mLmgKLQotIyBIZWFkZXJzIGNhbGxlcnMgdXNlCi1QTkdJTkM9IHBuZy5oIHBuZ2NvbmYuaCBwbmd1c3IuaCAkKFBOR0NPTkYpCi0KLSMgSGVhZGVycyB0aGUgUE5HIGxpYnJhcnkgdXNlcwotUE5HSERSUz0kKFBOR0gpICQoUE5HQ09ORikgcG5ndXNyLmgKLQotUE5HT0JKUz1wbmckKE8pIHBuZ2Vycm9yJChPKSBwbmdnZXQkKE8pIHBuZ21lbSQoTykgXAotCXBuZ3JlYWQkKE8pIHBuZ3JpbyQoTykgcG5ncnRyYW4kKE8pIHBuZ3J1dGlsJChPKSBcCi0JcG5nc2V0JChPKSBwbmd0cmFucyQoTykKLQotUFJPR1NSQ1M9IHBuZ20ycG5tJChDKQotUFJPR0hEUlM9Ci1QUk9HRE9DUz0KLVBST0dPQkpTPSBwbmdtMnBubSQoTykKLQotT0JKUyAgICA9ICQoUFJPR09CSlMpICQoUE5HT0JKUykgJChaT0JKUykKLQotIyBpbXBsaWNpdCBtYWtlIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBub3RlOiBkZXBlbmRlbmNpZXMgZG8gbm90IHdvcmsgb24gaW1wbGljaXQgcnVsZSBsaW5lcwotLmMkKE8pOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAotCi0jIGRlcGVuZGVuY2llcwotCi1hbGw6IHBuZ20ycG5tJChFKQotCi1wbmdtMnBubSQoRSk6ICQoT0JKUykKLQkkKExEKSAtbyBwbmdtMnBubSQoRSkgJChPQkpTKQotCi0jIFRoZSBERkFfWFRSQSBzZXR0aW5nIHR1cm5zIGFsbCBsaWJwbmcgb3B0aW9ucyBvZmYgdGhlbgotIyB0dXJucyBvbiB0aG9zZSByZXF1aXJlZCBmb3IgdGhpcyBtaW5pbWFsIGJ1aWxkLgotIyBUaGUgQ1BQX0ZMQUdTIHNldHRpbmcgY2F1c2VzIHBuZ3Vzci5oIHRvIGJlIGluY2x1ZGVkIGluCi0jIGJvdGggdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaCBhbmQsIHN1YnNlcXVlbnRseSwgd2hlbgotIyBidWlsZGluZyBsaWJwbmcgaXRzZWxmLgotJChQTkdDT05GKTogJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChaSClcCi0JJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5kZmEgXAotCSQoUE5HU1JDKS9zY3JpcHRzL29wdGlvbnMuYXdrIHBuZ3Vzci5oIHBuZ3Vzci5kZmEKLQkkKFJNKSBwbmdsaWJjb25mLmggcG5nbGliY29uZi5kZm4KLQkkKE1BS0UpIC1mICQoUE5HU1JDKS9zY3JpcHRzL3BuZ2xpYmNvbmYubWFrICQoTUFLRUZMQUdTKVwKLQkgICAgc3JjZGlyPSQoUE5HU1JDKSBDUFBGTEFHUz0iLURQTkdfVVNFUl9DT05GSUcgLUkuIlwKLQkgICAgREZBX1hUUkE9InBuZ3Vzci5kZmEiICRACi0KLWNsZWFuOgotCSQoTUFLRSkgLWYgJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChNQUtFRkxBR1MpXAotCSAgICBzcmNkaXI9JChQTkdTUkMpIGNsZWFuCi0JJChSTSkgcG5nbTJwbm0kKE8pCi0JJChSTSkgcG5nbTJwbm0kKEUpCi0JJChSTSkgJChPQkpTKQotCi0jIGRpc3RjbGVhbiBhbHNvIHJlbW92ZXMgdGhlIGNvcGllZCBzb3VyY2UgYW5kIGhlYWRlcnMKLWRpc3RjbGVhbjogY2xlYW4KLQkkKFJNKSAtciBzY3JpcHRzICMgaGlzdG9yaWNhbCByZWFzb25zCi0JJChSTSkgJChQTkdTUkNTKSAkKFBOR0gpCi0JJChSTSkgJChaU1JDUykgJChaSCkgJChaQ09ORikKLQkkKFJNKSAkKFBST0dTUkNTKSAkKFBST0dIRFJTKSAkKFBST0dET0NTKQotCi0jIEhlYWRlciBmaWxlIGRlcGVuZGVuY2llczoKLSQoUFJPR09CSlMpOiAkKFBST0dIRFJTKSAkKFBOR0lOQykgJChaSU5DKQotJChQTkdPQkpTKTogJChQTkdIRFJTKSAkKFpJTkMpCi0kKFpPQkpTKTogJChaSERSUykKLQotIyBHYXRoZXIgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHJlc3BlY3RpdmUgZGlyZWN0b3JpZXMKLSQoUE5HU1JDUykgJChQTkdIKTogJChQTkdTUkMpLyRACi0JJChSTSkgJEAKLQkkKENPUFkpICQoUE5HU1JDKS8kQCAkQAotCi0jIE5vIGRlcGVuZGVuY3kgb24gdGhlIFpMSUJTUkMgdGFyZ2V0IHNvIHRoYXQgaXQgb25seSBuZWVkcwotIyB0byBiZSBzcGVjaWZpZWQgb25jZS4KLSQoWlNSQ1MpICQoWkgpOgotCSQoUk0pICRACi0JJChDT1BZKSAkKFpMSUJTUkMpLyRAICRACi0KLSMgVGhlIHVuY29uZmlndXJlZCB6Y29uZi5oIHZhcmllcyBpbiBuYW1lIGFjY29yZGluZyB0byB0aGUKLSMgemxpYiByZWxlYXNlCi0kKFpDT05GKToKLQkkKFJNKSAkQAotCUBmb3IgZiBpbiB6Y29uZi5oLmluIHpjb25mLmluLmggemNvbmYuaDsgZG9cCi0JICAgIHRlc3QgLXIgJChaTElCU1JDKS8kJGYgJiZcCi0JICAgIGVjaG8gJChDT1BZKSAkKFpMSUJTUkMpLyQkZiAkQCAmJlwKLQkgICAgJChDT1BZKSAkKFpMSUJTUkMpLyQkZiAkQCAmJiBleGl0IDA7XAotCWRvbmU7IGVjaG8gY29weTogJChaTElCU1JDKS96Y29uZi5oIG5vdCBmb3VuZDsgZXhpdCAxCi0KLXBuZ20ycG5tLmM6ICQoUFJPR1NSQykvcG5nMnBubS5jCi0JJChSTSkgJEAKLQkkKENPUFkpICQoUFJPR1NSQykvcG5nMnBubS5jICRACi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBwbmdtMnBubQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdtaW5pbS9kZWNvZGVyL3BuZ3Vzci5kZmEgYi9jb250cmliL3BuZ21pbmltL2RlY29kZXIvcG5ndXNyLmRmYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0MDI3Mi4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbmltL2RlY29kZXIvcG5ndXNyLmRmYQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMgcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuZGZhCi0jCi0jIENvcHlyaWdodCAoYykgMjAxMC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgRmlyc3QgYWxsIHRoZSBidWlsZCBvcHRpb25zIG9mZjoKLQotZXZlcnl0aGluZyA9IG9mZgotCi0jIEFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHNvbWUgcmVhZCBjb2RlLiBUaGlzIGV4YW1wbGUgc3dpdGNoZXMKLSMgb24gdGhlIHNlcXVlbnRpYWwgcmVhZCBjb2RlIChzZWUgLi4vcHJlYWRlciBmb3IgYSBwcm9ncmVzc2l2ZQotIyByZWFkIGV4YW1wbGUpLgotCi1vcHRpb24gU0VRVUVOVElBTF9SRUFEIG9uCi0KLSMgWW91IG11c3QgY2hvb3NlIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWM6Ci0jIG9wdGlvbiBGTE9BVElOR19QT0lOVCBvbgotCi1vcHRpb24gRklYRURfUE9JTlQgb24KLQotIyBZb3UgbXVzdCBjaG9zZSB0aGUgaW50ZXJuYWwgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gb3IgdG8KLSMgdXNlIHRoZSBzeXN0ZW0gZmxvYXRpbmcgcG9pbnQuICBUaGUgbGF0dGVyIGlzIGNvbnNpZGVyYWJseQotIyBzbWFsbGVyIChieSBhYm91dCAxa2J5dGUgb24gYW4geDg2IHN5c3RlbSk6Ci0jIG9wdGlvbiBGTE9BVElOR19BUklUSE1FVElDIG9uCi0KLW9wdGlvbiBGTE9BVElOR19BUklUSE1FVElDIG9mZgotCi0jIFlvdXIgcHJvZ3JhbSB3aWxsIHByb2JhYmx5IG5lZWQgb3RoZXIgb3B0aW9ucy4gIFRoZSBleGFtcGxlCi0jIHByb2dyYW0gaGVyZSwgcG5nbTJwbm0sIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcuICBUYWtlIGEgbG9vawotIyBhdCBwbmdsaWJjb25mLmggdG8gZmluZCBvdXQgdGhlIGZ1bGwgc2V0IG9mIHdoYXQgaGFzIHRvIGJlCi0jIGVuYWJsZWQgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHdvcmsuCi0KLW9wdGlvbiBTRVRKTVAgb24KLW9wdGlvbiBTVERJTyBvbgotb3B0aW9uIFJFQURfRVhQQU5EIG9uCi1vcHRpb24gUkVBRF9TVFJJUF8xNl9UT184IG9uCi1vcHRpb24gVVNFUl9MSU1JVFMgb24KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaCBiL2NvbnRyaWIvcG5nbWluaW0vZGVjb2Rlci9wbmd1c3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkNzg5MC4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbmltL2RlY29kZXIvcG5ndXNyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBtaW5yZHBuZ2NvbmYuaDogaGVhZGVycyB0byBtYWtlIGEgbWluaW1hbCBwbmctcmVhZC1vbmx5IGxpYnJhcnkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqCi0gKiBEZXJpdmVkIGZyb20gcG5nY3J1c2guaCwgQ29weXJpZ2h0IDE5OTgtMjAwNywgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKi8KLQotI2lmbmRlZiBNSU5SRFBOR0NPTkZfSAotI2RlZmluZSBNSU5SRFBOR0NPTkZfSAotCi0vKiBUbyBpbmNsdWRlIHBuZ3Vzci5oIHNldCAtRFBOR19VU0VSX0NPTkZJRyBpbiBDUFBGTEFHUyAqLwotCi0vKiBMaXN0IG9wdGlvbnMgdG8gdHVybiBvZmYgZmVhdHVyZXMgb2YgdGhlIGJ1aWxkIHRoYXQgZG8gbm90Ci0gKiBhZmZlY3QgdGhlIEFQSSAoc28gYXJlIG5vdCByZWNvcmRlZCBpbiBwbmdsaWJjb25mLmgpCi0gKi8KLQotI2RlZmluZSBQTkdfQUxJR05fVFlQRSBQTkdfQUxJR05fTk9ORQotCi0jZW5kaWYgLyogTUlOUkRQTkdDT05GX0ggKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9SRUFETUUgYi9jb250cmliL3BuZ21pbmltL2VuY29kZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ5YTY0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1UaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFBOR19VU0VSX0NPTkZJRyBhbmQgcG5ndXNyLmgKLQotVGhlIG1ha2VmaWxlIGJ1aWxkcyBhIG1pbmltYWwgd3JpdGUtb25seSBlbmNvZGVyIHdpdGggZW1iZWRkZWQgbGlicG5nCi1hbmQgemxpYi4KLQotU3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIHpsaWIgc291cmNlICgxLjIuMSBvciBsYXRlcikgYXMgWkxJQlNSQwotb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lLgotCi1JZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgc2hhcmVkIGxpYnJhcmllcywgZ28gdG8gY29udHJpYi9wbmdtaW51cwotYW5kIGJ1aWxkIHRoZSBwbm0ycG5nIGFwcGxpY2F0aW9uIHRoZXJlLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL21ha2VmaWxlIGIvY29udHJpYi9wbmdtaW5pbS9lbmNvZGVyL21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWIyMDVjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBQbmdNaW51cyAocG5tMnBuZ20pCi0jIExpbnV4IC8gVW5peAotCi0jQ0M9Y2MKLUNDPWdjYwotTEQ9JChDQykKLQotIyBJZiBhd2sgZmFpbHMgdHJ5Ci0jIG1ha2UgQVdLPW5hd2sKLQotIyBJZiBjcHAgZmFpbHMgdHJ5Ci0jIG1ha2UgQ1BQPS9saWIvY3BwCi0KLVJNPXJtIC1mCi1DT1BZPWNwCi0KLUNQUEZMQUdTPS1JLiAtRFBOR19VU0VSX0NPTkZJRyAtRE5PX0daQ09NUFJFU1MgLURaX1NPTE8gLUROT19HWklQCi1DRkxBR1M9LU8xIC1XYWxsCi0KLUM9LmMKLU89Lm8KLUw9LmEKLUU9Ci0KLSMgV2hlcmUgdG8gZmluZCB0aGUgc291cmNlIGNvZGU6Ci1QTkdTUkMgPS4uLy4uLy4uCi1aTElCU1JDPSQoUE5HU1JDKS8uLi96bGliCi1QUk9HU1JDPSQoUE5HU1JDKS9jb250cmliL3BuZ21pbnVzCi0KLSMgWmxpYgotWlNSQ1MgID0gYWRsZXIzMiQoQykgY29tcHJlc3MkKEMpIGNyYzMyJChDKSBkZWZsYXRlJChDKSBcCi0JIHRyZWVzJChDKSB6dXRpbCQoQykKLQotIyBTdGFuZGFyZCBoZWFkZXJzCi0jWkggICAgID0gemxpYi5oIGNyYzMyLmggZGVmbGF0ZS5oIHRyZWVzLmggenV0aWwuaAotWkggICAgID0gemxpYi5oIGNyYzMyLmggZGVmbGF0ZS5oIHRyZWVzLmggenV0aWwuaAotCi0jIE1hY2hpbmUgZ2VuZXJhdGVkIGhlYWRlcnMKLVpDT05GICA9IHpjb25mLmgKLQotIyBIZWFkZXJzIGNhbGxlcnMgdXNlCi1aSU5DICAgPSB6bGliLmggJChaQ09ORikKLQotIyBIZWFkZXJzIHRoZSBabGliIHNvdXJjZSB1c2VzCi1aSERSUyAgPSAkKFpIKSAkKFpDT05GKQotCi0jIGNvbXByZXNzIGlzIG5vdCByZXF1aXJlZDsgaXQgaXMgbmVlZGVkIHRvIGxpbmsgdGhlIHpsaWIKLSMgY29kZSBiZWNhdXNlIGRlZmxhdGUgZGVmaW5lcyBhbiB1bnVzZWQgQVBJIGZ1bmN0aW9uIGRlZmxhdGVCb3VuZAotIyB3aGljaCBpdHNlbGYgY2FsbHMgY29tcHJlc3NCb3VuZCBmcm9tIGNvbXByZXNzLgotWk9CSlMgID0gYWRsZXIzMiQoTykgY29tcHJlc3MkKE8pIGNyYzMyJChPKSBkZWZsYXRlJChPKSBcCi0JIHRyZWVzJChPKSB6dXRpbCQoTykKLQotIyBsaWJwbmcKLVBOR1NSQ1M9cG5nJChDKSBwbmdlcnJvciQoQykgcG5nZ2V0JChDKSBwbmdtZW0kKEMpIFwKLQlwbmdzZXQkKEMpIHBuZ3RyYW5zJChDKSBwbmd3aW8kKEMpIHBuZ3dyaXRlJChDKSBcCi0JcG5nd3RyYW4kKEMpIHBuZ3d1dGlsJChDKQotCi0jIFN0YW5kYXJkIGhlYWRlcnMKLVBOR0ggICA9cG5nLmggcG5nY29uZi5oIHBuZ2RlYnVnLmggcG5naW5mby5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaAotCi0jIE1hY2hpbmUgZ2VuZXJhdGVkIGhlYWRlcnMKLVBOR0NPTkY9cG5nbGliY29uZi5oCi0KLSMgSGVhZGVycyBjYWxsZXJzIHVzZQotUE5HSU5DPSBwbmcuaCBwbmdjb25mLmggcG5ndXNyLmggJChQTkdDT05GKQotCi0jIEhlYWRlcnMgdGhlIFBORyBsaWJyYXJ5IHVzZXMKLVBOR0hEUlM9JChQTkdIKSAkKFBOR0NPTkYpIHBuZ3Vzci5oCi0KLVBOR09CSlM9cG5nJChPKSBwbmdlcnJvciQoTykgcG5nZ2V0JChPKSBwbmdtZW0kKE8pIFwKLQlwbmdzZXQkKE8pIHBuZ3RyYW5zJChPKSBwbmd3aW8kKE8pIHBuZ3dyaXRlJChPKSBcCi0JcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQotCi1QUk9HU1JDUz0gcG5tMnBuZ20kKEMpCi1QUk9HSERSUz0KLVBST0dET0NTPQotUFJPR09CSlM9IHBubTJwbmdtJChPKQotCi1PQkpTICAgID0gJChQUk9HT0JKUykgJChQTkdPQkpTKSAkKFpPQkpTKQotCi0jIGltcGxpY2l0IG1ha2UgcnVsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0uYyQoTyk6Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQ8Ci0KLSMgZGVwZW5kZW5jaWVzCi0KLWFsbDogcG5tMnBuZ20kKEUpCi0KLXBubTJwbmdtJChFKTogJChPQkpTKQotCSQoTEQpIC1vIHBubTJwbmdtJChFKSAkKE9CSlMpCi0KLSMgVGhlIERGQV9YVFJBIHNldHRpbmcgdHVybnMgYWxsIGxpYnBuZyBvcHRpb25zIG9mZiB0aGVuCi0jIHR1cm5zIG9uIHRob3NlIHJlcXVpcmVkIGZvciB0aGlzIG1pbmltYWwgYnVpbGQuCi0jIFRoZSBDUFBfRkxBR1Mgc2V0dGluZyBjYXVzZXMgcG5ndXNyLmggdG8gYmUgaW5jbHVkZWQgaW4KLSMgYm90aCB0aGUgYnVpbGQgb2YgcG5nbGliY29uZi5oIGFuZCwgc3Vic2VxdWVudGx5LCB3aGVuCi0jIGJ1aWxkaW5nIGxpYnBuZyBpdHNlbGYuCi0kKFBOR0NPTkYpOiAkKFBOR1NSQykvc2NyaXB0cy9wbmdsaWJjb25mLm1hayAkKFpIKVwKLQkkKFBOR1NSQykvc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBcCi0JJChQTkdTUkMpL3NjcmlwdHMvb3B0aW9ucy5hd2sgcG5ndXNyLmggcG5ndXNyLmRmYQotCSQoUk0pIHBuZ2xpYmNvbmYuaCBwbmdsaWJjb25mLmRmbgotCSQoTUFLRSkgLWYgJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChNQUtFRkxBR1MpXAotCSAgICBzcmNkaXI9JChQTkdTUkMpIENQUEZMQUdTPSItRFBOR19VU0VSX0NPTkZJRyAtSS4iXAotCSAgICBERkFfWFRSQT0icG5ndXNyLmRmYSIgJEAKLQotY2xlYW46Ci0JJChNQUtFKSAtZiAkKFBOR1NSQykvc2NyaXB0cy9wbmdsaWJjb25mLm1hayAkKE1BS0VGTEFHUylcCi0JICAgIHNyY2Rpcj0kKFBOR1NSQykgY2xlYW4KLQkkKFJNKSBwbm0ycG5nbSQoTykKLQkkKFJNKSBwbm0ycG5nbSQoRSkKLQkkKFJNKSAkKE9CSlMpCi0KLSMgZGlzdGNsZWFuIGFsc28gcmVtb3ZlcyB0aGUgY29waWVkIHNvdXJjZSBhbmQgaGVhZGVycwotZGlzdGNsZWFuOiBjbGVhbgotCSQoUk0pIC1yIHNjcmlwdHMgIyBoaXN0b3JpY2FsIHJlYXNvbnMKLQkkKFJNKSAkKFBOR1NSQ1MpICQoUE5HSCkKLQkkKFJNKSAkKFpTUkNTKSAkKFpIKSAkKFpDT05GKQotCSQoUk0pICQoUFJPR1NSQ1MpICQoUFJPR0hEUlMpICQoUFJPR0RPQ1MpCi0KLSMgSGVhZGVyIGZpbGUgZGVwZW5kZW5jaWVzOgotJChQUk9HT0JKUyk6ICQoUFJPR0hEUlMpICQoUE5HSU5DKSAkKFpJTkMpCi0kKFBOR09CSlMpOiAkKFBOR0hEUlMpICQoWklOQykKLSQoWk9CSlMpOiAkKFpIRFJTKQotCi0jIEdhdGhlciB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgcmVzcGVjdGl2ZSBkaXJlY3RvcmllcwotJChQTkdTUkNTKSAkKFBOR0gpOiAkKFBOR1NSQykvJEAKLQkkKFJNKSAkQAotCSQoQ09QWSkgJChQTkdTUkMpLyRAICRACi0KLSMgTm8gZGVwZW5kZW5jeSBvbiB0aGUgWkxJQlNSQyB0YXJnZXQgc28gdGhhdCBpdCBvbmx5IG5lZWRzCi0jIHRvIGJlIHNwZWNpZmllZCBvbmNlLgotJChaU1JDUykgJChaSCk6Ci0JJChSTSkgJEAKLQkkKENPUFkpICQoWkxJQlNSQykvJEAgJEAKLQotIyBUaGUgdW5jb25maWd1cmVkIHpjb25mLmggdmFyaWVzIGluIG5hbWUgYWNjb3JkaW5nIHRvIHRoZQotIyB6bGliIHJlbGVhc2UKLSQoWkNPTkYpOgotCSQoUk0pICRACi0JQGZvciBmIGluIHpjb25mLmguaW4gemNvbmYuaW4uaCB6Y29uZi5oOyBkb1wKLQkgICAgdGVzdCAtciAkKFpMSUJTUkMpLyQkZiAmJlwKLQkgICAgZWNobyAkKENPUFkpICQoWkxJQlNSQykvJCRmICRAICYmXAotCSAgICAkKENPUFkpICQoWkxJQlNSQykvJCRmICRAICYmIGV4aXQgMDtcCi0JZG9uZTsgZWNobyBjb3B5OiAkKFpMSUJTUkMpL3pjb25mLmggbm90IGZvdW5kOyBleGl0IDEKLQotcG5tMnBuZ20uYzogJChQUk9HU1JDKS9wbm0ycG5nLmMKLQkkKFJNKSAkQAotCSQoQ09QWSkgJChQUk9HU1JDKS9wbm0ycG5nLmMgJEAKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIHBubTJwbmdtCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbmltL2VuY29kZXIvcG5ndXNyLmRmYSBiL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuZGZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmMyNGYzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuZGZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBwbmdtaW5pbS9lbmNvZGVyL3BuZ3Vzci5kZmEKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBGaXJzdCBhbGwgdGhlIGJ1aWxkIG9wdGlvbnMgb2ZmOgotCi1ldmVyeXRoaW5nID0gb2ZmCi0KLSMgU3dpdGNoIG9uIHRoZSB3cml0ZSBjb2RlIC0gdGhpcyBtYWtlcyBhIG1pbmltYWxpc3QgZW5jb2RlcgotCi1vcHRpb24gV1JJVEUgb24KLQotIyBUaGVzZSAyIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGlmIHlvdSBuZWVkIHRvIHJlYWQgUEJNIChQMSBvciBQNCkgZmlsZXMuCi1vcHRpb24gV1JJVEVfSU5WRVJUIG9uCi1vcHRpb24gV1JJVEVfUEFDSyBvbgotCi0jIFlvdSBtdXN0IGNob29zZSBmaXhlZCBvciBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljOgotIyBvcHRpb24gRkxPQVRJTkdfUE9JTlQgb24KLQotb3B0aW9uIEZJWEVEX1BPSU5UIG9uCi0KLSMgWW91IG11c3QgY2hvc2UgdGhlIGludGVybmFsIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIG9yIHRvCi0jIHVzZSB0aGUgc3lzdGVtIGZsb2F0aW5nIHBvaW50LiAgVGhlIGxhdHRlciBpcyBjb25zaWRlcmFibHkKLSMgc21hbGxlciAoYnkgYWJvdXQgMWtieXRlIG9uIGFuIHg4NiBzeXN0ZW0pOgotIyBvcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvbgotCi1vcHRpb24gRkxPQVRJTkdfQVJJVEhNRVRJQyBvZmYKLQotIyBZb3VyIHByb2dyYW0gd2lsbCBwcm9iYWJseSBuZWVkIG90aGVyIG9wdGlvbnMuICBUaGUgZXhhbXBsZQotIyBwcm9ncmFtIGhlcmUsIHBubTJwbmdtLCByZXF1aXJlcyB0aGUgZm9sbG93aW5nLiAgVGFrZSBhIGxvb2sKLSMgYXQgcG5nbGliY29uZi5oIHRvIGZpbmQgb3V0IHRoZSBmdWxsIHNldCBvZiB3aGF0IGhhcyB0byBiZQotIyBlbmFibGVkIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB3b3JrLgotCi1vcHRpb24gU0VUSk1QIG9uCi1vcHRpb24gU1RESU8gb24KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaCBiL2NvbnRyaWIvcG5nbWluaW0vZW5jb2Rlci9wbmd1c3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3ZDQ0Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbmltL2VuY29kZXIvcG5ndXNyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBtaW53cnBuZ2NvbmYuaDogaGVhZGVycyB0byBtYWtlIGEgbWluaW1hbCBwbmctd3JpdGUtb25seSBsaWJyYXJ5Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwLTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogRGVyaXZlZCBmcm9tIHBuZ2NydXNoLmgsIENvcHlyaWdodCAxOTk4LTIwMDcsIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICovCi0KLSNpZm5kZWYgTUlOV1JQTkdDT05GX0gKLSNkZWZpbmUgTUlOV1JQTkdDT05GX0gKLQotLyogVG8gaW5jbHVkZSBwbmd1c3IuaCBzZXQgLURQTkdfVVNFUl9DT05GSUcgaW4gQ1BQRkxBR1MgKi8KLQotLyogTGlzdCBvcHRpb25zIHRvIHR1cm4gb2ZmIGZlYXR1cmVzIG9mIHRoZSBidWlsZCB0aGF0IGRvIG5vdAotICogYWZmZWN0IHRoZSBBUEkgKHNvIGFyZSBub3QgcmVjb3JkZWQgaW4gcG5nbGliY29uZi5oKQotICovCi0KLSNkZWZpbmUgUE5HX0FMSUdOX1RZUEUgUE5HX0FMSUdOX05PTkUKLQotI2VuZGlmIC8qIE1JTldSUE5HQ09ORl9IICovCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvUkVBRE1FIGIvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhODM1Ni4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBQTkdfVVNFUl9DT05GSUcgYW5kIHBuZ3Vzci5oCi0KLVRoZSBtYWtlZmlsZSBidWlsZHMgYSBtaW5pbWFsIHJlYWQtb25seSBwcm9ncmVzc2l2ZSBkZWNvZGVyIHdpdGgKLWVtYmVkZGVkIGxpYnBuZywgemxpYiBhbmQgeW91ciBzeXN0ZW0ncyBYIGxpYnJhcnkuCi0KLVNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSB6bGliIHNvdXJjZSAoMS4yLjEgb3IgbGF0ZXIpIGFzIFpMSUJTUkMKLW9uIHRoZSBtYWtlIGNvbW1hbmQgbGluZS4KLQotRWRpdCBtYWtlZmlsZSBpZiByZXF1aXJlZCwgdG8gZmluZCB5b3VyIFggbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcywKLXRoZW4KLQotICAgIG1ha2UgWkxJQlNSQz1kaXJlY3RvcnkKLQotSWYgeW91IHByZWZlciB0byB1c2UgdGhlIHNoYXJlZCBsaWJyYXJpZXMsIGdvIHRvIGNvbnRyaWIvZ3JlZ2Jvb2sKLWFuZCBidWlsZCB0aGUgcnBuZzIteCBhcHBsaWNhdGlvbiB0aGVyZS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9tYWtlZmlsZSBiL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyNTE5OS4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgUG5nTWludXMgKHJwbmcyKQotIyBMaW51eCAvIFVuaXgKLQotI0NDPWNjCi1DQz1nY2MKLUxEPSQoQ0MpCi0KLSMgSWYgYXdrIGZhaWxzIHRyeQotIyBtYWtlIEFXSz1uYXdrCi0KLSMgSWYgY3BwIGZhaWxzIHRyeQotIyBtYWtlIENQUD0vbGliL2NwcAotCi1STT1ybSAtZgotQ09QWT1jcAotCi0jWElOQyA9IC1JL3Vzci9pbmNsdWRlCQkJIyBvbGQtc3R5bGUsIHN0b2NrIFggZGlzdHJpYnV0aW9ucwotI1hMSUIgPSAtTC91c3IvbGliL1gxMSAtbFgxMQkJIyAgKGluY2x1ZGluZyBTR0kgSVJJWCkKLQotI1hJTkMgPSAtSS91c3Ivb3Blbndpbi9pbmNsdWRlCQkjIFN1biB3b3Jrc3RhdGlvbnMgKE9wZW5XaW5kb3dzKQotI1hMSUIgPSAtTC91c3Ivb3Blbndpbi9saWIgLWxYMTEKLQotWElOQyA9IC1JL3Vzci9YMTFSNi9pbmNsdWRlCQkjIG5ldyBYIGRpc3RyaWJ1dGlvbnMgKFgub3JnLCBldGMuKQotWExJQiA9IC1ML3Vzci9YMTFSNi9saWIgLWxYMTEKLSNYTElCID0gLUwvdXNyL1gxMVI2L2xpYjY0IC1sWDExCSMgZS5nLiwgUmVkIEhhdCBvbiBBTUQ2NAotCi0jWElOQyA9IC1JL3Vzci9sb2NhbC9pbmNsdWRlICAgCQkjIEZyZWVCU0QKLSNYTElCID0gLUwvdXNyL2xvY2FsL2xpYiAtbFgxMQotCi0jTElCUyA9ICQoWExJQikKLUxJQlMgPSAkKFhMSUIpIC1sbSAgICAgICAgICAgICAgICAgICAgICAjcGxhdGZvcm1zIHRoYXQgbmVlZCBsaWJtCi0KLUNQUEZMQUdTPS1JLiAkKFhJTkMpIC1EUE5HX1VTRVJfQ09ORklHIC1ETk9fR1pDT01QUkVTUyAtRFpfU09MTyAtRE5PX0daSVAKLUNGTEFHUz0tTzEgLVdhbGwKLQotQz0uYwotTz0ubwotTD0uYQotRT0KLQotIyBXaGVyZSB0byBmaW5kIHRoZSBzb3VyY2UgY29kZToKLVBOR1NSQyA9Li4vLi4vLi4KLVpMSUJTUkM9JChQTkdTUkMpLy4uL3psaWIKLVBST0dTUkM9JChQTkdTUkMpL2NvbnRyaWIvZ3JlZ2Jvb2sKLQotIyBabGliIChtaW5pbWFsIGluZmxhdGUgcmVxdWlyZW1lbnRzIC0gY3JjMzIgaXMgdXNlZCBieSBsaWJwbmcpCi0jIHp1dGlsIGNhbiBiZSBlbGltaW5hdGVkIGlmIHlvdSBwcm92aWRlIHlvdXIgb3duIHpjYWxsb2MgYW5kIHpjZnJlZQotWlNSQ1MgID0gYWRsZXIzMiQoQykgY3JjMzIkKEMpIFwKLQkgaW5mZmFzdCQoQykgaW5mbGF0ZSQoQykgaW5mdHJlZXMkKEMpIFwKLQkgenV0aWwkKEMpCi0KLSMgU3RhbmRhcmQgaGVhZGVycwotWkggICAgID0gemxpYi5oIGNyYzMyLmggaW5mZmFzdC5oIGluZmZpeGVkLmggXAotCSBpbmZsYXRlLmggaW5mdHJlZXMuaCB6dXRpbC5oCi0KLSMgTWFjaGluZSBnZW5lcmF0ZWQgaGVhZGVycwotWkNPTkYgID0gemNvbmYuaAotCi0jIEhlYWRlcnMgY2FsbGVycyB1c2UKLVpJTkMgICA9IHpsaWIuaCAkKFpDT05GKQotCi0jIEhlYWRlcnMgdGhlIFpsaWIgc291cmNlIHVzZXMKLVpIRFJTICA9ICQoWkgpICQoWkNPTkYpCi0KLVpPQkpTICA9IGFkbGVyMzIkKE8pIGNyYzMyJChPKSBcCi0JIGluZmZhc3QkKE8pIGluZmxhdGUkKE8pIGluZnRyZWVzJChPKSBcCi0JIHp1dGlsJChPKQotCi0jIGxpYnBuZwotUE5HU1JDUz1wbmckKEMpIHBuZ2Vycm9yJChDKSBwbmdnZXQkKEMpIHBuZ21lbSQoQykgXAotCXBuZ3ByZWFkJChDKSBwbmdyZWFkJChDKSBwbmdyaW8kKEMpIHBuZ3J0cmFuJChDKSBwbmdydXRpbCQoQykgXAotCXBuZ3NldCQoQykgcG5ndHJhbnMkKEMpCi0KLSMgU3RhbmRhcmQgaGVhZGVycwotUE5HSCAgID1wbmcuaCBwbmdjb25mLmggcG5nZGVidWcuaCBwbmdpbmZvLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oCi0KLSMgTWFjaGluZSBnZW5lcmF0ZWQgaGVhZGVycwotUE5HQ09ORj1wbmdsaWJjb25mLmgKLQotIyBIZWFkZXJzIGNhbGxlcnMgdXNlCi1QTkdJTkM9IHBuZy5oIHBuZ2NvbmYuaCBwbmd1c3IuaCAkKFBOR0NPTkYpCi0KLSMgSGVhZGVycyB0aGUgUE5HIGxpYnJhcnkgdXNlcwotUE5HSERSUz0kKFBOR0gpICQoUE5HQ09ORikgcG5ndXNyLmgKLQotUE5HT0JKUz1wbmckKE8pIHBuZ2Vycm9yJChPKSBwbmdnZXQkKE8pIHBuZ21lbSQoTykgXAotCXBuZ3ByZWFkJChPKSBwbmdyZWFkJChPKSBwbmdyaW8kKE8pIHBuZ3J0cmFuJChPKSBwbmdydXRpbCQoTykgXAotCXBuZ3NldCQoTykgcG5ndHJhbnMkKE8pCi0KLVBST0dTUkNTPSBycG5nMi14JChDKSByZWFkcG5nMiQoQykKLVBST0dIRFJTPSByZWFkcG5nMi5oCi1QUk9HRE9DUz0gQ09QWUlORyBMSUNFTlNFCi1QUk9HT0JKUz0gcnBuZzIteCQoTykgcmVhZHBuZzIkKE8pCi0KLU9CSlMgICAgPSAkKFBST0dPQkpTKSAkKFBOR09CSlMpICQoWk9CSlMpCi0KLSMgaW1wbGljaXQgbWFrZSBydWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5jJChPKToKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKLQotIyBkZXBlbmRlbmNpZXMKLQotYWxsOiAkKFBST0dET0NTKSBycG5nMi14JChFKQotCi1ycG5nMi14JChFKTogJChPQkpTKQotCSQoTEQpIC1vIHJwbmcyLXgkKEUpICQoT0JKUykgJChMSUJTKQotCi0jIFRoZSBERkFfWFRSQSBzZXR0aW5nIHR1cm5zIGFsbCBsaWJwbmcgb3B0aW9ucyBvZmYgdGhlbgotIyB0dXJucyBvbiB0aG9zZSByZXF1aXJlZCBmb3IgdGhpcyBtaW5pbWFsIGJ1aWxkLgotIyBUaGUgQ1BQX0ZMQUdTIHNldHRpbmcgY2F1c2VzIHBuZ3Vzci5oIHRvIGJlIGluY2x1ZGVkIGluCi0jIGJvdGggdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaCBhbmQsIHN1YnNlcXVlbnRseSwgd2hlbgotIyBidWlsZGluZyBsaWJwbmcgaXRzZWxmLgotJChQTkdDT05GKTogJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChaSClcCi0JJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5kZmEgXAotCSQoUE5HU1JDKS9zY3JpcHRzL29wdGlvbnMuYXdrIHBuZ3Vzci5oIHBuZ3Vzci5kZmEKLQkkKFJNKSBwbmdsaWJjb25mLmggcG5nbGliY29uZi5kZm4KLQkkKE1BS0UpIC1mICQoUE5HU1JDKS9zY3JpcHRzL3BuZ2xpYmNvbmYubWFrICQoTUFLRUZMQUdTKVwKLQkgICAgc3JjZGlyPSQoUE5HU1JDKSBDUFBGTEFHUz0iLURQTkdfVVNFUl9DT05GSUcgLUkuIlwKLQkgICAgREZBX1hUUkE9InBuZ3Vzci5kZmEiICRACi0KLWNsZWFuOgotCSQoTUFLRSkgLWYgJChQTkdTUkMpL3NjcmlwdHMvcG5nbGliY29uZi5tYWsgJChNQUtFRkxBR1MpXAotCSAgICBzcmNkaXI9JChQTkdTUkMpIGNsZWFuCi0JJChSTSkgcnBuZzIteCQoTykKLQkkKFJNKSBycG5nMi14JChFKQotCSQoUk0pICQoT0JKUykKLQotIyBkaXN0Y2xlYW4gYWxzbyByZW1vdmVzIHRoZSBjb3BpZWQgc291cmNlIGFuZCBoZWFkZXJzCi1kaXN0Y2xlYW46IGNsZWFuCi0JJChSTSkgLXIgc2NyaXB0cyAjIGhpc3RvcmljYWwgcmVhc29ucwotCSQoUk0pICQoUE5HU1JDUykgJChQTkdIKQotCSQoUk0pICQoWlNSQ1MpICQoWkgpICQoWkNPTkYpCi0JJChSTSkgJChQUk9HU1JDUykgJChQUk9HSERSUykgJChQUk9HRE9DUykKLQotIyBIZWFkZXIgZmlsZSBkZXBlbmRlbmNpZXM6Ci0kKFBST0dPQkpTKTogJChQUk9HSERSUykgJChQTkdJTkMpICQoWklOQykKLSQoUE5HT0JKUyk6ICQoUE5HSERSUykgJChaSU5DKQotJChaT0JKUyk6ICQoWkhEUlMpCi0KLSMgR2F0aGVyIHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSByZXNwZWN0aXZlIGRpcmVjdG9yaWVzCi0kKFBOR1NSQ1MpICQoUE5HSCk6ICQoUE5HU1JDKS8kQAotCSQoUk0pICRACi0JJChDT1BZKSAkKFBOR1NSQykvJEAgJEAKLQotIyBObyBkZXBlbmRlbmN5IG9uIHRoZSBaTElCU1JDIHRhcmdldCBzbyB0aGF0IGl0IG9ubHkgbmVlZHMKLSMgdG8gYmUgc3BlY2lmaWVkIG9uY2UuCi0kKFpTUkNTKSAkKFpIKToKLQkkKFJNKSAkQAotCSQoQ09QWSkgJChaTElCU1JDKS8kQCAkQAotCi0jIFRoZSB1bmNvbmZpZ3VyZWQgemNvbmYuaCB2YXJpZXMgaW4gbmFtZSBhY2NvcmRpbmcgdG8gdGhlCi0jIHpsaWIgcmVsZWFzZQotJChaQ09ORik6Ci0JJChSTSkgJEAKLQlAZm9yIGYgaW4gemNvbmYuaC5pbiB6Y29uZi5pbi5oIHpjb25mLmg7IGRvXAotCSAgICB0ZXN0IC1yICQoWkxJQlNSQykvJCRmICYmXAotCSAgICBlY2hvICQoQ09QWSkgJChaTElCU1JDKS8kJGYgJEAgJiZcCi0JICAgICQoQ09QWSkgJChaTElCU1JDKS8kJGYgJEAgJiYgZXhpdCAwO1wKLQlkb25lOyBlY2hvIGNvcHk6ICQoWkxJQlNSQykvemNvbmYuaCBub3QgZm91bmQ7IGV4aXQgMQotCi0kKFBST0dTUkNTKSAkKFBST0dIRFJTKSAkKFBST0dET0NTKTogJChQUk9HU1JDKS8kQAotCSQoUk0pICRACi0JJChDT1BZKSAkKFBST0dTUkMpLyRAICRACi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBycG5nMi14CmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbmltL3ByZWFkZXIvcG5ndXNyLmRmYSBiL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9wbmd1c3IuZGZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzI5N2Y0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9wbmd1c3IuZGZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBwbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5kZmEKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBGaXJzdCBhbGwgdGhlIGJ1aWxkIG9wdGlvbnMgb2ZmOgotCi1ldmVyeXRoaW5nID0gb2ZmCi0KLSMgSnVzdCBzd2l0Y2ggb24gdGhlIHByb2dyZXNzaXZlIHJlYWQgY29kZQotCi1vcHRpb24gUFJPR1JFU1NJVkVfUkVBRCBvbgotCi0jIFlvdSBtYXkgY2hvb3NlIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IEFQSXM6Ci0jIG9wdGlvbiBGTE9BVElOR19QT0lOVCBvbgotCi1vcHRpb24gRklYRURfUE9JTlQgb24KLQotIyBZb3UgbXVzdCBjaG9zZSB0aGUgaW50ZXJuYWwgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gb3IgdG8KLSMgdXNlIHRoZSBzeXN0ZW0gZmxvYXRpbmcgcG9pbnQuICBUaGUgbGF0dGVyIGlzIGNvbnNpZGVyYWJseQotIyBzbWFsbGVyIChieSBhYm91dCAxa2J5dGUgb24gYW4geDg2IHN5c3RlbSk6Ci0KLW9wdGlvbiBGTE9BVElOR19BUklUSE1FVElDIG9uCi0jIG9wdGlvbiBGTE9BVElOR19BUklUSE1FVElDIG9mZgotCi0jIFlvdXIgcHJvZ3JhbSB3aWxsIHByb2JhYmx5IG5lZWQgb3RoZXIgb3B0aW9ucy4gIFRoZSBleGFtcGxlCi0jIHByb2dyYW0gaGVyZSwgcnBuZzIteCwgcmVxdWlyZXMgdGhlIGZvbGxvd2luZy4gIFRha2UgYSBsb29rCi0jIGF0IHBuZ2xpYmNvbmYuaCB0byBmaW5kIG91dCB0aGUgZnVsbCBzZXQgb2Ygd2hhdCBoYXMgdG8gYmUKLSMgZW5hYmxlZCB0byBtYWtlIHRoZSBmb2xsb3dpbmcgd29yay4KLQotb3B0aW9uIFNFVEpNUCBvbgotb3B0aW9uIFNURElPIG9uCi1vcHRpb24gUkVBRF9iS0dEIG9uCi1vcHRpb24gUkVBRF9HQU1NQSBvbgotb3B0aW9uIFJFQURfRVhQQU5EIG9uCi1vcHRpb24gUkVBRF9TVFJJUF8xNl9UT184IG9uCi1vcHRpb24gUkVBRF9HUkFZX1RPX1JHQiBvbgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5oIGIvY29udHJpYi9wbmdtaW5pbS9wcmVhZGVyL3BuZ3Vzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGRiM2JiLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWluaW0vcHJlYWRlci9wbmd1c3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIG1pbnJkcG5nY29uZi5oOiBoZWFkZXJzIHRvIG1ha2UgYSBtaW5pbWFsIHBuZy1yZWFkLW9ubHkgbGlicmFyeQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMC0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIERlcml2ZWQgZnJvbSBwbmdjcnVzaC5oLCBDb3B5cmlnaHQgMTk5OC0yMDA3LCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqLwotCi0jaWZuZGVmIE1JTlBSRFBOR0NPTkZfSAotI2RlZmluZSBNSU5QUkRQTkdDT05GX0gKLQotLyogVG8gaW5jbHVkZSBwbmd1c3IuaCBzZXQgLURQTkdfVVNFUl9DT05GSUcgaW4gQ1BQRkxBR1MgKi8KLQotLyogTGlzdCBvcHRpb25zIHRvIHR1cm4gb2ZmIGZlYXR1cmVzIG9mIHRoZSBidWlsZCB0aGF0IGRvIG5vdAotICogYWZmZWN0IHRoZSBBUEkgKHNvIGFyZSBub3QgcmVjb3JkZWQgaW4gcG5nbGliY29uZi5oKQotICovCi0KLSNkZWZpbmUgUE5HX0FMSUdOX1RZUEUgUE5HX0FMSUdOX05PTkUKLQotI2VuZGlmIC8qIE1JTlBSRFBOR0NPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdtaW51cy9SRUFETUUgYi9jb250cmliL3BuZ21pbnVzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlNzQwNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbnVzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi1QbmdNaW51cwotLS0tLS0tLS0KLShjb3B5cmlnaHQgV2lsbGVtIHZhbiBTY2hhaWssIDE5OTkpCi0KLQotTGljZW5zZQotLS0tLS0tLQotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKLXByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCi10aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAotZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotCi0KLVNvbWUgaGlzdG9yeQotLS0tLS0tLS0tLS0tCi1Tb29uIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBQTkcgaW4gMTk5NSwgdGhlIG5lZWQgd2FzIGZlbHQgZm9yIGEgc2V0IG9mCi1wbm10b3BuZyAvIHBuZ3RvcG5tIHV0aWxpdGllcy4gSW5kZXBlbmRhbnRseSBBbGV4YW5kZXIgTGVobWFubiBhbmQgSQotKFdpbGxlbSB2YW4gU2NoYWlrKSBzdGFydGVkIHN1Y2ggYSBwcm9qZWN0LiBMdWNraWx5IHdlIGRpc2NvdmVyZWQgdGhpcwotYW5kIG1lcmdlZCB0aGUgdHdvIHRvZ2V0aGVyIGludG8gcG5tdG9wbmcudGFyLmd6LCB3aGljaCBpcyBhdmFpbGFibGUKLWZyb20gYS9vIGZ0cDovL2Z0cC5zaW1wbGVzeXN0ZW1zLm9yZy9wdWIvbGlicG5nL3BuZy8uCi0KLVRoZXNlIHR3byB1dGlsaXRpZXMgaGF2ZSBtYW55LCBtYW55IG9wdGlvbnMgYW5kIG1ha2UgdXNlIG9mIG1vc3Qgb2YgdGhlCi1mZWF0dXJlcyBvZiBQTkcsIGxpa2UgZ2FtbWEsIGFscGhhLCBzYml0LCB0ZXh0LWNodW5rcywgZXRjLiBUaGlzIG1ha2VzCi10aGUgdXRpbGl0aWVzIHF1aXRlIGNvbXBsZXggYW5kIGJ5IG5vdyBub3QgYW55bW9yZSB2ZXJ5IG1haW50YWluYWJsZS4KLVdoZW4gd2Ugd3JvdGUgdGhlc2UgcHJvZ3JhbXMsIGxpYnBuZyB3YXMgc3RpbGwgaW4gYW4gZWFybHkgc3RhZ2UuCi1UaGVyZWZvcmUsIGxvdHMgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCB3ZSBwdXQgaW4gb3VyIHNvZnR3YXJlIGNhbiBub3cKLWJlIGRvbmUgdXNpbmcgdHJhbnNmb3JtLWZ1bmN0aW9ucyBpbiBsaWJwbmcuCi0KLUZpbmFsbHksIHRvIGNvbXBpbGUgdGhlc2UgcHJvZ3JhbXMsIHlvdSBuZWVkIHRvIGhhdmUgaW5zdGFsbGVkIGFuZAotY29tcGlsZWQgdGhyZWUgbGlicmFyaWVzOiBsaWJwbmcsIHpsaWIgYW5kIG5ldHBibS4gRXNwZWNpYWxseSB0aGUgbGF0dGVyCi1tYWtlcyB0aGUgd2hvbGUgc2V0dXAgYSBiaXQgYnVsa3kuIEJ1dCB0aGF0J3MgdW5hdm9pZGFibGUgZ2l2ZW4gdGhlIG1hbnkKLWZlYXR1cmVzIG9mIHBubXRvcG5nLgotCi0KLVdoYXQgbm93Ci0tLS0tLS0tLQotQXQgdGhpcyBtb21lbnQgbGlicG5nIGlzIGluIGEgdmVyeSBzdGFibGUgc3RhdGUgYW5kIGNhbiBkbyBtdWNoIG9mIHRoZQotd29yayBkb25lIGluIHBubXRvcG5nLiBBbHNvLCBwbm10b3BuZyBuZWVkcyB0byBiZSB1cGdyYWRlZCB0byB0aGUgbmV3Ci1pbnRlcmZhY2Ugb2YgbGlicG5nLiBIZW5jZSwgaXQgaXMgdGltZSBmb3IgYSByZXdyaXRlIGZyb20gdGhlIGdyb3VuZCB1cAotb2YgcG5tdG9wbmcgYW5kIHBuZ3RvcG5tLiBUaGlzIHdpbGwgaGFwcGVuIGluIHRoZSBuZWFyIGZ1dHVyZSAoc3RheQotdHVuZWQpLiBUaGUgbmV3IHBhY2thZ2Ugd2lsbCBnZXQgYSBkaWZmZXJlbnQgbmFtZSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tCi10aGUgb2xkIG9uZTogUG5nUGx1cy4KLQotVG8gZXhwZXJpbWVudCBhIGJpdCB3aXRoIHRoZSBuZXcgaW50ZXJmYWNlIG9mIGxpYnBuZywgSSBzdGFydGVkIG9mZiB3aXRoCi1hIHNtYWxsIHByb3RvdHlwZSB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXNuJ3QKLWhhdmUgYW55IG9mIHRoZSBvcHRpb25zIHRvIHJlYWQgb3Igd3JpdGUgc3BlY2lhbCBjaHVua3MgYW5kIGl0IHdpbGwgZG8KLW5vIGdhbW1hIGNvcnJlY3Rpb24uIEJ1dCB0aGlzIG1ha2VzIGl0IGFsc28gYSBzaW1wbGUgcHJvZ3JhbSB0aGF0IGlzCi1xdWl0ZSBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIGNhbiBzZXJ2ZSB3ZWxsIGFzIGEgdGVtcGxhdGUgZm9yIG90aGVyCi1zb2Z0d2FyZSBkZXZlbG9wbWVudHMuIChCeSBub3cgdGhlcmUgYXJlIG9mIGNvdXJzZSBhIGNvdXBsZSBvZiBwcm9ncmFtcywKLWxpa2UgR3JlZyBSb2Vsb2ZzJyBycG5nL3dwbmcsIHRoYXQgY2FuIGJlIHVzZWQganVzdCBhcyBnb29kLikKLQotCi1DYW4gYW5kIGNhbiBub3QKLS0tLS0tLS0tLS0tLS0tLQotQXMgdGhpcyBpcyB0aGUgc21hbGwgYnJvdGhlciBvZiB0aGUgZnV0dXJlIFBuZ1BsdXMsIEkgY2FsbGVkIHRoaXMgZmVsbG93Ci1QbmdNaW51cy4gQmVjYXVzZSBJIHN0YXJ0ZWQgdGhpcyBkZXZlbG9wbWVudCBpbiBnb29kLW9sZCBUdXJiby1DLCBJCi1hdm9pZGVkIHRoZSB1c2UgdGhlIG5ldHBibSBsaWJyYXJ5LCB3aGljaCByZXF1aXJlcyBET1MgZXh0ZW5kZXJzLiBBZ2FpbiwKLWFub3RoZXIgcmVhc29uIHRvIGNhbGwgaXQgUG5nTWludXMgKG1pbnVzIG5ldHBibSA6LSkuIFNvLCBwYXJ0IG9mIHRoZQotcHJvZ3JhbSBhcmUgc29tZSBlbGVtZW50YXJ5IHJvdXRpbmVzIHRvIHJlYWQgLyB3cml0ZSBwZ20tIGFuZCBwcG0tZmlsZXMuCi1JdCBkb2VzIG5vdCByZWFkIGImdyBwYm0tZmlsZXMuCi0KLVRoZSBkb3duc2lkZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgeW91IGNhbiBub3QgdXNlIHRoZW0gb24gaW1hZ2VzCi10aGF0IHJlcXVpcmUgYmxvY2tzIG9mIG1lbW9yeSBiaWdnZXIgdGhhbiA2NGsgKHRoZSBET1MgdmVyc2lvbikuIEZvcgotbGFyZ2VyIGltYWdlcyB5b3Ugd2lsbCBnZXQgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci4KLQotQXMgc2FpZCBiZWZvcmUsIFBuZ01pbnVzIGRvZXNuJ3QgY29ycmVjdCBmb3IgZ2FtbWEuIFdoZW4gcmVhZGluZwotcG5nLWZpbGVzIHlvdSBjYW4gZG8gdGhpcyBqdXN0IGFzIHdlbGwgYnkgcGlwaW5nIHRoZSBvdXRwdXQgb2YgcG5nMnBubQotdG8gcG5tZ2FtbWEsIG9uZSBvZiB0aGUgc3RhbmRhcmQgUGJtUGx1cyB0b29scy4gVGhpcyBzYW1lIHNjZW5hcmlvIHdpbGwKLW1vc3QgcHJvYmFibHkgYWxzbyBiZSBmb2xsb3dlZCBpbiB0aGUgZnVsbC1ibG93biBmdXR1cmUgUG5nUGx1cywgd2l0aAotdGhlIGFkZGl0aW9uIG9mIGNvdXJzZSBvZiB0aGUgcG9zc2liaWxpdHkgdG8gY3JlYXRlIGdhbW1hLWNodW5rcyB3aGVuCi13cml0aW5nIHBuZy1maWxlcy4KLQotT24gdGhlIG90aGVyIGhhbmQgaXQgc3VwcG9ydHMgYWxwaGEtY2hhbm5lbHMuIFdoZW4gcmVhZGluZyBhIHBuZy1pbWFnZQoteW91IGNhbiB3cml0ZSB0aGUgYWxwaGEtY2hhbm5lbCBpbnRvIGEgcGdtLWZpbGUuIEFuZCB3aGVuIGNyZWF0aW5nIGFuCi1SR0IrQSBwbmctaW1hZ2UsIHlvdSBqdXN0IGNvbWJpbmUgYSBwcG0tZmlsZSB3aXRoIGEgY29ycmVzcG9uZGluZwotcGdtLWZpbGUgY29udGFpbmluZyB0aGUgYWxwaGEtY2hhbm5lbC4gV2hlbiByZWFkaW5nLCB0cmFuc3BhcmVuY3kgY2h1bmtzCi1hcmUgY29udmVydGVkIGludG8gYW4gYWxwaGEtY2hhbm5lbCBhbmQgZnJvbSB0aGVyZSBvbiB0cmVhdGVkIHRoZSBzYW1lCi13YXkuCi0KLUZpbmFsbHkgeW91IGNhbiBvcHQgZm9yIHdyaXRpbmcgYXNjaWkgb3IgYmluYXJ5IHBnbS0gYW5kIHBwbS1maWxlcy4gV2hlbgotdGhlIGJpdC1kZXB0aCBpcyAxNiwgdGhlIGZvcm1hdCB3aWxsIGFsd2F5cyBiZSBhc2NpaS4KLQotCi1Vc2luZyBpdAotLS0tLS0tLS0KLVRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBwbm10b3BuZyBhbmQgUG5nUGx1cywgdGhlIHV0aWxpdGllcyBhcmUgbmFtZWQKLXBuZzJwbm0gYW5kIHBubTJwbmcgKDIgaW5zdGVhZCBvZiB0bykuIFRoZSBpbnB1dC0gYW5kIG91dHB1dC1maWxlcyBjYW4KLWJlIGdpdmVuIGFzIHBhcmFtZXRlcnMgb3IgdGhyb3VnaCByZWRpcmVjdGlvbi4gVGhlcmVmb3JlIHRoZSBwcm9ncmFtcwotY2FuIGJlIHBhcnQgb2YgYSBwaXBlLgotCi1UbyBsaXN0IHRoZSBvcHRpb25zIHR5cGUgInBuZzJwbm0gLWgiIG9yICJwbm0ycG5nIC1oIi4KLQotCi1KdXN0IGxpa2UgU2NhbmRpbmF2aWFuIGZ1cm5pdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVlvdSBoYXZlIHRvIHB1dCBpdCB0b2dldGhlciB5b3Vyc2VsZi4gSSBkaWQgdGVzdCB0aGUgc29mdHdhcmUgdW5kZXIKLU1TLURPUyB3aXRoIFR1cmJvLUMgMy4wIGFuZCB1bmRlciBSZWRIYXQgTGludXggNC4yIHdpdGggZ2NjLiBJbiBib3RoCi1jYXNlcyBJIHVzZWQgbGlicG5nLTEuMC40IGFuZCB6bGliLTEuMS4zLiBMYXRlciB2ZXJzaW9ucyBzaG91bGQgYmUgT0ssCi1ob3dldmVyIHNvbWUgb2xkZXIgbGlicG5nIHZlcnNpb25zIGhhdmUgYSBidWcgaW4gcG5nbWVtLmMgd2hlbiB1c2luZwotVHVyYm8tQyAzLjAgKHNlZSBiZWxvdykuCi0KLVlvdSBjYW4gYnVpbGQgaXQgdXNpbmcgb25lIG9mIHRoZSB0d28gbWFrZWZpbGVzIChtYWtlIC1mIG1ha2VmaWxlLiMjIykKLW9yIHVzZSB0aGUgYmF0Y2gvc2NyaXB0IGZpbGVzIHBuZ21pbnVzLmJhdCAvIHBuZ21pbnVzLnNoLiBUaGlzIGFzc3VtZXMKLXRoYXQgeW91IGhhdmUgYnVpbHQgdGhlIGxpYnJhcmllcyBpbiAuLi9saWJwbmcgYW5kIC4uL3psaWIuIFVzaW5nIExpbnV4LAotbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYnVpbHQgbGlicG5nIHdpdGggbWFrZWZpbGUuc3RkIGFuZCBub3QKLW1ha2VmaWxlLmxpbnV4IChhbHNvIGNhbGxlZCAubG54IGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgbGlicG5nKS4gVGhlCi1sYXR0ZXIgY3JlYXRlcyBhIC5zbyBzaGFyZWQtbGlicmFyeSwgd2hpbGUgdGhlIFBuZ01pbnVzIG1ha2VmaWxlIGFzc3VtZXMKLWEgbm9ybWFsIC5hIHN0YXRpYyBsaWJyYXJ5LgotCi1JZiB5b3UgY3JlYXRlIGEgLi4vcG5nc3VpdGUgZGlyZWN0b3J5IGFuZCB0aGVuIHN0b3JlIHRoZSBiYXNuIyMjIy5wbmcKLWZpbGVzIGZyb20gUG5nU3VpdGUgKGh0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmdzdWl0ZS8pIGluIHRoZXJlLCB5b3UgY2FuCi10ZXN0IGluIG9uZSBnbyB0aGUgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIFBuZ01pbnVzLCBzZWUgcG5nMnBubS5iYXQgYW5kCi1wbm0ycG5nLmJhdCAob3IgdGhlIC5zaCB2ZXJzaW9ucykuCi0KLQotV2FycmFudHkKLS0tLS0tLS0KLVBsZWFzZSwgcmVtZW1iZXIgdGhhdCB0aGlzIHdhcyBqdXN0IGEgc21hbGwgZXhwZXJpbWVudCB0byBsZWFybiBhIGZldwotdGhpbmdzLiBJdCB3aWxsIGhhdmUgbWFueSB1bmZvcmVzZWVuIGZlYXR1cmVzIDx2Ymc+LiBXaG8gc2FpZCBidWdzPyBVc2UKLWl0IHdoZW4geW91IGFyZSBpbiBuZWVkIGZvciBzb21ldGhpbmcgc2ltcGxlIG9yIHdoZW4geW91IHdhbnQgdG8gc3RhcnQKLWRldmVsb3BpbmcgeW91ciBvd24gc3R1ZmYuCi0KLQotVGhlIFR1cmJvIGJ1ZwotLS0tLS0tLS0tLS0tLQotKiogcG5nbWVtLm9sZAotICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7Ci0gICAgICAgICAgaHB0ciArPSAxNkw7Ci0qKiBwbmdtZW0uYwotICAgICAgICAgIGhwdHIgPSAocG5nX2J5dGUgaHVnZSAqKSgobG9uZykoaHB0cikgJiAweGZmZmZmZmYwTCk7Ci0gICAgICAgICAgaHB0ciA9IGhwdHIgKyAxNkw7Ci0qKgotCi0qKiBwbmdtZW0ub2xkCi0gICAgICAgICAgcG5nX3B0ci0+b2Zmc2V0X3RhYmxlX3B0cltpXSA9IChwbmdfYnl0ZXApaHB0cjsKLSAgICAgICAgICBocHRyICs9IChwbmdfdWludF8zMik2NTUzNkw7Ci0qKiBwbmdtZW0uYwotICAgICAgICAgIHBuZ19wdHItPm9mZnNldF90YWJsZV9wdHJbaV0gPSAocG5nX2J5dGVwKWhwdHI7Ci0gICAgICAgICAgaHB0ciA9IGhwdHIgKyA2NTUzNkw7Ci0qKgotCi0KLVRoZSBlbmQKLS0tLS0tLS0KLVdpbGxlbSB2YW4gU2NoYWlrCi1tYWlsdG86d2lsbGVtQHNjaGFpay5jb20KLWh0dHA6Ly93d3cuc2NoYWlrLmNvbS9wbmcvCi0tLS0tLS0tCi1PY3QgMTk5OQotCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnN0ZCBiL2NvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGUyNWNkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWludXMvbWFrZWZpbGUuc3RkCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgUG5nTWludXMgKHBuZzJwbm0gYW5kIHBubTJwbmcpCi0jIExpbnV4IC8gVW5peAotCi0jQ0M9Y2MKLUNDPWdjYwotTEQ9JChDQykKLQotUk09cm0gLWYKLQotI1BOR1BBVEggPSAvdXNyL2xvY2FsCi0jUE5HSU5DID0gLUkkKFBOR1BBVEgpL2luY2x1ZGUvbGlicG5nMTYKLSNQTkdMSUIgPSAtTCQoUE5HUEFUSCkvbGliIC1scG5nMTYKLSNQTkdMSUJTID0gJChQTkdQQVRIKS9saWIvbGlicG5nMTYuYQotUE5HSU5DID0gLUkuLi8uLgotUE5HTElCID0gLUwuLi8uLiAtbHBuZwotUE5HTElCUyA9IC4uLy4uL2xpYnBuZy5hCi0KLSNaUEFUSCA9IC91c3IvbG9jYWwKLSNaSU5DID0gLUkkKFpQQVRIKS9pbmNsdWRlCi0jWkxJQiA9IC1MJChaUEFUSCkvbGliIC1segotI1pMSUJTID0gJChaUEFUSCkvbGliL2xpYnouYQotWklOQyA9IC1JLi4vLi4vLi4vemxpYgotWkxJQiA9IC1MLi4vLi4vLi4vemxpYiAtbHoKLVpMSUJTID0gLi4vLi4vLi4vemxpYi9saWJ6LmEKLQotQ1BQRkxBR1M9JChQTkdJTkMpICQoWklOQykKLUNGTEFHUz0KLUxETElCUz0kKFBOR0xJQikgJChaTElCKQotTERMSUJTUz0kKFBOR0xJQlMpICQoWkxJQlMpCi1DPS5jCi1PPS5vCi1MPS5hCi1FPQotCi0jIGRlcGVuZGVuY2llcwotCi0jYWxsOiBwbmcycG5tJChFKSBwbm0ycG5nJChFKQotYWxsOiBwbmcycG5tJChFKSBwbm0ycG5nJChFKSBwbmcycG5tLXN0YXRpYyQoRSkgcG5tMnBuZy1zdGF0aWMkKEUpCi0KLXBuZzJwbm0kKE8pOiBwbmcycG5tJChDKQotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSBwbmcycG5tJChDKQotCi1wbmcycG5tJChFKTogcG5nMnBubSQoTykKLQkkKExEKSAkKExERkxBR1MpIC1vIHBuZzJwbm0kKEUpIHBuZzJwbm0kKE8pICQoTERMSUJTKSAtbG0KLQotcG5nMnBubS1zdGF0aWMkKEUpOiBwbmcycG5tJChPKQotCSQoTEQpICQoTERGTEFHUykgLW8gcG5nMnBubS1zdGF0aWMkKEUpIHBuZzJwbm0kKE8pICQoTERMSUJTUykgLWxtCi0KLXBubTJwbmckKE8pOiBwbm0ycG5nJChDKQotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSBwbm0ycG5nJChDKQotCi1wbm0ycG5nJChFKTogcG5tMnBuZyQoTykKLQkkKExEKSAkKExERkxBR1MpIC1vIHBubTJwbmckKEUpIHBubTJwbmckKE8pICQoTERMSUJTKSAtbG0KLQotcG5tMnBuZy1zdGF0aWMkKEUpOiBwbm0ycG5nJChPKQotCSQoTEQpICQoTERGTEFHUykgLW8gcG5tMnBuZy1zdGF0aWMkKEUpIHBubTJwbmckKE8pICQoTERMSUJTUykgLWxtCi0KLWNsZWFuOgotCSQoUk0pIHBuZzJwbm0kKE8pCi0JJChSTSkgcG5tMnBuZyQoTykKLQkkKFJNKSBwbmcycG5tJChFKQotCSQoUk0pIHBubTJwbmckKEUpCi0JJChSTSkgcG5nMnBubS1zdGF0aWMkKEUpCi0JJChSTSkgcG5tMnBuZy1zdGF0aWMkKEUpCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBwbmcycG5tIC8gcG5tMnBuZwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdtaW51cy9tYWtlZmlsZS50YzMgYi9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnRjMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyZjRiOS4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbnVzL21ha2VmaWxlLnRjMworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIFBuZ01pbnVzIChwbmcycG5tIGFuZCBwbm0ycG5nKQotIyBUdXJib0MrKyAzLjAKLQotQ0M9dGNjIC1JYzpcdGMzXGluYwotTEQ9dGNjIC1MYzpcdGMzXGxpYgotTEI9dGxpYgotUk09ZGVsCi1DUD1jb3B5Ci1NT0RFTD1sCi1DUFBGTEFHUz0tSS4uXGxpYnBuZyAtSS4uXHpsaWIKLUNGTEFHUz0tTyAtbSQoTU9ERUwpCi1MREZMQUdTPS1tJChNT0RFTCkgLUwuLlxsaWJwbmcgLUwuLlx6bGliCi1DPS5jCi1PPS5vYmoKLUw9LmxpYgotRT0uZXhlCi0KLSMgZGVwZW5kZW5jaWVzCi0KLWFsbDogcG5nMnBubSQoRSkgcG5tMnBuZyQoRSkKLQotcG5nMnBubSQoTyk6IHBuZzJwbm0kKEMpCi0gICAgICAgICQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSBwbmcycG5tJChDKQotCi1wbmcycG5tJChFKTogcG5nMnBubSQoTykKLSAgICAgICAgJChMRCkgJChMREZMQUdTKSBwbmcycG5tJChPKSBsaWJwbmckKEwpIHpsaWIkKEwpCi0KLXBubTJwbmckKE8pOiBwbm0ycG5nJChDKQotICAgICAgICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgcG5tMnBuZyQoQykKLQotcG5tMnBuZyQoRSk6IHBubTJwbmckKE8pCi0gICAgICAgICQoTEQpICQoTERGTEFHUykgcG5tMnBuZyQoTykgbGlicG5nJChMKSB6bGliJChMKQotCi1jbGVhbjoKLSAgICAgICAgJChSTSkgKiQoTykKLSAgICAgICAgJChSTSkgKiQoRSkKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIHBuZzJwbm0gLyBwbm0ycG5nCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbnVzL21ha2V2bXMuY29tIGIvY29udHJpYi9wbmdtaW51cy9tYWtldm1zLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1NjFiYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbnVzL21ha2V2bXMuY29tCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQhIG1ha2UgQ29udHJpYiBwcm9ncmFtcyBvZiBsaWJwbmcgdW5kZXIgT3BlblZNUwotJCEKLSQhCi0kISBMb29rIGZvciB0aGUgY29tcGlsZXIgdXNlZAotJCEKLSQgemxpYnNyYyA9ICJbLS0tLnpsaWJdIgotJCBjY29wdD0iL2luY2x1ZGU9KCcnemxpYnNyYycsWy0tXSkiCi0kIGlmIGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQKLSQgdGhlbgotJCAgY2NvcHQgPSAiL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICBjb21wICA9ICJfX2RlY2NfXz0xIgotJCAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kIGVsc2UKLSQgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOkRFQ0MkQ09NUElMRVIuRVhFIikuZXFzLiIiCi0kICAgdGhlbgotJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKLSQgICAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06VkFYQy5FWEUiKS5lcXMuIiIKLSQgICAgIHRoZW4KLSQgICAgICBjb21wICA9ICJfX2djY19fPTEiCi0kICAgICAgQ0MgOj09IEdDQwotJCAgICAgZWxzZQotJCAgICAgIGNvbXAgPSAiX192YXhjX189MSIKLSQgICAgIGVuZGlmCi0kICAgZWxzZQotJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBkZWNjJGxpYnJhcnlfaW5jbHVkZToKLSQgICAgY2NvcHQgPSAiL2RlY2MvcHJlZml4PWFsbCIrY2NvcHQKLSQgICAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGVuZGlmCi0kIGVuZGlmCi0kIG9wZW4vd3JpdGUgbG9wdCBsaWIub3B0Ci0kIHdyaXRlIGxvcHQgIlstLV1saWJwbmcub2xiL2xpYiIKLSQgd3JpdGUgbG9wdCAiJyd6bGlic3JjJ2xpYnoub2xiL2xpYiIKLSQgY2xvc2UgbG9wdAotJCBvcGVuL3dyaXRlIHhvcHQgeDExLm9wdAotJCB3cml0ZSB4b3B0ICJzeXMkbGlicmFyeTpkZWN3JHhsaWJzaHIuZXhlL3NoYXJlIgotJCBjbG9zZSB4b3B0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBQTkcgY29udHJpYiBwcm9ncmFtcyAuLi4iCi0kICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgcG5tMnBuZy4uLiIKLSQgICBDQUxMIE1BS0UgcG5tMnBuZy5PQkogImNjICcnQ0NPUFQnIHBubTJwbmciIC0KLQlwbm0ycG5nLmMKLSQgICBjYWxsIG1ha2UgcG5tMnBuZy5leGUgLQotCSJMSU5LIHBubTJwbmcsbGliLm9wdC9vcHQiIC0KLQlwbm0ycG5nLm9iagotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHBuZzJwbm0uLi4iCi0kICAgQ0FMTCBNQUtFIHBuZzJwbm0uT0JKICJjYyAnJ0NDT1BUJyBwbmcycG5tIiAtCi0JcG5nMnBubS5jCi0kICAgY2FsbCBtYWtlIHBuZzJwbm0uZXhlIC0KLQkiTElOSyBwbmcycG5tLGxpYi5vcHQvb3B0IiAtCi0JcG5nMnBubS5vYmoKLSQgZXhpdAotJCEKLSQhCi0kTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUwotJCBWID0gJ0YkVmVyaWZ5KDApCi0kISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCi0kISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAotJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCi0kCi0kIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0Ci0kIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQotJGFyZz0zCi0kTG9vcDoKLSQgICAgICAgQXJndW1lbnQgPSBQJ2FyZwotJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAotJCAgICAgICBFbD0wCi0kTG9vcDI6Ci0kICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQotJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAotJCAgICAgICBBRmlsZSA9ICIiCi0kTG9vcDM6Ci0kICAgICAgIE9GaWxlID0gQUZpbGUKLSQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQotJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKLSQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0Ci0kICAgICAgIEdvdG8gTG9vcDMKLSROZXh0RUw6Ci0kICAgICAgIEVsID0gRWwgKyAxCi0kICAgICAgIEdvdG8gTG9vcDIKLSRFbmRMOgotJCBhcmc9YXJnKzEKLSQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAotJCBHb3RvIEV4aXQKLSQKLSRNYWtlaXQ6Ci0kIFZWPUYkVkVSSUZZKDApCi0kIHdyaXRlIHN5cyRvdXRwdXQgUDIKLSQgJ1AyCi0kIFZWPSdGJFZlcmlmeShWVikKLSRFeGl0OgotJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQotJEVORFNVQlJPVVRJTkUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5iYXQgYi9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDljZjM2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1SRU0gLS0gZ3JheXNjYWxlCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDEucG5nIGJhc24wZzAxLnBnbQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzAyLnBuZyBiYXNuMGcwMi5wZ20KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwNC5wbmcgYmFzbjBnMDQucGdtCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDgucG5nIGJhc24wZzA4LnBnbQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzE2LnBuZyBiYXNuMGcxNi5wZ20KLVJFTSAtLSBmdWxsLWNvbG9yCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjJjMDgucG5nIGJhc24yYzA4LnBwbQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24yYzE2LnBuZyBiYXNuMmMxNi5wcG0KLVJFTSAtLSBwYWxsZXR0ZWQKLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwMS5wbmcgYmFzbjNwMDEucHBtCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDIucG5nIGJhc24zcDAyLnBwbQotcG5nMnBubS5leGUgLW5vcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDA0LnBuZyBiYXNuM3AwNC5wcG0KLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwOC5wbmcgYmFzbjNwMDgucHBtCi1SRU0gLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKLXBuZzJwbm0uZXhlIC1ub3JhdyAuLlxwbmdzdWl0ZVxiYXNuNGEwOC5wbmcgYmFzbjRhMDgucGdtCi1wbmcycG5tLmV4ZSAtbm9yYXcgLi5ccG5nc3VpdGVcYmFzbjRhMTYucG5nIGJhc240YTE2LnBnbQotUkVNIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotcG5nMnBubS5leGUgLW5vcmF3IC1hbHBoYSBiYXNuNmEwOC5wZ20gLi5ccG5nc3VpdGVcYmFzbjZhMDgucG5nIGJhc242YTA4LnBwbQotcG5nMnBubS5leGUgLW5vcmF3IC1hbHBoYSBiYXNuNmExNi5wZ20gLi5ccG5nc3VpdGVcYmFzbjZhMTYucG5nIGJhc242YTE2LnBwbQotUkVNIC0tIGdyYXlzY2FsZQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwMS5wbmcgcmF3bjBnMDEucGdtCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzAyLnBuZyByYXduMGcwMi5wZ20KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjBnMDQucG5nIHJhd24wZzA0LnBnbQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuMGcwOC5wbmcgcmF3bjBnMDgucGdtCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24wZzE2LnBuZyByYXduMGcxNi5wZ20KLVJFTSAtLSBmdWxsLWNvbG9yCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24yYzA4LnBuZyByYXduMmMwOC5wcG0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjJjMTYucG5nIHJhd24yYzE2LnBwbQotUkVNIC0tIHBhbGxldHRlZAotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwMS5wbmcgcmF3bjNwMDEucHBtCi1wbmcycG5tLmV4ZSAtcmF3IC4uXHBuZ3N1aXRlXGJhc24zcDAyLnBuZyByYXduM3AwMi5wcG0KLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjNwMDQucG5nIHJhd24zcDA0LnBwbQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuM3AwOC5wbmcgcmF3bjNwMDgucHBtCi1SRU0gLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKLXBuZzJwbm0uZXhlIC1yYXcgLi5ccG5nc3VpdGVcYmFzbjRhMDgucG5nIHJhd240YTA4LnBnbQotcG5nMnBubS5leGUgLXJhdyAuLlxwbmdzdWl0ZVxiYXNuNGExNi5wbmcgcmF3bjRhMTYucGdtCi1SRU0gLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCi1wbmcycG5tLmV4ZSAtbm9yYXcgLWFscGhhIHJhd242YTA4LnBnbSAuLlxwbmdzdWl0ZVxiYXNuNmEwOC5wbmcgcmF3bjZhMDgucHBtCi1wbmcycG5tLmV4ZSAtbm9yYXcgLWFscGhhIHJhd242YTE2LnBnbSAuLlxwbmdzdWl0ZVxiYXNuNmExNi5wbmcgcmF3bjZhMTYucHBtCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5jIGIvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OGQ3ZmYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdtaW51cy9wbmcycG5tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoKLSAqICBwbmcycG5tLmMgLS0tIGNvbnZlcnNpb24gZnJvbSBQTkctZmlsZSB0byBQR00vUFBNLWZpbGUKLSAqICBjb3B5cmlnaHQgKEMpIDE5OTkgYnkgV2lsbGVtIHZhbiBTY2hhaWsgPHdpbGxlbUBzY2hhaWsuY29tPgotICoKLSAqICB2ZXJzaW9uIDEuMCAtIDE5OTkuMTAuMTUgLSBGaXJzdCB2ZXJzaW9uLgotICoKLSAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotICogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi0gKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKLSAqICB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotICogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKLSAqICBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWZkZWYgX19UVVJCT0NfXwotI2luY2x1ZGUgPG1lbS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx6bGliLmg+Ci0KLSNpZm5kZWYgQk9PTAotI2RlZmluZSBCT09MIHVuc2lnbmVkIGNoYXIKLSNlbmRpZgotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgKEJPT0wpIDEKLSNlbmRpZgotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAoQk9PTCkgMAotI2VuZGlmCi0KLSNpZmRlZiBfX1RVUkJPQ19fCi0jZGVmaW5lIFNURElOICAwCi0jZGVmaW5lIFNURE9VVCAxCi0jZGVmaW5lIFNUREVSUiAyCi0jZW5kaWYKLQotLyogdG8gbWFrZSBwbmcycG5tIHZlcmJvc2Ugc28gd2UgY2FuIGZpbmQgcHJvYmxlbXMgKG5lZWRzIHRvIGJlIGJlZm9yZSBwbmcuaCkgKi8KLSNpZm5kZWYgUE5HX0RFQlVHCi0jZGVmaW5lIFBOR19ERUJVRyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgInBuZy5oIgotCi0vKiBEZWZpbmUgcG5nX2ptcGJ1ZigpIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGEgcHJlLTEuMC42IHZlcnNpb24gb2YgbGlicG5nICovCi0jaWZuZGVmIHBuZ19qbXBidWYKLSMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpICgocG5nX3B0ciktPmptcGJ1ZikKLSNlbmRpZgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLWludCAgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Ci12b2lkIHVzYWdlICgpOwotQk9PTCBwbmcycG5tIChGSUxFICpwbmdfZmlsZSwgRklMRSAqcG5tX2ZpbGUsIEZJTEUgKmFscGhhX2ZpbGUsIEJPT0wgcmF3LAotICAgQk9PTCBhbHBoYSk7Ci0KLS8qCi0gKiAgbWFpbgotICovCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIEZJTEUgKmZwX3JkID0gc3RkaW47Ci0gIEZJTEUgKmZwX3dyID0gc3Rkb3V0OwotICBGSUxFICpmcF9hbCA9IE5VTEw7Ci0gIEJPT0wgcmF3ID0gVFJVRTsKLSAgQk9PTCBhbHBoYSA9IEZBTFNFOwotICBpbnQgYXJnaTsKLQotICBmb3IgKGFyZ2kgPSAxOyBhcmdpIDwgYXJnYzsgYXJnaSsrKQotICB7Ci0gICAgaWYgKGFyZ3ZbYXJnaV1bMF0gPT0gJy0nKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXJndlthcmdpXVsxXSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgcmF3ID0gRkFMU0U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgIHJhdyA9IFRSVUU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgIGFscGhhID0gVFJVRTsKLSAgICAgICAgICBhcmdpKys7Ci0gICAgICAgICAgaWYgKChmcF9hbCA9IGZvcGVuIChhcmd2W2FyZ2ldLCAid2IiKSkgPT0gTlVMTCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgY2FuIG5vdCBjcmVhdGUgYWxwaGEtY2hhbm5lbCBmaWxlICVzXG4iLAotICAgICAgICAgICAgICAgYXJndlthcmdpXSk7Ci0gICAgICAgICAgICBleGl0ICgxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bmtub3duIG9wdGlvbiAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfSAvKiBlbmQgc3dpdGNoICovCi0gICAgfQotICAgIGVsc2UgaWYgKGZwX3JkID09IHN0ZGluKQotICAgIHsKLSAgICAgIGlmICgoZnBfcmQgPSBmb3BlbiAoYXJndlthcmdpXSwgInJiIikpID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGZpbGUgJXMgZG9lcyBub3QgZXhpc3RcbiIsIGFyZ3ZbYXJnaV0pOwotICAgICAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGZwX3dyID09IHN0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoKGZwX3dyID0gZm9wZW4gKGFyZ3ZbYXJnaV0sICJ3YiIpKSA9PSBOVUxMKQotICAgICAgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBjYW4gbm90IGNyZWF0ZSBmaWxlICVzXG4iLCBhcmd2W2FyZ2ldKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQTkcyUE5NXG4iKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdG9vIG1hbnkgcGFyYW1ldGVyc1xuIik7Ci0gICAgICB1c2FnZSgpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0gLyogZW5kIGZvciAqLwotCi0jaWZkZWYgX19UVVJCT0NfXwotICAvKiBzZXQgc3RkaW4vc3Rkb3V0IGlmIHJlcXVpcmVkIHRvIGJpbmFyeSAqLwotICBpZiAoZnBfcmQgPT0gc3RkaW4pCi0gIHsKLSAgICBzZXRtb2RlIChTVERJTiwgT19CSU5BUlkpOwotICB9Ci0gIGlmICgocmF3KSAmJiAoZnBfd3IgPT0gc3Rkb3V0KSkKLSAgewotICAgIHNldG1vZGUgKFNURE9VVCwgT19CSU5BUlkpOwotICB9Ci0jZW5kaWYKLQotICAvKiBjYWxsIHRoZSBjb252ZXJzaW9uIHByb2dyYW0gaXRzZWxmICovCi0gIGlmIChwbmcycG5tIChmcF9yZCwgZnBfd3IsIGZwX2FsLCByYXcsIGFscGhhKSA9PSBGQUxTRSkKLSAgewotICAgIGZwcmludGYgKHN0ZGVyciwgIlBORzJQTk1cbiIpOwotICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdW5zdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgUE5HLWltYWdlXG4iKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgLyogY2xvc2UgaW5wdXQgZmlsZSAqLwotICBmY2xvc2UgKGZwX3JkKTsKLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZmNsb3NlIChmcF93cik7Ci0gIC8qIGNsb3NlIGFscGhhIGZpbGUgKi8KLSAgaWYgKGFscGhhKQotICAgIGZjbG9zZSAoZnBfYWwpOwotCi0gIHJldHVybiAwOwotfQotCi0vKgotICogIHVzYWdlCi0gKi8KLQotdm9pZCB1c2FnZSgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlBORzJQTk1cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICBieSBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OVxuIik7Ci0jaWZkZWYgX19UVVJCT0NfXwotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgVHVyYm8tQyBhbmQgQm9ybGFuZC1DIGNvbXBpbGVyc1xuIik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgTGludXggKGFuZCBVbml4KSBjb21waWxlcnNcbiIpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAgcG5nMnBubSBbb3B0aW9uc10gPGZpbGU+LnBuZyBbPGZpbGU+LnBubV1cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICBvcjogIC4uLiB8IHBuZzJwbm0gW29wdGlvbnNdXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiT3B0aW9uczpcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICIgICAtclthd10gICB3cml0ZSBwbm0tZmlsZSBpbiBiaW5hcnkgZm9ybWF0IChQNC9QNS9QNikgKGRlZmF1bHQpXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICAgLW5bb3Jhd10gd3JpdGUgcG5tLWZpbGUgaW4gYXNjaWkgZm9ybWF0IChQMS9QMi9QMylcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICIgICAtYVtscGhhXSA8ZmlsZT4ucGdtIHdyaXRlIFBORyBhbHBoYSBjaGFubmVsIGFzIHBnbS1maWxlXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICAgLWggfCAtPyAgcHJpbnQgdGhpcyBoZWxwLWluZm9ybWF0aW9uXG4iKTsKLX0KLQotLyoKLSAqICBwbmcycG5tCi0gKi8KLQotQk9PTCBwbmcycG5tIChGSUxFICpwbmdfZmlsZSwgRklMRSAqcG5tX2ZpbGUsIEZJTEUgKmFscGhhX2ZpbGUsCi0gICAgdm9sYXRpbGUgQk9PTCByYXcsIEJPT0wgYWxwaGEpCi17Ci0gIHBuZ19zdHJ1Y3QgICAgKnBuZ19wdHIgPSBOVUxMOwotICBwbmdfaW5mbyAgICAgICAgKmluZm9fcHRyID0gTlVMTDsKLSAgcG5nX2J5dGUgICAgICBidWZbOF07Ci0gIHBuZ19ieXRlICAgICAgKnBuZ19waXhlbHMgPSBOVUxMOwotICBwbmdfYnl0ZSAgICAgICoqcm93X3BvaW50ZXJzID0gTlVMTDsKLSAgcG5nX2J5dGUgICAgICAqcGl4X3B0ciA9IE5VTEw7Ci0gIHBuZ191aW50XzMyICAgcm93X2J5dGVzOwotCi0gIHBuZ191aW50XzMyICAgd2lkdGg7Ci0gIHBuZ191aW50XzMyICAgaGVpZ2h0OwotICBpbnQgICAgICAgICAgIGJpdF9kZXB0aDsKLSAgaW50ICAgICAgICAgICBjaGFubmVsczsKLSAgaW50ICAgICAgICAgICBjb2xvcl90eXBlOwotICBpbnQgICAgICAgICAgIGFscGhhX3ByZXNlbnQ7Ci0gIGludCAgICAgICAgICAgcm93LCBjb2w7Ci0gIGludCAgICAgICAgICAgcmV0OwotICBpbnQgICAgICAgICAgIGk7Ci0gIGxvbmcgICAgICAgICAgZGVwXzE2OwotCi0gIC8qIHJlYWQgYW5kIGNoZWNrIHNpZ25hdHVyZSBpbiBQTkcgZmlsZSAqLwotICByZXQgPSBmcmVhZCAoYnVmLCAxLCA4LCBwbmdfZmlsZSk7Ci0gIGlmIChyZXQgIT0gOCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcmV0ID0gcG5nX3NpZ19jbXAgKGJ1ZiwgMCwgOCk7Ci0gIGlmIChyZXQpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIGNyZWF0ZSBwbmcgYW5kIGluZm8gc3RydWN0dXJlcyAqLwotCi0gIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0IChwbmdfZ2V0X2xpYnBuZ192ZXIoTlVMTCksCi0gICAgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIGlmICghcG5nX3B0cikKLSAgICByZXR1cm4gRkFMU0U7ICAgLyogb3V0IG9mIG1lbW9yeSAqLwotCi0gIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCAocG5nX3B0cik7Ci0gIGlmICghaW5mb19wdHIpCi0gIHsKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAoJnBuZ19wdHIsIE5VTEwsIE5VTEwpOwotICAgIHJldHVybiBGQUxTRTsgICAvKiBvdXQgb2YgbWVtb3J5ICovCi0gIH0KLQotICBpZiAoc2V0am1wIChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBzZXQgdXAgdGhlIGlucHV0IGNvbnRyb2wgZm9yIEMgc3RyZWFtcyAqLwotICBwbmdfaW5pdF9pbyAocG5nX3B0ciwgcG5nX2ZpbGUpOwotICBwbmdfc2V0X3NpZ19ieXRlcyAocG5nX3B0ciwgOCk7ICAvKiB3ZSBhbHJlYWR5IHJlYWQgdGhlIDggc2lnbmF0dXJlIGJ5dGVzICovCi0KLSAgLyogcmVhZCB0aGUgZmlsZSBpbmZvcm1hdGlvbiAqLwotICBwbmdfcmVhZF9pbmZvIChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgLyogZ2V0IHNpemUgYW5kIGJpdC1kZXB0aCBvZiB0aGUgUE5HLWltYWdlICovCi0gIHBuZ19nZXRfSUhEUiAocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLQotICAvKiBzZXQtdXAgdGhlIHRyYW5zZm9ybWF0aW9ucyAqLwotCi0gIC8qIHRyYW5zZm9ybSBwYWxldHRlZCBpbWFnZXMgaW50byBmdWxsLWNvbG9yIHJnYiAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgIHBuZ19zZXRfZXhwYW5kIChwbmdfcHRyKTsKLSAgLyogZXhwYW5kIGltYWdlcyB0byBiaXQtZGVwdGggOCAob25seSBhcHBsaWNhYmxlIGZvciBncmF5c2NhbGUgaW1hZ2VzKSAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIGJpdF9kZXB0aCA8IDgpCi0gICAgcG5nX3NldF9leHBhbmQgKHBuZ19wdHIpOwotICAvKiB0cmFuc2Zvcm0gdHJhbnNwYXJlbmN5IG1hcHMgaW50byBmdWxsIGFscGhhLWNoYW5uZWwgKi8KLSAgaWYgKHBuZ19nZXRfdmFsaWQgKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICBwbmdfc2V0X2V4cGFuZCAocG5nX3B0cik7Ci0KLSNpZmRlZiBOSkVUCi0gIC8qIGRvd25ncmFkZSAxNi1iaXQgaW1hZ2VzIHRvIDgtYml0ICovCi0gIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgcG5nX3NldF9zdHJpcF8xNiAocG5nX3B0cik7Ci0gIC8qIHRyYW5zZm9ybSBncmF5c2NhbGUgaW1hZ2VzIGludG8gZnVsbC1jb2xvciAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgIHBuZ19zZXRfZ3JheV90b19yZ2IgKHBuZ19wdHIpOwotICAvKiBvbmx5IGlmIGZpbGUgaGFzIGEgZmlsZSBnYW1tYSwgd2UgZG8gYSBjb3JyZWN0aW9uICovCi0gIGlmIChwbmdfZ2V0X2dBTUEgKHBuZ19wdHIsIGluZm9fcHRyLCAmZmlsZV9nYW1tYSkpCi0gICAgcG5nX3NldF9nYW1tYSAocG5nX3B0ciwgKGRvdWJsZSkgMi4yLCBmaWxlX2dhbW1hKTsKLSNlbmRpZgotCi0gIC8qIGFsbCB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQ7IG5vdyB1cGRhdGUgaW5mb19wdHIgZGF0YSwKLSAgICogZ2V0IHJvd2J5dGVzIGFuZCBjaGFubmVscywgYW5kIGFsbG9jYXRlIGltYWdlIG1lbW9yeSAqLwotCi0gIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgLyogZ2V0IHRoZSBuZXcgY29sb3ItdHlwZSBhbmQgYml0LWRlcHRoIChhZnRlciBleHBhbnNpb24vc3RyaXBwaW5nKSAqLwotICBwbmdfZ2V0X0lIRFIgKHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLAotICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0gIC8qIGNoZWNrIGZvciAxNi1iaXQgZmlsZXMgKi8KLSAgaWYgKGJpdF9kZXB0aCA9PSAxNikKLSAgewotICAgIHJhdyA9IEZBTFNFOwotI2lmZGVmIF9fVFVSQk9DX18KLSAgICBwbm1fZmlsZS0+ZmxhZ3MgJj0gfigodW5zaWduZWQpIF9GX0JJTik7Ci0jZW5kaWYKLSAgfQotCi0gIC8qIGNhbGN1bGF0ZSBuZXcgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBzdG9yZSBhbHBoYS1wcmVzZW5jZSAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgIGNoYW5uZWxzID0gMTsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgIGNoYW5uZWxzID0gMjsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgY2hhbm5lbHMgPSAzOwotICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICBjaGFubmVscyA9IDQ7Ci0gIGVsc2UKLSAgICBjaGFubmVscyA9IDA7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSAgYWxwaGFfcHJlc2VudCA9IChjaGFubmVscyAtIDEpICUgMjsKLQotICAvKiBjaGVjayBpZiBhbHBoYSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIGZpbGUgKi8KLSAgaWYgKGFscGhhICYmICFhbHBoYV9wcmVzZW50KQotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HMlBOTVxuIik7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICBQTkctZmlsZSBkb2Vzbid0IGNvbnRhaW4gYWxwaGEgY2hhbm5lbFxuIik7Ci0gICAgZXhpdCAoMSk7Ci0gIH0KLQotICAvKiByb3dfYnl0ZXMgaXMgdGhlIHdpZHRoIHggbnVtYmVyIG9mIGNoYW5uZWxzIHggKGJpdC1kZXB0aCAvIDgpICovCi0gIHJvd19ieXRlcyA9IHBuZ19nZXRfcm93Ynl0ZXMgKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICBpZiAoKHBuZ19waXhlbHMgPSAocG5nX2J5dGUgKikKLSAgICAgbWFsbG9jIChyb3dfYnl0ZXMgKiBoZWlnaHQgKiBzaXplb2YgKHBuZ19ieXRlKSkpID09IE5VTEwpIHsKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0ciwgTlVMTCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKChyb3dfcG9pbnRlcnMgPSAocG5nX2J5dGUgKiopCi0gICAgIG1hbGxvYyAoaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZXApKSkgPT0gTlVMTCkKLSAgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLSAgICBmcmVlIChwbmdfcGl4ZWxzKTsKLSAgICBwbmdfcGl4ZWxzID0gTlVMTDsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBzZXQgdGhlIGluZGl2aWR1YWwgcm93X3BvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMgKi8KLSAgZm9yIChpID0gMDsgaSA8ICgoaW50KSBoZWlnaHQpOyBpKyspCi0gICAgcm93X3BvaW50ZXJzW2ldID0gcG5nX3BpeGVscyArIGkgKiByb3dfYnl0ZXM7Ci0KLSAgLyogbm93IHdlIGNhbiBnbyBhaGVhZCBhbmQganVzdCByZWFkIHRoZSB3aG9sZSBpbWFnZSAqLwotICBwbmdfcmVhZF9pbWFnZSAocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotICAvKiByZWFkIHJlc3Qgb2YgZmlsZSwgYW5kIGdldCBhZGRpdGlvbmFsIGNodW5rcyBpbiBpbmZvX3B0ciAtIFJFUVVJUkVEICovCi0gIHBuZ19yZWFkX2VuZCAocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8qIGNsZWFuIHVwIGFmdGVyIHRoZSByZWFkLCBhbmQgZnJlZSBhbnkgbWVtb3J5IGFsbG9jYXRlZCAtIFJFUVVJUkVEICovCi0gIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0ICgmcG5nX3B0ciwgJmluZm9fcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0KLSAgLyogd3JpdGUgaGVhZGVyIG9mIFBOTSBmaWxlICovCi0KLSAgaWYgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpIHx8Ci0gICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSkKLSAgewotICAgIGZwcmludGYgKHBubV9maWxlLCAiJXNcbiIsIChyYXcpID8gIlA1IiA6ICJQMiIpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWQgJWRcbiIsIChpbnQpIHdpZHRoLCAoaW50KSBoZWlnaHQpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWxkXG4iLCAoKDFMIDw8IChpbnQpIGJpdF9kZXB0aCkgLSAxTCkpOwotICB9Ci0gIGVsc2UgaWYgKChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgfHwKLSAgICAgICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKSkKLSAgewotICAgIGZwcmludGYgKHBubV9maWxlLCAiJXNcbiIsIChyYXcpID8gIlA2IiA6ICJQMyIpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWQgJWRcbiIsIChpbnQpIHdpZHRoLCAoaW50KSBoZWlnaHQpOwotICAgIGZwcmludGYgKHBubV9maWxlLCAiJWxkXG4iLCAoKDFMIDw8IChpbnQpIGJpdF9kZXB0aCkgLSAxTCkpOwotICB9Ci0KLSAgLyogd3JpdGUgaGVhZGVyIG9mIFBHTSBmaWxlIHdpdGggYWxwaGEgY2hhbm5lbCAqLwotCi0gIGlmICgoYWxwaGEpICYmCi0gICAgICAoKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkgfHwKLSAgICAgICAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpKSkKLSAgewotICAgIGZwcmludGYgKGFscGhhX2ZpbGUsICIlc1xuIiwgKHJhdykgPyAiUDUiIDogIlAyIik7Ci0gICAgZnByaW50ZiAoYWxwaGFfZmlsZSwgIiVkICVkXG4iLCAoaW50KSB3aWR0aCwgKGludCkgaGVpZ2h0KTsKLSAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJWxkXG4iLCAoKDFMIDw8IChpbnQpIGJpdF9kZXB0aCkgLSAxTCkpOwotICB9Ci0KLSAgLyogd3JpdGUgZGF0YSB0byBQTk0gZmlsZSAqLwotICBwaXhfcHRyID0gcG5nX3BpeGVsczsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IChpbnQpIGhlaWdodDsgcm93KyspCi0gIHsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChpbnQpIHdpZHRoOyBjb2wrKykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgKGNoYW5uZWxzIC0gYWxwaGFfcHJlc2VudCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHJhdykKLSAgICAgICAgICBmcHV0YyAoKGludCkgKnBpeF9wdHIrKyAsIHBubV9maWxlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMTYpewotICAgICAgICAgICAgZGVwXzE2ID0gKGxvbmcpICpwaXhfcHRyKys7Ci0gICAgICAgICAgICBmcHJpbnRmIChwbm1fZmlsZSwgIiVsZCAiLCAoZGVwXzE2IDw8IDgpICsgKChsb25nKSAqcGl4X3B0cisrKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYgKHBubV9maWxlLCAiJWxkICIsIChsb25nKSAqcGl4X3B0cisrKTsKLSAgICAgIH0KLSAgICAgIGlmIChhbHBoYV9wcmVzZW50KQotICAgICAgewotICAgICAgICBpZiAoIWFscGhhKQotICAgICAgICB7Ci0gICAgICAgICAgcGl4X3B0cisrOyAvKiBhbHBoYSAqLwotICAgICAgICAgIGlmIChiaXRfZGVwdGggPT0gMTYpCi0gICAgICAgICAgICBwaXhfcHRyKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBvdXRwdXQgYWxwaGEtY2hhbm5lbCBhcyBwZ20gZmlsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJhdykKLSAgICAgICAgICAgIGZwdXRjICgoaW50KSAqcGl4X3B0cisrICwgYWxwaGFfZmlsZSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSAxNil7Ci0gICAgICAgICAgICAgIGRlcF8xNiA9IChsb25nKSAqcGl4X3B0cisrOwotICAgICAgICAgICAgICBmcHJpbnRmIChhbHBoYV9maWxlLCAiJWxkICIsIChkZXBfMTYgPDwgOCkgKyAobG9uZykgKnBpeF9wdHIrKyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZwcmludGYgKGFscGhhX2ZpbGUsICIlbGQgIiwgKGxvbmcpICpwaXhfcHRyKyspOwotICAgICAgICB9Ci0gICAgICB9IC8qIGlmIGFscGhhX3ByZXNlbnQgKi8KLQotICAgICAgaWYgKCFyYXcpCi0gICAgICAgIGlmIChjb2wgJSA0ID09IDMpCi0gICAgICAgICAgZnByaW50ZiAocG5tX2ZpbGUsICJcbiIpOwotICAgIH0gLyogZW5kIGZvciBjb2wgKi8KLQotICAgIGlmICghcmF3KQotICAgICAgaWYgKGNvbCAlIDQgIT0gMCkKLSAgICAgICAgZnByaW50ZiAocG5tX2ZpbGUsICJcbiIpOwotICB9IC8qIGVuZCBmb3Igcm93ICovCi0KLSAgaWYgKHJvd19wb2ludGVycyAhPSAodW5zaWduZWQgY2hhcioqKSBOVUxMKQotICAgIGZyZWUgKHJvd19wb2ludGVycyk7Ci0gIGlmIChwbmdfcGl4ZWxzICE9ICh1bnNpZ25lZCBjaGFyKikgTlVMTCkKLSAgICBmcmVlIChwbmdfcGl4ZWxzKTsKLQotICByZXR1cm4gVFJVRTsKLQotfSAvKiBlbmQgb2Ygc291cmNlICovCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5zaCBiL2NvbnRyaWIvcG5nbWludXMvcG5nMnBubS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFjMDUzNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ21pbnVzL3BuZzJwbm0uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIS9iaW4vc2gKLSMgLS0gZ3JheXNjYWxlCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyBiYXNuMGcwMS5wZ20KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMDIucG5nIGJhc24wZzAyLnBnbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgYmFzbjBnMDQucGdtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyBiYXNuMGcwOC5wZ20KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjBnMTYucG5nIGJhc24wZzE2LnBnbQotIyAtLSBmdWxsLWNvbG9yCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyBiYXNuMmMwOC5wcG0KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjJjMTYucG5nIGJhc24yYzE2LnBwbQotIyAtLSBwYWxsZXR0ZWQKLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDEucG5nIGJhc24zcDAxLnBwbQotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgYmFzbjNwMDIucHBtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyBiYXNuM3AwNC5wcG0KLS4vcG5nMnBubSAtbm9yYXcgLi4vcG5nc3VpdGUvYmFzbjNwMDgucG5nIGJhc24zcDA4LnBwbQotIyAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbmcycG5tIC1ub3JhdyAuLi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgYmFzbjRhMDgucGdtCi0uL3BuZzJwbm0gLW5vcmF3IC4uL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyBiYXNuNGExNi5wZ20KLSMgLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCi0uL3BuZzJwbm0gLW5vcmF3IC1hbHBoYSBiYXNuNmEwOC5wZ20gLi4vcG5nc3VpdGUvYmFzbjZhMDgucG5nIGJhc242YTA4LnBwbQotLi9wbmcycG5tIC1ub3JhdyAtYWxwaGEgYmFzbjZhMTYucGdtIC4uL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyBiYXNuNmExNi5wcG0KLSMgLS0gZ3JheXNjYWxlCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgcmF3bjBnMDEucGdtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgcmF3bjBnMDIucGdtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgcmF3bjBnMDQucGdtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgcmF3bjBnMDgucGdtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgcmF3bjBnMTYucGdtCi0jIC0tIGZ1bGwtY29sb3IKLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyByYXduMmMwOC5wcG0KLS4vcG5nMnBubSAtcmF3IC4uL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyByYXduMmMxNi5wcG0KLSMgLS0gcGFsbGV0dGVkCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgcmF3bjNwMDEucHBtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgcmF3bjNwMDIucHBtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgcmF3bjNwMDQucHBtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgcmF3bjNwMDgucHBtCi0jIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgcmF3bjRhMDgucGdtCi0uL3BuZzJwbm0gLXJhdyAuLi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgcmF3bjRhMTYucGdtCi0jIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbmcycG5tIC1ub3JhdyAtYWxwaGEgcmF3bjZhMDgucGdtIC4uL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyByYXduNmEwOC5wcG0KLS4vcG5nMnBubSAtbm9yYXcgLWFscGhhIHJhd242YTE2LnBnbSAuLi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgcmF3bjZhMTYucHBtCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuYmF0IGIvY29udHJpYi9wbmdtaW51cy9wbmdtaW51cy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxMWJiOGQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdtaW51cy9wbmdtaW51cy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW1ha2UgLWYgbWFrZWZpbGUudGMzCi1jYWxsIHBuZzJwbm0uYmF0Ci1jYWxsIHBubTJwbmcuYmF0Ci0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuc2ggYi9jb250cmliL3BuZ21pbnVzL3BuZ21pbnVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYTBhOWQ4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nbWludXMvcG5nbWludXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMhL2Jpbi9zaAotbWFrZSAtZiBtYWtlZmlsZS5zdGQKLXNoIHBuZzJwbm0uc2gKLXNoIHBubTJwbmcuc2gKLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmJhdCBiL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3NTZjYjguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVJFTSAtLSBncmF5c2NhbGUKLXBubTJwbmcuZXhlIGJhc24wZzAxLnBnbSBiYXNuMGcwMS5wbmcKLXBubTJwbmcuZXhlIGJhc24wZzAyLnBnbSBiYXNuMGcwMi5wbmcKLXBubTJwbmcuZXhlIGJhc24wZzA0LnBnbSBiYXNuMGcwNC5wbmcKLXBubTJwbmcuZXhlIGJhc24wZzA4LnBnbSBiYXNuMGcwOC5wbmcKLXBubTJwbmcuZXhlIGJhc24wZzE2LnBnbSBiYXNuMGcxNi5wbmcKLVJFTSAtLSBmdWxsLWNvbG9yCi1wbm0ycG5nLmV4ZSBiYXNuMmMwOC5wcG0gYmFzbjJjMDgucG5nCi1wbm0ycG5nLmV4ZSBiYXNuMmMxNi5wcG0gYmFzbjJjMTYucG5nCi1SRU0gLS0gcGFsbGV0dGVkCi1wbm0ycG5nLmV4ZSBiYXNuM3AwMS5wcG0gYmFzbjNwMDEucG5nCi1wbm0ycG5nLmV4ZSBiYXNuM3AwMi5wcG0gYmFzbjNwMDIucG5nCi1wbm0ycG5nLmV4ZSBiYXNuM3AwNC5wcG0gYmFzbjNwMDQucG5nCi1wbm0ycG5nLmV4ZSBiYXNuM3AwOC5wcG0gYmFzbjNwMDgucG5nCi1SRU0gLS0gZ3JheSB3aXRoIGFscGhhLWNoYW5uZWwKLXBubTJwbmcuZXhlIC1hbHBoYSBiYXNuNmEwOC5wZ20gYmFzbjRhMDgucGdtIGJhc240YTA4LnBuZwotcG5tMnBuZy5leGUgLWFscGhhIGJhc242YTE2LnBnbSBiYXNuNGExNi5wZ20gYmFzbjRhMTYucG5nCi1SRU0gLS0gY29sb3Igd2l0aCBhbHBoYS1jaGFubmVsCi1wbm0ycG5nLmV4ZSAtYWxwaGEgYmFzbjZhMDgucGdtIGJhc242YTA4LnBwbSBiYXNuNmEwOC5wbmcKLXBubTJwbmcuZXhlIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjZhMTYucHBtIGJhc242YTE2LnBuZwotUkVNIC0tIGdyYXlzY2FsZQotcG5tMnBuZy5leGUgcmF3bjBnMDEucGdtIHJhd24wZzAxLnBuZwotcG5tMnBuZy5leGUgcmF3bjBnMDIucGdtIHJhd24wZzAyLnBuZwotcG5tMnBuZy5leGUgcmF3bjBnMDQucGdtIHJhd24wZzA0LnBuZwotcG5tMnBuZy5leGUgcmF3bjBnMDgucGdtIHJhd24wZzA4LnBuZwotcG5tMnBuZy5leGUgcmF3bjBnMTYucGdtIHJhd24wZzE2LnBuZwotUkVNIC0tIGZ1bGwtY29sb3IKLXBubTJwbmcuZXhlIHJhd24yYzA4LnBwbSByYXduMmMwOC5wbmcKLXBubTJwbmcuZXhlIHJhd24yYzE2LnBwbSByYXduMmMxNi5wbmcKLVJFTSAtLSBwYWxsZXR0ZWQKLXBubTJwbmcuZXhlIHJhd24zcDAxLnBwbSByYXduM3AwMS5wbmcKLXBubTJwbmcuZXhlIHJhd24zcDAyLnBwbSByYXduM3AwMi5wbmcKLXBubTJwbmcuZXhlIHJhd24zcDA0LnBwbSByYXduM3AwNC5wbmcKLXBubTJwbmcuZXhlIHJhd24zcDA4LnBwbSByYXduM3AwOC5wbmcKLVJFTSAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAotcG5tMnBuZy5leGUgLWFscGhhIHJhd242YTA4LnBnbSByYXduNGEwOC5wZ20gcmF3bjRhMDgucG5nCi1wbm0ycG5nLmV4ZSAtYWxwaGEgcmF3bjZhMTYucGdtIHJhd240YTE2LnBnbSByYXduNGExNi5wbmcKLVJFTSAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKLXBubTJwbmcuZXhlIC1hbHBoYSByYXduNmEwOC5wZ20gcmF3bjZhMDgucHBtIHJhd242YTA4LnBuZwotcG5tMnBuZy5leGUgLWFscGhhIHJhd242YTE2LnBnbSByYXduNmExNi5wcG0gcmF3bjZhMTYucG5nCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nbWludXMvcG5tMnBuZy5jIGIvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTY0Y2QuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotLyoKLSAqICBwbm0ycG5nLmMgLS0tIGNvbnZlcnNpb24gZnJvbSBQQk0vUEdNL1BQTS1maWxlIHRvIFBORy1maWxlCi0gKiAgY29weXJpZ2h0IChDKSAxOTk5IGJ5IFdpbGxlbSB2YW4gU2NoYWlrIDx3aWxsZW1Ac2NoYWlrLmNvbT4KLSAqCi0gKiAgdmVyc2lvbiAxLjAgLSAxOTk5LjEwLjE1IC0gRmlyc3QgdmVyc2lvbi4KLSAqICB2ZXJzaW9uIDEuMSAtIDIwMTUuMDcuMjkgLSBGaXhlZCBsZWFrcyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotICoKLSAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAotICogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi0gKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKLSAqICB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotICogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKLSAqICBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWZkZWYgX19UVVJCT0NfXwotI2luY2x1ZGUgPG1lbS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx6bGliLmg+Ci0KLSNpZm5kZWYgQk9PTAotI2RlZmluZSBCT09MIHVuc2lnbmVkIGNoYXIKLSNlbmRpZgotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgKEJPT0wpIDEKLSNlbmRpZgotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAoQk9PTCkgMAotI2VuZGlmCi0KLSNkZWZpbmUgU1RESU4gIDAKLSNkZWZpbmUgU1RET1VUIDEKLSNkZWZpbmUgU1RERVJSIDIKLQotLyogdG8gbWFrZSBwbm0ycG5nIHZlcmJvc2Ugc28gd2UgY2FuIGZpbmQgcHJvYmxlbXMgKG5lZWRzIHRvIGJlIGJlZm9yZSBwbmcuaCkgKi8KLSNpZm5kZWYgUE5HX0RFQlVHCi0jZGVmaW5lIFBOR19ERUJVRyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgInBuZy5oIgotCi0vKiBEZWZpbmUgcG5nX2ptcGJ1ZigpIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGEgcHJlLTEuMC42IHZlcnNpb24gb2YgbGlicG5nICovCi0jaWZuZGVmIHBuZ19qbXBidWYKLSMgIGRlZmluZSBwbmdfam1wYnVmKHBuZ19wdHIpICgocG5nX3B0ciktPmptcGJ1ZikKLSNlbmRpZgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLWludCAgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Ci12b2lkIHVzYWdlICgpOwotQk9PTCBwbm0ycG5nIChGSUxFICpwbm1fZmlsZSwgRklMRSAqcG5nX2ZpbGUsIEZJTEUgKmFscGhhX2ZpbGUsIEJPT0wgaW50ZXJsYWNlLAotICAgIEJPT0wgYWxwaGEpOwotdm9pZCBnZXRfdG9rZW4oRklMRSAqcG5tX2ZpbGUsIGNoYXIgKnRva2VuKTsKLXBuZ191aW50XzMyIGdldF9kYXRhIChGSUxFICpwbm1fZmlsZSwgaW50IGRlcHRoKTsKLXBuZ191aW50XzMyIGdldF92YWx1ZSAoRklMRSAqcG5tX2ZpbGUsIGludCBkZXB0aCk7Ci0KLS8qCi0gKiAgbWFpbgotICovCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIEZJTEUgKmZwX3JkID0gc3RkaW47Ci0gIEZJTEUgKmZwX2FsID0gTlVMTDsKLSAgRklMRSAqZnBfd3IgPSBzdGRvdXQ7Ci0gIEJPT0wgaW50ZXJsYWNlID0gRkFMU0U7Ci0gIEJPT0wgYWxwaGEgPSBGQUxTRTsKLSAgaW50IGFyZ2k7Ci0KLSAgZm9yIChhcmdpID0gMTsgYXJnaSA8IGFyZ2M7IGFyZ2krKykKLSAgewotICAgIGlmIChhcmd2W2FyZ2ldWzBdID09ICctJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ3ZbYXJnaV1bMV0pCi0gICAgICB7Ci0gICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgIGludGVybGFjZSA9IFRSVUU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgIGFscGhhID0gVFJVRTsKLSAgICAgICAgICBhcmdpKys7Ci0gICAgICAgICAgaWYgKChmcF9hbCA9IGZvcGVuIChhcmd2W2FyZ2ldLCAicmIiKSkgPT0gTlVMTCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgYWxwaGEtY2hhbm5lbCBmaWxlICVzIGRvZXMgbm90IGV4aXN0XG4iLAotICAgICAgICAgICAgICAgYXJndlthcmdpXSk7Ci0gICAgICAgICAgICBleGl0ICgxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bmtub3duIG9wdGlvbiAlc1xuIiwgYXJndlthcmdpXSk7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfSAvKiBlbmQgc3dpdGNoICovCi0gICAgfQotICAgIGVsc2UgaWYgKGZwX3JkID09IHN0ZGluKQotICAgIHsKLSAgICAgIGlmICgoZnBfcmQgPSBmb3BlbiAoYXJndlthcmdpXSwgInJiIikpID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGZpbGUgJXMgZG9lcyBub3QgZXhpc3RcbiIsIGFyZ3ZbYXJnaV0pOwotICAgICAgICBleGl0ICgxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZnBfd3IgPT0gc3Rkb3V0KQotICAgIHsKLSAgICAgIGlmICgoZnBfd3IgPSBmb3BlbiAoYXJndlthcmdpXSwgIndiIikpID09IE5VTEwpCi0gICAgICB7Ci0gICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogIGNhbiBub3QgY3JlYXRlIFBORy1maWxlICVzXG4iLCBhcmd2W2FyZ2ldKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HXG4iKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yOiAgdG9vIG1hbnkgcGFyYW1ldGVyc1xuIik7Ci0gICAgICB1c2FnZSgpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICB9IC8qIGVuZCBmb3IgKi8KLQotI2lmZGVmIF9fVFVSQk9DX18KLSAgLyogc2V0IHN0ZGluL3N0ZG91dCB0byBiaW5hcnksIHdlJ3JlIHJlYWRpbmcgdGhlIFBOTSBhbHdheXMhIGluIGJpbmFyeSBmb3JtYXQgKi8KLSAgaWYgKGZwX3JkID09IHN0ZGluKQotICB7Ci0gICAgc2V0bW9kZSAoU1RESU4sIE9fQklOQVJZKTsKLSAgfQotICBpZiAoZnBfd3IgPT0gc3Rkb3V0KQotICB7Ci0gICAgc2V0bW9kZSAoU1RET1VULCBPX0JJTkFSWSk7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIGNhbGwgdGhlIGNvbnZlcnNpb24gcHJvZ3JhbSBpdHNlbGYgKi8KLSAgaWYgKHBubTJwbmcgKGZwX3JkLCBmcF93ciwgZnBfYWwsIGludGVybGFjZSwgYWxwaGEpID09IEZBTFNFKQotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiUE5NMlBOR1xuIik7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6ICB1bnN1Y2Nlc3NmdWwgY29udmVydGluZyB0byBQTkctaW1hZ2VcbiIpOwotICAgIGV4aXQgKDEpOwotICB9Ci0KLSAgLyogY2xvc2UgaW5wdXQgZmlsZSAqLwotICBmY2xvc2UgKGZwX3JkKTsKLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZmNsb3NlIChmcF93cik7Ci0gIC8qIGNsb3NlIGFscGhhIGZpbGUgKi8KLSAgaWYgKGFscGhhKQotICAgIGZjbG9zZSAoZnBfYWwpOwotCi0gIHJldHVybiAwOwotfQotCi0vKgotICogIHVzYWdlCi0gKi8KLQotdm9pZCB1c2FnZSgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlBOTTJQTkdcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICIgICBieSBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OVxuIik7Ci0jaWZkZWYgX19UVVJCT0NfXwotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgVHVyYm8tQyBhbmQgQm9ybGFuZC1DIGNvbXBpbGVyc1xuIik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsICIgICBmb3IgTGludXggKGFuZCBVbml4KSBjb21waWxlcnNcbiIpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAgcG5tMnBuZyBbb3B0aW9uc10gPGZpbGU+Ljxwbm0+IFs8ZmlsZT4ucG5nXVxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIG9yOiAgLi4uIHwgcG5tMnBuZyBbb3B0aW9uc11cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgIC1pW250ZXJsYWNlXSAgIHdyaXRlIHBuZy1maWxlIHdpdGggaW50ZXJsYWNpbmcgb25cbiIpOwotICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAiICAgLWFbbHBoYV0gPGZpbGU+LnBnbSByZWFkIFBORyBhbHBoYSBjaGFubmVsIGFzIHBnbS1maWxlXG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICAgLWggfCAtPyAgcHJpbnQgdGhpcyBoZWxwLWluZm9ybWF0aW9uXG4iKTsKLX0KLQotLyoKLSAqICBwbm0ycG5nCi0gKi8KLQotQk9PTCBwbm0ycG5nIChGSUxFICpwbm1fZmlsZSwgRklMRSAqcG5nX2ZpbGUsIEZJTEUgKmFscGhhX2ZpbGUsIEJPT0wgaW50ZXJsYWNlLAotICAgICBCT09MIGFscGhhKQotewotICBwbmdfc3RydWN0ICAgICpwbmdfcHRyID0gTlVMTDsKLSAgcG5nX2luZm8gICAgICAqaW5mb19wdHIgPSBOVUxMOwotICBwbmdfYnl0ZSAgICAgICpwbmdfcGl4ZWxzID0gTlVMTDsKLSAgcG5nX2J5dGUgICAgICAqKnJvd19wb2ludGVycyA9IE5VTEw7Ci0gIHBuZ19ieXRlICAgICAgKnBpeF9wdHIgPSBOVUxMOwotICB2b2xhdGlsZSBwbmdfdWludF8zMiAgIHJvd19ieXRlczsKLQotICBjaGFyICAgICAgICAgIHR5cGVfdG9rZW5bMTZdOwotICBjaGFyICAgICAgICAgIHdpZHRoX3Rva2VuWzE2XTsKLSAgY2hhciAgICAgICAgICBoZWlnaHRfdG9rZW5bMTZdOwotICBjaGFyICAgICAgICAgIG1heHZhbF90b2tlblsxNl07Ci0gIHZvbGF0aWxlIGludCAgICBjb2xvcl90eXBlPTE7Ci0gIHVuc2lnbmVkIGxvbmcgICB1bF93aWR0aD0wLCB1bF9hbHBoYV93aWR0aD0wOwotICB1bnNpZ25lZCBsb25nICAgdWxfaGVpZ2h0PTAsIHVsX2FscGhhX2hlaWdodD0wOwotICB1bnNpZ25lZCBsb25nICAgdWxfbWF4dmFsPTA7Ci0gIHZvbGF0aWxlIHBuZ191aW50XzMyICAgd2lkdGg9MCwgaGVpZ2h0PTA7Ci0gIHZvbGF0aWxlIHBuZ191aW50XzMyICAgYWxwaGFfd2lkdGg9MCwgYWxwaGFfaGVpZ2h0PTA7Ci0gIHBuZ191aW50XzMyICAgbWF4dmFsOwotICB2b2xhdGlsZSBpbnQgICAgICAgICAgIGJpdF9kZXB0aCA9IDA7Ci0gIGludCAgICAgICAgICAgY2hhbm5lbHM9MDsKLSAgaW50ICAgICAgICAgICBhbHBoYV9kZXB0aCA9IDA7Ci0gIGludCAgICAgICAgICAgYWxwaGFfcHJlc2VudD0wOwotICBpbnQgICAgICAgICAgIHJvdywgY29sOwotICBCT09MICAgICAgICAgIHJhdywgYWxwaGFfcmF3ID0gRkFMU0U7Ci0jaWYgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpCi0gIEJPT0wgICAgICAgICAgcGFja2VkX2JpdG1hcCA9IEZBTFNFOwotI2VuZGlmCi0gIHBuZ191aW50XzMyICAgdG1wMTY7Ci0gIGludCAgICAgICAgICAgaTsKLQotICAvKiByZWFkIGhlYWRlciBvZiBQTk0gZmlsZSAqLwotCi0gIGdldF90b2tlbihwbm1fZmlsZSwgdHlwZV90b2tlbik7Ci0gIGlmICh0eXBlX3Rva2VuWzBdICE9ICdQJykKLSAgewotICAgIHJldHVybiBGQUxTRTsKLSAgfQotICBlbHNlIGlmICgodHlwZV90b2tlblsxXSA9PSAnMScpIHx8ICh0eXBlX3Rva2VuWzFdID09ICc0JykpCi0gIHsKLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkKLSAgICByYXcgPSAodHlwZV90b2tlblsxXSA9PSAnNCcpOwotICAgIGNvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9HUkFZOwotICAgIGdldF90b2tlbihwbm1fZmlsZSwgd2lkdGhfdG9rZW4pOwotICAgIHNzY2FuZiAod2lkdGhfdG9rZW4sICIlbHUiLCAmdWxfd2lkdGgpOwotICAgIHdpZHRoID0gKHBuZ191aW50XzMyKSB1bF93aWR0aDsKLSAgICBnZXRfdG9rZW4ocG5tX2ZpbGUsIGhlaWdodF90b2tlbik7Ci0gICAgc3NjYW5mIChoZWlnaHRfdG9rZW4sICIlbHUiLCAmdWxfaGVpZ2h0KTsKLSAgICBoZWlnaHQgPSAocG5nX3VpbnRfMzIpIHVsX2hlaWdodDsKLSAgICBiaXRfZGVwdGggPSAxOwotICAgIHBhY2tlZF9iaXRtYXAgPSBUUlVFOwotI2Vsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJQTk0yUE5HIGJ1aWx0IHdpdGhvdXQgUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQgYW5kIFxuIik7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEIGNhbid0IHJlYWQgUEJNIChQMSxQNCkgZmlsZXNcbiIpOwotI2VuZGlmCi0gIH0KLSAgZWxzZSBpZiAoKHR5cGVfdG9rZW5bMV0gPT0gJzInKSB8fCAodHlwZV90b2tlblsxXSA9PSAnNScpKQotICB7Ci0gICAgcmF3ID0gKHR5cGVfdG9rZW5bMV0gPT0gJzUnKTsKLSAgICBjb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKLSAgICBnZXRfdG9rZW4ocG5tX2ZpbGUsIHdpZHRoX3Rva2VuKTsKLSAgICBzc2NhbmYgKHdpZHRoX3Rva2VuLCAiJWx1IiwgJnVsX3dpZHRoKTsKLSAgICB3aWR0aCA9IChwbmdfdWludF8zMikgdWxfd2lkdGg7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBoZWlnaHRfdG9rZW4pOwotICAgIHNzY2FuZiAoaGVpZ2h0X3Rva2VuLCAiJWx1IiwgJnVsX2hlaWdodCk7Ci0gICAgaGVpZ2h0ID0gKHBuZ191aW50XzMyKSB1bF9oZWlnaHQ7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgIHNzY2FuZiAobWF4dmFsX3Rva2VuLCAiJWx1IiwgJnVsX21heHZhbCk7Ci0gICAgbWF4dmFsID0gKHBuZ191aW50XzMyKSB1bF9tYXh2YWw7Ci0KLSAgICBpZiAobWF4dmFsIDw9IDEpCi0gICAgICBiaXRfZGVwdGggPSAxOwotICAgIGVsc2UgaWYgKG1heHZhbCA8PSAzKQotICAgICAgYml0X2RlcHRoID0gMjsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMTUpCi0gICAgICBiaXRfZGVwdGggPSA0OwotICAgIGVsc2UgaWYgKG1heHZhbCA8PSAyNTUpCi0gICAgICBiaXRfZGVwdGggPSA4OwotICAgIGVsc2UgLyogaWYgKG1heHZhbCA8PSA2NTUzNSkgKi8KLSAgICAgIGJpdF9kZXB0aCA9IDE2OwotICB9Ci0gIGVsc2UgaWYgKCh0eXBlX3Rva2VuWzFdID09ICczJykgfHwgKHR5cGVfdG9rZW5bMV0gPT0gJzYnKSkKLSAgewotICAgIHJhdyA9ICh0eXBlX3Rva2VuWzFdID09ICc2Jyk7Ci0gICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKLSAgICBnZXRfdG9rZW4ocG5tX2ZpbGUsIHdpZHRoX3Rva2VuKTsKLSAgICBzc2NhbmYgKHdpZHRoX3Rva2VuLCAiJWx1IiwgJnVsX3dpZHRoKTsKLSAgICB3aWR0aCA9IChwbmdfdWludF8zMikgdWxfd2lkdGg7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBoZWlnaHRfdG9rZW4pOwotICAgIHNzY2FuZiAoaGVpZ2h0X3Rva2VuLCAiJWx1IiwgJnVsX2hlaWdodCk7Ci0gICAgaGVpZ2h0ID0gKHBuZ191aW50XzMyKSB1bF9oZWlnaHQ7Ci0gICAgZ2V0X3Rva2VuKHBubV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgIHNzY2FuZiAobWF4dmFsX3Rva2VuLCAiJWx1IiwgJnVsX21heHZhbCk7Ci0gICAgbWF4dmFsID0gKHBuZ191aW50XzMyKSB1bF9tYXh2YWw7Ci0gICAgaWYgKG1heHZhbCA8PSAxKQotICAgICAgYml0X2RlcHRoID0gMTsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMykKLSAgICAgIGJpdF9kZXB0aCA9IDI7Ci0gICAgZWxzZSBpZiAobWF4dmFsIDw9IDE1KQotICAgICAgYml0X2RlcHRoID0gNDsKLSAgICBlbHNlIGlmIChtYXh2YWwgPD0gMjU1KQotICAgICAgYml0X2RlcHRoID0gODsKLSAgICBlbHNlIC8qIGlmIChtYXh2YWwgPD0gNjU1MzUpICovCi0gICAgICBiaXRfZGVwdGggPSAxNjsKLSAgfQotICBlbHNlCi0gIHsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiByZWFkIGhlYWRlciBvZiBQR00gZmlsZSB3aXRoIGFscGhhIGNoYW5uZWwgKi8KLQotICBpZiAoYWxwaGEpCi0gIHsKLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEE7Ci0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCKQotICAgICAgY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKLQotICAgIGdldF90b2tlbihhbHBoYV9maWxlLCB0eXBlX3Rva2VuKTsKLSAgICBpZiAodHlwZV90b2tlblswXSAhPSAnUCcpCi0gICAgewotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGlmICgodHlwZV90b2tlblsxXSA9PSAnMicpIHx8ICh0eXBlX3Rva2VuWzFdID09ICc1JykpCi0gICAgewotICAgICAgYWxwaGFfcmF3ID0gKHR5cGVfdG9rZW5bMV0gPT0gJzUnKTsKLSAgICAgIGdldF90b2tlbihhbHBoYV9maWxlLCB3aWR0aF90b2tlbik7Ci0gICAgICBzc2NhbmYgKHdpZHRoX3Rva2VuLCAiJWx1IiwgJnVsX2FscGhhX3dpZHRoKTsKLSAgICAgIGFscGhhX3dpZHRoPShwbmdfdWludF8zMikgdWxfYWxwaGFfd2lkdGg7Ci0gICAgICBpZiAoYWxwaGFfd2lkdGggIT0gd2lkdGgpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIGdldF90b2tlbihhbHBoYV9maWxlLCBoZWlnaHRfdG9rZW4pOwotICAgICAgc3NjYW5mIChoZWlnaHRfdG9rZW4sICIlbHUiLCAmdWxfYWxwaGFfaGVpZ2h0KTsKLSAgICAgIGFscGhhX2hlaWdodCA9IChwbmdfdWludF8zMikgdWxfYWxwaGFfaGVpZ2h0OwotICAgICAgaWYgKGFscGhhX2hlaWdodCAhPSBoZWlnaHQpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIGdldF90b2tlbihhbHBoYV9maWxlLCBtYXh2YWxfdG9rZW4pOwotICAgICAgc3NjYW5mIChtYXh2YWxfdG9rZW4sICIlbHUiLCAmdWxfbWF4dmFsKTsKLSAgICAgIG1heHZhbCA9IChwbmdfdWludF8zMikgdWxfbWF4dmFsOwotICAgICAgaWYgKG1heHZhbCA8PSAxKQotICAgICAgICBhbHBoYV9kZXB0aCA9IDE7Ci0gICAgICBlbHNlIGlmIChtYXh2YWwgPD0gMykKLSAgICAgICAgYWxwaGFfZGVwdGggPSAyOwotICAgICAgZWxzZSBpZiAobWF4dmFsIDw9IDE1KQotICAgICAgICBhbHBoYV9kZXB0aCA9IDQ7Ci0gICAgICBlbHNlIGlmIChtYXh2YWwgPD0gMjU1KQotICAgICAgICBhbHBoYV9kZXB0aCA9IDg7Ci0gICAgICBlbHNlIC8qIGlmIChtYXh2YWwgPD0gNjU1MzUpICovCi0gICAgICAgIGFscGhhX2RlcHRoID0gMTY7Ci0gICAgICBpZiAoYWxwaGFfZGVwdGggIT0gYml0X2RlcHRoKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICB9IC8qIGVuZCBpZiBhbHBoYSAqLwotCi0gIC8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBzdG9yZSBhbHBoYS1wcmVzZW5jZSAqLwotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgIGNoYW5uZWxzID0gMTsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgIGNoYW5uZWxzID0gMjsKLSAgZWxzZSBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgY2hhbm5lbHMgPSAzOwotICBlbHNlIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICBjaGFubmVscyA9IDQ7Ci0jaWYgMAotICBlbHNlCi0gICAgY2hhbm5lbHMgPSAwOyAvKiBjYW5ub3QgaGFwcGVuICovCi0jZW5kaWYKLQotICBhbHBoYV9wcmVzZW50ID0gKGNoYW5uZWxzIC0gMSkgJSAyOwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQpCi0gIGlmIChwYWNrZWRfYml0bWFwKQotICAgIC8qIHJvdyBkYXRhIGlzIGFzIG1hbnkgYnl0ZXMgYXMgY2FuIGZpdCB3aWR0aCB4IGNoYW5uZWxzIHggYml0X2RlcHRoICovCi0gICAgcm93X2J5dGVzID0gKHdpZHRoICogY2hhbm5lbHMgKiBiaXRfZGVwdGggKyA3KSAvIDg7Ci0gIGVsc2UKLSNlbmRpZgotICAgIC8qIHJvd19ieXRlcyBpcyB0aGUgd2lkdGggeCBudW1iZXIgb2YgY2hhbm5lbHMgeCAoYml0LWRlcHRoIC8gOCkgKi8KLSAgICByb3dfYnl0ZXMgPSB3aWR0aCAqIGNoYW5uZWxzICogKChiaXRfZGVwdGggPD0gOCkgPyAxIDogMik7Ci0KLSAgaWYgKChwbmdfcGl4ZWxzID0gKHBuZ19ieXRlICopCi0gICAgIG1hbGxvYyAocm93X2J5dGVzICogaGVpZ2h0ICogc2l6ZW9mIChwbmdfYnl0ZSkpKSA9PSBOVUxMKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiByZWFkIGRhdGEgZnJvbSBQTk0gZmlsZSAqLwotICBwaXhfcHRyID0gcG5nX3BpeGVsczsKLQotICBmb3IgKHJvdyA9IDA7IHJvdyA8IChpbnQpIGhlaWdodDsgcm93KyspCi0gIHsKLSNpZiBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9QQUNLX1NVUFBPUlRFRCkKLSAgICBpZiAocGFja2VkX2JpdG1hcCkgewotICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHJvd19ieXRlczsgaSsrKQotICAgICAgICAvKiBwbmcgc3VwcG9ydHMgdGhpcyBmb3JtYXQgbmF0aXZlbHkgc28gbm8gY29udmVyc2lvbiBpcyBuZWVkZWQgKi8KLSAgICAgICAgKnBpeF9wdHIrKyA9IGdldF9kYXRhIChwbm1fZmlsZSwgOCk7Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChpbnQpIHdpZHRoOyBjb2wrKykKLSAgICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IChjaGFubmVscyAtIGFscGhhX3ByZXNlbnQpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmF3KQotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF9kYXRhIChwbm1fZmlsZSwgYml0X2RlcHRoKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAoYml0X2RlcHRoIDw9IDgpCi0gICAgICAgICAgICAgICpwaXhfcHRyKysgPSBnZXRfdmFsdWUgKHBubV9maWxlLCBiaXRfZGVwdGgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0bXAxNiA9IGdldF92YWx1ZSAocG5tX2ZpbGUsIGJpdF9kZXB0aCk7Ci0gICAgICAgICAgICAgICpwaXhfcHRyID0gKHBuZ19ieXRlKSAoKHRtcDE2ID4+IDgpICYgMHhGRik7Ci0gICAgICAgICAgICAgIHBpeF9wdHIrKzsKLSAgICAgICAgICAgICAgKnBpeF9wdHIgPSAocG5nX2J5dGUpICh0bXAxNiAmIDB4RkYpOwotICAgICAgICAgICAgICBwaXhfcHRyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWxwaGEpIC8qIHJlYWQgYWxwaGEtY2hhbm5lbCBmcm9tIHBnbSBmaWxlICovCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYWxwaGFfcmF3KQotICAgICAgICAgICAgKnBpeF9wdHIrKyA9IGdldF9kYXRhIChhbHBoYV9maWxlLCBhbHBoYV9kZXB0aCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgKGFscGhhX2RlcHRoIDw9IDgpCi0gICAgICAgICAgICAgICpwaXhfcHRyKysgPSBnZXRfdmFsdWUgKGFscGhhX2ZpbGUsIGJpdF9kZXB0aCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRtcDE2ID0gZ2V0X3ZhbHVlIChhbHBoYV9maWxlLCBiaXRfZGVwdGgpOwotICAgICAgICAgICAgICAqcGl4X3B0cisrID0gKHBuZ19ieXRlKSAoKHRtcDE2ID4+IDgpICYgMHhGRik7Ci0gICAgICAgICAgICAgICpwaXhfcHRyKysgPSAocG5nX2J5dGUpICh0bXAxNiAmIDB4RkYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIGlmIGFscGhhICovCi0gICAgICB9IC8qIGlmIHBhY2tlZF9iaXRtYXAgKi8KLSAgICB9IC8qIGVuZCBmb3IgY29sICovCi0gIH0gLyogZW5kIGZvciByb3cgKi8KLQotICAvKiBwcmVwYXJlIHRoZSBzdGFuZGFyZCBQTkcgc3RydWN0dXJlcyAqLwotICBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QgKHBuZ19nZXRfbGlicG5nX3ZlcihOVUxMKSwgTlVMTCwgTlVMTCwKLSAgICAgIE5VTEwpOwotICBpZiAoIXBuZ19wdHIpCi0gIHsKLSAgICBmcmVlIChwbmdfcGl4ZWxzKTsKLSAgICBwbmdfcGl4ZWxzID0gTlVMTDsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdfcHRyKTsKLSAgaWYgKCFpbmZvX3B0cikKLSAgewotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKLSAgICBmcmVlIChwbmdfcGl4ZWxzKTsKLSAgICBwbmdfcGl4ZWxzID0gTlVMTDsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotI2lmIGRlZmluZWQoUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEKQotICBpZiAocGFja2VkX2JpdG1hcCA9PSBUUlVFKQotICB7Ci0gICAgcG5nX3NldF9wYWNraW5nIChwbmdfcHRyKTsKLSAgICBwbmdfc2V0X2ludmVydF9tb25vIChwbmdfcHRyKTsKLSAgfQotI2VuZGlmCi0KLSAgLyogc2V0am1wKCkgbXVzdCBiZSBjYWxsZWQgaW4gZXZlcnkgZnVuY3Rpb24gdGhhdCBjYWxscyBhIFBORy1yZWFkaW5nIGxpYnBuZyBmdW5jdGlvbiAqLwotICBpZiAoc2V0am1wIChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgewotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0gICAgZnJlZSAocG5nX3BpeGVscyk7Ci0gICAgcG5nX3BpeGVscyA9IE5VTEw7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogaW5pdGlhbGl6ZSB0aGUgcG5nIHN0cnVjdHVyZSAqLwotICBwbmdfaW5pdF9pbyAocG5nX3B0ciwgcG5nX2ZpbGUpOwotCi0gIC8qIHdlJ3JlIGdvaW5nIHRvIHdyaXRlIG1vcmUgb3IgbGVzcyB0aGUgc2FtZSBQTkcgYXMgdGhlIGlucHV0IGZpbGUgKi8KLSAgcG5nX3NldF9JSERSIChwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgYml0X2RlcHRoLCBjb2xvcl90eXBlLAotICAgICghaW50ZXJsYWNlKSA/IFBOR19JTlRFUkxBQ0VfTk9ORSA6IFBOR19JTlRFUkxBQ0VfQURBTTcsCi0gICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOwotCi0gIC8qIHdyaXRlIHRoZSBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotICBwbmdfd3JpdGVfaW5mbyAocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8qIGlmIG5lZWRlZCB3ZSB3aWxsIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gbmV3IGFycmF5IG9mIHJvdy1wb2ludGVycyAqLwotICBpZiAocm93X3BvaW50ZXJzID09ICh1bnNpZ25lZCBjaGFyKiopIE5VTEwpCi0gIHsKLSAgICBpZiAoKHJvd19wb2ludGVycyA9IChwbmdfYnl0ZSAqKikKLSAgICAgICAgbWFsbG9jIChoZWlnaHQgKiBzaXplb2YgKHBuZ19ieXRlcCkpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0gICAgICBmcmVlIChwbmdfcGl4ZWxzKTsKLSAgICAgIHBuZ19waXhlbHMgPSBOVUxMOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgfQotCi0gIC8qIHNldCB0aGUgaW5kaXZpZHVhbCByb3dfcG9pbnRlcnMgdG8gcG9pbnQgYXQgdGhlIGNvcnJlY3Qgb2Zmc2V0cyAqLwotICBmb3IgKGkgPSAwOyBpIDwgKGludCkgaGVpZ2h0OyBpKyspCi0gICAgcm93X3BvaW50ZXJzW2ldID0gcG5nX3BpeGVscyArIGkgKiByb3dfYnl0ZXM7Ci0KLSAgLyogd3JpdGUgb3V0IHRoZSBlbnRpcmUgaW1hZ2UgZGF0YSBpbiBvbmUgY2FsbCAqLwotICBwbmdfd3JpdGVfaW1hZ2UgKHBuZ19wdHIsIHJvd19wb2ludGVycyk7Ci0KLSAgLyogd3JpdGUgdGhlIGFkZGl0aW9uYWwgY2h1bmtzIHRvIHRoZSBQTkcgZmlsZSAobm90IHJlYWxseSBuZWVkZWQpICovCi0gIHBuZ193cml0ZV9lbmQgKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAvKiBjbGVhbiB1cCBhZnRlciB0aGUgd3JpdGUsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkICovCi0gIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0KLSAgaWYgKHJvd19wb2ludGVycyAhPSAodW5zaWduZWQgY2hhcioqKSBOVUxMKQotICAgIGZyZWUgKHJvd19wb2ludGVycyk7Ci0gIGlmIChwbmdfcGl4ZWxzICE9ICh1bnNpZ25lZCBjaGFyKikgTlVMTCkKLSAgICBmcmVlIChwbmdfcGl4ZWxzKTsKLQotICByZXR1cm4gVFJVRTsKLX0gLyogZW5kIG9mIHBubTJwbmcgKi8KLQotLyoKLSAqIGdldF90b2tlbigpIC0gZ2V0cyB0aGUgZmlyc3Qgc3RyaW5nIGFmdGVyIHdoaXRlc3BhY2UKLSAqLwotCi12b2lkIGdldF90b2tlbihGSUxFICpwbm1fZmlsZSwgY2hhciAqdG9rZW4pCi17Ci0gIGludCBpID0gMDsKLSAgaW50IHJldDsKLQotICAvKiByZW1vdmUgd2hpdGUtc3BhY2UgYW5kIGNvbW1lbnQgbGluZXMgKi8KLSAgZG8KLSAgewotICAgIHJldCA9IGZnZXRjKHBubV9maWxlKTsKLSAgICBpZiAocmV0ID09ICcjJykgewotICAgICAgLyogdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGlzIGEgY29tbWVudCAqLwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgcmV0ID0gZmdldGMocG5tX2ZpbGUpOwotICAgICAgfQotICAgICAgd2hpbGUgKChyZXQgIT0gJ1xuJykgJiYgKHJldCAhPSAnXHInKSAmJiAocmV0ICE9IEVPRikpOwotICAgIH0KLSAgICBpZiAocmV0ID09IEVPRikgYnJlYWs7Ci0gICAgdG9rZW5baV0gPSAodW5zaWduZWQgY2hhcikgcmV0OwotICB9Ci0gIHdoaWxlICgodG9rZW5baV0gPT0gJ1xuJykgfHwgKHRva2VuW2ldID09ICdccicpIHx8ICh0b2tlbltpXSA9PSAnICcpKTsKLQotICAvKiByZWFkIHN0cmluZyAqLwotICBkbwotICB7Ci0gICAgcmV0ID0gZmdldGMocG5tX2ZpbGUpOwotICAgIGlmIChyZXQgPT0gRU9GKSBicmVhazsKLSAgICBpKys7Ci0gICAgdG9rZW5baV0gPSAodW5zaWduZWQgY2hhcikgcmV0OwotICB9Ci0gIHdoaWxlICgodG9rZW5baV0gIT0gJ1xuJykgJiYgKHRva2VuW2ldICE9ICdccicpICYmICh0b2tlbltpXSAhPSAnICcpKTsKLQotICB0b2tlbltpXSA9ICdcMCc7Ci0KLSAgcmV0dXJuOwotfQotCi0vKgotICogZ2V0X2RhdGEoKSAtIHRha2VzIGZpcnN0IGJ5dGUgYW5kIGNvbnZlcnRzIGludG8gbmV4dCBwaXhlbCB2YWx1ZSwKLSAqICAgICAgICB0YWtpbmcgYXMgbXVjaCBiaXRzIGFzIGRlZmluZWQgYnkgYml0LWRlcHRoIGFuZAotICogICAgICAgIHVzaW5nIHRoZSBiaXQtZGVwdGggdG8gZmlsbCB1cCBhIGJ5dGUgKDBBaCAtPiBBQWgpCi0gKi8KLQotcG5nX3VpbnRfMzIgZ2V0X2RhdGEgKEZJTEUgKnBubV9maWxlLCBpbnQgZGVwdGgpCi17Ci0gIHN0YXRpYyBpbnQgYml0c19sZWZ0ID0gMDsKLSAgc3RhdGljIGludCBvbGRfdmFsdWUgPSAwOwotICBzdGF0aWMgaW50IG1hc2sgPSAwOwotICBpbnQgaTsKLSAgcG5nX3VpbnRfMzIgcmV0X3ZhbHVlOwotCi0gIGlmIChtYXNrID09IDApCi0gICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspCi0gICAgICBtYXNrID0gKG1hc2sgPj4gMSkgfCAweDgwOwotCi0gIGlmIChiaXRzX2xlZnQgPD0gMCkKLSAgewotICAgIG9sZF92YWx1ZSA9IGZnZXRjIChwbm1fZmlsZSk7Ci0gICAgYml0c19sZWZ0ID0gODsKLSAgfQotCi0gIHJldF92YWx1ZSA9IG9sZF92YWx1ZSAmIG1hc2s7Ci0gIGZvciAoaSA9IDE7IGkgPCAoOCAvIGRlcHRoKTsgaSsrKQotICAgIHJldF92YWx1ZSA9IHJldF92YWx1ZSB8fCAocmV0X3ZhbHVlID4+IGRlcHRoKTsKLQotICBvbGRfdmFsdWUgPSAob2xkX3ZhbHVlIDw8IGRlcHRoKSAmIDB4RkY7Ci0gIGJpdHNfbGVmdCAtPSBkZXB0aDsKLQotICByZXR1cm4gcmV0X3ZhbHVlOwotfQotCi0vKgotICogZ2V0X3ZhbHVlKCkgLSB0YWtlcyBmaXJzdCAobnVtZXJpYykgc3RyaW5nIGFuZCBjb252ZXJ0cyBpbnRvIG51bWJlciwKLSAqICAgICAgICAgdXNpbmcgdGhlIGJpdC1kZXB0aCB0byBmaWxsIHVwIGEgYnl0ZSAoMEFoIC0+IEFBaCkKLSAqLwotCi1wbmdfdWludF8zMiBnZXRfdmFsdWUgKEZJTEUgKnBubV9maWxlLCBpbnQgZGVwdGgpCi17Ci0gIHN0YXRpYyBwbmdfdWludF8zMiBtYXNrID0gMDsKLSAgcG5nX2J5dGUgdG9rZW5bMTZdOwotICB1bnNpZ25lZCBsb25nIHVsX3JldF92YWx1ZTsKLSAgcG5nX3VpbnRfMzIgcmV0X3ZhbHVlOwotICBpbnQgaSA9IDA7Ci0KLSAgaWYgKG1hc2sgPT0gMCkKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKLSAgICAgIG1hc2sgPSAobWFzayA8PCAxKSB8IDB4MDE7Ci0KLSAgZ2V0X3Rva2VuIChwbm1fZmlsZSwgKGNoYXIgKikgdG9rZW4pOwotICBzc2NhbmYgKChjb25zdCBjaGFyICopIHRva2VuLCAiJWx1IiwgJnVsX3JldF92YWx1ZSk7Ci0gIHJldF92YWx1ZSA9IChwbmdfdWludF8zMikgdWxfcmV0X3ZhbHVlOwotCi0gIHJldF92YWx1ZSAmPSBtYXNrOwotCi0gIGlmIChkZXB0aCA8IDgpCi0gICAgZm9yIChpID0gMDsgaSA8ICg4IC8gZGVwdGgpOyBpKyspCi0gICAgICByZXRfdmFsdWUgPSAocmV0X3ZhbHVlIDw8IGRlcHRoKSB8fCByZXRfdmFsdWU7Ci0KLSAgcmV0dXJuIHJldF92YWx1ZTsKLX0KLQotLyogZW5kIG9mIHNvdXJjZSAqLwotCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuc2ggYi9jb250cmliL3BuZ21pbnVzL3BubTJwbmcuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3OWRmMmYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdtaW51cy9wbm0ycG5nLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyEvYmluL3NoCi0jIC0tIGdyYXlzY2FsZQotLi9wbm0ycG5nIGJhc24wZzAxLnBnbSBiYXNuMGcwMS5wbmcKLS4vcG5tMnBuZyBiYXNuMGcwMi5wZ20gYmFzbjBnMDIucG5nCi0uL3BubTJwbmcgYmFzbjBnMDQucGdtIGJhc24wZzA0LnBuZwotLi9wbm0ycG5nIGJhc24wZzA4LnBnbSBiYXNuMGcwOC5wbmcKLS4vcG5tMnBuZyBiYXNuMGcxNi5wZ20gYmFzbjBnMTYucG5nCi0jIC0tIGZ1bGwtY29sb3IKLS4vcG5tMnBuZyBiYXNuMmMwOC5wcG0gYmFzbjJjMDgucG5nCi0uL3BubTJwbmcgYmFzbjJjMTYucHBtIGJhc24yYzE2LnBuZwotIyAtLSBwYWxsZXR0ZWQKLS4vcG5tMnBuZyBiYXNuM3AwMS5wcG0gYmFzbjNwMDEucG5nCi0uL3BubTJwbmcgYmFzbjNwMDIucHBtIGJhc24zcDAyLnBuZwotLi9wbm0ycG5nIGJhc24zcDA0LnBwbSBiYXNuM3AwNC5wbmcKLS4vcG5tMnBuZyBiYXNuM3AwOC5wcG0gYmFzbjNwMDgucG5nCi0jIC0tIGdyYXkgd2l0aCBhbHBoYS1jaGFubmVsCi0uL3BubTJwbmcgLWFscGhhIGJhc242YTA4LnBnbSBiYXNuNGEwOC5wZ20gYmFzbjRhMDgucG5nCi0uL3BubTJwbmcgLWFscGhhIGJhc242YTE2LnBnbSBiYXNuNGExNi5wZ20gYmFzbjRhMTYucG5nCi0jIC0tIGNvbG9yIHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmEwOC5wZ20gYmFzbjZhMDgucHBtIGJhc242YTA4LnBuZwotLi9wbm0ycG5nIC1hbHBoYSBiYXNuNmExNi5wZ20gYmFzbjZhMTYucHBtIGJhc242YTE2LnBuZwotIyAtLSBncmF5c2NhbGUKLS4vcG5tMnBuZyByYXduMGcwMS5wZ20gcmF3bjBnMDEucG5nCi0uL3BubTJwbmcgcmF3bjBnMDIucGdtIHJhd24wZzAyLnBuZwotLi9wbm0ycG5nIHJhd24wZzA0LnBnbSByYXduMGcwNC5wbmcKLS4vcG5tMnBuZyByYXduMGcwOC5wZ20gcmF3bjBnMDgucG5nCi0uL3BubTJwbmcgcmF3bjBnMTYucGdtIHJhd24wZzE2LnBuZwotIyAtLSBmdWxsLWNvbG9yCi0uL3BubTJwbmcgcmF3bjJjMDgucHBtIHJhd24yYzA4LnBuZwotLi9wbm0ycG5nIHJhd24yYzE2LnBwbSByYXduMmMxNi5wbmcKLSMgLS0gcGFsbGV0dGVkCi0uL3BubTJwbmcgcmF3bjNwMDEucHBtIHJhd24zcDAxLnBuZwotLi9wbm0ycG5nIHJhd24zcDAyLnBwbSByYXduM3AwMi5wbmcKLS4vcG5tMnBuZyByYXduM3AwNC5wcG0gcmF3bjNwMDQucG5nCi0uL3BubTJwbmcgcmF3bjNwMDgucHBtIHJhd24zcDA4LnBuZwotIyAtLSBncmF5IHdpdGggYWxwaGEtY2hhbm5lbAotLi9wbm0ycG5nIC1hbHBoYSByYXduNmEwOC5wZ20gcmF3bjRhMDgucGdtIHJhd240YTA4LnBuZwotLi9wbm0ycG5nIC1hbHBoYSByYXduNmExNi5wZ20gcmF3bjRhMTYucGdtIHJhd240YTE2LnBuZwotIyAtLSBjb2xvciB3aXRoIGFscGhhLWNoYW5uZWwKLS4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMDgucGdtIHJhd242YTA4LnBwbSByYXduNmEwOC5wbmcKLS4vcG5tMnBuZyAtYWxwaGEgcmF3bjZhMTYucGdtIHJhd242YTE2LnBwbSByYXduNmExNi5wbmcKLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9SRUFETUUgYi9jb250cmliL3BuZ3N1aXRlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmZGU4Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0KLXBuZ3N1aXRlCi0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSBXaWxsZW0gdmFuIFNjaGFpaywgMTk5OSwgMjAxMSwgMjAxMgotVHdvIGltYWdlcyAoZnRiYm4wZzAxLnBuZyBhbmQgZnRiYm4wZzAyLnBuZykgYXJlIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgMjAxMgotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGVzZSBpbWFnZXMgZm9yIGFueQotcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCi0KLVRoZSAxNSAiYmFzKi5wbmciIGltYWdlcyBhcmUgcGFydCBvZiB0aGUgbXVjaCBsYXJnZXIgUG5nU3VpdGUgdGVzdC1zZXQgb2YKLWltYWdlcywgYXZhaWxhYmxlIGZvciBkZXZlbG9wZXJzIG9mIFBORyBzdXBwb3J0aW5nIHNvZnR3YXJlLiBUaGUKLWNvbXBsZXRlIHNldCwgYXZhaWxhYmxlIGF0IGh0dHA6L3d3dy5zY2hhaWsuY29tL3BuZ3N1aXRlLywgY29udGFpbnMKLWEgdmFyaWV0eSBvZiBpbWFnZXMgdG8gdGVzdCBpbnRlcmxhY2luZywgZ2FtbWEgc2V0dGluZ3MsIGFuY2lsbGFyeQotY2h1bmtzLCBldGMuCi0KLVRoZSAiZnQqLnBuZyIgaW1hZ2VzIGFyZSAiZnJlZS9saWJyZSIgcmVwbGFjZW1lbnRzIGZvciB0aGUgdHJhbnNwYXJlbnQKLWNvcnJlc3BvbmRpbmcgdCoucG5nIGltYWdlcyBpbiB0aGUgUG5nU3VpdGUuCi0KLVRoZSBpbWFnZXMgaW4gdGhpcyBkaXJlY3RvcnkgcmVwcmVzZW50IHRoZSBiYXNpYyBQTkcgY29sb3ItdHlwZXM6Ci1ncmF5c2NhbGUgKDEtMTYgYml0IGRlZXApLCBmdWxsIGNvbG9yICg4IG9yIDE2IGJpdCksIHBhbGV0dGVkCi0oMS04IGJpdCkgYW5kIGdyYXlzY2FsZSBvciBjb2xvciBpbWFnZXMgd2l0aCBhbHBoYSBjaGFubmVsLiBZb3UKLWNhbiB1c2UgdGhlbSB0byB0ZXN0IHRoZSBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgUE5HIHNvZnR3YXJlLgotCi0gICAgZmlsZW5hbWUgICAgICAgZGVwdGggdHlwZQotICAgIC0tLS0tLS0tLS0tLSAtLS0tLS0gLS0tLS0tLS0tLS0tLS0KLSAgICBiYXNuMGcwMS5wbmcgICAxLWJpdCBncmF5c2NhbGUKLSAgICBiYXNuMGcwMi5wbmcgICAyLWJpdCBncmF5c2NhbGUKLSAgICBiYXNuMGcwNC5wbmcgICA0LWJpdCBncmF5c2NhbGUKLSAgICBiYXNuMGcwOC5wbmcgICA4LWJpdCBncmF5c2NhbGUKLSAgICBiYXNuMGcxNi5wbmcgIDE2LWJpdCBncmF5c2NhbGUKLSAgICBiYXNuMmMwOC5wbmcgICA4LWJpdCB0cnVlY29sb3IKLSAgICBiYXNuMmMxNi5wbmcgIDE2LWJpdCB0cnVlY29sb3IKLSAgICBiYXNuM3AwMS5wbmcgICAxLWJpdCBwYWxldHRlZAotICAgIGJhc24zcDAyLnBuZyAgIDItYml0IHBhbGV0dGVkCi0gICAgYmFzbjNwMDQucG5nICAgNC1iaXQgcGFsZXR0ZWQKLSAgICBiYXNuM3AwOC5wbmcgICA4LWJpdCBwYWxldHRlZAotICAgIGJhc240YTA4LnBuZyAgIDgtYml0IGdyYXkgd2l0aCBhbHBoYQotICAgIGJhc240YTE2LnBuZyAgMTYtYml0IGdyYXkgd2l0aCBhbHBoYQotICAgIGJhc242YTA4LnBuZyAgIDgtYml0IFJHQkEKLSAgICBiYXNuNmExNi5wbmcgIDE2LWJpdCBSR0JBCi0KLSAgICBmdGJibjBnMDEucG5nICAxLWJpdCBncmF5c2NhbGUsIGJsYWNrIGJLR0QKLSAgICBmdGJibjBnMDIucG5nICAyLWJpdCBncmF5c2NhbGUsIGJsYWNrIGJLR0QKLSAgICBmdGJibjBnMDQucG5nICA0LWJpdCBncmF5c2NhbGUsIGJsYWNrIGJLR0QKLSAgICBmdGJibjJjMTYucG5nIDE2LWJpdCB0cnVlY29sb3IsIGJsYWNrIGJLR0QKLSAgICBmdGJibjNwMDgucG5nICA4LWJpdCBwYWxldHRlZCwgYmxhY2sgYktHRAotICAgIGZ0YmduMmMxNi5wbmcgMTYtYml0IHRydWVjb2xvciwgZ3JheSBiS0dECi0gICAgZnRiZ24zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIGdyYXkgYktHRAotICAgIGZ0YnJuMmMwOC5wbmcgIDgtYml0IHRydWVjb2xvciwgcmVkIGJLR0QKLSAgICBmdGJ3bjBnMTYucG5nIDE2LWJpdCBncmF5LCB3aGl0ZSBiS0dECi0gICAgZnRid24zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIHdoaXRlIGJLR0QKLSAgICBmdGJ5bjNwMDgucG5nICA4LWJpdCBwYWxldHRlZCwgeWVsbG93IGJLR0QKLSAgICBmdHAwbjBnMDgucG5nICA4LWJpdCBncmF5c2NhbGUsIG9wYXF1ZQotICAgIGZ0cDBuMmMwOC5wbmcgIDgtYml0IHRydWVjb2xvciwgb3BhcXVlCi0gICAgZnRwMG4zcDA4LnBuZyAgOC1iaXQgcGFsZXR0ZWQsIG9wYXF1ZQotICAgIGZ0cDFuM3AwOC5wbmcgIDgtYml0IHBhbGV0dGVkLCBubyBiS0dECi0KLUhlcmUgaXMgdGhlIGNvcnJlY3QgcmVzdWx0IG9mIHR5cGluZyAicG5ndGVzdCAtbSBiYXMqLnBuZyIgaW4KLXRoaXMgZGlyZWN0b3J5OgotCi1UZXN0aW5nIGJhc24wZzAxLnBuZzogUEFTUyAoNTI0IHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcwotVGVzdGluZyBiYXNuMGcwMi5wbmc6IFBBU1MgKDQ0OCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjBnMDQucG5nOiBQQVNTICg1MjAgemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCi1UZXN0aW5nIGJhc24wZzA4LnBuZzogUEFTUyAoMyB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDEgd2FzIHVzZWQgOSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDIzIHRpbWVzCi1UZXN0aW5nIGJhc24wZzE2LnBuZzogUEFTUyAoMSB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDEgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciAyIHdhcyB1c2VkIDMxIHRpbWVzCi1UZXN0aW5nIGJhc24yYzA4LnBuZzogUEFTUyAoNiB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDEgd2FzIHVzZWQgNSB0aW1lcwotIEZpbHRlciA0IHdhcyB1c2VkIDI3IHRpbWVzCi1UZXN0aW5nIGJhc24yYzE2LnBuZzogUEFTUyAoNTkyIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMSB3YXMgdXNlZCAxIHRpbWVzCi0gRmlsdGVyIDQgd2FzIHVzZWQgMzEgdGltZXMKLVRlc3RpbmcgYmFzbjNwMDEucG5nOiBQQVNTICg1MTIgemVybyBzYW1wbGVzKQotIEZpbHRlciAwIHdhcyB1c2VkIDMyIHRpbWVzCi1UZXN0aW5nIGJhc24zcDAyLnBuZzogUEFTUyAoNDQ4IHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcwotVGVzdGluZyBiYXNuM3AwNC5wbmc6IFBBU1MgKDU0NCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMzIgdGltZXMKLVRlc3RpbmcgYmFzbjNwMDgucG5nOiBQQVNTICg0IHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMCB3YXMgdXNlZCAzMiB0aW1lcwotVGVzdGluZyBiYXNuNGEwOC5wbmc6IFBBU1MgKDMyIHplcm8gc2FtcGxlcykKLSBGaWx0ZXIgMSB3YXMgdXNlZCAxIHRpbWVzCi0gRmlsdGVyIDQgd2FzIHVzZWQgMzEgdGltZXMKLVRlc3RpbmcgYmFzbjRhMTYucG5nOiBQQVNTICg2NCB6ZXJvIHNhbXBsZXMpCi0gRmlsdGVyIDAgd2FzIHVzZWQgMSB0aW1lcwotIEZpbHRlciAxIHdhcyB1c2VkIDIgdGltZXMKLSBGaWx0ZXIgMiB3YXMgdXNlZCAxIHRpbWVzCi0gRmlsdGVyIDQgd2FzIHVzZWQgMjggdGltZXMKLVRlc3RpbmcgYmFzbjZhMDgucG5nOiBQQVNTICgxNjAgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDEgdGltZXMKLSBGaWx0ZXIgNCB3YXMgdXNlZCAzMSB0aW1lcwotVGVzdGluZyBiYXNuNmExNi5wbmc6IFBBU1MgKDEwNzIgemVybyBzYW1wbGVzKQotIEZpbHRlciAxIHdhcyB1c2VkIDQgdGltZXMKLSBGaWx0ZXIgNCB3YXMgdXNlZCAyOCB0aW1lcwotbGlicG5nIHBhc3NlcyB0ZXN0Ci0KLVdpbGxlbSB2YW4gU2NoYWlrCi08d2lsbGVtQHNjaGFpay5jb20+Ci1PY3RvYmVyIDE5OTkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDEucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMWUxYzcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgwOWRkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhMDg5Yy4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMDgucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTIyZWUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThlYmNhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjBnMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkMmY5MS4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjJjMTYucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDRhNGQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFkYjU5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwYWI2MS4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDQucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzZlYWMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTA3ZjQ4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjNwMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiMGRkMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjRhMTYucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmVlOWYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA2MjMwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvYmFzbjZhMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliZjNjYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAxLnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3NDZmZi4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMi5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkODNiZDYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE3MDUwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4yYzE2LnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4yYzE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzMTY4ZS4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMmMxNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Z0YmJuM3AwOC5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuM3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZGUzNTcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9mdGJibjNwMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjJjMTYucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9mdGJnbjJjMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWNlYzM5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24yYzE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24zcDA4LnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24zcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmMmU2Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Z0YmduM3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Z0YnJuMmMwOC5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Z0YnJuMmMwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2EwZDYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9mdGJybjJjMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjBnMTYucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjBnMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWJkZWVkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvZnRid24wZzE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvZnRid24zcDA4LnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvZnRid24zcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjYWI3YS4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Z0YnduM3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Z0YnluM3AwOC5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Z0YnluM3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmRiMDkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9mdGJ5bjNwMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjBnMDgucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjBnMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM0NjVmLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4wZzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4yYzA4LnBuZyBiL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4yYzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2ZTQyYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMmMwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3BuZ3N1aXRlL2Z0cDBuM3AwOC5wbmcgYi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuM3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YTY5ZTUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9wbmdzdWl0ZS9mdHAwbjNwMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wbmdzdWl0ZS9mdHAxbjNwMDgucG5nIGIvY29udHJpYi9wbmdzdWl0ZS9mdHAxbjNwMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmM5ZjM1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvcG5nc3VpdGUvZnRwMW4zcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xLTEuOC10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xLTEuOC10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjNmNiNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMS0xLjgtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMS0xLjgucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEtMS44LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNGQ3OS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMS0xLjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEtbGluZWFyLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEtbGluZWFyLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmViOWQxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xLWxpbmVhci10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xLWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktMS1saW5lYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE4OWE1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xLWxpbmVhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMS1zUkdCLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEtc1JHQi10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjZWM0Yi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMS1zUkdCLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEtc1JHQi5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktMS1zUkdCLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZmQxOC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMS1zUkdCLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODhkYjkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMS5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZTM3YTMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LTEuOC10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xNi0xLjgtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2MwYzEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LTEuOC10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xNi0xLjgucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LTEuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2MwYzEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LTEuOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMTYtbGluZWFyLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LWxpbmVhci10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNGU5Ni4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMTYtbGluZWFyLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktMTYtbGluZWFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNGU5Ni4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMTYtbGluZWFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xNi1zUkdCLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LXNSR0ItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWRiODYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LXNSR0ItdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMTYtc1JHQi5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktMTYtc1JHQi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWRiODYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LXNSR0IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTE2LXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI2ZDYxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xNi10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xNi5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI2ZDYxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0xNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMi0xLjgtdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktMi0xLjgtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYzY4NTQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItMS44LXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItMS44LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLTEuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzgxMWMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItMS44LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLWxpbmVhci10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLWxpbmVhci10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyOWVjNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMi1saW5lYXItdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMi1saW5lYXIucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItbGluZWFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhNmZiNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMi1saW5lYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItc1JHQi10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLXNSR0ItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MThjOGYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItc1JHQi10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLXNSR0IucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItc1JHQi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YmRlNjAuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTItc1JHQi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktMi10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA0Y2I1Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTIucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg1YTJhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS0yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS00LTEuOC10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS00LTEuOC10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyZDY5OS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktNC0xLjgtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktNC0xLjgucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQtMS44LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZGE5OC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktNC0xLjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQtbGluZWFyLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQtbGluZWFyLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWMwNjNkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS00LWxpbmVhci10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS00LWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktNC1saW5lYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQwNjhkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS00LWxpbmVhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktNC1zUkdCLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQtc1JHQi10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4NTIxMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktNC1zUkdCLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQtc1JHQi5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktNC1zUkdCLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhNzkyMi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktNC1zUkdCLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS00LXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzRmMWYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktNC5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmNhZGEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTgtMS44LXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LTgtMS44LXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM4OTI0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LTEuOC10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LTEuOC5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktOC0xLjgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJhNzRjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LTEuOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktOC1saW5lYXItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktOC1saW5lYXItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDFhYmQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTgtbGluZWFyLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTgtbGluZWFyLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LWxpbmVhci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmUzNjcuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTgtbGluZWFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LXNSR0ItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktOC1zUkdCLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTRmMjNkLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LXNSR0ItdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktOC1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LXNSR0IucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU2Mzc3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LXNSR0IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LTgtdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktOC10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyMjQ1Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktOC10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS04LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZjI3ZS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtMTYtMS44LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS0xNi0xLjgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGQzNmI3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS0xNi0xLjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LWFscGhhLTE2LWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtMTYtbGluZWFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhYTMyYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtMTYtbGluZWFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS0xNi1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS0xNi1zUkdCLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlODExYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtMTYtc1JHQi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtMTYucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LWFscGhhLTE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5ODc5Ny4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LWFscGhhLTgtMS44LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS04LTEuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODgzYTUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LWFscGhhLTgtMS44LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS04LWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtOC1saW5lYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGMwNzAzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS04LWxpbmVhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL2dyYXktYWxwaGEtOC1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS04LXNSR0IucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzM3Yzg4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS04LXNSR0IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9ncmF5LWFscGhhLTgucG5nIGIvY29udHJpYi90ZXN0cG5ncy9ncmF5LWFscGhhLTgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjBhOTI0Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvZ3JheS1hbHBoYS04LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvbWFrZXBuZ3Muc2ggYi9jb250cmliL3Rlc3RwbmdzL21ha2VwbmdzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTg3NTg3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvbWFrZXBuZ3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgTWFrZSBhIHNldCBvZiB0ZXN0IFBORyBmaWxlcywgTUFLRVBORyBpcyB0aGUgbmFtZSBvZiB0aGUgbWFrZXBuZyBleGVjdXRhYmxlCi0jIGJ1aWx0IGZyb20gY29udHJpYi9saWJ0ZXN0cy9tYWtlcG5nLmMKLQotIyBDb3B5cmlnaHQgKGMpIDIwMTUgSm9obiBDdW5uaW5naGFtIEJvd2xlcgotCi0jIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS43LjAgWyhQRU5ESU5HIFJFTEVBU0UpXQotCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBUaGUgYXJndW1lbnRzIHNheSB3aGV0aGVyIHRvIGJ1aWxkIGFsbCB0aGUgZmlsZXMgb3Igd2hldGhlciBqdXN0IHRvIGJ1aWxkIHRoZQotIyBvbmVzIHRoYXQgZXh0ZW5kIHRoZSBjb2RlLWNvdmVyYWdlIG9mIGxpYnBuZyBmcm9tIHRoZSBleGlzdGluZyB0ZXN0IGZpbGVzIGluCi0jIGNvbnRyaWIvcG5nc3VpdGUuCi10ZXN0IC1uICIkTUFLRVBORyIgfHwgTUFLRVBORz0uL21ha2VwbmcKLW9wdHM9Ci0KLW1wKCl7Ci0gICAke01BS0VQTkd9ICRvcHRzICQxICIkMyIgIiQ0IiAiJDMtJDQkMi5wbmciCi19Ci0KLW1wZygpewotICAgaWYgdGVzdCAiJDEiID0gIm5vbmUiCi0gICB0aGVuCi0gICAgICBtcCAiIiAiIiAiJDIiICIkMyIKLSAgIGVsc2UKLSAgICAgIG1wICItLSQxIiAiLSQxIiAiJDIiICIkMyIKLSAgIGZpCi19Ci0KLW1wdHJhbnMoKXsKLSAgIGlmIHRlc3QgIiQxIiA9ICJub25lIgotICAgdGhlbgotICAgICAgbXAgIi0tdFJOUyIgIi10Uk5TIiAiJDIiICIkMyIKLSAgIGVsc2UKLSAgICAgIG1wICItLXRSTlMgLS0kMSIgIi0kMS10Uk5TIiAiJDIiICIkMyIKLSAgIGZpCi19Ci0KLWNhc2UgIiQxIiBpbgotICAgLS1zbWFsbCkKLSAgICAgIG9wdHM9Ii0tc21hbGwiOzsmCi0KLSAgIC0tYWxsfC0tc21hbGwpCi0gICAgICBmb3IgZyBpbiBub25lIHNSR0IgbGluZWFyIDEuOAotICAgICAgZG8KLSAgICAgICAgIGZvciBjIGluIGdyYXkgcGFsZXR0ZQotICAgICAgICAgZG8KLSAgICAgICAgICAgIGZvciBiIGluIDEgMiA0Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgbXBnICIkZyIgIiRjIiAiJGIiCi0gICAgICAgICAgICAgICBtcHRyYW5zICIkZyIgIiRjIiAiJGIiCi0gICAgICAgICAgICBkb25lCi0gICAgICAgICBkb25lCi0KLSAgICAgICAgIG1wZyAiJGciIHBhbGV0dGUgOAotICAgICAgICAgbXB0cmFucyAiJGciIHBhbGV0dGUgOAotCi0gICAgICAgICBmb3IgYiBpbiA4IDE2Ci0gICAgICAgICBkbwotICAgICAgICAgICAgZm9yIGMgaW4gZ3JheSBncmF5LWFscGhhIHJnYiByZ2ItYWxwaGEKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICBtcGcgIiRnIiAiJGMiICIkYiIKLSAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgIGZvciBjIGluIGdyYXkgcmdiCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgbXB0cmFucyAiJGciICIkYyIgIiRiIgotICAgICAgICAgICAgZG9uZQotICAgICAgICAgZG9uZQotICAgICAgZG9uZTs7Ci0KLSAgIC0tY292ZXJhZ2UpCi0gICAgICAjIENvbW1lbnRzIGJlbG93IGluZGljYXRlIGNhc2VzIGtub3duIHRvIGJlIHJlcXVpcmVkIGFuZCBub3QgZHVwbGljYXRlZAotICAgICAgIyBpbiBvdGhlciAocmVxdWlyZWQpIGNhc2VzOyB0aGUgYWltIGlzIHRvIGdldCBhIG1pbmltYWwgc2V0IHRoYXQgZ2l2ZXMKLSAgICAgICMgdGhlIG1heGl1bSBjb2RlIGNvdmVyYWdlLgotICAgICAgbXBnIG5vbmUgZ3JheS1hbHBoYSA4ICMgcmVxdWlyZWQ6IGNvZGUgY292ZXJhZ2UsIHNSR0Igb3BhcXVlIGNvbXBvbmVudAotICAgICAgbXBnIG5vbmUgcGFsZXR0ZSA4ICMgcmVxdWlyZWQ6IGJhc2ljIHBhbGV0dGUgcmVhZAotICAgICAgbXBnIDEuOCBncmF5IDIgIyByZXF1aXJlZDogdGVzdHMgZ2FtbWEgdGhyZXNob2xkIGNvZGUKLSAgICAgIG1wZyAxLjggcGFsZXR0ZSAyICMgcmVxdWlyZWQ6IGNvZGUgY292ZXJhZ2UKLSAgICAgIG1wZyAxLjggcGFsZXR0ZSA0ICMgcmVxdWlyZWQ6IGNvZGUgY292ZXJhZ2UKLSAgICAgIG1wZyAxLjggcGFsZXR0ZSA4ICMgZXJyb3IgbGltaXRzIG9ubHkKLSAgICAgIG1wZyBsaW5lYXIgcGFsZXR0ZSA4ICMgZXJyb3IgbGltaXRzIG9ubHkKLSAgICAgIG1wZyBsaW5lYXIgcmdiLWFscGhhIDE2ICMgZXJyb3IgbGltaXRzIG9ubHkKLSAgICAgIG1wZyBzUkdCIHBhbGV0dGUgMSAjIHJlcXVpcmVkOiBjb2RlIGNvdmVyYWdlCi0gICAgICBtcGcgc1JHQiByZ2ItYWxwaGEgMTYgIyByZXF1aXJlZDogY29kZSBjb3ZlcmFnZTogcG5ncmVhZC5jOjI0MjIgdW50ZXN0ZWQKLSAgICAgIDo7OwotCi0gICAqKQotICAgICAgZWNobyAiJDAgJDE6IHVua25vd24gYXJndW1lbnQsIHVzYWdlOiIgPiYyCi0gICAgICBlY2hvICIgICQwIFstLWFsbHwtLWNvdmVyYWdlfC0tc21hbGxdIiA+JjIKLSAgICAgIGV4aXQgMQotZXNhYwpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTEtMS44LXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTEtMS44LXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY2MDQxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLTEuOC10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLTEuOC5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS0xLjgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk2NWI3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLTEuOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS1saW5lYXItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS1saW5lYXItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDEzM2QuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTEtbGluZWFyLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTEtbGluZWFyLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLWxpbmVhci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjMyZmQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTEtbGluZWFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLXNSR0ItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS1zUkdCLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzZmMjYyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLXNSR0ItdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLXNSR0IucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmFkYzA5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLXNSR0IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTEtdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxNjQyYi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3ZDEzNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMi0xLjgtdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMi0xLjgtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmFiMTYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItMS44LXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItMS44LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLTEuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2YyODMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItMS44LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLWxpbmVhci10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLWxpbmVhci10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0NmQ0MC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMi1saW5lYXItdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMi1saW5lYXIucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItbGluZWFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyZjZkMy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMi1saW5lYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItc1JHQi10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLXNSR0ItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTQ5MWEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItc1JHQi10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLXNSR0IucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItc1JHQi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYmY5YTIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTItc1JHQi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtMi10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRhNjk4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTIucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWY0NTM2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS0yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS00LTEuOC10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS00LTEuOC10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjYjQ2NS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC0xLjgtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC0xLjgucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQtMS44LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzMThmZi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC0xLjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQtbGluZWFyLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQtbGluZWFyLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDk2YTQ3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS00LWxpbmVhci10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS00LWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC1saW5lYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM1YTg2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS00LWxpbmVhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC1zUkdCLXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQtc1JHQi10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMjNlNy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC1zUkdCLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQtc1JHQi5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC1zUkdCLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlYTllNS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC1zUkdCLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS00LXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOWY2YjkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZjM0ODkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTgtMS44LXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTgtMS44LXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTBiYjU2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LTEuOC10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LTEuOC5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC0xLjgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzA5ZWU2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LTEuOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC1saW5lYXItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC1saW5lYXItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjVhMzMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTgtbGluZWFyLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTgtbGluZWFyLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LWxpbmVhci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDQxM2MuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTgtbGluZWFyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LXNSR0ItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC1zUkdCLXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODg2M2VjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LXNSR0ItdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LXNSR0IucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGY4OTEyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LXNSR0IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9wYWxldHRlLTgtdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2MGU2Ny4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcGFsZXR0ZS04LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwMmQzMC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3BhbGV0dGUtOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi0xNi0xLjgtdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3JnYi0xNi0xLjgtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjUxYjEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtMS44LXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtMS44LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LTEuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjUxYjEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtMS44LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LWxpbmVhci10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LWxpbmVhci10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmYTZhNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3JnYi0xNi1saW5lYXItdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi0xNi1saW5lYXIucG5nIGIvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtbGluZWFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmYTZhNi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3JnYi0xNi1saW5lYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtc1JHQi10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LXNSR0ItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjIyMDkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtc1JHQi10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LXNSR0IucG5nIGIvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtc1JHQi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjIyMDkuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYtc1JHQi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi0xNi10Uk5TLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODY0MzUyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYucG5nIGIvY29udHJpYi90ZXN0cG5ncy9yZ2ItMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODY0MzUyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgtMS44LXRSTlMucG5nIGIvY29udHJpYi90ZXN0cG5ncy9yZ2ItOC0xLjgtdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmY5ZGYuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItOC0xLjgtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi04LTEuOC5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3JnYi04LTEuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YmIxMmEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItOC0xLjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItOC1saW5lYXItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3JnYi04LWxpbmVhci10Uk5TLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyZWQ5Zi4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3JnYi04LWxpbmVhci10Uk5TLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgtbGluZWFyLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgtbGluZWFyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0MmIwOC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3JnYi04LWxpbmVhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi04LXNSR0ItdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3JnYi04LXNSR0ItdFJOUy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjRlY2IuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItOC1zUkdCLXRSTlMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItOC1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgtc1JHQi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhY2FlNjQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItOC1zUkdCLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgtdFJOUy5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3JnYi04LXRSTlMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGIxNjQyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgtdFJOUy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi04LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjljNzFiLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLTgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtMTYtMS44LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTE2LTEuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjVkMTUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtMTYtMS44LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTE2LWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3JnYi1hbHBoYS0xNi1saW5lYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjM5OTAwLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTE2LWxpbmVhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi1hbHBoYS0xNi1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTE2LXNSR0IucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWNlYTYzLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTE2LXNSR0IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtMTYucG5nIGIvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtMTYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI2MjM5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTgtMS44LnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTgtMS44LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkMDhlYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rlc3RwbmdzL3JnYi1hbHBoYS04LTEuOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RwbmdzL3JnYi1hbHBoYS04LWxpbmVhci5wbmcgYi9jb250cmliL3Rlc3RwbmdzL3JnYi1hbHBoYS04LWxpbmVhci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjhiYzguLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtOC1saW5lYXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtOC1zUkdCLnBuZyBiL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTgtc1JHQi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNmU3ZjguLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtOC1zUkdCLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdHBuZ3MvcmdiLWFscGhhLTgucG5nIGIvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWQ0OTEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90ZXN0cG5ncy9yZ2ItYWxwaGEtOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3Rvb2xzL1JFQURNRS50eHQgYi9jb250cmliL3Rvb2xzL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZGFlMDIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90b29scy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgKGNvbnRyaWIvdG9vbHMpIGNvbnRhaW5zIHRvb2xzIHVzZWQgYnkgdGhlIGF1dGhvcnMgb2YgbGlicG5nLgotCi1Db2RlIGFuZCBkYXRhIHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSBpcyBub3QgcmVxdWlyZWQgdG8gYnVpbGQgbGlicG5nLAotaG93ZXZlciB0aGUgY29kZSBpbiB0aGlzIGRpcmVjdG9yeSBoYXMgYmVlbiB1c2VkIHRvIGdlbmVyYXRlIGRhdGEgb3IgY29kZSBpbgotdGhlIGJvZHkgb2YgdGhlIGxpYnBuZyBzb3VyY2UuICBUaGUgc291cmNlIGNvZGUgaWRlbnRpZmllcyB3aGVyZSB0aGlzIGhhcwotYmVlbiBkb25lLiAgQ29kZSBpbiB0aGlzIGRpcmVjdG9yeSBtYXkgbm90IGNvbXBpbGUgb24gYWxsIG9wZXJhdGluZyBzeXN0ZW1zCi10aGF0IGxpYnBuZyBzdXBwb3J0cy4KLQotTk8gQ09QWVJJR0hUIFJJR0hUUyBBUkUgQ0xBSU1FRCBUTyBBTlkgT0YgVEhFIEZJTEVTIElOIFRISVMgRElSRUNUT1JZLgotCi1UbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvcnMgaGF2ZSB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKLXJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKLVVuaXRlZCBTdGF0ZXMuCi0KLVRoZSBmaWxlcyBtYXkgYmUgdXNlZCBmcmVlbHkgaW4gYW55IHdheS4KLQotVGhlIHNvdXJjZSBjb2RlIGFuZCBjb21tZW50cyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgdGhlIG9yaWdpbmFsIHdvcmsgb2YgdGhlCi1wZW9wbGUgbmFtZWQgYmVsb3cuICBObyBvdGhlciBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGhhcyBtYWRlIGNvbnRyaWJ1dGlvbnMgdG8KLXRoZSB3b3JrIGluIHRoaXMgZGlyZWN0b3J5LgotCi1PUklHSU5BTCBBVVRIT1JTCi0gICAgVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY29kZSBpbiB0aGlzIGRpcmVjdG9yeS4gIE5vbmUKLSAgICBvZiB0aGUgcGVvcGxlIGJlbG93IGNsYWltIGFueSByaWdodHMgd2l0aCByZWdhcmQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMKLSAgICBkaXJlY3RvcnkuCi0KLSAgICBKb2huIEJvd2xlciA8amJvd2xlckBhY20ub3JnPgpkaWZmIC0tZ2l0IGEvY29udHJpYi90b29scy9jaGVja3N1bS1pY2MuYyBiL2NvbnRyaWIvdG9vbHMvY2hlY2tzdW0taWNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWU3MDguLjAwMDAwMDAKLS0tIGEvY29udHJpYi90b29scy9jaGVja3N1bS1pY2MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiBjaGVja3N1bS1pY2MuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMyBKb2huIEN1bm5pbmdoYW0gQm93bGVyCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogR2VuZXJhdGUgY3JjMzIgYW5kIGFkbGVyMzIgY2hlY2tzdW1zIG9mIHRoZSBnaXZlbiBpbnB1dCBmaWxlcywgdXNlZCB0bwotICogZ2VuZXJhdGUgY2hlY2stY29kZXMgZm9yIHVzZSB3aGVuIG1hdGNoaW5nIElDQyBwcm9maWxlcyB3aXRoaW4gbGlicG5nLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHpsaWIuaD4KLQotc3RhdGljIGludAotcmVhZF9vbmVfZmlsZShGSUxFICppcCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgIHVMb25nIGxlbmd0aCA9IDA7Ci0gICB1TG9uZyBhMzIgPSBhZGxlcjMyKDAsIE5VTEwsIDApOwotICAgdUxvbmcgYzMyID0gY3JjMzIoMCwgTlVMTCwgMCk7Ci0gICBCeXRlIGhlYWRlclsxMzJdOwotCi0gICBmb3IgKDs7KQotICAgewotICAgICAgaW50IGNoID0gZ2V0YyhpcCk7Ci0gICAgICBCeXRlIGI7Ci0KLSAgICAgIGlmIChjaCA9PSBFT0YpIGJyZWFrOwotCi0gICAgICBiID0gKEJ5dGUpY2g7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBzaXplb2YgaGVhZGVyKQotICAgICAgICAgaGVhZGVyW2xlbmd0aF0gPSBiOwotCi0gICAgICArK2xlbmd0aDsKLSAgICAgIGEzMiA9IGFkbGVyMzIoYTMyLCAmYiwgMSk7Ci0gICAgICBjMzIgPSBjcmMzMihjMzIsICZiLCAxKTsKLSAgIH0KLQotICAgaWYgKGZlcnJvcihpcCkpCi0gICAgICByZXR1cm4gMDsKLQotICAgLyogU3VjY2VzcyAqLwotICAgcHJpbnRmKCJQTkdfSUNDX0NIRUNLU1VNKDB4JTguOGx4LCAweCU4LjhseCxcbiAgIFBOR19NRDUoIgotICAgICAgIjB4JTIuMnglMi4yeCUyLjJ4JTIuMngsIDB4JTIuMnglMi4yeCUyLjJ4JTIuMngsIDB4JTIuMnglMi4yeCUyLjJ4JTIuMngsIgotICAgICAgIiAweCUyLjJ4JTIuMnglMi4yeCUyLjJ4KSwgJWQsXG4iCi0gICAgICAiICAgXCIlNC40ZC8lMi4yZC8lMi4yZCAlMi4yZDolMi4yZDolMi4yZFwiLCAlbHUsIFwiJXNcIilcbiIsCi0gICAgICAodW5zaWduZWQgbG9uZylhMzIsICh1bnNpZ25lZCBsb25nKWMzMiwKLSAgICAgIGhlYWRlcls4NF0sIGhlYWRlcls4NV0sIGhlYWRlcls4Nl0sIGhlYWRlcls4N10sCi0gICAgICBoZWFkZXJbODhdLCBoZWFkZXJbODldLCBoZWFkZXJbOTBdLCBoZWFkZXJbOTFdLAotICAgICAgaGVhZGVyWzkyXSwgaGVhZGVyWzkzXSwgaGVhZGVyWzk0XSwgaGVhZGVyWzk1XSwKLSAgICAgIGhlYWRlcls5Nl0sIGhlYWRlcls5N10sIGhlYWRlcls5OF0sIGhlYWRlcls5OV0sCi0jICAgICBkZWZpbmUgdTE2KHgpIChoZWFkZXJbeF0gKiAyNTYgKyBoZWFkZXJbeCsxXSkKLSMgICAgIGRlZmluZSB1MzIoeCkgKHUxNih4KSAqIDY1NTM2ICsgdTE2KHgrMikpCi0gICAgICB1MzIoNjQpLCB1MTYoMjQpLCB1MTYoMjYpLCB1MTYoMjgpLCB1MTYoMzApLCB1MTYoMzIpLCB1MTYoMzQpLAotICAgICAgKHVuc2lnbmVkIGxvbmcpbGVuZ3RoLCBuYW1lKTsKLQotICAgcmV0dXJuIDE7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgIGludCBlcnIgPSAwOwotCi0gICBwcmludGYoIi8qIGFkbGVyMzIsIGNyYzMyLCBNRDVbMTZdLCBpbnRlbnQsIGRhdGUsIGxlbmd0aCwgZmlsZS1uYW1lICovXG4iKTsKLQotICAgaWYgKGFyZ2MgPiAxKQotICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaT0xOyBpPGFyZ2M7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIEZJTEUgKmlwID0gZm9wZW4oYXJndltpXSwgInJiIik7Ci0KLSAgICAgICAgIGlmIChpcCA9PSBOVUxMIHx8ICFyZWFkX29uZV9maWxlKGlwLCBhcmd2W2ldKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgICBwZXJyb3IoYXJndltpXSk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiByZWFkIGVycm9yXG4iLCBhcmd2W2ldKTsKLSAgICAgICAgICAgIHByaW50ZigiLyogRVJST1I6ICVzICovXG4iLCBhcmd2W2ldKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgKHZvaWQpZmNsb3NlKGlwKTsKLSAgICAgIH0KLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgaWYgKCFyZWFkX29uZV9maWxlKHN0ZGluLCAiLSIpKQotICAgICAgewotICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgIHBlcnJvcigic3RkaW4iKTsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3RkaW46IHJlYWQgZXJyb3JcbiIpOwotICAgICAgICAgcHJpbnRmKCIvKiBFUlJPUjogc3RkaW4gKi9cbiIpOwotICAgICAgfQotICAgfQotCi0gICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90b29scy9jaGtmbXQgYi9jb250cmliL3Rvb2xzL2Noa2ZtdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTFiODhjYy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rvb2xzL2Noa2ZtdAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBjaGtmbXQKLSMKLSMgQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTAuCi0jIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKLSMgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotIyBVbml0ZWQgU3RhdGVzLgotIwotIyBDaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBzb3VyY2UgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IC0gY2hlY2tzIGZvciBhCi0jIGxpbmUgbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMgbWF4IGFuZCBubyB0YWIgY2hhcmFjdGVycy4KLSMKLSMgT3B0aW9uYWxseSBhcmd1bWVudHMgYXJlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRvIGNoZWNrLgotIwotIyAtdjogb3V0cHV0IHRoZSBsb25nIGxpbmVzIChtYWtlcyBmaXhpbmcgdGhlbSBlYXNpZXIpCi0jIC1lOiBzcGF3biBhbiBlZGl0b3IgZm9yIGVhY2ggZmlsZSB0aGF0IG5lZWRzIGEgY2hhbmdlICgkRURJVE9SIG11c3QgYmUKLSMgICAgIGRlZmluZWQpLiAgV2hlbiB1c2luZyAtZSB0aGUgc2NyaXB0IE1VU1QgYmUgcnVuIGZyb20gYW4gaW50ZXJhY3RpdmUKLSMgICAgIGNvbW1hbmQgbGluZS4KLXZlcmJvc2U9Ci1lZGl0PQotdmVycz0KLXRlc3QgIiQxIiA9ICItdiIgJiYgewotICAgc2hpZnQKLSAgIHZlcmJvc2U9eWVzCi19Ci10ZXN0ICIkMSIgPSAiLWUiICYmIHsKLSAgIHNoaWZ0Ci0gICBpZiB0ZXN0IC1uICIkRURJVE9SIgotICAgdGhlbgotICAgICAgZWRpdD15ZXMKLQotICAgICAgIyBDb3B5IHRoZSBzdGFuZGFyZCBzdHJlYW1zIGZvciB0aGUgZWRpdG9yCi0gICAgICBleGVjIDM+JjAgND4mMSA1PiYyCi0gICBlbHNlCi0gICAgICBlY2hvICJjaGtmbXQgLWU6IEVESVRPUiBtdXN0IGJlIGRlZmluZWQiID4mMgotICAgICAgZXhpdCAxCi0gICBmaQotfQotCi0jIEZ1bmN0aW9uIHRvIGVkaXQgYSBzaW5nbGUgZmlsZSAtIGlmIHRoZSBmaWxlIGlzbid0IGNoYW5nZWQgYXNrIHRoZSB1c2VyCi0jIHdoZXRoZXIgb3Igbm90IHRvIGNvbnRpbnVlLiAgVGhpcyBzdHVmZiBvbmx5IHdvcmtzIGlmIHRoZSBzY3JpcHQgaXMgcnVuIGZyb20KLSMgdGhlIGNvbW1hbmQgbGluZSAob3RoZXJ3aXNlLCBkb24ndCBzcGVjaWZ5IC1lIG9yIHlvdSB3aWxsIGJlIHNvcnJ5KS4KLWRvZWQoKXsKLSAgIGNwICIkZmlsZSIgIiRmaWxlIi5vcmlnCi0gICAiJEVESVRPUiIgIiRmaWxlIiAwPiYzIDE+JjQgMj4mNSAzPiYtIDQ+Ji0gNT4mLSB8fCBleGl0IDEKLSAgIGlmIGNtcCAtcyAiJGZpbGUiLm9yaWcgIiRmaWxlIgotICAgdGhlbgotICAgICAgcm0gIiRmaWxlIi5vcmlnCi0gICAgICBlY2hvIC1uICIkZmlsZTogZmlsZSBub3QgY2hhbmdlZCwgdHlwZSBhbnl0aGluZyB0byBjb250aW51ZTogIiA+JjUKLSAgICAgIHJlYWQgYW5zIDA+JjMKLSAgICAgIHRlc3QgLW4gIiRhbnMiIHx8IHJldHVybiAxCi0gICBmaQotICAgcmV0dXJuIDAKLX0KLQotIyBJbiBiZXRhIHZlcnNpb25zIHRoZSB2ZXJzaW9uIHN0cmluZyB3aGljaCBhcHBlYXJzIGluIGZpbGVzIGNhbiBiZSBhIGxpdHRsZQotIyBsb25nIGFuZCBjYXVzZSBzcHVyaW91c2x5IG92ZXJsb25nIGxpbmVzLiAgVG8gYXZvaWQgdGhpcyBzdWJ0aXR1dGUgdGhlIHZlcnNpb24KLSMgc3RyaW5nIHdpdGggYSAnc3RhbmRhcmQnIHZlcnNpb24gYS5iLmNjIGJlZm9yZSBjaGVja2luZyBmb3IgbG9uZyBsaW5lcy4KLWlmIHRlc3QgLXIgcG5nLmgKLXRoZW4KLSAgIHZlcnM9ImBzZWQgLW4gLWUgXAotICAgJ3MvXiNkZWZpbmUgUE5HX0xJQlBOR19WRVJfU1RSSU5HIC5cKFswLTldXC5bMC05XVwuWzAtOV1bMC05YS16XSpcKS4kL1wxL3AnIFwKLSAgIHBuZy5oYCIKLSAgIGVjaG8gImNoa2ZtdDogY2hlY2tpbmcgdmVyc2lvbiAkdmVycyIKLWZpCi1pZiB0ZXN0IC16ICIkdmVycyIKLXRoZW4KLSAgIGVjaG8gImNoa2ZtdDogcG5nLmggbm90IGZvdW5kLCBpZ25vcmluZyB2ZXJzaW9uIG51bWJlciIgPiYyCi1maQotCi10ZXN0IC1uICIkMSIgfHwgc2V0IC0tIC4KLWZpbmQgIiRAIiBcKCAtdHlwZSBkIFwoIC1uYW1lICcuZ2l0JyAtbyAtbmFtZSAnLmxpYnMnIC1vIC1uYW1lICdwcm9qZWN0cycgXCkgXAotICAgLXBydW5lIFwpIC1vIFwoIC10eXBlIGYgXAotICAgISAtbmFtZSAnKi5bb2FdJyAhIC1uYW1lICcqLmxbb2FdJyAhICAtbmFtZSAnKi5wbmcnICEgLW5hbWUgJyoub3V0JyBcCi0gICAhIC1uYW1lICcqLmpwZycgISAtbmFtZSAnKi5wYXRjaCcgISAtbmFtZSAnKi5vYmonICEgLW5hbWUgJyouZXhlJyBcCi0gICAhIC1uYW1lICcqLmNvbScgISAtbmFtZSAnKi50YXIuKicgISAtbmFtZSAnKi56aXAnICEgLW5hbWUgJyouaWNvJyBcCi0gICAhIC1uYW1lICcqLnJlcycgISAtbmFtZSAnKi5yYycgISAtbmFtZSAnKi5tbXMnICEgLW5hbWUgJyoucmVqJyBcCi0gICAhIC1uYW1lICcqLmRzcCcgISAtbmFtZSAnKi5vcmlnJyAhIC1uYW1lICcqLmRmbicgISAtbmFtZSAnKi5zd3AnIFwKLSAgICEgLW5hbWUgJ34qJyAhIC1uYW1lICcqLjMnIFwKLSAgICEgLW5hbWUgJ21pc3NpbmcnICEgLW5hbWUgJ21raW5zdGFsbGRpcnMnICEgLW5hbWUgJ2RlcGNvbXAnIFwKLSAgICEgLW5hbWUgJ2FjbG9jYWwubTQnICEgLW5hbWUgJ2luc3RhbGwtc2gnICEgLW5hbWUgJ01ha2VmaWxlLmluJyBcCi0gICAhIC1uYW1lICdsdG1haW4uc2gnICEgLW5hbWUgJ2NvbmZpZyonIC1wcmludCBcKSB8IHsKLSAgIHN0PTAKLSAgIHdoaWxlIHJlYWQgZmlsZQotICAgZG8KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgKi5tYWt8KltNbV1ha2VmaWxlLip8KltNbV1ha2VmaWxlKQotICAgICAgICAgIyBNYWtlZmlsZXMgcmVxdWlyZSB0YWJzLCBkZXBlbmRlbmN5IGxpbmVzIGNhbiBiZSB0aGlzIGxvbmcuCi0gICAgICAgICBjaGVja190YWJzPQotICAgICAgICAgbGluZV9sZW5ndGg9MTAwOzsKLSAgICAgICouYXdrKQotICAgICAgICAgIyBJbmNsdWRlcyBsaXRlcmFsIHRhYnMKLSAgICAgICAgIGNoZWNrX3RhYnM9Ci0gICAgICAgICAjIFRoZSBmb2xsb3dpbmcgaXMgYXJiaXRyYXJ5Ci0gICAgICAgICBsaW5lX2xlbmd0aD0xMzI7OwotICAgICAgKmNvbnRyaWIvKi8qLltjaF0pCi0gICAgICAgICBjaGVja190YWJzPXllcwotICAgICAgICAgbGluZV9sZW5ndGg9OTY7OwotICAgICAgKikKLSAgICAgICAgIGNoZWNrX3RhYnM9eWVzCi0gICAgICAgICBsaW5lX2xlbmd0aD04MDs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgTm90ZSB0aGF0IHZlcnMgY2FuIG9ubHkgY29udGFpbiAwLTksIC4gYW5kIGEtegotICAgICAgaWYgdGVzdCAtbiAiJHZlcnMiCi0gICAgICB0aGVuCi0gICAgICAgICBzZWQgLWUgInMvJHZlcnMvYS5iLmNjL2ciICIkZmlsZSIgPiIkZmlsZSIuJCQKLSAgICAgIGVsc2UKLSAgICAgICAgIGNwICIkZmlsZSIgIiRmaWxlIi4kJAotICAgICAgZmkKLSAgICAgIHNwbHQ9ImBmb2xkIC0kbGluZV9sZW5ndGggIiRmaWxlIi4kJCB8IGRpZmYgLWMgIiRmaWxlIi4kJCAtYCIKLSAgICAgIHJtICIkZmlsZSIuJCQKLQotICAgICAgaWYgdGVzdCAtbiAiJHNwbHQiCi0gICAgICB0aGVuCi0gICAgICAgICBlY2hvICIkZmlsZTogbGluZXMgdG9vIGxvbmciCi0gICAgICAgICBzdD0xCi0gICAgICAgICBpZiB0ZXN0IC1uICIkRURJVE9SIiAtYSAtbiAiJGVkaXQiCi0gICAgICAgICB0aGVuCi0gICAgICAgICAgICBkb2VkICIkZmlsZSIgfHwgZXhpdCAxCi0gICAgICAgICBlbGlmIHRlc3QgLW4gIiR2ZXJib3NlIgotICAgICAgICAgdGhlbgotICAgICAgICAgICAgZWNobyAiJHNwbHQiCi0gICAgICAgICBmaQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLW4gIiRjaGVja190YWJzIgotICAgICAgdGhlbgotICAgICAgICAgdGFiPSJgdHIgLWMgLWQgJ1x0JyA8IiRmaWxlImAiCi0gICAgICAgICBpZiB0ZXN0IC1uICIkdGFiIgotICAgICAgICAgdGhlbgotICAgICAgICAgICAgZWNobyAiJGZpbGU6IGZpbGUgY29udGFpbnMgdGFiIGNoYXJhY3RlcnMiCi0gICAgICAgICAgICBzdD0xCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICIkRURJVE9SIiAtYSAtbiAiJGVkaXQiCi0gICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICBkb2VkICIkZmlsZSIgfHwgZXhpdCAxCi0gICAgICAgICAgICBlbGlmIHRlc3QgLW4gIiR2ZXJib3NlIgotICAgICAgICAgICAgdGhlbgotICAgICAgICAgICAgICAgZWNobyAiJHNwbHQiCi0gICAgICAgICAgICBmaQotICAgICAgICAgZmkKLSAgICAgIGZpCi0gICBkb25lCi0gICBleGl0ICRzdAotfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90b29scy9jdnRjb2xvci5jIGIvY29udHJpYi90b29scy9jdnRjb2xvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjc5M2M3Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdG9vbHMvY3Z0Y29sb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKi0KLSAqIGNvbnZlcnQuYwotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjAgW0ZlYnJ1YXJ5IDE0LCAyMDEzXQotICoKLSAqIENPUFlSSUdIVDogV3JpdHRlbiBieSBKb2huIEN1bm5pbmdoYW0gQm93bGVyLCAyMDEzLgotICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0IGFuZAotICogcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotICogVW5pdGVkIFN0YXRlcy4KLSAqCi0gKiBDb252ZXJ0IDgtYml0IHNSR0Igb3IgMTYtYml0IGxpbmVhciB2YWx1ZXMgdG8gYW5vdGhlciBmb3JtYXQuCi0gKi8KLSNkZWZpbmUgX0lTT0M5OV9TT1VSQ0UgMQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxmZW52Lmg+Ci0KLSNpbmNsdWRlICJzUkdCLmgiCi0KLXN0YXRpYyB2b2lkCi11c2FnZShjb25zdCBjaGFyICpwcm9nKQotewotICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAiJXM6IHVzYWdlOiAlcyBbLWxpbmVhcnwtc1JHQl0gWy1ncmF5fC1jb2xvcl0gY29tcG9uZW50ezEsNH1cbiIsCi0gICAgICBwcm9nLCBwcm9nKTsKLSAgIGV4aXQoMSk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLWNvbXBvbmVudChjb25zdCBjaGFyICpwcm9nLCBjb25zdCBjaGFyICphcmcsIGludCBpc3NSR0IpCi17Ci0gICBjaGFyICplcDsKLSAgIHVuc2lnbmVkIGxvbmcgYyA9IHN0cnRvdWwoYXJnLCAmZXAsIDApOwotCi0gICBpZiAoZXAgPD0gYXJnIHx8ICplcCB8fCBjID4gNjU1MzUgfHwgKGlzc1JHQiAmJiBjID4gMjU1KSkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiBpbnZhbGlkIGNvbXBvbmVudCB2YWx1ZSAoJWx1KVxuIiwgcHJvZywgYXJnLCBjKTsKLSAgICAgIHVzYWdlKHByb2cpOwotICAgfQotCi0gICByZXR1cm4gYzsKLX0KLQotaW50Ci1tYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKLXsKLSAgIGNvbnN0IGNoYXIgKnByb2cgPSAqYXJndisrOwotICAgaW50IHRvX2xpbmVhciA9IDAsIHRvX2dyYXkgPSAwLCB0b19jb2xvciA9IDA7Ci0gICBpbnQgY2hhbm5lbHMgPSAwOwotICAgZG91YmxlIGNbNF07Ci0KLSAgIC8qIEZFX1RPTkVBUkVTVCBpcyB0aGUgSUVFRTc1NCByb3VuZCB0byBuZWFyZXN0LCBwcmVmZXJyaW5nIGV2ZW4sIG1vZGU7IGkuZS4KLSAgICAqIGV2ZXJ5dGhpbmcgcm91bmRzIHRvIHRoZSBuZWFyZXN0IHZhbHVlIGV4Y2VwdCB0aGF0ICcuNScgcm91bmRzIHRvIHRoZQotICAgICogbmVhcmVzdCBldmVuIHZhbHVlLgotICAgICovCi0gICBmZXNldHJvdW5kKEZFX1RPTkVBUkVTVCk7Ci0KLSAgIGNbM10gPSBjWzJdID0gY1sxXSA9IGNbMF0gPSAwOwotCi0gICB3aGlsZSAoLS1hcmdjID4gMCAmJiAqKmFyZ3YgPT0gJy0nKQotICAgewotICAgICAgY29uc3QgY2hhciAqYXJnID0gMSsqYXJndisrOwotCi0gICAgICBpZiAoc3RyY21wKGFyZywgInNSR0IiKSA9PSAwKQotICAgICAgICAgdG9fbGluZWFyID0gMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgImxpbmVhciIpID09IDApCi0gICAgICAgICB0b19saW5lYXIgPSAxOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiZ3JheSIpID09IDApCi0gICAgICAgICB0b19ncmF5ID0gMSwgdG9fY29sb3IgPSAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiY29sb3IiKSA9PSAwKQotICAgICAgICAgdG9fZ3JheSA9IDAsIHRvX2NvbG9yID0gMTsKLQotICAgICAgZWxzZQotICAgICAgICAgdXNhZ2UocHJvZyk7Ci0gICB9Ci0KLSAgIHN3aXRjaCAoYXJnYykKLSAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICB1c2FnZShwcm9nKTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDQ6Ci0gICAgICAgICBjWzNdID0gY29tcG9uZW50KHByb2csIGFyZ3ZbM10sIHRvX2xpbmVhcik7Ci0gICAgICAgICArK2NoYW5uZWxzOwotICAgICAgY2FzZSAzOgotICAgICAgICAgY1syXSA9IGNvbXBvbmVudChwcm9nLCBhcmd2WzJdLCB0b19saW5lYXIpOwotICAgICAgICAgKytjaGFubmVsczsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgIGNbMV0gPSBjb21wb25lbnQocHJvZywgYXJndlsxXSwgdG9fbGluZWFyKTsKLSAgICAgICAgICsrY2hhbm5lbHM7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBjWzBdID0gY29tcG9uZW50KHByb2csIGFyZ3ZbMF0sIHRvX2xpbmVhcik7Ci0gICAgICAgICArK2NoYW5uZWxzOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgIGlmICh0b19saW5lYXIpCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBjb21wb25lbnRzID0gY2hhbm5lbHM7Ci0KLSAgICAgIGlmICgoY29tcG9uZW50cyAmIDEpID09IDApCi0gICAgICAgICAtLWNvbXBvbmVudHM7Ci0KLSAgICAgIGZvciAoaT0wOyBpPGNvbXBvbmVudHM7ICsraSkgY1tpXSA9IGxpbmVhcl9mcm9tX3NSR0IoY1tpXSAvIDI1NSk7Ci0gICAgICBpZiAoY29tcG9uZW50cyA8IGNoYW5uZWxzKQotICAgICAgICAgY1tjb21wb25lbnRzXSA9IGNbY29tcG9uZW50c10gLyAyNTU7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpPTA7IGk8NDsgKytpKSBjW2ldIC89IDY1NTM1OwotCi0gICAgICBpZiAoKGNoYW5uZWxzICYgMSkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSBhbHBoYSA9IGNbY2hhbm5lbHMtMV07Ci0KLSAgICAgICAgIGlmIChhbHBoYSA+IDApCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxjaGFubmVscy0xOyArK2kpIGNbaV0gLz0gYWxwaGE7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxjaGFubmVscy0xOyArK2kpIGNbaV0gPSAxOwotICAgICAgfQotICAgfQotCi0gICBpZiAodG9fZ3JheSkKLSAgIHsKLSAgICAgIGlmIChjaGFubmVscyA8IDMpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB0b28gZmV3IGNoYW5uZWxzICglZCkgZm9yIC1ncmF5XG4iLAotICAgICAgICAgICAgcHJvZywgY2hhbm5lbHMpOwotICAgICAgICAgdXNhZ2UocHJvZyk7Ci0gICAgICB9Ci0KLSAgICAgIGNbMF0gPSBZZnJvbVJHQihjWzBdLCBjWzFdLCBjWzJdKTsKLSAgICAgIGNoYW5uZWxzIC09IDI7Ci0gICB9Ci0KLSAgIGlmICh0b19jb2xvcikKLSAgIHsKLSAgICAgIGlmIChjaGFubmVscyA+IDIpCi0gICAgICB7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB0b28gbWFueSBjaGFubmVscyAoJWQpIGZvciAtY29sb3JcbiIsCi0gICAgICAgICAgICBwcm9nLCBjaGFubmVscyk7Ci0gICAgICAgICB1c2FnZShwcm9nKTsKLSAgICAgIH0KLQotICAgICAgY1szXSA9IGNbMV07IC8qIGFscGhhLCBpZiBwcmVzZW50ICovCi0gICAgICBjWzJdID0gY1sxXSA9IGNbMF07Ci0gICB9Ci0KLSAgIGlmICh0b19saW5lYXIpCi0gICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGlmICgoY2hhbm5lbHMgJiAxKSA9PSAwKQotICAgICAgewotICAgICAgICAgZG91YmxlIGFscGhhID0gY1tjaGFubmVscy0xXTsKLSAgICAgICAgIGZvciAoaT0wOyBpPGNoYW5uZWxzLTE7ICsraSkgY1tpXSAqPSBhbHBoYTsKLSAgICAgIH0KLQotICAgICAgZm9yIChpPTA7IGk8Y2hhbm5lbHM7ICsraSkgY1tpXSA9IG5lYXJieWludChjW2ldICogNjU1MzUpOwotICAgfQotCi0gICBlbHNlIC8qIHRvIHNSR0IgKi8KLSAgIHsKLSAgICAgIGludCBpID0gKGNoYW5uZWxzKzEpJn4xOwotICAgICAgd2hpbGUgKC0taSA+PSAwKQotICAgICAgICAgY1tpXSA9IHNSR0JfZnJvbV9saW5lYXIoY1tpXSk7Ci0KLSAgICAgIGZvciAoaT0wOyBpPGNoYW5uZWxzOyArK2kpIGNbaV0gPSBuZWFyYnlpbnQoY1tpXSAqIDI1NSk7Ci0gICB9Ci0KLSAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpPTA7IGk8Y2hhbm5lbHM7ICsraSkgcHJpbnRmKCIgJWciLCBjW2ldKTsKLSAgIH0KLSAgIHByaW50ZigiXG4iKTsKLQotICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3Rvb2xzL2dlbnBuZy5jIGIvY29udHJpYi90b29scy9nZW5wbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0MzI2MC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rvb2xzL2dlbnBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsODY3ICswLDAgQEAKLS8qLSBnZW5wbmcKLSAqCi0gKiBDT1BZUklHSFQ6IFdyaXR0ZW4gYnkgSm9obiBDdW5uaW5naGFtIEJvd2xlciwgMjAxNS4KLSAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKLSAqIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKLSAqIFVuaXRlZCBTdGF0ZXMuCi0gKgotICogR2VuZXJhdGUgYSBQTkcgd2l0aCBhbiBhbHBoYSBjaGFubmVsLCBjb3JyZWN0bHkuCi0gKgotICogVGhpcyBpcyBhIHRlc3QgY2FzZSBnZW5lcmF0b3I7IHRoZSByZXN1bHRhbnQgUE5HIGZpbGVzIGFyZSBvbmx5IG9mIGludGVyZXN0Ci0gKiB0byB0aG9zZSBvZiB1cyB3aG8gY2FyZSBhYm91dCB3aGV0aGVyIHRoZSBlZGdlcyBvZiBjaXJjbGVzIGFyZSBncmVlbiwgcmVkLAotICogb3IgeWVsbG93LgotICoKLSAqIFRoZSBwcm9ncmFtIGdlbmVyYXRlcyBhbiBSR0IrQWxwaGEgUE5HIG9mIGEgZ2l2ZW4gc2l6ZSBjb250YWluaW5nIHRoZSBnaXZlbgotICogc2hhcGVzIG9uIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZDoKLSAqCi0gKiAgZ2VucG5nIHdpZHRoIGhlaWdodCB7IHNoYXBlIH0KLSAqICAgIHNoYXBlIDo6PSBjb2xvciB3aWR0aCBzaGFwZSB4MSB5MSB4MiB5MgotICoKLSAqICdjb2xvcicgaXM6Ci0gKgotICogIGJsYWNrIHdoaXRlIHJlZCBncmVlbiB5ZWxsb3cgYmx1ZSBicm93biBwdXJwbGUgcGluayBvcmFuZ2UgZ3JheSBjeWFuCi0gKgotICogVGhlIHBvaW50IGlzIHRvIGhhdmUgY29sb3JzIHRoYXQgYXJlIGxpbmd1aXN0aWNhbGx5IG1lYW5pbmdmdWwgcGx1cyB0aGF0IG9sZAotICogYnVnYmVhciBvZiB0aGUgZGVwYXJ0bWVudCBzdG9yZSBkcmVzcyBtdXJkZXJzLCBDeWFuLCB0aGUgb25seSBjb2xvciB3ZSBhcmd1ZQotICogYWJvdXQuCi0gKgotICogJ3NoYXBlJyBpczoKLSAqCi0gKiAgY2lyY2xlOiBhbiBlbGxpcHNlCi0gKiAgc3F1YXJlOiBhIHJlY3RhbmdsZQotICogIGxpbmU6IGEgc3RyYWlnaHQgbGluZQotICoKLSAqIEVhY2ggc2hhcGUgaXMgZm9sbG93ZWQgYnkgZm91ciBudW1iZXJzLCB0aGVzZSBhcmUgdHdvIHBvaW50cyBpbiB0aGUgb3V0cHV0Ci0gKiBjb29yZGluYXRlIHNwYWNlIChhcyByZWFsIG51bWJlcnMpIHdoaWNoIGRlc2NyaWJlIHRoZSBjaXJjbGUsIHNxdWFyZSwgb3IKLSAqIGxpbmUuICBUaGUgc2hhcGUgaXMgZmlsbGVkIGlmIGl0IGlzIHByZWNlZGVkIGJ5ICdmaWxsZWQnIChub3QgdmFsaWQgZm9yCi0gKiAnbGluZScpIG9yIGlzIGRyYXduIHdpdGggYSBsaW5lLCBpbiB3aGljaCBjYXNlIHRoZSB3aWR0aCBvZiB0aGUgbGluZSBtdXN0Ci0gKiBwcmVjZWRlIHRoZSBzaGFwZS4KLSAqCi0gKiBUaGUgd2hvbGUgc2V0IG9mIGluZm9ybWF0aW9uIGNhbiBiZSByZXBlYXRlZCBhcyBtYW55IHRpbWVzIGFzIGRlc2lyZWQ6Ci0gKgotICogICAgc2hhcGUgOjo9IGNvbG9yIHdpZHRoIHNoYXBlIHgxIHkxIHgyIHkyCi0gKgotICogICAgY29sb3IgOjo9IGJsYWNrfHdoaXRlfHJlZHxncmVlbnx5ZWxsb3d8Ymx1ZQotICogICAgY29sb3IgOjo9IGJyb3dufHB1cnBsZXxwaW5rfG9yYW5nZXxncmF5fGN5YW4KLSAqICAgIHdpZHRoIDo6PSBmaWxsZWQKLSAqICAgIHdpZHRoIDo6PSA8bnVtYmVyPgotICogICAgc2hhcGUgOjo9IGNpcmNsZXxzcXVhcmV8bGluZQotICogICAgeDEgICAgOjo9IDxudW1iZXI+Ci0gKiAgICB4MiAgICA6Oj0gPG51bWJlcj4KLSAqICAgIHkxICAgIDo6PSA8bnVtYmVyPgotICogICAgeTIgICAgOjo9IDxudW1iZXI+Ci0gKgotICogVGhlIG91dHB1dCBQTkcgaXMgZ2VuZXJhdGVkIGJ5IGRvd24tc2FtcGxpbmcgYSA0eCBzdXBlcnNhbXBsZWQgaW1hZ2UgdXNpbmcKLSAqIGEgYmktY3ViaWMgZmlsdGVyLiAgVGhlIGJpLWN1YmljIGhhcyBhIDIgKG91dHB1dCkgcGl4ZWwgd2lkdGgsIHNvIGFuIDh4OAotICogYXJyYXkgb2Ygc3VwZXItc2FtcGxlZCBwb2ludHMgY29udHJpYnV0ZSB0byBlYWNoIG91dHB1dCBwaXhlbC4gIFRoZSB2YWx1ZSBvZgotICogYSBzdXBlci1zYW1wbGVkIHBvaW50IGlzIGZvdW5kIHVzaW5nIGFuIHVuZmlsdGVyZWQsIGFsaWFzZWQsIGluZmluaXRlCi0gKiBwcmVjaXNpb24gaW1hZ2U6IEVhY2ggc2hhcGUgZnJvbSB0aGUgbGFzdCB0byB0aGUgZmlyc3QgaXMgY2hlY2tlZCB0byBzZWUgaWYKLSAqIHRoZSBwb2ludCBpcyBpbiB0aGUgZHJhd24gYXJlYSBhbmQsIGlmIGl0IGlzLCB0aGUgY29sb3Igb2YgdGhlIHBvaW50IGlzIHRoZQotICogY29sb3Igb2YgdGhlIHNoYXBlIGFuZCB0aGUgYWxwaGEgaXMgMSwgaWYgbm90IHRoZSBwcmV2aW91cyBzaGFwZSBpcyBjaGVja2VkLgotICoKLSAqIFRoaXMgaXMgYW4gYWxpYXNlZCBhbGdvcml0aG0gYmVjYXVzZSBubyBmaWx0ZXJpbmcgaXMgZG9uZTsgYSBwb2ludCBpcyBlaXRoZXIKLSAqIGluc2lkZSBvciBvdXRzaWRlIGVhY2ggc2hhcGUgYW5kICdjbG9zZScgcG9pbnRzIGRvIG5vdCBjb250cmlidXRlIHRvIHRoZQotICogc2FtcGxlLiAgVGhlIGRvd24tc2FtcGxpbmcgaXMgcmVsaWVkIG9uIHRvIGNvcnJlY3QgdGhlIGVycm9yIG9mIG5vdCB1c2luZwotICogYSBmaWx0ZXIuCi0gKgotICogVGhlIGxpbmUgZW5kLWNhcHMgYXJlICdmbGF0JzsgdGhleSBnbyB0aHJvdWdoIHRoZSBwb2ludHMuICBUaGUgc3F1YXJlIGxpbmUKLSAqIGpvaW5zIGFyZSBtaXRyZXM7IHRoZSBvdXRzaWRlIG9mIHRoZSBsaW5lcyBhcmUgY29udGludWVkIHRvIHRoZSBwb2ludCBvZgotICogaW50ZXJzZWN0aW9uLgotICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLS8qIE5vcm1hbGx5IHVzZSA8cG5nLmg+IGhlcmUgdG8gZ2V0IHRoZSBpbnN0YWxsZWQgbGlicG5nLCBidXQgdGhpcyBpcyBkb25lIHRvCi0gKiBlbnN1cmUgdGhlIGNvZGUgcGlja3MgdXAgdGhlIGxvY2FsIGxpYnBuZyBpbXBsZW1lbnRhdGlvbjoKLSAqLwotI2luY2x1ZGUgIi4uLy4uL3BuZy5oIgotCi0jaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvcgotewotICAgY29uc3QgY2hhciAqbmFtZTsKLSAgIGRvdWJsZSAgICAgIHJlZDsKLSAgIGRvdWJsZSAgICAgIGdyZWVuOwotICAgZG91YmxlICAgICAgYmx1ZTsKLX0gY29sb3JzW10gPQotLyogY29sb3IgOjo9IGJsYWNrfHdoaXRlfHJlZHxncmVlbnx5ZWxsb3d8Ymx1ZQotICogY29sb3IgOjo9IGJyb3dufHB1cnBsZXxwaW5rfG9yYW5nZXxncmF5fGN5YW4KLSAqLwotewotICAgeyAiYmxhY2siLCAgIDAsICAgIDAsICAwIH0sCi0gICB7ICJ3aGl0ZSIsICAgMSwgICAgMSwgIDEgfSwKLSAgIHsgInJlZCIsICAgICAxLCAgICAwLCAgMCB9LAotICAgeyAiZ3JlZW4iLCAgIDAsICAgIDEsICAwIH0sCi0gICB7ICJ5ZWxsb3ciLCAgMSwgICAgMSwgIDAgfSwKLSAgIHsgImJsdWUiLCAgICAwLCAgICAwLCAgMSB9LAotICAgeyAiYnJvd24iLCAgLjUsIC4xMjUsICAwIH0sCi0gICB7ICJwdXJwbGUiLCAgMSwgICAgMCwgIDEgfSwKLSAgIHsgInBpbmsiLCAgICAxLCAgIC41LCAuNSB9LAotICAgeyAib3JhbmdlIiwgIDEsICAgLjUsICAwIH0sCi0gICB7ICJncmF5IiwgICAgMCwgICAuNSwgLjUgfSwKLSAgIHsgImN5YW4iLCAgICAwLCAgICAxLCAgMSB9Ci19OwotI2RlZmluZSBjb2xvcl9jb3VudCAoKHNpemVvZiBjb2xvcnMpLyhzaXplb2YgY29sb3JzWzBdKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvciAqCi1jb2xvcl9vZihjb25zdCBjaGFyICphcmcpCi17Ci0gICBpbnQgaWNvbG9yID0gY29sb3JfY291bnQ7Ci0KLSAgIHdoaWxlICgtLWljb2xvciA+PSAwKQotICAgewotICAgICAgaWYgKHN0cmNtcChjb2xvcnNbaWNvbG9yXS5uYW1lLCBhcmcpID09IDApCi0gICAgICAgICByZXR1cm4gY29sb3JzK2ljb2xvcjsKLSAgIH0KLQotICAgZnByaW50ZihzdGRlcnIsICJnZW5wbmc6IGludmFsaWQgY29sb3IgJXNcbiIsIGFyZyk7Ci0gICBleGl0KDEpOwotfQotCi1zdGF0aWMgZG91YmxlCi13aWR0aF9vZihjb25zdCBjaGFyICphcmcpCi17Ci0gICBpZiAoc3RyY21wKGFyZywgImZpbGxlZCIpID09IDApCi0gICAgICByZXR1cm4gMDsKLQotICAgZWxzZQotICAgewotICAgICAgY2hhciAqZXAgPSBOVUxMOwotICAgICAgZG91YmxlIHcgPSBzdHJ0b2QoYXJnLCAmZXApOwotCi0gICAgICBpZiAoZXAgIT0gTlVMTCAmJiAqZXAgPT0gMCAmJiB3ID4gMCkKLSAgICAgICAgIHJldHVybiB3OwotICAgfQotCi0gICBmcHJpbnRmKHN0ZGVyciwgImdlbnBuZzogaW52YWxpZCBsaW5lIHdpZHRoICVzXG4iLCBhcmcpOwotICAgZXhpdCgxKTsKLX0KLQotc3RhdGljIGRvdWJsZQotY29vcmRpbmF0ZV9vZihjb25zdCBjaGFyICphcmcpCi17Ci0gICBjaGFyICplcCA9IE5VTEw7Ci0gICBkb3VibGUgdyA9IHN0cnRvZChhcmcsICZlcCk7Ci0KLSAgIGlmIChlcCAhPSBOVUxMICYmICplcCA9PSAwKQotICAgICAgcmV0dXJuIHc7Ci0KLSAgIGZwcmludGYoc3RkZXJyLCAiZ2VucG5nOiBpbnZhbGlkIGNvb3JkaW5hdGUgdmFsdWUgJXNcbiIsIGFyZyk7Ci0gICBleGl0KDEpOwotfQotCi1zdHJ1Y3QgYXJnOyAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi0KLXR5cGVkZWYgaW50ICgqc2hhcGVfZm5fcHRyKShjb25zdCBzdHJ1Y3QgYXJnICphcmcsIGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0gICAvKiBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiAoeCx5KSBpcyBpbnNpZGUgdGhlIHNoYXBlLgotICAgICoKLSAgICAqIFRoZXJlIGFyZSB0d28gaW1wbGVtZW50YXRpb25zOgotICAgICoKLSAgICAqICAgIGluc2lkZV9mbjogcmV0dXJucyB0cnVlIGlmIHRoZSBwb2ludCBpcyBpbnNpZGUKLSAgICAqICAgIGNoZWNrX2ZuOiAgcmV0dXJuczsKLSAgICAqICAgICAgIC0xOiB0aGUgcG9pbnQgaXMgb3V0c2lkZSB0aGUgc2hhcGUgYnkgbW9yZSB0aGFuIHRoZSBmaWx0ZXIgd2lkdGggKDIpCi0gICAgKiAgICAgICAgMDogdGhlIHBvaW50IG1heSBiZSBpbnNpZGUgdGhlIHNoYXBlCi0gICAgKiAgICAgICArMTogdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgc2hhcGUgYnkgbW9yZSB0aGFuIHRoZSBmaWx0ZXIgd2lkdGgKLSAgICAqLwotI2RlZmluZSBPVVRTSURFICgtMSkKLSNkZWZpbmUgSU5TSURFICAoMSkKLQotc3RydWN0IGFyZwotewotICAgY29uc3Qgc3RydWN0IGNvbG9yICpjb2xvcjsKLSAgIHNoYXBlX2ZuX3B0ciAgICAgICAgaW5zaWRlX2ZuOwotICAgc2hhcGVfZm5fcHRyICAgICAgICBjaGVja19mbjsKLSAgIGRvdWJsZSAgICAgICAgICAgICAgd2lkdGg7IC8qIGxpbmUgd2lkdGgsIDAgZm9yICdmaWxsZWQnICovCi0gICBkb3VibGUgICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyOwotfTsKLQotLyogSU1QTEVNRU5UQVRJT04gTk9URToKLSAqCi0gKiBXZSB3YW50IHRoZSBjb250cmlidXRpb24gb2YgZWFjaCBzaGFwZSB0byB0aGUgc2FtcGxlIGNvcnJlc3BvbmRpbmcgdG8gZWFjaAotICogcGl4ZWwuICBUaGlzIGNvdWxkIGJlIG9idGFpbmVkIGJ5IHN1cGVyIHNhbXBsaW5nIHRoZSBpbWFnZSB0byBpbmZpbml0ZQotICogZGltZW5zaW9ucywgZmluZGluZyBlYWNoIHBvaW50IHdpdGhpbiB0aGUgc2hhcGUgYW5kIGFzc2lnbmluZyB0aGF0IGEgdmFsdWUKLSAqICcxJyB3aGlsZSBsZWF2aW5nIGV2ZXJ5IHBvaW50IG91dHNpZGUgdGhlIHNoYXBlIHdpdGggdmFsdWUgJzAnIHRoZW4KLSAqIGRvd25zYW1wbGluZyB0byB0aGUgaW1hZ2Ugc2l6ZSB3aXRoIHNpbmM7IGNvbXB1dGF0aW9uYWxseSB2ZXJ5IGV4cGVuc2l2ZS4KLSAqCi0gKiBBcHByb3hpbWF0aW9ucyBhcmUgYXMgZm9sbG93czoKLSAqCi0gKiAxKSBJZiB0aGUgcGl4ZWwgY29vcmRpbmF0ZSBpcyB3aXRoaW4gdGhlIHNoYXBlIGFzc3VtZSB0aGUgc2FtcGxlIGhhcyB0aGUKLSAqICAgIHNoYXBlIGNvbG9yIGFuZCBpcyBvcGFxdWUsIGVsc2UgYXNzdW1lIHRoZXJlIGlzIG5vIGNvbnRyaWJ1dGlvbiBmcm9tCi0gKiAgICB0aGUgc2hhcGUuCi0gKgotICogICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBhbGlhc2VkIHJlbmRlcmluZyBvciByZXNhbXBsaW5nIGFuIGltYWdlIHdpdGgKLSAqICAgIGEgYmxvY2sgZmlsdGVyLiAgVGhlIG1heGltdW0gZXJyb3IgaW4gdGhlIGNhbGN1bGF0ZWQgYWxwaGEgKHdoaWNoIHdpbGwKLSAqICAgIGFsd2F5cyBiZSAwIG9yIDEpIGlzIDAuNS4KLSAqCi0gKiAyKSBJZiB0aGUgc2hhcGUgaXMgd2l0aGluIGEgc3F1YXJlIG9mIHNpemUgMXgxIGNlbnRlcmVkIG9uIHRoZSBwaXhlbCBhc3N1bWUKLSAqICAgIHRoYXQgdGhlIHNoYXBlIG9ic2N1cmVzIGFuIGFtb3VudCBvZiB0aGUgcGl4ZWwgZXF1YWwgdG8gaXRzIGFyZWEgd2l0aGluCi0gKiAgICB0aGF0IHNxdWFyZS4KLSAqCi0gKiAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mICdwaXhlbCBjb3ZlcmFnZScgYWxwaGEgY2FsY3VsYXRpb24gb3IgcmVzYW1wbGluZwotICogICAgYW4gaW1hZ2Ugd2l0aCBhIGJpLWxpbmVhciBmaWx0ZXIuICBUaGUgbWF4aW11bSBlcnJvciBpcyBvdmVyIDAuMiwgYnV0IHRoZQotICogICAgcmVzdWx0cyBhcmUgb2Z0ZW4gYWNjZXB0YWJsZS4KLSAqCi0gKiAgICBUaGlzIGNhbiBiZSBhcHByb3hpbWF0ZWQgYnkgYXBwbHlpbmcgKDEpIHRvIGEgc3VwZXItc2FtcGxlZCBpbWFnZSB0aGVuCi0gKiAgICBkb3duc2FtcGxpbmcgd2l0aCBhIGJpLWxpbmVhciBmaWx0ZXIuICBUaGUgZXJyb3IgaW4gdGhlIHN1cGVyLXNhbXBsZWQKLSAqICAgIGltYWdlIGlzIDAuNSBwZXIgc2FtcGxlLCBidXQgdGhlIHJlc2FtcGxpbmcgcmVkdWNlcyB0aGlzLgotICoKLSAqIDMpIFVzZSBhIGJldHRlciBmaWx0ZXIgd2l0aCBhIHN1cGVyLXNhbXBsZWQgaW1hZ2U7IGluIHRoZSBsaW1pdCB0aGlzIGlzIHRoZQotICogICAgc2luYygpIGFwcHJvYWNoLgotICoKLSAqIDQpIERvIHRoZSBnZW9tZXRyaWMgY2FsY3VsYXRpb247IGEgYml2YXJpYXRlIGRlZmluaXRlIGludGVncmFsIGFjcm9zcyB0aGUKLSAqICAgIHNoYXBlLCB1bmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgZXZhbHVhdGluZyBTaSh4KSwgdGhlIGludGVncmFsIG9mIHNpbmMoeCksCi0gKiAgICB3aGljaCBpcyBzdGlsbCBhIGxvdCBvZiBtYXRoLgotICoKLSAqIFRoaXMgY29kZSB1c2VzIGFwcHJvYWNoICgzKSB3aXRoIGEgYmktY3ViaWMgZmlsdGVyIGFuZCA4eCBzdXBlci1zYW1wbGluZwotICogYW5kIG1ldGhvZCAoMSkgZm9yIHRoZSBzdXBlci1zYW1wbGVzLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBzYW1wbGUgaXMgZWl0aGVyCi0gKiAwIG9yIDEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBzdWItcGl4ZWwgaXMgd2l0aGluIG9yIG91dHNpZGUgdGhlIHNoYXBlLgotICogVGhlIGJpLWN1YmljIHdlaWdodHMgYXJlIGFsc28gZml4ZWQgYW5kIHRoZSAxNiByZXF1aXJlZCB3ZWlnaHRzIGFyZQotICogcHJlLWNvbXB1dGVkIGhlcmUgKG5vdGUgdGhhdCB0aGUgJ3NjYWxlJyBzZXR0aW5nIHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkIGlmCi0gKiAnc3VwZXInIGlzIGluY3JlYXNlZCkuCi0gKgotICogVGhlIGNvZGUgYWxzbyBjYWxjdWxhdGVzIGEgc3VtIHRvIHRoZSBlZGdlIG9mIHRoZSBmaWx0ZXIuIFRoaXMgaXMgbm90Ci0gKiBjdXJyZW50bHkgdXNlZCBieSBjb3VsZCBiZSB1c2VkIHRvIG9wdGltaXplIHRoZSBjYWxjdWxhdGlvbi4KLSAqLwotI2lmIDAgLyogYmMgY29kZSAqLwotc2NhbGU9MTAKLXN1cGVyPTgKLWRlZmluZSBiaWN1YmljKHgpIHsKLSAgIGlmICh4IDw9IDEpIHJldHVybiAoMS41KnggLSAyLjUpKngqeCArIDE7Ci0gICBpZiAoeCA8ICAyKSByZXR1cm4gKCgoMi41IC0gMC41KngpKnggLSA0KSp4ICsgMik7Ci0gICByZXR1cm4gMDsKLX0KLWRlZmluZSBzdW0oeCkgewotICAgYXV0byBzOwotICAgcyA9IDA7Ci0gICB3aGlsZSAoeCA8IDIqc3VwZXIpIHsKLSAgICAgIHMgPSBzICsgYmljdWJpYyh4L3N1cGVyKTsKLSAgICAgIHggPSB4ICsgMTsKLSAgIH0KLSAgIHJldHVybiBzOwotfQotZGVmaW5lIHJlc3VsdHMoeCkgewotICAgYXV0byBiLCBzOwotICAgYiA9IGJpY3ViaWMoeC9zdXBlcik7Ci0gICBzID0gc3VtKHgpOwotCi0gICBwcmludCAiICAgLyoiLCB4LCAiKi8geyAiLCBiLCAiLCAiLCBzLCAiIH0iOwotICAgcmV0dXJuIDE7Ci19Ci14PTAKLXdoaWxlICh4PDIqc3VwZXIpIHsKLSAgIHggPSB4ICsgcmVzdWx0cyh4KQotICAgaWYgKHggPCAyKnN1cGVyKSBwcmludCAiLCIKLSAgIHByaW50ICJcbiIKLX0KLXF1aXQKLSNlbmRpZgotCi0jZGVmaW5lIEJJQ1VCSUMxKHgpIC8qICAgICB8eHwgPD0gMSAqLyAoKDEuNSooeCkqIC0gMi41KSooeCkqKHgpICsgMSkKLSNkZWZpbmUgQklDVUJJQzIoeCkgLyogMSA8IHx4fCA8ICAyICovICgoKDIuNSAtIDAuNSooeCkpKih4KSAtIDQpKih4KSArIDIpCi0jZGVmaW5lIEZJTFRFUl9XRUlHSFQgOSAvKiBUd2ljZSB0aGUgZmlyc3Qgc3VtIGJlbG93ICovCi0jZGVmaW5lIEZJTFRFUl9XSURUSCAgMiAvKiBBY3R1YWxseSBoYWxmIHRoZSB3aWR0aDsgLTIuLisyICovCi0jZGVmaW5lIEZJTFRFUl9TVEVQUyAgOCAvKiBzdGVwcyBwZXIgZmlsdGVyIHVuaXQgKi8KLXN0YXRpYyBjb25zdCBkb3VibGUKLWJpY3ViaWNbMTZdWzJdID0KLXsKLSAgIC8qIFRoZXNlIG51bWJlcnMgYXJlIGV4YWN0OyB0aGUgd2VpZ2h0IGZvciB0aGUgZmlsdGVyIGlzIDEvOSwgYnV0IHRoaXMKLSAgICAqIHdvdWxkIG1ha2UgdGhlIG51bWJlcnMgaW5leGFjdCwgc28gaXQgaXMgbm90IGluY2x1ZGVkIGhlcmUuCi0gICAgKi8KLSAgIC8qICAgICAgICAgIGJpY3ViaWMgICAgICBzdW0gICAgICAgICovCi0gICAvKiAwKi8geyAxLjAwMDAwMDAwMDAsIDQuNTAwMDAwMDAwMCB9LAotICAgLyogMSovIHsgIC45NjM4NjcxODc1LCAzLjUwMDAwMDAwMDAgfSwKLSAgIC8qIDIqLyB7ICAuODY3MTg3NTAwMCwgMi41MzYxMzI4MTI1IH0sCi0gICAvKiAzKi8geyAgLjcyNzUzOTA2MjUsIDEuNjY4OTQ1MzEyNSB9LAotICAgLyogNCovIHsgIC41NjI1MDAwMDAwLCAgLjk0MTQwNjI1MDAgfSwKLSAgIC8qIDUqLyB7ICAuMzg5NjQ4NDM3NSwgIC4zNzg5MDYyNTAwIH0sCi0gICAvKiA2Ki8geyAgLjIyNjU2MjUwMDAsIC0uMDEwNzQyMTg3NSB9LAotICAgLyogNyovIHsgIC4wOTA4MjAzMTI1LCAtLjIzNzMwNDY4NzUgfSwKLSAgIC8qIDgqLyB7ICAgICAgICAgICAgMCwgLS4zMjgxMjUwMDAwIH0sCi0gICAvKiA5Ki8geyAtLjA0Nzg1MTU2MjUsIC0uMzI4MTI1MDAwMCB9LAotICAgLyoxMCovIHsgLS4wNzAzMTI1MDAwLCAtLjI4MDI3MzQzNzUgfSwKLSAgIC8qMTEqLyB7IC0uMDczMjQyMTg3NSwgLS4yMDk5NjA5Mzc1IH0sCi0gICAvKjEyKi8geyAtLjA2MjUwMDAwMDAsIC0uMTM2NzE4NzUwMCB9LAotICAgLyoxMyovIHsgLS4wNDM5NDUzMTI1LCAtLjA3NDIxODc1MDAgfSwKLSAgIC8qMTQqLyB7IC0uMDIzNDM3NTAwMCwgLS4wMzAyNzM0Mzc1IH0sCi0gICAvKjE1Ki8geyAtLjAwNjgzNTkzNzUsIC0uMDA2ODM1OTM3NSB9Ci19OwotCi1zdGF0aWMgZG91YmxlCi1hbHBoYV9jYWxjKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgLyogRm9yIFt4LTIuLngrMl0sW3ktMix5KzJdIGNhbGN1bGF0ZSB0aGUgd2VpZ2h0ZWQgYmljdWJpYyBnaXZlbiBhIGZ1bmN0aW9uCi0gICAgKiB3aGljaCB0ZWxscyB1cyB3aGV0aGVyIGEgcG9pbnQgaXMgaW5zaWRlIG9yIG91dHNpZGUgdGhlIHNoYXBlLiAgRmlyc3QKLSAgICAqIGNoZWNrIGlmIHdlIG5lZWQgdG8gZG8gdGhpcyBhdCBhbGw6Ci0gICAgKi8KLSAgIHN3aXRjaCAoYXJnLT5jaGVja19mbihhcmcsIHgsIHkpKQotICAgewotICAgICAgY2FzZSBPVVRTSURFOgotICAgICAgICAgcmV0dXJuIDA7IC8qIGFsbCBzYW1wbGVzIG91dHNpZGUgdGhlIHNoYXBlICovCi0KLSAgICAgIGNhc2UgSU5TSURFOgotICAgICAgICAgcmV0dXJuIDE7IC8qIGFsbCBzYW1wbGVzIGluc2lkZSB0aGUgc2hhcGUgKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgIGludCBkeTsKLSAgICAgICAgIGRvdWJsZSBhbHBoYSA9IDA7Ci0KLSMgICAgICAgIGRlZmluZSBGSUxURVJfRCAoRklMVEVSX1dJRFRIKkZJTFRFUl9TVEVQUy0xKQotICAgICAgICAgZm9yIChkeT0tRklMVEVSX0Q7IGR5PD1GSUxURVJfRDsgKytkeSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSB3eSA9IGJpY3ViaWNbYWJzKGR5KV1bMF07Ci0KLSAgICAgICAgICAgIGlmICh3eSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZG91YmxlIGFscGhheSA9IDA7Ci0gICAgICAgICAgICAgICBpbnQgZHg7Ci0KLSAgICAgICAgICAgICAgIGZvciAoZHg9LUZJTFRFUl9EOyBkeDw9RklMVEVSX0Q7ICsrZHgpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBkb3VibGUgd3ggPSBiaWN1YmljW2FicyhkeCldWzBdOwotCi0gICAgICAgICAgICAgICAgICBpZiAod3ggIT0gMCAmJiBhcmctPmluc2lkZV9mbihhcmcsIHgrZHgvMTYsIHkrZHkvMTYpKQotICAgICAgICAgICAgICAgICAgICAgYWxwaGF5ICs9IHd4OwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBhbHBoYSArPSB3eSAqIGFscGhheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgLyogVGhpcyBuZWVkcyB0byBiZSB3ZWlnaHRlZCBmb3IgZWFjaCBkaW1lbnNpb246ICovCi0gICAgICAgICByZXR1cm4gYWxwaGEgLyAoRklMVEVSX1dFSUdIVCpGSUxURVJfV0VJR0hUKTsKLSAgICAgIH0KLSAgIH0KLX0KLQotLyogVGhlc2UgYXJlIHRoZSBzaGFwZSBmdW5jdGlvbnMuICovCi0vKiAic3F1YXJlIiwKLSAqIHsgaW5zaWRlX3NxdWFyZV9maWxsZWQsIGNoZWNrX3NxdWFyZV9maWxsZWQgfSwKLSAqIHsgaW5zaWRlX3NxdWFyZSwgY2hlY2tfc3F1YXJlIH0KLSAqLwotc3RhdGljIGludAotc3F1YXJlX2NoZWNrKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKQotICAgLyogSXMgeCx5IGluc2lkZSB0aGUgc3F1YXJlICh4MSx5MSkuLih4Mix5Mik/ICovCi17Ci0gICAvKiBEbyBhIG1vZGlmaWVkIENvaGVuLVN1dGhlcmxhbmQgb24gb25lIHBvaW50LCBiaXQgcGF0dGVybnMgdGhhdCBpbmRpY2F0ZQotICAgICogJ291dHNpZGUnIGFyZToKLSAgICAqCi0gICAgKiAgIHg8eDEgfCB4PHkxIHwgeDx4MiB8IHg8eTIKLSAgICAqICAgIDAgICAgICB4ICAgICAgMCAgICAgIHggICAgIFRvIHRoZSByaWdodAotICAgICogICAgMSAgICAgIHggICAgICAxICAgICAgeCAgICAgVG8gdGhlIGxlZnQKLSAgICAqICAgIHggICAgICAwICAgICAgeCAgICAgIDAgICAgIEJlbG93Ci0gICAgKiAgICB4ICAgICAgMSAgICAgIHggICAgICAxICAgICBBYm92ZQotICAgICoKLSAgICAqIFNvICdpbnNpZGUnIGlzICh4PHgxKSAhPSAoeDx4MikgJiYgKHk8eTEpICE9ICh5PHkyKTsKLSAgICAqLwotICAgcmV0dXJuICgoeDx4MSkgXiAoeDx4MikpICYgKCh5PHkxKSBeICh5PHkyKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWluc2lkZV9zcXVhcmVfZmlsbGVkKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgcmV0dXJuIHNxdWFyZV9jaGVjayh4LCB5LCBhcmctPngxLCBhcmctPnkxLCBhcmctPngyLCBhcmctPnkyKTsKLX0KLQotc3RhdGljIGludAotc3F1YXJlX2NoZWNrX2xpbmUoY29uc3Qgc3RydWN0IGFyZyAqYXJnLCBkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3KQotICAgLyogQ2hlY2sgZm9yIGEgcG9pbnQgYmVpbmcgaW5zaWRlIHRoZSBib3VuZGFyaWVzIGltcGxpZWQgYnkgdGhlIGdpdmVuIGFyZwotICAgICogYW5kIGFzc3VtaW5nIGEgd2lkdGggMip3IGVhY2ggc2lkZSBvZiB0aGUgYm91bmRhcmllcy4gIFRoaXMgcmV0dXJucyB0aGUKLSAgICAqICdjaGVjaycgSU5TSURFL09VVFNJREUvMCByZXN1bHQgYnV0IG5vdGUgdGhlIHNlbWFudGljczoKLSAgICAqCi0gICAgKiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0rCi0gICAgKiAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgT1VUU0lERQotICAgICogICAgICAgICAgfCAgIElOU0lERSAgICAgfAotICAgICogICAgICAgICAgfCAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgICoKLSAgICAqIEFuZCAnMCcgbWVhbnMgd2l0aGluIHRoZSBsaW5lIGJvdW5kYXJpZXMuCi0gICAgKi8KLXsKLSAgIGRvdWJsZSBjeCA9IChhcmctPngxK2FyZy0+eDIpLzI7Ci0gICBkb3VibGUgd3ggPSBmYWJzKGFyZy0+eDEtYXJnLT54MikvMjsKLSAgIGRvdWJsZSBjeSA9IChhcmctPnkxK2FyZy0+eTIpLzI7Ci0gICBkb3VibGUgd3kgPSBmYWJzKGFyZy0+eTEtYXJnLT55MikvMjsKLQotICAgaWYgKHNxdWFyZV9jaGVjayh4LCB5LCBjeC13eC13LCBjeS13eS13LCBjeCt3eCt3LCBjeSt3eSt3KSkKLSAgIHsKLSAgICAgIC8qIEluc2lkZSwgYnV0IG1heWJlIHRvbyBmYXI7IGNoZWNrIGZvciB0aGUgcmVkdW5kYW50IGNhc2Ugd2hlcmUKLSAgICAgICAqIHRoZSBsaW5lcyBvdmVybGFwOgotICAgICAgICovCi0gICAgICB3eCAtPSB3OwotICAgICAgd3kgLT0gdzsKLSAgICAgIGlmICh3eCA+IDAgJiYgd3kgPiAwICYmIHNxdWFyZV9jaGVjayh4LCB5LCBjeC13eCwgY3ktd3ksIGN4K3d4LCBjeSt3eSkpCi0gICAgICAgICByZXR1cm4gSU5TSURFOyAvKiBiZXR3ZWVuIChpbnNpZGUpIHRoZSBib3VuZGFyeSBsaW5lcy4gKi8KLQotICAgICAgcmV0dXJuIDA7IC8qIGluc2lkZSB0aGUgbGluZXMgdGhlbXNlbHZlcy4gKi8KLSAgIH0KLQotICAgcmV0dXJuIE9VVFNJREU7IC8qIG91dHNpZGUgdGhlIGJvdW5kYXJ5IGxpbmVzLiAqLwotfQotCi1zdGF0aWMgaW50Ci1jaGVja19zcXVhcmVfZmlsbGVkKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgLyogVGhlIGZpbHRlciBleHRlbmRzICsvLUZJTFRFUl9XSURUSCBlYWNoIHNpZGUgb2YgZWFjaCBvdXRwdXQgcG9pbnQsIHNvCi0gICAgKiB0aGUgY2hlY2sgaGFzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgdGhlIHNxdWFyZSBieSB0aGF0IGFtb3VudDsgJzAnCi0gICAgKiBtZWFucyBjbG9zZSBlbm91Z2ggdG8gdGhlIGVkZ2Ugb2YgdGhlIHNxdWFyZSB0aGF0IHRoZSBiaWN1YmljIGZpbHRlciBoYXMKLSAgICAqIHRvIGJlIHJ1biwgT1VUU0lERSBtZWFucyBhbHBoYT09MCwgSU5TSURFIG1lYW5zIGFscGhhPT0xLgotICAgICovCi0gICByZXR1cm4gc3F1YXJlX2NoZWNrX2xpbmUoYXJnLCB4LCB5LCBGSUxURVJfV0lEVEgpOwotfQotCi1zdGF0aWMgaW50Ci1pbnNpZGVfc3F1YXJlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgLyogUmV0dXJuIHRydWUgaWYgd2l0aGluIHRoZSBkcmF3biBsaW5lcywgZWxzZSBmYWxzZSwgbm8gbmVlZCB0byBkaXN0aW5ndWlzaAotICAgICogSU5TSURFIHZzIE9VVFNJREUgaGVyZToKLSAgICAqLwotICAgcmV0dXJuIHNxdWFyZV9jaGVja19saW5lKGFyZywgeCwgeSwgYXJnLT53aWR0aC8yKSA9PSAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja19zcXVhcmUoY29uc3Qgc3RydWN0IGFyZyAqYXJnLCBkb3VibGUgeCwgZG91YmxlIHkpCi17Ci0gICAvKiBTbyBmb3IgdGhpcyBmdW5jdGlvbiBhIHJlc3VsdCBvZiAnSU5TSURFJyBtZWFucyBpbnNpZGUgdGhlIGFjdHVhbCBsaW5lcy4KLSAgICAqLwotICAgZG91YmxlIHcgPSBhcmctPndpZHRoLzI7Ci0KLSAgIGlmIChzcXVhcmVfY2hlY2tfbGluZShhcmcsIHgsIHksIHcrRklMVEVSX1dJRFRIKSA9PSAwKQotICAgewotICAgICAgLyogU29tZXdoZXJlIGNsb3NlIHRvIHRoZSBib3VuZGFyeSBsaW5lcy4gSWYgZmFyIGVub3VnaCBpbnNpZGUgb25lIG9mCi0gICAgICAgKiB0aGVtIHRoZW4gd2UgY2FuIHJldHVybiBJTlNJREU6Ci0gICAgICAgKi8KLSAgICAgIHcgLT0gRklMVEVSX1dJRFRIOwotCi0gICAgICBpZiAodyA+IDAgJiYgc3F1YXJlX2NoZWNrX2xpbmUoYXJnLCB4LCB5LCB3KSA9PSAwKQotICAgICAgICAgcmV0dXJuIElOU0lERTsKLQotICAgICAgLyogUG9pbnQgaXMgc29tZXdoZXJlIGluIHRoZSBmaWx0ZXIgcmVnaW9uOiAqLwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIGVsc2UgLyogSW5zaWRlIG9yIG91dHNpZGUgdGhlIHNxdWFyZSBieSBtb3JlIHRoYW4gdytGSUxURVJfV0lEVEguICovCi0gICAgICByZXR1cm4gT1VUU0lERTsKLX0KLQotLyogImNpcmNsZSIsCi0gKiB7IGluc2lkZV9jaXJjbGVfZmlsbGVkLCBjaGVja19jaXJjbGVfZmlsbGVkIH0sCi0gKiB7IGluc2lkZV9jaXJjbGUsIGNoZWNrX2NpcmNsZSB9Ci0gKgotICogVGhlIGZ1bmN0aW9ucyBoZXJlIGFyZSBhbmFsb2d1b3VzIHRvIHRoZSBzcXVhcmUgb25lczsgaG93ZXZlciwgdGhleSBjaGVjawotICogdGhlIGNvcnJlc3BvbmRpbmcgZWxsaXBzZSBhcyBvcHBvc2VkIHRvIHRoZSByZWN0YW5nbGUuCi0gKi8KLXN0YXRpYyBpbnQKLWNpcmNsZV9jaGVjayhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikKLXsKLSAgIGlmIChzcXVhcmVfY2hlY2soeCwgeSwgeDEsIHkxLCB4MiwgeTIpKQotICAgewotICAgICAgLyogSW5zaWRlIHRoZSBzcXVhcmUsIHNvIG1heWJlIGluc2lkZSB0aGUgY2lyY2xlIHRvbzogKi8KLSAgICAgIGNvbnN0IGRvdWJsZSBjeCA9ICh4MSArIHgyKS8yOwotICAgICAgY29uc3QgZG91YmxlIGN5ID0gKHkxICsgeTIpLzI7Ci0gICAgICBjb25zdCBkb3VibGUgZHggPSB4MSAtIHgyOwotICAgICAgY29uc3QgZG91YmxlIGR5ID0geTEgLSB5MjsKLQotICAgICAgeCA9ICh4IC0gY3gpL2R4OwotICAgICAgeSA9ICh5IC0gY3kpL2R5OwotCi0gICAgICAvKiBJdCBpcyBvdXRzaWRlIGlmIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgaXMgbW9yZSB0aGFuIGhhbGYgdGhlCi0gICAgICAgKiBkaWFtZXRlcjoKLSAgICAgICAqLwotICAgICAgcmV0dXJuIHgqeCt5KnkgPCAuMjU7Ci0gICB9Ci0KLSAgIHJldHVybiAwOyAvKiBvdXRzaWRlICovCi19Ci0KLXN0YXRpYyBpbnQKLWluc2lkZV9jaXJjbGVfZmlsbGVkKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgcmV0dXJuIGNpcmNsZV9jaGVjayh4LCB5LCBhcmctPngxLCBhcmctPnkxLCBhcmctPngyLCBhcmctPnkyKTsKLX0KLQotc3RhdGljIGludAotY2lyY2xlX2NoZWNrX2xpbmUoY29uc3Qgc3RydWN0IGFyZyAqYXJnLCBkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3KQotICAgLyogQ2hlY2sgZm9yIGEgcG9pbnQgYmVpbmcgaW5zaWRlIHRoZSBib3VuZGFyaWVzIGltcGxpZWQgYnkgdGhlIGdpdmVuIGFyZwotICAgICogYW5kIGFzc3VtaW5nIGEgd2lkdGggMip3IGVhY2ggc2lkZSBvZiB0aGUgYm91bmRhcmllcy4gIFRoaXMgZnVuY3Rpb24gaGFzCi0gICAgKiB0aGUgc2FtZSBzZW1hbnRpYyBhcyBzcXVhcmVfY2hlY2tfbGluZSBidXQgdGVzdHMgdGhlIGNpcmNsZS4KLSAgICAqLwotewotICAgZG91YmxlIGN4ID0gKGFyZy0+eDErYXJnLT54MikvMjsKLSAgIGRvdWJsZSB3eCA9IGZhYnMoYXJnLT54MS1hcmctPngyKS8yOwotICAgZG91YmxlIGN5ID0gKGFyZy0+eTErYXJnLT55MikvMjsKLSAgIGRvdWJsZSB3eSA9IGZhYnMoYXJnLT55MS1hcmctPnkyKS8yOwotCi0gICBpZiAoY2lyY2xlX2NoZWNrKHgsIHksIGN4LXd4LXcsIGN5LXd5LXcsIGN4K3d4K3csIGN5K3d5K3cpKQotICAgewotICAgICAgLyogSW5zaWRlLCBidXQgbWF5YmUgdG9vIGZhcjsgY2hlY2sgZm9yIHRoZSByZWR1bmRhbnQgY2FzZSB3aGVyZQotICAgICAgICogdGhlIGxpbmVzIG92ZXJsYXA6Ci0gICAgICAgKi8KLSAgICAgIHd4IC09IHc7Ci0gICAgICB3eSAtPSB3OwotICAgICAgaWYgKHd4ID4gMCAmJiB3eSA+IDAgJiYgY2lyY2xlX2NoZWNrKHgsIHksIGN4LXd4LCBjeS13eSwgY3grd3gsIGN5K3d5KSkKLSAgICAgICAgIHJldHVybiBJTlNJREU7IC8qIGJldHdlZW4gKGluc2lkZSkgdGhlIGJvdW5kYXJ5IGxpbmVzLiAqLwotCi0gICAgICByZXR1cm4gMDsgLyogaW5zaWRlIHRoZSBsaW5lcyB0aGVtc2VsdmVzLiAqLwotICAgfQotCi0gICByZXR1cm4gT1VUU0lERTsgLyogb3V0c2lkZSB0aGUgYm91bmRhcnkgbGluZXMuICovCi19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrX2NpcmNsZV9maWxsZWQoY29uc3Qgc3RydWN0IGFyZyAqYXJnLCBkb3VibGUgeCwgZG91YmxlIHkpCi17Ci0gICByZXR1cm4gY2lyY2xlX2NoZWNrX2xpbmUoYXJnLCB4LCB5LCBGSUxURVJfV0lEVEgpOwotfQotCi1zdGF0aWMgaW50Ci1pbnNpZGVfY2lyY2xlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgcmV0dXJuIGNpcmNsZV9jaGVja19saW5lKGFyZywgeCwgeSwgYXJnLT53aWR0aC8yKSA9PSAwOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja19jaXJjbGUoY29uc3Qgc3RydWN0IGFyZyAqYXJnLCBkb3VibGUgeCwgZG91YmxlIHkpCi17Ci0gICAvKiBFeGFjdGx5IGFzIHRoZSAnc3F1YXJlJyBjb2RlLiAgKi8KLSAgIGRvdWJsZSB3ID0gYXJnLT53aWR0aC8yOwotCi0gICBpZiAoY2lyY2xlX2NoZWNrX2xpbmUoYXJnLCB4LCB5LCB3K0ZJTFRFUl9XSURUSCkgPT0gMCkKLSAgIHsKLSAgICAgIHcgLT0gRklMVEVSX1dJRFRIOwotCi0gICAgICBpZiAodyA+IDAgJiYgY2lyY2xlX2NoZWNrX2xpbmUoYXJnLCB4LCB5LCB3KSA9PSAwKQotICAgICAgICAgcmV0dXJuIElOU0lERTsKLQotICAgICAgLyogUG9pbnQgaXMgc29tZXdoZXJlIGluIHRoZSBmaWx0ZXIgcmVnaW9uOiAqLwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIGVsc2UgLyogSW5zaWRlIG9yIG91dHNpZGUgdGhlIHNxdWFyZSBieSBtb3JlIHRoYW4gdytGSUxURVJfV0lEVEguICovCi0gICAgICByZXR1cm4gT1VUU0lERTsKLX0KLQotLyogImxpbmUiLAotICogeyBOVUxMLCBOVUxMIH0sICBUaGVyZSBpcyBubyAnZmlsbGVkJyBsaW5lLgotICogeyBpbnNpZGVfbGluZSwgY2hlY2tfbGluZSB9Ci0gKi8KLXN0YXRpYyBpbnQKLWxpbmVfY2hlY2soZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsCi0gICBkb3VibGUgdywgZG91YmxlIGV4cGFuZCkKLXsKLSAgIC8qIFNoaWZ0IGFsbCB0aGUgcG9pbnRzIHRvIChhcmctPngxLCBhcmctPnkxKSAqLwotICAgZG91YmxlIGx4ID0geDIgLSB4MTsKLSAgIGRvdWJsZSBseSA9IHkyIC0geTE7Ci0gICBkb3VibGUgbGVuMiA9IGx4Kmx4ICsgbHkqbHk7Ci0gICBkb3VibGUgY3Jvc3MsIGRvdDsKLQotICAgeCAtPSB4MTsKLSAgIHkgLT0geTE7Ci0KLSAgIC8qIFRoZSBkb3QgcHJvZHVjdCBpcyB0aGUgZGlzdGFuY2UgZG93biB0aGUgbGluZSwgdGhlIGNyb3NzIHByb2R1Y3QgaXMKLSAgICAqIHRoZSBkaXN0YW5jZSBhd2F5IGZyb20gdGhlIGxpbmU6Ci0gICAgKgotICAgICogICAgZGlzdGFuY2UgPSB8Y3Jvc3N8IC8gc3FydChsZW4yKQotICAgICovCi0gICBjcm9zcyA9IHggKiBseSAtIHkgKiBseDsKLQotICAgLyogSWYgJ2Rpc3RhbmNlJyBpcyBtb3JlIHRoYW4gdyB0aGUgcG9pbnQgaXMgZGVmaW5pdGVseSBvdXRzaWRlIHRoZSBsaW5lOgotICAgICoKLSAgICAqICAgICBkaXN0YW5jZSA+PSB3Ci0gICAgKiAgICAgfGNyb3NzfCAgPj0gdyAqIHNxcnQobGVuMikKLSAgICAqICAgICBjcm9zc14yICA+PSB3XjIgKiBsZW4yOgotICAgICovCi0gICBpZiAoY3Jvc3MqY3Jvc3MgPj0gKHcrZXhwYW5kKSoodytleHBhbmQpKmxlbjIpCi0gICAgICByZXR1cm4gMDsgLyogb3V0c2lkZSAqLwotCi0gICAvKiBOb3cgZmluZCB0aGUgZGlzdGFuY2UgKmFsb25nKiB0aGUgbGluZTsgdGhpcyBjb21lcyBmcm9tIHRoZSBkb3QgcHJvZHVjdAotICAgICogbHgueCtseS55LiBUaGUgYWN0dWFsIGRpc3RhbmNlIChpbiBwaXhlbHMpIGlzOgotICAgICoKLSAgICAqICAgZGlzdGFuY2UgPSBkb3QgLyBzcXJ0KGxlbjIpCi0gICAgKi8KLSAgIGRvdCA9IGx4ICogeCArIGx5ICogeTsKLQotICAgLyogVGhlIHRlc3QgZm9yICdvdXRzaWRlJyBpczoKLSAgICAqCi0gICAgKiAgICBkaXN0YW5jZSA8IDAgfHwgZGlzdGFuY2UgPiBzcXJ0KGxlbjIpCi0gICAgKiAgICAgICAgICAgICAgICAgLT4gZG90IC8gc3FydChsZW4yKSA+IHNxcnQobGVuMikKLSAgICAqICAgICAgICAgICAgICAgICAtPiBkb3QgPiBsZW4yCi0gICAgKgotICAgICogQnV0ICdleHBhbmQnIGlzIHVzZWQgZm9yIHRoZSBmaWx0ZXIgd2lkdGggYW5kIG5lZWRzIHRvIGJlIGhhbmRsZWQgdG9vOgotICAgICovCi0gICByZXR1cm4gZG90ID4gLWV4cGFuZCAmJiBkb3QgPCBsZW4yK2V4cGFuZDsKLX0KLQotc3RhdGljIGludAotaW5zaWRlX2xpbmUoY29uc3Qgc3RydWN0IGFyZyAqYXJnLCBkb3VibGUgeCwgZG91YmxlIHkpCi17Ci0gICByZXR1cm4gbGluZV9jaGVjayh4LCB5LCBhcmctPngxLCBhcmctPnkxLCBhcmctPngyLCBhcmctPnkyLCBhcmctPndpZHRoLzIsIDApOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja19saW5lKGNvbnN0IHN0cnVjdCBhcmcgKmFyZywgZG91YmxlIHgsIGRvdWJsZSB5KQotewotICAgLyogVGhlIGVuZCBjYXBzIG9mIHRoZSBsaW5lIG11c3QgYmUgY2hlY2tlZCB0b287IGl0J3Mgbm90IGVub3VnaCBqdXN0IHRvCi0gICAgKiB3aWRlbiB0aGUgbGluZSBieSBGSUxURVJfV0lEVEg7ICdleHBhbmQnIGV4aXN0cyBmb3IgdGhpcyBwdXJwb3NlOgotICAgICovCi0gICBpZiAobGluZV9jaGVjayh4LCB5LCBhcmctPngxLCBhcmctPnkxLCBhcmctPngyLCBhcmctPnkyLCBhcmctPndpZHRoLzIsCi0gICAgICAgRklMVEVSX1dJRFRIKSkKLSAgIHsKLSAgICAgIC8qIEluc2lkZSB0aGUgbGluZStmaWx0ZXI7IGZhciBlbm91Z2ggaW5zaWRlIHRoYXQgdGhlIGZpbHRlciBpc24ndAotICAgICAgICogcmVxdWlyZWQ/Ci0gICAgICAgKi8KLSAgICAgIGlmIChhcmctPndpZHRoID4gMipGSUxURVJfV0lEVEggJiYKLSAgICAgICAgICBsaW5lX2NoZWNrKHgsIHksIGFyZy0+eDEsIGFyZy0+eTEsIGFyZy0+eDIsIGFyZy0+eTIsIGFyZy0+d2lkdGgvMiwKLSAgICAgICAgICAgICAtRklMVEVSX1dJRFRIKSkKLSAgICAgICAgIHJldHVybiBJTlNJREU7Ci0KLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICByZXR1cm4gT1VUU0lERTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdAotewotICAgY29uc3QgY2hhciAgICAqbmFtZTsKLSAgIHNoYXBlX2ZuX3B0ciAgIGZ1bmN0aW9uWzIvKmZpbGwsbGluZSovXVsyXTsKLSMgIGRlZmluZSAgICAgICAgIEZOX0lOU0lERSAwCi0jICBkZWZpbmUgICAgICAgICBGTl9DSEVDSyAxCi19IHNoYXBlX2RlZnNbXSA9Ci17Ci0gICB7ICAic3F1YXJlIiwKLSAgICAgIHsgIHsgaW5zaWRlX3NxdWFyZV9maWxsZWQsIGNoZWNrX3NxdWFyZV9maWxsZWQgfSwKLSAgICAgICAgIHsgaW5zaWRlX3NxdWFyZSwgY2hlY2tfc3F1YXJlIH0gfQotICAgfSwKLSAgIHsgICJjaXJjbGUiLAotICAgICAgeyAgeyBpbnNpZGVfY2lyY2xlX2ZpbGxlZCwgY2hlY2tfY2lyY2xlX2ZpbGxlZCB9LAotICAgICAgICAgeyBpbnNpZGVfY2lyY2xlLCBjaGVja19jaXJjbGUgfSB9Ci0gICB9LAotICAgeyAgImxpbmUiLAotICAgICAgeyAgeyBOVUxMLCBOVUxMIH0sCi0gICAgICAgICB7IGluc2lkZV9saW5lLCBjaGVja19saW5lIH0gfQotICAgfQotfTsKLQotI2RlZmluZSBzaGFwZV9jb3VudCAoKHNpemVvZiBzaGFwZV9kZWZzKS8oc2l6ZW9mIHNoYXBlX2RlZnNbMF0pKQotCi1zdGF0aWMgc2hhcGVfZm5fcHRyCi1zaGFwZV9vZihjb25zdCBjaGFyICphcmcsIGRvdWJsZSB3aWR0aCwgaW50IGYpCi17Ci0gICB1bnNpZ25lZCBpbnQgaTsKLQotICAgZm9yIChpPTA7IGk8c2hhcGVfY291bnQ7ICsraSkgaWYgKHN0cmNtcChzaGFwZV9kZWZzW2ldLm5hbWUsIGFyZykgPT0gMCkKLSAgIHsKLSAgICAgIHNoYXBlX2ZuX3B0ciBmbiA9IHNoYXBlX2RlZnNbaV0uZnVuY3Rpb25bd2lkdGggIT0gMF1bZl07Ci0KLSAgICAgIGlmIChmbiAhPSBOVUxMKQotICAgICAgICAgcmV0dXJuIGZuOwotCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnBuZzogJXMgJXMgbm90IHN1cHBvcnRlZFxuIiwKLSAgICAgICAgIHdpZHRoID09IDAgPyAiZmlsbGVkIiA6ICJ1bmZpbGxlZCIsIGFyZyk7Ci0gICAgICBleGl0KDEpOwotICAgfQotCi0gICBmcHJpbnRmKHN0ZGVyciwgImdlbnBuZzogJXM6IG5vdCBhIHZhbGlkIHNoYXBlIG5hbWVcbiIsIGFyZyk7Ci0gICBleGl0KDEpOwotfQotCi1zdGF0aWMgdm9pZAotcGFyc2VfYXJnKHN0cnVjdCBhcmcgKmFyZywgY29uc3QgY2hhciAqKmFyZ3YvKjcgYXJndW1lbnRzKi8pCi17Ci0gICAvKiBzaGFwZSA6Oj0gY29sb3Igd2lkdGggc2hhcGUgeDEgeTEgeDIgeTIgKi8KLSAgIGFyZy0+Y29sb3IgPSBjb2xvcl9vZihhcmd2WzBdKTsKLSAgIGFyZy0+d2lkdGggPSB3aWR0aF9vZihhcmd2WzFdKTsKLSAgIGFyZy0+aW5zaWRlX2ZuID0gc2hhcGVfb2YoYXJndlsyXSwgYXJnLT53aWR0aCwgRk5fSU5TSURFKTsKLSAgIGFyZy0+Y2hlY2tfZm4gPSBzaGFwZV9vZihhcmd2WzJdLCBhcmctPndpZHRoLCBGTl9DSEVDSyk7Ci0gICBhcmctPngxID0gY29vcmRpbmF0ZV9vZihhcmd2WzNdKTsKLSAgIGFyZy0+eTEgPSBjb29yZGluYXRlX29mKGFyZ3ZbNF0pOwotICAgYXJnLT54MiA9IGNvb3JkaW5hdGVfb2YoYXJndls1XSk7Ci0gICBhcmctPnkyID0gY29vcmRpbmF0ZV9vZihhcmd2WzZdKTsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyCi1yZWFkX3doKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN0cikKLSAgIC8qIHJlYWQgYSBQTkcgd2lkdGggb3IgaGVpZ2h0ICovCi17Ci0gICBjaGFyICplcCA9IE5VTEw7Ci0gICB1bnNpZ25lZCBsb25nIHVsID0gc3RydG91bChzdHIsICZlcCwgMTApOwotCi0gICBpZiAoZXAgIT0gTlVMTCAmJiAqZXAgPT0gMCAmJiB1bCA+IDAgJiYgdWwgPD0gMHg3ZmZmZmZmZikKLSAgICAgIHJldHVybiAocG5nX3VpbnRfMzIpLypTQUZFKi91bDsKLQotICAgZnByaW50ZihzdGRlcnIsICJnZW5wbmc6ICVzOiBpbnZhbGlkIG51bWJlciAlc1xuIiwgbmFtZSwgc3RyKTsKLSAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1waXhlbChwbmdfdWludF8xNnAgcCwgc3RydWN0IGFyZyAqYXJncywgaW50IG5hcmdzLCBkb3VibGUgeCwgZG91YmxlIHkpCi17Ci0gICAvKiBGaWxsIGluIHRoZSBwaXhlbCBieSBjaGVja2luZyBlYWNoIHNoYXBlIChhcmdzW25hcmdzXSkgZm9yIGVmZmVjdHMgb24KLSAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHNhbXBsZToKLSAgICAqLwotICAgZG91YmxlIHI9MCwgZz0wLCBiPTAsIGE9MDsKLQotICAgd2hpbGUgKC0tbmFyZ3MgPj0gMCAmJiBhICE9IDEpCi0gICB7Ci0gICAgICAvKiBOT1RFOiBhbHBoYV9jYWxjIGNhbiByZXR1cm4gYSB2YWx1ZSBvdXRzaWRlIHRoZSByYW5nZSAwLi4xIHdpdGggdGhlCi0gICAgICAgKiBiaWN1YmljIGZpbHRlci4KLSAgICAgICAqLwotICAgICAgY29uc3QgZG91YmxlIGFscGhhID0gYWxwaGFfY2FsYyhhcmdzK25hcmdzLCB4LCB5KSAqICgxLWEpOwotCi0gICAgICByICs9IGFscGhhICogYXJnc1tuYXJnc10uY29sb3ItPnJlZDsKLSAgICAgIGcgKz0gYWxwaGEgKiBhcmdzW25hcmdzXS5jb2xvci0+Z3JlZW47Ci0gICAgICBiICs9IGFscGhhICogYXJnc1tuYXJnc10uY29sb3ItPmJsdWU7Ci0gICAgICBhICs9IGFscGhhOwotICAgfQotCi0gICAvKiAnYScgbWF5IGJlIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiAxOyBpZiBpdCBpcywgbmVnYXRpdmUgY2xhbXAgdGhlCi0gICAgKiBwaXhlbCB0byAwIGlmID4xIGNsYW1wIHIvZy9iOgotICAgICovCi0gICBpZiAoYSA+IDApCi0gICB7Ci0gICAgICBpZiAoYSA+IDEpCi0gICAgICB7Ci0gICAgICAgICBpZiAociA+IDEpIHIgPSAxOwotICAgICAgICAgaWYgKGcgPiAxKSBnID0gMTsKLSAgICAgICAgIGlmIChiID4gMSkgYiA9IDE7Ci0gICAgICAgICBhID0gMTsKLSAgICAgIH0KLQotICAgICAgLyogQW5kIGZpbGwgaW4gdGhlIHBpeGVsOiAqLwotICAgICAgcFswXSA9IChwbmdfdWludF8xNikvKlNBRkUqL3JvdW5kKHIgKiA2NTUzNSk7Ci0gICAgICBwWzFdID0gKHBuZ191aW50XzE2KS8qU0FGRSovcm91bmQoZyAqIDY1NTM1KTsKLSAgICAgIHBbMl0gPSAocG5nX3VpbnRfMTYpLypTQUZFKi9yb3VuZChiICogNjU1MzUpOwotICAgICAgcFszXSA9IChwbmdfdWludF8xNikvKlNBRkUqL3JvdW5kKGEgKiA2NTUzNSk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIHBbM10gPSBwWzJdID0gcFsxXSA9IHBbMF0gPSAwOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQotewotICAgaW50IGNvbnZlcnRfdG9fOGJpdCA9IDA7Ci0KLSAgIC8qIFRoZXJlIGlzIG9uZSBvcHRpb246IC0tOGJpdDogKi8KLSAgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi0tOGJpdCIpID09IDApCi0gICAgICAtLWFyZ2MsICsrYXJndiwgY29udmVydF90b184Yml0ID0gMTsKLQotICAgaWYgKGFyZ2MgPj0gMykKLSAgIHsKLSAgICAgIHBuZ191aW50XzE2cCBidWZmZXI7Ci0gICAgICBpbnQgbnNoYXBlczsKLSAgICAgIHBuZ19pbWFnZSBpbWFnZTsKLSMgICAgIGRlZmluZSBtYXhfc2hhcGVzIDI1NgotICAgICAgc3RydWN0IGFyZyBhcmdfbGlzdFttYXhfc2hhcGVzXTsKLQotICAgICAgLyogVGhlIGxpYnBuZyBTaW1wbGlmaWVkIEFQSSB3cml0ZSBjb2RlIHJlcXVpcmVzIGEgZnVsbHkgaW5pdGlhbGl6ZWQKLSAgICAgICAqIHN0cnVjdHVyZS4KLSAgICAgICAqLwotICAgICAgbWVtc2V0KCZpbWFnZSwgMCwgc2l6ZW9mIGltYWdlKTsKLSAgICAgIGltYWdlLnZlcnNpb24gPSBQTkdfSU1BR0VfVkVSU0lPTjsKLSAgICAgIGltYWdlLm9wYXF1ZSA9IE5VTEw7Ci0gICAgICBpbWFnZS53aWR0aCA9IHJlYWRfd2goIndpZHRoIiwgYXJndlsxXSk7Ci0gICAgICBpbWFnZS5oZWlnaHQgPSByZWFkX3doKCJoZWlnaHQiLCBhcmd2WzJdKTsKLSAgICAgIGltYWdlLmZvcm1hdCA9IFBOR19GT1JNQVRfTElORUFSX1JHQl9BTFBIQTsKLSAgICAgIGltYWdlLmZsYWdzID0gMDsKLSAgICAgIGltYWdlLmNvbG9ybWFwX2VudHJpZXMgPSAwOwotCi0gICAgICAvKiBDaGVjayB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmd1bWVudHMgKi8KLSAgICAgIGZvciAobnNoYXBlcz0wOyAzKzcqKG5zaGFwZXMrMSkgPD0gYXJnYyAmJiBuc2hhcGVzIDwgbWF4X3NoYXBlczsKLSAgICAgICAgICAgKytuc2hhcGVzKQotICAgICAgICAgcGFyc2VfYXJnKGFyZ19saXN0K25zaGFwZXMsIGFyZ3YrMys3Km5zaGFwZXMpOwotCi0gICAgICBpZiAoMys3Km5zaGFwZXMgIT0gYXJnYykKLSAgICAgIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucG5nOiAlczogdG9vIG1hbnkgYXJndW1lbnRzXG4iLCBhcmd2WzMrNypuc2hhcGVzXSk7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLQotICAgICAgLyogQ3JlYXRlIHRoZSBidWZmZXI6ICovCi0gICAgICBidWZmZXIgPSBtYWxsb2MoUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKLQotICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgeTsKLQotICAgICAgICAgLyogV3JpdGUgZWFjaCByb3cuLi4gKi8KLSAgICAgICAgIGZvciAoeT0wOyB5PGltYWdlLmhlaWdodDsgKyt5KQotICAgICAgICAgewotICAgICAgICAgICAgcG5nX3VpbnRfMzIgeDsKLQotICAgICAgICAgICAgLyogRWFjaCBwaXhlbCBpbiBlYWNoIHJvdzogKi8KLSAgICAgICAgICAgIGZvciAoeD0wOyB4PGltYWdlLndpZHRoOyArK3gpCi0gICAgICAgICAgICAgICBwaXhlbChidWZmZXIgKyA0Kih4ICsgeSppbWFnZS53aWR0aCksIGFyZ19saXN0LCBuc2hhcGVzLCB4LCB5KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogV3JpdGUgdGhlIHJlc3VsdCAodG8gc3Rkb3V0KSAqLwotICAgICAgICAgaWYgKHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygmaW1hZ2UsIHN0ZG91dCwgY29udmVydF90b184Yml0LAotICAgICAgICAgICAgIGJ1ZmZlciwgMC8qcm93X3N0cmlkZSovLCBOVUxMLypjb2xvcm1hcCovKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybiAwOyAvKiBzdWNjZXNzICovCi0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucG5nOiB3cml0ZSBzdGRvdXQ6ICVzXG4iLCBpbWFnZS5tZXNzYWdlKTsKLQotICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnBuZzogb3V0IG9mIG1lbW9yeTogJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgLyogV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wbmc6IHVzYWdlOiBnZW5wbmcgWy0tOGJpdF0gd2lkdGggaGVpZ2h0IHtzaGFwZX1cbiIKLSAgICAgICAgICIgR2VuZXJhdGUgYSB0cmFuc3BhcmVudCBQTkcgaW4gUkdCQSAodHJ1ZWNvbG9yK2FscGhhKSBmb3JtYXRcbiIKLSAgICAgICAgICIgY29udGFpbmluZyB0aGUgZ2l2ZW4gc2hhcGUgb3Igc2hhcGVzLiAgU2hhcGVzIGFyZSBkZWZpbmVkOlxuIgotICAgICAgICAgIlxuIgotICAgICAgICAgIiAgc2hhcGUgOjo9IGNvbG9yIHdpZHRoIHNoYXBlIHgxIHkxIHgyIHkyXG4iCi0gICAgICAgICAiICBjb2xvciA6Oj0gYmxhY2t8d2hpdGV8cmVkfGdyZWVufHllbGxvd3xibHVlXG4iCi0gICAgICAgICAiICBjb2xvciA6Oj0gYnJvd258cHVycGxlfHBpbmt8b3JhbmdlfGdyYXl8Y3lhblxuIgotICAgICAgICAgIiAgd2lkdGggOjo9IGZpbGxlZHw8bnVtYmVyPlxuIgotICAgICAgICAgIiAgc2hhcGUgOjo9IGNpcmNsZXxzcXVhcmV8bGluZVxuIgotICAgICAgICAgIiAgeDEseDIgOjo9IDxudW1iZXI+XG4iCi0gICAgICAgICAiICB5MSx5MiA6Oj0gPG51bWJlcj5cbiIKLSAgICAgICAgICJcbiIKLSAgICAgICAgICIgTnVtYmVycyBhcmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBkZXNjcmliaW5nIHBvaW50cyByZWxhdGl2ZSB0b1xuIgotICAgICAgICAgIiB0aGUgdG9wIGxlZnQgb2YgdGhlIG91dHB1dCBQTkcgYXMgcGl4ZWwgY29vcmRpbmF0ZXMuICBUaGUgJ3dpZHRoJ1xuIgotICAgICAgICAgIiBwYXJhbWV0ZXIgaXMgZWl0aGVyIHRoZSB3aWR0aCBvZiB0aGUgbGluZSAoaW4gb3V0cHV0IHBpeGVscykgdXNlZFxuIgotICAgICAgICAgIiB0byBkcmF3IHRoZSBzaGFwZSBvciAnZmlsbGVkJyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzaGFwZSBzaG91bGRcbiIKLSAgICAgICAgICIgYmUgZmlsbGVkIHdpdGggdGhlIGNvbG9yLlxuIgotICAgICAgICAgIlxuIgotICAgICAgICAgIiBDb2xvcnMgYXJlIGludGVycHJldGVkIGxvb3NlbHkgdG8gZ2l2ZSBhY2Nlc3MgdG8gdGhlIGVpZ2h0IGZ1bGxcbiIKLSAgICAgICAgICIgaW50ZW5zaXR5IFJHQiB2YWx1ZXM6XG4iCi0gICAgICAgICAiXG4iCi0gICAgICAgICAiICBibGFjaywgcmVkLCBncmVlbiwgYmx1ZSwgeWVsbG93LCBjeWFuLCBwdXJwbGUsIHdoaXRlLFxuIgotICAgICAgICAgIlxuIgotICAgICAgICAgIiBDeWFuIGlzIGZ1bGwgaW50ZW5zaXR5IGJsdWUrZ3JlZW47IFJHQigwLDEsMSksIHBsdXMgdGhlIGZvbGxvd2luZ1xuIgotICAgICAgICAgIiBsb3dlciBpbnRlbnNpdHkgdmFsdWVzOlxuIgotICAgICAgICAgIlxuIgotICAgICAgICAgIiAgYnJvd246ICByZWQrb3JhbmdlOiAgUkdCKDAuNSwgMC4xMjUsIDApIChkYXJrIHJlZCtvcmFuZ2UpXG4iCi0gICAgICAgICAiICBwaW5rOiAgIHJlZCt3aGl0ZTogICBSR0IoMS4wLCAwLjUsICAgMC41KVxuIgotICAgICAgICAgIiAgb3JhbmdlOiByZWQreWVsbG93OiAgUkdCKDEuMCwgMC41LCAgIDApXG4iCi0gICAgICAgICAiICBncmF5OiAgIGJsYWNrK3doaXRlOiBSR0IoMC41LCAwLjUsICAgMC41KVxuIgotICAgICAgICAgIlxuIgotICAgICAgICAgIiBUaGUgUkdCIHZhbHVlcyBhcmUgc2VsZWN0ZWQgdG8gbWFrZSBkZXRlY3Rpb24gb2YgYWxpYXNpbmcgZXJyb3JzXG4iCi0gICAgICAgICAiIGVhc3kuIFRoZSBuYW1lcyBhcmUgc2VsZWN0ZWQgdG8gbWFrZSB0aGUgZGVzY3JpcHRpb24gb2YgZXJyb3JzXG4iCi0gICAgICAgICAiIGVhc3kuXG4iCi0gICAgICAgICAiXG4iCi0gICAgICAgICAiIFRoZSBQTkcgaXMgd3JpdHRlbiB0byBzdGRvdXQsIGlmIC0tOGJpdCBpcyBnaXZlbiBhIDMyYnBwIFJHQkEgc1JHQlxuIgotICAgICAgICAgIiBmaWxlIGlzIHByb2R1Y2VkLCBvdGhlcndpc2UgYSA2NGJwcCBSR0JBIGxpbmVhciBlbmNvZGVkIGZpbGUgaXNcbiIKLSAgICAgICAgICIgd3JpdHRlbi5cbiIpOwotICAgfQotCi0gICByZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBTSU1QTElGSUVEX1dSSVRFICYmIFNURElPICovCmRpZmYgLS1naXQgYS9jb250cmliL3Rvb2xzL2ludGdhbW1hLnNoIGIvY29udHJpYi90b29scy9pbnRnYW1tYS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFjNWQ2ZC4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rvb2xzL2ludGdhbW1hLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBpbnRnYW1tYS5zaAotIwotIyBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10KLSMKLSMgQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTMuCi0jIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKLSMgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotIyBVbml0ZWQgU3RhdGVzLgotIwotIyBTaGVsbCBzY3JpcHQgdG8gZ2VuZXJhdGUgcG5nLmMgOC1iaXQgYW5kIDE2LWJpdCBsb2cgdGFibGVzIChzZWUgdGhlIGNvZGUgaW4KLSMgcG5nLmMgZm9yIGRldGFpbHMpLgotIwotIyBUaGlzIHNjcmlwdCB1c2VzIHRoZSAiYmMiIGFyYml0cmFyeSBwcmVjaXNpb24gY2FsY3VsYXRvciB0byBjYWxjdWxhdGUgMzItYml0Ci0jIGZpeGVkIHBvaW50IHZhbHVlcyBvZiBsb2dhcml0aG1zIGFwcHJvcHJpYXRlIHRvIGZpbmRpbmcgdGhlIGxvZyBvZiBhbiA4LWJpdAotIyAoMC4uMjU1KSB2YWx1ZSBhbmQgYSBzaW1pbGFyIHRhYmxlIGZvciB0aGUgZXhwb25lbnQgY2FsY3VsYXRpb24uCi0jCi0jICJiYyIgbXVzdCBiZSBvbiB0aGUgcGF0aCB3aGVuIHRoZSBzY3JpcHQgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbWF0aCBsaWJyYXJ5Ci0jICgtbG0pIG11c3QgYmUgYXZhaWxhYmxlCi0jCi0jIGZ1bmN0aW9uIHRvIHByaW50IG91dCBhIGxpc3Qgb2YgbnVtYmVycyBhcyBpbnRlZ2VyczsgdGhlIGZ1bmN0aW9uIHRydW5jYXRlcwotIyB0aGUgaW50ZWdlcnMgd2hpY2ggbXVzdCBiZSBvbmUtcGVyLWxpbmUKLWZ1bmN0aW9uIHByaW50KCl7Ci0gICBhd2sgJ0JFR0lOewotICAgICAgc3RyID0gIiIKLSAgIH0KLSAgIHsKLSAgICAgIHN1YigiXFwuWzAtOV0qJCIsICIiKQotICAgICAgaWYgKCQwID09ICIiKQotICAgICAgICAgJDAgPSAiMCIKLQotICAgICAgaWYgKHN0ciA9PSAiIikKLSAgICAgICAgIHQgPSAiICAgIiAkMCAiVSIKLSAgICAgIGVsc2UKLSAgICAgICAgIHQgPSBzdHIgIiwgIiAkMCAiVSIKLQotICAgICAgaWYgKGxlbmd0aCh0KSA+PSA4MCkgewotICAgICAgICAgcHJpbnQgc3RyICIsIgotICAgICAgICAgc3RyID0gIiAgICIgJDAgIlUiCi0gICAgICB9IGVsc2UKLSAgICAgICAgIHN0ciA9IHQKLSAgIH0KLSAgIEVORHsKLSAgICAgIHByaW50IHN0cgotICAgfScKLX0KLSMKLSMgVGhlIGxvZ2FyaXRobSB0YWJsZS4KLWNhdCA8PEVORAotLyogOC1iaXQgbG9nIHRhYmxlOiBwbmdfOGJpdF9sMlsxMjhdCi0gKiBUaGlzIGlzIGEgdGFibGUgb2YgLWxvZyh2YWx1ZS8yNTUpL2xvZygyKSBmb3IgJ3ZhbHVlJyBpbiB0aGUgcmFuZ2UgMTI4IHRvCi0gKiAyNTUsIHNvIGl0J3MgdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgYSBub3JtYWxpemVkIDgtYml0IGZsb2F0aW5nIHBvaW50Ci0gKiBtYW50aXNzYS4gIFRoZSBudW1iZXJzIGFyZSAzMi1iaXQgZnJhY3Rpb25zLgotICovCi1zdGF0aWMgY29uc3QgcG5nX3VpbnRfMzIKLXBuZ184Yml0X2wyWzEyOF0gPQotewotRU5ECi0jCi1iYyAtbHF3cyA8PEVORCB8IHByaW50Ci1mPTY1NTM2KjY1NTM2L2woMikKLWZvciAoaT0xMjg7aTwyNTY7KytpKSB7IC41IC0gbChpLzI1NSkqZjsgfQotRU5ECi1lY2hvICd9OycKLWVjaG8KLSMKLSMgVGhlIGV4cG9uZW50IHRhYmxlLgotY2F0IDw8RU5ECi0vKiBUaGUgJ2V4cCgpJyBjYXNlIG11c3QgaW52ZXJ0IHRoZSBhYm92ZSwgdGFraW5nIGEgMjAtYml0IGZpeGVkIHBvaW50Ci0gKiBsb2dhcml0aG1pYyB2YWx1ZSBhbmQgcmV0dXJuaW5nIGEgMTYgb3IgOC1iaXQgbnVtYmVyIGFzIGFwcHJvcHJpYXRlLiAgSW4KLSAqIGVhY2ggY2FzZSBvbmx5IHRoZSBsb3cgMTYgYml0cyBhcmUgcmVsZXZhbnQgLSB0aGUgZnJhY3Rpb24gLSBzaW5jZSB0aGUKLSAqIGludGVnZXIgYml0cyAodGhlIHRvcCA0KSBzaW1wbHkgZGV0ZXJtaW5lIGEgc2hpZnQuCi0gKgotICogVGhlIHdvcnN0IGNhc2UgaXMgdGhlIDE2LWJpdCBkaXN0aW5jdGlvbiBiZXR3ZWVuIDY1NTM1IGFuZCA2NTUzNDsgdGhpcwotICogcmVxdWlyZXMgcGVyaGFwcyBzcHVyaW91cyBhY2N1cmFjeSBpbiB0aGUgZGVjb2Rpbmcgb2YgdGhlIGxvZ2FyaXRobSB0bwotICogZGlzdGluZ3Vpc2ggbG9nMig2NTUzNS82NTUzNC41KSAtIDEwXi01IG9yIDE3IGJpdHMuICBUaGVyZSBpcyBsaXR0bGUgY2hhbmNlCi0gKiBvZiBnZXR0aW5nIHRoaXMgYWNjdXJhY3kgaW4gcHJhY3RpY2UuCi0gKgotICogVG8gZGVhbCB3aXRoIHRoaXMgdGhlIGZvbGxvd2luZyBleHAoKSBmdW5jdGlvbiB3b3JrcyBvdXQgdGhlIGV4cG9uZW50IG9mIHRoZQotICogZnJhdGlvbmFsIHBhcnQgb2YgdGhlIGxvZ2FyaXRobSBieSB1c2luZyBhbiBhY2N1cmF0ZSAzMi1iaXQgdmFsdWUgZnJvbSB0aGUKLSAqIHRvcCBmb3VyIGZyYWN0aW9uYWwgYml0cyB0aGVuIG11bHRpcGx5aW5nIGluIHRoZSByZW1haW5pbmcgYml0cy4KLSAqLwotc3RhdGljIGNvbnN0IHBuZ191aW50XzMyCi1wbmdfMzJiaXRfZXhwWzE2XSA9Ci17Ci1FTkQKLSMKLWJjIC1scXdzIDw8RU5EIHwgcHJpbnQKLWY9bCgyKS8xNgotZm9yIChpPTA7aTwxNjsrK2kpIHsKLSAgIHggPSAuNSArIGUoLWkqZikqMl4zMjsKLSAgIGlmICh4ID49IDJeMzIpIHggPSAyXjMyLTE7Ci0gICB4OwotfQotRU5ECi1lY2hvICd9OycKLWVjaG8KLSMKLSMgQW5kIHRoZSB0YWJsZSBvZiBhZGp1c3RtZW50IHZhbHVlcy4KLWNhdCA8PEVORAotLyogQWRqdXN0bWVudCB0YWJsZTsgcHJvdmlkZWQgdG8gZXhwbGFpbiB0aGUgbnVtYmVycyBpbiB0aGUgY29kZSBiZWxvdy4gKi8KLSNpZiAwCi1FTkQKLWJjIC1scXdzIDw8RU5EIHwgYXdrICd7IHByaW50ZiAiJTVkICVzXG4iLCAxMi1OUiwgJDAgfScKLWZvciAoaT0xMTtpPj0wOy0taSl7Ci0gICAoMSAtIGUoLSgyXmkpLzY1NTM2KmwoMikpKSAqIDJeKDMyLWkpCi19Ci1FTkQKLWVjaG8gJyNlbmRpZicKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdG9vbHMvbWFrZXNSR0IuYyBiL2NvbnRyaWIvdG9vbHMvbWFrZXNSR0IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2YzlmMS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rvb2xzL21ha2VzUkdCLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyogbWFrZXNSR0IuYyAtLSBidWlsZCBzUkdCLXRvLWxpbmVhciBhbmQgbGluZWFyLXRvLXNSR0IgY29udmVyc2lvbiB0YWJsZXMKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4wIFtGZWJydWFyeSAxNCwgMjAxM10KLSAqCi0gKiBDT1BZUklHSFQ6IFdyaXR0ZW4gYnkgSm9obiBDdW5uaW5naGFtIEJvd2xlciwgMjAxMy4KLSAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKLSAqIHJlbGF0ZWQgb3IgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgd29yay4gIFRoaXMgd29yayBpcyBwdWJsaXNoZWQgZnJvbToKLSAqIFVuaXRlZCBTdGF0ZXMuCi0gKgotICogTWFrZSBhIHRhYmxlIHRvIGNvbnZlcnQgOC1iaXQgc1JHQiBlbmNvZGluZyB2YWx1ZXMgaW50byB0aGUgY2xvc2VzdCAxNi1iaXQKLSAqIGxpbmVhciB2YWx1ZS4KLSAqCi0gKiBNYWtlIHR3byB0YWJsZXMgdG8gdGFrZSBhIGxpbmVhciB2YWx1ZSBzY2FsZWQgdG8gMjU1KjY1NTM1IGFuZCByZXR1cm4gYW4KLSAqIGFwcHJveGltYXRpb24gdG8gdGhlIDgtYml0IHNSR0IgZW5jb2RlZCB2YWx1ZS4gIENhbGN1bGF0ZSB0aGUgZXJyb3IgaW4gdGhlc2UKLSAqIHRhYmxlcyBhbmQgZGlzcGxheSBpdC4KLSAqLwotI2RlZmluZSBfQzk5X1NPVVJDRSAxCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qIHBuZ3ByaXYuaCBpbmNsdWRlcyB0aGUgZGVmaW5pdGlvbiBvZiAnUE5HX3NSR0JfRlJPTV9MSU5FQVInIHdoaWNoIGlzIHJlcXVpcmVkCi0gKiB0byB2ZXJpZnkgdGhlIGFjdHVhbCBjb2RlLgotICovCi0jaW5jbHVkZSAiLi4vLi4vcG5ncHJpdi5oIgotCi0jaW5jbHVkZSAic1JHQi5oIgotCi0vKiBUaGUgdGFibGVzIGFyZSBkZWNsYXJlZCAnY29uc3QnIGluIHBuZ3ByaXYuaCwgc28gdGhpcyByZWRlZmluZXMgdGhlIHRhYmxlcyB0bwotICogYmUgdXNlZC4KLSAqLwotI2RlZmluZSBwbmdfc1JHQl90YWJsZSBzUkdCX3RhYmxlCi0jZGVmaW5lIHBuZ19zUkdCX2Jhc2Ugc1JHQl9iYXNlCi0jZGVmaW5lIHBuZ19zUkdCX2RlbHRhIHNSR0JfZGVsdGEKLQotc3RhdGljIHBuZ191aW50XzE2IHBuZ19zUkdCX3RhYmxlWzI1Nl07Ci1zdGF0aWMgcG5nX3VpbnRfMTYgcG5nX3NSR0JfYmFzZVs1MTJdOwotc3RhdGljIHBuZ19ieXRlIHBuZ19zUkdCX2RlbHRhWzUxMl07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X2lucHV0ID0gMjU1KjY1NTM1OwotCi1kb3VibGUKLWZzUkdCKGRvdWJsZSBsKQotewotICAgcmV0dXJuIHNSR0JfZnJvbV9saW5lYXIobC9tYXhfaW5wdXQpOwotfQotCi1kb3VibGUKLXNSR0IodW5zaWduZWQgaW50IGkpCi17Ci0gICByZXR1cm4gZnNSR0IoaSk7Ci19Ci0KLWRvdWJsZQotZmludnNSR0IodW5zaWduZWQgaW50IGkpCi17Ci0gICByZXR1cm4gNjU1MzUgKiBsaW5lYXJfZnJvbV9zUkdCKGkvMjU1Lik7Ci19Ci0KLXBuZ191aW50XzE2Ci1pbnZzUkdCKHVuc2lnbmVkIGludCBpKQotewotICAgdW5zaWduZWQgaW50IHggPSBuZWFyYnlpbnQoZmludnNSR0IoaSkpOwotCi0gICBpZiAoeCA+IDY1NTM1KQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZzUkdCKCV1KSBvdmVyZmxvd3MgdG8gJXVcbiIsIGksIHgpOwotICAgICAgZXhpdCgxKTsKLSAgIH0KLQotICAgcmV0dXJuIChwbmdfdWludF8xNil4OwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgdW5zaWduZWQgaW50IGksIGkxNiwgaWJhc2U7Ci0gICBkb3VibGUgbWluX2Vycm9yID0gMDsKLSAgIGRvdWJsZSBtYXhfZXJyb3IgPSAwOwotICAgZG91YmxlIG1pbl9lcnJvcjE2ID0gMDsKLSAgIGRvdWJsZSBtYXhfZXJyb3IxNiA9IDA7Ci0gICBkb3VibGUgYWRqdXN0OwotICAgZG91YmxlIGFkanVzdF9sbyA9IDAuNCwgYWRqdXN0X2hpID0gMC42LCBhZGp1c3RfbWlkID0gMC41OwotICAgdW5zaWduZWQgaW50IGVjX2xvID0gMCwgZWNfaGkgPSAwLCBlY19taWQgPSAwOwotICAgdW5zaWduZWQgaW50IGVycm9yX2NvdW50ID0gMDsKLSAgIHVuc2lnbmVkIGludCBlcnJvcl9jb3VudDE2ID0gMDsKLSAgIGludCB0ZXN0X29ubHkgPSAwOwotCi0gICBpZiAoYXJnYyA+IDEpCi0gICAgICB0ZXN0X29ubHkgPSBzdHJjbXAoIi0tdGVzdCIsIGFyZ3ZbMV0pID09IDA7Ci0KLSAgIC8qIEluaXRpYWxpemUgdGhlIGVuY29kaW5nIHRhYmxlIGZpcnN0LiAqLwotICAgZm9yIChpPTA7IGk8MjU2OyArK2kpCi0gICB7Ci0gICAgICBwbmdfc1JHQl90YWJsZVtpXSA9IGludnNSR0IoaSk7Ci0gICB9Ci0KLSAgIC8qIE5vdyB3b3JrIG91dCB0aGUgZGVjb2RpbmcgdGFibGVzICh0aGlzIGlzIHdoZXJlIHRoZSBlcnJvciBjb21lcyBpbiBiZWNhdXNlCi0gICAgKiB0aGVyZSBhcmUgNTEyIHNldCBwb2ludHMgYW5kIDUxMiBzdHJhaWdodCBsaW5lcyBiZXR3ZWVuIHRoZW0uKQotICAgICovCi0gICBmb3IgKDs7KQotICAgewotICAgICAgaWYgKGVjX2xvID09IDApCi0gICAgICAgICBhZGp1c3QgPSBhZGp1c3RfbG87Ci0KLSAgICAgIGVsc2UgaWYgKGVjX2hpID09IDApCi0gICAgICAgICBhZGp1c3QgPSBhZGp1c3RfaGk7Ci0KLSAgICAgIGVsc2UgaWYgKGVjX21pZCA9PSAwKQotICAgICAgICAgYWRqdXN0ID0gYWRqdXN0X21pZDsKLQotICAgICAgZWxzZSBpZiAoZWNfbWlkIDwgZWNfaGkpCi0gICAgICAgICBhZGp1c3QgPSAoYWRqdXN0X21pZCArIGFkanVzdF9oaSkvMjsKLQotICAgICAgZWxzZSBpZiAoZWNfbWlkIDwgZWNfbG8pCi0gICAgICAgICBhZGp1c3QgPSAoYWRqdXN0X21pZCArIGFkanVzdF9sbykvMjsKLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgcmVhY2hlZDogJXUgLi4gJXUgLi4gJXVcbiIsIGVjX2xvLCBlY19taWQsIGVjX2hpKTsKLSAgICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIENhbGN1bGF0ZSB0aGUgdGFibGUgdXNpbmcgdGhlIGN1cnJlbnQgJ2FkanVzdCcgKi8KLSAgICAgIGZvciAoaT0wOyBpPD01MTE7ICsraSkKLSAgICAgIHsKLSAgICAgICAgIGRvdWJsZSBsbyA9IDI1NSAqIHNSR0IoaSA8PCAxNSk7Ci0gICAgICAgICBkb3VibGUgaGkgPSAyNTUgKiBzUkdCKChpKzEpIDw8IDE1KTsKLSAgICAgICAgIHVuc2lnbmVkIGludCBjYWxjOwotCi0gICAgICAgICBjYWxjID0gbmVhcmJ5aW50KChsbythZGp1c3QpICogMjU2KTsKLSAgICAgICAgIGlmIChjYWxjID4gNjU1MzUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRhYmxlWyVkXVswXTogb3ZlcmZsb3cgJTA4eCAoJWQpXG4iLCBpLCBjYWxjLAotICAgICAgICAgICAgICAgY2FsYyk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgfQotICAgICAgICAgcG5nX3NSR0JfYmFzZVtpXSA9IGNhbGM7Ci0KLSAgICAgICAgIGNhbGMgPSBuZWFyYnlpbnQoKGhpLWxvKSAqIDMyKTsKLSAgICAgICAgIGlmIChjYWxjID4gMjU1KQotICAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0YWJsZVslZF1bMV06IG92ZXJmbG93ICUwOHggKCVkKVxuIiwgaSwgY2FsYywKLSAgICAgICAgICAgICAgIGNhbGMpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHBuZ19zUkdCX2RlbHRhW2ldID0gY2FsYzsKLSAgICAgIH0KLQotICAgICAgLyogQ2hlY2sgdGhlIDE2LWJpdCBsaW5lYXIgdmFsdWVzIGFsb25lOiAqLwotICAgICAgZXJyb3JfY291bnQxNiA9IDA7Ci0gICAgICBmb3IgKGkxNj0wOyBpMTYgPD0gNjU1MzU7ICsraTE2KQotICAgICAgewotICAgICAgICAgdW5zaWduZWQgaW50IGkgPSAyNTUqaTE2OwotICAgICAgICAgdW5zaWduZWQgaW50IGlleGFjdCA9IG5lYXJieWludCgyNTUqc1JHQihpKSk7Ci0gICAgICAgICB1bnNpZ25lZCBpbnQgaWNhbGMgPSBQTkdfc1JHQl9GUk9NX0xJTkVBUihpKTsKLQotICAgICAgICAgaWYgKGljYWxjICE9IGlleGFjdCkKLSAgICAgICAgICAgICsrZXJyb3JfY291bnQxNjsKLSAgICAgIH0KLQotICAgICAgLyogTm93IHRyeSBjaGFuZ2luZyB0aGUgYWRqdXN0bWVudC4gKi8KLSAgICAgIGlmIChlY19sbyA9PSAwKQotICAgICAgICAgZWNfbG8gPSBlcnJvcl9jb3VudDE2OwotCi0gICAgICBlbHNlIGlmIChlY19oaSA9PSAwKQotICAgICAgICAgZWNfaGkgPSBlcnJvcl9jb3VudDE2OwotCi0gICAgICBlbHNlIGlmIChlY19taWQgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGVjX21pZCA9IGVycm9yX2NvdW50MTY7Ci0gICAgICAgICBwcmludGYoIi8qIGluaXRpYWwgZXJyb3IgY291bnRzOiAldSAuLiAldSAuLiAldSAqL1xuIiwgZWNfbG8sIGVjX21pZCwKLSAgICAgICAgICAgIGVjX2hpKTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQxNiA8IGVjX21pZCkKLSAgICAgIHsKLSAgICAgICAgIHByaW50ZigiLyogYWRqdXN0IChtaWQgKTogJWY6ICV1IC0+ICV1ICovXG4iLCBhZGp1c3QsIGVjX21pZCwKLSAgICAgICAgICAgIGVycm9yX2NvdW50MTYpOwotICAgICAgICAgZWNfbWlkID0gZXJyb3JfY291bnQxNjsKLSAgICAgICAgIGFkanVzdF9taWQgPSBhZGp1c3Q7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGFkanVzdCA8IGFkanVzdF9taWQgJiYgZXJyb3JfY291bnQxNiA8IGVjX2xvKQotICAgICAgewotICAgICAgICAgcHJpbnRmKCIvKiBhZGp1c3QgKGxvdyApOiAlZjogJXUgLT4gJXUgKi9cbiIsIGFkanVzdCwgZWNfbG8sCi0gICAgICAgICAgICBlcnJvcl9jb3VudDE2KTsKLSAgICAgICAgIGVjX2xvID0gZXJyb3JfY291bnQxNjsKLSAgICAgICAgIGFkanVzdF9sbyA9IGFkanVzdDsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoYWRqdXN0ID4gYWRqdXN0X21pZCAmJiBlcnJvcl9jb3VudDE2IDwgZWNfaGkpCi0gICAgICB7Ci0gICAgICAgICBwcmludGYoIi8qIGFkanVzdCAoaGlnaCk6ICVmOiAldSAtPiAldSAqL1xuIiwgYWRqdXN0LCBlY19oaSwKLSAgICAgICAgICAgIGVycm9yX2NvdW50MTYpOwotICAgICAgICAgZWNfaGkgPSBlcnJvcl9jb3VudDE2OwotICAgICAgICAgYWRqdXN0X2hpID0gYWRqdXN0OwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBhZGp1c3QgPSBhZGp1c3RfbWlkOwotICAgICAgICAgcHJpbnRmKCIvKiBhZGp1c3Q6ICVmOiAldSAqL1xuIiwgYWRqdXN0LCBlY19taWQpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIEZvciBlYWNoIGVudHJ5IGluIHRoZSB0YWJsZSB0cnkgdG8gYWRqdXN0IGl0IHRvIG1pbmltaXplIHRoZSBlcnJvciBjb3VudAotICAgICogaW4gdGhhdCBlbnRyeS4gIEVhY2ggZW50cnkgY29ycmVzcG9uZHMgdG8gMTI4IGlucHV0IHZhbHVlcy4KLSAgICAqLwotICAgZm9yIChpYmFzZT0wOyBpYmFzZTw2NTUzNjsgaWJhc2UrPTEyOCkKLSAgIHsKLSAgICAgIHBuZ191aW50XzE2IGJhc2UgPSBwbmdfc1JHQl9iYXNlW2liYXNlID4+IDddLCB0cnliYXNlID0gYmFzZSwgb2I9YmFzZTsKLSAgICAgIHBuZ19ieXRlIGRlbHRhID0gcG5nX3NSR0JfZGVsdGFbaWJhc2UgPj4gN10sIHRyeWRlbHRhID0gZGVsdGEsIG9kPWRlbHRhOwotICAgICAgdW5zaWduZWQgaW50IGVjYmFzZSA9IDAsIGVjbzsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgIHBuZ19zUkdCX2Jhc2VbaWJhc2UgPj4gN10gPSB0cnliYXNlOwotICAgICAgICAgcG5nX3NSR0JfZGVsdGFbaWJhc2UgPj4gN10gPSB0cnlkZWx0YTsKLQotICAgICAgICAgLyogQ2hlY2sgdGhlIDE2LWJpdCBsaW5lYXIgdmFsdWVzIGFsb25lOiAqLwotICAgICAgICAgZXJyb3JfY291bnQxNiA9IDA7Ci0gICAgICAgICBmb3IgKGkxNj1pYmFzZTsgaTE2IDwgaWJhc2UrMTI4OyArK2kxNikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBpID0gMjU1KmkxNjsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZXhhY3QgPSBuZWFyYnlpbnQoMjU1KnNSR0IoaSkpOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IGljYWxjID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoaSk7Ci0KLSAgICAgICAgICAgIGlmIChpY2FsYyAhPSBpZXhhY3QpCi0gICAgICAgICAgICAgICArK2Vycm9yX2NvdW50MTY7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmIChlcnJvcl9jb3VudDE2ID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgaWYgKGVjYmFzZSA9PSAwKQotICAgICAgICAgewotICAgICAgICAgICAgZWNvID0gZWNiYXNlID0gZXJyb3JfY291bnQxNjsKLSAgICAgICAgICAgICsrdHJ5YmFzZTsgLyogRmlyc3QgdGVzdCAqLwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlIGlmIChlcnJvcl9jb3VudDE2IDwgZWNiYXNlKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHRyeWJhc2UgPiBiYXNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgYmFzZSA9IHRyeWJhc2U7Ci0gICAgICAgICAgICAgICArK3RyeWJhc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0cnliYXNlIDwgYmFzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGJhc2UgPSB0cnliYXNlOwotICAgICAgICAgICAgICAgLS10cnliYXNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHJ5ZGVsdGEgPiBkZWx0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGRlbHRhID0gdHJ5ZGVsdGE7Ci0gICAgICAgICAgICAgICArK3RyeWRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHJ5ZGVsdGEgPCBkZWx0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGRlbHRhID0gdHJ5ZGVsdGE7Ci0gICAgICAgICAgICAgICAtLXRyeWRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlc1JHQjogaW1wb3NzaWJsZVxuIik7Ci0gICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWNiYXNlID0gZXJyb3JfY291bnQxNjsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKHRyeWJhc2UgPiBiYXNlKQotICAgICAgICAgICAgICAgdHJ5YmFzZSA9IGJhc2UtMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRyeWJhc2UgPCBiYXNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgdHJ5YmFzZSA9IGJhc2U7Ci0gICAgICAgICAgICAgICArK3RyeWRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHJ5ZGVsdGEgPiBkZWx0YSkKLSAgICAgICAgICAgICAgIHRyeWRlbHRhID0gZGVsdGEtMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRyeWRlbHRhIDwgZGVsdGEpCi0gICAgICAgICAgICAgICBicmVhazsgLyogZW5kIG9mIHRlc3RzICovCi0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHBuZ19zUkdCX2Jhc2VbaWJhc2UgPj4gN10gPSBiYXNlOwotICAgICAgcG5nX3NSR0JfZGVsdGFbaWJhc2UgPj4gN10gPSBkZWx0YTsKLSAgICAgIGlmIChiYXNlICE9IG9iIHx8IGRlbHRhICE9IG9kKQotICAgICAgewotICAgICAgICAgcHJpbnRmKCIvKiB0YWJsZVsldV09eyV1LCV1fSAtPiB7JXUsJXV9ICV1IC0+ICV1IGVycm9ycyAqL1xuIiwKLSAgICAgICAgICAgIGliYXNlPj43LCBvYiwgb2QsIGJhc2UsIGRlbHRhLCBlY28sIGVjYmFzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgwKQotICAgICAgICAgcHJpbnRmKCIvKiB0YWJsZVsldV09eyV1LCV1fSAldSBlcnJvcnMgKi9cbiIsIGliYXNlPj43LCBvYiwgb2QsCi0gICAgICAgICAgICBlY2Jhc2UpOwotICAgfQotCi0gICAvKiBPbmx5IGRvIHRoZSBmdWxsIChzbG93KSB0ZXN0IGF0IHRoZSBlbmQ6ICovCi0gICBtaW5fZXJyb3IgPSAtLjQ5OTk7Ci0gICBtYXhfZXJyb3IgPSAuNDk5OTsKLSAgIGVycm9yX2NvdW50ID0gMDsKLQotICAgZm9yIChpPTA7IGkgPD0gbWF4X2lucHV0OyArK2kpCi0gICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaWV4YWN0ID0gbmVhcmJ5aW50KDI1NSpzUkdCKGkpKTsKLSAgICAgIHVuc2lnbmVkIGludCBpY2FsYyA9IFBOR19zUkdCX0ZST01fTElORUFSKGkpOwotCi0gICAgICBpZiAoaWNhbGMgIT0gaWV4YWN0KQotICAgICAgewotICAgICAgICAgZG91YmxlIGVyciA9IDI1NSpzUkdCKGkpIC0gaWNhbGM7Ci0KLSAgICAgICAgIGlmIChlcnIgPiAobWF4X2Vycm9yKy4wMDEpIHx8IGVyciA8IChtaW5fZXJyb3ItLjAwMSkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoCi0gICAgICAgICAgICAgICAiLyogMHglMDh4OiBleGFjdDogJTNkLCBnb3Q6ICUzZCBbdGFibGVzOiAlMDh4LCAlMDh4XSAoJWYpICovXG4iLAotICAgICAgICAgICAgICAgaSwgaWV4YWN0LCBpY2FsYywgcG5nX3NSR0JfYmFzZVtpPj4xNV0sCi0gICAgICAgICAgICAgICBwbmdfc1JHQl9kZWx0YVtpPj4xNV0sIGVycik7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgICsrZXJyb3JfY291bnQ7Ci0gICAgICAgICBpZiAoZXJyID4gbWF4X2Vycm9yKQotICAgICAgICAgICAgbWF4X2Vycm9yID0gZXJyOwotICAgICAgICAgZWxzZSBpZiAoZXJyIDwgbWluX2Vycm9yKQotICAgICAgICAgICAgbWluX2Vycm9yID0gZXJyOwotICAgICAgfQotICAgfQotCi0gICAvKiBSZS1jaGVjayB0aGUgMTYtYml0IGNhc2VzIHRvbywgaW5jbHVkaW5nIHRoZSB3YXJuaW5nIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAgKiBiaWdnZXIgdGhhbiAxLgotICAgICovCi0gICBlcnJvcl9jb3VudDE2ID0gMDsKLSAgIG1heF9lcnJvcjE2ID0gMDsKLSAgIG1pbl9lcnJvcjE2ID0gMDsKLSAgIGZvciAoaTE2PTA7IGkxNiA8PSA2NTUzNTsgKytpMTYpCi0gICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaSA9IDI1NSppMTY7Ci0gICAgICB1bnNpZ25lZCBpbnQgaWV4YWN0ID0gbmVhcmJ5aW50KDI1NSpzUkdCKGkpKTsKLSAgICAgIHVuc2lnbmVkIGludCBpY2FsYyA9IFBOR19zUkdCX0ZST01fTElORUFSKGkpOwotCi0gICAgICBpZiAoaWNhbGMgIT0gaWV4YWN0KQotICAgICAgewotICAgICAgICAgZG91YmxlIGVyciA9IDI1NSpzUkdCKGkpIC0gaWNhbGM7Ci0KLSAgICAgICAgICsrZXJyb3JfY291bnQxNjsKLSAgICAgICAgIGlmIChlcnIgPiBtYXhfZXJyb3IxNikKLSAgICAgICAgICAgIG1heF9lcnJvcjE2ID0gZXJyOwotICAgICAgICAgZWxzZSBpZiAoZXJyIDwgbWluX2Vycm9yMTYpCi0gICAgICAgICAgICBtaW5fZXJyb3IxNiA9IGVycjsKLQotICAgICAgICAgaWYgKGFicyhpY2FsYyAtIGlleGFjdCkgPiAxKQotICAgICAgICAgICAgcHJpbnRmKAotICAgICAgICAgICAgICAgIi8qIDB4JTA0eDogZXhhY3Q6ICUzZCwgZ290OiAlM2QgW3RhYmxlczogJTA4eCwgJTA4eF0gKCVmKSAqL1xuIiwKLSAgICAgICAgICAgICAgIGkxNiwgaWV4YWN0LCBpY2FsYywgcG5nX3NSR0JfYmFzZVtpPj4xNV0sCi0gICAgICAgICAgICAgICBwbmdfc1JHQl9kZWx0YVtpPj4xNV0sIGVycik7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIENoZWNrIHRoZSByb3VuZCB0cmlwIGZvciBlYWNoIDgtYml0IHNSR0IgdmFsdWUuICovCi0gICBmb3IgKGkxNj0wOyBpMTYgPD0gMjU1OyArK2kxNikKLSAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpID0gMjU1ICogcG5nX3NSR0JfdGFibGVbaTE2XTsKLSAgICAgIHVuc2lnbmVkIGludCBpZXhhY3QgPSBuZWFyYnlpbnQoMjU1KnNSR0IoaSkpOwotICAgICAgdW5zaWduZWQgaW50IGljYWxjID0gUE5HX3NSR0JfRlJPTV9MSU5FQVIoaSk7Ci0KLSAgICAgIGlmIChpMTYgIT0gaWV4YWN0KQotICAgICAgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICI4LWJpdCByb3VuZGluZyBlcnJvcjogJWQgLT4gJWRcbiIsIGkxNiwgaWV4YWN0KTsKLSAgICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpY2FsYyAhPSBpMTYpCi0gICAgICB7Ci0gICAgICAgICBkb3VibGUgZmludiA9IGZpbnZzUkdCKGkxNik7Ci0KLSAgICAgICAgIHByaW50ZigiLyogOC1iaXQgcm91bmR0cmlwIGVycm9yOiAlZCAtPiAlZiAtPiAlZCglZikgKi9cbiIsCi0gICAgICAgICAgICBpMTYsIGZpbnYsIGljYWxjLCBmc1JHQigyNTUqZmludikpOwotICAgICAgfQotICAgfQotCi0KLSAgIHByaW50ZigiLyogZXJyb3I6ICVnIC0gJWcsICV1ICglZyUlKSBvZiByZWFkaW5ncyBpbmV4YWN0ICovXG4iLAotICAgICAgbWluX2Vycm9yLCBtYXhfZXJyb3IsIGVycm9yX2NvdW50LCAoMTAwLiplcnJvcl9jb3VudCkvbWF4X2lucHV0KTsKLSAgIHByaW50ZigiLyogMTYtYml0IGVycm9yOiAlZyAtICVnLCAldSAoJWclJSkgb2YgcmVhZGluZ3MgaW5leGFjdCAqL1xuIiwKLSAgICAgIG1pbl9lcnJvcjE2LCBtYXhfZXJyb3IxNiwgZXJyb3JfY291bnQxNiwgKDEwMC4qZXJyb3JfY291bnQxNikvNjU1MzUpOwotCi0gICBpZiAoIXRlc3Rfb25seSkKLSAgIHsKLSAgICAgIHByaW50ZigiUE5HX0NPTlNUIHBuZ191aW50XzE2IHBuZ19zUkdCX3RhYmxlWzI1Nl0gPVxue1xuICAgIik7Ci0gICAgICBmb3IgKGk9MDsgaTwyNTU7ICkKLSAgICAgIHsKLSAgICAgICAgIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoIiVkLCIsIHBuZ19zUkdCX3RhYmxlW2krK10pOwotICAgICAgICAgfQotICAgICAgICAgd2hpbGUgKChpICYgMHg3KSAhPSAwICYmIGk8MjU1KTsKLSAgICAgICAgIGlmIChpPDI1NSkgcHJpbnRmKCJcbiAgICIpOwotICAgICAgfQotICAgICAgcHJpbnRmKCIlZFxufTtcblxuIiwgcG5nX3NSR0JfdGFibGVbaV0pOwotCi0KLSAgICAgIHByaW50ZigiUE5HX0NPTlNUIHBuZ191aW50XzE2IHBuZ19zUkdCX2Jhc2VbNTEyXSA9XG57XG4gICAiKTsKLSAgICAgIGZvciAoaT0wOyBpPDUxMTsgKQotICAgICAgewotICAgICAgICAgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQsIiwgcG5nX3NSR0JfYmFzZVtpKytdKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlICgoaSAmIDB4NykgIT0gMCAmJiBpPDUxMSk7Ci0gICAgICAgICBpZiAoaTw1MTEpIHByaW50ZigiXG4gICAiKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZigiJWRcbn07XG5cbiIsIHBuZ19zUkdCX2Jhc2VbaV0pOwotCi0gICAgICBwcmludGYoIlBOR19DT05TVCBwbmdfYnl0ZSBwbmdfc1JHQl9kZWx0YVs1MTJdID1cbntcbiAgICIpOwotICAgICAgZm9yIChpPTA7IGk8NTExOyApCi0gICAgICB7Ci0gICAgICAgICBkbwotICAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCIlZCwiLCBwbmdfc1JHQl9kZWx0YVtpKytdKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlICgoaSAmIDB4ZikgIT0gMCAmJiBpPDUxMSk7Ci0gICAgICAgICBpZiAoaTw1MTEpIHByaW50ZigiXG4gICAiKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZigiJWRcbn07XG5cbiIsIHBuZ19zUkdCX2RlbHRhW2ldKTsKLSAgIH0KLQotICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3Rvb2xzL3BuZy1maXgtaXR4dC5jIGIvY29udHJpYi90b29scy9wbmctZml4LWl0eHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2NTRjMS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rvb2xzL3BuZy1maXgtaXR4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLQotLyogcG5nLWZpeC1pdHh0IHZlcnNpb24gMS4wLjAKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE4IFtKdWx5IDIzLCAyMDE1XQotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICoKLSAqIFVzYWdlOgotICoKLSAqICAgICBwbmctZml4LWl0eHQuZXhlIDwgYmFkLnBuZyA+IGdvb2QucG5nCi0gKgotICogRml4ZXMgYSBQTkcgZmlsZSB3cml0dGVuIHdpdGggbGlicG5nLTEuNi4wIG9yIDEuNi4xIHRoYXQgaGFzIG9uZSBvciBtb3JlCi0gKiB1bmNvbXByZXNzZWQgaVRYdCBjaHVua3MuICBBc3N1bWVzIHRoYXQgdGhlIGFjdHVhbCBsZW5ndGggaXMgZ3JlYXRlcgotICogdGhhbiBvciBlcXVhbCB0byB0aGUgdmFsdWUgaW4gdGhlIGxlbmd0aCBieXRlLCBhbmQgdGhhdCB0aGUgQ1JDIGlzCi0gKiBjb3JyZWN0IGZvciB0aGUgYWN0dWFsIGxlbmd0aC4gIFRoaXMgcHJvZ3JhbSBodW50cyBmb3IgdGhlIENSQyBhbmQKLSAqIGFkanVzdHMgdGhlIGxlbmd0aCBieXRlIGFjY29yZGluZ2x5LiAgSXQgaXMgbm90IGFuIGVycm9yIHRvIHByb2Nlc3MgYQotICogUE5HIGZpbGUgdGhhdCBoYXMgbm8gaVRYdCBjaHVua3Mgb3Igb25lIHRoYXQgaGFzIHZhbGlkIGlUWHQgY2h1bmtzOwotICogc3VjaCBmaWxlcyB3aWxsIHNpbXBseSBiZSBjb3BpZWQuCi0gKgotICogUmVxdWlyZXMgemxpYiAoZm9yIGNyYzMyIGFuZCBaX05VTEwpOyBidWlsZCB3aXRoCi0gKgotICogICAgIGdjYyAtTyAtbyBwbmctZml4LWl0eHQgcG5nLWZpeC1pdHh0LmMgLWx6Ci0gKgotICogSWYgeW91IG5lZWQgdG8gaGFuZGxlIGlUWHQgY2h1bmtzIGxhcmdlciB0aGFuIDUwMDAwMCBrYnl0ZXMgeW91IG11c3QKLSAqIHJlYnVpbGQgcG5nLWZpeC1pdHh0IHdpdGggYSBsYXJnZXIgdmFsdWVzIG9mIE1BWF9MRU5HVEggKG9yIGEgc21hbGxlciB2YWx1ZQotICogaWYgeW91IGtub3cgeW91IHdpbGwgbmV2ZXIgZW5jb3VudGVyIHN1Y2ggaHVnZSBpVFh0IGNodW5rcykuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8emxpYi5oPgotCi0jZGVmaW5lIE1BWF9MRU5HVEggNTAwMDAwCi0KLS8qIFJlYWQgb25lIGNoYXJhY3RlciAoaW5jaGFyKSwgYWxzbyByZXR1cm4gb2N0ZXQgKGMpLCBicmVhayBpZiBFT0YgKi8KLSNkZWZpbmUgR0VUQlJFQUsgaW5jaGFyPWdldGNoYXIoKTsgXAotICAgICAgICAgICAgICAgICBjPShpbmNoYXIgJiAweGZmVSk7XAotICAgICAgICAgICAgICAgICBpZiAoaW5jaGFyICE9IGMpIGJyZWFrCi1pbnQKLW1haW4odm9pZCkKLXsKLSAgIHVuc2lnbmVkIGludCBpOwotICAgdW5zaWduZWQgY2hhciBidWZbTUFYX0xFTkdUSF07Ci0gICB1bnNpZ25lZCBsb25nIGNyYzsKLSAgIHVuc2lnbmVkIGNoYXIgYzsKLSAgIGludCBpbmNoYXI7Ci0KLS8qIFNraXAgOC1ieXRlIHNpZ25hdHVyZSAqLwotICAgZm9yIChpPTg7IGk7IGktLSkKLSAgIHsKLSAgICAgIEdFVEJSRUFLOwotICAgICAgcHV0Y2hhcihjKTsKLSAgIH0KLQotaWYgKGluY2hhciA9PSBjKSAvKiAhRU9GICovCi1mb3IgKDs7KQotIHsKLSAgIC8qIFJlYWQgdGhlIGxlbmd0aCAqLwotICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7IC8qIG11c3QgYmUgMzIgYml0cyEgKi8KLSAgIEdFVEJSRUFLOyBidWZbMF0gPSBjOyBsZW5ndGggID0gYzsgbGVuZ3RoIDw8PSA4OwotICAgR0VUQlJFQUs7IGJ1ZlsxXSA9IGM7IGxlbmd0aCArPSBjOyBsZW5ndGggPDw9IDg7Ci0gICBHRVRCUkVBSzsgYnVmWzJdID0gYzsgbGVuZ3RoICs9IGM7IGxlbmd0aCA8PD0gODsKLSAgIEdFVEJSRUFLOyBidWZbM10gPSBjOyBsZW5ndGggKz0gYzsKLQotICAgLyogUmVhZCB0aGUgY2h1bmtuYW1lICovCi0gICBHRVRCUkVBSzsgYnVmWzRdID0gYzsKLSAgIEdFVEJSRUFLOyBidWZbNV0gPSBjOwotICAgR0VUQlJFQUs7IGJ1Zls2XSA9IGM7Ci0gICBHRVRCUkVBSzsgYnVmWzddID0gYzsKLQotCi0gICAvKiBUaGUgaVRYdCBjaHVuayB0eXBlIGV4cHJlc3NlZCBhcyBpbnRlZ2VycyBpcyAoMTA1LCA4NCwgODgsIDExNikgKi8KLSAgIGlmIChidWZbNF0gPT0gMTA1ICYmIGJ1Zls1XSA9PSA4NCAmJiBidWZbNl0gPT0gODggJiYgYnVmWzddID09IDExNikKLSAgIHsKLSAgICAgIGlmIChsZW5ndGggPj0gTUFYX0xFTkdUSC0xMikKLSAgICAgICAgIGJyZWFrOyAgLyogVG8gZG86IGhhbmRsZSB0aGlzIG1vcmUgZ3JhY2VmdWxseSAqLwotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBDUkMgKi8KLSAgICAgIGNyYyA9IGNyYzMyKDAsIFpfTlVMTCwgMCk7Ci0KLSAgICAgIC8qIENvcHkgdGhlIGRhdGEgYnl0ZXMgKi8KLSAgICAgIGZvciAoaT04OyBpIDwgbGVuZ3RoICsgMTI7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIEdFVEJSRUFLOyBidWZbaV0gPSBjOwotICAgICAgfQotCi0gICAgICBpZiAoaW5jaGFyICE9IGMpIC8qIEVPRiAqLwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIENhbGN1bGF0ZSB0aGUgQ1JDICovCi0gICAgICBjcmMgPSBjcmMzMihjcmMsIGJ1Zis0LCAodUludClsZW5ndGgrNCk7Ci0KLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIC8qIENoZWNrIHRoZSBDUkMgKi8KLSAgICAgICAgaWYgKCgoY3JjID4+IDI0KSAmIDB4ZmZVKSA9PSBidWZbbGVuZ3RoKzhdICYmCi0gICAgICAgICAgICAoKGNyYyA+PiAxNikgJiAweGZmVSkgPT0gYnVmW2xlbmd0aCs5XSAmJgotICAgICAgICAgICAgKChjcmMgPj4gIDgpICYgMHhmZlUpID09IGJ1ZltsZW5ndGgrMTBdICYmCi0gICAgICAgICAgICAoKGNyYyAgICAgICkgJiAweGZmVSkgPT0gYnVmW2xlbmd0aCsxMV0pCi0gICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGxlbmd0aCsrOwotCi0gICAgICAgIGlmIChsZW5ndGggPj0gTUFYX0xFTkdUSC0xMikKLSAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgR0VUQlJFQUs7Ci0gICAgICAgIGJ1ZltsZW5ndGgrMTFdID0gYzsKLQotICAgICAgICAvKiBVcGRhdGUgdGhlIENSQyAqLwotICAgICAgICBjcmMgPSBjcmMzMihjcmMsIGJ1Zis3K2xlbmd0aCwgMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbmNoYXIgIT0gYykgLyogRU9GICovCi0gICAgICAgICBicmVhazsKLQotICAgICAgLyogVXBkYXRlIGxlbmd0aCBieXRlcyAqLwotICAgICAgYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKChsZW5ndGggPj4gMjQpICYgMHhmZlUpOwotICAgICAgYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKChsZW5ndGggPj4gMTYpICYgMHhmZlUpOwotICAgICAgYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpKChsZW5ndGggPj4gIDgpICYgMHhmZlUpOwotICAgICAgYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKChsZW5ndGggICAgICApICYgMHhmZlUpOwotCi0gICAgICAvKiBXcml0ZSB0aGUgZml4ZWQgaVRYdCBjaHVuayAobGVuZ3RoLCBuYW1lLCBkYXRhLCBjcmMpICovCi0gICAgICBmb3IgKGk9MDsgaTxsZW5ndGgrMTI7IGkrKykKLSAgICAgICAgIHB1dGNoYXIoYnVmW2ldKTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgaWYgKGluY2hhciAhPSBjKSAvKiBFT0YgKi8KLSAgICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBDb3B5IGJ5dGVzIHRoYXQgd2VyZSBhbHJlYWR5IHJlYWQgKGxlbmd0aCBhbmQgY2h1bmsgbmFtZSkgKi8KLSAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKLSAgICAgICAgIHB1dGNoYXIoYnVmW2ldKTsKLQotICAgICAgLyogQ29weSBkYXRhIGJ5dGVzIGFuZCBDUkMgKi8KLSAgICAgIGZvciAoaT04OyBpPCBsZW5ndGgrMTI7IGkrKykKLSAgICAgIHsKLSAgICAgICAgIEdFVEJSRUFLOwotICAgICAgICAgcHV0Y2hhcihjKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGluY2hhciAhPSBjKSAvKiBFT0YgKi8KLSAgICAgIHsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAvKiBUaGUgSUVORCBjaHVuayB0eXBlIGV4cHJlc3NlZCBhcyBpbnRlZ2VycyBpcyAoNzMsIDY5LCA3OCwgNjgpICovCi0gICAgICBpZiAoYnVmWzRdID09IDczICYmIGJ1Zls1XSA9PSA2OSAmJiBidWZbNl0gPT0gNzggJiYgYnVmWzddID09IDY4KQotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIGlmIChpbmNoYXIgIT0gYykgLyogRU9GICovCi0gICAgICBicmVhazsKLQotICAgaWYgKGJ1Zls0XSA9PSA3MyAmJiBidWZbNV0gPT0gNjkgJiYgYnVmWzZdID09IDc4ICYmIGJ1Zls3XSA9PSA2OCkKLSAgICAgYnJlYWs7Ci0gfQotCi0gcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3Rvb2xzL3BuZ2NwLmMgYi9jb250cmliL3Rvb2xzL3BuZ2NwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmRkZGMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90b29scy9wbmdjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1MyArMCwwIEBACi0vKiBwbmdjcC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDE2IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIKLSAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yNCBbQXVndXN0IDQsIDIwMTZdCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGNvcHlpbmcgYSBQTkcgd2l0aG91dCBjaGFuZ2VzIHVzaW5nIHRoZSBwbmdfcmVhZF9wbmcKLSAqIGFuZCBwbmdfd3JpdGVfcG5nIGludGVyZmFjZXMuICBBIGNvbnNpZGVyYWJsZSBudW1iZXIgb2Ygb3B0aW9ucyBhcmUgcHJvdmlkZWQKLSAqIHRvIG1hbmlwdWxhdGUgdGhlIGNvbXByZXNzaW9uIG9mIHRoZSBQTkcgZGF0YSBhbmQgb3RoZXIgY29tcHJlc3NlZCBjaHVua3MuCi0gKgotICogRm9yIGEgbW9yZSBleHRlbnNpdmUgZXhhbXBsZSB0aGF0IHVzZXMgdGhlIHRyYW5zZm9ybXMgc2VlCi0gKiBjb250cmliL2xpYnRlc3RzL3BuZ2ltYWdlLmMgaW4gdGhlIGxpYnBuZyBkaXN0cmlidXRpb24uCi0gKi8KLSNpbmNsdWRlICJwbmdsaWJjb25mLmgiIC8qIFRvIGZpbmQgaG93IGxpYnBuZyB3YXMgY29uZmlndXJlZC4gKi8KLQotI2lmZGVmIFBOR19QTkdDUF9USU1JTkdfU1VQUE9SVEVECi0gICAvKiBXQVJOSU5HOgotICAgICoKLSAgICAqIFRoaXMgdGVzdCBpcyBoZXJlIHRvIGFsbG93IFBPU0lYLjFiIGV4dGVuc2lvbnMgdG8gYmUgdXNlZCBpZiBlbmFibGVkIGluCi0gICAgKiB0aGUgY29tcGlsZTsgc3BlY2lmaWNhbGx5IHRoZSBjb2RlIHJlcXVpcmVzX1BPU0lYX0NfU09VUkNFIHN1cHBvcnQgb2YKLSAgICAqIDE5OTMwOUwgb3IgbGF0ZXIgdG8gZW5hYmxlIGNsb2NrX2dldHRpbWUgdXNlLgotICAgICoKLSAgICAqIElGIHRoaXMgY2F1c2VzIHByb2JsZW1zIFRIRU4gY29tcGlsZSB3aXRoIGEgc3RyaWN0IEFOU0kgQyBjb21waWxlciBhbmQgbGV0Ci0gICAgKiB0aGlzIGNvZGUgdHVybiBvbiB0aGUgUE9TSVggZmVhdHVyZXMgdGhhdCBpdCBtaW5pbWFsbHkgcmVxdWlyZXMuCi0gICAgKgotICAgICogSUYgdGhpcyBkb2VzIG5vdCB3b3JrIHRoZXJlIGlzIHByb2JhYmx5IGEgYnVnIGluIHlvdXIgQU5TSSBDIGNvbXBpbGVyIG9yCi0gICAgKiB5b3VyIFBPU0lYIGltcGxlbWVudGF0aW9uLgotICAgICovCi0jICBkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDE5OTMwOUwKLSNlbHNlIC8qIE5vIHRpbWluZyBzdXBwb3J0IHJlcXVpcmVkICovCi0jICBkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQotIyAgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHRlc3QgYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsIHJhdGhlcgotICogdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6Ci0gKi8KLSNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCi0jICBpbmNsdWRlIDxwbmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKLSNlbmRpZgotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMAotICAgLyogUkVBRF9QTkcgYW5kIFdSSVRFX1BORyB3ZXJlIG5vdCBkZWZpbmVkLCBzbzogKi8KLSMgIGlmZGVmIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAotIyAgICAgaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLSMgICAgICAgIGRlZmluZSBQTkdfUkVBRF9QTkdfU1VQUE9SVEVECi0jICAgICBlbmRpZiAvKiBTRVFVRU5USUFMX1JFQUQgKi8KLSMgICAgIGlmZGVmIFBOR19XUklURV9TVVBQT1JURUQKLSMgICAgICAgIGRlZmluZSBQTkdfV1JJVEVfUE5HX1NVUFBPUlRFRAotIyAgICAgZW5kaWYgLyogV1JJVEUgKi8KLSMgIGVuZGlmIC8qIElORk9fSU1BR0UgKi8KLSNlbmRpZiAvKiBwcmUgMS43LjAgKi8KLQotI2lmIChkZWZpbmVkKFBOR19SRUFEX1BOR19TVVBQT1JURUQpKSAmJiAoZGVmaW5lZChQTkdfV1JJVEVfUE5HX1NVUFBPUlRFRCkpCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLSNpZm5kZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQKLSMgIGluY2x1ZGUgPHNldGptcC5oPiAvKiBiZWNhdXNlIHBuZy5oIGRpZCAqbm90KiBpbmNsdWRlIHRoaXMgKi8KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSMgIGRlZmluZSB2b2lkY2FzdCh0eXBlLCB2YWx1ZSkgc3RhdGljX2Nhc3Q8dHlwZT4odmFsdWUpCi0jZWxzZQotIyAgZGVmaW5lIHZvaWRjYXN0KHR5cGUsIHZhbHVlKSAodmFsdWUpCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2lmZGVmIF9fR05VQ19fCi0gICAvKiBNYW55IHZlcnNpb25zIG9mIEdDQyBlcnJvbmVvdXNseSByZXBvcnQgdGhhdCBsb2NhbCB2YXJpYWJsZXMgdW5tb2RpZmllZAotICAgICogd2l0aGluIHRoZSBzY29wZSBvZiBhIHNldGptcCBtYXkgYmUgY2xvYmJlcmVkLiAgVGhpcyBoYWNrcyByb3VuZCB0aGUKLSAgICAqIHByb2JsZW0gKHNvbWV0aW1lcykgd2l0aG91dCBoYXJtaW5nIG90aGVyIGNvbXBpbGVycy4KLSAgICAqLwotIyAgZGVmaW5lIGd2IHZvbGF0aWxlCi0jZWxzZQotIyAgZGVmaW5lIGd2Ci0jZW5kaWYKLQotLyogJ0NMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCcgaXMgb25lIG9mIHRoZSBjbG9jayB0aW1lcnMgZm9yIGNsb2NrX2dldHRpbWUuICBJdAotICogbmVlZCBub3QgYmUgc3VwcG9ydGVkIGV2ZW4gd2hlbiBjbG9ja19nZXR0aW1lIGlzIGF2YWlsYWJsZS4gIEl0IHJldHVybnMgdGhlCi0gKiAnQ1BVJyB0aW1lIHRoZSBwcm9jZXNzIGhhcyBjb25zdW1lZC4gICdDUFUnIHRpbWUgaXMgYXNzdW1lZCB0byBpbmNsdWRlIHRpbWUKLSAqIHdoZW4gdGhlIENQVSBpcyBhY3R1YWxseSBibG9ja2VkIGJ5IGEgcGVuZGluZyBjYWNoZSBmaWxsIGJ1dCBub3QgdGltZQotICogd2FpdGluZyBmb3IgcGFnZSBmYXVsdHMuICBUaGUgYXR0ZW1wdCBpcyB0byBnZXQgYSBtZWFzdXJlIG9mIHRoZSBhY3R1YWwgdGltZQotICogdGhlIGltcGxlbWVudGF0aW9uIHRha2VzIHRvIHJlYWQgYSBQTkcgaWdub3JpbmcgdGhlIHBvdGVudGlhbGx5IHZlcnkgbGFyZ2UgSU8KLSAqIG92ZXJoZWFkLgotICovCi0jaWZkZWYgUE5HX1BOR0NQX1RJTUlOR19TVVBQT1JURUQKLSMgIGluY2x1ZGUgPHRpbWUuaD4gICAvKiBjbG9ja19nZXR0aW1lIGFuZCBhc3NvY2lhdGVkIGRlZmluaXRpb25zICovCi0jICBpZm5kZWYgQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lECi0gICAgICAvKiBQcmV2ZW50IGluY2x1c2lvbiBvZiB0aGUgc3B1cmlvdXMgY29kZTogKi8KLSMgICAgIHVuZGVmIFBOR19QTkdDUF9USU1JTkdfU1VQUE9SVEVECi0jICBlbmRpZgotI2VuZGlmIC8qIFBOR0NQX1RJTUlORyAqLwotCi0vKiBTbyBpZiB0aGUgdGltaW5nIGZlYXR1cmUgaGFzIGJlZW4gYWN0aXZhdGVkOiAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHRlc3Qgb2YgYSBzaW5nbGUgZmlsZS4gKi8KLXR5cGVkZWYgZW51bQotewotICAgVkVSQk9TRSwgICAgICAgIC8qIHN3aXRjaGVzIG9uIGFsbCBtZXNzYWdlcyAqLwotICAgSU5GT1JNQVRJT04sCi0gICBXQVJOSU5HUywgICAgICAgLyogc3dpdGNoZXMgb24gd2FybmluZ3MgKi8KLSAgIExJQlBOR19XQVJOSU5HLAotICAgQVBQX1dBUk5JTkcsCi0gICBFUlJPUlMsICAgICAgICAgLyoganVzdCBlcnJvcnMgKi8KLSAgIEFQUF9GQUlMLCAgICAgICAvKiBjb250aW51YWJsZSBlcnJvciAtIG5vIG5lZWQgdG8gbG9uZ2ptcCAqLwotICAgTElCUE5HX0VSUk9SLCAgIC8qIHRoaXMgYW5kIGhpZ2hlciBjYXVzZSBhIGxvbmdqbXAgKi8KLSAgIExJQlBOR19CVUcsICAgICAvKiBlcnJvbmVvdXMgYmVoYXZpb3IgaW4gbGlicG5nICovCi0gICBBUFBfRVJST1IsICAgICAgLyogc3VjaCBhcyBvdXQtb2YtbWVtb3J5IGluIGEgY2FsbGJhY2sgKi8KLSAgIFFVSUVULCAgICAgICAgICAvKiBubyBub3JtYWwgbWVzc2FnZXMgKi8KLSAgIFVTRVJfRVJST1IsICAgICAvKiBzdWNoIGFzIGZpbGUtbm90LWZvdW5kICovCi0gICBJTlRFUk5BTF9FUlJPUgotfSBlcnJvcl9sZXZlbDsKLSNkZWZpbmUgTEVWRUxfTUFTSyAgICAgIDB4ZiAgIC8qIHdoZXJlIHRoZSBsZXZlbCBpcyBpbiAnb3B0aW9ucycgKi8KLQotI2RlZmluZSBTVFJJQ1QgICAgICAgICAgMHgwMTAgLyogRmFpbCBvbiB3YXJuaW5ncyBhcyB3ZWxsIGFzIGVycm9ycyAqLwotI2RlZmluZSBMT0cgICAgICAgICAgICAgMHgwMjAgLyogTG9nIHBhc3MvZmFpbCB0byBzdGRvdXQgKi8KLSNkZWZpbmUgQ09OVElOVUUgICAgICAgIDB4MDQwIC8qIENvbnRpbnVlIG9uIEFQUF9GQUlMIGVycm9ycyAqLwotI2RlZmluZSBTSVpFUyAgICAgICAgICAgMHgwODAgLyogUmVwb3J0IGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMgKi8KLSNkZWZpbmUgU0VBUkNIICAgICAgICAgIDB4MTAwIC8qIFNlYXJjaCBJREFUIGNvbXByZXNzaW9uIG9wdGlvbnMgKi8KLSNkZWZpbmUgTk9XUklURSAgICAgICAgIDB4MjAwIC8qIERvIG5vdCB3cml0ZSBhbiBvdXRwdXQgZmlsZSAqLwotI2lmZGVmIFBOR19DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQKLSMgIGRlZmluZSBJR05PUkVfSU5ERVggIDB4NDAwIC8qIElnbm9yZSBvdXQgb2YgcmFuZ2UgcGFsZXR0ZSBpbmRpY2VzIChCQUQhKSAqLwotIyAgaWZkZWYgUE5HX0dFVF9QQUxFVFRFX01BWF9TVVBQT1JURUQKLSMgICAgIGRlZmluZSBGSVhfSU5ERVggIDB4ODAwIC8qICdGaXgnIG91dCBvZiByYW5nZSBwYWxldHRlIGluZGljZXMgKE9LKSAqLwotIyAgZW5kaWYgLyogR0VUX1BBTEVUVEVfTUFYICovCi0jZW5kaWYgLyogQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVggKi8KLSNkZWZpbmUgT1BUSU9OICAgICAweDgwMDAwMDAwIC8qIFVzZWQgZm9yIGhhbmRsaW5nIG9wdGlvbnMgKi8KLSNkZWZpbmUgTElTVCAgICAgICAweDgwMDAwMDAxIC8qIFVzZWQgZm9yIGhhbmRsaW5nIG9wdGlvbnMgKi8KLQotLyogUmVzdWx0IG1hc2tzIGFwcGx5IHRvIHRoZSByZXN1bHQgYml0cyBpbiB0aGUgJ3Jlc3VsdHMnIGZpZWxkIGJlbG93OyB0aGVzZQotICogYml0cyBhcmUgc2ltcGxlIDFVPDxlcnJvcl9sZXZlbC4gIEEgcGFzcyByZXF1aXJlcyBlaXRoZXIgbm90aGluZyB3b3JzZSB0aGFuCi0gKiB3YXJuaW5ncyAoLS1yZWxheGVzKSBvciBub3RoaW5nIHdvcnNlIHRoYW4gaW5mb3JtYXRpb24gKC0tc3RyaWN0KQotICovCi0jZGVmaW5lIFJFU1VMVF9TVFJJQ1QocikgICAoKChyKSAmIH4oKDFVPDxXQVJOSU5HUyktMSkpID09IDApCi0jZGVmaW5lIFJFU1VMVF9SRUxBWEVEKHIpICAoKChyKSAmIH4oKDFVPDxFUlJPUlMpLTEpKSA9PSAwKQotCi0vKiBPUFRJT04gREVGSU5JVElPTlMgKi8KLXN0YXRpYyBjb25zdCBjaGFyIHJhbmdlX2xvW10gPSAibG93IjsKLXN0YXRpYyBjb25zdCBjaGFyIHJhbmdlX2hpW10gPSAiaGlnaCI7Ci1zdGF0aWMgY29uc3QgY2hhciBhbGxbXSA9ICJhbGwiOwotI2RlZmluZSBSQU5HRShsbyxoaSkgeyByYW5nZV9sbywgbG8gfSwgeyByYW5nZV9oaSwgaGkgfQotdHlwZWRlZiBzdHJ1Y3QgdmFsdWVfbGlzdAotewotICAgY29uc3QgY2hhciAqbmFtZTsgIC8qIHRoZSBjb21tYW5kIGxpbmUgbmFtZSBvZiB0aGUgdmFsdWUgKi8KLSAgIGludCAgICAgICAgIHZhbHVlOyAvKiB0aGUgYWN0dWFsIHZhbHVlIHRvIHVzZSAqLwotfSAgdmFsdWVfbGlzdDsKLQotc3RhdGljIGNvbnN0IHZhbHVlX2xpc3QKLSNpZmRlZiBQTkdfU1dfQ09NUFJFU1NfcG5nX2xldmVsCi12bF9jb21wcmVzc2lvbltdID0KLXsKLSAgIC8qIE92ZXJhbGwgY29tcHJlc3Npb24gY29udHJvbC4gIFRoZSBvcmRlciBjb250cm9scyB0aGUgc2VhcmNoIG9yZGVyIGZvcgotICAgICogJ2FsbCcuICBTaW5jZSB0aGUgc2VhcmNoIGlzIGZvciB0aGUgc21hbGxlc3QgdGhlIG9yZGVyIHVzZWQgaXMgbG93IG1lbW9yeQotICAgICogdGhlbiBoaWdoIHNwZWVkLgotICAgICovCi0gICB7ICJsb3ctbWVtb3J5IiwgICAgICBQTkdfQ09NUFJFU1NJT05fTE9XX01FTU9SWSB9LAotICAgeyAiaGlnaC1zcGVlZCIsICAgICAgUE5HX0NPTVBSRVNTSU9OX0hJR0hfU1BFRUQgfSwKLSAgIHsgImhpZ2gtcmVhZC1zcGVlZCIsIFBOR19DT01QUkVTU0lPTl9ISUdIX1JFQURfU1BFRUQgfSwKLSAgIHsgImxvdyIsICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9MT1cgfSwKLSAgIHsgIm1lZGl1bSIsICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9NRURJVU0gfSwKLSAgIHsgIm9sZCIsICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9DT01QQVQgfSwKLSAgIHsgImhpZ2giLCAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9ISUdIIH0sCi0gICB7IGFsbCwgMCB9Ci19LAotI2VuZGlmIC8qIFNXX0NPTVBSRVNTX3BuZ19sZXZlbCAqLwotCi0jaWYgZGVmaW5lZChQTkdfV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OX1NVUFBPUlRFRCkgfHxcCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT05fU1VQUE9SVEVEKQotdmxfc3RyYXRlZ3lbXSA9Ci17Ci0gICAvKiBUaGlzIGNvbnRyb2xzIHRoZSBvcmRlciBvZiBzZWFyY2guICovCi0gICB7ICJodWZmbWFuIiwgWl9IVUZGTUFOX09OTFkgfSwKLSAgIHsgIlJMRSIsIFpfUkxFIH0sCi0gICB7ICJmaXhlZCIsIFpfRklYRUQgfSwgLyogdGhlIHJlbWFpbmRlciBkbyB3aW5kb3cgc2VhcmNocyAqLwotICAgeyAiZmlsdGVyZWQiLCBaX0ZJTFRFUkVEIH0sCi0gICB7ICJkZWZhdWx0IiwgWl9ERUZBVUxUX1NUUkFURUdZIH0sCi0gICB7IGFsbCwgMCB9Ci19LAotI2lmZGVmIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTl9TVVBQT1JURUQKLXZsX3dpbmRvd0JpdHNfdGV4dFtdID0KLXsKLSAgIHsgImRlZmF1bHQiLCBNQVhfV0JJVFMvKmZyb20gemxpYiovIH0sCi0gICB7ICJtaW5pbXVtIiwgOCB9LAotICAgUkFOR0UoOCwgTUFYX1dCSVRTLypmcm9tIHpsaWIqLyksCi0gICB7IGFsbCwgMCB9Ci19LAotI2VuZGlmIC8qIHRleHQgY29tcHJlc3Npb24gKi8KLXZsX2xldmVsW10gPQotewotICAgeyAiZGVmYXVsdCIsIFpfREVGQVVMVF9DT01QUkVTU0lPTiAvKiB0aGlzIGlzIC0xICovIH0sCi0gICB7ICJub25lIiwgWl9OT19DT01QUkVTU0lPTiB9LAotICAgeyAic3BlZWQiLCBaX0JFU1RfU1BFRUQgfSwKLSAgIHsgImJlc3QiLCBaX0JFU1RfQ09NUFJFU1NJT04gfSwKLSAgIHsgIjAiLCBaX05PX0NPTVBSRVNTSU9OIH0sCi0gICBSQU5HRSgxLCA5KSwgLyogdGhpcyBkZWxpYmVyYXRlbHkgZXhjbHVkZXMgJzAnICovCi0gICB7IGFsbCwgMCB9Ci19LAotdmxfbWVtTGV2ZWxbXSA9Ci17Ci0gICB7ICJtYXgiLCBNQVhfTUVNX0xFVkVMIH0sIC8qIHpsaWIgbWF4aW11bSAqLwotICAgeyAiMSIsIDEgfSwgLyogemxpYiBtaW5pbXVtICovCi0gICB7ICJkZWZhdWx0IiwgOCB9LCAvKiB6bGliIGRlZmF1bHQgKi8KLSAgIHsgIjIiLCAyIH0sCi0gICB7ICIzIiwgMyB9LAotICAgeyAiNCIsIDQgfSwKLSAgIHsgIjUiLCA1IH0sIC8qIGZvciBleHBsaWNpdCB0ZXN0aW5nICovCi0gICBSQU5HRSg2LCBNQVhfTUVNX0xFVkVMLyp6bGliKi8pLCAvKiBleGNsdWRlIDUgYW5kIGJlbG93OiB6bGliIGJ1Z3MgKi8KLSAgIHsgYWxsLCAwIH0KLX0sCi0jZW5kaWYgLyogV1JJVEVfQ1VTVE9NSVpFXypDT01QUkVTU0lPTiAqLwotI2lmZGVmIFBOR19XUklURV9GSUxURVJfU1VQUE9SVEVECi12bF9maWx0ZXJbXSA9Ci17Ci0gICB7IGFsbCwgICAgICBQTkdfQUxMX0ZJTFRFUlMgICB9LAotICAgeyAib2ZmIiwgICAgUE5HX05PX0ZJTFRFUlMgICAgfSwKLSAgIHsgIm5vbmUiLCAgIFBOR19GSUxURVJfTk9ORSAgIH0sCi0gICB7ICJzdWIiLCAgICBQTkdfRklMVEVSX1NVQiAgICB9LAotICAgeyAidXAiLCAgICAgUE5HX0ZJTFRFUl9VUCAgICAgfSwKLSAgIHsgImF2ZyIsICAgIFBOR19GSUxURVJfQVZHICAgIH0sCi0gICB7ICJwYWV0aCIsICBQTkdfRklMVEVSX1BBRVRIICB9Ci19LAotI2VuZGlmIC8qIFdSSVRFX0ZJTFRFUiAqLwotI2lmZGVmIFBOR19QTkdDUF9USU1JTkdfU1VQUE9SVEVECi0jICBkZWZpbmUgUE5HQ1BfVElNRV9SRUFEICAxCi0jICBkZWZpbmUgUE5HQ1BfVElNRV9XUklURSAyCi12bF90aW1lW10gPQotewotICAgeyAiYm90aCIsICBQTkdDUF9USU1FX1JFQUQrUE5HQ1BfVElNRV9XUklURSB9LAotICAgeyAib2ZmIiwgICAwIH0sCi0gICB7ICJyZWFkIiwgIFBOR0NQX1RJTUVfUkVBRCB9LAotICAgeyAid3JpdGUiLCBQTkdDUF9USU1FX1dSSVRFIH0KLX0sCi0jZW5kaWYgLyogUE5HQ1BfVElNSU5HICovCi12bF9JREFUX3NpemVbXSA9IC8qIGZvciBwbmdfc2V0X0lEQVRfc2l6ZSAqLwotewotICAgeyAiZGVmYXVsdCIsIDB4N0ZGRkZGRkYgfSwKLSAgIHsgIm1pbmltYWwiLCAxIH0sCi0gICBSQU5HRSgxLCAweDdGRkZGRkZGKQotfSwKLSNpZm5kZWYgUE5HX1NXX0lEQVRfc2l6ZQotICAgLyogUHJlIDEuNyBBUEk6ICovCi0jICBkZWZpbmUgcG5nX3NldF9JREFUX3NpemUocCx2KSBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHAsIHYpCi0jZW5kaWYgLyogIVNXX0lEQVRfc2l6ZSAqLwotI2RlZmluZSBTTCA4IC8qIHN0YWNrIGxpbWl0IGluIGRpc3BsYXksIGJlbG93ICovCi12bF9sb2dfZGVwdGhbXSA9IHsgeyAib24iLCAxIH0sIHsgIm9mZiIsIDAgfSwgUkFOR0UoMCwgU0wpIH0sCi12bF9vbl9vZmZbXSA9IHsgeyAib24iLCAxIH0sIHsgIm9mZiIsIDAgfSB9OwotCi0jaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9DT01QUkVTU0lPTl9TVVBQT1JURUQKLXN0YXRpYyB2YWx1ZV9saXN0Ci12bF93aW5kb3dCaXRzX0lEQVRbXSA9Ci17Ci0gICB7ICJkZWZhdWx0IiwgTUFYX1dCSVRTIH0sCi0gICB7ICJzbWFsbCIsIDkgfSwKLSAgIFJBTkdFKDgsIE1BWF9XQklUUyksIC8qIG1vZGlmaWVkIGJ5IHNldF93aW5kb3dCaXRzX2hpICovCi0gICB7IGFsbCwgMCB9Ci19OwotI2VuZGlmIC8qIElEQVQgY29tcHJlc3Npb24gKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgb3B0aW9uCi17Ci0gICBjb25zdCBjaGFyICAgICAgICpuYW1lOyAgICAgICAgIC8qIG5hbWUgb2YgdGhlIG9wdGlvbiAqLwotICAgcG5nX3VpbnRfMzIgICAgICAgb3B0OyAgICAgICAgICAvKiBhbiBvcHRpb24sIG9yIE9QVElPTiBvciBMSVNUICovCi0gICBwbmdfYnl0ZSAgICAgICAgICBzZWFyY2g7ICAgICAgIC8qIFNlYXJjaCBvbiAtLXNlYXJjaCAqLwotICAgcG5nX2J5dGUgICAgICAgICAgdmFsdWVfY291bnQ7ICAvKiBsZW5ndGggb2YgdGhlIGxpc3Qgb2YgdmFsdWVzOiAqLwotICAgY29uc3QgdmFsdWVfbGlzdCAqdmFsdWVzOyAgICAgICAvKiB2YWx1ZXMgZm9yIE9QVElPTiBvciBMSVNUICovCi19ICBvcHRpb247Ci0KLXN0YXRpYyBjb25zdCBvcHRpb24gb3B0aW9uc1tdID0KLXsKLSAgIC8qIHN0cnVjdCBkaXNwbGF5IG9wdGlvbnMsIHRoZXNlIGFyZSBzZXQgd2hlbiB0aGUgY29tbWFuZCBsaW5lIGlzIHJlYWQgKi8KLSMgIGRlZmluZSBTKG4sdikgeyAjbiwgdiwgMCwgMiwgdmxfb25fb2ZmIH0sCi0gICBTKHZlcmJvc2UsICBWRVJCT1NFKQotICAgUyh3YXJuaW5ncywgV0FSTklOR1MpCi0gICBTKGVycm9ycywgICBFUlJPUlMpCi0gICBTKHF1aWV0LCAgICBRVUlFVCkKLSAgIFMoc3RyaWN0LCAgIFNUUklDVCkKLSAgIFMobG9nLCAgICAgIExPRykKLSAgIFMoY29udGludWUsIENPTlRJTlVFKQotICAgUyhzaXplcywgICAgU0laRVMpCi0gICBTKHNlYXJjaCwgICBTRUFSQ0gpCi0gICBTKG5vd3JpdGUsICBOT1dSSVRFKQotIyAgaWZkZWYgSUdOT1JFX0lOREVYCi0gICAgICBTKGlnbm9yZS1wYWxldHRlLWluZGV4LCBJR05PUkVfSU5ERVgpCi0jICBlbmRpZiAvKiBJR05PUkVfSU5ERVggKi8KLSMgIGlmZGVmIEZJWF9JTkRFWAotICAgICAgUyhmaXgtcGFsZXR0ZS1pbmRleCwgRklYX0lOREVYKQotIyAgZW5kaWYgLyogRklYX0lOREVYICovCi0jICB1bmRlZiBTCi0KLSAgIC8qIE9QVElPTiBzZXR0aW5ncywgdGhlc2UgYW5kIExJU1Qgc2V0dGluZ3MgYXJlIHJlYWQgb24gZGVtYW5kICovCi0jICBkZWZpbmUgVkxOQU1FKG5hbWUpIHZsXyAjIyBuYW1lCi0jICBkZWZpbmUgVkxTSVpFKG5hbWUpIHZvaWRjYXN0KHBuZ19ieXRlLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YgVkxOQU1FKG5hbWUpKS8oc2l6ZW9mIFZMTkFNRShuYW1lKVswXSkpCi0jICBkZWZpbmUgVkwob25hbWUsIG5hbWUsIHR5cGUsIHNlYXJjaClcCi0gICB7IG9uYW1lLCB0eXBlLCBzZWFyY2gsIFZMU0laRShuYW1lKSwgVkxOQU1FKG5hbWUpIH0sCi0jICBkZWZpbmUgVkxPKG9uYW1lLCBuYW1lLCBzZWFyY2gpIFZMKG9uYW1lLCBuYW1lLCBPUFRJT04sIHNlYXJjaCkKLQotIyAgaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9DT01QUkVTU0lPTl9TVVBQT1JURUQKLSMgICAgIGRlZmluZSBWTENJREFUKG5hbWUpIFZMTygjbmFtZSwgbmFtZSwgMS8qc2VhcmNoKi8pCi0jICAgICBpZmRlZiBQTkdfU1dfQ09NUFJFU1NfbGV2ZWwKLSMgICAgICAgIGRlZmluZSBWTENpQ0NQKG5hbWUpIFZMTygiSUNDLXByb2ZpbGUtIiAjbmFtZSwgbmFtZSwgMC8qc2VhcmNoKi8pCi0jICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgVkxDaUNDUChuYW1lKQotIyAgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgIGRlZmluZSBWTENJREFUKG5hbWUpCi0jICAgICBkZWZpbmUgVkxDaUNDUChuYW1lKQotIyAgZW5kaWYgLyogV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OICovCi0KLSMgIGlmZGVmIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTl9TVVBQT1JURUQKLSMgICAgIGRlZmluZSBWTEN6VFh0KG5hbWUpIFZMTygidGV4dC0iICNuYW1lLCBuYW1lLCAwLypzZWFyY2gqLykKLSMgIGVsc2UKLSMgICAgIGRlZmluZSBWTEN6VFh0KG5hbWUpCi0jICBlbmRpZiAvKiBXUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTiAqLwotCi0jICBkZWZpbmUgVkxDKG5hbWUpIFZMQ0lEQVQobmFtZSkgVkxDaUNDUChuYW1lKSBWTEN6VFh0KG5hbWUpCi0KLSMgIGlmZGVmIFBOR19TV19DT01QUkVTU19wbmdfbGV2ZWwKLSAgICAgIC8qIFRoZSBsaWJwbmcgY29tcHJlc3Npb24gbGV2ZWwgaXNuJ3Qgc2VhcmNoZWQgYmVhdXNlIGl0IGp1c3RzIHNldHMgdGhlCi0gICAgICAgKiBvdGhlciB0aGluZ3MgdGhhdCBhcmUgc2VhcmNoZWQhCi0gICAgICAgKi8KLSAgICAgIFZMTygiY29tcHJlc3Npb24iLCBjb21wcmVzc2lvbiwgMCkKLSAgICAgIFZMTygidGV4dC1jb21wcmVzc2lvbiIsIGNvbXByZXNzaW9uLCAwKQotICAgICAgVkxPKCJJQ0MtcHJvZmlsZS1jb21wcmVzc2lvbiIsIGNvbXByZXNzaW9uLCAwKQotIyAgZW5kaWYgLyogU1dfQ09NUFJFU1NfcG5nX2xldmVsICovCi0gICBWTEMoc3RyYXRlZ3kpCi0gICBWTE8oIndpbmRvd0JpdHMiLCB3aW5kb3dCaXRzX0lEQVQsIDEpCi0jICBpZmRlZiBQTkdfU1dfQ09NUFJFU1Nfd2luZG93Qml0cwotICAgICAgVkxPKCJJQ0MtcHJvZmlsZS13aW5kb3dCaXRzIiwgd2luZG93Qml0c190ZXh0LypzaWMqLywgMCkKLSMgIGVuZGlmCi0gICBWTE8oInRleHQtd2luZG93Qml0cyIsIHdpbmRvd0JpdHNfdGV4dCwgMCkKLSAgIFZMQyhsZXZlbCkKLSAgIFZMQyhtZW1MZXZlbCkKLSAgIFZMTygiSURBVC1zaXplIiwgSURBVF9zaXplLCAwKQotICAgVkxPKCJsb2ctZGVwdGgiLCBsb2dfZGVwdGgsIDApCi0KLSMgIHVuZGVmIFZMTwotCi0gICAvKiBMSVNUIHNldHRpbmdzICovCi0jICBkZWZpbmUgVkxMKG5hbWUsIHNlYXJjaCkgVkwoI25hbWUsIG5hbWUsIExJU1QsIHNlYXJjaCkKLSNpZmRlZiBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAotICAgVkxMKGZpbHRlciwgMCkKLSNlbmRpZiAvKiBXUklURV9GSUxURVIgKi8KLSNpZmRlZiBQTkdfUE5HQ1BfVElNSU5HX1NVUFBPUlRFRAotICAgVkxMKHRpbWUsIDApCi0jZW5kaWYgLyogUE5HQ1BfVElNSU5HICovCi0jICB1bmRlZiBWTEwKLSMgIHVuZGVmIFZMCi19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgIHN0YXRpYyBjb25zdCBzaXplX3Qgb3B0aW9uX2NvdW50KChzaXplb2Ygb3B0aW9ucykvKHNpemVvZiBvcHRpb25zWzBdKSk7Ci0jZWxzZSAvKiAhX19jcGx1c3BsdXMgKi8KLSMgIGRlZmluZSBvcHRpb25fY291bnQgKChzaXplb2Ygb3B0aW9ucykvKHNpemVvZiBvcHRpb25zWzBdKSkKLSNlbmRpZiAvKiAhX19jcGx1c3BsdXMgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotY3RzKGludCBjdCkKLXsKLSAgIHN3aXRjaCAoY3QpCi0gICB7Ci0gICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1BBTEVUVEU6ICAgICByZXR1cm4gIlAiOwotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOiAgICAgICAgcmV0dXJuICJHIjsKLSAgICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQTogIHJldHVybiAiR0EiOwotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6ICAgICAgICAgcmV0dXJuICJSR0IiOwotICAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6ICAgcmV0dXJuICJSR0JBIjsKLSAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiSU5WQUxJRCI7Ci0gICB9Ci19Ci0KLXN0cnVjdCBkaXNwbGF5Ci17Ci0gICBqbXBfYnVmICAgICAgICAgIGVycm9yX3JldHVybjsgICAgICAvKiBXaGVyZSB0byBnbyB0byBvbiBlcnJvciAqLwotICAgdW5zaWduZWQgaW50ICAgICBlcnJzZXQ7ICAgICAgICAgICAgLyogZXJyb3JfcmV0dXJuIGlzIHNldCAqLwotCi0gICBjb25zdCBjaGFyICAgICAgKm9wZXJhdGlvbjsgICAgICAgICAvKiBXaGF0IGlzIGhhcHBlbmluZyAqLwotICAgY29uc3QgY2hhciAgICAgICpmaWxlbmFtZTsgICAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGZpbGUgKi8KLSAgIGNvbnN0IGNoYXIgICAgICAqb3V0cHV0X2ZpbGU7ICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSAqLwotCi0gICAvKiBVc2VkIG9uIGJvdGggcmVhZCBhbmQgd3JpdGU6ICovCi0gICBGSUxFICAgICAgICAgICAgKmZwOwotCi0gICAvKiBVc2VkIG9uIGEgcmVhZCwgYm90aCB0aGUgb3JpZ2luYWwgcmVhZCBhbmQgd2hlbiB2YWxpZGF0aW5nIGEgd3JpdHRlbgotICAgICogaW1hZ2UuCi0gICAgKi8KLSAgIHBuZ19hbGxvY19zaXplX3QgcmVhZF9zaXplOwotICAgcG5nX3N0cnVjdHAgICAgICByZWFkX3BwOwotICAgcG5nX2luZm9wICAgICAgICBpcDsKLSMgIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAgJiYgZGVmaW5lZCBQTkdfVEVYVF9TVVBQT1JURUQKLSAgICAgIHBuZ190ZXh0cCAgICAgdGV4dF9wdHI7IC8qIHN0YXNoIG9mIHRleHQgY2h1bmtzICovCi0gICAgICBpbnQgICAgICAgICAgIG51bV90ZXh0OwotICAgICAgaW50ICAgICAgICAgICB0ZXh0X3N0YXNoZWQ7Ci0jICBlbmRpZiAvKiBwcmUgMS43ICovCi0KLSMgIGlmZGVmIFBOR19QTkdDUF9USU1JTkdfU1VQUE9SVEVECi0gICAgICBzdHJ1Y3QgdGltZXNwZWMgICByZWFkX3RpbWU7Ci0gICAgICBzdHJ1Y3QgdGltZXNwZWMgICByZWFkX3RpbWVfdG90YWw7Ci0gICAgICBzdHJ1Y3QgdGltZXNwZWMgICB3cml0ZV90aW1lOwotICAgICAgc3RydWN0IHRpbWVzcGVjICAgd3JpdGVfdGltZV90b3RhbDsKLSMgIGVuZGlmIC8qIFBOR0NQX1RJTUlORyAqLwotCi0gICAvKiBVc2VkIHRvIHdyaXRlIGEgbmV3IGltYWdlICh0aGUgb3JpZ2luYWwgaW5mb19wdHIgaXMgdXNlZCkgKi8KLSMgIGRlZmluZSBNQVhfU0laRSAoKHBuZ19hbGxvY19zaXplX3QpKC0xKSkKLSAgIHBuZ19hbGxvY19zaXplX3Qgd3JpdGVfc2l6ZTsKLSAgIHBuZ19hbGxvY19zaXplX3QgYmVzdF9zaXplOwotICAgcG5nX3N0cnVjdHAgICAgICB3cml0ZV9wcDsKLQotICAgLyogQmFzZSBmaWxlIGluZm9ybWF0aW9uICovCi0gICBwbmdfYWxsb2Nfc2l6ZV90IHNpemU7Ci0gICBwbmdfdWludF8zMiAgICAgIHc7Ci0gICBwbmdfdWludF8zMiAgICAgIGg7Ci0gICBpbnQgICAgICAgICAgICAgIGJwcDsKLSAgIHBuZ19ieXRlICAgICAgICAgY3Q7Ci0gICBpbnQgICAgICAgICAgICAgIG5vX3dhcm5pbmdzOyAgICAgICAvKiBEbyBub3Qgb3V0cHV0IGxpYnBuZyB3YXJuaW5ncyAqLwotICAgaW50ICAgICAgICAgICAgICBtaW5fd2luZG93Qml0czsgICAgLyogVGhlIHdpbmRvd0JpdHMgcmFuZ2UgaXMgOC4uOCAqLwotCi0gICAvKiBPcHRpb25zIGhhbmRsaW5nICovCi0gICBwbmdfdWludF8zMiAgICAgIHJlc3VsdHM7ICAgICAgICAgICAgIC8qIEEgbWFzayBvZiBlcnJvcnMgc2VlbiAqLwotICAgcG5nX3VpbnRfMzIgICAgICBvcHRpb25zOyAgICAgICAgICAgICAvKiBTZWUgZGlzcGxheV9sb2cgYmVsb3cgKi8KLSAgIHBuZ19ieXRlICAgICAgICAgZW50cnlbb3B0aW9uX2NvdW50XTsgLyogVGhlIHNlbGVjdGVkIGVudHJ5KzEgb2YgYW4gb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgYXBwZWFycyBvbiB0aGUgY29tbWFuZCBsaW5lLCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwIGlmIGl0IHdhcyBub3QgZ2l2ZW4uICovCi0gICBpbnQgICAgICAgICAgICAgIHZhbHVlW29wdGlvbl9jb3VudF07IC8qIENvcnJlc3BvbmRpbmcgdmFsdWUgKi8KLQotICAgLyogQ29tcHJlc3Npb24gZXhoYXVzdGl2ZSB0ZXN0aW5nICovCi0gICAvKiBUZW1wb3JhcnkgdmFyaWFibGVzIHVzZWQgb25seSB3aGlsZSB0ZXN0aW5nIGEgc2luZ2xlIGNvbGxlY3Rpb24gb2YKLSAgICAqIHNldHRpbmdzOgotICAgICovCi0gICB1bnNpZ25lZCBpbnQgICAgIGNzcDsgICAgICAgICAgICAgICAvKiBuZXh0IHN0YWNrIGVudHJ5IHRvIHVzZSAqLwotICAgdW5zaWduZWQgaW50ICAgICBuc3A7ICAgICAgICAgICAgICAgLyogaGlnaGVzdCBhY3RpdmUgZW50cnkrMSBmb3VuZCBzbyBmYXIgKi8KLQotICAgLyogVmFsdWVzIHVzZWQgd2hpbGUgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSBjb21iaW5hdGlvbnMgb2Ygc2V0dGluZ3MgZm9yIGEKLSAgICAqIHNpbmdsZSBmaWxlOgotICAgICovCi0gICB1bnNpZ25lZCBpbnQgICAgIHRzcDsgICAgICAgICAgICAgICAvKiBuc3AgZnJvbSB0aGUgbGFzdCBydW47IHRoaXMgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRleCsxIG9mIHRoZSBoaWdoZXN0IGFjdGl2ZSBlbnRyeSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhpcyBydW47IHRoaXMgZW50cnkgd2lsbCBiZSBhZHZhbmNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgaW50ICAgICAgICAgICAgICBvcHRfc3RyaW5nX3N0YXJ0OyAgLyogUG9zaXRpb24gaW4gYnVmZmVyIGZvciB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlYXJjaGVkIG9wdGlvbjsgbm9uLXplcm8gaWYgZWFybGllcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3B0aW9ucyB3ZXJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICBzdHJ1Y3Qgc3RhY2sKLSAgIHsKLSAgICAgIHBuZ19hbGxvY19zaXplX3QgYmVzdF9zaXplOyAgICAgIC8qIEJlc3Qgc28gZmFyIGZvciB0aGlzIG9wdGlvbiAqLwotICAgICAgcG5nX2FsbG9jX3NpemVfdCBsb19zaXplOwotICAgICAgcG5nX2FsbG9jX3NpemVfdCBoaV9zaXplOwotICAgICAgaW50ICAgICAgICAgICAgICBsbywgaGk7ICAgICAgICAgLyogRm9yIGJpbmFyeSBjaG9wIG9mIGEgcmFuZ2UgKi8KLSAgICAgIGludCAgICAgICAgICAgICAgYmVzdF92YWw7ICAgICAgIC8qIEJlc3QgdmFsdWUgZm91bmQgc28gZmFyICovCi0gICAgICBpbnQgICAgICAgICAgICAgIG9wdF9zdHJpbmdfZW5kOyAvKiBFbmQgb2YgdGhlIG9wdGlvbiBzdHJpbmcgaW4gJ2N1cnInICovCi0gICAgICBwbmdfYnl0ZSAgICAgICAgIG9wdDsgICAgICAgICAgICAvKiBUaGUgb3B0aW9uIGJlaW5nIHRlc3RlZCAqLwotICAgICAgcG5nX2J5dGUgICAgICAgICBlbnRyeTsgICAgICAgICAgLyogVGhlIG5leHQgdmFsdWUgZW50cnkgdG8gYmUgdGVzdGVkICovCi0gICAgICBwbmdfYnl0ZSAgICAgICAgIGVuZDsgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBsYXN0IGVudHJ5ICovCi0gICB9ICAgICAgICAgICAgICAgIHN0YWNrW1NMXTsgICAgICAgICAvKiBTdGFjayBvZiBlbnRyaWVzIGJlaW5nIHRlc3RlZCAqLwotICAgY2hhciAgICAgICAgICAgICBjdXJyWzMyKlNMXTsgICAgICAgLyogY3VycmVudCBvcHRpb25zIGJlaW5nIHRlc3RlZCAqLwotICAgY2hhciAgICAgICAgICAgICBiZXN0WzMyKlNMXTsgICAgICAgLyogYmVzdCBvcHRpb25zICovCi0KLSAgIGNoYXIgICAgICAgICAgICAgbmFtZWJ1ZltGSUxFTkFNRV9NQVhdOyAvKiBvdXRwdXQgZmlsZSBuYW1lICovCi19OwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbml0KHN0cnVjdCBkaXNwbGF5ICpkcCkKLSAgIC8qIENhbGwgdGhpcyBvbmx5IG9uY2UgcmlnaHQgYXQgdGhlIHN0YXJ0IHRvIGluaXRpYWxpemUgdGhlIGNvbnRyb2wKLSAgICAqIHN0cnVjdHVyZSwgdGhlIChzdHJ1Y3QgYnVmZmVyKSBsaXN0cyBhcmUgbWFpbnRhaW5lZCBhY3Jvc3MgY2FsbHMgLSB0aGUKLSAgICAqIG1lbW9yeSBpcyBub3QgZnJlZWQuCi0gICAgKi8KLXsKLSAgIG1lbXNldChkcCwgMCwgc2l6ZW9mICpkcCk7Ci0gICBkcC0+b3BlcmF0aW9uID0gImludGVybmFsIGVycm9yIjsKLSAgIGRwLT5maWxlbmFtZSA9ICJjb21tYW5kIGxpbmUiOwotICAgZHAtPm91dHB1dF9maWxlID0gIm5vIG91dHB1dCBmaWxlIjsKLSAgIGRwLT5vcHRpb25zID0gV0FSTklOR1M7IC8qIGRlZmF1bHQgdG8gIXZlcmJvc2UsICFxdWlldCAqLwotICAgZHAtPmZwID0gTlVMTDsKLSAgIGRwLT5yZWFkX3BwID0gTlVMTDsKLSAgIGRwLT5pcCA9IE5VTEw7Ci0gICBkcC0+d3JpdGVfcHAgPSBOVUxMOwotICAgZHAtPm1pbl93aW5kb3dCaXRzID0gLTE7IC8qIHRoaXMgaXMgYW4gT1BUSU5ELCBzbyAtMSB3b24ndCBtYXRjaCBhbnl0aGluZyAqLwotIyAgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMCAmJiBkZWZpbmVkIFBOR19URVhUX1NVUFBPUlRFRAotICAgICAgZHAtPnRleHRfcHRyID0gTlVMTDsKLSAgICAgIGRwLT5udW1fdGV4dCA9IDA7Ci0gICAgICBkcC0+dGV4dF9zdGFzaGVkID0gMDsKLSMgIGVuZGlmIC8qIHByZSAxLjcgKi8KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfY2xlYW5fcmVhZChzdHJ1Y3QgZGlzcGxheSAqZHApCi17Ci0gICBpZiAoZHAtPnJlYWRfcHAgIT0gTlVMTCkKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZkcC0+cmVhZF9wcCwgTlVMTCwgTlVMTCk7Ci0KLSAgIGlmIChkcC0+ZnAgIT0gTlVMTCkKLSAgIHsKLSAgICAgIEZJTEUgKmZwID0gZHAtPmZwOwotICAgICAgZHAtPmZwID0gTlVMTDsKLSAgICAgICh2b2lkKWZjbG9zZShmcCk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2NsZWFuX3dyaXRlKHN0cnVjdCBkaXNwbGF5ICpkcCkKLXsKLSAgIGlmIChkcC0+ZnAgIT0gTlVMTCkKLSAgIHsKLSAgICAgIEZJTEUgKmZwID0gZHAtPmZwOwotICAgICAgZHAtPmZwID0gTlVMTDsKLSAgICAgICh2b2lkKWZjbG9zZShmcCk7Ci0gICB9Ci0KLSAgIGlmIChkcC0+d3JpdGVfcHAgIT0gTlVMTCkKLSAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmZHAtPndyaXRlX3BwLCBkcC0+dHNwID4gMCA/IE5VTEwgOiAmZHAtPmlwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfY2xlYW4oc3RydWN0IGRpc3BsYXkgKmRwKQotewotICAgZGlzcGxheV9jbGVhbl9yZWFkKGRwKTsKLSAgIGRpc3BsYXlfY2xlYW5fd3JpdGUoZHApOwotICAgZHAtPm91dHB1dF9maWxlID0gTlVMTDsKLQotIyAgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMCAmJiBkZWZpbmVkIFBOR19URVhUX1NVUFBPUlRFRAotICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBjcmVhdGVkIGFuZCB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlLCBidXQgb25seQotICAgICAgICogb25jZTsgaXQgaGFzIHRvIGJlIHJldGFpbmVkIGZvciBzdWJzZXF1ZW50IHdyaXRlcyBvZiB0aGUgc2FtZSBmaWxlLgotICAgICAgICovCi0gICAgICBpZiAoZHAtPnRleHRfc3Rhc2hlZCkKLSAgICAgIHsKLSAgICAgICAgIGRwLT50ZXh0X3N0YXNoZWQgPSAwOwotICAgICAgICAgZHAtPm51bV90ZXh0ID0gMDsKLSAgICAgICAgIGZyZWUoZHAtPnRleHRfcHRyKTsKLSAgICAgICAgIGRwLT50ZXh0X3B0ciA9IE5VTEw7Ci0gICAgICB9Ci0jICBlbmRpZiAvKiBwcmUgMS43ICovCi0KLSAgIC8qIGxlYXZlIHRoZSBmaWxlbmFtZSBmb3IgZXJyb3IgZGV0ZWN0aW9uICovCi0gICBkcC0+cmVzdWx0cyA9IDA7IC8qIHJlc2V0IGZvciBuZXh0IHRpbWUgKi8KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZGlzcGxheSAqZHApCi17Ci0gICAvKiBSZWxlYXNlIGFueSBtZW1vcnkgaGVsZCBpbiB0aGUgZGlzcGxheS4gKi8KLSAgIGRpc3BsYXlfY2xlYW4oZHApOwotfQotCi1zdGF0aWMgc3RydWN0IGRpc3BsYXkgKgotZ2V0X2RwKHBuZ19zdHJ1Y3RwIHBwKQotICAgLyogVGhlIGRpc3BsYXkgcG9pbnRlciBpcyBhbHdheXMgc3RvcmVkIGluIHRoZSBwbmdfc3RydWN0IGVycm9yIHBvaW50ZXIgKi8KLXsKLSAgIHN0cnVjdCBkaXNwbGF5ICpkcCA9IChzdHJ1Y3QgZGlzcGxheSopcG5nX2dldF9lcnJvcl9wdHIocHApOwotCi0gICBpZiAoZHAgPT0gTlVMTCkKLSAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAicG5nY3A6IGludGVybmFsIGVycm9yIChubyBkaXNwbGF5KVxuIik7Ci0gICAgICBleGl0KDk5KTsgLyogcHJldmVudHMgYSBjcmFzaCAqLwotICAgfQotCi0gICByZXR1cm4gZHA7Ci19Ci0KLS8qIGVycm9yIGhhbmRsaW5nICovCi0jaWZkZWYgX19HTlVDX18KLSMgIGRlZmluZSBWR0FUVFIgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyAoX19wcmludGZfXywzLDQpKSkKLSAgIC8qIFJlcXVpcmVkIHRvIHF1aWV0IEdOVUMgd2FybmluZ3Mgd2hlbiB0aGUgY29tcGlsZXIgc2VlcyBhIHN0ZGFyZyBmdW5jdGlvbgotICAgICogdGhhdCBjYWxscyBvbmUgb2YgdGhlIHN0ZGlvIHYgQVBJcy4KLSAgICAqLwotI2Vsc2UKLSMgIGRlZmluZSBWR0FUVFIKLSNlbmRpZgotc3RhdGljIHZvaWQgVkdBVFRSCi1kaXNwbGF5X2xvZyhzdHJ1Y3QgZGlzcGxheSAqZHAsIGVycm9yX2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgIC8qICdsZXZlbCcgaXMgYXMgYWJvdmUsIGZtdCBpcyBhIHN0ZGlvIHN0eWxlIGZvcm1hdCBzdHJpbmcuICBUaGlzIHJvdXRpbmUKLSAgICAqIGRvZXMgbm90IHJldHVybiBpZiBsZXZlbCBpcyBhYm92ZSBMSUJQTkdfV0FSTklORwotICAgICovCi17Ci0gICBkcC0+cmVzdWx0cyB8PSAxVSA8PCBsZXZlbDsKLQotICAgaWYgKGxldmVsID4gKGVycm9yX2xldmVsKShkcC0+b3B0aW9ucyAmIExFVkVMX01BU0spKQotICAgewotICAgICAgY29uc3QgY2hhciAqbHA7Ci0gICAgICB2YV9saXN0IGFwOwotCi0gICAgICBzd2l0Y2ggKGxldmVsKQotICAgICAgewotICAgICAgICAgY2FzZSBJTkZPUk1BVElPTjogICAgbHAgPSAiaW5mb3JtYXRpb24iOyBicmVhazsKLSAgICAgICAgIGNhc2UgTElCUE5HX1dBUk5JTkc6IGxwID0gIndhcm5pbmcobGlicG5nKSI7IGJyZWFrOwotICAgICAgICAgY2FzZSBBUFBfV0FSTklORzogICAgbHAgPSAid2FybmluZyhwbmdjcCkiOyBicmVhazsKLSAgICAgICAgIGNhc2UgQVBQX0ZBSUw6ICAgICAgIGxwID0gImVycm9yKGNvbnRpbnVhYmxlKSI7IGJyZWFrOwotICAgICAgICAgY2FzZSBMSUJQTkdfRVJST1I6ICAgbHAgPSAiZXJyb3IobGlicG5nKSI7IGJyZWFrOwotICAgICAgICAgY2FzZSBMSUJQTkdfQlVHOiAgICAgbHAgPSAiYnVnKGxpYnBuZykiOyBicmVhazsKLSAgICAgICAgIGNhc2UgQVBQX0VSUk9SOiAgICAgIGxwID0gImVycm9yKHBuZ2NwKSI7IGJyZWFrOwotICAgICAgICAgY2FzZSBVU0VSX0VSUk9SOiAgICAgbHAgPSAiZXJyb3IodXNlcikiOyBicmVhazsKLQotICAgICAgICAgY2FzZSBJTlRFUk5BTF9FUlJPUjogLyogYW55dGhpbmcgdW5leHBlY3RlZCBpcyBhbiBpbnRlcm5hbCBlcnJvcjogKi8KLSAgICAgICAgIGNhc2UgVkVSQk9TRTogY2FzZSBXQVJOSU5HUzogY2FzZSBFUlJPUlM6IGNhc2UgUVVJRVQ6Ci0gICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICBscCA9ICJidWcocG5nY3ApIjsgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiAlcyIsCi0gICAgICAgICBkcC0+ZmlsZW5hbWUgIT0gTlVMTCA/IGRwLT5maWxlbmFtZSA6ICI8c3RkaW4+IiwgbHAsIGRwLT5vcGVyYXRpb24pOwotCi0gICAgICBmcHJpbnRmKHN0ZGVyciwgIjogIik7Ci0KLSAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKLSAgICAgIHZhX2VuZChhcCk7Ci0KLSAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7Ci0gICB9Ci0gICAvKiBlbHNlIGRvIG5vdCBvdXRwdXQgYW55IG1lc3NhZ2UgKi8KLQotICAgLyogRXJyb3JzIGNhdXNlIHRoaXMgcm91dGluZSB0byBleGl0IHRvIHRoZSBmYWlsIGNvZGUgKi8KLSAgIGlmIChsZXZlbCA+IEFQUF9GQUlMIHx8IChsZXZlbCA+IEVSUk9SUyAmJiAhKGRwLT5vcHRpb25zICYgQ09OVElOVUUpKSkKLSAgIHsKLSAgICAgIGlmIChkcC0+ZXJyc2V0KQotICAgICAgICAgbG9uZ2ptcChkcC0+ZXJyb3JfcmV0dXJuLCBsZXZlbCk7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIGV4aXQoOTkpOwotICAgfQotfQotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMCAmJiBkZWZpbmVkIFBOR19URVhUX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLXRleHRfc3Rhc2goc3RydWN0IGRpc3BsYXkgKmRwKQotewotICAgLyogbGlicG5nIDEuNiBhbmQgZWFybGllciBmaXhlZCBhIGJ1ZyB3aGVyZWJ5IHRleHQgY2h1bmtzIHdlcmUgd3JpdHRlbgotICAgICogbXVsdGlwbGUgdGltZXMgYnkgcG5nX3dyaXRlX3BuZzsgdGhlIGlzc3VlIHdhcyB0aGF0IHBuZ193cml0ZV9wbmcgcGFzc2VkCi0gICAgKiB0aGUgc2FtZSBwbmdfaW5mbyB0byBib3RoIHBuZ193cml0ZV9pbmZvIGFuZCBwbmdfd3JpdGVfZW5kLiAgUmF0aGVyIHRoYW4KLSAgICAqIGZpeGluZyBpdCBieSByZWNvcmRpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBwbmdfc3RydWN0LCBvciBieSByZWNvcmRpbmcKLSAgICAqIHdoZXJlIHRvIHdyaXRlIHRoZSBjaHVua3MsIHRoZSBmaXggbWFkZSB3YXMgdG8gY2hhbmdlIHRoZSAnY29tcHJlc3Npb24nCi0gICAgKiBmaWVsZCBvZiB0aGUgY2h1bmsgdG8gaW52YWxpZCB2YWx1ZXMsIHJlbmRlcmluZyB0aGUgcG5nX2luZm8gc29tZXdoYXQKLSAgICAqIHVzZWxlc3MuCi0gICAgKgotICAgICogVGhlIG9ubHkgZml4IGZvciB0aGlzIGdpdmVuIHRoYXQgd2UgdXNlIHRoZSBwbmdfaW5mbyBtb3JlIHRoYW4gb25jZSBpcyB0bwotICAgICogbWFrZSBhIGNvcHkgb2YgdGhlIHRleHQgY2h1bmtzIGFuZCBwbmdfc2V0X3RleHQgaXQgZWFjaCB0aW1lLiAgVGhpcyBhZGRzIGEKLSAgICAqIHRleHQgY2h1bmtzLCBzbyB0aGV5IGdldCByZXBsaWNhdGVkLCBidXQgb25seSB0aGUgbmV3IHNldCBnZXRzIHdyaXR0ZW4KLSAgICAqIGVhY2ggdGltZS4gIFRoaXMgdXNlcyBtZW1vcnkgbGlrZSBjcmF6eSBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGRlbGV0ZSB0aGUKLSAgICAqIHVzZWxlc3MgY2h1bmtzIGZyb20gdGhlIHBuZ19pbmZvLgotICAgICoKLSAgICAqIFRvIG1ha2UgdGhpcyBzbGlnaHRseSBtb3JlIGVmZmljaWVudCBvbmx5IHRoZSB0b3AgbGV2ZWwgc3RydWN0dXJlIGlzCi0gICAgKiBjb3BpZWQ7IHNpbmNlIHRoZSBvbGQgc3RyaW5ncyBhcmUgYWN0dWFsbHkgcHJlc2VydmVkIChpbiAxLjYgYW5kIGVhcmxpZXIpCi0gICAgKiB0aGlzIGhhcHBlbnMgdG8gd29yay4KLSAgICAqLwotICAgcG5nX3RleHRwIGNodW5rcyA9IE5VTEw7Ci0KLSAgIGRwLT5udW1fdGV4dCA9IHBuZ19nZXRfdGV4dChkcC0+d3JpdGVfcHAsIGRwLT5pcCwgJmNodW5rcywgTlVMTCk7Ci0KLSAgIGlmIChkcC0+bnVtX3RleHQgPiAwKQotICAgewotICAgICAgZHAtPnRleHRfcHRyID0gdm9pZGNhc3QocG5nX3RleHRwLCBtYWxsb2MoZHAtPm51bV90ZXh0ICogc2l6ZW9mICpjaHVua3MpKTsKLQotICAgICAgaWYgKGRwLT50ZXh0X3B0ciA9PSBOVUxMKQotICAgICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9FUlJPUiwgInRleHQgY2h1bmtzOiBzdGFzaCBtYWxsb2MgZmFpbGVkIik7Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgIG1lbWNweShkcC0+dGV4dF9wdHIsIGNodW5rcywgZHAtPm51bV90ZXh0ICogc2l6ZW9mICpjaHVua3MpOwotICAgfQotCi0gICBkcC0+dGV4dF9zdGFzaGVkID0gMTsgLyogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGFyZSBjaHVua3Mgb3Igbm90ICovCi19Ci0KLSNkZWZpbmUgdGV4dF9zdGFzaChkcCkgaWYgKCFkcC0+dGV4dF9zdGFzaGVkKSB0ZXh0X3N0YXNoKGRwKQotCi1zdGF0aWMgdm9pZAotdGV4dF9yZXN0b3JlKHN0cnVjdCBkaXNwbGF5ICpkcCkKLXsKLSAgIC8qIGxpYnBuZyBtYWtlcyBhIGNvcHksIHNvIHRoaXMgaXMgZmluZTogKi8KLSAgIGlmIChkcC0+dGV4dF9wdHIgIT0gTlVMTCkKLSAgICAgIHBuZ19zZXRfdGV4dChkcC0+d3JpdGVfcHAsIGRwLT5pcCwgZHAtPnRleHRfcHRyLCBkcC0+bnVtX3RleHQpOwotfQotCi0jZGVmaW5lIHRleHRfcmVzdG9yZShkcCkgaWYgKGRwLT50ZXh0X3N0YXNoZWQpIHRleHRfcmVzdG9yZShkcCkKLQotI2Vsc2UKLSNkZWZpbmUgdGV4dF9zdGFzaChkcCkgKCh2b2lkKTApCi0jZGVmaW5lIHRleHRfcmVzdG9yZShkcCkgKCh2b2lkKTApCi0jZW5kaWYgLyogcHJlIDEuNyAqLwotCi0vKiBPUFRJT05TOgotICoKLSAqIFRoZSBjb21tYW5kIGhhbmRsZXMgb3B0aW9ucyBvZiB0aGUgZm9ybXM6Ci0gKgotICogICAgLS1vcHRpb24KLSAqICAgICAgIFR1cm4gYW4gb3B0aW9uIG9uIChPcHRpb24pCi0gKiAgICAtLW5vLW9wdGlvbgotICogICAgICAgVHVybiBhbiBvcHRpb24gb2ZmIChPcHRpb24pCi0gKiAgICAtLW9wdGlvbj12YWx1ZQotICogICAgICAgU2V0IGFuIG9wdGlvbiB0byBhIHZhbHVlIChWYWx1ZSkKLSAqICAgIC0tb3B0aW9uPXZhbDEsdmFsMix2YWwzCi0gKiAgICAgICBTZXQgYW4gb3B0aW9uIHRvIGEgYml0bWFzayBjb25zdHJ1Y3RlZCBmcm9tIHRoZSB2YWx1ZXMgKExpc3QpCi0gKi8KLXN0YXRpYyBwbmdfYnl0ZQotb3B0aW9uX2luZGV4KHN0cnVjdCBkaXNwbGF5ICpkcCwgY29uc3QgY2hhciAqb3B0LCBzaXplX3QgbGVuKQotICAgLyogUmV0dXJuIHRoZSBpbmRleCAoaW4gb3B0aW9uc1tdKSBvZiB0aGUgZ2l2ZW4gb3B0aW9uLCBvdXRwdXRzIGFuIGVycm9yIGlmCi0gICAgKiBpdCBkb2VzIG5vdCBleGlzdC4gIFRha2VzIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYW5kIGEgbGVuZ3RoIChudW1iZXIgb2YKLSAgICAqIGNoYXJhY3RlcnMgaW4gdGhlIG5hbWUpLgotICAgICovCi17Ci0gICBwbmdfYnl0ZSBqOwotCi0gICBmb3IgKGo9MDsgajxvcHRpb25fY291bnQ7ICsraikKLSAgICAgIGlmIChzdHJuY21wKG9wdGlvbnNbal0ubmFtZSwgb3B0LCBsZW4pID09IDAgJiYgb3B0aW9uc1tqXS5uYW1lW2xlbl0gPT0gMCkKLSAgICAgICAgIHJldHVybiBqOwotCi0gICAvKiBJZiB0aGUgc2V0am1wIGJ1ZmZlciBpcyBzZXQgdGhlIGNvZGUgaXMgYXNraW5nIGZvciBhbiBvcHRpb24gaW5kZXg7IHRoaXMKLSAgICAqIGlzIGJhZC4gIE90aGVyd2lzZSB0aGlzIGlzIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcuCi0gICAgKi8KLSAgIGRpc3BsYXlfbG9nKGRwLCBkcC0+ZXJyc2V0ID8gSU5URVJOQUxfRVJST1IgOiBVU0VSX0VSUk9SLAotICAgICAgICAgIiUuKnM6IHVua25vd24gb3B0aW9uIiwgKGludCkvKlNBRkUqL2xlbiwgb3B0KTsKLSAgIGFib3J0KCk7IC8qIE5PVCBSRUFDSEVEICovCi19Ci0KLS8qIFRoaXMgd29ya3MgZm9yIGFuIG9wdGlvbiBuYW1lIChubyBxdW90ZXMpOiAqLwotI2RlZmluZSBPUFRJTkQoZHAsIG5hbWUpIG9wdGlvbl9pbmRleChkcCwgI25hbWUsIChzaXplb2YgI25hbWUpLTEpCi0KLXN0YXRpYyBpbnQKLWdldF9vcHRpb24oc3RydWN0IGRpc3BsYXkgKmRwLCBjb25zdCBjaGFyICpvcHQsIGludCAqdmFsdWUpCi17Ci0gICBjb25zdCBwbmdfYnl0ZSBpID0gb3B0aW9uX2luZGV4KGRwLCBvcHQsIHN0cmxlbihvcHQpKTsKLQotICAgaWYgKGRwLT5lbnRyeVtpXSkgLyogb3B0aW9uIHdhcyBzZXQgb24gY29tbWFuZCBsaW5lICovCi0gICB7Ci0gICAgICAqdmFsdWUgPSBkcC0+dmFsdWVbaV07Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXNldF9vcHRfc3RyaW5nXyhzdHJ1Y3QgZGlzcGxheSAqZHAsIHVuc2lnbmVkIGludCBzcCwgcG5nX2J5dGUgb3B0LAotICAgICAgY29uc3QgY2hhciAqZW50cnlfbmFtZSkKLSAgIC8qIEFkZCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uIHN0cmluZyB0byBkcC0+Y3Vyci4gKi8KLXsKLSAgIGludCBvZmZzZXQsIGFkZDsKLQotICAgaWYgKHNwID4gMCkKLSAgICAgIG9mZnNldCA9IGRwLT5zdGFja1tzcC0xXS5vcHRfc3RyaW5nX2VuZDsKLQotICAgZWxzZQotICAgICAgb2Zmc2V0ID0gZHAtPm9wdF9zdHJpbmdfc3RhcnQ7Ci0KLSAgIGlmIChlbnRyeV9uYW1lID09IHJhbmdlX2xvKQotICAgICAgYWRkID0gc3ByaW50ZihkcC0+Y3VycitvZmZzZXQsICIgLS0lcz0lZCIsIG9wdGlvbnNbb3B0XS5uYW1lLAotICAgICAgICAgICAgZHAtPnZhbHVlW29wdF0pOwotCi0gICBlbHNlCi0gICAgICBhZGQgPSBzcHJpbnRmKGRwLT5jdXJyK29mZnNldCwgIiAtLSVzPSVzIiwgb3B0aW9uc1tvcHRdLm5hbWUsIGVudHJ5X25hbWUpOwotCi0gICBpZiAoYWRkIDwgMCkKLSAgICAgIGRpc3BsYXlfbG9nKGRwLCBJTlRFUk5BTF9FUlJPUiwgInNwcmludGYgZmFpbGVkIik7Ci0KLSAgIGFzc2VydChvZmZzZXQrYWRkIDwgKGludCkvKlNBRkUqL3NpemVvZiBkcC0+Y3Vycik7Ci0gICByZXR1cm4gb2Zmc2V0K2FkZDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9vcHRfc3RyaW5nKHN0cnVjdCBkaXNwbGF5ICpkcCwgdW5zaWduZWQgaW50IHNwKQotICAgLyogQWRkIHRoZSBhcHByb3ByaWF0ZSBvcHRpb24gc3RyaW5nIHRvIGRwLT5jdXJyLiAqLwotewotICAgZHAtPnN0YWNrW3NwXS5vcHRfc3RyaW5nX2VuZCA9IHNldF9vcHRfc3RyaW5nXyhkcCwgc3AsIGRwLT5zdGFja1tzcF0ub3B0LCAKLSAgICAgIG9wdGlvbnNbZHAtPnN0YWNrW3NwXS5vcHRdLnZhbHVlc1tkcC0+c3RhY2tbc3BdLmVudHJ5XS5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF9vcHQoc3RydWN0IGRpc3BsYXkgKmRwLCBwbmdfYnl0ZSBvcHQsIGNvbnN0IGNoYXIgKmVudHJ5X25hbWUpCi0gICAvKiBSZWNvcmQgdGhpcyBvcHRpb24gaW4gZHAtPmN1cnI7IGNhbGxlZCBmb3IgYW4gb3B0aW9uIG5vdCBiZWluZyBzZWFyY2hlZCwKLSAgICAqIHRoZSBjYWxsZXIgcGFzc2VzIGluIHRoZSBuYW1lIG9mIHRoZSB2YWx1ZSwgb3IgcmFuZ2VfbG8gdG8gdXNlIHRoZQotICAgICogbnVtZXJpY2FsIHZhbHVlLgotICAgICovCi17Ci0gICBjb25zdCB1bnNpZ25lZCBpbnQgc3AgPSBkcC0+Y3NwOyAvKiBzdGFjayBlbnRyeSBvZiBuZXh0IHNlYXJjaGVkIG9wdGlvbiAqLwotCi0gICBpZiAoc3AgPj0gZHAtPnRzcCkKLSAgIHsKLSAgICAgIC8qIEF0IHRvcCBvZiBzdGFjazsgYWRkIHRoZSBvcHQgc3RyaW5nIGZvciB0aGlzIGVudHJ5IHRvIHRoZSBwcmV2aW91cwotICAgICAgICogc2VhcmNoZWQgZW50cnkgb3IgdGhlIHN0YXJ0IG9mIHRoZSBkcC0+Y3VyciBidWZmZXIgaWYgdGhlcmUgaXMgbm90aGluZwotICAgICAgICogb24gdGhlIHN0YWNrIHlldCAoc3AgPT0gMCkuCi0gICAgICAgKi8KLSAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBzZXRfb3B0X3N0cmluZ18oZHAsIHNwLCBvcHQsIGVudHJ5X25hbWUpOwotCi0gICAgICBpZiAoc3AgPiAwKQotICAgICAgICAgZHAtPnN0YWNrW3NwLTFdLm9wdF9zdHJpbmdfZW5kID0gb2Zmc2V0OwotCi0gICAgICBlbHNlCi0gICAgICAgICBkcC0+b3B0X3N0cmluZ19zdGFydCA9IG9mZnNldDsKLSAgIH0KLQotICAgLyogZWxzZSBkbyBub3RoaW5nOiBvcHRpb24gYWxyZWFkeSByZWNvcmRlZCAqLwotfQotCi1zdGF0aWMgaW50Ci1vcHRfbGlzdF9lbmQoc3RydWN0IGRpc3BsYXkgKmRwLCBwbmdfYnl0ZSBvcHQsIHBuZ19ieXRlIGVudHJ5KQotewotICAgaWYgKG9wdGlvbnNbb3B0XS52YWx1ZXNbZW50cnldLm5hbWUgPT0gcmFuZ2VfbG8pCi0gICAgICByZXR1cm4gZW50cnkrMVUgPj0gb3B0aW9uc1tvcHRdLnZhbHVlX2NvdW50IC8qIG1pc3NpbmcgcmFuZ2VfaGkgKi8gfHwKLSAgICAgICAgIG9wdGlvbnNbb3B0XS52YWx1ZXNbZW50cnkrMVVdLm5hbWUgIT0gcmFuZ2VfaGkgLyogbGlrZXdpc2UgKi8gfHwKLSAgICAgICAgIG9wdGlvbnNbb3B0XS52YWx1ZXNbZW50cnkrMVVdLnZhbHVlIDw9IGRwLT52YWx1ZVtvcHRdIC8qIHJhbmdlIGVuZCAqLzsKLQotICAgZWxzZQotICAgICAgcmV0dXJuIGVudHJ5KzFVID49IG9wdGlvbnNbb3B0XS52YWx1ZV9jb3VudCAvKiBtaXNzaW5nICdhbGwnICovIHx8Ci0gICAgICAgICBvcHRpb25zW29wdF0udmFsdWVzW2VudHJ5KzFVXS5uYW1lID09IGFsbCAvKiBsYXN0IGVudHJ5ICovOwotfQotCi1zdGF0aWMgdm9pZAotcHVzaF9vcHQoc3RydWN0IGRpc3BsYXkgKmRwLCB1bnNpZ25lZCBpbnQgc3AsIHBuZ19ieXRlIG9wdCwgaW50IHNlYXJjaCkKLSAgIC8qIFB1c2ggYSBuZXcgb3B0aW9uIG9udG8gdGhlIHN0YWNrLCBpbml0aWFsaXppbmcgdGhlIG5ldyBzdGFjayBlbnRyeQotICAgICogYXBwcm9wcmlhdGVseTsgdGhpcyBkb2VzIGFsbCB0aGUgd29yayBvZiBuZXh0X29wdCAoc2V0dGluZyBlbmQvbnNwKSBmb3IKLSAgICAqIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbGlzdC4KLSAgICAqLwotewotICAgcG5nX2J5dGUgZW50cnk7Ci0gICBjb25zdCBjaGFyICplbnRyeV9uYW1lOwotCi0gICBhc3NlcnQoc3AgPT0gZHAtPnRzcCAmJiBzcCA8IFNMKTsKLQotICAgLyogVGhlIHN0YXJ0aW5nIGVudHJ5IGlzIGVudHJ5IDAgdW5sZXNzIHRoZXJlIGlzIGEgcmFuZ2UgaW4gd2hpY2ggY2FzZSBpdCBpcwotICAgICogdGhlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gcmFuZ2VfbG86Ci0gICAgKi8KLSAgIGVudHJ5ID0gb3B0aW9uc1tvcHRdLnZhbHVlX2NvdW50OwotICAgYXNzZXJ0KGVudHJ5ID4gMFUpOwotCi0gICBkbwotICAgewotICAgICAgZW50cnlfbmFtZSA9IG9wdGlvbnNbb3B0XS52YWx1ZXNbLS1lbnRyeV0ubmFtZTsKLSAgICAgIGlmIChlbnRyeV9uYW1lID09IHJhbmdlX2xvKQotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICB3aGlsZSAoZW50cnkgPiAwVSk7Ci0KLSAgIGRwLT50c3AgPSBzcCsxVTsKLSAgIGRwLT5zdGFja1tzcF0uYmVzdF9zaXplID0KLSAgICAgIGRwLT5zdGFja1tzcF0ubG9fc2l6ZSA9Ci0gICAgICBkcC0+c3RhY2tbc3BdLmhpX3NpemUgPSBNQVhfU0laRTsKLQotICAgaWYgKHNlYXJjaCAmJiBlbnRyeV9uYW1lID09IHJhbmdlX2xvKSAvKiBzZWFyY2ggdGhpcyByYW5nZSAqLwotICAgewotICAgICAgZHAtPnN0YWNrW3NwXS5sbyA9IG9wdGlvbnNbb3B0XS52YWx1ZXNbZW50cnldLnZhbHVlOwotICAgICAgLyogY2hlY2sgZm9yIGEgbWFsLWZvcm1lZCBSQU5HRSBhYm92ZTogKi8KLSAgICAgIGFzc2VydChlbnRyeSsxIDwgb3B0aW9uc1tvcHRdLnZhbHVlX2NvdW50ICYmCi0gICAgICAgICAgICAgb3B0aW9uc1tvcHRdLnZhbHVlc1tlbnRyeSsxXS5uYW1lID09IHJhbmdlX2hpKTsKLSAgICAgIGRwLT5zdGFja1tzcF0uaGkgPSBvcHRpb25zW29wdF0udmFsdWVzW2VudHJ5KzFdLnZhbHVlOwotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICAvKiBuZXh0X29wdCB3aWxsIGp1c3QgaXRlcmF0ZSBvdmVyIHRoZSByYW5nZS4gKi8KLSAgICAgIGRwLT5zdGFja1tzcF0ubG8gPSBJTlRfTUFYOwotICAgICAgZHAtPnN0YWNrW3NwXS5oaSA9IElOVF9NSU47IC8qIFByZXZlbnQgcmFuZ2UgY2hvcCAqLwotICAgfQotCi0gICBkcC0+c3RhY2tbc3BdLm9wdCA9IG9wdDsKLSAgIGRwLT5zdGFja1tzcF0uZW50cnkgPSBlbnRyeTsKLSAgIGRwLT5zdGFja1tzcF0uYmVzdF92YWwgPSBkcC0+dmFsdWVbb3B0XSA9IG9wdGlvbnNbb3B0XS52YWx1ZXNbZW50cnldLnZhbHVlOwotCi0gICBzZXRfb3B0X3N0cmluZyhkcCwgc3ApOwotCi0gICAvKiBUaGlzIHdvcmtzIGZvciB0aGUgc2VhcmNoIGNhc2UgdG9vOyBpZiB0aGUgcmFuZ2UgaGFzIG9ubHkgb25lIGVudHJ5ICdlbmQnCi0gICAgKiB3aWxsIGJlIG1hcmtlZCBoZXJlLgotICAgICovCi0gICBpZiAob3B0X2xpc3RfZW5kKGRwLCBvcHQsIGVudHJ5KSkKLSAgIHsKLSAgICAgIGRwLT5zdGFja1tzcF0uZW5kID0gMTsKLSAgICAgIC8qIFNraXAgdGhlIHdhcm5pbmcgaWYgcG5nY3AgZGlkIHRoaXMgaXRzZWxmLiAgU2VlIHRoZSBjb2RlIGluCi0gICAgICAgKiBzZXRfd2luZG93Qml0c19oaS4KLSAgICAgICAqLwotICAgICAgaWYgKG9wdCAhPSBkcC0+bWluX3dpbmRvd0JpdHMpCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgQVBQX1dBUk5JTkcsICIlczogb25seSB0ZXN0aW5nIG9uZSB2YWx1ZSIsCi0gICAgICAgICAgICAgICBvcHRpb25zW29wdF0ubmFtZSk7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGRwLT5zdGFja1tzcF0uZW5kID0gMDsKLSAgICAgIGRwLT5uc3AgPSBkcC0+dHNwOwotICAgfQotCi0gICAvKiBEbyBhIGxhenkgY2FjaGUgb2YgdGhlIHRleHQgY2h1bmtzIGZvciBsaWJwbmcgMS42IGFuZCBlYXJsaWVyOyB0aGlzIGlzCi0gICAgKiBiZWNhdXNlIHRoZXkgY2FuIG9ubHkgYmUgd3JpdHRlbiBvbmNlKCEpIHNvIGlmIHdlIGFyZSBnb2luZyB0byByZS11c2UgdGhlCi0gICAgKiBwbmdfaW5mbyB3ZSBuZWVkIGEgY29weS4KLSAgICAqLwotICAgdGV4dF9zdGFzaChkcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uZXh0X29wdChzdHJ1Y3QgZGlzcGxheSAqZHAsIHVuc2lnbmVkIGludCBzcCkKLSAgIC8qIFJldHVybiB0aGUgbmV4dCB2YWx1ZSBmb3IgdGhpcyBvcHRpb24uICBXaGVuIGNhbGxlZCAnc3AnIGlzIGV4cGVjdGVkIHRvIGJlCi0gICAgKiB0aGUgdG9wbW9zdCBzdGFjayBlbnRyeSAtIG9ubHkgdGhlIHRvcG1vc3QgZW50cnkgY2hhbmdlcyBlYWNoIHRpbWUgcm91bmQgLQotICAgICogYW5kIHRoZXJlIG11c3QgYmUgYSB2YWxpZCBlbnRyeSB0byByZXR1cm4uICBuZXh0X29wdCB3aWxsIHNldCBkcC0+bnNwIHRvCi0gICAgKiBzcCsxIGlmIG1vcmUgZW50cmllcyBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgaXQgd2lsbCBub3QgY2hhbmdlIGl0IGFuZAotICAgICogc2V0IGRwLT5zdGFja1tzXS5lbmQgdG8gdHJ1ZS4KLSAgICAqLwotewotICAgaW50IHNlYXJjaCA9IDA7Ci0gICBwbmdfYnl0ZSBlbnRyeSwgb3B0OwotICAgY29uc3QgY2hhciAqZW50cnlfbmFtZTsKLQotICAgLyogZHAtPnN0YWNrW3NwXSBtdXN0IGJlIHRoZSB0b3Agc3RhY2sgZW50cnkgYW5kIGl0IG11c3QgYmUgYWN0aXZlOiAqLwotICAgYXNzZXJ0KHNwKzFVID09IGRwLT50c3AgJiYgIWRwLT5zdGFja1tzcF0uZW5kKTsKLQotICAgb3B0ID0gZHAtPnN0YWNrW3NwXS5vcHQ7Ci0gICBlbnRyeSA9IGRwLT5zdGFja1tzcF0uZW50cnk7Ci0gICBhc3NlcnQoZW50cnkrMVUgPCBvcHRpb25zW29wdF0udmFsdWVfY291bnQpOwotICAgZW50cnlfbmFtZSA9IG9wdGlvbnNbb3B0XS52YWx1ZXNbZW50cnldLm5hbWU7Ci0gICBhc3NlcnQoZW50cnlfbmFtZSAhPSBOVUxMKTsKLQotICAgLyogRm9yIHJhbmdlcyBpbmNyZW1lbnQgdGhlIHZhbHVlIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIGVudHJ5LCBmb3IgYWxsIG90aGVyCi0gICAgKiBjYXNlcyBtb3ZlIHRvIHRoZSBuZXh0IGVudHJ5IGFuZCBsb2FkIGl0cyB2YWx1ZToKLSAgICAqLwotICAgaWYgKGVudHJ5X25hbWUgPT0gcmFuZ2VfbG8pIC8qIGEgcmFuZ2UgKi8KLSAgIHsKLSAgICAgIC8qIEEgcmFuZ2UgY2FuIGJlIGl0ZXJhdGVkIG92ZXIgb3Igc2VhcmNoZWQuICBUaGUgZGVmYXVsdCBpdGVyYXRpb24gb3B0aW9uCi0gICAgICAgKiBpcyBpbmRpY2F0ZWQgYnkgaGkgPCBsbyBvbiB0aGUgc3RhY2ssIG90aGVyd2lzZSB0aGUgcmFuZ2UgYmVpbmcgc2VhcmNoCi0gICAgICAgKiBpcyBbbG8uLmhpXSAoaW5jbHVzaXZlKS4KLSAgICAgICAqLwotICAgICAgaWYgKGRwLT5zdGFja1tzcF0ubG8gPiBkcC0+c3RhY2tbc3BdLmhpKQotICAgICAgICAgZHAtPnZhbHVlW29wdF0rKzsKLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLyogVGhpcyBpcyB0aGUgYmVzdCBzaXplIGZvdW5kIGZvciB0aGlzIG9wdGlvbiB2YWx1ZTogKi8KLSAgICAgICAgIHBuZ19hbGxvY19zaXplX3QgYmVzdF9zaXplID0gZHAtPnN0YWNrW3NwXS5iZXN0X3NpemU7Ci0gICAgICAgICBpbnQgbG8gPSBkcC0+c3RhY2tbc3BdLmxvOwotICAgICAgICAgaW50IGhpID0gZHAtPnN0YWNrW3NwXS5oaTsKLSAgICAgICAgIGludCB2YWwgPSBkcC0+dmFsdWVbb3B0XTsKLQotICAgICAgICAgc2VhcmNoID0gMTsgLyogZW5kIGlzIGRldGVybWluZWQgaGVyZSAqLwotICAgICAgICAgYXNzZXJ0KGJlc3Rfc2l6ZSA8IE1BWF9TSVpFKTsKLQotICAgICAgICAgaWYgKHZhbCA9PSBsbykKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpbmRpbmcgdGhlIGJlc3QgZm9yIHRoZSBsb3cgZW5kIG9mIHRoZSByYW5nZTogKi8KLSAgICAgICAgICAgIGRwLT5zdGFja1tzcF0ubG9fc2l6ZSA9IGJlc3Rfc2l6ZTsKLSAgICAgICAgICAgIGFzc2VydChoaSA+IHZhbCk7Ci0KLSAgICAgICAgICAgIGlmIChoaSA9PSB2YWwrMSkgLyogb25seSAyIGVudHJpZXMgKi8KLSAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0uZW5kID0gMTsKLQotICAgICAgICAgICAgdmFsID0gaGk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgaWYgKHZhbCA9PSBoaSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRwLT5zdGFja1tzcF0uaGlfc2l6ZSA9IGJlc3Rfc2l6ZTsKLSAgICAgICAgICAgIGFzc2VydCh2YWwgPiBsbysxKTsgLyogZWxzZSAnZW5kJyBzZXQgYWJvdmUgKi8KLQotICAgICAgICAgICAgaWYgKHZhbCA9PSBsbysyKSAvKiBvbmx5IHRocmVlIGVudHJpZXMgdG8gdGVzdCAqLwotICAgICAgICAgICAgICAgZHAtPnN0YWNrW3NwXS5lbmQgPSAxOwotCi0gICAgICAgICAgICB2YWwgPSAobG8gKyB2YWwpLzI7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19hbGxvY19zaXplX3QgbG9fc2l6ZSA9IGRwLT5zdGFja1tzcF0ubG9fc2l6ZTsKLSAgICAgICAgICAgIHBuZ19hbGxvY19zaXplX3QgaGlfc2l6ZSA9IGRwLT5zdGFja1tzcF0uaGlfc2l6ZTsKLQotICAgICAgICAgICAgLyogbG8gYW5kIGhpIHNob3VsZCBoYXZlIGJlZW4gdGVzdGVkLiAqLwotICAgICAgICAgICAgYXNzZXJ0KGxvX3NpemUgPCBNQVhfU0laRSAmJiBoaV9zaXplIDwgTUFYX1NJWkUpOwotCi0gICAgICAgICAgICAvKiBUaGVzZSBjYXNlcyBhcmlzZSB3aXRoIHRoZSAncHJvYmUnIGhhbmRsaW5nIGJlbG93IHdoZW4gdGhlcmUgaXMgYQotICAgICAgICAgICAgICogZGlwIG9yIHBlYWsgaW4gdGhlIHNpemUgY3VydmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh2YWwgPCBsbykgLyogcHJvYmluZyBhIG5ldyBsbyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogU3dhcCBsbyBhbmQgdmFsOiAqLwotICAgICAgICAgICAgICAgZHAtPnN0YWNrW3NwXS5sbyA9IHZhbDsKLSAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0ubG9fc2l6ZSA9IGJlc3Rfc2l6ZTsKLSAgICAgICAgICAgICAgIHZhbCA9IGxvOwotICAgICAgICAgICAgICAgYmVzdF9zaXplID0gbG9fc2l6ZTsKLSAgICAgICAgICAgICAgIGxvID0gZHAtPnN0YWNrW3NwXS5sbzsKLSAgICAgICAgICAgICAgIGxvX3NpemUgPSBkcC0+c3RhY2tbc3BdLmxvX3NpemU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbCA+IGhpKSAvKiBwcm9iaW5nIGEgbmV3IGhpICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBTd2FwIGhpIGFuZCB2YWw6ICovCi0gICAgICAgICAgICAgICBkcC0+c3RhY2tbc3BdLmhpID0gdmFsOwotICAgICAgICAgICAgICAgZHAtPnN0YWNrW3NwXS5oaV9zaXplID0gYmVzdF9zaXplOwotICAgICAgICAgICAgICAgdmFsID0gaGk7Ci0gICAgICAgICAgICAgICBiZXN0X3NpemUgPSBoaV9zaXplOwotICAgICAgICAgICAgICAgaGkgPSBkcC0+c3RhY2tbc3BdLmhpOwotICAgICAgICAgICAgICAgaGlfc2l6ZSA9IGRwLT5zdGFja1tzcF0uaGlfc2l6ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJ1ZSBvciBzb21ldGhpbmcgZ290IG1lc3NlZCB1cCBhYm92ZS4gKi8KLSAgICAgICAgICAgIGFzc2VydChsbyA8IHZhbCAmJiB2YWwgPCBoaSk7Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZXJlIGFyZSBvbmx5IGZvdXIgZW50cmllcyAobG8sIHZhbCwgaGkgcGx1cyBvbmUgbW9yZSkganVzdAotICAgICAgICAgICAgICogdGVzdCB0aGUgcmVtYWluaW5nIGVudHJ5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoaGkgPT0gbG8rMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIEJlY2F1c2Ugb2YgdGhlICdwcm9iZScgY29kZSB2YWwgY2FuIGVpdGhlciBiZSBsbysxIG9yIGhpLTE7IHdlCi0gICAgICAgICAgICAgICAgKiBuZWVkIHRvIHRlc3QgdGhlIG90aGVyLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICB2YWwgPSBsbyArICgodmFsID09IGxvKzEpID8gMiA6IDEpOwotICAgICAgICAgICAgICAgYXNzZXJ0KGxvIDwgdmFsICYmIHZhbCA8IGhpKTsKLSAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0uZW5kID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIGF0IGxlYXN0IDIgZW50cmllcyBzdGlsbCB1bnRlc3RlZCBiZXR3ZWVuIGxvIGFuZCBoaSwKLSAgICAgICAgICAgICAgICAqIGkuZS4gaGkgPj0gbG8rNC4gICd2YWwnIGlzIHRoZSBtaWRwb2ludCArLy0gMC41Ci0gICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICogU2VwYXJhdGUgb3V0IHRoZSBmb3VyIGVhc3kgY2FzZXMgd2hlbiBsby4udmFsLi5oaSBhcmUKLSAgICAgICAgICAgICAgICAqIG1vbm90b25pY2FsbHkgZGVjcmVhc2VkIG9yIChtb3JlIHdlaXJkKSBpbmNyZWFzaW5nOgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBhc3NlcnQoaGkgPiBsbyszKTsKLQotICAgICAgICAgICAgICAgaWYgKGxvX3NpemUgPD0gYmVzdF9zaXplICYmIGJlc3Rfc2l6ZSA8PSBoaV9zaXplKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogU2VsZWN0IHRoZSBsb3cgcmFuZ2U7IHRlc3RpbmcgdGhpcyBmaXJzdCBmYXZvdXJzIHRoZSBsb3cKLSAgICAgICAgICAgICAgICAgICAqIHJhbmdlIG92ZXIgdGhlIGhpZ2ggcmFuZ2Ugd2hlbiBldmVyeXRoaW5nIGNvbWVzIG91dCBlcXVhbC4KLSAgICAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgdGhlIHByb2JpbmcgJ3ZhbCcgbWF5IGJlIGxvKzEuICBJbiB0aGF0IGNhc2UgZW5kCi0gICAgICAgICAgICAgICAgICAgKiB0aGUgc2VhcmNoIGFuZCBzZXQgJ3ZhbCcgdG8gbG8rMi4KLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBsbysxKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgKyt2YWw7Ci0gICAgICAgICAgICAgICAgICAgICBkcC0+c3RhY2tbc3BdLmVuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0uaGkgPSBoaSA9IHZhbDsKLSAgICAgICAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0uaGlfc2l6ZSA9IGJlc3Rfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgIHZhbCA9IChsbyArIHZhbCkgLyAyOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBlbHNlIGlmIChsb19zaXplID49IGJlc3Rfc2l6ZSAmJiBiZXN0X3NpemUgPj0gaGlfc2l6ZSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIE1vbm90b25pY2FsbHkgZGVjcmVhc2luZyBzaXplOyB0aGlzIGlzIHRoZSBleHBlY3RlZCBjYXNlLgotICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHRoZSBoaWdoIGVuZCBvZiB0aGUgcmFuZ2UuICBBcyBhYm92ZSwgdmFsIG1heSBiZQotICAgICAgICAgICAgICAgICAgICogaGktMS4KLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBoaS0xKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgLS12YWw7Ci0gICAgICAgICAgICAgICAgICAgICBkcC0+c3RhY2tbc3BdLmVuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0ubG8gPSBsbyA9IHZhbDsKLSAgICAgICAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0ubG9fc2l6ZSA9IGJlc3Rfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgKyBoaSkgLyAyOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAvKiBJZiBib3RoIHRob3NlIHRlc3RzIGZhaWxlZCAnYmVzdF9zaXplJyBpcyBlaXRoZXIgZ3JlYXRlciB0aGFuCi0gICAgICAgICAgICAgICAgKiBvciBsZXNzIHRoYW4gYm90aCBsb19zaXplIGFuZCBoaV9zaXplLiAgVGhlcmUgaXMgYSBwZWFrIG9yIGRpcAotICAgICAgICAgICAgICAgICogaW4gdGhlIGN1cnZlIG9mIHNpemVzIGZyb20gbG8gdG8gaGkgYW5kIHZhbCBpcyBvbiB0aGUgcGVhayBvcgotICAgICAgICAgICAgICAgICogZGlwLgotICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAqIEJlY2F1c2UgdGhlIHJhbmdlcyBiZWluZyBzZWFyY2hlZCBhcyBzbyBzbWFsbCAobGV2ZWwgaXMgMS4uOSwKLSAgICAgICAgICAgICAgICAqIHdpbmRvd0JpdHMgOC4uMTUsIG1lbUxldmVsIDEuLjkpIHRoZXJlIHdpbGwgb25seSBiZSBhdCBtb3N0Ci0gICAgICAgICAgICAgICAgKiB0aHJlZSB1bnRlc3RlZCB2YWx1ZXMgYmV0d2VlbiBsby4udmFsIGFuZCB2YWwuLmhpLCBzbyBzb2x2ZQotICAgICAgICAgICAgICAgICogdGhlIHByb2JsZW0gYnkgcHJvYmluZyBkb3duIGZyb20gaGkgb3IgdXAgZnJvbSBsbywgd2hpY2hldmVyCi0gICAgICAgICAgICAgICAgKiBpcyB0aGUgaGlnaGVyLgotICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlICd2YWwnIGlzIHNldCB0byBvdXRzaWRlIHRoZSByYW5nZQotICAgICAgICAgICAgICAgICogbG8uLmhpLCBkZXNjcmliZWQgYXMgJ3Byb2JpbmcnLCB0aG91Z2ggbWF5YmUgJ25hcnJvd2luZycgd291bGQKLSAgICAgICAgICAgICAgICAqIGJlIG1vcmUgYWNjdXJhdGUuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvX3NpemUgPD0gaGlfc2l6ZSkgLyogZG93biBmcm9tIGhpICovCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBkcC0+c3RhY2tbc3BdLmhpID0gdmFsOwotICAgICAgICAgICAgICAgICAgZHAtPnN0YWNrW3NwXS5oaV9zaXplID0gYmVzdF9zaXplOwotICAgICAgICAgICAgICAgICAgdmFsID0gLS1oaTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgZWxzZSAvKiB1cCBmcm9tIGxvdyAqLwotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZHAtPnN0YWNrW3NwXS5sbyA9IHZhbDsKLSAgICAgICAgICAgICAgICAgIGRwLT5zdGFja1tzcF0ubG9fc2l6ZSA9IGJlc3Rfc2l6ZTsKLSAgICAgICAgICAgICAgICAgIHZhbCA9ICsrbG87Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIC8qIGxvIGFuZCBoaSBhcmUgc3RpbGwgdGhlIHRydWUgcmFuZ2UgbGltaXRzLCBjaGVjayBmb3IgdGhlIGVuZAotICAgICAgICAgICAgICAgICogY29uZGl0aW9uLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBhc3NlcnQoaGkgPiBsbysxKTsKLSAgICAgICAgICAgICAgIGlmIChoaSA8PSBsbysyKQotICAgICAgICAgICAgICAgICAgZHAtPnN0YWNrW3NwXS5lbmQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBhc3NlcnQodmFsICE9IGRwLT5zdGFja1tzcF0uYmVzdF92YWwpOyAvKiBzaG91bGQgYmUgYSBuZXcgdmFsdWUgKi8KLSAgICAgICAgIGRwLT52YWx1ZVtvcHRdID0gdmFsOwotICAgICAgICAgZHAtPnN0YWNrW3NwXS5iZXN0X3NpemUgPSBNQVhfU0laRTsKLSAgICAgIH0KLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgLyogSW5jcmVtZW50ICdlbnRyeScgKi8KLSAgICAgIGRwLT52YWx1ZVtvcHRdID0gb3B0aW9uc1tvcHRdLnZhbHVlc1srK2VudHJ5XS52YWx1ZTsKLSAgICAgIGRwLT5zdGFja1tzcF0uZW50cnkgPSBlbnRyeTsKLSAgIH0KLQotICAgc2V0X29wdF9zdHJpbmcoZHAsIHNwKTsKLQotICAgaWYgKCFzZWFyY2ggJiYgb3B0X2xpc3RfZW5kKGRwLCBvcHQsIGVudHJ5KSkgLyogZW5kIG9mIGxpc3QgKi8KLSAgICAgIGRwLT5zdGFja1tzcF0uZW5kID0gMTsKLQotICAgZWxzZSBpZiAoIWRwLT5zdGFja1tzcF0uZW5kKSAvKiBzdGlsbCBhY3RpdmUgYWZ0ZXIgYWxsIHRoZXNlIHRlc3RzICovCi0gICAgICBkcC0+bnNwID0gZHAtPnRzcDsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV9vcHRpb24oY29uc3Qgc3RydWN0IGRpc3BsYXkgKmRwLCB1bnNpZ25lZCBpbnQgc3ApCi17Ci0gICBpbnQgb3B0ID0gZHAtPnN0YWNrW3NwXS5vcHQ7Ci0KLSAgIC8qIElmIHRoZSBiZXN0IHNvIGZhciBpcyBudW1lcmljYWxseSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgdGhlCi0gICAgKiBjdXJyZW50IHNldCBvZiBvcHRpb25zIGlzIGludmFyaWFibHkgd29yc2UuCi0gICAgKi8KLSAgIGlmIChkcC0+c3RhY2tbc3BdLmJlc3RfdmFsIDwgZHAtPnZhbHVlW29wdF0pCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgIC8qIExpc3RzIG9mIG9wdGlvbnMgYXJlIHNlYXJjaGVkIG91dCBvZiBudW1lcmljYWwgb3JkZXIgKGN1cnJlbnRseSBvbmx5Ci0gICAgKiBzdHJhdGVneSksIHNvIG9ubHkgcmV0dXJuICsxIGhlcmUgd2hlbiBhIHJhbmdlIGlzIGJlaW5nIHNlYXJjaGVkLgotICAgICovCi0gICBlbHNlIGlmIChkcC0+c3RhY2tbc3BdLmJlc3RfdmFsID4gZHAtPnZhbHVlW29wdF0pCi0gICB7Ci0gICAgICBpZiAoZHAtPnN0YWNrW3NwXS5sbyA8PSBkcC0+c3RhY2tbc3BdLmhpIC8qc2VhcmNoaW5nKi8pCi0gICAgICAgICByZXR1cm4gMTsKLQotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIC0xOwotICAgfQotCi0gICBlbHNlCi0gICAgICByZXR1cm4gMDsgLyogbWF0Y2g7IGN1cnJlbnQgdmFsdWUgaXMgdGhlIGJlc3Qgb25lICovCi19Ci0KLXN0YXRpYyBpbnQKLWFkdmFuY2Vfb3B0KHN0cnVjdCBkaXNwbGF5ICpkcCwgcG5nX2J5dGUgb3B0LCBpbnQgc2VhcmNoKQotewotICAgdW5zaWduZWQgaW50IHNwID0gZHAtPmNzcCsrOyAvKiBteSBzdGFjayBlbnRyeSAqLwotCi0gICBhc3NlcnQoc3AgPj0gZHAtPm5zcCk7IC8qIG5zcCBzdGFydHMgb2ZmIHplcm8gKi8KLQotICAgLyogSWYgdGhlIGVudHJ5IHdhcyBhY3RpdmUgaW4gdGhlIHByZXZpb3VzIHJ1biBkcC0+c3RhY2tbc3BdIGlzIGFscmVhZHkKLSAgICAqIHNldCB1cCBhbmQgZHAtPnRzcCB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBzcCwgb3RoZXJ3aXNlIGEgbmV3IGVudHJ5Ci0gICAgKiBuZWVkcyB0byBiZSBjcmVhdGVkLgotICAgICoKLSAgICAqIGRwLT5uc3AgaXMgaGFuZGxlZCB0aGlzIHdheToKLSAgICAqCi0gICAgKiAxKSBXaGVuIGFuIG9wdGlvbiBpcyBwdXNoZWQgb250byB0aGUgc3RhY2sgZHAtPm5zcCBhbmQgZHAtPnRzcCBhcmUKLSAgICAqICAgIGJvdGggc2V0IChieSBwdXNoX29wdCkgdG8gdGhlIG5leHQgc3RhY2sgZW50cnkgKnVubGVzcyogdGhlcmUgaXMKLSAgICAqICAgIG9ubHkgb25lIGVudHJ5IGluIHRoZSBuZXcgbGlzdCwgaW4gd2hpY2ggY2FzZSBkcC0+c3RhY2tbc3BdLmVuZAotICAgICogICAgaXMgc2V0LgotICAgICoKLSAgICAqIDIpIEZvciB0aGUgdG9wIHN0YWNrIGVudHJ5IG5leHRfb3B0IGlzIGNhbGxlZC4gIFRoZSBlbnRyeSBtdXN0IGJlCi0gICAgKiAgICBhY3RpdmUgKGRwLT5zdGFja1tzcF0uZW5kIGlzIG5vdCBzZXQpIGFuZCBlaXRoZXIgJ25zcCcgb3IgJ2VuZCcKLSAgICAqICAgIHdpbGwgYmUgdXBkYXRlZCBhcyBhcHByb3ByaWF0ZS4KLSAgICAqCi0gICAgKiAzKSBGb3IgbG93ZXIgc3RhY2sgZW50cmllcyBuc3AgaXMgc2V0IHVubGVzcyB0aGUgc3RhY2sgZW50cnkgaXMKLSAgICAqICAgIGFscmVhZHkgYXQgdGhlIGVuZC4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuIGFsbCB0aGUgaGlnaGVyIGVudHJpZXMKLSAgICAqICAgIGFyZSBwb3BwZWQgdGhpcyBlbnRyeSB3aWxsIGJlIHRvby4KLSAgICAqLwotICAgaWYgKHNwID49IGRwLT50c3ApCi0gICB7Ci0gICAgICBwdXNoX29wdChkcCwgc3AsIG9wdCwgc2VhcmNoKTsgLyogVGhpcyBzZXRzIHRzcCB0byBzcCsxICovCi0gICAgICByZXR1cm4gMTsgLyogaW5pdGlhbGl6ZWQgKi8KLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgaW50IHJldCA9IDA7IC8qIHVuY2hhbmdlZCAqLwotCi0gICAgICAvKiBBbiBvcHRpb24gdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBzdGFjazsgdXBkYXRlIGJlc3Rfc2l6ZSBhbmQgYmVzdF92YWwKLSAgICAgICAqIGlmIGFwcHJvcHJpYXRlLiAgT24gdGhlIGZpcnN0IHJ1biB0aGVyZSBhcmUgbm8gcHJldmlvdXMgdmFsdWVzIGFuZAotICAgICAgICogZHAtPndyaXRlX3NpemUgd2lsbCBiZSBNQVhfU0laRSwgaG93ZXZlciBvbiB0aGUgZmlyc3QgcnVuIGRwLT50c3AKLSAgICAgICAqIHN0YXJ0cyBvZmYgYXMgMC4KLSAgICAgICAqLwotICAgICAgYXNzZXJ0KGRwLT53cml0ZV9zaXplID4gMFUgJiYgZHAtPndyaXRlX3NpemUgPCBNQVhfU0laRSk7Ci0KLSAgICAgIGlmIChkcC0+c3RhY2tbc3BdLmJlc3Rfc2l6ZSA+IGRwLT53cml0ZV9zaXplIHx8Ci0gICAgICAgICAgKGRwLT5zdGFja1tzcF0uYmVzdF9zaXplID09IGRwLT53cml0ZV9zaXplICYmCi0gICAgICAgICAgIGNvbXBhcmVfb3B0aW9uKGRwLCBzcCkgPiAwKSkKLSAgICAgIHsKLSAgICAgICAgIGRwLT5zdGFja1tzcF0uYmVzdF9zaXplID0gZHAtPndyaXRlX3NpemU7Ci0gICAgICAgICBkcC0+c3RhY2tbc3BdLmJlc3RfdmFsID0gZHAtPnZhbHVlW29wdF07Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzcCsxVSA+PSBkcC0+dHNwKQotICAgICAgewotICAgICAgICAgbmV4dF9vcHQoZHAsIHNwKTsKLSAgICAgICAgIHJldCA9IDE7IC8qIGFkdmFuY2VkICovCi0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCFkcC0+c3RhY2tbc3BdLmVuZCkgLyogQWN0aXZlLCBub3QgYXQgdG9wIG9mIHN0YWNrICovCi0gICAgICAgICBkcC0+bnNwID0gc3ArMVU7Ci0KLSAgICAgIHJldHVybiByZXQ7IC8qIGFkdmFuY2VkIHx8IHVuY2hhbmdlZCAqLwotICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXRhbGxvcHRzXyhzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IHBuZ19ieXRlIG9wdCwgaW50ICp2YWx1ZSwgaW50IHJlY29yZCkKLSAgIC8qIExpa2UgZ2V0b3AgYnV0IGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHZhbHVlcyBpZiB0aGUgb3B0aW9uIHdhcyBzZXQgdG8gImFsbCIuCi0gICAgKi8KLXsKLSAgIGlmIChkcC0+ZW50cnlbb3B0XSkgLyogb3B0aW9uIHdhcyBzZXQgb24gY29tbWFuZCBsaW5lICovCi0gICB7Ci0gICAgICAvKiBTaW1wbGUsIHNpbmdsZSB2YWx1ZSwgZW50cmllcyBkb24ndCBoYXZlIGEgc3RhY2sgZnJhbWUgYW5kIGhhdmUgYSBmaXhlZAotICAgICAgICogdmFsdWUgKGl0IGRvZXNuJ3QgY2hhbmdlIG9uY2Ugc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUpLiAgT3RoZXJ3aXNlIHRoZQotICAgICAgICogdmFsdWUgKGVudHJ5KSBzZWxlY3RlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaXMgJ2FsbCc6Ci0gICAgICAgKi8KLSAgICAgIGNvbnN0IGNoYXIgKmVudHJ5X25hbWUgPSBvcHRpb25zW29wdF0udmFsdWVzW2RwLT5lbnRyeVtvcHRdLTFdLm5hbWU7Ci0KLSAgICAgIGlmIChlbnRyeV9uYW1lID09IGFsbCkKLSAgICAgICAgICh2b2lkKWFkdmFuY2Vfb3B0KGRwLCBvcHQsIDAvKmRvIG5vdCBzZWFyY2g7IGl0ZXJhdGUqLyk7Ci0KLSAgICAgIGVsc2UgaWYgKHJlY29yZCkKLSAgICAgICAgIHJlY29yZF9vcHQoZHAsIG9wdCwgZW50cnlfbmFtZSk7Ci0KLSAgICAgICp2YWx1ZSA9IGRwLT52YWx1ZVtvcHRdOwotICAgICAgcmV0dXJuIDE7IC8qIHNldCAqLwotICAgfQotCi0gICBlbHNlCi0gICAgICByZXR1cm4gMDsgLyogbm90IHNldCAqLwotfQotCi1zdGF0aWMgaW50Ci1nZXRhbGxvcHRzKHN0cnVjdCBkaXNwbGF5ICpkcCwgY29uc3QgY2hhciAqb3B0X3N0ciwgaW50ICp2YWx1ZSkKLXsKLSAgIHJldHVybiBnZXRhbGxvcHRzXyhkcCwgb3B0aW9uX2luZGV4KGRwLCBvcHRfc3RyLCBzdHJsZW4ob3B0X3N0cikpLCB2YWx1ZSwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldHNlYXJjaG9wdHMoc3RydWN0IGRpc3BsYXkgKmRwLCBjb25zdCBjaGFyICpvcHRfc3RyLCBpbnQgKnZhbHVlKQotICAgLyogQXMgYWJvdmUgZXhjZXB0IHRoYXQgaWYgdGhlIG9wdGlvbiB3YXMgbm90IHNldCB0cnkgYSBzZWFyY2ggKi8KLXsKLSAgIHBuZ19ieXRlIGlzdHJhdDsKLSAgIGNvbnN0IHBuZ19ieXRlIG9wdCA9IG9wdGlvbl9pbmRleChkcCwgb3B0X3N0ciwgc3RybGVuKG9wdF9zdHIpKTsKLSAgIGludCByZWNvcmQgPSBvcHRpb25zW29wdF0uc2VhcmNoOwotICAgY29uc3QgY2hhciAqZW50cnlfbmFtZTsKLQotICAgLyogSWYgaXQgd2FzIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lIGhvbm91ciB0aGUgc2V0dGluZywgaW5jbHVkaW5nICdhbGwnCi0gICAgKiB3aGljaCB3aWxsIG92ZXJyaWRlIHRoZSBidWlsdCBpbiBzZWFyY2g6Ci0gICAgKi8KLSAgIGlmIChnZXRhbGxvcHRzXyhkcCwgb3B0LCB2YWx1ZSwgcmVjb3JkKSkKLSAgICAgIHJldHVybiAxOwotCi0gICBlbHNlIGlmICghcmVjb3JkKSAvKiBub3QgYSBzZWFyY2ggb3B0aW9uICovCi0gICAgICByZXR1cm4gMDsgLyogdW5zZXQgYW5kIG5vdCBzZWFyY2hlZCAqLwotCi0gICAvKiBPdGhlcndpc2UgZGVjaWRlIHdoYXQgdG8gZG8gaGVyZS4gKi8KLSAgIGlzdHJhdCA9IE9QVElORChkcCwgc3RyYXRlZ3kpOwotICAgZW50cnlfbmFtZSA9IHJhbmdlX2xvOyAvKiByZWNvcmQgdGhlIHZhbHVlLCBub3QgdGhlIG5hbWUgKi8KLQotICAgaWYgKG9wdCA9PSBpc3RyYXQpIC8qIHNlYXJjaCBhbGwgc3RyYXRlZ2llcyAqLwotICAgICAgKHZvaWQpYWR2YW5jZV9vcHQoZHAsIG9wdCwgMC8qaXRlcmF0ZSovKSwgcmVjb3JkPTA7Ci0KLSAgIGVsc2UgaWYgKG9wdCA9PSBPUFRJTkQoZHAsIGxldmVsKSkKLSAgIHsKLSAgICAgIC8qIEJvdGggUkxFIGFuZCBIVUZGTUFOIGRvbid0IGJlbmVmaXQgZnJvbSBsZXZlbCBpbmNyZWFzZXMgKi8KLSAgICAgIGlmIChkcC0+dmFsdWVbaXN0cmF0XSA9PSBaX1JMRSB8fCBkcC0+dmFsdWVbaXN0cmF0XSA9PSBaX0hVRkZNQU5fT05MWSkKLSAgICAgICAgIGRwLT52YWx1ZVtvcHRdID0gMTsKLQotICAgICAgZWxzZSAvKiBmaXhlZCwgZmlsdGVyZWQgb3IgZGVmYXVsdCAqLwotICAgICAgICAgKHZvaWQpYWR2YW5jZV9vcHQoZHAsIG9wdCwgMS8qc2VhcmNoKi8pLCByZWNvcmQ9MDsKLSAgIH0KLQotICAgZWxzZSBpZiAob3B0ID09IE9QVElORChkcCwgd2luZG93Qml0cykpCi0gICB7Ci0gICAgICAvKiBDaGFuZ2luZyB3aW5kb3dCaXRzIGZvciBzdHJhdGVnaWVzIHRoYXQgZG8gbm90IHNlYXJjaCB0aGUgd2luZG93IGlzCi0gICAgICAgKiBwb2ludGxlc3MuICBIdWZmbWFuLW9ubHkgZG9lcyBub3Qgc2VhcmNoLCBSTEUgb25seSBzZWFyY2hlcyBiYWNrd2FyZHMKLSAgICAgICAqIG9uZSBieXRlLCBzbyBnaXZlbiB0aGF0IHRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGggaXMgMjU4LCBhIHdpbmRvd0JpdHMKLSAgICAgICAqIG9mIDkgaXMgYWx3YXlzIHN1ZmZpY2llbnQuCi0gICAgICAgKi8KLSAgICAgIGlmIChkcC0+dmFsdWVbaXN0cmF0XSA9PSBaX0hVRkZNQU5fT05MWSkKLSAgICAgICAgIGRwLT52YWx1ZVtvcHRdID0gODsKLQotICAgICAgZWxzZSBpZiAoZHAtPnZhbHVlW2lzdHJhdF0gPT0gWl9STEUpCi0gICAgICAgICBkcC0+dmFsdWVbb3B0XSA9IDk7Ci0KLSAgICAgIGVsc2UgLyogZml4ZWQsIGZpbHRlcmVkIG9yIGRlZmF1bHQgKi8KLSAgICAgICAgICh2b2lkKWFkdmFuY2Vfb3B0KGRwLCBvcHQsIDEvKnNlYXJjaCovKSwgcmVjb3JkPTA7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKG9wdCA9PSBPUFRJTkQoZHAsIG1lbUxldmVsKSkKLSAgIHsKLSMgICAgIGlmIDAKLSAgICAgICAgICh2b2lkKWFkdmFuY2Vfb3B0KGRwLCBvcHQsIDAvKmFsbCovKSwgcmVjb3JkPTA7Ci0jICAgICBlbHNlCi0gICAgICAgICBkcC0+dmFsdWVbb3B0XSA9IE1BWF9NRU1fTEVWRUw7Ci0jICAgICBlbmRpZgotICAgfQotCi0gICBlbHNlIC8qIHNvbWV0aGluZyBlbHNlICovCi0gICAgICBhc3NlcnQoMD09InJlYWNoZWQiKTsKLQotICAgaWYgKHJlY29yZCkKLSAgICAgIHJlY29yZF9vcHQoZHAsIG9wdCwgZW50cnlfbmFtZSk7Ci0KLSAgIC8qIE9uZSBvZiB0aGUgYWJvdmUgc2VhcmNoZWQgb3B0aW9uczogKi8KLSAgICp2YWx1ZSA9IGRwLT52YWx1ZVtvcHRdOwotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWZpbmRfdmFsKHN0cnVjdCBkaXNwbGF5ICpkcCwgcG5nX2J5dGUgb3B0LCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCi0gICAvKiBMaWtlIG9wdGlvbl9pbmRleCBidXQgc2V0cyAoaW5kZXgraSkgb2YgdGhlIGVudHJ5IGluIG9wdGlvbnNbb3B0XSB0aGF0Ci0gICAgKiBtYXRjaGVzIHN0clswLi5sZW4tMV0gaW50byBkcC0+ZW50cnlbb3B0XSBhcyB3ZWxsIGFzIHJldHVybmluZyB0aGUgYWN0dWFsCi0gICAgKiB2YWx1ZS4KLSAgICAqLwotewotICAgaW50IHJsbyA9IElOVF9NQVgsIHJoaSA9IElOVF9NSU47Ci0gICBwbmdfYnl0ZSBqLCBpcmFuZ2UgPSAwOwotCi0gICBmb3IgKGo9MVU7IGo8PW9wdGlvbnNbb3B0XS52YWx1ZV9jb3VudDsgKytqKQotICAgewotICAgICAgaWYgKHN0cm5jbXAob3B0aW9uc1tvcHRdLnZhbHVlc1tqLTFVXS5uYW1lLCBzdHIsIGxlbikgPT0gMCAmJgotICAgICAgICAgIG9wdGlvbnNbb3B0XS52YWx1ZXNbai0xVV0ubmFtZVtsZW5dID09IDApCi0gICAgICB7Ci0gICAgICAgICBkcC0+ZW50cnlbb3B0XSA9IGo7Ci0gICAgICAgICByZXR1cm4gb3B0aW9uc1tvcHRdLnZhbHVlc1tqLTFVXS52YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9wdGlvbnNbb3B0XS52YWx1ZXNbai0xVV0ubmFtZSA9PSByYW5nZV9sbykKLSAgICAgICAgIHJsbyA9IG9wdGlvbnNbb3B0XS52YWx1ZXNbai0xVV0udmFsdWUsIGlyYW5nZSA9IGo7Ci0gICAgICBlbHNlIGlmIChvcHRpb25zW29wdF0udmFsdWVzW2otMVVdLm5hbWUgPT0gcmFuZ2VfaGkpCi0gICAgICAgICByaGkgPSBvcHRpb25zW29wdF0udmFsdWVzW2otMVVdLnZhbHVlOwotICAgfQotCi0gICAvKiBObyBtYXRjaCBvbiB0aGUgbmFtZSwgYnV0IHRoZXJlIG1heSBiZSBhIHJhbmdlLiAqLwotICAgaWYgKGlyYW5nZSA+IDApCi0gICB7Ci0gICAgICBjaGFyICplcCA9IE5VTEw7Ci0gICAgICBsb25nIGwgPSBzdHJ0b2woc3RyLCAmZXAsIDApOwotCi0gICAgICBpZiAoZXAgPT0gc3RyK2xlbiAmJiBsID49IHJsbyAmJiBsIDw9IHJoaSkKLSAgICAgIHsKLSAgICAgICAgIGRwLT5lbnRyeVtvcHRdID0gaXJhbmdlOyAvKiByYW5nZV9sbyAqLwotICAgICAgICAgcmV0dXJuIChpbnQpLypTQUZFKi9sOwotICAgICAgfQotICAgfQotCi0gICBkaXNwbGF5X2xvZyhkcCwgZHAtPmVycnNldCA/IElOVEVSTkFMX0VSUk9SIDogVVNFUl9FUlJPUiwKLSAgICAgICAgICIlczogdW5rbm93biB2YWx1ZSBzZXR0aW5nICclLipzJyIsIG9wdGlvbnNbb3B0XS5uYW1lLAotICAgICAgICAgKGludCkvKlNBRkUqL2xlbiwgc3RyKTsKLSAgIGFib3J0KCk7IC8qIE5PVCBSRUFDSEVEICovCi19Ci0KLXN0YXRpYyBpbnQKLW9wdF9jaGVjayhzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgIGFzc2VydChkcC0+ZXJyc2V0ID09IDApOwotCi0gICBpZiAoYXJnICE9IE5VTEwgJiYgYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJy0nKQotICAgewotICAgICAgaW50IGkgPSAwLCBuZWdhdGUgPSAoc3RybmNtcChhcmcrMiwgIm5vLSIsIDMpID09IDApLCB2YWw7Ci0gICAgICBwbmdfYnl0ZSBqOwotCi0gICAgICBpZiAobmVnYXRlKQotICAgICAgICAgYXJnICs9IDU7IC8qIC0tbm8tICovCi0KLSAgICAgIGVsc2UKLSAgICAgICAgIGFyZyArPSAyOyAvKiAtLSAqLwotCi0gICAgICAvKiBGaW5kIHRoZSBsZW5ndGggKGV4cGVjdCBhcmdcMCBvciBhcmc9KSAqLwotICAgICAgd2hpbGUgKGFyZ1tpXSAhPSAwICYmIGFyZ1tpXSAhPSAnPScpICsraTsKLQotICAgICAgLyogU28gYXJnWzAuLmktMV0gaXMgdGhlIGFyZ3VtZW50IG5hbWUsIHRoaXMgZG9lcyBub3QgcmV0dXJuIGlmIHRoaXMgaXNuJ3QKLSAgICAgICAqIGEgdmFsaWQgb3B0aW9uIG5hbWUuCi0gICAgICAgKi8KLSAgICAgIGogPSBvcHRpb25faW5kZXgoZHAsIGFyZywgaSk7Ci0KLSAgICAgIC8qIEl0IG1hdGNoZXRoIGFuIG9wdGlvbjsgY2hlY2sgdGhlIHJlbWFpbmRlci4gKi8KLSAgICAgIGlmIChhcmdbaV0gPT0gMCkgLyogbm8gc3BlY2lmaWVkIHZhbHVlLCB1c2UgdGhlIGRlZmF1bHQgKi8KLSAgICAgIHsKLSAgICAgICAgIHZhbCA9IG9wdGlvbnNbal0udmFsdWVzW25lZ2F0ZV0udmFsdWU7Ci0gICAgICAgICBkcC0+ZW50cnlbal0gPSAocG5nX2J5dGUpLypTQUZFKi8obmVnYXRlICsgMVUpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBjb25zdCBjaGFyICpsaXN0ID0gYXJnICsgKGkrMSk7Ci0KLSAgICAgICAgIC8qIEV4cGVjdCBhIHNpbmdsZSB2YWx1ZSBoZXJlIHVubGVzcyB0aGlzIGlzIGEgbGlzdCwgaW4gd2hpY2ggY2FzZQotICAgICAgICAgICogbXVsdGlwbGUgdmFsdWVzIGFyZSBjb21iaW5lZC4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKG9wdGlvbnNbal0ub3B0ICE9IExJU1QpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKiBmaW5kX3ZhbCBzZXRzICdkcC0+ZW50cnlbal0nIHRvIGEgbm9uLXplcm8gdmFsdWU6ICovCi0gICAgICAgICAgICB2YWwgPSBmaW5kX3ZhbChkcCwgaiwgbGlzdCwgc3RybGVuKGxpc3QpKTsKLQotICAgICAgICAgICAgaWYgKG5lZ2F0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChvcHRpb25zW2pdLm9wdCA8IE9QVElPTikKLSAgICAgICAgICAgICAgICAgIHZhbCA9ICF2YWw7Ci0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiUuKnM6IG9wdGlvbj1hcmcgY2Fubm90IGJlIG5lZ2F0ZWQiLCBpLCBhcmcpOwotICAgICAgICAgICAgICAgICAgYWJvcnQoKTsgLyogTk9UIFJFQUNIRUQgKi8KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZSAvKiBtdWx0aXBsZSBvcHRpb25zIHNlcGFyYXRlZCBieSAnLCcgY2hhcmFjdGVycyAqLwotICAgICAgICAgewotICAgICAgICAgICAgLyogLS1uby1vcHRpb24gbmVnYXRlcyBsaXN0IHZhbHVlcyBmcm9tIHRoZSBkZWZhdWx0LCB3aGljaCBzaG91bGQKLSAgICAgICAgICAgICAqIHRoZXJlZm9yZSBiZSAnYWxsJy4gIE5vdGljZSB0aGF0IGlmIHRoZSBvcHRpb24gbGlzdCBpcyBlbXB0eSBpbgotICAgICAgICAgICAgICogdGhpcyBjYXNlIG5vdGhpbmcgd2lsbCBiZSByZW1vdmVkIGFuZCB0aGVyZWZvcmUgLS1uby1vcHRpb249IGlzCi0gICAgICAgICAgICAgKiB0aGUgc2FtZSBhcyAtLW9wdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKG5lZ2F0ZSkKLSAgICAgICAgICAgICAgIHZhbCA9IG9wdGlvbnNbal0udmFsdWVzWzBdLnZhbHVlOwotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB2YWwgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoKmxpc3QgIT0gMCkgLyogYWxsb3dzIG9wdGlvbj0gd2hpY2ggc2V0cyAwICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBBIHZhbHVlIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIGVuZCBvZiB0aGUgbGlzdCBvciBhICcsJwotICAgICAgICAgICAgICAgICogY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBpbnQgdiwgaXY7Ci0KLSAgICAgICAgICAgICAgIGl2ID0gMDsgLyogYW4gaW5kZXggaW50byAnbGlzdCcgKi8KLSAgICAgICAgICAgICAgIHdoaWxlIChsaXN0WysraXZdICE9IDAgJiYgbGlzdFtpdl0gIT0gJywnKSB7fQotCi0gICAgICAgICAgICAgICB2ID0gZmluZF92YWwoZHAsIGosIGxpc3QsIGl2KTsKLQotICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkKLSAgICAgICAgICAgICAgICAgIHZhbCAmPSB+djsKLQotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgdmFsIHw9IHY7Ci0KLSAgICAgICAgICAgICAgIGxpc3QgKz0gaXY7Ci0gICAgICAgICAgICAgICBpZiAoKmxpc3QgIT0gMCkKLSAgICAgICAgICAgICAgICAgICsrbGlzdDsgLyogc2tpcCB0aGUgJywnICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qICd2YWwnIGlzIHRoZSBuZXcgdmFsdWUsIHN0b3JlIGl0IGZvciB1c2UgbGF0ZXIgYW5kIGRlYnVnZ2luZzogKi8KLSAgICAgIGRwLT52YWx1ZVtqXSA9IHZhbDsKLQotICAgICAgaWYgKG9wdGlvbnNbal0ub3B0IDwgTEVWRUxfTUFTSykKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoZSBoYW5kbGluZyBmb3IgZXJyb3IgbGV2ZWxzIGlzIHRvIHNldCB0aGUgbGV2ZWwuICovCi0gICAgICAgICBpZiAodmFsKSAvKiBTZXQgdGhpcyBsZXZlbCAqLwotICAgICAgICAgICAgZHAtPm9wdGlvbnMgPSAoZHAtPm9wdGlvbnMgJiB+TEVWRUxfTUFTSykgfCBvcHRpb25zW2pdLm9wdDsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIFVTRVJfRVJST1IsCi0gICAgICAiJS4qczogbWVzc2FnZXMgY2Fubm90IGJlIHR1cm5lZCBvZmYgaW5kaXZpZHVhbGx5OyBzZXQgYSBtZXNzYWdlIGxldmVsIiwKLSAgICAgICAgICAgICAgICAgIGksIGFyZyk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKG9wdGlvbnNbal0ub3B0IDwgT1BUSU9OKQotICAgICAgewotICAgICAgICAgaWYgKHZhbCkKLSAgICAgICAgICAgIGRwLT5vcHRpb25zIHw9IG9wdGlvbnNbal0ub3B0OwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBkcC0+b3B0aW9ucyAmPSB+b3B0aW9uc1tqXS5vcHQ7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAxOyAvKiB0aGlzIGlzIGFuIG9wdGlvbiAqLwotICAgfQotCi0gICBlbHNlCi0gICAgICByZXR1cm4gMDsgLyogbm90IGFuIG9wdGlvbiAqLwotfQotCi0jaWZkZWYgUE5HX1BOR0NQX1RJTUlOR19TVVBQT1JURUQKLXN0YXRpYyB2b2lkCi1zZXRfdGltZXIoc3RydWN0IGRpc3BsYXkgKmRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVyKQotewotICAgLyogRG8gdGhlIHRpbWluZyB1c2luZyBjbG9ja19nZXR0aW1lIGFuZCB0aGUgcGVyLXByb2Nlc3MgdGltZXIuICovCi0gICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsIHRpbWVyKSkKLSAgIHsKLSAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRVJST1IsCi0gICAgICAgICAgICAiQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEOiAlczogdGltaW5nIGRpc2FibGVkXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgZHAtPnZhbHVlW09QVElORChkcCx0aW1lKV0gPSAwOyAvKiBpLmUuIG9mZiAqLwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RhcnRfdGltZXIoc3RydWN0IGRpc3BsYXkgKmRwLCBpbnQgd2hhdCkKLXsKLSAgIGlmICgoZHAtPnZhbHVlW09QVElORChkcCx0aW1lKV0gJiB3aGF0KSAhPSAwKQotICAgICAgc2V0X3RpbWVyKGRwLCB3aGF0ID09IFBOR0NQX1RJTUVfUkVBRCA/ICZkcC0+cmVhZF90aW1lIDogJmRwLT53cml0ZV90aW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLWVuZF90aW1lcihzdHJ1Y3QgZGlzcGxheSAqZHAsIGludCB3aGF0KQotewotICAgaWYgKChkcC0+dmFsdWVbT1BUSU5EKGRwLHRpbWUpXSAmIHdoYXQpICE9IDApCi0gICB7Ci0gICAgICBzdHJ1Y3QgdGltZXNwZWMgdCwgdG1wOwotCi0gICAgICBzZXRfdGltZXIoZHAsICZ0KTsKLQotICAgICAgaWYgKHdoYXQgPT0gUE5HQ1BfVElNRV9SRUFEKQotICAgICAgICAgdG1wID0gZHAtPnJlYWRfdGltZTsKLQotICAgICAgZWxzZQotICAgICAgICAgdG1wID0gZHAtPndyaXRlX3RpbWU7Ci0KLSAgICAgIHQudHZfc2VjIC09IHRtcC50dl9zZWM7Ci0gICAgICB0LnR2X25zZWMgLT0gdG1wLnR2X25zZWM7Ci0KLSAgICAgIGlmICh0LnR2X25zZWMgPCAwKQotICAgICAgewotICAgICAgICAgLS0odC50dl9zZWMpOwotICAgICAgICAgdC50dl9uc2VjICs9IDEwMDAwMDAwMDBMOwotICAgICAgfQotCi0gICAgICBpZiAod2hhdCA9PSBQTkdDUF9USU1FX1JFQUQpCi0gICAgICAgICBkcC0+cmVhZF90aW1lID0gdCwgdG1wID0gZHAtPnJlYWRfdGltZV90b3RhbDsKLQotICAgICAgZWxzZQotICAgICAgICAgZHAtPndyaXRlX3RpbWUgPSB0LCB0bXAgPSBkcC0+d3JpdGVfdGltZV90b3RhbDsKLQotICAgICAgdG1wLnR2X3NlYyArPSB0LnR2X3NlYzsKLSAgICAgIHRtcC50dl9uc2VjICs9IHQudHZfbnNlYzsKLQotICAgICAgaWYgKHRtcC50dl9uc2VjID49IDEwMDAwMDAwMDBMKQotICAgICAgewotICAgICAgICAgKysodG1wLnR2X3NlYyk7Ci0gICAgICAgICB0bXAudHZfbnNlYyAtPSAxMDAwMDAwMDAwTDsKLSAgICAgIH0KLQotICAgICAgaWYgKHdoYXQgPT0gUE5HQ1BfVElNRV9SRUFEKQotICAgICAgICAgZHAtPnJlYWRfdGltZV90b3RhbCA9IHRtcDsKLQotICAgICAgZWxzZQotICAgICAgICAgZHAtPndyaXRlX3RpbWVfdG90YWwgPSB0bXA7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF90aW1lKGNvbnN0IGNoYXIgKndoYXQsIHN0cnVjdCB0aW1lc3BlYyB0KQotewotICAgcHJpbnRmKCIlcyAlLjJsdS4lLjlsZCIsIHdoYXQsICh1bnNpZ25lZCBsb25nKXQudHZfc2VjLCB0LnR2X25zZWMpOwotfQotI2Vsc2UgLyogIVBOR0NQX1RJTUlORyAqLwotI2RlZmluZSBzdGFydF90aW1lcihkcCwgd2hhdCkgKCh2b2lkKTApCi0jZGVmaW5lIGVuZF90aW1lcihkcCwgd2hhdCkgKCh2b2lkKTApCi0jZW5kaWYgLyogIVBOR0NQX1RJTUlORyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgaW4gbWFpbiB0byB2ZXJpZnkgdGhhdCB0aGUgZmluYWwgYXJndW1lbnQgaXMgYQotICogZGlyZWN0b3J5OgotICovCi1zdGF0aWMgaW50Ci1jaGVja2Rpcihjb25zdCBjaGFyICpwYXRobmFtZSkKLXsKLSAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgIHJldHVybiBzdGF0KHBhdGhuYW1lLCAmYnVmKSA9PSAwICYmIFNfSVNESVIoYnVmLnN0X21vZGUpOwotfQotCi0vKiBXb3JrIG91dCB3aGV0aGVyIGEgcGF0aCBpcyB2YWxpZCAoaWYgbm90IGEgZGlzcGxheV9sb2cgb2NjdXJzKSwgYSBkaXJlY3RvcnkKLSAqICgxIGlzIHJldHVybmVkKSBvciBhIGZpbGUgKm9yKiBub24tZXhpc3RlbnQgKDAgaXMgcmV0dXJuZWQpLgotICoKLSAqIFVzZWQgZm9yIGEgd3JpdGUgcGF0aC4KLSAqLwotc3RhdGljIGludAotaXNkaXIoc3RydWN0IGRpc3BsYXkgKmRwLCBjb25zdCBjaGFyICpwYXRobmFtZSkKLXsKLSAgIGlmIChwYXRobmFtZSA9PSBOVUxMKQotICAgICAgcmV0dXJuIDA7IC8qIHN0ZG91dCAqLwotCi0gICBlbHNlIGlmIChwYXRobmFtZVswXSA9PSAwKQotICAgICAgcmV0dXJuIDE7IC8qIGVtcHR5IHN0cmluZyAqLwotCi0gICBlbHNlCi0gICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgICBpbnQgcmV0ID0gc3RhdChwYXRobmFtZSwgJmJ1Zik7Ci0KLSAgICAgIGlmIChyZXQgPT0gMCkgLyogdGhlIGVudHJ5IGV4aXN0cyAqLwotICAgICAgewotICAgICAgICAgaWYgKFNfSVNESVIoYnVmLnN0X21vZGUpKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgIC8qIEVsc2UgZXhwZWN0IGFuIG9iamVjdCB0aGF0IGV4aXN0cyBhbmQgY2FuIGJlIHdyaXR0ZW46ICovCi0gICAgICAgICBpZiAoYWNjZXNzKHBhdGhuYW1lLCBXX09LKSAhPSAwKQotICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIFVTRVJfRVJST1IsICIlczogY2Fubm90IGJlIHdyaXR0ZW4gKCVzKSIsIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgICAgICAgcmV0dXJuIDA7IC8qIGZpbGUgKGV4aXN0cywgY2FuIGJlIHdyaXR0ZW4pICovCi0gICAgICB9Ci0KLSAgICAgIGVsc2UgLyogYW4gZXJyb3IgKi8KLSAgICAgIHsKLSAgICAgICAgIC8qIE5vbi1leGlzdGVuY2UgaXMgZmluZSwgb3RoZXIgZXJyb3JzIGFyZSBub3Q6ICovCi0gICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQotICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIFVTRVJfRVJST1IsICIlczogaW52YWxpZCBvdXRwdXQgbmFtZSAoJXMpIiwKLSAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCi0gICAgICAgICByZXR1cm4gMDsgLyogZmlsZSAoZG9lcyBub3QgZXhpc3QpICovCi0gICAgICB9Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWtlbmFtZShzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqaW5maWxlKQotewotICAgLyogTWFrZSBhIG5hbWUgZm9yIGFuIG91dHB1dCBmaWxlIChhbmQgY2hlY2sgaXQpLiAqLwotICAgZHAtPm5hbWVidWZbMF0gPSAwOwotCi0gICBpZiAoZGlyID09IE5VTEwgfHwgaW5maWxlID09IE5VTEwpCi0gICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsICJOVUxMIG5hbWUgdG8gbWFrZW5hbWUiKTsKLQotICAgZWxzZQotICAgewotICAgICAgc2l6ZV90IGRzaXplID0gc3RybGVuKGRpcik7Ci0KLSAgICAgIGlmIChkc2l6ZSA8PSAoc2l6ZW9mIGRwLT5uYW1lYnVmKS0yKSAvKiBBbGxvdyBmb3IgbmFtZSArICcvJyArICdcMCcgKi8KLSAgICAgIHsKLSAgICAgICAgIHNpemVfdCBpc2l6ZSA9IHN0cmxlbihpbmZpbGUpOwotICAgICAgICAgc2l6ZV90IGlzdGFydCA9IGlzaXplLTE7Ci0KLSAgICAgICAgIC8qIFRoaXMgc2hvdWxkIGZhaWwgYmVmb3JlIGhlcmU6ICovCi0gICAgICAgICBpZiAoaW5maWxlW2lzdGFydF0gPT0gJy8nKQotICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIElOVEVSTkFMX0VSUk9SLCAiaW5maWxlIHdpdGggdHJhaWxpbmcgLyIpOwotCi0gICAgICAgICBtZW1jcHkoZHAtPm5hbWVidWYsIGRpciwgZHNpemUpOwotICAgICAgICAgaWYgKGRzaXplID4gMCAmJiBkcC0+bmFtZWJ1Zltkc2l6ZS0xXSAhPSAnLycpCi0gICAgICAgICAgICBkcC0+bmFtZWJ1Zltkc2l6ZSsrXSA9ICcvJzsKLQotICAgICAgICAgLyogRmluZCB0aGUgcmlnaHRtb3N0IG5vbi0vIGNoYXJhY3RlcjogKi8KLSAgICAgICAgIHdoaWxlIChpc3RhcnQgPiAwICYmIGluZmlsZVtpc3RhcnQtMV0gIT0gJy8nKQotICAgICAgICAgICAgLS1pc3RhcnQ7Ci0KLSAgICAgICAgIGlzaXplIC09IGlzdGFydDsKLSAgICAgICAgIGluZmlsZSArPSBpc3RhcnQ7Ci0KLSAgICAgICAgIGlmIChkc2l6ZStpc2l6ZSA8IChzaXplb2YgZHAtPm5hbWVidWYpKSAvKiBkc2l6ZSArIGluZmlsZSArICdcMCcgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweShkcC0+bmFtZWJ1Zitkc2l6ZSwgaW5maWxlLCBpc2l6ZSsxKTsKLQotICAgICAgICAgICAgaWYgKGlzZGlyKGRwLCBkcC0+bmFtZWJ1ZikpCi0gICAgICAgICAgICAgICBkaXNwbGF5X2xvZyhkcCwgVVNFUl9FUlJPUiwgIiVzOiBvdXRwdXQgZmlsZSBpcyBhIGRpcmVjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICBkcC0+bmFtZWJ1Zik7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGRwLT5uYW1lYnVmW2RzaXplXSA9IDA7IC8qIGFsbG93ZWQgZm9yOiAtMiBhdCBzdGFydCAqLwotICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIFVTRVJfRVJST1IsICIlcyVzOiBvdXRwdXQgZmlsZSBuYW1lIHRvbyBsb25nIiwKLSAgICAgICAgICAgICAgICAgIGRwLT5uYW1lYnVmLCBpbmZpbGUpOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgVVNFUl9FUlJPUiwgIiVzOiBvdXRwdXQgZGlyZWN0b3J5IG5hbWUgdG9vIGxvbmciLCBkaXIpOwotICAgfQotfQotCi0vKiBlcnJvciBoYW5kbGVyIGNhbGxiYWNrcyBmb3IgbGlicG5nICovCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotZGlzcGxheV93YXJuaW5nKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZykKLXsKLSAgIHN0cnVjdCBkaXNwbGF5ICpkcCA9IGdldF9kcChwcCk7Ci0KLSAgIC8qIFRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IHJlcGVhdGVkIHdhcm5pbmdzIHdoaWxlIHNlYXJjaGluZyAqLwotICAgaWYgKCFkcC0+bm9fd2FybmluZ3MpCi0gICAgICBkaXNwbGF5X2xvZyhnZXRfZHAocHApLCBMSUJQTkdfV0FSTklORywgIiVzIiwgd2FybmluZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi1kaXNwbGF5X2Vycm9yKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfY29uc3RfY2hhcnAgZXJyb3IpCi17Ci0gICBzdHJ1Y3QgZGlzcGxheSAqZHAgPSBnZXRfZHAocHApOwotCi0gICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0VSUk9SLCAiJXMiLCBlcnJvcik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3N0YXJ0X3JlYWQoc3RydWN0IGRpc3BsYXkgKmRwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotICAgewotICAgICAgZHAtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgICBkcC0+ZnAgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGRwLT5maWxlbmFtZSA9ICI8c3RkaW4+IjsKLSAgICAgIGRwLT5mcCA9IHN0ZGluOwotICAgfQotCi0gICBkcC0+dyA9IGRwLT5oID0gMFU7Ci0gICBkcC0+YnBwID0gMFU7Ci0gICBkcC0+c2l6ZSA9IDBVOwotICAgZHAtPnJlYWRfc2l6ZSA9IDBVOwotCi0gICBpZiAoZHAtPmZwID09IE5VTEwpCi0gICAgICBkaXNwbGF5X2xvZyhkcCwgVVNFUl9FUlJPUiwgImZpbGUgb3BlbiBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi1yZWFkX2Z1bmN0aW9uKHBuZ19zdHJ1Y3RwIHBwLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBzaXplKQotewotICAgc3RydWN0IGRpc3BsYXkgKmRwID0gZ2V0X2RwKHBwKTsKLQotICAgaWYgKHNpemUgPT0gMFUgfHwgZnJlYWQoZGF0YSwgc2l6ZSwgMVUsIGRwLT5mcCkgPT0gMVUpCi0gICAgICBkcC0+cmVhZF9zaXplICs9IHNpemU7Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChmZW9mKGRwLT5mcCkpCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0VSUk9SLCAiUE5HIGZpbGUgdHJ1bmNhdGVkIik7Ci0gICAgICBlbHNlCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0VSUk9SLCAiUE5HIGZpbGUgcmVhZCBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotcmVhZF9wbmcoc3RydWN0IGRpc3BsYXkgKmRwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgIGRpc3BsYXlfY2xlYW5fcmVhZChkcCk7IC8qIHNhZmV0eSAqLwotICAgZGlzcGxheV9zdGFydF9yZWFkKGRwLCBmaWxlbmFtZSk7Ci0KLSAgIGRwLT5yZWFkX3BwID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIGRwLAotICAgICAgZGlzcGxheV9lcnJvciwgZGlzcGxheV93YXJuaW5nKTsKLSAgIGlmIChkcC0+cmVhZF9wcCA9PSBOVUxMKQotICAgICAgZGlzcGxheV9sb2coZHAsIExJQlBOR19FUlJPUiwgImZhaWxlZCB0byBjcmVhdGUgcmVhZCBzdHJ1Y3QiKTsKLQotIyAgaWZkZWYgUE5HX0JFTklHTl9FUlJPUlNfU1VQUE9SVEVECi0gICAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoZHAtPnJlYWRfcHAsIDEvKmFsbG93ZWQqLyk7Ci0jICBlbmRpZiAvKiBCRU5JR05fRVJST1JTICovCi0KLSMgIGlmZGVmIEZJWF9JTkRFWAotICAgICAgaWYgKChkcC0+b3B0aW9ucyAmIEZJWF9JTkRFWCkgIT0gMCkKLSAgICAgICAgIHBuZ19zZXRfY2hlY2tfZm9yX2ludmFsaWRfaW5kZXgoZHAtPnJlYWRfcHAsIDEvKm9uLCBubyB3YXJuaW5nKi8pOwotIyAgICAgaWZkZWYgSUdOT1JFX0lOREVYCi0gICAgICAgICBlbHNlCi0jICAgICBlbmRpZiAvKiBJR05PUkVfSU5ERVggKi8KLSMgIGVuZGlmIC8qIEZJWF9JTkRFWCAqLwotIyAgaWZkZWYgSUdOT1JFX0lOREVYCi0gICAgICBpZiAoKGRwLT5vcHRpb25zICYgSUdOT1JFX0lOREVYKSAhPSAwKSAvKiBEQU5HRVJPVVMgKi8KLSAgICAgICAgIHBuZ19zZXRfY2hlY2tfZm9yX2ludmFsaWRfaW5kZXgoZHAtPnJlYWRfcHAsIC0xLypvZmYgY29tcGxldGVseSovKTsKLSMgIGVuZGlmIC8qIElHTk9SRV9JTkRFWCAqLwotCi0gICAvKiBUaGUgcG5nX3JlYWRfcG5nIEFQSSByZXF1aXJlcyB1cyB0byBtYWtlIHRoZSBpbmZvIHN0cnVjdCwgYnV0IGl0IGRvZXMgdGhlCi0gICAgKiBjYWxsIHRvIHBuZ19yZWFkX2luZm8uCi0gICAgKi8KLSAgIGRwLT5pcCA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoZHAtPnJlYWRfcHApOwotICAgaWYgKGRwLT5pcCA9PSBOVUxMKQotICAgICAgcG5nX2Vycm9yKGRwLT5yZWFkX3BwLCAiZmFpbGVkIHRvIGNyZWF0ZSBpbmZvIHN0cnVjdCIpOwotCi0gICAvKiBTZXQgdGhlIElPIGhhbmRsaW5nICovCi0gICBwbmdfc2V0X3JlYWRfZm4oZHAtPnJlYWRfcHAsIGRwLCByZWFkX2Z1bmN0aW9uKTsKLQotIyAgaWZkZWYgUE5HX0hBTkRMRV9BU19VTktOT1dOX1NVUFBPUlRFRAotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKGRwLT5yZWFkX3BwLCBQTkdfSEFORExFX0NIVU5LX0FMV0FZUywgTlVMTCwKLSAgICAgICAgICAgIDApOwotIyAgZW5kaWYgLyogSEFORExFX0FTX1VOS05PV04gKi8KLQotIyAgaWZkZWYgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKLSAgICAgIC8qIFJlbW92ZSB0aGUgdXNlciBsaW1pdHMsIGlmIGFueSAqLwotICAgICAgcG5nX3NldF91c2VyX2xpbWl0cyhkcC0+cmVhZF9wcCwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZik7Ci0jICBlbmRpZiAvKiBTRVRfVVNFUl9MSU1JVFMgKi8KLQotICAgLyogTm93IHJlYWQgdGhlIFBORy4gKi8KLSAgIHN0YXJ0X3RpbWVyKGRwLCBQTkdDUF9USU1FX1JFQUQpOwotICAgcG5nX3JlYWRfcG5nKGRwLT5yZWFkX3BwLCBkcC0+aXAsIDBVLyp0cmFuc2Zvcm1zKi8sIE5VTEwvKnBhcmFtcyovKTsKLSAgIGVuZF90aW1lcihkcCwgUE5HQ1BfVElNRV9SRUFEKTsKLSAgIGRwLT53ID0gcG5nX2dldF9pbWFnZV93aWR0aChkcC0+cmVhZF9wcCwgZHAtPmlwKTsKLSAgIGRwLT5oID0gcG5nX2dldF9pbWFnZV9oZWlnaHQoZHAtPnJlYWRfcHAsIGRwLT5pcCk7Ci0gICBkcC0+Y3QgPSBwbmdfZ2V0X2NvbG9yX3R5cGUoZHAtPnJlYWRfcHAsIGRwLT5pcCk7Ci0gICBkcC0+YnBwID0gcG5nX2dldF9iaXRfZGVwdGgoZHAtPnJlYWRfcHAsIGRwLT5pcCkgKgotICAgICAgICAgICAgIHBuZ19nZXRfY2hhbm5lbHMoZHAtPnJlYWRfcHAsIGRwLT5pcCk7Ci0gICB7Ci0gICAgICAvKiBwbmdfZ2V0X3Jvd2J5dGVzIHNob3VsZCBuZXZlciByZXR1cm4gMCBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBzZXQgYnkgdGhlCi0gICAgICAgKiBmaXJzdCBjYWxsIHRvIHBuZ19zZXRfSUhEUiwgd2hpY2ggc2hvdWxkIGhhdmUgaGFwcGVuZWQgYnkgbm93LCBidXQganVzdAotICAgICAgICogaW4gY2FzZToKLSAgICAgICAqLwotICAgICAgcG5nX2FsbG9jX3NpemVfdCByYiA9IHBuZ19nZXRfcm93Ynl0ZXMoZHAtPnJlYWRfcHAsIGRwLT5pcCk7Ci0KLSAgICAgIGlmIChyYiA9PSAwKQotICAgICAgICAgcG5nX2Vycm9yKGRwLT5yZWFkX3BwLCAiaW52YWxpZCByb3cgYnl0ZSBjb3VudCBmcm9tIGxpYnBuZyIpOwotCi0gICAgICAvKiBUaGUgc2l6ZSBjYWxjIGNhbiBvdmVyZmxvdy4gKi8KLSAgICAgIGlmICgoTUFYX1NJWkUtZHAtPmgpL3JiIDwgZHAtPmgpCi0gICAgICAgICBwbmdfZXJyb3IoZHAtPnJlYWRfcHAsICJpbWFnZSB0b28gbGFyZ2UiKTsKLQotICAgICAgZHAtPnNpemUgPSByYiAqIGRwLT5oICsgZHAtPmgvKmZpbHRlciBieXRlKi87Ci0gICB9Ci0KLSNpZmRlZiBGSVhfSU5ERVgKLSAgIGlmIChkcC0+Y3QgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSAmJiAoZHAtPm9wdGlvbnMgJiBGSVhfSU5ERVgpICE9IDApCi0gICB7Ci0gICAgICBpbnQgbWF4ID0gcG5nX2dldF9wYWxldHRlX21heChkcC0+cmVhZF9wcCwgZHAtPmlwKTsKLSAgICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSA9IE5VTEw7Ci0gICAgICBpbnQgbnVtID0gLTE7Ci0KLSAgICAgIGlmIChwbmdfZ2V0X1BMVEUoZHAtPnJlYWRfcHAsIGRwLT5pcCwgJnBhbGV0dGUsICZudW0pICE9IFBOR19JTkZPX1BMVEUKLSAgICAgICAgICB8fCBtYXggPCAwIHx8IG51bSA8PSAwIHx8IHBhbGV0dGUgPT0gTlVMTCkKLSAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBMSUJQTkdfRVJST1IsICJpbnZhbGlkIHBuZ19nZXRfUExURSByZXN1bHQiKTsKLQotICAgICAgaWYgKG1heCA+PSBudW0pCi0gICAgICB7Ci0gICAgICAgICAvKiAnRml4JyB0aGUgcGFsZXR0ZS4gKi8KLSAgICAgICAgIGludCBpOwotICAgICAgICAgcG5nX2NvbG9yIG5ld3BhbFsyNTZdOwotCi0gICAgICAgICBmb3IgKGk9MDsgaTxudW07ICsraSkKLSAgICAgICAgICAgIG5ld3BhbFtpXSA9IHBhbGV0dGVbaV07Ci0KLSAgICAgICAgIC8qIEZpbGwgaW4gYW55IHJlbWFpbmRlciB3aXRoIGEgd2FybmluZyBjb2xvcjogKi8KLSAgICAgICAgIGZvciAoOyBpPD1tYXg7ICsraSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG5ld3BhbFtpXS5yZWQgPSAweGJlOwotICAgICAgICAgICAgbmV3cGFsW2ldLmdyZWVuID0gMHhhZDsKLSAgICAgICAgICAgIG5ld3BhbFtpXS5ibHVlID0gMHhlZDsKLSAgICAgICAgIH0KLQotICAgICAgICAgcG5nX3NldF9QTFRFKGRwLT5yZWFkX3BwLCBkcC0+aXAsIG5ld3BhbCwgaSk7Ci0gICAgICB9Ci0gICB9Ci0jZW5kaWYgLyogRklYX0lOREVYICovCi0KLSAgIGRpc3BsYXlfY2xlYW5fcmVhZChkcCk7Ci0gICBkcC0+b3BlcmF0aW9uID0gIm5vbmUiOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9zdGFydF93cml0ZShzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgYXNzZXJ0KGRwLT5mcCA9PSBOVUxMKTsKLQotICAgaWYgKChkcC0+b3B0aW9ucyAmIE5PV1JJVEUpICE9IDApCi0gICAgICBkcC0+b3V0cHV0X2ZpbGUgPSAiPG5vIHdyaXRlPiI7Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotICAgICAgewotICAgICAgICAgZHAtPm91dHB1dF9maWxlID0gZmlsZW5hbWU7Ci0gICAgICAgICBkcC0+ZnAgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGRwLT5vdXRwdXRfZmlsZSA9ICI8c3Rkb3V0PiI7Ci0gICAgICAgICBkcC0+ZnAgPSBzdGRvdXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkcC0+ZnAgPT0gTlVMTCkKLSAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLCAiJXM6IGZpbGUgb3BlbiBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICAgICBkcC0+b3V0cHV0X2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi13cml0ZV9mdW5jdGlvbihwbmdfc3RydWN0cCBwcCwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3Qgc2l6ZSkKLXsKLSAgIHN0cnVjdCBkaXNwbGF5ICpkcCA9IGdldF9kcChwcCk7Ci0KLSAgIC8qIFRoZSB3cml0ZSBmYWlsIGlzIGNsYXNzZWQgYXMgYSBVU0VSX0VSUk9SLCBzbyAtLXF1aWV0IGRvZXMgbm90IHR1cm4gaXQKLSAgICAqIG9mZiwgdGhpcyBzZWVtcyBtb3JlIGxpa2VseSB0byBiZSBjb3JyZWN0LgotICAgICovCi0gICBpZiAoZHAtPmZwID09IE5VTEwgfHwgZndyaXRlKGRhdGEsIHNpemUsIDFVLCBkcC0+ZnApID09IDFVKQotICAgewotICAgICAgZHAtPndyaXRlX3NpemUgKz0gc2l6ZTsKLSAgICAgIGlmIChkcC0+d3JpdGVfc2l6ZSA8IHNpemUgfHwgZHAtPndyaXRlX3NpemUgPT0gTUFYX1NJWkUpCi0gICAgICAgICBwbmdfZXJyb3IocHAsICJJREFUIHNpemUgb3ZlcmZsb3ciKTsKLSAgIH0KLQotICAgZWxzZQotICAgICAgZGlzcGxheV9sb2coZHAsIFVTRVJfRVJST1IsICIlczogUE5HIGZpbGUgd3JpdGUgZmFpbGVkICglcykiLAotICAgICAgICAgICAgZHAtPm91dHB1dF9maWxlLCBzdHJlcnJvcihlcnJubykpOwotfQotCi0vKiBDb21wcmVzc2lvbiBvcHRpb24sICdtZXRob2QnIGlzIG5ldmVyIHNldDogdGhlcmUgaXMgbm8gY2hvaWNlLgotICoKLSAqIElNUE9SVEFOVDogdGhlIG9yZGVyIG9mIHRoZSBlbnRyaWVzIGluIHRoaXMgbWFjcm8gZGV0ZXJtaW5lcyB0aGUgcHJlZmVyZW5jZQotICogb3JkZXIgd2hlbiB0d28gZGlmZmVyZW50IGNvbWJvcyBvZiB0d28gb2YgdGhlc2Ugb3B0aW9ucyBwcm9kdWNlIGFuIElEQVQgb2YKLSAqIHRoZSBzYW1lIHNpemUuICBUaGUgbG9naWMgaGVyZSBpcyB0byBwdXQgdGhlIHRoaW5ncyB0aGF0IGFmZmVjdCB0aGUgZGVjb2RpbmcKLSAqIG9mIHRoZSBQTkcgaW1hZ2UgYWhlYWQgb2YgdGhvc2UgdGhhdCBhcmUgcmVsZXZhbnQgb25seSB0byB0aGUgZW5jb2RpbmcuCi0gKi8KLSNkZWZpbmUgU0VUX0NPTVBSRVNTSU9OXAotICAgU0VUKHN0cmF0ZWd5LCBzdHJhdGVneSk7XAotICAgU0VUKHdpbmRvd0JpdHMsIHdpbmRvd19iaXRzKTtcCi0gICBTRVQobGV2ZWwsIGxldmVsKTtcCi0gICBTRVQobWVtTGV2ZWwsIG1lbV9sZXZlbCk7Ci0KLSNpZmRlZiBQTkdfV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OX1NVUFBPUlRFRAotc3RhdGljIHZvaWQKLXNlYXJjaF9jb21wcmVzc2lvbihzdHJ1Y3QgZGlzcGxheSAqZHApCi17Ci0gICAvKiBMaWtlIHNldF9jb21wcmVzc2lvbiBiZWxvdyBidXQgdXNlIGEgbW9yZSByZXN0cmljdGVkIHNlYXJjaCB0aGFuICdhbGwnICovCi0gICBpbnQgdmFsOwotCi0jICBkZWZpbmUgU0VUKG5hbWUsIGZ1bmMpIGlmIChnZXRzZWFyY2hvcHRzKGRwLCAjbmFtZSwgJnZhbCkpXAotICAgICAgcG5nX3NldF9jb21wcmVzc2lvbl8gIyMgZnVuYyhkcC0+d3JpdGVfcHAsIHZhbCk7Ci0gICBTRVRfQ09NUFJFU1NJT04KLSMgIHVuZGVmIFNFVAotfQotCi1zdGF0aWMgdm9pZAotc2V0X2NvbXByZXNzaW9uKHN0cnVjdCBkaXNwbGF5ICpkcCkKLXsKLSAgIGludCB2YWw7Ci0KLSMgIGRlZmluZSBTRVQobmFtZSwgZnVuYykgaWYgKGdldGFsbG9wdHMoZHAsICNuYW1lLCAmdmFsKSlcCi0gICAgICBwbmdfc2V0X2NvbXByZXNzaW9uXyAjIyBmdW5jKGRwLT53cml0ZV9wcCwgdmFsKTsKLSAgIFNFVF9DT01QUkVTU0lPTgotIyAgdW5kZWYgU0VUCi19Ci0KLSNpZmRlZiBQTkdfU1dfQ09NUFJFU1NfbGV2ZWwgLyogMS43LjArICovCi1zdGF0aWMgdm9pZAotc2V0X0lDQ19wcm9maWxlX2NvbXByZXNzaW9uKHN0cnVjdCBkaXNwbGF5ICpkcCkKLXsKLSAgIGludCB2YWw7Ci0KLSMgIGRlZmluZSBTRVQobmFtZSwgZnVuYykgaWYgKGdldGFsbG9wdHMoZHAsICJJQ0MtcHJvZmlsZS0iICNuYW1lLCAmdmFsKSlcCi0gICAgICBwbmdfc2V0X0lDQ19wcm9maWxlX2NvbXByZXNzaW9uXyAjIyBmdW5jKGRwLT53cml0ZV9wcCwgdmFsKTsKLSAgIFNFVF9DT01QUkVTU0lPTgotIyAgdW5kZWYgU0VUCi19Ci0jZWxzZQotIyAgZGVmaW5lIHNldF9JQ0NfcHJvZmlsZV9jb21wcmVzc2lvbihkcCkgKCh2b2lkKTApCi0jZW5kaWYKLSNlbHNlCi0jICBkZWZpbmUgc2VhcmNoX2NvbXByZXNzaW9uKGRwKSAoKHZvaWQpMCkKLSMgIGRlZmluZSBzZXRfY29tcHJlc3Npb24oZHApICgodm9pZCkwKQotIyAgZGVmaW5lIHNldF9JQ0NfcHJvZmlsZV9jb21wcmVzc2lvbihkcCkgKCh2b2lkKTApCi0jZW5kaWYgLyogV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OICovCi0KLSNpZmRlZiBQTkdfV1JJVEVfQ1VTVE9NSVpFX1pUWFRfQ09NUFJFU1NJT05fU1VQUE9SVEVECi1zdGF0aWMgdm9pZAotc2V0X3RleHRfY29tcHJlc3Npb24oc3RydWN0IGRpc3BsYXkgKmRwKQotewotICAgaW50IHZhbDsKLQotIyAgZGVmaW5lIFNFVChuYW1lLCBmdW5jKSBpZiAoZ2V0YWxsb3B0cyhkcCwgInRleHQtIiAjbmFtZSwgJnZhbCkpXAotICAgICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uXyAjIyBmdW5jKGRwLT53cml0ZV9wcCwgdmFsKTsKLSAgIFNFVF9DT01QUkVTU0lPTgotIyAgdW5kZWYgU0VUCi19Ci0jZWxzZQotIyAgZGVmaW5lIHNldF90ZXh0X2NvbXByZXNzaW9uKGRwKSAoKHZvaWQpMCkKLSNlbmRpZiAvKiBXUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTiAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcG5nKHN0cnVjdCBkaXNwbGF5ICpkcCwgY29uc3QgY2hhciAqZGVzdG5hbWUpCi17Ci0gICBkaXNwbGF5X2NsZWFuX3dyaXRlKGRwKTsgLyogc2FmZXR5ICovCi0gICBkaXNwbGF5X3N0YXJ0X3dyaXRlKGRwLCBkZXN0bmFtZSk7Ci0KLSAgIGRwLT53cml0ZV9wcCA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgZHAsCi0gICAgICBkaXNwbGF5X2Vycm9yLCBkaXNwbGF5X3dhcm5pbmcpOwotCi0gICBpZiAoZHAtPndyaXRlX3BwID09IE5VTEwpCi0gICAgICBkaXNwbGF5X2xvZyhkcCwgTElCUE5HX0VSUk9SLCAiZmFpbGVkIHRvIGNyZWF0ZSB3cml0ZSBwbmdfc3RydWN0Iik7Ci0KLSMgIGlmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRAotICAgICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzKGRwLT53cml0ZV9wcCwgMS8qYWxsb3dlZCovKTsKLSMgIGVuZGlmIC8qIEJFTklHTl9FUlJPUlMgKi8KLQotICAgcG5nX3NldF93cml0ZV9mbihkcC0+d3JpdGVfcHAsIGRwLCB3cml0ZV9mdW5jdGlvbiwgTlVMTC8qZmx1c2gqLyk7Ci0KLSNpZmRlZiBJR05PUkVfSU5ERVgKLSAgIGlmICgoZHAtPm9wdGlvbnMgJiBJR05PUkVfSU5ERVgpICE9IDApIC8qIERBTkdFUk9VUyAqLwotICAgICAgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChkcC0+d3JpdGVfcHAsIC0xLypvZmYgY29tcGxldGVseSovKTsKLSNlbmRpZiAvKiBJR05PUkVfSU5ERVggKi8KLQotICAgLyogUmVzdG9yZSB0aGUgdGV4dCBjaHVua3Mgd2hlbiB1c2luZyBsaWJwbmcgMS42IG9yIGxlc3M7IHRoaXMgaXMgYSBtYWNybwotICAgICogd2hpY2ggZXhwYW5kcyB0byBub3RoaW5nIGluIDEuNysgIEluIGVhcmxpZXIgdmVyc2lvbnMgaXQgdGVzdHMKLSAgICAqIGRwLT50ZXh0X3N0YXNoZWQsIHdoaWNoIGlzIG9ubHkgc2V0IChiZWxvdykgKmFmdGVyKiB0aGUgZmlyc3Qgd3JpdGUuCi0gICAgKi8KLSAgIHRleHRfcmVzdG9yZShkcCk7Ci0KLSMgIGlmZGVmIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhkcC0+d3JpdGVfcHAsIFBOR19IQU5ETEVfQ0hVTktfQUxXQVlTLCBOVUxMLAotICAgICAgICAgICAgMCk7Ci0jICBlbmRpZiAvKiBIQU5ETEVfQVNfVU5LTk9XTiAqLwotCi0jICBpZmRlZiBQTkdfU0VUX1VTRVJfTElNSVRTX1NVUFBPUlRFRAotICAgICAgLyogUmVtb3ZlIHRoZSB1c2VyIGxpbWl0cywgaWYgYW55ICovCi0gICAgICBwbmdfc2V0X3VzZXJfbGltaXRzKGRwLT53cml0ZV9wcCwgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZik7Ci0jICBlbmRpZgotCi0gICAvKiBPUFRJT04gSEFORExJTkcgKi8KLSAgIC8qIGNvbXByZXNzaW9uIG91dHB1dHMsIElEQVQgYW5kIHpUWHQvaVRYdDogKi8KLSAgIGRwLT50c3AgPSBkcC0+bnNwOwotICAgZHAtPm5zcCA9IGRwLT5jc3AgPSAwOwotIyAgaWZkZWYgUE5HX1NXX0NPTVBSRVNTX3BuZ19sZXZlbAotICAgICAgewotICAgICAgICAgaW50IHZhbDsKLQotICAgICAgICAgLyogVGhpcyBzZXRzIGV2ZXJ5dGhpbmcsIGJ1dCB0aGVuIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBqdXN0IG92ZXJyaWRlCi0gICAgICAgICAgKiB0aGUgc3BlY2lmaWMgc2V0dGluZ3MgZm9yIElDQyBwcm9maWxlcyBhbmQgdGV4dC4KLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKGdldGFsbG9wdHMoZHAsICJjb21wcmVzc2lvbiIsICZ2YWwpKQotICAgICAgICAgICAgcG5nX3NldF9jb21wcmVzc2lvbihkcC0+d3JpdGVfcHAsIHZhbCk7Ci0KLSAgICAgICAgIGlmIChnZXRhbGxvcHRzKGRwLCAiSUNDLXByb2ZpbGUtY29tcHJlc3Npb24iLCAmdmFsKSkKLSAgICAgICAgICAgIHBuZ19zZXRfSUNDX3Byb2ZpbGVfY29tcHJlc3Npb24oZHAtPndyaXRlX3BwLCB2YWwpOwotCi0gICAgICAgICBpZiAoZ2V0YWxsb3B0cyhkcCwgInRleHQtY29tcHJlc3Npb24iLCAmdmFsKSkKLSAgICAgICAgICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbihkcC0+d3JpdGVfcHAsIHZhbCk7Ci0gICAgICB9Ci0jICBlbmRpZiAvKiBwbmdfbGV2ZWwgc3VwcG9ydCAqLwotICAgaWYgKGRwLT5vcHRpb25zICYgU0VBUkNIKQotICAgICAgc2VhcmNoX2NvbXByZXNzaW9uKGRwKTsKLSAgIGVsc2UKLSAgICAgIHNldF9jb21wcmVzc2lvbihkcCk7Ci0gICBzZXRfSUNDX3Byb2ZpbGVfY29tcHJlc3Npb24oZHApOwotICAgc2V0X3RleHRfY29tcHJlc3Npb24oZHApOwotCi0gICB7Ci0gICAgICBpbnQgdmFsOwotCi0gICAgICAvKiBUaGUgcGVybWl0dGVkIHJhbmdlIGlzIDEuLjB4N0ZGRkZGRkYsIHNvIHRoZSBjYXN0IGlzIHNhZmUgKi8KLSAgICAgIGlmIChnZXRfb3B0aW9uKGRwLCAiSURBVC1zaXplIiwgJnZhbCkpCi0gICAgICAgICBwbmdfc2V0X0lEQVRfc2l6ZShkcC0+d3JpdGVfcHAsIHZhbCk7Ci0gICB9Ci0KLSAgIC8qIGZpbHRlciBoYW5kbGluZyAqLwotIyAgaWZkZWYgUE5HX1dSSVRFX0ZJTFRFUl9TVVBQT1JURUQKLSAgICAgIHsKLSAgICAgICAgIGludCB2YWw7Ci0KLSAgICAgICAgIGlmIChnZXRfb3B0aW9uKGRwLCAiZmlsdGVyIiwgJnZhbCkpCi0gICAgICAgICAgICBwbmdfc2V0X2ZpbHRlcihkcC0+d3JpdGVfcHAsIFBOR19GSUxURVJfVFlQRV9CQVNFLCB2YWwpOwotICAgICAgfQotIyAgZW5kaWYgLyogV1JJVEVfRklMVEVSICovCi0KLSAgIC8qIFRoaXMganVzdCB1c2VzIHRoZSAncmVhZCcgaW5mb19zdHJ1Y3QgZGlyZWN0bHksIGl0IGNvbnRhaW5zIHRoZSBpbWFnZS4gKi8KLSAgIGRwLT53cml0ZV9zaXplID0gMFU7Ci0gICBzdGFydF90aW1lcihkcCwgUE5HQ1BfVElNRV9XUklURSk7Ci0gICBwbmdfd3JpdGVfcG5nKGRwLT53cml0ZV9wcCwgZHAtPmlwLCAwVS8qdHJhbnNmb3JtcyovLCBOVUxMLypwYXJhbXMqLyk7Ci0gICBlbmRfdGltZXIoZHAsIFBOR0NQX1RJTUVfV1JJVEUpOwotCi0gICAvKiBNYWtlIHN1cmUgdGhlIGZpbGUgd2FzIHdyaXR0ZW4gb2s6ICovCi0gICBpZiAoZHAtPmZwICE9IE5VTEwpCi0gICB7Ci0gICAgICBGSUxFICpmcCA9IGRwLT5mcDsKLSAgICAgIGRwLT5mcCA9IE5VTEw7Ci0gICAgICBpZiAoZmNsb3NlKGZwKSkKLSAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfRVJST1IsICIlczogd3JpdGUgZmFpbGVkICglcykiLAotICAgICAgICAgICAgICAgZGVzdG5hbWUgPT0gTlVMTCA/ICJzdGRvdXQiIDogZGVzdG5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICB9Ci0KLSAgIC8qIENsZWFuIGl0IG9uIHRoZSB3YXkgb3V0IC0gaWYgY29udHJvbCByZXR1cm5zIHRvIHRoZSBjYWxsZXIgdGhlbiB0aGUKLSAgICAqIHdyaXR0ZW5fZmlsZSBjb250YWlucyB0aGUgcmVxdWlyZWQgZGF0YS4KLSAgICAqLwotICAgZGlzcGxheV9jbGVhbl93cml0ZShkcCk7Ci0gICBkcC0+b3BlcmF0aW9uID0gIm5vbmUiOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3dpbmRvd0JpdHNfaGkoc3RydWN0IGRpc3BsYXkgKmRwKQotewotICAgLyogd2luZG93Qml0cyBpcyBpbiB0aGUgcmFuZ2UgOC4uMTUgYnV0IHpsaWIgbWFwcyAnOCcgdG8gJzknIHNvIGl0IGlzIG9ubHkKLSAgICAqIHdvcnRoIHVzaW5nIGlmIHRoZSBkYXRhIHNpemUgaXMgMjU2IGJ5dGUgb3IgbGVzcy4KLSAgICAqLwotICAgaW50IHdiID0gTUFYX1dCSVRTOyAvKiBmb3IgbGFyZ2UgaW1hZ2VzICovCi0gICBpbnQgaSA9IFZMU0laRSh3aW5kb3dCaXRzX0lEQVQpOwotCi0gICB3aGlsZSAod2IgPiA4ICYmIGRwLT5zaXplIDw9IDFVPDwod2ItMSkpIC0td2I7Ci0KLSAgIHdoaWxlICgtLWkgPj0gMCkgaWYgKFZMTkFNRSh3aW5kb3dCaXRzX0lEQVQpW2ldLm5hbWUgPT0gcmFuZ2VfaGkpIGJyZWFrOwotCi0gICBhc3NlcnQoaSA+IDEpOyAvKiB2bF93aW5kb3dCaXRzX0lEQVQgYWx3YXlzIGhhcyBhIFJBTkdFKCkgKi8KLSAgIFZMTkFNRSh3aW5kb3dCaXRzX0lEQVQpW2ldLnZhbHVlID0gd2I7Ci0KLSAgIGFzc2VydChWTE5BTUUod2luZG93Qml0c19JREFUKVstLWldLm5hbWUgPT0gcmFuZ2VfbG8pOwotICAgVkxOQU1FKHdpbmRvd0JpdHNfSURBVClbaV0udmFsdWUgPSB3YiA+IDggPyA5IDogODsKLQotICAgLyogSWYgd2IgPT0gOCB0aGVuIGFueSBzZWFyY2ggaGFzIGJlZW4gcmVzdHJpY3RlZCB0byBqdXN0IG9uZSB3aW5kb3dCaXRzCi0gICAgKiBlbnRyeS4gIFJlY29yZCB0aGF0IGhlcmUgdG8gYXZvaWQgcHJvZHVjaW5nIGEgc3B1cmlvdXMgYXBwLWxldmVsIHdhcm5pbmcKLSAgICAqIGFib3ZlLgotICAgICovCi0gICBpZiAod2IgPT0gOCkKLSAgICAgIGRwLT5taW5fd2luZG93Qml0cyA9IE9QVElORChkcCwgd2luZG93Qml0cyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWJldHRlcl9vcHRpb25zKGNvbnN0IHN0cnVjdCBkaXNwbGF5ICpkcCkKLXsKLSAgIC8qIEFyZSB0aGVzZSBvcHRpb25zIGJldHRlciB0aGFuIHRoZSBiZXN0IGZvdW5kIHNvIGZhcj8gIE5vcm1hbGx5IHRoZQotICAgICogb3B0aW9ucyBhcmUgdGVzdGVkIGluIHByZWZlcmVuY2Ugb3JkZXIsIGJlc3QgZmlyc3QsIGhvd2V2ZXIgd2hlbiBkb2luZyBhCi0gICAgKiBzZWFyY2ggb3BlcmF0aW9uIG9uIGEgcmFuZ2UgdGhlIHJhbmdlIHZhbHVlcyBhcmUgdGVzdGVkIG91dCBvZiBvcmRlci4gIEluCi0gICAgKiB0aGF0IGNhc2UgcHJlZmVyYWJsZSBvcHRpb25zIHdpbGwgZ2V0IHRlc3RlZCBsYXRlci4KLSAgICAqCi0gICAgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHRocm91Z2ggdGhlIHN0YWNrIGZyb20gdGhlIGJvdHRvbSB1cCBsb29raW5nIGZvciBhbgotICAgICogb3B0aW9uIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgYmVzdCB2YWx1ZS4gIFdoZW4gaXQgZmluZHMgb25lIGl0Ci0gICAgKiBjaGVja3MgdG8gc2VlIGlmIGl0IGlzIG1vcmUgb3IgbGVzcyBkZXNpcmVhYmxlIGFuZCByZXR1cm5zIHRydWUgb3IgZmFsc2UKLSAgICAqIGFzIGFwcHJvcHJpYXRlLgotICAgICoKLSAgICAqIE5vdGljZSB0aGF0IHRoaXMgbWVhbnMgdGhhdCB0aGUgb3JkZXIgb3B0aW9ucyBhcmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrCi0gICAgKiBjb252ZXlzIGEgcHJpb3JpdHk7IGxvd2VyL2VhcmxpZXIgb3B0aW9ucyBhcmUgbW9yZSBpbXBvcnRhbnQgdGhhbiBsYXRlcgotICAgICogb25lcy4KLSAgICAqLwotICAgdW5zaWduZWQgaW50IHNwOwotCi0gICBmb3IgKHNwPTA7IHNwPGRwLT5jc3A7ICsrc3ApCi0gICB7Ci0gICAgICBpbnQgYyA9IGNvbXBhcmVfb3B0aW9uKGRwLCBzcCk7Ci0KLSAgICAgIGlmIChjIDwgMCkKLSAgICAgICAgIHJldHVybiAwOyAvKiB3b3JzZSAqLwotCi0gICAgICBlbHNlIGlmIChjID4gMCkKLSAgICAgICAgIHJldHVybiAxOyAvKiBiZXR0ZXIgKi8KLSAgIH0KLQotICAgYXNzZXJ0KDAgJiYgInVucmVhY2hlZCIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2VhcmNoX3Jlc3VsdHMoc3RydWN0IGRpc3BsYXkgKmRwKQotewotICAgYXNzZXJ0KGRwLT5maWxlbmFtZSAhPSBOVUxMKTsKLSAgIHByaW50ZigiJXMgWyVsZCB4ICVsZCAlZCBicHAgJXMsICVsdSBieXRlc10gJWx1IC0+ICVsdSB3aXRoICclcydcbiIsCi0gICAgICBkcC0+ZmlsZW5hbWUsICh1bnNpZ25lZCBsb25nKWRwLT53LCAodW5zaWduZWQgbG9uZylkcC0+aCwgZHAtPmJwcCwKLSAgICAgIGN0cyhkcC0+Y3QpLCAodW5zaWduZWQgbG9uZylkcC0+c2l6ZSwgKHVuc2lnbmVkIGxvbmcpZHAtPnJlYWRfc2l6ZSwKLSAgICAgICh1bnNpZ25lZCBsb25nKWRwLT5iZXN0X3NpemUsIGRwLT5iZXN0KTsKLSAgIGZmbHVzaChzdGRvdXQpOwotfQotCi1zdGF0aWMgdm9pZAotbG9nX3NlYXJjaChzdHJ1Y3QgZGlzcGxheSAqZHAsIHVuc2lnbmVkIGludCBsb2dfZGVwdGgpCi17Ci0gICAvKiBMb2csIGFuZCByZXNldCwgdGhlIHNlYXJjaCBzbyBmYXI6ICovCi0gICBpZiAoZHAtPm5zcC8qbmV4dCBlbnRyeSB0byBjaGFuZ2UqLyA8PSBsb2dfZGVwdGgpCi0gICB7Ci0gICAgICBwcmludF9zZWFyY2hfcmVzdWx0cyhkcCk7Ci0gICAgICAvKiBTdGFydCBhZ2FpbiB3aXRoIHRoaXMgZW50cnk6ICovCi0gICAgICBkcC0+YmVzdF9zaXplID0gTUFYX1NJWkU7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jcF9vbmVfZmlsZShzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpkZXN0bmFtZSkKLXsKLSAgIHVuc2lnbmVkIGludCBsb2dfZGVwdGg7Ci0KLSAgIGRwLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgZHAtPm9wZXJhdGlvbiA9ICJyZWFkIjsKLSAgIGRwLT5ub193YXJuaW5ncyA9IDA7Ci0KLSAgIC8qIFJlYWQgaXQgdGhlbiB3cml0ZSBpdDogKi8KLSAgIGlmIChmaWxlbmFtZSAhPSBOVUxMICYmIGFjY2VzcyhmaWxlbmFtZSwgUl9PSykgIT0gMCkKLSAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLCAiJXM6IGludmFsaWQgZmlsZSBuYW1lICglcykiLAotICAgICAgICAgICAgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0KLSAgIHJlYWRfcG5nKGRwLCBmaWxlbmFtZSk7Ci0KLSAgIC8qIEJ1dCAnZGVzdG5hbWUnIG1heSBiZSBhIGRpcmVjdG9yeS4gKi8KLSAgIGRwLT5vcGVyYXRpb24gPSAid3JpdGUiOwotCi0gICAvKiBMaW1pdCB0aGUgdXBwZXIgZW5kIG9mIHRoZSB3aW5kb3dCaXRzIHJhbmdlIGZvciB0aGlzIGZpbGUgKi8KLSAgIHNldF93aW5kb3dCaXRzX2hpKGRwKTsKLQotICAgLyogRm9yIGxvZ2dpbmcsIGRlcHRoIHRvIGxvZzogKi8KLSAgIHsKLSAgICAgIGludCB2YWw7Ci0KLSAgICAgIGlmIChnZXRfb3B0aW9uKGRwLCAibG9nLWRlcHRoIiwgJnZhbCkgJiYgdmFsID49IDApCi0gICAgICAgICBsb2dfZGVwdGggPSAodW5zaWduZWQgaW50KS8qU0FGRSovdmFsOwotCi0gICAgICBlbHNlCi0gICAgICAgICBsb2dfZGVwdGggPSAwVTsKLSAgIH0KLQotICAgaWYgKGRlc3RuYW1lICE9IE5VTEwpIC8qIGVsc2Ugc3Rkb3V0ICovCi0gICB7Ci0gICAgICBpZiAoaXNkaXIoZHAsIGRlc3RuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgIG1ha2VuYW1lKGRwLCBkZXN0bmFtZSwgZmlsZW5hbWUpOwotICAgICAgICAgZGVzdG5hbWUgPSBkcC0+bmFtZWJ1ZjsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoYWNjZXNzKGRlc3RuYW1lLCBXX09LKSAhPSAwICYmIGVycm5vICE9IEVOT0VOVCkKLSAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBVU0VSX0VSUk9SLCAiJXM6IGludmFsaWQgb3V0cHV0IG5hbWUgKCVzKSIsIGRlc3RuYW1lLAotICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgIH0KLQotICAgZHAtPm5zcCA9IDA7Ci0gICBkcC0+Y3VyclswXSA9IDA7IC8qIGFjdHMgYXMgYSBmbGFnIGZvciB0aGUgY2FsbGVyICovCi0gICBkcC0+b3B0X3N0cmluZ19zdGFydCA9IDA7Ci0gICBkcC0+YmVzdFswXSA9IDA7IC8qIHNhZmV0eSAqLwotICAgZHAtPmJlc3Rfc2l6ZSA9IE1BWF9TSVpFOwotICAgd3JpdGVfcG5nKGRwLCBkZXN0bmFtZSk7Ci0KLSAgIC8qIEluaXRpYWxpemUgdGhlICdiZXN0JyBmaWVsZHM6ICovCi0gICBzdHJjcHkoZHAtPmJlc3QsIGRwLT5jdXJyKTsKLSAgIGRwLT5iZXN0X3NpemUgPSBkcC0+d3JpdGVfc2l6ZTsKLQotICAgaWYgKGRwLT5uc3AgPiAwKSAvKiBpbnRlcmF0aW5nIG92ZXIgbGlzdHMgKi8KLSAgIHsKLSAgICAgIGNoYXIgKnRtcG5hbWUsIHRtcGJ1Zlsoc2l6ZW9mIGRwLT5uYW1lYnVmKSArIDRdOwotICAgICAgYXNzZXJ0KGRwLT5jdXJyWzBdID09ICcgJyAmJiBkcC0+dHNwID4gMCk7Ci0KLSAgICAgIC8qIENhbmNlbCB3YXJuaW5ncyBvbiBzdWJzZXF1ZW50IHdyaXRlcyAqLwotICAgICAgbG9nX3NlYXJjaChkcCwgbG9nX2RlcHRoKTsKLSAgICAgIGRwLT5ub193YXJuaW5ncyA9IDE7Ci0KLSAgICAgIC8qIE1ha2UgYSB0ZW1wb3JhcnkgbmFtZSBmb3IgdGhlIHN1YnNlcXVlbnQgdGVzdHM6ICovCi0gICAgICBpZiAoZGVzdG5hbWUgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHN0cmNweSh0bXBidWYsIGRlc3RuYW1lKTsKLSAgICAgICAgIHN0cmNhdCh0bXBidWYsICIudG1wIik7IC8qIHNwYWNlIGZvciAudG1wIGFsbG9jYXRlZCBhYm92ZSAqLwotICAgICAgICAgdG1wbmFtZSA9IHRtcGJ1ZjsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgICAgdG1wbmFtZSA9IE5VTEw7IC8qIHN0ZG91dCAqLwotCi0gICAgICAvKiBMb29wIHRvIGZpbmQgdGhlIGJlc3Qgb3B0aW9uLiAqLwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgIHdyaXRlX3BuZyhkcCwgdG1wbmFtZSk7Ci0KLSAgICAgICAgIC8qIEFuZCBjb21wYXJlIHRoZSBzaXplcyAodGhlIHdyaXRlIGZ1bmN0aW9uIG1ha2VzIHN1cmUgd3JpdGVfc2l6ZQotICAgICAgICAgICogZG9lc24ndCBvdmVyZmxvdy4pCi0gICAgICAgICAgKi8KLSAgICAgICAgIGFzc2VydChkcC0+Y3NwID4gMCk7Ci0KLSAgICAgICAgIGlmIChkcC0+d3JpdGVfc2l6ZSA8IGRwLT5iZXN0X3NpemUgfHwKLSAgICAgICAgICAgICAoZHAtPndyaXRlX3NpemUgPT0gZHAtPmJlc3Rfc2l6ZSAmJiBiZXR0ZXJfb3B0aW9ucyhkcCkpKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlc3RuYW1lICE9IE5VTEwgJiYgcmVuYW1lKHRtcG5hbWUsIGRlc3RuYW1lKSAhPSAwKQotICAgICAgICAgICAgICAgZGlzcGxheV9sb2coZHAsIEFQUF9FUlJPUiwgInJlbmFtZSAlcyAlcyBmYWlsZWQgKCVzKSIsIHRtcG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBkZXN0bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgICAgICAgICAgc3RyY3B5KGRwLT5iZXN0LCBkcC0+Y3Vycik7Ci0gICAgICAgICAgICBkcC0+YmVzdF9zaXplID0gZHAtPndyaXRlX3NpemU7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgaWYgKHRtcG5hbWUgIT0gTlVMTCAmJiB1bmxpbmsodG1wbmFtZSkgIT0gMCkKLSAgICAgICAgICAgIGRpc3BsYXlfbG9nKGRwLCBBUFBfV0FSTklORywgInVubGluayAlcyBmYWlsZWQgKCVzKSIsIHRtcG5hbWUsCi0gICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotCi0gICAgICAgICBsb2dfc2VhcmNoKGRwLCBsb2dfZGVwdGgpOwotICAgICAgfQotICAgICAgd2hpbGUgKGRwLT5uc3AgPiAwKTsKLQotICAgICAgLyogRG8gdGhpcyBmb3IgdGhlICdzaXplcycgb3B0aW9uIHNvIHRoYXQgaXQgcmVwb3J0cyB0aGUgY29ycmVjdCBzaXplLiAqLwotICAgICAgZHAtPndyaXRlX3NpemUgPSBkcC0+YmVzdF9zaXplOwotICAgfQotfQotCi1zdGF0aWMgaW50Ci1jcHBuZyhzdHJ1Y3QgZGlzcGxheSAqZHAsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmd2IGRlc3QpCi0gICAvKiBFeGlzdHMgc29sZWx5IHRvIGlzb2xhdGUgdGhlIHNldGptcCBjbG9iYmVycyB3aGljaCBzb21lIHZlcnNpb25zIG9mIEdDQwotICAgICogZXJyb25lb3VzbHkgZ2VuZXJhdGUuCi0gICAgKi8KLXsKLSAgIGludCByZXQgPSBzZXRqbXAoZHAtPmVycm9yX3JldHVybik7Ci0KLSAgIGlmIChyZXQgPT0gMCkKLSAgIHsKLSAgICAgIGRwLT5lcnJzZXQgPSAxOwotICAgICAgY3Bfb25lX2ZpbGUoZHAsIGZpbGUsIGRlc3QpOwotICAgICAgZHAtPmVycnNldCA9IDA7Ci0gICAgICByZXR1cm4gMDsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgZHAtPmVycnNldCA9IDA7Ci0KLSAgICAgIGlmIChyZXQgPCBFUlJPUlMpIC8qIHNob3VsZG4ndCBsb25nam1wIG9uIHdhcm5pbmdzICovCi0gICAgICAgICBkaXNwbGF5X2xvZyhkcCwgSU5URVJOQUxfRVJST1IsICJ1bmV4cGVjdGVkIHJldHVybiBjb2RlICVkIiwgcmV0KTsKLQotICAgICAgcmV0dXJuIHJldDsKLSAgIH0KLX0KLQotaW50Ci1tYWluKGNvbnN0IGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgKiBjb25zdCBhcmd2KQotewotICAgLyogRm9yIGVhY2ggZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lIHRlc3QgaXQgd2l0aCBhIHJhbmdlIG9mIHRyYW5zZm9ybXMgKi8KLSAgIGludCBvcHRpb25fZW5kOwotICAgc3RydWN0IGRpc3BsYXkgZDsKLQotICAgZGlzcGxheV9pbml0KCZkKTsKLQotICAgZC5vcGVyYXRpb24gPSAib3B0aW9ucyI7Ci0gICBmb3IgKG9wdGlvbl9lbmQgPSAxOwotICAgICAgICBvcHRpb25fZW5kIDwgYXJnYyAmJiBvcHRfY2hlY2soJmQsIGFyZ3Zbb3B0aW9uX2VuZF0pOwotICAgICAgICArK29wdGlvbl9lbmQpCi0gICB7Ci0gICB9Ci0KLSAgIC8qIERvIGEgcXVpY2sgY2hlY2sgb24gdGhlIGRpcmVjdG9yeSB0YXJnZXQgY2FzZTsgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuCi0gICAgKiB0d28gYXJndW1lbnRzIHRoZSBsYXN0IG9uZSBtdXN0IGJlIGEgZGlyZWN0b3J5LgotICAgICovCi0gICBpZiAoIShkLm9wdGlvbnMgJiBOT1dSSVRFKSAmJiBvcHRpb25fZW5kKzIgPCBhcmdjICYmICFjaGVja2Rpcihhcmd2W2FyZ2MtMV0pKQotICAgewotICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAicG5nY3A6ICVzOiBkaXJlY3RvcnkgcmVxdWlyZWQgd2l0aCBtb3JlIHRoYW4gdHdvIGFyZ3VtZW50c1xuIiwKLSAgICAgICAgICAgIGFyZ3ZbYXJnYy0xXSk7Ci0gICAgICByZXR1cm4gOTk7Ci0gICB9Ci0KLSAgIHsKLSAgICAgIGludCBlcnJvcnMgPSAwOwotICAgICAgaW50IGkgPSBvcHRpb25fZW5kOwotCi0gICAgICAvKiBEbyB0aGlzIGF0IGxlYXN0IG9uY2U7IGlmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMgc3RkaW4vc3Rkb3V0IGFyZSB1c2VkLgotICAgICAgICovCi0gICAgICBkLm9wZXJhdGlvbiA9ICJmaWxlcyI7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICAgY29uc3QgY2hhciAqaW5maWxlID0gTlVMTDsKLSAgICAgICAgIGNvbnN0IGNoYXIgKm91dGZpbGUgPSBOVUxMOwotICAgICAgICAgaW50IHJldDsKLQotICAgICAgICAgaWYgKGkgPCBhcmdjKQotICAgICAgICAgewotICAgICAgICAgICAgaW5maWxlID0gYXJndltpKytdOwotICAgICAgICAgICAgaWYgKCEoZC5vcHRpb25zICYgTk9XUklURSkgJiYgaSA8IGFyZ2MpCi0gICAgICAgICAgICAgICBvdXRmaWxlID0gYXJndlthcmdjLTFdOwotICAgICAgICAgfQotCi0gICAgICAgICByZXQgPSBjcHBuZygmZCwgaW5maWxlLCBvdXRmaWxlKTsKLQotICAgICAgICAgaWYgKHJldCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXQgPiBRVUlFVCkgLyogYWJvcnQgb24gdXNlciBvciBpbnRlcm5hbCBlcnJvciAqLwotICAgICAgICAgICAgICAgcmV0dXJuIDk5OwotCi0gICAgICAgICAgICAvKiBBbiBlcnJvcjogdGhlIG91dHB1dCBpcyBtZWFuaW5nbGVzcyAqLwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlIGlmIChkLmJlc3RbMF0gIT0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoaXMgcmVzdWx0IG1heSBhbHJlYWR5IGhhdmUgYmVlbiBvdXRwdXQsIGluIHdoaWNoIGNhc2UgYmVzdF9zaXplCi0gICAgICAgICAgICAgKiBoYXMgYmVlbiByZXNldC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGQuYmVzdF9zaXplIDwgTUFYX1NJWkUpCi0gICAgICAgICAgICAgICBwcmludF9zZWFyY2hfcmVzdWx0cygmZCk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgaWYgKGQub3B0aW9ucyAmIFNJWkVTKQotICAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCIlcyBbJWxkIHggJWxkICVkIGJwcCAlcywgJWx1IGJ5dGVzXSAlbHUgLT4gJWx1IFsweCVseF1cbiIsCi0gICAgICAgICAgICAgICAgICBpbmZpbGUsICh1bnNpZ25lZCBsb25nKWQudywgKHVuc2lnbmVkIGxvbmcpZC5oLCBkLmJwcCwKLSAgICAgICAgICAgICAgICAgIGN0cyhkLmN0KSwgKHVuc2lnbmVkIGxvbmcpZC5zaXplLCAodW5zaWduZWQgbG9uZylkLnJlYWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWQud3JpdGVfc2l6ZSwgKHVuc2lnbmVkIGxvbmcpZC5yZXN1bHRzKTsKLSAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgfQotCi0gICAgICAgICAvKiBIZXJlIG9uIGFueSByZXR1cm4sIGluY2x1ZGluZyBmYWlsdXJlcywgZXhjZXB0IHVzZXIvaW50ZXJuYWwgaXNzdWVzCi0gICAgICAgICAgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBwYXNzID0gKGQub3B0aW9ucyAmIFNUUklDVCkgPwotICAgICAgICAgICAgICAgUkVTVUxUX1NUUklDVChkLnJlc3VsdHMpIDogUkVTVUxUX1JFTEFYRUQoZC5yZXN1bHRzKTsKLQotICAgICAgICAgICAgaWYgKCFwYXNzKQotICAgICAgICAgICAgICAgKytlcnJvcnM7Ci0KLSAgICAgICAgICAgIGlmIChkLm9wdGlvbnMgJiBMT0cpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgcHJpbnRmKCIlczogcG5nY3AiLCBwYXNzID8gIlBBU1MiIDogIkZBSUwiKTsKLQotICAgICAgICAgICAgICAgZm9yIChqPTE7IGo8b3B0aW9uX2VuZDsgKytqKQotICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBhcmd2W2pdKTsKLQotICAgICAgICAgICAgICAgaWYgKGluZmlsZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBpbmZpbGUpOwotCi0jICAgICAgICAgICAgICBpZmRlZiBQTkdfUE5HQ1BfVElNSU5HX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgLyogV2hlbiBsb2dnaW5nIG91dHB1dCB0aGUgZmlsZXMgZm9yIGVhY2ggZmlsZSwgaWYgZW5hYmxlZC4gKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoZC52YWx1ZVtPUFRJTkQoJmQsdGltZSldICYgUE5HQ1BfVElNRV9SRUFEKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdGltZSgiIHJlYWQiLCBkLnJlYWRfdGltZSk7Ci0KLSAgICAgICAgICAgICAgICAgIGlmICgoZC52YWx1ZVtPUFRJTkQoJmQsdGltZSldICYgUE5HQ1BfVElNRV9XUklURSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgIHByaW50X3RpbWUoIiB3cml0ZSIsIGQud3JpdGVfdGltZSk7Ci0jICAgICAgICAgICAgICBlbmRpZiAvKiBQTkdDUF9USU1JTkcgKi8KLQotICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGRpc3BsYXlfY2xlYW4oJmQpOwotICAgICAgfQotICAgICAgd2hpbGUgKGkrIShkLm9wdGlvbnMgJiBOT1dSSVRFKSA8IGFyZ2MpOwotICAgICAgICAgLyogSS5lLiBmb3Igd3JpdGUgY2FzZXMgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCByZXF1aXJlCi0gICAgICAgICAgKiB0aGVyZSB0byBiZSBhdCBsZWFzdCB0d28gYXJndW1lbnRzIGxlZnQgYW5kIGZvciB0aGUgbGFzdCBvbmUgdG8gYmUgYQotICAgICAgICAgICogZGlyZWN0b3J5ICh0aGlzIHdhcyBjaGVja2VkIGFib3ZlKS4KLSAgICAgICAgICAqLwotCi0gICAgICAvKiBSZWxlYXNlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSAgICAgIGRpc3BsYXlfZGVzdHJveSgmZCk7Ci0KLSMgICAgIGlmZGVmIFBOR19QTkdDUF9USU1JTkdfU1VQUE9SVEVECi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb3V0cHV0ID0gMDsKLQotICAgICAgICAgICAgaWYgKChkLnZhbHVlW09QVElORCgmZCx0aW1lKV0gJiBQTkdDUF9USU1FX1JFQUQpICE9IDApCi0gICAgICAgICAgICAgICBwcmludF90aW1lKCJyZWFkIiwgZC5yZWFkX3RpbWVfdG90YWwpLCBvdXRwdXQgPSAxOwotCi0gICAgICAgICAgICBpZiAoKGQudmFsdWVbT1BUSU5EKCZkLHRpbWUpXSAmIFBOR0NQX1RJTUVfV1JJVEUpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAob3V0cHV0KSBwdXRjaGFyKCcgJyk7Ci0gICAgICAgICAgICAgICBwcmludF90aW1lKCJ3cml0ZSIsIGQud3JpdGVfdGltZV90b3RhbCk7Ci0gICAgICAgICAgICAgICBvdXRwdXQgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob3V0cHV0KSBwdXRjaGFyKCdcbicpOwotICAgICAgICAgfQotIyAgICAgZW5kaWYgLyogUE5HQ1BfVElNSU5HICovCi0KLSAgICAgIHJldHVybiBlcnJvcnMgIT0gMDsKLSAgIH0KLX0KLSNlbHNlIC8qICFSRUFEX1BORyB8fCAhV1JJVEVfUE5HICovCi1pbnQKLW1haW4odm9pZCkKLXsKLSAgIGZwcmludGYoc3RkZXJyLCAicG5nY3A6IG5vIHN1cHBvcnQgZm9yIHBuZ19yZWFkL3dyaXRlX2ltYWdlXG4iKTsKLSAgIHJldHVybiA3NzsKLX0KLSNlbmRpZiAvKiAhUkVBRF9QTkcgfHwgIVdSSVRFX1BORyAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi90b29scy9wbmdmaXguYyBiL2NvbnRyaWIvdG9vbHMvcG5nZml4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDQzZTMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi90b29scy9wbmdmaXguYworKysgL2Rldi9udWxsCkBAIC0xLDQwNDkgKzAsMCBAQAotLyogcG5nZml4LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiBKb2huIEN1bm5pbmdoYW0gQm93bGVyCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjEgW0phbnVhcnkgMTUsIDIwMTZdCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKgotICogVG9vbCB0byBjaGVjayBhbmQgZml4IHRoZSB6bGliIGluZmxhdGUgJ3RvbyBmYXIgYmFjaycgcHJvYmxlbS4KLSAqIFNlZSB0aGUgdXNhZ2UgbWVzc2FnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jZGVmaW5lIGltcGxpZXMoeCx5KSBhc3NlcnQoISh4KSB8fCAoeSkpCi0KLSNpZmRlZiBfX0dOVUNfXwotICAgLyogVGhpcyBpcyB1c2VkIHRvIGZpeCB0aGUgZXJyb3I6Ci0gICAgKgotICAgICogcG5nZml4LmM6Ci0gICAgKiBJbiBmdW5jdGlvbiAnemxpYl9hZHZhbmNlJzoKLSAgICAqIHBuZ2ZpeC5jOjE4MToxMzogZXJyb3I6IGFzc3VtaW5nIHNpZ25lZCBvdmVyZmxvdyBkb2VzIG5vdAotICAgICogICBvY2N1ciB3aGVuIHNpbXBsaWZ5aW5nIGNvbmRpdGlvbmFsIHRvIGNvbnN0YW50IFstV2Vycm9yPXN0cmljdC1vdmVyZmxvd10KLSAgICAqLwotIyAgZGVmaW5lIEZJWF9HQ0Mgdm9sYXRpbGUKLSNlbHNlCi0jICBkZWZpbmUgRklYX0dDQwotI2VuZGlmCi0KLSNkZWZpbmUgUFJPR1JBTV9OQU1FICJwbmdmaXgiCi0KLS8qIERlZmluZSB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGlzIHByb2dyYW0gYWdhaW5zdCB5b3VyIGluc3RhbGxlZCBsaWJwbmcsCi0gKiByYXRoZXIgdGhhbiB0aGUgb25lIGJlaW5nIGJ1aWx0IGhlcmU6Ci0gKi8KLSNpZmRlZiBQTkdfRlJFRVNUQU5ESU5HX1RFU1RTCi0jICBpbmNsdWRlIDxwbmcuaD4KLSNlbHNlCi0jICBpbmNsdWRlICIuLi8uLi9wbmcuaCIKLSNlbmRpZgotCi0jaWYgUE5HX0xJQlBOR19WRVIgPCAxMDYwMyAvKiAxLjYuMyAqLwotIyAgZXJyb3IgInBuZ2ZpeCB3aWxsIG5vdCB3b3JrIHdpdGggbGlicG5nIHByaW9yIHRvIDEuNi4zIgotI2VuZGlmCi0KLSNpZmRlZiBQTkdfU0VUSk1QX1NVUFBPUlRFRAotI2luY2x1ZGUgPHNldGptcC5oPgotCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX0VBU1lfQUNDRVNTX1NVUFBPUlRFRCkgJiZcCi0gICAoZGVmaW5lZChQTkdfUkVBRF9ERUlOVEVSTEFDRV9TVVBQT1JURUQpIHx8XAotICAgIGRlZmluZWQoUE5HX1JFQURfSU5URVJMQUNJTkdfU1VQUE9SVEVEKSkKLQotLyogemxpYi5oIGRlZmluZXMgdGhlIHN0cnVjdHVyZSB6X3N0cmVhbSwgYW4gaW5zdGFuY2Ugb2Ygd2hpY2ggaXMgaW5jbHVkZWQKLSAqIGluIHRoaXMgc3RydWN0dXJlIGFuZCBpcyByZXF1aXJlZCBmb3IgZGVjb21wcmVzc2luZyB0aGUgTFogY29tcHJlc3NlZAotICogZGF0YSBpbiBQTkcgZmlsZXMuCi0gKi8KLSNpZm5kZWYgWkxJQl9DT05TVAotICAgLyogV2UgbXVzdCBlbnN1cmUgdGhhdCB6bGliIHVzZXMgJ2NvbnN0JyBpbiBkZWNsYXJhdGlvbnMuICovCi0jICBkZWZpbmUgWkxJQl9DT05TVAotI2VuZGlmCi0jaW5jbHVkZSA8emxpYi5oPgotI2lmZGVmIGNvbnN0Ci0gICAvKiB6bGliLmggc29tZXRpbWVzICNkZWZpbmVzIGNvbnN0IHRvIG5vdGhpbmcsIHVuZG8gdGhpcy4gKi8KLSMgIHVuZGVmIGNvbnN0Ci0jZW5kaWYKLQotLyogemxpYi5oIGhhcyBtZWRpb2NyZSB6X2NvbnN0IHVzZSBiZWZvcmUgMS4yLjYsIHRoaXMgc3R1ZmYgaXMgZm9yIGNvbXBhdGliaWxpdHkKLSAqIHdpdGggb2xkZXIgYnVpbGRzLgotICovCi0jaWYgWkxJQl9WRVJOVU0gPCAweDEyNjAKLSMgIGRlZmluZSBQTkdaX01TR19DQVNUKHMpIGNvbnN0Y2FzdChjaGFyKixzKQotIyAgZGVmaW5lIFBOR1pfSU5QVVRfQ0FTVChiKSBjb25zdGNhc3QocG5nX2J5dGVwLGIpCi0jZWxzZQotIyAgZGVmaW5lIFBOR1pfTVNHX0NBU1QocykgKHMpCi0jICBkZWZpbmUgUE5HWl9JTlBVVF9DQVNUKGIpIChiKQotI2VuZGlmCi0KLSNpZm5kZWYgUE5HX01BWElNVU1fSU5GTEFURV9XSU5ET1cKLSMgIGVycm9yICJwbmdmaXggbm90IHN1cHBvcnRlZCBpbiB0aGlzIGxpYnBuZyB2ZXJzaW9uIgotI2VuZGlmCi0KLSNpZiBaTElCX1ZFUk5VTSA+PSAweDEyNDAKLQotLyogQ29waWVkIGZyb20gcG5ncHJpdi5oICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSMgIGRlZmluZSB2b2lkY2FzdCh0eXBlLCB2YWx1ZSkgc3RhdGljX2Nhc3Q8dHlwZT4odmFsdWUpCi0jICBkZWZpbmUgY29uc3RjYXN0KHR5cGUsIHZhbHVlKSBjb25zdF9jYXN0PHR5cGU+KHZhbHVlKQotIyAgZGVmaW5lIGFsaWduY2FzdCh0eXBlLCB2YWx1ZSkgXAotICAgc3RhdGljX2Nhc3Q8dHlwZT4oc3RhdGljX2Nhc3Q8dm9pZCo+KHZhbHVlKSkKLSMgIGRlZmluZSBhbGlnbmNhc3Rjb25zdCh0eXBlLCB2YWx1ZSkgXAotICAgc3RhdGljX2Nhc3Q8dHlwZT4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHZhbHVlKSkKLSNlbHNlCi0jICBkZWZpbmUgdm9pZGNhc3QodHlwZSwgdmFsdWUpICh2YWx1ZSkKLSMgIGRlZmluZSBjb25zdGNhc3QodHlwZSwgdmFsdWUpICgodHlwZSkodmFsdWUpKQotIyAgZGVmaW5lIGFsaWduY2FzdCh0eXBlLCB2YWx1ZSkgKCh2b2lkKikodmFsdWUpKQotIyAgZGVmaW5lIGFsaWduY2FzdGNvbnN0KHR5cGUsIHZhbHVlKSAoKGNvbnN0IHZvaWQqKSh2YWx1ZSkpCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2lmIFBOR19MSUJQTkdfVkVSIDwgMTA3MDAKLS8qIENodW5rIHRhZ3MgKGNvcGllZCBmcm9tIHBuZ3ByaXYuaCkgKi8KLSNkZWZpbmUgUE5HXzMyYihiLHMpICgocG5nX3VpbnRfMzIpKGIpIDw8IChzKSkKLSNkZWZpbmUgUE5HX1UzMihiMSxiMixiMyxiNCkgXAotICAgKFBOR18zMmIoYjEsMjQpIHwgUE5HXzMyYihiMiwxNikgfCBQTkdfMzJiKGIzLDgpIHwgUE5HXzMyYihiNCwwKSkKLQotLyogQ29uc3RhbnRzIGZvciBrbm93biBjaHVuayB0eXBlcy4gKi8KLSNkZWZpbmUgcG5nX0lEQVQgUE5HX1UzMiggNzMsICA2OCwgIDY1LCAgODQpCi0jZGVmaW5lIHBuZ19JRU5EIFBOR19VMzIoIDczLCAgNjksICA3OCwgIDY4KQotI2RlZmluZSBwbmdfSUhEUiBQTkdfVTMyKCA3MywgIDcyLCAgNjgsICA4MikKLSNkZWZpbmUgcG5nX1BMVEUgUE5HX1UzMiggODAsICA3NiwgIDg0LCAgNjkpCi0jZGVmaW5lIHBuZ19iS0dEIFBOR19VMzIoIDk4LCAgNzUsICA3MSwgIDY4KQotI2RlZmluZSBwbmdfY0hSTSBQTkdfVTMyKCA5OSwgIDcyLCAgODIsICA3NykKLSNkZWZpbmUgcG5nX2ZSQWMgUE5HX1UzMigxMDIsICA4MiwgIDY1LCAgOTkpIC8qIHJlZ2lzdGVyZWQsIG5vdCBkZWZpbmVkICovCi0jZGVmaW5lIHBuZ19nQU1BIFBOR19VMzIoMTAzLCAgNjUsICA3NywgIDY1KQotI2RlZmluZSBwbmdfZ0lGZyBQTkdfVTMyKDEwMywgIDczLCAgNzAsIDEwMykKLSNkZWZpbmUgcG5nX2dJRnQgUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMTYpIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgcG5nX2dJRnggUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMjApCi0jZGVmaW5lIHBuZ19oSVNUIFBOR19VMzIoMTA0LCAgNzMsICA4MywgIDg0KQotI2RlZmluZSBwbmdfaUNDUCBQTkdfVTMyKDEwNSwgIDY3LCAgNjcsICA4MCkKLSNkZWZpbmUgcG5nX2lUWHQgUE5HX1UzMigxMDUsICA4NCwgIDg4LCAxMTYpCi0jZGVmaW5lIHBuZ19vRkZzIFBOR19VMzIoMTExLCAgNzAsICA3MCwgMTE1KQotI2RlZmluZSBwbmdfcENBTCBQTkdfVTMyKDExMiwgIDY3LCAgNjUsICA3NikKLSNkZWZpbmUgcG5nX3BIWXMgUE5HX1UzMigxMTIsICA3MiwgIDg5LCAxMTUpCi0jZGVmaW5lIHBuZ19zQklUIFBOR19VMzIoMTE1LCAgNjYsICA3MywgIDg0KQotI2RlZmluZSBwbmdfc0NBTCBQTkdfVTMyKDExNSwgIDY3LCAgNjUsICA3NikKLSNkZWZpbmUgcG5nX3NQTFQgUE5HX1UzMigxMTUsICA4MCwgIDc2LCAgODQpCi0jZGVmaW5lIHBuZ19zUkdCIFBOR19VMzIoMTE1LCAgODIsICA3MSwgIDY2KQotI2RlZmluZSBwbmdfc1RFUiBQTkdfVTMyKDExNSwgIDg0LCAgNjksICA4MikKLSNkZWZpbmUgcG5nX3RFWHQgUE5HX1UzMigxMTYsICA2OSwgIDg4LCAxMTYpCi0jZGVmaW5lIHBuZ190SU1FIFBOR19VMzIoMTE2LCAgNzMsICA3NywgIDY5KQotI2RlZmluZSBwbmdfdFJOUyBQTkdfVTMyKDExNiwgIDgyLCAgNzgsICA4MykKLSNkZWZpbmUgcG5nX3pUWHQgUE5HX1UzMigxMjIsICA4NCwgIDg4LCAxMTYpCi0jZW5kaWYKLQotLyogVGhlIDgtYnl0ZSBzaWduYXR1cmUgYXMgYSBwYWlyIG9mIDMyLWJpdCBxdWFudGl0aWVzICovCi0jZGVmaW5lIHNpZzEgUE5HX1UzMigxMzcsICA4MCwgIDc4LCAgNzEpCi0jZGVmaW5lIHNpZzIgUE5HX1UzMiggMTMsICAxMCwgIDI2LCAgMTApCi0KLS8qIElzIHRoZSBjaHVuayBjcml0aWNhbD8gKi8KLSNkZWZpbmUgQ1JJVElDQUwoY2h1bmspICgoKGNodW5rKSAmIFBOR19VMzIoMzIsMCwwLDApKSA9PSAwKQotCi0vKiBJcyBpdCBzYWZlIHRvIGNvcHk/ICovCi0jZGVmaW5lIFNBRkVfVE9fQ09QWShjaHVuaykgKCgoY2h1bmspICYgUE5HX1UzMigwLDAsMCwzMikpICE9IDApCi0KLS8qIEZpeCB1cHMgZm9yIGJ1aWxkcyB3aXRoIGxpbWl0ZWQgcmVhZCBzdXBwb3J0ICovCi0jaWZuZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRAotIyAgZGVmaW5lIHBuZ19lcnJvcihhLGIpIHBuZ19lcnIoYSkKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVUSUxJVElFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVU5SRUFDSEVEIGlzIGEgdmFsdWUgdG8gY2F1c2UgYW4gYXNzZXJ0IHRvIGZhaWwuIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUKLSAqIGFzc2VydCBtYWNybyBpcyB3cml0dGVuIHRoZSBzdHJpbmcgIlVOUkVBQ0hFRCIgaXMgcHJvZHVjZWQgaW4gdGhlIGVycm9yCi0gKiBtZXNzYWdlLgotICovCi0jZGVmaW5lIFVOUkVBQ0hFRCAwCi0KLS8qIDgwLWJpdCBudW1iZXIgaGFuZGxpbmcgLSBhIFBORyBpbWFnZSBjYW4gYmUgdXAgdG8gKDJeMzEtMSl4KDJeMzEtMSkgOC1ieXRlCi0gKiAoMTYtYml0IFJHQkEpIHBpeGVscyBpbiBzaXplOyB0aGF0J3MgbGVzcyB0aGFuIDJeNjUgYnl0ZXMgb3IgMl42OCBiaXRzLCBzbwotICogYXJpdGhtZXRpYyBvZiA4MC1iaXQgbnVtYmVycyBpcyBzdWZmaWNpZW50LiAgVGhpcyByZXByZXNlbnRhdGlvbiB1c2VzIGFuCi0gKiBhcmJpdHJhcnkgbGVuZ3RoIGFycmF5IG9mIHBuZ191aW50XzE2IGRpZ2l0cyAoMC4uNjU1MzUpLiAgVGhlIHJlcHJlc2VudGF0aW9uCi0gKiBpcyBsaXR0bGUgZW5kaWFuLgotICoKLSAqIFRoZSBhcml0aG1ldGljIGZ1bmN0aW9ucyB0YWtlIHplcm8gdG8gdHdvIHVhcmIgdmFsdWVzIHRvZ2V0aGVyIHdpdGggdGhlCi0gKiBudW1iZXIgb2YgZGlnaXRzIGluIHRob3NlIHZhbHVlcyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgZ2l2ZW4gdWFyYgotICogKGFsd2F5cyB0aGUgZmlyc3QgYXJndW1lbnQpIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgcmVzdWx0LgotICogSWYgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gbmVnYXRpdmUgKHRoaXMgd291bGQKLSAqIG5vcm1hbGx5IGJlIGFuIGVycm9yKS4KLSAqLwotdHlwZWRlZiBwbmdfdWludF8xNiAgdWRpZ2l0OyAvKiBBICd1bnVtJyBpcyBhbiBhcnJheSBvZiB0aGVzZSAqLwotdHlwZWRlZiBwbmdfdWludF8xNnAgdWFyYjsKLXR5cGVkZWYgcG5nX2NvbnN0X3VpbnRfMTZwIHVhcmJjOwotCi0jZGVmaW5lIFVESUdJVFModW51bSkgKChzaXplb2YgdW51bSkvKHNpemVvZiAodWRpZ2l0KSkKLSAgIC8qIElNUE9SVEFOVDogb25seSBhcHBseSB0aGlzIHRvIGFuIGFycmF5LCBhcHBsaWVkIHRvIGEgcG9pbnRlciB0aGUgcmVzdWx0Ci0gICAgKiB3aWxsIHR5cGljYWxseSBiZSAnMicsIHdoaWNoIGlzIG5vdCB1c2VmdWwuCi0gICAgKi8KLQotc3RhdGljIGludAotdWFyYl9zZXQodWFyYiByZXN1bHQsIHBuZ19hbGxvY19zaXplX3QgdmFsKQotICAgLyogU2V0IChpbml0aWFsaXplKSAncmVzdWx0JyB0byAndmFsJy4gIFRoZSBzaXplIHJlcXVpcmVkIGZvciAncmVzdWx0JyBtdXN0Ci0gICAgKiBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBjYWxsZXIgZnJvbSBhIGtub3dsZWRnZSBvZiB0aGUgbWF4aW11bSBmb3IgJ3ZhbCcuCi0gICAgKi8KLXsKLSAgIGludCBuZGlnaXRzID0gMDsKLQotICAgd2hpbGUgKHZhbCA+IDApCi0gICB7Ci0gICAgICByZXN1bHRbbmRpZ2l0cysrXSA9IChwbmdfdWludF8xNikodmFsICYgMHhmZmZmKTsKLSAgICAgIHZhbCA+Pj0gMTY7Ci0gICB9Ci0KLSAgIHJldHVybiBuZGlnaXRzOwotfQotCi1zdGF0aWMgaW50Ci11YXJiX2NvcHkodWFyYiB0bywgdWFyYiBmcm9tLCBpbnQgaWRpZ2l0cykKLSAgIC8qIENvcHkgYSB1YXJiLCBtYXkgcmVkdWNlIHRoZSBkaWdpdCBjb3VudCAqLwotewotICAgaW50IGQsIG9kaWdpdHM7Ci0KLSAgIGZvciAoZD1vZGlnaXRzPTA7IGQ8aWRpZ2l0czsgKytkKQotICAgICAgaWYgKCh0b1tkXSA9IGZyb21bZF0pICE9IDApCi0gICAgICAgICBvZGlnaXRzID0gZCsxOwotCi0gICByZXR1cm4gb2RpZ2l0czsKLX0KLQotc3RhdGljIGludAotdWFyYl9pbmModWFyYiBudW0sIGludCBpbl9kaWdpdHMsIHBuZ19pbnRfMzIgYWRkKQotICAgLyogVGhpcyBpcyBhIHNpZ25lZCAzMi1iaXQgYWRkLCBleGNlcHQgdGhhdCB0byBhdm9pZCBvdmVyZmxvdyB0aGUgdmFsdWUgYWRkZWQKLSAgICAqIG9yIHN1YnRyYWN0ZWQgbXVzdCBiZSBubyBtb3JlIHRoYW4gMl4zMS02NTUzNi4gIEEgbmVnYXRpdmUgcmVzdWx0Ci0gICAgKiBpbmRpY2F0ZXMgYSBuZWdhdGl2ZSBudW1iZXIgKHdoaWNoIGlzIGFuIGVycm9yIGJlbG93KS4gIFRoZSBzaXplIG9mCi0gICAgKiAnbnVtJyBzaG91bGQgYmUgbWF4KGluX2RpZ2l0cysxLDIpIGZvciBhcmJpdHJhcnkgJ2FkZCcgYnV0IGNhbiBiZSBqdXN0Ci0gICAgKiBpbl9kaWdpdHMrMSBpZiBhZGQgaXMga25vd24gdG8gYmUgaW4gdGhlIHJhbmdlIC02NTUzNS4uNjU1MzUuCi0gICAgKi8KLXsKLSAgIEZJWF9HQ0MgaW50IG91dF9kaWdpdHMgPSAwOwotCi0gICB3aGlsZSAob3V0X2RpZ2l0cyA8IGluX2RpZ2l0cykKLSAgIHsKLSAgICAgIGFkZCArPSBudW1bb3V0X2RpZ2l0c107Ci0gICAgICBudW1bb3V0X2RpZ2l0cysrXSA9IChwbmdfdWludF8xNikoYWRkICYgMHhmZmZmKTsKLSAgICAgIGFkZCA+Pj0gMTY7Ci0gICB9Ci0KLSAgIHdoaWxlIChhZGQgIT0gMCAmJiBhZGQgIT0gKC0xKSkKLSAgIHsKLSAgICAgIG51bVtvdXRfZGlnaXRzKytdID0gKHBuZ191aW50XzE2KShhZGQgJiAweGZmZmYpOwotICAgICAgYWRkID4+PSAxNjsKLSAgIH0KLQotICAgaWYgKGFkZCA9PSAwKQotICAgewotICAgICAgd2hpbGUgKG91dF9kaWdpdHMgPiAwICYmIG51bVtvdXRfZGlnaXRzLTFdID09IDApCi0gICAgICAgICAtLW91dF9kaWdpdHM7Ci0gICAgICByZXR1cm4gb3V0X2RpZ2l0czsgLyogbWF5IGJlIDAgKi8KLSAgIH0KLQotICAgZWxzZSAvKiBuZWdhdGl2ZSByZXN1bHQgKi8KLSAgIHsKLSAgICAgIHdoaWxlIChvdXRfZGlnaXRzID4gMSAmJiBudW1bb3V0X2RpZ2l0cy0xXSA9PSAweGZmZmYpCi0gICAgICAgICAtLW91dF9kaWdpdHM7Ci0KLSAgICAgIHJldHVybiAtb3V0X2RpZ2l0czsKLSAgIH0KLX0KLQotc3RhdGljIGludAotdWFyYl9hZGQzMih1YXJiIG51bSwgaW50IGluX2RpZ2l0cywgcG5nX3VpbnRfMzIgYWRkKQotICAgLyogQXMgYWJvdmUgYnV0IHRoaXMgd29ya3Mgd2l0aCBhbnkgMzItYml0IHZhbHVlIGFuZCBvbmx5IGRvZXMgJ2FkZCcgKi8KLXsKLSAgIGlmIChpbl9kaWdpdHMgPiAwKQotICAgewotICAgICAgaW5fZGlnaXRzID0gdWFyYl9pbmMobnVtLCBpbl9kaWdpdHMsIGFkZCAmIDB4ZmZmZik7Ci0gICAgICByZXR1cm4gdWFyYl9pbmMobnVtKzEsIGluX2RpZ2l0cy0xLCBhZGQgPj4gMTYpKzE7Ci0gICB9Ci0KLSAgIHJldHVybiB1YXJiX3NldChudW0sIGFkZCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXVhcmJfbXVsdF9kaWdpdCh1YXJiIGFjYywgaW50IGFfZGlnaXRzLCB1YXJiIG51bSwgRklYX0dDQyBpbnQgbl9kaWdpdHMsCi0gICBwbmdfdWludF8xNiB2YWwpCi0gICAvKiBQcmltaXRpdmUgb25lLWRpZ2l0IG11bHRpcGx5IC0gJ3ZhbCcgbXVzdCBiZSAwLi42NTUzNS4gTm90ZSB0aGF0IHRoaXMKLSAgICAqIHByaW1pdGl2ZSBpcyBhIG11bHRpcGx5IGFuZCBhY2N1bXVsYXRlIC0gdGhlIHJlc3VsdCBvZiAqbnVtICogdmFsIGlzIGFkZGVkCi0gICAgKiB0byAqYWNjLgotICAgICoKLSAgICAqIFRoaXMgaXMgYSBvbmUtZGlnaXQgbXVsdGlwbHksIHNvIHRoZSBwcm9kdWN0IG1heSBiZSB1cCB0byBvbmUgZGlnaXQgbG9uZ2VyCi0gICAgKiB0aGFuICdudW0nLCBob3dldmVyIHRoZSBhZGQgdG8gJ2FjYycgbWVhbnMgdGhhdCB0aGUgY2FsbGVyIG11c3QgZW5zdXJlCi0gICAgKiB0aGF0ICdhY2MnIGlzIGF0IGxlYXN0IG9uZSBkaWdpdCBsb25nZXIgdGhhbiB0aGlzICphbmQqIGF0IGxlYXN0IG9uZSBkaWdpdAotICAgICogbG9uZ2VyIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIG9mICdhY2MnLiAgKE9yIHRoZSBjYWxsZXIgbXVzdCBvdGhlcndpc2UKLSAgICAqIGVuc3VyZSAnYWRpZ2l0cycgaXMgYWRlcXVhdGUgZnJvbSBrbm93bGVkZ2Ugb2YgdGhlIHZhbHVlcy4pCi0gICAgKi8KLXsKLSAgIC8qIFRoZSBkaWdpdHMgaW4gKmFjYywgKm51bSBhbmQgdmFsIGFyZSBpbiB0aGUgcmFuZ2UgMC4uNjU1MzUsIHNvIHRoZQotICAgICogcmVzdWx0IGJlbG93IGlzIGF0IG1vc3QgKDY1NTM1KjY1NTM1KSsyKjY1NjM1ID0gNjU1MzUqKDY1NTM1KzIpLCB3aGljaCBpcwotICAgICogZXhhY3RseSAweGZmZmZmZmZmLgotICAgICovCi0gICBpZiAodmFsID4gMCAmJiBuX2RpZ2l0cyA+IDApIC8qIEVsc2UgdGhlIHByb2R1Y3QgaXMgMCAqLwotICAgewotICAgICAgcG5nX3VpbnRfMzIgY2FycnkgPSAwOwotICAgICAgaW50IG91dF9kaWdpdHMgPSAwOwotCi0gICAgICB3aGlsZSAob3V0X2RpZ2l0cyA8IG5fZGlnaXRzIHx8IGNhcnJ5ID4gMCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChvdXRfZGlnaXRzIDwgYV9kaWdpdHMpCi0gICAgICAgICAgICBjYXJyeSArPSBhY2Nbb3V0X2RpZ2l0c107Ci0KLSAgICAgICAgIGlmIChvdXRfZGlnaXRzIDwgbl9kaWdpdHMpCi0gICAgICAgICAgICBjYXJyeSArPSAocG5nX3VpbnRfMzIpbnVtW291dF9kaWdpdHNdICogdmFsOwotCi0gICAgICAgICBhY2Nbb3V0X2RpZ2l0cysrXSA9IChwbmdfdWludF8xNikoY2FycnkgJiAweGZmZmYpOwotICAgICAgICAgY2FycnkgPj49IDE2OwotICAgICAgfQotCi0gICAgICAvKiBTbyBjYXJyeSBpcyAwIGFuZCBhbGwgdGhlIGlucHV0IGRpZ2l0cyBoYXZlIGJlZW4gY29uc3VtZWQuIFRoaXMgbWVhbnMKLSAgICAgICAqIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gc2tpcCBhbnkgcmVtYWluaW5nIGRpZ2l0cyBpbiBhY2MuCi0gICAgICAgKi8KLSAgICAgIGlmIChvdXRfZGlnaXRzID4gYV9kaWdpdHMpCi0gICAgICAgICByZXR1cm4gb3V0X2RpZ2l0czsKLSAgIH0KLQotICAgcmV0dXJuIGFfZGlnaXRzOwotfQotCi1zdGF0aWMgaW50Ci11YXJiX211bHQzMih1YXJiIGFjYywgaW50IGFfZGlnaXRzLCB1YXJiIG51bSwgaW50IG5fZGlnaXRzLCBwbmdfdWludF8zMiB2YWwpCi0gICAvKiBjYWxjdWxhdGUgYWNjICs9IG51bSAqIHZhbCwgJ3ZhbCcgbWF5IGJlIGFueSAzMi1iaXQgdmFsdWUsICdhY2MnIGFuZCAnbnVtJwotICAgICogbWF5IGJlIGFueSB2YWx1ZSwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiAnYWNjJy4KLSAgICAqLwotewotICAgaWYgKG5fZGlnaXRzID4gMCAmJiB2YWwgPiAwKQotICAgewotICAgICAgYV9kaWdpdHMgPSB1YXJiX211bHRfZGlnaXQoYWNjLCBhX2RpZ2l0cywgbnVtLCBuX2RpZ2l0cywKLSAgICAgICAgIChwbmdfdWludF8xNikodmFsICYgMHhmZmZmKSk7Ci0KLSAgICAgIHZhbCA+Pj0gMTY7Ci0gICAgICBpZiAodmFsID4gMCkKLSAgICAgICAgIGFfZGlnaXRzID0gdWFyYl9tdWx0X2RpZ2l0KGFjYysxLCBhX2RpZ2l0cy0xLCBudW0sIG5fZGlnaXRzLAotICAgICAgICAgICAgKHBuZ191aW50XzE2KXZhbCkgKyAxOwotCi0gICAgICAvKiBCZWNhdXNlIG5fZGlnaXRzIGFuZCB2YWwgYXJlID4wIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOiAqLwotICAgICAgYXNzZXJ0KGFfZGlnaXRzID4gMCk7Ci0gICB9Ci0KLSAgIHJldHVybiBhX2RpZ2l0czsKLX0KLQotc3RhdGljIGludAotdWFyYl9zaGlmdCh1YXJiIGlub3V0LCBpbnQgbmRpZ2l0cywgdW5zaWduZWQgaW50IHJpZ2h0X3NoaWZ0KQotICAgLyogU2hpZnQgaW5vdXQgcmlnaHQgYnkgcmlnaHRfc2hpZnQgYml0cywgcmlnaHRfc2hpZnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UKLSAgICAqIDEuLjE1Ci0gICAgKi8KLXsKLSAgIEZJWF9HQ0MgaW50IGkgPSBuZGlnaXRzOwotICAgcG5nX3VpbnRfMTYgY2FycnkgPSAwOwotCi0gICBhc3NlcnQocmlnaHRfc2hpZnQgPj0gMSAmJiByaWdodF9zaGlmdCA8PSAxNSk7Ci0KLSAgIHdoaWxlICgtLWkgPj0gMCkKLSAgIHsKLSAgICAgIHBuZ191aW50XzE2IHRlbXAgPSAocG5nX3VpbnRfMTYpKGNhcnJ5IHwgKGlub3V0W2ldID4+IHJpZ2h0X3NoaWZ0KSk7Ci0KLSAgICAgIC8qIEJvdHRvbSBiaXRzIHRvIHRvcCBiaXRzIG9mIGNhcnJ5ICovCi0gICAgICBjYXJyeSA9IChwbmdfdWludF8xNikoKGlub3V0W2ldIDw8ICgxNi1yaWdodF9zaGlmdCkpICYgMHhmZmZmKTsKLQotICAgICAgaW5vdXRbaV0gPSB0ZW1wOwotCi0gICAgICAvKiBUaGUgc2hpZnQgbWF5IHJlZHVjZSBuZGlnaXRzICovCi0gICAgICBpZiAoaSA9PSBuZGlnaXRzLTEgJiYgdGVtcCA9PSAwKQotICAgICAgICAgbmRpZ2l0cyA9IGk7Ci0gICB9Ci0KLSAgIHJldHVybiBuZGlnaXRzOwotfQotCi1zdGF0aWMgaW50Ci11YXJiX2NtcCh1YXJiIGEsIGludCBhZGlnaXRzLCB1YXJiIGIsIGludCBiZGlnaXRzKQotICAgLyogUmV0dXJuIC0xLzAvKzEgYWNjb3JkaW5nIGFzIGE8Yi9hPT1iL2E+YiAqLwotewotICAgaWYgKGFkaWdpdHMgPCBiZGlnaXRzKQotICAgICAgcmV0dXJuIC0xOwotCi0gICBpZiAoYWRpZ2l0cyA+IGJkaWdpdHMpCi0gICAgICByZXR1cm4gMTsKLQotICAgd2hpbGUgKGFkaWdpdHMtLSA+IDApCi0gICAgICBpZiAoYVthZGlnaXRzXSA8IGJbYWRpZ2l0c10pCi0gICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgIGVsc2UgaWYgKGFbYWRpZ2l0c10gPiBiW2FkaWdpdHNdKQotICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgIHJldHVybiAwOwotfQotCi0jaWYgMCAvKlVOVVNFRCovCi1zdGF0aWMgaW50Ci11YXJiX2VxMzIodWFyYiBudW0sIGludCBkaWdpdHMsIHBuZ191aW50XzMyIHZhbCkKLSAgIC8qIFJldHVybiB0cnVlIGlmIHRoZSB1YXJiIGlzIGVxdWFsIHRvICd2YWwnICovCi17Ci0gICBzd2l0Y2ggKGRpZ2l0cykKLSAgIHsKLSAgICAgIGNhc2UgMDogIHJldHVybiB2YWwgPT0gMDsKLSAgICAgIGNhc2UgMTogIHJldHVybiB2YWwgPT0gbnVtWzBdOwotICAgICAgY2FzZSAyOiAgcmV0dXJuICh2YWwgJiAweGZmZmYpID09IG51bVswXSAmJiAodmFsID4+IDE2KSA9PSBudW1bMV07Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gMDsKLSAgIH0KLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotdWFyYl9wcmludHgodWFyYiBudW0sIGludCBkaWdpdHMsIEZJTEUgKm91dCkKLSAgIC8qIFByaW50ICdudW0nIGFzIGEgaGV4YWRlY2ltYWwgbnVtYmVyIChlYXNpZXIgdGhhbiBkZWNpbWFsISkgKi8KLXsKLSAgIHdoaWxlIChkaWdpdHMgPiAwKQotICAgICAgaWYgKG51bVstLWRpZ2l0c10gPiAwKQotICAgICAgewotICAgICAgICAgZnByaW50ZihvdXQsICIweCV4IiwgbnVtW2RpZ2l0c10pOwotCi0gICAgICAgICB3aGlsZSAoZGlnaXRzID4gMCkKLSAgICAgICAgICAgIGZwcmludGYob3V0LCAiJS40eCIsIG51bVstLWRpZ2l0c10pOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChkaWdpdHMgPT0gMCkgLyogdGhlIG51bWJlciBpcyAwICovCi0gICAgICAgICBmcHV0cygiMHgwIiwgb3V0KTsKLX0KLQotc3RhdGljIHZvaWQKLXVhcmJfcHJpbnQodWFyYiBudW0sIGludCBkaWdpdHMsIEZJTEUgKm91dCkKLSAgIC8qIFByaW50cyAnbnVtJyBhcyBhIGRlY2ltYWwgaWYgaXQgd2lsbCBmaXQgaW4gYW4gdW5zaWduZWQgbG9uZywgZWxzZSBhcyBhCi0gICAgKiBoZXhhZGVjaW1hbCBudW1iZXIuICBOb3RpY2UgdGhhdCB0aGUgcmVzdWx0cyB2YXJ5IGZvciBpbWFnZXMgb3ZlciA0R0J5dGUKLSAgICAqIGluIGEgc3lzdGVtIGRlcGVuZGVudCB3YXksIGFuZCB0aGUgaGV4YWRlY2ltYWwgZm9ybSBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsCi0gICAgKiBpbiBhd2sgc2NyaXB0IGlucHV0LgotICAgICoKLSAgICAqCi0gICAgKiBUT0RPOiB3cml0ZSB1YXJiX2RpdjEwCi0gICAgKi8KLXsKLSAgIGlmIChkaWdpdHMgKiBzaXplb2YgKHVkaWdpdCkgPiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgICAgdWFyYl9wcmludHgobnVtLCBkaWdpdHMsIG91dCk7Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbiA9IDA7Ci0KLSAgICAgIHdoaWxlIChkaWdpdHMgPiAwKQotICAgICAgICAgbiA9IChuIDw8IDE2KSArIG51bVstLWRpZ2l0c107Ci0KLSAgICAgIGZwcmludGYob3V0LCAiJWx1Iiwgbik7Ci0gICB9Ci19Ci0KLS8qIEdlbmVyYXRlIHJhbmRvbSBieXRlcy4gIFRoaXMgdXNlcyBhIGJvcmluZyByZXBlYXRhYmxlIGFsZ29yaXRobSBhbmQgaXQKLSAqIGlzIGltcGxlbWVudGVkIGhlcmUgc28gdGhhdCBpdCBnaXZlcyB0aGUgc2FtZSBzZXQgb2YgbnVtYmVycyBvbiBldmVyeQotICogYXJjaGl0ZWN0dXJlLiAgSXQncyBhIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIChLbnV0aCBvciBTZWRnZXdpY2sKLSAqICJBbGdvcml0aG1zIikgYnV0IGl0IGNvbWVzIGZyb20gdGhlICdmZWVkYmFjayB0YXBzJyB0YWJsZSBpbiBIb3Jvd2l0eiBhbmQKLSAqIEhpbGwsICJUaGUgQXJ0IG9mIEVsZWN0cm9uaWNzIiAoUHNldWRvLVJhbmRvbSBCaXQgU2VxdWVuY2VzIGFuZCBOb2lzZQotICogR2VuZXJhdGlvbi4pCi0gKgotICogKENvcGllZCBmcm9tIGNvbnRyaWIvbGlidGVzdHMvcG5ndmFsaWQuYykKLSAqLwotc3RhdGljIHZvaWQKLW1ha2VfcmFuZG9tX2J5dGVzKHBuZ191aW50XzMyKiBzZWVkLCB2b2lkKiBwdiwgc2l6ZV90IHNpemUpCi17Ci0gICBwbmdfdWludF8zMiB1MCA9IHNlZWRbMF0sIHUxID0gc2VlZFsxXTsKLSAgIHBuZ19ieXRlcCBieXRlcyA9IHZvaWRjYXN0KHBuZ19ieXRlcCwgcHYpOwotCi0gICAvKiBUaGVyZSBhcmUgdGhpcnR5LXRocmVlIGJpdHM7IHRoZSBuZXh0IGJpdCBpbiB0aGUgc2VxdWVuY2UgaXMgYml0LTMzIFhPUgotICAgICogYml0LTIwLiAgVGhlIHRvcCAxIGJpdCBpcyBpbiB1MSwgdGhlIGJvdHRvbSAzMiBhcmUgaW4gdTAuCi0gICAgKi8KLSAgIHNpemVfdCBpOwotICAgZm9yIChpPTA7IGk8c2l6ZTsgKytpKQotICAgewotICAgICAgLyogRmlyc3QgZ2VuZXJhdGUgOCBuZXcgYml0cyB0aGVuIHNoaWZ0IHRoZW0gaW4gYXQgdGhlIGVuZC4gKi8KLSAgICAgIHBuZ191aW50XzMyIHUgPSAoKHUwID4+ICgyMC04KSkgXiAoKHUxIDw8IDcpIHwgKHUwID4+ICgzMi03KSkpKSAmIDB4ZmY7Ci0gICAgICB1MSA8PD0gODsKLSAgICAgIHUxIHw9IHUwID4+IDI0OwotICAgICAgdTAgPDw9IDg7Ci0gICAgICB1MCB8PSB1OwotICAgICAgKmJ5dGVzKysgPSAocG5nX2J5dGUpdTsKLSAgIH0KLQotICAgc2VlZFswXSA9IHUwOwotICAgc2VlZFsxXSA9IHUxOwotfQotCi0vKiBDbGVhciBhbiBvYmplY3QgdG8gYSByYW5kb20gdmFsdWUuICovCi1zdGF0aWMgdm9pZAotY2xlYXIodm9pZCAqcHYsIHNpemVfdCBzaXplKQotewotICAgc3RhdGljIHBuZ191aW50XzMyIGNsZWFyX3NlZWRbMl0gPSB7IDB4MTIzNDU2NzgsIDB4OWFiY2RlZjAgfTsKLSAgIG1ha2VfcmFuZG9tX2J5dGVzKGNsZWFyX3NlZWQsIHB2LCBzaXplKTsKLX0KLQotI2RlZmluZSBDTEVBUihvYmplY3QpIGNsZWFyKCYob2JqZWN0KSwgc2l6ZW9mIChvYmplY3QpKQotCi0vKiBDb3BpZWQgZnJvbSB1bnJlbGVhc2VkIDEuNyBjb2RlLgotICoKLSAqIENSQyBjaGVja2luZyB1c2VzIGEgbG9jYWwgcHJlLWJ1aWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBFdGhlcm5ldCBDUkMzMi4KLSAqIFRoaXMgaXMgdG8gYXZvaWQgYSBmdW5jdGlvbiBjYWxsIHRvIHRoZSB6bGliIERMTCBhbmQgdG8gb3B0aW1pemUgdGhlCi0gKiBieXRlLWJ5LWJ5dGUgY2FzZS4KLSAqLwotc3RhdGljIHBuZ191aW50XzMyIGNyY190YWJsZVsyNTZdID0KLXsKLSAgIDB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsIDB4MDc2ZGM0MTksCi0gICAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LAotICAgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwgMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNywKLSAgIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsCi0gICAweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LCAweDEzNmM5ODU2LAotICAgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywgMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwKLSAgIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsIDB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsCi0gICAweGEyNjc3MTcyLCAweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLAotICAgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwgMHgzMmQ4NmNlMywKLSAgIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksIDB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsCi0gICAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LCAweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LAotICAgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKLSAgIDB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsIDB4NzZkYzQxOTAsCi0gICAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLCAweDcxYjE4NTg5LCAweDA2YjZiNTFmLAotICAgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwKLSAgIDB4ZTEwZTk4MTgsIDB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsCi0gICAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLCAweDZjMDY5NWVkLAotICAgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywgMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwKLSAgIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsIDB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsCi0gICAweGZiZDQ0YzY1LCAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLAotICAgMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwgMHg0MzY5ZTk2YSwKLSAgIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsIDB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsCi0gICAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLAotICAgMHhjOTBjMjA4NiwgMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZiwKLSAgIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsCi0gICAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLCAweGVkYjg4MzIwLCAweDlhYmZiM2I2LAotICAgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwgMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSwKLSAgIDB4NzNkYzE2ODMsIDB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsCi0gICAweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLCAweGYwMGY5MzQ0LAotICAgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwKLSAgIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsIDB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsCi0gICAweDY3ZGQ0YWNjLCAweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LAotICAgMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSwKLSAgIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsIDB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsCi0gICAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLAotICAgMHg0NjY5YmU3OSwgMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNiwKLSAgIDB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsIDB4YzViYTNiYmUsCi0gICAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLAotICAgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwgMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YywKLSAgIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsCi0gICAweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LCAweDkyZDI4ZTliLAotICAgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwgMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwKLSAgIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsCi0gICAweDE4Yjc0Nzc3LCAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLAotICAgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwgMHhhMDBhZTI3OCwKLSAgIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsCi0gICAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLCAweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LAotICAgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKLSAgIDB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsIDB4YmFkMDM2MDUsCi0gICAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLCAweGIzNjY3YTJlLCAweGM0NjE0YWI4LAotICAgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwKLSAgIDB4MmQwMmVmOGQKLX07Ci0KLS8qIFRoZSBDUkMgY2FsY3VsYXRlZCBoZXJlICpJUyogY29uZGl0aW9uZWQsIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIHVzZWQgYnkKLSAqIHpsaWIgYW5kIHRoZSByZXN1bHQgdmFsdWUgaXMgb2J0YWluZWQgYnkgWE9SaW5nIHdpdGggQ1JDX0lOSVQsIHdoaWNoIGlzIGFsc28KLSAqIHRoZSBmaXJzdCB2YWx1ZSB0aGF0IG11c3QgYmUgcGFzc2VkIGluIChmb3IgdGhlIGZpcnN0IGJ5dGUpIHRvIGNyY19vbmVfYnl0ZS4KLSAqLwotI2RlZmluZSBDUkNfSU5JVCAweGZmZmZmZmZmCi0KLXN0YXRpYyBwbmdfdWludF8zMgotY3JjX29uZV9ieXRlKHBuZ191aW50XzMyIGNyYywgaW50IGIpCi17Ci0gICByZXR1cm4gY3JjX3RhYmxlWyhjcmMgXiBiKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyCi1jcmNfaW5pdF80KHBuZ191aW50XzMyIHZhbHVlKQotewotICAgLyogVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgYWxnb3JpdGhtIHVzZWQgaW4gemxpYiwgd2hpY2ggcmVxdWlyZXMgZm91cgotICAgICogc2VwYXJhdGUgdGFibGVzIHRvIHBhcmFsbGVsaXplIHRoZSBmb3VyIGJ5dGUgb3BlcmF0aW9ucywgaXQgb25seSB3b3JrcyBmb3IKLSAgICAqIGEgQ1JDIG9mIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBzdHJlYW0sIGJ1dCB0aGlzIGlzIHdoYXQgaGFwcGVucyBpbgotICAgICogdGhlIHBhcnNlciBiZWxvdyB3aGVyZSBsZW5ndGgrY2h1bmstbmFtZSBpcyByZWFkIGFuZCBjaHVuay1uYW1lIHVzZWQgdG8KLSAgICAqIGluaXRpYWxpemUgdGhlIENSQy4gIE5vdGljZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiBoZXJlIGF2b2lkcyByZXBlYXRlZAotICAgICogY29uZGl0aW9uaW5nICh4b3Igd2l0aCAweGZmZmZmZmZmKSBieSBzdG9yaW5nIHRoZSBjb25kaXRpb25lZCB2YWx1ZS4KLSAgICAqLwotICAgcG5nX3VpbnRfMzIgY3JjID0gY3JjX3RhYmxlWyh+dmFsdWUgPj4gMjQpXSBeIDB4ZmZmZmZmOwotCi0gICBjcmMgPSBjcmNfdGFibGVbKGNyYyBeICh2YWx1ZSA+PiAxNikpICYgMHhmZl0gXiAoY3JjID4+IDgpOwotICAgY3JjID0gY3JjX3RhYmxlWyhjcmMgXiAodmFsdWUgPj4gOCkpICYgMHhmZl0gXiAoY3JjID4+IDgpOwotICAgcmV0dXJuIGNyY190YWJsZVsoY3JjIF4gdmFsdWUpICYgMHhmZl0gXiAoY3JjID4+IDgpOwotfQotCi1zdGF0aWMgaW50Ci1jaHVua190eXBlX3ZhbGlkKHBuZ191aW50XzMyIGMpCi0gICAvKiBCaXQgd2hhY2tpbmcgYXBwcm9hY2ggdG8gY2h1bmsgbmFtZSB2YWxpZGF0aW9uIHRoYXQgaXMgaW50ZW5kZWQgdG8gYXZvaWQKLSAgICAqIGJyYW5jaGVzLiAgVGhlIGNvc3QgaXMgdGhhdCBpdCB1c2VzIGEgbG90IG9mIDMyLWJpdCBjb25zdGFudHMsIHdoaWNoIG1pZ2h0Ci0gICAgKiBiZSBiYWQgb24gc29tZSBhcmNoaXRlY3R1cmVzLgotICAgICovCi17Ci0gICBwbmdfdWludF8zMiB0OwotCi0gICAvKiBSZW1vdmUgYml0IDUgZnJvbSBhbGwgYnV0IHRoZSByZXNlcnZlZCBieXRlOyB0aGlzIG1lYW5zIGV2ZXJ5Ci0gICAgKiA4LWJpdCB1bml0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDY1LTkwIHRvIGJlIHZhbGlkLiAgU28gYml0IDUKLSAgICAqIG11c3QgYmUgemVybywgYml0IDYgbXVzdCBiZSBzZXQgYW5kIGJpdCA3IHplcm8uCi0gICAgKi8KLSAgIGMgJj0gflBOR19VMzIoMzIsMzIsMCwzMik7Ci0gICB0ID0gKGMgJiB+MHgxZjFmMWYxZikgXiAweDQwNDA0MDQwOwotCi0gICAvKiBTdWJ0cmFjdCA2NSBmb3IgZWFjaCA4LWJpdCBxdWFudGl0eSwgdGhpcyBtdXN0IG5vdCBvdmVyZmxvdwotICAgICogYW5kIGVhY2ggYnl0ZSBtdXN0IHRoZW4gYmUgaW4gdGhlIHJhbmdlIDAtMjUuCi0gICAgKi8KLSAgIGMgLT0gUE5HX1UzMig2NSw2NSw2NSw2NSk7Ci0gICB0IHw9YyA7Ci0KLSAgIC8qIFN1YnRyYWN0IDI2LCBoYW5kbGluZyB0aGUgb3ZlcmZsb3cgd2hpY2ggc2hvdWxkIHNldCB0aGUgdG9wCi0gICAgKiB0aHJlZSBiaXRzIG9mIGVhY2ggYnl0ZS4KLSAgICAqLwotICAgYyAtPSBQTkdfVTMyKDI1LDI1LDI1LDI2KTsKLSAgIHQgfD0gfmM7Ci0KLSAgIHJldHVybiAodCAmIDB4ZTBlMGUwZTApID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlRST0wgSU5GT1JNQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc2VxdWVuY2Ugb2YgSURBVCBjaHVua3MsIHRoZSBjaHVua3MgaGF2ZSBiZWVuIHJlLXN5bmNlZAotICogdXNpbmcgc3luY19zdHJlYW0gYmVsb3cgYW5kIHRoZSBuZXcgbGVuZ3RocyBhcmUgcmVjb3JkZWQgaGVyZS4gIEJlY2F1c2UgdGhlCi0gKiBudW1iZXIgb2YgY2h1bmtzIGlzIHVubGltaXRlZCB0aGlzIGlzIGhhbmRsZWQgdXNpbmcgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZQotICogc3RydWN0dXJlcy4KLSAqLwotc3RydWN0IElEQVRfbGlzdAotewotICAgc3RydWN0IElEQVRfbGlzdCAqbmV4dDsgICAgIC8qIExpbmtlZCBsaXN0ICovCi0gICB1bnNpZ25lZCBpbnQgICAgICBsZW5ndGg7ICAgLyogQWN0dWFsIGxlbmd0aCBvZiB0aGUgYXJyYXkgYmVsb3cgKi8KLSAgIHVuc2lnbmVkIGludCAgICAgIGNvdW50OyAgICAvKiBOdW1iZXIgb2YgZW50cmllcyB0aGF0IGFyZSB2YWxpZCAqLwotIyAgICAgZGVmaW5lIElEQVRfSU5JVF9MRU5HVEggMTYKLSAgIHBuZ191aW50XzMyICAgICAgIGxlbmd0aHNbSURBVF9JTklUX0xFTkdUSF07Ci19OwotCi1zdGF0aWMgdm9pZAotSURBVF9saXN0X2luaXQoc3RydWN0IElEQVRfbGlzdCAqbGlzdCkKLXsKLSAgIENMRUFSKCpsaXN0KTsKLQotICAgbGlzdC0+bmV4dCA9IE5VTEw7Ci0gICBsaXN0LT5sZW5ndGggPSBJREFUX0lOSVRfTEVOR1RIOwotfQotCi1zdGF0aWMgc2l6ZV90Ci1JREFUX2xpc3Rfc2l6ZShzdHJ1Y3QgSURBVF9saXN0ICpsaXN0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotICAgLyogUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIElEQVRfbGlzdCBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLiAqLwotewotICAgaWYgKGxpc3QgIT0gTlVMTCkKLSAgICAgIGxlbmd0aCA9IGxpc3QtPmxlbmd0aDsKLQotICAgcmV0dXJuIHNpemVvZiAqbGlzdCAtIHNpemVvZiBsaXN0LT5sZW5ndGhzICsKLSAgICAgIGxlbmd0aCAqIHNpemVvZiBsaXN0LT5sZW5ndGhzWzBdOwotfQotCi1zdGF0aWMgdm9pZAotSURBVF9saXN0X2VuZChzdHJ1Y3QgSURBVF9saXN0ICpJREFUX2xpc3QpCi17Ci0gICBzdHJ1Y3QgSURBVF9saXN0ICpsaXN0ID0gSURBVF9saXN0LT5uZXh0OwotCi0gICBDTEVBUigqSURBVF9saXN0KTsKLQotICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkKLSAgIHsKLSAgICAgIHN0cnVjdCBJREFUX2xpc3QgKm5leHQgPSBsaXN0LT5uZXh0OwotCi0gICAgICBjbGVhcihsaXN0LCBJREFUX2xpc3Rfc2l6ZShsaXN0LCAwKSk7Ci0gICAgICBmcmVlKGxpc3QpOwotICAgICAgbGlzdCA9IG5leHQ7Ci0gICB9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgSURBVF9saXN0ICoKLUlEQVRfbGlzdF9leHRlbmQoc3RydWN0IElEQVRfbGlzdCAqdGFpbCkKLXsKLSAgIC8qIFVzZSB0aGUgcHJldmlvdXMgY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZS4gKi8KLSAgIHN0cnVjdCBJREFUX2xpc3QgKm5leHQgPSB0YWlsLT5uZXh0OwotCi0gICBpZiAobmV4dCA9PSBOVUxMKQotICAgewotICAgICAgLyogSW5zZXJ0IGEgbmV3LCBtYWxsb2MnZWQsIGJsb2NrIG9mIElEQVQgaW5mb3JtYXRpb24gYnVmZmVycywgdGhpcwotICAgICAgICogb25lIHR3aWNlIGFzIGxhcmdlIGFzIHRoZSBwcmV2aW91cyBvbmU6Ci0gICAgICAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGggPSAyICogdGFpbC0+bGVuZ3RoOwotCi0gICAgICBpZiAobGVuZ3RoIDwgdGFpbC0+bGVuZ3RoKSAvKiBhcml0aG1ldGljIG92ZXJmbG93ICovCi0gICAgICAgICBsZW5ndGggPSB0YWlsLT5sZW5ndGg7Ci0KLSAgICAgIG5leHQgPSB2b2lkY2FzdChJREFUX2xpc3QqLCBtYWxsb2MoSURBVF9saXN0X3NpemUoTlVMTCwgbGVuZ3RoKSkpOwotICAgICAgQ0xFQVIoKm5leHQpOwotCi0gICAgICAvKiBUaGUgY2FsbGVyIG11c3QgaGFuZGxlIHRoaXM6ICovCi0gICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG5leHQtPm5leHQgPSBOVUxMOwotICAgICAgbmV4dC0+bGVuZ3RoID0gbGVuZ3RoOwotICAgICAgdGFpbC0+bmV4dCA9IG5leHQ7Ci0gICB9Ci0KLSAgIHJldHVybiBuZXh0OwotfQotCi0vKiBHTE9CQUwgQ09OVFJPTCBTVFJVQ1RVUkUgKi8KLXN0cnVjdCBnbG9iYWwKLXsKLSAgIC8qIFBVQkxJQyBHTE9CQUwgVkFSSUFCTEVTOiBPV05FUiBJTklUSUFMSVpFICovCi0gICB1bnNpZ25lZCBpbnQgICBlcnJvcnMgICAgICAgIDoxOyAvKiBwcmludCBmaWxlIGVycm9ycyB0byBzdGRlcnIgKi8KLSAgIHVuc2lnbmVkIGludCAgIHdhcm5pbmdzICAgICAgOjE7IC8qIHByaW50IGxpYnBuZyB3YXJuaW5ncyB0byBzdGRlcnIgKi8KLSAgIHVuc2lnbmVkIGludCAgIG9wdGltaXplX3psaWIgOjE7IC8qIFJ1biBvcHRpbWl6YXRpb24gc2VhcmNoICovCi0gICB1bnNpZ25lZCBpbnQgICBxdWlldCAgICAgICAgIDoyOyAvKiBkb24ndCBvdXRwdXQgc3VtbWFyaWVzICovCi0gICB1bnNpZ25lZCBpbnQgICB2ZXJib3NlICAgICAgIDozOyAvKiB2YXJpb3VzIGludGVybmFsIHRyYWNraW5nICovCi0gICB1bnNpZ25lZCBpbnQgICBza2lwICAgICAgICAgIDozOyAvKiBOb24tY3JpdGljYWwgY2h1bmtzIHRvIHNraXAgKi8KLSMgICAgIGRlZmluZSBTS0lQX05PTkUgICAgICAwCi0jICAgICBkZWZpbmUgU0tJUF9CQURfQ1JDICAgMSAgICAvKiBDaHVua3Mgd2l0aCBhIGJhZCBDUkMgKi8KLSMgICAgIGRlZmluZSBTS0lQX1VOU0FGRSAgICAyICAgIC8qIENodW5rcyBub3Qgc2FmZSB0byBjb3B5ICovCi0jICAgICBkZWZpbmUgU0tJUF9VTlVTRUQgICAgMyAgICAvKiBDaHVua3Mgbm90IHVzZWQgYnkgbGlicG5nICovCi0jICAgICBkZWZpbmUgU0tJUF9UUkFOU0ZPUk0gNCAgICAvKiBDaHVua3Mgb25seSB1c2VkIGluIHRyYW5zZm9ybXMgKi8KLSMgICAgIGRlZmluZSBTS0lQX0NPTE9SICAgICA1ICAgIC8qIEV2ZXJ5dGhpbmcgYnV0IHRSTlMsIHNCSVQsIGdBTUEgYW5kIHNSR0IgKi8KLSMgICAgIGRlZmluZSBTS0lQX0FMTCAgICAgICA2ICAgIC8qIEV2ZXJ5dGhpbmcgYnV0IHRSTlMgYW5kIHNCSVQgKi8KLQotICAgcG5nX3VpbnRfMzIgICAgaWRhdF9tYXg7ICAgICAgICAgLyogMCB0byBwZXJmb3JtIG5vIHJlLWNodW5raW5nICovCi0KLSAgIGludCAgICAgICAgICAgIHN0YXR1c19jb2RlOyAgICAgIC8qIEFjY3VtdWxhdGVkIHN0YXR1cyBjb2RlICovCi0jICAgICBkZWZpbmUgVE9PX0ZBUl9CQUNLICAgMHgwMSAvKiBmb3VuZCBhIHRvby1mYXItYmFjayBlcnJvciAqLwotIyAgICAgZGVmaW5lIENSQ19FUlJPUiAgICAgIDB4MDIgLyogZml4ZWQgYW4gaW52YWxpZCBDUkMgKi8KLSMgICAgIGRlZmluZSBTVFJFQU1fRVJST1IgICAweDA0IC8qIGRhbWFnZWQgUE5HIHN0cmVhbSAobWF5IGJlIGZpeGFibGUpICovCi0jICAgICBkZWZpbmUgVFJVTkNBVEVEICAgICAgMHgwOCAvKiB0cnVuY2F0ZWQgYnV0IHN0aWxsIHJlYWRhYmxlICovCi0jICAgICBkZWZpbmUgRklMRV9FUlJPUiAgICAgMHgxMCAvKiBjb3VsZCBub3QgcmVhZCB0aGUgZmlsZSAqLwotIyAgICAgZGVmaW5lIFdSSVRFX0VSUk9SICAgIDB4MjAgLyogd3JpdGUgZXJyb3IgKHRoaXMgdGVybWluYXRlcyB0aGUgcmVhZCkgKi8KLSMgICAgIGRlZmluZSBJTlRFUk5BTF9FUlJPUiAweDQwIC8qIGludGVybmFsIGxpbWl0cy9lcnJvcnMgZW5jb3VudGVyZWQgKi8KLQotICAgLyogUFVCTElDIEdMT0JBTCBWQVJJQUJMRVM6IFVTRUQgSU5URVJOQUxMWSBCWSBJREFUIFJFQUQgQ09ERSAqLwotICAgc3RydWN0IElEQVRfbGlzdCBpZGF0X2NhY2hlOyAgLyogQ2FjaGUgb2YgZmlsZSBJREFUIGluZm9ybWF0aW9uIGJ1ZmZlcnMgKi8KLSAgICAgIC8qIFRoZSBzdHJ1Y3R1cmUgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdXNlcyBvZiB0aGlzIGdsb2JhbCBjb250cm9sCi0gICAgICAgKiBzdHJ1Y3R1cmUgdG8gYXZvaWQgcmVhbGxvY2F0aW9uIGJldHdlZW4gSURBVCBzdHJlYW1zLgotICAgICAgICovCi19OwotCi1zdGF0aWMgaW50Ci1nbG9iYWxfZW5kKHN0cnVjdCBnbG9iYWwgKmdsb2JhbCkKLXsKLQotICAgaW50IHJjOwotCi0gICBJREFUX2xpc3RfZW5kKCZnbG9iYWwtPmlkYXRfY2FjaGUpOwotICAgcmMgPSBnbG9iYWwtPnN0YXR1c19jb2RlOwotICAgQ0xFQVIoKmdsb2JhbCk7Ci0gICByZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbG9iYWxfaW5pdChzdHJ1Y3QgZ2xvYmFsICpnbG9iYWwpCi0gICAvKiBDYWxsIHRoaXMgb25jZSAoYW5kIG9ubHkgb25jZSkgdG8gaW5pdGlhbGl6ZSB0aGUgY29udHJvbCAqLwotewotICAgQ0xFQVIoKmdsb2JhbCk7Ci0KLSAgIC8qIEdsb2JhbHMgKi8KLSAgIGdsb2JhbC0+ZXJyb3JzICAgICAgICA9IDA7Ci0gICBnbG9iYWwtPndhcm5pbmdzICAgICAgPSAwOwotICAgZ2xvYmFsLT5xdWlldCAgICAgICAgID0gMDsKLSAgIGdsb2JhbC0+dmVyYm9zZSAgICAgICA9IDA7Ci0gICBnbG9iYWwtPmlkYXRfbWF4ICAgICAgPSAwOyAgICAgICAgIC8qIG5vIHJlLWNodW5raW5nIG9mIElEQVQgKi8KLSAgIGdsb2JhbC0+b3B0aW1pemVfemxpYiA9IDA7Ci0gICBnbG9iYWwtPnNraXAgICAgICAgICAgPSBTS0lQX05PTkU7Ci0gICBnbG9iYWwtPnN0YXR1c19jb2RlICAgPSAwOwotCi0gICBJREFUX2xpc3RfaW5pdCgmZ2xvYmFsLT5pZGF0X2NhY2hlKTsKLX0KLQotc3RhdGljIGludAotc2tpcF9jaHVua190eXBlKGNvbnN0IHN0cnVjdCBnbG9iYWwgKmdsb2JhbCwgcG5nX3VpbnRfMzIgdHlwZSkKLSAgIC8qIFJldHVybiB0cnVlIGlmIHRoaXMgY2h1bmsgaXMgdG8gYmUgc2tpcHBlZCBhY2NvcmRpbmcgdG8gdGhlIC0tc3RyaXAKLSAgICAqIG9wdGlvbi4gIFRoaXMgY29kZSBuZWVkcyB0byByZWNvZ25pemUgYWxsIGtub3duIGFuY2lsbGFyeSBjaHVua3MgaW4gb3JkZXIKLSAgICAqIHRvIGhhbmRsZSB0aGUgLS1zdHJpcD11bnNhZmUgb3B0aW9uLgotICAgICovCi17Ci0gICAvKiBOZXZlciBzdHJpcCBjcml0aWNhbCBjaHVua3M6ICovCi0gICBpZiAoQ1JJVElDQUwodHlwZSkpCi0gICAgICByZXR1cm4gMDsKLQotICAgc3dpdGNoICh0eXBlKQotICAgewotICAgICAgLyogQ2h1bmtzIHRoYXQgYXJlIHRyZWF0ZWQgYXMsIGVmZmVjdGl2ZWx5LCBjcml0aWNhbCBiZWNhdXNlIHRoZXkgYWZmZWN0Ci0gICAgICAgKiBjb3JyZWN0IGludGVycHJldGF0aW9uIG9mIHRoZSBwaXhlbCB2YWx1ZXM6Ci0gICAgICAgKi8KLSAgICAgIGNhc2UgcG5nX3RSTlM6IGNhc2UgcG5nX3NCSVQ6Ci0gICAgICAgICByZXR1cm4gMDsKLQotICAgICAgLyogQ2h1bmtzIHRoYXQgc3BlY2lmeSBnYW1tYSBlbmNvZGluZyB3aGljaCBzaG91bGQgdGhlcmVmb3JlIG9ubHkgYmUKLSAgICAgICAqIHJlbW92ZWQgdGhlIHRoZSB1c2VyIGluc2lzdHM6Ci0gICAgICAgKi8KLSAgICAgIGNhc2UgcG5nX2dBTUE6IGNhc2UgcG5nX3NSR0I6Ci0gICAgICAgICBpZiAoZ2xvYmFsLT5za2lwID49IFNLSVBfQUxMKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICByZXR1cm4gMDsKLQotICAgICAgLyogQ2h1bmtzIHRoYXQgYWZmZWN0IGNvbG9yIGludGVycHJldGF0aW9uIC0gbm90IHVzZWQgYnkgbGlicG5nIGFuZCByYXJlbHkKLSAgICAgICAqIHVzZWQgYnkgYXBwbGljYXRpb25zLCBidXQgdGVjaG5pY2FsbHkgc3RpbGwgcmVxdWlyZWQgZm9yIGNvcnJlY3QKLSAgICAgICAqIGludGVycHJldGF0aW9uIG9mIHRoZSBpbWFnZSBkYXRhOgotICAgICAgICovCi0gICAgICBjYXNlIHBuZ19jSFJNOiBjYXNlIHBuZ19pQ0NQOgotICAgICAgICAgaWYgKGdsb2JhbC0+c2tpcCA+PSBTS0lQX0NPTE9SKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICByZXR1cm4gMDsKLQotICAgICAgLyogT3RoZXIgY2h1bmtzIHRoYXQgYXJlIHVzZWQgYnkgbGlicG5nIGluIGltYWdlIHRyYW5zZm9ybWF0aW9ucyAoYXMKLSAgICAgICAqIG9wcG9zZWQgdG8ga25vd24gY2h1bmtzIHRoYXQgaGF2ZSBnZXQvc2V0IEFQSXMgYnV0IGFyZSBub3Qgb3RoZXJ3aXNlCi0gICAgICAgKiB1c2VkLikKLSAgICAgICAqLwotICAgICAgY2FzZSBwbmdfYktHRDoKLSAgICAgICAgIGlmIChnbG9iYWwtPnNraXAgPj0gU0tJUF9UUkFOU0ZPUk0pCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAvKiBBbGwgb3RoZXIgY2h1bmtzIHRoYXQgbGlicG5nIGtub3dzIGFib3V0IGFuZCBhZmZlY3QgbmVpdGhlciBpbWFnZQotICAgICAgICogaW50ZXJwcmV0YXRpb24gbm9yIGxpYnBuZyB0cmFuc2Zvcm1zIC0gY2h1bmtzIHRoYXQgYXJlIGVmZmVjdGl2ZWx5Ci0gICAgICAgKiB1bnVzZWQgYnkgbGlicG5nIGV2ZW4gdGhvdWdoIGxpYnBuZyBtaWdodCByZWNvZ25pemUgYW5kIHN0b3JlIHRoZW0uCi0gICAgICAgKi8KLSAgICAgIGNhc2UgcG5nX2ZSQWM6IGNhc2UgcG5nX2dJRmc6IGNhc2UgcG5nX2dJRnQ6IGNhc2UgcG5nX2dJRng6IGNhc2UgcG5nX2hJU1Q6Ci0gICAgICBjYXNlIHBuZ19pVFh0OiBjYXNlIHBuZ19vRkZzOiBjYXNlIHBuZ19wQ0FMOiBjYXNlIHBuZ19wSFlzOiBjYXNlIHBuZ19zQ0FMOgotICAgICAgY2FzZSBwbmdfc1BMVDogY2FzZSBwbmdfc1RFUjogY2FzZSBwbmdfdEVYdDogY2FzZSBwbmdfdElNRTogY2FzZSBwbmdfelRYdDoKLSAgICAgICAgIGlmIChnbG9iYWwtPnNraXAgPj0gU0tJUF9VTlVTRUQpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAvKiBDaHVua3MgdGhhdCBsaWJwbmcgZG9lcyBub3Qga25vdyBhYm91dCAobm90aWNlIHRoYXQgdGhpcyBkZXBlbmRzIG9uIHRoZQotICAgICAgICogbGlzdCBhYm92ZSBpbmNsdWRpbmcgYWxsIGtub3duIGNodW5rcyEpICBUaGUgZGVjaXNpb24gaGVyZSBkZXBlbmRzIG9uCi0gICAgICAgKiB3aGV0aGVyIHRoZSBzYWZlLXRvLWNvcHkgYml0IGlzIHNldCBpbiB0aGUgY2h1bmsgdHlwZS4KLSAgICAgICAqLwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGlmIChTQUZFX1RPX0NPUFkodHlwZSkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZ2xvYmFsLT5za2lwID49IFNLSVBfVU5VU0VEKSAvKiBhcyBhYm92ZSAqLwotICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UgaWYgKGdsb2JhbC0+c2tpcCA+PSBTS0lQX1VOU0FGRSkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICByZXR1cm4gMDsKLSAgIH0KLX0KLQotLyogUEVSLUZJTEUgQ09OVFJPTCBTVFJVQ1RVUkUgKi8KLXN0cnVjdCBjaHVuazsKLXN0cnVjdCBJREFUOwotc3RydWN0IGZpbGUKLXsKLSAgIC8qIEFOQ0VTVE9SUyAqLwotICAgc3RydWN0IGdsb2JhbCAqZ2xvYmFsOwotCi0gICAvKiBQVUJMSUMgUEVSLUZJTEUgVkFSSUFCTEVTOiBDQUxMRVIgSU5JVElBTElaRSAqLwotICAgY29uc3QgY2hhciAqICAgZmlsZV9uYW1lOwotICAgY29uc3QgY2hhciAqICAgb3V0X25hbWU7ICAgICAgLyogTmFtZSBvZiBvdXRwdXQgZmlsZSAoaWYgcmVxdWlyZWQpICovCi0KLSAgIC8qIFBVQkxJQyBQRVItRklMRSBWQVJJQUJMRVM6IFNFVCBCWSBQTkcgUkVBRCBDT0RFICovCi0gICAvKiBGaWxlIHNwZWNpZmljIHJlc3VsdCBjb2RlcyAqLwotICAgaW50ICAgICAgICAgICAgc3RhdHVzX2NvZGU7ICAgLyogU2V0IHRvIGEgYml0IG1hc2sgb2YgdGhlIGZvbGxvd2luZzogKi8KLSAgIGludCAgICAgICAgICAgIHJlYWRfZXJybm87ICAgIC8qIFJlY29yZHMgYSByZWFkIGVycm9yIGVycm5vICovCi0gICBpbnQgICAgICAgICAgICB3cml0ZV9lcnJubzsgICAvKiBSZWNvcmRzIGEgd3JpdGUgZXJyb3IgZXJybm8gKi8KLQotICAgLyogSUhEUiBpbmZvcm1hdGlvbiAqLwotICAgcG5nX3VpbnRfMzIgICAgd2lkdGg7Ci0gICBwbmdfdWludF8zMiAgICBoZWlnaHQ7Ci0gICBwbmdfYnl0ZSAgICAgICBiaXRfZGVwdGg7Ci0gICBwbmdfYnl0ZSAgICAgICBjb2xvcl90eXBlOwotICAgcG5nX2J5dGUgICAgICAgY29tcHJlc3Npb25fbWV0aG9kOwotICAgcG5nX2J5dGUgICAgICAgZmlsdGVyX21ldGhvZDsKLSAgIHBuZ19ieXRlICAgICAgIGludGVybGFjZV9tZXRob2Q7Ci0KLSAgIHVkaWdpdCAgICAgICAgIGltYWdlX2J5dGVzWzVdOwotICAgaW50ICAgICAgICAgICAgaW1hZ2VfZGlnaXRzOwotCi0gICAvKiBQUk9URUNURUQgUEVSLUZJTEUgVkFSSUFCTEVTOiBVU0VEIEJZIFRIRSBSRUFEIENPREUgKi8KLSAgIEZJTEUgKiAgICAgICAgIGZpbGU7ICAgICAgICAgIC8qIE9yaWdpbmFsIFBORyBmaWxlICovCi0gICBGSUxFICogICAgICAgICBvdXQ7ICAgICAgICAgICAvKiBJZiBhIG5ldyBvbmUgaXMgYmVpbmcgd3JpdHRlbiAqLwotICAgam1wX2J1ZiAgICAgICAgam1wYnVmOyAgICAgICAgLyogU2V0IHdoaWxlIHJlYWRpbmcgYSBQTkcgKi8KLQotICAgLyogUFJPVEVDVEVEIENIVU5LIFNQRUNJRklDIFZBUklBQkxFUzogVVNFRCBCWSBDSFVOSyBDT0RFICovCi0gICAvKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgdXNlZCBkdXJpbmcgcmVhZGluZyB0byByZWNvcmQgdGhlIGxlbmd0aCwgdHlwZQotICAgICogYW5kIGRhdGEgcG9zaXRpb24gb2YgdGhlICpuZXh0KiBjaHVuayBvciwgcmlnaHQgYXQgdGhlIHN0YXJ0LCB0aGUKLSAgICAqIHNpZ25hdHVyZSAoaW4gbGVuZ3RoLHR5cGUpLgotICAgICoKLSAgICAqIFdoZW4gYSBjaHVuayBjb250cm9sIHN0cnVjdHVyZSBpcyBpbnN0YW50aWF0ZWQgdGhlc2UgdmFsdWVzIGFyZSBjb3BpZWQKLSAgICAqIGludG8gdGhlIHN0cnVjdHVyZSBhbmQgY2FuIHRoZW4gYmUgb3ZlcnJpdHRlbiB3aXRoIHRoZSBkYXRhIGZvciB0aGUgbmV4dAotICAgICogY2h1bmsuCi0gICAgKi8KLSAgIGZwb3NfdCAgICAgICAgIGRhdGFfcG9zOyAgICAgIC8qIFBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgY2h1bmsgZGF0YSAqLwotICAgcG5nX3VpbnRfMzIgICAgbGVuZ3RoOyAgICAgICAgLyogRmlyc3Qgd29yZCAobGVuZ3RoIG9yIHNpZ25hdHVyZSBzdGFydCkgKi8KLSAgIHBuZ191aW50XzMyICAgIHR5cGU7ICAgICAgICAgIC8qIFNlY29uZCB3b3JkICh0eXBlIG9yIHNpZ25hdHVyZSBlbmQpICovCi0gICBwbmdfdWludF8zMiAgICBjcmM7ICAgICAgICAgICAvKiBSdW5uaW5nIGNodW5rIENSQyAodXNlZCBieSByZWFkX2NodW5rKSAqLwotCi0gICAvKiBUaGVzZSBjb3VudHMgYXJlIG1haW50YWluZWQgYnkgdGhlIHJlYWQgYW5kIHdyaXRlIHJvdXRpbmVzIGJlbG93IGFuZCBhcmUKLSAgICAqIHJlc2V0IGJ5IHRoZSBjaHVuayBoYW5kbGluZyBjb2RlLiAgVGhleSByZWNvcmQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcwotICAgICogcmVhZCBvciB3cml0dGVuIGZvciB0aGUgY2h1bmssIGluY2x1ZGluZyB0aGUgaGVhZGVyIChsZW5ndGgsdHlwZSkgYnl0ZXMuCi0gICAgKi8KLSAgIHBuZ191aW50XzMyICAgIHJlYWRfY291bnQ7ICAgIC8qIENvdW50IG9mIGJ5dGVzIHJlYWQgKGluIHRoZSBjaHVuaykgKi8KLSAgIHBuZ191aW50XzMyICAgIHdyaXRlX2NvdW50OyAgIC8qIENvdW50IG9mIGJ5dGVzIHdyaXR0ZW4gKGluIHRoZSBjaHVuaykgKi8KLSAgIGludCAgICAgICAgICAgIHN0YXRlOyAgICAgICAgIC8qIEFzIGRlZmluZWQgaGVyZTogKi8KLSMgICAgIGRlZmluZSBTVEFURV9TSUdOQVRVUkUgIDAgIC8qIFRoZSBzaWduYXR1cmUgaXMgYmVpbmcgd3JpdHRlbiAqLwotIyAgICAgZGVmaW5lIFNUQVRFX0NIVU5LUyAgICAgMSAgLyogTm9uLUlEQVQgY2h1bmtzIGFyZSBiZWluZyB3cml0dGVuICovCi0jICAgICBkZWZpbmUgU1RBVEVfSURBVCAgICAgICAyICAvKiBBbiBJREFUIHN0cmVhbSBpcyBiZWluZyB3cml0dGVuICovCi0KLSAgIC8qIFR3byBwb2ludGVycyB1c2VkIHRvIGVuYWJsZSBjbGVhbi11cCBpbiB0aGUgZXZlbnQgb2YgZmF0YWwgZXJyb3JzIGFuZCB0bwotICAgICogaG9sZCBzdGF0ZSBhYm91dCB0aGUgcGFyc2VyIHByb2Nlc3MgKG9ubHkgb25lIG9mIGVhY2ggYXQgcHJlc2VudC4pCi0gICAgKi8KLSAgIHN0cnVjdCBjaHVuayAqIGNodW5rOwotICAgc3RydWN0IElEQVQgKiAgaWRhdDsKLQotICAgLyogSW50ZXJmYWNlIHRvIGFsbG9jYXRlIGEgbmV3IGNodW5rIG9yIElEQVQgY29udHJvbCBzdHJ1Y3R1cmUuICBUaGUgcmVzdWx0Ci0gICAgKiBpcyByZXR1cm5lZCBieSBzZXR0aW5nIG9uZSBvciBvdGhlciBvZiB0aGUgYWJvdmUgdmFyaWFibGVzLiAgTm90ZSB0aGF0IHRoZQotICAgICogcmVsZXZhbnQgaW5pdGlhbGl6ZXIgaXMgY2FsbGVkIGJ5IHRoZSBhbGxvY2F0b3IgZnVuY3Rpb24uICBUaGUgYWxsb2NfcHRyCi0gICAgKiBpcyB1c2VkIG9ubHkgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhbGxvY2F0ZSBmdW5jdGlvbi4KLSAgICAqLwotICAgdm9pZCAqICAgICAgICAgYWxsb2NfcHRyOwotICAgdm9pZCAgICAgICAgICgqYWxsb2MpKHN0cnVjdCBmaWxlKixpbnQgaWRhdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWRhdDogYWxsb2NhdGUgSURBVCBub3QgY2h1bmsgKi8KLX07Ci0KLS8qIFZhbGlkIGxvbmdqbXAgKHN0b3ApIGNvZGVzIGFyZTogKi8KLSNkZWZpbmUgTElCUE5HX1dBUk5JTkdfQ09ERSAgIDEgLyogZ2VuZXJpYyBwbmdfZXJyb3IgKi8KLSNkZWZpbmUgTElCUE5HX0VSUk9SX0NPREUgICAgIDIgLyogZ2VuZXJpYyBwbmdfZXJyb3IgKi8KLSNkZWZpbmUgWkxJQl9FUlJPUl9DT0RFICAgICAgIDMgLyogZ2VuZXJpYyB6bGliIGVycm9yICovCi0jZGVmaW5lIElOVkFMSURfRVJST1JfQ09ERSAgICA0IC8qIGRldGVjdGVkIGFuIGludmFsaWQgUE5HICovCi0jZGVmaW5lIFJFQURfRVJST1JfQ09ERSAgICAgICA1IC8qIHJlYWQgZmFpbGVkICovCi0jZGVmaW5lIFdSSVRFX0VSUk9SX0NPREUgICAgICA2IC8qIGVycm9yIGluIHdyaXRlICovCi0jZGVmaW5lIFVORVhQRUNURURfRVJST1JfQ09ERSA3IC8qIHVuZXhwZWN0ZWQgKGludGVybmFsPykgZXJyb3IgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgRklMRSAqb3V0KQotICAgLyogUHJpbnQgYSBzdHJpbmcgd2l0aCBzcGFjZXMgcmVwbGFjZWQgYnkgJ18nIGFuZCBub24tcHJpbnRpbmcgY2hhcmFjdGVycyBieQotICAgICogYW4gb2N0YWwgZXNjYXBlLgotICAgICovCi17Ci0gICBmb3IgKDsgKnN0cjsgKytzdHIpCi0gICAgICBpZiAoaXNncmFwaChVQ0hBUl9NQVggJiAqc3RyKSkKLSAgICAgICAgIHB1dGMoKnN0ciwgb3V0KTsKLQotICAgICAgZWxzZSBpZiAoaXNzcGFjZShVQ0hBUl9NQVggJiAqc3RyKSkKLSAgICAgICAgIHB1dGMoJ18nLCBvdXQpOwotCi0gICAgICBlbHNlCi0gICAgICAgICBmcHJpbnRmKG91dCwgIlxcJS4zbyIsICpzdHIpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zdHJjb2RlKGludCBjb2RlKQotewotICAgc3dpdGNoIChjb2RlKQotICAgewotICAgICAgY2FzZSBMSUJQTkdfV0FSTklOR19DT0RFOiAgIHJldHVybiAid2FybmluZyI7Ci0gICAgICBjYXNlIExJQlBOR19FUlJPUl9DT0RFOiAgICAgcmV0dXJuICJsaWJwbmciOwotICAgICAgY2FzZSBaTElCX0VSUk9SX0NPREU6ICAgICAgIHJldHVybiAiemxpYiI7Ci0gICAgICBjYXNlIElOVkFMSURfRVJST1JfQ09ERTogICAgcmV0dXJuICJpbnZhbGlkIjsKLSAgICAgIGNhc2UgUkVBRF9FUlJPUl9DT0RFOiAgICAgICByZXR1cm4gInJlYWQiOwotICAgICAgY2FzZSBXUklURV9FUlJPUl9DT0RFOiAgICAgIHJldHVybiAid3JpdGUiOwotICAgICAgY2FzZSBVTkVYUEVDVEVEX0VSUk9SX0NPREU6IHJldHVybiAidW5leHBlY3RlZCI7Ci0gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJTlZBTElEIjsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWVtaXRfZXJyb3Ioc3RydWN0IGZpbGUgKmZpbGUsIGludCBjb2RlLCBjb25zdCBjaGFyICp3aGF0KQotICAgLyogR2VuZXJpYyBlcnJvciBtZXNzYWdlIHJvdXRpbmUsIHRha2VzIGEgJ3N0b3AnIGNvZGUgYnV0IGNhbiBiZSB1c2VkCi0gICAgKiBlbHNld2hlcmUuICBBbHdheXMgb3V0cHV0cyBhIG1lc3NhZ2UuCi0gICAgKi8KLXsKLSAgIGNvbnN0IGNoYXIgKnJlYXNvbjsKLSAgIGludCBlcnIgPSAwOwotCi0gICBzd2l0Y2ggKGNvZGUpCi0gICB7Ci0gICAgICBjYXNlIExJQlBOR19XQVJOSU5HX0NPREU6ICAgcmVhc29uID0gImxpYnBuZyB3YXJuaW5nOiI7IGJyZWFrOwotICAgICAgY2FzZSBMSUJQTkdfRVJST1JfQ09ERTogICAgIHJlYXNvbiA9ICJsaWJwbmcgZXJyb3I6IjsgYnJlYWs7Ci0gICAgICBjYXNlIFpMSUJfRVJST1JfQ09ERTogICAgICAgcmVhc29uID0gInpsaWIgZXJyb3I6IjsgYnJlYWs7Ci0gICAgICBjYXNlIElOVkFMSURfRVJST1JfQ09ERTogICAgcmVhc29uID0gImludmFsaWQiOyBicmVhazsKLSAgICAgIGNhc2UgUkVBRF9FUlJPUl9DT0RFOiAgICAgICByZWFzb24gPSAicmVhZCBmYWlsdXJlOiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZmlsZS0+cmVhZF9lcnJubzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV1JJVEVfRVJST1JfQ09ERTogICAgICByZWFzb24gPSAid3JpdGUgZXJyb3IiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGZpbGUtPndyaXRlX2Vycm5vOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVTkVYUEVDVEVEX0VSUk9SX0NPREU6IHJlYXNvbiA9ICJ1bmV4cGVjdGVkIGVycm9yOiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZmlsZS0+cmVhZF9lcnJubzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZmlsZS0+d3JpdGVfZXJybm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gIklOVkFMSUQgKGludGVybmFsIGVycm9yKToiOyBicmVhazsKLSAgIH0KLQotICAgaWYgKGVyciAhPSAwKQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgJXMgWyVzXVxuIiwgZmlsZS0+ZmlsZV9uYW1lLCByZWFzb24sIHdoYXQsCi0gICAgICAgICBzdHJlcnJvcihlcnIpKTsKLQotICAgZWxzZQotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgJXNcbiIsIGZpbGUtPmZpbGVfbmFtZSwgcmVhc29uLCB3aGF0KTsKLX0KLQotc3RhdGljIHZvaWQgY2h1bmtfZW5kKHN0cnVjdCBjaHVuayAqKik7Ci1zdGF0aWMgdm9pZCBJREFUX2VuZChzdHJ1Y3QgSURBVCAqKik7Ci0KLXN0YXRpYyBpbnQKLWZpbGVfZW5kKHN0cnVjdCBmaWxlICpmaWxlKQotewotICAgaW50IHJjOwotCi0gICAvKiBJZiBlaXRoZXIgb2YgdGhlIGNodW5rIHBvaW50ZXJzIGFyZSBzZXQgZW5kIHRoZW0gaGVyZSwgdGhlIElEQVQgc3RydWN0dXJlCi0gICAgKiBtdXN0IGJlIGRlYWxsb2NhdGVkIGZpcnN0IGFzIGl0IG1heSBkZWFsbG9jYXRlIHRoZSBjaHVuayBzdHJ1Y3R1cmUuCi0gICAgKi8KLSAgIGlmIChmaWxlLT5pZGF0ICE9IE5VTEwpCi0gICAgICBJREFUX2VuZCgmZmlsZS0+aWRhdCk7Ci0KLSAgIGlmIChmaWxlLT5jaHVuayAhPSBOVUxMKQotICAgICAgY2h1bmtfZW5kKCZmaWxlLT5jaHVuayk7Ci0KLSAgIHJjID0gZmlsZS0+c3RhdHVzX2NvZGU7Ci0KLSAgIGlmIChmaWxlLT5maWxlICE9IE5VTEwpCi0gICAgICAodm9pZClmY2xvc2UoZmlsZS0+ZmlsZSk7Ci0KLSAgIGlmIChmaWxlLT5vdXQgIT0gTlVMTCkKLSAgIHsKLSAgICAgIC8qIE5PVEU6IHRoaXMgaXMgYml0d2lzZSB8LCBhbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCBleGVjdXRlIGFuZAotICAgICAgICogbXVzdCBzdWNjZWVkLgotICAgICAgICovCi0gICAgICBpZiAoZmVycm9yKGZpbGUtPm91dCkgfCBmZmx1c2goZmlsZS0+b3V0KSB8IGZjbG9zZShmaWxlLT5vdXQpKQotICAgICAgewotICAgICAgICAgcGVycm9yKGZpbGUtPm91dF9uYW1lKTsKLSAgICAgICAgIGVtaXRfZXJyb3IoZmlsZSwgUkVBRF9FUlJPUl9DT0RFLCAib3V0cHV0IHdyaXRlIGVycm9yIik7Ci0gICAgICAgICByYyB8PSBXUklURV9FUlJPUjsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogQWNjdW11bGF0ZSB0aGUgcmVzdWx0IGNvZGVzICovCi0gICBmaWxlLT5nbG9iYWwtPnN0YXR1c19jb2RlIHw9IHJjOwotCi0gICBDTEVBUigqZmlsZSk7Ci0KLSAgIHJldHVybiByYzsgLyogc3RhdHVzIGNvZGU6IG5vbi16ZXJvIG9uIHJlYWQgb3Igd3JpdGUgZXJyb3IgKi8KLX0KLQotc3RhdGljIGludAotZmlsZV9pbml0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZ2xvYmFsICpnbG9iYWwsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLSAgIGNvbnN0IGNoYXIgKm91dF9uYW1lLCB2b2lkICphbGxvY19wdHIsIHZvaWQgKCphbGxvYykoc3RydWN0IGZpbGUqLGludCkpCi0gICAvKiBJbml0aWFsaXplIGEgZmlsZSBjb250cm9sIHN0cnVjdHVyZS4gIFRoaXMgd2lsbCBvcGVuIHRoZSBnaXZlbiBmaWxlcyBhcwotICAgICogd2VsbC4gIFRoZSBzdGF0dXMgY29kZSByZXR1cm5lZCBpcyAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvICh1c2luZyB0aGUgZmxhZ3MKLSAgICAqIGFib3ZlKSBvbiBhIGZpbGUgb3BlbiBlcnJvci4KLSAgICAqLwotewotICAgQ0xFQVIoKmZpbGUpOwotICAgZmlsZS0+Z2xvYmFsID0gZ2xvYmFsOwotCi0gICBmaWxlLT5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0gICBmaWxlLT5vdXRfbmFtZSA9IG91dF9uYW1lOwotICAgZmlsZS0+c3RhdHVzX2NvZGUgPSAwOwotICAgZmlsZS0+cmVhZF9lcnJubyA9IDA7Ci0gICBmaWxlLT53cml0ZV9lcnJubyA9IDA7Ci0KLSAgIGZpbGUtPmZpbGUgPSBOVUxMOwotICAgZmlsZS0+b3V0ID0gTlVMTDsKLSAgIC8qIGptcGJ1ZiBpcyBnYXJiYWdlOiBtdXN0IGJlIHNldCBieSByZWFkX3BuZyAqLwotCi0gICBmaWxlLT5yZWFkX2NvdW50ID0gMDsKLSAgIGZpbGUtPnN0YXRlID0gU1RBVEVfU0lHTkFUVVJFOwotCi0gICBmaWxlLT5jaHVuayA9IE5VTEw7Ci0gICBmaWxlLT5pZGF0ID0gTlVMTDsKLQotICAgZmlsZS0+YWxsb2NfcHRyID0gYWxsb2NfcHRyOwotICAgZmlsZS0+YWxsb2MgPSBhbGxvYzsKLQotICAgLyogT3BlbiB0aGUgZmlsZXM6ICovCi0gICBhc3NlcnQoZmlsZV9uYW1lICE9IE5VTEwpOwotICAgZmlsZS0+ZmlsZSA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7Ci0KLSAgIGlmIChmaWxlLT5maWxlID09IE5VTEwpCi0gICB7Ci0gICAgICBmaWxlLT5yZWFkX2Vycm5vID0gZXJybm87Ci0gICAgICBmaWxlLT5zdGF0dXNfY29kZSB8PSBGSUxFX0VSUk9SOwotICAgICAgLyogQWx3YXlzIG91dHB1dDogcGxlYXNlIGdpdmUgYSByZWFkYWJsZSBmaWxlISAqLwotICAgICAgcGVycm9yKGZpbGVfbmFtZSk7Ci0gICAgICByZXR1cm4gRklMRV9FUlJPUjsKLSAgIH0KLQotICAgaWYgKG91dF9uYW1lICE9IE5VTEwpCi0gICB7Ci0gICAgICBmaWxlLT5vdXQgPSBmb3BlbihvdXRfbmFtZSwgIndiIik7Ci0KLSAgICAgIGlmIChmaWxlLT5vdXQgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIGZpbGUtPndyaXRlX2Vycm5vID0gZXJybm87Ci0gICAgICAgICBmaWxlLT5zdGF0dXNfY29kZSB8PSBXUklURV9FUlJPUjsKLSAgICAgICAgIHBlcnJvcihvdXRfbmFtZSk7Ci0gICAgICAgICByZXR1cm4gV1JJVEVfRVJST1I7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotbG9nX2Vycm9yKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY29kZSwgY29uc3QgY2hhciAqd2hhdCkKLSAgIC8qIExpa2UgZW1pdF9lcnJvciBidXQgY2hlY2tzIHRoZSBnbG9iYWwgJ2Vycm9ycycgZmxhZyAqLwotewotICAgaWYgKGZpbGUtPmdsb2JhbC0+ZXJyb3JzKQotICAgICAgZW1pdF9lcnJvcihmaWxlLCBjb2RlLCB3aGF0KTsKLX0KLQotc3RhdGljIGNoYXIKLXR5cGVfY2hhcihwbmdfdWludF8zMiB2KQotewotICAgLyogSW4gZmFjdCBiZWNhdXNlIGNodW5rOjpjaHVua190eXBlIGlzIHZhbGlkYXRlZCBwcmlvciB0byBhbnkgY2FsbCB0byB0aGlzCi0gICAgKiBmdW5jdGlvbiBpdCB3aWxsIGFsd2F5cyByZXR1cm4gYS16QS1aLCBidXQgdGhlIGV4dHJhIGNvZGVzIGFyZSBqdXN0IHRoZXJlCi0gICAgKiB0byBoZWxwIGluIGZpbmRpbmcgaW50ZXJuYWwgKHByb2dyYW1taW5nKSBlcnJvcnMuICBOb3RlIHRoYXQgdGhlIGNvZGUgb25seQotICAgICogZXZlciBjb25zaWRlcnMgdGhlIGxvdyA3IGJpdHMgb2YgdGhlIHZhbHVlIChzbyBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUKLSAgICAqIHR5cGVfbmFtZSBmdW5jdGlvbiB0byBtYXNrIG9mIHRoZSBieXRlLikKLSAgICAqLwotICAgaWYgKHYgJiAzMikKLSAgICAgIHJldHVybiAiIWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6NTY3ODkiWyh2LTk2KSYzMV07Ci0KLSAgIGVsc2UKLSAgICAgIHJldHVybiAiQEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQiWyh2LTY0KSYzMV07Ci19Ci0KLXN0YXRpYyB2b2lkCi10eXBlX25hbWUocG5nX3VpbnRfMzIgdHlwZSwgRklMRSAqb3V0KQotewotICAgcHV0Yyh0eXBlX2NoYXIodHlwZSA+PiAyNCksIG91dCk7Ci0gICBwdXRjKHR5cGVfY2hhcih0eXBlID4+IDE2KSwgb3V0KTsKLSAgIHB1dGModHlwZV9jaGFyKHR5cGUgPj4gIDgpLCBvdXQpOwotICAgcHV0Yyh0eXBlX2NoYXIodHlwZSAgICAgICksIG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10eXBlX3NlcChGSUxFICpvdXQpCi17Ci0gICBwdXRjKCc6Jywgb3V0KTsKLSAgIHB1dGMoJyAnLCBvdXQpOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIgY3VycmVudF90eXBlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY29kZSk7Ci0KLVBOR19OT1JFVFVSTiBzdGF0aWMgdm9pZAotc3RvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNvZGUsIGNvbnN0IGNoYXIgKndoYXQpCi0gICAvKiBSZXR1cm4gY29udHJvbCB3aGVuIGEgUE5HIGZpbGUgY2Fubm90IGJlIHJlYWQuIFRoaXMgb3V0cHV0cyBhbiAnRVJSJwotICAgICogc3VtbWFyeSBsaW5lIHRvby4KLSAgICAqLwotewotICAgbG9nX2Vycm9yKGZpbGUsIGNvZGUsIHdoYXQpOwotCi0gICAvKiBUaGUgY2h1bmsgYmVpbmcgcmVhZCBpcyB0eXBpY2FsbHkgaWRlbnRpZmllZCBieSBmaWxlLT5jaHVuayBvciwgaWYgdGhpcyBpcwotICAgICogTlVMTCwgYnkgZmlsZS0+dHlwZS4gIFRoaXMgbWF5IGJlIHdyb25nIGlmIGxpYnBuZyByZWFkcyBhaGVhZCwgYnV0IHRoaXMKLSAgICAqIG9ubHkgaGFwcGVucyB3aXRoIElEQVQgd2hlcmUgbGlicG5nIHJlYWRzIHRoZSBoZWFkZXIgdGhlbiBqdW1wcyBhcm91bmQKLSAgICAqIGZpbmRpbmcgZXJyb3JzIGluIHRoZSBwcmV2aW91cyBjaHVua3MuICBXZSBrbm93IHRoYXQgaXMgaGFwcGVuaW5nIGJlY2F1c2UKLSAgICAqIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIElEQVQgKGkuZS4gbm8gSURBVCBkYXRhIGhhcyB5ZXQgYmVlbiB3cml0dGVuLikKLSAgICAqCi0gICAgKiBTVU1NQVJZIEZPUk1BVCAoc3RvcCk6Ci0gICAgKgotICAgICogSURBVCBFUlIgc3RhdHVzIGNvZGUgcmVhZC1lcnJubyB3cml0ZS1lcnJubyBtZXNzYWdlIGZpbGUKLSAgICAqCi0gICAgKiAndW5jb21wcmVzc2VkJyB3aWxsIGJlIDAgaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUgSUhEUi4gIFRoZSBlcnJubwotICAgICogdmFsdWVzIGFyZSBlbWl0X3N0cmluZyhzdHJlcnJvcihlcnJubykpLgotICAgICovCi0gICBpZiAoZmlsZS0+Z2xvYmFsLT5xdWlldCA8IDIpIC8qIG5lZWQgdHdvIHF1aWV0cyB0byBzdG9wIHRoaXMuICovCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiB0eXBlOwotCi0gICAgICBpZiAoZmlsZS0+Y2h1bmsgIT0gTlVMTCkKLSAgICAgICAgIHR5cGUgPSBjdXJyZW50X3R5cGUoZmlsZSwgY29kZSk7IC8qIEdyb3BlcyBpbiBzdHJ1Y3QgY2h1bmsgYW5kIElEQVQgKi8KLQotICAgICAgZWxzZQotICAgICAgICAgdHlwZSA9IGZpbGUtPnR5cGU7Ci0KLSAgICAgIGlmICh0eXBlKQotICAgICAgICAgdHlwZV9uYW1lKHR5cGUsIHN0ZG91dCk7Ci0KLSAgICAgIGVsc2UgLyogbWFnaWM6IGFuIElEQVQgaGVhZGVyLCBwcm9kdWNlcyBib2dvbnMgZm9yIHRvbyBtYW55IElEQVRzICovCi0gICAgICAgICBmcHV0cygiSEVBRCIsIHN0ZG91dCk7IC8qIG5vdCBhIHJlZ2lzdGVyZWQgY2h1bmshICovCi0KLSAgICAgIHByaW50ZigiIEVSUiAlLjJ4ICVzICIsIGZpbGUtPnN0YXR1c19jb2RlLCBzdHJjb2RlKGNvZGUpKTsKLSAgICAgIC8qIFRoaXMgb25seSB3b3JrcyBvbmUgc3RyZXJyb3IgYXQgYSB0aW1lLCBiZWNhdXNlIG9mIHRoZSB3YXkgc3RyZXJyb3IgaXMKLSAgICAgICAqIGltcGxlbWVudGVkLgotICAgICAgICovCi0gICAgICBlbWl0X3N0cmluZyhzdHJlcnJvcihmaWxlLT5yZWFkX2Vycm5vKSwgc3Rkb3V0KTsKLSAgICAgIHB1dGMoJyAnLCBzdGRvdXQpOwotICAgICAgZW1pdF9zdHJpbmcoc3RyZXJyb3IoZmlsZS0+d3JpdGVfZXJybm8pLCBzdGRvdXQpOwotICAgICAgcHV0YygnICcsIHN0ZG91dCk7Ci0gICAgICBlbWl0X3N0cmluZyh3aGF0LCBzdGRvdXQpOwotICAgICAgcHV0YygnICcsIHN0ZG91dCk7Ci0gICAgICBmcHV0cyhmaWxlLT5maWxlX25hbWUsIHN0ZG91dCk7Ci0gICAgICBwdXRjKCdcbicsIHN0ZG91dCk7Ci0gICB9Ci0KLSAgIGZpbGUtPnN0YXR1c19jb2RlIHw9IEZJTEVfRVJST1I7Ci0gICBsb25nam1wKGZpbGUtPmptcGJ1ZiwgY29kZSk7Ci19Ci0KLVBOR19OT1JFVFVSTiBzdGF0aWMgdm9pZAotc3RvcF9pbnZhbGlkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICp3aGF0KQotewotICAgc3RvcChmaWxlLCBJTlZBTElEX0VSUk9SX0NPREUsIHdoYXQpOwotfQotCi1zdGF0aWMgdm9pZAotdHlwZV9tZXNzYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBwbmdfdWludF8zMiB0eXBlLCBjb25zdCBjaGFyICp3aGF0KQotICAgLyogRXJyb3IgbWVzc2FnZSBmb3IgYSBjaHVuazsgdGhlIGNodW5rIG5hbWUgY29tZXMgZnJvbSAndHlwZScgKi8KLXsKLSAgIGlmIChmaWxlLT5nbG9iYWwtPmVycm9ycykKLSAgIHsKLSAgICAgIGZwdXRzKGZpbGUtPmZpbGVfbmFtZSwgc3RkZXJyKTsKLSAgICAgIHR5cGVfc2VwKHN0ZGVycik7Ci0gICAgICB0eXBlX25hbWUodHlwZSwgc3RkZXJyKTsKLSAgICAgIHR5cGVfc2VwKHN0ZGVycik7Ci0gICAgICBmcHV0cyh3aGF0LCBzdGRlcnIpOwotICAgICAgcHV0YygnXG4nLCBzdGRlcnIpOwotICAgfQotfQotCi0vKiBJbnB1dCBmaWxlIHBvc2l0aW9uaW5nIC0gd2UganVtcCBhcm91bmQgaW4gdGhlIGlucHV0IGZpbGUgd2hpbGUgcmVhZGluZwotICogc3R1ZmYsIHRoZXNlIHdyYXBwZXJzIGRlYWwgd2l0aCB0aGUgZXJyb3IgaGFuZGxpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1maWxlX2dldHBvcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgZnBvc190ICpwb3MpCi17Ci0gICBpZiAoZmdldHBvcyhmaWxlLT5maWxlLCBwb3MpKQotICAgewotICAgICAgLyogVGhpcyBpcyB1bmV4cGVjdGVkLCBzbyBwZXJyb3IgaXQgKi8KLSAgICAgIHBlcnJvcihmaWxlLT5maWxlX25hbWUpOwotICAgICAgc3RvcChmaWxlLCBSRUFEX0VSUk9SX0NPREUsICJmZ2V0cG9zIik7Ci0gICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1maWxlX3NldHBvcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgZnBvc190ICpwb3MpCi17Ci0gICBpZiAoZnNldHBvcyhmaWxlLT5maWxlLCBwb3MpKQotICAgewotICAgICAgcGVycm9yKGZpbGUtPmZpbGVfbmFtZSk7Ci0gICAgICBzdG9wKGZpbGUsIFJFQURfRVJST1JfQ09ERSwgImZzZXRwb3MiKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWdldHBvcyhzdHJ1Y3QgZmlsZSAqZmlsZSkKLSAgIC8qIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgc3RvcmUgaXQgaW4gJ2RhdGFfcG9zJy4gIFRoZSBjb3JyZXNwb25kaW5nCi0gICAgKiBzZXRwb3MoKSBmdW5jdGlvbiBpcyBjaHVuayBzcGVjaWZpYyBiZWNhdXNlIGl0IHVzZXMgdGhlIGNvcHkgb2YgdGhlCi0gICAgKiBwb3NpdGlvbiBmb3IgdGhlIHNwZWNpZmljIGNodW5rLgotICAgICovCi17Ci0gICBmaWxlX2dldHBvcyhmaWxlLCAmZmlsZS0+ZGF0YV9wb3MpOwotfQotCi0KLS8qIFJlYWQgdXRpbGl0eSAtIHJlYWQgYSBzaW5nbGUgYnl0ZSwgcmV0dXJucyBhIHZhbHVlIGluIHRoZSByYW5nZSAwLi4yNTUgb3IgRU9GCi0gKiBvbiBhIHJlYWQgZXJyb3IuICBJbiB0aGUgbGF0dGVyIGNhc2Ugc3RhdHVzX2NvZGUgYW5kIHJlYWRfZXJybm8gYXJlIHVwZGF0ZWQKLSAqIGFwcHJvcHJpYXRlbHkuCi0gKi8KLXN0YXRpYyBpbnQKLXJlYWRfYnl0ZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgIGludCBjaCA9IGdldGMoZmlsZS0+ZmlsZSk7Ci0KLSAgIGlmIChjaCA+PSAwICYmIGNoIDw9IDI1NSkKLSAgIHsKLSAgICAgICsrKGZpbGUtPnJlYWRfY291bnQpOwotICAgICAgcmV0dXJuIGNoOwotICAgfQotCi0gICBlbHNlIGlmIChjaCAhPSBFT0YpCi0gICB7Ci0gICAgICBmaWxlLT5zdGF0dXNfY29kZSB8PSBJTlRFUk5BTF9FUlJPUjsKLSAgICAgIGZpbGUtPnJlYWRfZXJybm8gPSBFUkFOR0U7IC8qIG91dCBvZiByYW5nZSBjaGFyYWN0ZXIgKi8KLQotICAgICAgLyogVGhpcyBpcyB2ZXJ5IHVuZXhwZWN0ZWQ7IGFuIGVycm9yIG1lc3NhZ2UgaXMgYWx3YXlzIG91dHB1dDogKi8KLSAgICAgIGVtaXRfZXJyb3IoZmlsZSwgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFLCAiZmlsZSByZWFkIik7Ci0gICB9Ci0KLSMgIGlmZGVmIEVJTlRSCi0gICAgICBlbHNlIGlmIChlcnJubyA9PSBFSU5UUikgLyogSW50ZXJydXB0ZWQsIHRyeSBhZ2FpbiAqLwotICAgICAgewotICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgcmV0dXJuIHJlYWRfYnl0ZShmaWxlKTsKLSAgICAgIH0KLSMgIGVuZGlmCi0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIC8qIEFuIGVycm9yLCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCB0aGUgZXJyb3IgaXMgYnV0IGl0IGdldHMKLSAgICAgICAqIHJlY29yZGVkIGFueXdheS4KLSAgICAgICAqLwotICAgICAgaWYgKGZlcnJvcihmaWxlLT5maWxlKSkKLSAgICAgICAgIGZpbGUtPnJlYWRfZXJybm8gPSBlcnJubzsKLQotICAgICAgZWxzZSBpZiAoZmVvZihmaWxlLT5maWxlKSkKLSAgICAgICAgIGZpbGUtPnJlYWRfZXJybm8gPSAwOyAvKiBJLmUuIGEgcmVndWxhciBFT0YsIG5vIGVycm9yICovCi0KLSAgICAgIGVsc2UgLyogdW5leHBlY3RlZCAqLwotICAgICAgICAgZmlsZS0+cmVhZF9lcnJubyA9IEVET007Ci0gICB9Ci0KLSAgIC8qICdUUlVOQ0FURUQnIGlzIHVzZWQgZm9yIGFsbCBjYXNlcyBvZiBmYWlsdXJlIHRvIHJlYWQgYSBieXRlLCBiZWNhdXNlIG9mCi0gICAgKiB0aGUgd2F5IGxpYnBuZyB3b3JrcyBhIGJ5dGUgcmVhZCBpcyBuZXZlciBhdHRlbXB0ZWQgdW5sZXNzIHRoZSBieXRlIGlzCi0gICAgKiBleHBlY3RlZCB0byBiZSB0aGVyZSwgc28gRU9GIHNob3VsZCBub3Qgb2NjdXIuCi0gICAgKi8KLSAgIGZpbGUtPnN0YXR1c19jb2RlIHw9IFRSVU5DQVRFRDsKLSAgIHJldHVybiBFT0Y7Ci19Ci0KLXN0YXRpYyBwbmdfYnl0ZQotcmVyZWFkX2J5dGUoc3RydWN0IGZpbGUgKmZpbGUpCi0gICAvKiBSZWFkIGEgYnl0ZSB3aGVuIGFuIGVycm9yIGlzIG5vdCBleHBlY3RlZCB0byBoYXBwZW4gYmVjYXVzZSB0aGUgYnl0ZSBoYXMKLSAgICAqIGJlZW4gcmVhZCBiZWZvcmUgd2l0aG91dCBlcnJvci4KLSAgICAqLwotewotICAgaW50IGNoID0gZ2V0YyhmaWxlLT5maWxlKTsKLQotICAgaWYgKGVycm5vICE9IDApCi0gICAgICBmaWxlLT5yZWFkX2Vycm5vID0gZXJybm87Ci0KLSAgIGlmIChjaCA8IDAgfHwgY2ggPiAyNTUpCi0gICAgICBzdG9wKGZpbGUsIFVORVhQRUNURURfRVJST1JfQ09ERSwgInJlcmVhZCIpOwotCi0gICByZXR1cm4gKHBuZ19ieXRlKWNoOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIKLXJlcmVhZF80KHN0cnVjdCBmaWxlICpmaWxlKQotICAgLyogVGhlIHNhbWUgYnV0IGZvciBhIGZvdXIgYnl0ZSBxdWFudGl0eSAqLwotewotICAgcG5nX3VpbnRfMzIgcmVzdWx0ID0gMDsKLSAgIGludCBpID0gMDsKLQotICAgd2hpbGUgKCsraSA8PSA0KQotICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIHJlcmVhZF9ieXRlKGZpbGUpOwotCi0gICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotc2tpcF8xMihzdHJ1Y3QgZmlsZSAqZmlsZSkKLSAgIC8qIFNraXAgZXhhY3RseSAxMiBieXRlcyBpbiB0aGUgaW5wdXQgc3RyZWFtIC0gdXNlZCB0byBza2lwIGEgQ1JDIGFuZCBjaHVuawotICAgICogaGVhZGVyIHRoYXQgaGFzIGJlZW4gcmVhZCBiZWZvcmUuCi0gICAgKi8KLXsKLSAgIC8qIFNpbmNlIHRoZSBjaHVua3Mgd2VyZSByZWFkIGJlZm9yZSB0aGlzIHNob3VsZG4ndCBmYWlsOiAqLwotICAgaWYgKGZzZWVrKGZpbGUtPmZpbGUsIDEyLCBTRUVLX0NVUikgIT0gMCkKLSAgIHsKLSAgICAgIGlmIChlcnJubyAhPSAwKQotICAgICAgICAgZmlsZS0+cmVhZF9lcnJubyA9IGVycm5vOwotCi0gICAgICBzdG9wKGZpbGUsIFVORVhQRUNURURfRVJST1JfQ09ERSwgInJlc2tpcCIpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfYnl0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGIpCi0gICAvKiBXcml0ZSBvbmUgYnl0ZSB0byB0aGUgb3V0cHV0IC0gdGhpcyBjYXVzZXMgYSBmYXRhbCBlcnJvciBpZiB0aGUgd3JpdGUKLSAgICAqIGZhaWxzIGFuZCB0aGUgcmVhZCBvZiB0aGlzIFBORyBmaWxlIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZXMuICBKdXN0Ci0gICAgKiBpbmNyZW1lbnRzIHRoZSB3cml0ZSBjb3VudCBpZiB0aGVyZSBpcyBubyBvdXRwdXQgZmlsZS4KLSAgICAqLwotewotICAgaWYgKGZpbGUtPm91dCAhPSBOVUxMKQotICAgewotICAgICAgaWYgKHB1dGMoYiwgZmlsZS0+b3V0KSAhPSBiKQotICAgICAgewotICAgICAgICAgZmlsZS0+d3JpdGVfZXJybm8gPSBlcnJubzsKLSAgICAgICAgIGZpbGUtPnN0YXR1c19jb2RlIHw9IFdSSVRFX0VSUk9SOwotICAgICAgICAgc3RvcChmaWxlLCBXUklURV9FUlJPUl9DT0RFLCAid3JpdGUgYnl0ZSIpOwotICAgICAgfQotICAgfQotCi0gICArKyhmaWxlLT53cml0ZV9jb3VudCk7Ci19Ci0KLS8qIERlcml2YXRpdmVzIG9mIHRoZSByZWFkL3dyaXRlIGZ1bmN0aW9ucy4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfNChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG5nX3VpbnRfMzIgKnB1KQotICAgLyogUmVhZCBmb3VyIGJ5dGVzLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBzdWNjZXNzZnVsbHkgYW5kLCBpZiBhbGwKLSAgICAqIGZvdXIgYnl0ZXMgYXJlIHJlYWQsIGFzc2lnbnMgdGhlIHJlc3VsdCB0byAqcHUuCi0gICAgKi8KLXsKLSAgIHVuc2lnbmVkIGludCBpID0gMDsKLSAgIHBuZ191aW50XzMyIHZhbCA9IDA7Ci0KLSAgIGRvCi0gICB7Ci0gICAgICBpbnQgY2ggPSByZWFkX2J5dGUoZmlsZSk7Ci0KLSAgICAgIGlmIChjaCA9PSBFT0YpCi0gICAgICAgICByZXR1cm4gaTsKLQotICAgICAgdmFsID0gKHZhbCA8PCA4KSArIGNoOwotICAgfSB3aGlsZSAoKytpIDwgNCk7Ci0KLSAgICpwdSA9IHZhbDsKLSAgIHJldHVybiBpOwotfQotCi0vKiBDUkMgaGFuZGxpbmcgLSByZWFkIGJ1dCBjYWxjdWxhdGUgdGhlIENSQyB3aGlsZSBkb2luZyBzby4gKi8KLXN0YXRpYyBpbnQKLWNyY19yZWFkX21hbnkoc3RydWN0IGZpbGUgKmZpbGUsIHBuZ191aW50XzMyIGxlbmd0aCkKLSAgIC8qIFJlYWRzICdsZW5ndGgnIGJ5dGVzIGFuZCB1cGRhdGVzIHRoZSBDUkMsIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZQotICAgICogaWYgdGhlIGlucHV0IGlzIHRydW5jYXRlZC4KLSAgICAqLwotewotICAgaWYgKGxlbmd0aCA+IDApCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBjcmMgPSBmaWxlLT5jcmM7Ci0KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICBpbnQgY2ggPSByZWFkX2J5dGUoZmlsZSk7Ci0KLSAgICAgICAgIGlmIChjaCA9PSBFT0YpCi0gICAgICAgICAgICByZXR1cm4gMDsgLyogVHJ1bmNhdGVkICovCi0KLSAgICAgICAgIGNyYyA9IGNyY19vbmVfYnl0ZShjcmMsIGNoKTsKLSAgICAgIH0KLSAgICAgIHdoaWxlICgtLWxlbmd0aCA+IDApOwotCi0gICAgICBmaWxlLT5jcmMgPSBjcmM7Ci0gICB9Ci0KLSAgIHJldHVybiAxOyAvKiBPSyAqLwotfQotCi1zdGF0aWMgaW50Ci1jYWxjX2ltYWdlX3NpemUoc3RydWN0IGZpbGUgKmZpbGUpCi0gICAvKiBGaWxsIGluIHRoZSBpbWFnZV9ieXRlcyBmaWVsZCBnaXZlbiB0aGUgSUhEUiBpbmZvcm1hdGlvbiwgY2FsbHMgc3RvcCBvbgotICAgICogZXJyb3IuCi0gICAgKi8KLXsKLSAgIHBuZ191aW50XzE2IHBkID0gZmlsZS0+Yml0X2RlcHRoOwotCi0gICBzd2l0Y2ggKGZpbGUtPmNvbG9yX3R5cGUpCi0gICB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgc3RvcF9pbnZhbGlkKGZpbGUsICJJSERSOiBjb2xvdXIgdHlwZSIpOwotCi0gICAgICBpbnZhbGlkX2JpdF9kZXB0aDoKLSAgICAgICAgIHN0b3BfaW52YWxpZChmaWxlLCAiSUhEUjogYml0IGRlcHRoIik7Ci0KLSAgICAgIGNhc2UgMDogLyogZyAqLwotICAgICAgICAgaWYgKHBkICE9IDEgJiYgcGQgIT0gMiAmJiBwZCAhPSA0ICYmIHBkICE9IDggJiYgcGQgIT0gMTYpCi0gICAgICAgICAgICBnb3RvIGludmFsaWRfYml0X2RlcHRoOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMzoKLSAgICAgICAgIGlmIChwZCAhPSAxICYmIHBkICE9IDIgJiYgcGQgIT0gNCAmJiBwZCAhPSA4KQotICAgICAgICAgICAgZ290byBpbnZhbGlkX2JpdF9kZXB0aDsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6IC8qIHJnYiAqLwotICAgICAgICAgaWYgKHBkICE9IDggJiYgcGQgIT0gMTYpCi0gICAgICAgICAgICBnb3RvIGludmFsaWRfYml0X2RlcHRoOwotCi0gICAgICAgICBwZCA9IChwbmdfdWludF8xNikocGQgKiAzKTsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDQ6IC8qIGdhICovCi0gICAgICAgICBpZiAocGQgIT0gOCAmJiBwZCAhPSAxNikKLSAgICAgICAgICAgIGdvdG8gaW52YWxpZF9iaXRfZGVwdGg7Ci0KLSAgICAgICAgIHBkID0gKHBuZ191aW50XzE2KShwZCAqIDIpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgNjogLyogcmdiYSAqLwotICAgICAgICAgaWYgKHBkICE9IDggJiYgcGQgIT0gMTYpCi0gICAgICAgICAgICBnb3RvIGludmFsaWRfYml0X2RlcHRoOwotCi0gICAgICAgICBwZCA9IChwbmdfdWludF8xNikocGQgKiA0KTsKLSAgICAgICAgIGJyZWFrOwotICAgfQotCi0gICBpZiAoZmlsZS0+d2lkdGggPCAxIHx8IGZpbGUtPndpZHRoID4gMHg3ZmZmZmZmZikKLSAgICAgIHN0b3BfaW52YWxpZChmaWxlLCAiSUhEUjogd2lkdGgiKTsKLQotICAgZWxzZSBpZiAoZmlsZS0+aGVpZ2h0IDwgMSB8fCBmaWxlLT5oZWlnaHQgPiAweDdmZmZmZmZmKQotICAgICAgc3RvcF9pbnZhbGlkKGZpbGUsICJJSERSOiBoZWlnaHQiKTsKLQotICAgZWxzZSBpZiAoZmlsZS0+Y29tcHJlc3Npb25fbWV0aG9kICE9IDApCi0gICAgICBzdG9wX2ludmFsaWQoZmlsZSwgIklIRFI6IGNvbXByZXNzaW9uIG1ldGhvZCIpOwotCi0gICBlbHNlIGlmIChmaWxlLT5maWx0ZXJfbWV0aG9kICE9IDApCi0gICAgICBzdG9wX2ludmFsaWQoZmlsZSwgIklIRFI6IGZpbHRlciBtZXRob2QiKTsKLQotICAgZWxzZSBzd2l0Y2ggKGZpbGUtPmludGVybGFjZV9tZXRob2QpCi0gICB7Ci0gICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfQURBTTc6Ci0gICAgICAgICAvKiBJbnRlcmxhY2luZyBtYWtlcyB0aGUgaW1hZ2UgbGFyZ2VyIGJlY2F1c2Ugb2YgdGhlIHJlcGxpY2F0aW9uIG9mCi0gICAgICAgICAgKiBib3RoIHRoZSBmaWx0ZXIgYnl0ZSBhbmQgdGhlIHBhZGRpbmcgdG8gYSBieXRlIGJvdW5kYXJ5LgotICAgICAgICAgICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcGFzczsKLSAgICAgICAgICAgIGludCBpbWFnZV9kaWdpdHMgPSAwOwotICAgICAgICAgICAgdWRpZ2l0IHJvd193aWR0aFsyXSwgcm93X2J5dGVzWzNdOwotCi0gICAgICAgICAgICBmb3IgKHBhc3M9MDsgcGFzczw9NjsgKytwYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcHcgPSBQTkdfUEFTU19DT0xTKGZpbGUtPndpZHRoLCBwYXNzKTsKLQotICAgICAgICAgICAgICAgaWYgKHB3ID4gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCAgZGlnaXRzOwotCi0gICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgMSsoKHB3KnBkKzcpPj4zKSBpbiByb3dfYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHVhcmJfbXVsdF9kaWdpdChyb3dfYnl0ZXMsIHVhcmJfc2V0KHJvd19ieXRlcywgNyksCi0gICAgICAgICAgICAgICAgICAgICByb3dfd2lkdGgsIHVhcmJfc2V0KHJvd193aWR0aCwgcHcpLCBwZCk7Ci0gICAgICAgICAgICAgICAgICBkaWdpdHMgPSB1YXJiX3NoaWZ0KHJvd19ieXRlcywgZGlnaXRzLCAzKTsKLSAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHVhcmJfaW5jKHJvd19ieXRlcywgZGlnaXRzLCAxKTsKLQotICAgICAgICAgICAgICAgICAgLyogQWRkIHJvd19ieXRlcyAqIHBhc3MtaGVpZ2h0IHRvIHRoZSBmaWxlIGltYWdlX2J5dGVzIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIGltYWdlX2RpZ2l0cyA9IHVhcmJfbXVsdDMyKGZpbGUtPmltYWdlX2J5dGVzLCBpbWFnZV9kaWdpdHMsCi0gICAgICAgICAgICAgICAgICAgICByb3dfYnl0ZXMsIGRpZ2l0cywKLSAgICAgICAgICAgICAgICAgICAgIFBOR19QQVNTX1JPV1MoZmlsZS0+aGVpZ2h0LCBwYXNzKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbGUtPmltYWdlX2RpZ2l0cyA9IGltYWdlX2RpZ2l0czsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBOR19JTlRFUkxBQ0VfTk9ORToKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCAgZGlnaXRzOwotICAgICAgICAgICAgdWRpZ2l0IHJvd193aWR0aFsyXSwgcm93X2J5dGVzWzNdOwotCi0gICAgICAgICAgICAvKiBBcyBhYm92ZSwgYnV0IHVzZSBpbWFnZV93aWR0aCBpbiBwbGFjZSBvZiB0aGUgcGFzcyB3aWR0aDogKi8KLSAgICAgICAgICAgIGRpZ2l0cyA9IHVhcmJfbXVsdF9kaWdpdChyb3dfYnl0ZXMsIHVhcmJfc2V0KHJvd19ieXRlcywgNyksCi0gICAgICAgICAgICAgICByb3dfd2lkdGgsIHVhcmJfc2V0KHJvd193aWR0aCwgZmlsZS0+d2lkdGgpLCBwZCk7Ci0gICAgICAgICAgICBkaWdpdHMgPSB1YXJiX3NoaWZ0KHJvd19ieXRlcywgZGlnaXRzLCAzKTsKLSAgICAgICAgICAgIGRpZ2l0cyA9IHVhcmJfaW5jKHJvd19ieXRlcywgZGlnaXRzLCAxKTsKLQotICAgICAgICAgICAgLyogU2V0IHJvd19ieXRlcyAqIGltYWdlLWhlaWdodCB0byB0aGUgZmlsZSBpbWFnZV9ieXRlcyBmaWVsZCAqLwotICAgICAgICAgICAgZmlsZS0+aW1hZ2VfZGlnaXRzID0gdWFyYl9tdWx0MzIoZmlsZS0+aW1hZ2VfYnl0ZXMsIDAsCi0gICAgICAgICAgICAgICByb3dfYnl0ZXMsIGRpZ2l0cywgZmlsZS0+aGVpZ2h0KTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgc3RvcF9pbnZhbGlkKGZpbGUsICJJSERSOiBpbnRlcmxhY2UgbWV0aG9kIik7Ci0gICB9Ci0KLSAgIGFzc2VydChmaWxlLT5pbWFnZV9kaWdpdHMgPj0gMSAmJiBmaWxlLT5pbWFnZV9kaWdpdHMgPD0gNSk7Ci0gICByZXR1cm4gMTsKLX0KLQotLyogUEVSLUNIVU5LIENPTlRST0wgU1RSVUNUVVJFCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBpbnN0YW50aWF0ZWQgZm9yIGVhY2ggY2h1bmssIGV4Y2VwdCBmb3IgdGhlIElEQVQgY2h1bmtzCi0gKiB3aGVyZSBvbmUgY2h1bmsgY29udHJvbCBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIHdob2xlIG9mIGEgc2luZ2xlIHN0cmVhbSBvZgotICogSURBVCBjaHVua3MgKHNlZSB0aGUgSURBVCBjb250cm9sIHN0cnVjdHVyZSBiZWxvdykuCi0gKi8KLXN0cnVjdCBjaHVuawotewotICAgLyogQU5DRVNUT1JTICovCi0gICBzdHJ1Y3QgZmlsZSAqICAgICAgICAgZmlsZTsKLSAgIHN0cnVjdCBnbG9iYWwgKiAgICAgICBnbG9iYWw7Ci0KLSAgIC8qIFBVQkxJQyBJREFUIElORk9STUFUSU9OOiBTRVQgQlkgVEhFIFpMSUIgQ09ERSAqLwotICAgdWRpZ2l0ICAgICAgICAgdW5jb21wcmVzc2VkX2J5dGVzWzVdOwotICAgaW50ICAgICAgICAgICAgdW5jb21wcmVzc2VkX2RpZ2l0czsKLSAgIHVkaWdpdCAgICAgICAgIGNvbXByZXNzZWRfYnl0ZXNbNV07Ci0gICBpbnQgICAgICAgICAgICBjb21wcmVzc2VkX2RpZ2l0czsKLQotICAgLyogUFVCTElDIFBFUi1DSFVOSyBJTkZPUk1BVElPTjogVVNFRCBCWSBDSFVOSyBSRUFEIENPREUgKi8KLSAgIC8qIFRoaXMgaW5mb3JtYXRpb24gaXMgZmlsbGVkIGluIGJ5IGNodW5rX2luaXQgZnJvbSB0aGUgZGF0YSBpbiB0aGUgZmlsZQotICAgICogY29udHJvbCBzdHJ1Y3R1cmUsIGJ1dCBjaHVua19sZW5ndGggbWF5IGJlIGNoYW5nZWQgbGF0ZXIuCi0gICAgKi8KLSAgIGZwb3NfdCAgICAgICAgIGNodW5rX2RhdGFfcG9zOyAgICAvKiBQb3NpdGlvbiBvZiBmaXJzdCBieXRlIG9mIGNodW5rIGRhdGEgKi8KLSAgIHBuZ191aW50XzMyICAgIGNodW5rX2xlbmd0aDsgICAgICAvKiBGcm9tIGhlYWRlciAob3IgbW9kaWZpZWQgYmVsb3cpICovCi0gICBwbmdfdWludF8zMiAgICBjaHVua190eXBlOyAgICAgICAgLyogRnJvbSBoZWFkZXIgKi8KLQotICAgLyogUFVCTElDIFBFUi1DSFVOSyBJTkZPUk1BVElPTjogRk9SIFRIRSBDSFVOSyBXUklURSBDT0RFICovCi0gICBwbmdfdWludF8zMiAgICB3cml0ZV9jcmM7ICAgICAgICAgLyogT3V0cHV0IENSQyAobWF5IGRpZmZlciBmcm9tIHJlYWRfY3JjKSAqLwotICAgcG5nX3VpbnRfMzIgICAgcmV3cml0ZV9vZmZzZXQ7ICAgIC8qIENvdW50IG9mIGJ5dGVzIGJlZm9yZSByZXdyaXRlLiAqLwotICAgaW50ICAgICAgICAgICAgcmV3cml0ZV9sZW5ndGg7ICAgIC8qIE51bWJlciBvZiBieXRlcyBsZWZ0IHRvIGNoYW5nZSAqLwotICAgcG5nX2J5dGUgICAgICAgcmV3cml0ZV9idWZmZXJbMl07IC8qIEJ1ZmZlciBvZiBuZXcgYnl0ZSB2YWx1ZXMgKi8KLX07Ci0KLXN0YXRpYyB2b2lkCi1jaHVua19tZXNzYWdlKHN0cnVjdCBjaHVuayAqY2h1bmssIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCi17Ci0gICB0eXBlX21lc3NhZ2UoY2h1bmstPmZpbGUsIGNodW5rLT5jaHVua190eXBlLCBtZXNzYWdlKTsKLX0KLQotc3RhdGljIHZvaWQKLWNodW5rX2VuZChzdHJ1Y3QgY2h1bmsgKipjaHVua192YXIpCi17Ci0gICBzdHJ1Y3QgY2h1bmsgKmNodW5rID0gKmNodW5rX3ZhcjsKLQotICAgKmNodW5rX3ZhciA9IE5VTEw7Ci0gICBDTEVBUigqY2h1bmspOwotfQotCi1zdGF0aWMgdm9pZAotY2h1bmtfaW5pdChzdHJ1Y3QgY2h1bmsgKiBjb25zdCBjaHVuaywgc3RydWN0IGZpbGUgKiBjb25zdCBmaWxlKQotICAgLyogV2hlbiBhIGNodW5rIGlzIGluaXRpYWxpemVkIHRoZSBmaWxlIGxlbmd0aC90eXBlL3BvcyBhcmUgY29waWVkIGludG8gdGhlCi0gICAgKiBjb3JyZXNwb25kaW5nIGNodW5rIGZpZWxkcyBhbmQgdGhlIG5ldyBjaHVuayBpcyByZWdpc3RlcmVkIGluIHRoZSBmaWxlCi0gICAgKiBzdHJ1Y3R1cmUuICBUaGVyZSBjYW4gb25seSBiZSBvbmUgY2h1bmsgYXQgYSB0aW1lLgotICAgICoKLSAgICAqIE5PVEU6IHRoaXMgcm91dGluZSBtdXN0IG9uZWx5IGJlIGNhbGxlZCBmcm9tIHRoZSBmaWxlIGFsbG9jIHJvdXRpbmUhCi0gICAgKi8KLXsKLSAgIGFzc2VydChmaWxlLT5jaHVuayA9PSBOVUxMKTsKLQotICAgQ0xFQVIoKmNodW5rKTsKLQotICAgY2h1bmstPmZpbGUgPSBmaWxlOwotICAgY2h1bmstPmdsb2JhbCA9IGZpbGUtPmdsb2JhbDsKLQotICAgY2h1bmstPmNodW5rX2RhdGFfcG9zID0gZmlsZS0+ZGF0YV9wb3M7Ci0gICBjaHVuay0+Y2h1bmtfbGVuZ3RoID0gZmlsZS0+bGVuZ3RoOwotICAgY2h1bmstPmNodW5rX3R5cGUgPSBmaWxlLT50eXBlOwotCi0gICAvKiBDb21wcmVzc3NlZC91bmNvbXByZXNzZWQgc2l6ZSBpbmZvcm1hdGlvbiAoZnJvbSB0aGUgemxpYiBjb250cm9sIHN0cnVjdHVyZQotICAgICogdGhhdCBpcyB1c2VkIHRvIGNoZWNrIHRoZSBjb21wcmVzc2VkIGRhdGEgaW4gYSBjaHVuay4pCi0gICAgKi8KLSAgIGNodW5rLT51bmNvbXByZXNzZWRfZGlnaXRzID0gMDsKLSAgIGNodW5rLT5jb21wcmVzc2VkX2RpZ2l0cyA9IDA7Ci0KLSAgIGZpbGUtPmNodW5rID0gY2h1bms7Ci19Ci0KLXN0YXRpYyBwbmdfdWludF8zMgotY3VycmVudF90eXBlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY29kZSkKLSAgIC8qIEd1ZXNzIHRoZSBhY3R1YWwgY2h1bmsgdHlwZSB0aGF0IGNhdXNlcyBhIHN0b3AoKSAqLwotewotICAgLyogVGhpcyBtYXkgcmV0dXJuIHBuZ19JREFUIGZvciBlcnJvcnMgZGV0ZWN0ZWQgKGxhdGUpIGluIHRoZSBoZWFkZXI7IHRoYXQKLSAgICAqIGluY2x1ZGVzIGFueSBpbnRlci1jaHVuayBjb25zaXN0ZW5jeSBjaGVjayB0aGF0IGxpYnBuZyBwZXJmb3Jtcy4gIEFzc3VtZQotICAgICogdGhhdCBpZiB0aGUgY2h1bmtfdHlwZSBpcyBwbmdfSURBVCBhbmQgdGhlIGZpbGUgd3JpdGUgY291bnQgaXMgOCB0aGlzIGlzCi0gICAgKiB3aGF0IGlzIGhhcHBlbmluZy4KLSAgICAqLwotICAgaWYgKGZpbGUtPmNodW5rICE9IE5VTEwpCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiB0eXBlID0gZmlsZS0+Y2h1bmstPmNodW5rX3R5cGU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcgZm9yIHRoZSBleGNlc3MgSURBVHMgY2FzZSwgYmVjYXVzZSB0aGVuIGxpYnBuZwotICAgICAgICogd2hpbmVzIGFib3V0IHRvbyBtYW55IG9mIHRoZW0gKGFwcGFyZW50bHkgaW4gc29tZSBjYXNlcyBlcnJvbmVvdXNseSkKLSAgICAgICAqIHdoZW4gdGhlIGhlYWRlciBpcyByZWFkLgotICAgICAgICovCi0gICAgICBpZiAoY29kZSA8PSBMSUJQTkdfRVJST1JfQ09ERSAmJiB0eXBlID09IHBuZ19JREFUICYmCi0gICAgICAgICBmaWxlLT53cml0ZV9jb3VudCA9PSA4KQotICAgICAgICAgdHlwZSA9IDA7IC8qIG1hZ2ljICovCi0KLSAgICAgIHJldHVybiB0eXBlOwotICAgfQotCi0gICBlbHNlCi0gICAgICByZXR1cm4gZmlsZS0+dHlwZTsKLX0KLQotc3RhdGljIHZvaWQKLXNldHBvcyhzdHJ1Y3QgY2h1bmsgKmNodW5rKQotICAgLyogUmVzZXQgdGhlIHBvc2l0aW9uIHRvICdjaHVua19kYXRhX3BvcycgLSB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgZm9yIHRoaXMKLSAgICAqIGNodW5rLiAgQXMgYSBzaWRlIGVmZmVjdCB0aGUgcmVhZF9jb3VudCBpbiB0aGUgZmlsZSBpcyByZXNldCB0byA4LCBqdXN0Ci0gICAgKiBhZnRlciB0aGUgbGVuZ3RoL3R5cGUgaGVhZGVyLgotICAgICovCi17Ci0gICBjaHVuay0+ZmlsZS0+cmVhZF9jb3VudCA9IDg7Ci0gICBmaWxlX3NldHBvcyhjaHVuay0+ZmlsZSwgJmNodW5rLT5jaHVua19kYXRhX3Bvcyk7Ci19Ci0KLS8qIFNwZWNpZmljIGNodW5rIGhhbmRsaW5nIC0gY2FsbGVkIGZvciBlYWNoIGNodW5rIGhlYWRlciwgYWxsIHNwZWNpYWwgY2h1bmsKLSAqIHByb2Nlc3NpbmcgaXMgaW5pdGlhdGVkIGluIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotLyogVGhlIG5leHQgZnVuY3Rpb25zIGhhbmRsZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIHRob3NlIGNodW5rcyB3aXRoIExaIGRhdGEsCi0gKiB0aGUgZGF0YSBpcyBpZGVudGlmaWVkIGFuZCBjaGVja2VkIGZvciB2YWxpZGl0eS4gIElmIHRoZXJlIGFyZSBwcm9ibGVtcyB3aGljaAotICogY2Fubm90IGJlIGNvcnJlY3RlZCB0aGUgcm91dGluZXMgcmV0dXJuIGZhbHNlLCBvdGhlcndpc2UgdHJ1ZSAoYWx0aG91Z2gKLSAqIG1vZGlmaWNhdGlvbiB0byB0aGUgemxpYiBoZWFkZXIgbWF5IGJlIHJlcXVpcmVkLikKLSAqCi0gKiBUaGUgY29tcHJlc3NlZCBkYXRhIGlzIGluIHpsaWIgZm9ybWF0IChSRkMxOTUwKSBhbmQgY29uc2VxdWVudGx5IGhhcyBhCi0gKiBtaW5pbXVtIGxlbmd0aCBvZiA3IGJ5dGVzLgotICovCi1zdGF0aWMgaW50IHpsaWJfY2hlY2soc3RydWN0IGZpbGUgKmZpbGUsIHBuZ191aW50XzMyIG9mZnNldCk7Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfelRYdF9pQ0NQKHN0cnVjdCBmaWxlICpmaWxlKQotICAgLyogelRYdCBhbmQgaUNDUCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZm9ybSAtIGtleXdvcmQsIG51bGwsIGNvbXByZXNzaW9uCi0gICAgKiBtZXRob2QgdGhlbiBjb21wcmVzc2VkIGRhdGEuCi0gICAgKi8KLXsKLSAgIHN0cnVjdCBjaHVuayAqY2h1bmsgPSBmaWxlLT5jaHVuazsKLSAgIHBuZ191aW50XzMyIGxlbmd0aDsKLSAgIHBuZ191aW50XzMyIGluZGV4ID0gMDsKLQotICAgYXNzZXJ0KGNodW5rICE9IE5VTEwgJiYgZmlsZS0+aWRhdCA9PSBOVUxMKTsKLSAgIGxlbmd0aCA9IGNodW5rLT5jaHVua19sZW5ndGg7Ci0gICBzZXRwb3MoY2h1bmspOwotCi0gICB3aGlsZSAobGVuZ3RoID49IDkpCi0gICB7Ci0gICAgICAtLWxlbmd0aDsKLSAgICAgICsraW5kZXg7Ci0gICAgICBpZiAocmVyZWFkX2J5dGUoZmlsZSkgPT0gMCkgLyoga2V5d29yZCBudWxsIHRlcm1pbmF0b3IgKi8KLSAgICAgIHsKLSAgICAgICAgIC0tbGVuZ3RoOwotICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICh2b2lkKXJlcmVhZF9ieXRlKGZpbGUpOyAvKiBjb21wcmVzc2lvbiBtZXRob2QgKi8KLSAgICAgICAgIHJldHVybiB6bGliX2NoZWNrKGZpbGUsIGluZGV4KTsKLSAgICAgIH0KLSAgIH0KLQotICAgY2h1bmtfbWVzc2FnZShjaHVuaywgInRvbyBzaG9ydCIpOwotICAgcmV0dXJuIDA7IC8qIHNraXAgKi8KLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19pVFh0KHN0cnVjdCBmaWxlICpmaWxlKQotewotICAgLyogTGlrZSB6VFh0IGJ1dCBtb3JlIGZpZWxkcy4gKi8KLSAgIHN0cnVjdCBjaHVuayAqY2h1bmsgPSBmaWxlLT5jaHVuazsKLSAgIHBuZ191aW50XzMyIGxlbmd0aDsKLSAgIHBuZ191aW50XzMyIGluZGV4ID0gMDsKLQotICAgYXNzZXJ0KGNodW5rICE9IE5VTEwgJiYgZmlsZS0+aWRhdCA9PSBOVUxMKTsKLSAgIGxlbmd0aCA9IGNodW5rLT5jaHVua19sZW5ndGg7Ci0gICBzZXRwb3MoY2h1bmspOwotCi0gICB3aGlsZSAobGVuZ3RoID49IDUpCi0gICB7Ci0gICAgICAtLWxlbmd0aDsKLSAgICAgICsraW5kZXg7Ci0gICAgICBpZiAocmVyZWFkX2J5dGUoZmlsZSkgPT0gMCkgLyoga2V5d29yZCBudWxsIHRlcm1pbmF0b3IgKi8KLSAgICAgIHsKLSAgICAgICAgIC0tbGVuZ3RoOwotICAgICAgICAgKytpbmRleDsKLSAgICAgICAgIGlmIChyZXJlYWRfYnl0ZShmaWxlKSA9PSAwKSAvKiB1bmNvbXByZXNzZWQgdGV4dCAqLwotICAgICAgICAgICAgcmV0dXJuIDE7IC8qIG5vdGhpbmcgdG8gY2hlY2sgKi8KLQotICAgICAgICAgLS1sZW5ndGg7Ci0gICAgICAgICArK2luZGV4OwotICAgICAgICAgKHZvaWQpcmVyZWFkX2J5dGUoZmlsZSk7IC8qIGNvbXByZXNzaW9uIG1ldGhvZCAqLwotCi0gICAgICAgICAvKiBTa2lwIHRoZSBsYW5ndWFnZSB0YWcgKG51bGwgdGVybWluYXRlZCkuICovCi0gICAgICAgICB3aGlsZSAobGVuZ3RoID49IDkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAtLWxlbmd0aDsKLSAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICBpZiAocmVyZWFkX2J5dGUoZmlsZSkgPT0gMCkgLyogdGVybWluYXRvciAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogU2tpcCB0aGUgdHJhbnNsYXRlZCBrZXl3b3JkICovCi0gICAgICAgICAgICAgICB3aGlsZSAobGVuZ3RoID49IDgpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAtLWxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICAgICAgICBpZiAocmVyZWFkX2J5dGUoZmlsZSkgPT0gMCkgLyogdGVybWluYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHpsaWJfY2hlY2soZmlsZSwgaW5kZXgpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICAvKiBSYW4gb3V0IG9mIGJ5dGVzIGluIHRoZSBjb21wcmVzc2VkIGNhc2UuICovCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgIH0KLQotICAgbG9nX2Vycm9yKGZpbGUsIElOVkFMSURfRVJST1JfQ09ERSwgImlUWHQgY2h1bmsgbGVuZ3RoIik7Ci0KLSAgIHJldHVybiAwOyAvKiBza2lwICovCi19Ci0KLS8qIElEQVQgUkVBRC9XUklURSBDT05UUk9MIFNUUlVDVFVSRSAqLwotc3RydWN0IElEQVQKLXsKLSAgIC8qIEFOQ0VTVE9SUyAqLwotICAgc3RydWN0IGZpbGUgKiAgICAgICAgIGZpbGU7Ci0gICBzdHJ1Y3QgZ2xvYmFsICogICAgICAgZ2xvYmFsOwotCi0gICAvKiBQUk9URUNURUQgSURBVCBJTkZPUk1BVElPTjogU0VUIEJZIFRIRSBJREFUIFJFQUQgQ09ERSAqLwotICAgc3RydWN0IElEQVRfbGlzdCAqaWRhdF9saXN0X2hlYWQ7IC8qIFNUQVJUIG9mIHRoZSBsaXN0IG9mIElEQVQgaW5mb3JtYXRpb24gKi8KLSAgIHN0cnVjdCBJREFUX2xpc3QgKmlkYXRfbGlzdF90YWlsOyAvKiAqRU5EKiBvZiB0aGUgbGlzdCBvZiBJREFUIGluZm9ybWF0aW9uICovCi0KLSAgIC8qIFBST1RFQ1RFRCBJREFUIElORk9STUFUSU9OOiBVU0VEIEJZIFRIRSBJREFUIFdSSVRFIENPREUgKi8KLSAgIHN0cnVjdCBJREFUX2xpc3QgKmlkYXRfY3VyOyAgICAgICAvKiBDdXJyZW50IGxpc3QgZW50cnkgKi8KLSAgIHVuc2lnbmVkIGludCAgICAgIGlkYXRfY291bnQ7ICAgICAvKiBBbmQgdGhlICpjdXJyZW50KiBpbmRleCBpbnRvIHRoZSBsaXN0ICovCi0gICBwbmdfdWludF8zMiAgICAgICBpZGF0X2luZGV4OyAgICAgLyogSW5kZXggb2YgKm5leHQqIGlucHV0IGJ5dGUgdG8gd3JpdGUgKi8KLSAgIHBuZ191aW50XzMyICAgICAgIGlkYXRfbGVuZ3RoOyAgICAvKiBDYWNoZSBvZiBjdXJyZW50IGNodW5rIGxlbmd0aCAqLwotfTsKLQotLyogTk9URTogdGhlcmUgaXMgY3VycmVudGx5IG5vIElEQVRfcmVzZXQsIHNvIGEgc3RyZWFtIGNhbm5vdCBjb250YWluIG1vcmUgdGhhbgotICogb25lIElEQVQgc2VxdWVuY2UgKGkuZS4gTU5HIGlzIG5vdCBzdXBwb3J0ZWQpLgotICovCi0KLXN0YXRpYyB2b2lkCi1JREFUX2VuZChzdHJ1Y3QgSURBVCAqKmlkYXRfdmFyKQotewotICAgc3RydWN0IElEQVQgKmlkYXQgPSAqaWRhdF92YXI7Ci0gICBzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlkYXQtPmZpbGU7Ci0KLSAgICppZGF0X3ZhciA9IE5VTEw7Ci0KLSAgIENMRUFSKCppZGF0KTsKLQotICAgYXNzZXJ0KGZpbGUtPmNodW5rICE9IE5VTEwpOwotICAgY2h1bmtfZW5kKCZmaWxlLT5jaHVuayk7Ci0KLSAgIC8qIFJlZ2FyZGxlc3Mgb2Ygd2h5IHRoZSBJREFUIHdhcyBraWxsZWQgc2V0IHRoZSBzdGF0ZSBiYWNrIHRvIENIVU5LUyAoaXQgbWF5Ci0gICAgKiBhbHJlYWR5IGJlIENIVU5LUyBiZWNhdXNlIHRoZSBzdGF0ZSBpc24ndCBjaGFuZ2VkIHVudGlsIHByb2Nlc3NfSURBVAotICAgICogcmV0dXJuczsgYSBzdG9wIHdpbGwgY2F1c2UgSURBVF9lbmQgdG8gYmUgZW50ZXJlZCBpbiBzdGF0ZSBDSFVOS1MhKQotICAgICovCi0gICBmaWxlLT5zdGF0ZSA9IFNUQVRFX0NIVU5LUzsKLX0KLQotc3RhdGljIHZvaWQKLUlEQVRfaW5pdChzdHJ1Y3QgSURBVCAqIGNvbnN0IGlkYXQsIHN0cnVjdCBmaWxlICogY29uc3QgZmlsZSkKLSAgIC8qIFdoZW4gdGhlIGNodW5rIGlzIHBuZ19JREFUIGluc3RhbnRpYXRlIGFuIElEQVQgY29udHJvbCBzdHJ1Y3R1cmUgaW4gcGxhY2UKLSAgICAqIG9mIGEgY2h1bmsgY29udHJvbCBzdHJ1Y3R1cmUuICBUaGUgSURBVCB3aWxsIGluc3RhbnRpYXRlIGEgY2h1bmsgY29udHJvbAotICAgICogc3RydWN0dXJlIHVzaW5nIHRoZSBmaWxlIGFsbG9jIHJvdXRpbmUuCi0gICAgKgotICAgICogTk9URTogdGhpcyByb3V0aW5lIG11c3Qgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgZmlsZSBhbGxvYyByb3V0aW5lIQotICAgICovCi17Ci0gICBhc3NlcnQoZmlsZS0+Y2h1bmsgPT0gTlVMTCk7Ci0gICBhc3NlcnQoZmlsZS0+aWRhdCA9PSBOVUxMKTsKLQotICAgQ0xFQVIoKmlkYXQpOwotCi0gICBpZGF0LT5maWxlID0gZmlsZTsKLSAgIGlkYXQtPmdsb2JhbCA9IGZpbGUtPmdsb2JhbDsKLQotICAgLyogSW5pdGlhbGl6ZSB0aGUgdGFpbCB0byB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgYW5kIHNldCB0aGUgY291bnQgdG8gMAotICAgICogKGVtcHR5LikKLSAgICAqLwotICAgaWRhdC0+Z2xvYmFsLT5pZGF0X2NhY2hlLmNvdW50ID0gMDsKLSAgIGlkYXQtPmlkYXRfbGlzdF9oZWFkID0gaWRhdC0+aWRhdF9saXN0X3RhaWwgPSAmaWRhdC0+Z2xvYmFsLT5pZGF0X2NhY2hlOwotCi0gICAvKiBOb3cgdGhlIGNodW5rLiAgVGhlIGFsbG9jYXRvciBjYWxscyB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhlIG5ldyBjaHVuayBhbmQKLSAgICAqIHN0b3JlcyB0aGUgcmVzdWx0IGluIGZpbGUtPmNodW5rOgotICAgICovCi0gICBmaWxlLT5hbGxvYyhmaWxlLCAwLypjaHVuayovKTsKLSAgIGFzc2VydChmaWxlLT5jaHVuayAhPSBOVUxMKTsKLQotICAgLyogQW5kIHN0b3JlIHRoaXMgZm9yIGNsZWFudXAgKGFuZCB0byBjaGVjayBmb3IgZG91YmxlIGFsbG9jIG9yIGZhaWx1cmUgdG8KLSAgICAqIGZyZWUuKQotICAgICovCi0gICBmaWxlLT5pZGF0ID0gaWRhdDsKLX0KLQotc3RhdGljIHBuZ191aW50XzMyCi1yZWNodW5rX2xlbmd0aChzdHJ1Y3QgSURBVCAqaWRhdCkKLSAgIC8qIFJldHVybiB0aGUgbGVuZ3RoIGZvciB0aGUgbmV4dCBJREFUIGNodW5rLCB0YWtpbmcgaW50byBhY2NvdW50Ci0gICAgKiByZWNodW5raW5nLgotICAgICovCi17Ci0gICBwbmdfdWludF8zMiBsZW4gPSBpZGF0LT5nbG9iYWwtPmlkYXRfbWF4OwotCi0gICBpZiAobGVuID09IDApIC8qIHVzZSBvcmlnaW5hbCBjaHVuayBsZW5ndGhzICovCi0gICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgSURBVF9saXN0ICpjdXI7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgICAgIGlmIChpZGF0LT5pZGF0X2luZGV4ID09IDApIC8qIGF0IHRoZSBuZXcgY2h1bmsgKGZpcnN0IHRpbWUpICovCi0gICAgICAgICByZXR1cm4gaWRhdC0+aWRhdF9sZW5ndGg7IC8qIHVzZSB0aGUgY2FjaGUgKi8KLQotICAgICAgLyogT3RoZXJ3aXNlIHJlY2h1bmtfbGVuZ3RoIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgY2h1bmsgZm9yIHRoZSBsZW5ndGgKLSAgICAgICAqIG9mIHRoZSBuZXh0IG9uZS4KLSAgICAgICAqLwotICAgICAgY3VyID0gaWRhdC0+aWRhdF9jdXI7Ci0gICAgICBjb3VudCA9IGlkYXQtPmlkYXRfY291bnQ7Ci0KLSAgICAgIGFzc2VydChpZGF0LT5pZGF0X2luZGV4ID09IGlkYXQtPmlkYXRfbGVuZ3RoICYmCi0gICAgICAgICBpZGF0LT5pZGF0X2xlbmd0aCA9PSBjdXItPmxlbmd0aHNbY291bnRdKTsKLQotICAgICAgLyogUmV0dXJuIGxlbmd0aCBvZiB0aGUgKm5leHQqIGNodW5rICovCi0gICAgICBpZiAoKytjb3VudCA8IGN1ci0+Y291bnQpCi0gICAgICAgICByZXR1cm4gY3VyLT5sZW5ndGhzW2NvdW50XTsKLQotICAgICAgLyogRW5kIG9mIHRoaXMgbGlzdCAqLwotICAgICAgYXNzZXJ0KGN1ciAhPSBpZGF0LT5pZGF0X2xpc3RfdGFpbCk7Ci0gICAgICBjdXIgPSBjdXItPm5leHQ7Ci0gICAgICBhc3NlcnQoY3VyICE9IE5VTEwgJiYgY3VyLT5jb3VudCA+IDApOwotICAgICAgcmV0dXJuIGN1ci0+bGVuZ3Roc1swXTsKLSAgIH0KLQotICAgZWxzZSAvKiByZWNodW5raW5nICovCi0gICB7Ci0gICAgICAvKiBUaGUgY2h1bmsgc2l6ZSBpcyB0aGUgbGVzc2VyIG9mIGZpbGUtPmlkYXRfbWF4IGFuZCB0aGUgbnVtYmVyCi0gICAgICAgKiBvZiByZW1haW5pbmcgYnl0ZXMuCi0gICAgICAgKi8KLSAgICAgIHBuZ191aW50XzMyIGhhdmUgPSBpZGF0LT5pZGF0X2xlbmd0aCAtIGlkYXQtPmlkYXRfaW5kZXg7Ci0KLSAgICAgIGlmIChsZW4gPiBoYXZlKQotICAgICAgewotICAgICAgICAgc3RydWN0IElEQVRfbGlzdCAqY3VyID0gaWRhdC0+aWRhdF9jdXI7Ci0gICAgICAgICB1bnNpZ25lZCBpbnQgaiA9IGlkYXQtPmlkYXRfY291bnQrMTsgLyogdGhlIG5leHQgSURBVCBpbiB0aGUgbGlzdCAqLwotCi0gICAgICAgICBkbwotICAgICAgICAgewotICAgICAgICAgICAgLyogQWRkIHVwIHRoZSByZW1haW5pbmcgYnl0ZXMuICBUaGlzIGNhbid0IG92ZXJmbG93IGJlY2F1c2UgdGhlCi0gICAgICAgICAgICAgKiBpbmRpdmlkdWFsIGxlbmd0aHMgYXJlIGFsd2F5cyA8PSAweDdmZmZmZmZmLCBzbyB3aGVuIHdlIGFkZCB0d28KLSAgICAgICAgICAgICAqIG9mIHRoZW0gb3ZlcmZsb3cgaXMgbm90IHBvc3NpYmxlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhc3NlcnQoY3VyICE9IE5VTEwpOwotCi0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogTk9URTogSURBVF9saXN0Ojpjb3VudCBoZXJlLCBub3QgSURBVF9saXN0OjpsZW5ndGggKi8KLSAgICAgICAgICAgICAgIGZvciAoOyBqIDwgY3VyLT5jb3VudDsgKytqKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaGF2ZSArPSBjdXItPmxlbmd0aHNbal07Ci0gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IGhhdmUpCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAvKiBJZiB0aGlzIHdhcyB0aGUgZW5kIHJldHVybiB0aGUgY291bnQgb2YgdGhlIGF2YWlsYWJsZSBieXRlcyAqLwotICAgICAgICAgICAgICAgaWYgKGN1ciA9PSBpZGF0LT5pZGF0X2xpc3RfdGFpbCkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBoYXZlOwotCi0gICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7Ci0gICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlIChsZW4gPiBoYXZlKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGxlbjsKLSAgIH0KLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19JREFUKHN0cnVjdCBmaWxlICpmaWxlKQotICAgLyogUHJvY2VzcyB0aGUgSURBVCBzdHJlYW0sIHRoaXMgaXMgdGhlIG1vcmUgY29tcGxleCB0aGFuIHRoZSBwcmVjZWRpbmcKLSAgICAqIGNhc2VzIGJlY2F1c2UgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyBzcHJlYWQgYWNyb3NzIG11bHRpcGxlIElEQVQgY2h1bmtzCi0gICAgKiAodHlwaWNhbGx5KS4gIFJlY2h1bmtpbmcgb2YgdGhlIGRhdGEgaXMgbm90IGhhbmRsZWQgaGVyZTsgYWxsIHRoaXMKLSAgICAqIGZ1bmN0aW9uIGRvZXMgaXMgZXN0YWJsaXNoIHdoZXRoZXIgdGhlIHpsaWIgaGVhZGVyIG5lZWRzIHRvIGJlIG1vZGlmaWVkLgotICAgICoKLSAgICAqIEluaXRpYWxseSB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBjaHVuayBzaG91bGQgbm90Ci0gICAgKiBiZSB3cml0dGVuLiAgSXQgZG9lcyB0aGlzIHVudGlsIHRoZSBsYXN0IElEQVQgY2h1bmsgaXMgcGFzc2VkIGluLCB0aGVuIGl0Ci0gICAgKiBjaGVja3MgdGhlIHpsaWIgZGF0YSBhbmQgcmV0dXJucyB0cnVlLgotICAgICoKLSAgICAqIEl0IGRvZXMgbm90IHJldHVybiBmYWxzZSBvbiBhIGZhdGFsIGVycm9yOyBpdCBjYWxscyBzdG9wIGluc3RlYWQuCi0gICAgKgotICAgICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYW4gaW5zdGFudGlhdGVkIChJREFUKSBjb250cm9sIHN0cnVjdHVyZSBhbmQgaXQgbXVzdAotICAgICogaGF2ZSBleHRlbnQgb3ZlciB0aGUgd2hvbGUgcmVhZCBvZiB0aGUgSURBVCBzdHJlYW0uICBGb3IgYSBQTkcgdGhpcyBtZWFucwotICAgICogdGhlIHdob2xlIFBORyByZWFkLCBmb3IgTU5HIGl0IGNvdWxkIGhhdmUgbGVzc2VyIGV4dGVudC4KLSAgICAqLwotewotICAgc3RydWN0IElEQVRfbGlzdCAqbGlzdDsKLQotICAgYXNzZXJ0KGZpbGUtPmlkYXQgIT0gTlVMTCAmJiBmaWxlLT5jaHVuayAhPSBOVUxMKTsKLQotICAgLyogV2UgbmVlZCB0byBmaXJzdCBjaGVjayB0aGUgZW50aXJlIHNlcXVlbmNlIG9mIElEQVQgY2h1bmtzIHRvIGVuc3VyZSB0aGUKLSAgICAqIHN0cmVhbSBpcyBpbiBzeW5jLiAgRG8gdGhpcyBieSBidWlsZGluZyBhIGxpc3Qgb2YgYWxsIHRoZSBjaHVua3MgYW5kCi0gICAgKiByZWNvcmRpbmcgdGhlIGxlbmd0aCBvZiBlYWNoIGJlY2F1c2UgdGhlIGxlbmd0aCBtYXkgaGF2ZSBiZWVuIGZpeGVkIHVwIGJ5Ci0gICAgKiBzeW5jX3N0cmVhbSBiZWxvdy4KLSAgICAqCi0gICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGNodW5rcywgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIG5leHQgY2h1bmsgaXMgbm90Ci0gICAgKiBwbmdfSURBVCwgcHJvY2VzcyB0aGUgd2hvbGUgc3RyZWFtIHVzaW5nIHRoZSBsaXN0IGRhdGEgdG8gY2hlY2sgdmFsaWRpdHkKLSAgICAqIHRoZW4gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIHN0YXJ0IGFuZCByZXdyaXRlIGV2ZXJ5dGhpbmcuCi0gICAgKi8KLSAgIGxpc3QgPSBmaWxlLT5pZGF0LT5pZGF0X2xpc3RfdGFpbDsKLQotICAgaWYgKGxpc3QtPmNvdW50ID09IGxpc3QtPmxlbmd0aCkKLSAgIHsKLSAgICAgIGxpc3QgPSBJREFUX2xpc3RfZXh0ZW5kKGxpc3QpOwotCi0gICAgICBpZiAobGlzdCA9PSBOVUxMKQotICAgICAgICAgc3RvcChmaWxlLCBSRUFEX0VSUk9SX0NPREUsICJvdXQgb2YgbWVtb3J5Iik7Ci0KLSAgICAgIC8qIE1vdmUgdG8gdGhlIG5leHQgYmxvY2sgKi8KLSAgICAgIGxpc3QtPmNvdW50ID0gMDsKLSAgICAgIGZpbGUtPmlkYXQtPmlkYXRfbGlzdF90YWlsID0gbGlzdDsKLSAgIH0KLQotICAgLyogQW5kIGZpbGwgaW4gdGhlIG5leHQgSURBVCBpbmZvcm1hdGlvbiBidWZmZXIuICovCi0gICBsaXN0LT5sZW5ndGhzWyhsaXN0LT5jb3VudCkrK10gPSBmaWxlLT5jaHVuay0+Y2h1bmtfbGVuZ3RoOwotCi0gICAvKiBUaGUgdHlwZSBvZiB0aGUgbmV4dCBjaHVuayB3YXMgcmVjb3JkZWQgaW4gdGhlIGZpbGUgY29udHJvbCBzdHJ1Y3R1cmUgYnkKLSAgICAqIHRoZSBjYWxsZXIsIGlmIHRoaXMgaXMgcG5nX0lEQVQgcmV0dXJuICdza2lwJyB0byB0aGUgY2FsbGVyLgotICAgICovCi0gICBpZiAoZmlsZS0+dHlwZSA9PSBwbmdfSURBVCkKLSAgICAgIHJldHVybiAwOyAvKiBza2lwIHRoaXMgZm9yIHRoZSBtb21lbnQgKi8KLQotICAgLyogVGhpcyBpcyB0aGUgZmluYWwgSURBVCBjaHVuaywgc28gcnVuIHRoZSB0ZXN0cyB0byBjaGVjayBmb3IgdGhlIHRvbyBmYXIKLSAgICAqIGJhY2sgZXJyb3IgYW5kIHBvc3NpYmx5IG9wdGltaXplIHRoZSB3aW5kb3cgYml0cy4gIFRoaXMgbWVhbnMgZ29pbmcgYmFjawotICAgICogdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBjaHVuayBkYXRhLCB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIG9yaWdpbmFsCi0gICAgKiBjaHVuayBhbGxvY2F0aW9uLgotICAgICovCi0gICBzZXRwb3MoZmlsZS0+Y2h1bmspOwotCi0gICBpZiAoemxpYl9jaGVjayhmaWxlLCAwKSkKLSAgIHsKLSAgICAgIHN0cnVjdCBJREFUICppZGF0OwotICAgICAgaW50IGNtcDsKLQotICAgICAgLyogVGhlIElEQVQgc3RyZWFtIHdhcyBzdWNjZXNzZnVsbHkgdW5jb21wcmVzc2VkOyBzZWUgd2hldGhlciBpdAotICAgICAgICogY29udGFpbmVkIHRoZSBjb3JyZWN0IG51bWJlciBvZiBieXRlcyBvZiBpbWFnZSBkYXRhLgotICAgICAgICovCi0gICAgICBjbXAgPSB1YXJiX2NtcChmaWxlLT5pbWFnZV9ieXRlcywgZmlsZS0+aW1hZ2VfZGlnaXRzLAotICAgICAgICAgZmlsZS0+Y2h1bmstPnVuY29tcHJlc3NlZF9ieXRlcywgZmlsZS0+Y2h1bmstPnVuY29tcHJlc3NlZF9kaWdpdHMpOwotCi0gICAgICBpZiAoY21wIDwgMCkKLSAgICAgICAgIHR5cGVfbWVzc2FnZShmaWxlLCBwbmdfSURBVCwgImV4dHJhIHVuY29tcHJlc3NlZCBkYXRhIik7Ci0KLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0gICAgICAgICBzdG9wKGZpbGUsIExJQlBOR19FUlJPUl9DT0RFLCAiSURBVDogdW5jb21wcmVzc2VkIGRhdGEgdG9vIHNtYWxsIik7Ci0KLSAgICAgIC8qIFJldHVybiB0aGUgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgSURBVCBjaHVuazsgdGhlIGxlbmd0aAotICAgICAgICogaXMgc2V0IGluIHRoZSB3cml0ZSBjYXNlIGJlbG93IGJ1dCB0aGUgaW5wdXQgY2h1bmsgdmFyaWFibGVzIG11c3QgYmUKLSAgICAgICAqIHNldCAob25jZSkgaGVyZToKLSAgICAgICAqLwotICAgICAgc2V0cG9zKGZpbGUtPmNodW5rKTsKLQotICAgICAgaWRhdCA9IGZpbGUtPmlkYXQ7Ci0gICAgICBpZGF0LT5pZGF0X2N1ciA9IGlkYXQtPmlkYXRfbGlzdF9oZWFkOwotICAgICAgaWRhdC0+aWRhdF9sZW5ndGggPSBpZGF0LT5pZGF0X2N1ci0+bGVuZ3Roc1swXTsKLSAgICAgIGlkYXQtPmlkYXRfY291bnQgPSAwOyAvKiBDb3VudCBvZiBjaHVua3MgcmVhZCBpbiBjdXJyZW50IGxpc3QgKi8KLSAgICAgIGlkYXQtPmlkYXRfaW5kZXggPSAwOyAvKiBJbmRleCBpbnRvIGNodW5rIGRhdGEgKi8KLQotICAgICAgLyogVXBkYXRlIHRoZSBjaHVuayBsZW5ndGggdG8gdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoZSBJREFUIGNodW5rOiAqLwotICAgICAgZmlsZS0+Y2h1bmstPmNodW5rX2xlbmd0aCA9IHJlY2h1bmtfbGVuZ3RoKGlkYXQpOwotCi0gICAgICAvKiBDaGFuZ2UgdGhlIHN0YXRlIHRvIHdyaXRpbmcgSURBVCBjaHVua3MgKi8KLSAgICAgIGZpbGUtPnN0YXRlID0gU1RBVEVfSURBVDsKLQotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIGVsc2UgLyogRmFpbHVyZSB0byBkZWNvbXByZXNzIHRoZSBJREFUIHN0cmVhbTsgZ2l2ZSB1cC4gKi8KLSAgICAgIHN0b3AoZmlsZSwgWkxJQl9FUlJPUl9DT0RFLCAiY291bGQgbm90IHVuY29tcHJlc3MgSURBVCIpOwotfQotCi0vKiBaTElCIENPTlRST0wgU1RSVUNUVVJFICovCi1zdHJ1Y3QgemxpYgotewotICAgLyogQU5DRVNUT1JTICovCi0gICBzdHJ1Y3QgSURBVCAqICBpZGF0OyAgICAgICAgICAvKiBOT1RFOiBNYXkgYmUgTlVMTCAqLwotICAgc3RydWN0IGNodW5rICogY2h1bms7Ci0gICBzdHJ1Y3QgZmlsZSAqICBmaWxlOwotICAgc3RydWN0IGdsb2JhbCAqZ2xvYmFsOwotCi0gICAvKiBHTE9CQUwgWkxJQiBJTkZPUk1BVElPTjogU0VUIEJZIFRIRSBDQUxMRVIgKi8KLSAgIHBuZ191aW50XzMyICAgIHJld3JpdGVfb2Zmc2V0OwotCi0gICAvKiBHTE9CQUwgWkxJQiBJTkZPUk1BVElPTjogU0VUIEJZIFRIRSBaTElCIFJFQUQgQ09ERSAqLwotICAgdWRpZ2l0ICAgICAgICAgY29tcHJlc3NlZF9ieXRlc1s1XTsKLSAgIGludCAgICAgICAgICAgIGNvbXByZXNzZWRfZGlnaXRzOwotICAgdWRpZ2l0ICAgICAgICAgdW5jb21wcmVzc2VkX2J5dGVzWzVdOwotICAgaW50ICAgICAgICAgICAgdW5jb21wcmVzc2VkX2RpZ2l0czsKLSAgIGludCAgICAgICAgICAgIGZpbGVfYml0czsgICAgICAgICAgICAgLyogd2luZG93IGJpdHMgZnJvbSB0aGUgZmlsZSAqLwotICAgaW50ICAgICAgICAgICAgb2tfYml0czsgICAgICAgICAgICAgICAvKiBTZXQgPDE2IG9uIGEgc3VjY2Vzc2Z1bCByZWFkICovCi0gICBpbnQgICAgICAgICAgICBja3N1bTsgICAgICAgICAgICAgICAgIC8qIFNldCBvbiBhIGNoZWNrc3VtIGVycm9yICovCi0KLSAgIC8qIFBST1RFQ1RFRCBaTElCIElORk9STUFUSU9OOiBVU0VEIEJZIFRIRSBaTElCIFJPVVRJTkVTICovCi0gICB6X3N0cmVhbSAgICAgICB6OwotICAgcG5nX3VpbnRfMzIgICAgZXh0cmFfYnl0ZXM7ICAgLyogQ291bnQgb2YgZXh0cmEgY29tcHJlc3NlZCBieXRlcyAqLwotICAgaW50ICAgICAgICAgICAgc3RhdGU7Ci0gICBpbnQgICAgICAgICAgICByYzsgICAgICAgICAgICAvKiBMYXN0IHJldHVybiBjb2RlICovCi0gICBpbnQgICAgICAgICAgICB3aW5kb3dfYml0czsgICAvKiAwIGlmIG5vIGNoYW5nZSAqLwotICAgcG5nX2J5dGUgICAgICAgaGVhZGVyWzJdOwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotemxpYl9mbGV2ZWwoc3RydWN0IHpsaWIgKnpsaWIpCi17Ci0gICBzd2l0Y2ggKHpsaWItPmhlYWRlclsxXSA+PiA2KQotICAgewotICAgICAgY2FzZSAwOiAgcmV0dXJuICJzdXBmYXN0IjsKLSAgICAgIGNhc2UgMTogIHJldHVybiAic3RkZmFzdCI7Ci0gICAgICBjYXNlIDI6ICByZXR1cm4gImRlZmF1bHQiOwotICAgICAgY2FzZSAzOiAgcmV0dXJuICJtYXhpbXVtIjsKLSAgICAgIGRlZmF1bHQ6IGFzc2VydChVTlJFQUNIRUQpOwotICAgfQotCi0gICByZXR1cm4gIkNPTVBJTEVSIEJVRyI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXpsaWJfcmMoc3RydWN0IHpsaWIgKnpsaWIpCi0gICAvKiBSZXR1cm4gYSBzdHJpbmcgZm9yIHRoZSB6bGliIHJldHVybiBjb2RlICovCi17Ci0gICBzd2l0Y2ggKHpsaWItPnJjKQotICAgewotICAgICAgY2FzZSBaX09LOiAgICAgICAgICAgICAgcmV0dXJuICJaX09LIjsKLSAgICAgIGNhc2UgWl9TVFJFQU1fRU5EOiAgICAgIHJldHVybiAiWl9TVFJFQU1fRU5EIjsKLSAgICAgIGNhc2UgWl9ORUVEX0RJQ1Q6ICAgICAgIHJldHVybiAiWl9ORUVEX0RJQ1QiOwotICAgICAgY2FzZSBaX0VSUk5POiAgICAgICAgICAgcmV0dXJuICJaX0VSUk5PIjsKLSAgICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6ICAgIHJldHVybiAiWl9TVFJFQU1fRVJST1IiOwotICAgICAgY2FzZSBaX0RBVEFfRVJST1I6ICAgICAgcmV0dXJuICJaX0RBVEFfRVJST1IiOwotICAgICAgY2FzZSBaX01FTV9FUlJPUjogICAgICAgcmV0dXJuICJaX01FTV9FUlJPUiI7Ci0gICAgICBjYXNlIFpfQlVGX0VSUk9SOiAgICAgICByZXR1cm4gIlpfQlVGX0VSUk9SIjsKLSAgICAgIGNhc2UgWl9WRVJTSU9OX0VSUk9SOiAgIHJldHVybiAiWl9WRVJTSU9OX0VSUk9SIjsKLSAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiAiWl8qSU5WQUxJRF9SQyoiOwotICAgfQotfQotCi1zdGF0aWMgdm9pZAotemxpYl9tZXNzYWdlKHN0cnVjdCB6bGliICp6bGliLCBpbnQgdW5leHBlY3RlZCkKLSAgIC8qIE91dHB1dCBhIG1lc3NhZ2UgZ2l2ZW4gYSB6bGliIHJjICovCi17Ci0gICBpZiAoemxpYi0+Z2xvYmFsLT5lcnJvcnMpCi0gICB7Ci0gICAgICBjb25zdCBjaGFyICpyZWFzb24gPSB6bGliLT56Lm1zZzsKLQotICAgICAgaWYgKHJlYXNvbiA9PSBOVUxMKQotICAgICAgICAgcmVhc29uID0gIltubyBtZXNzYWdlXSI7Ci0KLSAgICAgIGZwdXRzKHpsaWItPmZpbGUtPmZpbGVfbmFtZSwgc3RkZXJyKTsKLSAgICAgIHR5cGVfc2VwKHN0ZGVycik7Ci0gICAgICB0eXBlX25hbWUoemxpYi0+Y2h1bmstPmNodW5rX3R5cGUsIHN0ZGVycik7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIjogJXN6bGliIGVycm9yOiAlZCAoJXMpICglcylcbiIsCi0gICAgICAgICB1bmV4cGVjdGVkID8gInVuZXhwZWN0ZWQgIiA6ICIiLCB6bGliLT5yYywgemxpYl9yYyh6bGliKSwgcmVhc29uKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXpsaWJfZW5kKHN0cnVjdCB6bGliICp6bGliKQotewotICAgLyogT3V0cHV0IHRoZSBzdW1tYXJ5IGxpbmUgbm93OyB0aGlzIGVuc3VyZXMgYSBzdW1tYXJ5IGxpbmUgYWx3YXlzIGdldHMKLSAgICAqIG91dHB1dCByZWdhcmRsZXNzIG9mIHRoZSBtYW5uZXIgb2YgZXhpdC4KLSAgICAqLwotICAgaWYgKCF6bGliLT5nbG9iYWwtPnF1aWV0KQotICAgewotICAgICAgaWYgKHpsaWItPm9rX2JpdHMgPCAxNikgLyogc3RyZWFtIHdhcyByZWFkIG9rICovCi0gICAgICB7Ci0gICAgICAgICBjb25zdCBjaGFyICpyZWFzb247Ci0KLSAgICAgICAgIGlmICh6bGliLT5ja3N1bSkKLSAgICAgICAgICAgIHJlYXNvbiA9ICJDSEsiOyAvKiBjaGVja3N1bSBlcnJvciAqLwotCi0gICAgICAgICBlbHNlIGlmICh6bGliLT5va19iaXRzID4gemxpYi0+ZmlsZV9iaXRzKQotICAgICAgICAgICAgcmVhc29uID0gIlRGQiI7IC8qIGZpeGluZyBhIHRvby1mYXItYmFjayBlcnJvciAqLwotCi0gICAgICAgICBlbHNlIGlmICh6bGliLT5va19iaXRzID09IHpsaWItPmZpbGVfYml0cykKLSAgICAgICAgICAgIHJlYXNvbiA9ICJPSyAiOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICByZWFzb24gPSAiT1BUIjsgLyogb3B0aW1pemluZyB3aW5kb3cgYml0cyAqLwotCi0gICAgICAgICAvKiBTVU1NQVJZIEZPUk1BVCAoZm9yIGEgc3VjY2Vzc2Z1bCB6bGliIGluZmxhdGUpOgotICAgICAgICAgICoKLSAgICAgICAgICAqIElEQVQgcmVhc29uIGZsZXZlbCBmaWxlLWJpdHMgb2stYml0cyBjb21wcmVzc2VkIHVuY29tcHJlc3NlZCBmaWxlCi0gICAgICAgICAgKi8KLSAgICAgICAgIHR5cGVfbmFtZSh6bGliLT5jaHVuay0+Y2h1bmtfdHlwZSwgc3Rkb3V0KTsKLSAgICAgICAgIHByaW50ZigiICVzICVzICVkICVkICIsIHJlYXNvbiwgemxpYl9mbGV2ZWwoemxpYiksIHpsaWItPmZpbGVfYml0cywKLSAgICAgICAgICAgIHpsaWItPm9rX2JpdHMpOwotICAgICAgICAgdWFyYl9wcmludCh6bGliLT5jb21wcmVzc2VkX2J5dGVzLCB6bGliLT5jb21wcmVzc2VkX2RpZ2l0cywgc3Rkb3V0KTsKLSAgICAgICAgIHB1dGMoJyAnLCBzdGRvdXQpOwotICAgICAgICAgdWFyYl9wcmludCh6bGliLT51bmNvbXByZXNzZWRfYnl0ZXMsIHpsaWItPnVuY29tcHJlc3NlZF9kaWdpdHMsCi0gICAgICAgICAgICBzdGRvdXQpOwotICAgICAgICAgcHV0YygnICcsIHN0ZG91dCk7Ci0gICAgICAgICBmcHV0cyh6bGliLT5maWxlLT5maWxlX25hbWUsIHN0ZG91dCk7Ci0gICAgICAgICBwdXRjKCdcbicsIHN0ZG91dCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgaXMgYSB6bGliIHJlYWQgZXJyb3I7IHRoZSBjaHVuayB3aWxsIGJlIHNraXBwZWQuICBGb3IgYW4gSURBVAotICAgICAgICAgICogc3RyZWFtIHRoaXMgd2lsbCBhbHNvIGNhdXNlIGEgZmF0YWwgcmVhZCBlcnJvciAodmlhIHN0b3AoKSkuCi0gICAgICAgICAgKgotICAgICAgICAgICogU1VNTUFSWSBGT1JNQVQ6Ci0gICAgICAgICAgKgotICAgICAgICAgICogSURBVCBTS1AgZmxldmVsIGZpbGUtYml0cyB6LXJjIGNvbXByZXNzZWQgbWVzc2FnZSBmaWxlCi0gICAgICAgICAgKgotICAgICAgICAgICogei1yYyBpcyB0aGUgemxpYiBmYWlsdXJlIGNvZGU7IG1lc3NhZ2UgaXMgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aAotICAgICAgICAgICogc3BhY2VzIHJlcGxhY2VkIGJ5ICctJy4gIFRoZSBjb21wcmVzc2VkIGJ5dGUgY291bnQgaW5kaWNhdGVzIHdoZXJlCi0gICAgICAgICAgKiBpbiB0aGUgemxpYiBzdHJlYW0gdGhlIGVycm9yIG9jY3VycmVkLgotICAgICAgICAgICovCi0gICAgICAgICB0eXBlX25hbWUoemxpYi0+Y2h1bmstPmNodW5rX3R5cGUsIHN0ZG91dCk7Ci0gICAgICAgICBwcmludGYoIiBTS1AgJXMgJWQgJXMgIiwgemxpYl9mbGV2ZWwoemxpYiksIHpsaWItPmZpbGVfYml0cywKLSAgICAgICAgICAgIHpsaWJfcmMoemxpYikpOwotICAgICAgICAgdWFyYl9wcmludCh6bGliLT5jb21wcmVzc2VkX2J5dGVzLCB6bGliLT5jb21wcmVzc2VkX2RpZ2l0cywgc3Rkb3V0KTsKLSAgICAgICAgIHB1dGMoJyAnLCBzdGRvdXQpOwotICAgICAgICAgZW1pdF9zdHJpbmcoemxpYi0+ei5tc2cgPyB6bGliLT56Lm1zZyA6ICJbbm9fbWVzc2FnZV0iLCBzdGRvdXQpOwotICAgICAgICAgcHV0YygnICcsIHN0ZG91dCk7Ci0gICAgICAgICBmcHV0cyh6bGliLT5maWxlLT5maWxlX25hbWUsIHN0ZG91dCk7Ci0gICAgICAgICBwdXRjKCdcbicsIHN0ZG91dCk7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGlmICh6bGliLT5zdGF0ZSA+PSAwKQotICAgewotICAgICAgemxpYi0+cmMgPSBpbmZsYXRlRW5kKCZ6bGliLT56KTsKLQotICAgICAgaWYgKHpsaWItPnJjICE9IFpfT0spCi0gICAgICAgICB6bGliX21lc3NhZ2UoemxpYiwgMS8qdW5leHBlY3RlZCovKTsKLSAgIH0KLQotICAgQ0xFQVIoKnpsaWIpOwotfQotCi1zdGF0aWMgaW50Ci16bGliX3Jlc2V0KHN0cnVjdCB6bGliICp6bGliLCBpbnQgd2luZG93X2JpdHMpCi0gICAvKiBSZWluaXRpYWxpemVzIGEgemxpYiB3aXRoIGEgZGlmZmVyZW50IHdpbmRvd19iaXRzICovCi17Ci0gICBhc3NlcnQoemxpYi0+c3RhdGUgPj0gMCk7IC8qIGluaXRpYWxpemVkIGJ5IHpsaWJfaW5pdCAqLwotCi0gICB6bGliLT56Lm5leHRfaW4gPSBaX05VTEw7Ci0gICB6bGliLT56LmF2YWlsX2luID0gMDsKLSAgIHpsaWItPnoubmV4dF9vdXQgPSBaX05VTEw7Ci0gICB6bGliLT56LmF2YWlsX291dCA9IDA7Ci0KLSAgIHpsaWItPndpbmRvd19iaXRzID0gd2luZG93X2JpdHM7Ci0gICB6bGliLT5jb21wcmVzc2VkX2RpZ2l0cyA9IDA7Ci0gICB6bGliLT51bmNvbXByZXNzZWRfZGlnaXRzID0gMDsKLQotICAgemxpYi0+c3RhdGUgPSAwOyAvKiBpbml0aWFsaXplZCwgb25jZSAqLwotICAgemxpYi0+cmMgPSBpbmZsYXRlUmVzZXQyKCZ6bGliLT56LCAwKTsKLSAgIGlmICh6bGliLT5yYyAhPSBaX09LKQotICAgewotICAgICAgemxpYl9tZXNzYWdlKHpsaWIsIDEvKnVuZXhwZWN0ZWQqLyk7Ci0gICAgICByZXR1cm4gMDsKLSAgIH0KLQotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXpsaWJfaW5pdChzdHJ1Y3QgemxpYiAqemxpYiwgc3RydWN0IElEQVQgKmlkYXQsIHN0cnVjdCBjaHVuayAqY2h1bmssCi0gICBpbnQgd2luZG93X2JpdHMsIHBuZ191aW50XzMyIG9mZnNldCkKLSAgIC8qIEluaXRpYWxpemUgYSB6bGliX2NvbnRyb2w7IHRoZSByZXN1bHQgaXMgdHJ1ZS9mYWxzZSAqLwotewotICAgQ0xFQVIoKnpsaWIpOwotCi0gICB6bGliLT5pZGF0ID0gaWRhdDsKLSAgIHpsaWItPmNodW5rID0gY2h1bms7Ci0gICB6bGliLT5maWxlID0gY2h1bmstPmZpbGU7Ci0gICB6bGliLT5nbG9iYWwgPSBjaHVuay0+Z2xvYmFsOwotICAgemxpYi0+cmV3cml0ZV9vZmZzZXQgPSBvZmZzZXQ7IC8qIG5ldmVyIGNoYW5nZWQgZm9yIHRoaXMgemxpYiAqLwotCi0gICAvKiAqX291dCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldDogKi8KLSAgIHpsaWItPnoubmV4dF9pbiA9IFpfTlVMTDsKLSAgIHpsaWItPnouYXZhaWxfaW4gPSAwOwotICAgemxpYi0+ei56YWxsb2MgPSBaX05VTEw7Ci0gICB6bGliLT56LnpmcmVlID0gWl9OVUxMOwotICAgemxpYi0+ei5vcGFxdWUgPSBaX05VTEw7Ci0KLSAgIHpsaWItPnN0YXRlID0gLTE7Ci0gICB6bGliLT53aW5kb3dfYml0cyA9IHdpbmRvd19iaXRzOwotCi0gICB6bGliLT5jb21wcmVzc2VkX2RpZ2l0cyA9IDA7Ci0gICB6bGliLT51bmNvbXByZXNzZWRfZGlnaXRzID0gMDsKLQotICAgLyogVGhlc2UgdmFsdWVzIGFyZSBzdGlja3kgYWNyb3NzIHJlc2V0IChpbiBhZGRpdGlvbiB0byB0aGUgc3R1ZmYgaW4gdGhlCi0gICAgKiBmaXJzdCBibG9jaywgd2hpY2ggaXMgYWN0dWFsbHkgY29uc3RhbnQuKQotICAgICovCi0gICB6bGliLT5maWxlX2JpdHMgPSAyNDsKLSAgIHpsaWItPm9rX2JpdHMgPSAxNjsgLyogdW5zZXQgKi8KLSAgIHpsaWItPmNrc3VtID0gMDsgLyogc2V0IHdoZW4gYSBjaGVja3N1bSBlcnJvciBpcyBkZXRlY3RlZCAqLwotCi0gICAvKiAnMCcgbWVhbnMgdXNlIHRoZSBoZWFkZXI7IGluZmxhdGVJbml0MiBzaG91bGQgYWx3YXlzIHN1Y2NlZWQgYmVjYXVzZSBpdAotICAgICogZG9lcyBub3RoaW5nIGFwYXJ0IGZyb20gYWxsb2NhdGluZyB0aGUgaW50ZXJuYWwgenN0YXRlLgotICAgICovCi0gICB6bGliLT5yYyA9IGluZmxhdGVJbml0MigmemxpYi0+eiwgMCk7Ci0gICBpZiAoemxpYi0+cmMgIT0gWl9PSykKLSAgIHsKLSAgICAgIHpsaWJfbWVzc2FnZSh6bGliLCAxLyp1bmV4cGVjdGVkKi8pOwotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHpsaWItPnN0YXRlID0gMDsgLyogaW5pdGlhbGl6ZWQgKi8KLSAgICAgIHJldHVybiAxOwotICAgfQotfQotCi1zdGF0aWMgaW50Ci1tYXhfd2luZG93X2JpdHModWFyYmMgc2l6ZSwgaW50IG5kaWdpdHMpCi0gICAvKiBSZXR1cm4gdGhlIHpsaWIgc3RyZWFtIHdpbmRvdyBiaXRzIHJlcXVpcmVkIGZvciBkYXRhIG9mIHRoZSBnaXZlbiBzaXplLiAqLwotewotICAgcG5nX3VpbnRfMTYgY2I7Ci0KLSAgIGlmIChuZGlnaXRzID4gMSkKLSAgICAgIHJldHVybiAxNTsKLQotICAgY2IgPSBzaXplWzBdOwotCi0gICBpZiAoY2IgPiAxNjM4NCkgcmV0dXJuIDE1OwotICAgaWYgKGNiID4gIDgxOTIpIHJldHVybiAxNDsKLSAgIGlmIChjYiA+ICA0MDk2KSByZXR1cm4gMTM7Ci0gICBpZiAoY2IgPiAgMjA0OCkgcmV0dXJuIDEyOwotICAgaWYgKGNiID4gIDEwMjQpIHJldHVybiAxMTsKLSAgIGlmIChjYiA+ICAgNTEyKSByZXR1cm4gMTA7Ci0gICBpZiAoY2IgPiAgIDI1NikgcmV0dXJuICA5OwotICAgcmV0dXJuIDg7Ci19Ci0KLXN0YXRpYyBpbnQKLXpsaWJfYWR2YW5jZShzdHJ1Y3QgemxpYiAqemxpYiwgcG5nX3VpbnRfMzIgbmJ5dGVzKQotICAgLyogUmVhZCBuYnl0ZXMgY29tcHJlc3NlZCBieXRlczsgdGhlIHN0cmVhbSB3aWxsIGJlIGluaXRpYWxpemVkIGlmIHJlcXVpcmVkLgotICAgICogQnl0ZXMgYXJlIGFsd2F5cyBiZWluZyByZXJlYWQgYW5kIGVycm9ycyBhcmUgZmF0YWwuICBUaGUgcmV0dXJuIGNvZGUgaXMgYXMKLSAgICAqIGZvbGxvd3M6Ci0gICAgKgotICAgICogICAgLTE6IHNhdyB0aGUgInRvbyBmYXIgYmFjayIgZXJyb3IKLSAgICAqICAgICAwOiBvaywga2VlcCBnb2luZwotICAgICogICAgIDE6IHNhdyBaX1NUUkVBTV9FTkQgKHpsaWItPmV4dHJhX2J5dGVzIGluZGljYXRlcyB0b28gbXVjaCBkYXRhKQotICAgICogICAgIDI6IGEgemxpYiBlcnJvciB0aGF0IGNhbm5vdCBiZSBjb3JyZWN0ZWQgKGVycm9yIG1lc3NhZ2UgYWxyZWFkeQotICAgICogICAgICAgIG91dHB1dCBpZiByZXF1aXJlZC4pCi0gICAgKi8KLSMgIGRlZmluZSBaTElCX1RPT19GQVJfQkFDSyAoLTEpCi0jICBkZWZpbmUgWkxJQl9PSyAgICAgICAgICAgMAotIyAgZGVmaW5lIFpMSUJfU1RSRUFNX0VORCAgIDEKLSMgIGRlZmluZSBaTElCX0ZBVEFMICAgICAgICAyCi17Ci0gICBpbnQgc3RhdGUgPSB6bGliLT5zdGF0ZTsKLSAgIGludCBlbmRyYyA9IFpMSUJfT0s7Ci0gICBwbmdfdWludF8zMiBpbl9ieXRlcyA9IDA7Ci0gICBzdHJ1Y3QgZmlsZSAqZmlsZSA9IHpsaWItPmZpbGU7Ci0KLSAgIGFzc2VydChzdGF0ZSA+PSAwKTsKLQotICAgd2hpbGUgKGluX2J5dGVzIDwgbmJ5dGVzICYmIGVuZHJjID09IFpMSUJfT0spCi0gICB7Ci0gICAgICBwbmdfdWludF8zMiBvdXRfYnl0ZXM7Ci0gICAgICBpbnQgZmx1c2g7Ci0gICAgICBwbmdfYnl0ZSBiSW4gPSByZXJlYWRfYnl0ZShmaWxlKTsKLSAgICAgIHBuZ19ieXRlIGJPdXQ7Ci0KLSAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICB7Ci0gICAgICAgICBjYXNlIDA6IC8qIGZpcnN0IGhlYWRlciBieXRlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgZmlsZV9iaXRzID0gOCsoYkluID4+IDQpOwotICAgICAgICAgICAgICAgaW50IG5ld19iaXRzID0gemxpYi0+d2luZG93X2JpdHM7Ci0KLSAgICAgICAgICAgICAgIHpsaWItPmZpbGVfYml0cyA9IGZpbGVfYml0czsKLQotICAgICAgICAgICAgICAgLyogQ2hlY2sgYWdhaW5zdCB0aGUgZXhpc3RpbmcgdmFsdWUgLSBpdCBtYXkgbm90IG5lZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAqIGNoYW5nZWQuICBOb3RlIHRoYXQgYSBib2d1cyBmaWxlX2JpdHMgaXMgYWxsb3dlZCB0aHJvdWdoIG9uY2UsCi0gICAgICAgICAgICAgICAgKiB0byBzZWUgaWYgaXQgd29ya3MsIGJ1dCB0aGUgd2luZG93X2JpdHMgdmFsdWUgaXMgc2V0IHRvIDE1LAotICAgICAgICAgICAgICAgICogdGhlIG1heGltdW0uCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGlmIChuZXdfYml0cyA9PSAwKSAvKiBubyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgIHpsaWItPndpbmRvd19iaXRzID0gKChmaWxlX2JpdHMgPiAxNSkgPyAxNSA6IGZpbGVfYml0cyk7Ci0KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld19iaXRzICE9IGZpbGVfYml0cykgLyogcmV3cml0ZSByZXF1aXJlZCAqLwotICAgICAgICAgICAgICAgICAgYkluID0gKHBuZ19ieXRlKSgoYkluICYgMHhmKSArICgobmV3X2JpdHMtOCkgPDwgNCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6bGliLT5oZWFkZXJbMF0gPSBiSW47Ci0gICAgICAgICAgICB6bGliLT5zdGF0ZSA9IHN0YXRlID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDE6IC8qIHNlY29uZCBoZWFkZXIgYnl0ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaW50IGIyID0gYkluICYgMHhlMDsgLyogdG9wIDMgYml0cyAqLwotCi0gICAgICAgICAgICAgICAvKiBUaGUgY2hlY2tzdW0gY2FsY3VsYXRpb24sIG9uIHRoZSBmaXJzdCAxMSBiaXRzOiAqLwotICAgICAgICAgICAgICAgYjIgKz0gMHgxZiAtICgoemxpYi0+aGVhZGVyWzBdIDw8IDgpICsgYjIpICUgMHgxZjsKLQotICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBjaGVja3N1bSBieXRlIGlmIHJlcXVpcmVkOiAqLwotICAgICAgICAgICAgICAgaWYgKGJJbiAhPSBiMikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBmaXJzdCBieXRlIHdhc24ndCBjaGFuZ2VkIHRoaXMgaW5kaWNhdGVzIGFuIGVycm9yIGluCi0gICAgICAgICAgICAgICAgICAgKiB0aGUgY2hlY2tzdW0gY2FsY3VsYXRpb247IHNpZ25hbCB0aGlzIGJ5IHNldHRpbmcgJ2Nrc3VtJy4KLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgaWYgKHpsaWItPmZpbGVfYml0cyA9PSB6bGliLT53aW5kb3dfYml0cykKLSAgICAgICAgICAgICAgICAgICAgIHpsaWItPmNrc3VtID0gMTsKLQotICAgICAgICAgICAgICAgICAgYkluID0gKHBuZ19ieXRlKWIyOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6bGliLT5oZWFkZXJbMV0gPSBiSW47Ci0gICAgICAgICAgICB6bGliLT5zdGF0ZSA9IHN0YXRlID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OiAvKiBBZnRlciB0aGUgaGVhZGVyIGJ5dGVzICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLyogRm9yIHNvbWUgc3RyZWFtcywgcGVyaGFwcyBvbmx5IHRob3NlIGNvbXByZXNzZWQgd2l0aCAnc3VwZXJmYXN0Ci0gICAgICAgKiBjb21wcmVzc2lvbicgKHdoaWNoIHJlc3VsdHMgaW4gYSBsb3Qgb2YgY29weWluZykgWl9CVUZfRVJST1IgY2FuIGhhcHBlbgotICAgICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgYWxsIG91dHB1dCBoYXMgYmVlbiBmbHVzaGVkIG9uIHRoZSBuZXh0IGlucHV0IGJ5dGUuCi0gICAgICAgKiBUaGlzIGlzIGhhbmRsZWQgYmVsb3cgd2hlbiBaX0JVRl9FUlJPUiBpcyBkZXRlY3RlZCBieSBhZGRpbmcgYW4gb3V0cHV0Ci0gICAgICAgKiBieXRlLgotICAgICAgICovCi0gICAgICB6bGliLT56Lm5leHRfaW4gPSAmYkluOwotICAgICAgemxpYi0+ei5hdmFpbF9pbiA9IDE7Ci0gICAgICB6bGliLT56Lm5leHRfb3V0ID0gJmJPdXQ7Ci0gICAgICB6bGliLT56LmF2YWlsX291dCA9IDA7ICAgICAvKiBJbml0aWFsbHkgKi8KLQotICAgICAgLyogSW5pdGlhbGx5IHVzZSBaX05PX0ZMVVNIIGluIGFuIGF0dGVtcHQgdG8gcGVyc3VhZGUgemxpYiB0byBsb29rIGF0IHRoaXMKLSAgICAgICAqIGJ5dGUgd2l0aG91dCBjb25mdXNpbmcgd2hhdCBpcyBnb2luZyBvbiB3aXRoIG91dHB1dC4KLSAgICAgICAqLwotICAgICAgZmx1c2ggPSBaX05PX0ZMVVNIOwotICAgICAgb3V0X2J5dGVzID0gMDsKLQotICAgICAgLyogTk9URTogZXhwcmVzc2lvbiAzIGlzIG9ubHkgZXZhbHV0ZWQgb24gJ2NvbnRpbnVlJywgYmVjYXVzZSBvZiB0aGUKLSAgICAgICAqICdicmVhaycgYXQgdGhlIGVuZCBvZiB0aGlzIGxvb3AgYmVsb3cuCi0gICAgICAgKi8KLSAgICAgIGZvciAoO2VuZHJjID09IFpMSUJfT0s7Ci0gICAgICAgICBmbHVzaCA9IFpfU1lOQ19GTFVTSCwKLSAgICAgICAgIHpsaWItPnoubmV4dF9vdXQgPSAmYk91dCwKLSAgICAgICAgIHpsaWItPnouYXZhaWxfb3V0ID0gMSwKLSAgICAgICAgICsrb3V0X2J5dGVzKQotICAgICAgewotICAgICAgICAgemxpYi0+cmMgPSBpbmZsYXRlKCZ6bGliLT56LCBmbHVzaCk7Ci0gICAgICAgICBvdXRfYnl0ZXMgLT0gemxpYi0+ei5hdmFpbF9vdXQ7Ci0KLSAgICAgICAgIHN3aXRjaCAoemxpYi0+cmMpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFpfQlVGX0VSUk9SOgotICAgICAgICAgICAgICAgaWYgKHpsaWItPnouYXZhaWxfb3V0ID09IDApCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogVHJ5IGFub3RoZXIgb3V0cHV0IGJ5dGUuICovCi0KLSAgICAgICAgICAgICAgIGlmICh6bGliLT56LmF2YWlsX2luID09IDApCi0gICAgICAgICAgICAgICAgICBicmVhazsgLyogVHJ5IGFub3RoZXIgaW5wdXQgYnl0ZSAqLwotCi0gICAgICAgICAgICAgICAvKiBCb3RoIGF2YWlsX291dCBhbmQgYXZhaWxfaW4gYXJlIDEgeWV0IHpsaWIgcmV0dXJuZWQgYSBjb2RlCi0gICAgICAgICAgICAgICAgKiBpbmRpY2F0aW5nIG5vIHByb2dyZXNzIHdhcyBwb3NzaWJsZS4gIFRoaXMgaXMgdW5leHBlY3RlZC4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgemxpYl9tZXNzYWdlKHpsaWIsIDEvKnVuZXhwZWN0ZWQqLyk7Ci0gICAgICAgICAgICAgICBlbmRyYyA9IFpMSUJfRkFUQUw7IC8qIHN0b3AgcHJvY2Vzc2luZyAqLwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWl9PSzoKLSAgICAgICAgICAgICAgIC8qIFpsaWIgaXMgc3VwcG9zZWQgdG8gaGF2ZSBtYWRlIHByb2dyZXNzOiAqLwotICAgICAgICAgICAgICAgYXNzZXJ0KHpsaWItPnouYXZhaWxfb3V0ID09IDAgfHwgemxpYi0+ei5hdmFpbF9pbiA9PSAwKTsKLSAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBjYXNlIFpfU1RSRUFNX0VORDoKLSAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHN1Y2Nlc3NmdWwgZW5kLiAqLwotICAgICAgICAgICAgICAgemxpYi0+c3RhdGUgPSAzOyAvKiBlbmQgb2Ygc3RyZWFtICovCi0gICAgICAgICAgICAgICBlbmRyYyA9IFpMSUJfU1RSRUFNX0VORDsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFpfTkVFRF9ESUNUOgotICAgICAgICAgICAgICAgemxpYl9tZXNzYWdlKHpsaWIsIDAvKnN0cmVhbSBlcnJvciovKTsKLSAgICAgICAgICAgICAgIGVuZHJjID0gWkxJQl9GQVRBTDsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFpfREFUQV9FUlJPUjoKLSAgICAgICAgICAgICAgIC8qIFRoZSB0b28gZmFyIGJhY2sgZXJyb3IgY2FuIGJlIGNvcnJlY3RlZCwgb3RoZXJzIGNhbm5vdDogKi8KLSAgICAgICAgICAgICAgIGlmICh6bGliLT56Lm1zZyAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICBzdHJjbXAoemxpYi0+ei5tc2csICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIpID09IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbmRyYyA9IFpMSUJfVE9PX0ZBUl9CQUNLOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgIHpsaWJfbWVzc2FnZSh6bGliLCAwLypzdHJlYW0gZXJyb3IqLyk7Ci0gICAgICAgICAgICAgICBlbmRyYyA9IFpMSUJfRkFUQUw7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0gLyogc3dpdGNoIChpbmZsYXRlIHJjKSAqLwotCi0gICAgICAgICAvKiBDb250cm9sIGdldHMgaGVyZSB3aGVuIGZ1cnRoZXIgb3V0cHV0IGlzIG5vdCBwb3NzaWJsZTsgZW5kcmMgbWF5Ci0gICAgICAgICAgKiBzdGlsbCBiZSBaTElCX09LIGlmIG1vcmUgaW5wdXQgaXMgcmVxdWlyZWQuCi0gICAgICAgICAgKi8KLSAgICAgICAgIGJyZWFrOwotICAgICAgfSAvKiBmb3IgKG91dHB1dCBieXRlcykgKi8KLQotICAgICAgLyogS2VlcCBhIHJ1bm5pbmcgY291bnQgb2Ygb3V0cHV0IGJ5dGUgcHJvZHVjZWQ6ICovCi0gICAgICB6bGliLT51bmNvbXByZXNzZWRfZGlnaXRzID0gdWFyYl9hZGQzMih6bGliLT51bmNvbXByZXNzZWRfYnl0ZXMsCi0gICAgICAgICB6bGliLT51bmNvbXByZXNzZWRfZGlnaXRzLCBvdXRfYnl0ZXMpOwotCi0gICAgICAvKiBLZWVwIGdvaW5nLCB0aGUgbG9vcCB3aWxsIHRlcm1pbmF0ZSB3aGVuIGVuZHJjIGlzIG5vIGxvbmdlciBzZXQgdG8KLSAgICAgICAqIFpMSUJfT0sgb3IgYWxsIHRoZSBpbnB1dCBieXRlcyBoYXZlIGJlZW4gY29uc3VtZWQ7IG1lYW53aGlsZSBrZWVwCi0gICAgICAgKiBhZGRpbmcgaW5wdXQgYnl0ZXMuCi0gICAgICAgKi8KLSAgICAgIGFzc2VydCh6bGliLT56LmF2YWlsX2luID09IDAgfHwgZW5kcmMgIT0gWkxJQl9PSyk7Ci0KLSAgICAgIGluX2J5dGVzICs9IDEgLSB6bGliLT56LmF2YWlsX2luOwotICAgfSAvKiB3aGlsZSAoaW5wdXQgYnl0ZXMpICovCi0KLSAgIGFzc2VydChpbl9ieXRlcyA9PSBuYnl0ZXMgfHwgZW5kcmMgIT0gWkxJQl9PSyk7Ci0KLSAgIC8qIFVwZGF0ZSB0aGUgcnVubmluZyB0b3RhbCBvZiBpbnB1dCBieXRlcyBjb25zdW1lZCAqLwotICAgemxpYi0+Y29tcHJlc3NlZF9kaWdpdHMgPSB1YXJiX2FkZDMyKHpsaWItPmNvbXByZXNzZWRfYnl0ZXMsCi0gICAgICB6bGliLT5jb21wcmVzc2VkX2RpZ2l0cywgaW5fYnl0ZXMgLSB6bGliLT56LmF2YWlsX2luKTsKLQotICAgLyogQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHVwZGF0ZSB0aGUgY2h1bmsgd2l0aCB0aGUgYWNjdW11bGF0ZWQKLSAgICAqIGluZm9ybWF0aW9uIGlmIGl0IGlzIGFuIGltcHJvdmVtZW50OgotICAgICovCi0gICBpZiAoZW5kcmMgPT0gWkxJQl9TVFJFQU1fRU5EICYmIHpsaWItPndpbmRvd19iaXRzIDwgemxpYi0+b2tfYml0cykKLSAgIHsKLSAgICAgIHN0cnVjdCBjaHVuayAqY2h1bmsgPSB6bGliLT5jaHVuazsKLQotICAgICAgY2h1bmstPnVuY29tcHJlc3NlZF9kaWdpdHMgPSB1YXJiX2NvcHkoY2h1bmstPnVuY29tcHJlc3NlZF9ieXRlcywKLSAgICAgICAgIHpsaWItPnVuY29tcHJlc3NlZF9ieXRlcywgemxpYi0+dW5jb21wcmVzc2VkX2RpZ2l0cyk7Ci0gICAgICBjaHVuay0+Y29tcHJlc3NlZF9kaWdpdHMgPSB1YXJiX2NvcHkoY2h1bmstPmNvbXByZXNzZWRfYnl0ZXMsCi0gICAgICAgICB6bGliLT5jb21wcmVzc2VkX2J5dGVzLCB6bGliLT5jb21wcmVzc2VkX2RpZ2l0cyk7Ci0gICAgICBjaHVuay0+cmV3cml0ZV9idWZmZXJbMF0gPSB6bGliLT5oZWFkZXJbMF07Ci0gICAgICBjaHVuay0+cmV3cml0ZV9idWZmZXJbMV0gPSB6bGliLT5oZWFkZXJbMV07Ci0KLSAgICAgIGlmICh6bGliLT53aW5kb3dfYml0cyAhPSB6bGliLT5maWxlX2JpdHMgfHwgemxpYi0+Y2tzdW0pCi0gICAgICB7Ci0gICAgICAgICAvKiBBIHJld3JpdGUgaXMgcmVxdWlyZWQgKi8KLSAgICAgICAgIGNodW5rLT5yZXdyaXRlX29mZnNldCA9IHpsaWItPnJld3JpdGVfb2Zmc2V0OwotICAgICAgICAgY2h1bmstPnJld3JpdGVfbGVuZ3RoID0gMjsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgY2h1bmstPnJld3JpdGVfb2Zmc2V0ID0gMDsKLSAgICAgICAgIGNodW5rLT5yZXdyaXRlX2xlbmd0aCA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbl9ieXRlcyA8IG5ieXRlcykKLSAgICAgICAgIGNodW5rX21lc3NhZ2UoY2h1bmssICJleHRyYSBjb21wcmVzc2VkIGRhdGEiKTsKLQotICAgICAgemxpYi0+ZXh0cmFfYnl0ZXMgPSBuYnl0ZXMgLSBpbl9ieXRlczsKLSAgICAgIHpsaWItPm9rX2JpdHMgPSB6bGliLT53aW5kb3dfYml0czsKLSAgIH0KLQotICAgcmV0dXJuIGVuZHJjOwotfQotCi1zdGF0aWMgaW50Ci16bGliX3J1bihzdHJ1Y3QgemxpYiAqemxpYikKLSAgIC8qIExpa2UgemxpYl9hZHZhbmNlIGJ1dCBhbHNvIGhhbmRsZXMgYSBzdHJlYW0gb2YgSURBVCBjaHVua3MuICovCi17Ci0gICAvKiBUaGUgJ2V4dHJhX2J5dGVzJyBmaWVsZCBpcyBzZXQgYnkgemxpYl9hZHZhbmNlIGlmIHRoZXJlIGlzIGV4dHJhCi0gICAgKiBjb21wcmVzc2VkIGRhdGEgaW4gdGhlIGNodW5rIGl0IGhhbmRsZXMgKGlmIGl0IHNlZXMgWl9TVFJFQU1fRU5EIGJlZm9yZQotICAgICogYWxsIHRoZSBpbnB1dCBkYXRhIGhhcyBiZWVuIHVzZWQuKSAgVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSB2YWx1ZSB0byB1cGRhdGUKLSAgICAqIHRoZSBjb3JyZWN0IGNodW5rIGxlbmd0aCwgc28gdGhlIHByb2JsZW0gc2hvdWxkIG9ubHkgZXZlciBiZSBkZXRlY3RlZCBvbmNlCi0gICAgKiBmb3IgZWFjaCBjaHVuay4gIHpsaWJfYWR2YW5jZSBvdXRwdXRzIHRoZSBlcnJvciBtZXNzYWdlLCB0aG91Z2ggc2VlIHRoZQotICAgICogSURBVCBzcGVjaWZpYyBjaGVjayBiZWxvdy4KLSAgICAqLwotICAgemxpYi0+ZXh0cmFfYnl0ZXMgPSAwOwotCi0gICBpZiAoemxpYi0+aWRhdCAhPSBOVUxMKQotICAgewotICAgICAgc3RydWN0IElEQVRfbGlzdCAqbGlzdCA9IHpsaWItPmlkYXQtPmlkYXRfbGlzdF9oZWFkOwotICAgICAgc3RydWN0IElEQVRfbGlzdCAqbGFzdCA9IHpsaWItPmlkYXQtPmlkYXRfbGlzdF90YWlsOwotICAgICAgaW50ICAgICAgICBza2lwID0gMDsKLQotICAgICAgLyogJ3Jld3JpdGVfb2Zmc2V0JyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBMWiBkYXRhIHdpdGhpbiB0aGUgY2h1bmssIGZvcgotICAgICAgICogSURBVCBpdCBzaG91bGQgYmUgMDoKLSAgICAgICAqLwotICAgICAgYXNzZXJ0KHpsaWItPnJld3JpdGVfb2Zmc2V0ID09IDApOwotCi0gICAgICAvKiBQcm9jZXNzIGVhY2ggSURBVF9saXN0IGluIHR1cm47IHRoZSBjYWxsZXIgaGFzIGxlZnQgdGhlIHN0cmVhbQotICAgICAgICogcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IElEQVQgY2h1bmsgZGF0YS4KLSAgICAgICAqLwotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCA9IGxpc3QtPmNvdW50OwotICAgICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgICAgIGZvciAoaSA9IDA7IGk8Y291bnQ7ICsraSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGludCByYzsKLQotICAgICAgICAgICAgaWYgKHNraXAgPiAwKSAvKiBTa2lwIENSQyBhbmQgbmV4dCBJREFUIGhlYWRlciAqLwotICAgICAgICAgICAgICAgc2tpcF8xMih6bGliLT5maWxlKTsKLQotICAgICAgICAgICAgc2tpcCA9IDEyOyAvKiBmb3IgdGhlIG5leHQgdGltZSAqLwotCi0gICAgICAgICAgICByYyA9IHpsaWJfYWR2YW5jZSh6bGliLCBsaXN0LT5sZW5ndGhzW2ldKTsKLQotICAgICAgICAgICAgc3dpdGNoIChyYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgWkxJQl9PSzogLyoga2VlcCBnb2luZyAqLwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgIGNhc2UgWkxJQl9TVFJFQU1fRU5EOiAvKiBzdG9wICovCi0gICAgICAgICAgICAgICAgICAvKiBUaGVyZSBtYXkgYmUgZXh0cmEgY2h1bmtzOyBpZiB0aGVyZSBhcmUgYW5kIG9uZSBvZiB0aGVtIGlzCi0gICAgICAgICAgICAgICAgICAgKiBub3QgemVybyBsZW5ndGggb3V0cHV0IHRoZSAnZXh0cmEgZGF0YScgbWVzc2FnZS4gIE9ubHkgZG8KLSAgICAgICAgICAgICAgICAgICAqIHRoaXMgY2hlY2sgaWYgZXJyb3JzIGFyZSBiZWluZyBvdXRwdXQuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIGlmICh6bGliLT5nbG9iYWwtPmVycm9ycyAmJiB6bGliLT5leHRyYV9ieXRlcyA9PSAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IElEQVRfbGlzdCAqY2hlY2sgPSBsaXN0OwotICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpKzEsIGpjb3VudCA9IGNvdW50OwotCi0gICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGo8amNvdW50OyArK2opCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2stPmxlbmd0aHNbal0gPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfbWVzc2FnZSh6bGliLT5jaHVuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYSBjb21wcmVzc2VkIGRhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX2NoZWNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sgPT0gbGFzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IGNoZWNrLT5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgamNvdW50ID0gY2hlY2stPmNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIGVuZF9jaGVjazoKLSAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSB0aGUgbGlzdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgcmVkdWNpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgKiBsZW5ndGggb2YgdGhlIGxhc3QgSURBVCB0b28gaWYgcmVxdWlyZWQuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIGxpc3QtPmxlbmd0aHNbaV0gLT0gemxpYi0+ZXh0cmFfYnl0ZXM7Ci0gICAgICAgICAgICAgICAgICBsaXN0LT5jb3VudCA9IGkrMTsKLSAgICAgICAgICAgICAgICAgIHpsaWItPmlkYXQtPmlkYXRfbGlzdF90YWlsID0gbGlzdDsKLSAgICAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgYW5kIFpfU1RSRUFNX0VORCB3YXMgbm90IHNlZW4uICovCi0gICAgICAgICBpZiAobGlzdCA9PSBsYXN0KQotICAgICAgICAgICAgcmV0dXJuIFpMSUJfT0s7Ci0KLSAgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgICAgfQotICAgfQotCi0gICBlbHNlCi0gICB7Ci0gICAgICBzdHJ1Y3QgY2h1bmsgKmNodW5rID0gemxpYi0+Y2h1bms7Ci0gICAgICBpbnQgcmM7Ci0KLSAgICAgIGFzc2VydCh6bGliLT5yZXdyaXRlX29mZnNldCA8IGNodW5rLT5jaHVua19sZW5ndGgpOwotCi0gICAgICByYyA9IHpsaWJfYWR2YW5jZSh6bGliLCBjaHVuay0+Y2h1bmtfbGVuZ3RoIC0gemxpYi0+cmV3cml0ZV9vZmZzZXQpOwotCi0gICAgICAvKiBUaGUgZXh0cmEgYnl0ZXMgaW4gdGhlIGNodW5rIGFyZSBoYW5kbGVkIG5vdyBieSBhZGp1c3RpbmcgdGhlIGNodW5rCi0gICAgICAgKiBsZW5ndGggdG8gZXhjbHVkZSB0aGVtOyB0aGUgemxpYiBkYXRhIGlzIGFsd2F5cyBzdG9yZWQgYXQgdGhlIGVuZCBvZgotICAgICAgICogdGhlIFBORyBjaHVuayAoYWx0aG91Z2ggY2xlYXJseSB0aGlzIGlzIG5vdCBuZWNlc3NhcnkuKSAgemxpYl9hZHZhbmNlCi0gICAgICAgKiBoYXMgYWxyZWFkeSBvdXRwdXQgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAgICAgKi8KLSAgICAgIGNodW5rLT5jaHVua19sZW5ndGggLT0gemxpYi0+ZXh0cmFfYnl0ZXM7Ci0gICAgICByZXR1cm4gcmM7Ci0gICB9Ci19Ci0KLXN0YXRpYyBpbnQgLyogZ2xvYmFsIGZ1bmN0aW9uOyBub3QgYSBtZW1iZXIgZnVuY3Rpb24gKi8KLXpsaWJfY2hlY2soc3RydWN0IGZpbGUgKmZpbGUsIHBuZ191aW50XzMyIG9mZnNldCkKLSAgIC8qIENoZWNrIHRoZSBzdHJlYW0gb2YgemxpYiBjb21wcmVzc2VkIGRhdGEgaW4gZWl0aGVyIGlkYXQgKGlmIGdpdmVuKSBvciAoaWYKLSAgICAqIG5vdCkgY2h1bmsuICBJbiBmYWN0IGl0IGlzIHpsaWJfcnVuIHRoYXQgaGFuZGxlcyB0aGUgZGlmZmVyZW5jZSBpbiByZWFkaW5nCi0gICAgKiBhIHNpbmdsZSBjaHVuayBhbmQgYSBsaXN0IG9mIElEQVQgY2h1bmtzLgotICAgICoKLSAgICAqIEluIGVpdGhlciBjYXNlIHRoZSBpbnB1dCBmaWxlIG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUgZmlyc3QgYnl0ZSBvZiB6bGliCi0gICAgKiBjb21wcmVzc2VkIGRhdGEgKHRoZSBmaXJzdCBoZWFkZXIgYnl0ZSkuCi0gICAgKgotICAgICogVGhlIHJldHVybiB2YWx1ZSBpcyB0cnVlIG9uIHN1Y2Nlc3MsIGluY2x1ZGluZyB0aGUgY2FzZSB3aGVyZSB0aGUgemxpYgotICAgICogaGVhZGVyIG1heSBuZWVkIHRvIGJlIHJld3JpdHRlbiwgYW5kIGZhbHNlIG9uIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCi0gICAgKgotICAgICogSW4gdGhlIGNhc2Ugb2YgSURBVCBjaHVua3MgJ29mZnNldCcgc2hvdWxkIGJlIDAuCi0gICAgKi8KLXsKLSAgIGZwb3NfdCBzdGFydF9wb3M7Ci0gICBzdHJ1Y3QgemxpYiB6bGliOwotCi0gICAvKiBSZWNvcmQgdGhlIHN0YXJ0IG9mIHRoZSBMWiBkYXRhIHRvIGFsbG93IGEgcmUtcmVhZC4gKi8KLSAgIGZpbGVfZ2V0cG9zKGZpbGUsICZzdGFydF9wb3MpOwotCi0gICAvKiBGaXJzdCB0ZXN0IHRoZSBleGlzdGluZyAoZmlsZSkgd2luZG93IGJpdHM6ICovCi0gICBpZiAoemxpYl9pbml0KCZ6bGliLCBmaWxlLT5pZGF0LCBmaWxlLT5jaHVuaywgMC8qd2luZG93IGJpdHMqLywgb2Zmc2V0KSkKLSAgIHsKLSAgICAgIGludCBtaW5fYml0cywgbWF4X2JpdHMsIHJjOwotCi0gICAgICAvKiBUaGUgZmlyc3QgcnVuIHVzaW5nIHRoZSBleGlzdGluZyB3aW5kb3cgYml0cy4gKi8KLSAgICAgIHJjID0gemxpYl9ydW4oJnpsaWIpOwotCi0gICAgICBzd2l0Y2ggKHJjKQotICAgICAgewotICAgICAgICAgY2FzZSBaTElCX1RPT19GQVJfQkFDSzoKLSAgICAgICAgICAgIC8qIHRvbyBmYXIgYmFjayBlcnJvciAqLwotICAgICAgICAgICAgZmlsZS0+c3RhdHVzX2NvZGUgfD0gVE9PX0ZBUl9CQUNLOwotICAgICAgICAgICAgbWluX2JpdHMgPSB6bGliLndpbmRvd19iaXRzICsgMTsKLSAgICAgICAgICAgIG1heF9iaXRzID0gMTU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSBaTElCX1NUUkVBTV9FTkQ6Ci0gICAgICAgICAgICBpZiAoIXpsaWIuZ2xvYmFsLT5vcHRpbWl6ZV96bGliICYmCi0gICAgICAgICAgICAgICB6bGliLndpbmRvd19iaXRzID09IHpsaWIuZmlsZV9iaXRzICYmICF6bGliLmNrc3VtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogVGhlIHRyaXZpYWwgY2FzZSB3aGVyZSB0aGUgc3RyZWFtIGlzIG9rIGFuZCBvcHRpbWl6YXRpb24gd2FzCi0gICAgICAgICAgICAgICAgKiBub3QgcmVxdWVzdGVkLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICB6bGliX2VuZCgmemxpYik7Ci0gICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF4X2JpdHMgPSBtYXhfd2luZG93X2JpdHMoemxpYi51bmNvbXByZXNzZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICB6bGliLnVuY29tcHJlc3NlZF9kaWdpdHMpOwotICAgICAgICAgICAgaWYgKHpsaWIub2tfYml0cyA8IG1heF9iaXRzKQotICAgICAgICAgICAgICAgbWF4X2JpdHMgPSB6bGliLm9rX2JpdHM7Ci0gICAgICAgICAgICBtaW5fYml0cyA9IDg7Ci0KLSAgICAgICAgICAgIC8qIGNrc3VtIGlzIHNldCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgemxpYiBoZWFkZXIgY2hlY2tzdW0KLSAgICAgICAgICAgICAqIGNhbGN1bGF0aW9uIGluIHRoZSBvcmlnaW5hbCBmaWxlIChhbmQgdGhpcyBtYXkgYmUgdGhlIG9ubHkgcmVhc29uCi0gICAgICAgICAgICAgKiBhIHJld3JpdGUgaXMgcmVxdWlyZWQpLiAgV2UgY2FuJ3QgcmVseSBvbiB0aGUgZmlsZSB3aW5kb3cgYml0cyBpbgotICAgICAgICAgICAgICogdGhpcyBjYXNlLCBzbyBkbyB0aGUgb3B0aW1pemF0aW9uIGFueXdheS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHpsaWIuY2tzdW0pCi0gICAgICAgICAgICAgICBjaHVua19tZXNzYWdlKHpsaWIuY2h1bmssICJ6bGliIGNoZWNrdW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgIGNhc2UgWkxJQl9PSzoKLSAgICAgICAgICAgIC8qIFRydW5jYXRlZCBzdHJlYW07IHVucmVjb3ZlcmFibGUsIGdldHMgY29udmVydGVkIHRvIFpMSUJfRkFUQUwgKi8KLSAgICAgICAgICAgIHpsaWIuei5tc2cgPSBQTkdaX01TR19DQVNUKCJbdHJ1bmNhdGVkXSIpOwotICAgICAgICAgICAgemxpYl9tZXNzYWdlKCZ6bGliLCAwLypleHBlY3RlZCovKTsKLSAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogVW5yZWNvdmVyYWJsZSBlcnJvcjsgc2tpcCB0aGUgY2h1bms7IGEgemxpYl9tZXNzYWdlIGhhcyBhbHJlYWR5Ci0gICAgICAgICAgICAgKiBiZWVuIG91dHB1dC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgemxpYl9lbmQoJnpsaWIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE9wdGltaXplIHdpbmRvdyBiaXRzIG9yIGZpeCBhIHRvby1mYXItYmFjayBlcnJvci4gIG1pbl9iaXRzIGFuZAotICAgICAgICogbWF4X2JpdHMgaGF2ZSBiZWVuIHNldCBhcHByb3ByaWF0ZWx5LCBva19iaXRzIHJlY29yZHMgdGhlIGJpdCB2YWx1ZQotICAgICAgICoga25vd24gdG8gd29yay4KLSAgICAgICAqLwotICAgICAgd2hpbGUgKG1pbl9iaXRzIDwgbWF4X2JpdHMgfHwgbWF4X2JpdHMgPCB6bGliLm9rX2JpdHMvKmlmIDE2Ki8pCi0gICAgICB7Ci0gICAgICAgICBpbnQgdGVzdF9iaXRzID0gKG1pbl9iaXRzICsgbWF4X2JpdHMpID4+IDE7Ci0KLSAgICAgICAgIGlmICh6bGliX3Jlc2V0KCZ6bGliLCB0ZXN0X2JpdHMpKQotICAgICAgICAgewotICAgICAgICAgICAgZmlsZV9zZXRwb3MoZmlsZSwgJnN0YXJ0X3Bvcyk7Ci0gICAgICAgICAgICByYyA9IHpsaWJfcnVuKCZ6bGliKTsKLQotICAgICAgICAgICAgc3dpdGNoIChyYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgWkxJQl9UT09fRkFSX0JBQ0s6Ci0gICAgICAgICAgICAgICAgICBtaW5fYml0cyA9IHRlc3RfYml0cysxOwotICAgICAgICAgICAgICAgICAgaWYgKG1pbl9iaXRzID4gbWF4X2JpdHMpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgc3RyZWFtIHJlYWxseSBpcyBkYW1hZ2VkIGFuZCBpdAotICAgICAgICAgICAgICAgICAgICAgICogY29udGFpbnMgYSBkaXN0YW5jZSBjb2RlIHRoYXQgYWRkcmVzc2VzIGJ5dGVzIGJlZm9yZQotICAgICAgICAgICAgICAgICAgICAgICogdGhlIHN0YXJ0IG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHRlc3RfYml0cyA9PSAxNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCB0aGUgZXJyb3IgdGhhdCB3YXNuJ3Qgb3V0cHV0IGJlZm9yZTogKi8KLSAgICAgICAgICAgICAgICAgICAgIGlmICh6bGliLnoubXNnID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB6bGliLnoubXNnID0gUE5HWl9NU0dfQ0FTVCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIpOwotICAgICAgICAgICAgICAgICAgICAgemxpYl9tZXNzYWdlKCZ6bGliLCAwLypzdHJlYW0gZXJyb3IqLyk7Ci0gICAgICAgICAgICAgICAgICAgICB6bGliX2VuZCgmemxpYik7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICBjYXNlIFpMSUJfU1RSRUFNX0VORDogLyogc3VjY2VzcyAqLwotICAgICAgICAgICAgICAgICAgbWF4X2JpdHMgPSB0ZXN0X2JpdHM7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIC8qIEEgZmF0YWwgZXJyb3I7IHRoaXMgaGFwcGVucyBpZiBhIHRvby1mYXItYmFjayBlcnJvciB3YXMKLSAgICAgICAgICAgICAgICAgICAqIGhpZGluZyBhIG1vcmUgc2VyaW91cyBlcnJvciwgemxpYl9hZHZhbmNlIGhhcyBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgKiBvdXRwdXQgYSB6bGliX21lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIHpsaWJfZW5kKCZ6bGliKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlIC8qIGluZmxhdGVSZXNldDIgZmFpbGVkICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICB6bGliX2VuZCgmemxpYik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogVGhlIGxvb3AgZ3VhcmFudGVlcyB0aGlzICovCi0gICAgICBhc3NlcnQoemxpYi5va19iaXRzID09IG1heF9iaXRzKTsKLSAgICAgIHpsaWJfZW5kKCZ6bGliKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotCi0gICBlbHNlIC8qIHpsaWIgaW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gc2tpcCB0aGUgY2h1bmsgKi8KLSAgIHsKLSAgICAgIHpsaWJfZW5kKCZ6bGliKTsKLSAgICAgIHJldHVybiAwOwotICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTElCUE5HIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIHN0cmF0ZWd5IGhlcmUgaXMgdG8gcnVuIGEgcmVndWxhciBsaWJwbmcgUE5HIGZpbGUgcmVhZCBidXQgZXhhbWluZSB0aGUKLSAqIGlucHV0IGRhdGEgKGZyb20gdGhlIGZpbGUpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIGxpYnBuZyBzbyBhcyB0byBiZSBhd2FyZSBvZgotICogdGhlIHN0YXRlIHdlIGV4cGVjdCBsaWJwbmcgdG8gYmUgaW4uICBXYXJuaW5nIGFuZCBlcnJvciBjYWxsYmFja3MgYXJlIGFsc28KLSAqIGludGVyY2VwdGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgcXVpZXRlZCBhbmQgaW50ZXJwcmV0ZWQuICBJbnRlcnByZXRhdGlvbgotICogZGVwZW5kcyBvbiBhIHNvbWV3aGF0IHJpc2t5IHN0cmluZyBtYXRjaCBmb3Iga25vd24gZXJyb3IgbWVzc2FnZXM7IGxldCB1cwotICogaG9wZSB0aGF0IHRoaXMgY2FuIGJlIGZpeGVkIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgbGlicG5nLgotICoKLSAqIFRoZSBjb250cm9sIHN0cnVjdHVyZSBpcyBwb2ludGVkIHRvIGJ5IHRoZSBsaWJwbmcgZXJyb3IgcG9pbnRlci4gIEl0IGNvbnRhaW5zCi0gKiB0aGF0IHNldCBvZiBzdHJ1Y3R1cmVzIHdoaWNoIG11c3QgcGVyc2lzdCBhY3Jvc3MgbXVsdGlwbGUgcmVhZCBjYWxsYmFja3MsCi0gKiB3aGljaCBpcyBwcmV0dHkgbXVjaCBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgJ3psaWInIGNvbnRyb2wgc3RydWN0dXJlLgotICoKLSAqIFRoZSBmaWxlIHN0cnVjdHVyZSBpcyBpbnN0YW50aWF0ZWQgaW4gdGhlIGNhbGxlciBvZiB0aGUgcGVyLWZpbGUgcm91dGluZSwgYnV0Ci0gKiB0aGUgcGVyLWZpbGUgcm91dGluZSBjb250YWlucyB0aGUgY2h1bmsgYW5kIElEQVQgY29udHJvbCBzdHJ1Y3R1cmVzLgotICovCi0vKiBUaGUgdGhyZWUgcm91dGluZXMgcmVhZF9jaHVuaywgcHJvY2Vzc19jaHVuayBhbmQgc3luY19zdHJlYW0gY2FuIG9ubHkgYmUKLSAqIGNhbGxlZCB2aWEgYSBjYWxsIHRvIHJlYWRfY2h1bmsgYW5kIG9ubHkgZXhpdCBhdCBhIHJldHVybiBmcm9tIHByb2Nlc3NfY2h1bmsuCi0gKiBUaGVzZSByb3V0aW5lcyBjb3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBhcyBvbmUgY29uZnVzaW5nIGxhcmdlIHJvdXRpbmUsCi0gKiBpbnN0ZWFkIHRoaXMgY29kZSByZWxpZXMgb24gdGhlIGNvbXBpbGVyIHRvIGRvIHRhaWwgY2FsbCBlbGltaW5hdGlvbi4gIFRoZQotICogcG9zc2libGUgY2FsbHMgYXJlIGFzIGZvbGxvd3M6Ci0gKgotICogcmVhZF9jaHVuawotICogICAgLT4gc3luY19zdHJlYW0KLSAqICAgICAgIC0+IHByb2Nlc3NfY2h1bmsKLSAqICAgIC0+IHByb2Nlc3NfY2h1bmsKLSAqICAgICAgIC0+IHJlYWRfY2h1bmsKLSAqICAgICAgIHJldHVybnMKLSAqLwotc3RhdGljIHZvaWQgcmVhZF9jaHVuayhzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgdm9pZAotcHJvY2Vzc19jaHVuayhzdHJ1Y3QgZmlsZSAqZmlsZSwgcG5nX3VpbnRfMzIgZmlsZV9jcmMsIHBuZ191aW50XzMyIG5leHRfbGVuZ3RoLAotICAgcG5nX3VpbnRfMzIgbmV4dF90eXBlKQotICAgLyogQ2FsbGVkIHdoZW4gdGhlIGNodW5rIGRhdGEgaGFzIGJlZW4gcmVhZCwgbmV4dF9sZW5ndGggYW5kIG5leHRfdHlwZQotICAgICogd2lsbCBiZSBzZXQgZm9yIHRoZSBuZXh0IGNodW5rIChvciAwIGlmIHRoaXMgaXMgSUVORCkuCi0gICAgKgotICAgICogV2hlbiB0aGlzIHJvdXRpbmUgcmV0dXJucywgY2h1bmtfbGVuZ3RoIGFuZCBjaHVua190eXBlIHdpbGwgYmUgc2V0IGZvciB0aGUKLSAgICAqIG5leHQgY2h1bmsgdG8gd3JpdGUgYmVjYXVzZSBpZiBhIGNodW5rIGlzIHNraXBwZWQgdGhpcyByZXR1cm4gY2FsbHMgYmFjawotICAgICogdG8gcmVhZF9jaHVuay4KLSAgICAqLwotewotICAgY29uc3QgcG5nX3VpbnRfMzIgdHlwZSA9IGZpbGUtPnR5cGU7Ci0KLSAgIGlmIChmaWxlLT5nbG9iYWwtPnZlcmJvc2UgPiAxKQotICAgewotICAgICAgZnB1dHMoIiAgIiwgc3RkZXJyKTsKLSAgICAgIHR5cGVfbmFtZShmaWxlLT50eXBlLCBzdGRlcnIpOwotICAgICAgZnByaW50ZihzdGRlcnIsICIgJWx1IDB4JS44eCAweCUuOHhcbiIsICh1bnNpZ25lZCBsb25nKWZpbGUtPmxlbmd0aCwKLSAgICAgICAgIGZpbGUtPmNyYyBeIDB4ZmZmZmZmZmYsIGZpbGVfY3JjKTsKLSAgIH0KLQotICAgLyogVGhlIGJhc2ljIHN0cnVjdHVyZSBzZWVtcyBjb3JyZWN0IGJ1dCB0aGUgQ1JDIG1heSBub3QgbWF0Y2gsIGluIHRoaXMKLSAgICAqIGNhc2UgYXNzdW1lIHRoYXQgaXQgaXMgc2ltcGx5IGEgYmFkIENSQywgZWl0aGVyIHdyb25nbHkgY2FsY3VsYXRlZCBvcgotICAgICogYmVjYXVzZSBvZiBkYW1hZ2VkIHN0cmVhbSBkYXRhLgotICAgICovCi0gICBpZiAoKGZpbGUtPmNyYyBeIDB4ZmZmZmZmZmYpICE9IGZpbGVfY3JjKQotICAgewotICAgICAgLyogVGhlIGJlaGF2aW9yIGlzIHNldCBieSB0aGUgJ3NraXAnIHNldHRpbmc7IGlmIGl0IGlzIGFueXRoaW5nIG90aGVyCi0gICAgICAgKiB0aGFuIFNLSVBfQkFEX0NSQyBpZ25vcmUgdGhlIGJhZCBDUkMgYW5kIHJldHVybiB0aGUgY2h1bmssIHdpdGggYQotICAgICAgICogY29ycmVjdGVkIENSQyBhbmQgcG9zc2libHkgcHJvY2Vzc2VkLCB0byBsaWJwbmcuICBPdGhlcndpc2Ugc2tpcCB0aGUKLSAgICAgICAqIGNodW5rLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIGZhdGFsIGVycm9yIGlmIHRoZSBjaHVuayBpcyBjcml0aWNhbC4KLSAgICAgICAqLwotICAgICAgZmlsZS0+c3RhdHVzX2NvZGUgfD0gQ1JDX0VSUk9SOwotCi0gICAgICAvKiBJZ25vcmUgdGhlIGJhZCBDUkMgICovCi0gICAgICBpZiAoZmlsZS0+Z2xvYmFsLT5za2lwICE9IFNLSVBfQkFEX0NSQykKLSAgICAgICAgIHR5cGVfbWVzc2FnZShmaWxlLCB0eXBlLCAiYmFkIENSQyIpOwotCi0gICAgICAvKiBUaGlzIHdpbGwgY2F1c2UgYW4gSUVORCB3aXRoIGEgYmFkIENSQyB0byBzdG9wICovCi0gICAgICBlbHNlIGlmIChDUklUSUNBTCh0eXBlKSkKLSAgICAgICAgIHN0b3AoZmlsZSwgUkVBRF9FUlJPUl9DT0RFLCAiYmFkIENSQyBpbiBjcml0aWNhbCBjaHVuayIpOwotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICB0eXBlX21lc3NhZ2UoZmlsZSwgdHlwZSwgInNraXBwZWQ6IGJhZCBDUkMiKTsKLQotICAgICAgICAgLyogTk9URTogdGhpcyBjYW5ub3QgYmUgcmVhY2hlZCBmb3IgSUVORCBiZWNhdXNlIGl0IGlzIGNyaXRpY2FsLiAqLwotICAgICAgICAgZ290byBza2lwX2NodW5rOwotICAgICAgfQotICAgfQotCi0gICAvKiBDaGVjayBmb3Igb3RoZXIgJ3NraXAnIGNhc2VzIGFuZCBoYW5kbGUgdGhlc2U7IHRoZXNlIG9ubHkgYXBwbHkgdG8KLSAgICAqIGFuY2lsbGFyeSBjaHVua3MgKGFuZCBub3QgdFJOUywgd2hpY2ggc2hvdWxkIHByb2JhYmx5IGhhdmUgYmVlbiBhIGNyaXRpY2FsCi0gICAgKiBjaHVuay4pCi0gICAgKi8KLSAgIGlmIChza2lwX2NodW5rX3R5cGUoZmlsZS0+Z2xvYmFsLCB0eXBlKSkKLSAgICAgIGdvdG8gc2tpcF9jaHVuazsKLQotICAgLyogVGhlIGNodW5rIG1heSBzdGlsbCBiZSBza2lwcGVkIGlmIHByb2JsZW1zIGFyZSBkZXRlY3RlZCBpbiB0aGUgTFogZGF0YSwKLSAgICAqIGhvd2V2ZXIgdGhlIExaIGRhdGEgY2hlY2sgcmVxdWlyZXMgYSBjaHVuay4gIEhhbmRsZSB0aGlzIGJ5IGluc3RhbnRpYXRpbmcKLSAgICAqIGEgY2h1bmsgdW5sZXNzIGFuIElEQVQgaXMgYWxyZWFkeSBpbnN0YW50aWF0ZWQgKElEQVQgY29udHJvbCBzdHJ1Y3R1cmVzCi0gICAgKiBpbnN0YW50aWF0ZSB0aGVpciBvd24gY2h1bmsuKQotICAgICovCi0gICBpZiAodHlwZSAhPSBwbmdfSURBVCkKLSAgICAgIGZpbGUtPmFsbG9jKGZpbGUsIDAvKmNodW5rKi8pOwotCi0gICBlbHNlIGlmIChmaWxlLT5pZGF0ID09IE5VTEwpCi0gICAgICBmaWxlLT5hbGxvYyhmaWxlLCAxLypJREFUKi8pOwotCi0gICBlbHNlCi0gICB7Ci0gICAgICAvKiBUaGUgY2h1bmsgbGVuZ3RoIG11c3QgYmUgdXBkYXRlZCBmb3IgcHJvY2Vzc19JREFUICovCi0gICAgICBhc3NlcnQoZmlsZS0+Y2h1bmsgIT0gTlVMTCk7Ci0gICAgICBhc3NlcnQoZmlsZS0+Y2h1bmstPmNodW5rX3R5cGUgPT0gcG5nX0lEQVQpOwotICAgICAgZmlsZS0+Y2h1bmstPmNodW5rX2xlbmd0aCA9IGZpbGUtPmxlbmd0aDsKLSAgIH0KLQotICAgLyogUmVjb3JkIHRoZSAnbmV4dCcgaW5mb3JtYXRpb24gdG9vLCBub3cgdGhhdCB0aGUgb3JpZ2luYWwgdmFsdWVzIGZvcgotICAgICogdGhpcyBjaHVuayBoYXZlIGJlZW4gY29waWVkLiAgTm90aWNlIHRoYXQgdGhlIElEQVQgY2h1bmtzIG9ubHkgbWFrZSBhCi0gICAgKiBjb3B5IG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2h1bmssIHRoaXMgaXMgZmluZSAtIHByb2Nlc3NfSURBVCBkb2VzCi0gICAgKiBub3QgbmVlZCB0aGUgcG9zaXRpb24gb2YgdGhpcyBjaHVuay4KLSAgICAqLwotICAgZmlsZS0+bGVuZ3RoID0gbmV4dF9sZW5ndGg7Ci0gICBmaWxlLT50eXBlID0gbmV4dF90eXBlOwotICAgZ2V0cG9zKGZpbGUpOwotCi0gICAvKiBEbyBwZXItdHlwZSBwcm9jZXNzaW5nLCBub3RlIHRoYXQgaWYgdGhpcyBjb2RlIGRvZXMgbm90IHJldHVybiBmcm9tIHRoZQotICAgICogZnVuY3Rpb24gdGhlIGNodW5rIHdpbGwgYmUgc2tpcHBlZC4gIFRoZSByZXdyaXRlIGlzIGNhbmNlbGxlZCBoZXJlIHNvIHRoYXQKLSAgICAqIGl0IGNhbiBiZSBzZXQgaW4gdGhlIHBlci1jaHVuayBwcm9jZXNzaW5nLgotICAgICovCi0gICBmaWxlLT5jaHVuay0+cmV3cml0ZV9sZW5ndGggPSAwOwotICAgZmlsZS0+Y2h1bmstPnJld3JpdGVfb2Zmc2V0ID0gMDsKLSAgIHN3aXRjaCAodHlwZSkKLSAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICByZXR1cm47Ci0KLSAgICAgIGNhc2UgcG5nX0lIRFI6Ci0gICAgICAgICAvKiBSZWFkIHRoaXMgbm93IGFuZCB1cGRhdGUgdGhlIGNvbnRyb2wgc3RydWN0dXJlIHdpdGggdGhlIGluZm9ybWF0aW9uCi0gICAgICAgICAgKiBpdCBjb250YWlucy4gIFRoZSBoZWFkZXIgaXMgdmFsaWRhdGVkIGNvbXBsZXRlbHkgdG8gZW5zdXJlIHRoaXMgaXMgYQotICAgICAgICAgICogUE5HLgotICAgICAgICAgICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzdHJ1Y3QgY2h1bmsgKmNodW5rID0gZmlsZS0+Y2h1bms7Ci0KLSAgICAgICAgICAgIGlmIChjaHVuay0+Y2h1bmtfbGVuZ3RoICE9IDEzKQotICAgICAgICAgICAgICAgc3RvcF9pbnZhbGlkKGZpbGUsICJJSERSIGxlbmd0aCIpOwotCi0gICAgICAgICAgICAvKiBSZWFkIGFsbCB0aGUgSUhEUiBpbmZvcm1hdGlvbiBhbmQgdmFsaWRhdGUgaXQuICovCi0gICAgICAgICAgICBzZXRwb3MoY2h1bmspOwotICAgICAgICAgICAgZmlsZS0+d2lkdGggPSByZXJlYWRfNChmaWxlKTsKLSAgICAgICAgICAgIGZpbGUtPmhlaWdodCA9IHJlcmVhZF80KGZpbGUpOwotICAgICAgICAgICAgZmlsZS0+Yml0X2RlcHRoID0gcmVyZWFkX2J5dGUoZmlsZSk7Ci0gICAgICAgICAgICBmaWxlLT5jb2xvcl90eXBlID0gcmVyZWFkX2J5dGUoZmlsZSk7Ci0gICAgICAgICAgICBmaWxlLT5jb21wcmVzc2lvbl9tZXRob2QgPSByZXJlYWRfYnl0ZShmaWxlKTsKLSAgICAgICAgICAgIGZpbGUtPmZpbHRlcl9tZXRob2QgPSByZXJlYWRfYnl0ZShmaWxlKTsKLSAgICAgICAgICAgIGZpbGUtPmludGVybGFjZV9tZXRob2QgPSByZXJlYWRfYnl0ZShmaWxlKTsKLQotICAgICAgICAgICAgLyogVGhpcyB2YWxpZGF0ZXMgYWxsIHRoZSBmaWVsZHMsIGFuZCBjYWxscyBzdG9wX2ludmFsaWQgaWYKLSAgICAgICAgICAgICAqIHRoZXJlIGlzIGEgcHJvYmxlbS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2FsY19pbWFnZV9zaXplKGZpbGUpOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAvKiBBbmNpbGxhcnkgY2h1bmtzIHRoYXQgcmVxdWlyZSBmdXJ0aGVyIHByb2Nlc3Npbmc6ICovCi0gICAgICBjYXNlIHBuZ196VFh0OiBjYXNlIHBuZ19pQ0NQOgotICAgICAgICAgaWYgKHByb2Nlc3NfelRYdF9pQ0NQKGZpbGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgY2h1bmtfZW5kKCZmaWxlLT5jaHVuayk7Ci0gICAgICAgICBmaWxlX3NldHBvcyhmaWxlLCAmZmlsZS0+ZGF0YV9wb3MpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgcG5nX2lUWHQ6Ci0gICAgICAgICBpZiAocHJvY2Vzc19pVFh0KGZpbGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgY2h1bmtfZW5kKCZmaWxlLT5jaHVuayk7Ci0gICAgICAgICBmaWxlX3NldHBvcyhmaWxlLCAmZmlsZS0+ZGF0YV9wb3MpOwotICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgcG5nX0lEQVQ6Ci0gICAgICAgICBpZiAocHJvY2Vzc19JREFUKGZpbGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgLyogRmlyc3QgcGFzczogKi8KLSAgICAgICAgIGFzc2VydChuZXh0X3R5cGUgPT0gcG5nX0lEQVQpOwotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIC8qIENvbnRyb2wgcmVhY2hlcyB0aGlzIHBvaW50IGlmIHRoZSBjaHVuayBtdXN0IGJlIHNraXBwZWQuICBGb3IgY2h1bmtzIG90aGVyCi0gICAgKiB0aGFuIElEQVQgdGhpcyBtZWFucyB0aGF0IHRoZSB6bGliIGNvbXByZXNzZWQgZGF0YSBpcyBmYXRhbGx5IGRhbWFuZ2VkIGFuZAotICAgICogdGhlIGNodW5rIHdpbGwgbm90IGJlIHBhc3NlZCB0byBsaWJwbmcuICBGb3IgSURBVCBpdCBtZWFucyB0aGF0IHRoZSBlbmQgb2YKLSAgICAqIHRoZSBJREFUIHN0cmVhbSBoYXMgbm90IHlldCBiZWVuIHJlYWNoZWQgYW5kIHdlIG11c3QgaGFuZGxlIHRoZSBuZXh0Ci0gICAgKiAoSURBVCkgY2h1bmsuICBJZiB0aGUgTFogZGF0YSBpbiBhbiBJREFUIHN0cmVhbSBjYW5ub3QgYmUgcmVhZCAnc3RvcCcgbXVzdAotICAgICogYmUgdXNlZCB0byBoYWx0IHBhcnNpbmcgb2YgdGhlIFBORy4KLSAgICAqLwotICAgcmVhZF9jaHVuayhmaWxlKTsKLSAgIHJldHVybjsKLQotICAgLyogVGhpcyBpcyB0aGUgZ2VuZXJpYyBjb2RlIHRvIHNraXAgdGhlIGN1cnJlbnQgY2h1bms7IHNpbXBseSBqdW1wIHRvIHRoZQotICAgICogbmV4dCBvbmUuCi0gICAgKi8KLXNraXBfY2h1bms6Ci0gICBmaWxlLT5sZW5ndGggPSBuZXh0X2xlbmd0aDsKLSAgIGZpbGUtPnR5cGUgPSBuZXh0X3R5cGU7Ci0gICBnZXRwb3MoZmlsZSk7Ci0gICByZWFkX2NodW5rKGZpbGUpOwotfQotCi1zdGF0aWMgcG5nX3VpbnRfMzIKLWdldDMyKHBuZ19ieXRlcCBidWZmZXIsIGludCBvZmZzZXQpCi0gICAvKiBSZWFkIGEgMzItYml0IHZhbHVlIGZyb20gYW4gOC1ieXRlIGNpcmN1bGFyIGJ1ZmZlciAodXNlZCBvbmx5IGJlbG93KS4KLSAgICAqLwotewotICAgcmV0dXJuCi0gICAgICAoYnVmZmVyWyBvZmZzZXQgICAgJiA3XSA8PCAyNCkgKwotICAgICAgKGJ1ZmZlclsob2Zmc2V0KzEpICYgN10gPDwgMTYpICsKLSAgICAgIChidWZmZXJbKG9mZnNldCsyKSAmIDddIDw8ICA4KSArCi0gICAgICAoYnVmZmVyWyhvZmZzZXQrMykgJiA3XSAgICAgICk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zeW5jX3N0cmVhbShzdHJ1Y3QgZmlsZSAqZmlsZSkKLSAgIC8qIFRoZSBzdHJlYW0gc2VlbXMgdG8gYmUgbWVzc2VkIHVwLCBhdHRlbXB0IHRvIHJlc3luYyBmcm9tIHRoZSBjdXJyZW50IGNodW5rCi0gICAgKiBoZWFkZXIuICBFeGVjdXRlcyBzdG9wIG9uIGEgZmF0YWwgZXJyb3IsIG90aGVyd2lzZSBjYWxscyBwcm9jZXNzX2NodW5rLgotICAgICovCi17Ci0gICBwbmdfdWludF8zMiBmaWxlX2NyYzsKLQotICAgZmlsZS0+c3RhdHVzX2NvZGUgfD0gU1RSRUFNX0VSUk9SOwotCi0gICBpZiAoZmlsZS0+Z2xvYmFsLT52ZXJib3NlKQotICAgewotICAgICAgZnB1dHMoIiBTWU5DICIsIHN0ZGVycik7Ci0gICAgICB0eXBlX25hbWUoZmlsZS0+dHlwZSwgc3RkZXJyKTsKLSAgICAgIHB1dGMoJ1xuJywgc3RkZXJyKTsKLSAgIH0KLQotICAgLyogUmV0dXJuIHRvIHRoZSBzdGFydCBvZiB0aGUgY2h1bmsgZGF0YSAqLwotICAgZmlsZV9zZXRwb3MoZmlsZSwgJmZpbGUtPmRhdGFfcG9zKTsKLSAgIGZpbGUtPnJlYWRfY291bnQgPSA4OwotCi0gICBpZiAocmVhZF80KGZpbGUsICZmaWxlX2NyYykgPT0gNCkgLyogZWxzZSBjb21wbGV0ZWx5IHRydW5jYXRlZCAqLwotICAgewotICAgICAgLyogSWdub3JlIHRoZSByZWNvcmRlZCBjaHVuayBsZW5ndGgsIHByb2NlZWQgdGhyb3VnaCB0aGUgZGF0YSBsb29raW5nIGZvcgotICAgICAgICogYSBsZWFkaW5nIHNlcXVlbmNlIG9mIGJ5dGVzIHRoYXQgbWF0Y2ggdGhlIENSQyBpbiB0aGUgZm9sbG93aW5nIGZvdXIKLSAgICAgICAqIGJ5dGVzLiAgRWFjaCB0aW1lIGEgbWF0Y2ggaXMgZm91bmQgY2hlY2sgdGhlIG5leHQgOCBieXRlcyBmb3IgYSB2YWxpZAotICAgICAgICogbGVuZ3RoLCBjaHVuay10eXBlIHBhaXIuCi0gICAgICAgKi8KLSAgICAgIHBuZ191aW50XzMyIGxlbmd0aDsKLSAgICAgIHBuZ191aW50XzMyIHR5cGUgPSBmaWxlLT50eXBlOwotICAgICAgcG5nX3VpbnRfMzIgY3JjID0gY3JjX2luaXRfNCh0eXBlKTsKLSAgICAgIHBuZ19ieXRlIGJ1ZmZlcls4XTsKLSAgICAgIHVuc2lnbmVkIGludCBucmVhZCA9IDAsIG51c2VkID0gMDsKLQotICAgICAgZm9yIChsZW5ndGg9MDsgbGVuZ3RoIDw9IDB4N2ZmZmZmZmY7ICsrbGVuZ3RoKQotICAgICAgewotICAgICAgICAgaW50IGNoOwotCi0gICAgICAgICBpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpID09IGZpbGVfY3JjKQotICAgICAgICAgewotICAgICAgICAgICAgLyogQSBtYXRjaCBvbiB0aGUgQ1JDOyBmb3IgSUVORCB0aGlzIGlzIHN1ZmZpY2llbnQsIGJ1dCBmb3IgYW55dGhpbmcKLSAgICAgICAgICAgICAqIGVsc2UgZXhwZWN0IGEgZm9sbG93aW5nIGNodW5rIGhlYWRlci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gcG5nX0lFTkQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBmaWxlLT5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICBwcm9jZXNzX2NodW5rKGZpbGUsIGZpbGVfY3JjLCAwLCAwKTsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLyogTmVlZCA4IGJ5dGVzICovCi0gICAgICAgICAgICAgICB3aGlsZSAobnJlYWQgPCA4K251c2VkKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2ggPSByZWFkX2J5dGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY2F0ZWQ7Ci0gICAgICAgICAgICAgICAgICBidWZmZXJbKG5yZWFkKyspICYgN10gPSAocG5nX2J5dGUpY2g7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIC8qIFByZXZlbnQgb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgICAgIG5yZWFkIC09IG51c2VkICYgfjc7Ci0gICAgICAgICAgICAgICBudXNlZCAtPSBudXNlZCAmIH43OyAvKiBvciwgbnVzZWQgJj0gNyA7LSkgKi8KLQotICAgICAgICAgICAgICAgLyogRXhhbWluZSB0aGUgOCBieXRlcyBmb3IgYSB2YWxpZCBjaHVuayBoZWFkZXIuICovCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBwbmdfdWludF8zMiBuZXh0X2xlbmd0aCA9IGdldDMyKGJ1ZmZlciwgbnVzZWQpOwotCi0gICAgICAgICAgICAgICAgICBpZiAobmV4dF9sZW5ndGggPCAweDdmZmZmZmZmKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgbmV4dF90eXBlID0gZ2V0MzIoYnVmZmVyLCBudXNlZCs0KTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGVfdmFsaWQobmV4dF90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUtPnJlYWRfY291bnQgLT0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY2h1bmsoZmlsZSwgZmlsZV9jcmMsIG5leHRfbGVuZ3RoLCBuZXh0X3R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAvKiBOb3QgdmFsaWQsIGtlZXAgZ29pbmcuICovCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIC8qIFRoaXMgY2F0Y2hlcyB1cCB3aXRoIHRoZSBjaXJjdWxhciBidWZmZXIgd2hpY2ggZ2V0cyBmaWxsZWQgYWJvdmUKLSAgICAgICAgICAqIHdoaWxlIGNoZWNraW5nIGEgY2h1bmsgaGVhZGVyLiAgVGhpcyBjb2RlIGlzIHNsaWdodGx5IHRyaWNreSAtIGlmCi0gICAgICAgICAgKiB0aGUgY2h1bmtfdHlwZSBpcyBJRU5EIHRoZSBidWZmZXIgd2lsbCBuZXZlciBiZSB1c2VkLCBpZiBpdCBpcyBub3QKLSAgICAgICAgICAqIHRoZSBjb2RlIHdpbGwgYWx3YXlzIHJlYWQgYWhlYWQgZXhhY3RseSA4IGJ5dGVzIGFuZCBwYXNzIHRoaXMgb24gdG8KLSAgICAgICAgICAqIHByb2Nlc3NfY2h1bmsuICBTbyB0aGUgaW52YXJpYW50IHRoYXQgSUVORCBsZWF2ZXMgdGhlIGZpbGUgcG9zaXRpb24KLSAgICAgICAgICAqIGFmdGVyIHRoZSBJRU5EIENSQyBhbmQgb3RoZXIgY2h1bmsgbGVhdmUgaXQgYWZ0ZXIgdGhlICpuZXh0KiBjaHVuawotICAgICAgICAgICogaGVhZGVyIGlzIG5vdCBicm9rZW4uCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChucmVhZCA8PSBudXNlZCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGNoID0gcmVhZF9ieXRlKGZpbGUpOwotCi0gICAgICAgICAgICBpZiAoY2ggPT0gRU9GKQotICAgICAgICAgICAgICAgZ290byB0cnVuY2F0ZWQ7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoID0gYnVmZmVyWygrK251c2VkKSAmIDddOwotCi0gICAgICAgICBjcmMgPSBjcmNfb25lX2J5dGUoY3JjLCBmaWxlX2NyYyA+PiAyNCk7Ci0gICAgICAgICBmaWxlX2NyYyA9IChmaWxlX2NyYyA8PCA4KSArIGNoOwotICAgICAgfQotCi0gICAgICAvKiBDb250cm9sIGdldHMgdG8gaGVyZSBpZiB3aGVuIDB4N2ZmZmZmZmYgYnl0ZXMgKHBsdXMgOCkgaGF2ZSBiZWVuIHJlYWQsCi0gICAgICAgKiBvaywgdHJlYXQgdGhpcyBhcyBhIGRhbWFnZWQgc3RyZWFtIHRvbzoKLSAgICAgICAqLwotICAgfQotCi10cnVuY2F0ZWQ6Ci0gICBzdG9wKGZpbGUsIFJFQURfRVJST1JfQ09ERSwgImRhbWFnZWQgUE5HIHN0cmVhbSIpOwotfQotCi1zdGF0aWMgdm9pZAotcmVhZF9jaHVuayhzdHJ1Y3QgZmlsZSAqZmlsZSkKLSAgIC8qIE9uIGVudHJ5IGZpbGU6OmRhdGFfcG9zIG11c3QgYmUgc2V0IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZQotICAgICogb2YgdGhlIGNodW5rIGRhdGEgKmFuZCogdGhlIGlucHV0IGZpbGUgbXVzdCBiZSBhdCB0aGlzIHBvc2l0aW9uLiAgVGhpcwotICAgICogcm91dGluZSAodmlhIHByb2Nlc3NfY2h1bmspIGluc3RhbnRpYXRlcyBhIGNodW5rIG9yIElEQVQgY29udHJvbCBzdHJ1Y3R1cmUKLSAgICAqIGJhc2VkIG9uIGZpbGU6Omxlbmd0aCBhbmQgZmlsZTo6dHlwZSBhbmQgYWxzbyByZXNldHMgdGhlc2UgZmllbGRzIGFuZAotICAgICogZmlsZTo6ZGF0YV9wb3MgZm9yIHRoZSBjaHVuayBhZnRlciB0aGlzIG9uZS4gIEZvciBhbiBJREFUIGNodW5rIHRoZSB3aG9sZQotICAgICogc3RyZWFtIG9mIElEQVRzIHdpbGwgYmUgcmVhZCwgdW50aWwgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gSURBVCBpcwotICAgICogZW5jb3VudGVyZWQsIGFuZCB0aGUgZmlsZSBmaWVsZHMgd2lsbCBiZSBzZXQgZm9yIHRoZSBjaHVuayBhZnRlciB0aGUgZW5kCi0gICAgKiBvZiB0aGUgc3RyZWFtIG9mIElEQVRzLgotICAgICoKLSAgICAqIEZvciBJRU5EIHRoZSBmaWxlOjp0eXBlIGZpZWxkIHdpbGwgYmUgc2V0IHRvIDAsIGFuZCBub3RoaW5nIGJleW9uZCB0aGUgZW5kCi0gICAgKiBvZiB0aGUgSUVORCBjaHVuayB3aWxsIGhhdmUgYmVlbiByZWFkLgotICAgICovCi17Ci0gICBwbmdfdWludF8zMiBsZW5ndGggPSBmaWxlLT5sZW5ndGg7Ci0gICBwbmdfdWludF8zMiB0eXBlID0gZmlsZS0+dHlwZTsKLQotICAgLyogQWZ0ZXIgSUVORCBmaWxlOjp0eXBlIGlzIHNldCB0byAwLCBpZiBsaWJwbmcgYXR0ZW1wdHMgdG8gcmVhZAotICAgICogbW9yZSBkYXRhIGF0IHRoaXMgcG9pbnQgdGhpcyBpcyBhIGJ1ZyBpbiBsaWJwbmcuCi0gICAgKi8KLSAgIGlmICh0eXBlID09IDApCi0gICAgICBzdG9wKGZpbGUsIFVORVhQRUNURURfRVJST1JfQ09ERSwgInJlYWQgYmV5b25kIElFTkQiKTsKLQotICAgaWYgKGZpbGUtPmdsb2JhbC0+dmVyYm9zZSA+IDIpCi0gICB7Ci0gICAgICBmcHV0cygiICAgIiwgc3RkZXJyKTsKLSAgICAgIHR5cGVfbmFtZSh0eXBlLCBzdGRlcnIpOwotICAgICAgZnByaW50ZihzdGRlcnIsICIgJWx1XG4iLCAodW5zaWduZWQgbG9uZylsZW5ndGgpOwotICAgfQotCi0gICAvKiBTdGFydCB0aGUgcmVhZF9jcmMgY2FsY3VsYXRpb24gd2l0aCB0aGUgY2h1bmsgdHlwZSwgdGhlbiByZWFkIHRvIHRoZSBlbmQKLSAgICAqIG9mIHRoZSBjaHVuayBkYXRhICh3aXRob3V0IHByb2Nlc3NpbmcgaXQgaW4gYW55IHdheSkgdG8gY2hlY2sgdGhhdCBpdCBpcwotICAgICogYWxsIHRoZXJlIGFuZCBjYWxjdWxhdGUgdGhlIENSQy4KLSAgICAqLwotICAgZmlsZS0+Y3JjID0gY3JjX2luaXRfNCh0eXBlKTsKLSAgIGlmIChjcmNfcmVhZF9tYW55KGZpbGUsIGxlbmd0aCkpIC8qIGVsc2UgaXQgd2FzIHRydW5jYXRlZCAqLwotICAgewotICAgICAgcG5nX3VpbnRfMzIgZmlsZV9jcmM7IC8qIENSQyByZWFkIGZyb20gZmlsZSAqLwotICAgICAgdW5zaWduZWQgaW50IG5yZWFkID0gcmVhZF80KGZpbGUsICZmaWxlX2NyYyk7Ci0KLSAgICAgIGlmIChucmVhZCA9PSA0KQotICAgICAgewotICAgICAgICAgaWYgKHR5cGUgIT0gcG5nX0lFTkQpIC8qIGRvIG5vdCByZWFkIGJleW9uZCBJRU5EICovCi0gICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfdWludF8zMiBuZXh0X2xlbmd0aDsKLQotICAgICAgICAgICAgbnJlYWQgKz0gcmVhZF80KGZpbGUsICZuZXh0X2xlbmd0aCk7Ci0gICAgICAgICAgICBpZiAobnJlYWQgPT0gOCAmJiBuZXh0X2xlbmd0aCA8PSAweDdmZmZmZmZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgbmV4dF90eXBlOwotCi0gICAgICAgICAgICAgICBucmVhZCArPSByZWFkXzQoZmlsZSwgJm5leHRfdHlwZSk7Ci0KLSAgICAgICAgICAgICAgIGlmIChucmVhZCA9PSAxMiAmJiBjaHVua190eXBlX3ZhbGlkKG5leHRfdHlwZSkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBBZGp1c3QgdGhlIHJlYWQgY291bnQgYmFjayB0byB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICogY2h1bmsuCi0gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIGZpbGUtPnJlYWRfY291bnQgLT0gODsKLSAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY2h1bmsoZmlsZSwgZmlsZV9jcmMsIG5leHRfbGVuZ3RoLCBuZXh0X3R5cGUpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlIC8qIElFTkQgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2Nlc3NfY2h1bmsoZmlsZSwgZmlsZV9jcmMsIDAsIDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICAvKiBDb250cm9sIGdldHMgdG8gaGVyZSBpZiB0aGUgdGhlIHN0cmVhbSBzZWVtcyBpbnZhbGlkIG9yIGRhbWFnZWQgaW4gc29tZQotICAgICogd2F5LiAgRWl0aGVyIHRoZXJlIHdhcyBhIHByb2JsZW0gcmVhZGluZyBhbGwgdGhlIGV4cGVjdGVkIGRhdGEgKHRoaXMKLSAgICAqIGNodW5rJ3MgZGF0YSwgaXRzIENSQyBhbmQgdGhlIGxlbmd0aCBhbmQgdHlwZSBvZiB0aGUgbmV4dCBjaHVuaykgb3IgdGhlCi0gICAgKiBuZXh0IGNodW5rIGxlbmd0aC90eXBlIGFyZSBpbnZhbGlkLiAgTm90aWNlIHRoYXQgdGhlIGNhc2VzIHRoYXQgZW5kIHVwCi0gICAgKiBoZXJlIGFsbCBjb3JyZXNwb25kIHRvIGNhc2VzIHRoYXQgd291bGQgb3RoZXJ3aXNlIHRlcm1pbmF0ZSB0aGUgcmVhZCBvZgotICAgICogdGhlIFBORyBmaWxlLgotICAgICovCi0gICBzeW5jX3N0cmVhbShmaWxlKTsKLX0KLQotLyogVGhpcyByZXR1cm5zIGEgZmlsZSogZnJvbSBhIHBuZ19zdHJ1Y3QgaW4gYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgd2F5LiAqLwotc3RhdGljIHN0cnVjdCBmaWxlICpnZXRfY29udHJvbChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cik7Ci0KLXN0YXRpYyB2b2lkIFBOR0NCQVBJCi1lcnJvcl9oYW5kbGVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKQotewotICAgc3RvcChnZXRfY29udHJvbChwbmdfcHRyKSwgIExJQlBOR19FUlJPUl9DT0RFLCBtZXNzYWdlKTsKLX0KLQotc3RhdGljIHZvaWQgUE5HQ0JBUEkKLXdhcm5pbmdfaGFuZGxlcihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSkKLXsKLSAgIHN0cnVjdCBmaWxlICpmaWxlID0gZ2V0X2NvbnRyb2wocG5nX3B0cik7Ci0KLSAgIGlmIChmaWxlLT5nbG9iYWwtPndhcm5pbmdzKQotICAgICAgZW1pdF9lcnJvcihmaWxlLCBMSUJQTkdfV0FSTklOR19DT0RFLCBtZXNzYWdlKTsKLX0KLQotLyogUmVhZCBjYWxsYmFjayAtIHRoaXMgaXMgd2hlcmUgdGhlIHdvcmsgZ2V0cyBkb25lIHRvIGNoZWNrIHRoZSBzdHJlYW0gYmVmb3JlCi0gKiBwYXNzaW5nIGl0IHRvIGxpYnBuZwotICovCi1zdGF0aWMgdm9pZCBQTkdDQkFQSQotcmVhZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmZmVyLCBzaXplX3QgY291bnQpCi0gICAvKiBSZXR1cm4gJ2NvdW50JyBieXRlcyB0byBsaWJwbmcgaW4gJ2J1ZmZlcicgKi8KLXsKLSAgIHN0cnVjdCBmaWxlICpmaWxlID0gZ2V0X2NvbnRyb2wocG5nX3B0cik7Ci0gICBwbmdfdWludF8zMiB0eXBlLCBsZW5ndGg7IC8qIEZvciB0aGUgY2h1bmsgYmUgKldSSVRURU4qICovCi0gICBzdHJ1Y3QgY2h1bmsgKmNodW5rOwotCi0gICAvKiBsaWJwbmcgc2hvdWxkIGFsd2F5cyBhc2sgZm9yIGF0IGxlYXN0IG9uZSBieXRlICovCi0gICBpZiAoY291bnQgPT0gMCkKLSAgICAgIHN0b3AoZmlsZSwgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFLCAicmVhZCBjYWxsYmFjayBmb3IgMCBieXRlcyIpOwotCi0gICAvKiBUaGUgY2FsbGJhY2sgYWx3YXlzIHJlYWRzIGFoZWFkIGJ5IDggYnl0ZXMgLSB0aGUgc2lnbmF0dXJlIG9yIGNodW5rIGhlYWRlcgotICAgICogLSB0aGVzZSBieXRlcyBhcmUgc3RvcmVkIGluIGNodW5rX2xlbmd0aCBhbmQgY2h1bmtfdHlwZS4gIFRoaXMgYmxvY2sgaXMKLSAgICAqIGV4ZWN1dGVkIG9uY2UgZm9yIHRoZSBzaWduYXR1cmUgYW5kIG9uY2UgZm9yIHRoZSBmaXJzdCBjaHVuayByaWdodCBhdCB0aGUKLSAgICAqIHN0YXJ0LgotICAgICovCi0gICBpZiAoZmlsZS0+cmVhZF9jb3VudCA8IDgpCi0gICB7Ci0gICAgICBhc3NlcnQoZmlsZS0+cmVhZF9jb3VudCA9PSAwKTsKLSAgICAgIGFzc2VydCgoZmlsZS0+c3RhdHVzX2NvZGUgJiBUUlVOQ0FURUQpID09IDApOwotCi0gICAgICAodm9pZClyZWFkXzQoZmlsZSwgJmZpbGUtPmxlbmd0aCk7Ci0KLSAgICAgIGlmIChmaWxlLT5yZWFkX2NvdW50ID09IDQpCi0gICAgICAgICAodm9pZClyZWFkXzQoZmlsZSwgJmZpbGUtPnR5cGUpOwotCi0gICAgICBpZiAoZmlsZS0+cmVhZF9jb3VudCA8IDgpCi0gICAgICB7Ci0gICAgICAgICBhc3NlcnQoKGZpbGUtPnN0YXR1c19jb2RlICYgVFJVTkNBVEVEKSAhPSAwKTsKLSAgICAgICAgIHN0b3AoZmlsZSwgUkVBRF9FUlJPUl9DT0RFLCAibm90IGEgUE5HICh0b28gc2hvcnQpIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaWxlLT5zdGF0ZSA9PSBTVEFURV9TSUdOQVRVUkUpCi0gICAgICB7Ci0gICAgICAgICBpZiAoZmlsZS0+bGVuZ3RoICE9IHNpZzEgfHwgZmlsZS0+dHlwZSAhPSBzaWcyKQotICAgICAgICAgICAgc3RvcChmaWxlLCBMSUJQTkdfRVJST1JfQ09ERSwgIm5vdCBhIFBORyAoc2lnbmF0dXJlKSIpOwotCi0gICAgICAgICAvKiBFbHNlIHdyaXRlIGl0ICh0aGlzIGlzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB3cml0ZV9jb3VudCwgcHJpb3IgdG8KLSAgICAgICAgICAqIHRoaXMgaXQgY29udGFpbnMgQ0xFQVIgZ2FyYmFnZS4pCi0gICAgICAgICAgKi8KLSAgICAgICAgIGZpbGUtPndyaXRlX2NvdW50ID0gMDsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgYXNzZXJ0KGZpbGUtPnN0YXRlID09IFNUQVRFX0NIVU5LUyk7Ci0KLSAgICAgICAgIC8qIFRoZSBmaXJzdCBjaHVuayBtdXN0IGJlIGEgd2VsbCBmb3JtZWQgSUhEUiAodGhpcyBjb3VsZCBiZSByZWxheGVkIHRvCi0gICAgICAgICAgKiB1c2UgdGhlIGNoZWNrcyBpbiBwcm9jZXNzX2NodW5rLCBidXQgdGhhdCBzZWVtcyB1bm5lY2Vzc2FyeS4pCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChmaWxlLT5sZW5ndGggIT0gMTMgfHwgZmlsZS0+dHlwZSAhPSBwbmdfSUhEUikKLSAgICAgICAgICAgIHN0b3AoZmlsZSwgTElCUE5HX0VSUk9SX0NPREUsICJub3QgYSBQTkcgKElIRFIpIik7Ci0KLSAgICAgICAgIC8qIFRoZSBwb3NpdGlvbiBvZiB0aGUgZGF0YSBtdXN0IGJlIHN0b3JlZCB0b28gKi8KLSAgICAgICAgIGdldHBvcyhmaWxlKTsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogUmV0cmlldmUgcHJldmlvdXMgc3RhdGUgKGJlY2F1c2UgdGhlIHJlYWQgY2FsbGJhY2tzIGFyZSBtYWRlIHByZXR0eSBtdWNoCi0gICAgKiBieXRlLWJ5LWJ5dGUgaW4gdGhlIHNlcXVlbnRpYWwgcmVhZGVyIHByaW9yIHRvIDEuNykuCi0gICAgKi8KLSAgIGNodW5rID0gZmlsZS0+Y2h1bms7Ci0KLSAgIGlmIChjaHVuayAhPSBOVUxMKQotICAgewotICAgICAgbGVuZ3RoID0gY2h1bmstPmNodW5rX2xlbmd0aDsKLSAgICAgIHR5cGUgPSBjaHVuay0+Y2h1bmtfdHlwZTsKLSAgIH0KLQotICAgZWxzZQotICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgc2lnbmF0dXJlIGNhc2U7IGZvciBJREFUIGFuZCBvdGhlciBjaHVua3MgdGhlc2UgdmFsdWVzIHdpbGwKLSAgICAgICAqIGJlIG92ZXJ3cml0dGVuIHdoZW4gcmVhZF9jaHVuayBpcyBjYWxsZWQgYmVsb3cuCi0gICAgICAgKi8KLSAgICAgIGxlbmd0aCA9IGZpbGUtPmxlbmd0aDsKLSAgICAgIHR5cGUgPSBmaWxlLT50eXBlOwotICAgfQotCi0gICBkbwotICAgewotICAgICAgcG5nX3VpbnRfMzIgYjsKLQotICAgICAgLyogQ29tcGxldGUgdGhlIHJlYWQgb2YgYSBjaHVuazsgYXMgYSBzaWRlIGVmZmVjdCB0aGlzIGFsc28gaW5zdGFudGlhdGVzCi0gICAgICAgKiBhIGNodW5rIGNvbnRyb2wgc3RydWN0dXJlIGFuZCBzZXRzIHRoZSBmaWxlIGxlbmd0aC90eXBlL2RhdGFfcG9zIGZpZWxkcwotICAgICAgICogZm9yIHRoZSAqTkVYVCogY2h1bmsgaGVhZGVyLgotICAgICAgICoKLSAgICAgICAqIE5PVEU6IGF0IGFuIElEQVQgYW55IGZvbGxvd2luZyBJREFUIGNodW5rcyB3aWxsIGFsc28gYmUgcmVhZCBhbmQgdGhlCi0gICAgICAgKiBuZXh0XyBmaWVsZHMgd2lsbCByZWZlciB0byB0aGUgY2h1bmsgYWZ0ZXIgdGhlIGxhc3QgSURBVC4KLSAgICAgICAqCi0gICAgICAgKiBOT1RFOiByZWFkX2NodW5rIG9ubHkgcmV0dXJucyB3aGVuIGl0IGhhcyByZWFkIGEgY2h1bmsgdGhhdCBtdXN0IG5vdyBiZQotICAgICAgICogd3JpdHRlbi4KLSAgICAgICAqLwotICAgICAgaWYgKGZpbGUtPnN0YXRlICE9IFNUQVRFX1NJR05BVFVSRSAmJiBjaHVuayA9PSBOVUxMKQotICAgICAgewotICAgICAgICAgYXNzZXJ0KGZpbGUtPnJlYWRfY291bnQgPT0gOCk7Ci0gICAgICAgICBhc3NlcnQoZmlsZS0+aWRhdCA9PSBOVUxMKTsKLSAgICAgICAgIHJlYWRfY2h1bmsoZmlsZSk7Ci0gICAgICAgICBjaHVuayA9IGZpbGUtPmNodW5rOwotICAgICAgICAgYXNzZXJ0KGNodW5rICE9IE5VTEwpOwotCi0gICAgICAgICAvKiBEbyB0aGUgaW5pdGlhbGl6YXRpb24gdGhhdCB3YXMgbm90IGRvbmUgYmVmb3JlLiAqLwotICAgICAgICAgbGVuZ3RoID0gY2h1bmstPmNodW5rX2xlbmd0aDsKLSAgICAgICAgIHR5cGUgPSBjaHVuay0+Y2h1bmtfdHlwZTsKLQotICAgICAgICAgLyogQW5kIHN0YXJ0IHdyaXRpbmcgdGhlIG5ldyBjaHVuay4gKi8KLSAgICAgICAgIGZpbGUtPndyaXRlX2NvdW50ID0gMDsKLSAgICAgIH0KLQotICAgICAgLyogVGhlIGNodW5rXyBmaWVsZHMgZGVzY3JpYmUgYSBjaHVuayB0aGF0IG11c3QgYmUgd3JpdHRlbiwgb3IgaG9sZCB0aGUKLSAgICAgICAqIHNpZ25hdHVyZS4gIFdyaXRlIHRoZSBoZWFkZXIgZmlyc3QuICBJbiB0aGUgc2lnbmF0dXJlIGNhc2UgdGhpcwotICAgICAgICogcmV3cml0ZXMgdGhlIHNpZ25hdHVyZS4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaWxlLT53cml0ZV9jb3VudCkKLSAgICAgIHsKLSAgICAgICAgIGNhc2UgMDogYiA9IGxlbmd0aCA+PiAyNDsgYnJlYWs7Ci0gICAgICAgICBjYXNlIDE6IGIgPSBsZW5ndGggPj4gMTY7IGJyZWFrOwotICAgICAgICAgY2FzZSAyOiBiID0gbGVuZ3RoID4+ICA4OyBicmVhazsKLSAgICAgICAgIGNhc2UgMzogYiA9IGxlbmd0aCAgICAgIDsgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgNDogYiA9IHR5cGUgPj4gMjQ7IGJyZWFrOwotICAgICAgICAgY2FzZSA1OiBiID0gdHlwZSA+PiAxNjsgYnJlYWs7Ci0gICAgICAgICBjYXNlIDY6IGIgPSB0eXBlID4+ICA4OyBicmVhazsKLSAgICAgICAgIGNhc2UgNzogYiA9IHR5cGUgICAgICA7IGJyZWFrOwotCi0gICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAvKiBUaGUgaGVhZGVyIGhhcyBiZWVuIHdyaXR0ZW4uICBJZiB0aGlzIGlzIHJlYWxseSB0aGUgc2lnbmF0dXJlCi0gICAgICAgICAgICAgKiB0aGF0J3MgYWxsIHRoYXQgaXMgcmVxdWlyZWQgYW5kIHdlIGNhbiBnbyB0byBub3JtYWwgY2h1bmsKLSAgICAgICAgICAgICAqIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChmaWxlLT5zdGF0ZSA9PSBTVEFURV9TSUdOQVRVUkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBUaGUgc2lnbmF0dXJlIGhhcyBiZWVuIHdyaXR0ZW4sIHRoZSB0YWlsIGNhbGwgdG8gcmVhZF9jYWxsYmFjawotICAgICAgICAgICAgICAgICogYmVsb3cgKGl0J3MganVzdCBhIGdvdG8gdG8gdGhlIHN0YXJ0IHdpdGggYSBkZWNlbnQgY29tcGlsZXIpCi0gICAgICAgICAgICAgICAgKiB3aWxsIHJlYWQgdGhlIElIRFIgaGVhZGVyIGFoZWFkIGFuZCB2YWxpZGF0ZSBpdC4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgYXNzZXJ0KGxlbmd0aCA9PSBzaWcxICYmIHR5cGUgPT0gc2lnMik7Ci0gICAgICAgICAgICAgICBmaWxlLT5yZWFkX2NvdW50ID0gMDsgLyogRm9yY2VzIGEgaGVhZGVyIHJlYWQgKi8KLSAgICAgICAgICAgICAgIGZpbGUtPnN0YXRlID0gU1RBVEVfQ0hVTktTOyAvKiBJSERSOiBjaGVja2VkIGFib3ZlICovCi0gICAgICAgICAgICAgICByZWFkX2NhbGxiYWNrKHBuZ19wdHIsIGJ1ZmZlciwgY291bnQpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBhc3NlcnQoY2h1bmsgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgIC8qIFNldCB1cCBmb3Igd3JpdGUsIG5vdGljZSB0aGF0IHJlcG9zaXRpb25pbmcgdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICogaXMgb25seSBuZWNlc3NhcnkgaWYgc29tZXRoaW5nIGlzIHRvIGJlIHJlYWQgZnJvbSBpdC4gIEFsc28KLSAgICAgICAgICAgICAgICAqIG5vdGljZSB0aGF0IGZvciB0aGUgSURBVCBzdHJlYW0gdGhpcyBtdXN0IG9ubHkgaGFwcGVuIG9uY2UgLQotICAgICAgICAgICAgICAgICogb24gdGhlIGZpcnN0IElEQVQgLSB0byBnZXQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3QgYW5kCi0gICAgICAgICAgICAgICAgKiB0aGlzIGlzIGRvbmUgaW5zaWRlIHByb2Nlc3NfSURBVDoKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgY2h1bmstPndyaXRlX2NyYyA9IGNyY19pbml0XzQodHlwZSk7Ci0gICAgICAgICAgICAgICBpZiAoZmlsZS0+c3RhdGUgIT0gU1RBVEVfSURBVCAmJiBsZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgc2V0cG9zKGNodW5rKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXNzZXJ0KGNodW5rICE9IE5VTEwpOwotCi0gICAgICAgICAgICAvKiBOT1RFOiB0aGUgYXJpdGhtZXRpYyBiZWxvdyBvdmVyZmxvd3MgYW5kIGdpdmVzIGEgbGFyZ2UgcG9zaXRpdmUKLSAgICAgICAgICAgICAqIHBuZ191aW50XzMyIHZhbHVlIHVudGlsIHRoZSB3aG9sZSBjaHVuayBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN3aXRjaCAoZmlsZS0+d3JpdGVfY291bnQgLSBsZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvKiBXcml0ZSB0aGUgY2h1bmsgZGF0YSwgbm9ybWFsbHkgdGhpcyBqdXN0IGNvbWVzIGZyb20KLSAgICAgICAgICAgICAgICAqIHRoZSBmaWxlLiAgVGhlIG9ubHkgZXhjZXB0aW9uIGlzIGZvciB0aGF0IHBhcnQgb2YgYQotICAgICAgICAgICAgICAgICogY2h1bmsgd2hpY2ggaXMgemxpYiBkYXRhIGFuZCB3aGljaCBtdXN0IGJlIHJld3JpdHRlbiwKLSAgICAgICAgICAgICAgICAqIGFuZCBJREFUIGNodW5rcyB3aGljaCBjYW4gYmUgY29tcGxldGVseQotICAgICAgICAgICAgICAgICogcmVjb25zdHJ1Y3RlZC4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5zdGF0ZSA9PSBTVEFURV9JREFUKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IElEQVQgKmlkYXQgPSBmaWxlLT5pZGF0OwotCi0gICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaWRhdCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCBhbiBJREFUIGJ5dGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIG9mIElEQVQgY2h1bmtzLgotICAgICAgICAgICAgICAgICAgICAgICogQmVjYXVzZSB0aGUgSURBVCBzdHJlYW0gY2FuIGJlIHJlLWNodW5rZWQgdGhpcyBzdHJlYW0gaXMKLSAgICAgICAgICAgICAgICAgICAgICAqIGhlbGQgaW4gdGhlIHN0cnVjdCBJREFUIG1lbWJlcnMuICBUaGUgY2h1bmsgbWVtYmVycywgaW4KLSAgICAgICAgICAgICAgICAgICAgICAqIHBhcnRpY3VsYXIgY2h1bmtfbGVuZ3RoIChhbmQgdGhlcmVmb3JlIHRoZSBsZW5ndGggbG9jYWwpCi0gICAgICAgICAgICAgICAgICAgICAgKiByZWZlciB0byB0aGUgb3V0cHV0IGNodW5rLgotICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWRhdC0+aWRhdF9pbmRleCA+PSBpZGF0LT5pZGF0X2xlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2Ugb25lIGNodW5rICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSURBVF9saXN0ICpjdXIgPSBpZGF0LT5pZGF0X2N1cjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGlkYXQtPmlkYXRfaW5kZXggPT0gaWRhdC0+aWRhdF9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGN1ciAhPSBOVUxMICYmIGN1ci0+Y291bnQgPiAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9URTogSURBVF9saXN0Ojpjb3VudCBoZXJlLCBub3QgSURBVF9saXN0OjpsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrKyhpZGF0LT5pZGF0X2NvdW50KSA+PSBjdXItPmNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGlkYXQtPmlkYXRfY291bnQgPT0gY3VyLT5jb3VudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vdmUgb24gdG8gdGhlIG5leHQgSURBVF9saXN0OiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGFuIGludGVybmFsIGVycm9yIC0gcmVhZCBiZXlvbmQgdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHByZS1jYWxjdWxhdGVkIHN0cmVhbS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciA9PSBOVUxMIHx8IGN1ci0+Y291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoZmlsZSwgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgYmV5b25kIGVuZCBvZiBJREFUIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkYXQtPmlkYXRfY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRhdC0+aWRhdF9jdXIgPSBjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlkYXQtPmlkYXRfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogWmVybyBsZW5ndGggSURBVCBjaHVua3MgYXJlIHBlcm1pdHRlZCwgc28gdGhlIGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICogaGVyZSBtYXkgYmUgMC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWRhdC0+aWRhdF9sZW5ndGggPSBjdXItPmxlbmd0aHNbaWRhdC0+aWRhdF9jb3VudF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFuZCBza2lwIDEyIGJ5dGVzIHRvIHRoZSBuZXh0IGNodW5rIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfMTIoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBpbmRleCBpcyBhbHdheXMgdGhhdCBvZiB0aGUgbmV4dCBieXRlLCB0aGUgcmVzdCBvZgotICAgICAgICAgICAgICAgICAgICAgICogdGhlIGluZm9ybWF0aW9uIGlzIGFsd2F5cyB0aGUgY3VycmVudCBJREFUIGNodW5rIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAqIGN1cnJlbnQgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgKysoaWRhdC0+aWRhdF9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICAgICAgICAgICAgICAgICAgYiA9IHJlcmVhZF9ieXRlKGZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgYnl0ZSBtdXN0IGJlIHJld3JpdHRlbiBoYW5kbGUgdGhhdCBoZXJlICovCi0gICAgICAgICAgICAgICAgICBpZiAoY2h1bmstPnJld3JpdGVfbGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuay0+cmV3cml0ZV9vZmZzZXQgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgLS0oY2h1bmstPnJld3JpdGVfb2Zmc2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGNodW5rLT5yZXdyaXRlX2J1ZmZlclswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoY2h1bmstPnJld3JpdGVfYnVmZmVyLCBjaHVuay0+cmV3cml0ZV9idWZmZXIrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YgY2h1bmstPnJld3JpdGVfYnVmZmVyKS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YgY2h1bmstPnJld3JpdGVfYnVmZmVyWzBdKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0tKGNodW5rLT5yZXdyaXRlX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIGNodW5rLT53cml0ZV9jcmMgPSBjcmNfb25lX2J5dGUoY2h1bmstPndyaXRlX2NyYywgYik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgLyogVGhlIENSQyBpcyB3cml0dGVuIGF0OgotICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAqICAgIGNodW5rX3dyaXRlID09IGNodW5rX2xlbmd0aCs4Li5jaHVua19sZW5ndGgrMTEKLSAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgKiBzbyA4IHRvIDExLiAgVGhlIENSQyBpcyBub3QgKHlldCkgY29uZGl0aW9uZWQuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIGNhc2UgIDg6IGIgPSBjaHVuay0+d3JpdGVfY3JjID4+IDI0OyBnb3RvIHdyaXRlX2NyYzsKLSAgICAgICAgICAgICAgIGNhc2UgIDk6IGIgPSBjaHVuay0+d3JpdGVfY3JjID4+IDE2OyBnb3RvIHdyaXRlX2NyYzsKLSAgICAgICAgICAgICAgIGNhc2UgMTA6IGIgPSBjaHVuay0+d3JpdGVfY3JjID4+ICA4OyBnb3RvIHdyaXRlX2NyYzsKLSAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICAvKiBUaGlzIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUgY2h1bmtfZW5kIGJlbG93OiAqLwotICAgICAgICAgICAgICAgICAgYiA9IGNodW5rLT53cml0ZV9jcmM7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5nbG9iYWwtPnZlcmJvc2UgPiAyKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgZnB1dHMoIiAgICIsIHN0ZGVycik7Ci0gICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUodHlwZSwgc3RkZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICVsdSAweCUuOHhcbiIsICh1bnNpZ25lZCBsb25nKWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLT53cml0ZV9jcmMgXiAweGZmZmZmZmZmKTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgLyogVGhlIElEQVQgc3RyZWFtIGlzIHdyaXR0ZW4gd2l0aG91dCBhIGNhbGwgdG8gcmVhZF9jaHVuawotICAgICAgICAgICAgICAgICAgICogdW50aWwgdGhlIGVuZCBpcyByZWFjaGVkLiAgcmVjaHVua19sZW5ndGgoKSBjYWxjdWxhdGVzIHRoZQotICAgICAgICAgICAgICAgICAgICogbGVuZ3RoIG9mIHRoZSBvdXRwdXQgY2h1bmtzLiAgQ29udHJvbCBnZXRzIHRvIHRoaXMgcG9pbnQgYXQKLSAgICAgICAgICAgICAgICAgICAqIHRoZSBlbmQgb2YgYW4gKm91dHB1dCogY2h1bmsgLSB0aGUgbGVuZ3RoIGNhbGN1bGF0ZWQgYnkKLSAgICAgICAgICAgICAgICAgICAqIHJlY2h1bmtfbGVuZ3RoLiAgSWYgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZW5kIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICogaW5wdXQgc3RyZWFtIHN0b3Agd3JpdGluZyBJREFUIGNodW5rcywgb3RoZXJ3aXNlIGNvbnRpbnVlLgotICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+c3RhdGUgPT0gU1RBVEVfSURBVCAmJgotICAgICAgICAgICAgICAgICAgICAgKGZpbGUtPmlkYXQtPmlkYXRfaW5kZXggPCBmaWxlLT5pZGF0LT5pZGF0X2xlbmd0aCB8fAotICAgICAgICAgICAgICAgICAgICAgIDErZmlsZS0+aWRhdC0+aWRhdF9jb3VudCA8IGZpbGUtPmlkYXQtPmlkYXRfY3VyLT5jb3VudCB8fAotICAgICAgICAgICAgICAgICAgICAgIGZpbGUtPmlkYXQtPmlkYXRfY3VyICE9IGZpbGUtPmlkYXQtPmlkYXRfbGlzdF90YWlsKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGFub3RoZXIgSURBVCBjaHVuay4gIENhbGwgcmVjaHVua19sZW5ndGggdG8KLSAgICAgICAgICAgICAgICAgICAgICAqIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIHJlcXVpcmVkLgotICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBjaHVuay0+Y2h1bmtfbGVuZ3RoID0gcmVjaHVua19sZW5ndGgoZmlsZS0+aWRhdCk7Ci0gICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHlwZSA9PSBwbmdfSURBVCk7Ci0gICAgICAgICAgICAgICAgICAgICBmaWxlLT53cml0ZV9jb3VudCA9IDA7IC8qIGZvciB0aGUgbmV3IGNodW5rICovCi0gICAgICAgICAgICAgICAgICAgICAtLShmaWxlLT53cml0ZV9jb3VudCk7IC8qIGZha2Ugb3V0IHRoZSBpbmNyZW1lbnQgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgLyogRW50ZXJlZCBhdCB0aGUgZW5kIG9mIGEgbm9uLUlEQVQgY2h1bmsgYW5kIGF0IHRoZSBlbmQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBJREFUIHN0cmVhbS4gIFRoZSByZXdyaXRlIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rLT5yZXdyaXRlX2xlbmd0aCA+IDAgfHwgY2h1bmstPnJld3JpdGVfb2Zmc2V0ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoZmlsZSwgVU5FWFBFQ1RFRF9FUlJPUl9DT0RFLCAicGVuZGluZyByZXdyaXRlIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIGxhc3QgYnl0ZSBzbyByZXNldCBjaHVua19yZWFkIGZvciB0aGUgbmV4dAotICAgICAgICAgICAgICAgICAgICAgICogY2h1bmsgYW5kIG1vdmUgdGhlIGlucHV0IGZpbGUgdG8gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICogKm5leHQqIGNodW5rIGhlYWRlciBpZiByZXF1aXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgZmlsZS0+cmVhZF9jb3VudCA9IDg7Ci0gICAgICAgICAgICAgICAgICAgICBmaWxlX3NldHBvcyhmaWxlLCAmZmlsZS0+ZGF0YV9wb3MpOwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+aWRhdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfZW5kKCZmaWxlLT5jaHVuayk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIElEQVRfZW5kKCZmaWxlLT5pZGF0KTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgd3JpdGVfY3JjOgotICAgICAgICAgICAgICAgICAgYiBePSAweGZmOyAvKiBjb25kaXRpb25pbmcgKi8KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFdyaXRlIG9uZSBieXRlICovCi0gICAgICBiICY9IDB4ZmY7Ci0gICAgICAqYnVmZmVyKysgPSAocG5nX2J5dGUpYjsKLSAgICAgIC0tY291bnQ7Ci0gICAgICB3cml0ZV9ieXRlKGZpbGUsIChwbmdfYnl0ZSliKTsgLyogaW5jcmVtZW50cyBjaHVua193cml0ZSAqLwotICAgfQotICAgd2hpbGUgKGNvdW50ID4gMCk7Ci19Ci0KLS8qIEJ1bmRsZSB0aGUgZmlsZSBhbmQgYW4gdW5pbml0aWFsaXplZCBjaHVuayBhbmQgSURBVCBjb250cm9sIHN0cnVjdHVyZQotICogdG9nZXRoZXIgdG8gYWxsb3cgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNodW5rL0lEQVQgYWxsb2NhdGUgcm91dGluZS4KLSAqLwotc3RydWN0IGNvbnRyb2wKLXsKLSAgIHN0cnVjdCBmaWxlICBmaWxlOwotICAgc3RydWN0IGNodW5rIGNodW5rOwotICAgc3RydWN0IElEQVQgIGlkYXQ7Ci19OwotCi1zdGF0aWMgaW50Ci1jb250cm9sX2VuZChzdHJ1Y3QgY29udHJvbCAqY29udHJvbCkKLXsKLSAgIHJldHVybiBmaWxlX2VuZCgmY29udHJvbC0+ZmlsZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZSAqCi1nZXRfY29udHJvbChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0cikKLXsKLSAgIC8qIFRoaXMganVzdCByZXR1cm5zIHRoZSAoZmlsZSopLiAgVGhlIGNodW5rIGFuZCBpZGF0IGNvbnRyb2wgc3RydWN0dXJlcwotICAgICogZG9uJ3QgYWx3YXlzIGV4aXN0LgotICAgICovCi0gICBzdHJ1Y3QgY29udHJvbCAqY29udHJvbCA9IHZvaWRjYXN0KHN0cnVjdCBjb250cm9sKiwKLSAgICAgIHBuZ19nZXRfZXJyb3JfcHRyKHBuZ19wdHIpKTsKLSAgIHJldHVybiAmY29udHJvbC0+ZmlsZTsKLX0KLQotc3RhdGljIHZvaWQKLWFsbG9jYXRlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgYWxsb2NhdGVfaWRhdCkKLXsKLSAgIHN0cnVjdCBjb250cm9sICpjb250cm9sID0gdm9pZGNhc3Qoc3RydWN0IGNvbnRyb2wqLCBmaWxlLT5hbGxvY19wdHIpOwotCi0gICBpZiAoYWxsb2NhdGVfaWRhdCkKLSAgIHsKLSAgICAgIGFzc2VydChmaWxlLT5pZGF0ID09IE5VTEwpOwotICAgICAgSURBVF9pbml0KCZjb250cm9sLT5pZGF0LCBmaWxlKTsKLSAgIH0KLQotICAgZWxzZSAvKiBjaHVuayAqLwotICAgewotICAgICAgYXNzZXJ0KGZpbGUtPmNodW5rID09IE5VTEwpOwotICAgICAgY2h1bmtfaW5pdCgmY29udHJvbC0+Y2h1bmssIGZpbGUpOwotICAgfQotfQotCi1zdGF0aWMgaW50Ci1jb250cm9sX2luaXQoc3RydWN0IGNvbnRyb2wgKmNvbnRyb2wsIHN0cnVjdCBnbG9iYWwgKmdsb2JhbCwKLSAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgY29uc3QgY2hhciAqb3V0X25hbWUpCi0gICAvKiBUaGlzIHdyYXBzIGZpbGVfaW5pdCgmY29udHJvbDo6ZmlsZSkgYW5kIHNpbXBseSByZXR1cm5zIHRoZSByZXN1bHQgZnJvbQotICAgICogZmlsZV9pbml0LgotICAgICovCi17Ci0gICByZXR1cm4gZmlsZV9pbml0KCZjb250cm9sLT5maWxlLCBnbG9iYWwsIGZpbGVfbmFtZSwgb3V0X25hbWUsIGNvbnRyb2wsCi0gICAgICBhbGxvY2F0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlYWRfcG5nKHN0cnVjdCBjb250cm9sICpjb250cm9sKQotICAgLyogUmVhZCBhIFBORywgcmV0dXJuIDAgb24gc3VjY2VzcyBlbHNlIGFuIGVycm9yIChzdGF0dXMpIGNvZGU7IGEgYml0IG1hc2sgYXMKLSAgICAqIGRlZmluZWQgZm9yIGZpbGU6OnN0YXR1c19jb2RlIGFzIGFib3ZlLgotICAgICovCi17Ci0gICBwbmdfc3RydWN0cCBwbmdfcHRyOwotICAgcG5nX2luZm9wIGluZm9fcHRyID0gTlVMTDsKLSAgIHZvbGF0aWxlIGludCByYzsKLQotICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBjb250cm9sLAotICAgICAgZXJyb3JfaGFuZGxlciwgd2FybmluZ19oYW5kbGVyKTsKLQotICAgaWYgKHBuZ19wdHIgPT0gTlVMTCkKLSAgIHsKLSAgICAgIC8qIFRoaXMgaXMgbm90IHJlYWxseSBleHBlY3RlZC4gKi8KLSAgICAgIGxvZ19lcnJvcigmY29udHJvbC0+ZmlsZSwgTElCUE5HX0VSUk9SX0NPREUsICJPT00gYWxsb2NhdGluZyBwbmdfc3RydWN0Iik7Ci0gICAgICBjb250cm9sLT5maWxlLnN0YXR1c19jb2RlIHw9IElOVEVSTkFMX0VSUk9SOwotICAgICAgcmV0dXJuIExJQlBOR19FUlJPUl9DT0RFOwotICAgfQotCi0gICByYyA9IHNldGptcChjb250cm9sLT5maWxlLmptcGJ1Zik7Ci0gICBpZiAocmMgPT0gMCkKLSAgIHsKLSMgICAgIGlmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECi0gICAgICAgICAvKiBSZW1vdmUgYW55IGxpbWl0cyBvbiB0aGUgc2l6ZSBvZiBQTkcgZmlsZXMgdGhhdCBjYW4gYmUgcmVhZCwKLSAgICAgICAgICAqIHdpdGhvdXQgdGhpcyB3ZSBtYXkgcmVqZWN0IGZpbGVzIGJhc2VkIG9uIGJ1aWx0LWluIHNhZmV0eQotICAgICAgICAgICogbGltaXRzLgotICAgICAgICAgICovCi0gICAgICAgICBwbmdfc2V0X3VzZXJfbGltaXRzKHBuZ19wdHIsIDB4N2ZmZmZmZmYsIDB4N2ZmZmZmZmYpOwotICAgICAgICAgcG5nX3NldF9jaHVua19jYWNoZV9tYXgocG5nX3B0ciwgMCk7Ci0gICAgICAgICBwbmdfc2V0X2NodW5rX21hbGxvY19tYXgocG5nX3B0ciwgMCk7Ci0jICAgICBlbmRpZgotCi0gICAgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgY29udHJvbCwgcmVhZF9jYWxsYmFjayk7Ci0KLSAgICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgICAgIGlmIChpbmZvX3B0ciA9PSBOVUxMKQotICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJPT00gYWxsb2NhdGluZyBpbmZvIHN0cnVjdHVyZSIpOwotCi0gICAgICBpZiAoY29udHJvbC0+ZmlsZS5nbG9iYWwtPnZlcmJvc2UpCi0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBJTkZPXG4iKTsKLQotICAgICAgcG5nX3JlYWRfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICAgIHsKLSAgICAgICAgcG5nX3VpbnRfMzIgaGVpZ2h0ID0gcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX3B0ciwgaW5mb19wdHIpOwotICAgICAgICBpbnQgcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0gICAgICAgIGludCBwYXNzOwotCi0gICAgICAgIHBuZ19zdGFydF9yZWFkX2ltYWdlKHBuZ19wdHIpOwotCi0gICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBwYXNzZXM7ICsrcGFzcykKLSAgICAgICAgewotICAgICAgICAgICBwbmdfdWludF8zMiB5ID0gaGVpZ2h0OwotCi0gICAgICAgICAgIC8qIE5PVEU6IHRoaXMgc2tpcHMgYXNraW5nIGxpYnBuZyB0byByZXR1cm4gZWl0aGVyIHZlcnNpb24gb2YKLSAgICAgICAgICAgICogdGhlIGltYWdlIHJvdywgYnV0IGxpYnBuZyBzdGlsbCByZWFkcyB0aGUgcm93cy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIHdoaWxlICh5LS0gPiAwKQotICAgICAgICAgICAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGNvbnRyb2wtPmZpbGUuZ2xvYmFsLT52ZXJib3NlKQotICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgRU5EXG4iKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHRvIHJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZTogKi8KLSAgICAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICB9Ci0KLSAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsIE5VTEwpOwotICAgcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50Ci1vbmVfZmlsZShzdHJ1Y3QgZ2xvYmFsICpnbG9iYWwsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgY29uc3QgY2hhciAqb3V0X25hbWUpCi17Ci0gICBpbnQgcmM7Ci0gICBzdHJ1Y3QgY29udHJvbCBjb250cm9sOwotCi0gICBpZiAoZ2xvYmFsLT52ZXJib3NlKQotICAgICAgZnByaW50ZihzdGRlcnIsICJGSUxFICVzIC0+ICVzXG4iLCBmaWxlX25hbWUsCi0gICAgICAgICBvdXRfbmFtZSA/IG91dF9uYW1lIDogIjxub25lPiIpOwotCi0gICAvKiBBbHRob3VnaCBjb250cm9sX2luaXQgY2FuIHJldHVybiBhIGZhaWx1cmUgY29kZSB0aGUgc3RydWN0dXJlIGlzIGFsd2F5cwotICAgICogaW5pdGlhbGl6ZWQsIHNvIGNvbnRyb2xfZW5kIGNhbiBiZSB1c2VkIHRvIGFjY3VtdWxhdGUgYW55IHN0YXR1cyBjb2Rlcy4KLSAgICAqLwotICAgcmMgPSBjb250cm9sX2luaXQoJmNvbnRyb2wsIGdsb2JhbCwgZmlsZV9uYW1lLCBvdXRfbmFtZSk7Ci0KLSAgIGlmIChyYyA9PSAwKQotICAgICAgcmMgPSByZWFkX3BuZygmY29udHJvbCk7Ci0KLSAgIHJjIHw9IGNvbnRyb2xfZW5kKCZjb250cm9sKTsKLQotICAgcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UoY29uc3QgY2hhciAqcHJvZykKLXsKLSAgIC8qIEFOU0kgQy05MCBsaW1pdHMgc3RyaW5ncyB0byA1MDkgY2hhcmFjdGVycywgc28gdXNlIGEgc3RyaW5nIGFycmF5OiAqLwotICAgc2l6ZV90IGk7Ci0gICBzdGF0aWMgY29uc3QgY2hhciAqdXNhZ2Vfc3RyaW5nW10gPSB7Ci0iICBUZXN0cywgb3B0aW1pemVzIGFuZCBvcHRpb25hbGx5IGZpeGVzIHRoZSB6bGliIGhlYWRlciBpbiBQTkcgZmlsZXMuIiwKLSIgIE9wdGlvbmFsbHksIHdoZW4gZml4aW5nLCBzdHJpcHMgYW5jaWxsaWFyeSBjaHVua3MgZnJvbSB0aGUgZmlsZS4iLAotMCwKLSJPUFRJT05TIiwKLSIgIE9QRVJBVElPTiIsCi0iICAgICAgQnkgZGVmYXVsdCBmaWxlcyBhcmUganVzdCBjaGVja2VkIGZvciByZWFkYWJpbGl0eSB3aXRoIGEgc3VtbWFyeSBvZiB0aGUiLAotIiAgICAgIG9mIHpsaWIgaXNzdWVzIGZvdW5kcyBmb3IgZWFjaCBjb21wcmVzc2VkIGNodW5rIGFuZCB0aGUgSURBVCBzdHJlYW0gaW4iLAotIiAgICAgIHRoZSBmaWxlLiIsCi0iICAgIC0tb3B0aW1pemUgKC1vKToiLAotIiAgICAgIEZpbmQgdGhlIHNtYWxsZXN0IGRlZmxhdGUgd2luZG93IHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEuIiwKLSIgICAgLS1zdHJpcD1bbm9uZXxjcmN8dW5zYWZlfHVudXNlZHx0cmFuc2Zvcm18Y29sb3J8YWxsXToiLAotIiAgICAgICAgbm9uZSAoZGVmYXVsdCk6ICAgUmV0YWluIGFsbCBjaHVua3MuIiwKLSIgICAgICAgIGNyYzogICAgUmVtb3ZlIGNodW5rcyB3aXRoIGEgYmFkIENSQy4iLAotIiAgICAgICAgdW5zYWZlOiBSZW1vdmUgY2h1bmtzIHRoYXQgbWF5IGJlIHVuc2FmZSB0byByZXRhaW4gaWYgdGhlIGltYWdlIGRhdGEiLAotIiAgICAgICAgICAgICAgICBpcyBtb2RpZmllZC4gIFRoaXMgaXMgc2V0IGF1dG9tYXRpY2FsbHkgaWYgLS1tYXggaXMgZ2l2ZW4gYnV0IiwKLSIgICAgICAgICAgICAgICAgbWF5IGJlIGNhbmNlbGxlZCBieSBhIGxhdGVyIC0tc3RyaXA9bm9uZS4iLAotIiAgICAgICAgdW51c2VkOiBSZW1vdmUgY2h1bmtzIG5vdCB1c2VkIGJ5IGxpYnBuZyB3aGVuIGRlY29kaW5nIGFuIGltYWdlLiIsCi0iICAgICAgICAgICAgICAgIFRoaXMgcmV0YWlucyBhbnkgY2h1bmtzIHRoYXQgbWlnaHQgYmUgdXNlZCBieSBsaWJwbmcgaW1hZ2UiLAotIiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbnMuIiwKLSIgICAgICAgIHRyYW5zZm9ybTogdW51c2VkK2JLR0QuIiwKLSIgICAgICAgIGNvbG9yOiAgdHJhbnNmb3JtK2lDQ1AgYW5kIGNIUk0uIiwKLSIgICAgICAgIGFsbDogICAgY29sb3IrZ0FNQSBhbmQgc1JHQi4iLAotIiAgICAgIE9ubHkgYW5jaWxsYXJ5IGNodW5rcyBhcmUgZXZlciByZW1vdmVkLiAgSW4gYWRkaXRpb24gdGhlIHRSTlMgYW5kIHNCSVQiLAotIiAgICAgIGNodW5rcyBhcmUgbmV2ZXIgcmVtb3ZlZCBhcyB0aGV5IGFmZmVjdCBleGFjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGUiLAotIiAgICAgIGltYWdlIHBpeGVsIHZhbHVlcy4gIFRoZSBmb2xsb3dpbmcga25vd24gY2h1bmtzIGFyZSB0cmVhdGVkIHNwZWNpYWxseSIsCi0iICAgICAgYnkgdGhlIGFib3ZlIG9wdGlvbnM6IiwKLSIgICAgICAgIGdBTUEsIHNSR0IgW2FsbF06IFRoZXNlIHNwZWNpZnkgdGhlIGdhbW1hIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBwaXhlbCIsCi0iICAgICAgICAgICAgdmFsdWVzLiIsCi0iICAgICAgICBjSFJNLCBpQ0NQIFtjb2xvcl06IFRoZXNlIHNwZWNpZnkgaG93IGNvbG9ycyBhcmUgZW5jb2RlZC4gIGlDQ1AgYWxzbyIsCi0iICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBleGFjdCBlbmNvZGluZyBvZiBhIHBpeGVsIHZhbHVlOyBob3dldmVyLCBpbiIsCi0iICAgICAgICAgICAgcHJhY3RpY2UgbW9zdCBwcm9ncmFtcyB3aWxsIGlnbm9yZSBpdC4iLAotIiAgICAgICAgYktHRCBbdHJhbnNmb3JtXTogVGhpcyBpcyB1c2VkIGJ5IGxpYnBuZyB0cmFuc2Zvcm1zLiIKLSIgICAgLS1tYXg9PG51bWJlcj46IiwKLSIgICAgICBVc2UgSURBVCBjaHVua3Mgc2l6ZWQgPG51bWJlcj4uICBJZiBubyBudW1iZXIgaXMgZ2l2ZW4gdGhlIHRoZSBJREFUIiwKLSIgICAgICBjaHVua3Mgd2lsbCBiZSB0aGUgbWF4aW11bSBzaXplIHBlcm1pdHRlZDsgMl4zMS0xIGJ5dGVzLiAgSWYgdGhlIG9wdGlvbiIsCi0iICAgICAgaXMgb21pdHRlZCB0aGUgb3JpZ2luYWwgY2h1bmsgc2l6ZXMgd2lsbCBub3QgYmUgY2hhbmdlZC4gIFdoZW4gdGhlIiwKLSIgICAgICBvcHRpb24gaXMgZ2l2ZW4gLS1zdHJpcD11bnNhZmUgaXMgc2V0IGF1dG9tYXRpY2FsbHkuIFRoaXMgbWF5IGJlIiwKLSIgICAgICBjYW5jZWxsZWQgaWYgeW91IGtub3cgdGhhdCBhbGwgdW5rbm93biB1bnNhZmUtdG8tY29weSBjaHVua3MgcmVhbGx5IGFyZSIsCi0iICAgICAgc2FmZSB0byBjb3B5IGFjcm9zcyBhbiBJREFUIHNpemUgY2hhbmdlLiAgVGhpcyBpcyB0cnVlIG9mIGFsbCBjaHVua3MiLAotIiAgICAgIHRoYXQgaGF2ZSBldmVyIGJlZW4gZm9ybWFsbHkgcHJvcG9zZWQgYXMgUE5HIGV4dGVuc2lvbnMuIiwKLSIgIE1FU1NBR0VTIiwKLSIgICAgICBCeSBkZWZhdWx0IHRoZSBwcm9ncmFtIG9ubHkgb3V0cHV0cyBzdW1tYXJpZXMgZm9yIGVhY2ggZmlsZS4iLAotIiAgICAtLXF1aWV0ICgtcSk6IiwKLSIgICAgICBEbyBub3Qgb3V0cHV0IHRoZSBzdW1tYXJpZXMgZXhjZXB0IGZvciBmaWxlcyB0aGF0IGNhbm5vdCBiZSByZWFkLiBXaXRoIiwKLSIgICAgICB0d28gLS1xdWlldHMgdGhlc2UgYXJlIG5vdCBvdXRwdXQgZWl0aGVyLiIsCi0iICAgIC0tZXJyb3JzICgtZSk6IiwKLSIgICAgICBPdXRwdXQgZXJyb3JzIGZyb20gbGlicG5nIGFuZCB0aGUgcHJvZ3JhbSAoZXhjZXB0IHRvby1mYXItYmFjaykuIiwKLSIgICAgLS13YXJuaW5ncyAoLXcpOiIsCi0iICAgICAgT3V0cHV0IHdhcm5pbmdzIGZyb20gbGlicG5nLiIsCi0iICBPVVRQVVQiLAotIiAgICAgIEJ5IGRlZmF1bHQgbm90aGluZyBpcyB3cml0dGVuLiIsCi0iICAgIC0tb3V0PTxmaWxlPjoiLAotIiAgICAgIFdyaXRlIHRoZSBvcHRpbWl6ZWQvY29ycmVjdGVkIHZlcnNpb24gb2YgdGhlIG5leHQgUE5HIHRvIDxmaWxlPi4gIFRoaXMiLAotIiAgICAgIG92ZXJyaWRlcyB0aGUgZm9sbG93aW5nIHR3byBvcHRpb25zIiwKLSIgICAgLS1zdWZmaXg9PHN1ZmZpeD46IiwKLSIgICAgICBTZXQgLS1vdXQ9PG5hbWU+PHN1ZmZpeD4gZm9yIGFsbCBmb2xsb3dpbmcgZmlsZXMgdW5sZXNzIG92ZXJyaWRkZW4gb24iLAotIiAgICAgIGEgcGVyLWZpbGUgYmFzaXMgYnkgZXhwbGljaXQgLS1vdXQuIiwKLSIgICAgLS1wcmVmaXg9PHByZWZpeD46IiwKLSIgICAgICBTZXQgLS1vdXQ9PHByZWZpeD48bmFtZT4gZm9yIGFsbCB0aGUgZm9sbG93aW5nIGZpbGVzIHVubGVzcyBvdmVycmlkZGVuIiwKLSIgICAgICBvbiBhIHBlci1maWxlIGJhc2lzIGJ5IGV4cGxpY2l0IC0tb3V0LiIsCi0iICAgICAgVGhlc2UgdHdvIG9wdGlvbnMgY2FuIGJlIHVzZWQgdG9nZXRoZXIgdG8gcHJvZHVjZSBhIHN1ZmZpeCBhbmQgcHJlZml4LiIsCi0iICBJTlRFUk5BTCBPUFRJT05TIiwKLSNpZiAwIC8qTllJKi8KLSNpZmRlZiBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVwotIiAgICAtLXRlc3Q6IiwKLSIgICAgICBUZXN0IHRoZSBQTkdfTUFYSU1VTV9JTkZMQVRFX1dJTkRPVyBvcHRpb24uICBTZXR0aW5nIHRoaXMgZGlzYWJsZXMiLAotIiAgICAgIG91dHB1dCBhcyB0aGlzIHdvdWxkIHByb2R1Y2UgYSBicm9rZW4gZmlsZS4iLAotI2VuZGlmCi0jZW5kaWYKLTAsCi0iRVhJVCBDT0RFUyIsCi0iICAqKiogU1VCSkVDVCBUTyBDSEFOR0UgKioqIiwKLSIgIFRoZSBwcm9ncmFtIGV4aXQgY29kZSBpcyB2YWx1ZSBpbiB0aGUgcmFuZ2UgMC4uMTI3IGhvbGRpbmcgYSBiaXQgbWFzayBvZiIsCi0iICB0aGUgZm9sbG93aW5nIGNvZGVzLiAgTm90aWNlIHRoYXQgdGhlIHJlc3VsdHMgZm9yIGVhY2ggZmlsZSBhcmUgY29tYmluZWQiLAotIiAgdG9nZXRoZXIgLSBjaGVjayBvbmUgZmlsZSBhdCBhIHRpbWUgdG8gZ2V0IGEgbWVhbmluZ2Z1bCBlcnJvciBjb2RlISIsCi0iICAgIDB4MDE6IFRoZSB6bGliIHRvby1mYXItYmFjayBlcnJvciBleGlzdGVkIGluIGF0IGxlYXN0IG9uZSBjaHVuay4iLAotIiAgICAweDAyOiBBdCBsZWFzdCBvbmUgY2h1bmsgaGFkIGEgQ1JDIGVycm9yLiIsCi0iICAgIDB4MDQ6IEEgY2h1bmsgbGVuZ3RoIHdhcyBpbmNvcnJlY3QuIiwKLSIgICAgMHgwODogVGhlIGZpbGUgd2FzIHRydW5jYXRlZC4iLAotIiAgRXJyb3JzIGxlc3MgdGhhbiAxNiBhcmUgcG90ZW50aWFsbHkgcmVjb3ZlcmFibGUsIGZvciBhIHNpbmdsZSBmaWxlIGlmIHRoZSIsCi0iICBleGl0IGNvZGUgaXMgbGVzcyB0aGFuIDE2IHRoZSBmaWxlIGNvdWxkIGJlIHJlYWQgKHdpdGggY29ycmVjdGlvbnMgaWYgYSIsCi0iICBub24temVybyBjb2RlIGlzIHJldHVybmVkKS4iLAotIiAgICAweDEwOiBUaGUgZmlsZSBjb3VsZCBub3QgYmUgcmVhZCwgZXZlbiB3aXRoIGNvcnJlY3Rpb25zLiIsCi0iICAgIDB4MjA6IFRoZSBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4iLAotIiAgICAweDQwOiBBbiB1bmV4cGVjdGVkLCBwb3RlbnRpYWxseSBpbnRlcm5hbCwgZXJyb3Igb2NjdXJyZWQuIiwKLSIgIElmIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFyZSBpbmNvcnJlY3QgdGhlIHByb2dyYW0gZXhpdHMgd2l0aCBleGl0IiwKLSIgIDI1NS4gIFNvbWUgb2xkZXIgb3BlcmF0aW5nIHN5c3RlbXMgb25seSBzdXBwb3J0IDctYml0IGV4aXQgY29kZXMsIG9uIHRob3NlIiwKLSIgIHN5c3RlbXMgaXQgaXMgc3VnZ2VzdGVkIHRoYXQgdGhpcyBwcm9ncmFtIGlzIGZpcnN0IHRlc3RlZCBieSBzdXBwbHlpbmciLAotIiAgaW52YWxpZCBhcmd1bWVudHMuIiwKLTAsCi0iREVTQ1JJUFRJT04iLAotIiAgIiBQUk9HUkFNX05BTUUgIjoiLAotIiAgY2hlY2tzIGVhY2ggUE5HIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgZXJyb3JzLiAgQnkgZGVmYXVsdCBlcnJvcnMgYXJlIiwKLSIgIG5vdCBvdXRwdXQgYW5kIHRoZSBwcm9ncmFtIGp1c3QgcmV0dXJucyBhbiBleGl0IGNvZGUgYW5kIHByaW50cyBhIHN1bW1hcnkuIiwKLSIgIFdpdGggdGhlIC0tcXVpZXQgKC1xKSBvcHRpb24gdGhlIHN1bW1hcmllcyBhcmUgc3VwcHJlc3NlZCB0b28gYW5kIHRoZSIsCi0iICBwcm9ncmFtIG9ubHkgb3V0cHV0cyB1bmV4cGVjdGVkIGVycm9ycyAoaW50ZXJuYWwgZXJyb3JzIGFuZCBmaWxlIG9wZW4iLAotIiAgZXJyb3JzKS4iLAotIiAgVmFyaW91cyBrbm93biBwcm9ibGVtcyBpbiBQTkcgZmlsZXMgYXJlIGZpeGVkIHdoaWxlIHRoZSBmaWxlIGlzIGJlaW5nIHJlYWQiLAotIiAgVGhlIGV4aXQgY29kZSBzYXlzIHdoYXQgcHJvYmxlbXMgd2VyZSBmaXhlZC4gIEluIHBhcnRpY3VsYXIgdGhlIHpsaWIgZXJyb3I6IiwKLTAsCi0iICAgICAgICBcImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrXCIiLAotMCwKLSIgIGNhdXNlZCBieSBhbiBpbmNvcnJlY3Qgb3B0aW1pemF0aW9uIG9mIGEgemxpYiBzdHJlYW0gaXMgZml4ZWQgaW4gYW55IiwKLSIgIGNvbXByZXNzZWQgY2h1bmsgaW4gd2hpY2ggaXQgaXMgZW5jb3VudGVyZWQuICBBbiBpbnRlZ3JpdHkgcHJvYmxlbSBvZiB0aGUiLAotIiAgUE5HIHN0cmVhbSBjYXVzZWQgYnkgYSBidWcgaW4gbGlicG5nIHdoaWNoIHdyb3RlIGFuIGluY29ycmVjdCBjaHVuayBsZW5ndGgiLAotIiAgaXMgYWxzbyBmaXhlZC4gIENodW5rIENSQyBlcnJvcnMgYXJlIGF1dG9tYXRpY2FsbHkgZml4ZWQgdXAuIiwKLTAsCi0iICBTZXR0aW5nIG9uZSBvZiB0aGUgXCJPVVRQVVRcIiBvcHRpb25zIGNhdXNlcyB0aGUgcG9zc2libHkgbW9kaWZpZWQgZmlsZSB0byIsCi0iICBiZSB3cml0dGVuIHRvIGEgbmV3IGZpbGUuIiwKLTAsCi0iICBOb3RpY2UgdGhhdCBzb21lIFBORyBmaWxlcyB3aXRoIHRoZSB6bGliIG9wdGltaXphdGlvbiBwcm9ibGVtIGNhbiBzdGlsbCBiZSIsCi0iICByZWFkIGJ5IGxpYnBuZyB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuICBUaGlzIHByb2dyYW0gd2lsbCBzdGlsbCBkZXRlY3QiLAotIiAgYW5kLCBpZiByZXF1ZXN0ZWQsIGNvcnJlY3QgdGhlIGVycm9yLiIsCi0wLAotIiAgVGhlIHByb2dyYW0gd2lsbCByZWxpYWJseSBwcm9jZXNzIGFsbCBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lIHVubGVzcyIsCi0iICBlaXRoZXIgYW4gaW52YWxpZCBhcmd1bWVudCBjYXVzZXMgdGhlIHVzYWdlIG1lc3NhZ2UgKHRoaXMgbWVzc2FnZSkgdG8gYmUiLAotIiAgcHJvZHVjZWQgb3IgdGhlIHByb2dyYW0gY3Jhc2hlcy4iLAotMCwKLSIgIFRoZSBzdW1tYXJ5IGxpbmVzIGRlc2NyaWJlIGlzc3VlcyBlbmNvdW50ZXJlZCB3aXRoIHRoZSB6bGliIGNvbXByZXNzZWQiLAotIiAgc3RyZWFtIG9mIGEgY2h1bmsuICBUaGV5IGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQsIHdoaWNoIGlzIFNVQkpFQ1QgVE8iLAotIiAgQ0hBTkdFIGluIHRoZSBmdXR1cmU6IiwKLTAsCi0iICAgICBjaHVuayByZWFzb24gY29tcC1sZXZlbCBwMSBwMiBwMyBwNCBmaWxlIiwKLTAsCi0iICBwMSB0aHJvdWdoIHA0IHZhcnkgYWNjb3JkaW5nIHRvIHRoZSAncmVhc29uJy4gIFRoZXJlIGFyZSBhbHdheXMgOCBzcGFjZSIsCi0iICBzZXBhcmF0ZWQgZmllbGRzLiAgUmVhc29ucyBzcGVjaWZpYyBmb3JtYXRzIGFyZToiLAotMCwKLSIgICAgIGNodW5rIEVSUiBzdGF0dXMgY29kZSByZWFkLWVycm5vIHdyaXRlLWVycm5vIG1lc3NhZ2UgZmlsZSIsCi0iICAgICBjaHVuayBTS1AgY29tcC1sZXZlbCBmaWxlLWJpdHMgemxpYi1yYyBjb21wcmVzc2VkIG1lc3NhZ2UgZmlsZSIsCi0iICAgICBjaHVuayA/Pz8gY29tcC1sZXZlbCBmaWxlLWJpdHMgb2stYml0cyBjb21wcmVzc2VkIHVuY29tcHJlc3MgZmlsZSIsCi0wLAotIiAgVGhlIHZhcmlvdXMgZmllbGRzIGFyZSIsCi0wLAotIiQxIGNodW5rOiAgICAgIFRoZSBjaHVuayB0eXBlIG9mIGEgY2h1bmsgaW4gdGhlIGZpbGUgb3IgJ0hFQUQnIGlmIGEgcHJvYmxlbSIsCi0iICAgICAgICAgICAgICAgaXMgcmVwb3J0ZWQgYnkgbGlicG5nIGF0IHRoZSBzdGFydCBvZiB0aGUgSURBVCBzdHJlYW0uIiwKLSIkMiByZWFzb246ICAgICBPbmUgb2Y6IiwKLSIgICAgICAgICAgQ0hLOiBBIHpsaWIgaGVhZGVyIGNoZWNrc3VtIHdhcyBkZXRlY3RlZCBhbmQgZml4ZWQuIiwKLSIgICAgICAgICAgVEZCOiBUaGUgemxpYiB0b28gZmFyIGJhY2sgZXJyb3Igd2FzIGRldGVjdGVkIGFuZCBmaXhlZC4iLAotIiAgICAgICAgICBPSyA6IE5vIGVycm9ycyB3ZXJlIGRldGVjdGVkIGluIHRoZSB6bGliIHN0cmVhbSBhbmQgb3B0aW1pemF0aW9uIiwKLSIgICAgICAgICAgICAgICB3YXMgbm90IHJlcXVlc3RlZCwgb3Igd2FzIG5vdCBwb3NzaWJsZS4iLAotIiAgICAgICAgICBPUFQ6IFRoZSB6bGliIHN0cmVhbSB3aW5kb3cgYml0cyB2YWx1ZSBjb3VsZCBiZSBpbXByb3ZlZCAoYW5kIHdhcykuIiwKLSIgICAgICAgICAgU0tQOiBUaGUgY2h1bmsgd2FzIHNraXBwZWQgYmVjYXVzZSBvZiBhIHpsaWIgaXNzdWUgKHpsaWItcmMpIHdpdGgiLAotIiAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uICdtZXNzYWdlJyIsCi0iICAgICAgICAgIEVSUjogVGhlIHJlYWQgb2YgdGhlIGZpbGUgd2FzIGFib3J0ZWQuICBUaGUgcGFyYW1ldGVycyBleHBsYWluIHdoeS4iLAotIiQzIHN0YXR1czogICAgIEZvciAnRVJSJyB0aGUgYWNjdW11bGF0ZWQgc3RhdHVzIGNvZGUgZnJvbSAnRVhJVCBDT0RFUycgYWJvdmUuIiwKLSIgICAgICAgICAgICAgICBUaGlzIGlzIHByaW50ZWQgYXMgYSAyIGRpZ2l0IGhleGFkZWNpbWFsIHZhbHVlIiwKLSIgICBjb21wLWxldmVsOiBUaGUgcmVjb3JkZWQgY29tcHJlc3Npb24gbGV2ZWwgKEZMRVZFTCkgb2YgYSB6bGliIHN0cmVhbSIsCi0iICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGEgc3RyaW5nIHtzdXBmYXN0LHN0ZGZhc3QsZGVmYXVsdCxtYXhpbXVtfSIsCi0iJDQgY29kZTogICAgICAgVGhlIGZpbGUgZXhpdCBjb2RlOyB3aGVyZSBzdG9wIHdhcyBjYWxsZWQsIGFzIGEgZmFpcmx5IHRlcnNlIiwKLSIgICAgICAgICAgICAgICBzdHJpbmcge3dhcm5pbmcsbGlicG5nLHpsaWIsaW52YWxpZCxyZWFkLHdyaXRlLHVuZXhwZWN0ZWR9LiIsCi0iICAgZmlsZS1iaXRzOiAgVGhlIHpsaWIgd2luZG93IGJpdHMgcmVjb3JkZWQgaW4gdGhlIGZpbGUuIiwKLSIkNSByZWFkLWVycm5vOiBBIHN5c3RlbSBlcnJubyB2YWx1ZSBmcm9tIGEgcmVhZCB0cmFuc2xhdGVkIGJ5IHN0cmVycm9yKDMpLiIsCi0iICAgemxpYi1yYzogICAgQSB6bGliIHJldHVybiBjb2RlIGFzIGEgc3RyaW5nIChzZWUgemxpYi5oKS4iLAotIiAgIG9rLWJpdHM6ICAgIFRoZSBzbWFsbGVzdCB6bGliIHdpbmRvdyBiaXRzIHZhbHVlIHRoYXQgd29ya3MuIiwKLSIkNiB3cml0ZS1lcnJubzpBIHN5c3RlbSBlcnJubyB2YWx1ZSBmcm9tIGEgd3JpdGUgdHJhbnNsYXRlZCBieSBzdHJlcnJvcigzKS4iLAotIiAgIGNvbXByZXNzZWQ6IFRoZSBjb3VudCBvZiBjb21wcmVzc2VkIGJ5dGVzIGluIHRoZSB6bGliIHN0cmVhbSwgd2hlbiB0aGUiLAotIiAgICAgICAgICAgICAgIHJlYXNvbiBpcyAnU0tQJzsgdGhpcyBpcyBhIGNvdW50IG9mIHRoZSBieXRlcyByZWFkIGZyb20gdGhlIiwKLSIgICAgICAgICAgICAgICBzdHJlYW0gd2hlbiB0aGUgZmF0YWwgZXJyb3Igd2FzIGVuY291bnRlcmVkLiIsCi0iJDcgbWVzc2FnZTogICAgQW4gZXJyb3IgbWVzc2FnZSAoc3BhY2VzIHJlcGxhY2VkIGJ5IF8sIGFzIGluIGFsbCBwYXJhbWV0ZXJzKSwiLAotIiAgIHVuY29tcHJlc3M6IFRoZSBjb3VudCBvZiBieXRlcyBmcm9tIHVuY29tcHJlc3NpbmcgdGhlIHpsaWIgc3RyZWFtOyB0aGlzIiwKLSIgICAgICAgICAgICAgICBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGltYWdlLiIsCi0iJDggZmlsZTogICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgKHRoaXMgbWF5IGNvbnRhaW4gc3BhY2VzKS4iLAotfTsKLQotICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMge1tvcHRpb25zXSBwbmctZmlsZX1cbiIsIHByb2cpOwotCi0gICBmb3IgKGk9MDsgaSA8IChzaXplb2YgdXNhZ2Vfc3RyaW5nKS8oc2l6ZW9mIHVzYWdlX3N0cmluZ1swXSk7ICsraSkKLSAgIHsKLSAgICAgIGlmICh1c2FnZV9zdHJpbmdbaV0gIT0gMCkKLSAgICAgICAgIGZwdXRzKHVzYWdlX3N0cmluZ1tpXSwgc3RkZXJyKTsKLQotICAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKLSAgIH0KLQotICAgZXhpdCgyNTUpOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQotewotICAgY2hhciB0ZW1wX25hbWVbRklMRU5BTUVfTUFYKzFdOwotICAgY29uc3QgY2hhciAqICBwcm9nID0gKmFyZ3Y7Ci0gICBjb25zdCBjaGFyICogIG91dGZpbGUgPSBOVUxMOwotICAgY29uc3QgY2hhciAqICBzdWZmaXggPSBOVUxMOwotICAgY29uc3QgY2hhciAqICBwcmVmaXggPSBOVUxMOwotICAgaW50ICAgICAgICAgICBkb25lID0gMDsgLyogaWYgYXQgbGVhc3Qgb25lIGZpbGUgaXMgcHJvY2Vzc2VkICovCi0gICBzdHJ1Y3QgZ2xvYmFsIGdsb2JhbDsKLQotICAgZ2xvYmFsX2luaXQoJmdsb2JhbCk7Ci0KLSAgIHdoaWxlICgtLWFyZ2MgPiAwKQotICAgewotICAgICAgKythcmd2OwotCi0gICAgICBpZiAoc3RyY21wKCphcmd2LCAiLS1kZWJ1ZyIpID09IDApCi0gICAgICB7Ci0gICAgICAgICAvKiBUbyBoZWxwIGRlYnVnZ2luZyBwcm9ibGVtczogKi8KLSAgICAgICAgIGdsb2JhbC5lcnJvcnMgPSBnbG9iYWwud2FybmluZ3MgPSAxOwotICAgICAgICAgZ2xvYmFsLnF1aWV0ID0gMDsKLSAgICAgICAgIGdsb2JhbC52ZXJib3NlID0gNzsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoc3RybmNtcCgqYXJndiwgIi0tbWF4PSIsIDYpID09IDApCi0gICAgICB7Ci0gICAgICAgICBnbG9iYWwuaWRhdF9tYXggPSAocG5nX3VpbnRfMzIpYXRvbCg2Kyphcmd2KTsKLQotICAgICAgICAgaWYgKGdsb2JhbC5za2lwIDwgU0tJUF9VTlNBRkUpCi0gICAgICAgICAgICBnbG9iYWwuc2tpcCA9IFNLSVBfVU5TQUZFOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLW1heCIpID09IDApCi0gICAgICB7Ci0gICAgICAgICBnbG9iYWwuaWRhdF9tYXggPSAweDdmZmZmZmZmOwotCi0gICAgICAgICBpZiAoZ2xvYmFsLnNraXAgPCBTS0lQX1VOU0FGRSkKLSAgICAgICAgICAgIGdsb2JhbC5za2lwID0gU0tJUF9VTlNBRkU7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tb3B0aW1pemUiKSA9PSAwIHx8IHN0cmNtcCgqYXJndiwgIi1vIikgPT0gMCkKLSAgICAgICAgIGdsb2JhbC5vcHRpbWl6ZV96bGliID0gMTsKLQotICAgICAgZWxzZSBpZiAoc3RybmNtcCgqYXJndiwgIi0tb3V0PSIsIDYpID09IDApCi0gICAgICAgICBvdXRmaWxlID0gNisqYXJndjsKLQotICAgICAgZWxzZSBpZiAoc3RybmNtcCgqYXJndiwgIi0tc3VmZml4PSIsIDkpID09IDApCi0gICAgICAgICBzdWZmaXggPSA5Kyphcmd2OwotCi0gICAgICBlbHNlIGlmIChzdHJuY21wKCphcmd2LCAiLS1wcmVmaXg9IiwgOSkgPT0gMCkKLSAgICAgICAgIHByZWZpeCA9IDkrKmFyZ3Y7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tc3RyaXA9bm9uZSIpID09IDApCi0gICAgICAgICBnbG9iYWwuc2tpcCA9IFNLSVBfTk9ORTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLS1zdHJpcD1jcmMiKSA9PSAwKQotICAgICAgICAgZ2xvYmFsLnNraXAgPSBTS0lQX0JBRF9DUkM7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tc3RyaXA9dW5zYWZlIikgPT0gMCkKLSAgICAgICAgIGdsb2JhbC5za2lwID0gU0tJUF9VTlNBRkU7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tc3RyaXA9dW51c2VkIikgPT0gMCkKLSAgICAgICAgIGdsb2JhbC5za2lwID0gU0tJUF9VTlVTRUQ7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tc3RyaXA9dHJhbnNmb3JtIikgPT0gMCkKLSAgICAgICAgIGdsb2JhbC5za2lwID0gU0tJUF9UUkFOU0ZPUk07Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tc3RyaXA9Y29sb3IiKSA9PSAwKQotICAgICAgICAgZ2xvYmFsLnNraXAgPSBTS0lQX0NPTE9SOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXN0cmlwPWFsbCIpID09IDApCi0gICAgICAgICBnbG9iYWwuc2tpcCA9IFNLSVBfQUxMOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLWVycm9ycyIpID09IDAgfHwgc3RyY21wKCphcmd2LCAiLWUiKSA9PSAwKQotICAgICAgICAgZ2xvYmFsLmVycm9ycyA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0td2FybmluZ3MiKSA9PSAwIHx8IHN0cmNtcCgqYXJndiwgIi13IikgPT0gMCkKLSAgICAgICAgIGdsb2JhbC53YXJuaW5ncyA9IDE7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi0tcXVpZXQiKSA9PSAwIHx8IHN0cmNtcCgqYXJndiwgIi1xIikgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGlmIChnbG9iYWwucXVpZXQpCi0gICAgICAgICAgICBnbG9iYWwucXVpZXQgPSAyOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBnbG9iYWwucXVpZXQgPSAxOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXZlcmJvc2UiKSA9PSAwIHx8IHN0cmNtcCgqYXJndiwgIi12IikgPT0gMCkKLSAgICAgICAgICsrZ2xvYmFsLnZlcmJvc2U7Ci0KLSNpZiAwCi0gICAgICAvKiBOWUkgKi8KLSMgICAgIGlmZGVmIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XCi0gICAgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItLXRlc3QiKSA9PSAwKQotICAgICAgICAgICAgKytzZXRfb3B0aW9uOwotIyAgICAgZW5kaWYKLSNlbmRpZgotCi0gICAgICBlbHNlIGlmICgoKmFyZ3YpWzBdID09ICctJykKLSAgICAgICAgIHVzYWdlKHByb2cpOwotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBzaXplX3Qgb3V0bGVuID0gc3RybGVuKCphcmd2KTsKLQotICAgICAgICAgaWYgKG91dGZpbGUgPT0gTlVMTCkgLyogZWxzZSB0aGlzIHRha2VzIHByZWNlZGVuY2UgKi8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnNpZGVyIHRoZSBwcmVmaXgvc3VmZml4IG9wdGlvbnMgKi8KLSAgICAgICAgICAgIGlmIChwcmVmaXggIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHNpemVfdCBwcmVmaXhsZW4gPSBzdHJsZW4ocHJlZml4KTsKLQotICAgICAgICAgICAgICAgaWYgKHByZWZpeGxlbitvdXRsZW4gPiBGSUxFTkFNRV9NQVgpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBvdXRwdXQgZmlsZSBuYW1lIHRvbyBsb25nOiAlcyVzJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICBwcm9nLCBwcmVmaXgsICphcmd2LCBzdWZmaXggPyBzdWZmaXggOiAiIik7Ci0gICAgICAgICAgICAgICAgICBnbG9iYWwuc3RhdHVzX2NvZGUgfD0gV1JJVEVfRVJST1I7Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfbmFtZSwgcHJlZml4LCBwcmVmaXhsZW4pOwotICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfbmFtZStwcmVmaXhsZW4sICphcmd2LCBvdXRsZW4pOwotICAgICAgICAgICAgICAgb3V0bGVuICs9IHByZWZpeGxlbjsKLSAgICAgICAgICAgICAgIG91dGZpbGUgPSB0ZW1wX25hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN1ZmZpeCAhPSBOVUxMKQotICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfbmFtZSwgKmFyZ3YsIG91dGxlbik7Ci0KLSAgICAgICAgICAgIHRlbXBfbmFtZVtvdXRsZW5dID0gMDsKLQotICAgICAgICAgICAgaWYgKHN1ZmZpeCAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc2l6ZV90IHN1ZmZpeGxlbiA9IHN0cmxlbihzdWZmaXgpOwotCi0gICAgICAgICAgICAgICBpZiAob3V0bGVuK3N1ZmZpeGxlbiA+IEZJTEVOQU1FX01BWCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG91dHB1dCBmaWxlIG5hbWUgdG9vIGxvbmc6ICVzJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICBwcm9nLCAqYXJndiwgc3VmZml4KTsKLSAgICAgICAgICAgICAgICAgIGdsb2JhbC5zdGF0dXNfY29kZSB8PSBXUklURV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBtZW1jcHkodGVtcF9uYW1lK291dGxlbiwgc3VmZml4LCBzdWZmaXhsZW4pOwotICAgICAgICAgICAgICAgb3V0bGVuICs9IHN1ZmZpeGxlbjsKLSAgICAgICAgICAgICAgIHRlbXBfbmFtZVtvdXRsZW5dID0gMDsKLSAgICAgICAgICAgICAgIG91dGZpbGUgPSB0ZW1wX25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgICh2b2lkKW9uZV9maWxlKCZnbG9iYWwsICphcmd2LCBvdXRmaWxlKTsKLSAgICAgICAgICsrZG9uZTsKLSAgICAgICAgIG91dGZpbGUgPSBOVUxMOwotICAgICAgfQotICAgfQotCi0gICBpZiAoIWRvbmUpCi0gICAgICB1c2FnZShwcm9nKTsKLQotICAgcmV0dXJuIGdsb2JhbF9lbmQoJmdsb2JhbCk7Ci19Ci0KLSNlbHNlIC8qIFpMSUJfVkVSTlVNIDwgMHgxMjQwICovCi1pbnQKLW1haW4odm9pZCkKLXsKLSAgIGZwcmludGYoc3RkZXJyLAotICAgICAgInBuZ2ZpeCBuZWVkcyBsaWJwbmcgd2l0aCBhIHpsaWIgPj0xLjIuNCAobm90IDB4JXgpXG4iLAotICAgICAgWkxJQl9WRVJOVU0pOwotICAgcmV0dXJuIDc3OwotfQotI2VuZGlmIC8qIFpMSUJfVkVSTlVNICovCi0KLSNlbHNlIC8qIE5vIHJlYWQgc3VwcG9ydCAqLwotCi1pbnQKLW1haW4odm9pZCkKLXsKLSAgIGZwcmludGYoc3RkZXJyLCAicG5nZml4IGRvZXMgbm90IHdvcmsgd2l0aG91dCByZWFkIGRlaW50ZXJsYWNlIHN1cHBvcnRcbiIpOwotICAgcmV0dXJuIDc3OwotfQotI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAmJiBQTkdfRUFTWV9BQ0NFU1NfU1VQUE9SVEVEICovCi0jZWxzZSAvKiBObyBzZXRqbXAgc3VwcG9ydCAqLwotaW50Ci1tYWluKHZvaWQpCi17Ci0gICBmcHJpbnRmKHN0ZGVyciwgInBuZ2ZpeCBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgc2V0am1wIHN1cHBvcnRcbiIpOwotICAgcmV0dXJuIDc3OwotfQotI2VuZGlmIC8qIFBOR19TRVRKTVBfU1VQUE9SVEVEICovCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdG9vbHMvcmVpbmRlbnQgYi9jb250cmliL3Rvb2xzL3JlaW5kZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGRmMzA5Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdG9vbHMvcmVpbmRlbnQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyByZWluZGVudCBhIGxpYnBuZyBDIHNvdXJjZQotCi0jIENPUFlSSUdIVDogV3JpdHRlbiBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIDIwMTYuCi0jIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhcyB3YWl2ZWQgYWxsIGNvcHlyaWdodCBhbmQKLSMgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyB3b3JrLiAgVGhpcyB3b3JrIGlzIHB1Ymxpc2hlZCBmcm9tOgotIyBVbml0ZWQgU3RhdGVzLgotCi0jIFVzYWdlOgotIyByZWluZGVudCBpbnB1dHRhYnNpemUgb3V0cHV0dGFic2l6ZSBpbnB1dGNvbnRpbnVlc3RyaW5nIG91dHB1dGNvbnRpbnVlc3RyaW5nCi0jCi0jIEFzc3VtZXMgdGhhdCBjb250aW51ZWQgbGluZXMgYmVnaW4gd2l0aCBpbmRlbnRhdGlvbiBwbHVzIG9uZSBzcGFjZSwgYW5kCi0jIHRoYXQgY29udGludWVkIGNvbW1lbnRzIGJlZ2luIHdpdGggaW5kZW50YXRpb24gcGx1cyAiICoiLgotIwotIyBlZywgdG8gY2hhbmdlIGxpYnBuZyBjb2Rpbmcgc3R5bGUgZnJvbSAzLXNwYWNlIGluZGVudGF0aW9uIHdpdGggNC1zcGFjZQotIyBjb250aW51YXRpb25zIHRvIDQtc3BhY2UgaW5kZW50YXRpb24gd2l0aCAyLXNwYWNlIGNvbnRpbnVhdGlvbnM6Ci0jCi0jICByZWluZGVudCAzIDQgIlx0ICIgIiAgIiA8IGV4YW1wbGUuYyA+IGV4YW1wbGUuY180XzIKLSMgYW5kIHRvIHJlc3RvcmUgdGhlIGZpbGUgYmFjayB0byBsaWJwbmcgY29kaW5nIHN0eWxlCi0jICByZWluZGVudCA0IDMgIiAgIiAiICAgICIgPCBleGFtcGxlLmNfNF8yID4gZXhhbXBsZS5jXzNfNAotCi11bmV4cGFuZCAtLWZpcnN0LW9ubHkgLS10ICQxIHwgXAotICAgc2VkIC1lICIvXgkqJDNbXlwqXS97cy8kMy8kNC99IiB8IFwKLSAgIGV4cGFuZCAtdCAkMgpkaWZmIC0tZ2l0IGEvY29udHJpYi90b29scy9zUkdCLmggYi9jb250cmliL3Rvb2xzL3NSR0IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjOGY3Yy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Rvb2xzL3NSR0IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLQotICogc1JHQi5oCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMCBbRmVicnVhcnkgMTQsIDIwMTNdCi0gKgotICogQ09QWVJJR0hUOiBXcml0dGVuIGJ5IEpvaG4gQ3VubmluZ2hhbSBCb3dsZXIsIDIwMTMuCi0gKiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvciBoYXMgd2FpdmVkIGFsbCBjb3B5cmlnaHQgYW5kCi0gKiByZWxhdGVkIG9yIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHdvcmsuICBUaGlzIHdvcmsgaXMgcHVibGlzaGVkIGZyb206Ci0gKiBVbml0ZWQgU3RhdGVzLgotICoKLSAqIFV0aWxpdHkgZmlsZTsgbm90IGFjdHVhbGx5IGEgaGVhZGVyLCB0aGlzIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIHNSR0IKLSAqIGNhbGN1bGF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5jbHVzaW9uIGluIHRob3NlIHRlc3QgcHJvZ3JhbXMgdGhhdCBuZWVkIHRoZW0uCi0gKgotICogQWxsIHJvdXRpbmVzIHRha2UgYW5kIHJldHVybiBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIGluIHRoZSByYW5nZQotICogMCB0byAxLjAsIGRvaW5nIGEgY2FsY3VsYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzUkdCIHNwZWNpZmljYXRpb24KLSAqIChpbiBmYWN0IHRoZSBzb3VyY2Ugb2YgdGhlIG51bWJlcnMgaXMgdGhlIHdpa2lwZWRpYSBhcnRpY2xlIGF0Ci0gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NSR0IpLgotICovCi1zdGF0aWMgZG91YmxlCi1zUkdCX2Zyb21fbGluZWFyKGRvdWJsZSBsKQotewotICAgaWYgKGwgPD0gMC4wMDMxMzA4KQotICAgICAgbCAqPSAxMi45MjsKLQotICAgZWxzZQotICAgICAgbCA9IDEuMDU1ICogcG93KGwsIDEvMi40KSAtIDAuMDU1OwotCi0gICByZXR1cm4gbDsKLX0KLQotc3RhdGljIGRvdWJsZQotbGluZWFyX2Zyb21fc1JHQihkb3VibGUgcykKLXsKLSAgIGlmIChzIDw9IDAuMDQwNDUpCi0gICAgICByZXR1cm4gcyAvIDEyLjkyOwotCi0gICBlbHNlCi0gICAgICByZXR1cm4gcG93KChzKzAuMDU1KS8xLjA1NSwgMi40KTsKLX0KLQotc3RhdGljIGRvdWJsZQotWWZyb21SR0IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYikKLXsKLSAgIC8qIFVzZSB0aGUgc1JHQiAocm91bmRlZCkgY29lZmZpY2llbnRzIGZvciBSbGluZWFyLCBHbGluZWFyLCBCbGluZWFyIHRvIGdldAotICAgICogdGhlIENJRSBZIHZhbHVlIChhbHNvIGxpbmVhcikuCi0gICAgKi8KLSAgIHJldHVybiAwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGI7Ci19CmRpZmYgLS1naXQgYS9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jIGIvY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkZTE4YS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Zpc3VwbmcvUG5nRmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIFBOR0ZJTEUuQyAtLSBJbWFnZSBGaWxlIEZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogQ29weXJpZ2h0IDIwMDAsIFdpbGxlbSB2YW4gU2NoYWlrLgotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICovCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8Y29tbWRsZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8emxpYi5oPgotCi0jaW5jbHVkZSAicG5nLmgiCi0jaW5jbHVkZSAicG5nZmlsZS5oIgotI2luY2x1ZGUgImNleGNlcHQuaCIKLQotZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0IHRoZV9leGNlcHRpb25fY29udGV4dFsxXTsKLXN0cnVjdCBleGNlcHRpb25fY29udGV4dCB0aGVfZXhjZXB0aW9uX2NvbnRleHRbMV07Ci1wbmdfY29uc3RfY2hhcnAgbXNnOwotCi1zdGF0aWMgT1BFTkZJTEVOQU1FIG9mbjsKLQotc3RhdGljIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBOVUxMOwotc3RhdGljIHBuZ19pbmZvcCBpbmZvX3B0ciA9IE5VTEw7Ci0KLQotLyogY2V4Y2VwdCBpbnRlcmZhY2UgKi8KLQotc3RhdGljIHZvaWQKLXBuZ19jZXhjZXB0X2Vycm9yKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBtc2cpCi17Ci0gICBpZihwbmdfcHRyKQotICAgICA7Ci0jaWZkZWYgUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVECi0gICBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyBlcnJvcjogJXNcbiIsIG1zZyk7Ci0jZW5kaWYKLSAgIHsKLSAgICAgIFRocm93IG1zZzsKLSAgIH0KLX0KLQotLyogV2luZG93cyBvcGVuLWZpbGUgZnVuY3Rpb25zICovCi0KLXZvaWQgUG5nRmlsZUluaXRpYWxpemUgKEhXTkQgaHduZCkKLXsKLSAgICBzdGF0aWMgVENIQVIgc3pGaWx0ZXJbXSA9IFRFWFQgKCJQTkcgRmlsZXMgKCouUE5HKVwwKi5wbmdcMCIpCi0gICAgICAgIFRFWFQgKCJBbGwgRmlsZXMgKCouKilcMCouKlwwXDAiKTsKLQotICAgIG9mbi5sU3RydWN0U2l6ZSAgICAgICA9IHNpemVvZiAoT1BFTkZJTEVOQU1FKTsKLSAgICBvZm4uaHduZE93bmVyICAgICAgICAgPSBod25kOwotICAgIG9mbi5oSW5zdGFuY2UgICAgICAgICA9IE5VTEw7Ci0gICAgb2ZuLmxwc3RyRmlsdGVyICAgICAgID0gc3pGaWx0ZXI7Ci0gICAgb2ZuLmxwc3RyQ3VzdG9tRmlsdGVyID0gTlVMTDsKLSAgICBvZm4ubk1heEN1c3RGaWx0ZXIgICAgPSAwOwotICAgIG9mbi5uRmlsdGVySW5kZXggICAgICA9IDA7Ci0gICAgb2ZuLmxwc3RyRmlsZSAgICAgICAgID0gTlVMTDsgICAgICAgICAgLyogU2V0IGluIE9wZW4gYW5kIENsb3NlIGZ1bmN0aW9ucyAqLwotICAgIG9mbi5uTWF4RmlsZSAgICAgICAgICA9IE1BWF9QQVRIOwotICAgIG9mbi5scHN0ckZpbGVUaXRsZSAgICA9IE5VTEw7ICAgICAgICAgIC8qIFNldCBpbiBPcGVuIGFuZCBDbG9zZSBmdW5jdGlvbnMgKi8KLSAgICBvZm4ubk1heEZpbGVUaXRsZSAgICAgPSBNQVhfUEFUSDsKLSAgICBvZm4ubHBzdHJJbml0aWFsRGlyICAgPSBOVUxMOwotICAgIG9mbi5scHN0clRpdGxlICAgICAgICA9IE5VTEw7Ci0gICAgb2ZuLkZsYWdzICAgICAgICAgICAgID0gMDsgICAgICAgICAgICAgLyogU2V0IGluIE9wZW4gYW5kIENsb3NlIGZ1bmN0aW9ucyAqLwotICAgIG9mbi5uRmlsZU9mZnNldCAgICAgICA9IDA7Ci0gICAgb2ZuLm5GaWxlRXh0ZW5zaW9uICAgID0gMDsKLSAgICBvZm4ubHBzdHJEZWZFeHQgICAgICAgPSBURVhUICgicG5nIik7Ci0gICAgb2ZuLmxDdXN0RGF0YSAgICAgICAgID0gMDsKLSAgICBvZm4ubHBmbkhvb2sgICAgICAgICAgPSBOVUxMOwotICAgIG9mbi5scFRlbXBsYXRlTmFtZSAgICA9IE5VTEw7Ci19Ci0KLUJPT0wgUG5nRmlsZU9wZW5EbGcgKEhXTkQgaHduZCwgUFRTVFIgcHN0ckZpbGVOYW1lLCBQVFNUUiBwc3RyVGl0bGVOYW1lKQotewotICAgIG9mbi5od25kT3duZXIgICAgICAgICA9IGh3bmQ7Ci0gICAgb2ZuLmxwc3RyRmlsZSAgICAgICAgID0gcHN0ckZpbGVOYW1lOwotICAgIG9mbi5scHN0ckZpbGVUaXRsZSAgICA9IHBzdHJUaXRsZU5hbWU7Ci0gICAgb2ZuLkZsYWdzICAgICAgICAgICAgID0gT0ZOX0hJREVSRUFET05MWTsKLQotICAgIHJldHVybiBHZXRPcGVuRmlsZU5hbWUgKCZvZm4pOwotfQotCi1CT09MIFBuZ0ZpbGVTYXZlRGxnIChIV05EIGh3bmQsIFBUU1RSIHBzdHJGaWxlTmFtZSwgUFRTVFIgcHN0clRpdGxlTmFtZSkKLXsKLSAgICBvZm4uaHduZE93bmVyICAgICAgICAgPSBod25kOwotICAgIG9mbi5scHN0ckZpbGUgICAgICAgICA9IHBzdHJGaWxlTmFtZTsKLSAgICBvZm4ubHBzdHJGaWxlVGl0bGUgICAgPSBwc3RyVGl0bGVOYW1lOwotICAgIG9mbi5GbGFncyAgICAgICAgICAgICA9IE9GTl9ISURFUkVBRE9OTFkgfCBPRk5fT1ZFUldSSVRFUFJPTVBUOwotCi0gICAgcmV0dXJuIEdldFNhdmVGaWxlTmFtZSAoJm9mbik7Ci19Ci0KLS8qIFBORyBpbWFnZSBoYW5kbGVyIGZ1bmN0aW9ucyAqLwotCi1CT09MIFBuZ0xvYWRJbWFnZSAoUFRTVFIgcHN0ckZpbGVOYW1lLCBwbmdfYnl0ZSAqKnBwYkltYWdlRGF0YSwKLSAgICAgICAgICAgICAgICAgICBpbnQgKnBpV2lkdGgsIGludCAqcGlIZWlnaHQsIGludCAqcGlDaGFubmVscywgcG5nX2NvbG9yICpwQmtnQ29sb3IpCi17Ci0gICAgc3RhdGljIEZJTEUgICAgICAgICpwZkZpbGU7Ci0gICAgcG5nX2J5dGUgICAgICAgICAgICBwYlNpZ1s4XTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGlCaXREZXB0aDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGlDb2xvclR5cGU7Ci0gICAgZG91YmxlICAgICAgICAgICAgICBkR2FtbWE7Ci0gICAgcG5nX2NvbG9yXzE2ICAgICAgICpwQmFja2dyb3VuZDsKLSAgICBwbmdfdWludF8zMiAgICAgICAgIHVsQ2hhbm5lbHM7Ci0gICAgcG5nX3VpbnRfMzIgICAgICAgICB1bFJvd0J5dGVzOwotICAgIHBuZ19ieXRlICAgICAgICAgICAqcGJJbWFnZURhdGEgPSAqcHBiSW1hZ2VEYXRhOwotICAgIHN0YXRpYyBwbmdfYnl0ZSAgICoqcHBiUm93UG9pbnRlcnMgPSBOVUxMOwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLQotICAgIC8qIG9wZW4gdGhlIFBORyBpbnB1dCBmaWxlICovCi0KLSAgICBpZiAoIXBzdHJGaWxlTmFtZSkKLSAgICB7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoIShwZkZpbGUgPSBmb3Blbihwc3RyRmlsZU5hbWUsICJyYiIpKSkKLSAgICB7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvKiBmaXJzdCBjaGVjayB0aGUgZWlnaHQgYnl0ZSBQTkcgc2lnbmF0dXJlICovCi0KLSAgICBmcmVhZChwYlNpZywgMSwgOCwgcGZGaWxlKTsKLSAgICBpZiAocG5nX3NpZ19jbXAocGJTaWcsIDAsIDgpKQotICAgIHsKLSAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8qIGNyZWF0ZSB0aGUgdHdvIHBuZygtaW5mbykgc3RydWN0dXJlcyAqLwotCi0gICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLAotICAgICAgKHBuZ19lcnJvcl9wdHIpcG5nX2NleGNlcHRfZXJyb3IsIChwbmdfZXJyb3JfcHRyKU5VTEwpOwotICAgIGlmICghcG5nX3B0cikKLSAgICB7Ci0gICAgICAgICpwcGJJbWFnZURhdGEgPSBwYkltYWdlRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikKLSAgICB7Ci0gICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgKnBwYkltYWdlRGF0YSA9IHBiSW1hZ2VEYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIFRyeQotICAgIHsKLQotICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBwbmcgc3RydWN0dXJlICovCi0KLSNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECi0gICAgICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIHBmRmlsZSk7Ci0jZWxzZQotICAgICAgICBwbmdfc2V0X3JlYWRfZm4ocG5nX3B0ciwgKHBuZ192b2lkcClwZkZpbGUsIHBuZ19yZWFkX2RhdGEpOwotI2VuZGlmCi0KLSAgICAgICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7Ci0KLSAgICAgICAgLyogcmVhZCBhbGwgUE5HIGluZm8gdXAgdG8gaW1hZ2UgZGF0YSAqLwotCi0gICAgICAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgICAgIC8qIGdldCB3aWR0aCwgaGVpZ2h0LCBiaXQtZGVwdGggYW5kIGNvbG9yLXR5cGUgKi8KLQotICAgICAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHBpV2lkdGgsIHBpSGVpZ2h0LCAmaUJpdERlcHRoLAotICAgICAgICAgICAgJmlDb2xvclR5cGUsIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0gICAgICAgIC8qIGV4cGFuZCBpbWFnZXMgb2YgYWxsIGNvbG9yLXR5cGUgYW5kIGJpdC1kZXB0aCB0byAzeDgtYml0IFJHQiAqLwotICAgICAgICAvKiBsZXQgdGhlIGxpYnJhcnkgcHJvY2VzcyBhbHBoYSwgdHJhbnNwYXJlbmN5LCBiYWNrZ3JvdW5kLCBldGMuICovCi0KLSNpZmRlZiBQTkdfUkVBRF8xNl9UT184X1NVUFBPUlRFRAotICAgIGlmIChpQml0RGVwdGggPT0gMTYpCi0jICBpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAotICAgICAgICBwbmdfc2V0X3NjYWxlXzE2KHBuZ19wdHIpOwotIyAgZWxzZQotICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotIyAgZW5kaWYKLSNlbmRpZgotICAgICAgICBpZiAoaUNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKQotICAgICAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgICAgIGlmIChpQml0RGVwdGggPCA4KQotICAgICAgICAgICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0gICAgICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOwotICAgICAgICBpZiAoaUNvbG9yVHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgICAgICBpQ29sb3JUeXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgICAgICAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOwotCi0gICAgICAgIC8qIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciB0byBkcmF3IHRyYW5zcGFyZW50IGFuZCBhbHBoYSBpbWFnZXMgb3ZlciAqLwotICAgICAgICBpZiAocG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmcEJhY2tncm91bmQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfc2V0X2JhY2tncm91bmQocG5nX3B0ciwgcEJhY2tncm91bmQsIFBOR19CQUNLR1JPVU5EX0dBTU1BX0ZJTEUsIDEsIDEuMCk7Ci0gICAgICAgICAgICBwQmtnQ29sb3ItPnJlZCAgID0gKGJ5dGUpIHBCYWNrZ3JvdW5kLT5yZWQ7Ci0gICAgICAgICAgICBwQmtnQ29sb3ItPmdyZWVuID0gKGJ5dGUpIHBCYWNrZ3JvdW5kLT5ncmVlbjsKLSAgICAgICAgICAgIHBCa2dDb2xvci0+Ymx1ZSAgPSAoYnl0ZSkgcEJhY2tncm91bmQtPmJsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQmtnQ29sb3IgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgcmVxdWlyZWQgc2V0IGdhbW1hIGNvbnZlcnNpb24gKi8KLSAgICAgICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmRHYW1tYSkpCi0gICAgICAgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIChkb3VibGUpIDIuMiwgZEdhbW1hKTsKLQotICAgICAgICAvKiBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb25zIGFyZSByZWdpc3RlcmVkLCB1cGRhdGUgaW5mb19wdHIgZGF0YSAqLwotCi0gICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgICAgICAvKiBnZXQgYWdhaW4gd2lkdGgsIGhlaWdodCBhbmQgdGhlIG5ldyBiaXQtZGVwdGggYW5kIGNvbG9yLXR5cGUgKi8KLQotICAgICAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHBpV2lkdGgsIHBpSGVpZ2h0LCAmaUJpdERlcHRoLAotICAgICAgICAgICAgJmlDb2xvclR5cGUsIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0KLSAgICAgICAgLyogcm93X2J5dGVzIGlzIHRoZSB3aWR0aCB4IG51bWJlciBvZiBjaGFubmVscyAqLwotCi0gICAgICAgIHVsUm93Qnl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICAgICAgdWxDaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgICAgICpwaUNoYW5uZWxzID0gdWxDaGFubmVsczsKLQotICAgICAgICAvKiBub3cgd2UgY2FuIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSB0aGUgaW1hZ2UgKi8KLQotICAgICAgICBpZiAocGJJbWFnZURhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUgKHBiSW1hZ2VEYXRhKTsKLSAgICAgICAgICAgIHBiSW1hZ2VEYXRhID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHBiSW1hZ2VEYXRhID0gKHBuZ19ieXRlICopIG1hbGxvYyh1bFJvd0J5dGVzICogKCpwaUhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihwbmdfYnl0ZSkpKSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlZpc3VhbCBQTkc6IG91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgfQotICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGE7Ci0KLSAgICAgICAgLyogYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkgb2Ygcm93LXBvaW50ZXJzICovCi0KLSAgICAgICAgaWYgKChwcGJSb3dQb2ludGVycyA9IChwbmdfYnl0ZXBwKSBtYWxsb2MoKCpwaUhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihwbmdfYnl0ZXApKSkgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJWaXN1YWwgUE5HOiBvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgdGhlIGluZGl2aWR1YWwgcm93LXBvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMgKi8KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKCpwaUhlaWdodCk7IGkrKykKLSAgICAgICAgICAgIHBwYlJvd1BvaW50ZXJzW2ldID0gcGJJbWFnZURhdGEgKyBpICogdWxSb3dCeXRlczsKLQotICAgICAgICAvKiBub3cgd2UgY2FuIGdvIGFoZWFkIGFuZCBqdXN0IHJlYWQgdGhlIHdob2xlIGltYWdlICovCi0KLSAgICAgICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcHBiUm93UG9pbnRlcnMpOwotCi0gICAgICAgIC8qIHJlYWQgdGhlIGFkZGl0aW9uYWwgY2h1bmtzIGluIHRoZSBQTkcgZmlsZSAobm90IHJlYWxseSBuZWVkZWQpICovCi0KLSAgICAgICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIE5VTEwpOwotCi0gICAgICAgIC8qIGFuZCB3ZSdyZSBkb25lICovCi0KLSAgICAgICAgZnJlZSAocHBiUm93UG9pbnRlcnMpOwotICAgICAgICBwcGJSb3dQb2ludGVycyA9IE5VTEw7Ci0KLSAgICAgICAgLyogeWVwcCwgZG9uZSAqLwotICAgIH0KLQotICAgIENhdGNoIChtc2cpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLCBOVUxMKTsKLQotICAgICAgICAqcHBiSW1hZ2VEYXRhID0gcGJJbWFnZURhdGEgPSBOVUxMOwotCi0gICAgICAgIGlmKHBwYlJvd1BvaW50ZXJzKQotICAgICAgICAgICAgZnJlZSAocHBiUm93UG9pbnRlcnMpOwotCi0gICAgICAgIGZjbG9zZShwZkZpbGUpOwotCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBmY2xvc2UgKHBmRmlsZSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi1CT09MIFBuZ1NhdmVJbWFnZSAoUFRTVFIgcHN0ckZpbGVOYW1lLCBwbmdfYnl0ZSAqcERpRGF0YSwKLSAgICAgICAgICAgICAgICAgICBpbnQgaVdpZHRoLCBpbnQgaUhlaWdodCwgcG5nX2NvbG9yIGJrZ0NvbG9yKQotewotICAgIGNvbnN0IGludCAgICAgICAgICAgY2lCaXREZXB0aCA9IDg7Ci0gICAgY29uc3QgaW50ICAgICAgICAgICBjaUNoYW5uZWxzID0gMzsKLQotICAgIHN0YXRpYyBGSUxFICAgICAgICAqcGZGaWxlOwotICAgIHBuZ191aW50XzMyICAgICAgICAgdWxSb3dCeXRlczsKLSAgICBzdGF0aWMgcG5nX2J5dGUgICAqKnBwYlJvd1BvaW50ZXJzID0gTlVMTDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0KLSAgICAvKiBvcGVuIHRoZSBQTkcgb3V0cHV0IGZpbGUgKi8KLQotICAgIGlmICghcHN0ckZpbGVOYW1lKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoIShwZkZpbGUgPSBmb3Blbihwc3RyRmlsZU5hbWUsICJ3YiIpKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLyogcHJlcGFyZSB0aGUgc3RhbmRhcmQgUE5HIHN0cnVjdHVyZXMgKi8KLQotICAgIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsCi0gICAgICAocG5nX2Vycm9yX3B0cilwbmdfY2V4Y2VwdF9lcnJvciwgKHBuZ19lcnJvcl9wdHIpTlVMTCk7Ci0gICAgaWYgKCFwbmdfcHRyKQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBmRmlsZSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikgewotICAgICAgICBmY2xvc2UocGZGaWxlKTsKLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBUcnkKLSAgICB7Ci0gICAgICAgIC8qIGluaXRpYWxpemUgdGhlIHBuZyBzdHJ1Y3R1cmUgKi8KLQotI2lmZGVmIFBOR19TVERJT19TVVBQT1JURUQKLSAgICAgICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgcGZGaWxlKTsKLSNlbHNlCi0gICAgICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nX3B0ciwgKHBuZ192b2lkcClwZkZpbGUsIHBuZ193cml0ZV9kYXRhLCBwbmdfZmx1c2gpOwotI2VuZGlmCi0KLSAgICAgICAgLyogd2UncmUgZ29pbmcgdG8gd3JpdGUgYSB2ZXJ5IHNpbXBsZSAzeDgtYml0IFJHQiBpbWFnZSAqLwotCi0gICAgICAgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgaVdpZHRoLCBpSGVpZ2h0LCBjaUJpdERlcHRoLAotICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCLCBQTkdfSU5URVJMQUNFX05PTkUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UsCi0gICAgICAgICAgICBQTkdfRklMVEVSX1RZUEVfQkFTRSk7Ci0KLSAgICAgICAgLyogd3JpdGUgdGhlIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uICovCi0KLSAgICAgICAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgICAgIC8qIHN3YXAgdGhlIEJHUiBwaXhlbHMgaW4gdGhlIERpRGF0YSBzdHJ1Y3R1cmUgdG8gUkdCICovCi0KLSAgICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7Ci0KLSAgICAgICAgLyogcm93X2J5dGVzIGlzIHRoZSB3aWR0aCB4IG51bWJlciBvZiBjaGFubmVscyAqLwotCi0gICAgICAgIHVsUm93Qnl0ZXMgPSBpV2lkdGggKiBjaUNoYW5uZWxzOwotCi0gICAgICAgIC8qIHdlIGNhbiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5IG9mIHJvdy1wb2ludGVycyAqLwotCi0gICAgICAgIGlmICgocHBiUm93UG9pbnRlcnMgPSAocG5nX2J5dGVwcCkgbWFsbG9jKGlIZWlnaHQgKiBzaXplb2YocG5nX2J5dGVwKSkpID09IE5VTEwpCi0gICAgICAgICAgICBUaHJvdyAiVmlzdWFscG5nOiBPdXQgb2YgbWVtb3J5IjsKLQotICAgICAgICAvKiBzZXQgdGhlIGluZGl2aWR1YWwgcm93LXBvaW50ZXJzIHRvIHBvaW50IGF0IHRoZSBjb3JyZWN0IG9mZnNldHMgKi8KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUhlaWdodDsgaSsrKQotICAgICAgICAgICAgcHBiUm93UG9pbnRlcnNbaV0gPSBwRGlEYXRhICsgaSAqICgoKHVsUm93Qnl0ZXMgKyAzKSA+PiAyKSA8PCAyKTsKLQotICAgICAgICAvKiB3cml0ZSBvdXQgdGhlIGVudGlyZSBpbWFnZSBkYXRhIGluIG9uZSBjYWxsICovCi0KLSAgICAgICAgcG5nX3dyaXRlX2ltYWdlIChwbmdfcHRyLCBwcGJSb3dQb2ludGVycyk7Ci0KLSAgICAgICAgLyogd3JpdGUgdGhlIGFkZGl0aW9uYWwgY2h1bmtzIHRvIHRoZSBQTkcgZmlsZSAobm90IHJlYWxseSBuZWVkZWQpICovCi0KLSAgICAgICAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICAgICAgLyogYW5kIHdlJ3JlIGRvbmUgKi8KLQotICAgICAgICBmcmVlIChwcGJSb3dQb2ludGVycyk7Ci0gICAgICAgIHBwYlJvd1BvaW50ZXJzID0gTlVMTDsKLQotICAgICAgICAvKiBjbGVhbiB1cCBhZnRlciB0aGUgd3JpdGUsIGFuZCBmcmVlIGFueSBtZW1vcnkgYWxsb2NhdGVkICovCi0KLSAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCAocG5nX2luZm9wcCkgTlVMTCk7Ci0KLSAgICAgICAgLyogeWVwcCwgZG9uZSAqLwotICAgIH0KLQotICAgIENhdGNoIChtc2cpCi0gICAgewotICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsIChwbmdfaW5mb3BwKSBOVUxMKTsKLQotICAgICAgICBpZihwcGJSb3dQb2ludGVycykKLSAgICAgICAgICAgIGZyZWUgKHBwYlJvd1BvaW50ZXJzKTsKLQotICAgICAgICBmY2xvc2UocGZGaWxlKTsKLQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgZmNsb3NlIChwZkZpbGUpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZm5kZWYgUE5HX1NURElPX1NVUFBPUlRFRAotCi1zdGF0aWMgdm9pZAotcG5nX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpCi17Ci0gICBwbmdfc2l6ZV90IGNoZWNrOwotCi0gICAvKiBmcmVhZCgpIHJldHVybnMgMCBvbiBlcnJvciwgc28gaXQgaXMgT0sgdG8gc3RvcmUgdGhpcyBpbiBhIHBuZ19zaXplX3QKLSAgICAqIGluc3RlYWQgb2YgYW4gaW50LCB3aGljaCBpcyB3aGF0IGZyZWFkKCkgYWN0dWFsbHkgcmV0dXJucy4KLSAgICAqLwotICAgY2hlY2sgPSAocG5nX3NpemVfdClmcmVhZChkYXRhLCAocG5nX3NpemVfdCkxLCBsZW5ndGgsCi0gICAgICAoRklMRSAqKXBuZ19wdHItPmlvX3B0cik7Ci0KLSAgIGlmIChjaGVjayAhPSBsZW5ndGgpCi0gICB7Ci0gICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJlYWQgRXJyb3IiKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXBuZ193cml0ZV9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkKLXsKLSAgIHBuZ191aW50XzMyIGNoZWNrOwotCi0gICBjaGVjayA9IGZ3cml0ZShkYXRhLCAxLCBsZW5ndGgsIChGSUxFICopKHBuZ19wdHItPmlvX3B0cikpOwotICAgaWYgKGNoZWNrICE9IGxlbmd0aCkKLSAgIHsKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiV3JpdGUgRXJyb3IiKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXBuZ19mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKQotewotICAgRklMRSAqaW9fcHRyOwotICAgaW9fcHRyID0gKEZJTEUgKilDVlRfUFRSKChwbmdfcHRyLT5pb19wdHIpKTsKLSAgIGlmIChpb19wdHIgIT0gTlVMTCkKLSAgICAgIGZmbHVzaChpb19wdHIpOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLQotICogIGVuZCBvZiBzb3VyY2UKLSAqLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuaCBiL2NvbnRyaWIvdmlzdXBuZy9QbmdGaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDQyNmMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi92aXN1cG5nL1BuZ0ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBQTkdGSUxFLkggLS0gSGVhZGVyIEZpbGUgZm9yIHBuZ2ZpbGUuYyovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIENvcHlyaWdodCAyMDAwLCBXaWxsZW0gdmFuIFNjaGFpay4qLwotCi0vKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLiovCi0vKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyKi8KLS8qIGFuZCBsaWNlbnNlIGluIHBuZy5oKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi12b2lkIFBuZ0ZpbGVJbml0aWFsaXplIChIV05EIGh3bmQpIDsKLUJPT0wgUG5nRmlsZU9wZW5EbGcgKEhXTkQgaHduZCwgUFRTVFIgcHN0ckZpbGVOYW1lLCBQVFNUUiBwc3RyVGl0bGVOYW1lKSA7Ci1CT09MIFBuZ0ZpbGVTYXZlRGxnIChIV05EIGh3bmQsIFBUU1RSIHBzdHJGaWxlTmFtZSwgUFRTVFIgcHN0clRpdGxlTmFtZSkgOwotCi1CT09MIFBuZ0xvYWRJbWFnZSAoUFRTVFIgcHN0ckZpbGVOYW1lLCBwbmdfYnl0ZSAqKnBwYkltYWdlRGF0YSwKLSAgICAgICAgICAgICAgICAgICBpbnQgKnBpV2lkdGgsIGludCAqcGlIZWlnaHQsIGludCAqcGlDaGFubmVscywgcG5nX2NvbG9yICpwQmtnQ29sb3IpOwotQk9PTCBQbmdTYXZlSW1hZ2UgKFBUU1RSIHBzdHJGaWxlTmFtZSwgcG5nX2J5dGUgKnBEaURhdGEsCi0gICAgICAgICAgICAgICAgICAgaW50IGlXaWR0aCwgaW50IGlIZWlnaHQsIHBuZ19jb2xvciBCa2dDb2xvcik7Ci0KLSNpZm5kZWYgUE5HX1NURElPX1NVUFBPUlRFRAotc3RhdGljIHZvaWQgcG5nX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotc3RhdGljIHZvaWQgcG5nX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIHBuZ19mbHVzaChwbmdfc3RydWN0cCBwbmdfcHRyKTsKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jb250cmliL3Zpc3VwbmcvUkVBRE1FLnR4dCBiL2NvbnRyaWIvdmlzdXBuZy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM1Y2JhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdmlzdXBuZy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMCBmb3IgVmlzdWFsUG5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDAsIFdpbGxlbSB2YW4gU2NoYWlrLgotCi1UaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotQXMgYSBQTkcgLmRsbCBkZW1vIFZpc3VhbFBuZyBpcyBmaW5pc2hlZC4gTW9yZSBmZWF0dXJlcyB3b3VsZCBvbmx5IGhpbmRlcgotdGhlIHByb2dyYW0ncyBvYmplY3RpdmUuIEhvd2V2ZXIsIGZ1cnRoZXIgZXh0ZW5zaW9ucyAobGlrZSBzdXBwb3J0IGZvciBvdGhlcgotZ3JhcGhpY3MgZm9ybWF0cykgYXJlIGluIGRldmVsb3BtZW50LiBUbyBnZXQgdGhlc2UsIG9yIGZvciBwcmUtY29tcGlsZWQKLWJpbmFyaWVzLCBnbyB0byAiaHR0cDovL3d3dy5zY2hhaWsuY29tL3BuZy92aXN1YWxwbmcuaHRtbCIuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Bc3N1bWVzIHRoYXQKLQotICAgbGlicG5nIERMTHMgYW5kIExJQnMgYXJlIGluIC4uXC4uXHByb2plY3RzXG1zdmNcd2luMzJcbGlicG5nCi0gICB6bGliIERMTHMgYW5kIExJQnMgYXJlIGluICAgLi5cLi5ccHJvamVjdHNcbXN2Y1x3aW4zMlx6bGliCi0gICBsaWJwbmcgaGVhZGVyIGZpbGVzIGFyZSBpbiAgLi5cLi5cLi5cbGlicG5nCi0gICB6bGliIGhlYWRlciBmaWxlcyBhcmUgaW4gICAgLi5cLi5cLi5cemxpYgotICAgdGhlIHBuZ3N1aXRlIGltYWdlcyBhcmUgaW4gIC4uXHBuZ3N1aXRlCi0KLVRvIGJ1aWxkOgotCi0xKSBPbiB0aGUgbWFpbiBtZW51IFNlbGVjdCAiQnVpbGR8U2V0IEFjdGl2ZSBjb25maWd1cmF0aW9uIi4KLSAgIENob29zZSB0aGUgY29uZmlndXJhdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsaWJyYXJ5IHlvdSB3YW50IHRvIHRlc3QuCi0gICBUaGlzIGxpYnJhcnkgbXVzdCBoYXZlIGJlZW4gYnVpbHQgdXNpbmcgdGhlIGxpYnBuZyBNUyBwcm9qZWN0IGxvY2F0ZWQgaW4KLSAgIHRoZSAiLi5cLi5cbXNjdiIgc3ViZGlyZWN0b3J5LgotCi0yKSBTZWxlY3QgIkJ1aWxkfENsZWFuIgotCi0zKSBTZWxlY3QgIkJ1aWxkfFJlYnVpbGQgQWxsIgotCi00KSBBZnRlciBjb21waWxpbmcgYW5kIGxpbmtpbmcgVmlzdWFsUG5nIHdpbGwgYmUgc3RhcnRlZCB0byB2aWV3IGFuIGltYWdlCi0gICBmcm9tIHRoZSBQbmdTdWl0ZSBkaXJlY3RvcnkuICBQcmVzcyBDdHJsLU4gKGFuZCBDdHJsLVYpIGZvciBvdGhlciBpbWFnZXMuCi0KLQotVG8gaW5zdGFsbDoKLQotV2hlbiBkaXN0cmlidXRpbmcgVmlzdWFsUG5nIChvciBhIGZ1cnRoZXIgZGV2ZWxvcG1lbnQpIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwotYXJlIGF2YWlsYWJsZToKLQotMSkgQnVpbGQgdGhlIHByb2dyYW0gd2l0aCB0aGUgY29uZmlndXJhdGlvbiAiV2luMzIgTElCIiBhbmQgeW91IG9ubHkgbmVlZCB0bwotICAgaW5jbHVkZSB0aGUgZXhlY3V0YWJsZSBmcm9tIHRoZSAuL2xpYiBkaXJlY3RvcnkgaW4geW91ciBkaXN0cmlidXRpb24uCi0KLTIpIEJ1aWxkIHRoZSBwcm9ncmFtIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gIldpbjMyIERMTCIgYW5kIHlvdSBuZWVkIHRvIHB1dAotICAgaW4geW91ciBkaXN0cmlidXRpb24gdGhlIGV4ZWN1dGFibGUgZnJvbSB0aGUgLi9kbGwgZGlyZWN0b3J5IGFuZCB0aGUgZGxsJ3MKLSAgIGxpYnBuZzEuZGxsLCB6bGliLmRsbCBhbmQgbXN2Y3J0LmRsbC4gIFRoZXNlIG5lZWQgdG8gYmUgaW4gdGhlIHVzZXIncyBQQVRILgotCi0KLVdpbGxlbSB2YW4gU2NoYWlrCi1DYWxnYXJ5LCBKdW5lIDZ0aCAyMDAwCi0KLVAuUy4gVmlzdWFsUG5nIHdhcyB3cml0dGVuIGJhc2VkIG9uIHByZWxpbWluYXJ5IHdvcmsgb2Y6Ci0KLSAgICAtIFNpbW9uLVBpZXJyZSBDYWRpZXV4Ci0gICAgLSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAgICAtIEdyZWcgUm9lbG9mcwotCmRpZmYgLS1naXQgYS9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmMgYi9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNjUyNWEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgVmlzdWFsUG5nLkMgLS0gU2hvd3MgYSBQTkcgaW1hZ2UKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogQ29weXJpZ2h0IDIwMDAsIFdpbGxlbSB2YW4gU2NoYWlrLgotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotICovCi0KLS8qIHN3aXRjaGVzICovCi0KLS8qIGRlZmluZXMgKi8KLQotI2RlZmluZSBQUk9HTkFNRSAgIlZpc3VhbFBuZyIKLSNkZWZpbmUgTE9OR05BTUUgICJXaW4zMiBWaWV3ZXIgZm9yIFBORy1maWxlcyIKLSNkZWZpbmUgVkVSU0lPTiAgICIxLjAgb2YgMjAwMCBKdW5lIDA3IgotCi0vKiBjb25zdGFudHMgKi8KLQotI2RlZmluZSBNQVJHSU4gOAotCi0vKiBzdGFuZGFyZCBpbmNsdWRlcyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8emxpYi5oPgotCi0vKiBhcHBsaWNhdGlvbiBpbmNsdWRlcyAqLwotCi0jaW5jbHVkZSAicG5nLmgiCi0jaW5jbHVkZSAicG5nZmlsZS5oIgotI2luY2x1ZGUgInJlc291cmNlLmgiCi0KLS8qIG1hY3JvcyAqLwotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLUxSRVNVTFQgQ0FMTEJBQ0sgV25kUHJvYyAoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOwotQk9PTCAgICBDQUxMQkFDSyBBYm91dERsZ1Byb2MgKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKSA7Ci0KLUJPT0wgQ2VudGVyQWJvdXQgKEhXTkQgaHduZENoaWxkLCBIV05EIGh3bmRQYXJlbnQpOwotCi1CT09MIEJ1aWxkUG5nTGlzdCAoUFRTVFIgcHN0clBhdGhOYW1lLCBUQ0hBUiAqKnBwRmlsZUxpc3QsIGludCAqcEZpbGVDb3VudCwKLSAgICAgICAgaW50ICpwRmlsZUluZGV4KTsKLQotQk9PTCBTZWFyY2hQbmdMaXN0IChUQ0hBUiAqcEZpbGVMaXN0LCBpbnQgRmlsZUNvdW50LCBpbnQgKnBGaWxlSW5kZXgsCi0gICAgICAgIFBUU1RSIHBzdHJQcmV2TmFtZSwgUFRTVFIgcHN0ck5leHROYW1lKTsKLQotQk9PTCBMb2FkSW1hZ2VGaWxlKEhXTkQgaHduZCwgUFRTVFIgcHN0clBhdGhOYW1lLAotICAgICAgICBwbmdfYnl0ZSAqKnBwYkltYWdlLCBpbnQgKnB4SW1nU2l6ZSwgaW50ICpweUltZ1NpemUsIGludCAqcGlDaGFubmVscywKLSAgICAgICAgcG5nX2NvbG9yICpwQmtnQ29sb3IpOwotCi1CT09MIERpc3BsYXlJbWFnZSAoSFdORCBod25kLCBCWVRFICoqcHBEaWIsCi0gICAgICAgIEJZVEUgKipwcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSwKLSAgICAgICAgQllURSAqcGJJbWFnZSwgaW50IGN4SW1nU2l6ZSwgaW50IGN5SW1nU2l6ZSwgaW50IGNJbWdDaGFubmVscywKLSAgICAgICAgQk9PTCBiU3RyZXRjaGVkKTsKLQotQk9PTCBJbml0Qml0bWFwICgKLSAgICAgICAgQllURSAqcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSk7Ci0KLUJPT0wgRmlsbEJpdG1hcCAoCi0gICAgICAgIEJZVEUgKnBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUsCi0gICAgICAgIEJZVEUgKnBiSW1hZ2UsIGludCBjeEltZ1NpemUsIGludCBjeUltZ1NpemUsIGludCBjSW1nQ2hhbm5lbHMsCi0gICAgICAgIEJPT0wgYlN0cmV0Y2hlZCk7Ci0KLS8qIGEgZmV3IGdsb2JhbCB2YXJpYWJsZXMgKi8KLQotc3RhdGljIGNoYXIgKnN6UHJvZ05hbWUgPSBQUk9HTkFNRTsKLXN0YXRpYyBjaGFyICpzekFwcE5hbWUgPSBMT05HTkFNRTsKLXN0YXRpYyBjaGFyICpzekljb25OYW1lID0gUFJPR05BTUU7Ci1zdGF0aWMgY2hhciBzekNtZEZpbGVOYW1lIFtNQVhfUEFUSF07Ci0KLS8qIE1BSU4gcm91dGluZSAqLwotCi1pbnQgV0lOQVBJIFdpbk1haW4gKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICBQU1RSIHN6Q21kTGluZSwgaW50IGlDbWRTaG93KQotewotICAgIEhBQ0NFTCAgIGhBY2NlbDsKLSAgICBIV05EICAgICBod25kOwotICAgIE1TRyAgICAgIG1zZzsKLSAgICBXTkRDTEFTUyB3bmRjbGFzczsKLSAgICBpbnQgaXhCb3JkZXJzLCBpeUJvcmRlcnM7Ci0KLSAgICB3bmRjbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7Ci0gICAgd25kY2xhc3MubHBmblduZFByb2MgICA9IFduZFByb2M7Ci0gICAgd25kY2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7Ci0gICAgd25kY2xhc3MuY2JXbmRFeHRyYSAgICA9IDA7Ci0gICAgd25kY2xhc3MuaEluc3RhbmNlICAgICA9IGhJbnN0YW5jZTsKLSAgICB3bmRjbGFzcy5oSWNvbiAgICAgICAgID0gTG9hZEljb24gKGhJbnN0YW5jZSwgc3pJY29uTmFtZSkgOwotICAgIHduZGNsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yIChOVUxMLCBJRENfQVJST1cpOwotICAgIHduZGNsYXNzLmhickJhY2tncm91bmQgPSBOVUxMOyAvKiAoSEJSVVNIKSBHZXRTdG9ja09iamVjdCAoR1JBWV9CUlVTSCk7ICovCi0gICAgd25kY2xhc3MubHBzek1lbnVOYW1lICA9IHN6UHJvZ05hbWU7Ci0gICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IHN6UHJvZ05hbWU7Ci0KLSAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZ3bmRjbGFzcykpCi0gICAgewotICAgICAgICBNZXNzYWdlQm94IChOVUxMLCBURVhUICgiRXJyb3I6IHRoaXMgcHJvZ3JhbSByZXF1aXJlcyBXaW5kb3dzIE5UISIpLAotICAgICAgICAgICAgc3pQcm9nTmFtZSwgTUJfSUNPTkVSUk9SKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogaWYgZmlsZW5hbWUgZ2l2ZW4gb24gY29tbWFuZGxpbmUsIHN0b3JlIGl0ICovCi0gICAgaWYgKChzekNtZExpbmUgIT0gTlVMTCkgJiYgKCpzekNtZExpbmUgIT0gJ1wwJykpCi0gICAgICAgIGlmIChzekNtZExpbmVbMF0gPT0gJyInKQotICAgICAgICAgICAgc3RybmNweSAoc3pDbWRGaWxlTmFtZSwgc3pDbWRMaW5lICsgMSwgc3RybGVuKHN6Q21kTGluZSkgLSAyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyY3B5IChzekNtZEZpbGVOYW1lLCBzekNtZExpbmUpOwotICAgIGVsc2UKLSAgICAgICAgc3RyY3B5IChzekNtZEZpbGVOYW1lLCAiIik7Ci0KLSAgICAvKiBjYWxjdWxhdGUgc2l6ZSBvZiB3aW5kb3ctYm9yZGVycyAqLwotICAgIGl4Qm9yZGVycyA9IDIgKiAoR2V0U3lzdGVtTWV0cmljcyAoU01fQ1hCT1JERVIpICsKLSAgICAgICAgICAgICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MgKFNNX0NYRExHRlJBTUUpKTsKLSAgICBpeUJvcmRlcnMgPSAyICogKEdldFN5c3RlbU1ldHJpY3MgKFNNX0NZQk9SREVSKSArCi0gICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWURMR0ZSQU1FKSkgKwotICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyAoU01fQ1lDQVBUSU9OKSArCi0gICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzIChTTV9DWU1FTlVTSVpFKSArCi0gICAgICAgICAgICAgICAgICAgICAxOyAvKiBXdlM6IGRvbid0IGFzayBtZSB3aHk/ICAqLwotCi0gICAgaHduZCA9IENyZWF0ZVdpbmRvdyAoc3pQcm9nTmFtZSwgc3pBcHBOYW1lLAotICAgICAgICBXU19PVkVSTEFQUEVEV0lORE9XLAotICAgICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULAotICAgICAgICA1MTIgKyAyICogTUFSR0lOICsgaXhCb3JkZXJzLCAzODQgKyAyICogTUFSR0lOICsgaXlCb3JkZXJzLAotLyogICAgICBDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULCAqLwotICAgICAgICBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwpOwotCi0gICAgU2hvd1dpbmRvdyAoaHduZCwgaUNtZFNob3cpOwotICAgIFVwZGF0ZVdpbmRvdyAoaHduZCk7Ci0KLSAgICBoQWNjZWwgPSBMb2FkQWNjZWxlcmF0b3JzIChoSW5zdGFuY2UsIHN6UHJvZ05hbWUpOwotCi0gICAgd2hpbGUgKEdldE1lc3NhZ2UgKCZtc2csIE5VTEwsIDAsIDApKQotICAgIHsKLSAgICAgICAgaWYgKCFUcmFuc2xhdGVBY2NlbGVyYXRvciAoaHduZCwgaEFjY2VsLCAmbXNnKSkKLSAgICAgICAgewotICAgICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSAoJm1zZyk7Ci0gICAgICAgICAgICBEaXNwYXRjaE1lc3NhZ2UgKCZtc2cpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtc2cud1BhcmFtOwotfQotCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MgKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLAotICAgICAgICBMUEFSQU0gbFBhcmFtKQotewotICAgIHN0YXRpYyBISU5TVEFOQ0UgICAgICAgICAgaEluc3RhbmNlIDsKLSAgICBzdGF0aWMgSERDICAgICAgICAgICAgICAgIGhkYzsKLSAgICBzdGF0aWMgUEFJTlRTVFJVQ1QgICAgICAgIHBzOwotICAgIHN0YXRpYyBITUVOVSAgICAgICAgICAgICAgaE1lbnU7Ci0KLSAgICBzdGF0aWMgQklUTUFQRklMRUhFQURFUiAgKnBibWZoOwotICAgIHN0YXRpYyBCSVRNQVBJTkZPSEVBREVSICAqcGJtaWg7Ci0gICAgc3RhdGljIEJZVEUgICAgICAgICAgICAgICpwYkltYWdlOwotICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgY3hXaW5TaXplLCBjeVdpblNpemU7Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgICAgICBjeEltZ1NpemUsIGN5SW1nU2l6ZTsKLSAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGNJbWdDaGFubmVsczsKLSAgICBzdGF0aWMgcG5nX2NvbG9yICAgICAgICAgIGJrZ0NvbG9yID0gezEyNywgMTI3LCAxMjd9OwotCi0gICAgc3RhdGljIEJPT0wgICAgICAgICAgICAgICBiU3RyZXRjaGVkID0gVFJVRTsKLQotICAgIHN0YXRpYyBCWVRFICAgICAgICAgICAgICAqcERpYiA9IE5VTEw7Ci0gICAgc3RhdGljIEJZVEUgICAgICAgICAgICAgICpwRGlEYXRhID0gTlVMTDsKLQotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pJbWdQYXRoTmFtZSBbTUFYX1BBVEhdOwotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAgc3pUaXRsZU5hbWUgW01BWF9QQVRIXTsKLQotICAgIHN0YXRpYyBUQ0hBUiAgICAgICAgICAgICAqcFBuZ0ZpbGVMaXN0ID0gTlVMTDsKLSAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGlQbmdGaWxlQ291bnQ7Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgICAgICBpUG5nRmlsZUluZGV4OwotCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICBiT2s7Ci0KLSAgICBzd2l0Y2ggKG1lc3NhZ2UpCi0gICAgewotICAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgICBoSW5zdGFuY2UgPSAoKExQQ1JFQVRFU1RSVUNUKSBsUGFyYW0pLT5oSW5zdGFuY2UgOwotICAgICAgICBQbmdGaWxlSW5pdGlhbGl6ZSAoaHduZCk7Ci0KLSAgICAgICAgc3RyY3B5IChzekltZ1BhdGhOYW1lLCAiIik7Ci0KLSAgICAgICAgLyogaW4gY2FzZSB3ZSBwcm9jZXNzIGZpbGUgZ2l2ZW4gb24gY29tbWFuZC1saW5lICovCi0KLSAgICAgICAgaWYgKHN6Q21kRmlsZU5hbWVbMF0gIT0gJ1wwJykKLSAgICAgICAgewotICAgICAgICAgICAgc3RyY3B5IChzekltZ1BhdGhOYW1lLCBzekNtZEZpbGVOYW1lKTsKLQotICAgICAgICAgICAgLyogcmVhZCB0aGUgb3RoZXIgcG5nLWZpbGVzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGxhdGVyICovCi0gICAgICAgICAgICAvKiBuZXh0L3ByZXZpb3VzIGNvbW1hbmRzICovCi0KLSAgICAgICAgICAgIEJ1aWxkUG5nTGlzdCAoc3pJbWdQYXRoTmFtZSwgJnBQbmdGaWxlTGlzdCwgJmlQbmdGaWxlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZpUG5nRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgLyogbG9hZCB0aGUgaW1hZ2UgZnJvbSBmaWxlICovCi0KLSAgICAgICAgICAgIGlmICghTG9hZEltYWdlRmlsZSAoaHduZCwgc3pJbWdQYXRoTmFtZSwKLSAgICAgICAgICAgICAgICAmcGJJbWFnZSwgJmN4SW1nU2l6ZSwgJmN5SW1nU2l6ZSwgJmNJbWdDaGFubmVscywgJmJrZ0NvbG9yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgLyogaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZSAqLwotCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgIC8qIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcCAqLwotCi0gICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgV01fU0laRToKLSAgICAgICAgY3hXaW5TaXplID0gTE9XT1JEIChsUGFyYW0pOwotICAgICAgICBjeVdpblNpemUgPSBISVdPUkQgKGxQYXJhbSk7Ci0KLSAgICAgICAgLyogaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZSAqLwotCi0gICAgICAgIEludmFsaWRhdGVSZWN0IChod25kLCBOVUxMLCBUUlVFKTsKLQotICAgICAgICAvKiBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAgKi8KLQotICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICBwYkltYWdlLCBjeEltZ1NpemUsIGN5SW1nU2l6ZSwgY0ltZ0NoYW5uZWxzLCBiU3RyZXRjaGVkKTsKLQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgV01fSU5JVE1FTlVQT1BVUDoKLSAgICAgICAgaE1lbnUgPSBHZXRNZW51IChod25kKTsKLQotICAgICAgICBpZiAocGJJbWFnZSkKLSAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtIChoTWVudSwgSURNX0ZJTEVfU0FWRSwgTUZfRU5BQkxFRCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEVuYWJsZU1lbnVJdGVtIChoTWVudSwgSURNX0ZJTEVfU0FWRSwgTUZfR1JBWUVEKTsKLQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgV01fQ09NTUFORDoKLSAgICAgICAgaE1lbnUgPSBHZXRNZW51IChod25kKTsKLQotICAgICAgICBzd2l0Y2ggKExPV09SRCAod1BhcmFtKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIElETV9GSUxFX09QRU46Ci0KLSAgICAgICAgICAgIC8qIHNob3cgdGhlIEZpbGUgT3BlbiBkaWFsb2cgYm94ICovCi0KLSAgICAgICAgICAgIGlmICghUG5nRmlsZU9wZW5EbGcgKGh3bmQsIHN6SW1nUGF0aE5hbWUsIHN6VGl0bGVOYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgLyogcmVhZCB0aGUgb3RoZXIgcG5nLWZpbGVzIGluIHRoZSBkaXJlY3RvcnkgZm9yIGxhdGVyICovCi0gICAgICAgICAgICAvKiBuZXh0L3ByZXZpb3VzIGNvbW1hbmRzICovCi0KLSAgICAgICAgICAgIEJ1aWxkUG5nTGlzdCAoc3pJbWdQYXRoTmFtZSwgJnBQbmdGaWxlTGlzdCwgJmlQbmdGaWxlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZpUG5nRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgLyogbG9hZCB0aGUgaW1hZ2UgZnJvbSBmaWxlICovCi0KLSAgICAgICAgICAgIGlmICghTG9hZEltYWdlRmlsZSAoaHduZCwgc3pJbWdQYXRoTmFtZSwKLSAgICAgICAgICAgICAgICAmcGJJbWFnZSwgJmN4SW1nU2l6ZSwgJmN5SW1nU2l6ZSwgJmNJbWdDaGFubmVscywgJmJrZ0NvbG9yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgLyogaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZSAqLwotCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgIC8qIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcCAqLwotCi0gICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfU0FWRToKLQotICAgICAgICAgICAgLyogc2hvdyB0aGUgRmlsZSBTYXZlIGRpYWxvZyBib3ggKi8KLQotICAgICAgICAgICAgaWYgKCFQbmdGaWxlU2F2ZURsZyAoaHduZCwgc3pJbWdQYXRoTmFtZSwgc3pUaXRsZU5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAvKiBzYXZlIHRoZSBQTkcgdG8gYSBkaXNrIGZpbGUgKi8KLQotICAgICAgICAgICAgU2V0Q3Vyc29yIChMb2FkQ3Vyc29yIChOVUxMLCBJRENfV0FJVCkpOwotICAgICAgICAgICAgU2hvd0N1cnNvciAoVFJVRSk7Ci0KLSAgICAgICAgICAgIGJPayA9IFBuZ1NhdmVJbWFnZSAoc3pJbWdQYXRoTmFtZSwgcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgICBia2dDb2xvcik7Ci0KLSAgICAgICAgICAgIFNob3dDdXJzb3IgKEZBTFNFKTsKLSAgICAgICAgICAgIFNldEN1cnNvciAoTG9hZEN1cnNvciAoTlVMTCwgSURDX0FSUk9XKSk7Ci0KLSAgICAgICAgICAgIGlmICghYk9rKQotICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3ggKGh3bmQsIFRFWFQgKCJFcnJvciBpbiBzYXZpbmcgdGhlIFBORyBpbWFnZSIpLAotICAgICAgICAgICAgICAgIHN6UHJvZ05hbWUsIE1CX0lDT05FWENMQU1BVElPTiB8IE1CX09LKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfTkVYVDoKLQotICAgICAgICAgICAgLyogcmVhZCBuZXh0IGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgKi8KLQotICAgICAgICAgICAgaWYgKFNlYXJjaFBuZ0xpc3QgKHBQbmdGaWxlTGlzdCwgaVBuZ0ZpbGVDb3VudCwgJmlQbmdGaWxlSW5kZXgsCi0gICAgICAgICAgICAgICAgTlVMTCwgc3pJbWdQYXRoTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcCAoc3pJbWdQYXRoTmFtZSwgIiIpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAgICAgLyogbG9hZCB0aGUgaW1hZ2UgZnJvbSBmaWxlICovCi0KLSAgICAgICAgICAgICAgICBpZiAoIUxvYWRJbWFnZUZpbGUgKGh3bmQsIHN6SW1nUGF0aE5hbWUsICZwYkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgJmN4SW1nU2l6ZSwgJmN5SW1nU2l6ZSwgJmNJbWdDaGFubmVscywgJmJrZ0NvbG9yKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBpbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSBmb3IgbGF0ZXIgdXBkYXRlICovCi0KLSAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAgKi8KLQotICAgICAgICAgICAgICAgIERpc3BsYXlJbWFnZSAoaHduZCwgJnBEaWIsICZwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfUFJFVklPVVM6Ci0KLSAgICAgICAgICAgIC8qIHJlYWQgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLwotCi0gICAgICAgICAgICBpZiAoU2VhcmNoUG5nTGlzdCAocFBuZ0ZpbGVMaXN0LCBpUG5nRmlsZUNvdW50LCAmaVBuZ0ZpbGVJbmRleCwKLSAgICAgICAgICAgICAgICBzekltZ1BhdGhOYW1lLCBOVUxMKSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAgKHN6SW1nUGF0aE5hbWUsICIiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgICAgIC8qIGxvYWQgdGhlIGltYWdlIGZyb20gZmlsZSAqLwotCi0gICAgICAgICAgICAgICAgaWYgKCFMb2FkSW1hZ2VGaWxlIChod25kLCBzekltZ1BhdGhOYW1lLCAmcGJJbWFnZSwgJmN4SW1nU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJmN5SW1nU2l6ZSwgJmNJbWdDaGFubmVscywgJmJrZ0NvbG9yKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBpbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSBmb3IgbGF0ZXIgdXBkYXRlICovCi0KLSAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBkaXNwbGF5IHRoZSBQTkcgaW50byB0aGUgRElCaXRtYXAgKi8KLQotICAgICAgICAgICAgICAgIERpc3BsYXlJbWFnZSAoaHduZCwgJnBEaWIsICZwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0ZJTEVfRVhJVDoKLQotICAgICAgICAgICAgLyogbW9yZSBjbGVhbnVwIG5lZWRlZC4uLiAqLwotCi0gICAgICAgICAgICAvKiBmcmVlIGltYWdlIGJ1ZmZlciAqLwotCi0gICAgICAgICAgICBpZiAocERpYiAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUgKHBEaWIpOwotICAgICAgICAgICAgICAgIHBEaWIgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBmcmVlIGZpbGUtbGlzdCAqLwotCi0gICAgICAgICAgICBpZiAocFBuZ0ZpbGVMaXN0ICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSAocFBuZ0ZpbGVMaXN0KTsKLSAgICAgICAgICAgICAgICBwUG5nRmlsZUxpc3QgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBsZXQncyBnbyAuLi4gKi8KLQotICAgICAgICAgICAgZXhpdCAoMCk7Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX09QVElPTlNfU1RSRVRDSDoKLSAgICAgICAgICAgIGJTdHJldGNoZWQgPSAhYlN0cmV0Y2hlZDsKLSAgICAgICAgICAgIGlmIChiU3RyZXRjaGVkKQotICAgICAgICAgICAgICAgIENoZWNrTWVudUl0ZW0gKGhNZW51LCBJRE1fT1BUSU9OU19TVFJFVENILCBNRl9DSEVDS0VEKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBDaGVja01lbnVJdGVtIChoTWVudSwgSURNX09QVElPTlNfU1RSRVRDSCwgTUZfVU5DSEVDS0VEKTsKLQotICAgICAgICAgICAgLyogaW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgZm9yIGxhdGVyIHVwZGF0ZSAqLwotCi0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCAoaHduZCwgTlVMTCwgVFJVRSk7Ci0KLSAgICAgICAgICAgIC8qIGRpc3BsYXkgdGhlIFBORyBpbnRvIHRoZSBESUJpdG1hcCAqLwotCi0gICAgICAgICAgICBEaXNwbGF5SW1hZ2UgKGh3bmQsICZwRGliLCAmcERpRGF0YSwgY3hXaW5TaXplLCBjeVdpblNpemUsCi0gICAgICAgICAgICAgICAgcGJJbWFnZSwgY3hJbWdTaXplLCBjeUltZ1NpemUsIGNJbWdDaGFubmVscywgYlN0cmV0Y2hlZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgSURNX0hFTFBfQUJPVVQ6Ci0gICAgICAgICAgICBEaWFsb2dCb3ggKGhJbnN0YW5jZSwgVEVYVCAoIkFib3V0Qm94IiksIGh3bmQsIEFib3V0RGxnUHJvYykgOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgfSAvKiBlbmQgc3dpdGNoICovCi0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFdNX1BBSU5UOgotICAgICAgICBoZGMgPSBCZWdpblBhaW50IChod25kLCAmcHMpOwotCi0gICAgICAgIGlmIChwRGliKQotICAgICAgICAgICAgU2V0RElCaXRzVG9EZXZpY2UgKGhkYywgMCwgMCwgY3hXaW5TaXplLCBjeVdpblNpemUsIDAsIDAsCi0gICAgICAgICAgICAgICAgMCwgY3lXaW5TaXplLCBwRGlEYXRhLCAoQklUTUFQSU5GTyAqKSBwRGliLCBESUJfUkdCX0NPTE9SUyk7Ci0KLSAgICAgICAgRW5kUGFpbnQgKGh3bmQsICZwcyk7Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgICBpZiAocGJtZmgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUgKHBibWZoKTsKLSAgICAgICAgICAgIHBibWZoID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIFBvc3RRdWl0TWVzc2FnZSAoMCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBEZWZXaW5kb3dQcm9jIChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Ci19Ci0KLUJPT0wgQ0FMTEJBQ0sgQWJvdXREbGdQcm9jIChIV05EIGhEbGcsIFVJTlQgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICAgICBzd2l0Y2ggKG1lc3NhZ2UpCi0gICAgIHsKLSAgICAgY2FzZSBXTV9JTklURElBTE9HIDoKLSAgICAgICAgICBTaG93V2luZG93IChoRGxnLCBTV19ISURFKTsKLSAgICAgICAgICBDZW50ZXJBYm91dCAoaERsZywgR2V0V2luZG93IChoRGxnLCBHV19PV05FUikpOwotICAgICAgICAgIFNob3dXaW5kb3cgKGhEbGcsIFNXX1NIT1cpOwotICAgICAgICAgIHJldHVybiBUUlVFIDsKLQotICAgICBjYXNlIFdNX0NPTU1BTkQgOgotICAgICAgICAgIHN3aXRjaCAoTE9XT1JEICh3UGFyYW0pKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIElET0sgOgotICAgICAgICAgIGNhc2UgSURDQU5DRUwgOgotICAgICAgICAgICAgICAgRW5kRGlhbG9nIChoRGxnLCAwKSA7Ci0gICAgICAgICAgICAgICByZXR1cm4gVFJVRSA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrIDsKLSAgICAgfQotICAgICByZXR1cm4gRkFMU0UgOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLQotICogIENlbnRlckFib3V0Ci0gKi0tLS0tLS0tLS0tLS0tLQotICovCi1CT09MIENlbnRlckFib3V0IChIV05EIGh3bmRDaGlsZCwgSFdORCBod25kUGFyZW50KQotewotICAgUkVDVCAgICByQ2hpbGQsIHJQYXJlbnQsIHJXb3JrQXJlYTsKLSAgIGludCAgICAgd0NoaWxkLCBoQ2hpbGQsIHdQYXJlbnQsIGhQYXJlbnQ7Ci0gICBpbnQgICAgIHhOZXcsIHlOZXc7Ci0gICBCT09MICBiUmVzdWx0OwotCi0gICAvKiBHZXQgdGhlIEhlaWdodCBhbmQgV2lkdGggb2YgdGhlIGNoaWxkIHdpbmRvdyAqLwotICAgR2V0V2luZG93UmVjdCAoaHduZENoaWxkLCAmckNoaWxkKTsKLSAgIHdDaGlsZCA9IHJDaGlsZC5yaWdodCAtIHJDaGlsZC5sZWZ0OwotICAgaENoaWxkID0gckNoaWxkLmJvdHRvbSAtIHJDaGlsZC50b3A7Ci0KLSAgIC8qIEdldCB0aGUgSGVpZ2h0IGFuZCBXaWR0aCBvZiB0aGUgcGFyZW50IHdpbmRvdyAqLwotICAgR2V0V2luZG93UmVjdCAoaHduZFBhcmVudCwgJnJQYXJlbnQpOwotICAgd1BhcmVudCA9IHJQYXJlbnQucmlnaHQgLSByUGFyZW50LmxlZnQ7Ci0gICBoUGFyZW50ID0gclBhcmVudC5ib3R0b20gLSByUGFyZW50LnRvcDsKLQotICAgLyogR2V0IHRoZSBsaW1pdHMgb2YgdGhlICd3b3JrYXJlYScgKi8KLSAgIGJSZXN1bHQgPSBTeXN0ZW1QYXJhbWV0ZXJzSW5mbygKLSAgICAgIFNQSV9HRVRXT1JLQVJFQSwgIC8qIHN5c3RlbSBwYXJhbWV0ZXIgdG8gcXVlcnkgb3Igc2V0ICovCi0gICAgICBzaXplb2YoUkVDVCksCi0gICAgICAmcldvcmtBcmVhLAotICAgICAgMCk7Ci0gICBpZiAoIWJSZXN1bHQpIHsKLSAgICAgIHJXb3JrQXJlYS5sZWZ0ID0gcldvcmtBcmVhLnRvcCA9IDA7Ci0gICAgICByV29ya0FyZWEucmlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKLSAgICAgIHJXb3JrQXJlYS5ib3R0b20gPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKLSAgIH0KLQotICAgLyogQ2FsY3VsYXRlIG5ldyBYIHBvc2l0aW9uLCB0aGVuIGFkanVzdCBmb3Igd29ya2FyZWEgKi8KLSAgIHhOZXcgPSByUGFyZW50LmxlZnQgKyAoKHdQYXJlbnQgLSB3Q2hpbGQpIC8yKTsKLSAgIGlmICh4TmV3IDwgcldvcmtBcmVhLmxlZnQpIHsKLSAgICAgIHhOZXcgPSByV29ya0FyZWEubGVmdDsKLSAgIH0gZWxzZSBpZiAoKHhOZXcrd0NoaWxkKSA+IHJXb3JrQXJlYS5yaWdodCkgewotICAgICAgeE5ldyA9IHJXb3JrQXJlYS5yaWdodCAtIHdDaGlsZDsKLSAgIH0KLQotICAgLyogQ2FsY3VsYXRlIG5ldyBZIHBvc2l0aW9uLCB0aGVuIGFkanVzdCBmb3Igd29ya2FyZWEgKi8KLSAgIHlOZXcgPSByUGFyZW50LnRvcCAgKyAoKGhQYXJlbnQgLSBoQ2hpbGQpIC8yKTsKLSAgIGlmICh5TmV3IDwgcldvcmtBcmVhLnRvcCkgewotICAgICAgeU5ldyA9IHJXb3JrQXJlYS50b3A7Ci0gICB9IGVsc2UgaWYgKCh5TmV3K2hDaGlsZCkgPiByV29ya0FyZWEuYm90dG9tKSB7Ci0gICAgICB5TmV3ID0gcldvcmtBcmVhLmJvdHRvbSAtIGhDaGlsZDsKLSAgIH0KLQotICAgLyogU2V0IGl0LCBhbmQgcmV0dXJuICovCi0gICByZXR1cm4gU2V0V2luZG93UG9zIChod25kQ2hpbGQsIE5VTEwsIHhOZXcsIHlOZXcsIDAsIDAsIFNXUF9OT1NJWkUgfAotICAgICAgICAgIFNXUF9OT1pPUkRFUik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLQotICogIEJ1aWxkUG5nTGlzdAotICotLS0tLS0tLS0tLS0tLS0tCi0gKi8KLUJPT0wgQnVpbGRQbmdMaXN0IChQVFNUUiBwc3RyUGF0aE5hbWUsIFRDSEFSICoqcHBGaWxlTGlzdCwgaW50ICpwRmlsZUNvdW50LAotICAgICBpbnQgKnBGaWxlSW5kZXgpCi17Ci0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzekltZ1BhdGhOYW1lIFtNQVhfUEFUSF07Ci0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzekltZ0ZpbGVOYW1lIFtNQVhfUEFUSF07Ci0gICAgc3RhdGljIFRDSEFSICAgICAgICAgICAgICBzekltZ0ZpbmROYW1lIFtNQVhfUEFUSF07Ci0KLSAgICBXSU4zMl9GSU5EX0RBVEEgICAgICAgICAgIGZpbmRkYXRhOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgaEZpbmQ7Ci0KLSAgICBzdGF0aWMgVENIQVIgICAgICAgICAgICAgIHN6VG1wIFtNQVhfUEFUSF07Ci0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICBiT2s7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBpLCBpaTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGosIGpqOwotCi0gICAgLyogZnJlZSBwcmV2aW91cyBmaWxlLWxpc3QgKi8KLQotICAgIGlmICgqcHBGaWxlTGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSAoKnBwRmlsZUxpc3QpOwotICAgICAgICAqcHBGaWxlTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLyogZXh0cmFjdCBmb2xkZXJuYW1lLCBmaWxlbmFtZSBhbmQgc2VhcmNoLW5hbWUgKi8KLQotICAgIHN0cmNweSAoc3pJbWdQYXRoTmFtZSwgcHN0clBhdGhOYW1lKTsKLSAgICBzdHJjcHkgKHN6SW1nRmlsZU5hbWUsIHN0cnJjaHIgKHBzdHJQYXRoTmFtZSwgJ1xcJykgKyAxKTsKLQotICAgIHN0cmNweSAoc3pJbWdGaW5kTmFtZSwgc3pJbWdQYXRoTmFtZSk7Ci0gICAgKihzdHJyY2hyIChzekltZ0ZpbmROYW1lLCAnXFwnKSArIDEpID0gJ1wwJzsKLSAgICBzdHJjYXQgKHN6SW1nRmluZE5hbWUsICIqLnBuZyIpOwotCi0gICAgLyogZmlyc3QgY3ljbGU6IGNvdW50IG51bWJlciBvZiBmaWxlcyBpbiBkaXJlY3RvcnkgZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCi0KLSAgICAqcEZpbGVDb3VudCA9IDA7Ci0KLSAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGUoc3pJbWdGaW5kTmFtZSwgJmZpbmRkYXRhKTsKLSAgICBiT2sgPSAoaEZpbmQgIT0gKEhBTkRMRSkgLTEpOwotCi0gICAgd2hpbGUgKGJPaykKLSAgICB7Ci0gICAgICAgICpwRmlsZUNvdW50ICs9IDE7Ci0gICAgICAgIGJPayA9IEZpbmROZXh0RmlsZShoRmluZCwgJmZpbmRkYXRhKTsKLSAgICB9Ci0gICAgRmluZENsb3NlKGhGaW5kKTsKLQotICAgIC8qIGFsbG9jYXRpb24gbWVtb3J5IGZvciBmaWxlLWxpc3QgKi8KLQotICAgICpwcEZpbGVMaXN0ID0gKFRDSEFSICopIG1hbGxvYyAoKnBGaWxlQ291bnQgKiBNQVhfUEFUSCk7Ci0KLSAgICAvKiBzZWNvbmQgY3ljbGU6IHJlYWQgZGlyZWN0b3J5IGFuZCBzdG9yZSBmaWxlbmFtZXMgaW4gZmlsZS1saXN0ICovCi0KLSAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGUoc3pJbWdGaW5kTmFtZSwgJmZpbmRkYXRhKTsKLSAgICBiT2sgPSAoaEZpbmQgIT0gKEhBTkRMRSkgLTEpOwotCi0gICAgaSA9IDA7Ci0gICAgaWkgPSAwOwotICAgIHdoaWxlIChiT2spCi0gICAgewotICAgICAgICBzdHJjcHkgKCpwcEZpbGVMaXN0ICsgaWksIHN6SW1nUGF0aE5hbWUpOwotICAgICAgICBzdHJjcHkgKHN0cnJjaHIoKnBwRmlsZUxpc3QgKyBpaSwgJ1xcJykgKyAxLCBmaW5kZGF0YS5jRmlsZU5hbWUpOwotCi0gICAgICAgIGlmIChzdHJjbXAocHN0clBhdGhOYW1lLCAqcHBGaWxlTGlzdCArIGlpKSA9PSAwKQotICAgICAgICAgICAgKnBGaWxlSW5kZXggPSBpOwotCi0gICAgICAgIGlpICs9IE1BWF9QQVRIOwotICAgICAgICBpKys7Ci0KLSAgICAgICAgYk9rID0gRmluZE5leHRGaWxlKGhGaW5kLCAmZmluZGRhdGEpOwotICAgIH0KLSAgICBGaW5kQ2xvc2UoaEZpbmQpOwotCi0gICAgLyogZmluYWxseSB3ZSBtdXN0IHNvcnQgdGhlIGZpbGUtbGlzdCAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8ICpwRmlsZUNvdW50IC0gMTsgaSsrKQotICAgIHsKLSAgICAgICAgaWkgPSBpICogTUFYX1BBVEg7Ci0gICAgICAgIGZvciAoaiA9IGkrMTsgaiA8ICpwRmlsZUNvdW50OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpqID0gaiAqIE1BWF9QQVRIOwotICAgICAgICAgICAgaWYgKHN0cmNtcCAoKnBwRmlsZUxpc3QgKyBpaSwgKnBwRmlsZUxpc3QgKyBqaikgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmNweSAoc3pUbXAsICpwcEZpbGVMaXN0ICsgamopOwotICAgICAgICAgICAgICAgIHN0cmNweSAoKnBwRmlsZUxpc3QgKyBqaiwgKnBwRmlsZUxpc3QgKyBpaSk7Ci0gICAgICAgICAgICAgICAgc3RyY3B5ICgqcHBGaWxlTGlzdCArIGlpLCBzelRtcCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGlzIHdhcyB0aGUgY3VycmVudCBpbWFnZSB0aGF0IHdlIG1vdmVkICovCi0KLSAgICAgICAgICAgICAgICBpZiAoKnBGaWxlSW5kZXggPT0gaSkKLSAgICAgICAgICAgICAgICAgICAgKnBGaWxlSW5kZXggPSBqOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpwRmlsZUluZGV4ID09IGopCi0gICAgICAgICAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tCi0gKiAgU2VhcmNoUG5nTGlzdAotICotLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotQk9PTCBTZWFyY2hQbmdMaXN0ICgKLSAgICAgICAgVENIQVIgKnBGaWxlTGlzdCwgaW50IEZpbGVDb3VudCwgaW50ICpwRmlsZUluZGV4LAotICAgICAgICBQVFNUUiBwc3RyUHJldk5hbWUsIFBUU1RSIHBzdHJOZXh0TmFtZSkKLXsKLSAgICBpZiAoRmlsZUNvdW50ID4gMCkKLSAgICB7Ci0gICAgICAgIC8qIGdldCBwcmV2aW91cyBlbnRyeSAqLwotCi0gICAgICAgIGlmIChwc3RyUHJldk5hbWUgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCpwRmlsZUluZGV4ID4gMCkKLSAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCAtPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICpwRmlsZUluZGV4ID0gRmlsZUNvdW50IC0gMTsKLQotICAgICAgICAgICAgc3RyY3B5IChwc3RyUHJldk5hbWUsIHBGaWxlTGlzdCArICgqcEZpbGVJbmRleCAqIE1BWF9QQVRIKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBnZXQgbmV4dCBlbnRyeSAqLwotCi0gICAgICAgIGlmIChwc3RyTmV4dE5hbWUgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCpwRmlsZUluZGV4IDwgRmlsZUNvdW50IC0gMSkKLSAgICAgICAgICAgICAgICAqcEZpbGVJbmRleCArPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICpwRmlsZUluZGV4ID0gMDsKLQotICAgICAgICAgICAgc3RyY3B5IChwc3RyTmV4dE5hbWUsIHBGaWxlTGlzdCArICgqcEZpbGVJbmRleCAqIE1BWF9QQVRIKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLQotICogIExvYWRJbWFnZUZpbGUKLSAqLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1CT09MIExvYWRJbWFnZUZpbGUgKEhXTkQgaHduZCwgUFRTVFIgcHN0clBhdGhOYW1lLAotICAgICAgICAgICAgICAgIHBuZ19ieXRlICoqcHBiSW1hZ2UsIGludCAqcHhJbWdTaXplLCBpbnQgKnB5SW1nU2l6ZSwKLSAgICAgICAgICAgICAgICBpbnQgKnBpQ2hhbm5lbHMsIHBuZ19jb2xvciAqcEJrZ0NvbG9yKQotewotICAgIHN0YXRpYyBUQ0hBUiBzelRtcCBbTUFYX1BBVEhdOwotCi0gICAgLyogaWYgdGhlcmUncyBhbiBleGlzdGluZyBQTkcsIGZyZWUgdGhlIG1lbW9yeSAqLwotCi0gICAgaWYgKCpwcGJJbWFnZSkKLSAgICB7Ci0gICAgICAgIGZyZWUgKCpwcGJJbWFnZSk7Ci0gICAgICAgICpwcGJJbWFnZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgLyogTG9hZCB0aGUgZW50aXJlIFBORyBpbnRvIG1lbW9yeSAqLwotCi0gICAgU2V0Q3Vyc29yIChMb2FkQ3Vyc29yIChOVUxMLCBJRENfV0FJVCkpOwotICAgIFNob3dDdXJzb3IgKFRSVUUpOwotCi0gICAgUG5nTG9hZEltYWdlIChwc3RyUGF0aE5hbWUsIHBwYkltYWdlLCBweEltZ1NpemUsIHB5SW1nU2l6ZSwgcGlDaGFubmVscywKLSAgICAgICAgICAgICAgICAgIHBCa2dDb2xvcik7Ci0KLSAgICBTaG93Q3Vyc29yIChGQUxTRSk7Ci0gICAgU2V0Q3Vyc29yIChMb2FkQ3Vyc29yIChOVUxMLCBJRENfQVJST1cpKTsKLQotICAgIGlmICgqcHBiSW1hZ2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHNwcmludGYgKHN6VG1wLCAiVmlzdWFsUG5nIC0gJXMiLCBzdHJyY2hyKHBzdHJQYXRoTmFtZSwgJ1xcJykgKyAxKTsKLSAgICAgICAgU2V0V2luZG93VGV4dCAoaHduZCwgc3pUbXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNZXNzYWdlQm94IChod25kLCBURVhUICgiRXJyb3IgaW4gbG9hZGluZyB0aGUgUE5HIGltYWdlIiksCi0gICAgICAgICAgICBzelByb2dOYW1lLCBNQl9JQ09ORVhDTEFNQVRJT04gfCBNQl9PSyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tCi0gKiAgRGlzcGxheUltYWdlCi0gKi0tLS0tLS0tLS0tLS0tLS0KLSAqLwotQk9PTCBEaXNwbGF5SW1hZ2UgKEhXTkQgaHduZCwgQllURSAqKnBwRGliLAotICAgICAgICBCWVRFICoqcHBEaURhdGEsIGludCBjeFdpblNpemUsIGludCBjeVdpblNpemUsCi0gICAgICAgIEJZVEUgKnBiSW1hZ2UsIGludCBjeEltZ1NpemUsIGludCBjeUltZ1NpemUsIGludCBjSW1nQ2hhbm5lbHMsCi0gICAgICAgIEJPT0wgYlN0cmV0Y2hlZCkKLXsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAqcERpYiA9ICpwcERpYjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAqcERpRGF0YSA9ICpwcERpRGF0YTsKLSAgICAvKiBCSVRNQVBGSUxFSEVBREVSICAgICAgICAqcGJtZmg7ICovCi0gICAgQklUTUFQSU5GT0hFQURFUiAgICAgICAgICAgKnBibWloOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3RElSb3dCeXRlczsKLSAgICBwbmdfY29sb3IgICAgICAgICAgICAgICAgICAgYmtnQmxhY2sgPSB7MCwgMCwgMH07Ci0gICAgcG5nX2NvbG9yICAgICAgICAgICAgICAgICAgIGJrZ0dyYXkgID0gezEyNywgMTI3LCAxMjd9OwotICAgIHBuZ19jb2xvciAgICAgICAgICAgICAgICAgICBia2dXaGl0ZSA9IHsyNTUsIDI1NSwgMjU1fTsKLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIERldmljZSBJbmRlcGVuZGFudCBiaXRtYXAgKi8KLQotICAgIHdESVJvd0J5dGVzID0gKFdPUkQpICgoMyAqIGN4V2luU2l6ZSArIDNMKSA+PiAyKSA8PCAyOwotCi0gICAgaWYgKHBEaWIpCi0gICAgewotICAgICAgICBmcmVlIChwRGliKTsKLSAgICAgICAgcERpYiA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCEocERpYiA9IChCWVRFICopIG1hbGxvYyAoc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsKLSAgICAgICAgd0RJUm93Qnl0ZXMgKiBjeVdpblNpemUpKSkKLSAgICB7Ci0gICAgICAgIE1lc3NhZ2VCb3ggKGh3bmQsIFRFWFQgKCJFcnJvciBpbiBkaXNwbGF5aW5nIHRoZSBQTkcgaW1hZ2UiKSwKLSAgICAgICAgICAgIHN6UHJvZ05hbWUsIE1CX0lDT05FWENMQU1BVElPTiB8IE1CX09LKTsKLSAgICAgICAgKnBwRGliID0gcERpYiA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgKnBwRGliID0gcERpYjsKLSAgICBtZW1zZXQgKHBEaWIsIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBkaWItc3RydWN0dXJlICovCi0KLSAgICBwYm1paCA9IChCSVRNQVBJTkZPSEVBREVSICopIHBEaWI7Ci0gICAgcGJtaWgtPmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICBwYm1paC0+YmlXaWR0aCA9IGN4V2luU2l6ZTsKLSAgICBwYm1paC0+YmlIZWlnaHQgPSAtKChsb25nKSBjeVdpblNpemUpOwotICAgIHBibWloLT5iaVBsYW5lcyA9IDE7Ci0gICAgcGJtaWgtPmJpQml0Q291bnQgPSAyNDsKLSAgICBwYm1paC0+YmlDb21wcmVzc2lvbiA9IDA7Ci0gICAgcERpRGF0YSA9IHBEaWIgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgKnBwRGlEYXRhID0gcERpRGF0YTsKLQotICAgIC8qIGZpcnN0IGZpbGwgYml0bWFwIHdpdGggZ3JheSBhbmQgaW1hZ2UgYm9yZGVyICovCi0KLSAgICBJbml0Qml0bWFwIChwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSk7Ci0KLSAgICAvKiB0aGVuIGZpbGwgYml0bWFwIHdpdGggaW1hZ2UgKi8KLQotICAgIGlmIChwYkltYWdlKQotICAgIHsKLSAgICAgICAgRmlsbEJpdG1hcCAoCi0gICAgICAgICAgICBwRGlEYXRhLCBjeFdpblNpemUsIGN5V2luU2l6ZSwKLSAgICAgICAgICAgIHBiSW1hZ2UsIGN4SW1nU2l6ZSwgY3lJbWdTaXplLCBjSW1nQ2hhbm5lbHMsCi0gICAgICAgICAgICBiU3RyZXRjaGVkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLQotICogIEluaXRCaXRtYXAKLSAqLS0tLS0tLS0tLS0tLS0KLSAqLwotQk9PTCBJbml0Qml0bWFwIChCWVRFICpwRGlEYXRhLCBpbnQgY3hXaW5TaXplLCBpbnQgY3lXaW5TaXplKQotewotICAgIEJZVEUgKmRzdDsKLSAgICBpbnQgeCwgeSwgY29sOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB3aXRoIGdyYXkgKi8KLQotICAgIGRzdCA9IHBEaURhdGE7Ci0gICAgZm9yICh5ID0gMDsgeSA8IGN5V2luU2l6ZTsgeSsrKQotICAgIHsKLSAgICAgICAgY29sID0gMDsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGN4V2luU2l6ZTsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBmaWxsIHdpdGggR1JBWSAqLwotICAgICAgICAgICAgKmRzdCsrID0gMTI3OwotICAgICAgICAgICAgKmRzdCsrID0gMTI3OwotICAgICAgICAgICAgKmRzdCsrID0gMTI3OwotICAgICAgICAgICAgY29sICs9IDM7Ci0gICAgICAgIH0KLSAgICAgICAgLyogcm93cyBzdGFydCBvbiA0IGJ5dGUgYm91bmRhcmllcyAqLwotICAgICAgICB3aGlsZSAoKGNvbCAlIDQpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICAgICAgY29sKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLQotICogIEZpbGxCaXRtYXAKLSAqLS0tLS0tLS0tLS0tLS0KLSAqLwotQk9PTCBGaWxsQml0bWFwICgKLSAgICAgICAgQllURSAqcERpRGF0YSwgaW50IGN4V2luU2l6ZSwgaW50IGN5V2luU2l6ZSwKLSAgICAgICAgQllURSAqcGJJbWFnZSwgaW50IGN4SW1nU2l6ZSwgaW50IGN5SW1nU2l6ZSwgaW50IGNJbWdDaGFubmVscywKLSAgICAgICAgQk9PTCBiU3RyZXRjaGVkKQotewotICAgIEJZVEUgKnBTdHJldGNoZWRJbWFnZTsKLSAgICBCWVRFICpwSW1nOwotICAgIEJZVEUgKnNyYywgKmRzdDsKLSAgICBCWVRFIHIsIGcsIGIsIGE7Ci0gICAgY29uc3QgaW50IGNESUNoYW5uZWxzID0gMzsKLSAgICBXT1JEIHdJbWdSb3dCeXRlczsKLSAgICBXT1JEIHdESVJvd0J5dGVzOwotICAgIGludCBjeE5ld1NpemUsIGN5TmV3U2l6ZTsKLSAgICBpbnQgY3hJbWdQb3MsIGN5SW1nUG9zOwotICAgIGludCB4SW1nLCB5SW1nOwotICAgIGludCB4V2luLCB5V2luOwotICAgIGludCB4T2xkLCB5T2xkOwotICAgIGludCB4TmV3LCB5TmV3OwotCi0gICAgaWYgKGJTdHJldGNoZWQpCi0gICAgewotICAgICAgICBjeE5ld1NpemUgPSBjeFdpblNpemUgLSAyICogTUFSR0lOOwotICAgICAgICBjeU5ld1NpemUgPSBjeVdpblNpemUgLSAyICogTUFSR0lOOwotCi0gICAgICAgIC8qIHN0cmV0Y2ggdGhlIGltYWdlIHRvIGl0J3Mgd2luZG93IGRldGVybWluZWQgc2l6ZSAqLwotCi0gICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgdHdvIGFyZSBtYXRoZW1hdGljYWxseSB0aGUgc2FtZSwgYnV0IHRoZSBmaXJzdAotICAgICAgICAgKiBoYXMgc2lkZS1lZmZlY3RzIGJlY2F1c2Ugb2Ygcm91bmRpbmcKLSAgICAgICAgICovCi0vKiAgICAgIGlmICgoY3lOZXdTaXplIC8gY3hOZXdTaXplKSA+IChjeUltZ1NpemUgLyBjeEltZ1NpemUpKSAqLwotICAgICAgICBpZiAoKGN5TmV3U2l6ZSAqIGN4SW1nU2l6ZSkgPiAoY3lJbWdTaXplICogY3hOZXdTaXplKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3lOZXdTaXplID0gY3hOZXdTaXplICogY3lJbWdTaXplIC8gY3hJbWdTaXplOwotICAgICAgICAgICAgY3hJbWdQb3MgPSBNQVJHSU47Ci0gICAgICAgICAgICBjeUltZ1BvcyA9IChjeVdpblNpemUgLSBjeU5ld1NpemUpIC8gMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN4TmV3U2l6ZSA9IGN5TmV3U2l6ZSAqIGN4SW1nU2l6ZSAvIGN5SW1nU2l6ZTsKLSAgICAgICAgICAgIGN5SW1nUG9zID0gTUFSR0lOOwotICAgICAgICAgICAgY3hJbWdQb3MgPSAoY3hXaW5TaXplIC0gY3hOZXdTaXplKSAvIDI7Ci0gICAgICAgIH0KLQotICAgICAgICBwU3RyZXRjaGVkSW1hZ2UgPSBtYWxsb2MgKGNJbWdDaGFubmVscyAqIGN4TmV3U2l6ZSAqIGN5TmV3U2l6ZSk7Ci0gICAgICAgIHBJbWcgPSBwU3RyZXRjaGVkSW1hZ2U7Ci0KLSAgICAgICAgZm9yICh5TmV3ID0gMDsgeU5ldyA8IGN5TmV3U2l6ZTsgeU5ldysrKQotICAgICAgICB7Ci0gICAgICAgICAgICB5T2xkID0geU5ldyAqIGN5SW1nU2l6ZSAvIGN5TmV3U2l6ZTsKLSAgICAgICAgICAgIGZvciAoeE5ldyA9IDA7IHhOZXcgPCBjeE5ld1NpemU7IHhOZXcrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4T2xkID0geE5ldyAqIGN4SW1nU2l6ZSAvIGN4TmV3U2l6ZTsKLQotICAgICAgICAgICAgICAgIHIgPSAqKHBiSW1hZ2UgKyBjSW1nQ2hhbm5lbHMgKiAoKHlPbGQgKiBjeEltZ1NpemUpICsgeE9sZCkgKyAwKTsKLSAgICAgICAgICAgICAgICBnID0gKihwYkltYWdlICsgY0ltZ0NoYW5uZWxzICogKCh5T2xkICogY3hJbWdTaXplKSArIHhPbGQpICsgMSk7Ci0gICAgICAgICAgICAgICAgYiA9ICoocGJJbWFnZSArIGNJbWdDaGFubmVscyAqICgoeU9sZCAqIGN4SW1nU2l6ZSkgKyB4T2xkKSArIDIpOwotICAgICAgICAgICAgICAgICpwSW1nKysgPSByOwotICAgICAgICAgICAgICAgICpwSW1nKysgPSBnOwotICAgICAgICAgICAgICAgICpwSW1nKysgPSBiOwotICAgICAgICAgICAgICAgIGlmIChjSW1nQ2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGEgPSAqKHBiSW1hZ2UgKyBjSW1nQ2hhbm5lbHMgKiAoKHlPbGQgKiBjeEltZ1NpemUpICsgeE9sZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgMyk7Ci0gICAgICAgICAgICAgICAgICAgICpwSW1nKysgPSBhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNhbGN1bGF0ZSByb3ctYnl0ZXMgKi8KLQotICAgICAgICB3SW1nUm93Qnl0ZXMgPSBjSW1nQ2hhbm5lbHMgKiBjeE5ld1NpemU7Ci0gICAgICAgIHdESVJvd0J5dGVzID0gKFdPUkQpICgoY0RJQ2hhbm5lbHMgKiBjeFdpblNpemUgKyAzTCkgPj4gMikgPDwgMjsKLQotICAgICAgICAvKiBjb3B5IGltYWdlIHRvIHNjcmVlbiAqLwotCi0gICAgICAgIGZvciAoeUltZyA9IDAsIHlXaW4gPSBjeUltZ1BvczsgeUltZyA8IGN5TmV3U2l6ZTsgeUltZysrLCB5V2luKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh5V2luID49IGN5V2luU2l6ZSAtIGN5SW1nUG9zKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgc3JjID0gcFN0cmV0Y2hlZEltYWdlICsgeUltZyAqIHdJbWdSb3dCeXRlczsKLSAgICAgICAgICAgIGRzdCA9IHBEaURhdGEgKyB5V2luICogd0RJUm93Qnl0ZXMgKyBjeEltZ1BvcyAqIGNESUNoYW5uZWxzOwotCi0gICAgICAgICAgICBmb3IgKHhJbWcgPSAwLCB4V2luID0gY3hJbWdQb3M7IHhJbWcgPCBjeE5ld1NpemU7IHhJbWcrKywgeFdpbisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4V2luID49IGN4V2luU2l6ZSAtIGN4SW1nUG9zKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICByID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgYiA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICAqZHN0KysgPSBiOyAvKiBub3RlIHRoZSByZXZlcnNlIG9yZGVyICAqLwotICAgICAgICAgICAgICAgICpkc3QrKyA9IGc7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gcjsKLSAgICAgICAgICAgICAgICBpZiAoY0ltZ0NoYW5uZWxzID09IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhID0gKnNyYysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGZyZWUgbWVtb3J5ICovCi0KLSAgICAgICAgaWYgKHBTdHJldGNoZWRJbWFnZSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlIChwU3RyZXRjaGVkSW1hZ2UpOwotICAgICAgICAgICAgcFN0cmV0Y2hlZEltYWdlID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogcHJvY2VzcyB0aGUgaW1hZ2Ugbm90LXN0cmV0Y2hlZCAqLwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBjZW50cmFsIHBvc2l0aW9uICovCi0KLSAgICAgICAgY3hJbWdQb3MgPSAoY3hXaW5TaXplIC0gY3hJbWdTaXplKSAvIDI7Ci0gICAgICAgIGN5SW1nUG9zID0gKGN5V2luU2l6ZSAtIGN5SW1nU2l6ZSkgLyAyOwotCi0gICAgICAgIC8qIGNoZWNrIGZvciBpbWFnZSBsYXJnZXIgdGhhbiB3aW5kb3cgKi8KLQotICAgICAgICBpZiAoY3hJbWdQb3MgPCBNQVJHSU4pCi0gICAgICAgICAgICBjeEltZ1BvcyA9IE1BUkdJTjsKLSAgICAgICAgaWYgKGN5SW1nUG9zIDwgTUFSR0lOKQotICAgICAgICAgICAgY3lJbWdQb3MgPSBNQVJHSU47Ci0KLSAgICAgICAgLyogY2FsY3VsYXRlIGJvdGggcm93LWJ5dGVzICovCi0KLSAgICAgICAgd0ltZ1Jvd0J5dGVzID0gY0ltZ0NoYW5uZWxzICogY3hJbWdTaXplOwotICAgICAgICB3RElSb3dCeXRlcyA9IChXT1JEKSAoKGNESUNoYW5uZWxzICogY3hXaW5TaXplICsgM0wpID4+IDIpIDw8IDI7Ci0KLSAgICAgICAgLyogY29weSBpbWFnZSB0byBzY3JlZW4gKi8KLQotICAgICAgICBmb3IgKHlJbWcgPSAwLCB5V2luID0gY3lJbWdQb3M7IHlJbWcgPCBjeUltZ1NpemU7IHlJbWcrKywgeVdpbisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeVdpbiA+PSBjeVdpblNpemUgLSBNQVJHSU4pCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBzcmMgPSBwYkltYWdlICsgeUltZyAqIHdJbWdSb3dCeXRlczsKLSAgICAgICAgICAgIGRzdCA9IHBEaURhdGEgKyB5V2luICogd0RJUm93Qnl0ZXMgKyBjeEltZ1BvcyAqIGNESUNoYW5uZWxzOwotCi0gICAgICAgICAgICBmb3IgKHhJbWcgPSAwLCB4V2luID0gY3hJbWdQb3M7IHhJbWcgPCBjeEltZ1NpemU7IHhJbWcrKywgeFdpbisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4V2luID49IGN4V2luU2l6ZSAtIE1BUkdJTikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICBnID0gKnNyYysrOwotICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gYjsgLyogbm90ZSB0aGUgcmV2ZXJzZSBvcmRlciAgKi8KLSAgICAgICAgICAgICAgICAqZHN0KysgPSBnOwotICAgICAgICAgICAgICAgICpkc3QrKyA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKGNJbWdDaGFubmVscyA9PSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLQotICogIGVuZCBvZiBzb3VyY2UKLSAqLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3AgYi9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZWY2Yy4uMDAwMDAwMAotLS0gYS9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IlZpc3VhbFBuZyIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCi0jICoqIERPIE5PVCBFRElUICoqDQotDQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iIDB4MDEwMQ0KLQ0KLUNGRz1WaXN1YWxQbmcgLSBXaW4zMiBEZWJ1Zw0KLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCi0hTUVTU0FHRSANCi0hTUVTU0FHRSBOTUFLRSAvZiAiVmlzdWFsUG5nLm1hayIuDQotIU1FU1NBR0UgDQotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFIE5NQUtFIC9mICJWaXN1YWxQbmcubWFrIiBDRkc9IlZpc3VhbFBuZyAtIFdpbjMyIERlYnVnIg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KLSFNRVNTQUdFIA0KLSFNRVNTQUdFICJWaXN1YWxQbmcgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikNCi0hTUVTU0FHRSAiVmlzdWFsUG5nIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQ0KLSFNRVNTQUdFIA0KLQ0KLSMgQmVnaW4gUHJvamVjdA0KLSMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQotQ1BQPWNsLmV4ZQ0KLU1UTD1taWRsLmV4ZQ0KLVJTQz1yYy5leGUNCi0NCi0hSUYgICIkKENGRykiID09ICJWaXN1YWxQbmcgLSBXaW4zMiBSZWxlYXNlIg0KLQ0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCi0jIFBST1AgQkFTRSBJZ25vcmVfRXhwb3J0X0xpYiAwDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9PMiAvSSAiLi5cLi4iIC9JICIuLlwuLlwuLlx6bGliIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJQTkdfTk9fU1RESU8iIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiUE5HX05PX1NURElPIiAvRkQgL2MNCi0jIFNVQlRSQUNUIENQUCAvWVgNCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSU5LMzI9bGluay5leGUNCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2DQotIyBBREQgTElOSzMyIC4uXC4uXHByb2plY3RzXHZpc3VhbGM2XFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgLi5cLi5cLi5cemxpYlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVx6bGliLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2DQotIyBCZWdpbiBTcGVjaWFsIEJ1aWxkIFRvb2wNCi1PdXREaXI9LlxSZWxlYXNlDQotU09VUkNFPSIkKElucHV0UGF0aCkiDQotUG9zdEJ1aWxkX0NtZHM9JChvdXRkaXIpXFZpc3VhbFBuZy5leGUgLi5cLi5cY29udHJpYlxwbmdzdWl0ZVxiYXNuNmExNi5wbmcNCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wNCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiVmlzdWFsUG5nIC0gV2luMzIgRGVidWciDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQotIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMA0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCi0jIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLiIgL0kgIi4uXC4uXC4uXHpsaWIiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIlBOR19OT19TVERJTyIgL0ZEIC9HWiAvYw0KLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uIiAvSSAiLi5cLi5cLi5cemxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiUE5HX05PX1NURElPIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL1lYDQotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQotQlNDMzI9YnNjbWFrZS5leGUNCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCi0jIEFERCBCU0MzMiAvbm9sb2dvDQotTElOSzMyPWxpbmsuZXhlDQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KLSMgQUREIExJTkszMiAuLlwuLlxwcm9qZWN0c1x2aXN1YWxjNlxXaW4zMl9MSUJfUmVsZWFzZVxsaWJwbmcubGliIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzZcV2luMzJfTElCX1JlbGVhc2VcemxpYi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL25vZGVmYXVsdGxpYjoibXN2Y3J0LmxpYiIgL3BkYnR5cGU6c2VwdA0KLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sDQotT3V0RGlyPS5cRGVidWcNCi1TT1VSQ0U9IiQoSW5wdXRQYXRoKSINCi1Qb3N0QnVpbGRfQ21kcz0kKG91dGRpcilcVmlzdWFsUG5nLmV4ZSAuLlwuLlxjb250cmliXHBuZ3N1aXRlXGJhc242YTE2LnBuZw0KLSMgRW5kIFNwZWNpYWwgQnVpbGQgVG9vbA0KLQ0KLSFFTkRJRiANCi0NCi0jIEJlZ2luIFRhcmdldA0KLQ0KLSMgTmFtZSAiVmlzdWFsUG5nIC0gV2luMzIgUmVsZWFzZSINCi0jIE5hbWUgIlZpc3VhbFBuZyAtIFdpbjMyIERlYnVnIg0KLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCi0NCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXFBuZ0ZpbGUuYw0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXFZpc3VhbFBuZy5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEVuZCBHcm91cA0KLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCi0NCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXGNleGNlcHQuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXFBuZ0ZpbGUuaA0KLSMgRW5kIFNvdXJjZSBGaWxlDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXHJlc291cmNlLmgNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgRW5kIEdyb3VwDQotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQotDQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQotIyBCZWdpbiBTb3VyY2UgRmlsZQ0KLQ0KLVNPVVJDRT0uXFZpc3VhbFBuZy5pY28NCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgQmVnaW4gU291cmNlIEZpbGUNCi0NCi1TT1VSQ0U9LlxWaXN1YWxQbmcucmMNCi0jIEVuZCBTb3VyY2UgRmlsZQ0KLSMgRW5kIEdyb3VwDQotIyBFbmQgVGFyZ2V0DQotIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuZHN3IGIvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGUxY2MuLjAwMDAwMDAKLS0tIGEvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5kc3cKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KLSMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLVByb2plY3Q6ICJWaXN1YWxQbmciPS5cVmlzdWFsUG5nLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQotDQotUGFja2FnZT08NT4NCi17e3sNCi19fX0NCi0NCi1QYWNrYWdlPTw0Pg0KLXt7ew0KLX19fQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1HbG9iYWw6DQotDQotUGFja2FnZT08NT4NCi17e3sNCi19fX0NCi0NCi1QYWNrYWdlPTwzPg0KLXt7ew0KLX19fQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCmRpZmYgLS1naXQgYS9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLmljbyBiL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFhMzcxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi92aXN1cG5nL1Zpc3VhbFBuZy5wbmcgYi9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYTgwYS4uMDAwMDAwMAotLS0gYS9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucmMgYi9jb250cmliL3Zpc3VwbmcvVmlzdWFsUG5nLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA2MjNhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdmlzdXBuZy9WaXN1YWxQbmcucmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy9NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgcmVzb3VyY2Ugc2NyaXB0Lg0KLS8vDQotI2luY2x1ZGUgInJlc291cmNlLmgiDQotDQotI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLw0KLS8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLg0KLS8vDQotI2luY2x1ZGUgImFmeHJlcy5oIg0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMNCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcw0KLQ0KLSNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkNCi0jaWZkZWYgX1dJTjMyDQotTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMNCi0jcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQ0KLSNlbmRpZiAvL19XSU4zMg0KLQ0KLSNpZmRlZiBBUFNUVURJT19JTlZPS0VEDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLw0KLS8vIFRFWFRJTkNMVURFDQotLy8NCi0NCi0xIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIA0KLUJFR0lODQotICAgICJyZXNvdXJjZS5oXDAiDQotRU5EDQotDQotMiBURVhUSU5DTFVERSBESVNDQVJEQUJMRSANCi1CRUdJTg0KLSAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiINCi0gICAgIlwwIg0KLUVORA0KLQ0KLTMgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgDQotQkVHSU4NCi0gICAgIlxyXG4iDQotICAgICJcMCINCi1FTkQNCi0NCi0jZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRA0KLQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8NCi0vLyBNZW51DQotLy8NCi0NCi1WSVNVQUxQTkcgTUVOVSBESVNDQVJEQUJMRSANCi1CRUdJTg0KLSAgICBQT1BVUCAiJkZpbGUiDQotICAgIEJFR0lODQotICAgICAgICBNRU5VSVRFTSAiJk9wZW4gSW1hZ2UuLi5cdEN0cmwrTyIsICAgICAgSURNX0ZJTEVfT1BFTg0KLSAgICAgICAgTUVOVUlURU0gIlNhdmUgJkFzLi4uIiwgICAgICAgICAgICAgICAgIElETV9GSUxFX1NBVkUNCi0gICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUg0KLSAgICAgICAgTUVOVUlURU0gIiZOZXh0IEltYWdlXHRDdHJsK04iLCAgICAgICAgIElETV9GSUxFX05FWFQNCi0gICAgICAgIE1FTlVJVEVNICJQcmUmdmlvdXMgSW1hZ2VcdEN0cmwrViIsICAgICBJRE1fRklMRV9QUkVWSU9VUw0KLSAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SDQotICAgICAgICBNRU5VSVRFTSAiRSZ4aXRcdEFsdCtYIiwgICAgICAgICAgICAgICAgSURNX0ZJTEVfRVhJVA0KLSAgICBFTkQNCi0gICAgUE9QVVAgIiZPcHRpb25zIg0KLSAgICBCRUdJTg0KLSAgICAgICAgTUVOVUlURU0gIiZTdHJldGNoIiwgICAgICAgICAgICAgICAgICAgIElETV9PUFRJT05TX1NUUkVUQ0gsIENIRUNLRUQNCi0gICAgRU5EDQotICAgIFBPUFVQICImSGVscCINCi0gICAgQkVHSU4NCi0gICAgICAgIE1FTlVJVEVNICImQWJvdXQiLCAgICAgICAgICAgICAgICAgICAgICBJRE1fSEVMUF9BQk9VVA0KLSAgICBFTkQNCi1FTkQNCi0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vDQotLy8gQWNjZWxlcmF0b3INCi0vLw0KLQ0KLVZJU1VBTFBORyBBQ0NFTEVSQVRPUlMgRElTQ0FSREFCTEUgDQotQkVHSU4NCi0gICAgIk4iLCAgICAgICAgICAgIElETV9GSUxFX05FWFQsICAgICAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQotICAgICJPIiwgICAgICAgICAgICBJRE1fRklMRV9PUEVOLCAgICAgICAgICBWSVJUS0VZLCBDT05UUk9MLCBOT0lOVkVSVA0KLSAgICAiUCIsICAgICAgICAgICAgSURNX0ZJTEVfUFJFVklPVVMsICAgICAgVklSVEtFWSwgQ09OVFJPTCwgTk9JTlZFUlQNCi0gICAgIlYiLCAgICAgICAgICAgIElETV9GSUxFX1BSRVZJT1VTLCAgICAgIFZJUlRLRVksIENPTlRST0wsIE5PSU5WRVJUDQotICAgICJYIiwgICAgICAgICAgICBJRE1fRklMRV9FWElULCAgICAgICAgICBWSVJUS0VZLCBBTFQsIE5PSU5WRVJUDQotRU5EDQotDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLw0KLS8vIEljb24NCi0vLw0KLQ0KLS8vIEljb24gd2l0aCBsb3dlc3QgSUQgdmFsdWUgcGxhY2VkIGZpcnN0IHRvIGVuc3VyZSBhcHBsaWNhdGlvbiBpY29uDQotLy8gcmVtYWlucyBjb25zaXN0ZW50IG9uIGFsbCBzeXN0ZW1zLg0KLVZJU1VBTFBORyAgICAgICAgICAgICAgIElDT04gICAgRElTQ0FSREFCTEUgICAgICJWaXN1YWxQbmcuaWNvIg0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8NCi0vLyBEaWFsb2cNCi0vLw0KLQ0KLUFCT1VUQk9YIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMTg2LCA5NA0KLVNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUA0KLUZPTlQgOCwgIk1TIFNhbnMgU2VyaWYiDQotQkVHSU4NCi0gICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSyw2OCw2Nyw1MCwxNA0KLSAgICBDVEVYVCAgICAgICAgICAgIlZpc3VhbFBuZyAxLjAgIC0gIEp1bmUgMjAwMCIsSURDX1NUQVRJQyw0OSwxNCw4OCw4DQotICAgIExURVhUICAgICAgICAgICAiYSBQTkcgaW1hZ2Ugdmlld2VyIixJRENfU1RBVElDLDYwLDMwLDY2LDgNCi0gICAgTFRFWFQgICAgICAgICAgICIoYykgV2lsbGVtIHZhbiBTY2hhaWssIDIwMDAiLElEQ19TVEFUSUMsNDgsNTIsOTAsOA0KLSAgICBMVEVYVCAgICAgICAgICAgInRvIGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgbGlicG5nIGluIFZpc3VhbCBDIiwNCi0gICAgICAgICAgICAgICAgICAgIElEQ19TVEFUSUMsMjUsMzgsMTM2LDgNCi1FTkQNCi0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vDQotLy8gREVTSUdOSU5GTw0KLS8vDQotDQotI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQNCi1HVUlERUxJTkVTIERFU0lHTklORk8gRElTQ0FSREFCTEUgDQotQkVHSU4NCi0gICAgIkFCT1VUQk9YIiwgRElBTE9HDQotICAgIEJFR0lODQotICAgICAgICBMRUZUTUFSR0lOLCA3DQotICAgICAgICBSSUdIVE1BUkdJTiwgMTc5DQotICAgICAgICBUT1BNQVJHSU4sIDcNCi0gICAgICAgIEJPVFRPTU1BUkdJTiwgODcNCi0gICAgRU5EDQotRU5EDQotI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQNCi0NCi0jZW5kaWYgICAgLy8gRW5nbGlzaCAoVS5TLikgcmVzb3VyY2VzDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0NCi0NCi0jaWZuZGVmIEFQU1RVRElPX0lOVk9LRUQNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vDQotLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDMgcmVzb3VyY2UuDQotLy8NCi0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLSNlbmRpZiAgICAvLyBub3QgQVBTVFVESU9fSU5WT0tFRA0KLQ0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmggYi9jb250cmliL3Zpc3VwbmcvY2V4Y2VwdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ1ZDc2Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvdmlzdXBuZy9jZXhjZXB0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyo9PT0KLWNleGNlcHQuaCAyLjAuMSAoMjAwOC1KdWwtMTktU2F0KQotaHR0cDovL3d3dy5uaWNlbWljZS5uZXQvY2V4Y2VwdC8KLUFkYW0gTS4gQ29zdGVsbG8KLWh0dHA6Ly93d3cubmljZW1pY2UubmV0L2FtYy8KLQotQW4gaW50ZXJmYWNlIGZvciBleGNlcHRpb24taGFuZGxpbmcgaW4gQU5TSSBDIChDODkgYW5kIHN1YnNlcXVlbnQgSVNPCi1zdGFuZGFyZHMpLCBkZXZlbG9wZWQgam9pbnRseSB3aXRoIENvc21pbiBUcnV0YS4KLQotICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDA4IEFkYW0gTS4gQ29zdGVsbG8gYW5kIENvc21pbiBUcnV0YS4KLSAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSBtb2RpZmllZCBvbmx5IGlmIGl0cyBhdXRob3IgYW5kIHZlcnNpb24KLSAgICBpbmZvcm1hdGlvbiBpcyB1cGRhdGVkIGFjY3VyYXRlbHksIGFuZCBtYXkgYmUgcmVkaXN0cmlidXRlZAotICAgIG9ubHkgaWYgYWNjb21wYW5pZWQgYnkgdGhpcyB1bmFsdGVyZWQgbm90aWNlLiAgU3ViamVjdCB0byB0aG9zZQotICAgIHJlc3RyaWN0aW9ucywgcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byBkbyBhbnl0aGluZwotICAgIHdpdGggdGhpcyBzb2Z0d2FyZS4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIGd1YXJhbnRlZXMKLSAgICByZWdhcmRpbmcgdGhpcyBzb2Z0d2FyZSwgYW5kIGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGFueSBkYW1hZ2UKLSAgICByZXN1bHRpbmcgZnJvbSBpdHMgdXNlLgotCi1UaGUgY2V4Y2VwdCBpbnRlcmZhY2UgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBhbmQgY2Fubm90IGludGVyYWN0Ci13aXRoIHN5c3RlbSBleGNlcHRpb25zIChsaWtlIGRpdmlzaW9uIGJ5IHplcm8gb3IgbWVtb3J5IHNlZ21lbnRhdGlvbgotdmlvbGF0aW9uKSwgY29tcGlsZXItZ2VuZXJhdGVkIGV4Y2VwdGlvbnMgKGxpa2UgQysrIGV4Y2VwdGlvbnMpLCBvcgotb3RoZXIgZXhjZXB0aW9uLWhhbmRsaW5nIGludGVyZmFjZXMuCi0KLVdoZW4gdXNpbmcgdGhpcyBpbnRlcmZhY2UgYWNyb3NzIG11bHRpcGxlIC5jIGZpbGVzLCBkbyBub3QgaW5jbHVkZQotdGhpcyBoZWFkZXIgZmlsZSBkaXJlY3RseS4gIEluc3RlYWQsIGNyZWF0ZSBhIHdyYXBwZXIgaGVhZGVyIGZpbGUgdGhhdAotaW5jbHVkZXMgdGhpcyBoZWFkZXIgZmlsZSBhbmQgdGhlbiBpbnZva2VzIHRoZSBkZWZpbmVfZXhjZXB0aW9uX3R5cGUKLW1hY3JvIChzZWUgYmVsb3cpLiAgVGhlIC5jIGZpbGVzIHNob3VsZCB0aGVuIGluY2x1ZGUgdGhhdCBoZWFkZXIgZmlsZS4KLQotVGhlIGludGVyZmFjZSBjb25zaXN0cyBvZiBvbmUgdHlwZSwgb25lIHdlbGwta25vd24gbmFtZSwgYW5kIHNpeCBtYWNyb3MuCi0KLQotZGVmaW5lX2V4Y2VwdGlvbl90eXBlKHR5cGVfbmFtZSk7Ci0KLSAgICBUaGlzIG1hY3JvIGlzIHVzZWQgbGlrZSBhbiBleHRlcm5hbCBkZWNsYXJhdGlvbi4gIEl0IHNwZWNpZmllcwotICAgIHRoZSB0eXBlIG9mIG9iamVjdCB0aGF0IGdldHMgY29waWVkIGZyb20gdGhlIGV4Y2VwdGlvbiB0aHJvd2VyIHRvCi0gICAgdGhlIGV4Y2VwdGlvbiBjYXRjaGVyLiAgVGhlIHR5cGVfbmFtZSBjYW4gYmUgYW55IHR5cGUgdGhhdCBjYW4gYmUKLSAgICBhc3NpZ25lZCB0bywgdGhhdCBpcywgYSBub24tY29uc3RhbnQgYXJpdGhtZXRpYyB0eXBlLCBzdHJ1Y3QsIHVuaW9uLAotICAgIG9yIHBvaW50ZXIuICBFeGFtcGxlczoKLQotICAgICAgICBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoaW50KTsKLQotICAgICAgICBlbnVtIGV4Y2VwdGlvbiB7IG91dF9vZl9tZW1vcnksIGJhZF9hcmd1bWVudHMsIGRpc2tfZnVsbCB9OwotICAgICAgICBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoZW51bSBleGNlcHRpb24pOwotCi0gICAgICAgIHN0cnVjdCBleGNlcHRpb24geyBpbnQgY29kZTsgY29uc3QgY2hhciAqbXNnOyB9OwotICAgICAgICBkZWZpbmVfZXhjZXB0aW9uX3R5cGUoc3RydWN0IGV4Y2VwdGlvbik7Ci0KLSAgICBCZWNhdXNlIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBjYXVzZXMgdGhlIG9iamVjdCB0byBiZSBjb3BpZWQgKG5vdAotICAgIGp1c3Qgb25jZSwgYnV0IHR3aWNlKSwgcHJvZ3JhbW1lcnMgbWF5IHdpc2ggdG8gY29uc2lkZXIgc2l6ZSB3aGVuCi0gICAgY2hvb3NpbmcgdGhlIGV4Y2VwdGlvbiB0eXBlLgotCi0KLXN0cnVjdCBleGNlcHRpb25fY29udGV4dDsKLQotICAgIFRoaXMgdHlwZSBtYXkgYmUgdXNlZCBhZnRlciB0aGUgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKCkgbWFjcm8gaGFzCi0gICAgYmVlbiBpbnZva2VkLiAgQSBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgbXVzdCBiZSBrbm93biB0byBib3RoCi0gICAgdGhlIHRocm93ZXIgYW5kIHRoZSBjYXRjaGVyLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGVyZSBiZSBvbmUKLSAgICBjb250ZXh0IGZvciBlYWNoIHRocmVhZCB0aGF0IHVzZXMgZXhjZXB0aW9ucy4gIEl0IHdvdWxkIGNlcnRhaW5seQotICAgIGJlIGRhbmdlcm91cyBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBhY2Nlc3MgdGhlIHNhbWUgY29udGV4dC4KLSAgICBPbmUgdGhyZWFkIGNhbiB1c2UgbXVsdGlwbGUgY29udGV4dHMsIGJ1dCB0aGF0IGlzIGxpa2VseSB0byBiZQotICAgIGNvbmZ1c2luZyBhbmQgbm90IHR5cGljYWxseSB1c2VmdWwuICBUaGUgYXBwbGljYXRpb24gY2FuIGFsbG9jYXRlCi0gICAgdGhpcyBzdHJ1Y3R1cmUgaW4gYW55IHdheSBpdCBwbGVhc2VzLS1hdXRvbWF0aWMsIHN0YXRpYywgb3IgZHluYW1pYy4KLSAgICBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lciBzaG91bGQgcHJldGVuZCBub3QgdG8ga25vdyB0aGUgc3RydWN0dXJlCi0gICAgbWVtYmVycywgd2hpY2ggYXJlIHN1YmplY3QgdG8gY2hhbmdlLgotCi0KLXN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqdGhlX2V4Y2VwdGlvbl9jb250ZXh0OwotCi0gICAgVGhlIFRyeS9DYXRjaCBhbmQgVGhyb3cgc3RhdGVtZW50cyAoZGVzY3JpYmVkIGJlbG93KSBpbXBsaWNpdGx5Ci0gICAgcmVmZXIgdG8gYSBjb250ZXh0LCB1c2luZyB0aGUgbmFtZSB0aGVfZXhjZXB0aW9uX2NvbnRleHQuICBJdCBpcwotICAgIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgbmFtZSB5aWVsZHMKLSAgICB0aGUgYWRkcmVzcyBvZiBhIG11dGFibGUgKG5vbi1jb25zdGFudCkgc3RydWN0IGV4Y2VwdGlvbl9jb250ZXh0Ci0gICAgd2hlcmV2ZXIgdGhvc2Ugc3RhdGVtZW50cyBhcmUgdXNlZC4gIFN1YmplY3QgdG8gdGhhdCBjb25zdHJhaW50LCB0aGUKLSAgICBhcHBsaWNhdGlvbiBtYXkgZGVjbGFyZSBhIHZhcmlhYmxlIG9mIHRoaXMgbmFtZSBhbnl3aGVyZSBpdCBsaWtlcwotICAgIChpbnNpZGUgYSBmdW5jdGlvbiwgaW4gYSBwYXJhbWV0ZXIgbGlzdCwgb3IgZXh0ZXJuYWxseSksIGFuZCBtYXkKLSAgICB1c2Ugd2hhdGV2ZXIgc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJzIChzdGF0aWMsIGV4dGVybiwgZXRjKSBvciB0eXBlCi0gICAgcXVhbGlmaWVycyAoY29uc3QsIHZvbGF0aWxlLCBldGMpIGl0IGxpa2VzLiAgRXhhbXBsZXM6Ci0KLSAgICAgICAgc3RhdGljIHN0cnVjdCBleGNlcHRpb25fY29udGV4dAotICAgICAgICAgICogY29uc3QgdGhlX2V4Y2VwdGlvbl9jb250ZXh0ID0gJmZvbzsKLQotICAgICAgICB7IHN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqdGhlX2V4Y2VwdGlvbl9jb250ZXh0ID0gYmFyOyAuLi4gfQotCi0gICAgICAgIGludCBibGFoKHN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqdGhlX2V4Y2VwdGlvbl9jb250ZXh0LCAuLi4pOwotCi0gICAgICAgIGV4dGVybiBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgdGhlX2V4Y2VwdGlvbl9jb250ZXh0WzFdOwotCi0gICAgVGhlIGxhc3QgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIHRyaWNrIHRoYXQgYXZvaWRzIGNyZWF0aW5nIGEgcG9pbnRlcgotICAgIG9iamVjdCBzZXBhcmF0ZSBmcm9tIHRoZSBzdHJ1Y3R1cmUgb2JqZWN0LgotCi0gICAgVGhlIG5hbWUgY291bGQgZXZlbiBiZSBhIG1hY3JvLCBmb3IgZXhhbXBsZToKLQotICAgICAgICBzdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgZWNfYXJyYXlbbnVtdGhyZWFkc107Ci0gICAgICAgICNkZWZpbmUgdGhlX2V4Y2VwdGlvbl9jb250ZXh0IChlY19hcnJheSArIHRocmVhZF9pZCkKLQotICAgIEJlIGF3YXJlIHRoYXQgdGhlX2V4Y2VwdGlvbl9jb250ZXh0IGlzIHVzZWQgc2V2ZXJhbCB0aW1lcyBieSB0aGUKLSAgICBUcnkvQ2F0Y2gvVGhyb3cgbWFjcm9zLCBzbyBpdCBzaG91bGRuJ3QgYmUgZXhwZW5zaXZlIG9yIGhhdmUgc2lkZQotICAgIGVmZmVjdHMuICBUaGUgZXhwYW5zaW9uIG11c3QgYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBhbgotICAgIGlkZW50aWZpZXIsIHNvIGl0J3Mgc2FmZXN0IHRvIHB1dCBwYXJlbnRoZXNlcyBhcm91bmQgaXQuCi0KLQotdm9pZCBpbml0X2V4Y2VwdGlvbl9jb250ZXh0KHN0cnVjdCBleGNlcHRpb25fY29udGV4dCAqZWMpOwotCi0gICAgRm9yIGNvbnRleHQgc3RydWN0dXJlcyBhbGxvY2F0ZWQgc3RhdGljYWxseSAoYnkgYW4gZXh0ZXJuYWwKLSAgICBkZWZpbml0aW9uIG9yIHVzaW5nIHRoZSAic3RhdGljIiBrZXl3b3JkKSwgdGhlIGltcGxpY2l0Ci0gICAgaW5pdGlhbGl6YXRpb24gdG8gYWxsIHplcm9zIGlzIHN1ZmZpY2llbnQsIGJ1dCBjb250ZXh0cyBhbGxvY2F0ZWQKLSAgICBieSBvdGhlciBtZWFucyBtdXN0IGJlIGluaXRpYWxpemVkIHVzaW5nIHRoaXMgbWFjcm8gYmVmb3JlIHRoZXkKLSAgICBhcmUgdXNlZCBieSBhIFRyeS9DYXRjaCBzdGF0ZW1lbnQuICBJdCBkb2VzIG5vIGhhcm0gdG8gaW5pdGlhbGl6ZQotICAgIGEgY29udGV4dCBtb3JlIHRoYW4gb25jZSAoYnkgdXNpbmcgdGhpcyBtYWNybyBvbiBhIHN0YXRpY2FsbHkKLSAgICBhbGxvY2F0ZWQgY29udGV4dCwgb3IgdXNpbmcgdGhpcyBtYWNybyB0d2ljZSBvbiB0aGUgc2FtZSBjb250ZXh0KSwKLSAgICBidXQgYSBjb250ZXh0IG11c3Qgbm90IGJlIHJlLWluaXRpYWxpemVkIGFmdGVyIGl0IGhhcyBiZWVuIHVzZWQgYnkgYQotICAgIFRyeS9DYXRjaCBzdGF0ZW1lbnQuCi0KLQotVHJ5IHN0YXRlbWVudAotQ2F0Y2ggKGV4cHJlc3Npb24pIHN0YXRlbWVudAotCi0gICAgVGhlIFRyeS9DYXRjaC9UaHJvdyBtYWNyb3MgYXJlIGNhcGl0YWxpemVkIGluIG9yZGVyIHRvIGF2b2lkCi0gICAgY29uZnVzaW9uIHdpdGggdGhlIEMrKyBrZXl3b3Jkcywgd2hpY2ggaGF2ZSBzdWJ0bHkgZGlmZmVyZW50Ci0gICAgc2VtYW50aWNzLgotCi0gICAgQSBUcnkvQ2F0Y2ggc3RhdGVtZW50IGhhcyBhIHN5bnRheCBzaW1pbGFyIHRvIGFuIGlmL2Vsc2Ugc3RhdGVtZW50LAotICAgIGV4Y2VwdCB0aGF0IHRoZSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gZ29lcyBhZnRlciB0aGUgc2Vjb25kCi0gICAga2V5d29yZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QuICBBcyB3aXRoIGlmL2Vsc2UsIHRoZXJlIGFyZSB0d28KLSAgICBjbGF1c2VzLCBlYWNoIG9mIHdoaWNoIG1heSBiZSBhIHNpbXBsZSBzdGF0ZW1lbnQgZW5kaW5nIHdpdGggYQotICAgIHNlbWljb2xvbiBvciBhIGJyYWNlLWVuY2xvc2VkIGNvbXBvdW5kIHN0YXRlbWVudC4gIEJ1dCB3aGVyZWFzCi0gICAgdGhlIGVsc2UgY2xhdXNlIGlzIG9wdGlvbmFsLCB0aGUgQ2F0Y2ggY2xhdXNlIGlzIHJlcXVpcmVkLiAgVGhlCi0gICAgZXhwcmVzc2lvbiBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUgKHNvbWV0aGluZyBjYXBhYmxlIG9mIGJlaW5nCi0gICAgYXNzaWduZWQgdG8pIG9mIHRoZSBzYW1lIHR5cGUgKGRpc3JlZ2FyZGluZyB0eXBlIHF1YWxpZmllcnMpIHRoYXQKLSAgICB3YXMgcGFzc2VkIHRvIGRlZmluZV9leGNlcHRpb25fdHlwZSgpLgotCi0gICAgSWYgYSBUaHJvdyB0aGF0IHVzZXMgdGhlIHNhbWUgZXhjZXB0aW9uIGNvbnRleHQgYXMgdGhlIFRyeS9DYXRjaCBpcwotICAgIGV4ZWN1dGVkIHdpdGhpbiB0aGUgVHJ5IGNsYXVzZSAodHlwaWNhbGx5IHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGxlZAotICAgIGJ5IHRoZSBUcnkgY2xhdXNlKSwgYW5kIHRoZSBleGNlcHRpb24gaXMgbm90IGNhdWdodCBieSBhIG5lc3RlZAotICAgIFRyeS9DYXRjaCBzdGF0ZW1lbnQsIHRoZW4gYSBjb3B5IG9mIHRoZSBleGNlcHRpb24gd2lsbCBiZSBhc3NpZ25lZAotICAgIHRvIHRoZSBleHByZXNzaW9uLCBhbmQgY29udHJvbCB3aWxsIGp1bXAgdG8gdGhlIENhdGNoIGNsYXVzZS4gIElmIG5vCi0gICAgc3VjaCBUaHJvdyBpcyBleGVjdXRlZCwgdGhlbiB0aGUgYXNzaWdubWVudCBpcyBub3QgcGVyZm9ybWVkLCBhbmQKLSAgICB0aGUgQ2F0Y2ggY2xhdXNlIGlzIG5vdCBleGVjdXRlZC4KLQotICAgIFRoZSBleHByZXNzaW9uIGlzIG5vdCBldmFsdWF0ZWQgdW5sZXNzIGFuZCB1bnRpbCB0aGUgZXhjZXB0aW9uIGlzCi0gICAgY2F1Z2h0LCB3aGljaCBpcyBzaWduaWZpY2FudCBpZiBpdCBoYXMgc2lkZSBlZmZlY3RzLCBmb3IgZXhhbXBsZToKLQotICAgICAgICBUcnkgZm9vKCk7Ci0gICAgICAgIENhdGNoIChwWysraV0uZSkgeyAuLi4gfQotCi0gICAgSU1QT1JUQU5UOiBKdW1waW5nIGludG8gb3Igb3V0IG9mIGEgVHJ5IGNsYXVzZSAoZm9yIGV4YW1wbGUgdmlhCi0gICAgcmV0dXJuLCBicmVhaywgY29udGludWUsIGdvdG8sIGxvbmdqbXApIGlzIGZvcmJpZGRlbi0tdGhlIGNvbXBpbGVyCi0gICAgd2lsbCBub3QgY29tcGxhaW4sIGJ1dCBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuIGF0IHJ1bi10aW1lLiAgSnVtcGluZwotICAgIGludG8gb3Igb3V0IG9mIGEgQ2F0Y2ggY2xhdXNlIGlzIG9rYXksIGFuZCBzbyBpcyBqdW1waW5nIGFyb3VuZAotICAgIGluc2lkZSBhIFRyeSBjbGF1c2UuICBJbiBtYW55IGNhc2VzIHdoZXJlIG9uZSBpcyB0ZW1wdGVkIHRvIHJldHVybgotICAgIGZyb20gYSBUcnkgY2xhdXNlLCBpdCB3aWxsIHN1ZmZpY2UgdG8gdXNlIFRocm93LCBhbmQgdGhlbiByZXR1cm4KLSAgICBmcm9tIHRoZSBDYXRjaCBjbGF1c2UuICBBbm90aGVyIG9wdGlvbiBpcyB0byBzZXQgYSBmbGFnIHZhcmlhYmxlIGFuZAotICAgIHVzZSBnb3RvIHRvIGp1bXAgdG8gdGhlIGVuZCBvZiB0aGUgVHJ5IGNsYXVzZSwgdGhlbiBjaGVjayB0aGUgZmxhZwotICAgIGFmdGVyIHRoZSBUcnkvQ2F0Y2ggc3RhdGVtZW50LgotCi0gICAgSU1QT1JUQU5UOiBUaGUgdmFsdWVzIG9mIGFueSBub24tdm9sYXRpbGUgYXV0b21hdGljIHZhcmlhYmxlcwotICAgIGNoYW5nZWQgd2l0aGluIHRoZSBUcnkgY2xhdXNlIGFyZSB1bmRlZmluZWQgYWZ0ZXIgYW4gZXhjZXB0aW9uIGlzCi0gICAgY2F1Z2h0LiAgVGhlcmVmb3JlLCB2YXJpYWJsZXMgbW9kaWZpZWQgaW5zaWRlIHRoZSBUcnkgYmxvY2sgd2hvc2UKLSAgICB2YWx1ZXMgYXJlIG5lZWRlZCBsYXRlciBvdXRzaWRlIHRoZSBUcnkgYmxvY2sgbXVzdCBlaXRoZXIgdXNlIHN0YXRpYwotICAgIHN0b3JhZ2Ugb3IgYmUgZGVjbGFyZWQgd2l0aCB0aGUgInZvbGF0aWxlIiB0eXBlIHF1YWxpZmllci4KLQotCi1UaHJvdyBleHByZXNzaW9uOwotCi0gICAgQSBUaHJvdyBzdGF0ZW1lbnQgaXMgdmVyeSBtdWNoIGxpa2UgYSByZXR1cm4gc3RhdGVtZW50LCBleGNlcHQgdGhhdAotICAgIHRoZSBleHByZXNzaW9uIGlzIHJlcXVpcmVkLiAgV2hlcmVhcyByZXR1cm4ganVtcHMgYmFjayB0byB0aGUgcGxhY2UKLSAgICB3aGVyZSB0aGUgY3VycmVudCBmdW5jdGlvbiB3YXMgY2FsbGVkLCBUaHJvdyBqdW1wcyBiYWNrIHRvIHRoZSBDYXRjaAotICAgIGNsYXVzZSBvZiB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBUcnkgY2xhdXNlLiAgVGhlIGV4cHJlc3Npb24gbXVzdAotICAgIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBwYXNzZWQgdG8gZGVmaW5lX2V4Y2VwdGlvbl90eXBlKCkuICBUaGUKLSAgICBleGNlcHRpb24gbXVzdCBiZSBjYXVnaHQsIG90aGVyd2lzZSB0aGUgcHJvZ3JhbSBtYXkgY3Jhc2guCi0KLSAgICBTbGlnaHQgbGltaXRhdGlvbjogIElmIHRoZSBleHByZXNzaW9uIGlzIGEgY29tbWEtZXhwcmVzc2lvbiwgaXQgbXVzdAotICAgIGJlIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLgotCi0KLVRyeSBzdGF0ZW1lbnQKLUNhdGNoX2Fub255bW91cyBzdGF0ZW1lbnQKLQotICAgIFdoZW4gdGhlIHZhbHVlIG9mIHRoZSBleGNlcHRpb24gaXMgbm90IG5lZWRlZCwgYSBUcnkvQ2F0Y2ggc3RhdGVtZW50Ci0gICAgY2FuIHVzZSBDYXRjaF9hbm9ueW1vdXMgaW5zdGVhZCBvZiBDYXRjaCAoZXhwcmVzc2lvbikuCi0KLQotRXZlcnl0aGluZyBiZWxvdyB0aGlzIHBvaW50IGlzIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgY29tcGlsZXIuICBUaGUKLWFwcGxpY2F0aW9uIHByb2dyYW1tZXIgc2hvdWxkIHByZXRlbmQgbm90IHRvIGtub3cgYW55IG9mIGl0LCBiZWNhdXNlIGl0Ci1pcyBzdWJqZWN0IHRvIGNoYW5nZS4KLQotPT09Ki8KLQotCi0jaWZuZGVmIENFWENFUFRfSAotI2RlZmluZSBDRVhDRVBUX0gKLQotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLSNkZWZpbmUgZGVmaW5lX2V4Y2VwdGlvbl90eXBlKGV0eXBlKSBcCi1zdHJ1Y3QgZXhjZXB0aW9uX2NvbnRleHQgeyBcCi0gIGptcF9idWYgKnBlbnY7IFwKLSAgaW50IGNhdWdodDsgXAotICB2b2xhdGlsZSBzdHJ1Y3QgeyBldHlwZSBldG1wOyB9IHY7IFwKLX0KLQotLyogZXRtcCBtdXN0IGJlIHZvbGF0aWxlIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIG1pZ2h0IHVzZSBhdXRvbWF0aWMgKi8KLS8qIHN0b3JhZ2UgZm9yIHRoZV9leGNlcHRpb25fY29udGV4dCwgYW5kIGV0bXAgaXMgbW9kaWZpZWQgYmV0d2VlbiAgICovCi0vKiB0aGUgY2FsbHMgdG8gc2V0am1wKCkgYW5kIGxvbmdqbXAoKS4gIEEgd3JhcHBlciBzdHJ1Y3QgaXMgdXNlZCB0byAqLwotLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgYSBkdXBsaWNhdGUgdm9sYXRpbGUgcXVhbGlmaWVyIGluIGNhc2UgZXR5cGUgKi8KLS8qIGFscmVhZHkgaW5jbHVkZXMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgaW5pdF9leGNlcHRpb25fY29udGV4dChlYykgKCh2b2lkKSgoZWMpLT5wZW52ID0gMCkpCi0KLSNkZWZpbmUgVHJ5IFwKLSAgeyBcCi0gICAgam1wX2J1ZiAqZXhjZXB0aW9uX19wcmV2LCBleGNlcHRpb25fX2VudjsgXAotICAgIGV4Y2VwdGlvbl9fcHJldiA9IHRoZV9leGNlcHRpb25fY29udGV4dC0+cGVudjsgXAotICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+cGVudiA9ICZleGNlcHRpb25fX2VudjsgXAotICAgIGlmIChzZXRqbXAoZXhjZXB0aW9uX19lbnYpID09IDApIHsgXAotICAgICAgZG8KLQotI2RlZmluZSBleGNlcHRpb25fX2NhdGNoKGFjdGlvbikgXAotICAgICAgd2hpbGUgKHRoZV9leGNlcHRpb25fY29udGV4dC0+Y2F1Z2h0ID0gMCwgXAotICAgICAgICAgICAgIHRoZV9leGNlcHRpb25fY29udGV4dC0+Y2F1Z2h0KTsgXAotICAgIH0gXAotICAgIGVsc2UgeyBcCi0gICAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPmNhdWdodCA9IDE7IFwKLSAgICB9IFwKLSAgICB0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnBlbnYgPSBleGNlcHRpb25fX3ByZXY7IFwKLSAgfSBcCi0gIGlmICghdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT5jYXVnaHQgfHwgYWN0aW9uKSB7IH0gXAotICBlbHNlCi0KLSNkZWZpbmUgQ2F0Y2goZSkgZXhjZXB0aW9uX19jYXRjaCgoKGUpID0gdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT52LmV0bXAsIDApKQotI2RlZmluZSBDYXRjaF9hbm9ueW1vdXMgZXhjZXB0aW9uX19jYXRjaCgwKQotCi0vKiBUcnkgZW5kcyB3aXRoIGRvLCBhbmQgQ2F0Y2ggYmVnaW5zIHdpdGggd2hpbGUoMCkgYW5kIGVuZHMgd2l0aCAgICAgKi8KLS8qIGVsc2UsIHRvIGVuc3VyZSB0aGF0IFRyeS9DYXRjaCBzeW50YXggaXMgc2ltaWxhciB0byBpZi9lbHNlICAgICAgICAqLwotLyogc3ludGF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSAwIGluIHdoaWxlKDApIGlzIGV4cHJlc3NlZCBhcyB4PTAseCBpbiBvcmRlciB0byBhcHBlYXNlICAgICAgICAqLwotLyogY29tcGlsZXJzIHRoYXQgd2FybiBhYm91dCBjb25zdGFudCBleHByZXNzaW9ucyBpbnNpZGUgd2hpbGUoKS4gICAgICovCi0vKiBNb3N0IGNvbXBpbGVycyBzaG91bGQgc3RpbGwgcmVjb2duaXplIHRoYXQgdGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgKi8KLS8qIGZhbHNlIGFuZCBhdm9pZCBnZW5lcmF0aW5nIGNvZGUgZm9yIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFRocm93IFwKLSAgZm9yICg7OyBsb25nam1wKCp0aGVfZXhjZXB0aW9uX2NvbnRleHQtPnBlbnYsIDEpKSBcCi0gICAgdGhlX2V4Y2VwdGlvbl9jb250ZXh0LT52LmV0bXAgPQotCi0KLSNlbmRpZiAvKiBDRVhDRVBUX0ggKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmlzdXBuZy9yZXNvdXJjZS5oIGIvY29udHJpYi92aXN1cG5nL3Jlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjE3NmQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi92aXN1cG5nL3Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vL3t7Tk9fREVQRU5ERU5DSUVTfX0KLS8vIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCBpbmNsdWRlIGZpbGUuCi0vLyBVc2VkIGJ5IFZpc3VhbFBuZy5yYwotLy8KLSNkZWZpbmUgSURNX0ZJTEVfT1BFTiAgICAgICAgICAgICAgICAgICA0MDAwMQotI2RlZmluZSBJRE1fRklMRV9TQVZFICAgICAgICAgICAgICAgICAgIDQwMDAyCi0jZGVmaW5lIElETV9GSUxFX05FWFQgICAgICAgICAgICAgICAgICAgNDAwMDMKLSNkZWZpbmUgSURNX0ZJTEVfUFJFVklPVVMgICAgICAgICAgICAgICA0MDAwNAotI2RlZmluZSBJRE1fRklMRV9FWElUICAgICAgICAgICAgICAgICAgIDQwMDA1Ci0jZGVmaW5lIElETV9PUFRJT05TX0JBQ0tHUk9VTkQgICAgICAgICAgNDAwMDYKLSNkZWZpbmUgSURNX09QVElPTlNfU1RSRVRDSCAgICAgICAgICAgICA0MDAwNwotI2RlZmluZSBJRE1fSEVMUF9BQk9VVCAgICAgICAgICAgICAgICAgIDQwMDA4Ci0KLS8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCi0vLwotI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKLSNpZm5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUwotI2RlZmluZSBfQVBTX05FWFRfUkVTT1VSQ0VfVkFMVUUgICAgICAgIDExMwotI2RlZmluZSBfQVBTX05FWFRfQ09NTUFORF9WQUxVRSAgICAgICAgIDQwMDA5Ci0jZGVmaW5lIF9BUFNfTkVYVF9DT05UUk9MX1ZBTFVFICAgICAgICAgMTAwMQotI2RlZmluZSBfQVBTX05FWFRfU1lNRURfVkFMVUUgICAgICAgICAgIDEwMQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBuZy1jb25maWcuaW4gYi9saWJwbmctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWJmOGUzLi4wMDAwMDAwCi0tLSBhL2xpYnBuZy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGxpYnBuZy1jb25maWcKLSMgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBpbmZvIGZvciBsaWJwbmcuCi0KLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA2LCAyMDA3IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBNb2RlbGVkIGFmdGVyIGxpYnhtbC1jb25maWcuCi0KLXZlcnNpb249IkBQTkdMSUJfVkVSU0lPTkAiCi1wcmVmaXg9IkBwcmVmaXhAIgotZXhlY19wcmVmaXg9IkBleGVjX3ByZWZpeEAiCi1saWJkaXI9IkBsaWJkaXJAIgotaW5jbHVkZWRpcj0iQGluY2x1ZGVkaXJAL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAiCi1saWJzPSItbHBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAiCi1hbGxfbGlicz0iLWxwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JAIEBMSUJTQCIKLUlfb3B0cz0iLUkke2luY2x1ZGVkaXJ9IgotTF9vcHRzPSItTCR7bGliZGlyfSIKLVJfb3B0cz0iIgotY3BwZmxhZ3M9IiIKLWNjb3B0cz0iIgotbGRvcHRzPSIiCi0KLXVzYWdlKCkKLXsKLSAgICBjYXQgPDxFT0YKLVVzYWdlOiAkMCBbT1BUSU9OXSAuLi4KLQotS25vd24gdmFsdWVzIGZvciBPUFRJT04gYXJlOgotCi0gIC0tcHJlZml4ICAgICAgICBwcmludCBsaWJwbmcgcHJlZml4Ci0gIC0tbGliZGlyICAgICAgICBwcmludCBwYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIGxpYnJhcnkKLSAgLS1saWJzICAgICAgICAgIHByaW50IGxpYnJhcnkgbGlua2luZyBpbmZvcm1hdGlvbgotICAtLWNjb3B0cyAgICAgICAgcHJpbnQgY29tcGlsZXIgb3B0aW9ucwotICAtLWNwcGZsYWdzICAgICAgcHJpbnQgcHJlLXByb2Nlc3NvciBmbGFncwotICAtLWNmbGFncyAgICAgICAgcHJpbnQgcHJlcHJvY2Vzc29yIGZsYWdzLCBJX29wdHMsIGFuZCBjb21waWxlciBvcHRpb25zCi0gIC0tSV9vcHRzICAgICAgICBwcmludCAiLUkiIGluY2x1ZGUgb3B0aW9ucwotICAtLUxfb3B0cyAgICAgICAgcHJpbnQgbGlua2VyICItTCIgZmxhZ3MgZm9yIGR5bmFtaWMgbGlua2luZwotICAtLVJfb3B0cyAgICAgICAgcHJpbnQgZHluYW1pYyBsaW5rZXIgIi1SIiBvciAiLXJwYXRoIiBmbGFncwotICAtLWxkb3B0cyAgICAgICAgcHJpbnQgbGlua2VyIG9wdGlvbnMKLSAgLS1sZGZsYWdzICAgICAgIHByaW50IGxpbmtlciBmbGFncyAobGRvcHRzLCBMX29wdHMsIFJfb3B0cywgYW5kIGxpYnMpCi0gIC0tc3RhdGljICAgICAgICByZXZpc2Ugc3Vic2VxdWVudCBvdXRwdXRzIGZvciBzdGF0aWMgbGlua2luZwotICAtLWhlbHAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC0tdmVyc2lvbiAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi1FT0YKLQotICAgIGV4aXQgJDEKLX0KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICAgIHVzYWdlIDEKLWZpCi0KLXdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgY2FzZSAiJDEiIGluCi0KLSAgICAtLXByZWZpeCkKLSAgICAgICAgZWNobyAke3ByZWZpeH0KLSAgICAgICAgOzsKLQotICAgIC0tdmVyc2lvbikKLSAgICAgICAgZWNobyAke3ZlcnNpb259Ci0gICAgICAgIGV4aXQgMAotICAgICAgICA7OwotCi0gICAgLS1oZWxwKQotICAgICAgICB1c2FnZSAwCi0gICAgICAgIDs7Ci0KLSAgICAtLWNjb3B0cykKLSAgICAgICAgZWNobyAke2Njb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tY3BwZmxhZ3MpCi0gICAgICAgIGVjaG8gJHtjcHBmbGFnc30KLSAgICAgICAgOzsKLQotICAgIC0tY2ZsYWdzKQotICAgICAgICBlY2hvICR7SV9vcHRzfSAke2NwcGZsYWdzfSAke2Njb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tbGliZGlyKQotICAgICAgICBlY2hvICR7bGliZGlyfQotICAgICAgICA7OwotCi0gICAgLS1saWJzKQotICAgICAgICBlY2hvICR7bGlic30KLSAgICAgICAgOzsKLQotICAgIC0tSV9vcHRzKQotICAgICAgICBlY2hvICR7SV9vcHRzfQotICAgICAgICA7OwotCi0gICAgLS1MX29wdHMpCi0gICAgICAgIGVjaG8gJHtMX29wdHN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLVJfb3B0cykKLSAgICAgICAgZWNobyAke1Jfb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tbGRvcHRzKQotICAgICAgICBlY2hvICR7bGRvcHRzfQotICAgICAgICA7OwotCi0gICAgLS1sZGZsYWdzKQotICAgICAgICBlY2hvICR7bGRvcHRzfSAke0xfb3B0c30gJHtSX29wdHN9ICR7bGlic30KLSAgICAgICAgOzsKLQotICAgIC0tc3RhdGljKQotICAgICAgICBSX29wdHM9IiIKLSAgICAgICAgbGlicz0ke2FsbF9saWJzfQotICAgICAgICA7OwotCi0gICAgKikKLSAgICAgICAgdXNhZ2UKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0Ci1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvbGlicG5nLW1hbnVhbC50eHQgYi9saWJwbmctbWFudWFsLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhYzRiMS4uMDAwMDAwMAotLS0gYS9saWJwbmctbWFudWFsLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU0MDAgKzAsMCBAQAotbGlicG5nLW1hbnVhbC50eHQgLSBBIGRlc2NyaXB0aW9uIG9uIGhvdyB0byB1c2UgYW5kIG1vZGlmeSBsaWJwbmcKLQotIGxpYnBuZyB2ZXJzaW9uIDEuNi4yNCAtIEF1Z3VzdCA0LCAyMDE2Ci0gVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gPGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0PgotIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotCi0gVGhpcyBkb2N1bWVudCBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSBCYXNlZCBvbjoKLQotIGxpYnBuZyB2ZXJzaW9ucyAwLjk3LCBKYW51YXJ5IDE5OTgsIHRocm91Z2ggMS42LjI0IC0gQXVndXN0IDQsIDIwMTYKLSBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotIGxpYnBuZyAxLjAgYmV0YSA2IC0gdmVyc2lvbiAwLjk2IC0gTWF5IDI4LCAxOTk3Ci0gVXBkYXRlZCBhbmQgZGlzdHJpYnV0ZWQgYnkgQW5kcmVhcyBEaWxnZXIKLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLQotIGxpYnBuZyAxLjAgYmV0YSAyIC0gdmVyc2lvbiAwLjg4IC0gSmFudWFyeSAyNiwgMTk5NgotIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0Ci0gbm90aWNlIGluIHBuZy5oLiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMKLSBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLQotIFVwZGF0ZWQvcmV3cml0dGVuIHBlciByZXF1ZXN0IGluIHRoZSBsaWJwbmcgRkFRCi0gQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEZyYW5rIEouIFQuIFdvamNpawotIERlY2VtYmVyIDE4LCAxOTk1ICYgSmFudWFyeSAyMCwgMTk5NgotCi0gVEFCTEUgT0YgQ09OVEVOVFMKLQotICAgIEkuIEludHJvZHVjdGlvbgotICAgSUkuIFN0cnVjdHVyZXMKLSAgSUlJLiBSZWFkaW5nCi0gICBJVi4gV3JpdGluZwotICAgIFYuIFNpbXBsaWZpZWQgQVBJCi0gICBWSS4gTW9kaWZ5aW5nL0N1c3RvbWl6aW5nIGxpYnBuZwotICBWSUkuIE1ORyBzdXBwb3J0Ci0gVklJSS4gQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDAuODgKLSAgIElYLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLnggdG8gMS4yLngKLSAgICBYLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLngvMS4yLnggdG8gMS40LngKLSAgIFhJLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS40LnggdG8gMS41LngKLSAgWElJLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS41LnggdG8gMS42LngKLSBYSUlJLiBEZXRlY3RpbmcgbGlicG5nCi0gIFhJVi4gU291cmNlIGNvZGUgcmVwb3NpdG9yeQotICAgWFYuIENvZGluZyBzdHlsZQotICBYVkkuIFkySyBDb21wbGlhbmNlIGluIGxpYnBuZwotCi1JLiBJbnRyb2R1Y3Rpb24KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQotKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIEluIGFkZGl0aW9uIHRvIHRoaXMKLWZpbGUsIGV4YW1wbGUuYyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVzaW5nIHRoZSBsaWJyYXJ5LCBhcwotaXQgaXMgaGVhdmlseSBjb21tZW50ZWQgYW5kIHNob3VsZCBpbmNsdWRlIGV2ZXJ5dGhpbmcgbW9zdCBwZW9wbGUKLXdpbGwgbmVlZC4gIFdlIGFzc3VtZSB0aGF0IGxpYnBuZyBpcyBhbHJlYWR5IGluc3RhbGxlZDsgc2VlIHRoZQotSU5TVEFMTCBmaWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCBsaWJwbmcuCi0KLUZvciBleGFtcGxlcyBvZiBsaWJwbmcgdXNhZ2UsIHNlZSB0aGUgZmlsZXMgImV4YW1wbGUuYyIsICJwbmd0ZXN0LmMiLAotYW5kIHRoZSBmaWxlcyBpbiB0aGUgImNvbnRyaWIiIGRpcmVjdG9yeSwgYWxsIG9mIHdoaWNoIGFyZSBpbmNsdWRlZCBpbgotdGhlIGxpYnBuZyBkaXN0cmlidXRpb24uCi0KLUxpYnBuZyB3YXMgd3JpdHRlbiBhcyBhIGNvbXBhbmlvbiB0byB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGEgd2F5Ci1vZiByZWR1Y2luZyB0aGUgYW1vdW50IG9mIHRpbWUgYW5kIGVmZm9ydCBpdCB0YWtlcyB0byBzdXBwb3J0IHRoZSBQTkcKLWZpbGUgZm9ybWF0IGluIGFwcGxpY2F0aW9uIHByb2dyYW1zLgotCi1UaGUgUE5HIHNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKSwgTm92ZW1iZXIgMjAwMywgaXMgYXZhaWxhYmxlIGFzCi1hIFczQyBSZWNvbW1lbmRhdGlvbiBhbmQgYXMgYW4gSVNPIFN0YW5kYXJkIChJU08vSUVDIDE1OTQ4OjIwMDQgKEUpKSBhdAotPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KLVRoZSBXM0MgYW5kIElTTyBkb2N1bWVudHMgaGF2ZSBpZGVudGljYWwgdGVjaG5pY2FsIGNvbnRlbnQuCi0KLVRoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlIGF0Ci08aHR0cDovL3BuZy1tbmcuc291cmNlZm9yZ2UubmV0L3B1Yi9wbmcvc3BlYy8xLjIvPi4KLUl0IGlzIHRlY2huaWNhbGx5IGVxdWl2YWxlbnQKLXRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pIGJ1dCBoYXMgc29tZSBhZGRpdGlvbmFsIG1hdGVyaWFsLgotCi1UaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSBhcyBSRkMgMjA4MyAKLTxodHRwOi8vcG5nLW1uZy5zb3VyY2Vmb3JnZS5uZXQvcHViL3BuZy9zcGVjLzEuMC8+IGFuZCBhcyBhCi1XM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmctOTYxMDAxPi4KLQotU29tZSBhZGRpdGlvbmFsIGNodW5rcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzcGVjaWFsLXB1cnBvc2UgcHVibGljIGNodW5rcwotZG9jdW1lbnRzIGF0IDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9zcGVjL3JlZ2lzdGVyLz4KLQotT3RoZXIgaW5mb3JtYXRpb24KLWFib3V0IFBORywgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBsaWJwbmcsIGNhbiBiZSBmb3VuZCBhdCB0aGUgUE5HIGhvbWUKLXBhZ2UsIDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy8+LgotCi1Nb3N0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gbW9kaWZ5IHRoZSBsaWJyYXJ5IHNpZ25pZmljYW50bHk7IGFkdmFuY2VkCi11c2VycyBtYXkgd2FudCB0byBtb2RpZnkgaXQgbW9yZS4gIEFsbCBhdHRlbXB0cyB3ZXJlIG1hZGUgdG8gbWFrZSBpdCBhcwotY29tcGxldGUgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgdGhlIGNvZGUgZWFzeSB0byB1bmRlcnN0YW5kLgotQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBDLiAgU3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCi1pcyBiZWluZyBjb25zaWRlcmVkLgotCi1MaWJwbmcgaGFzIGJlZW4gZGVzaWduZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlc3Npb25zIGF0IG9uZSB0aW1lLAotdG8gYmUgZWFzaWx5IG1vZGlmaWFibGUsIHRvIGJlIHBvcnRhYmxlIHRvIHRoZSB2YXN0IG1ham9yaXR5IG9mCi1tYWNoaW5lcyAoQU5TSSwgSyZSLCAxNi0sIDMyLSwgYW5kIDY0LWJpdCkgYXZhaWxhYmxlLCBhbmQgdG8gYmUgZWFzeQotdG8gdXNlLiAgVGhlIHVsdGltYXRlIGdvYWwgb2YgbGlicG5nIGlzIHRvIHByb21vdGUgdGhlIGFjY2VwdGFuY2Ugb2YKLXRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gd2hhdGV2ZXIgd2F5IHBvc3NpYmxlLiAgV2hpbGUgdGhlcmUgaXMgc3RpbGwKLXdvcmsgdG8gYmUgZG9uZSAoc2VlIHRoZSBUT0RPIGZpbGUpLCBsaWJwbmcgc2hvdWxkIGNvdmVyIHRoZQotbWFqb3JpdHkgb2YgdGhlIG5lZWRzIG9mIGl0cyB1c2Vycy4KLQotTGlicG5nIHVzZXMgemxpYiBmb3IgaXRzIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9mIFBORyBmaWxlcy4KLUZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgemxpYiwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliLCBjYW4KLWJlIGZvdW5kIGF0IHRoZSB6bGliIGhvbWUgcGFnZSwgPGh0dHA6Ly96bGliLm5ldC8+LgotVGhlIHpsaWIgY29tcHJlc3Npb24gdXRpbGl0eSBpcyBhIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IHRoYXQgaXMKLXVzZWZ1bCBmb3IgbW9yZSB0aGFuIFBORyBmaWxlcywgYW5kIGNhbiBiZSB1c2VkIHdpdGhvdXQgbGlicG5nLgotU2VlIHRoZSBkb2N1bWVudGF0aW9uIGRlbGl2ZXJlZCB3aXRoIHpsaWIgZm9yIG1vcmUgZGV0YWlscy4KLVlvdSBjYW4gdXN1YWxseSBmaW5kIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSB6bGliIHV0aWxpdHkgd2hlcmV2ZXIgeW91Ci1maW5kIHRoZSBsaWJwbmcgc291cmNlIGZpbGVzLgotCi1MaWJwbmcgaXMgdGhyZWFkIHNhZmUsIHByb3ZpZGVkIHRoZSB0aHJlYWRzIGFyZSB1c2luZyBkaWZmZXJlbnQKLWluc3RhbmNlcyBvZiB0aGUgc3RydWN0dXJlcy4gIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24KLXBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIGluc3RhbmNlcywgYW5kIHRodXMgaXRzIG93biBpbWFnZS4KLUxpYnBuZyBkb2VzIG5vdCBwcm90ZWN0IGl0c2VsZiBhZ2FpbnN0IHR3byB0aHJlYWRzIHVzaW5nIHRoZQotc2FtZSBpbnN0YW5jZSBvZiBhIHN0cnVjdHVyZS4KLQotSUkuIFN0cnVjdHVyZXMKLQotVGhlcmUgYXJlIHR3byBtYWluIHN0cnVjdHVyZXMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIGxpYnBuZywgcG5nX3N0cnVjdAotYW5kIHBuZ19pbmZvLiAgQm90aCBhcmUgaW50ZXJuYWwgc3RydWN0dXJlcyB0aGF0IGFyZSBubyBsb25nZXIgZXhwb3NlZAotaW4gdGhlIGxpYnBuZyBpbnRlcmZhY2UgKGFzIG9mIGxpYnBuZyAxLjUuMCkuCi0KLVRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLVBORyBmaWxlLiAgQXQgb25lIHRpbWUsIHRoZSBmaWVsZHMgb2YgcG5nX2luZm8gd2VyZSBpbnRlbmRlZCB0byBiZQotZGlyZWN0bHkgYWNjZXNzaWJsZSB0byB0aGUgdXNlci4gIEhvd2V2ZXIsIHRoaXMgdGVuZGVkIHRvIGNhdXNlIHByb2JsZW1zCi13aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBkeW5hbWljYWxseSBsb2FkZWQgbGlicmFyaWVzLCBhbmQgYXMgYSByZXN1bHQKLWEgc2V0IG9mIGludGVyZmFjZSBmdW5jdGlvbnMgZm9yIHBuZ19pbmZvICh0aGUgcG5nX2dldF8qKCkgYW5kIHBuZ19zZXRfKigpCi1mdW5jdGlvbnMpIHdhcyBkZXZlbG9wZWQsIGFuZCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBwbmdfaW5mbyBmaWVsZHMgd2FzCi1kZXByZWNhdGVkLi4KLQotVGhlIHBuZ19zdHJ1Y3Qgc3RydWN0dXJlIGlzIHRoZSBvYmplY3QgdXNlZCBieSB0aGUgbGlicmFyeSB0byBkZWNvZGUgYQotc2luZ2xlIGltYWdlLiAgQXMgb2YgMS41LjAgdGhpcyBzdHJ1Y3R1cmUgaXMgYWxzbyBub3QgZXhwb3NlZC4KLQotQWxtb3N0IGFsbCBsaWJwbmcgQVBJcyByZXF1aXJlIGEgcG9pbnRlciB0byBhIHBuZ19zdHJ1Y3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgotTWFueSAoaW4gcGFydGljdWxhciB0aGUgcG5nX3NldCBhbmQgcG5nX2dldCBBUElzKSBhbHNvIHJlcXVpcmUgYSBwb2ludGVyCi10byBwbmdfaW5mbyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiAgU29tZSBhcHBsaWNhdGlvbiB2aXNpYmxlIG1hY3JvcwotZGVmaW5lZCBpbiBwbmcuaCBkZXNpZ25lZCBmb3IgYmFzaWMgZGF0YSBhY2Nlc3MgKHJlYWRpbmcgYW5kIHdyaXRpbmcKLWludGVnZXJzIGluIHRoZSBQTkcgZm9ybWF0KSBkb24ndCB0YWtlIGEgcG5nX2luZm8gcG9pbnRlciwgYnV0IGl0J3MgYWxtb3N0Ci1hbHdheXMgc2FmZSB0byBhc3N1bWUgdGhhdCBhIChwbmdfc3RydWN0KikgaGFzIHRvIGJlIHBhc3NlZCB0byBjYWxsIGFuIEFQSQotZnVuY3Rpb24uCi0KLVlvdSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHBuZ19pbmZvIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggYW4gaW1hZ2UsCi1hcyBpbGx1c3RyYXRlZCBpbiBwbmd0ZXN0LmMsIG9uZSBmb3IgaW5mb3JtYXRpb24gdmFsaWQgcHJpb3IgdG8gdGhlCi1JREFUIGNodW5rcyBhbmQgYW5vdGhlciAoY2FsbGVkICJlbmRfaW5mbyIgYmVsb3cpIGZvciB0aGluZ3MgYWZ0ZXIgdGhlbS4KLQotVGhlIHBuZy5oIGhlYWRlciBmaWxlIGlzIGFuIGludmFsdWFibGUgcmVmZXJlbmNlIGZvciBwcm9ncmFtbWluZyB3aXRoIGxpYnBuZy4KLUFuZCB3aGlsZSBJJ20gb24gdGhlIHRvcGljLCBtYWtlIHN1cmUgeW91IGluY2x1ZGUgdGhlIGxpYnBuZyBoZWFkZXIgZmlsZToKLQotI2luY2x1ZGUgPHBuZy5oPgotCi1hbmQgYWxzbyAoYXMgb2YgbGlicG5nLTEuNS4wKSB0aGUgemxpYiBoZWFkZXIgZmlsZSwgaWYgeW91IG5lZWQgaXQ6Ci0KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLVR5cGVzCi0KLVRoZSBwbmcuaCBoZWFkZXIgZmlsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGludGVncmFsIHR5cGVzIHVzZWQgYnkgdGhlCi1BUElzLiAgTW9zdCBvZiB0aGVzZSBhcmUgZmFpcmx5IG9idmlvdXM7IGZvciBleGFtcGxlIHR5cGVzIGNvcnJlc3BvbmRpbmcKLXRvIGludGVnZXJzIG9mIHBhcnRpY3VsYXIgc2l6ZXMgYW5kIHR5cGVzIGZvciBwYXNzaW5nIGNvbG9yIHZhbHVlcy4KLQotT25lIGV4Y2VwdGlvbiBpcyBob3cgbm9uLWludGVncmFsIG51bWJlcnMgYXJlIGhhbmRsZWQuICBGb3IgYXBwbGljYXRpb24KLWNvbnZlbmllbmNlIG1vc3QgQVBJcyB0aGF0IHRha2Ugc3VjaCBudW1iZXJzIGhhdmUgQyAoZG91YmxlKSBhcmd1bWVudHM7Ci1ob3dldmVyLCBpbnRlcm5hbGx5IFBORywgYW5kIGxpYnBuZywgdXNlIDMyIGJpdCBzaWduZWQgaW50ZWdlcnMgYW5kIGVuY29kZQotdGhlIHZhbHVlIGJ5IG11bHRpcGx5aW5nIGJ5IDEwMCwwMDAuICBBcyBvZiBsaWJwbmcgMS41LjAgYSBjb252ZW5pZW5jZQotbWFjcm8gUE5HX0ZQXzEgaXMgZGVmaW5lZCBpbiBwbmcuaCBhbG9uZyB3aXRoIGEgdHlwZSAocG5nX2ZpeGVkX3BvaW50KQotd2hpY2ggaXMgc2ltcGx5IChwbmdfaW50XzMyKS4KLQotQWxsIEFQSXMgdGhhdCB0YWtlIChkb3VibGUpIGFyZ3VtZW50cyBhbHNvIGhhdmUgYSBtYXRjaGluZyBBUEkgdGhhdAotdGFrZXMgdGhlIGNvcnJlc3BvbmRpbmcgZml4ZWQgcG9pbnQgaW50ZWdlciBhcmd1bWVudHMuICBUaGUgZml4ZWQgcG9pbnQKLUFQSSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZmxvYXRpbmcgcG9pbnQgb25lIHdpdGggIl9maXhlZCIgYXBwZW5kZWQuCi1UaGUgYWN0dWFsIHJhbmdlIG9mIHZhbHVlcyBwZXJtaXR0ZWQgaW4gdGhlIEFQSXMgaXMgZnJlcXVlbnRseSBsZXNzIHRoYW4KLXRoZSBmdWxsIHJhbmdlIG9mIChwbmdfZml4ZWRfcG9pbnQpICgtMjE0NzQgdG8gKzIxNDc0KS4gIFdoZW4gQVBJcyByZXF1aXJlCi1hIG5vbi1uZWdhdGl2ZSBhcmd1bWVudCB0aGUgdHlwZSBpcyByZWNvcmRlZCBhcyBwbmdfdWludF8zMiBhYm92ZS4gIENvbnN1bHQKLXRoZSBoZWFkZXIgZmlsZSBhbmQgdGhlIHRleHQgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVNwZWNpYWwgY2FyZSBtdXN0IGJlIHRha2Ugd2l0aCBzQ0FMIGNodW5rIGhhbmRsaW5nIGJlY2F1c2UgdGhlIGNodW5rIGl0c2VsZgotdXNlcyBub24taW50ZWdyYWwgdmFsdWVzIGVuY29kZWQgYXMgc3RyaW5ncyBjb250YWluaW5nIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQKLW51bWJlcnMuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBoZWFkZXIgZmlsZS4KLQotQ29uZmlndXJhdGlvbgotCi1UaGUgbWFpbiBoZWFkZXIgZmlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYXJlIGZyZXF1ZW50bHkgcHJvdGVjdGVkIGJ5IEMKLXByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcyBvZiB0aGUgZm9ybToKLQotICAgICNpZmRlZiBQTkdfZmVhdHVyZV9TVVBQT1JURUQKLSAgICBkZWNsYXJlLWZ1bmN0aW9uCi0gICAgI2VuZGlmCi0gICAgLi4uCi0gICAgI2lmZGVmIFBOR19mZWF0dXJlX1NVUFBPUlRFRAotICAgIHVzZS1mdW5jdGlvbgotICAgICNlbmRpZgotCi1UaGUgbGlicmFyeSBjYW4gYmUgYnVpbHQgd2l0aG91dCBzdXBwb3J0IGZvciB0aGVzZSBBUElzLCBhbHRob3VnaCBhCi1zdGFuZGFyZCBidWlsZCB3aWxsIGhhdmUgYWxsIGltcGxlbWVudGVkIEFQSXMuICBBcHBsaWNhdGlvbiBwcm9ncmFtcwotc2hvdWxkIGNoZWNrIHRoZSBmZWF0dXJlIG1hY3JvcyBiZWZvcmUgdXNpbmcgYW4gQVBJIGZvciBtYXhpbXVtCi1wb3J0YWJpbGl0eS4gIEZyb20gbGlicG5nIDEuNS4wIHRoZSBmZWF0dXJlIG1hY3JvcyBzZXQgZHVyaW5nIHRoZSBidWlsZAotb2YgbGlicG5nIGFyZSByZWNvcmRlZCBpbiB0aGUgaGVhZGVyIGZpbGUgInBuZ2xpYmNvbmYuaCIgYW5kIHRoaXMgZmlsZQotaXMgYWx3YXlzIGluY2x1ZGVkIGJ5IHBuZy5oLgotCi1JZiB5b3UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkZWZhdWx0LCBza2lwIHRvCi10aGUgbmV4dCBzZWN0aW9uICgiUmVhZGluZyIpLgotCi1Ob3RpY2UgdGhhdCBzb21lIG9mIHRoZSBtYWtlZmlsZXMgaW4gdGhlICdzY3JpcHRzJyBkaXJlY3RvcnkgYW5kIChpbiAxLjUuMCkgYWxsCi1vZiB0aGUgYnVpbGQgcHJvamVjdCBmaWxlcyBpbiB0aGUgJ3Byb2plY3RzJyBkaXJlY3Rvcnkgc2ltcGx5IGNvcHkKLXNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0IHRvIHBuZ2xpYmNvbmYuaC4gIFRoaXMgbWVhbnMgdGhhdCB0aGVzZSBidWlsZAotc3lzdGVtcyBkbyBub3QgcGVybWl0IGVhc3kgYXV0by1jb25maWd1cmF0aW9uIG9mIHRoZSBsaWJyYXJ5IC0gdGhleSBvbmx5Ci1zdXBwb3J0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCi0KLVRoZSBlYXNpZXN0IHdheSB0byBtYWtlIG1pbm9yIGNoYW5nZXMgdG8gdGhlIGxpYnBuZyBjb25maWd1cmF0aW9uIHdoZW4KLWF1dG8tY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQgaXMgdG8gYWRkIGRlZmluaXRpb25zIHRvIHRoZSBjb21tYW5kIGxpbmUKLXVzaW5nICh0eXBpY2FsbHkpIENQUEZMQUdTLiAgRm9yIGV4YW1wbGU6Ci0KLUNQUEZMQUdTPS1EUE5HX05PX0ZMT0FUSU5HX0FSSVRITUVUSUMKLQotd2lsbCBjaGFuZ2UgdGhlIGludGVybmFsIGxpYnBuZyBtYXRoIGltcGxlbWVudGF0aW9uIGZvciBnYW1tYSBjb3JyZWN0aW9uIGFuZAotb3RoZXIgYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMgdG8gZml4ZWQgcG9pbnQsIGF2b2lkaW5nIHRoZSBuZWVkIGZvciBmYXN0Ci1mbG9hdGluZyBwb2ludCBzdXBwb3J0LiAgVGhlIHJlc3VsdCBjYW4gYmUgc2VlbiBpbiB0aGUgZ2VuZXJhdGVkIHBuZ2xpYmNvbmYuaCAtCi1tYWtlIHN1cmUgaXQgY29udGFpbnMgdGhlIGNoYW5nZWQgZmVhdHVyZSBtYWNybyBzZXR0aW5nLgotCi1JZiB5b3UgbmVlZCB0byBtYWtlIG1vcmUgZXh0ZW5zaXZlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAtIG1vcmUgdGhhbiBvbmUgb3IgdHdvCi1mZWF0dXJlIG1hY3JvIHNldHRpbmdzIC0geW91IGNhbiBlaXRoZXIgYWRkIC1EUE5HX1VTRVJfQ09ORklHIHRvIHRoZSBidWlsZAotY29tbWFuZCBsaW5lIGFuZCBwdXQgYSBsaXN0IG9mIGZlYXR1cmUgbWFjcm8gc2V0dGluZ3MgaW4gcG5ndXNyLmggb3IgeW91IGNhbiBzZXQKLURGQV9YVFJBIChhIG1ha2VmaWxlIHZhcmlhYmxlKSB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpbiB0aGUKLWZvcm0gb2YgJ29wdGlvbicgc2V0dGluZ3MuCi0KLUEuIENoYW5naW5nIHBuZ2xpYmNvbmYuaAotCi1BIHZhcmlldHkgb2YgbWV0aG9kcyBleGlzdCB0byBidWlsZCBsaWJwbmcuICBOb3QgYWxsIG9mIHRoZXNlIHN1cHBvcnQKLXJlY29uZmlndXJhdGlvbiBvZiBwbmdsaWJjb25mLmguICBUbyByZWNvbmZpZ3VyZSBwbmdsaWJjb25mLmggaXQgbXVzdCBlaXRoZXIgYmUKLXJlYnVpbHQgZnJvbSBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHVzaW5nIGF3ayBvciBpdCBtdXN0IGJlIGVkaXRlZCBieSBoYW5kLgotCi1IYW5kIGVkaXRpbmcgaXMgYWNoaWV2ZWQgYnkgY29weWluZyBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCB0bwotcG5nbGliY29uZi5oIGFuZCBjaGFuZ2luZyB0aGUgbGluZXMgZGVmaW5pbmcgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcywgcGF5aW5nCi12ZXJ5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgJ29wdGlvbicgaW5mb3JtYXRpb24gaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYQotdGhhdCBkZXNjcmliZXMgdGhvc2UgZmVhdHVyZXMgYW5kIHRoZWlyIHJlcXVpcmVtZW50cy4gIFRoaXMgaXMgZWFzeSB0byBnZXQKLXdyb25nLgotCi1CLiBDb25maWd1cmF0aW9uIHVzaW5nIERGQV9YVFJBCi0KLVJlYnVpbGRpbmcgZnJvbSBwbmdsaWJjb25mLmRmYSBpcyBlYXN5IGlmIGEgZnVuY3Rpb25pbmcgJ2F3aycsIG9yIGEgbGF0ZXIKLXZhcmlhbnQgc3VjaCBhcyAnbmF3aycgb3IgJ2dhd2snLCBpcyBhdmFpbGFibGUuICBUaGUgY29uZmlndXJlIGJ1aWxkIHdpbGwKLWF1dG9tYXRpY2FsbHkgZmluZCBhbiBhcHByb3ByaWF0ZSBhd2sgYW5kIGJ1aWxkIHBuZ2xpYmNvbmYuaC4KLVRoZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZpbGUgY29udGFpbnMgYSBzZXQgb2YgbWFrZSBydWxlcyBmb3IgZG9pbmcgdGhlCi1zYW1lIHRoaW5nIGlmIGNvbmZpZ3VyZSBpcyBub3QgdXNlZCwgYW5kIG1hbnkgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc2NyaXB0cwotZGlyZWN0b3J5IHVzZSB0aGlzIGFwcHJvYWNoLgotCi1XaGVuIHJlYnVpbGRpbmcgc2ltcGx5IHdyaXRlIGEgbmV3IGZpbGUgY29udGFpbmluZyBjaGFuZ2VkIG9wdGlvbnMgYW5kIHNldAotREZBX1hUUkEgdG8gdGhlIG5hbWUgb2YgdGhpcyBmaWxlLiAgVGhpcyBjYXVzZXMgdGhlIGJ1aWxkIHRvIGFwcGVuZCB0aGUgbmV3IGZpbGUKLXRvIHRoZSBlbmQgb2Ygc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gIFRoZSBwbmd1c3IuZGZhIGZpbGUgc2hvdWxkIGNvbnRhaW4gbGluZXMKLW9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0KLWV2ZXJ5dGhpbmcgPSBvZmYKLQotVGhpcyB0dXJucyBhbGwgb3B0aW9uYWwgZmVhdHVyZXMgb2ZmLiAgSW5jbHVkZSBpdCBhdCB0aGUgc3RhcnQgb2YgcG5ndXNyLmRmYSB0bwotbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgYSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24uICBZb3Ugd2lsbCBuZWVkIHRvIHR1cm4gYXQgbGVhc3QKLXNvbWUgZmVhdHVyZXMgb24gYWZ0ZXJ3YXJkIHRvIGVuYWJsZSBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nIGNvZGUsIG9yIGJvdGguCi0KLW9wdGlvbiBmZWF0dXJlIG9uCi1vcHRpb24gZmVhdHVyZSBvZmYKLQotRW5hYmxlIG9yIGRpc2FibGUgYSBzaW5nbGUgZmVhdHVyZS4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSBvdGhlcgotZmVhdHVyZXMgcmVxdWlyZWQgYnkgYSBmZWF0dXJlIHRoYXQgaXMgdHVybmVkIG9uIG9yIGRpc2FibGUgb3RoZXIgZmVhdHVyZXMgdGhhdAotcmVxdWlyZSBhIGZlYXR1cmUgd2hpY2ggaXMgdHVybmVkIG9mZi4gIENvbmZsaWN0aW5nIHNldHRpbmdzIHdpbGwgY2F1c2UgYW4gZXJyb3IKLW1lc3NhZ2UgdG8gYmUgZW1pdHRlZCBieSBhd2suCi0KLXNldHRpbmcgZmVhdHVyZSBkZWZhdWx0IHZhbHVlCi0KLUNoYW5nZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2V0dGluZyAnZmVhdHVyZScgdG8gJ3ZhbHVlJy4gIFRoZXJlIGFyZSBhIHNtYWxsCi1udW1iZXIgb2Ygc2V0dGluZ3MgbGlzdGVkIGF0IHRoZSB0b3Agb2YgcG5nbGliY29uZi5oLCB0aGV5IGFyZSBkb2N1bWVudGVkIGluIHRoZQotc291cmNlIGNvZGUuICBNb3N0IG9mIHRoZXNlIHZhbHVlcyBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBmb3IgdGhlIGxpYnJhcnkKLWJ1dCBtb3N0IG9mIHRoZW0gaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBvbiB0aGUgQVBJLiAgU29tZSBjYW4gYWxzbyBiZSBvdmVycmlkZGVuCi1mcm9tIHRoZSBBUEkuCi0KLVRoaXMgbWV0aG9kIG9mIGJ1aWxkaW5nIGEgY3VzdG9taXplZCBwbmdsaWJjb25mLmggaXMgaWxsdXN0cmF0ZWQgaW4KLWNvbnRyaWIvcG5nbWluaW0vKi4gIFNlZSB0aGUgIiQoUE5HQ09ORik6IiB0YXJnZXQgaW4gdGhlIG1ha2VmaWxlIGFuZAotcG5ndXNyLmRmYSBpbiB0aGVzZSBkaXJlY3Rvcmllcy4KLQotQy4gQ29uZmlndXJhdGlvbiB1c2luZyBQTkdfVVNFUl9DT05GSUcKLQotSWYgLURQTkdfVVNFUl9DT05GSUcgaXMgYWRkZWQgdG8gdGhlIENQUEZMQUdTIHdoZW4gcG5nbGliY29uZi5oIGlzIGJ1aWx0LAotdGhlIGZpbGUgcG5ndXNyLmggd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGUgb3B0aW9ucyBpbgotc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBhcmUgcHJvY2Vzc2VkLiAgWW91ciBwbmd1c3IuaCBmaWxlIHNob3VsZCBjb250YWluIG9ubHkKLW1hY3JvIGRlZmluaXRpb25zIHR1cm5pbmcgZmVhdHVyZXMgb24gb3Igb2ZmIG9yIHNldHRpbmcgc2V0dGluZ3MuCi0KLUFwYXJ0IGZyb20gdGhlIGdsb2JhbCBzZXR0aW5nICJldmVyeXRoaW5nID0gb2ZmIiBhbGwgdGhlIG9wdGlvbnMgbGlzdGVkIGFib3ZlCi1jYW4gYmUgc2V0IHVzaW5nIG1hY3JvcyBpbiBwbmd1c3IuaDoKLQotI2RlZmluZSBQTkdfZmVhdHVyZV9TVVBQT1JURUQKLQotaXMgZXF1aXZhbGVudCB0bzoKLQotb3B0aW9uIGZlYXR1cmUgb24KLQotI2RlZmluZSBQTkdfTk9fZmVhdHVyZQotCi1pcyBlcXVpdmFsZW50IHRvOgotCi1vcHRpb24gZmVhdHVyZSBvZmYKLQotI2RlZmluZSBQTkdfZmVhdHVyZSB2YWx1ZQotCi1pcyBlcXVpdmFsZW50IHRvOgotCi1zZXR0aW5nIGZlYXR1cmUgZGVmYXVsdCB2YWx1ZQotCi1Ob3RpY2UgdGhhdCBpbiBib3RoIGNhc2VzLCBwbmd1c3IuZGZhIGFuZCBwbmd1c3IuaCwgdGhlIGNvbnRlbnRzIG9mIHRoZQotcG5ndXNyIGZpbGUgeW91IHN1cHBseSBvdmVycmlkZSB0aGUgY29udGVudHMgb2Ygc2NyaXB0cy9wbmdsaWJjb25mLmRmYQotCi1JZiBjb25mdXNpbmcgb3IgaW5jb21wcmVoZW5zaWJsZSBiZWhhdmlvciByZXN1bHRzIGl0IGlzIHBvc3NpYmxlIHRvCi1leGFtaW5lIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBwbmdsaWJjb25mLmRmbiB0byBmaW5kIHRoZSBmdWxsIHNldCBvZgotZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzZXR0aW5nIGFuZCBvcHRpb24uICBTaW1wbHkgbG9jYXRlIHRoZQotZmVhdHVyZSBpbiB0aGUgZmlsZSBhbmQgcmVhZCB0aGUgQyBjb21tZW50cyB0aGF0IHByZWNlZGUgaXQuCi0KLVRoaXMgbWV0aG9kIGlzIGFsc28gaWxsdXN0cmF0ZWQgaW4gdGhlIGNvbnRyaWIvcG5nbWluaW0vKiBtYWtlZmlsZXMgYW5kCi1wbmd1c3IuaC4KLQotSUlJLiBSZWFkaW5nCi0KLVdlJ2xsIG5vdyB3YWxrIHlvdSB0aHJvdWdoIHRoZSBwb3NzaWJsZSBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIHJlYWRpbmcKLWluIGEgUE5HIGZpbGUgc2VxdWVudGlhbGx5LCBicmllZmx5IGV4cGxhaW5pbmcgdGhlIHN5bnRheCBhbmQgcHVycG9zZQotb2YgZWFjaCBvbmUuICBTZWUgZXhhbXBsZS5jIGFuZCBwbmcuaCBmb3IgbW9yZSBkZXRhaWwuICBXaGlsZQotcHJvZ3Jlc3NpdmUgcmVhZGluZyBpcyBjb3ZlcmVkIGluIHRoZSBuZXh0IHNlY3Rpb24sIHlvdSB3aWxsIHN0aWxsCi1uZWVkIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBkaXNjdXNzZWQgaW4gdGhpcyBzZWN0aW9uIHRvIHJlYWQgYSBQTkcKLWZpbGUuCi0KLVNldHVwCi0KLVlvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbigqKSBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKLXNvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgbXVjaCB0byB1bmRvLiAgT2YgY291cnNlLCB5b3UKLXdpbGwgYWxzbyB3YW50IHRvIGluc3VyZSB0aGF0IHlvdSBhcmUsIGluIGZhY3QsIGRlYWxpbmcgd2l0aCBhIFBORwotZmlsZS4gIExpYnBuZyBwcm92aWRlcyBhIHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYSBmaWxlIGlzIGEgUE5HIGZpbGUuCi1UbyB1c2UgaXQsIHBhc3MgaW4gdGhlIGZpcnN0IDEgdG8gOCBieXRlcyBvZiB0aGUgZmlsZSB0byB0aGUgZnVuY3Rpb24KLXBuZ19zaWdfY21wKCksIGFuZCBpdCB3aWxsIHJldHVybiAwIChmYWxzZSkgaWYgdGhlIGJ5dGVzIG1hdGNoIHRoZQotY29ycmVzcG9uZGluZyBieXRlcyBvZiB0aGUgUE5HIHNpZ25hdHVyZSwgb3Igbm9uemVybyAodHJ1ZSkgb3RoZXJ3aXNlLgotT2YgY291cnNlLCB0aGUgbW9yZSBieXRlcyB5b3UgcGFzcyBpbiwgdGhlIGdyZWF0ZXIgdGhlIGFjY3VyYWN5IG9mIHRoZQotcHJlZGljdGlvbi4KLQotSWYgeW91IGFyZSBpbnRlbmRpbmcgdG8ga2VlcCB0aGUgZmlsZSBwb2ludGVyIG9wZW4gZm9yIHVzZSBpbiBsaWJwbmcsCi15b3UgbXVzdCBlbnN1cmUgeW91IGRvbid0IHJlYWQgbW9yZSB0aGFuIDggYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nCi1vZiB0aGUgZmlsZSwgYW5kIHlvdSBhbHNvIGhhdmUgdG8gbWFrZSBhIGNhbGwgdG8gcG5nX3NldF9zaWdfYnl0ZXMoKQotd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSByZWFkIGZyb20gdGhlIGJlZ2lubmluZy4gIExpYnBuZyB3aWxsCi10aGVuIG9ubHkgY2hlY2sgdGhlIGJ5dGVzIChpZiBhbnkpIHRoYXQgeW91ciBwcm9ncmFtIGRpZG4ndCByZWFkLgotCi0oKik6IElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkCi10byByZXBsYWNlIHRoZW0gd2l0aCBjdXN0b20gZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyCi1DdXN0b21pemluZyBsaWJwbmcuCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7Ci0gICAgaWYgKCFmcCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKGZyZWFkKGhlYWRlciwgMSwgbnVtYmVyLCBmcCkgIT0gbnVtYmVyKQotICAgIHsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBpc19wbmcgPSAhcG5nX3NpZ19jbXAoaGVhZGVyLCAwLCBudW1iZXIpOwotICAgIGlmICghaXNfcG5nKQotICAgIHsKLSAgICAgICByZXR1cm4gKE5PVF9QTkcpOwotICAgIH0KLQotTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLiAgSW4KLW9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgY29ycmVjdCBldmVuIHdpdGggYQotZHluYW1pY2FsbHkgbGlua2VkIGxpYnBuZywgdGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZAotYWxsb2NhdGUgdGhlIHN0cnVjdHVyZXMuICBXZSBhbHNvIHBhc3MgdGhlIGxpYnJhcnkgdmVyc2lvbiwgb3B0aW9uYWwKLXBvaW50ZXJzIHRvIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucywgYW5kIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0IGZvcgotdXNlIGJ5IHRoZSBlcnJvciBmdW5jdGlvbnMsIGlmIG5lY2Vzc2FyeSAodGhlIHBvaW50ZXIgYW5kIGZ1bmN0aW9ucyBjYW4KLWJlIE5VTEwgaWYgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcnMgYXJlIHRvIGJlIHVzZWQpLiAgU2VlIHRoZSBzZWN0aW9uCi1vbiBDaGFuZ2VzIHRvIExpYnBuZyBiZWxvdyByZWdhcmRpbmcgdGhlIG9sZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCi1UaGUgc3RydWN0dXJlIGFsbG9jYXRpb24gZnVuY3Rpb25zIHF1aWV0bHkgcmV0dXJuIE5VTEwgaWYgdGhleSBmYWlsIHRvCi1jcmVhdGUgdGhlIHN0cnVjdHVyZSwgc28geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgY2hlY2sgZm9yIHRoYXQuCi0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAotICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOwotCi0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLQotICAgIGlmICghaW5mb19wdHIpCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLXVzZSBhIGxpYnBuZyB0aGF0IHdhcyBidWlsdCB3aXRoIFBOR19VU0VSX01FTV9TVVBQT1JURUQgZGVmaW5lZCwgYW5kIHVzZQotcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCk6Ci0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yCi0gICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotVGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkKLWFuZCB0aGUgbWVtb3J5IGFsbG9jL2ZyZWUgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfc3RydWN0XzIoKQotYXJlIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBsaWJwbmcgc3VwcGxpZWQgZXJyb3IKLWhhbmRsaW5nIGFuZCBtZW1vcnkgYWxsb2MvZnJlZSBmdW5jdGlvbnMuCi0KLVdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8gbG9uZ2ptcCBiYWNrCi10byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBzZXRqbXAgYW5kIHBhc3MKLXlvdXIgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdSByZWFkIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50Ci1yb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGxvbmdqbXAgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IGVudGVyCi1hIG5ldyByb3V0aW5lIHRoYXQgd2lsbCBjYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4KLQotU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcCBmb3IgeW91ciBjb21waWxlciBmb3IgbW9yZQotaW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yCi1oYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuZCBsaWJwbmcgbG9uZ2ptcCdzCi1iYWNrIHRvIHlvdXIgc2V0am1wLCB5b3Ugd2lsbCB3YW50IHRvIGNhbGwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSB0bwotZnJlZSBhbnkgbWVtb3J5LgotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAgICAgJmVuZF9pbmZvKTsKLSAgICAgICBmY2xvc2UoZnApOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotUGFzcyAocG5nX2luZm9wcClOVUxMIGluc3RlYWQgb2YgJmVuZF9pbmZvIGlmIHlvdSBkaWRuJ3QgY3JlYXRlCi1hbiBlbmRfaW5mbyBzdHJ1Y3R1cmUuCi0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAsIGluIHdoaWNoIGNhc2UKLWVycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KLQotWW91IGNhbiAjZGVmaW5lIFBOR19BQk9SVCgpIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZwotbW9yZSB1c2VmdWwgdGhhbiBhYm9ydCgpLCBhcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QKLXJldHVybi4KLQotTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgaW5wdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KLXVzZSB0aGUgQyBmdW5jdGlvbiBmcmVhZCgpLiAgSWYgeW91IHVzZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgYQotdmFsaWQgRklMRSAqIGluIHRoZSBmdW5jdGlvbiBwbmdfaW5pdF9pbygpLiAgQmUgc3VyZSB0aGF0IHRoZSBmaWxlIGlzCi1vcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBJZiB5b3Ugd2lzaCB0byBoYW5kbGUgcmVhZGluZyBkYXRhIGluIGFub3RoZXIKLXdheSwgeW91IG5lZWQgbm90IGNhbGwgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24sIGJ1dCB5b3UgbXVzdCB0aGVuCi1pbXBsZW1lbnQgdGhlIGxpYnBuZyBJL08gbWV0aG9kcyBkaXNjdXNzZWQgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZwotc2VjdGlvbiBiZWxvdy4KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKLQotSWYgeW91IGhhZCBwcmV2aW91c2x5IG9wZW5lZCB0aGUgZmlsZSBhbmQgcmVhZCBhbnkgb2YgdGhlIHNpZ25hdHVyZSBmcm9tCi10aGUgYmVnaW5uaW5nIGluIG9yZGVyIHRvIHNlZSBpZiB0aGlzIHdhcyBhIFBORyBmaWxlLCB5b3UgbmVlZCB0byBsZXQKLWxpYnBuZyBrbm93IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnl0ZXMgbWlzc2luZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLQotICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIG51bWJlcik7Ci0KLVlvdSBjYW4gY2hhbmdlIHRoZSB6bGliIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQgd2hpbGUKLXJlYWRpbmcgY29tcHJlc3NlZCBkYXRhIHdpdGgKLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgYnVmZmVyX3NpemUpOwotCi13aGVyZSB0aGUgZGVmYXVsdCBzaXplIGlzIDgxOTIgYnl0ZXMuICBOb3RlIHRoYXQgdGhlIGJ1ZmZlciBzaXplCi1pcyBjaGFuZ2VkIGltbWVkaWF0ZWx5IGFuZCB0aGUgYnVmZmVyIGlzIHJlYWxsb2NhdGVkIGltbWVkaWF0ZWx5LAotaW5zdGVhZCBvZiBzZXR0aW5nIGEgZmxhZyB0byBiZSBhY3RlZCB1cG9uIGxhdGVyLgotCi1JZiB5b3Ugd2FudCBDUkMgZXJyb3JzIHRvIGJlIGhhbmRsZWQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYW4KLXRoZSBkZWZhdWx0LCB1c2UKLQotICAgIHBuZ19zZXRfY3JjX2FjdGlvbihwbmdfcHRyLCBjcml0X2FjdGlvbiwgYW5jaWxfYWN0aW9uKTsKLQotVGhlIHZhbHVlcyBmb3IgcG5nX3NldF9jcmNfYWN0aW9uKCkgc2F5IGhvdyBsaWJwbmcgaXMgdG8gaGFuZGxlIENSQyBlcnJvcnMgaW4KLWFuY2lsbGFyeSBhbmQgY3JpdGljYWwgY2h1bmtzLCBhbmQgd2hldGhlciB0byB1c2UgdGhlIGRhdGEgY29udGFpbmVkCi10aGVyZWluLiAgTm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gImRpc2NhcmQiIGRhdGEgaW4gYSBjcml0aWNhbAotY2h1bmsuCi0KLUNob2ljZXMgZm9yIChpbnQpIGNyaXRfYWN0aW9uIGFyZQotICAgUE5HX0NSQ19ERUZBVUxUICAgICAgMCAgZXJyb3IvcXVpdAotICAgUE5HX0NSQ19FUlJPUl9RVUlUICAgMSAgZXJyb3IvcXVpdAotICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQotICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKLSAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQotCi1DaG9pY2VzIGZvciAoaW50KSBhbmNpbF9hY3Rpb24gYXJlCi0gICBQTkdfQ1JDX0RFRkFVTFQgICAgICAwICBlcnJvci9xdWl0Ci0gICBQTkdfQ1JDX0VSUk9SX1FVSVQgICAxICBlcnJvci9xdWl0Ci0gICBQTkdfQ1JDX1dBUk5fRElTQ0FSRCAyICB3YXJuL2Rpc2NhcmQgZGF0YQotICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQotICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKLSAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQotCi1TZXR0aW5nIHVwIGNhbGxiYWNrIGNvZGUKLQotWW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgYW55IHVua25vd24gY2h1bmtzIGluIHRoZQotaW5wdXQgc3RyZWFtLiBZb3UgbXVzdCBzdXBwbHkgdGhlIGZ1bmN0aW9uCi0KLSAgICByZWFkX2NodW5rX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgICBwbmdfdW5rbm93bl9jaHVua3AgY2h1bmspOwotICAgIHsKLSAgICAgICAvKiBUaGUgdW5rbm93biBjaHVuayBzdHJ1Y3R1cmUgY29udGFpbnMgeW91cgotICAgICAgICAgIGNodW5rIGRhdGEsIGFsb25nIHdpdGggc2ltaWxhciBkYXRhIGZvciBhbnkgb3RoZXIKLSAgICAgICAgICB1bmtub3duIGNodW5rczogKi8KLQotICAgICAgICAgICBwbmdfYnl0ZSBuYW1lWzVdOwotICAgICAgICAgICBwbmdfYnl0ZSAqZGF0YTsKLSAgICAgICAgICAgcG5nX3NpemVfdCBzaXplOwotCi0gICAgICAgLyogTm90ZSB0aGF0IGxpYnBuZyBoYXMgYWxyZWFkeSB0YWtlbiBjYXJlIG9mCi0gICAgICAgICAgdGhlIENSQyBoYW5kbGluZyAqLwotCi0gICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlLiAgU2VhcmNoIGZvciB5b3VyIGNodW5rIGluIHRoZQotICAgICAgICAgIHVua25vd24gY2h1bmsgc3RydWN0dXJlLCBwcm9jZXNzIGl0LCBhbmQgcmV0dXJuIG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmc6ICovCi0KLSAgICAgICByZXR1cm4gKC1uKTsgLyogY2h1bmsgaGFkIGFuIGVycm9yICovCi0gICAgICAgcmV0dXJuICgwKTsgLyogZGlkIG5vdCByZWNvZ25pemUgKi8KLSAgICAgICByZXR1cm4gKG4pOyAvKiBzdWNjZXNzICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIHlvdXIgZnVuY3Rpb24gYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZgotInJlYWRfY2h1bmtfY2FsbGJhY2siKQotCi1UbyBpbmZvcm0gbGlicG5nIGFib3V0IHlvdXIgZnVuY3Rpb24sIHVzZQotCi0gICAgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4ocG5nX3B0ciwgdXNlcl9jaHVua19wdHIsCi0gICAgICAgIHJlYWRfY2h1bmtfY2FsbGJhY2spOwotCi1UaGlzIG5hbWVzIG5vdCBvbmx5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgYnV0IGFsc28gYSB1c2VyIHBvaW50ZXIgdGhhdAoteW91IGNhbiByZXRyaWV2ZSB3aXRoCi0KLSAgICBwbmdfZ2V0X3VzZXJfY2h1bmtfcHRyKHBuZ19wdHIpOwotCi1JZiB5b3UgY2FsbCB0aGUgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4oKSBmdW5jdGlvbiwgdGhlbiBhbGwgdW5rbm93bgotY2h1bmtzIHdoaWNoIHRoZSBjYWxsYmFjayBkb2VzIG5vdCBoYW5kbGUgd2lsbCBiZSBzYXZlZCB3aGVuIHJlYWQuICBZb3UgY2FuCi1jYXVzZSB0aGVtIHRvIGJlIGRpc2NhcmRlZCBieSByZXR1cm5pbmcgJzEnICgiaGFuZGxlZCIpIGluc3RlYWQgb2YgJzAnLiAgVGhpcwotYmVoYXZpb3Igd2lsbCBjaGFuZ2UgaW4gbGlicG5nIDEuNyBhbmQgdGhlIGRlZmF1bHQgaGFuZGxpbmcgc2V0IGJ5IHRoZQotcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24sIGRlc2NyaWJlZCBiZWxvdywgd2lsbCBiZSB1c2VkIHdoZW4gdGhlCi1jYWxsYmFjayByZXR1cm5zIDAuICBJZiB5b3Ugd2FudCB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgeW91IHNob3VsZCBzZXQgdGhlIGdsb2JhbAotZGVmYXVsdCB0byBQTkdfSEFORExFX0NIVU5LX0lGX1NBRkUgbm93OyB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgY3VycmVudAotdmVyc2lvbnMgb2YgbGlicG5nIGFuZCB3aXRoIDEuNy4gIExpYnBuZyAxLjYgaXNzdWVzIGEgd2FybmluZyBpZiB5b3Uga2VlcCB0aGUKLWRlZmF1bHQsIG9yIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIsIGFuZCB0aGUgY2FsbGJhY2sgcmV0dXJucyAwLgotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQotY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHJlYWQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKLWEgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCi1Zb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgotCi0gICAgdm9pZCByZWFkX3Jvd19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgIHBuZ191aW50XzMyIHJvdywgaW50IHBhc3MpOwotICAgIHsKLSAgICAgIC8qIHB1dCB5b3VyIGNvZGUgaGVyZSAqLwotICAgIH0KLQotKFlvdSBjYW4gZ2l2ZSBpdCBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mICJyZWFkX3Jvd19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuKHBuZ19wdHIsIHJlYWRfcm93X2NhbGxiYWNrKTsKLQotV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGUgcm93IGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVseSBwcm9jZXNzZWQgYW5kCi10aGUgJ3JvdycgYW5kICdwYXNzJyByZWZlciB0byB0aGUgbmV4dCByb3cgdG8gYmUgaGFuZGxlZC4gIEZvciB0aGUKLW5vbi1pbnRlcmxhY2VkIGNhc2UgdGhlIHJvdyB0aGF0IHdhcyBqdXN0IGhhbmRsZWQgaXMgc2ltcGx5IG9uZSBsZXNzIHRoYW4gdGhlCi1wYXNzZWQgaW4gcm93IG51bWJlciwgYW5kIHBhc3Mgd2lsbCBhbHdheXMgYmUgMC4gIEZvciB0aGUgaW50ZXJsYWNlZCBjYXNlIHRoZQotc2FtZSBhcHBsaWVzIHVubGVzcyB0aGUgcm93IHZhbHVlIGlzIDAsIGluIHdoaWNoIGNhc2UgdGhlIHJvdyBqdXN0IGhhbmRsZWQgd2FzCi10aGUgbGFzdCBvbmUgZnJvbSBvbmUgb2YgdGhlIHByZWNlZGluZyBwYXNzZXMuICBCZWNhdXNlIGludGVybGFjaW5nIG1heSBza2lwIGEKLXBhc3MgeW91IGNhbm5vdCBiZSBzdXJlIHRoYXQgdGhlIHByZWNlZGluZyBwYXNzIGlzIGp1c3QgJ3Bhc3MtMSc7IGlmIHlvdSByZWFsbHkKLW5lZWQgdG8ga25vdyB3aGF0IHRoZSBsYXN0IHBhc3MgaXMgcmVjb3JkIChyb3cscGFzcykgZnJvbSB0aGUgY2FsbGJhY2sgYW5kIHVzZQotdGhlIGxhc3QgcmVjb3JkZWQgdmFsdWUgZWFjaCB0aW1lLgotCi1BcyB3aXRoIHRoZSB1c2VyIHRyYW5zZm9ybSB5b3UgY2FuIGZpbmQgdGhlIG91dHB1dCByb3cgdXNpbmcgdGhlCi1QTkdfUk9XX0ZST01fUEFTU19ST1cgbWFjcm8uCi0KLVVua25vd24tY2h1bmsgaGFuZGxpbmcKLQotTm93IHlvdSBnZXQgdG8gc2V0IHRoZSB3YXkgdGhlIGxpYnJhcnkgcHJvY2Vzc2VzIHVua25vd24gY2h1bmtzIGluIHRoZQotaW5wdXQgUE5HIHN0cmVhbS4gQm90aCBrbm93biBhbmQgdW5rbm93biBjaHVua3Mgd2lsbCBiZSByZWFkLiAgTm9ybWFsCi1iZWhhdmlvciBpcyB0aGF0IGtub3duIGNodW5rcyB3aWxsIGJlIHBhcnNlZCBpbnRvIGluZm9ybWF0aW9uIGluCi12YXJpb3VzIGluZm9fcHRyIG1lbWJlcnMgd2hpbGUgdW5rbm93biBjaHVua3Mgd2lsbCBiZSBkaXNjYXJkZWQuIFRoaXMKLWJlaGF2aW9yIGNhbiBiZSB3YXN0ZWZ1bCBpZiB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgbmV2ZXIgdXNlIHNvbWUga25vd24KLWNodW5rIHR5cGVzLiBUbyBjaGFuZ2UgdGhpcywgeW91IGNhbiBjYWxsOgotCi0gICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGtlZXAsCi0gICAgICAgIGNodW5rX2xpc3QsIG51bV9jaHVua3MpOwotCi0gICAga2VlcCAgICAgICAtIDA6IGRlZmF1bHQgdW5rbm93biBjaHVuayBoYW5kbGluZwotICAgICAgICAgICAgICAgICAxOiBpZ25vcmU7IGRvIG5vdCBrZWVwCi0gICAgICAgICAgICAgICAgIDI6IGtlZXAgb25seSBpZiBzYWZlLXRvLWNvcHkKLSAgICAgICAgICAgICAgICAgMzoga2VlcCBldmVuIGlmIHVuc2FmZS10by1jb3B5Ci0KLSAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZXNlIGRlZmluaXRpb25zOgotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FTX0RFRkFVTFQgICAwCi0gICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgICAgICAgIDEKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19JRl9TQUZFICAgICAgMgotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX0FMV0FZUyAgICAgICAzCi0KLSAgICBjaHVua19saXN0IC0gbGlzdCBvZiBjaHVua3MgYWZmZWN0ZWQgKGEgYnl0ZSBzdHJpbmcsCi0gICAgICAgICAgICAgICAgIGZpdmUgYnl0ZXMgcGVyIGNodW5rLCBOVUxMIG9yICdcMCcgaWYKLSAgICAgICAgICAgICAgICAgbnVtX2NodW5rcyBpcyBwb3NpdGl2ZTsgaWdub3JlZCBpZgotICAgICAgICAgICAgICAgICBudW1jaHVua3MgPD0gMCkuCi0KLSAgICBudW1fY2h1bmtzIC0gbnVtYmVyIG9mIGNodW5rcyBhZmZlY3RlZDsgaWYgMCwgYWxsCi0gICAgICAgICAgICAgICAgIHVua25vd24gY2h1bmtzIGFyZSBhZmZlY3RlZC4gIElmIHBvc2l0aXZlLAotICAgICAgICAgICAgICAgICBvbmx5IHRoZSBjaHVua3MgaW4gdGhlIGxpc3QgYXJlIGFmZmVjdGVkLAotICAgICAgICAgICAgICAgICBhbmQgaWYgbmVnYXRpdmUgYWxsIHVua25vd24gY2h1bmtzIGFuZAotICAgICAgICAgICAgICAgICBhbGwga25vd24gY2h1bmtzIGV4Y2VwdCBmb3IgdGhlIElIRFIsCi0gICAgICAgICAgICAgICAgIFBMVEUsIHRSTlMsIElEQVQsIGFuZCBJRU5EIGNodW5rcyBhcmUKLSAgICAgICAgICAgICAgICAgYWZmZWN0ZWQuCi0KLVVua25vd24gY2h1bmtzIGRlY2xhcmVkIGluIHRoaXMgd2F5IHdpbGwgYmUgc2F2ZWQgYXMgcmF3IGRhdGEgb250byBhCi1saXN0IG9mIHBuZ191bmtub3duX2NodW5rIHN0cnVjdHVyZXMuICBJZiBhIGNodW5rIHRoYXQgaXMgbm9ybWFsbHkKLWtub3duIHRvIGxpYnBuZyBpcyBuYW1lZCBpbiB0aGUgbGlzdCwgaXQgd2lsbCBiZSBoYW5kbGVkIGFzIHVua25vd24sCi1hY2NvcmRpbmcgdG8gdGhlICJrZWVwIiBkaXJlY3RpdmUuICBJZiBhIGNodW5rIGlzIG5hbWVkIGluIHN1Y2Nlc3NpdmUKLWluc3RhbmNlcyBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwgdGhlIGZpbmFsIGluc3RhbmNlIHdpbGwKLXRha2UgcHJlY2VkZW5jZS4gIFRoZSBJSERSIGFuZCBJRU5EIGNodW5rcyBzaG91bGQgbm90IGJlIG5hbWVkIGluCi1jaHVua19saXN0OyBpZiB0aGV5IGFyZSwgbGlicG5nIHdpbGwgcHJvY2VzcyB0aGVtIG5vcm1hbGx5IGFueXdheS4KLUlmIHlvdSBrbm93IHRoYXQgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIG1ha2UgdXNlIG9mIHNvbWUgcGFydGljdWxhcgotY2h1bmtzLCB1c2UgUE5HX0hBTkRMRV9DSFVOS19ORVZFUiAob3IgMSkgYXMgZGVtb25zdHJhdGVkIGJlbG93LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzYWdlIG9mIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpLAotd2hlcmUgdGhlIHByaXZhdGUgInZwQWciIGNodW5rIHdpbGwgbGF0ZXIgYmUgcHJvY2Vzc2VkIGJ5IGEgdXNlciBjaHVuawotY2FsbGJhY2sgZnVuY3Rpb246Ci0KLSAgICBwbmdfYnl0ZSB2cEFnWzVdPXsxMTgsIDExMiwgIDY1LCAxMDMsIChwbmdfYnl0ZSkgJ1wwJ307Ci0KLSAgICAjaWYgZGVmaW5lZChQTkdfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEKQotICAgICAgcG5nX2J5dGUgdW51c2VkX2NodW5rc1tdPQotICAgICAgewotICAgICAgICAxMDQsICA3MywgIDgzLCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBoSVNUICovCi0gICAgICAgIDEwNSwgIDg0LCAgODgsIDExNiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIGlUWHQgKi8KLSAgICAgICAgMTEyLCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogcENBTCAqLwotICAgICAgICAxMTUsICA2NywgIDY1LCAgNzYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzQ0FMICovCi0gICAgICAgIDExNSwgIDgwLCAgNzYsICA4NCwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHNQTFQgKi8KLSAgICAgICAgMTE2LCAgNzMsICA3NywgIDY5LCAocG5nX2J5dGUpICdcMCcsICAgLyogdElNRSAqLwotICAgICAgfTsKLSAgICAjZW5kaWYKLQotICAgIC4uLgotCi0gICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgIC8qIGlnbm9yZSBhbGwgdW5rbm93biBjaHVua3MKLSAgICAgICAqICh1c2UgZ2xvYmFsIHNldHRpbmcgIjIiIGZvciBsaWJwbmcxNiBhbmQgZWFybGllcik6Ci0gICAgICAgKi8KLSAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgMiwgTlVMTCwgMCk7Ci0KLSAgICAgIC8qIGV4Y2VwdCBmb3IgdnBBZzogKi8KLSAgICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhyZWFkX3B0ciwgMiwgdnBBZywgMSk7Ci0KLSAgICAgIC8qIGFsc28gaWdub3JlIHVudXNlZCBrbm93biBjaHVua3M6ICovCi0gICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDEsIHVudXNlZF9jaHVua3MsCi0gICAgICAgICAoaW50KShzaXplb2YgdW51c2VkX2NodW5rcykvNSk7Ci0gICAgI2VuZGlmCi0KLVVzZXIgbGltaXRzCi0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYW4gaW1hZ2UgdG8gYmUgYXMKLWxhcmdlIGFzIDJeMzEtMSAoMHg3ZmZmZmZmZiksIG9yIGFib3V0IDIuMTQ3IGJpbGxpb24gcm93cyBhbmQgY29sdW1ucy4KLUZvciBzYWZldHksIGxpYnBuZyBpbXBvc2VzIGEgZGVmYXVsdCBsaW1pdCBvZiAxIG1pbGxpb24gcm93cyBhbmQgY29sdW1ucy4KLUxhcmdlciBpbWFnZXMgd2lsbCBiZSByZWplY3RlZCBpbW1lZGlhdGVseSB3aXRoIGEgcG5nX2Vycm9yKCkgY2FsbC4gSWYKLXlvdSB3aXNoIHRvIGNoYW5nZSB0aGVzZSBsaW1pdHMsIHlvdSBjYW4gdXNlCi0KLSAgIHBuZ19zZXRfdXNlcl9saW1pdHMocG5nX3B0ciwgd2lkdGhfbWF4LCBoZWlnaHRfbWF4KTsKLQotdG8gc2V0IHlvdXIgb3duIGxpbWl0cyAobGlicG5nIG1heSByZWplY3Qgc29tZSB2ZXJ5IHdpZGUgaW1hZ2VzCi1hbnl3YXkgYmVjYXVzZSBvZiBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGNvbmRpdGlvbnMpLgotCi1Zb3Ugc2hvdWxkIHB1dCB0aGlzIHN0YXRlbWVudCBhZnRlciB5b3UgY3JlYXRlIHRoZSBQTkcgc3RydWN0dXJlIGFuZAotYmVmb3JlIGNhbGxpbmcgcG5nX3JlYWRfaW5mbygpLCBwbmdfcmVhZF9wbmcoKSwgb3IgcG5nX3Byb2Nlc3NfZGF0YSgpLgotCi1XaGVuIHdyaXRpbmcgYSBQTkcgZGF0YXN0cmVhbSwgcHV0IHRoaXMgc3RhdGVtZW50IGJlZm9yZSBjYWxsaW5nCi1wbmdfd3JpdGVfaW5mbygpIG9yIHBuZ193cml0ZV9wbmcoKS4KLQotSWYgeW91IG5lZWQgdG8gcmV0cmlldmUgdGhlIGxpbWl0cyB0aGF0IGFyZSBiZWluZyBhcHBsaWVkLCB1c2UKLQotICAgd2lkdGhfbWF4ID0gcG5nX2dldF91c2VyX3dpZHRoX21heChwbmdfcHRyKTsKLSAgIGhlaWdodF9tYXggPSBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heChwbmdfcHRyKTsKLQotVGhlIFBORyBzcGVjaWZpY2F0aW9uIHNldHMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBhbmNpbGxhcnkgY2h1bmtzCi1hbGxvd2VkIGluIGEgUE5HIGRhdGFzdHJlYW0uICBCeSBkZWZhdWx0LCBsaWJwbmcgaW1wb3NlcyBhIGxpbWl0IG9mCi1hIHRvdGFsIG9mIDEwMDAgc1BMVCwgdEVYdCwgaVRYdCwgelRYdCwgYW5kIHVua25vd24gY2h1bmtzIHRvIGJlIHN0b3JlZC4KLUlmIHlvdSBoYXZlIHNldCB1cCBib3RoIGluZm9fcHRyIGFuZCBlbmRfaW5mb19wdHIsIHRoZSBsaW1pdCBhcHBsaWVzCi1zZXBhcmF0ZWx5IHRvIGVhY2guICBZb3UgY2FuIGNoYW5nZSB0aGUgbGltaXQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBzdWNoCi1jaHVua3MgdGhhdCB3aWxsIGJlIHN0b3JlZCwgd2l0aAotCi0gICBwbmdfc2V0X2NodW5rX2NhY2hlX21heChwbmdfcHRyLCB1c2VyX2NodW5rX2NhY2hlX21heCk7Ci0KLXdoZXJlIDB4N2ZmZmZmZmZMIG1lYW5zIHVubGltaXRlZC4gIFlvdSBjYW4gcmV0cmlldmUgdGhpcyBsaW1pdCB3aXRoCi0KLSAgIGNodW5rX2NhY2hlX21heCA9IHBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4KHBuZ19wdHIpOwotCi1MaWJwbmcgaW1wb3NlcyBhIGxpbWl0IG9mIDggTWVnYWJ5dGVzICg4LDAwMCwwMDAgYnl0ZXMpIG9uIHRoZSBhbW91bnQgb2YKLW1lbW9yeSB0aGF0IGEgY29tcHJlc3NlZCBjaHVuayBvdGhlciB0aGFuIElEQVQgY2FuIG9jY3VweSwgd2hlbiBkZWNvbXByZXNzZWQuCi1Zb3UgY2FuIGNoYW5nZSB0aGlzIGxpbWl0IHdpdGgKLQotICAgcG5nX3NldF9jaHVua19tYWxsb2NfbWF4KHBuZ19wdHIsIHVzZXJfY2h1bmtfbWFsbG9jX21heCk7Ci0KLWFuZCB5b3UgY2FuIHJldHJpZXZlIHRoZSBsaW1pdCB3aXRoCi0KLSAgIGNodW5rX21hbGxvY19tYXggPSBwbmdfZ2V0X2NodW5rX21hbGxvY19tYXgocG5nX3B0cik7Ci0KLUFueSBjaHVua3MgdGhhdCB3b3VsZCBjYXVzZSBlaXRoZXIgb2YgdGhlc2UgbGltaXRzIHRvIGJlIGV4Y2VlZGVkIHdpbGwKLWJlIGlnbm9yZWQuCi0KLUluZm9ybWF0aW9uIGFib3V0IHlvdXIgc3lzdGVtCi0KLUlmIHlvdSBpbnRlbmQgdG8gZGlzcGxheSB0aGUgUE5HIG9yIHRvIGluY29ycG9yYXRlIGl0IGluIG90aGVyIGltYWdlIGRhdGEgeW91Ci1uZWVkIHRvIHRlbGwgbGlicG5nIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgZGlzcGxheSBvciBkcmF3aW5nIHN1cmZhY2Ugc28gdGhhdAotbGlicG5nIGNhbiBjb252ZXJ0IHRoZSB2YWx1ZXMgaW4gdGhlIGltYWdlIHRvIG1hdGNoIHRoZSBkaXNwbGF5LgotCi1Gcm9tIGxpYnBuZy0xLjUuNCB0aGlzIGluZm9ybWF0aW9uIGNhbiBiZSBzZXQgYmVmb3JlIHJlYWRpbmcgdGhlIFBORyBmaWxlCi1oZWFkZXIuICBJbiBlYXJsaWVyIHZlcnNpb25zIHBuZ19zZXRfZ2FtbWEoKSBleGlzdGVkIGJ1dCBiZWhhdmVkIGluY29ycmVjdGx5IGlmCi1jYWxsZWQgYmVmb3JlIHRoZSBQTkcgZmlsZSBoZWFkZXIgaGFkIGJlZW4gcmVhZCBhbmQgcG5nX3NldF9hbHBoYV9tb2RlKCkgZGlkIG5vdAotZXhpc3QuCi0KLUlmIHlvdSBuZWVkIHRvIHN1cHBvcnQgdmVyc2lvbnMgcHJpb3IgdG8gbGlicG5nLTEuNS40IHRlc3QgdGhlIHZlcnNpb24gbnVtYmVyCi1hcyBpbGx1c3RyYXRlZCBiZWxvdyB1c2luZyAiUE5HX0xJQlBOR19WRVIgPj0gMTA1MDQiIGFuZCBmb2xsb3cgdGhlIHByb2NlZHVyZXMKLWRlc2NyaWJlZCBpbiB0aGUgYXBwcm9wcmlhdGUgbWFudWFsIHBhZ2UuCi0KLVlvdSBnaXZlIGxpYnBuZyB0aGUgZW5jb2RpbmcgZXhwZWN0ZWQgYnkgeW91ciBzeXN0ZW0gZXhwcmVzc2VkIGFzIGEgJ2dhbW1hJwotdmFsdWUuICBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBQTkcgZmlsZSBpbgotY2FzZSB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgbWlzc2luZyBmcm9tIHRoZSBmaWxlLiAgQnkgZGVmYXVsdCBsaWJwbmcKLWFzc3VtZXMgdGhhdCB0aGUgUE5HIGRhdGEgbWF0Y2hlcyB5b3VyIHN5c3RlbSwgdG8ga2VlcCB0aGlzIGRlZmF1bHQgY2FsbDoKLQotICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIG91dHB1dF9nYW1tYSk7Ci0KLW9yIHlvdSBjYW4gdXNlIHRoZSBmaXhlZCBwb2ludCBlcXVpdmFsZW50OgotCi0gICBwbmdfc2V0X2dhbW1hX2ZpeGVkKHBuZ19wdHIsIFBOR19GUF8xKnNjcmVlbl9nYW1tYSwKLSAgICAgIFBOR19GUF8xKm91dHB1dF9nYW1tYSk7Ci0KLUlmIHlvdSBkb24ndCBrbm93IHRoZSBnYW1tYSBmb3IgeW91ciBzeXN0ZW0gaXQgaXMgcHJvYmFibHkgMi4yIC0gYSBnb29kCi1hcHByb3hpbWF0aW9uIHRvIHRoZSBJRUMgc3RhbmRhcmQgZm9yIGRpc3BsYXkgc3lzdGVtcyAoc1JHQikuICBJZiBpbWFnZXMgYXJlCi10b28gY29udHJhc3R5IG9yIHdhc2hlZCBvdXQgeW91IGdvdCB0aGUgdmFsdWUgd3JvbmcgLSBjaGVjayB5b3VyIHN5c3RlbQotZG9jdW1lbnRhdGlvbiEKLQotTWFueSBzeXN0ZW1zIHBlcm1pdCB0aGUgc3lzdGVtIGdhbW1hIHRvIGJlIGNoYW5nZWQgdmlhIGEgbG9va3VwIHRhYmxlIGluIHRoZQotZGlzcGxheSBkcml2ZXIsIGEgZmV3IHN5c3RlbXMsIGluY2x1ZGluZyBvbGRlciBNYWNzLCBjaGFuZ2UgdGhlIHJlc3BvbnNlIGJ5Ci1kZWZhdWx0LiAgQXMgb2YgMS41LjQgdGhyZWUgc3BlY2lhbCB2YWx1ZXMgYXJlIGF2YWlsYWJsZSB0byBoYW5kbGUgY29tbW9uCi1zaXR1YXRpb25zOgotCi0gICBQTkdfREVGQVVMVF9zUkdCOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtIGNvbmZvcm1zIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgSUVDIDYxOTY2LTItMSBzdGFuZGFyZC4gIFRoaXMgbWF0Y2hlcyBhbG1vc3QKLSAgICAgICAgICAgICAgICAgICAgIGFsbCBzeXN0ZW1zLgotICAgUE5HX0dBTU1BX01BQ18xODogSW5kaWNhdGVzIHRoYXQgdGhlIHN5c3RlbSBpcyBhbiBvbGRlcgotICAgICAgICAgICAgICAgICAgICAgKHByZSBNYWMgT1MgMTAuNikgQXBwbGUgTWFjaW50b3NoIHN5c3RlbSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KLSAgIFBOR19HQU1NQV9MSU5FQVI6IEp1c3QgdGhlIGZpeGVkIHBvaW50IHZhbHVlIGZvciAxLjAgLSBpbmRpY2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIHN5c3RlbSBleHBlY3RzIGRhdGEgd2l0aCBubyBnYW1tYQotICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcuCi0KLVlvdSB3b3VsZCB1c2UgdGhlIGxpbmVhciAodW5lbmNvZGVkKSB2YWx1ZSBpZiB5b3UgbmVlZCB0byBwcm9jZXNzIHRoZSBwaXhlbAotdmFsdWVzIGZ1cnRoZXIgYmVjYXVzZSB0aGlzIGF2b2lkcyB0aGUgbmVlZCB0byBkZWNvZGUgYW5kIHJlLWVuY29kZSBlYWNoCi1jb21wb25lbnQgdmFsdWUgd2hlbmV2ZXIgYXJpdGhtZXRpYyBpcyBwZXJmb3JtZWQuICBBIGxvdCBvZiBncmFwaGljcyBzb2Z0d2FyZQotdXNlcyBsaW5lYXIgdmFsdWVzIGZvciB0aGlzIHJlYXNvbiwgb2Z0ZW4gd2l0aCBoaWdoZXIgcHJlY2lzaW9uIGNvbXBvbmVudCB2YWx1ZXMKLXRvIHByZXNlcnZlIG92ZXJhbGwgYWNjdXJhY3kuCi0KLQotVGhlIG91dHB1dF9nYW1tYSB2YWx1ZSBleHByZXNzZXMgaG93IHRvIGRlY29kZSB0aGUgb3V0cHV0IHZhbHVlcywgbm90IGhvdwotdGhleSBhcmUgZW5jb2RlZC4gIFRoZSB2YWx1ZXMgdXNlZCBjb3JyZXNwb25kIHRvIHRoZSBub3JtYWwgbnVtYmVycyB1c2VkIHRvCi1kZXNjcmliZSB0aGUgb3ZlcmFsbCBnYW1tYSBvZiBhIGNvbXB1dGVyIGRpc3BsYXkgc3lzdGVtOyBmb3IgZXhhbXBsZSAyLjIgZm9yCi1hbiBzUkdCIGNvbmZvcm1hbnQgc3lzdGVtLiAgVGhlIHZhbHVlcyBhcmUgc2NhbGVkIGJ5IDEwMDAwMCBpbiB0aGUgX2ZpeGVkCi12ZXJzaW9uIG9mIHRoZSBBUEkgKHNvIDIyMDAwMCBmb3Igc1JHQi4pCi0KLVRoZSBpbnZlcnNlIG9mIHRoZSB2YWx1ZSBpcyBhbHdheXMgdXNlZCB0byBwcm92aWRlIGEgZGVmYXVsdCBmb3IgdGhlIFBORyBmaWxlCi1lbmNvZGluZyBpZiBpdCBoYXMgbm8gZ0FNQSBjaHVuayBhbmQgaWYgcG5nX3NldF9nYW1tYSgpIGhhcyBub3QgYmVlbiBjYWxsZWQKLXRvIG92ZXJyaWRlIHRoZSBQTkcgZ2FtbWEgaW5mb3JtYXRpb24uCi0KLVdoZW4gdGhlIEFMUEhBX09QVElNSVpFRCBtb2RlIGlzIHNlbGVjdGVkIHRoZSBvdXRwdXQgZ2FtbWEgaXMgdXNlZCB0byBlbmNvZGUKLW9wYXF1ZSBwaXhlbHMgaG93ZXZlciBwaXhlbHMgd2l0aCBsb3dlciBhbHBoYSB2YWx1ZXMgYXJlIG5vdCBlbmNvZGVkLAotcmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGdhbW1hIHNldHRpbmcuCi0KLVdoZW4gdGhlIHN0YW5kYXJkIFBvcnRlciBEdWZmIGhhbmRsaW5nIGlzIHJlcXVlc3RlZCB3aXRoIG1vZGUgMSB0aGUgb3V0cHV0Ci1lbmNvZGluZyBpcyBzZXQgdG8gYmUgbGluZWFyIGFuZCB0aGUgb3V0cHV0X2dhbW1hIHZhbHVlIGlzIG9ubHkgcmVsZXZhbnQKLWFzIGEgZGVmYXVsdCBmb3IgaW5wdXQgZGF0YSB0aGF0IGhhcyBubyBnYW1tYSBpbmZvcm1hdGlvbi4gIFRoZSBsaW5lYXIgb3V0cHV0Ci1lbmNvZGluZyB3aWxsIGJlIG92ZXJyaWRkZW4gaWYgcG5nX3NldF9nYW1tYSgpIGlzIGNhbGxlZCAtIHRoZSByZXN1bHRzIG1heSBiZQotaGlnaGx5IHVuZXhwZWN0ZWQhCi0KLVRoZSBmb2xsb3dpbmcgbnVtYmVycyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBzUkdCIHN0YW5kYXJkIGFuZCB0aGUgcmVzZWFyY2gKLWJlaGluZCBpdC4gIHNSR0IgaXMgZGVmaW5lZCB0byBiZSBhcHByb3hpbWF0ZWQgYnkgYSBQTkcgZ0FNQSBjaHVuayB2YWx1ZSBvZgotMC40NTQ1NSAoMS8yLjIpIGZvciBQTkcuICBUaGUgdmFsdWUgaW1wbGljaXRseSBpbmNsdWRlcyBhbnkgdmlld2luZwotY29ycmVjdGlvbiByZXF1aXJlZCB0byB0YWtlIGFjY291bnQgb2YgYW55IGRpZmZlcmVuY2VzIGluIHRoZSBjb2xvcgotZW52aXJvbm1lbnQgb2YgdGhlIG9yaWdpbmFsIHNjZW5lIGFuZCB0aGUgaW50ZW5kZWQgZGlzcGxheSBlbnZpcm9ubWVudDsgdGhlCi12YWx1ZSBleHByZXNzZXMgaG93IHRvICpkZWNvZGUqIHRoZSBpbWFnZSBmb3IgZGlzcGxheSwgbm90IGhvdyB0aGUgb3JpZ2luYWwKLWRhdGEgd2FzICplbmNvZGVkKi4KLQotc1JHQiBwcm92aWRlcyBhIHBlZyBmb3IgdGhlIFBORyBzdGFuZGFyZCBieSBkZWZpbmluZyBhIHZpZXdpbmcgZW52aXJvbm1lbnQuCi1zUkdCIGl0c2VsZiwgYW5kIGVhcmxpZXIgVFYgc3RhbmRhcmRzLCBhY3R1YWxseSB1c2UgYSBtb3JlIGNvbXBsZXggdHJhbnNmb3JtCi0oYSBsaW5lYXIgcG9ydGlvbiB0aGVuIGEgZ2FtbWEgMi40IHBvd2VyIGxhdykgdGhhbiBQTkcgY2FuIGV4cHJlc3MuICAoUE5HIGlzCi1saW1pdGVkIHRvIHNpbXBsZSBwb3dlciBsYXdzLikgIEJ5IHNheWluZyB0aGF0IGFuIGltYWdlIGZvciBkaXJlY3QgZGlzcGxheSBvbgotYW4gc1JHQiBjb25mb3JtYW50IHN5c3RlbSBzaG91bGQgYmUgc3RvcmVkIHdpdGggYSBnQU1BIGNodW5rIHZhbHVlIG9mIDQ1NDU1Ci0oMTEuMy4zLjIgYW5kIDExLjMuMy41IG9mIHRoZSBJU08gUE5HIHNwZWNpZmljYXRpb24pIHRoZSBQTkcgc3BlY2lmaWNhdGlvbgotbWFrZXMgaXQgcG9zc2libGUgdG8gZGVyaXZlIHZhbHVlcyBmb3Igb3RoZXIgZGlzcGxheSBzeXN0ZW1zIGFuZAotZW52aXJvbm1lbnRzLgotCi1UaGUgTWFjIHZhbHVlIGlzIGRlZHVjZWQgZnJvbSB0aGUgc1JHQiBiYXNlZCBvbiBhbiBhc3N1bXB0aW9uIHRoYXQgdGhlIGFjdHVhbAotZXh0cmEgdmlld2luZyBjb3JyZWN0aW9uIHVzZWQgaW4gZWFybHkgTWFjIGRpc3BsYXkgc3lzdGVtcyB3YXMgaW1wbGVtZW50ZWQgYXMKLWEgcG93ZXIgMS40NSBsb29rdXAgdGFibGUuCi0KLUFueSBzeXN0ZW0gd2hlcmUgYSBwcm9ncmFtbWFibGUgbG9va3VwIHRhYmxlIGlzIHVzZWQgb3Igd2hlcmUgdGhlIGJlaGF2aW9yIG9mCi10aGUgZmluYWwgZGlzcGxheSBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIGNhbiBiZSBjaGFuZ2VkIHJlcXVpcmVzIHN5c3RlbQotc3BlY2lmaWMgY29kZSB0byBvYnRhaW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyaXN0aWMuICBIb3dldmVyIHRoaXMgY2FuIGJlCi1kaWZmaWN1bHQgYW5kIG1vc3QgUE5HIGdhbW1hIGNvcnJlY3Rpb24gb25seSByZXF1aXJlcyBhbiBhcHByb3hpbWF0ZSB2YWx1ZS4KLQotQnkgZGVmYXVsdCwgaWYgcG5nX3NldF9hbHBoYV9tb2RlKCkgaXMgbm90IGNhbGxlZCwgbGlicG5nIGFzc3VtZXMgdGhhdCBhbGwKLXZhbHVlcyBhcmUgdW5lbmNvZGVkLCBsaW5lYXIsIHZhbHVlcyBhbmQgdGhhdCB0aGUgb3V0cHV0IGRldmljZSBhbHNvIGhhcyBhCi1saW5lYXIgY2hhcmFjdGVyaXN0aWMuICBUaGlzIGlzIG9ubHkgdmVyeSByYXJlbHkgY29ycmVjdCAtIGl0IGlzIGludmFyaWFibHkKLWJldHRlciB0byBjYWxsIHBuZ19zZXRfYWxwaGFfbW9kZSgpIHdpdGggUE5HX0RFRkFVTFRfc1JHQiB0aGFuIHJlbHkgb24gdGhlCi1kZWZhdWx0IGlmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhlIHJpZ2h0IGFuc3dlciBpcyEKLQotVGhlIHNwZWNpYWwgdmFsdWUgUE5HX0dBTU1BX01BQ18xOCBpbmRpY2F0ZXMgYW4gb2xkZXIgTWFjIHN5c3RlbSAocHJlIE1hYyBPUwotMTAuNikgd2hpY2ggdXNlZCBhIGNvcnJlY3Rpb24gdGFibGUgdG8gaW1wbGVtZW50IGEgc29tZXdoYXQgbG93ZXIgZ2FtbWEgb24gYW4KLW90aGVyd2lzZSBzUkdCIHN5c3RlbS4KLQotQm90aCB0aGVzZSB2YWx1ZXMgYXJlIHJlc2VydmVkIChub3Qgc2ltcGxlIGdhbW1hIHZhbHVlcykgaW4gb3JkZXIgdG8gYWxsb3cKLW1vcmUgcHJlY2lzZSBjb3JyZWN0aW9uIGludGVybmFsbHkgaW4gdGhlIGZ1dHVyZS4KLQotTk9URTogdGhlIHZhbHVlcyBjYW4gYmUgcGFzc2VkIHRvIGVpdGhlciB0aGUgZml4ZWQgb3IgZmxvYXRpbmcKLXBvaW50IEFQSXMsIGJ1dCB0aGUgZmxvYXRpbmcgcG9pbnQgQVBJIHdpbGwgYWxzbyBhY2NlcHQgZmxvYXRpbmcgcG9pbnQKLXZhbHVlcy4KLQotVGhlIHNlY29uZCB0aGluZyB5b3UgbWF5IG5lZWQgdG8gdGVsbCBsaWJwbmcgYWJvdXQgaXMgaG93IHlvdXIgc3lzdGVtIGhhbmRsZXMKLWFscGhhIGNoYW5uZWwgaW5mb3JtYXRpb24uICBTb21lLCBidXQgbm90IGFsbCwgUE5HIGZpbGVzIGNvbnRhaW4gYW4gYWxwaGEKLWNoYW5uZWwuICBUbyBkaXNwbGF5IHRoZXNlIGZpbGVzIGNvcnJlY3RseSB5b3UgbmVlZCB0byBjb21wb3NlIHRoZSBkYXRhIG9udG8gYQotc3VpdGFibGUgYmFja2dyb3VuZCwgYXMgZGVzY3JpYmVkIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbi4KLQotTGlicG5nIG9ubHkgc3VwcG9ydHMgY29tcG9zaW5nIG9udG8gYSBzaW5nbGUgY29sb3IgKHVzaW5nIHBuZ19zZXRfYmFja2dyb3VuZDsKLXNlZSBiZWxvdykuICBPdGhlcndpc2UgeW91IG11c3QgZG8gdGhlIGNvbXBvc2l0aW9uIHlvdXJzZWxmIGFuZCwgaW4gdGhpcyBjYXNlLAoteW91IG1heSBuZWVkIHRvIGNhbGwgcG5nX3NldF9hbHBoYV9tb2RlOgotCi0gICAjaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA1MDQKLSAgICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBtb2RlLCBzY3JlZW5fZ2FtbWEpOwotICAgI2Vsc2UKLSAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgc2NyZWVuX2dhbW1hLCAxLjAvc2NyZWVuX2dhbW1hKTsKLSAgICNlbmRpZgotCi1UaGUgc2NyZWVuX2dhbW1hIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCB0byBwbmdfc2V0X2dhbW1hOyBob3dldmVyLAotaG93IGl0IGFmZmVjdHMgdGhlIG91dHB1dCBkZXBlbmRzIG9uIHRoZSBtb2RlLiAgcG5nX3NldF9hbHBoYV9tb2RlKCkgc2V0cyB0aGUKLWZpbGUgZ2FtbWEgZGVmYXVsdCB0byAxL3NjcmVlbl9nYW1tYSwgc28gbm9ybWFsbHkgeW91IGRvbid0IG5lZWQgdG8gY2FsbAotcG5nX3NldF9nYW1tYS4gIElmIHlvdSBuZWVkIGRpZmZlcmVudCBkZWZhdWx0cyBjYWxsIHBuZ19zZXRfZ2FtbWEoKSBiZWZvcmUKLXBuZ19zZXRfYWxwaGFfbW9kZSgpIC0gaWYgeW91IGNhbGwgaXQgYWZ0ZXIgaXQgd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZ3MgbWFkZQotYnkgcG5nX3NldF9hbHBoYV9tb2RlKCkuCi0KLVRoZSBtb2RlIGlzIGFzIGZvbGxvd3M6Ci0KLSAgICBQTkdfQUxQSEFfUE5HOiBUaGUgZGF0YSBpcyBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgUE5HCi1zcGVjaWZpY2F0aW9uLiAgUmVkLCBncmVlbiBhbmQgYmx1ZSwgb3IgZ3JheSwgY29tcG9uZW50cyBhcmUKLWdhbW1hIGVuY29kZWQgY29sb3IgdmFsdWVzIGFuZCBhcmUgbm90IHByZW11bHRpcGxpZWQgYnkgdGhlCi1hbHBoYSB2YWx1ZS4gIFRoZSBhbHBoYSB2YWx1ZSBpcyBhIGxpbmVhciBtZWFzdXJlIG9mIHRoZQotY29udHJpYnV0aW9uIG9mIHRoZSBwaXhlbCB0byB0aGUgY29ycmVzcG9uZGluZyBmaW5hbCBvdXRwdXQgcGl4ZWwuCi0KLVlvdSBzaG91bGQgbm9ybWFsbHkgdXNlIHRoaXMgZm9ybWF0IGlmIHlvdSBpbnRlbmQgdG8gcGVyZm9ybQotY29sb3IgY29ycmVjdGlvbiBvbiB0aGUgY29sb3IgdmFsdWVzOyBtb3N0LCBtYXliZSBhbGwsIGNvbG9yCi1jb3JyZWN0aW9uIHNvZnR3YXJlIGhhcyBubyBoYW5kbGluZyBmb3IgdGhlIGFscGhhIGNoYW5uZWwgYW5kLAotYW55d2F5LCB0aGUgbWF0aCB0byBoYW5kbGUgcHJlLW11bHRpcGxpZWQgY29tcG9uZW50IHZhbHVlcyBpcwotdW5uZWNlc3NhcmlseSBjb21wbGV4LgotCi1CZWZvcmUgeW91IGRvIGFueSBhcml0aG1ldGljIG9uIHRoZSBjb21wb25lbnQgdmFsdWVzIHlvdSBuZWVkCi10byByZW1vdmUgdGhlIGdhbW1hIGVuY29kaW5nIGFuZCBtdWx0aXBseSBvdXQgdGhlIGFscGhhCi1jaGFubmVsLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWwuICBJdCBpcwotaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB3aGVuIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCBpcwotc2NhbGVkLCBsaW5lYXIgZW5jb2RlZCwgcHJlLW11bHRpcGxpZWQgY29tcG9uZW50IHZhbHVlcyBtdXN0Ci1iZSB1c2VkIQotCi1UaGUgcmVtYWluaW5nIG1vZGVzIGFzc3VtZSB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgZnVydGhlciBjb2xvciBjb3JyZWN0aW9uIG9yCi10aGF0IGlmIHlvdSBkbywgeW91ciBjb2xvciBjb3JyZWN0aW9uIHNvZnR3YXJlIGtub3dzIGFsbCBhYm91dCBhbHBoYSAoaXQKLXByb2JhYmx5IGRvZXNuJ3QhKS4gIFRoZXkgJ2Fzc29jaWF0ZScgdGhlIGFscGhhIHdpdGggdGhlIGNvbG9yIGluZm9ybWF0aW9uIGJ5Ci1zdG9yaW5nIGNvbG9yIGNoYW5uZWwgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHNjYWxlZCBieSB0aGUgYWxwaGEuICBUaGUKLWFkdmFudGFnZSBpcyB0aGF0IHRoZSBjb2xvciBjaGFubmVscyBjYW4gYmUgcmVzYW1wbGVkICh0aGUgaW1hZ2UgY2FuIGJlCi1zY2FsZWQpIGluIHRoaXMgZm9ybS4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBub3JtYWwgcHJhY3RpY2UgaXMgdG8gc3RvcmUKLWxpbmVhciwgbm90IChnYW1tYSkgZW5jb2RlZCwgdmFsdWVzIGFuZCB0aGlzIHJlcXVpcmVzIDE2LWJpdCBjaGFubmVscyBmb3IKLXN0aWxsIGltYWdlcyByYXRoZXIgdGhhbiB0aGUgOC1iaXQgY2hhbm5lbHMgdGhhdCBhcmUganVzdCBhYm91dCBzdWZmaWNpZW50IGlmCi1nYW1tYSBlbmNvZGluZyBpcyB1c2VkLiAgSW4gYWRkaXRpb24gYWxsIG5vbi10cmFuc3BhcmVudCBwaXhlbCB2YWx1ZXMsCi1pbmNsdWRpbmcgY29tcGxldGVseSBvcGFxdWUgb25lcywgbXVzdCBiZSBnYW1tYSBlbmNvZGVkIHRvIHByb2R1Y2UgdGhlIGZpbmFsCi1pbWFnZS4gIFRoZXNlIGFyZSB0aGUgJ1NUQU5EQVJEJywgJ0FTU09DSUFURUQnIG9yICdQUkVNVUxUSVBMSUVEJyBtb2RlcwotZGVzY3JpYmVkIGJlbG93ICh0aGUgbGF0dGVyIGJlaW5nIHRoZSB0d28gY29tbW9uIG5hbWVzIGZvciBhc3NvY2lhdGVkIGFscGhhCi1jb2xvciBjaGFubmVscykuIE5vdGUgdGhhdCBQTkcgZmlsZXMgYWx3YXlzIGNvbnRhaW4gbm9uLWFzc29jaWF0ZWQgY29sb3IKLWNoYW5uZWxzOyBwbmdfc2V0X2FscGhhX21vZGUoKSB3aXRoIG9uZSBvZiB0aGUgbW9kZXMgY2F1c2VzIHRoZSBkZWNvZGVyIHRvCi1jb252ZXJ0IHRoZSBwaXhlbHMgdG8gYW4gYXNzb2NpYXRlZCBmb3JtIGJlZm9yZSByZXR1cm5pbmcgdGhlbSB0byB5b3VyCi1hcHBsaWNhdGlvbi4gCi0KLVNpbmNlIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcGVyZm9ybSBhcml0aG1ldGljIG9uIG9wYXF1ZSBjb2xvciB2YWx1ZXMgc28KLWxvbmcgYXMgdGhleSBhcmUgbm90IHRvIGJlIHJlc2FtcGxlZCBhbmQgYXJlIGluIHRoZSBmaW5hbCBjb2xvciBzcGFjZSBpdCBpcwotcG9zc2libGUgdG8gb3B0aW1pemUgdGhlIGhhbmRsaW5nIG9mIGFscGhhIGJ5IHN0b3JpbmcgdGhlIG9wYXF1ZSBwaXhlbHMgaW4KLXRoZSBQTkcgZm9ybWF0IChhZGp1c3RlZCBmb3IgdGhlIG91dHB1dCBjb2xvciBzcGFjZSkgd2hpbGUgc3RvcmluZyBwYXJ0aWFsbHkKLW9wYXF1ZSBwaXhlbHMgaW4gdGhlIHN0YW5kYXJkLCBsaW5lYXIsIGZvcm1hdC4gIFRoZSBhY2N1cmFjeSByZXF1aXJlZCBmb3IKLXN0YW5kYXJkIGFscGhhIGNvbXBvc2l0aW9uIGlzIHJlbGF0aXZlbHkgbG93LCBiZWNhdXNlIHRoZSBwaXhlbHMgYXJlCi1pc29sYXRlZCwgdGhlcmVmb3JlIHR5cGljYWxseSB0aGUgYWNjdXJhY3kgbG9zcyBpbiBzdG9yaW5nIDgtYml0IGxpbmVhcgotdmFsdWVzIGlzIGFjY2VwdGFibGUuICAoVGhpcyBpcyBub3QgdHJ1ZSBpZiB0aGUgYWxwaGEgY2hhbm5lbCBpcyB1c2VkIHRvCi1zaW11bGF0ZSB0cmFuc3BhcmVuY3kgb3ZlciBsYXJnZSBhcmVhcyAtIHVzZSAxNiBiaXRzIG9yIHRoZSBQTkcgbW9kZSBpbgotdGhpcyBjYXNlISkgIFRoaXMgaXMgdGhlICdPUFRJTUlaRUQnIG1vZGUuICBGb3IgdGhpcyBtb2RlIGEgcGl4ZWwgaXMKLXRyZWF0ZWQgYXMgb3BhcXVlIG9ubHkgaWYgdGhlIGFscGhhIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHZhbHVlLgotCi0gICAgUE5HX0FMUEhBX1NUQU5EQVJEOiAgVGhlIGRhdGEgbGlicG5nIHByb2R1Y2VzIGlzIGVuY29kZWQgaW4gdGhlCi1zdGFuZGFyZCB3YXkgYXNzdW1lZCBieSBtb3N0IGNvcnJlY3RseSB3cml0dGVuIGdyYXBoaWNzIHNvZnR3YXJlLgotVGhlIGdhbW1hIGVuY29kaW5nIHdpbGwgYmUgcmVtb3ZlZCBieSBsaWJwbmcgYW5kIHRoZQotbGluZWFyIGNvbXBvbmVudCB2YWx1ZXMgd2lsbCBiZSBwcmUtbXVsdGlwbGllZCBieSB0aGUKLWFscGhhIGNoYW5uZWwuCi0KLVdpdGggdGhpcyBmb3JtYXQgdGhlIGZpbmFsIGltYWdlIG11c3QgYmUgcmUtZW5jb2RlZCB0bwotbWF0Y2ggdGhlIGRpc3BsYXkgZ2FtbWEgYmVmb3JlIHRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQuCi1JZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGRvIHRoYXQsIHlldCBzdGlsbCBzZWVtcyB0bwotcGVyZm9ybSBhcml0aG1ldGljIG9uIHRoZSBwaXhlbHMgd2l0aG91dCBkZWNvZGluZyB0aGVtLAotaXQgaXMgYnJva2VuIC0gY2hlY2sgb3V0IHRoZSBtb2RlcyBiZWxvdy4KLQotV2l0aCBQTkdfQUxQSEFfU1RBTkRBUkQgbGlicG5nIGFsd2F5cyBwcm9kdWNlcyBsaW5lYXIKLWNvbXBvbmVudCB2YWx1ZXMsIHdoYXRldmVyIHNjcmVlbl9nYW1tYSB5b3Ugc3VwcGx5LiAgVGhlCi1zY3JlZW5fZ2FtbWEgdmFsdWUgaXMsIGhvd2V2ZXIsIHVzZWQgYXMgYSBkZWZhdWx0IGZvcgotdGhlIGZpbGUgZ2FtbWEgaWYgdGhlIFBORyBmaWxlIGhhcyBubyBnYW1tYSBpbmZvcm1hdGlvbi4KLQotSWYgeW91IGNhbGwgcG5nX3NldF9nYW1tYSgpIGFmdGVyIHBuZ19zZXRfYWxwaGFfbW9kZSgpIHlvdQotd2lsbCBvdmVycmlkZSB0aGUgbGluZWFyIGVuY29kaW5nLiAgSW5zdGVhZCB0aGUKLXByZS1tdWx0aXBsaWVkIHBpeGVsIHZhbHVlcyB3aWxsIGJlIGdhbW1hIGVuY29kZWQgYnV0Ci10aGUgYWxwaGEgY2hhbm5lbCB3aWxsIHN0aWxsIGJlIGxpbmVhci4gIFRoaXMgbWF5Ci1hY3R1YWxseSBtYXRjaCB0aGUgcmVxdWlyZW1lbnRzIG9mIHNvbWUgYnJva2VuIHNvZnR3YXJlLAotYnV0IGl0IGlzIHVubGlrZWx5LgotCi1XaGlsZSBsaW5lYXIgOC1iaXQgZGF0YSBpcyBvZnRlbiB1c2VkIGl0IGhhcwotaW5zdWZmaWNpZW50IHByZWNpc2lvbiBmb3IgYW55IGltYWdlIHdpdGggYSByZWFzb25hYmxlCi1keW5hbWljIHJhbmdlLiAgVG8gYXZvaWQgcHJvYmxlbXMsIGFuZCBpZiB5b3VyIHNvZnR3YXJlCi1zdXBwb3J0cyBpdCwgdXNlIHBuZ19zZXRfZXhwYW5kXzE2KCkgdG8gZm9yY2UgYWxsCi1jb21wb25lbnRzIHRvIDE2IGJpdHMuCi0KLSAgICBQTkdfQUxQSEFfT1BUSU1JWkVEOiBUaGlzIG1vZGUgaXMgdGhlIHNhbWUgYXMgUE5HX0FMUEhBX1NUQU5EQVJECi1leGNlcHQgdGhhdCBjb21wbGV0ZWx5IG9wYXF1ZSBwaXhlbHMgYXJlIGdhbW1hIGVuY29kZWQgYWNjb3JkaW5nIHRvCi10aGUgc2NyZWVuX2dhbW1hIHZhbHVlLiAgUGl4ZWxzIHdpdGggYWxwaGEgbGVzcyB0aGFuIDEuMAotd2lsbCBzdGlsbCBoYXZlIGxpbmVhciBjb21wb25lbnRzLgotCi1Vc2UgdGhpcyBmb3JtYXQgaWYgeW91IGhhdmUgY29udHJvbCBvdmVyIHlvdXIKLWNvbXBvc2l0aW5nIHNvZnR3YXJlIGFuZCBzbyBkb24ndCBkbyBvdGhlciBhcml0aG1ldGljCi0oc3VjaCBhcyBzY2FsaW5nKSBvbiB0aGUgZGF0YSB5b3UgZ2V0IGZyb20gbGlicG5nLiAgWW91cgotY29tcG9zaXRpbmcgc29mdHdhcmUgY2FuIHNpbXBseSBjb3B5IG9wYXF1ZSBwaXhlbHMgdG8KLXRoZSBvdXRwdXQgYnV0IHN0aWxsIGhhcyBsaW5lYXIgdmFsdWVzIGZvciB0aGUKLW5vbi1vcGFxdWUgcGl4ZWxzLgotCi1JbiBub3JtYWwgY29tcG9zaXRpbmcsIHdoZXJlIHRoZSBhbHBoYSBjaGFubmVsIGVuY29kZXMKLXBhcnRpYWwgcGl4ZWwgY292ZXJhZ2UgKGFzIG9wcG9zZWQgdG8gYnJvYWQgYXJlYQotdHJhbnNsdWNlbmN5KSwgdGhlIGluYWNjdXJhY2llcyBvZiB0aGUgOC1iaXQKLXJlcHJlc2VudGF0aW9uIG9mIG5vbi1vcGFxdWUgcGl4ZWxzIGFyZSBpcnJlbGV2YW50LgotCi1Zb3UgY2FuIGFsc28gdHJ5IHRoaXMgZm9ybWF0IGlmIHlvdXIgc29mdHdhcmUgaXMgYnJva2VuOwotaXQgbWlnaHQgbG9vayBiZXR0ZXIuCi0KLSAgICBQTkdfQUxQSEFfQlJPS0VOOiBUaGlzIGlzIFBOR19BTFBIQV9TVEFOREFSRDsgaG93ZXZlciwgYWxsIGNvbXBvbmVudAotdmFsdWVzLCBpbmNsdWRpbmcgdGhlIGFscGhhIGNoYW5uZWwgYXJlIGdhbW1hIGVuY29kZWQuICBUaGlzIGlzCi1icm9rZW4gYmVjYXVzZSwgaW4gcHJhY3RpY2UsIG5vIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGlzIGNob2ljZQotY29ycmVjdGx5IHVuZG9lcyB0aGUgZW5jb2RpbmcgYmVmb3JlIGhhbmRsaW5nIGFscGhhIGNvbXBvc2l0aW9uLiAgVXNlIHRoaXMKLWNob2ljZSBvbmx5IGlmIG90aGVyIHNlcmlvdXMgZXJyb3JzIGluIHRoZSBzb2Z0d2FyZSBvciBoYXJkd2FyZSB5b3UgdXNlCi1tYW5kYXRlIGl0LiAgSW4gbW9zdCBjYXNlcyBvZiBicm9rZW4gc29mdHdhcmUgb3IgaGFyZHdhcmUgdGhlIGJ1ZyBpbiB0aGUKLWZpbmFsIGRpc3BsYXkgbWFuaWZlc3RzIGFzIGEgc3VidGxlIGhhbG8gYXJvdW5kIGNvbXBvc2l0ZWQgcGFydHMgb2YgdGhlCi1pbWFnZS4gIFlvdSBtYXkgbm90IGV2ZW4gcGVyY2VpdmUgdGhpcyBhcyBhIGhhbG87IHRoZSBjb21wb3NpdGVkIHBhcnQgb2YKLXRoZSBpbWFnZSBtYXkgc2ltcGx5IGFwcGVhciBzZXBhcmF0ZSBmcm9tIHRoZSBiYWNrZ3JvdW5kLCBhcyB0aG91Z2ggaXQgaGFkCi1iZWVuIGN1dCBvdXQgb2YgcGFwZXIgYW5kIHBhc3RlZCBvbiBhZnRlcndhcmQuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCBidWdzIGluIHNvZnR3YXJlIG9yIGhhcmR3YXJlLCBvciBpZiB5b3UgY2FuIGZpeAotdGhlbSwgdGhlcmUgYXJlIHRocmVlIHJlY29tbWVuZGVkIHdheXMgb2YgdXNpbmcgcG5nX3NldF9hbHBoYV9tb2RlKCk6Ci0KLSAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBQTkdfQUxQSEFfUE5HLAotICAgICAgIHNjcmVlbl9nYW1tYSk7Ci0KLVlvdSBjYW4gZG8gY29sb3IgY29ycmVjdGlvbiBvbiB0aGUgcmVzdWx0IChsaWJwbmcgZG9lcyBub3QgY3VycmVudGx5Ci1zdXBwb3J0IGNvbG9yIGNvcnJlY3Rpb24gaW50ZXJuYWxseSkuICBXaGVuIHlvdSBoYW5kbGUgdGhlIGFscGhhIGNoYW5uZWwKLXlvdSBuZWVkIHRvIHVuZG8gdGhlIGdhbW1hIGVuY29kaW5nIGFuZCBtdWx0aXBseSBvdXQgdGhlIGFscGhhLgotCi0gICBwbmdfc2V0X2FscGhhX21vZGUocG5nX3B0ciwgUE5HX0FMUEhBX1NUQU5EQVJELAotICAgICAgIHNjcmVlbl9nYW1tYSk7Ci0gICBwbmdfc2V0X2V4cGFuZF8xNihwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UsIGRvbid0IGNhbGwgcG5nX3NldF9leHBhbmRfMTYoKTsKLWluc3RlYWQgcGFzcyBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNiB0byB0aGUgaW50ZXJmYWNlLgotCi1XaXRoIHRoaXMgbW9kZSB5b3UgY2FuJ3QgZG8gY29sb3IgY29ycmVjdGlvbiwgYnV0IHlvdSBjYW4gZG8gYXJpdGhtZXRpYywKLWluY2x1ZGluZyBjb21wb3NpdGlvbiBhbmQgc2NhbGluZywgb24gdGhlIGRhdGEgd2l0aG91dCBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0KLSAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBQTkdfQUxQSEFfT1BUSU1JWkVELAotICAgICAgIHNjcmVlbl9nYW1tYSk7Ci0KLVlvdSBjYW4gYXZvaWQgdGhlIGV4cGFuc2lvbiB0byAxNi1iaXQgY29tcG9uZW50cyB3aXRoIHRoaXMgbW9kZSwgYnV0IHlvdQotbG9zZSB0aGUgYWJpbGl0eSB0byBzY2FsZSB0aGUgaW1hZ2Ugb3IgcGVyZm9ybSBvdGhlciBsaW5lYXIgYXJpdGhtZXRpYy4KLUFsbCB5b3UgY2FuIGRvIGlzIGNvbXBvc2UgdGhlIHJlc3VsdCBvbnRvIGEgbWF0Y2hpbmcgb3V0cHV0LiAgU2luY2UgdGhpcwotbW9kZSBpcyBsaWJwbmctc3BlY2lmaWMgeW91IGFsc28gbmVlZCB0byB3cml0ZSB5b3VyIG93biBjb21wb3NpdGlvbgotc29mdHdhcmUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIGNhbGxzIHRvIHBuZ19zZXRfYWxwaGFfbW9kZSB0byBhY2hpZXZlIHRoZQotcmVxdWlyZWQgb3ZlcmFsbCBnYW1tYSBjb3JyZWN0aW9uIGFuZCwgd2hlcmUgbmVjZXNzYXJ5LCBhbHBoYQotcHJlbXVsdGlwbGljYXRpb24uCi0KLSAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19ERUZBVUxUX3NSR0IpOwotCi1UaGlzIGlzIHRoZSBkZWZhdWx0IGxpYnBuZyBoYW5kbGluZyBvZiB0aGUgYWxwaGEgY2hhbm5lbCAtIGl0IGlzIG5vdAotcHJlLW11bHRpcGxpZWQgaW50byB0aGUgY29sb3IgY29tcG9uZW50cy4gIEluIGFkZGl0aW9uIHRoZSBjYWxsIHN0YXRlcwotdGhhdCB0aGUgb3V0cHV0IGlzIGZvciBhIHNSR0Igc3lzdGVtIGFuZCBjYXVzZXMgYWxsIFBORyBmaWxlcyB3aXRob3V0IGdBTUEKLWNodW5rcyB0byBiZSBhc3N1bWVkIHRvIGJlIGVuY29kZWQgdXNpbmcgc1JHQi4KLQotICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0dBTU1BX01BQyk7Ci0KLUluIHRoaXMgY2FzZSB0aGUgb3V0cHV0IGlzIGFzc3VtZWQgdG8gYmUgc29tZXRoaW5nIGxpa2UgYW4gc1JHQiBjb25mb3JtYW50Ci1kaXNwbGF5IHByZWNlZWRlZCBieSBhIHBvd2VyLWxhdyBsb29rdXAgdGFibGUgb2YgcG93ZXIgMS40NS4gIFRoaXMgaXMgaG93Ci1lYXJseSBNYWMgc3lzdGVtcyBiZWhhdmVkLgotCi0gICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfU1RBTkRBUkQsIFBOR19HQU1NQV9MSU5FQVIpOwotCi1UaGlzIGlzIHRoZSBjbGFzc2ljIEppbSBCbGlubiBhcHByb2FjaCBhbmQgd2lsbCB3b3JrIGluIGFjYWRlbWljCi1lbnZpcm9ubWVudHMgd2hlcmUgZXZlcnl0aGluZyBpcyBkb25lIGJ5IHRoZSBib29rLiAgSXQgaGFzIHRoZSBzaG9ydGNvbWluZwotb2YgYXNzdW1pbmcgdGhhdCBpbnB1dCBQTkcgZGF0YSB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIGlzIGxpbmVhciAtIHRoaXMKLWlzIHVubGlrZWx5IHRvIGJlIGNvcnJlY3QgdW5sZXNzIHRoZSBQTkcgZmlsZXMgd2hlcmUgZ2VuZXJhdGVkIGxvY2FsbHkuCi1Nb3N0IG9mIHRoZSB0aW1lIHRoZSBvdXRwdXQgcHJlY2lzaW9uIHdpbGwgYmUgc28gbG93IGFzIHRvIHNob3cKLXNpZ25pZmljYW50IGJhbmRpbmcgaW4gZGFyayBhcmVhcyBvZiB0aGUgaW1hZ2UuCi0KLSAgICBwbmdfc2V0X2V4cGFuZF8xNihwcCk7Ci0gICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfU1RBTkRBUkQsIFBOR19ERUZBVUxUX3NSR0IpOwotCi1UaGlzIGlzIGEgc29tZXdoYXQgbW9yZSByZWFsaXN0aWMgSmltIEJsaW5uIGluc3BpcmVkIGFwcHJvYWNoLiAgUE5HIGZpbGVzCi1hcmUgYXNzdW1lZCB0byBoYXZlIHRoZSBzUkdCIGVuY29kaW5nIGlmIG5vdCBtYXJrZWQgd2l0aCBhIGdhbW1hIHZhbHVlIGFuZAotdGhlIG91dHB1dCBpcyBhbHdheXMgMTYgYml0cyBwZXIgY29tcG9uZW50LiAgVGhpcyBwZXJtaXRzIGFjY3VyYXRlIHNjYWxpbmcKLWFuZCBwcm9jZXNzaW5nIG9mIHRoZSBkYXRhLiAgSWYgeW91IGtub3cgdGhhdCB5b3VyIGlucHV0IFBORyBmaWxlcyB3ZXJlCi1nZW5lcmF0ZWQgbG9jYWxseSB5b3UgbWlnaHQgbmVlZCB0byByZXBsYWNlIFBOR19ERUZBVUxUX3NSR0Igd2l0aCB0aGUKLWNvcnJlY3QgdmFsdWUgZm9yIHlvdXIgc3lzdGVtLgotCi0gICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfT1BUSU1JWkVELCBQTkdfREVGQVVMVF9zUkdCKTsKLQotSWYgeW91IGp1c3QgbmVlZCB0byBjb21wb3NpdGUgdGhlIFBORyBpbWFnZSBvbnRvIGFuIGV4aXN0aW5nIGJhY2tncm91bmQKLWFuZCBpZiB5b3UgY29udHJvbCB0aGUgY29kZSB0aGF0IGRvZXMgdGhpcyB5b3UgY2FuIHVzZSB0aGUgb3B0aW1pemF0aW9uCi1zZXR0aW5nLiAgSW4gdGhpcyBjYXNlIHlvdSBqdXN0IGNvcHkgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzIHRvIHRoZQotb3V0cHV0LiAgRm9yIHBpeGVscyB0aGF0IGFyZSBub3QgY29tcGxldGVseSB0cmFuc3BhcmVudCAoeW91IGp1c3Qgc2tpcAotdGhvc2UpIHlvdSBkbyB0aGUgY29tcG9zaXRpb24gbWF0aCB1c2luZyBwbmdfY29tcG9zaXRlIG9yIHBuZ19jb21wb3NpdGVfMTYKLWJlbG93IHRoZW4gZW5jb2RlIHRoZSByZXN1bHRhbnQgOC1iaXQgb3IgMTYtYml0IHZhbHVlcyB0byBtYXRjaCB0aGUgb3V0cHV0Ci1lbmNvZGluZy4KLQotICAgIE90aGVyIGNhc2VzCi0KLUlmIG5laXRoZXIgdGhlIFBORyBub3IgdGhlIHN0YW5kYXJkIGxpbmVhciBlbmNvZGluZyB3b3JrIGZvciB5b3UgYmVjYXVzZQotb2YgdGhlIHNvZnR3YXJlIG9yIGhhcmR3YXJlIHlvdSB1c2UgdGhlbiB5b3UgaGF2ZSBhIGJpZyBwcm9ibGVtLiAgVGhlIFBORwotY2FzZSB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBoYWxvcyBhcm91bmQgdGhlIGltYWdlLiAgVGhlIGxpbmVhciBlbmNvZGluZwotd2lsbCBwcm9iYWJseSByZXN1bHQgaW4gYSB3YXNoZWQgb3V0LCB0b28gYnJpZ2h0LCBpbWFnZSAoaXQncyBhY3R1YWxseSB0b28KLWNvbnRyYXN0eS4pICBUcnkgdGhlIEFMUEhBX09QVElNSVpFRCBtb2RlIGFib3ZlIC0gdGhpcyB3aWxsIHByb2JhYmx5Ci1zdWJzdGFudGlhbGx5IHJlZHVjZSB0aGUgaGFsb3MuICBBbHRlcm5hdGl2ZWx5IHRyeToKLQotICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX0JST0tFTiwgUE5HX0RFRkFVTFRfc1JHQik7Ci0KLVRoaXMgb3B0aW9uIHdpbGwgYWxzbyByZWR1Y2UgdGhlIGhhbG9zLCBidXQgdGhlcmUgd2lsbCBiZSBzbGlnaHQgZGFyawotaGFsb3Mgcm91bmQgdGhlIG9wYXF1ZSBwYXJ0cyBvZiB0aGUgaW1hZ2Ugd2hlcmUgdGhlIGJhY2tncm91bmQgaXMgbGlnaHQuCi1JbiB0aGUgT1BUSU1JWkVEIG1vZGUgdGhlIGhhbG9zIHdpbGwgYmUgbGlnaHQgaGFsb3Mgd2hlcmUgdGhlIGJhY2tncm91bmQKLWlzIGRhcmsuICBUYWtlIHlvdXIgcGljayAtIHRoZSBoYWxvcyBhcmUgdW5hdm9pZGFibGUgdW5sZXNzIHlvdSBjYW4gZ2V0Ci15b3VyIGhhcmR3YXJlL3NvZnR3YXJlIGZpeGVkISAgKFRoZSBPUFRJTUlaRUQgYXBwcm9hY2ggaXMgc2xpZ2h0bHkKLWZhc3Rlci4pCi0KLVdoZW4gdGhlIGRlZmF1bHQgZ2FtbWEgb2YgUE5HIGZpbGVzIGRvZXNuJ3QgbWF0Y2ggdGhlIG91dHB1dCBnYW1tYS4KLUlmIHlvdSBoYXZlIFBORyBmaWxlcyB3aXRoIG5vIGdhbW1hIGluZm9ybWF0aW9uIHBuZ19zZXRfYWxwaGFfbW9kZSBhbGxvd3MKLXlvdSB0byBwcm92aWRlIGEgZGVmYXVsdCBnYW1tYSwgYnV0IGl0IGFsc28gc2V0cyB0aGUgb3VwdXQgZ2FtbWEgdG8gdGhlCi1tYXRjaGluZyB2YWx1ZS4gIElmIHlvdSBrbm93IHlvdXIgUE5HIGZpbGVzIGhhdmUgYSBnYW1tYSB0aGF0IGRvZXNuJ3QKLW1hdGNoIHRoZSBvdXRwdXQgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0Ci1wbmdfc2V0X2FscGhhX21vZGUgYWx3YXlzIHNldHMgdGhlIG91dHB1dCBnYW1tYSBidXQgb25seSBzZXRzIHRoZSBQTkcKLWRlZmF1bHQgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0OgotCi0gICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfUE5HLCBQTkdfREVGQVVMVF9zUkdCKTsKLSAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19HQU1NQV9NQUMpOwotCi1UaGUgZmlyc3QgY2FsbCBzZXRzIGJvdGggdGhlIGRlZmF1bHQgYW5kIHRoZSBvdXRwdXQgZ2FtbWEgdmFsdWVzLCB0aGUKLXNlY29uZCBjYWxsIG92ZXJyaWRlcyB0aGUgb3V0cHV0IGdhbW1hIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGRlZmF1bHQuICBUaGlzCi1pcyBlYXNpZXIgdGhhbiBhY2hpZXZpbmcgdGhlIHNhbWUgZWZmZWN0IHdpdGggcG5nX3NldF9nYW1tYS4gIFlvdSBtdXN0IHVzZQotUE5HX0FMUEhBX1BORyBmb3IgdGhlIGZpcnN0IGNhbGwgLSBpbnRlcm5hbCBjaGVja2luZyBpbiBwbmdfc2V0X2FscGhhIHdpbGwKLWZpcmUgaWYgbW9yZSB0aGFuIG9uZSBjYWxsIHRvIHBuZ19zZXRfYWxwaGFfbW9kZSBhbmQgcG5nX3NldF9iYWNrZ3JvdW5kIGlzCi1tYWRlIGluIHRoZSBzYW1lIHJlYWQgb3BlcmF0aW9uLCBob3dldmVyIG11bHRpcGxlIGNhbGxzIHdpdGggUE5HX0FMUEhBX1BORwotYXJlIGlnbm9yZWQuCi0KLUlmIHlvdSBkb24ndCBuZWVkLCBvciBjYW4ndCBoYW5kbGUsIHRoZSBhbHBoYSBjaGFubmVsIHlvdSBjYW4gY2FsbAotcG5nX3NldF9iYWNrZ3JvdW5kKCkgdG8gcmVtb3ZlIGl0IGJ5IGNvbXBvc2l0aW5nIGFnYWluc3QgYSBmaXhlZCBjb2xvci4gIERvbid0Ci1jYWxsIHBuZ19zZXRfc3RyaXBfYWxwaGEoKSB0byBkbyB0aGlzIC0gaXQgd2lsbCBsZWF2ZSBzcHVyaW91cyBwaXhlbCB2YWx1ZXMgaW4KLXRyYW5zcGFyZW50IHBhcnRzIG9mIHRoaXMgaW1hZ2UuCi0KLSAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCAmYmFja2dyb3VuZF9jb2xvciwKLSAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAsIDEpOwotCi1UaGUgYmFja2dyb3VuZF9jb2xvciBpcyBhbiBSR0Igb3IgZ3JheXNjYWxlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgZGF0YSBmb3JtYXQKLWxpYnBuZyB3aWxsIHByb2R1Y2UgZm9yIHlvdS4gIEJlY2F1c2UgeW91IGRvbid0IHlldCBrbm93IHRoZSBmb3JtYXQgb2YgdGhlIFBORwotZmlsZSwgaWYgeW91IGNhbGwgcG5nX3NldF9iYWNrZ3JvdW5kIGF0IHRoaXMgcG9pbnQgeW91IG11c3QgYXJyYW5nZSBmb3IgdGhlCi1mb3JtYXQgcHJvZHVjZWQgYnkgbGlicG5nIHRvIGFsd2F5cyBoYXZlIDgtYml0IG9yIDE2LWJpdCBjb21wb25lbnRzIGFuZCB0aGVuCi1zdG9yZSB0aGUgY29sb3IgYXMgYW4gOC1iaXQgb3IgMTYtYml0IGNvbG9yIGFzIGFwcHJvcHJpYXRlLiAgVGhlIGNvbG9yIGNvbnRhaW5zCi1zZXBhcmF0ZSBncmF5IGFuZCBSR0IgY29tcG9uZW50IHZhbHVlcywgc28geW91IGNhbiBsZXQgbGlicG5nIHByb2R1Y2UgZ3JheSBvcgotUkdCIG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGZvcm1hdCwgYnV0IGxvdyBiaXQgZGVwdGggZ3JheXNjYWxlIGltYWdlcwotbXVzdCBhbHdheXMgYmUgY29udmVydGVkIHRvIGF0IGxlYXN0IDgtYml0IGZvcm1hdC4gIChFdmVuIHRob3VnaCBsb3cgYml0IGRlcHRoCi1ncmF5c2NhbGUgaW1hZ2VzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCB0aGV5IGNhbiBoYXZlIGEgdHJhbnNwYXJlbnQKLWNvbG9yISkKLQotWW91IHNldCB0aGUgdHJhbnNmb3JtcyB5b3UgbmVlZCBsYXRlciwgZWl0aGVyIGFzIGZsYWdzIHRvIHRoZSBoaWdoIGxldmVsCi1pbnRlcmZhY2Ugb3IgbGlicG5nIEFQSSBjYWxscyBmb3IgdGhlIGxvdyBsZXZlbCBpbnRlcmZhY2UuICBGb3IgcmVmZXJlbmNlIHRoZQotc2V0dGluZ3MgYW5kIEFQSSBjYWxscyByZXF1aXJlZCBhcmU6Ci0KLTgtYml0IHZhbHVlczoKLSAgIFBOR19UUkFOU0ZPUk1fU0NBTEVfMTYgfCBQTkdfRVhQQU5ECi0gICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKLQotICAgSWYgeW91IG11c3QgZ2V0IGV4YWN0bHkgdGhlIHNhbWUgaW5hY2N1cmF0ZSByZXN1bHRzCi0gICBwcm9kdWNlZCBieSBkZWZhdWx0IGluIHZlcnNpb25zIHByaW9yIHRvIGxpYnBuZy0xLjUuNCwKLSAgIHVzZSBQTkdfVFJBTlNGT1JNX1NUUklQXzE2IGFuZCBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpCi0gICBpbnN0ZWFkLgotCi0xNi1iaXQgdmFsdWVzOgotICAgUE5HX1RSQU5TRk9STV9FWFBBTkRfMTYKLSAgIHBuZ19zZXRfZXhwYW5kXzE2KHBuZ19wdHIpOwotCi1JbiBlaXRoZXIgY2FzZSBwYWxldHRlIGltYWdlIGRhdGEgd2lsbCBiZSBleHBhbmRlZCB0byBSR0IuICBJZiB5b3UganVzdCB3YW50Ci1jb2xvciBkYXRhIHlvdSBjYW4gYWRkIFBOR19UUkFOU0ZPUk1fR1JBWV9UT19SR0Igb3IgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKQotdG8gdGhlIGxpc3QuCi0KLUNhbGxpbmcgcG5nX3NldF9iYWNrZ3JvdW5kIGJlZm9yZSB0aGUgUE5HIGZpbGUgaGVhZGVyIGlzIHJlYWQgd2lsbCBub3Qgd29yawotcHJpb3IgdG8gbGlicG5nLTEuNS40LiAgQmVjYXVzZSB0aGUgZmFpbHVyZSBtYXkgcmVzdWx0IGluIHVuZXhwZWN0ZWQgd2FybmluZ3Mgb3IKLWVycm9ycyBpdCBpcyB0aGVyZWZvcmUgbXVjaCBzYWZlciB0byBjYWxsIHBuZ19zZXRfYmFja2dyb3VuZCBhZnRlciB0aGUgaGVhZCBoYXMKLWJlZW4gcmVhZC4gIFVuZm9ydHVuYXRlbHkgdGhpcyBtZWFucyB0aGF0IHByaW9yIHRvIGxpYnBuZy0xLjUuNCBpdCBjYW5ub3QgYmUKLXVzZWQgd2l0aCB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UuCi0KLVRoZSBoaWdoLWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUF0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKLXJlYWQgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHJlYWQgb3BlcmF0aW9ucy4KLVlvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiAoYSkgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQKLXRoZSBlbnRpcmUgaW1hZ2UgaW50byBtZW1vcnksIGFuZCAoYikgdGhlIGlucHV0IHRyYW5zZm9ybWF0aW9ucwoteW91IHdhbnQgdG8gZG8gYXJlIGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBzZXQ6Ci0KLSAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KLSAgICBQTkdfVFJBTlNGT1JNX1NDQUxFXzE2ICAgICAgU3RyaXAgMTYtYml0IHNhbXBsZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC1iaXQgYWNjdXJhdGVseQotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICBDaG9wIDE2LWJpdCBzYW1wbGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgtYml0IGxlc3MgYWNjdXJhdGVseQotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfQUxQSEEgICBEaXNjYXJkIHRoZSBhbHBoYSBjaGFubmVsCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIEV4cGFuZCAxLCAyIGFuZCA0LWJpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIHRvIGJ5dGVzCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAotICAgIFBOR19UUkFOU0ZPUk1fRVhQQU5EICAgICAgICBQZXJmb3JtIHNldF9leHBhbmQoKQotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAotICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRwotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKLSAgICBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCICAgRXhwYW5kIGdyYXlzY2FsZSBzYW1wbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFJHQiAob3IgR0EgdG8gUkdCQSkKLSAgICBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNiAgICAgRXhwYW5kIHNhbXBsZXMgdG8gMTYgYml0cwotCi0oVGhpcyBleGNsdWRlcyBzZXR0aW5nIGEgYmFja2dyb3VuZCBjb2xvciwgZG9pbmcgZ2FtbWEgdHJhbnNmb3JtYXRpb24sCi1xdWFudGl6aW5nLCBhbmQgc2V0dGluZyBmaWxsZXIuKSAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgc2ltcGx5IGRvIHRoaXM6Ci0KLSAgICBwbmdfcmVhZF9wbmcocG5nX3B0ciwgaW5mb19wdHIsIHBuZ190cmFuc2Zvcm1zLCBOVUxMKQotCi13aGVyZSBwbmdfdHJhbnNmb3JtcyBpcyBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygc29tZQotc2V0IG9mIHRyYW5zZm9ybWF0aW9uIGZsYWdzLiAgVGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gcG5nX3JlYWRfaW5mbygpLAotZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKLXRoZW4gcG5nX3JlYWRfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3JlYWRfZW5kKCkuCi0KLShUaGUgZmluYWwgcGFyYW1ldGVyIG9mIHRoaXMgY2FsbCBpcyBub3QgeWV0IHVzZWQuICBTb21lZGF5IGl0IG1pZ2h0IHBvaW50Ci10byB0cmFuc2Zvcm1hdGlvbiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHNvbWUgZnV0dXJlIGlucHV0IHRyYW5zZm9ybS4pCi0KLVlvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCi13aGVuIHlvdSB1c2UgcG5nX3JlYWRfcG5nKCkuCi0KLUFmdGVyIHlvdSBoYXZlIGNhbGxlZCBwbmdfcmVhZF9wbmcoKSwgeW91IGNhbiByZXRyaWV2ZSB0aGUgaW1hZ2UgZGF0YQotd2l0aAotCi0gICByb3dfcG9pbnRlcnMgPSBwbmdfZ2V0X3Jvd3MocG5nX3B0ciwgaW5mb19wdHIpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBpeGVsIGRhdGEgZm9yIGVhY2ggcm93OgotCi0gICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07Ci0KLUlmIHlvdSBrbm93IHlvdXIgaW1hZ2Ugc2l6ZSBhbmQgcGl4ZWwgc2l6ZSBhaGVhZCBvZiB0aW1lLCB5b3UgY2FuIGFsbG9jYXRlCi1yb3dfcG9pbnRlcnMgcHJpb3IgdG8gY2FsbGluZyBwbmdfcmVhZF9wbmcoKSB3aXRoCi0KLSAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMl9NQVgvKHNpemVvZiAocG5nX2J5dGUpKSkKLSAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKLSAgICAgICAgICAiSW1hZ2UgaXMgdG9vIHRhbGwgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKLQotICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCi0gICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCi0gICAgICAgICAgIkltYWdlIGlzIHRvbyB3aWRlIHRvIHByb2Nlc3MgaW4gbWVtb3J5Iik7Ci0KLSAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICBoZWlnaHQqKHNpemVvZiAocG5nX2J5dGVwKSkpOwotCi0gICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCi0gICAgICByb3dfcG9pbnRlcnNbaV09TlVMTDsgIC8qIHNlY3VyaXR5IHByZWNhdXRpb24gKi8KLQotICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQotICAgICAgcm93X3BvaW50ZXJzW2ldPXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICB3aWR0aCpwaXhlbF9zaXplKTsKLQotICAgcG5nX3NldF9yb3dzKHBuZ19wdHIsIGluZm9fcHRyLCAmcm93X3BvaW50ZXJzKTsKLQotQWx0ZXJuYXRpdmVseSB5b3UgY291bGQgYWxsb2NhdGUgeW91ciBpbWFnZSBpbiBvbmUgYmlnIGJsb2NrIGFuZCBkZWZpbmUKLXJvd19wb2ludGVyc1tpXSB0byBwb2ludCBpbnRvIHRoZSBwcm9wZXIgcGxhY2VzIGluIHlvdXIgYmxvY2suCi0KLUlmIHlvdSB1c2UgcG5nX3NldF9yb3dzKCksIHRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZwotcm93X3BvaW50ZXJzIChhbmQgcm93X3BvaW50ZXJzW2ldLCBpZiB0aGV5IHdlcmUgc2VwYXJhdGVseSBhbGxvY2F0ZWQpLgotCi1JZiB5b3UgZG9uJ3QgYWxsb2NhdGUgcm93X3BvaW50ZXJzIGFoZWFkIG9mIHRpbWUsIHBuZ19yZWFkX3BuZygpIHdpbGwKLWRvIGl0LCBhbmQgaXQnbGwgYmUgZnJlZSdlZCBieSBsaWJwbmcgd2hlbiB5b3UgY2FsbCBwbmdfZGVzdHJveV8qKCkuCi0KLVRoZSBsb3ctbGV2ZWwgcmVhZCBpbnRlcmZhY2UKLQotSWYgeW91IGFyZSBnb2luZyB0aGUgbG93LWxldmVsIHJvdXRlLCB5b3UgYXJlIG5vdyByZWFkeSB0byByZWFkIGFsbAotdGhlIGZpbGUgaW5mb3JtYXRpb24gdXAgdG8gdGhlIGFjdHVhbCBpbWFnZSBkYXRhLiAgWW91IGRvIHRoaXMgd2l0aCBhCi1jYWxsIHRvIHBuZ19yZWFkX2luZm8oKS4KLQotICAgIHBuZ19yZWFkX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi1UaGlzIHdpbGwgcHJvY2VzcyBhbGwgY2h1bmtzIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBpbWFnZSBkYXRhLgotCi1UaGlzIGFsc28gY29waWVzIHNvbWUgb2YgdGhlIGRhdGEgZnJvbSB0aGUgUE5HIGZpbGUgaW50byB0aGUgZGVjb2RlIHN0cnVjdHVyZQotZm9yIHVzZSBpbiBsYXRlciB0cmFuc2Zvcm1hdGlvbnMuICBJbXBvcnRhbnQgaW5mb3JtYXRpb24gY29waWVkIGluIGlzOgotCi0xKSBUaGUgUE5HIGZpbGUgZ2FtbWEgZnJvbSB0aGUgZ0FNQSBjaHVuay4gIFRoaXMgb3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB2YWx1ZQotcHJvdmlkZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIHBuZ19zZXRfZ2FtbWEgb3IgcG5nX3NldF9hbHBoYV9tb2RlLgotCi0yKSBQcmlvciB0byBsaWJwbmctMS41LjQgdGhlIGJhY2tncm91bmQgY29sb3IgZnJvbSBhIGJLR2QgY2h1bmsuICBUaGlzCi1kYW1hZ2VzIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8gcG5nX3NldF9iYWNrZ3JvdW5kCi1yZXN1bHRpbmcgaW4gdW5leHBlY3RlZCBiZWhhdmlvci4gIExpYnBuZy0xLjUuNCBubyBsb25nZXIgZG9lcyB0aGlzLgotCi0zKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgaW4gZWFjaCBjb21wb25lbnQgdmFsdWUuICBMaWJwbmcgdXNlcyB0aGlzIHRvCi1vcHRpbWl6ZSBnYW1tYSBoYW5kbGluZyBieSByZWR1Y2luZyB0aGUgaW50ZXJuYWwgbG9va3VwIHRhYmxlIHNpemVzLgotCi00KSBUaGUgdHJhbnNwYXJlbnQgY29sb3IgaW5mb3JtYXRpb24gZnJvbSBhIHRSTlMgY2h1bmsuICBUaGlzIGNhbiBiZSBtb2RpZmllZCBieQotYSBsYXRlciBjYWxsIHRvIHBuZ19zZXRfdFJOUy4KLQotUXVlcnlpbmcgdGhlIGluZm8gc3RydWN0dXJlCi0KLUZ1bmN0aW9ucyBhcmUgdXNlZCB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGluZm9fcHRyIG9uY2UgaXQKLWhhcyBiZWVuIHJlYWQuICBOb3RlIHRoYXQgdGhlc2UgZmllbGRzIG1heSBub3QgYmUgY29tcGxldGVseSBmaWxsZWQKLWluIHVudGlsIHBuZ19yZWFkX2VuZCgpIGhhcyByZWFkIHRoZSBjaHVuayBkYXRhIGZvbGxvd2luZyB0aGUgaW1hZ2UuCi0KLSAgICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwKLSAgICAgICAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZV90eXBlLAotICAgICAgICZjb21wcmVzc2lvbl90eXBlLCAmZmlsdGVyX21ldGhvZCk7Ci0KLSAgICB3aWR0aCAgICAgICAgICAtIGhvbGRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCi0KLSAgICBoZWlnaHQgICAgICAgICAtIGhvbGRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotCi0gICAgYml0X2RlcHRoICAgICAgLSBob2xkcyB0aGUgYml0IGRlcHRoIG9mIG9uZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGltYWdlIGNoYW5uZWxzLiAgKHZhbGlkIHZhbHVlcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDQsIDgsIDE2IGFuZCBkZXBlbmQgYWxzbyBvbgotICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbG9yX3R5cGUuICBTZWUgYWxzbwotICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0cyAoc0JJVCkgYmVsb3cpLgotCi0gICAgY29sb3JfdHlwZSAgICAgLSBkZXNjcmliZXMgd2hpY2ggY29sb3IvYWxwaGEgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJlc2VudC4KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVkKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0NPTE9SCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19BTFBIQQotCi0gICAgaW50ZXJsYWNlX3R5cGUgLSAoUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03KQotCi0gICAgY29tcHJlc3Npb25fdHlwZSAtIChtdXN0IGJlIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UKLSAgICAgICAgICAgICAgICAgICAgIGZvciBQTkcgMS4wKQotCi0gICAgZmlsdGVyX21ldGhvZCAgLSAobXVzdCBiZSBQTkdfRklMVEVSX1RZUEVfQkFTRQotICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjAsIGFuZCBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HIGlmCi0gICAgICAgICAgICAgICAgICAgICB0aGUgUE5HIGRhdGFzdHJlYW0gaXMgZW1iZWRkZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgIGEgTU5HLTEuMCBkYXRhc3RyZWFtKQotCi0gICAgQW55IG9mIHdpZHRoLCBoZWlnaHQsIGNvbG9yX3R5cGUsIGJpdF9kZXB0aCwKLSAgICBpbnRlcmxhY2VfdHlwZSwgY29tcHJlc3Npb25fdHlwZSwgb3IgZmlsdGVyX21ldGhvZCBjYW4KLSAgICBiZSBOVUxMIGlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlaXIgdmFsdWVzLgotCi0gICAgTm90ZSB0aGF0IHBuZ19nZXRfSUhEUigpIHJldHVybnMgMzItYml0IGRhdGEgaW50bwotICAgIHRoZSBhcHBsaWNhdGlvbidzIHdpZHRoIGFuZCBoZWlnaHQgdmFyaWFibGVzLgotICAgIFRoaXMgaXMgYW4gdW5zYWZlIHNpdHVhdGlvbiBpZiB0aGVzZSBhcmUgbm90IHBuZ191aW50XzMyCi0gICAgdmFyaWFibGVzLiAgSW4gc3VjaCBzaXR1YXRpb25zLCB0aGUKLSAgICBwbmdfZ2V0X2ltYWdlX3dpZHRoKCkgYW5kIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KCkKLSAgICBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IGFyZSBzYWZlci4KLQotICAgIHdpZHRoICAgICAgICAgICAgPSBwbmdfZ2V0X2ltYWdlX3dpZHRoKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgaGVpZ2h0ICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2VfaGVpZ2h0KHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgYml0X2RlcHRoICAgICAgICA9IHBuZ19nZXRfYml0X2RlcHRoKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgY29sb3JfdHlwZSAgICAgICA9IHBuZ19nZXRfY29sb3JfdHlwZShwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLQotICAgIGludGVybGFjZV90eXBlICAgPSBwbmdfZ2V0X2ludGVybGFjZV90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgY29tcHJlc3Npb25fdHlwZSA9IHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZShwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fcHRyKTsKLQotICAgIGZpbHRlcl9tZXRob2QgICAgPSBwbmdfZ2V0X2ZpbHRlcl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgY2hhbm5lbHMgPSBwbmdfZ2V0X2NoYW5uZWxzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgIGNoYW5uZWxzICAgICAgIC0gbnVtYmVyIG9mIGNoYW5uZWxzIG9mIGluZm8gZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgY29sb3IgdHlwZSAodmFsaWQgdmFsdWVzIGFyZSAxIChHUkFZLAotICAgICAgICAgICAgICAgICAgICAgUEFMRVRURSksIDIgKEdSQVlfQUxQSEEpLCAzIChSR0IpLAotICAgICAgICAgICAgICAgICAgICAgNCAoUkdCX0FMUEhBIG9yIFJHQiArIGZpbGxlciBieXRlKSkKLQotICAgIHJvd2J5dGVzID0gcG5nX2dldF9yb3dieXRlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICByb3dieXRlcyAgICAgICAtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIHJvdwotCi0gICAgc2lnbmF0dXJlID0gcG5nX2dldF9zaWduYXR1cmUocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgc2lnbmF0dXJlICAgICAgLSBob2xkcyB0aGUgc2lnbmF0dXJlIHJlYWQgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgKGlmIGFueSkuICBUaGUgZGF0YSBpcyBrZXB0IGluCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBvZmZzZXQgaXQgd291bGQgYmUgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICB3aG9sZSBzaWduYXR1cmUgd2VyZSByZWFkIChpLmUuIGlmIGFuCi0gICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBoYWQgYWxyZWFkeSByZWFkIGluIDQKLSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIHNpZ25hdHVyZSBiZWZvcmUgc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAgICAgIGxpYnBuZywgdGhlIHJlbWFpbmluZyA0IGJ5dGVzIHdvdWxkCi0gICAgICAgICAgICAgICAgICAgICBiZSBpbiBzaWduYXR1cmVbNF0gdGhyb3VnaCBzaWduYXR1cmVbN10KLSAgICAgICAgICAgICAgICAgICAgIChzZWUgcG5nX3NldF9zaWdfYnl0ZXMoKSkpLgotCi1UaGVzZSBhcmUgYWxzbyBpbXBvcnRhbnQsIGJ1dCB0aGVpciB2YWxpZGl0eSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNodW5rCi1oYXMgYmVlbiByZWFkLiAgVGhlIHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPXzxjaHVuaz4pIGFuZAotcG5nX2dldF88Y2h1bms+KHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pIGZ1bmN0aW9ucyByZXR1cm4gbm9uLXplcm8gaWYgdGhlCi1kYXRhIGhhcyBiZWVuIHJlYWQsIG9yIHplcm8gaWYgaXQgaXMgbWlzc2luZy4gIFRoZSBwYXJhbWV0ZXJzIHRvIHRoZQotcG5nX2dldF88Y2h1bms+IGFyZSBzZXQgZGlyZWN0bHkgaWYgdGhleSBhcmUgc2ltcGxlIGRhdGEgdHlwZXMsIG9yIGEKLXBvaW50ZXIgaW50byB0aGUgaW5mb19wdHIgaXMgcmV0dXJuZWQgZm9yIGFueSBjb21wbGV4IHR5cGVzLgotCi1UaGUgY29sb3JzcGFjZSBkYXRhIGZyb20gZ0FNQSwgY0hSTSwgc1JHQiwgaUNDUCwgYW5kIHNCSVQgY2h1bmtzCi1pcyBzaW1wbHkgcmV0dXJuZWQgdG8gZ2l2ZSB0aGUgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZQotaW1hZ2Ugd2FzIGVuY29kZWQuICBMaWJwbmcgaXRzZWxmIG9ubHkgZG9lcyB0cmFuc2Zvcm1hdGlvbnMgdXNpbmcgdGhlIGZpbGUKLWdhbW1hIHdoZW4gY29tYmluaW5nIHNlbWl0cmFuc3BhcmVudCBwaXhlbHMgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciwgYW5kLAotc2luY2UgbGlicG5nLTEuNi4wLCB3aGVuIGNvbnZlcnRpbmcgYmV0d2VlbiA4LWJpdCBzUkdCIGFuZCAxNi1iaXQgbGluZWFyIHBpeGVscwotd2l0aGluIHRoZSBzaW1wbGlmaWVkIEFQSS4gIExpYnBuZyBhbHNvIHVzZXMgdGhlIGZpbGUgZ2FtbWEgd2hlbiBjb252ZXJ0aW5nCi1SR0IgdG8gZ3JheSwgYmVnaW5uaW5nIHdpdGggbGlicG5nLTEuMC41LCBpZiB0aGUgYXBwbGljYXRpb24gY2FsbHMKLXBuZ19zZXRfcmdiX3RvX2dyYXkoKSkuCi0KLSAgICBwbmdfZ2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsICZwYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgJm51bV9wYWxldHRlKTsKLQotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotCi0gICAgbnVtX3BhbGV0dGUgICAgLSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZQotCi0gICAgcG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZmlsZV9nYW1tYSk7Ci0gICAgcG5nX2dldF9nQU1BX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCAmaW50X2ZpbGVfZ2FtbWEpOwotCi0gICAgZmlsZV9nYW1tYSAgICAgLSB0aGUgZ2FtbWEgYXQgd2hpY2ggdGhlIGZpbGUgaXMKLSAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gKFBOR19JTkZPX2dBTUEpCi0KLSAgICBpbnRfZmlsZV9nYW1tYSAtIDEwMCwwMDAgdGltZXMgdGhlIGdhbW1hIGF0IHdoaWNoIHRoZQotICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyB3cml0dGVuCi0KLSAgICBwbmdfZ2V0X2NIUk0ocG5nX3B0ciwgaW5mb19wdHIsICAmd2hpdGVfeCwgJndoaXRlX3ksICZyZWRfeCwKLSAgICAgICAgICAgICAgICAgICAgICZyZWRfeSwgJmdyZWVuX3gsICZncmVlbl95LCAmYmx1ZV94LCAmYmx1ZV95KQotICAgIHBuZ19nZXRfY0hSTV9YWVoocG5nX3B0ciwgaW5mb19wdHIsICZyZWRfWCwgJnJlZF9ZLCAmcmVkX1osCi0gICAgICAgICAgICAgICAgICAgICAmZ3JlZW5fWCwgJmdyZWVuX1ksICZncmVlbl9aLCAmYmx1ZV9YLCAmYmx1ZV9ZLAotICAgICAgICAgICAgICAgICAgICAgJmJsdWVfWikKLSAgICBwbmdfZ2V0X2NIUk1fZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsICZpbnRfd2hpdGVfeCwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRfd2hpdGVfeSwgJmludF9yZWRfeCwgJmludF9yZWRfeSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRfZ3JlZW5feCwgJmludF9ncmVlbl95LCAmaW50X2JsdWVfeCwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRfYmx1ZV95KQotICAgIHBuZ19nZXRfY0hSTV9YWVpfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsICZpbnRfcmVkX1gsICZpbnRfcmVkX1ksCi0gICAgICAgICAgICAgICAgICAgICAmaW50X3JlZF9aLCAmaW50X2dyZWVuX1gsICZpbnRfZ3JlZW5fWSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRfZ3JlZW5fWiwgJmludF9ibHVlX1gsICZpbnRfYmx1ZV9ZLAotICAgICAgICAgICAgICAgICAgICAgJmludF9ibHVlX1opCi0KLSAgICB7d2hpdGUscmVkLGdyZWVuLGJsdWV9X3t4LHl9Ci0gICAgICAgICAgICAgICAgICAgICBBIGNvbG9yIHNwYWNlIGVuY29kaW5nIHNwZWNpZmllZCB1c2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGNocm9tYXRpY2l0aWVzIG9mIHRoZSBlbmQgcG9pbnRzIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHdoaXRlIHBvaW50LiAoUE5HX0lORk9fY0hSTSkKLQotICAgIHtyZWQsZ3JlZW4sYmx1ZX1fe1gsWSxafQotICAgICAgICAgICAgICAgICAgICAgQSBjb2xvciBzcGFjZSBlbmNvZGluZyBzcGVjaWZpZWQgdXNpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyBlbmQgcG9pbnRzIC0gdGhlIENJRSB0cmlzdGltdWx1cwotICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW50ZW5kZWQgY29sb3Igb2YgdGhlIHJlZCwKLSAgICAgICAgICAgICAgICAgICAgIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzIGluIHRoZSBQTkcgUkdCIGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICBUaGUgd2hpdGUgcG9pbnQgaXMgc2ltcGx5IHRoZSBzdW0gb2YgdGhlIHRocmVlCi0gICAgICAgICAgICAgICAgICAgICBlbmQgcG9pbnRzLiAoUE5HX0lORk9fY0hSTSkKLQotICAgIHBuZ19nZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgJnNyZ2JfaW50ZW50KTsKLQotICAgIHNyZ2JfaW50ZW50IC0gICAgdGhlIHJlbmRlcmluZyBpbnRlbnQgKFBOR19JTkZPX3NSR0IpCi0gICAgICAgICAgICAgICAgICAgICBUaGUgcHJlc2VuY2Ugb2YgdGhlIHNSR0IgY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlIHBpeGVsIGRhdGEgaXMgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNvbG9yIHNwYWNlLiAgVGhpcyBjaHVuayBhbHNvCi0gICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHNwZWNpZmljIHZhbHVlcyBvZiBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTS4KLQotICAgIHBuZ19nZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgJm5hbWUsCi0gICAgICAgJmNvbXByZXNzaW9uX3R5cGUsICZwcm9maWxlLCAmcHJvZmxlbik7Ci0KLSAgICBuYW1lICAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KLQotICAgIGNvbXByZXNzaW9uX3R5cGUgLSBUaGUgY29tcHJlc3Npb24gdHlwZTsgYWx3YXlzCi0gICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlIGl0LgotCi0gICAgcHJvZmlsZSAgICAgICAgICAtIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBjb2xvcgotICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCi0KLSAgICBwcm9mbGVuICAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KLQotICAgIHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotCi0gICAgc2lnX2JpdCAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc0JJVCkgZWFjaCBvZiB0aGUgZ3JheSwKLSAgICAgICAgICAgICAgICAgICAgIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgd2hpY2hldmVyIGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBnaXZlbiBjb2xvciB0eXBlIChwbmdfY29sb3JfMTYpCi0KLSAgICBwbmdfZ2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsICZ0cmFuc19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICZudW1fdHJhbnMsICZ0cmFuc19jb2xvcik7Ci0KLSAgICB0cmFuc19hbHBoYSAgICAtIGFycmF5IG9mIGFscGhhICh0cmFuc3BhcmVuY3kpCi0gICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGZvciBwYWxldHRlIChQTkdfSU5GT190Uk5TKQotCi0gICAgbnVtX3RyYW5zICAgICAgLSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgZW50cmllcwotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3RSTlMpCi0KLSAgICB0cmFuc19jb2xvciAgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzIG9mCi0gICAgICAgICAgICAgICAgICAgICB0aGUgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgotICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKLQotICAgIHBuZ19nZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgJmhpc3QpOwotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX2hJU1QpCi0KLSAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpCi0KLSAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZtb2RfdGltZSk7Ci0KLSAgICBtb2RfdGltZSAgICAgICAtIHRpbWUgaW1hZ2Ugd2FzIGxhc3QgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQotCi0gICAgcG5nX2dldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCAmYmFja2dyb3VuZCk7Ci0KLSAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKG9mIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNnApIChQTkdfVkFMSURfYktHRCkKLSAgICAgICAgICAgICAgICAgICAgIHZhbGlkIDE2LWJpdCByZWQsIGdyZWVuIGFuZCBibHVlCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlZ2FyZGxlc3Mgb2YgY29sb3JfdHlwZQotCi0gICAgbnVtX2NvbW1lbnRzICAgPSBwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAmdGV4dF9wdHIsICZudW1fdGV4dCk7Ci0KLSAgICBudW1fY29tbWVudHMgICAtIG51bWJlciBvZiBjb21tZW50cwotCi0gICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBjb21tZW50cwotCi0gICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKLQotICAgIHRleHRfcHRyW2ldLmtleSAgIC0ga2V5d29yZCBmb3IgY29tbWVudC4gIE11c3QgY29udGFpbgotICAgICAgICAgICAgICAgICAgICAgICAgIDEtNzkgY2hhcmFjdGVycy4KLQotICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgZW1wdHkuCi0KLSAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAotCi0gICAgdGV4dF9wdHJbaV0uaXR4dF9sZW5ndGggLSBsZW5ndGggb2YgaXR4dCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIHRFWHQvelRYdAotCi0gICAgdGV4dF9wdHJbaV0ubGFuZyAgLSBsYW5ndWFnZSBvZiBjb21tZW50IChlbXB0eQotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmb3IgdW5rbm93bikuCi0KLSAgICB0ZXh0X3B0cltpXS5sYW5nX2tleSAgLSBrZXl3b3JkIGluIFVURi04Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKGVtcHR5IHN0cmluZyBmb3IgdW5rbm93bikuCi0KLSAgICBOb3RlIHRoYXQgdGhlIGl0eHRfbGVuZ3RoLCBsYW5nLCBhbmQgbGFuZ19rZXkKLSAgICBtZW1iZXJzIG9mIHRoZSB0ZXh0X3B0ciBzdHJ1Y3R1cmUgb25seSBleGlzdCB3aGVuIHRoZQotICAgIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBpVFh0IGNodW5rIHN1cHBvcnQuICBQcmlvciB0bwotICAgIGxpYnBuZy0xLjQuMCB0aGUgbGlicmFyeSB3YXMgYnVpbHQgYnkgZGVmYXVsdCB3aXRob3V0Ci0gICAgaVRYdCBzdXBwb3J0LiBBbHNvIG5vdGUgdGhhdCB3aGVuIGlUWHQgaXMgc3VwcG9ydGVkLAotICAgIHRoZXkgY29udGFpbiBOVUxMIHBvaW50ZXJzIHdoZW4gdGhlICJjb21wcmVzc2lvbiIKLSAgICBmaWVsZCBjb250YWlucyBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yCi0gICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdC4KLQotICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzIChzYW1lIGFzCi0gICAgICAgICAgICAgICAgICAgICBudW1fY29tbWVudHM7IHlvdSBjYW4gcHV0IE5VTEwgaGVyZQotICAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIGR1cGxpY2F0aW9uKQotCi0gICAgTm90ZSB3aGlsZSBwbmdfc2V0X3RleHQoKSB3aWxsIGFjY2VwdCB0ZXh0LCBsYW5ndWFnZSwKLSAgICBhbmQgdHJhbnNsYXRlZCBrZXl3b3JkcyB0aGF0IGNhbiBiZSBOVUxMIHBvaW50ZXJzLCB0aGUKLSAgICBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgcG5nX2dldF90ZXh0IHdpbGwgYWx3YXlzIGNvbnRhaW4KLSAgICByZWd1bGFyIHplcm8tdGVybWluYXRlZCBDIHN0cmluZ3MuICBUaGV5IG1pZ2h0IGJlCi0gICAgZW1wdHkgc3RyaW5ncyBidXQgdGhleSB3aWxsIG5ldmVyIGJlIE5VTEwgcG9pbnRlcnMuCi0KLSAgICBudW1fc3BhbGV0dGVzID0gcG5nX2dldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICZwYWxldHRlX3B0cik7Ci0KLSAgICBudW1fc3BhbGV0dGVzICAtIG51bWJlciBvZiBzUExUIGNodW5rcyByZWFkLgotCi0gICAgcGFsZXR0ZV9wdHIgICAgLSBhcnJheSBvZiBwYWxldHRlIHN0cnVjdHVyZXMgaG9sZGluZwotICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgb2Ygb25lIG9yIG1vcmUgc1BMVCBjaHVua3MKLSAgICAgICAgICAgICAgICAgICAgIHJlYWQuCi0KLSAgICBwbmdfZ2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsICZvZmZzZXRfeCwgJm9mZnNldF95LAotICAgICAgICZ1bml0X3R5cGUpOwotCi0gICAgb2Zmc2V0X3ggICAgICAgLSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgbGVmdCBlZGdlCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuIChjYW4gYmUgbmVnYXRpdmUpCi0KLSAgICBvZmZzZXRfeSAgICAgICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSB0b3AgZWRnZQotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNjcmVlbiAoY2FuIGJlIG5lZ2F0aXZlKQotCi0gICAgdW5pdF90eXBlICAgICAgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKLQotICAgIHBuZ19nZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksCi0gICAgICAgJnVuaXRfdHlwZSk7Ci0KLSAgICByZXNfeCAgICAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24gaW4KLSAgICAgICAgICAgICAgICAgICAgIHggZGlyZWN0aW9uCi0KLSAgICByZXNfeSAgICAgICAgICAtIHBpeGVscy91bml0IHBoeXNpY2FsIHJlc29sdXRpb24gaW4KLSAgICAgICAgICAgICAgICAgICAgIHggZGlyZWN0aW9uCi0KLSAgICB1bml0X3R5cGUgICAgICAtIFBOR19SRVNPTFVUSU9OX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICBQTkdfUkVTT0xVVElPTl9NRVRFUgotCi0gICAgcG5nX2dldF9zQ0FMKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5pdCwgJndpZHRoLAotICAgICAgICZoZWlnaHQpCi0KLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0KLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQotCi0gICAgcG5nX2dldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCi0gICAgICAgJmhlaWdodCkKLQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0KLSAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgIChleHByZXNzZWQgYXMgYSBzdHJpbmcpCi0KLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzdHJpbmdzIGxpa2UgIjIuNTQiKQotCi0gICAgbnVtX3Vua25vd25fY2h1bmtzID0gcG5nX2dldF91bmtub3duX2NodW5rcyhwbmdfcHRyLAotICAgICAgIGluZm9fcHRyLCAmdW5rbm93bnMpCi0KLSAgICB1bmtub3ducyAgICAgICAgICAtIGFycmF5IG9mIHBuZ191bmtub3duX2NodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGhvbGRpbmcgdW5rbm93biBjaHVua3MKLQotICAgIHVua25vd25zW2ldLm5hbWUgIC0gbmFtZSBvZiB1bmtub3duIGNodW5rCi0KLSAgICB1bmtub3duc1tpXS5kYXRhICAtIGRhdGEgb2YgdW5rbm93biBjaHVuawotCi0gICAgdW5rbm93bnNbaV0uc2l6ZSAgLSBzaXplIG9mIHVua25vd24gY2h1bmsncyBkYXRhCi0KLSAgICB1bmtub3duc1tpXS5sb2NhdGlvbiAtIHBvc2l0aW9uIG9mIGNodW5rIGluIGZpbGUKLQotICAgIFRoZSB2YWx1ZSBvZiAiaSIgY29ycmVzcG9uZHMgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZQotICAgIGNodW5rcyB3ZXJlIHJlYWQgZnJvbSB0aGUgUE5HIGZpbGUgb3IgaW5zZXJ0ZWQgd2l0aCB0aGUKLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKCkgZnVuY3Rpb24uCi0KLSAgICBUaGUgdmFsdWUgb2YgImxvY2F0aW9uIiBpcyBhIGJpdHdpc2UgIm9yIiBvZgotCi0gICAgICAgICBQTkdfSEFWRV9JSERSICAoMHgwMSkKLSAgICAgICAgIFBOR19IQVZFX1BMVEUgICgweDAyKQotICAgICAgICAgUE5HX0FGVEVSX0lEQVQgKDB4MDgpCi0KLVRoZSBkYXRhIGZyb20gdGhlIHBIWXMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKLWZvcm1zOgotCi0gICAgcmVzX3ggPSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotCi0gICAgcmVzX3kgPSBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotCi0gICAgcmVzX3hfYW5kX3kgPSBwbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLQotICAgIHJlc194ID0gcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaChwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotCi0gICAgcmVzX3kgPSBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0KLSAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0KLSAgICBhc3BlY3RfcmF0aW8gPSBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpbyhwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotCi0gICAgRWFjaCBvZiB0aGVzZSByZXR1cm5zIDAgW3NpZ25pZnlpbmcgInVua25vd24iXSBpZgotICAgICAgIHRoZSBkYXRhIGlzIG5vdCBwcmVzZW50IG9yIGlmIHJlc194IGlzIDA7Ci0gICAgICAgcmVzX3hfYW5kX3kgaXMgMCBpZiByZXNfeCAhPSByZXNfeQotCi0gICAgTm90ZSB0aGF0IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgcmVzb2x1dGlvbnMgYXJlCi0gICAgICAgc3RvcmVkIGludGVybmFsbHksIHRoZSBpbmNoIGNvbnZlcnNpb25zIHdvbid0Ci0gICAgICAgY29tZSBvdXQgdG8gZXhhY3RseSBldmVuIG51bWJlci4gIEZvciBleGFtcGxlLAotICAgICAgIDcyIGRwaSBpcyBzdG9yZWQgYXMgMC4yODM0NiBwaXhlbHMvbWV0ZXIsIGFuZAotICAgICAgIHdoZW4gdGhpcyBpcyByZXRyaWV2ZWQgaXQgaXMgNzEuOTk4OCBkcGksIHNvCi0gICAgICAgYmUgc3VyZSB0byByb3VuZCB0aGUgcmV0dXJuZWQgdmFsdWUgYXBwcm9wcmlhdGVseQotICAgICAgIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgYSByZWFzb25hYmxlLWxvb2tpbmcgcmVzdWx0LgotCi1UaGUgZGF0YSBmcm9tIHRoZSBvRkZzIGNodW5rIGNhbiBiZSByZXRyaWV2ZWQgaW4gc2V2ZXJhbCBjb252ZW5pZW50Ci1mb3JtczoKLQotICAgIHhfb2Zmc2V0ID0gcG5nX2dldF94X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgIHlfb2Zmc2V0ID0gcG5nX2dldF95X29mZnNldF9taWNyb25zKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgIHhfb2Zmc2V0ID0gcG5nX2dldF94X29mZnNldF9pbmNoZXMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgeV9vZmZzZXQgPSBwbmdfZ2V0X3lfb2Zmc2V0X2luY2hlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICBFYWNoIG9mIHRoZXNlIHJldHVybnMgMCBbc2lnbmlmeWluZyAidW5rbm93biIgaWYgYm90aAotICAgICAgIHggYW5kIHkgYXJlIDBdIGlmIHRoZSBkYXRhIGlzIG5vdCBwcmVzZW50IG9yIGlmIHRoZQotICAgICAgIGNodW5rIGlzIHByZXNlbnQgYnV0IHRoZSB1bml0IGlzIHRoZSBwaXhlbC4gIFRoZQotICAgICAgIHJlbWFyayBhYm91dCBpbmV4YWN0IGluY2ggY29udmVyc2lvbnMgYXBwbGllcyBoZXJlCi0gICAgICAgYXMgd2VsbCwgYmVjYXVzZSBhIHZhbHVlIGluIGluY2hlcyBjYW4ndCBhbHdheXMgYmUKLSAgICAgICBjb252ZXJ0ZWQgdG8gbWljcm9ucyBhbmQgYmFjayB3aXRob3V0IHNvbWUgbG9zcwotICAgICAgIG9mIHByZWNpc2lvbi4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUKLVBORyBzcGVjaWZpY2F0aW9uIGZvciBjaHVuayBjb250ZW50cy4gIEJlIGNhcmVmdWwgd2l0aCB0cnVzdGluZwotcm93Ynl0ZXMsIGFzIHNvbWUgb2YgdGhlIHRyYW5zZm9ybWF0aW9ucyBjb3VsZCBpbmNyZWFzZSB0aGUgc3BhY2UKLW5lZWRlZCB0byBob2xkIGEgcm93IChleHBhbmQsIGZpbGxlciwgZ3JheV90b19yZ2IsIGV0Yy4pLgotU2VlIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCksIGJlbG93LgotCi1BIHF1aWNrIHdvcmQgYWJvdXQgdGV4dF9wdHIgYW5kIG51bV90ZXh0LiAgUE5HIHN0b3JlcyBjb21tZW50cyBpbgota2V5d29yZC90ZXh0IHBhaXJzLCBvbmUgcGFpciBwZXIgY2h1bmssIHdpdGggbm8gbGltaXQgb24gdGhlIG51bWJlcgotb2YgdGV4dCBjaHVua3MsIGFuZCBhIDJeMzEgYnl0ZSBsaW1pdCBvbiB0aGVpciBzaXplLiAgV2hpbGUgdGhlcmUgYXJlCi1zdWdnZXN0ZWQga2V5d29yZHMsIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIHJlc3RyaWN0IHRoZSB1c2UgdG8gdGhlc2UKLXN0cmluZ3MuICBJdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdCBrZXl3b3JkcyBhbmQgdGV4dCBiZSBzZW5zaWJsZQotdG8gaHVtYW5zICh0aGF0J3MgdGhlIHBvaW50KSwgc28gZG9uJ3QgdXNlIGFiYnJldmlhdGlvbnMuICBOb24tcHJpbnRpbmcKLXN5bWJvbHMgYXJlIG5vdCBhbGxvd2VkLiAgU2VlIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotVGhlcmUgaXMgYWxzbyBubyByZXF1aXJlbWVudCB0byBoYXZlIHRleHQgYWZ0ZXIgdGhlIGtleXdvcmQuCi0KLUtleXdvcmRzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDc5IExhdGluLTEgY2hhcmFjdGVycyB3aXRob3V0IGxlYWRpbmcgb3IKLXRyYWlsaW5nIHNwYWNlcywgYnV0IG5vbi1jb25zZWN1dGl2ZSBzcGFjZXMgYXJlIGFsbG93ZWQgd2l0aGluIHRoZQota2V5d29yZC4gIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUga2V5d29yZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgotVGhlIHRleHRfcHRyIGlzIGFuIGFycmF5IG9mIHBuZ190ZXh0IHN0cnVjdHVyZXMsIGVhY2ggaG9sZGluZyBhCi1wb2ludGVyIHRvIGEgbGFuZ3VhZ2Ugc3RyaW5nLCBhIHBvaW50ZXIgdG8gYSBrZXl3b3JkIGFuZCBhIHBvaW50ZXIgdG8KLWEgdGV4dCBzdHJpbmcuICBUaGUgdGV4dCBzdHJpbmcsIGxhbmd1YWdlIGNvZGUsIGFuZCB0cmFuc2xhdGVkCi1rZXl3b3JkIG1heSBiZSBlbXB0eSBvciBOVUxMIHBvaW50ZXJzLiAgVGhlIGtleXdvcmQvdGV4dAotcGFpcnMgYXJlIHB1dCBpbnRvIHRoZSBhcnJheSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZWNlaXZlZC4KLUhvd2V2ZXIsIHNvbWUgb3IgYWxsIG9mIHRoZSB0ZXh0IGNodW5rcyBtYXkgYmUgYWZ0ZXIgdGhlIGltYWdlLCBzbywgdG8KLW1ha2Ugc3VyZSB5b3UgaGF2ZSByZWFkIGFsbCB0aGUgdGV4dCBjaHVua3MsIGRvbid0IG1lc3Mgd2l0aCB0aGVzZQotdW50aWwgYWZ0ZXIgeW91IHJlYWQgdGhlIHN0dWZmIGFmdGVyIHRoZSBpbWFnZS4gIFRoaXMgd2lsbCBiZQotbWVudGlvbmVkIGFnYWluIGJlbG93IGluIHRoZSBkaXNjdXNzaW9uIHRoYXQgZ29lcyB3aXRoIHBuZ19yZWFkX2VuZCgpLgotCi1JbnB1dCB0cmFuc2Zvcm1hdGlvbnMKLQotQWZ0ZXIgeW91J3ZlIHJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKLXRvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cwotd2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQotc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgotdHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCi1jZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLgotCi1UcmFuc2Zvcm1hdGlvbnMgeW91IHJlcXVlc3QgYXJlIGlnbm9yZWQgaWYgdGhleSBkb24ndCBoYXZlIGFueSBtZWFuaW5nIGZvciBhCi1wYXJ0aWN1bGFyIGlucHV0IGRhdGEgZm9ybWF0LiAgSG93ZXZlciBzb21lIHRyYW5zZm9ybWF0aW9ucyBjYW4gaGF2ZSBhbiBlZmZlY3QKLWFzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMgdHJhbnNmb3JtYXRpb24uICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnRyYWRpY3Rvcnkgc2V0IG9mCi10cmFuc2Zvcm1hdGlvbnMsIGZvciBleGFtcGxlIGJvdGggYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgYWxwaGEgY2hhbm5lbCwgeW91Ci1jYW5ub3QgcHJlZGljdCB0aGUgZmluYWwgcmVzdWx0LgotCi1UaGUgY29sb3IgdXNlZCBmb3IgdGhlIHRyYW5zcGFyZW5jeSB2YWx1ZXMgc2hvdWxkIGJlIHN1cHBsaWVkIGluIHRoZSBzYW1lCi1mb3JtYXQvZGVwdGggYXMgdGhlIGN1cnJlbnQgaW1hZ2UgZGF0YS4gIEl0IGlzIHN0b3JlZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGgKLWFzIHRoZSBpbWFnZSBkYXRhIGluIGEgdFJOUyBjaHVuaywgc28gdGhpcyBpcyB3aGF0IGxpYnBuZyBleHBlY3RzIGZvciB0aGlzIGRhdGEuCi0KLVRoZSBjb2xvciB1c2VkIGZvciB0aGUgYmFja2dyb3VuZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBuZWVkX2V4cGFuZCBhcmd1bWVudCBhcwotZGVzY3JpYmVkIGJlbG93LgotCi1EYXRhIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBzdXBwbGllZCByb3cgYnVmZmVycyBwYWNrZWQgaW50byBieXRlcwotdW5sZXNzIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRvbGQgdG8gdHJhbnNmb3JtIGl0IGludG8gYW5vdGhlciBmb3JtYXQuCi1Gb3IgZXhhbXBsZSwgNCBiaXQvcGl4ZWwgcGFsZXR0ZWQgb3IgZ3JheXNjYWxlIGRhdGEgd2lsbCBiZSByZXR1cm5lZAotMiBwaXhlbHMvYnl0ZSB3aXRoIHRoZSBsZWZ0bW9zdCBwaXhlbCBpbiB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIHRoZSBieXRlLAotdW5sZXNzIHBuZ19zZXRfcGFja2luZygpIGlzIGNhbGxlZC4gIDgtYml0IFJHQiBkYXRhIHdpbGwgYmUgc3RvcmVkCi1pbiBSR0IgUkdCIFJHQiBmb3JtYXQgdW5sZXNzIHBuZ19zZXRfZmlsbGVyKCkgb3IgcG5nX3NldF9hZGRfYWxwaGEoKQotaXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgZWFjaCBSR0IgdHJpcGxldC4KLQotMTYtYml0IFJHQiBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgUlJHR0JCIFJSR0dCQiwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAotYnl0ZSBvZiB0aGUgY29sb3IgdmFsdWUgZmlyc3QsIHVubGVzcyBwbmdfc2V0X3NjYWxlXzE2KCkgaXMgY2FsbGVkIHRvCi10cmFuc2Zvcm0gaXQgdG8gcmVndWxhciBSR0IgUkdCIHRyaXBsZXRzLCBvciBwbmdfc2V0X2ZpbGxlcigpIG9yCi1wbmdfc2V0X2FkZCBhbHBoYSgpIGlzIGNhbGxlZCB0byBpbnNlcnQgdHdvIGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZQotb3IgYWZ0ZXIgZWFjaCBSUkdHQkIgdHJpcGxldC4gIFNpbWlsYXJseSwgOC1iaXQgb3IgMTYtYml0IGdyYXlzY2FsZSBkYXRhIGNhbgotYmUgbW9kaWZpZWQgd2l0aCBwbmdfc2V0X2ZpbGxlcigpLCBwbmdfc2V0X2FkZF9hbHBoYSgpLCBwbmdfc2V0X3N0cmlwXzE2KCksCi1vciBwbmdfc2V0X3NjYWxlXzE2KCkuCi0KLVRoZSBmb2xsb3dpbmcgY29kZSB0cmFuc2Zvcm1zIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDggdG8gOCBiaXRzLAotY2hhbmdlcyBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBhbmQgYWRkcyBhIGZ1bGwgYWxwaGEgY2hhbm5lbCBpZiB0aGVyZSBpcwotdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGluIGEgdFJOUyBjaHVuay4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgb24KLWdyYXlzY2FsZSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIG9mIDIgb3IgNCBvciBpZiB0aGVyZSBpcyBhIG11bHRpcGxlLWltYWdlCi12aWV3aW5nIGFwcGxpY2F0aW9uIHRoYXQgd2lzaGVzIHRvIHRyZWF0IGFsbCBpbWFnZXMgaW4gdGhlIHNhbWUgd2F5LgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKLQotICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICBQTkdfSU5GT190Uk5TKSkgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOwotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJgotICAgICAgICBiaXRfZGVwdGggPCA4KSBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7Ci0KLVRoZSBmaXJzdCB0d28gZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpLCBhZGRlZAotaW4gbGlicG5nIHZlcnNpb24gMS4wLjQsIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIGV4cGFuZGVkIHRvIGltcHJvdmUgY29kZQotcmVhZGFiaWxpdHkuICBJbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIHRoZXkgbWF5IGFjdHVhbGx5IGRvIGRpZmZlcmVudAotdGhpbmdzLgotCi1BcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjIuOSwgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzCi1hZGRlZC4gIEl0IGV4cGFuZHMgdGhlIHNhbXBsZSBkZXB0aCB3aXRob3V0IGNoYW5naW5nIHRSTlMgdG8gYWxwaGEuCi0KLUFzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuNS4yLCBwbmdfc2V0X2V4cGFuZF8xNigpIHdhcyBhZGRlZC4gIEl0IGJlaGF2ZXMgYXMKLXBuZ19zZXRfZXhwYW5kKCk7IGhvd2V2ZXIsIHRoZSByZXN1bHRhbnQgY2hhbm5lbHMgaGF2ZSAxNiBiaXRzIHJhdGhlciB0aGFuIDguCi1Vc2UgdGhpcyB3aGVuIHRoZSBvdXRwdXQgY29sb3Igb3IgZ3JheSBjaGFubmVscyBhcmUgbWFkZSBsaW5lYXIgdG8gYXZvaWQgZmFpcmx5Ci1zZXZlcmUgYWNjdXJhY3kgbG9zcy4KLQotICAgaWYgKGJpdF9kZXB0aCA8IDE2KQotICAgICAgcG5nX3NldF9leHBhbmRfMTYocG5nX3B0cik7Ci0KLVBORyBjYW4gaGF2ZSBmaWxlcyB3aXRoIDE2IGJpdHMgcGVyIGNoYW5uZWwuICBJZiB5b3Ugb25seSBjYW4gaGFuZGxlCi04IGJpdHMgcGVyIGNoYW5uZWwsIHRoaXMgd2lsbCBzdHJpcCB0aGUgcGl4ZWxzIGRvd24gdG8gOC1iaXQuCi0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNTA0Ci0gICAgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKLSNlbHNlCi0gICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKLSNlbmRpZgotCi0oVGhlIG1vcmUgYWNjdXJhdGUgInBuZ19zZXRfc2NhbGVfMTYoKSIgQVBJIGJlY2FtZSBhdmFpbGFibGUgaW4gbGlicG5nIHZlcnNpb24KLTEuNS40KS4KLQotSWYgeW91IG5lZWQgdG8gcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCBvbiB0aGUgaW1hZ2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBpbWFnZQotZGF0YSAoZm9yIGV4YW1wbGUgaWYgeW91IGNvbnZlcnQgaXQgdG8gYSBiaXRtYXAgbWFzaykgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQotbGlicG5nIHN0cmlwIHRoZSBjaGFubmVsIGxlYXZpbmcganVzdCBSR0Igb3IgZ3JheSBkYXRhOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOwotCi1JZiB5b3Ugc3RyaXAgdGhlIGFscGhhIGNoYW5uZWwgeW91IG5lZWQgdG8gZmluZCBzb21lIG90aGVyIHdheSBvZiBkZWFsaW5nIHdpdGgKLXRoZSBpbmZvcm1hdGlvbi4gIElmLCBpbnN0ZWFkLCB5b3Ugd2FudCB0byBjb252ZXJ0IHRoZSBpbWFnZSB0byBhbiBvcGFxdWUKLXZlcnNpb24gd2l0aCBubyBhbHBoYSBjaGFubmVsIHVzZSBwbmdfc2V0X2JhY2tncm91bmQ7IHNlZSBiZWxvdy4KLQotQXMgb2YgbGlicG5nIHZlcnNpb24gMS41LjIsIGFsbW9zdCBhbGwgdXNlZnVsIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZCwgdGhlCi1tYWpvciBvbW1pc3Npb25zIGFyZSBjb252ZXJzaW9uIG9mIGdyYXlzY2FsZSB0byBpbmRleGVkIGltYWdlcyAod2hpY2ggY2FuIGJlCi1kb25lIHRyaXZpYWxseSBpbiB0aGUgYXBwbGljYXRpb24pIGFuZCBjb252ZXJzaW9uIG9mIGluZGV4ZWQgdG8gZ3JheXNjYWxlICh3aGljaAotY2FuIGJlIGRvbmUgYnkgYSB0cml2aWFsIG1hbmlwdWxhdGlvbiBvZiB0aGUgcGFsZXR0ZS4pCi0KLUluIHRoZSBmb2xsb3dpbmcgdGFibGUsIHRoZSAwMSBtZWFucyBncmF5c2NhbGUgd2l0aCBkZXB0aDw4LCAzMSBtZWFucwotaW5kZXhlZCB3aXRoIGRlcHRoPDgsIG90aGVyIG51bWVyYWxzIHJlcHJlc2VudCB0aGUgY29sb3IgdHlwZSwgIlQiIG1lYW5zCi10aGUgdFJOUyBjaHVuayBpcyBwcmVzZW50LCBBIG1lYW5zIGFuIGFscGhhIGNoYW5uZWwgaXMgcHJlc2VudCwgYW5kIE8KLW1lYW5zIHRSTlMgb3IgYWxwaGEgaXMgcHJlc2VudCBidXQgYWxsIHBpeGVscyBpbiB0aGUgaW1hZ2UgYXJlIG9wYXF1ZS4KLQotICBGUk9NICAwMSAgMzEgICAwICAwVCAgME8gICAyICAyVCAgMk8gICAzICAzVCAgM08gIDRBICA0TyAgNkEgIDZPCi0gICBUTwotICAgMDEgICAgLSAgW0ddICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtCi0gICAzMSAgIFtRXSAgUSAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgIFEgICBRICAgUSAgW1FdIFtRXSAgUSAgIFEKLSAgICAwICAgIDEgICBHICAgKyAgIC4gICAuICAgRyAgIEcgICBHICAgRyAgIEcgICBHICAgQiAgIEIgIEdCICBHQgotICAgMFQgICAgbHQgIEd0ICB0ICAgKyAgIC4gICBHdCAgRyAgIEcgICBHdCAgRyAgIEcgICBCdCAgQnQgR0J0IEdCdAotICAgME8gICAgbHQgIEd0ICB0ICAgLiAgICsgICBHdCAgR3QgIEcgICBHdCAgR3QgIEcgICBCdCAgQnQgR0J0IEdCdAotICAgIDIgICAgQyAgIFAgICBDICAgQyAgIEMgICArICAgLiAgIC4gICBDICAgLSAgIC0gIENCICBDQiAgIEIgICBCCi0gICAyVCAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICArICAgdCAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0Ci0gICAyTyAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICB0ICAgKyAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0Ci0gICAgMyAgIFtRXSAgcCAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgICsgICAuICAgLiAgW1FdIFtRXSAgUSAgIFEKLSAgIDNUICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgICsgICB0ICBbUXRdW1F0XSBRdCAgUXQKLSAgIDNPICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgIHQgICArICBbUXRdW1F0XSBRdCAgUXQKLSAgIDRBICAgIGxBICBHICAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgKyAgIEJBICBHICBHQkEKLSAgIDRPICAgIGxBIEdCQSAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgQkEgICsgIEdCQSAgRwotICAgNkEgICAgQ0EgIFBBICBDQSAgQyAgIEMgICBBICAgVCAgdFQgICBQQSAgUCAgIFAgICBDICBDQkEgICsgICBCQQotICAgNk8gICAgQ0EgUEJBICBDQSAgQyAgIEMgICBBICB0VCAgIFQgICBQQSAgUCAgIFAgIENCQSAgQyAgIEJBICArCi0KLVdpdGhpbiB0aGUgbWF0cml4LAotICAgICAiKyIgaWRlbnRpZmllcyBlbnRyaWVzIHdoZXJlICdmcm9tJyBhbmQgJ3RvJyBhcmUgdGhlIHNhbWUuCi0gICAgICItIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgIi4iIG1lYW5zIG5vdGhpbmcgaXMgbmVjZXNzYXJ5IChhIHRSTlMgY2h1bmsgY2FuIGp1c3QgYmUgaWdub3JlZCkuCi0gICAgICJ0IiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF90Uk5TLgotICAgICAiQSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfYWRkX2FscGhhKCkuCi0gICAgICJYIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9leHBhbmQoKS4KLSAgICAgIjEiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQotICAgICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgKGFuZCBieSBwbmdfc2V0X2V4cGFuZCgpCi0gICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc3BhcmVuY3kgaW4gdGhlIG9yaWdpbmFsIG9yIHRoZSBmaW5hbAotICAgICAgICAgZm9ybWF0KS4KLSAgICAgIkMiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieSBwbmdfc2V0X2dyYXlfdG9fcmdiKCkuCi0gICAgICJHIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9yZ2JfdG9fZ3JheSgpLgotICAgICAiUCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5Ci0gICAgICAgICBwbmdfc2V0X2V4cGFuZF9wYWxldHRlX3RvX3JnYigpLgotICAgICAicCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcGFja2luZygpLgotICAgICAiUSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcXVhbnRpemUoKS4KLSAgICAgIlQiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQotICAgICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKCkuCi0gICAgICJCIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKLSAgICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZCgpLCBvciBwbmdfc3RyaXBfYWxwaGEoKS4KLQotV2hlbiBhbiBlbnRyeSBoYXMgbXVsdGlwbGUgdHJhbnNmb3JtcyBsaXN0ZWQgYWxsIGFyZSByZXF1aXJlZCB0byBjYXVzZSB0aGUKLXJpZ2h0IG92ZXJhbGwgdHJhbnNmb3JtYXRpb24uICBXaGVuIHR3byB0cmFuc2Zvcm1zIGFyZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotZWl0aGVyIHdpbGwgZG8gdGhlIGpvYi4gIFdoZW4gdHJhbnNmb3JtcyBhcmUgZW5jbG9zZWQgaW4gW10gdGhlIHRyYW5zZm9ybSBzaG91bGQKLWRvIHRoZSBqb2IgYnV0IHRoaXMgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQgLSBhIGRpZmZlcmVudCBmb3JtYXQgd2lsbCByZXN1bHQKLWlmIHRoZSBzdWdnZXN0ZWQgdHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkLgotCi1JbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlCi1pcyB0aGUgbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdSBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIHRvCi1iZSB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IGluc3RlYWQgb2Ygb3BhY2l0eSwgeW91IGNhbiBpbnZlcnQgdGhlCi1hbHBoYSBjaGFubmVsIChvciB0aGUgdFJOUyBjaHVuayBkYXRhKSBhZnRlciBpdCdzIHJlYWQsIHNvIHRoYXQgMCBpcwotZnVsbHkgb3BhcXVlIGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUgKGluIDE2LWJpdAotaW1hZ2VzKSBpcyBmdWxseSB0cmFuc3BhcmVudCwgd2l0aAotCi0gICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKLXRoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQKLWZpbGVzLiAgVGhpcyBjb2RlIGV4cGFuZHMgdG8gMSBwaXhlbCBwZXIgYnl0ZSB3aXRob3V0IGNoYW5naW5nIHRoZQotdmFsdWVzIG9mIHRoZSBwaXhlbHM6Ci0KLSAgICBpZiAoYml0X2RlcHRoIDwgOCkKLSAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBoYXZlIHBvc3NpYmxlIGJpdCBkZXB0aHMgb2YgMSwgMiwgNCwgOCwgYW5kIDE2LiAgQWxsIHBpeGVscwotc3RvcmVkIGluIGEgUE5HIGltYWdlIGhhdmUgYmVlbiAic2NhbGVkIiBvciAic2hpZnRlZCIgdXAgdG8gdGhlIG5leHQKLWhpZ2hlciBwb3NzaWJsZSBiaXQgZGVwdGggKGUuZy4gZnJvbSA1IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwzMV0KLXRvIDggYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLCAyNTVdKS4gIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUKLXRvIGNvbnZlcnQgdGhlIFBORyBwaXhlbCBkYXRhIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCBvZiB0aGUKLWltYWdlLiAgVGhpcyBjYWxsIHJlZHVjZXMgdGhlIHBpeGVscyBiYWNrIGRvd24gdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aDoKLQotICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OwotCi0gICAgaWYgKHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpKQotICAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgc2lnX2JpdCk7Ci0KLVBORyBmaWxlcyBzdG9yZSAzLWNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCi1jaGFuZ2VzIHRoZSBzdG9yYWdlIG9mIHRoZSBwaXhlbHMgdG8gYmx1ZSwgZ3JlZW4sIHJlZDoKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiBUaGlzIGNvZGUgZXhwYW5kcyB0aGVtCi1pbnRvIDQgb3IgOCBieXRlcyBmb3Igd2luZG93aW5nIHN5c3RlbXMgdGhhdCBuZWVkIHRoZW0gaW4gdGhpcyBmb3JtYXQ6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0JFRk9SRSk7Ci0KLXdoZXJlICJmaWxsZXIiIGlzIHRoZSA4LWJpdCBvciAxNi1iaXQgbnVtYmVyIHRvIGZpbGwgd2l0aCwgYW5kIHRoZSBsb2NhdGlvbgotaXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yIFBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKLXlvdSB3YW50IHRoZSBmaWxsZXIgYmVmb3JlIHRoZSBSR0Igb3IgYWZ0ZXIuIFdoZW4gZmlsbGluZyBhbiA4LWJpdCBwaXhlbCwKLXRoZSBsZWFzdCBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG51bWJlciBhcmUgdXNlZCwgaWYgYSAxNi1iaXQgbnVtYmVyIGlzCi1zdXBwbGllZC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gZG9lcyBub3QgYWZmZWN0IGltYWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBmdWxsCi1hbHBoYSBjaGFubmVscy4gIFRvIGFkZCBhbiBvcGFxdWUgYWxwaGEgY2hhbm5lbCwgdXNlIGZpbGxlcj0weGZmZmYgYW5kCi1QTkdfRklMTEVSX0FGVEVSIHdoaWNoIHdpbGwgZ2VuZXJhdGUgUkdCQSBwaXhlbHMuCi0KLU5vdGUgdGhhdCBwbmdfc2V0X2ZpbGxlcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgdHlwZS4gIElmIHlvdSB3YW50Ci10byBkbyB0aGF0LCB5b3UgY2FuIGFkZCBhIHRydWUgYWxwaGEgY2hhbm5lbCB3aXRoCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICAgcG5nX3NldF9hZGRfYWxwaGEocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0FGVEVSKTsKLQotd2hlcmUgImZpbGxlciIgY29udGFpbnMgdGhlIGFscGhhIHZhbHVlIHRvIGFzc2lnbiB0byBlYWNoIHBpeGVsLgotVGhlIHBuZ19zZXRfYWRkX2FscGhhKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGluIGxpYnBuZy0xLjIuNy4KLQotSWYgeW91IGFyZSByZWFkaW5nIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHlvdSBuZWVkIHRoZQotZGF0YSBhcyBBUkdCIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBQTkcgZm9ybWF0IFJHQkE6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOwotCi1Gb3Igc29tZSB1c2VzLCB5b3UgbWF5IHdhbnQgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMKLVJHQi4gIFRoaXMgY29kZSB3aWxsIGRvIHRoYXQgY29udmVyc2lvbjoKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7Ci0KLUNvbnZlcnNlbHksIHlvdSBjYW4gY29udmVydCBhbiBSR0Igb3IgUkdCQSBpbWFnZSB0byBncmF5c2NhbGUgb3IgZ3JheXNjYWxlCi13aXRoIGFscGhhLgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXkocG5nX3B0ciwgZXJyb3JfYWN0aW9uLAotICAgICAgICAgIGRvdWJsZSByZWRfd2VpZ2h0LCBkb3VibGUgZ3JlZW5fd2VpZ2h0KTsKLQotICAgIGVycm9yX2FjdGlvbiA9IDE6IHNpbGVudGx5IGRvIHRoZSBjb252ZXJzaW9uCi0KLSAgICBlcnJvcl9hY3Rpb24gPSAyOiBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQotCi0gICAgZXJyb3JfYWN0aW9uID0gMzogaXNzdWUgYW4gZXJyb3IgYW5kIGFib3J0IHRoZQotICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQotCi0gICAgcmVkX3dlaWdodDogICAgICAgd2VpZ2h0IG9mIHJlZCBjb21wb25lbnQKLQotICAgIGdyZWVuX3dlaWdodDogICAgIHdlaWdodCBvZiBncmVlbiBjb21wb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICBJZiBlaXRoZXIgd2VpZ2h0IGlzIG5lZ2F0aXZlLCBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyBhcmUgdXNlZC4KLQotSW4gdGhlIGNvcnJlc3BvbmRpbmcgZml4ZWQgcG9pbnQgQVBJIHRoZSByZWRfd2VpZ2h0IGFuZCBncmVlbl93ZWlnaHQgdmFsdWVzIGFyZQotc2ltcGx5IHNjYWxlZCBieSAxMDAsMDAwOgotCi0gICAgcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfcHRyLCBlcnJvcl9hY3Rpb24sCi0gICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlZF93ZWlnaHQsCi0gICAgICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3dlaWdodCk7Ci0KLUlmIHlvdSBoYXZlIHNldCBlcnJvcl9hY3Rpb24gPSAxIG9yIDIsIHlvdSBjYW4KLWxhdGVyIGNoZWNrIHdoZXRoZXIgdGhlIGltYWdlIHJlYWxseSB3YXMgZ3JheSwgYWZ0ZXIgcHJvY2Vzc2luZwotdGhlIGltYWdlIHJvd3MsIHdpdGggdGhlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKHBuZ19wdHIpIGZ1bmN0aW9uLgotSXQgd2lsbCByZXR1cm4gYSBwbmdfYnl0ZSB0aGF0IGlzIHplcm8gaWYgdGhlIGltYWdlIHdhcyBncmF5IG9yCi0xIGlmIHRoZXJlIHdlcmUgYW55IG5vbi1ncmF5IHBpeGVscy4gIEJhY2tncm91bmQgYW5kIHNCSVQgZGF0YQotd2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gZ3JheXNjYWxlLCB1c2luZyB0aGUgZ3JlZW4gY2hhbm5lbAotZGF0YSBmb3Igc0JJVCwgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3JfYWN0aW9uIHNldHRpbmcuCi0KLVRoZSBkZWZhdWx0IHZhbHVlcyBjb21lIGZyb20gdGhlIFBORyBmaWxlIGNIUk0gY2h1bmsgaWYgcHJlc2VudDsgb3RoZXJ3aXNlLCB0aGUKLWRlZmF1bHRzIGNvcnJlc3BvbmQgdG8gdGhlIElUVS1SIHJlY29tbWVuZGF0aW9uIDcwOSwgYW5kIGFsc28gdGhlIHNSR0IgY29sb3IKLXNwYWNlLCBhcyByZWNvbW1lbmRlZCBpbiB0aGUgQ2hhcmxlcyBQb3ludG9uJ3MgQ29sb3VyIEZBUSwKLUNvcHlyaWdodCAoYykgMjAwNi0xMS0yOCBDaGFybGVzIFBveW50b24sIGluIHNlY3Rpb24gOToKLQotPGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzk+Ci0KLSAgICBZID0gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCCi0KLVByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQsIDE5OTggdGhyb3VnaCAyMDAyLCByZWNvbW1lbmRlZCBhIHNsaWdodGx5Ci1kaWZmZXJlbnQgZm9ybXVsYToKLQotICAgIFkgPSAwLjIxMjY3MSAqIFIgKyAwLjcxNTE2MCAqIEcgKyAwLjA3MjE2OSAqIEIKLQotTGlicG5nIHVzZXMgYW4gaW50ZWdlciBhcHByb3hpbWF0aW9uOgotCi0gICAgWSA9ICg2OTY4ICogUiArIDIzNDM0ICogRyArIDIzNjYgKiBCKS8zMjc2OAotCi1UaGUgY2FsY3VsYXRpb24gaXMgZG9uZSBpbiBhIGxpbmVhciBjb2xvcnNwYWNlLCBpZiB0aGUgaW1hZ2UgZ2FtbWEKLWNhbiBiZSBkZXRlcm1pbmVkLgotCi1UaGUgcG5nX3NldF9iYWNrZ3JvdW5kKCkgZnVuY3Rpb24gaGFzIGJlZW4gZGVzY3JpYmVkIGFscmVhZHk7IGl0IHRlbGxzIGxpYnBuZyB0bwotY29tcG9zaXRlIGltYWdlcyB3aXRoIGFscGhhIG9yIHNpbXBsZSB0cmFuc3BhcmVuY3kgYWdhaW5zdCB0aGUgc3VwcGxpZWQKLWJhY2tncm91bmQgY29sb3IuICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIG9mIGxpYnBuZyBlYXJsaWVyIHRoYW4KLWxpYnBuZy0xLjUuNCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjYWxsIHRoZSBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBmaWxlCi1oZWFkZXIsIGV2ZW4gaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoZSBjb2xvciBpbiBhIGJLR0QgY2h1bmssIGlmIG9uZSBleGlzdHMuCi0KLUlmIHRoZSBQTkcgZmlsZSBjb250YWlucyBhIGJLR0QgY2h1bmsgKFBOR19JTkZPX2JLR0QgdmFsaWQpLAoteW91IG1heSB1c2UgdGhpcyBjb2xvciwgb3Igc3VwcGx5IGFub3RoZXIgY29sb3IgbW9yZSBzdWl0YWJsZSBmb3IKLXRoZSBjdXJyZW50IGRpc3BsYXkgKGUuZy4sIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYSB3ZWIgcGFnZSkuICBZb3UKLW5lZWQgdG8gdGVsbCBsaWJwbmcgaG93IHRoZSBjb2xvciBpcyByZXByZXNlbnRlZCwgYm90aCB0aGUgZm9ybWF0IG9mIHRoZQotY29tcG9uZW50IHZhbHVlcyBpbiB0aGUgY29sb3IgKHRoZSBudW1iZXIgb2YgYml0cykgYW5kIHRoZSBnYW1tYSBlbmNvZGluZyBvZiB0aGUKLWNvbG9yLiAgVGhlIGZ1bmN0aW9uIHRha2VzIHR3byBhcmd1bWVudHMsIGJhY2tncm91bmRfZ2FtbWFfbW9kZSBhbmQgbmVlZF9leHBhbmQKLXRvIGNvbnZleSB0aGlzIGluZm9ybWF0aW9uOyBob3dldmVyLCBvbmx5IHR3byBjb21iaW5hdGlvbnMgYXJlIGxpa2VseSB0byBiZQotdXNlZnVsOgotCi0gICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQ7Ci0gICAgcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kOwotCi0gICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQotICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCBpbWFnZV9iYWNrZ3JvdW5kLAotICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLypuZWVkcyB0byBiZSBleHBhbmRlZCovLCAxKTsKLSAgICBlbHNlCi0gICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAotICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAvKmRvIG5vdCBleHBhbmQqLywgMSk7Ci0KLVRoZSBzZWNvbmQgY2FsbCB3YXMgZGVzY3JpYmVkIGFib3ZlIC0gbXlfYmFja2dyb3VuZCBpcyBpbiB0aGUgZm9ybWF0IG9mIHRoZQotZmluYWwsIGRpc3BsYXksIG91dHB1dCBwcm9kdWNlZCBieSBsaWJwbmcuICBCZWNhdXNlIHlvdSBub3cga25vdyB0aGUgZm9ybWF0IG9mCi10aGUgUE5HIGl0IGlzIHBvc3NpYmxlIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNob29zZSBlaXRoZXIgOC1iaXQgb3IgMTYtYml0Ci1vdXRwdXQgYW5kIHRvIHJldGFpbiBwYWxldHRlIGltYWdlcyAodGhlIHBhbGV0dGUgY29sb3JzIHdpbGwgYmUgbW9kaWZpZWQKLWFwcHJvcHJpYXRlbHkgYW5kIHRoZSB0Uk5TIGNodW5rIHJlbW92ZWQuKSAgSG93ZXZlciwgaWYgeW91IGFyZSBkb2luZyB0aGlzLAotdGFrZSBncmVhdCBjYXJlIG5vdCB0byBhc2sgZm9yIHRyYW5zZm9ybWF0aW9ucyB3aXRob3V0IGNoZWNraW5nIGZpcnN0IHRoYXQKLXRoZXkgYXBwbHkhCi0KLUluIHRoZSBmaXJzdCBjYWxsIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGhhcyB0aGUgb3JpZ2luYWwgYml0IGRlcHRoIGFuZCBjb2xvciB0eXBlCi1vZiB0aGUgUE5HIGZpbGUuICBTbywgZm9yIHBhbGV0dGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBzdXBwbGllZCBhcyBhIHBhbGV0dGUKLWluZGV4IGFuZCBmb3IgbG93IGJpdCBncmV5c2NhbGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBhIHJlZHVjZWQgYml0IHZhbHVlIGluCi1pbWFnZV9iYWNrZ3JvdW5kLT5ncmF5LgotCi1JZiB5b3UgZGlkbid0IGNhbGwgcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBmaWxlIGhlYWRlciwgZm9yIGV4YW1wbGUKLWlmIHlvdSBuZWVkIHlvdXIgY29kZSB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGxpYnBuZyBwcmlvcgotdG8gbGlicG5nLTEuNS40LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBjYWxsIGl0LgotCi1EbyBub3QgY2FsbCBpdCBpZiB5b3UgY2FsbGVkIHBuZ19zZXRfYWxwaGFfbW9kZSgpOyBkb2luZyBzbyB3aWxsIGRhbWFnZSB0aGUKLXNldHRpbmdzIHB1dCBpbiBwbGFjZSBieSBwbmdfc2V0X2FscGhhX21vZGUoKS4gIChJZiBwbmdfc2V0X2FscGhhX21vZGUoKSBpcwotc3VwcG9ydGVkIHRoZW4geW91IGNhbiBjZXJ0YWlubHkgZG8gcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBQTkcKLWhlYWRlci4pCi0KLVRoaXMgQVBJIHVuY29uZGl0aW9uYWxseSBzZXRzIHRoZSBzY3JlZW4gYW5kIGZpbGUgZ2FtbWEgdmFsdWVzLCBzbyBpdCB3aWxsCi1vdmVycmlkZSB0aGUgdmFsdWUgaW4gdGhlIFBORyBmaWxlIHVubGVzcyBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBQTkcgZmlsZQotcmVhZGluZyBzdGFydHMuICBGb3IgdGhpcyByZWFzb24geW91IG11c3QgYWx3YXlzIGNhbGwgaXQgd2l0aCB0aGUgUE5HIGZpbGUKLXZhbHVlIHdoZW4geW91IGNhbGwgaXQgaW4gdGhpcyBwb3NpdGlvbjoKLQotICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmZpbGVfZ2FtbWEpKQotICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGZpbGVfZ2FtbWEpOwotCi0gICBlbHNlCi0gICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7Ci0KLUlmIHlvdSBuZWVkIHRvIHJlZHVjZSBhbiBSR0IgZmlsZSB0byBhIHBhbGV0dGVkIGZpbGUsIG9yIGlmIGEgcGFsZXR0ZWQKLWZpbGUgaGFzIG1vcmUgZW50cmllcyB0aGFuIHdpbGwgZml0IG9uIHlvdXIgc2NyZWVuLCBwbmdfc2V0X3F1YW50aXplKCkKLXdpbGwgZG8gdGhhdC4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2ltcGxlIG1hdGNoIHF1YW50aXphdGlvbiB0aGF0IG1lcmVseQotZmluZHMgdGhlIGNsb3Nlc3QgY29sb3IgYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgd29yayBmYWlybHkgd2VsbCB3aXRoCi1vcHRpbWl6ZWQgcGFsZXR0ZXMsIGJ1dCBmYWlybHkgYmFkbHkgd2l0aCBsaW5lYXIgY29sb3IgY3ViZXMuICBJZiB5b3UKLXBhc3MgYSBwYWxldHRlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bV9jb2xvcnMsIHRoZSBmaWxlIHdpbGwKLXJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBzbyBpdCB3aWxsIGZpdCBpbnRvCi1tYXhpbXVtX2NvbG9ycy4gIElmIHRoZXJlIGlzIGEgaGlzdG9ncmFtLCBsaWJwbmcgd2lsbCB1c2UgaXQgdG8gbWFrZQotbW9yZSBpbnRlbGxpZ2VudCBjaG9pY2VzIHdoZW4gcmVkdWNpbmcgdGhlIHBhbGV0dGUuICBJZiB0aGVyZSBpcyBubwotaGlzdG9ncmFtLCBpdCBtYXkgbm90IGRvIGFzIGdvb2QgYSBqb2IuCi0KLSAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICB7Ci0gICAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICBQTkdfSU5GT19QTFRFKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzE2cCBoaXN0b2dyYW0gPSBOVUxMOwotCi0gICAgICAgICBwbmdfZ2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAgJmhpc3RvZ3JhbSk7Ci0gICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHBhbGV0dGUsIG51bV9wYWxldHRlLAotICAgICAgICAgICAgbWF4X3NjcmVlbl9jb2xvcnMsIGhpc3RvZ3JhbSwgMSk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jb2xvciBzdGRfY29sb3JfY3ViZVtNQVhfU0NSRUVOX0NPTE9SU10gPQotICAgICAgICAgICAgeyAuLi4gY29sb3JzIC4uLiB9OwotCi0gICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHN0ZF9jb2xvcl9jdWJlLAotICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIE1BWF9TQ1JFRU5fQ09MT1JTLAotICAgICAgICAgICAgTlVMTCwwKTsKLSAgICAgIH0KLSAgIH0KLQotUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcgb25lLgotVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV2ZXJzZSB0aGlzIChtYWtlIGJsYWNrIGJlIG9uZSBhbmQgd2hpdGUgYmUKLXplcm8pOgotCi0gICBpZiAoYml0X2RlcHRoID09IDEgJiYgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGludmVydCBncmF5c2NhbGUgYW5kIGdyYXktYWxwaGEgaW1hZ2VzOgotCi0gICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIDE2LWJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAotaWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgY2hhbmdlcyB0aGUgc3RvcmFnZSB0byB0aGUKLW90aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0LCB0aGUKLXdheSBQQ3Mgc3RvcmUgdGhlbSk6Ci0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91Ci1uZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCi10aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjawotd2l0aAotCi0gICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCi0gICAgICAgIHJlYWRfdHJhbnNmb3JtX2ZuKTsKLQotWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgotCi0gICAgdm9pZCByZWFkX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCi0gICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKLQotU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi1hZnRlciBhbGwgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGFrZSBjYXJlIHdpdGgKLWludGVybGFjZWQgaW1hZ2VzIGlmIHlvdSBkbyB0aGUgaW50ZXJsYWNlIHlvdXJzZWxmIC0gdGhlIHdpZHRoIG9mIHRoZSByb3cgaXMgdGhlCi13aWR0aCBpbiAncm93X2luZm8nLCBub3QgdGhlIG92ZXJhbGwgaW1hZ2Ugd2lkdGguCi0KLUlmIHN1cHBvcnRlZCwgbGlicG5nIHByb3ZpZGVzIHR3byBpbmZvcm1hdGlvbiByb3V0aW5lcyB0aGF0IHlvdSBjYW4gdXNlIHRvIGZpbmQKLXdoZXJlIHlvdSBhcmUgaW4gcHJvY2Vzc2luZyB0aGUgaW1hZ2U6Ci0KLSAgIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwbmdfc3RydWN0cCBwbmdfcHRyKTsKLSAgIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotCi1Eb24ndCB0cnkgdXNpbmcgdGhlc2Ugb3V0c2lkZSBhIHRyYW5zZm9ybSBjYWxsYmFjayAtIGZpcnN0bHkgdGhleSBhcmUgb25seQotc3VwcG9ydGVkIGlmIHVzZXIgdHJhbnNmb3JtcyBhcmUgc3VwcG9ydGVkLCBzZWNvbmRseSB0aGV5IG1heSB3ZWxsIHJldHVybgotdW5leHBlY3RlZCByZXN1bHRzIHVubGVzcyB0aGUgcm93IGlzIGFjdHVhbGx5IGJlaW5nIHByb2Nlc3NlZCBhdCB0aGUgbW9tZW50IHRoZXkKLWFyZSBjYWxsZWQuCi0KLVdpdGggaW50ZXJsYWNlZAotaW1hZ2VzIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgcm93IGluIHRoZSBpbnB1dCBzdWItaW1hZ2UgaW1hZ2UuICBVc2UKLVBOR19ST1dfRlJPTV9QQVNTX1JPVyhyb3csIHBhc3MpIGFuZCBQTkdfQ09MX0ZST01fUEFTU19DT0woY29sLCBwYXNzKSB0bwotZmluZCB0aGUgb3V0cHV0IHBpeGVsICh4LHkpIGdpdmVuIGFuIGludGVybGFjZWQgc3ViLWltYWdlIHBpeGVsIChyb3csY29sLHBhc3MpLgotCi1UaGUgZGlzY3Vzc2lvbiBvZiBpbnRlcmxhY2UgaGFuZGxpbmcgYWJvdmUgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8KLXVzZSB0aGVzZSB2YWx1ZXMuCi0KLVlvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCi1jYWxsYmFjayBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gaW5mb3JtIGxpYnBuZyB0aGF0IHlvdXIgdHJhbnNmb3JtCi1mdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdCBkZXB0aCB3aXRoIHRoZQotZnVuY3Rpb24KLQotICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwKLSAgICAgICAgdXNlcl9kZXB0aCwgdXNlcl9jaGFubmVscyk7Ci0KLVRoZSB1c2VyJ3MgYXBwbGljYXRpb24sIG5vdCBsaWJwbmcsIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZAotZnJlZWluZyBhbnkgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgdXNlciBzdHJ1Y3R1cmUuCi0KLVlvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbgotcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4gIEZvciBleGFtcGxlOgotCi0gICAgdm9pZHAgcmVhZF91c2VyX3RyYW5zZm9ybV9wdHIgPQotICAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKLQotVGhlIGxhc3QgdGhpbmcgdG8gaGFuZGxlIGlzIGludGVybGFjaW5nOyB0aGlzIGlzIGNvdmVyZWQgaW4gZGV0YWlsIGJlbG93LAotYnV0IHlvdSBtdXN0IGNhbGwgdGhlIGZ1bmN0aW9uIGhlcmUgaWYgeW91IHdhbnQgbGlicG5nIHRvIGhhbmRsZSBleHBhbnNpb24KLW9mIHRoZSBpbnRlcmxhY2VkIGltYWdlLgotCi0gICAgbnVtYmVyX29mX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi1BZnRlciBzZXR0aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGxpYnBuZyBjYW4gdXBkYXRlIHlvdXIgcG5nX2luZm8KLXN0cnVjdHVyZSB0byByZWZsZWN0IGFueSB0cmFuc2Zvcm1hdGlvbnMgeW91J3ZlIHJlcXVlc3RlZCB3aXRoIHRoaXMKLWNhbGwuCi0KLSAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLVRoaXMgaXMgbW9zdCB1c2VmdWwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHJvd2J5dGVzCi1maWVsZCBzbyB5b3UgY2FuIHVzZSBpdCB0byBhbGxvY2F0ZSB5b3VyIGltYWdlIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24KLXdpbGwgYWxzbyB1cGRhdGUgeW91ciBwYWxldHRlIHdpdGggdGhlIGNvcnJlY3Qgc2NyZWVuX2dhbW1hIGFuZAotYmFja2dyb3VuZCBpZiB0aGVzZSBoYXZlIGJlZW4gZ2l2ZW4gd2l0aCB0aGUgY2FsbHMgYWJvdmUuICBZb3UgbWF5Ci1vbmx5IGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBvbmNlIHdpdGggYSBwYXJ0aWN1bGFyIGluZm9fcHRyLgotCi1BZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB5b3UgY2FuIGFsbG9jYXRlIGFueQotbWVtb3J5IHlvdSBuZWVkIHRvIGhvbGQgdGhlIGltYWdlLiAgVGhlIHJvdyBkYXRhIGlzIHNpbXBseQotcmF3IGJ5dGUgZGF0YSBmb3IgYWxsIGZvcm1zIG9mIGltYWdlcy4gIEFzIHRoZSBhY3R1YWwgYWxsb2NhdGlvbgotdmFyaWVzIGFtb25nIGFwcGxpY2F0aW9ucywgbm8gZXhhbXBsZSB3aWxsIGJlIGdpdmVuLiAgSWYgeW91Ci1hcmUgYWxsb2NhdGluZyBvbmUgbGFyZ2UgY2h1bmssIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgYW4KLWFycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LCBhcyBpdCB3aWxsIGJlIG5lZWRlZCBmb3Igc29tZQotb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdy4KLQotUmVtZW1iZXI6IEJlZm9yZSB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB0aGUgcG5nX2dldF8qKCkKLWZ1bmN0aW9ucyByZXR1cm4gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmlnaW5hbCBQTkcgaW1hZ2UuCi1BZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbyB0aGUgdmFsdWVzIHJlZmVyIHRvIHRoZSBpbWFnZQotdGhhdCBsaWJwbmcgd2lsbCBvdXRwdXQuICBDb25zZXF1ZW50bHkgeW91IG11c3QgY2FsbCBhbGwgdGhlIHBuZ19zZXRfCi1mdW5jdGlvbnMgYmVmb3JlIHlvdSBjYWxsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkuICBUaGlzIGlzIHBhcnRpY3VsYXJseQotaW1wb3J0YW50IGZvciBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIC0gaWYgeW91IGFyZSBnb2luZyB0byBjYWxsCi1wbmdfcmVhZF91cGRhdGVfaW5mbygpIHlvdSBtdXN0IGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBiZWZvcmUKLWl0IHVubGVzcyB5b3Ugd2FudCB0byByZWNlaXZlIGludGVybGFjZWQgb3V0cHV0LgotCi1SZWFkaW5nIGltYWdlIGRhdGEKLQotQWZ0ZXIgeW91J3ZlIGFsbG9jYXRlZCBtZW1vcnksIHlvdSBjYW4gcmVhZCB0aGUgaW1hZ2UgZGF0YS4KLVRoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyBpbiBvbmUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSBhcmUKLWFsbG9jYXRpbmcgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSB3aG9sZSBpbWFnZSwgeW91IGNhbiBqdXN0Ci1jYWxsIHBuZ19yZWFkX2ltYWdlKCkgYW5kIGxpYnBuZyB3aWxsIHJlYWQgaW4gYWxsIHRoZSBpbWFnZSBkYXRhCi1hbmQgcHV0IGl0IGluIHRoZSBtZW1vcnkgYXJlYSBzdXBwbGllZC4gIFlvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbgotYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCByb3cuCi0KLVRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QKLW5lZWQgdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpICh1bmxlc3MgeW91IGNhbGwKLXBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcywgb3IgYW55Ci1vZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ19yZWFkX3Jvd3MoKS4KLQotICAgcG5nX3JlYWRfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzOgotCi0gICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07Ci0KLVlvdSBjYW4gcG9pbnQgdG8gdm9pZCBvciBjaGFyIG9yIHdoYXRldmVyIHlvdSB1c2UgZm9yIHBpeGVscy4KLQotSWYgeW91IGRvbid0IHdhbnQgdG8gcmVhZCBpbiB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSwgeW91IGNhbgotdXNlIHBuZ19yZWFkX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlcmUgaXMgbm8gaW50ZXJsYWNpbmcgKGNoZWNrCi1pbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX05PTkUpLCB0aGlzIGlzIHNpbXBsZToKLQotICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAotICAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLXdoZXJlIHJvd19wb2ludGVycyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcG5nX3JlYWRfaW1hZ2UoKSBjYWxsLgotCi1JZiB5b3UgYXJlIGRvaW5nIHRoaXMganVzdCBvbmUgcm93IGF0IGEgdGltZSwgeW91IGNhbiBkbyB0aGlzIHdpdGgKLWEgc2luZ2xlIHJvd19wb2ludGVyIGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygcm93X3BvaW50ZXJzOgotCi0gICAgcG5nX2J5dGVwIHJvd19wb2ludGVyID0gcm93OwotICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCByb3dfcG9pbnRlciwgTlVMTCk7Ci0KLUlmIHRoZSBmaWxlIGlzIGludGVybGFjZWQgKGludGVybGFjZV90eXBlICE9IDAgaW4gdGhlIElIRFIgY2h1bmspLCB0aGluZ3MKLWdldCBzb21ld2hhdCBoYXJkZXIuICBUaGUgb25seSBjdXJyZW50IChQTkcgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMikKLWludGVybGFjaW5nIHR5cGUgZm9yIFBORyBpcyAoaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNyk7Ci1hIHNvbWV3aGF0IGNvbXBsaWNhdGVkIDJEIGludGVybGFjZSBzY2hlbWUsIGtub3duIGFzIEFkYW03LCB0aGF0Ci1icmVha3MgZG93biBhbiBpbWFnZSBpbnRvIHNldmVuIHNtYWxsZXIgaW1hZ2VzIG9mIHZhcnlpbmcgc2l6ZSwgYmFzZWQKLW9uIGFuIDh4OCBncmlkLiAgVGhpcyBudW1iZXIgaXMgZGVmaW5lZCAoZnJvbSBsaWJwbmcgMS41KSBhcwotUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMgaW4gcG5nLmgKLQotbGlicG5nIGNhbiBmaWxsIG91dCB0aG9zZSBpbWFnZXMgb3IgaXQgY2FuIGdpdmUgdGhlbSB0byB5b3UgImFzIGlzIi4KLUl0IGlzIGFsbW9zdCBhbHdheXMgYmV0dGVyIHRvIGhhdmUgbGlicG5nIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZm9yIHlvdS4KLUlmIHlvdSB3YW50IHRoZSBpbWFnZXMgZmlsbGVkIG91dCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQuICBUaGUgb25lCi1tZW50aW9uZWQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uIGlzIHRvIGV4cGFuZCBlYWNoIHBpeGVsIHRvIGNvdmVyCi10aG9zZSBwaXhlbHMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQgeWV0ICh0aGUgInJlY3RhbmdsZSIgbWV0aG9kKS4KLVRoaXMgcmVzdWx0cyBpbiBhIGJsb2NreSBpbWFnZSBmb3IgdGhlIGZpcnN0IHBhc3MsIHdoaWNoIGdyYWR1YWxseQotc21vb3RocyBvdXQgYXMgbW9yZSBwaXhlbHMgYXJlIHJlYWQuICBUaGUgb3RoZXIgbWV0aG9kIGlzIHRoZSAic3BhcmtsZSIKLW1ldGhvZCwgd2hlcmUgcGl4ZWxzIGFyZSBkcmF3biBvbmx5IGluIHRoZWlyIGZpbmFsIGxvY2F0aW9ucywgd2l0aCB0aGUKLXJlc3Qgb2YgdGhlIGltYWdlIHJlbWFpbmluZyB3aGF0ZXZlciBjb2xvcnMgdGhleSB3ZXJlIGluaXRpYWxpemVkIHRvCi1iZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSByZWFkLiAgVGhlIGZpcnN0IG1ldGhvZCB1c3VhbGx5IGxvb2tzIGJldHRlciwKLWJ1dCB0ZW5kcyB0byBiZSBzbG93ZXIsIGFzIHRoZXJlIGFyZSBtb3JlIHBpeGVscyB0byBwdXQgaW4gdGhlIHJvd3MuCi0KLUlmLCBhcyBpcyBsaWtlbHksIHlvdSB3YW50IGxpYnBuZyB0byBleHBhbmQgdGhlIGltYWdlcywgY2FsbCB0aGlzIGJlZm9yZQotY2FsbGluZyBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCk6Ci0KLSAgICBpZiAoaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9BREFNNykKLSAgICAgICBudW1iZXJfb2ZfcGFzc2VzCi0gICAgICAgICAgID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzIGlzIHNldmVuLAotYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlCi1jYWxsZWQgZXZlbiBpZiB0aGUgZmlsZSBpcyBub3QgaW50ZXJsYWNlZCwgd2hlcmUgaXQgd2lsbCByZXR1cm4gb25lIHBhc3MuCi1Zb3UgdGhlbiBuZWVkIHRvIHJlYWQgdGhlIHdob2xlIGltYWdlICdudW1iZXJfb2ZfcGFzc2VzJyB0aW1lcy4gIEVhY2ggdGltZQotd2lsbCBkaXN0cmlidXRlIHRoZSBwaXhlbHMgZnJvbSB0aGUgY3VycmVudCBwYXNzIHRvIHRoZSBjb3JyZWN0IHBsYWNlIGluCi10aGUgb3V0cHV0IGltYWdlLCBzbyB5b3UgbmVlZCB0byBzdXBwbHkgdGhlIHNhbWUgcm93cyB0byBwbmdfcmVhZF9yb3dzIGluCi1lYWNoIHBhc3MuCi0KLUlmIHlvdSBhcmUgbm90IGdvaW5nIHRvIGRpc3BsYXkgdGhlIGltYWdlIGFmdGVyIGVhY2ggcGFzcywgYnV0IGFyZQotZ29pbmcgdG8gd2FpdCB1bnRpbCB0aGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW4sIHVzZSB0aGUgc3BhcmtsZQotZWZmZWN0LiAgVGhpcyBlZmZlY3QgaXMgZmFzdGVyIGFuZCB0aGUgZW5kIHJlc3VsdCBvZiBlaXRoZXIgbWV0aG9kCi1pcyBleGFjdGx5IHRoZSBzYW1lLiAgSWYgeW91IGFyZSBwbGFubmluZyBvbiBkaXNwbGF5aW5nIHRoZSBpbWFnZQotYWZ0ZXIgZWFjaCBwYXNzLCB0aGUgInJlY3RhbmdsZSIgZWZmZWN0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHRoZQotYmV0dGVyIGxvb2tpbmcgb25lLgotCi1JZiB5b3Ugb25seSB3YW50IHRoZSAic3BhcmtsZSIgZWZmZWN0LCBqdXN0IGNhbGwgcG5nX3JlYWRfcm93KCkgb3IKLXBuZ19yZWFkX3Jvd3MoKSBhcwotbm9ybWFsLCB3aXRoIHRoZSB0aGlyZCBwYXJhbWV0ZXIgTlVMTC4gIE1ha2Ugc3VyZSB5b3UgbWFrZSBwYXNzIG92ZXIKLXRoZSBpbWFnZSBudW1iZXJfb2ZfcGFzc2VzIHRpbWVzLCBhbmQgeW91IGRvbid0IGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUKLXJvd3MgYmV0d2VlbiBjYWxscy4gIFlvdSBjYW4gY2hhbmdlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGRhdGEsIGp1c3QKLW5vdCB0aGUgZGF0YS4gIEVhY2ggcGFzcyBvbmx5IHdyaXRlcyB0aGUgcGl4ZWxzIGFwcHJvcHJpYXRlIGZvciB0aGF0Ci1wYXNzLCBhbmQgYXNzdW1lcyB0aGUgZGF0YSBmcm9tIHByZXZpb3VzIHBhc3NlcyBpcyBzdGlsbCB2YWxpZC4KLQotICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMLAotICAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0gICAgb3IKLSAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXJzLCBOVUxMKTsKLQotSWYgeW91IG9ubHkgd2FudCB0aGUgZmlyc3QgZWZmZWN0ICh0aGUgcmVjdGFuZ2xlcyksIGRvIHRoZSBzYW1lIGFzCi1iZWZvcmUgZXhjZXB0IHBhc3MgdGhlIHJvdyBidWZmZXIgaW4gdGhlIHRoaXJkIHBhcmFtZXRlciwgYW5kIGxlYXZlCi10aGUgc2Vjb25kIHBhcmFtZXRlciBOVUxMLgotCi0gICAgcG5nX3JlYWRfcm93cyhwbmdfcHRyLCBOVUxMLCByb3dfcG9pbnRlcnMsCi0gICAgICAgIG51bWJlcl9vZl9yb3dzKTsKLSAgICBvcgotICAgIHBuZ19yZWFkX3JvdyhwbmdfcHRyLCBOVUxMLCByb3dfcG9pbnRlcnMpOwotCi1JZiB5b3UgZG9uJ3Qgd2FudCBsaWJwbmcgdG8gaGFuZGxlIHRoZSBpbnRlcmxhY2luZyBkZXRhaWxzLCBqdXN0IGNhbGwKLXBuZ19yZWFkX3Jvd3MoKSBQTkdfSU5URVJMQUNFX0FEQU03X1BBU1NFUyB0aW1lcyB0byByZWFkIGluIGFsbCB0aGUgaW1hZ2VzLgotRWFjaCBvZiB0aGUgaW1hZ2VzIGlzIGEgdmFsaWQgaW1hZ2UgYnkgaXRzZWxmOyBob3dldmVyLCB5b3Ugd2lsbCBhbG1vc3QKLWNlcnRhaW5seSBuZWVkIHRvIGRpc3RyaWJ1dGUgdGhlIHBpeGVscyBmcm9tIGVhY2ggc3ViLWltYWdlIHRvIHRoZQotY29ycmVjdCBwbGFjZS4gIFRoaXMgaXMgd2hlcmUgZXZlcnl0aGluZyBnZXRzIHZlcnkgdHJpY2t5LgotCi1JZiB5b3Ugd2FudCB0byByZXRyaWV2ZSB0aGUgc2VwYXJhdGUgaW1hZ2VzIHlvdSBtdXN0IHBhc3MgdGhlIGNvcnJlY3QKLW51bWJlciBvZiByb3dzIHRvIGVhY2ggc3VjY2Vzc2l2ZSBjYWxsIG9mIHBuZ19yZWFkX3Jvd3MoKS4gIFRoZSBjYWxjdWxhdGlvbgotZ2V0cyBwcmV0dHkgY29tcGxpY2F0ZWQgZm9yIHNtYWxsIGltYWdlcywgd2hlcmUgc29tZSBzdWItaW1hZ2VzIG1heQotbm90IGV2ZW4gZXhpc3QgYmVjYXVzZSBlaXRoZXIgdGhlaXIgd2lkdGggb3IgaGVpZ2h0IGVuZHMgdXAgemVyby4KLWxpYnBuZyBwcm92aWRlcyB0d28gbWFjcm9zIHRvIGhlbHAgeW91IGluIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnM6Ci0KLSAgIHBuZ191aW50XzMyIHdpZHRoID0gUE5HX1BBU1NfQ09MUyhpbWFnZV93aWR0aCwgcGFzc19udW1iZXIpOwotICAgcG5nX3VpbnRfMzIgaGVpZ2h0ID0gUE5HX1BBU1NfUk9XUyhpbWFnZV9oZWlnaHQsIHBhc3NfbnVtYmVyKTsKLQotUmVzcGVjdGl2ZWx5IHRoZXNlIHRlbGwgeW91IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzdWItaW1hZ2UKLWNvcnJlc3BvbmRpbmcgdG8gdGhlIG51bWJlcmVkIHBhc3MuICAncGFzcycgaXMgaW4gaW4gdGhlIHJhbmdlIDAgdG8gNiAtCi10aGlzIGNhbiBiZSBjb25mdXNpbmcgYmVjYXVzZSB0aGUgc3BlY2lmaWNhdGlvbiByZWZlcnMgdG8gdGhlIHNhbWUgcGFzc2VzCi1hcyAxIHRvIDchICBCZSBjYXJlZnVsLCB5b3UgbXVzdCBjaGVjayBib3RoIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGJlZm9yZQotY2FsbGluZyBwbmdfcmVhZF9yb3dzKCkgYW5kIG5vdCBjYWxsIGl0IGZvciB0aGF0IHBhc3MgaWYgZWl0aGVyIGlzIHplcm8uCi0KLVlvdSBjYW4sIG9mIGNvdXJzZSwgcmVhZCBlYWNoIHN1Yi1pbWFnZSByb3cgYnkgcm93LiAgSWYgeW91IHdhbnQgdG8KLXByb2R1Y2Ugb3B0aW1hbCBjb2RlIHRvIG1ha2UgYSBwaXhlbC1ieS1waXhlbCB0cmFuc2Zvcm1hdGlvbiBvZiBhbgotaW50ZXJsYWNlZCBpbWFnZSB0aGlzIGlzIHRoZSBiZXN0IGFwcHJvYWNoOyByZWFkIGVhY2ggcm93IG9mIGVhY2ggcGFzcywKLXRyYW5zZm9ybSBpdCwgYW5kIHdyaXRlIGl0IG91dCB0byBhIG5ldyBpbnRlcmxhY2VkIGltYWdlLgotCi1JZiB5b3Ugd2FudCB0byBkZS1pbnRlcmxhY2UgdGhlIGltYWdlIHlvdXJzZWxmIGxpYnBuZyBwcm92aWRlcyBmdXJ0aGVyCi1tYWNyb3MgdG8gaGVscCB0aGF0IHRlbGwgeW91IHdoZXJlIHRvIHBsYWNlIHRoZSBwaXhlbHMgaW4gdGhlIG91dHB1dCBpbWFnZS4KLUJlY2F1c2UgdGhlIGludGVybGFjaW5nIHNjaGVtZSBpcyByZWN0YW5ndWxhciAtIHN1Yi1pbWFnZSBwaXhlbHMgYXJlIGFsd2F5cwotYXJyYW5nZWQgb24gYSByZWN0YW5ndWxhciBncmlkIC0gYWxsIHlvdSBuZWVkIHRvIGtub3cgZm9yIGVhY2ggcGFzcyBpcyB0aGUKLXN0YXJ0aW5nIGNvbHVtbiBhbmQgcm93IGluIHRoZSBvdXRwdXQgaW1hZ2Ugb2YgdGhlIGZpcnN0IHBpeGVsIHBsdXMgdGhlCi1zcGFjaW5nIGJldHdlZW4gZWFjaCBwaXhlbC4gIEFzIG9mIGxpYnBuZyAxLjUgdGhlcmUgYXJlIGZvdXIgbWFjcm9zIHRvCi1yZXRyaWV2ZSB0aGlzIGluZm9ybWF0aW9uOgotCi0gICBwbmdfdWludF8zMiB4ID0gUE5HX1BBU1NfU1RBUlRfQ09MKHBhc3MpOwotICAgcG5nX3VpbnRfMzIgeSA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsKLSAgIHBuZ191aW50XzMyIHhTdGVwID0gMVUgPDwgUE5HX1BBU1NfQ09MX1NISUZUKHBhc3MpOwotICAgcG5nX3VpbnRfMzIgeVN0ZXAgPSAxVSA8PCBQTkdfUEFTU19ST1dfU0hJRlQocGFzcyk7Ci0KLVRoZXNlIGFsbG93IHlvdSB0byB3cml0ZSB0aGUgb2J2aW91cyBsb29wOgotCi0gICBwbmdfdWludF8zMiBpbnB1dF95ID0gMDsKLSAgIHBuZ191aW50XzMyIG91dHB1dF95ID0gUE5HX1BBU1NfU1RBUlRfUk9XKHBhc3MpOwotCi0gICB3aGlsZSAob3V0cHV0X3kgPCBvdXRwdXRfaW1hZ2VfaGVpZ2h0KQotICAgewotICAgICAgcG5nX3VpbnRfMzIgaW5wdXRfeCA9IDA7Ci0gICAgICBwbmdfdWludF8zMiBvdXRwdXRfeCA9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKTsKLQotICAgICAgd2hpbGUgKG91dHB1dF94IDwgb3V0cHV0X2ltYWdlX3dpZHRoKQotICAgICAgewotICAgICAgICAgaW1hZ2Vbb3V0cHV0X3ldW291dHB1dF94XSA9Ci0gICAgICAgICAgICAgc3ViaW1hZ2VbcGFzc11baW5wdXRfeV1baW5wdXRfeCsrXTsKLQotICAgICAgICAgb3V0cHV0X3ggKz0geFN0ZXA7Ci0gICAgICB9Ci0KLSAgICAgICsraW5wdXRfeTsKLSAgICAgIG91dHB1dF95ICs9IHlTdGVwOwotICAgfQotCi1Ob3RpY2UgdGhhdCB0aGUgc3RlcHMgYmV0d2VlbiBzdWNjZXNzaXZlIG91dHB1dCByb3dzIGFuZCBjb2x1bW5zIGFyZQotcmV0dXJuZWQgYXMgc2hpZnRzLiAgVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIHRoZSBwaXhlbHMgaW4gdGhlIHN1YmltYWdlcwotYXJlIGFsd2F5cyBhIHBvd2VyIG9mIDIgYXBhcnQgLSAxLCAyLCA0IG9yIDggcGl4ZWxzIC0gaW4gdGhlIG9yaWdpbmFsCi1pbWFnZS4gIEluIHByYWN0aWNlIHlvdSBtYXkgbmVlZCB0byBkaXJlY3RseSBjYWxjdWxhdGUgdGhlIG91dHB1dCBjb29yZGluYXRlCi1naXZlbiBhbiBpbnB1dCBjb29yZGluYXRlLiAgbGlicG5nIHByb3ZpZGVzIHR3byBmdXJ0aGVyIG1hY3JvcyBmb3IgdGhpcwotcHVycG9zZToKLQotICAgcG5nX3VpbnRfMzIgb3V0cHV0X3ggPSBQTkdfQ09MX0ZST01fUEFTU19DT0woaW5wdXRfeCwgcGFzcyk7Ci0gICBwbmdfdWludF8zMiBvdXRwdXRfeSA9IFBOR19ST1dfRlJPTV9QQVNTX1JPVyhpbnB1dF95LCBwYXNzKTsKLQotRmluYWxseSBhIHBhaXIgb2YgbWFjcm9zIGFyZSBwcm92aWRlZCB0byB0ZWxsIHlvdSBpZiBhIHBhcnRpY3VsYXIgaW1hZ2UKLXJvdyBvciBjb2x1bW4gYXBwZWFycyBpbiBhIGdpdmVuIHBhc3M6Ci0KLSAgIGludCBjb2xfaW5fcGFzcyA9IFBOR19DT0xfSU5fSU5URVJMQUNFX1BBU1Mob3V0cHV0X3gsIHBhc3MpOwotICAgaW50IHJvd19pbl9wYXNzID0gUE5HX1JPV19JTl9JTlRFUkxBQ0VfUEFTUyhvdXRwdXRfeSwgcGFzcyk7Ci0KLUJlYXIgaW4gbWluZCB0aGF0IHlvdSB3aWxsIHByb2JhYmx5IGFsc28gbmVlZCB0byBjaGVjayB0aGUgd2lkdGggYW5kIGhlaWdodAotb2YgdGhlIHBhc3MgaW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIHRvIGJlIHN1cmUgdGhlIHBhc3MgZXZlbiBleGlzdHMhCi0KLVdpdGggYW55IGx1Y2sgeW91IGFyZSBjb252aW5jZWQgYnkgbm93IHRoYXQgeW91IGRvbid0IHdhbnQgdG8gZG8geW91ciBvd24KLWludGVybGFjZSBoYW5kbGluZy4gIEluIHJlYWxpdHkgbm9ybWFsbHkgdGhlIG9ubHkgZ29vZCByZWFzb24gZm9yIGRvaW5nIHRoaXMKLWlzIGlmIHlvdSBhcmUgcHJvY2Vzc2luZyBQTkcgZmlsZXMgb24gYSBwaXhlbC1ieS1waXhlbCBiYXNpcyBhbmQgZG9uJ3Qgd2FudAotdG8gbG9hZCB0aGUgd2hvbGUgZmlsZSBpbnRvIG1lbW9yeSB3aGVuIGl0IGlzIGludGVybGFjZWQuCi0KLWxpYnBuZyBpbmNsdWRlcyBhIHRlc3QgcHJvZ3JhbSwgcG5ndmFsaWQsIHRoYXQgaWxsdXN0cmF0ZXMgcmVhZGluZyBhbmQKLXdyaXRpbmcgb2YgaW50ZXJsYWNlZCBpbWFnZXMuICBJZiB5b3UgY2FuJ3QgZ2V0IGludGVybGFjaW5nIHRvIHdvcmsgaW4geW91cgotY29kZSBhbmQgZG9uJ3Qgd2FudCB0byBsZWF2ZSBpdCB0byBsaWJwbmcgKHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaCksIHNlZQotaG93IHBuZ3ZhbGlkLmMgZG9lcyBpdC4KLQotRmluaXNoaW5nIGEgc2VxdWVudGlhbCByZWFkCi0KLUFmdGVyIHlvdSBhcmUgZmluaXNoZWQgcmVhZGluZyB0aGUgaW1hZ2UgdGhyb3VnaCB0aGUKLWxvdy1sZXZlbCBpbnRlcmZhY2UsIHlvdSBjYW4gZmluaXNoIHJlYWRpbmcgdGhlIGZpbGUuCi0KLUlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBjcmMgYWN0aW9uIGZvciBoYW5kbGluZyBDUkMgZXJyb3JzIGluCi1jaHVua3MgYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHlvdSBjYW4gY2FsbCBwbmdfc2V0X2NyY19hY3Rpb24oKQotYWdhaW4gYXQgdGhpcyBwb2ludC4KLQotSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGNvbW1lbnRzIG9yIHRpbWUsIHdoaWNoIG1heSBiZSBzdG9yZWQgZWl0aGVyCi1iZWZvcmUgb3IgYWZ0ZXIgdGhlIGltYWdlIGRhdGEsIHlvdSBzaG91bGQgcGFzcyB0aGUgc2VwYXJhdGUgcG5nX2luZm8KLXN0cnVjdCBpZiB5b3Ugd2FudCB0byBrZWVwIHRoZSBjb21tZW50cyBmcm9tIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGltYWdlCi1zZXBhcmF0ZS4KLQotICAgIHBuZ19pbmZvcCBlbmRfaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0KLSAgICBpZiAoIWVuZF9pbmZvKQotICAgIHsKLSAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCBlbmRfaW5mbyk7Ci0KLUlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQsIHlvdSBzaG91bGQgc3RpbGwgY2FsbCBwbmdfcmVhZF9lbmQoKQotYnV0IHlvdSBjYW4gcGFzcyBOVUxMLCBhdm9pZGluZyB0aGUgbmVlZCB0byBjcmVhdGUgYW4gZW5kX2luZm8gc3RydWN0dXJlLgotSWYgeW91IGRvIHRoaXMsIGxpYnBuZyB3aWxsIG5vdCBwcm9jZXNzIGFueSBjaHVua3MgYWZ0ZXIgSURBVCBvdGhlciB0aGFuCi1za2lwcGluZyBvdmVyIHRoZW0gYW5kIHBlcmhhcHMgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBoYXZlIGNhbGxlZAotcG5nX3NldF9jcmNfYWN0aW9uKSBjaGVja2luZyB0aGVpciBDUkNzIHdoaWxlIGxvb2tpbmcgZm9yIHRoZSBJRU5EIGNodW5rLgotCi0gICBwbmdfcmVhZF9lbmQocG5nX3B0ciwgKHBuZ19pbmZvcClOVUxMKTsKLQotSWYgeW91IGRvbid0IGNhbGwgcG5nX3JlYWRfZW5kKCksIHRoZW4geW91ciBmaWxlIHBvaW50ZXIgd2lsbCBiZQotbGVmdCBwb2ludGluZyB0byB0aGUgZmlyc3QgY2h1bmsgYWZ0ZXIgdGhlIGxhc3QgSURBVCwgd2hpY2ggaXMgcHJvYmFibHkKLW5vdCB3aGF0IHlvdSB3YW50IGlmIHlvdSBleHBlY3QgdG8gcmVhZCBzb21ldGhpbmcgYmV5b25kIHRoZSBlbmQgb2YKLXRoZSBQTkcgZGF0YXN0cmVhbS4KLQotV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBsaWJwbmcgbGlrZSB0aGlzOgotCi0gICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICZlbmRfaW5mbyk7Ci0KLW9yLCBpZiB5b3UgZGlkbid0IGNyZWF0ZSBhbiBlbmRfaW5mbyBzdHJ1Y3R1cmUsCi0KLSAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gaW5kaXZpZHVhbGx5IGZyZWUgdGhlIGluZm9fcHRyIG1lbWJlcnMgdGhhdAotcG9pbnQgdG8gbGlicG5nLWFsbG9jYXRlZCBzdG9yYWdlIHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKLQotICAgIHBuZ19mcmVlX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIG1hc2ssIHNlcSkKLQotICAgIG1hc2sgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzawotICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgotICAgICAgICAgICBtb3JlIG9mCi0gICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKLSAgICAgICAgICAgICBQTkdfRlJFRV9ISVNULCBQTkdfRlJFRV9JQ0NQLAotICAgICAgICAgICAgIFBOR19GUkVFX1BDQUwsIFBOR19GUkVFX1JPV1MsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKLSAgICAgICAgICAgICBQTkdfRlJFRV9URVhULCBQTkdfRlJFRV9VTktOLAotICAgICAgICAgICBvciBzaW1wbHkgUE5HX0ZSRUVfQUxMCi0KLSAgICBzZXEgIC0gc2VxdWVuY2UgbnVtYmVyIG9mIGl0ZW0gdG8gYmUgZnJlZWQKLSAgICAgICAgICAgKC0xIGZvciBhbGwgaXRlbXMpCi0KLVRoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgd2hlbiB0aGUgcmVsZXZhbnQgc3RvcmFnZSBoYXMKLWFscmVhZHkgYmVlbiBmcmVlZCwgb3IgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQsIG9yIHdhcyBhbGxvY2F0ZWQKLWJ5IHRoZSB1c2VyIGFuZCBub3QgYnkgbGlicG5nLCAgYW5kIHdpbGwgaW4gdGhvc2UgY2FzZXMgZG8gbm90aGluZy4KLVRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtIG9mIHRoZSBzZWxlY3RlZCBkYXRhCi10eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QgLTEsIGFuZCBtdWx0aXBsZSBpdGVtcwotYXJlIGFsbG93ZWQgZm9yIHRoZSBkYXRhIHR5cGUgaWRlbnRpZmllZCBpbiB0aGUgbWFzaywgc3VjaCBhcyB0ZXh0IG9yCi1zUExULCBvbmx5IHRoZSBuJ3RoIGl0ZW0gaW4gdGhlIHN0cnVjdHVyZSBpcyBmcmVlZCwgd2hlcmUgbiBpcyAic2VxIi4KLQotVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgb25seSB0byBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGludGVybmFsbHkKLWJ5IGxpYnBuZy4gIFRoaXMgY2FuIGJlIGNoYW5nZWQsIHNvIHRoYXQgbGlicG5nIHdpbGwgbm90IGZyZWUgdGhlIGRhdGEsCi1vciBzbyB0aGF0IGl0IHdpbGwgZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBieSB0aGUgdXNlciB3aXRoIHBuZ19tYWxsb2MoKQotb3IgcG5nX2NhbGxvYygpIGFuZCBwYXNzZWQgaW4gdmlhIGEgcG5nX3NldF8qKCkgZnVuY3Rpb24sIHdpdGgKLQotICAgIHBuZ19kYXRhX2ZyZWVyKHBuZ19wdHIsIGluZm9fcHRyLCBmcmVlciwgbWFzaykKLQotICAgIGZyZWVyICAtIG9uZSBvZgotICAgICAgICAgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBCi0KLSAgICBtYXNrICAgLSB3aGljaCBkYXRhIGVsZW1lbnRzIGFyZSBhZmZlY3RlZAotICAgICAgICAgICAgIHNhbWUgY2hvaWNlcyBhcyBpbiBwbmdfZnJlZV9kYXRhKCkKLQotVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgotWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgcmVhZGluZyB0aGUgUE5HIGRhdGEgYnV0IGJlZm9yZSBjYWxsaW5nCi1hbnkgcG5nX3NldF8qKCkgZnVuY3Rpb25zLCB0byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIgb3IgdGhlIHBuZ19zZXRfKigpCi1mdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBhbnkgZXhpc3RpbmcgZGF0YSB0aGF0IG1pZ2h0IGJlIHByZXNlbnQsCi1hbmQgYWdhaW4gYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucyB0byBjb250cm9sIHdoZXRoZXIgdGhlIHVzZXIKLW9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLiAgV2hlbiB0aGUgdXNlciBhc3N1bWVzCi1yZXNwb25zaWJpbGl0eSBmb3IgbGlicG5nLWFsbG9jYXRlZCBkYXRhLCB0aGUgYXBwbGljYXRpb24gbXVzdCB1c2UKLXBuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZwotZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKLW9yIHBuZ19jYWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KLQotSWYgeW91IGFsbG9jYXRlZCB5b3VyIHJvd19wb2ludGVycyBpbiBhIHNpbmdsZSBibG9jaywgYXMgc3VnZ2VzdGVkIGFib3ZlIGluCi10aGUgZGVzY3JpcHRpb24gb2YgdGhlIGhpZ2ggbGV2ZWwgcmVhZCBpbnRlcmZhY2UsIHlvdSBtdXN0IG5vdCB0cmFuc2ZlcgotcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgaXQgdG8gdGhlIHBuZ19zZXRfcm93cyBvciBwbmdfcmVhZF9kZXN0cm95IGZ1bmN0aW9uLAotYmVjYXVzZSB0aGV5IHdvdWxkIGFsc28gdHJ5IHRvIGZyZWUgdGhlIGluZGl2aWR1YWwgcm93X3BvaW50ZXJzW2ldLgotCi1JZiB5b3UgYWxsb2NhdGVkIHRleHRfcHRyLnRleHQsIHRleHRfcHRyLmxhbmcsIGFuZCB0ZXh0X3B0ci50cmFuc2xhdGVkX2tleXdvcmQKLXNlcGFyYXRlbHksIGRvIG5vdCB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0ZXh0X3B0ciB0byBsaWJwbmcsCi1iZWNhdXNlIHdoZW4gbGlicG5nIGZpbGxzIGEgcG5nX3RleHQgc3RydWN0dXJlIGl0IGNvbWJpbmVzIHRoZXNlIG1lbWJlcnMgd2l0aAotdGhlIGtleSBtZW1iZXIsIGFuZCBwbmdfZnJlZV9kYXRhKCkgd2lsbCBmcmVlIG9ubHkgdGV4dF9wdHIua2V5LiAgU2ltaWxhcmx5LAotaWYgeW91IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlJ2luZyB0ZXh0X3B0ciBmcm9tIGxpYnBuZyB0byB5b3VyCi1hcHBsaWNhdGlvbiwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IG5vdCBzZXBhcmF0ZWx5IGZyZWUgdGhvc2UgbWVtYmVycy4KLQotVGhlIHBuZ19mcmVlX2RhdGEoKSBmdW5jdGlvbiB3aWxsIHR1cm4gb2ZmIHRoZSAidmFsaWQiIGZsYWcgZm9yIGFueXRoaW5nCi1pdCBmcmVlcy4gIElmIHlvdSBuZWVkIHRvIHR1cm4gdGhlIGZsYWcgb2ZmIGZvciBhIGNodW5rIHRoYXQgd2FzIGZyZWVkIGJ5Ci15b3VyIGFwcGxpY2F0aW9uIGluc3RlYWQgb2YgYnkgbGlicG5nLCB5b3UgY2FuIHVzZQotCi0gICAgcG5nX3NldF9pbnZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBtYXNrKTsKLQotICAgIG1hc2sgLSBpZGVudGlmaWVzIHRoZSBjaHVua3MgdG8gYmUgbWFkZSBpbnZhbGlkLAotICAgICAgICAgICBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIG9uZSBvcgotICAgICAgICAgICBtb3JlIG9mCi0gICAgICAgICAgICAgUE5HX0lORk9fZ0FNQSwgUE5HX0lORk9fc0JJVCwKLSAgICAgICAgICAgICBQTkdfSU5GT19jSFJNLCBQTkdfSU5GT19QTFRFLAotICAgICAgICAgICAgIFBOR19JTkZPX3RSTlMsIFBOR19JTkZPX2JLR0QsCi0gICAgICAgICAgICAgUE5HX0lORk9faElTVCwgUE5HX0lORk9fcEhZcywKLSAgICAgICAgICAgICBQTkdfSU5GT19vRkZzLCBQTkdfSU5GT190SU1FLAotICAgICAgICAgICAgIFBOR19JTkZPX3BDQUwsIFBOR19JTkZPX3NSR0IsCi0gICAgICAgICAgICAgUE5HX0lORk9faUNDUCwgUE5HX0lORk9fc1BMVCwKLSAgICAgICAgICAgICBQTkdfSU5GT19zQ0FMLCBQTkdfSU5GT19JREFUCi0KLUZvciBhIG1vcmUgY29tcGFjdCBleGFtcGxlIG9mIHJlYWRpbmcgYSBQTkcgaW1hZ2UsIHNlZSB0aGUgZmlsZSBleGFtcGxlLmMuCi0KLVJlYWRpbmcgUE5HIGZpbGVzIHByb2dyZXNzaXZlbHkKLQotVGhlIHByb2dyZXNzaXZlIHJlYWRlciBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgbm9uLXByb2dyZXNzaXZlCi1yZWFkZXIuICBJbnN0ZWFkIG9mIGNhbGxpbmcgcG5nX3JlYWRfaW5mbygpLCBwbmdfcmVhZF9yb3dzKCksIGFuZAotcG5nX3JlYWRfZW5kKCksIHlvdSBtYWtlIG9uZSBjYWxsIHRvIHBuZ19wcm9jZXNzX2RhdGEoKSwgd2hpY2ggY2FsbHMKLWNhbGxiYWNrcyB3aGVuIGl0IGhhcyB0aGUgaW5mbywgYSByb3csIG9yIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAgWW91Ci1zZXQgdXAgdGhlc2UgY2FsbGJhY2tzIHdpdGggcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgZG9uJ3QKLWhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGlucHV0L291dHB1dCBmdW5jdGlvbnMgb2YgbGlicG5nLCBhcyB5b3UgYXJlCi1naXZpbmcgdGhlIGxpYnJhcnkgdGhlIGRhdGEgZGlyZWN0bHkgaW4gcG5nX3Byb2Nlc3NfZGF0YSgpLiAgSSB3aWxsCi1hc3N1bWUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBzZWN0aW9uIG9uIHJlYWRpbmcgUE5HIGZpbGVzIGFib3ZlLAotc28gSSB3aWxsIG9ubHkgaGlnaGxpZ2h0IHRoZSBkaWZmZXJlbmNlcyAoYWx0aG91Z2ggSSB3aWxsIHNob3cKLWFsbCBvZiB0aGUgY29kZSkuCi0KLXBuZ19zdHJ1Y3RwIHBuZ19wdHI7Ci1wbmdfaW5mb3AgaW5mb19wdHI7Ci0KLSAvKiAgQW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50IG9mIGhvdyB5b3Ugd291bGQKLSAgICAgaW5pdGlhbGl6ZSB0aGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGluIHlvdXIKLSAgICAgYXBwbGljYXRpb24uICovCi0gaW50Ci0gaW5pdGlhbGl6ZV9wbmdfcmVhZGVyKCkKLSB7Ci0gICAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QKLSAgICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7Ci0KLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotCi0gICAgaWYgKCFpbmZvX3B0cikKLSAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsCi0gICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCwgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIG9uZSdzIG5ldy4gIFlvdSBjYW4gcHJvdmlkZSBmdW5jdGlvbnMKLSAgICAgICB0byBiZSBjYWxsZWQgd2hlbiB0aGUgaGVhZGVyIGluZm8gaXMgdmFsaWQsCi0gICAgICAgd2hlbiBlYWNoIHJvdyBpcyBjb21wbGV0ZWQsIGFuZCB3aGVuIHRoZSBpbWFnZQotICAgICAgIGlzIGZpbmlzaGVkLiAgSWYgeW91IGFyZW4ndCB1c2luZyBhbGwgZnVuY3Rpb25zLAotICAgICAgIHlvdSBjYW4gc3BlY2lmeSBOVUxMIHBhcmFtZXRlcnMuICBFdmVuIHdoZW4gYWxsCi0gICAgICAgdGhyZWUgZnVuY3Rpb25zIGFyZSBOVUxMLCB5b3UgbmVlZCB0byBjYWxsCi0gICAgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKCkuICBZb3UgY2FuIHVzZQotICAgICAgIGFueSBzdHJ1Y3QgYXMgdGhlIHVzZXJfcHRyIChjYXN0IHRvIGEgdm9pZCBwb2ludGVyCi0gICAgICAgZm9yIHRoZSBmdW5jdGlvbiBjYWxsKSwgYW5kIHJldHJpZXZlIHRoZSBwb2ludGVyCi0gICAgICAgZnJvbSBpbnNpZGUgdGhlIGNhbGxiYWNrcyB1c2luZyB0aGUgZnVuY3Rpb24KLQotICAgICAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOwotCi0gICAgICAgd2hpY2ggd2lsbCByZXR1cm4gYSB2b2lkIHBvaW50ZXIsIHdoaWNoIHlvdSBoYXZlCi0gICAgICAgdG8gY2FzdCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwbmdfcHRyLCAodm9pZCAqKXVzZXJfcHRyLAotICAgICAgICBpbmZvX2NhbGxiYWNrLCByb3dfY2FsbGJhY2ssIGVuZF9jYWxsYmFjayk7Ci0KLSAgICByZXR1cm4gMDsKLSB9Ci0KLSAvKiBBIGNvZGUgZnJhZ21lbnQgdGhhdCB5b3UgY2FsbCBhcyB5b3UgcmVjZWl2ZSBibG9ja3MKLSAgIG9mIGRhdGEgKi8KLSBpbnQKLSBwcm9jZXNzX2RhdGEocG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3VpbnRfMzIgbGVuZ3RoKQotIHsKLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgIHsKLSAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIG9uZSdzIG5ldyBhbHNvLiAgU2ltcGx5IGdpdmUgaXQgYSBjaHVuawotICAgICAgIG9mIGRhdGEgZnJvbSB0aGUgZmlsZSBzdHJlYW0gKGluIG9yZGVyLCBvZgotICAgICAgIGNvdXJzZSkuICBPbiBtYWNoaW5lcyB3aXRoIHNlZ21lbnRlZCBtZW1vcnkKLSAgICAgICBtb2RlbHMgbWFjaGluZXMsIGRvbid0IGdpdmUgaXQgYW55IG1vcmUgdGhhbgotICAgICAgIDY0Sy4gIFRoZSBsaWJyYXJ5IHNlZW1zIHRvIHJ1biBmaW5lIHdpdGggc2l6ZXMKLSAgICAgICBvZiA0Sy4gQWx0aG91Z2ggeW91IGNhbiBnaXZlIGl0IG11Y2ggbGVzcyBpZgotICAgICAgIG5lY2Vzc2FyeSAoSSBhc3N1bWUgeW91IGNhbiBnaXZlIGl0IGNodW5rcyBvZgotICAgICAgIDEgYnl0ZSwgSSBoYXZlbid0IHRyaWVkIGxlc3MgdGhhbiAyNTYgYnl0ZXMKLSAgICAgICB5ZXQpLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHlvdSBtYXkKLSAgICAgICB3YW50IHRvIGRpc3BsYXkgYW55IHJvd3MgdGhhdCB3ZXJlIGdlbmVyYXRlZAotICAgICAgIGluIHRoZSByb3cgY2FsbGJhY2sgaWYgeW91IGRvbid0IGFscmVhZHkgZG8KLSAgICAgICBzbyB0aGVyZS4KLSAgICAgKi8KLSAgICBwbmdfcHJvY2Vzc19kYXRhKHBuZ19wdHIsIGluZm9fcHRyLCBidWZmZXIsIGxlbmd0aCk7Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50IHlvdSBjYW4gY2FsbCBwbmdfcHJvY2Vzc19kYXRhX3NraXAgaWYKLSAgICAgICB5b3Ugd2FudCB0byBoYW5kbGUgZGF0YSB0aGUgbGlicmFyeSB3aWxsIHNraXAgeW91cnNlbGY7Ci0gICAgICAgaXQgc2ltcGx5IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwIChhbmQgc3RvcHMKLSAgICAgICBsaWJwbmcgc2tpcHBpbmcgdGhhdCBudW1iZXIgb2YgYnl0ZXMgb24gdGhlIG5leHQKLSAgICAgICBwbmdfcHJvY2Vzc19kYXRhIGNhbGwpLgotICAgIHJldHVybiAwOwotIH0KLQotIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIChhcyBzZXQgYnkKLSAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKSBhYm92ZSkgd2hlbiBlbm91Z2ggZGF0YQotICAgIGhhcyBiZWVuIHN1cHBsaWVkIHNvIGFsbCBvZiB0aGUgaGVhZGVyIGhhcyBiZWVuCi0gICAgcmVhZC4KLSAqLwotIHZvaWQKLSBpbmZvX2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvKQotIHsKLSAgICAvKiBEbyBhbnkgc2V0dXAgaGVyZSwgaW5jbHVkaW5nIHNldHRpbmcgYW55IG9mCi0gICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyBtZW50aW9uZWQgaW4gdGhlIFJlYWRpbmcKLSAgICAgICBQTkcgZmlsZXMgc2VjdGlvbi4gIEZvciBub3csIHlvdSBfbXVzdF8gY2FsbAotICAgICAgIGVpdGhlciBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yCi0gICAgICAgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhZnRlciBhbGwgdGhlCi0gICAgICAgdHJhbnNmb3JtYXRpb25zIGFyZSBzZXQgKGV2ZW4gaWYgeW91IGRvbid0IHNldAotICAgICAgIGFueSkuICBZb3UgbWF5IHN0YXJ0IGdldHRpbmcgcm93cyBiZWZvcmUKLSAgICAgICBwbmdfcHJvY2Vzc19kYXRhKCkgcmV0dXJucywgc28gdGhpcyBpcyB5b3VyCi0gICAgICAgbGFzdCBjaGFuY2UgdG8gcHJlcGFyZSBmb3IgdGhhdC4KLQotICAgICAgIFRoaXMgaXMgd2hlcmUgeW91IHR1cm4gb24gaW50ZXJsYWNlIGhhbmRsaW5nLAotICAgICAgIGFzc3VtaW5nIHlvdSBkb24ndCB3YW50IHRvIGRvIGl0IHlvdXJzZWxmLgotCi0gICAgICAgSWYgeW91IG5lZWQgdG8geW91IGNhbiBzdG9wIHRoZSBwcm9jZXNzaW5nIG9mCi0gICAgICAgeW91ciBvcmlnaW5hbCBpbnB1dCBkYXRhIGF0IHRoaXMgcG9pbnQgYnkgY2FsbGluZwotICAgICAgIHBuZ19wcm9jZXNzX2RhdGFfcGF1c2UuICBUaGlzIHJldHVybnMgdGhlIG51bWJlcgotICAgICAgIG9mIHVucHJvY2Vzc2VkIGJ5dGVzIGZyb20gdGhlIGxhc3QgcG5nX3Byb2Nlc3NfZGF0YQotICAgICAgIGNhbGwgLSBpdCBpcyB1cCB0byB5b3UgdG8gZW5zdXJlIHRoYXQgdGhlIG5leHQgY2FsbAotICAgICAgIHNlZXMgdGhlc2UgYnl0ZXMgYWdhaW4uICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBib3RoZXIKLSAgICAgICB3aXRoIHRoaXMgeW91IGNhbiBnZXQgbGlicG5nIHRvIGNhY2hlIHRoZSB1bnJlYWQKLSAgICAgICBieXRlcyBieSBzZXR0aW5nIHRoZSAnc2F2ZScgcGFyYW1ldGVyIChzZWUgcG5nLmgpIGJ1dAotICAgICAgIHRoZW4gbGlicG5nIHdpbGwgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIGludGVybmFsbHkuCi0gICAgICovCi0gfQotCi0gLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBlYWNoIHJvdyBvZiBpbWFnZQotICAgIGRhdGEgaXMgY29tcGxldGUgKi8KLSB2b2lkCi0gcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBuZXdfcm93LAotICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKQotIHsKLSAgICAvKiBJZiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCwgYW5kIHlvdSB0dXJuZWQKLSAgICAgICBvbiB0aGUgaW50ZXJsYWNlIGhhbmRsZXIsIHRoaXMgZnVuY3Rpb24gd2lsbAotICAgICAgIGJlIGNhbGxlZCBmb3IgZXZlcnkgcm93IGluIGV2ZXJ5IHBhc3MuICBTb21lCi0gICAgICAgb2YgdGhlc2Ugcm93cyB3aWxsIG5vdCBiZSBjaGFuZ2VkIGZyb20gdGhlCi0gICAgICAgcHJldmlvdXMgcGFzcy4gIFdoZW4gdGhlIHJvdyBpcyBub3QgY2hhbmdlZCwKLSAgICAgICB0aGUgbmV3X3JvdyB2YXJpYWJsZSB3aWxsIGJlIE5VTEwuICBUaGUgcm93cwotICAgICAgIGFuZCBwYXNzZXMgYXJlIGNhbGxlZCBpbiBvcmRlciwgc28geW91IGRvbid0Ci0gICAgICAgcmVhbGx5IG5lZWQgdGhlIHJvd19udW0gYW5kIHBhc3MsIGJ1dCBJJ20KLSAgICAgICBzdXBwbHlpbmcgdGhlbSBiZWNhdXNlIGl0IG1heSBtYWtlIHlvdXIgbGlmZQotICAgICAgIGVhc2llci4KLQotICAgICAgIElmIHlvdSBkaWQgbm90IHR1cm4gb24gaW50ZXJsYWNlIGhhbmRsaW5nIHRoZW4KLSAgICAgICB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIGZvciBlYWNoIHJvdyBvZiBlYWNoCi0gICAgICAgc3ViLWltYWdlIHdoZW4gdGhlIGltYWdlIGlzIGludGVybGFjZWQuICBJbiB0aGlzCi0gICAgICAgY2FzZSAncm93X251bScgaXMgdGhlIHJvdyBpbiB0aGUgc3ViLWltYWdlLCBub3QKLSAgICAgICB0aGUgcm93IGluIHRoZSBvdXRwdXQgaW1hZ2UgYXMgaXQgaXMgaW4gYWxsIG90aGVyCi0gICAgICAgY2FzZXMuCi0KLSAgICAgICBGb3IgdGhlIG5vbi1OVUxMIHJvd3Mgb2YgaW50ZXJsYWNlZCBpbWFnZXMgd2hlbgotICAgICAgIHlvdSBoYXZlIHN3aXRjaGVkIG9uIGxpYnBuZyBpbnRlcmxhY2UgaGFuZGxpbmcsCi0gICAgICAgeW91IG11c3QgY2FsbCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3coKQotICAgICAgIHBhc3NpbmcgaW4gdGhlIHJvdyBhbmQgdGhlIG9sZCByb3cuICBZb3UgY2FuCi0gICAgICAgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBOVUxMIHJvd3MgKGl0IHdpbGwganVzdAotICAgICAgIHJldHVybikgYW5kIGZvciBub24taW50ZXJsYWNlZCBpbWFnZXMgKGl0IGp1c3QKLSAgICAgICBkb2VzIHRoZSBtZW1jcHkgZm9yIHlvdSkgaWYgaXQgd2lsbCBtYWtlIHRoZQotICAgICAgIGNvZGUgZWFzaWVyLiAgVGh1cywgeW91IGNhbiBqdXN0IGRvIHRoaXMgZm9yCi0gICAgICAgYWxsIGNhc2VzIGlmIHlvdSBzd2l0Y2ggb24gaW50ZXJsYWNlIGhhbmRsaW5nOwotICAgICAqLwotCi0gICAgICAgIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdyhwbmdfcHRyLCBvbGRfcm93LAotICAgICAgICAgIG5ld19yb3cpOwotCi0gICAgLyogd2hlcmUgb2xkX3JvdyBpcyB3aGF0IHdhcyBkaXNwbGF5ZWQKLSAgICAgICBwcmV2aW91c2x5IGZvciB0aGUgcm93LiAgTm90ZSB0aGF0IHRoZSBmaXJzdAotICAgICAgIHBhc3MgKHBhc3MgPT0gMCwgcmVhbGx5KSB3aWxsIGNvbXBsZXRlbHkgY292ZXIKLSAgICAgICB0aGUgb2xkIHJvdywgc28gdGhlIHJvd3MgZG8gbm90IGhhdmUgdG8gYmUKLSAgICAgICBpbml0aWFsaXplZC4gIEFmdGVyIHRoZSBmaXJzdCBwYXNzIChhbmQgb25seQotICAgICAgIGZvciBpbnRlcmxhY2VkIGltYWdlcyksIHlvdSB3aWxsIGhhdmUgdG8gcGFzcwotICAgICAgIHRoZSBjdXJyZW50IHJvdywgYW5kIHRoZSBmdW5jdGlvbiB3aWxsIGNvbWJpbmUKLSAgICAgICB0aGUgb2xkIHJvdyBhbmQgdGhlIG5ldyByb3cuCi0KLSAgICAgICBZb3UgY2FuIGFsc28gY2FsbCBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlIGluIHRoaXMKLSAgICAgICBjYWxsYmFjayAtIHNlZSBhYm92ZS4KLSAgICAqLwotIH0KLQotIHZvaWQKLSBlbmRfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi0gewotICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSB3aG9sZSBpbWFnZQotICAgICAgIGhhcyBiZWVuIHJlYWQsIGluY2x1ZGluZyBhbnkgY2h1bmtzIGFmdGVyIHRoZQotICAgICAgIGltYWdlICh1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBJRU5EKS4gIFlvdQotICAgICAgIHdpbGwgdXN1YWxseSBoYXZlIHRoZSBzYW1lIGluZm8gY2h1bmsgYXMgeW91Ci0gICAgICAgaGFkIGluIHRoZSBoZWFkZXIsIGFsdGhvdWdoIHNvbWUgZGF0YSBtYXkgaGF2ZQotICAgICAgIGJlZW4gYWRkZWQgdG8gdGhlIGNvbW1lbnRzIGFuZCB0aW1lIGZpZWxkcy4KLQotICAgICAgIE1vc3QgcGVvcGxlIHdvbid0IGRvIG11Y2ggaGVyZSwgcGVyaGFwcyBzZXR0aW5nCi0gICAgICAgYSBmbGFnIHRoYXQgbWFya3MgdGhlIGltYWdlIGFzIGZpbmlzaGVkLgotICAgICAqLwotIH0KLQotCi0KLUlWLiBXcml0aW5nCi0KLU11Y2ggb2YgdGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gcmVhZGluZy4gIEhvd2V2ZXIsIGV2ZXJ5dGhpbmcgb2YKLWltcG9ydGFuY2UgaXMgcmVwZWF0ZWQgaGVyZSwgc28geW91IHdvbid0IGhhdmUgdG8gY29uc3RhbnRseSBsb29rCi1iYWNrIHVwIGluIHRoZSByZWFkaW5nIHNlY3Rpb24gdG8gdW5kZXJzdGFuZCB3cml0aW5nLgotCi1TZXR1cAotCi1Zb3Ugd2lsbCB3YW50IHRvIGRvIHRoZSBJL08gaW5pdGlhbGl6YXRpb24gYmVmb3JlIHlvdSBnZXQgaW50byBsaWJwbmcsCi1zbyBpZiBpdCBkb2Vzbid0IHdvcmssIHlvdSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHVuZG8uIElmIHlvdSBhcmUgbm90Ci11c2luZyB0aGUgc3RhbmRhcmQgSS9PIGZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZCB0byByZXBsYWNlIHRoZW0gd2l0aAotY3VzdG9tIHdyaXRpbmcgZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyIEN1c3RvbWl6aW5nIGxpYnBuZy4KLQotICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKLQotICAgIGlmICghZnApCi0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0KLU5leHQsIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4KLUFzIHRoZXNlIGNhbiBiZSBib3RoIHJlbGF0aXZlbHkgbGFyZ2UsIHlvdSBtYXkgbm90IHdhbnQgdG8gc3RvcmUgdGhlc2UKLW9uIHRoZSBzdGFjaywgdW5sZXNzIHlvdSBoYXZlIHN0YWNrIHNwYWNlIHRvIHNwYXJlLiAgT2YgY291cnNlLCB5b3UKLXdpbGwgd2FudCB0byBjaGVjayBpZiB0aGV5IHJldHVybiBOVUxMLiAgSWYgeW91IGFyZSBhbHNvIHJlYWRpbmcsCi15b3Ugd29uJ3Qgd2FudCB0byBuYW1lIHlvdXIgcmVhZCBzdHJ1Y3R1cmUgYW5kIHlvdXIgd3JpdGUgc3RydWN0dXJlCi1ib3RoICJwbmdfcHRyIjsgeW91IGNhbiBjYWxsIHRoZW0gYW55dGhpbmcgeW91IGxpa2UsIHN1Y2ggYXMKLSJyZWFkX3B0ciIgYW5kICJ3cml0ZV9wdHIiLiAgTG9vayBhdCBwbmd0ZXN0LmMsIGZvciBleGFtcGxlLgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0Ci0gICAgICAgKFBOR19MSUJQTkdfVkVSX1NUUklORywgKHBuZ192b2lkcCl1c2VyX2Vycm9yX3B0ciwKLSAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLQotICAgIGlmICghcG5nX3B0cikKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLQotICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0gICAgaWYgKCFpbmZvX3B0cikKLSAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLWRlZmluZSBQTkdfVVNFUl9NRU1fU1VQUE9SVEVEIGFuZCB1c2UKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSBpbnN0ZWFkIG9mIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KCk6Ci0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMgotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotQWZ0ZXIgeW91IGhhdmUgdGhlc2Ugc3RydWN0dXJlcywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgdGhlCi1lcnJvciBoYW5kbGluZy4gIFdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8KLWxvbmdqbXAoKSBiYWNrIHRvIHlvdXIgcm91dGluZS4gIFRoZXJlZm9yZSwgeW91IHdpbGwgbmVlZCB0byBjYWxsCi1zZXRqbXAoKSBhbmQgcGFzcyB0aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdQotd3JpdGUgdGhlIGZpbGUgZnJvbSBkaWZmZXJlbnQgcm91dGluZXMsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlCi10aGUgcG5nX2ptcGJ1ZihwbmdfcHRyKSBldmVyeSB0aW1lIHlvdSBlbnRlciBhIG5ldyByb3V0aW5lIHRoYXQgd2lsbAotY2FsbCBhIHBuZ18qKCkgZnVuY3Rpb24uICBTZWUgeW91ciBkb2N1bWVudGF0aW9uIG9mIHNldGptcC9sb25nam1wCi1mb3IgeW91ciBjb21waWxlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXRqbXAvbG9uZ2ptcC4gIFNlZQotdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yIGhhbmRsaW5nIGluIHRoZSBDdXN0b21pemluZyBMaWJwbmcKLXNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGxpYnBuZyBlcnJvciBoYW5kbGluZy4KLQotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLSAgICAgICBmY2xvc2UoZnApOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLSAgICAuLi4KLSAgICByZXR1cm47Ci0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAsIGluIHdoaWNoIGNhc2UKLWVycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KLQotWW91IGNhbiAjZGVmaW5lIFBOR19BQk9SVCgpIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZwotbW9yZSB1c2VmdWwgdGhhbiBhYm9ydCgpLCBhcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QKLXJldHVybi4KLQotQ2hlY2tpbmcgZm9yIGludmFsaWQgcGFsZXR0ZSBpbmRleCBvbiB3cml0ZSB3YXMgYWRkZWQgYXQgbGlicG5nCi0xLjUuMTAuICBJZiBhIHBpeGVsIGNvbnRhaW5zIGFuIGludmFsaWQgKG91dC1vZi1yYW5nZSkgaW5kZXggbGlicG5nIGlzc3VlcwotYSBiZW5pZ24gZXJyb3IuICBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBiZWNhdXNlIHRoaXMgY29uZGl0aW9uIGlzIGFuCi1lcnJvciBhY2NvcmRpbmcgdG8gdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBDbGF1c2UgMTEuMy4yLCBidXQgdGhlIGVycm9yIGNhbgotYmUgaWdub3JlZCBpbiBlYWNoIHBuZ19wdHIgd2l0aAotCi0gICBwbmdfc2V0X2NoZWNrX2Zvcl9pbnZhbGlkX2luZGV4KHBuZ19wdHIsIDApOwotCi1JZiB0aGUgZXJyb3IgaXMgaWdub3JlZCwgb3IgaWYgcG5nX2Jlbmlnbl9lcnJvcigpIHRyZWF0cyBpdCBhcyBhIHdhcm5pbmcsCi1hbnkgaW52YWxpZCBwaXhlbHMgYXJlIHdyaXR0ZW4gYXMtaXMgYnkgdGhlIGVuY29kZXIsIHJlc3VsdGluZyBpbiBhbgotaW52YWxpZCBQTkcgZGF0YXN0cmVhbSBhcyBvdXRwdXQuICBJbiB0aGlzIGNhc2UgdGhlIGFwcGxpY2F0aW9uIGlzCi1yZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgcGl4ZWwgaW5kZXhlcyBhcmUgaW4gcmFuZ2Ugd2hlbiBpdCB3cml0ZXMKLWEgUExURSBjaHVuayB3aXRoIGZld2VyIGVudHJpZXMgdGhhbiB0aGUgYml0IGRlcHRoIHdvdWxkIGFsbG93LgotCi1Ob3cgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBvdXRwdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KLXVzZSB0aGUgQyBmdW5jdGlvbiBmd3JpdGUoKS4gIElmIHlvdSB1c2UgdGhpcywgeW91IHdpbGwgbmVlZCB0byBwYXNzIGEKLXZhbGlkIEZJTEUgKiBpbiB0aGUgZnVuY3Rpb24gcG5nX2luaXRfaW8oKS4gIEJlIHN1cmUgdGhhdCB0aGUgZmlsZSBpcwotb3BlbmVkIGluIGJpbmFyeSBtb2RlLiAgQWdhaW4sIGlmIHlvdSB3aXNoIHRvIGhhbmRsZSB3cml0aW5nIGRhdGEgaW4KLWFub3RoZXIgd2F5LCBzZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIEkvTyBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcKLUxpYnBuZyBzZWN0aW9uIGJlbG93LgotCi0gICAgcG5nX2luaXRfaW8ocG5nX3B0ciwgZnApOwotCi1JZiB5b3UgYXJlIGVtYmVkZGluZyB5b3VyIFBORyBpbnRvIGEgZGF0YXN0cmVhbSBzdWNoIGFzIE1ORywgYW5kIGRvbid0Ci13YW50IGxpYnBuZyB0byB3cml0ZSB0aGUgOC1ieXRlIHNpZ25hdHVyZSwgb3IgaWYgeW91IGhhdmUgYWxyZWFkeQotd3JpdHRlbiB0aGUgc2lnbmF0dXJlIGluIHlvdXIgYXBwbGljYXRpb24sIHVzZQotCi0gICAgcG5nX3NldF9zaWdfYnl0ZXMocG5nX3B0ciwgOCk7Ci0KLXRvIGluZm9ybSBsaWJwbmcgdGhhdCBpdCBzaG91bGQgbm90IHdyaXRlIGEgc2lnbmF0dXJlLgotCi1Xcml0ZSBjYWxsYmFja3MKLQotQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgdXAgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUKLWNhbGxlZCBhZnRlciBlYWNoIHJvdyBoYXMgYmVlbiB3cml0dGVuLCB3aGljaCB5b3UgY2FuIHVzZSB0byBjb250cm9sCi1hIHByb2dyZXNzIG1ldGVyIG9yIHRoZSBsaWtlLiAgSXQncyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLgotWW91IG11c3Qgc3VwcGx5IGEgZnVuY3Rpb24KLQotICAgIHZvaWQgd3JpdGVfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHJvdywKLSAgICAgICBpbnQgcGFzcyk7Ci0gICAgewotICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgIndyaXRlX3Jvd19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbihwbmdfcHRyLCB3cml0ZV9yb3dfY2FsbGJhY2spOwotCi1XaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRoZSByb3cgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCBhbmQKLWl0IGhhcyBhbHNvIGJlZW4gd3JpdHRlbiBvdXQuICBUaGUgJ3JvdycgYW5kICdwYXNzJyByZWZlciB0byB0aGUgbmV4dCByb3cgdG8gYmUKLWhhbmRsZWQuICBGb3IgdGhlCi1ub24taW50ZXJsYWNlZCBjYXNlIHRoZSByb3cgdGhhdCB3YXMganVzdCBoYW5kbGVkIGlzIHNpbXBseSBvbmUgbGVzcyB0aGFuIHRoZQotcGFzc2VkIGluIHJvdyBudW1iZXIsIGFuZCBwYXNzIHdpbGwgYWx3YXlzIGJlIDAuICBGb3IgdGhlIGludGVybGFjZWQgY2FzZSB0aGUKLXNhbWUgYXBwbGllcyB1bmxlc3MgdGhlIHJvdyB2YWx1ZSBpcyAwLCBpbiB3aGljaCBjYXNlIHRoZSByb3cganVzdCBoYW5kbGVkIHdhcwotdGhlIGxhc3Qgb25lIGZyb20gb25lIG9mIHRoZSBwcmVjZWRpbmcgcGFzc2VzLiAgQmVjYXVzZSBpbnRlcmxhY2luZyBtYXkgc2tpcCBhCi1wYXNzIHlvdSBjYW5ub3QgYmUgc3VyZSB0aGF0IHRoZSBwcmVjZWRpbmcgcGFzcyBpcyBqdXN0ICdwYXNzLTEnLCBpZiB5b3UgcmVhbGx5Ci1uZWVkIHRvIGtub3cgd2hhdCB0aGUgbGFzdCBwYXNzIGlzIHJlY29yZCAocm93LHBhc3MpIGZyb20gdGhlIGNhbGxiYWNrIGFuZCB1c2UKLXRoZSBsYXN0IHJlY29yZGVkIHZhbHVlIGVhY2ggdGltZS4KLQotQXMgd2l0aCB0aGUgdXNlciB0cmFuc2Zvcm0geW91IGNhbiBmaW5kIHRoZSBvdXRwdXQgcm93IHVzaW5nIHRoZQotUE5HX1JPV19GUk9NX1BBU1NfUk9XIG1hY3JvLgotCi1Zb3Ugbm93IGhhdmUgdGhlIG9wdGlvbiBvZiBtb2RpZnlpbmcgaG93IHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwKLXJ1bi4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBtYXkgYmUgdXNlZnVsCi1pbiBzb21lIGNhc2VzLCBsaWtlIGlmIHlvdSBuZWVkIHRvIHdyaXRlIFBORyBmaWxlcyBleHRyZW1lbHkgZmFzdCBhbmQKLWFyZSB3aWxsaW5nIHRvIGdpdmUgdXAgc29tZSBjb21wcmVzc2lvbiwgb3IgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZQotbWF4aW11bSBwb3NzaWJsZSBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBzbG93ZXIgd3JpdGluZy4gIElmIHlvdQotaGF2ZSBubyBzcGVjaWFsIG5lZWRzIGluIHRoaXMgYXJlYSwgbGV0IHRoZSBsaWJyYXJ5IGRvIHdoYXQgaXQgd2FudHMgYnkKLW5vdCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYXQgYWxsLCBhcyBpdCBoYXMgYmVlbiB0dW5lZCB0byBkZWxpdmVyIGEgZ29vZAotc3BlZWQvY29tcHJlc3Npb24gcmF0aW8uIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHBuZ19zZXRfZmlsdGVyKCkgaXMKLXRoZSBmaWx0ZXIgbWV0aG9kLCBmb3Igd2hpY2ggdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSAwIChhcyBvZiB0aGUKLUp1bHkgMTk5OSBQTkcgc3BlY2lmaWNhdGlvbiwgdmVyc2lvbiAxLjIpIG9yIDY0IChpZiB5b3UgYXJlIHdyaXRpbmcKLWEgUE5HIGRhdGFzdHJlYW0gdGhhdCBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORyBkYXRhc3RyZWFtKS4gIFRoZSB0aGlyZAotcGFyYW1ldGVyIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGljaCBmaWx0ZXIgdHlwZShzKSBhcmUgdG8gYmUgdGVzdGVkCi1mb3IgZWFjaCBzY2FubGluZS4gIFNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIHNwZWNpZmljCi1maWx0ZXIgdHlwZXMuCi0KLQotICAgIC8qIHR1cm4gb24gb3Igb2ZmIGZpbHRlcmluZywgYW5kL29yIGNob29zZQotICAgICAgIHNwZWNpZmljIGZpbHRlcnMuICBZb3UgY2FuIHVzZSBlaXRoZXIgYSBzaW5nbGUKLSAgICAgICBQTkdfRklMVEVSX1ZBTFVFX05BTUUgb3IgdGhlIGJpdHdpc2UgT1Igb2Ygb25lCi0gICAgICAgb3IgbW9yZSBQTkdfRklMVEVSX05BTUUgbWFza3MuCi0gICAgICovCi0gICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgMCwKLSAgICAgICBQTkdfRklMVEVSX05PTkUgIHwgUE5HX0ZJTFRFUl9WQUxVRV9OT05FIHwKLSAgICAgICBQTkdfRklMVEVSX1NVQiAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgIHwKLSAgICAgICBQTkdfRklMVEVSX1VQICAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9VUCAgIHwKLSAgICAgICBQTkdfRklMVEVSX0FWRyAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9BVkcgIHwKLSAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSHwKLSAgICAgICBQTkdfQUxMX0ZJTFRFUlMgIHwgUE5HX0ZBU1RfRklMVEVSUyk7Ci0KLUlmIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHN0YXJ0IGFuZCBzdG9wIHVzaW5nIHBhcnRpY3VsYXIgZmlsdGVycyBkdXJpbmcKLWNvbXByZXNzaW9uLCBpdCBzaG91bGQgc3RhcnQgb3V0IHdpdGggYWxsIG9mIHRoZSBmaWx0ZXJzICh0byBlbnN1cmUgdGhhdAotdGhlIHByZXZpb3VzIHJvdyBvZiBwaXhlbHMgd2lsbCBiZSBzdG9yZWQgaW4gY2FzZSBpdCdzIG5lZWRlZCBsYXRlciksCi1hbmQgdGhlbiBhZGQgYW5kIHJlbW92ZSB0aGVtIGFmdGVyIHRoZSBzdGFydCBvZiBjb21wcmVzc2lvbi4KLQotSWYgeW91IGFyZSB3cml0aW5nIGEgUE5HIGRhdGFzdHJlYW0gdGhhdCBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORwotZGF0YXN0cmVhbSwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgY2FuIGJlIGVpdGhlciAwIG9yIDY0LgotCi1UaGUgcG5nX3NldF9jb21wcmVzc2lvbl8qKCkgZnVuY3Rpb25zIGludGVyZmFjZSB0byB0aGUgemxpYiBjb21wcmVzc2lvbgotbGlicmFyeSwgYW5kIHNob3VsZCBtb3N0bHkgYmUgaWdub3JlZCB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZQotZG9pbmcuICBUaGUgb25seSBnZW5lcmFsbHkgdXNlZnVsIGNhbGwgaXMgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCgpCi13aGljaCBjaGFuZ2VzIGhvdyBtdWNoIHRpbWUgemxpYiBzcGVuZHMgb24gdHJ5aW5nIHRvIGNvbXByZXNzIHRoZSBpbWFnZQotZGF0YS4gIFNlZSB0aGUgQ29tcHJlc3Npb24gTGlicmFyeSAoemxpYi5oIGFuZCBhbGdvcml0aG0udHh0LCBkaXN0cmlidXRlZAotd2l0aCB6bGliKSBmb3IgZGV0YWlscyBvbiB0aGUgY29tcHJlc3Npb24gbGV2ZWxzLgotCi0gICAgI2luY2x1ZGUgemxpYi5oCi0KLSAgICAvKiBTZXQgdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsCi0gICAgICAgIFpfQkVTVF9DT01QUkVTU0lPTik7Ci0KLSAgICAvKiBTZXQgb3RoZXIgemxpYiBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2luZyBJREFUICovCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwgMTUpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgODE5MikKLQotICAgIC8qIFNldCB6bGliIHBhcmFtZXRlcnMgZm9yIHRleHQgY29tcHJlc3Npb24KLSAgICAgKiBJZiB5b3UgZG9uJ3QgY2FsbCB0aGVzZSwgdGhlIHBhcmFtZXRlcnMKLSAgICAgKiBmYWxsIGJhY2sgb24gdGhvc2UgZGVmaW5lZCBmb3IgSURBVCBjaHVua3MKLSAgICAgKi8KLSAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIDgpOwotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7Ci0gICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCA4KTsKLQotU2V0dGluZyB0aGUgY29udGVudHMgb2YgaW5mbyBmb3Igb3V0cHV0Ci0KLVlvdSBub3cgbmVlZCB0byBmaWxsIGluIHRoZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhbGwgdGhlIGRhdGEgeW91Ci13aXNoIHRvIHdyaXRlIGJlZm9yZSB0aGUgYWN0dWFsIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBvbmx5IHRoaW5nIHlvdQotYXJlIGFsbG93ZWQgdG8gd3JpdGUgYWZ0ZXIgdGhlIGltYWdlIGlzIHRoZSB0ZXh0IGNodW5rcyBhbmQgdGhlIHRpbWUKLWNodW5rIChhcyBvZiBQTkcgU3BlY2lmaWNhdGlvbiAxLjIsIGFueXdheSkuICBTZWUgcG5nX3dyaXRlX2VuZCgpIGFuZAotdGhlIGxhdGVzdCBQTkcgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGF0LiAgSWYgeW91Ci13aXNoIHRvIHdyaXRlIHRoZW0gYmVmb3JlIHRoZSBpbWFnZSwgZmlsbCB0aGVtIGluIG5vdywgYW5kIGZsYWcgdGhhdAotZGF0YSBhcyBiZWluZyB2YWxpZC4gIElmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRhdGEsIGRvbid0Ci1maWxsIHRoZW0gdW50aWwgcG5nX3dyaXRlX2VuZCgpLiAgRm9yIGFsbCB0aGUgZmllbGRzIGluIHBuZ19pbmZvIGFuZAotdGhlaXIgZGF0YSB0eXBlcywgc2VlIHBuZy5oLiAgRm9yIGV4cGxhbmF0aW9ucyBvZiB3aGF0IHRoZSBmaWVsZHMKLWNvbnRhaW4sIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi0KLVNvbWUgb2YgdGhlIG1vcmUgaW1wb3J0YW50IHBhcnRzIG9mIHRoZSBwbmdfaW5mbyBhcmU6Ci0KLSAgICBwbmdfc2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgYml0X2RlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2VfdHlwZSwKLSAgICAgICBjb21wcmVzc2lvbl90eXBlLCBmaWx0ZXJfbWV0aG9kKQotCi0gICAgd2lkdGggICAgICAgICAgLSBob2xkcyB0aGUgd2lkdGggb2YgdGhlIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBpbiBwaXhlbHMgKHVwIHRvIDJeMzEpLgotCi0gICAgaGVpZ2h0ICAgICAgICAgLSBob2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLQotICAgIGJpdF9kZXB0aCAgICAgIC0gaG9sZHMgdGhlIGJpdCBkZXB0aCBvZiBvbmUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBpbWFnZSBjaGFubmVscy4KLSAgICAgICAgICAgICAgICAgICAgICh2YWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2Ci0gICAgICAgICAgICAgICAgICAgICBhbmQgZGVwZW5kIGFsc28gb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlLiAgU2VlIGFsc28gc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgICAgIGJpdHMgKHNCSVQpIGJlbG93KS4KLQotICAgIGNvbG9yX3R5cGUgICAgIC0gZGVzY3JpYmVzIHdoaWNoIGNvbG9yL2FscGhhCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVscyBhcmUgcHJlc2VudC4KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVkKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0KLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX1BBTEVUVEUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0NPTE9SCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19BTFBIQQotCi0gICAgaW50ZXJsYWNlX3R5cGUgLSBQTkdfSU5URVJMQUNFX05PTkUgb3IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfQURBTTcKLQotICAgIGNvbXByZXNzaW9uX3R5cGUgLSAobXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfREVGQVVMVCkKLQotICAgIGZpbHRlcl9tZXRob2QgIC0gKG11c3QgYmUgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQKLSAgICAgICAgICAgICAgICAgICAgIG9yLCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBQTkcgdG8KLSAgICAgICAgICAgICAgICAgICAgIGJlIGVtYmVkZGVkIGluIGEgTU5HIGRhdGFzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICAgICAgICAgUE5HX0lOVFJBUElYRUxfRElGRkVSRU5DSU5HKQotCi1JZiB5b3UgY2FsbCBwbmdfc2V0X0lIRFIoKSwgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBvZiB0aGUKLW90aGVyIHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGV5IG1pZ2h0IHJlcXVpcmUgYWNjZXNzIHRvIHNvbWUgb2YKLXRoZSBJSERSIHNldHRpbmdzLiAgVGhlIHJlbWFpbmluZyBwbmdfc2V0XyooKSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAotaW4gYW55IG9yZGVyLgotCi1JZiB5b3Ugd2lzaCwgeW91IGNhbiByZXNldCB0aGUgY29tcHJlc3Npb25fdHlwZSwgaW50ZXJsYWNlX3R5cGUsIG9yCi1maWx0ZXJfbWV0aG9kIGxhdGVyIGJ5IGNhbGxpbmcgcG5nX3NldF9JSERSKCkgYWdhaW47IGlmIHlvdSBkbyB0aGlzLCB0aGUKLXdpZHRoLCBoZWlnaHQsIGJpdF9kZXB0aCwgYW5kIGNvbG9yX3R5cGUgbXVzdCBiZSB0aGUgc2FtZSBpbiBlYWNoIGNhbGwuCi0KLSAgICBwbmdfc2V0X1BMVEUocG5nX3B0ciwgaW5mb19wdHIsIHBhbGV0dGUsCi0gICAgICAgbnVtX3BhbGV0dGUpOwotCi0gICAgcGFsZXR0ZSAgICAgICAgLSB0aGUgcGFsZXR0ZSBmb3IgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIChhcnJheSBvZiBwbmdfY29sb3IpCi0gICAgbnVtX3BhbGV0dGUgICAgLSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZQotCi0KLSAgICBwbmdfc2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsIGZpbGVfZ2FtbWEpOwotICAgIHBuZ19zZXRfZ0FNQV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgaW50X2ZpbGVfZ2FtbWEpOwotCi0gICAgZmlsZV9nYW1tYSAgICAgLSB0aGUgZ2FtbWEgYXQgd2hpY2ggdGhlIGltYWdlIHdhcwotICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCAoUE5HX0lORk9fZ0FNQSkKLQotICAgIGludF9maWxlX2dhbW1hIC0gMTAwLDAwMCB0aW1lcyB0aGUgZ2FtbWEgYXQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZSB3YXMgY3JlYXRlZAotCi0gICAgcG5nX3NldF9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLCAgd2hpdGVfeCwgd2hpdGVfeSwgcmVkX3gsIHJlZF95LAotICAgICAgICAgICAgICAgICAgICAgZ3JlZW5feCwgZ3JlZW5feSwgYmx1ZV94LCBibHVlX3kpCi0gICAgcG5nX3NldF9jSFJNX1hZWihwbmdfcHRyLCBpbmZvX3B0ciwgcmVkX1gsIHJlZF9ZLCByZWRfWiwgZ3JlZW5fWCwKLSAgICAgICAgICAgICAgICAgICAgIGdyZWVuX1ksIGdyZWVuX1osIGJsdWVfWCwgYmx1ZV9ZLCBibHVlX1opCi0gICAgcG5nX3NldF9jSFJNX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBpbnRfd2hpdGVfeCwgaW50X3doaXRlX3ksCi0gICAgICAgICAgICAgICAgICAgICBpbnRfcmVkX3gsIGludF9yZWRfeSwgaW50X2dyZWVuX3gsIGludF9ncmVlbl95LAotICAgICAgICAgICAgICAgICAgICAgaW50X2JsdWVfeCwgaW50X2JsdWVfeSkKLSAgICBwbmdfc2V0X2NIUk1fWFlaX2ZpeGVkKHBuZ19wdHIsIGluZm9fcHRyLCBpbnRfcmVkX1gsIGludF9yZWRfWSwKLSAgICAgICAgICAgICAgICAgICAgIGludF9yZWRfWiwgaW50X2dyZWVuX1gsIGludF9ncmVlbl9ZLCBpbnRfZ3JlZW5fWiwKLSAgICAgICAgICAgICAgICAgICAgIGludF9ibHVlX1gsIGludF9ibHVlX1ksIGludF9ibHVlX1opCi0KLSAgICB7d2hpdGUscmVkLGdyZWVuLGJsdWV9X3t4LHl9Ci0gICAgICAgICAgICAgICAgICAgICBBIGNvbG9yIHNwYWNlIGVuY29kaW5nIHNwZWNpZmllZCB1c2luZyB0aGUgY2hyb21hdGljaXRpZXMKLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBlbmQgcG9pbnRzIGFuZCB0aGUgd2hpdGUgcG9pbnQuCi0KLSAgICB7cmVkLGdyZWVuLGJsdWV9X3tYLFksWn0KLSAgICAgICAgICAgICAgICAgICAgIEEgY29sb3Igc3BhY2UgZW5jb2Rpbmcgc3BlY2lmaWVkIHVzaW5nIHRoZSBlbmNvZGluZyBlbmQKLSAgICAgICAgICAgICAgICAgICAgIHBvaW50cyAtIHRoZSBDSUUgdHJpc3RpbXVsdXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW50ZW5kZWQKLSAgICAgICAgICAgICAgICAgICAgIGNvbG9yIG9mIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzIGluIHRoZSBQTkcgUkdCCi0gICAgICAgICAgICAgICAgICAgICBkYXRhLiAgVGhlIHdoaXRlIHBvaW50IGlzIHNpbXBseSB0aGUgc3VtIG9mIHRoZSB0aHJlZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgIHBvaW50cy4KLQotICAgIHBuZ19zZXRfc1JHQihwbmdfcHRyLCBpbmZvX3B0ciwgc3JnYl9pbnRlbnQpOwotCi0gICAgc3JnYl9pbnRlbnQgICAgLSB0aGUgcmVuZGVyaW5nIGludGVudAotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3NSR0IpIFRoZSBwcmVzZW5jZSBvZgotICAgICAgICAgICAgICAgICAgICAgdGhlIHNSR0IgY2h1bmsgbWVhbnMgdGhhdCB0aGUgcGl4ZWwKLSAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgaW4gdGhlIHNSR0IgY29sb3Igc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIGNodW5rIGFsc28gaW1wbGllcyBzcGVjaWZpYwotICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9mIGdBTUEgYW5kIGNIUk0uICBSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgIGludGVudCBpcyB0aGUgQ1NTLTEgcHJvcGVydHkgdGhhdAotICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gZGVmaW5lZCBieSB0aGUgSW50ZXJuYXRpb25hbAotICAgICAgICAgICAgICAgICAgICAgQ29sb3IgQ29uc29ydGl1bQotICAgICAgICAgICAgICAgICAgICAgKGh0dHA6Ly93d3cuY29sb3Iub3JnKS4KLSAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBvbmUgb2YKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9TQVRVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1BFUkNFUFRVQUwsCi0gICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfQUJTT0xVVEUsIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfUkVMQVRJVkUuCi0KLQotICAgIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgIHNyZ2JfaW50ZW50KTsKLQotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNhdXNlcyBnQU1BIGFuZAotICAgICAgICAgICAgICAgICAgICAgY0hSTSBjaHVua3Mgd2l0aCB0aGUgc3BlY2lmaWMgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0aGF0IGFyZSBjb25zaXN0ZW50IHdpdGggc1JHQiB0byBiZQotICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbi4KLQotICAgIHBuZ19zZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgbmFtZSwgY29tcHJlc3Npb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgcHJvZmxlbik7Ci0KLSAgICBuYW1lICAgICAgICAgICAgIC0gVGhlIHByb2ZpbGUgbmFtZS4KLQotICAgIGNvbXByZXNzaW9uX3R5cGUgLSBUaGUgY29tcHJlc3Npb24gdHlwZTsgYWx3YXlzCi0gICAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0JBU0UgZm9yIFBORyAxLjAuCi0gICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgZ2l2ZSBOVUxMIHRvIHRoaXMgYXJndW1lbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlIGl0LgotCi0gICAgcHJvZmlsZSAgICAgICAgICAtIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBjb2xvcgotICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGRhdGEuIE1heSBjb250YWluIE5VTHMuCi0KLSAgICBwcm9mbGVuICAgICAgICAgIC0gbGVuZ3RoIG9mIHByb2ZpbGUgZGF0YSBpbiBieXRlcy4KLQotICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgc2lnX2JpdCk7Ci0KLSAgICBzaWdfYml0ICAgICAgICAtIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zQklUKSBlYWNoIG9mIHRoZSBncmF5LCByZWQsCi0gICAgICAgICAgICAgICAgICAgICBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMsIHdoaWNoZXZlciBhcmUKLSAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gY29sb3IgdHlwZQotICAgICAgICAgICAgICAgICAgICAgKHBuZ19jb2xvcl8xNikKLQotICAgIHBuZ19zZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgdHJhbnNfYWxwaGEsCi0gICAgICAgbnVtX3RyYW5zLCB0cmFuc19jb2xvcik7Ci0KLSAgICB0cmFuc19hbHBoYSAgICAtIGFycmF5IG9mIGFscGhhICh0cmFuc3BhcmVuY3kpCi0gICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGZvciBwYWxldHRlIChQTkdfSU5GT190Uk5TKQotCi0gICAgbnVtX3RyYW5zICAgICAgLSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgZW50cmllcwotICAgICAgICAgICAgICAgICAgICAgKFBOR19JTkZPX3RSTlMpCi0KLSAgICB0cmFuc19jb2xvciAgICAtIGdyYXlsZXZlbCBvciBjb2xvciBzYW1wbGUgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAoaW4gb3JkZXIgcmVkLCBncmVlbiwgYmx1ZSkgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCi0gICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQotCi0gICAgcG5nX3NldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCBoaXN0KTsKLQotICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikgKFBOR19JTkZPX2hJU1QpCi0KLSAgICBwbmdfc2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsIG1vZF90aW1lKTsKLQotICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAgKFBOR19WQUxJRF90SU1FKQotCi0gICAgcG5nX3NldF9iS0dEKHBuZ19wdHIsIGluZm9fcHRyLCBiYWNrZ3JvdW5kKTsKLQotICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAob2YgdHlwZQotICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yXzE2cCkgKFBOR19WQUxJRF9iS0dEKQotCi0gICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCB0ZXh0X3B0ciwgbnVtX3RleHQpOwotCi0gICAgdGV4dF9wdHIgICAgICAgLSBhcnJheSBvZiBwbmdfdGV4dCBob2xkaW5nIGltYWdlCi0gICAgICAgICAgICAgICAgICAgICBjb21tZW50cwotCi0gICAgdGV4dF9wdHJbaV0uY29tcHJlc3Npb24gLSB0eXBlIG9mIGNvbXByZXNzaW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgb24gInRleHQiIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX05PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JVFhUX0NPTVBSRVNTSU9OX3pUWHQKLSAgICB0ZXh0X3B0cltpXS5rZXkgICAtIGtleXdvcmQgZm9yIGNvbW1lbnQuICBNdXN0IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgotICAgIHRleHRfcHRyW2ldLnRleHQgIC0gdGV4dCBjb21tZW50cyBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuICBDYW4gYmUgTlVMTCBvciBlbXB0eS4KLSAgICB0ZXh0X3B0cltpXS50ZXh0X2xlbmd0aCAtIGxlbmd0aCBvZiB0ZXh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgaVRYdAotICAgIHRleHRfcHRyW2ldLml0eHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIGl0eHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciB0RVh0L3pUWHQKLSAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKE5VTEwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBmb3IgdW5rbm93bikuCi0gICAgdGV4dF9wdHJbaV0udHJhbnNsYXRlZF9rZXl3b3JkICAtIGtleXdvcmQgaW4gVVRGLTggKE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvciBlbXB0eSBmb3IgdW5rbm93bikuCi0KLSAgICBOb3RlIHRoYXQgdGhlIGl0eHRfbGVuZ3RoLCBsYW5nLCBhbmQgbGFuZ19rZXkKLSAgICBtZW1iZXJzIG9mIHRoZSB0ZXh0X3B0ciBzdHJ1Y3R1cmUgb25seSBleGlzdCB3aGVuIHRoZQotICAgIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBpVFh0IGNodW5rIHN1cHBvcnQuICBQcmlvciB0bwotICAgIGxpYnBuZy0xLjQuMCB0aGUgbGlicmFyeSB3YXMgYnVpbHQgYnkgZGVmYXVsdCB3aXRob3V0Ci0gICAgaVRYdCBzdXBwb3J0LiBBbHNvIG5vdGUgdGhhdCB3aGVuIGlUWHQgaXMgc3VwcG9ydGVkLAotICAgIHRoZXkgY29udGFpbiBOVUxMIHBvaW50ZXJzIHdoZW4gdGhlICJjb21wcmVzc2lvbiIKLSAgICBmaWVsZCBjb250YWlucyBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yCi0gICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdC4KLQotICAgIG51bV90ZXh0ICAgICAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCi0KLSAgICBwbmdfc2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsICZwYWxldHRlX3B0ciwKLSAgICAgICBudW1fc3BhbGV0dGVzKTsKLQotICAgIHBhbGV0dGVfcHRyICAgIC0gYXJyYXkgb2YgcG5nX3NQTFRfc3RydWN0IHN0cnVjdHVyZXMKLSAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHBhbGV0dGVzCi0gICAgICAgICAgICAgICAgICAgICBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0gICAgbnVtX3NwYWxldHRlcyAgLSBudW1iZXIgb2YgcGFsZXR0ZSBzdHJ1Y3R1cmVzIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICBhZGRlZC4KLQotICAgIHBuZ19zZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgb2Zmc2V0X3gsIG9mZnNldF95LAotICAgICAgICB1bml0X3R5cGUpOwotCi0gICAgb2Zmc2V0X3ggIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIGxlZnQKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbgotCi0gICAgb2Zmc2V0X3kgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcAotICAgICAgICAgICAgICAgICAgICAgZWRnZSBvZiB0aGUgc2NyZWVuCi0KLSAgICB1bml0X3R5cGUgLSBQTkdfT0ZGU0VUX1BJWEVMLCBQTkdfT0ZGU0VUX01JQ1JPTUVURVIKLQotICAgIHBuZ19zZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgcmVzX3gsIHJlc195LAotICAgICAgICB1bml0X3R5cGUpOwotCi0gICAgcmVzX3ggICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICBpbiB4IGRpcmVjdGlvbgotCi0gICAgcmVzX3kgICAgICAgLSBwaXhlbHMvdW5pdCBwaHlzaWNhbCByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICBpbiB5IGRpcmVjdGlvbgotCi0gICAgdW5pdF90eXBlICAgLSBQTkdfUkVTT0xVVElPTl9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgUE5HX1JFU09MVVRJT05fTUVURVIKLQotICAgIHBuZ19zZXRfc0NBTChwbmdfcHRyLCBpbmZvX3B0ciwgdW5pdCwgd2lkdGgsIGhlaWdodCkKLQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0KLSAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLQotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBkb3VibGVzKQotCi0gICAgcG5nX3NldF9zQ0FMX3MocG5nX3B0ciwgaW5mb19wdHIsIHVuaXQsIHdpZHRoLCBoZWlnaHQpCi0KLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBzdHJpbmcKLQotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCi0KLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAmdW5rbm93bnMsCi0gICAgICAgbnVtX3Vua25vd25zKQotCi0gICAgdW5rbm93bnMgICAgICAgICAgLSBhcnJheSBvZiBwbmdfdW5rbm93bl9jaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcyBob2xkaW5nIHVua25vd24gY2h1bmtzCi0gICAgdW5rbm93bnNbaV0ubmFtZSAgLSBuYW1lIG9mIHVua25vd24gY2h1bmsKLSAgICB1bmtub3duc1tpXS5kYXRhICAtIGRhdGEgb2YgdW5rbm93biBjaHVuawotICAgIHVua25vd25zW2ldLnNpemUgIC0gc2l6ZSBvZiB1bmtub3duIGNodW5rJ3MgZGF0YQotICAgIHVua25vd25zW2ldLmxvY2F0aW9uIC0gcG9zaXRpb24gdG8gd3JpdGUgY2h1bmsgaW4gZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogZG8gbm90IHdyaXRlIGNodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSEFWRV9JSERSOiBiZWZvcmUgUExURQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0hBVkVfUExURTogYmVmb3JlIElEQVQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19BRlRFUl9JREFUOiBhZnRlciBJREFUCi0KLVRoZSAibG9jYXRpb24iIG1lbWJlciBpcyBzZXQgYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8KLXdoYXQgcGFydCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgotWW91IGNhbiBjaGFuZ2UgaXRzIHZhbHVlIGFmdGVyIGNhbGxpbmcgcG5nX3NldF91bmtub3duX2NodW5rcygpCi1hcyBkZW1vbnN0cmF0ZWQgaW4gcG5ndGVzdC5jLiAgV2l0aGluIGVhY2ggb2YgdGhlICJsb2NhdGlvbnMiLAotdGhlIGNodW5rcyBhcmUgc2VxdWVuY2VkIGFjY29yZGluZyB0byB0aGVpciBwb3NpdGlvbiBpbiB0aGUKLXN0cnVjdHVyZSAodGhhdCBpcywgdGhlIHZhbHVlIG9mICJpIiwgd2hpY2ggaXMgdGhlIG9yZGVyIGluIHdoaWNoCi10aGUgY2h1bmsgd2FzIGVpdGhlciByZWFkIGZyb20gdGhlIGlucHV0IGZpbGUgb3IgZGVmaW5lZCB3aXRoCi1wbmdfc2V0X3Vua25vd25fY2h1bmtzKS4KLQotQSBxdWljayB3b3JkIGFib3V0IHRleHQgYW5kIG51bV90ZXh0LiAgdGV4dCBpcyBhbiBhcnJheSBvZiBwbmdfdGV4dAotc3RydWN0dXJlcy4gIG51bV90ZXh0IGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgc3RydWN0dXJlcyBpbiB0aGUgYXJyYXkuCi1FYWNoIHBuZ190ZXh0IHN0cnVjdHVyZSBob2xkcyBhIGxhbmd1YWdlIGNvZGUsIGEga2V5d29yZCwgYSB0ZXh0IHZhbHVlLAotYW5kIGEgY29tcHJlc3Npb24gdHlwZS4KLQotVGhlIGNvbXByZXNzaW9uIHR5cGVzIGhhdmUgdGhlIHNhbWUgdmFsaWQgbnVtYmVycyBhcyB0aGUgY29tcHJlc3Npb24KLXR5cGVzIG9mIHRoZSBpbWFnZSBkYXRhLiAgQ3VycmVudGx5LCB0aGUgb25seSB2YWxpZCBudW1iZXIgaXMgemVyby4KLUhvd2V2ZXIsIHlvdSBjYW4gc3RvcmUgdGV4dCBlaXRoZXIgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQsIHVubGlrZQotaW1hZ2VzLCB3aGljaCBhbHdheXMgaGF2ZSB0byBiZSBjb21wcmVzc2VkLiAgU28gaWYgeW91IGRvbid0IHdhbnQgdGhlCi10ZXh0IGNvbXByZXNzZWQsIHNldCB0aGUgY29tcHJlc3Npb24gdHlwZSB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FLgotQmVjYXVzZSB0RVh0IGFuZCB6VFh0IGNodW5rcyBkb24ndCBoYXZlIGEgbGFuZ3VhZ2UgZmllbGQsIGlmIHlvdQotc3BlY2lmeSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FIG9yIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQKLWFueSBsYW5ndWFnZSBjb2RlIG9yIHRyYW5zbGF0ZWQga2V5d29yZCB3aWxsIG5vdCBiZSB3cml0dGVuIG91dC4KLQotVW50aWwgdGV4dCBnZXRzIGFyb3VuZCBhIGZldyBodW5kcmVkIGJ5dGVzLCBpdCBpcyBub3Qgd29ydGggY29tcHJlc3NpbmcgaXQuCi1BZnRlciB0aGUgdGV4dCBoYXMgYmVlbiB3cml0dGVuIG91dCB0byB0aGUgZmlsZSwgdGhlIGNvbXByZXNzaW9uIHR5cGUKLWlzIHNldCB0byBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FX1dSIG9yIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHRfV1IsCi1zbyB0aGF0IGl0IGlzbid0IHdyaXR0ZW4gb3V0IGFnYWluIGF0IHRoZSBlbmQgKGluIGNhc2UgeW91IGFyZSBjYWxsaW5nCi1wbmdfd3JpdGVfZW5kKCkgd2l0aCB0aGUgc2FtZSBzdHJ1Y3QpLgotCi1UaGUga2V5d29yZHMgdGhhdCBhcmUgZ2l2ZW4gaW4gdGhlIFBORyBTcGVjaWZpY2F0aW9uIGFyZToKLQotICAgIFRpdGxlICAgICAgICAgICAgU2hvcnQgKG9uZSBsaW5lKSB0aXRsZSBvcgotICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiBmb3IgaW1hZ2UKLQotICAgIEF1dGhvciAgICAgICAgICAgTmFtZSBvZiBpbWFnZSdzIGNyZWF0b3IKLQotICAgIERlc2NyaXB0aW9uICAgICAgRGVzY3JpcHRpb24gb2YgaW1hZ2UgKHBvc3NpYmx5IGxvbmcpCi0KLSAgICBDb3B5cmlnaHQgICAgICAgIENvcHlyaWdodCBub3RpY2UKLQotICAgIENyZWF0aW9uIFRpbWUgICAgVGltZSBvZiBvcmlnaW5hbCBpbWFnZSBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgUkZDIDExMjMgZm9ybWF0LCBzZWUgYmVsb3cpCi0KLSAgICBTb2Z0d2FyZSAgICAgICAgIFNvZnR3YXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotCi0gICAgRGlzY2xhaW1lciAgICAgICBMZWdhbCBkaXNjbGFpbWVyCi0KLSAgICBXYXJuaW5nICAgICAgICAgIFdhcm5pbmcgb2YgbmF0dXJlIG9mIGNvbnRlbnQKLQotICAgIFNvdXJjZSAgICAgICAgICAgRGV2aWNlIHVzZWQgdG8gY3JlYXRlIHRoZSBpbWFnZQotCi0gICAgQ29tbWVudCAgICAgICAgICBNaXNjZWxsYW5lb3VzIGNvbW1lbnQ7IGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgIGZyb20gb3RoZXIgaW1hZ2UgZm9ybWF0Ci0KLVRoZSBrZXl3b3JkLXRleHQgcGFpcnMgd29yayBsaWtlIHRoaXMuICBLZXl3b3JkcyBzaG91bGQgYmUgc2hvcnQKLXNpbXBsZSBkZXNjcmlwdGlvbnMgb2Ygd2hhdCB0aGUgY29tbWVudCBpcyBhYm91dC4gIFNvbWUgdHlwaWNhbAota2V5d29yZHMgYXJlIGZvdW5kIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgYXMgaXMgc29tZSByZWNvbW1lbmRhdGlvbnMKLW9uIGtleXdvcmRzLiAgWW91IGNhbiByZXBlYXQga2V5d29yZHMgaW4gYSBmaWxlLiAgWW91IGNhbiBldmVuIHdyaXRlCi1zb21lIHRleHQgYmVmb3JlIHRoZSBpbWFnZSBhbmQgc29tZSBhZnRlci4gIEZvciBleGFtcGxlLCB5b3UgbWF5IHdhbnQKLXRvIHB1dCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZSBiZWZvcmUgdGhlIGltYWdlLCBidXQgbGVhdmUgdGhlCi1kaXNjbGFpbWVyIHVudGlsIGFmdGVyLCBzbyB2aWV3ZXJzIHdvcmtpbmcgb3ZlciBtb2RlbSBjb25uZWN0aW9ucwotZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aGUgZGlzY2xhaW1lciB0byBnbyBvdmVyIHRoZSBtb2RlbSBiZWZvcmUKLXRoZXkgc3RhcnQgc2VlaW5nIHRoZSBpbWFnZS4gIEZpbmFsbHksIGtleXdvcmRzIHNob3VsZCBiZSBmdWxsCi13b3Jkcywgbm90IGFiYnJldmlhdGlvbnMuICBLZXl3b3JkcyBhbmQgdGV4dCBhcmUgaW4gdGhlIElTTyA4ODU5LTEKLShMYXRpbi0xKSBjaGFyYWN0ZXIgc2V0IChhIHN1cGVyc2V0IG9mIHJlZ3VsYXIgQVNDSUkpIGFuZCBjYW4gbm90Ci1jb250YWluIE5VTCBjaGFyYWN0ZXJzLCBhbmQgc2hvdWxkIG5vdCBjb250YWluIGNvbnRyb2wgb3Igb3RoZXIKLXVucHJpbnRhYmxlIGNoYXJhY3RlcnMuICBUbyBtYWtlIHRoZSBjb21tZW50cyB3aWRlbHkgcmVhZGFibGUsIHN0aWNrCi13aXRoIGJhc2ljIEFTQ0lJLCBhbmQgYXZvaWQgbWFjaGluZSBzcGVjaWZpYyBjaGFyYWN0ZXIgc2V0IGV4dGVuc2lvbnMKLWxpa2UgdGhlIElCTS1QQyBjaGFyYWN0ZXIgc2V0LiAgVGhlIGtleXdvcmQgbXVzdCBiZSBwcmVzZW50LCBidXQKLXlvdSBjYW4gbGVhdmUgb2ZmIHRoZSB0ZXh0IHN0cmluZyBvbiBub24tY29tcHJlc3NlZCBwYWlycy4KLUNvbXByZXNzZWQgcGFpcnMgbXVzdCBoYXZlIGEgdGV4dCBzdHJpbmcsIGFzIG9ubHkgdGhlIHRleHQgc3RyaW5nCi1pcyBjb21wcmVzc2VkIGFueXdheSwgc28gdGhlIGNvbXByZXNzaW9uIHdvdWxkIGJlIG1lYW5pbmdsZXNzLgotCi1QTkcgc3VwcG9ydHMgbW9kaWZpY2F0aW9uIHRpbWUgdmlhIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUuICBUd28KLWNvbnZlcnNpb24gcm91dGluZXMgYXJlIHByb3ZpZGVkLCBwbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZvcgotdGltZV90IGFuZCBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZvciBzdHJ1Y3QgdG0uICBUaGUKLXRpbWVfdCByb3V0aW5lIHVzZXMgZ210aW1lKCkuICBZb3UgZG9uJ3QgaGF2ZSB0byB1c2UgZWl0aGVyIG9mCi10aGVzZSwgYnV0IGlmIHlvdSB3aXNoIHRvIGZpbGwgaW4gdGhlIHBuZ190aW1lIHN0cnVjdHVyZSBkaXJlY3RseSwKLXlvdSBzaG91bGQgcHJvdmlkZSB0aGUgdGltZSBpbiB1bml2ZXJzYWwgdGltZSAoR01UKSBpZiBwb3NzaWJsZQotaW5zdGVhZCBvZiB5b3VyIGxvY2FsIHRpbWUuICBOb3RlIHRoYXQgdGhlIHllYXIgbnVtYmVyIGlzIHRoZSBmdWxsCi15ZWFyIChlLmcuIDE5OTgsIHJhdGhlciB0aGFuIDk4IC0gUE5HIGlzIHllYXIgMjAwMCBjb21wbGlhbnQhKSwgYW5kCi10aGF0IG1vbnRocyBzdGFydCB3aXRoIDEuCi0KLUlmIHlvdSB3YW50IHRvIHN0b3JlIHRoZSB0aW1lIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSBjcmVhdGlvbiwgeW91IHNob3VsZAotdXNlIGEgcGxhaW4gdEVYdCBjaHVuayB3aXRoIHRoZSAiQ3JlYXRpb24gVGltZSIga2V5d29yZC4gIFRoaXMgaXMKLW5lY2Vzc2FyeSBiZWNhdXNlIHRoZSAiY3JlYXRpb24gdGltZSIgb2YgYSBQTkcgaW1hZ2UgaXMgc29tZXdoYXQgdmFndWUsCi1kZXBlbmRpbmcgb24gd2hldGhlciB5b3UgbWVhbiB0aGUgUE5HIGZpbGUsIHRoZSB0aW1lIHRoZSBpbWFnZSB3YXMKLWNyZWF0ZWQgaW4gYSBub24tUE5HIGZvcm1hdCwgYSBzdGlsbCBwaG90byBmcm9tIHdoaWNoIHRoZSBpbWFnZSB3YXMKLXNjYW5uZWQsIG9yIHBvc3NpYmx5IHRoZSBzdWJqZWN0IG1hdHRlciBpdHNlbGYuICBJbiBvcmRlciB0byBmYWNpbGl0YXRlCi1tYWNoaW5lLXJlYWRhYmxlIGRhdGVzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSAiQ3JlYXRpb24gVGltZSIKLXRFWHQgY2h1bmsgdXNlIFJGQyAxMTIzIGZvcm1hdCBkYXRlcyAoZS5nLiAiMjIgTWF5IDE5OTcgMTg6MDc6MTAgR01UIiksCi1hbHRob3VnaCB0aGlzIGlzbid0IGEgcmVxdWlyZW1lbnQuICBVbmxpa2UgdGhlIHRJTUUgY2h1bmssIHRoZQotIkNyZWF0aW9uIFRpbWUiIHRFWHQgY2h1bmsgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGF1dG9tYXRpY2FsbHkgY2hhbmdlZAotYnkgdGhlIHNvZnR3YXJlLiAgVG8gZmFjaWxpdGF0ZSB0aGUgdXNlIG9mIFJGQyAxMTIzIGRhdGVzLCBhIGZ1bmN0aW9uCi1wbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcihidWZmZXIsIHBuZ190aW1lcCkgaXMgcHJvdmlkZWQgdG8KLWNvbnZlcnQgZnJvbSBQTkcgdGltZSB0byBhbiBSRkMgMTEyMyBmb3JtYXQgc3RyaW5nLiAgVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUKLWEgd3JpdGVhYmxlIGJ1ZmZlciBvZiBhdCBsZWFzdCAyOSBieXRlcy4KLQotV3JpdGluZyB1bmtub3duIGNodW5rcwotCi1Zb3UgY2FuIHVzZSB0aGUgcG5nX3NldF91bmtub3duX2NodW5rcyBmdW5jdGlvbiB0byBxdWV1ZSB1cCBwcml2YXRlIGNodW5rcwotZm9yIHdyaXRpbmcuICBZb3UgZ2l2ZSBpdCBhIGNodW5rIG5hbWUsIGxvY2F0aW9uLCByYXcgZGF0YSwgYW5kIGEgc2l6ZS4gIFlvdQotYWxzbyBtdXN0IHVzZSBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSB0byBlbnN1cmUgdGhhdCBsaWJwbmcgd2lsbAotaGFuZGxlIHRoZW0uICBUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0LiAgVGhlIGNodW5rcyB3aWxsIGJlIHdyaXR0ZW4gYnkgdGhlCi1uZXh0IGZvbGxvd2luZyBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSwgcG5nX3dyaXRlX2luZm8sIG9yIHBuZ193cml0ZV9lbmQKLWZ1bmN0aW9uLCBkZXBlbmRpbmcgdXBvbiB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgQW55IGNodW5rcyBwcmV2aW91c2x5Ci1yZWFkIGludG8gdGhlIGluZm8gc3RydWN0dXJlJ3MgdW5rbm93bi1jaHVuayBsaXN0IHdpbGwgYWxzbyBiZSB3cml0dGVuIG91dAotaW4gYSBzZXF1ZW5jZSB0aGF0IHNhdGlzZmllcyB0aGUgUE5HIHNwZWNpZmljYXRpb24ncyBvcmRlcmluZyBydWxlcy4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHdyaXRpbmcgdHdvIHByaXZhdGUgY2h1bmtzLCBwclZ0IGFuZCBtaU5FOgotCi0gICAgI2lmZGVmIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSAgICAvKiBTZXQgdW5rbm93biBjaHVuayBkYXRhICovCi0gICAgcG5nX3Vua25vd25fY2h1bmsgdW5rX2NodW5rWzJdOwotICAgIHN0cmNweSgoY2hhciAqKSB1bmtfY2h1bmtbMF0ubmFtZSwgInByVnQiOwotICAgIHVua19jaHVua1swXS5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgIlBSSVZBVEUgREFUQSI7Ci0gICAgdW5rX2NodW5rWzBdLnNpemUgPSBzdHJsZW4odW5rX2NodW5rWzBdLmRhdGEpKzE7Ci0gICAgdW5rX2NodW5rWzBdLmxvY2F0aW9uID0gUE5HX0hBVkVfSUhEUjsKLSAgICBzdHJjcHkoKGNoYXIgKikgdW5rX2NodW5rWzFdLm5hbWUsICJtaU5FIjsKLSAgICB1bmtfY2h1bmtbMV0uZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopICJNWSBDSFVOSyBEQVRBIjsKLSAgICB1bmtfY2h1bmtbMV0uc2l6ZSA9IHN0cmxlbih1bmtfY2h1bmtbMF0uZGF0YSkrMTsKLSAgICB1bmtfY2h1bmtbMV0ubG9jYXRpb24gPSBQTkdfQUZURVJfSURBVDsKLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsCi0gICAgICAgIHVua19jaHVuaywgMik7Ci0gICAgLyogTmVlZGVkIGJlY2F1c2UgbWlORSBpcyBub3Qgc2FmZS10by1jb3B5ICovCi0gICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHBuZywgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMsCi0gICAgICAgKHBuZ19ieXRlcCkgIm1pTkUiLCAxKTsKLSAgICAjIGlmIFBOR19MSUJQTkdfVkVSIDwgMTA2MDAKLSAgICAgIC8qIERlYWwgd2l0aCB1bmtub3duIGNodW5rIGxvY2F0aW9uIGJ1ZyBpbiAxLjUueCBhbmQgZWFybGllciAqLwotICAgICAgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKHBuZywgaW5mbywgMCwgUE5HX0hBVkVfSUhEUik7Ci0gICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nLCBpbmZvLCAxLCBQTkdfQUZURVJfSURBVCk7Ci0gICAgIyBlbmRpZgotICAgICMgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDUwMAotICAgICAgLyogUE5HX0FGVEVSX0lEQVQgd3JpdGVzIHR3byBjb3BpZXMgb2YgdGhlIGNodW5rIHByaW9yIHRvIGxpYnBuZy0xLjUuMCwKLSAgICAgICAqIG9uZSBiZWZvcmUgSURBVCBhbmQgYW5vdGhlciBhZnRlciBJREFULCBzbyBkb24ndCB1c2UgaXQ7IG9ubHkgdXNlCi0gICAgICAgKiBQTkdfSEFWRV9JSERSIGxvY2F0aW9uLiAgVGhpcyBjYWxsIHJlc2V0cyB0aGUgbG9jYXRpb24gcHJldmlvdXNseQotICAgICAgICogc2V0IGJ5IGFzc2lnbm1lbnQgYW5kIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbigpIGZvciBjaHVuayAxLgotICAgICAgICovCi0gICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nLCBpbmZvLCAxLCBQTkdfSEFWRV9JSERSKTsKLSAgICAjIGVuZGlmCi0gICAgI2VuZGlmCi0KLVRoZSBoaWdoLWxldmVsIHdyaXRlIGludGVyZmFjZQotCi1BdCB0aGlzIHBvaW50IHRoZXJlIGFyZSB0d28gd2F5cyB0byBwcm9jZWVkOyB0aHJvdWdoIHRoZSBoaWdoLWxldmVsCi13cml0ZSBpbnRlcmZhY2UsIG9yIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBsb3ctbGV2ZWwgd3JpdGUgb3BlcmF0aW9ucy4KLVlvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiB5b3VyIGltYWdlIGRhdGEgaXMgcHJlc2VudAotaW4gdGhlIGluZm8gc3RydWN0dXJlLiAgQWxsIGRlZmluZWQgb3V0cHV0Ci10cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcm1pdHRlZCwgZW5hYmxlZCBieSB0aGUgZm9sbG93aW5nIG1hc2tzLgotCi0gICAgUE5HX1RSQU5TRk9STV9JREVOVElUWSAgICAgIE5vIHRyYW5zZm9ybWF0aW9uCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIFBhY2sgMSwgMiBhbmQgNC1iaXQgc2FtcGxlcwotICAgIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVAgICAgICBDaGFuZ2Ugb3JkZXIgb2YgcGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byBMU0IgZmlyc3QKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PICAgSW52ZXJ0IG1vbm9jaHJvbWUgaW1hZ2VzCi0gICAgUE5HX1RSQU5TRk9STV9TSElGVCAgICAgICAgIE5vcm1hbGl6ZSBwaXhlbHMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCSVQgZGVwdGgKLSAgICBQTkdfVFJBTlNGT1JNX0JHUiAgICAgICAgICAgRmxpcCBSR0IgdG8gQkdSLCBSR0JBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJHUkEKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgICAgRmxpcCBSR0JBIHRvIEFSR0Igb3IgR0EKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQUcKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgQ2hhbmdlIGFscGhhIGZyb20gb3BhY2l0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cmFuc3BhcmVuY3kKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOICAgQnl0ZS1zd2FwIDE2LWJpdCBzYW1wbGVzCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgICAgICAgIFN0cmlwIG91dCBmaWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKGRlcHJlY2F0ZWQpLgotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSBTdHJpcCBvdXQgbGVhZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZXIgYnl0ZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUiAgU3RyaXAgb3V0IHRyYWlsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcwotCi1JZiB5b3UgaGF2ZSB2YWxpZCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSAoeW91IGNhbiB1c2UKLXBuZ19zZXRfcm93cygpIHRvIHB1dCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSksIHNpbXBseSBkbyB0aGlzOgotCi0gICAgcG5nX3dyaXRlX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCi0KLXdoZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBzb21lIHNldCBvZgotdHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfd3JpdGVfaW5mbygpLAotZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKLXRoZW4gcG5nX3dyaXRlX2ltYWdlKCksIGFuZCBmaW5hbGx5IHBuZ193cml0ZV9lbmQoKS4KLQotKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKLXRvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgb3V0cHV0IHRyYW5zZm9ybS4pCi0KLVlvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCi13aGVuIHlvdSB1c2UgcG5nX3dyaXRlX3BuZygpLgotCi1UaGUgbG93LWxldmVsIHdyaXRlIGludGVyZmFjZQotCi1JZiB5b3UgYXJlIGdvaW5nIHRoZSBsb3ctbGV2ZWwgcm91dGUgaW5zdGVhZCwgeW91IGFyZSBub3cgcmVhZHkgdG8KLXdyaXRlIGFsbCB0aGUgZmlsZSBpbmZvcm1hdGlvbiB1cCB0byB0aGUgYWN0dWFsIGltYWdlIGRhdGEuICBZb3UgZG8KLXRoaXMgd2l0aCBhIGNhbGwgdG8gcG5nX3dyaXRlX2luZm8oKS4KLQotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotTm90ZSB0aGF0IHRoZXJlIGlzIG9uZSB0cmFuc2Zvcm1hdGlvbiB5b3UgbWF5IG5lZWQgdG8gZG8gYmVmb3JlCi1wbmdfd3JpdGVfaW5mbygpLiAgSW4gUE5HIGZpbGVzLCB0aGUgYWxwaGEgY2hhbm5lbCBpbiBhbiBpbWFnZSBpcyB0aGUKLWxldmVsIG9mIG9wYWNpdHkuICBJZiB5b3VyIGRhdGEgaXMgc3VwcGxpZWQgYXMgYSBsZXZlbCBvZiB0cmFuc3BhcmVuY3ksCi15b3UgY2FuIGludmVydCB0aGUgYWxwaGEgY2hhbm5lbCBiZWZvcmUgeW91IHdyaXRlIGl0LCBzbyB0aGF0IDAgaXMKLWZ1bGx5IHRyYW5zcGFyZW50IGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUKLShpbiAxNi1iaXQgaW1hZ2VzKSBpcyBmdWxseSBvcGFxdWUsIHdpdGgKLQotICAgIHBuZ19zZXRfaW52ZXJ0X2FscGhhKHBuZ19wdHIpOwotCi1UaGlzIG11c3QgYXBwZWFyIGJlZm9yZSBwbmdfd3JpdGVfaW5mbygpIGluc3RlYWQgb2YgbGF0ZXIgd2l0aCB0aGUKLW90aGVyIHRyYW5zZm9ybWF0aW9ucyBiZWNhdXNlIGluIHRoZSBjYXNlIG9mIHBhbGV0dGVkIGltYWdlcyB0aGUgdFJOUwotY2h1bmsgZGF0YSBoYXMgdG8gYmUgaW52ZXJ0ZWQgYmVmb3JlIHRoZSB0Uk5TIGNodW5rIGlzIHdyaXR0ZW4uICBJZgoteW91ciBpbWFnZSBpcyBub3QgYSBwYWxldHRlZCBpbWFnZSwgdGhlIHRSTlMgZGF0YSAod2hpY2ggaW4gc3VjaCBjYXNlcwotcmVwcmVzZW50cyBhIHNpbmdsZSBjb2xvciB0byBiZSByZW5kZXJlZCBhcyB0cmFuc3BhcmVudCkgd29uJ3QgbmVlZCB0bwotYmUgY2hhbmdlZCwgYW5kIHlvdSBjYW4gc2FmZWx5IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24gYWZ0ZXIgeW91cgotcG5nX3dyaXRlX2luZm8oKSBjYWxsLgotCi1JZiB5b3UgbmVlZCB0byB3cml0ZSBhIHByaXZhdGUgY2h1bmsgdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVmb3JlCi10aGUgUExURSBjaHVuayB3aGVuIFBMVEUgaXMgcHJlc2VudCwgeW91IGNhbiB3cml0ZSB0aGUgUE5HIGluZm8gaW4KLXR3byBzdGVwcywgYW5kIGluc2VydCBjb2RlIHRvIHdyaXRlIHlvdXIgb3duIGNodW5rIGJldHdlZW4gdGhlbToKLQotICAgIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsIGluZm9fcHRyLCAuLi4pOwotICAgIHBuZ193cml0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotQWZ0ZXIgeW91J3ZlIHdyaXR0ZW4gdGhlIGZpbGUgaW5mb3JtYXRpb24sIHlvdSBjYW4gc2V0IHVwIHRoZSBsaWJyYXJ5Ci10byBoYW5kbGUgYW55IHNwZWNpYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhLiAgVGhlIHZhcmlvdXMKLXdheXMgdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkKLXNob3VsZCBvY2N1ci4gIFRoaXMgaXMgaW1wb3J0YW50LCBhcyBzb21lIG9mIHRoZXNlIGNoYW5nZSB0aGUgY29sb3IKLXR5cGUgYW5kL29yIGJpdCBkZXB0aCBvZiB0aGUgZGF0YSwgYW5kIHNvbWUgb3RoZXJzIG9ubHkgd29yayBvbgotY2VydGFpbiBjb2xvciB0eXBlcyBhbmQgYml0IGRlcHRocy4gIEV2ZW4gdGhvdWdoIGVhY2ggdHJhbnNmb3JtYXRpb24KLWNoZWNrcyB0byBzZWUgaWYgaXQgaGFzIGRhdGEgdGhhdCBpdCBjYW4gZG8gc29tZXRoaW5nIHdpdGgsIHlvdSBzaG91bGQKLW1ha2Ugc3VyZSB0byBvbmx5IGVuYWJsZSBhIHRyYW5zZm9ybWF0aW9uIGlmIGl0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZQotZGF0YS4gIEZvciBleGFtcGxlLCBkb24ndCBzd2FwIHJlZCBhbmQgYmx1ZSBvbiBncmF5c2NhbGUgZGF0YS4KLQotUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiAgVGhpcyBjb2RlIHRlbGxzCi10aGUgbGlicmFyeSB0byBzdHJpcCBpbnB1dCBkYXRhIHRoYXQgaGFzIDQgb3IgOCBieXRlcyBwZXIgcGl4ZWwgZG93bgotdG8gMyBvciA2IGJ5dGVzIChvciBzdHJpcCAyIG9yIDQtYnl0ZSBncmF5c2NhbGUrZmlsbGVyIGRhdGEgdG8gMSBvciAyCi1ieXRlcyBwZXIgcGl4ZWwpLgotCi0gICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgMCwgUE5HX0ZJTExFUl9CRUZPUkUpOwotCi13aGVyZSB0aGUgMCBpcyB1bnVzZWQsIGFuZCB0aGUgbG9jYXRpb24gaXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yCi1QTkdfRklMTEVSX0FGVEVSLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSBmaWxsZXIgYnl0ZSBpbiB0aGUgcGl4ZWwKLWlzIHN0b3JlZCBYUkdCIG9yIFJHQlguCi0KLVBORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKLXRoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQgZmlsZXMuCi1JZiB0aGUgZGF0YSBpcyBzdXBwbGllZCBhdCAxIHBpeGVsIHBlciBieXRlLCB1c2UgdGhpcyBjb2RlLCB3aGljaCB3aWxsCi1jb3JyZWN0bHkgcGFjayB0aGUgcGl4ZWxzIGludG8gYSBzaW5nbGUgYnl0ZToKLQotICAgIHBuZ19zZXRfcGFja2luZyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHJlZHVjZSBwb3NzaWJsZSBiaXQgZGVwdGhzIHRvIDEsIDIsIDQsIDgsIGFuZCAxNi4gIElmIHlvdXIKLWRhdGEgaXMgb2YgYW5vdGhlciBiaXQgZGVwdGgsIHlvdSBjYW4gd3JpdGUgYW4gc0JJVCBjaHVuayBpbnRvIHRoZQotZmlsZSBzbyB0aGF0IGRlY29kZXJzIGNhbiByZWNvdmVyIHRoZSBvcmlnaW5hbCBkYXRhIGlmIGRlc2lyZWQuCi0KLSAgICAvKiBTZXQgdGhlIHRydWUgYml0IGRlcHRoIG9mIHRoZSBpbWFnZSBkYXRhICovCi0gICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKLSAgICB7Ci0gICAgICAgc2lnX2JpdC5yZWQgPSB0cnVlX2JpdF9kZXB0aDsKLSAgICAgICBzaWdfYml0LmdyZWVuID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgICAgc2lnX2JpdC5ibHVlID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICBzaWdfYml0LmdyYXkgPSB0cnVlX2JpdF9kZXB0aDsKLSAgICB9Ci0KLSAgICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKQotICAgIHsKLSAgICAgICBzaWdfYml0LmFscGhhID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotCi0gICAgcG5nX3NldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7Ci0KLUlmIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgcm93IGJ1ZmZlciBpbiBhIGJpdCBkZXB0aCBvdGhlciB0aGFuCi1vbmUgc3VwcG9ydGVkIGJ5IFBORyAoZS5nLiAzIGJpdCBkYXRhIGluIHRoZSByYW5nZSAwLTcgZm9yIGEgNC1iaXQgUE5HKSwKLXRoaXMgd2lsbCBzY2FsZSB0aGUgdmFsdWVzIHRvIGFwcGVhciB0byBiZSB0aGUgY29ycmVjdCBiaXQgZGVwdGggYXMKLWlzIHJlcXVpcmVkIGJ5IFBORy4KLQotICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgJnNpZ19iaXQpOwotCi1QTkcgZmlsZXMgc3RvcmUgMTYtYml0IHBpeGVscyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZy1lbmRpYW4sCi1pZS4gbW9zdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0KS4gIFRoaXMgY29kZSB3b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlCi1zdXBwbGllZCB0aGUgb3RoZXIgd2F5IChsaXR0bGUtZW5kaWFuLCBpLmUuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKLWZpcnN0LCB0aGUgd2F5IFBDcyBzdG9yZSB0aGVtKToKLQotICAgIGlmIChiaXRfZGVwdGggPiA4KQotICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91Ci1uZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIDMgY29sb3IgcGl4ZWxzIGluIHJlZCwgZ3JlZW4sIGJsdWUgb3JkZXIuICBUaGlzIGNvZGUKLXdvdWxkIGJlIHVzZWQgaWYgdGhleSBhcmUgc3VwcGxpZWQgYXMgYmx1ZSwgZ3JlZW4sIHJlZDoKLQotICAgIHBuZ19zZXRfYmdyKHBuZ19wdHIpOwotCi1QTkcgZmlsZXMgZGVzY3JpYmUgbW9ub2Nocm9tZSBhcyBibGFjayBiZWluZyB6ZXJvIGFuZCB3aGl0ZSBiZWluZwotb25lLiBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGUgcGl4ZWxzIGFyZSBzdXBwbGllZCB3aXRoIHRoaXMgcmV2ZXJzZWQKLShibGFjayBiZWluZyBvbmUgYW5kIHdoaXRlIGJlaW5nIHplcm8pOgotCi0gICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCi10aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjawotd2l0aAotCi0gICAgcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbihwbmdfcHRyLAotICAgICAgIHdyaXRlX3RyYW5zZm9ybV9mbik7Ci0KLVlvdSBtdXN0IHN1cHBseSB0aGUgZnVuY3Rpb24KLQotICAgIHZvaWQgd3JpdGVfdHJhbnNmb3JtX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3AKLSAgICAgICByb3dfaW5mbywgcG5nX2J5dGVwIGRhdGEpCi0KLVNlZSBwbmd0ZXN0LmMgZm9yIGEgd29ya2luZyBleGFtcGxlLiAgWW91ciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgdHJhbnNmb3JtYXRpb25zIGFyZSBwcm9jZXNzZWQuICBJZiBzdXBwb3J0ZWQKLWxpYnBuZyBhbHNvIHN1cHBsaWVzIGFuIGluZm9ybWF0aW9uIHJvdXRpbmUgdGhhdCBtYXkgYmUgY2FsbGVkIGZyb20KLXlvdXIgY2FsbGJhY2s6Ci0KLSAgIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBuZ19wdHIpOwotICAgcG5nX2dldF9jdXJyZW50X3Bhc3NfbnVtYmVyKHBuZ19wdHIpOwotCi1UaGlzIHJldHVybnMgdGhlIGN1cnJlbnQgcm93IHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtLiAgV2l0aCBpbnRlcmxhY2VkCi1pbWFnZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSByb3cgaW4gdGhlIGlucHV0IHN1Yi1pbWFnZSBpbWFnZS4gIFVzZQotUE5HX1JPV19GUk9NX1BBU1NfUk9XKHJvdywgcGFzcykgYW5kIFBOR19DT0xfRlJPTV9QQVNTX0NPTChjb2wsIHBhc3MpIHRvCi1maW5kIHRoZSBvdXRwdXQgcGl4ZWwgKHgseSkgZ2l2ZW4gYW4gaW50ZXJsYWNlZCBzdWItaW1hZ2UgcGl4ZWwgKHJvdyxjb2wscGFzcykuCi0KLVRoZSBkaXNjdXNzaW9uIG9mIGludGVybGFjZSBoYW5kbGluZyBhYm92ZSBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0bwotdXNlIHRoZXNlIHZhbHVlcy4KLQotWW91IGNhbiBhbHNvIHNldCB1cCBhIHBvaW50ZXIgdG8gYSB1c2VyIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IHlvdXIKLWNhbGxiYWNrIGZ1bmN0aW9uLgotCi0gICAgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvKHBuZ19wdHIsIHVzZXJfcHRyLCAwLCAwKTsKLQotVGhlIHVzZXJfY2hhbm5lbHMgYW5kIHVzZXJfZGVwdGggcGFyYW1ldGVycyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBpZ25vcmVkCi13aGVuIHdyaXRpbmc7IHlvdSBjYW4gc2V0IHRoZW0gdG8gemVybyBhcyBzaG93bi4KLQotWW91IGNhbiByZXRyaWV2ZSB0aGUgcG9pbnRlciB2aWEgdGhlIGZ1bmN0aW9uIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKCkuCi1Gb3IgZXhhbXBsZToKLQotICAgIHZvaWRwIHdyaXRlX3VzZXJfdHJhbnNmb3JtX3B0ciA9Ci0gICAgICAgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIocG5nX3B0cik7Ci0KLUl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbGlicG5nIGZsdXNoIGFueSBwZW5kaW5nIG91dHB1dCwgZWl0aGVyIG1hbnVhbGx5LAotb3IgYXV0b21hdGljYWxseSBhZnRlciBhIGNlcnRhaW4gbnVtYmVyIG9mIGxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLiAgVG8KLWZsdXNoIHRoZSBvdXRwdXQgc3RyZWFtIGEgc2luZ2xlIHRpbWUgY2FsbDoKLQotICAgIHBuZ193cml0ZV9mbHVzaChwbmdfcHRyKTsKLQotYW5kIHRvIGhhdmUgbGlicG5nIGZsdXNoIHRoZSBvdXRwdXQgc3RyZWFtIHBlcmlvZGljYWxseSBhZnRlciBhIGNlcnRhaW4KLW51bWJlciBvZiBzY2FubGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4sIGNhbGw6Ci0KLSAgICBwbmdfc2V0X2ZsdXNoKHBuZ19wdHIsIG5yb3dzKTsKLQotTm90ZSB0aGF0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHJvd3MgaXMgZnJvbSB0aGUgbGFzdCB0aW1lIHBuZ193cml0ZV9mbHVzaCgpCi13YXMgY2FsbGVkLCBvciB0aGUgZmlyc3Qgcm93IG9mIHRoZSBpbWFnZSBpZiBpdCBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQuCi1TbyBpZiB5b3Ugd3JpdGUgNTAgbGluZXMsIGFuZCB0aGVuIHBuZ19zZXRfZmx1c2ggMjUsIGl0IHdpbGwgZmx1c2ggdGhlCi1vdXRwdXQgb24gdGhlIG5leHQgc2NhbmxpbmUsIGFuZCBldmVyeSAyNSBsaW5lcyB0aGVyZWFmdGVyLCB1bmxlc3MKLXBuZ193cml0ZV9mbHVzaCgpIGlzIGNhbGxlZCBiZWZvcmUgMjUgbW9yZSBsaW5lcyBoYXZlIGJlZW4gd3JpdHRlbi4KLUlmIG5yb3dzIGlzIHRvbyBzbWFsbCAobGVzcyB0aGFuIGFib3V0IDEwIGxpbmVzIGZvciBhIDY0MCBwaXhlbCB3aWRlCi1SR0IgaW1hZ2UpIHRoZSBpbWFnZSBjb21wcmVzc2lvbiBtYXkgZGVjcmVhc2Ugbm90aWNlYWJseSAoYWx0aG91Z2ggdGhpcwotbWF5IGJlIGFjY2VwdGFibGUgZm9yIHJlYWwtdGltZSBhcHBsaWNhdGlvbnMpLiAgSW5mcmVxdWVudCBmbHVzaGluZyB3aWxsCi1vbmx5IGRlZ3JhZGUgdGhlIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlIGJ5IGEgZmV3IHBlcmNlbnQgb3ZlciBpbWFnZXMKLXRoYXQgZG8gbm90IHVzZSBmbHVzaGluZy4KLQotV3JpdGluZyB0aGUgaW1hZ2UgZGF0YQotCi1UaGF0J3MgaXQgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbnMuICBOb3cgeW91IGNhbiB3cml0ZSB0aGUgaW1hZ2UgZGF0YS4KLVRoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyBpcyBpbiBvbmUgZnVuY3Rpb24gY2FsbC4gIElmIHlvdSBoYXZlIHRoZQotd2hvbGUgaW1hZ2UgaW4gbWVtb3J5LCB5b3UgY2FuIGp1c3QgY2FsbCBwbmdfd3JpdGVfaW1hZ2UoKSBhbmQgbGlicG5nCi13aWxsIHdyaXRlIHRoZSBpbWFnZS4gIFlvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbiBhbiBhcnJheSBvZiBwb2ludGVycyB0bwotZWFjaCByb3cuICBUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbnRlcmxhY2luZywgc28geW91IGRvbid0Ci1uZWVkIHRvIGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBvciBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUKLXRpbWVzLCBvciBhbnkgb2YgdGhhdCBvdGhlciBzdHVmZiBuZWNlc3Nhcnkgd2l0aCBwbmdfd3JpdGVfcm93cygpLgotCi0gICAgcG5nX3dyaXRlX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7Ci0KLXdoZXJlIHJvd19wb2ludGVycyBpczoKLQotICAgIHBuZ19ieXRlICpyb3dfcG9pbnRlcnNbaGVpZ2h0XTsKLQotWW91IGNhbiBwb2ludCB0byB2b2lkIG9yIGNoYXIgb3Igd2hhdGV2ZXIgeW91IHVzZSBmb3IgcGl4ZWxzLgotCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgd2hvbGUgaW1hZ2UgYXQgb25jZSwgeW91IGNhbgotdXNlIHBuZ193cml0ZV9yb3dzKCkgaW5zdGVhZC4gIElmIHRoZSBmaWxlIGlzIG5vdCBpbnRlcmxhY2VkLAotdGhpcyBpcyBzaW1wbGU6Ci0KLSAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsCi0gICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi1yb3dfcG9pbnRlcnMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHBuZ193cml0ZV9pbWFnZSgpIGNhbGwuCi0KLUlmIHlvdSBhcmUganVzdCB3cml0aW5nIG9uZSByb3cgYXQgYSB0aW1lLCB5b3UgY2FuIGRvIHRoaXMgd2l0aAotYSBzaW5nbGUgcm93X3BvaW50ZXIgaW5zdGVhZCBvZiBhbiBhcnJheSBvZiByb3dfcG9pbnRlcnM6Ci0KLSAgICBwbmdfYnl0ZXAgcm93X3BvaW50ZXIgPSByb3c7Ci0KLSAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsIHJvd19wb2ludGVyKTsKLQotV2hlbiB0aGUgZmlsZSBpcyBpbnRlcmxhY2VkLCB0aGluZ3MgY2FuIGdldCBhIGdvb2QgZGVhbCBtb3JlIGNvbXBsaWNhdGVkLgotVGhlIG9ubHkgY3VycmVudGx5IChhcyBvZiB0aGUgUE5HIFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIsIGRhdGVkIEp1bHkKLTE5OTkpIGRlZmluZWQgaW50ZXJsYWNpbmcgc2NoZW1lIGZvciBQTkcgZmlsZXMgaXMgdGhlICJBZGFtNyIgaW50ZXJsYWNlCi1zY2hlbWUsIHRoYXQgYnJlYWtzIGRvd24gYW4gaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nCi1zaXplLiAgbGlicG5nIHdpbGwgYnVpbGQgdGhlc2UgaW1hZ2VzIGZvciB5b3UsIG9yIHlvdSBjYW4gZG8gdGhlbQoteW91cnNlbGYuICBJZiB5b3Ugd2FudCB0byBidWlsZCB0aGVtIHlvdXJzZWxmLCBzZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uCi1mb3IgZGV0YWlscyBvZiB3aGljaCBwaXhlbHMgdG8gd3JpdGUgd2hlbi4KLQotSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdAotdXNlIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgYW5kIGNhbGwgcG5nX3dyaXRlX3Jvd3MoKSB0aGUKLWNvcnJlY3QgbnVtYmVyIG9mIHRpbWVzIHRvIHdyaXRlIGFsbCB0aGUgc3ViLWltYWdlcwotKHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1Yi1pbWFnZXMuKQotCi1JZiB5b3Ugd2FudCBsaWJwbmcgdG8gYnVpbGQgdGhlIHN1Yi1pbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUgeW91IHN0YXJ0Ci13cml0aW5nIGFueSByb3dzOgotCi0gICAgbnVtYmVyX29mX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi1UaGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFzc2VzIG5lZWRlZC4gIEN1cnJlbnRseSwgdGhpcyBpcyBzZXZlbiwKLWJ1dCBtYXkgY2hhbmdlIGlmIGFub3RoZXIgaW50ZXJsYWNlIHR5cGUgaXMgYWRkZWQuCi0KLVRoZW4gd3JpdGUgdGhlIGNvbXBsZXRlIGltYWdlIG51bWJlcl9vZl9wYXNzZXMgdGltZXMuCi0KLSAgICBwbmdfd3JpdGVfcm93cyhwbmdfcHRyLCByb3dfcG9pbnRlcnMsIG51bWJlcl9vZl9yb3dzKTsKLQotVGhpbmsgY2FyZWZ1bGx5IGJlZm9yZSB5b3Ugd3JpdGUgYW4gaW50ZXJsYWNlZCBpbWFnZS4gIFR5cGljYWxseSBjb2RlIHRoYXQKLXJlYWRzIHN1Y2ggaW1hZ2VzIHJlYWRzIGFsbCB0aGUgaW1hZ2UgZGF0YSBpbnRvIG1lbW9yeSwgdW5jb21wcmVzc2VkLCBiZWZvcmUKLWRvaW5nIGFueSBwcm9jZXNzaW5nLiAgT25seSBjb2RlIHRoYXQgY2FuIGRpc3BsYXkgYW4gaW1hZ2Ugb24gdGhlIGZseSBjYW4KLXRha2UgYWR2YW50YWdlIG9mIHRoZSBpbnRlcmxhY2luZyBhbmQgZXZlbiB0aGVuIHRoZSBpbWFnZSBoYXMgdG8gYmUgZXhhY3RseQotdGhlIGNvcnJlY3Qgc2l6ZSBmb3IgdGhlIG91dHB1dCBkZXZpY2UsIGJlY2F1c2Ugc2NhbGluZyBhbiBpbWFnZSByZXF1aXJlcwotYWRqYWNlbnQgcGl4ZWxzIGFuZCB0aGVzZSBhcmUgbm90IGF2YWlsYWJsZSB1bnRpbCBhbGwgdGhlIHBhc3NlcyBoYXZlIGJlZW4KLXJlYWQuCi0KLUlmIHlvdSBkbyB3cml0ZSBhbiBpbnRlcmxhY2VkIGltYWdlIHlvdSB3aWxsIGhhcmRseSBldmVyIG5lZWQgdG8gaGFuZGxlCi10aGUgaW50ZXJsYWNpbmcgeW91cnNlbGYuICBDYWxsIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKCkgYW5kIHVzZSB0aGUKLWFwcHJvYWNoIGRlc2NyaWJlZCBhYm92ZS4KLQotVGhlIG9ubHkgdGltZSBpdCBpcyBjb25jZWl2YWJsZSB0aGF0IHlvdSB3aWxsIHJlYWxseSBuZWVkIHRvIHdyaXRlIGFuCi1pbnRlcmxhY2VkIGltYWdlIHBhc3MtYnktcGFzcyBpcyB3aGVuIHlvdSBoYXZlIHJlYWQgb25lIHBhc3MgYnkgcGFzcyBhbmQKLW1hZGUgc29tZSBwaXhlbC1ieS1waXhlbCB0cmFuc2Zvcm1hdGlvbiB0byBpdCwgYXMgZGVzY3JpYmVkIGluIHRoZSByZWFkCi1jb2RlIGFib3ZlLiAgSW4gdGhpcyBjYXNlIHVzZSB0aGUgUE5HX1BBU1NfUk9XUyBhbmQgUE5HX1BBU1NfQ09MUyBtYWNyb3MKLXRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiBlYWNoIHN1Yi1pbWFnZSBpbiB0dXJuIGFuZCBzaW1wbHkgd3JpdGUgdGhlIHJvd3MKLXlvdSBvYnRhaW5lZCBmcm9tIHRoZSByZWFkIGNvZGUuCi0KLUZpbmlzaGluZyBhIHNlcXVlbnRpYWwgd3JpdGUKLQotQWZ0ZXIgeW91IGFyZSBmaW5pc2hlZCB3cml0aW5nIHRoZSBpbWFnZSwgeW91IHNob3VsZCBmaW5pc2ggd3JpdGluZwotdGhlIGZpbGUuICBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd3JpdGluZyBjb21tZW50cyBvciB0aW1lLCB5b3Ugc2hvdWxkCi1wYXNzIGFuIGFwcHJvcHJpYXRlbHkgZmlsbGVkIHBuZ19pbmZvIHBvaW50ZXIuICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLAoteW91IGNhbiBwYXNzIE5VTEwuCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgbGlicG5nIGxpa2UgdGhpczoKLQotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Ci1wb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi0gICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQotCi0gICAgbWFzayAgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzawotICAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKLSAgICAgICAgICAgIG1vcmUgb2YKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfSElTVCwgUE5HX0ZSRUVfSUNDUCwKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfUENBTCwgUE5HX0ZSRUVfUk9XUywKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfVEVYVCwgUE5HX0ZSRUVfVU5LTiwKLSAgICAgICAgICAgIG9yIHNpbXBseSBQTkdfRlJFRV9BTEwKLQotICAgIHNlcSAgIC0gc2VxdWVuY2UgbnVtYmVyIG9mIGl0ZW0gdG8gYmUgZnJlZWQKLSAgICAgICAgICAgICgtMSBmb3IgYWxsIGl0ZW1zKQotCi1UaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIHdoZW4gdGhlIHJlbGV2YW50IHN0b3JhZ2UgaGFzCi1hbHJlYWR5IGJlZW4gZnJlZWQsIG9yIGhhcyBub3QgeWV0IGJlZW4gYWxsb2NhdGVkLCBvciB3YXMgYWxsb2NhdGVkCi1ieSB0aGUgdXNlciAgYW5kIG5vdCBieSBsaWJwbmcsICBhbmQgd2lsbCBpbiB0aG9zZSBjYXNlcyBkbyBub3RoaW5nLgotVGhlICJzZXEiIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIG9ubHkgb25lIGl0ZW0gb2YgdGhlIHNlbGVjdGVkIGRhdGEKLXR5cGUsIHN1Y2ggYXMgUExURSwgaXMgYWxsb3dlZC4gIElmICJzZXEiIGlzIG5vdCAtMSwgYW5kIG11bHRpcGxlIGl0ZW1zCi1hcmUgYWxsb3dlZCBmb3IgdGhlIGRhdGEgdHlwZSBpZGVudGlmaWVkIGluIHRoZSBtYXNrLCBzdWNoIGFzIHRleHQgb3IKLXNQTFQsIG9ubHkgdGhlIG4ndGggaXRlbSBpbiB0aGUgc3RydWN0dXJlIGlzIGZyZWVkLCB3aGVyZSBuIGlzICJzZXEiLgotCi1JZiB5b3UgYWxsb2NhdGVkIGRhdGEgc3VjaCBhcyBhIHBhbGV0dGUgdGhhdCB5b3UgcGFzc2VkIGluIHRvIGxpYnBuZwotd2l0aCBwbmdfc2V0XyosIHlvdSBtdXN0IG5vdCBmcmVlIGl0IHVudGlsIGp1c3QgYmVmb3JlIHRoZSBjYWxsIHRvCi1wbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoKS4KLQotVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgb25seSB0byBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGludGVybmFsbHkKLWJ5IGxpYnBuZy4gIFRoaXMgY2FuIGJlIGNoYW5nZWQsIHNvIHRoYXQgbGlicG5nIHdpbGwgbm90IGZyZWUgdGhlIGRhdGEsCi1vciBzbyB0aGF0IGl0IHdpbGwgZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBieSB0aGUgdXNlciB3aXRoIHBuZ19tYWxsb2MoKQotb3IgcG5nX2NhbGxvYygpIGFuZCBwYXNzZWQgaW4gdmlhIGEgcG5nX3NldF8qKCkgZnVuY3Rpb24sIHdpdGgKLQotICAgIHBuZ19kYXRhX2ZyZWVyKHBuZ19wdHIsIGluZm9fcHRyLCBmcmVlciwgbWFzaykKLQotICAgIGZyZWVyICAtIG9uZSBvZgotICAgICAgICAgICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19TRVRfV0lMTF9GUkVFX0RBVEEKLSAgICAgICAgICAgICAgIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBCi0KLSAgICBtYXNrICAgLSB3aGljaCBkYXRhIGVsZW1lbnRzIGFyZSBhZmZlY3RlZAotICAgICAgICAgICAgIHNhbWUgY2hvaWNlcyBhcyBpbiBwbmdfZnJlZV9kYXRhKCkKLQotRm9yIGV4YW1wbGUsIHRvIHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBzb21lIGRhdGEgZnJvbSBhIHJlYWQgc3RydWN0dXJlCi10byBhIHdyaXRlIHN0cnVjdHVyZSwgeW91IGNvdWxkIHVzZQotCi0gICAgcG5nX2RhdGFfZnJlZXIocmVhZF9wdHIsIHJlYWRfaW5mb19wdHIsCi0gICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEsCi0gICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCi0KLSAgICBwbmdfZGF0YV9mcmVlcih3cml0ZV9wdHIsIHdyaXRlX2luZm9fcHRyLAotICAgICAgIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBLAotICAgICAgIFBOR19GUkVFX1BMVEV8UE5HX0ZSRUVfdFJOU3xQTkdfRlJFRV9oSVNUKQotCi10aGVyZWJ5IGJyaWVmbHkgcmVhc3NpZ25pbmcgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdG8gdGhlIHVzZXIgYnV0Ci1pbW1lZGlhdGVseSBhZnRlcndhcmRzIHJlYXNzaWduaW5nIGl0IG9uY2UgbW9yZSB0byB0aGUgd3JpdGVfZGVzdHJveQotZnVuY3Rpb24uICBIYXZpbmcgZG9uZSB0aGlzLCBpdCB3b3VsZCB0aGVuIGJlIHNhZmUgdG8gZGVzdHJveSB0aGUgcmVhZAotc3RydWN0dXJlIGFuZCBjb250aW51ZSB0byB1c2UgdGhlIFBMVEUsIHRSTlMsIGFuZCBoSVNUIGRhdGEgaW4gdGhlIHdyaXRlCi1zdHJ1Y3R1cmUuCi0KLVRoaXMgZnVuY3Rpb24gb25seSBhZmZlY3RzIGRhdGEgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4KLVlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIGFmdGVyIHRoZSBwbmdfc2V0XyooKSBmdW5jdGlvbnMKLXRvIGNvbnRyb2wgd2hldGhlciB0aGUgdXNlciBvciBwbmdfZGVzdHJveV8qKCkgaXMgc3VwcG9zZWQgdG8gZnJlZSB0aGUgZGF0YS4KLVdoZW4gdGhlIHVzZXIgYXNzdW1lcyByZXNwb25zaWJpbGl0eSBmb3IgbGlicG5nLWFsbG9jYXRlZCBkYXRhLCB0aGUKLWFwcGxpY2F0aW9uIG11c3QgdXNlCi1wbmdfZnJlZSgpIHRvIGZyZWUgaXQsIGFuZCB3aGVuIHRoZSB1c2VyIHRyYW5zZmVycyByZXNwb25zaWJpbGl0eSB0byBsaWJwbmcKLWZvciBkYXRhIHRoYXQgdGhlIHVzZXIgaGFzIGFsbG9jYXRlZCwgdGhlIHVzZXIgbXVzdCBoYXZlIHVzZWQgcG5nX21hbGxvYygpCi1vciBwbmdfY2FsbG9jKCkgdG8gYWxsb2NhdGUgaXQuCi0KLUlmIHlvdSBhbGxvY2F0ZWQgdGV4dF9wdHIudGV4dCwgdGV4dF9wdHIubGFuZywgYW5kIHRleHRfcHRyLnRyYW5zbGF0ZWRfa2V5d29yZAotc2VwYXJhdGVseSwgZG8gbm90IHRyYW5zZmVyIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRleHRfcHRyIHRvIGxpYnBuZywKLWJlY2F1c2Ugd2hlbiBsaWJwbmcgZmlsbHMgYSBwbmdfdGV4dCBzdHJ1Y3R1cmUgaXQgY29tYmluZXMgdGhlc2UgbWVtYmVycyB3aXRoCi10aGUga2V5IG1lbWJlciwgYW5kIHBuZ19mcmVlX2RhdGEoKSB3aWxsIGZyZWUgb25seSB0ZXh0X3B0ci5rZXkuICBTaW1pbGFybHksCi1pZiB5b3UgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWUnaW5nIHRleHRfcHRyIGZyb20gbGlicG5nIHRvIHlvdXIKLWFwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIG11c3Qgbm90IHNlcGFyYXRlbHkgZnJlZSB0aG9zZSBtZW1iZXJzLgotRm9yIGEgbW9yZSBjb21wYWN0IGV4YW1wbGUgb2Ygd3JpdGluZyBhIFBORyBpbWFnZSwgc2VlIHRoZSBmaWxlIGV4YW1wbGUuYy4KLQotVi4gU2ltcGxpZmllZCBBUEkKLQotVGhlIHNpbXBsaWZpZWQgQVBJLCB3aGljaCBiZWNhbWUgYXZhaWxhYmxlIGluIGxpYnBuZy0xLjYuMCwgaGlkZXMgdGhlIGRldGFpbHMKLW9mIGJvdGggbGlicG5nIGFuZCB0aGUgUE5HIGZpbGUgZm9ybWF0IGl0c2VsZi4KLUl0IGFsbG93cyBQTkcgZmlsZXMgdG8gYmUgcmVhZCBpbnRvIGEgdmVyeSBsaW1pdGVkIG51bWJlciBvZgotaW4tbWVtb3J5IGJpdG1hcCBmb3JtYXRzIG9yIHRvIGJlIHdyaXR0ZW4gZnJvbSB0aGUgc2FtZSBmb3JtYXRzLiAgSWYgdGhlc2UKLWZvcm1hdHMgZG8gbm90IGFjY29tbW9kYXRlIHlvdXIgbmVlZHMgdGhlbiB5b3UgY2FuLCBhbmQgc2hvdWxkLCB1c2UgdGhlIG1vcmUKLXNvcGhpc3RpY2F0ZWQgQVBJcyBhYm92ZSAtIHRoZXNlIHN1cHBvcnQgYSB3aWRlIHZhcmlldHkgb2YgaW4tbWVtb3J5IGZvcm1hdHMKLWFuZCBhIHdpZGUgdmFyaWV0eSBvZiBzb3BoaXN0aWNhdGVkIHRyYW5zZm9ybWF0aW9ucyB0byB0aG9zZSBmb3JtYXRzIGFzIHdlbGwKLWFzIGEgd2lkZSB2YXJpZXR5IG9mIEFQSXMgdG8gbWFuaXB1bGF0ZSBhbmNpbGxpYXJ5IGluZm9ybWF0aW9uLgotCi1UbyByZWFkIGEgUE5HIGZpbGUgdXNpbmcgdGhlIHNpbXBsaWZpZWQgQVBJOgotCi0gIDEpIERlY2xhcmUgYSAncG5nX2ltYWdlJyBzdHJ1Y3R1cmUgKHNlZSBiZWxvdykgb24gdGhlIHN0YWNrLCBzZXQgdGhlCi0gICAgIHZlcnNpb24gZmllbGQgdG8gUE5HX0lNQUdFX1ZFUlNJT04gYW5kIHRoZSAnb3BhcXVlJyBwb2ludGVyIHRvIE5VTEwKLSAgICAgKHRoaXMgaXMgUkVRVUlSRUQsIHlvdXIgcHJvZ3JhbSBtYXkgY3Jhc2ggaWYgeW91IGRvbid0IGRvIGl0LikKLQotICAyKSBDYWxsIHRoZSBhcHByb3ByaWF0ZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZC4uLiBmdW5jdGlvbi4KLQotICAzKSBTZXQgdGhlIHBuZ19pbWFnZSAnZm9ybWF0JyBtZW1iZXIgdG8gdGhlIHJlcXVpcmVkIHNhbXBsZSBmb3JtYXQuCi0KLSAgNCkgQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBpbWFnZSBhbmQsIGlmIHJlcXVpcmVkLCB0aGUgY29sb3ItbWFwLgotCi0gIDUpIENhbGwgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkIHRvIHJlYWQgdGhlIGltYWdlIGFuZCwgaWYgcmVxdWlyZWQsIHRoZQotICAgICBjb2xvci1tYXAgaW50byB5b3VyIGJ1ZmZlcnMuCi0KLVRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGZvcm1hdCBvZiB0aGUgUE5HIGlucHV0IGl0c2VsZjsgYWxsIHZhbGlkCi1jb2xvciB0eXBlcywgYml0IGRlcHRocywgYW5kIGludGVybGFjZSBtZXRob2RzIGFyZSBhY2NlcHRhYmxlLCBhbmQgdGhlCi1pbnB1dCBpbWFnZSBpcyB0cmFuc2Zvcm1lZCBhcyBuZWNlc3NhcnkgdG8gdGhlIHJlcXVlc3RlZCBpbi1tZW1vcnkgZm9ybWF0Ci1kdXJpbmcgdGhlIHBuZ19pbWFnZV9maW5pc2hfcmVhZCgpIHN0ZXAuICBUaGUgb25seSBjYXZlYXQgaXMgdGhhdCBpZiB5b3UKLXJlcXVlc3QgYSBjb2xvci1tYXBwZWQgaW1hZ2UgZnJvbSBhIFBORyB0aGF0IGlzIGZ1bGwtY29sb3Igb3IgbWFrZXMKLWNvbXBsZXggdXNlIG9mIGFuIGFscGhhIGNoYW5uZWwgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGV4dHJlbWVseSBsb3NzeSBhbmQgdGhlCi1yZXN1bHQgbWF5IGxvb2sgdGVycmlibGUuCi0KLVRvIHdyaXRlIGEgUE5HIGZpbGUgdXNpbmcgdGhlIHNpbXBsaWZpZWQgQVBJOgotCi0gIDEpIERlY2xhcmUgYSAncG5nX2ltYWdlJyBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrIGFuZCBtZW1zZXQoKQotICAgICBpdCB0byBhbGwgemVyby4KLQotICAyKSBJbml0aWFsaXplIHRoZSBtZW1iZXJzIG9mIHRoZSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZSB0aGUKLSAgICAgaW1hZ2UsIHNldHRpbmcgdGhlICdmb3JtYXQnIG1lbWJlciB0byB0aGUgZm9ybWF0IG9mIHRoZQotICAgICBpbWFnZSBzYW1wbGVzLgotCi0gIDMpIENhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19pbWFnZV93cml0ZS4uLiBmdW5jdGlvbiB3aXRoIGEKLSAgICAgcG9pbnRlciB0byB0aGUgaW1hZ2UgYW5kLCBpZiBuZWNlc3NhcnksIHRoZSBjb2xvci1tYXAgdG8gd3JpdGUKLSAgICAgdGhlIFBORyBkYXRhLgotCi1wbmdfaW1hZ2UgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgdGhlIGluLW1lbW9yeSBmb3JtYXQgb2YgYW4gaW1hZ2UKLXdoZW4gaXQgaXMgYmVpbmcgcmVhZCBvciBkZWZpbmVzIHRoZSBpbi1tZW1vcnkgZm9ybWF0IG9mIGFuIGltYWdlIHRoYXQgeW91Ci1uZWVkIHRvIHdyaXRlLiAgVGhlICJwbmdfaW1hZ2UiIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6Ci0KLSAgIHBuZ19jb250cm9scCBvcGFxdWUgIEluaXRpYWxpemUgdG8gTlVMTCwgZnJlZSB3aXRoIHBuZ19pbWFnZV9mcmVlCi0gICBwbmdfdWludF8zMiAgdmVyc2lvbiBTZXQgdG8gUE5HX0lNQUdFX1ZFUlNJT04KLSAgIHBuZ191aW50XzMyICB3aWR0aCAgIEltYWdlIHdpZHRoIGluIHBpeGVscyAoY29sdW1ucykKLSAgIHBuZ191aW50XzMyICBoZWlnaHQgIEltYWdlIGhlaWdodCBpbiBwaXhlbHMgKHJvd3MpCi0gICBwbmdfdWludF8zMiAgZm9ybWF0ICBJbWFnZSBmb3JtYXQgYXMgZGVmaW5lZCBiZWxvdwotICAgcG5nX3VpbnRfMzIgIGZsYWdzICAgQSBiaXQgbWFzayBjb250YWluaW5nIGluZm9ybWF0aW9uYWwgZmxhZ3MKLSAgIHBuZ191aW50XzMyICBjb2xvcm1hcF9lbnRyaWVzOyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29sb3ItbWFwCi0gICBwbmdfdWludF8zMiAgd2FybmluZ19vcl9lcnJvcjsKLSAgIGNoYXIgICAgICAgICBtZXNzYWdlWzY0XTsKLQotSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIG9yIHdhcm5pbmcgdGhlICJ3YXJuaW5nX29yX2Vycm9yIgotZmllbGQgd2lsbCBiZSBzZXQgdG8gYSBub24temVybyB2YWx1ZSBhbmQgdGhlICdtZXNzYWdlJyBmaWVsZCB3aWxsIGNvbnRhaW4KLWEgJ1wwJyB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBsaWJwbmcgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLiAgSWYgYm90aAotd2FybmluZ3MgYW5kIGFuIGVycm9yIHdlcmUgZW5jb3VudGVyZWQsIG9ubHkgdGhlIGVycm9yIGlzIHJlY29yZGVkLiAgSWYgdGhlcmUKLWFyZSBtdWx0aXBsZSB3YXJuaW5ncywgb25seSB0aGUgZmlyc3Qgb25lIGlzIHJlY29yZGVkLgotCi1UaGUgdXBwZXIgMzAgYml0cyBvZiB0aGUgIndhcm5pbmdfb3JfZXJyb3IiIHZhbHVlIGFyZSByZXNlcnZlZDsgdGhlIGxvdyB0d28KLWJpdHMgY29udGFpbiBhIHR3byBiaXQgY29kZSBzdWNoIHRoYXQgYSB2YWx1ZSBtb3JlIHRoYW4gMSBpbmRpY2F0ZXMgYSBmYWlsdXJlCi1pbiB0aGUgQVBJIGp1c3QgY2FsbGVkOgotCi0gICAwIC0gbm8gd2FybmluZyBvciBlcnJvcgotICAgMSAtIHdhcm5pbmcKLSAgIDIgLSBlcnJvcgotICAgMyAtIGVycm9yIHByZWNlZGVkIGJ5IHdhcm5pbmcKLQotVGhlIHBpeGVscyAoc2FtcGxlcykgb2YgdGhlIGltYWdlIGhhdmUgb25lIHRvIGZvdXIgY2hhbm5lbHMgd2hvc2UgY29tcG9uZW50cwotaGF2ZSBvcmlnaW5hbCB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAgdG8gMS4wOgotCi0gIDE6IEEgc2luZ2xlIGdyYXkgb3IgbHVtaW5hbmNlIGNoYW5uZWwgKEcpLgotICAyOiBBIGdyYXkvbHVtaW5hbmNlIGNoYW5uZWwgYW5kIGFuIGFscGhhIGNoYW5uZWwgKEdBKS4KLSAgMzogVGhyZWUgcmVkLCBncmVlbiwgYmx1ZSBjb2xvciBjaGFubmVscyAoUkdCKS4KLSAgNDogVGhyZWUgY29sb3IgY2hhbm5lbHMgYW5kIGFuIGFscGhhIGNoYW5uZWwgKFJHQkEpLgotCi1UaGUgY2hhbm5lbHMgYXJlIGVuY29kZWQgaW4gb25lIG9mIHR3byB3YXlzOgotCi0gIGEpIEFzIGEgc21hbGwgaW50ZWdlciwgdmFsdWUgMC4uMjU1LCBjb250YWluZWQgaW4gYSBzaW5nbGUgYnl0ZS4gIEZvciB0aGUKLWFscGhhIGNoYW5uZWwgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIHNpbXBseSB2YWx1ZS8yNTUuICBGb3IgdGhlIGNvbG9yIG9yCi1sdW1pbmFuY2UgY2hhbm5lbHMgdGhlIHZhbHVlIGlzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzUkdCIHNwZWNpZmljYXRpb24KLWFuZCBtYXRjaGVzIHRoZSA4LWJpdCBmb3JtYXQgZXhwZWN0ZWQgYnkgdHlwaWNhbCBkaXNwbGF5IGRldmljZXMuCi0KLVRoZSBjb2xvci9ncmF5IGNoYW5uZWxzIGFyZSBub3Qgc2NhbGVkIChwcmUtbXVsdGlwbGllZCkgYnkgdGhlIGFscGhhCi1jaGFubmVsIGFuZCBhcmUgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gY29sb3IgbWFuYWdlbWVudCBzb2Z0d2FyZS4KLQotICBiKSBBcyBhIHZhbHVlIGluIHRoZSByYW5nZSAwLi42NTUzNSwgY29udGFpbmVkIGluIGEgMi1ieXRlIGludGVnZXIsIGluCi10aGUgbmF0aXZlIGJ5dGUgb3JkZXIgb2YgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLgotQWxsIGNoYW5uZWxzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIGJ5IGRpdmlkaW5nIGJ5IDY1NTM1OyBhbGwKLWNoYW5uZWxzIGFyZSBsaW5lYXIuICBDb2xvciBjaGFubmVscyB1c2UgdGhlIFJHQiBlbmNvZGluZyAoUkdCIGVuZC1wb2ludHMpIG9mCi10aGUgc1JHQiBzcGVjaWZpY2F0aW9uLiAgVGhpcyBlbmNvZGluZyBpcyBpZGVudGlmaWVkIGJ5IHRoZQotUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiBmbGFnIGJlbG93LgotCi1XaGVuIHRoZSBzaW1wbGlmaWVkIEFQSSBuZWVkcyB0byBjb252ZXJ0IGJldHdlZW4gc1JHQiBhbmQgbGluZWFyIGNvbG9yc3BhY2VzLAotdGhlIGFjdHVhbCBzUkdCIHRyYW5zZmVyIGN1cnZlIGRlZmluZWQgaW4gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiAoc2VlIHRoZQotYXJ0aWNsZSBhdCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NSR0IpIGlzIHVzZWQsIG5vdCB0aGUgZ2FtbWE9MS8yLjIKLWFwcHJveGltYXRpb24gdXNlZCBlbHNld2hlcmUgaW4gbGlicG5nLgotCi1XaGVuIGFuIGFscGhhIGNoYW5uZWwgaXMgcHJlc2VudCBpdCBpcyBleHBlY3RlZCB0byBkZW5vdGUgcGl4ZWwgY292ZXJhZ2UKLW9mIHRoZSBjb2xvciBvciBsdW1pbmFuY2UgY2hhbm5lbHMgYW5kIGlzIHJldHVybmVkIGFzIGFuIGFzc29jaWF0ZWQgYWxwaGEKLWNoYW5uZWw6IHRoZSBjb2xvci9ncmF5IGNoYW5uZWxzIGFyZSBzY2FsZWQgKHByZS1tdWx0aXBsaWVkKSBieSB0aGUgYWxwaGEKLXZhbHVlLgotCi1UaGUgc2FtcGxlcyBhcmUgZWl0aGVyIGNvbnRhaW5lZCBkaXJlY3RseSBpbiB0aGUgaW1hZ2UgZGF0YSwgYmV0d2VlbiAxIGFuZCA4Ci1ieXRlcyBwZXIgcGl4ZWwgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZywgb3IgYXJlIGhlbGQgaW4gYSBjb2xvci1tYXAgaW5kZXhlZAotYnkgYnl0ZXMgaW4gdGhlIGltYWdlIGRhdGEuICBJbiB0aGUgY2FzZSBvZiBhIGNvbG9yLW1hcCB0aGUgY29sb3ItbWFwIGVudHJpZXMKLWFyZSBpbmRpdmlkdWFsIHNhbXBsZXMsIGVuY29kZWQgYXMgYWJvdmUsIGFuZCB0aGUgaW1hZ2UgZGF0YSBoYXMgb25lIGJ5dGUgcGVyCi1waXhlbCB0byBzZWxlY3QgdGhlIHJlbGV2YW50IHNhbXBsZSBmcm9tIHRoZSBjb2xvci1tYXAuCi0KLVBOR19GT1JNQVRfKgotCi1UaGUgI2RlZmluZXMgdG8gYmUgdXNlZCBpbiBwbmdfaW1hZ2U6OmZvcm1hdC4gIEVhY2ggI2RlZmluZSBpZGVudGlmaWVzIGEKLXBhcnRpY3VsYXIgbGF5b3V0IG9mIGNoYW5uZWwgZGF0YSBhbmQsIGlmIHByZXNlbnQsIGFscGhhIHZhbHVlcy4gIFRoZXJlIGFyZQotc2VwYXJhdGUgZGVmaW5lcyBmb3IgZWFjaCBvZiB0aGUgdHdvIGNvbXBvbmVudCBlbmNvZGluZ3MuCi0KLUEgZm9ybWF0IGlzIGJ1aWx0IHVwIHVzaW5nIHNpbmdsZSBiaXQgZmxhZyB2YWx1ZXMuICBBbGwgY29tYmluYXRpb25zIGFyZQotdmFsaWQuICBGb3JtYXRzIGNhbiBiZSBidWlsdCB1cCBmcm9tIHRoZSBmbGFnIHZhbHVlcyBvciB5b3UgY2FuIHVzZSBvbmUgb2YKLXRoZSBwcmVkZWZpbmVkIHZhbHVlcyBiZWxvdy4gIFdoZW4gdGVzdGluZyBmb3JtYXRzIGFsd2F5cyB1c2UgdGhlIEZPUk1BVF9GTEFHCi1tYWNyb3MgdG8gdGVzdCBmb3IgaW5kaXZpZHVhbCBmZWF0dXJlcyAtIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBtYXkKLWFkZCBuZXcgZmxhZ3MuCi0KLVdoZW4gcmVhZGluZyBvciB3cml0aW5nIGNvbG9yLW1hcHBlZCBpbWFnZXMgdGhlIGZvcm1hdCBzaG91bGQgYmUgc2V0IHRvIHRoZQotZm9ybWF0IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgdGhlbiBwbmdfaW1hZ2Vfe3JlYWQsd3JpdGV9X2NvbG9ybWFwCi1jYWxsZWQgdG8gcmVhZCBvciB3cml0ZSB0aGUgY29sb3ItbWFwIGFuZCBzZXQgdGhlIGZvcm1hdCBjb3JyZWN0bHkgZm9yIHRoZQotaW1hZ2UgZGF0YS4gIERvIG5vdCBzZXQgdGhlIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCBiaXQgZGlyZWN0bHkhCi0KLU5PVEU6IGxpYnBuZyBjYW4gYmUgYnVpbHQgd2l0aCBwYXJ0aWN1bGFyIGZlYXR1cmVzIGRpc2FibGVkLiBJZiB5b3Ugc2VlCi1jb21waWxlciBlcnJvcnMgYmVjYXVzZSB0aGUgZGVmaW5pdGlvbiBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFncyBoYXMgYmVlbgotY29tcGlsZWQgb3V0IGl0IGlzIGJlY2F1c2UgbGlicG5nIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHN1cHBvcnQuICBJdCBpcwotcG9zc2libGUsIGhvd2V2ZXIsIGZvciB0aGUgbGlicG5nIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHRoZSBmb3JtYXQgb24ganVzdAotcmVhZCBvciBqdXN0IHdyaXRlOyBpbiB0aGF0IGNhc2UgeW91IG1heSBzZWUgYW4gZXJyb3IgYXQgcnVuIHRpbWUuCi1Zb3UgY2FuIGd1YXJkIGFnYWluc3QgdGhpcyBieSBjaGVja2luZyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlCi1hcHByb3ByaWF0ZSAiX1NVUFBPUlRFRCIgbWFjcm8sIG9uZSBvZjoKLQotICAgUE5HX1NJTVBMSUZJRURfe1JFQUQsV1JJVEV9X3tCR1IsQUZJUlNUfV9TVVBQT1JURUQKLQotICAgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBICAgIGZvcm1hdCB3aXRoIGFuIGFscGhhIGNoYW5uZWwKLSAgIFBOR19GT1JNQVRfRkxBR19DT0xPUiAgICBjb2xvciBmb3JtYXQ6IG90aGVyd2lzZSBncmF5c2NhbGUKLSAgIFBOR19GT1JNQVRfRkxBR19MSU5FQVIgICAyLWJ5dGUgY2hhbm5lbHMgZWxzZSAxLWJ5dGUKLSAgIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCBpbWFnZSBkYXRhIGlzIGNvbG9yLW1hcHBlZAotICAgUE5HX0ZPUk1BVF9GTEFHX0JHUiAgICAgIEJHUiBjb2xvcnMsIGVsc2Ugb3JkZXIgaXMgUkdCCi0gICBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUICAgYWxwaGEgY2hhbm5lbCBjb21lcyBmaXJzdAotCi1TdXBwb3J0ZWQgZm9ybWF0cyBhcmUgYXMgZm9sbG93cy4gIEZ1dHVyZSB2ZXJzaW9ucyBvZiBsaWJwbmcgbWF5IHN1cHBvcnQgbW9yZQotZm9ybWF0czsgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgY2hlY2sgaWYgdGhlIGZvcm1hdAotbWFjcm8gaXMgZGVmaW5lZCB1c2luZyAjaWZkZWYuICBUaGVzZSBkZWZpbmVzIGRlc2NyaWJlIHRoZSBpbi1tZW1vcnkgbGF5b3V0Ci1vZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgcGl4ZWxzIG9mIHRoZSBpbWFnZS4KLQotRmlyc3QgdGhlIHNpbmdsZSBieXRlIChzUkdCKSBmb3JtYXRzOgotCi0gICBQTkdfRk9STUFUX0dSQVkKLSAgIFBOR19GT1JNQVRfR0EKLSAgIFBOR19GT1JNQVRfQUcKLSAgIFBOR19GT1JNQVRfUkdCCi0gICBQTkdfRk9STUFUX0JHUgotICAgUE5HX0ZPUk1BVF9SR0JBCi0gICBQTkdfRk9STUFUX0FSR0IKLSAgIFBOR19GT1JNQVRfQkdSQQotICAgUE5HX0ZPUk1BVF9BQkdSCi0KLVRoZW4gdGhlIGxpbmVhciAyLWJ5dGUgZm9ybWF0cy4gIFdoZW4gbmFtaW5nIHRoZXNlICJZIiBpcyB1c2VkIHRvCi1pbmRpY2F0ZSBhIGx1bWluYW5jZSAoZ3JheSkgY2hhbm5lbC4gIFRoZSBjb21wb25lbnQgb3JkZXIgd2l0aGluIHRoZSBwaXhlbAotaXMgYWx3YXlzIHRoZSBzYW1lIC0gdGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvciBzd2FwcGluZyB0aGUgb3JkZXIgb2YgdGhlCi1jb21wb25lbnRzIGluIHRoZSBsaW5lYXIgZm9ybWF0LiAgVGhlIGNvbXBvbmVudHMgYXJlIDE2LWJpdCBpbnRlZ2VycyBpbgotdGhlIG5hdGl2ZSBieXRlIG9yZGVyIGZvciB5b3VyIHBsYXRmb3JtLCBhbmQgdGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvcgotc3dhcHBpbmcgdGhlIGJ5dGVzIHRvIGEgZGlmZmVyZW50IGVuZGlhbiBjb25kaXRpb24uCi0KLSAgIFBOR19GT1JNQVRfTElORUFSX1kKLSAgIFBOR19GT1JNQVRfTElORUFSX1lfQUxQSEEKLSAgIFBOR19GT1JNQVRfTElORUFSX1JHQgotICAgUE5HX0ZPUk1BVF9MSU5FQVJfUkdCX0FMUEhBCi0KLVdpdGggY29sb3ItbWFwcGVkIGZvcm1hdHMgdGhlIGltYWdlIGRhdGEgaXMgb25lIGJ5dGUgZm9yIGVhY2ggcGl4ZWwuIFRoZSBieXRlCi1pcyBhbiBpbmRleCBpbnRvIHRoZSBjb2xvci1tYXAgd2hpY2ggaXMgZm9ybWF0dGVkIGFzIGFib3ZlLiAgVG8gb2J0YWluIGEKLWNvbG9yLW1hcHBlZCBmb3JtYXQgaXQgaXMgc3VmZmljaWVudCBqdXN0IHRvIGFkZCB0aGUgUE5HX0ZPTUFUX0ZMQUdfQ09MT1JNQVAKLXRvIG9uZSBvZiB0aGUgYWJvdmUgZGVmaW5pdGlvbnMsIG9yIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZGVmaW5pdGlvbnMgYmVsb3cuCi0KLSAgIFBOR19GT1JNQVRfUkdCX0NPTE9STUFQCi0gICBQTkdfRk9STUFUX0JHUl9DT0xPUk1BUAotICAgUE5HX0ZPUk1BVF9SR0JBX0NPTE9STUFQCi0gICBQTkdfRk9STUFUX0FSR0JfQ09MT1JNQVAKLSAgIFBOR19GT1JNQVRfQkdSQV9DT0xPUk1BUAotICAgUE5HX0ZPUk1BVF9BQkdSX0NPTE9STUFQCi0KLVBOR19JTUFHRSBtYWNyb3MKLQotVGhlc2UgYXJlIGNvbnZlbmllbmNlIG1hY3JvcyB0byBkZXJpdmUgaW5mb3JtYXRpb24gZnJvbSBhIHBuZ19pbWFnZQotc3RydWN0dXJlLiAgVGhlIFBOR19JTUFHRV9TQU1QTEVfIG1hY3JvcyByZXR1cm4gdmFsdWVzIGFwcHJvcHJpYXRlIHRvIHRoZQotYWN0dWFsIGltYWdlIHNhbXBsZSB2YWx1ZXMgLSBlaXRoZXIgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCBvciB0aGUKLXBpeGVscyBpbiB0aGUgaW1hZ2UuICBUaGUgUE5HX0lNQUdFX1BJWEVMXyBtYWNyb3MgcmV0dXJuIGNvcnJlc3BvbmRpbmcgdmFsdWVzCi1mb3IgdGhlIHBpeGVscyBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIDEgZm9yIGNvbG9yLW1hcHBlZCBmb3JtYXRzLiAgVGhlCi1yZW1haW5pbmcgbWFjcm9zIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm93cyBpbiB0aGUgaW1hZ2UgYW5kIHRoZQotY29tcGxldGUgaW1hZ2UuCi0KLU5PVEU6IEFsbCB0aGUgbWFjcm9zIHRoYXQgdGFrZSBhIHBuZ19pbWFnZTo6Zm9ybWF0IHBhcmFtZXRlciBhcmUgY29tcGlsZSB0aW1lCi1jb25zdGFudHMgaWYgdGhlIGZvcm1hdCBwYXJhbWV0ZXIgaXMsIGl0c2VsZiwgYSBjb25zdGFudC4gIFRoZXJlZm9yZSB0aGVzZQotbWFjcm9zIGNhbiBiZSB1c2VkIGluIGFycmF5IGRlY2xhcmF0aW9ucyBhbmQgY2FzZSBsYWJlbHMgd2hlcmUgcmVxdWlyZWQuCi1TaW1pbGFybHkgdGhlIG1hY3JvcyBhcmUgYWxzbyBwcmUtcHJvY2Vzc29yIGNvbnN0YW50cyAoc2l6ZW9mIGlzIG5vdCB1c2VkKSBzbwotdGhleSBjYW4gYmUgdXNlZCBpbiAjaWYgdGVzdHMuCi0KLSAgUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhmbXQpCi0gICAgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIGEgZ2l2ZW4gZm9ybWF0OiAxLi40Ci0KLSAgUE5HX0lNQUdFX1NBTVBMRV9DT01QT05FTlRfU0laRShmbXQpCi0gICAgUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQgb2YgYSBwaXhlbCBvciBjb2xvci1tYXAKLSAgICBlbnRyeSAoYXMgYXBwcm9wcmlhdGUpIGluIHRoZSBpbWFnZTogMSBvciAyLgotCi0gIFBOR19JTUFHRV9TQU1QTEVfU0laRShmbXQpCi0gICAgVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGRhdGEgZm9yIG9uZSBzYW1wbGUuICBJZiB0aGUgaW1hZ2UgaXMKLSAgICBjb2xvci1tYXBwZWQgaXQgaXMgdGhlIHNpemUgb2Ygb25lIGNvbG9yLW1hcCBlbnRyeSAoYW5kIGltYWdlIHBpeGVscyBhcmUKLSAgICBvbmUgYnl0ZSBpbiBzaXplKSwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBzaXplIG9mIG9uZSBpbWFnZSBwaXhlbC4KLQotICBQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKGZtdCkKLSAgICBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb2xvci1tYXAgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdCBleHByZXNzZWQgaW4gYQotICAgIGNvdW50IG9mIGNvbXBvbmVudHMuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbXBpbGUtdGltZSBhbGxvY2F0ZSBhCi0gICAgY29sb3ItbWFwOgotCi0gICAgcG5nX3VpbnRfMTYgY29sb3JtYXBbUE5HX0lNQUdFX01BWElNVU1fQ09MT1JNQVBfQ09NUE9ORU5UUyhsaW5lYXJfZm10KV07Ci0KLSAgICBwbmdfYnl0ZSBjb2xvcm1hcFtQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKHNSR0JfZm10KV07Ci0KLSAgICBBbHRlcm5hdGl2ZWx5IHVzZSB0aGUgUE5HX0lNQUdFX0NPTE9STUFQX1NJWkUgbWFjcm8gYmVsb3cgdG8gdXNlIHRoZQotICAgIGluZm9ybWF0aW9uIGZyb20gb25lIG9mIHRoZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF8gQVBJcyBhbmQgZHluYW1pY2FsbHkKLSAgICBhbGxvY2F0ZSB0aGUgcmVxdWlyZWQgbWVtb3J5LgotCi0gIFBOR19JTUFHRV9DT0xPUk1BUF9TSVpFKGZtdCkKLSAgIFRoZSBzaXplIG9mIHRoZSBjb2xvci1tYXAgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdDsgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUKLSAgIGNvbG9yLW1hcCBidWZmZXIgcGFzc2VkIHRvIHRoZSBwbmdfaW1hZ2Vfe3JlYWQsd3JpdGV9X2NvbG9ybWFwIEFQSXMuIEl0IGlzCi0gICBhIGZpeGVkIG51bWJlciBkZXRlcm1pbmVkIGJ5IHRoZSBmb3JtYXQgc28gY2FuIGVhc2lseSBiZSBhbGxvY2F0ZWQgb24gdGhlCi0gICBzdGFjayBpZiBuZWNlc3NhcnkuCi0KLUNvcnJlc3BvbmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBpeGVscwotCi0gIFBOR19JTUFHRV9QSVhFTF9DSEFOTkVMUyhmbXQpCi0gICBUaGUgbnVtYmVyIG9mIHNlcGFyYXRlIGNoYW5uZWxzIChjb21wb25lbnRzKSBpbiBhIHBpeGVsOyAxIGZvciBhCi0gICBjb2xvci1tYXBwZWQgaW1hZ2UuCi0KLSAgUE5HX0lNQUdFX1BJWEVMX0NPTVBPTkVOVF9TSVpFKGZtdClcCi0gICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGVhY2ggY29tcG9uZW50IGluIGEgcGl4ZWw7IDEgZm9yIGEgY29sb3ItbWFwcGVkCi0gICBpbWFnZS4KLQotICBQTkdfSU1BR0VfUElYRUxfU0laRShmbXQpCi0gICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGEgY29tcGxldGUgcGl4ZWw7IDEgZm9yIGEgY29sb3ItbWFwcGVkIGltYWdlLgotCi1JbmZvcm1hdGlvbiBhYm91dCB0aGUgd2hvbGUgcm93LCBvciB3aG9sZSBpbWFnZQotCi0gIFBOR19JTUFHRV9ST1dfU1RSSURFKGltYWdlKQotICAgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYSBzaW5nbGUgcm93IG9mIHRoZSBpbWFnZTsgdGhpcwotICAgaXMgdGhlIG1pbmltdW0gJ3JvdyBzdHJpZGUnLCB0aGUgbWluaW11bSBjb3VudCBvZiBjb21wb25lbnRzIGJldHdlZW4gZWFjaAotICAgcm93LiAgRm9yIGEgY29sb3ItbWFwcGVkIGltYWdlIHRoaXMgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEKLSAgIHJvdy4KLQotICAgSWYgeW91IG5lZWQgdGhlIHN0cmlkZSBtZWFzdXJlZCBpbiBieXRlcywgcm93X3N0cmlkZV9ieXRlcyBpcwotICAgUE5HX0lNQUdFX1JPV19TVFJJREUoaW1hZ2UpICogUE5HX0lNQUdFX1BJWEVMX0NPTVBPTkVOVF9TSVpFKGZtdCkKLSAgIHBsdXMgYW55IHBhZGRpbmcgYnl0ZXMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIG1pZ2h0IG5lZWQsIGZvciBleGFtcGxlCi0gICB0byBzdGFydCB0aGUgbmV4dCByb3cgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi0KLSAgUE5HX0lNQUdFX0JVRkZFUl9TSVpFKGltYWdlLCByb3dfc3RyaWRlKQotICAgUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgYW4gaW1hZ2UgYnVmZmVyIGdpdmVuIGEgcG5nX2ltYWdlIGFuZCBhIHJvdwotICAgc3RyaWRlIC0gdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRvIGxlYXZlIHNwYWNlIGZvciBpbiBlYWNoIHJvdy4KLQotICBQTkdfSU1BR0VfU0laRShpbWFnZSkKLSAgIFJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBpbWFnZSBpbiBtZW1vcnkgZ2l2ZW4ganVzdCBhIHBuZ19pbWFnZTsKLSAgIHRoZSByb3cgc3RyaWRlIGlzIHRoZSBtaW5pbXVtIHN0cmlkZSByZXF1aXJlZCBmb3IgdGhlIGltYWdlLgotCi0gIFBOR19JTUFHRV9DT0xPUk1BUF9TSVpFKGltYWdlKQotICAgUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGNvbG9yLW1hcCBvZiB0aGlzIGltYWdlLiAgSWYgdGhlIGltYWdlCi0gICBmb3JtYXQgaXMgbm90IGEgY29sb3ItbWFwIGZvcm1hdCB0aGlzIHdpbGwgcmV0dXJuIGEgc2l6ZSBzdWZmaWNpZW50IGZvcgotICAgMjU2IGVudHJpZXMgaW4gdGhlIGdpdmVuIGZvcm1hdDsgY2hlY2sgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGlmCi0gICB5b3UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhIGNvbG9yLW1hcCBpbiB0aGlzIGNhc2UuCi0KLVBOR19JTUFHRV9GTEFHXyoKLQotRmxhZ3MgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbWFnZSBhcmUgaGVsZCBpbgotdGhlICdmbGFncycgZmllbGQgb2YgcG5nX2ltYWdlLgotCi0gIFBOR19JTUFHRV9GTEFHX0NPTE9SU1BBQ0VfTk9UX3NSR0IgPT0gMHgwMQotICAgIFRoaXMgaW5kaWNhdGVzIHRoZSB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgaW4tbWVtb3J5IGJpdG1hcCBkbyBub3QKLSAgICBjb3JyZXNwb25kIHRvIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGVuZC1wb2ludHMgZGVmaW5lZCBieSBzUkdCLgotCi0gIFBOR19JTUFHRV9GTEFHX0ZBU1QgPT0gMHgwMgotICAgT24gd3JpdGUgZW1waGFzaXNlIHNwZWVkIG92ZXIgY29tcHJlc3Npb247IHRoZSByZXN1bHRhbnQgUE5HIGZpbGUgd2lsbCBiZQotICAgbGFyZ2VyIGJ1dCB3aWxsIGJlIHByb2R1Y2VkIHNpZ25pZmljYW50bHkgZmFzdGVyLCBwYXJ0aWN1bGFyIGZvciBsYXJnZQotICAgaW1hZ2VzLiAgRG8gbm90IHVzZSB0aGlzIG9wdGlvbiBmb3IgaW1hZ2VzIHdoaWNoIHdpbGwgYmUgZGlzdHJpYnV0ZWQsIG9ubHkKLSAgIHVzZWQgaXQgd2hlbiBwcm9kdWNpbmcgaW50ZXJtZWRpYXRlIGZpbGVzIHRoYXQgd2lsbCBiZSByZWFkIGJhY2sgaW4KLSAgIHJlcGVhdGVkbHkuICBGb3IgYSB0eXBpY2FsIDI0LWJpdCBpbWFnZSB0aGUgb3B0aW9uIHdpbGwgZG91YmxlIHRoZSByZWFkCi0gICBzcGVlZCBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSBpbWFnZSBzaXplIGJ5IDI1JSwgaG93ZXZlciBmb3IgbWFueQotICAgbW9yZSBjb21wcmVzc2libGUgaW1hZ2VzIHRoZSBQTkcgZmlsZSBjYW4gYmUgMTAgdGltZXMgbGFyZ2VyIHdpdGggb25seSBhCi0gICBzbGlnaHQgc3BlZWQgZ2Fpbi4KLQotICBQTkdfSU1BR0VfRkxBR18xNkJJVF9zUkdCID09IDB4MDQKLSAgICBPbiByZWFkIGlmIHRoZSBpbWFnZSBpcyBhIDE2LWJpdCBwZXIgY29tcG9uZW50IGltYWdlIGFuZCB0aGVyZSBpcyBubyBnQU1BCi0gICAgb3Igc1JHQiBjaHVuayBhc3N1bWUgdGhhdCB0aGUgY29tcG9uZW50cyBhcmUgc1JHQiBlbmNvZGVkLiAgTm90aWNlIHRoYXQKLSAgICBpbWFnZXMgb3V0cHV0IGJ5IHRoZSBzaW1wbGlmaWVkIEFQSSBhbHdheXMgaGF2ZSBnYW1tYSBpbmZvcm1hdGlvbjsgc2V0dGluZwotICAgIHRoaXMgZmxhZyBvbmx5IGFmZmVjdHMgdGhlIGludGVycHJldGF0aW9uIG9mIDE2LWJpdCBpbWFnZXMgZnJvbSBhbgotICAgIGV4dGVybmFsIHNvdXJjZS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGV4cG9zZSB0aGlzIGZsYWcKLSAgICB0byB0aGUgdXNlcjsgdGhlIHVzZXIgY2FuIG5vcm1hbGx5IGVhc2lseSByZWNvZ25pemUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICAgIGxpbmVhciBhbmQgc1JHQiBlbmNvZGluZy4gIFRoaXMgZmxhZyBoYXMgbm8gZWZmZWN0IG9uIHdyaXRlIC0gdGhlIGRhdGEKLSAgICBwYXNzZWQgdG8gdGhlIHdyaXRlIEFQSXMgbXVzdCBoYXZlIHRoZSBjb3JyZWN0IGVuY29kaW5nIChhcyBkZWZpbmVkCi0gICAgYWJvdmUuKQotCi0gICAgSWYgdGhlIGZsYWcgaXMgbm90IHNldCAodGhlIGRlZmF1bHQpIGlucHV0IDE2LWJpdCBwZXIgY29tcG9uZW50IGRhdGEgaXMKLSAgICBhc3N1bWVkIHRvIGJlIGxpbmVhci4KLQotICAgIE5PVEU6IHRoZSBmbGFnIGNhbiBvbmx5IGJlIHNldCBhZnRlciB0aGUgcG5nX2ltYWdlX2JlZ2luX3JlYWRfIGNhbGwsCi0gICAgYmVjYXVzZSB0aGF0IGNhbGwgaW5pdGlhbGl6ZXMgdGhlICdmbGFncycgZmllbGQuCi0KLVJFQUQgQVBJcwotCi0gICBUaGUgcG5nX2ltYWdlIHBhc3NlZCB0byB0aGUgcmVhZCBBUElzIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IHNldHRpbmcKLSAgIHRoZSBwbmdfY29udHJvbHAgZmllbGQgJ29wYXF1ZScgdG8gTlVMTCAob3IsIGJldHRlciwgbWVtc2V0IHRoZSB3aG9sZSB0aGluZy4pCi0KLSAgIGludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUoIHBuZ19pbWFnZXAgaW1hZ2UsCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKLQotICAgICBUaGUgbmFtZWQgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWQgYW5kIHRoZSBpbWFnZSBoZWFkZXIKLSAgICAgaXMgZmlsbGVkIGluIGZyb20gdGhlIFBORyBoZWFkZXIgaW4gdGhlIGZpbGUuCi0KLSAgIGludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvIChwbmdfaW1hZ2VwIGltYWdlLAotICAgICBGSUxFKiBmaWxlKQotCi0gICAgICBUaGUgUE5HIGhlYWRlciBpcyByZWFkIGZyb20gdGhlIHN0ZGlvIEZJTEUgb2JqZWN0LgotCi0gICBpbnQgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnkocG5nX2ltYWdlcCBpbWFnZSwKLSAgICAgIHBuZ19jb25zdF92b2lkcCBtZW1vcnksIHBuZ19zaXplX3Qgc2l6ZSkKLQotICAgICAgVGhlIFBORyBoZWFkZXIgaXMgcmVhZCBmcm9tIHRoZSBnaXZlbiBtZW1vcnkgYnVmZmVyLgotCi0gICBpbnQgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKHBuZ19pbWFnZXAgaW1hZ2UsCi0gICAgICBwbmdfY29sb3JwIGJhY2tncm91bmQsIHZvaWQgKmJ1ZmZlciwKLSAgICAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgdm9pZCAqY29sb3JtYXApKTsKLQotICAgICAgRmluaXNoIHJlYWRpbmcgdGhlIGltYWdlIGludG8gdGhlIHN1cHBsaWVkIGJ1ZmZlciBhbmQKLSAgICAgIGNsZWFuIHVwIHRoZSBwbmdfaW1hZ2Ugc3RydWN0dXJlLgotCi0gICAgICByb3dfc3RyaWRlIGlzIHRoZSBzdGVwLCBpbiBwbmdfYnl0ZSBvciBwbmdfdWludF8xNiB1bml0cwotICAgICAgYXMgYXBwcm9wcmlhdGUsIGJldHdlZW4gYWRqYWNlbnQgcm93cy4gIEEgcG9zaXRpdmUgc3RyaWRlCi0gICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgdG9wLW1vc3Qgcm93IGlzIGZpcnN0IGluIHRoZSBidWZmZXIgLQotICAgICAgdGhlIG5vcm1hbCB0b3AtZG93biBhcnJhbmdlbWVudC4gIEEgbmVnYXRpdmUgc3RyaWRlCi0gICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgYm90dG9tLW1vc3Qgcm93IGlzIGZpcnN0IGluIHRoZSBidWZmZXIuCi0KLSAgICAgIGJhY2tncm91bmQgbmVlZCBvbmx5IGJlIHN1cHBsaWVkIGlmIGFuIGFscGhhIGNoYW5uZWwgbXVzdAotICAgICAgYmUgcmVtb3ZlZCBmcm9tIGEgcG5nX2J5dGUgZm9ybWF0IGFuZCB0aGUgcmVtb3ZhbCBpcyB0byBiZQotICAgICAgZG9uZSBieSBjb21wb3NpdGluZyBvbiBhIHNvbGlkIGNvbG9yOyBvdGhlcndpc2UgaXQgbWF5IGJlCi0gICAgICBOVUxMIGFuZCBhbnkgY29tcG9zaXRpb24gd2lsbCBiZSBkb25lIGRpcmVjdGx5IG9udG8gdGhlCi0gICAgICBidWZmZXIuICBUaGUgdmFsdWUgaXMgYW4gc1JHQiBjb2xvciB0byB1c2UgZm9yIHRoZQotICAgICAgYmFja2dyb3VuZCwgZm9yIGdyYXlzY2FsZSBvdXRwdXQgdGhlIGdyZWVuIGNoYW5uZWwgaXMgdXNlZC4KLQotICAgICAgRm9yIGxpbmVhciBvdXRwdXQgcmVtb3ZpbmcgdGhlIGFscGhhIGNoYW5uZWwgaXMgYWx3YXlzIGRvbmUKLSAgICAgIGJ5IGNvbXBvc2l0aW5nIG9uIGJsYWNrLgotCi0gICB2b2lkIHBuZ19pbWFnZV9mcmVlKHBuZ19pbWFnZXAgaW1hZ2UpCi0KLSAgICAgIEZyZWUgYW55IGRhdGEgYWxsb2NhdGVkIGJ5IGxpYnBuZyBpbiBpbWFnZS0+b3BhcXVlLAotICAgICAgc2V0dGluZyB0aGUgcG9pbnRlciB0byBOVUxMLiAgTWF5IGJlIGNhbGxlZCBhdCBhbnkgdGltZQotICAgICAgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KLQotV2hlbiB0aGUgc2ltcGxpZmllZCBBUEkgbmVlZHMgdG8gY29udmVydCBiZXR3ZWVuIHNSR0IgYW5kIGxpbmVhciBjb2xvcnNwYWNlcywKLXRoZSBhY3R1YWwgc1JHQiB0cmFuc2ZlciBjdXJ2ZSBkZWZpbmVkIGluIHRoZSBzUkdCIHNwZWNpZmljYXRpb24gKHNlZSB0aGUKLWFydGljbGUgYXQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUkdCKSBpcyB1c2VkLCBub3QgdGhlIGdhbW1hPTEvMi4yCi1hcHByb3hpbWF0aW9uIHVzZWQgZWxzZXdoZXJlIGluIGxpYnBuZy4KLQotV1JJVEUgQVBJUwotCi1Gb3Igd3JpdGUgeW91IG11c3QgaW5pdGlhbGl6ZSBhIHBuZ19pbWFnZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGltYWdlIHRvCi1iZSB3cml0dGVuOgotCi0gICB2ZXJzaW9uOiBtdXN0IGJlIHNldCB0byBQTkdfSU1BR0VfVkVSU0lPTgotICAgb3BhcXVlOiBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE5VTEwKLSAgIHdpZHRoOiBpbWFnZSB3aWR0aCBpbiBwaXhlbHMKLSAgIGhlaWdodDogaW1hZ2UgaGVpZ2h0IGluIHJvd3MKLSAgIGZvcm1hdDogdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSB5b3Ugd2lzaCB0byB3cml0ZQotICAgZmxhZ3M6IHNldCB0byAwIHVubGVzcyBvbmUgb2YgdGhlIGRlZmluZWQgZmxhZ3MgYXBwbGllczsgc2V0Ci0gICAgICBQTkdfSU1BR0VfRkxBR19DT0xPUlNQQUNFX05PVF9zUkdCIGZvciBjb2xvciBmb3JtYXQgaW1hZ2VzCi0gICAgICB3aGVyZSB0aGUgUkdCIHZhbHVlcyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgY29sb3JzIGluIHNSR0IuCi0gICBjb2xvcm1hcF9lbnRyaWVzOiBzZXQgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgKDAgdG8gMjU2KQotCi0gICBpbnQgcG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUsIChwbmdfaW1hZ2VwIGltYWdlLAotICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGNvbnZlcnRfdG9fOGJpdCwgY29uc3Qgdm9pZCAqYnVmZmVyLAotICAgICAgcG5nX2ludF8zMiByb3dfc3RyaWRlLCBjb25zdCB2b2lkICpjb2xvcm1hcCkpOwotCi0gICAgICBXcml0ZSB0aGUgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUuCi0KLSAgIGludCBwbmdfaW1hZ2Vfd3JpdGVfdG9fbWVtb3J5IChwbmdfaW1hZ2VwIGltYWdlLCB2b2lkICptZW1vcnksCi0gICAgICBwbmdfYWxsb2Nfc2l6ZV90ICogUE5HX1JFU1RSSUNUIG1lbW9yeV9ieXRlcywKLSAgICAgIGludCBjb252ZXJ0X3RvXzhfYml0LCBjb25zdCB2b2lkICpidWZmZXIsIHB0cmRpZmZfdCByb3dfc3RyaWRlLAotICAgICAgY29uc3Qgdm9pZCAqY29sb3JtYXApKTsKLQotICAgICAgV3JpdGUgdGhlIGltYWdlIHRvIG1lbW9yeS4KLQotICAgaW50IHBuZ19pbWFnZV93cml0ZV90b19zdGRpbyhwbmdfaW1hZ2VwIGltYWdlLCBGSUxFICpmaWxlLAotICAgICAgaW50IGNvbnZlcnRfdG9fOF9iaXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgY29uc3Qgdm9pZCAqY29sb3JtYXApCi0KLSAgICAgIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgZ2l2ZW4gKEZJTEUqKS4KLQotV2l0aCBhbGwgd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGgKLShwbmdfdWludF8xNikgZGF0YSB0aGVuIHNldHRpbmcgY29udmVydF90b184X2JpdCB3aWxsIGNhdXNlIHRoZSBvdXRwdXQgdG8gYmUKLWEgKHBuZ19ieXRlKSBQTkcgZ2FtbWEgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiwgb3RoZXJ3aXNlCi1hIDE2LWJpdCBsaW5lYXIgZW5jb2RlZCBQTkcgZmlsZSBpcyB3cml0dGVuLgotCi1XaXRoIGFsbCBBUElzIHJvd19zdHJpZGUgaXMgaGFuZGxlZCBhcyBpbiB0aGUgcmVhZCBBUElzIC0gaXQgaXMgdGhlIHNwYWNpbmcKLWZyb20gb25lIHJvdyB0byB0aGUgbmV4dCBpbiBjb21wb25lbnQgc2l6ZWQgdW5pdHMgKGZsb2F0KSBhbmQgaWYgbmVnYXRpdmUKLWluZGljYXRlcyBhIGJvdHRvbS11cCByb3cgbGF5b3V0IGluIHRoZSBidWZmZXIuICBJZiB5b3UgcGFzcyB6ZXJvLCBsaWJwbmcgd2lsbAotY2FsY3VsYXRlIHRoZSByb3dfc3RyaWRlIGZvciB5b3UgZnJvbSB0aGUgd2lkdGggYW5kIG51bWJlciBvZiBjaGFubmVscy4KLQotTm90ZSB0aGF0IHRoZSB3cml0ZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmxhY2luZywgc3ViLTgtYml0IHBpeGVscywKLWluZGV4ZWQgKHBhbGV0dGVkKSBpbWFnZXMsIG9yIG1vc3QgYW5jaWxsYXJ5IGNodW5rcy4KLQotVkkuIE1vZGlmeWluZy9DdXN0b21pemluZyBsaWJwbmcKLQotVGhlcmUgYXJlIHR3byBpc3N1ZXMgaGVyZS4gIFRoZSBmaXJzdCBpcyBjaGFuZ2luZyBob3cgbGlicG5nIGRvZXMKLXN0YW5kYXJkIHRoaW5ncyBsaWtlIG1lbW9yeSBhbGxvY2F0aW9uLCBpbnB1dC9vdXRwdXQsIGFuZCBlcnJvciBoYW5kbGluZy4KLVRoZSBzZWNvbmQgZGVhbHMgd2l0aCBtb3JlIGNvbXBsaWNhdGVkIHRoaW5ncyBsaWtlIGFkZGluZyBuZXcgY2h1bmtzLAotYWRkaW5nIG5ldyB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBnZW5lcmFsbHkgY2hhbmdpbmcgaG93IGxpYnBuZyB3b3Jrcy4KLUJvdGggb2YgdGhvc2UgYXJlIGNvbXBpbGUtdGltZSBpc3N1ZXM7IHRoYXQgaXMsIHRoZXkgYXJlIGdlbmVyYWxseQotZGV0ZXJtaW5lZCBhdCB0aGUgdGltZSB0aGUgY29kZSBpcyB3cml0dGVuLCBhbmQgdGhlcmUgaXMgcmFyZWx5IGEgbmVlZAotdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGEgbWVhbnMgb2YgY2hhbmdpbmcgdGhlbS4KLQotTWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nCi0KLUFsbCBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24sIGlucHV0L291dHB1dCwgYW5kIGVycm9yIGhhbmRsaW5nIGluIGxpYnBuZwotZ29lcyB0aHJvdWdoIGNhbGxiYWNrcyB0aGF0IGFyZSB1c2VyLXNldHRhYmxlLiAgVGhlIGRlZmF1bHQgcm91dGluZXMgYXJlCi1pbiBwbmdtZW0uYywgcG5ncmlvLmMsIHBuZ3dpby5jLCBhbmQgcG5nZXJyb3IuYywgcmVzcGVjdGl2ZWx5LiAgVG8gY2hhbmdlCi10aGVzZSBmdW5jdGlvbnMsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19zZXRfKl9mbigpIGZ1bmN0aW9uLgotCi1NZW1vcnkgYWxsb2NhdGlvbiBpcyBkb25lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucyBwbmdfbWFsbG9jKCksIHBuZ19jYWxsb2MoKSwKLWFuZCBwbmdfZnJlZSgpLiAgVGhlIHBuZ19tYWxsb2MoKSBhbmQgcG5nX2ZyZWUoKSBmdW5jdGlvbnMgY3VycmVudGx5IGp1c3QKLWNhbGwgdGhlIHN0YW5kYXJkIEMgZnVuY3Rpb25zIGFuZCBwbmdfY2FsbG9jKCkgY2FsbHMgcG5nX21hbGxvYygpIGFuZCB0aGVuCi1jbGVhcnMgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgdG8gemVybzsgbm90ZSB0aGF0IHBuZ19jYWxsb2MocG5nX3B0ciwgc2l6ZSkKLWlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY2FsbG9jKG51bWJlciwgc2l6ZSkgZnVuY3Rpb24gcHJvdmlkZWQgYnkgc3RkbGliLmguCi1UaGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQgZm9yIGNlcnRhaW4gc3lzdGVtcyB3aXRoIHNlZ21lbnRlZCBtZW1vcnkKLWFyY2hpdGVjdHVyZXMgYW5kIHRoZSB0eXBlcyBvZiBwb2ludGVycyBkZWNsYXJlZCBieSBwbmcuaCBtYXRjaCB0aGlzOyB5b3UKLXdpbGwgaGF2ZSB0byB1c2UgYXBwcm9wcmlhdGUgcG9pbnRlcnMgaW4geW91ciBhcHBsaWNhdGlvbi4gIElmIHlvdSBwcmVmZXIKLXRvIHVzZSBhIGRpZmZlcmVudCBtZXRob2Qgb2YgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBkYXRhLCB5b3UgY2FuIHVzZQotcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgb3IgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMigpIHRvIHJlZ2lzdGVyIHlvdXIKLW93biBmdW5jdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlLiAgVGhlc2UgZnVuY3Rpb25zIGFsc28gcHJvdmlkZSBhIHZvaWQKLXBvaW50ZXIgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHZpYQotCi0gICAgbWVtX3B0cj1wbmdfZ2V0X21lbV9wdHIocG5nX3B0cik7Ci0KLVlvdXIgcmVwbGFjZW1lbnQgbWVtb3J5IGZ1bmN0aW9ucyBtdXN0IGhhdmUgcHJvdG90eXBlcyBhcyBmb2xsb3dzOgotCi0gICAgcG5nX3ZvaWRwIG1hbGxvY19mbihwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGZyZWVfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3ZvaWRwIHB0cik7Ci0KLVlvdXIgbWFsbG9jX2ZuKCkgbXVzdCByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuICBUaGUgcG5nX21hbGxvYygpCi1mdW5jdGlvbiB3aWxsIG5vcm1hbGx5IGNhbGwgcG5nX2Vycm9yKCkgaWYgaXQgcmVjZWl2ZXMgYSBOVUxMIGZyb20gdGhlCi1zeXN0ZW0gbWVtb3J5IGFsbG9jYXRvciBvciBmcm9tIHlvdXIgcmVwbGFjZW1lbnQgbWFsbG9jX2ZuKCkuCi0KLVlvdXIgZnJlZV9mbigpIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHdpdGggYSBOVUxMIHB0ciwgc2luY2UgbGlicG5nJ3MKLXBuZ19mcmVlKCkgY2hlY2tzIGZvciBOVUxMIGJlZm9yZSBjYWxsaW5nIGZyZWVfZm4oKS4KLQotSW5wdXQvT3V0cHV0IGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX3JlYWQoKSBhbmQgcG5nX3dyaXRlKCksCi13aGljaCBjdXJyZW50bHkganVzdCBjYWxsIGZyZWFkKCkgYW5kIGZ3cml0ZSgpLiAgVGhlIEZJTEUgKiBpcyBzdG9yZWQgaW4KLXBuZ19zdHJ1Y3QgYW5kIGlzIGluaXRpYWxpemVkIHZpYSBwbmdfaW5pdF9pbygpLiAgSWYgeW91IHdpc2ggdG8gY2hhbmdlCi10aGUgbWV0aG9kIG9mIEkvTywgdGhlIGxpYnJhcnkgc3VwcGxpZXMgY2FsbGJhY2tzIHRoYXQgeW91IGNhbiBzZXQKLXRocm91Z2ggdGhlIGZ1bmN0aW9uIHBuZ19zZXRfcmVhZF9mbigpIGFuZCBwbmdfc2V0X3dyaXRlX2ZuKCkgYXQgcnVuCi10aW1lLCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24uICBUaGVzZSBmdW5jdGlvbnMKLWFsc28gcHJvdmlkZSBhIHZvaWQgcG9pbnRlciB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBmdW5jdGlvbgotcG5nX2dldF9pb19wdHIoKS4gIEZvciBleGFtcGxlOgotCi0gICAgcG5nX3NldF9yZWFkX2ZuKHBuZ19zdHJ1Y3RwIHJlYWRfcHRyLAotICAgICAgICB2b2lkcCByZWFkX2lvX3B0ciwgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm4pCi0KLSAgICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19zdHJ1Y3RwIHdyaXRlX3B0ciwKLSAgICAgICAgdm9pZHAgd3JpdGVfaW9fcHRyLCBwbmdfcndfcHRyIHdyaXRlX2RhdGFfZm4sCi0gICAgICAgIHBuZ19mbHVzaF9wdHIgb3V0cHV0X2ZsdXNoX2ZuKTsKLQotICAgIHZvaWRwIHJlYWRfaW9fcHRyID0gcG5nX2dldF9pb19wdHIocmVhZF9wdHIpOwotICAgIHZvaWRwIHdyaXRlX2lvX3B0ciA9IHBuZ19nZXRfaW9fcHRyKHdyaXRlX3B0cik7Ci0KLVRoZSByZXBsYWNlbWVudCBJL08gZnVuY3Rpb25zIG11c3QgaGF2ZSBwcm90b3R5cGVzIGFzIGZvbGxvd3M6Ci0KLSAgICB2b2lkIHVzZXJfcmVhZF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCk7Ci0KLSAgICB2b2lkIHVzZXJfd3JpdGVfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotCi0gICAgdm9pZCB1c2VyX2ZsdXNoX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0cik7Ci0KLVRoZSB1c2VyX3JlYWRfZGF0YSgpIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlY3RpbmcgYW5kCi1oYW5kbGluZyBlbmQtb2YtZGF0YSBlcnJvcnMuCi0KLVN1cHBseWluZyBOVUxMIGZvciB0aGUgcmVhZCwgd3JpdGUsIG9yIGZsdXNoIGZ1bmN0aW9ucyBzZXRzIHRoZW0gYmFjawotdG8gdXNpbmcgdGhlIGRlZmF1bHQgQyBzdHJlYW0gZnVuY3Rpb25zLCB3aGljaCBleHBlY3QgdGhlIGlvX3B0ciB0bwotcG9pbnQgdG8gYSBzdGFuZGFyZCAqRklMRSBzdHJ1Y3R1cmUuICBJdCBpcyBwcm9iYWJseSBhIG1pc3Rha2UKLXRvIHVzZSBOVUxMIGZvciBvbmUgb2Ygd3JpdGVfZGF0YV9mbiBhbmQgb3V0cHV0X2ZsdXNoX2ZuIGJ1dCBub3QgYm90aAotb2YgdGhlbSwgdW5sZXNzIHlvdSBoYXZlIGJ1aWx0IGxpYnBuZyB3aXRoIFBOR19OT19XUklURV9GTFVTSCBkZWZpbmVkLgotSXQgaXMgYW4gZXJyb3IgdG8gcmVhZCBmcm9tIGEgd3JpdGUgc3RyZWFtLCBhbmQgdmljZSB2ZXJzYS4KLQotRXJyb3IgaGFuZGxpbmcgaW4gbGlicG5nIGlzIGRvbmUgdGhyb3VnaCBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKS4KLUVycm9ycyBoYW5kbGVkIHRocm91Z2ggcG5nX2Vycm9yKCkgYXJlIGZhdGFsLCBtZWFuaW5nIHRoYXQgcG5nX2Vycm9yKCkKLXNob3VsZCBuZXZlciByZXR1cm4gdG8gaXRzIGNhbGxlci4gIEN1cnJlbnRseSwgdGhpcyBpcyBoYW5kbGVkIHZpYQotc2V0am1wKCkgYW5kIGxvbmdqbXAoKSAodW5sZXNzIHlvdSBoYXZlIGNvbXBpbGVkIGxpYnBuZyB3aXRoCi1QTkdfTk9fU0VUSk1QLCBpbiB3aGljaCBjYXNlIGl0IGlzIGhhbmRsZWQgdmlhIFBOR19BQk9SVCgpKSwKLWJ1dCB5b3UgY291bGQgY2hhbmdlIHRoaXMgdG8gZG8gdGhpbmdzIGxpa2UgZXhpdCgpIGlmIHlvdSBzaG91bGQgd2lzaCwKLWFzIGxvbmcgYXMgeW91ciBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4uCi0KLU9uIG5vbi1mYXRhbCBlcnJvcnMsIHBuZ193YXJuaW5nKCkgaXMgY2FsbGVkCi10byBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gY29udHJvbCByZXR1cm5zIHRvIHRoZSBjYWxsaW5nIGNvZGUuCi1CeSBkZWZhdWx0IHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpIHByaW50IGEgbWVzc2FnZSBvbiBzdGRlcnIgdmlhCi1mcHJpbnRmKCkgdW5sZXNzIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggUE5HX05PX0NPTlNPTEVfSU8gZGVmaW5lZAotKGJlY2F1c2UgeW91IGRvbid0IHdhbnQgdGhlIG1lc3NhZ2VzKSBvciBQTkdfTk9fU1RESU8gZGVmaW5lZCAoYmVjYXVzZQotZnByaW50ZigpIGlzbid0IGF2YWlsYWJsZSkuICBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBlcnJvcgotZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCB1cCB5b3VyIG93biBtZXNzYWdlIGNhbGxiYWNrcy4gIFRoZXNlCi1mdW5jdGlvbnMgYXJlIG5vcm1hbGx5IHN1cHBsaWVkIGF0IHRoZSB0aW1lIHRoYXQgdGhlIHBuZ19zdHJ1Y3QgaXMgY3JlYXRlZC4KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gcmVkaXJlY3QgZXJyb3JzIGFuZCB3YXJuaW5ncyB0byB5b3VyIG93biByZXBsYWNlbWVudAotZnVuY3Rpb25zIGFmdGVyIHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBoYXMgYmVlbiBjYWxsZWQgYnkgY2FsbGluZzoKLQotICAgIHBuZ19zZXRfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX3ZvaWRwIGVycm9yX3B0ciwgcG5nX2Vycm9yX3B0ciBlcnJvcl9mbiwKLSAgICAgICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuKTsKLQotICAgIHBuZ192b2lkcCBlcnJvcl9wdHIgPSBwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKTsKLQotSWYgTlVMTCBpcyBzdXBwbGllZCBmb3IgZWl0aGVyIGVycm9yX2ZuIG9yIHdhcm5pbmdfZm4sIHRoZW4gdGhlIGxpYnBuZwotZGVmYXVsdCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQsIGNhbGxpbmcgZnByaW50ZigpIGFuZC9vciBsb25nam1wKCkgaWYgYQotcHJvYmxlbSBpcyBlbmNvdW50ZXJlZC4gIFRoZSByZXBsYWNlbWVudCBlcnJvciBmdW5jdGlvbnMgc2hvdWxkIGhhdmUKLXBhcmFtZXRlcnMgYXMgZm9sbG93czoKLQotICAgIHZvaWQgdXNlcl9lcnJvcl9mbihwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKTsKLQotICAgIHZvaWQgdXNlcl93YXJuaW5nX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21zZyk7Ci0KLVRoZSBtb3RpdmF0aW9uIGJlaGluZCB1c2luZyBzZXRqbXAoKSBhbmQgbG9uZ2ptcCgpIGlzIHRoZSBDKysgdGhyb3cgYW5kCi1jYXRjaCBleGNlcHRpb24gaGFuZGxpbmcgbWV0aG9kcy4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgbXVjaCBlYXNpZXIgdG8gd3JpdGUsCi1hcyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGV2ZXJ5IHJldHVybiBjb2RlIG9mIGV2ZXJ5IGZ1bmN0aW9uIGNhbGwuCi1Ib3dldmVyLCB0aGVyZSBhcmUgc29tZSB1bmNlcnRhaW50aWVzIGFib3V0IHRoZSBzdGF0dXMgb2YgbG9jYWwgdmFyaWFibGVzCi1hZnRlciBhIGxvbmdqbXAsIHNvIHRoZSB1c2VyIG1heSB3YW50IHRvIGJlIGNhcmVmdWwgYWJvdXQgZG9pbmcgYW55dGhpbmcKLWFmdGVyIHNldGptcCByZXR1cm5zIG5vbi16ZXJvIGJlc2lkZXMgcmV0dXJuaW5nIGl0c2VsZi4gIENvbnN1bHQgeW91cgotY29tcGlsZXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgRm9yIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoLCB5b3UKLW1heSB3aXNoIHRvIHVzZSB0aGUgImNleGNlcHQiIGZhY2lsaXR5IChzZWUgaHR0cDovL2NleGNlcHQuc291cmNlZm9yZ2UubmV0KSwKLXdoaWNoIGlzIGlsbHVzdHJhdGVkIGluIHBuZ3ZhbGlkLmMgYW5kIGluIGNvbnRyaWIvdmlzdXBuZy4KLQotQmVnaW5uaW5nIGluIGxpYnBuZy0xLjQuMCwgdGhlIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpIEFQSSBiZWNhbWUgYXZhaWxhYmxlLgotWW91IGNhbiB1c2UgdGhpcyB0byBoYW5kbGUgY2VydGFpbiBlcnJvcnMgKG5vcm1hbGx5IGhhbmRsZWQgYXMgZXJyb3JzKQotYXMgd2FybmluZ3MuCi0KLSAgICBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMgKHBuZ19wdHIsIGludCBhbGxvd2VkKTsKLQotICAgIGFsbG93ZWQ6IDA6IHRyZWF0IHBuZ19iZW5pZ25fZXJyb3IoKSBhcyBhbiBlcnJvci4KLSAgICAgICAgICAgICAxOiB0cmVhdCBwbmdfYmVuaWduX2Vycm9yKCkgYXMgYSB3YXJuaW5nLgotCi1BcyBvZiBsaWJwbmctMS42LjAsIHRoZSBkZWZhdWx0IGNvbmRpdGlvbiBpcyB0byB0cmVhdCBiZW5pZ24gZXJyb3JzIGFzCi13YXJuaW5ncyB3aGlsZSByZWFkaW5nIGFuZCBhcyBlcnJvcnMgd2hpbGUgd3JpdGluZy4KLQotQ3VzdG9tIGNodW5rcwotCi1JZiB5b3UgbmVlZCB0byByZWFkIG9yIHdyaXRlIGN1c3RvbSBjaHVua3MsIHlvdSBtYXkgbmVlZCB0byBnZXQgZGVlcGVyCi1pbnRvIHRoZSBsaWJwbmcgY29kZS4gIFRoZSBsaWJyYXJ5IG5vdyBoYXMgbWVjaGFuaXNtcyBmb3Igc3RvcmluZwotYW5kIHdyaXRpbmcgY2h1bmtzIG9mIHVua25vd24gdHlwZTsgeW91IGNhbiBldmVuIGRlY2xhcmUgY2FsbGJhY2tzCi1mb3IgY3VzdG9tIGNodW5rcy4gIEhvd2V2ZXIsIHRoaXMgbWF5IG5vdCBiZSBnb29kIGVub3VnaCBpZiB0aGUKLWxpYnJhcnkgY29kZSBpdHNlbGYgbmVlZHMgdG8ga25vdyBhYm91dCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB5b3VyCi1jaHVuayBhbmQgZXhpc3RpbmcgYGludHJpbnNpYycgY2h1bmtzLgotCi1JZiB5b3UgbmVlZCB0byB3cml0ZSBhIG5ldyBpbnRyaW5zaWMgY2h1bmssIGZpcnN0IHJlYWQgdGhlIFBORwotc3BlY2lmaWNhdGlvbi4gQWNxdWlyZSBhIGZpcnN0IGxldmVsIG9mIHVuZGVyc3RhbmRpbmcgb2YgaG93IGl0IHdvcmtzLgotUGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBzZWN0aW9ucyB0aGF0IGRlc2NyaWJlIGNodW5rIG5hbWVzLAotYW5kIGxvb2sgYXQgaG93IG90aGVyIGNodW5rcyB3ZXJlIGRlc2lnbmVkLCBzbyB5b3UgY2FuIGRvIHRoaW5ncwotc2ltaWxhcmx5LiAgU2Vjb25kLCBjaGVjayBvdXQgdGhlIHNlY3Rpb25zIG9mIGxpYnBuZyB0aGF0IHJlYWQgYW5kCi13cml0ZSBjaHVua3MuICBUcnkgdG8gZmluZCBhIGNodW5rIHRoYXQgaXMgc2ltaWxhciB0byB5b3VycyBhbmQgdXNlCi1pdCBhcyBhIHRlbXBsYXRlLiAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlCi10aGUgY29kZS4gIEl0IGlzIGJlc3QgdG8gaGFuZGxlIHByaXZhdGUgb3IgdW5rbm93biBjaHVua3MgaW4gYSBnZW5lcmljIG1ldGhvZCwKLXZpYSBjYWxsYmFjayBmdW5jdGlvbnMsIGluc3RlYWQgb2YgYnkgbW9kaWZ5aW5nIGxpYnBuZyBmdW5jdGlvbnMuIFRoaXMKLWlzIGlsbHVzdHJhdGVkIGluIHBuZ3Rlc3QuYywgd2hpY2ggdXNlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBhCi1wcml2YXRlICJ2cEFnIiBjaHVuayBhbmQgdGhlIG5ldyAic1RFUiIgY2h1bmssIHdoaWNoIGFyZSBib3RoIHVua25vd24gdG8KLWxpYnBuZy4KLQotSWYgeW91IHdpc2ggdG8gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZm9yIHRoZSBkYXRhLCBsb29rIHRocm91Z2gKLXRoZSBwYXJ0IG9mIHRoZSBjb2RlIHRoYXQgZG9lcyB0aGUgdHJhbnNmb3JtYXRpb25zLCBhbmQgY2hlY2sgb3V0IHNvbWUgb2YKLXRoZSBzaW1wbGVyIG9uZXMgdG8gZ2V0IGFuIGlkZWEgb2YgaG93IHRoZXkgd29yay4gIFRyeSB0byBmaW5kIGEgc2ltaWxhcgotdHJhbnNmb3JtYXRpb24gdG8gdGhlIG9uZSB5b3Ugd2FudCB0byBhZGQgYW5kIGNvcHkgb2ZmIG9mIGl0LiAgTW9yZSBkZXRhaWxzCi1jYW4gYmUgZm91bmQgaW4gdGhlIGNvbW1lbnRzIGluc2lkZSB0aGUgY29kZSBpdHNlbGYuCi0KLUNvbmZpZ3VyaW5nIGZvciBndWkvd2luZG93aW5nIHBsYXRmb3JtczoKLQotWW91IHdpbGwgbmVlZCB0byB3cml0ZSBuZXcgZXJyb3IgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSBHVUkKLWludGVyZmFjZSwgYXMgZGVzY3JpYmVkIHByZXZpb3VzbHksIGFuZCBzZXQgdGhlbSB0byBiZSB0aGUgZXJyb3IgYW5kCi13YXJuaW5nIGZ1bmN0aW9ucyBhdCB0aGUgdGltZSB0aGF0IHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBpcyBjYWxsZWQsCi1pbiBvcmRlciB0byBoYXZlIHRoZW0gYXZhaWxhYmxlIGR1cmluZyB0aGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgotVGhleSBjYW4gYmUgY2hhbmdlZCBsYXRlciB2aWEgcG5nX3NldF9lcnJvcl9mbigpLiAgT24gc29tZSBjb21waWxlcnMsCi15b3UgbWF5IGFsc28gaGF2ZSB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3JzIChwbmdfbWFsbG9jLCBldGMuKS4KLQotQ29uZmlndXJpbmcgemxpYjoKLQotVGhlcmUgYXJlIHNwZWNpYWwgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29tcHJlc3Npb24uICBQZXJoYXBzIHRoZQotbW9zdCB1c2VmdWwgb25lIGNoYW5nZXMgdGhlIGNvbXByZXNzaW9uIGxldmVsLCB3aGljaCBjdXJyZW50bHkgdXNlcwotaW5wdXQgY29tcHJlc3Npb24gdmFsdWVzIGluIHRoZSByYW5nZSAwIC0gOS4gIFRoZSBsaWJyYXJ5IG5vcm1hbGx5Ci11c2VzIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIChaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSA2KS4gIFRlc3RzCi1oYXZlIHNob3duIHRoYXQgZm9yIGEgbGFyZ2UgbWFqb3JpdHkgb2YgaW1hZ2VzLCBjb21wcmVzc2lvbiB2YWx1ZXMgaW4KLXRoZSByYW5nZSAzLTYgY29tcHJlc3MgbmVhcmx5IGFzIHdlbGwgYXMgaGlnaGVyIGxldmVscywgYW5kIGRvIHNvIG11Y2gKLWZhc3Rlci4gIEZvciBvbmxpbmUgYXBwbGljYXRpb25zIGl0IG1heSBiZSBkZXNpcmFibGUgdG8gaGF2ZSBtYXhpbXVtIHNwZWVkCi0oWl9CRVNUX1NQRUVEID0gMSkuICBXaXRoIHZlcnNpb25zIG9mIHpsaWIgYWZ0ZXIgdjAuOTksIHlvdSBjYW4gYWxzbwotc3BlY2lmeSBubyBjb21wcmVzc2lvbiAoWl9OT19DT01QUkVTU0lPTiA9IDApLCBidXQgdGhpcyB3b3VsZCBjcmVhdGUKLWZpbGVzIGxhcmdlciB0aGFuIGp1c3Qgc3RvcmluZyB0aGUgcmF3IGJpdG1hcC4gIFlvdSBjYW4gc3BlY2lmeSB0aGUKLWNvbXByZXNzaW9uIGxldmVsIGJ5IGNhbGxpbmc6Ci0KLSAgICAjaW5jbHVkZSB6bGliLmgKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKLQotQW5vdGhlciB1c2VmdWwgb25lIGlzIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGxldmVsIHVzZWQgYnkgdGhlIGxpYnJhcnkuCi1UaGUgbWVtb3J5IGxldmVsIGRlZmF1bHRzIHRvIDgsIGJ1dCBpdCBjYW4gYmUgbG93ZXJlZCBpZiB5b3UgYXJlCi1zaG9ydCBvbiBtZW1vcnkgKHJ1bm5pbmcgRE9TLCBmb3IgZXhhbXBsZSwgd2hlcmUgeW91IG9ubHkgaGF2ZSA2NDBLKS4KLU5vdGUgdGhhdCB0aGUgbWVtb3J5IGxldmVsIGRvZXMgaGF2ZSBhbiBlZmZlY3Qgb24gY29tcHJlc3Npb247IGFtb25nCi1vdGhlciB0aGluZ3MsIGxvd2VyIGxldmVscyB3aWxsIHJlc3VsdCBpbiBzZWN0aW9ucyBvZiBpbmNvbXByZXNzaWJsZQotZGF0YSBiZWluZyBlbWl0dGVkIGluIHNtYWxsZXIgc3RvcmVkIGJsb2Nrcywgd2l0aCBhIGNvcnJlc3BvbmRpbmdseQotbGFyZ2VyIHJlbGF0aXZlIG92ZXJoZWFkIG9mIHVwIHRvIDE1JSBpbiB0aGUgd29yc3QgY2FzZS4KLQotICAgICNpbmNsdWRlIHpsaWIuaAotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKLQotVGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgZm9yIGNvbmZpZ3VyaW5nIHpsaWIuICBUaGV5IGFyZSBub3QgcmVjb21tZW5kZWQKLWZvciBub3JtYWwgdXNlIGFuZCBtYXkgcmVzdWx0IGluIHdyaXRpbmcgYW4gaW52YWxpZCBQTkcgZmlsZS4gIFNlZQotemxpYi5oIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgdGhlc2UgbWVhbi4KLQotICAgICNpbmNsdWRlIHpsaWIuaAotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fc3RyYXRlZ3kocG5nX3B0ciwKLSAgICAgICAgc3RyYXRlZ3kpOwotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLAotICAgICAgICB3aW5kb3dfYml0cyk7Ci0KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCBtZXRob2QpOwotCi1UaGlzIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBJREFUIGNodW5rcyAoZGVmYXVsdCA4MTkyKToKLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgc2l6ZSk7Ci0KLUFzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuNS40LCBhZGRpdGlvbmFsIEFQSXMgYmVjYW1lCi1hdmFpbGFibGUgdG8gc2V0IHRoZXNlIHNlcGFyYXRlbHkgZm9yIG5vbi1JREFUCi1jb21wcmVzc2VkIGNodW5rcyBzdWNoIGFzIHpUWHQsIGlUWHQsIGFuZCBpQ0NQOgotCi0gICAgI2luY2x1ZGUgemxpYi5oCi0gICAgI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNTA0Ci0gICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKLQotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgbGV2ZWwpOwotCi0gICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCi0gICAgICAgIHN0cmF0ZWd5KTsKLQotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLAotICAgICAgICB3aW5kb3dfYml0cyk7Ci0KLSAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIG1ldGhvZCk7Ci0gICAgI2VuZGlmCi0KLUNvbnRyb2xsaW5nIHJvdyBmaWx0ZXJpbmcKLQotSWYgeW91IHdhbnQgdG8gY29udHJvbCB3aGV0aGVyIGxpYnBuZyB1c2VzIGZpbHRlcmluZyBvciBub3QsIHdoaWNoCi1maWx0ZXJzIGFyZSB1c2VkLCBhbmQgaG93IGl0IGdvZXMgYWJvdXQgcGlja2luZyByb3cgZmlsdGVycywgeW91Ci1jYW4gY2FsbCBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIHNlbGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbgotb2Ygcm93IGZpbHRlcnMgY2FuIGhhdmUgYSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIHNpemUgYW5kCi1lbmNvZGluZyBzcGVlZCBhbmQgYSBzb21ld2hhdCBsZXNzZXIgaW1wYWN0IG9uIHRoZSBkZWNvZGluZyBzcGVlZAotb2YgYW4gaW1hZ2UuICBGaWx0ZXJpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBSR0IgYW5kIGdyYXlzY2FsZQotaW1hZ2VzICh3aXRoIGFuZCB3aXRob3V0IGFscGhhKSwgYnV0IG5vdCBmb3IgcGFsZXR0ZWQgaW1hZ2VzIG5vcgotZm9yIGFueSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIGxlc3MgdGhhbiA4IGJpdHMvcGl4ZWwuCi0KLVRoZSAnbWV0aG9kJyBwYXJhbWV0ZXIgc2V0cyB0aGUgbWFpbiBmaWx0ZXJpbmcgbWV0aG9kLCB3aGljaCBpcwotY3VycmVudGx5IG9ubHkgJzAnIGluIHRoZSBQTkcgMS4yIHNwZWNpZmljYXRpb24uICBUaGUgJ2ZpbHRlcnMnCi1wYXJhbWV0ZXIgc2V0cyB3aGljaCBmaWx0ZXIocyksIGlmIGFueSwgc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2gKLXNjYW5saW5lLiAgUG9zc2libGUgdmFsdWVzIGFyZSBQTkdfQUxMX0ZJTFRFUlMsIFBOR19OT19GSUxURVJTLAotb3IgUE5HX0ZBU1RfRklMVEVSUyB0byB0dXJuIGZpbHRlcmluZyBvbiBhbmQgb2ZmLCBvciB0byB0dXJuIG9uCi1qdXN0IHRoZSBmYXN0LWRlY29kaW5nIHN1YnNldCBvZiBmaWx0ZXJzLCByZXNwZWN0aXZlbHkuCi0KLUluZGl2aWR1YWwgZmlsdGVyIHR5cGVzIGFyZSBQTkdfRklMVEVSX05PTkUsIFBOR19GSUxURVJfU1VCLAotUE5HX0ZJTFRFUl9VUCwgUE5HX0ZJTFRFUl9BVkcsIFBOR19GSUxURVJfUEFFVEgsIHdoaWNoIGNhbiBiZSBiaXR3aXNlCi1PUmVkIHRvZ2V0aGVyIHdpdGggJ3wnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsdGVycyB0byB1c2UuCi1UaGVzZSBmaWx0ZXJzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgotSWYgeW91IGludGVuZCB0byBjaGFuZ2UgdGhlIGZpbHRlciB0eXBlIGR1cmluZyB0aGUgY291cnNlIG9mIHdyaXRpbmcKLXRoZSBpbWFnZSwgeW91IHNob3VsZCBzdGFydCB3aXRoIGZsYWdzIHNldCBmb3IgYWxsIG9mIHRoZSBmaWx0ZXJzCi15b3UgaW50ZW5kIHRvIHVzZSBzbyB0aGF0IGxpYnBuZyBjYW4gaW5pdGlhbGl6ZSBpdHMgaW50ZXJuYWwKLXN0cnVjdHVyZXMgYXBwcm9wcmlhdGVseSBmb3IgYWxsIG9mIHRoZSBmaWx0ZXIgdHlwZXMuICAoTm90ZSB0aGF0IHRoaXMKLW1lYW5zIHRoZSBmaXJzdCByb3cgbXVzdCBhbHdheXMgYmUgYWRhcHRpdmVseSBmaWx0ZXJlZCwgYmVjYXVzZSBsaWJwbmcKLWN1cnJlbnRseSBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgZmlsdGVyIGJ1ZmZlcnMgdW50aWwgcG5nX3dyaXRlX3JvdygpCi1pcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLikKLQotICAgIGZpbHRlcnMgPSBQTkdfTk9fRklMVEVSUzsKLSAgICBmaWx0ZXJzID0gUE5HX0FMTF9GSUxURVJTOwotICAgIGZpbHRlcnMgPSBQTkdfRkFTVF9GSUxURVJTOwotCi0gICAgb3IKLQotICAgIGZpbHRlcnMgPSBQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQiB8Ci0gICAgICAgICAgICAgIFBOR19GSUxURVJfVVAgfCBQTkdfRklMVEVSX0FWRyB8Ci0gICAgICAgICAgICAgIFBOR19GSUxURVJfUEFFVEg7Ci0KLSAgICBwbmdfc2V0X2ZpbHRlcihwbmdfcHRyLCBQTkdfRklMVEVSX1RZUEVfQkFTRSwKLSAgICAgICBmaWx0ZXJzKTsKLQotICAgICAgICAgICAgICBUaGUgc2Vjb25kIHBhcmFtZXRlciBjYW4gYWxzbyBiZQotICAgICAgICAgICAgICBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcgaWYgeW91IGFyZQotICAgICAgICAgICAgICB3cml0aW5nIGEgUE5HIHRvIGJlIGVtYmVkZGVkIGluIGEgTU5HCi0gICAgICAgICAgICAgIGRhdGFzdHJlYW0uICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHRoZQotICAgICAgICAgICAgICBzYW1lIGFzIHRoZSB2YWx1ZSBvZiBmaWx0ZXJfbWV0aG9kIHVzZWQKLSAgICAgICAgICAgICAgaW4gcG5nX3NldF9JSERSKCkuCi0KLVJlcXVlc3RpbmcgZGVidWcgcHJpbnRvdXQKLQotVGhlIG1hY3JvIGRlZmluaXRpb24gUE5HX0RFQlVHIGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgZGVidWdnaW5nCi1wcmludG91dC4gIFNldCBpdCB0byBhbiBpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDMuICBIaWdoZXIKLW51bWJlcnMgcmVzdWx0IGluIGluY3JlYXNpbmcgYW1vdW50cyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUKLWluZm9ybWF0aW9uIGlzIHByaW50ZWQgdG8gdGhlICJzdGRlcnIiIGZpbGUsIHVubGVzcyBhbm90aGVyIGZpbGUKLW5hbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBQTkdfREVCVUdfRklMRSBtYWNybyBkZWZpbml0aW9uLgotCi1XaGVuIFBOR19ERUJVRyA+IDAsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIChtYWNyb3MpIGJlY29tZSBhdmFpbGFibGU6Ci0KLSAgIHBuZ19kZWJ1ZyhsZXZlbCwgbWVzc2FnZSkKLSAgIHBuZ19kZWJ1ZzEobGV2ZWwsIG1lc3NhZ2UsIHAxKQotICAgcG5nX2RlYnVnMihsZXZlbCwgbWVzc2FnZSwgcDEsIHAyKQotCi1pbiB3aGljaCAibGV2ZWwiIGlzIGNvbXBhcmVkIHRvIFBOR19ERUJVRyB0byBkZWNpZGUgd2hldGhlciB0byBwcmludAotdGhlIG1lc3NhZ2UsICJtZXNzYWdlIiBpcyB0aGUgZm9ybWF0dGVkIHN0cmluZyB0byBiZSBwcmludGVkLAotYW5kIHAxIGFuZCBwMiBhcmUgcGFyYW1ldGVycyB0aGF0IGFyZSB0byBiZSBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nCi1hY2NvcmRpbmcgdG8gcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAotCi0gICBwbmdfZGVidWcxKDIsICJmb289JWQiLCBmb28pOwotCi1pcyBleHBhbmRlZCB0bwotCi0gICBpZiAoUE5HX0RFQlVHID4gMikKLSAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsICJmb289JWRcbiIsIGZvbyk7Ci0KLVdoZW4gUE5HX0RFQlVHIGlzIGRlZmluZWQgYnV0IGlzIHplcm8sIHRoZSBtYWNyb3MgYXJlbid0IGRlZmluZWQsIGJ1dCB5b3UKLWNhbiBzdGlsbCB1c2UgUE5HX0RFQlVHIHRvIGNvbnRyb2wgeW91ciBvd24gZGVidWdnaW5nOgotCi0gICAjaWZkZWYgUE5HX0RFQlVHCi0gICAgICAgZnByaW50ZihzdGRlcnIsIC4uLgotICAgI2VuZGlmCi0KLVdoZW4gUE5HX0RFQlVHID0gMSwgdGhlIG1hY3JvcyBhcmUgZGVmaW5lZCwgYnV0IG9ubHkgcG5nX2RlYnVnIHN0YXRlbWVudHMKLWhhdmluZyBsZXZlbCA9IDAgd2lsbCBiZSBwcmludGVkLiAgVGhlcmUgYXJlbid0IGFueSBzdWNoIHN0YXRlbWVudHMgaW4KLXRoaXMgdmVyc2lvbiBvZiBsaWJwbmcsIGJ1dCBpZiB5b3UgaW5zZXJ0IHNvbWUgdGhleSB3aWxsIGJlIHByaW50ZWQuCi0KLVZJSS4gIE1ORyBzdXBwb3J0Ci0KLVRoZSBNTkcgc3BlY2lmaWNhdGlvbiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvbW5nKSBhbGxvd3MKLWNlcnRhaW4gZXh0ZW5zaW9ucyB0byBQTkcgZm9yIFBORyBpbWFnZXMgdGhhdCBhcmUgZW1iZWRkZWQgaW4gTU5HIGRhdGFzdHJlYW1zLgotTGlicG5nIGNhbiBzdXBwb3J0IHNvbWUgb2YgdGhlc2UgZXh0ZW5zaW9ucy4gIFRvIGVuYWJsZSB0aGVtLCB1c2UgdGhlCi1wbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGZ1bmN0aW9uOgotCi0gICBmZWF0dXJlX3NldCA9IHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKHBuZ19wdHIsIG1hc2spCi0KLSAgIG1hc2sgaXMgYSBwbmdfdWludF8zMiBjb250YWluaW5nIHRoZSBiaXR3aXNlIE9SIG9mIHRoZQotICAgICAgICBmZWF0dXJlcyB5b3Ugd2FudCB0byBlbmFibGUuICBUaGVzZSBpbmNsdWRlCi0gICAgICAgIFBOR19GTEFHX01OR19FTVBUWV9QTFRFCi0gICAgICAgIFBOR19GTEFHX01OR19GSUxURVJfNjQKLSAgICAgICAgUE5HX0FMTF9NTkdfRkVBVFVSRVMKLQotICAgZmVhdHVyZV9zZXQgaXMgYSBwbmdfdWludF8zMiB0aGF0IGlzIHRoZSBiaXR3aXNlIEFORCBvZgotICAgICAgeW91ciBtYXNrIHdpdGggdGhlIHNldCBvZiBNTkcgZmVhdHVyZXMgdGhhdCBpcwotICAgICAgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIGxpYnBuZyB0aGF0IHlvdSBhcmUgdXNpbmcuCi0KLUl0IGlzIGFuIGVycm9yIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIGEgc3RhbmRhbG9uZQotUE5HIGZpbGUgd2l0aCB0aGUgUE5HIDgtYnl0ZSBzaWduYXR1cmUuICBUaGUgUE5HIGRhdGFzdHJlYW0gbXVzdCBiZSB3cmFwcGVkCi1pbiBhIE1ORyBkYXRhc3RyZWFtLiAgQXMgYSBtaW5pbXVtLCBpdCBtdXN0IGhhdmUgdGhlIE1ORyA4LWJ5dGUgc2lnbmF0dXJlCi1hbmQgdGhlIE1IRFIgYW5kIE1FTkQgY2h1bmtzLiAgTGlicG5nIGRvZXMgbm90IHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlc2UKLW9yIGFueSBvdGhlciBNTkcgY2h1bmtzOyB5b3VyIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBpdHMgb3duIHN1cHBvcnQgZm9yCi10aGVtLiAgWW91IG1heSB3aXNoIHRvIGNvbnNpZGVyIHVzaW5nIGxpYm1uZyAoYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmxpYm1uZy5jb20pIGluc3RlYWQuCi0KLVZJSUkuICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMC44OAotCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB2ZXJzaW9ucyBvZiBsaWJwbmcgbGF0ZXIgdGhhbiAwLjk2IGFyZSBub3QKLWRpc3RyaWJ1dGVkIGJ5IHRoZSBvcmlnaW5hbCBsaWJwbmcgYXV0aG9yLCBHdXkgU2NoYWxuYXQsIG5vciBieQotQW5kcmVhcyBEaWxnZXIsIHdobyBoYWQgdGFrZW4gb3ZlciBmcm9tIEd1eSBkdXJpbmcgMTk5NiBhbmQgMTk5NywgYW5kCi1kaXN0cmlidXRlZCB2ZXJzaW9ucyAwLjg5IHRocm91Z2ggMC45NiwgYnV0IHJhdGhlciBieSBhbm90aGVyIG1lbWJlcgotb2YgdGhlIG9yaWdpbmFsIFBORyBHcm91cCwgR2xlbm4gUmFuZGVycy1QZWhyc29uLiAgR3V5IGFuZCBBbmRyZWFzIGFyZQotc3RpbGwgYWxpdmUgYW5kIHdlbGwsIGJ1dCB0aGV5IGhhdmUgbW92ZWQgb24gdG8gb3RoZXIgdGhpbmdzLgotCi1UaGUgb2xkIGxpYnBuZyBmdW5jdGlvbnMgcG5nX3JlYWRfaW5pdCgpLCBwbmdfd3JpdGVfaW5pdCgpLAotcG5nX2luZm9faW5pdCgpLCBwbmdfcmVhZF9kZXN0cm95KCksIGFuZCBwbmdfd3JpdGVfZGVzdHJveSgpIGhhdmUgYmVlbgotbW92ZWQgdG8gUE5HX0lOVEVSTkFMIGluIHZlcnNpb24gMC45NSB0byBkaXNjb3VyYWdlIHRoZWlyIHVzZS4gIFRoZXNlCi1mdW5jdGlvbnMgd2lsbCBiZSByZW1vdmVkIGZyb20gbGlicG5nIHZlcnNpb24gMS40LjAuCi0KLVRoZSBwcmVmZXJyZWQgbWV0aG9kIG9mIGNyZWF0aW5nIGFuZCBpbml0aWFsaXppbmcgdGhlIGxpYnBuZyBzdHJ1Y3R1cmVzIGlzCi12aWEgdGhlIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKSwgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoKSwgYW5kCi1wbmdfY3JlYXRlX2luZm9fc3RydWN0KCkgYmVjYXVzZSB0aGV5IGlzb2xhdGUgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZXMKLWZyb20gdGhlIGFwcGxpY2F0aW9uLCBhbGxvdyB2ZXJzaW9uIGVycm9yIGNoZWNraW5nLCBhbmQgYWxzbyBhbGxvdyB0aGUKLXVzZSBvZiBjdXN0b20gZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiwgd2hpY2gKLXRoZSBvbGQgZnVuY3Rpb25zIGRvIG5vdC4gIFRoZSBmdW5jdGlvbnMgcG5nX3JlYWRfZGVzdHJveSgpIGFuZAotcG5nX3dyaXRlX2Rlc3Ryb3koKSBkbyBub3QgYWN0dWFsbHkgZnJlZSB0aGUgbWVtb3J5IHRoYXQgbGlicG5nCi1hbGxvY2F0ZWQgZm9yIHRoZXNlIHN0cnVjdHMsIGJ1dCBqdXN0IHJlc2V0IHRoZSBkYXRhIHN0cnVjdHVyZXMsIHNvIHRoZXkKLWNhbiBiZSB1c2VkIGluc3RlYWQgb2YgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSBhbmQKLXBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIGlmIHlvdSBmZWVsIHRoZXJlIGlzIHRvbyBtdWNoIHN5c3RlbSBvdmVyaGVhZAotYWxsb2NhdGluZyBhbmQgZnJlZWluZyB0aGUgcG5nX3N0cnVjdCBmb3IgZWFjaCBpbWFnZSByZWFkLgotCi1TZXR0aW5nIHRoZSBlcnJvciBjYWxsYmFja3MgdmlhIHBuZ19zZXRfbWVzc2FnZV9mbigpIGJlZm9yZQotcG5nX3JlYWRfaW5pdCgpIGFzIHdhcyBzdWdnZXN0ZWQgaW4gbGlicG5nLTAuODggaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAotYmVjYXVzZSB0aGlzIGNhdXNlZCBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgdXNlIGN1c3RvbSBlcnJvciBmdW5jdGlvbnMKLXRvIGZhaWwgaWYgdGhlIHBuZ19wdHIgd2FzIG5vdCBpbml0aWFsaXplZCB0byB6ZXJvLiAgSXQgaXMgc3RpbGwgcG9zc2libGUKLXRvIHNldCB0aGUgZXJyb3IgY2FsbGJhY2tzIEFGVEVSIHBuZ19yZWFkX2luaXQoKSwgb3IgdG8gY2hhbmdlIHRoZW0gd2l0aAotcG5nX3NldF9lcnJvcl9mbigpLCB3aGljaCBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBmdW5jdGlvbiwgYnV0IHdpdGggYSBuZXcKLW5hbWUgdG8gZm9yY2UgY29tcGlsYXRpb24gZXJyb3JzIHdpdGggYXBwbGljYXRpb25zIHRoYXQgdHJ5IHRvIHVzZSB0aGUgb2xkCi1tZXRob2QuCi0KLVN1cHBvcnQgZm9yIHRoZSBzQ0FMLCBpQ0NQLCBpVFh0LCBhbmQgc1BMVCBjaHVua3Mgd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjAuNjsKLWhvd2V2ZXIsIGlUWHQgc3VwcG9ydCB3YXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLQotU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuMC43LCB5b3UgY2FuIGZpbmQgb3V0IHdoaWNoIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKLXlvdSBhcmUgdXNpbmcgYXQgcnVuLXRpbWU6Ci0KLSAgIHBuZ191aW50XzMyIGxpYnBuZ192biA9IHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKTsKLQotVGhlIG51bWJlciBsaWJwbmdfdm4gaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbWFqb3IgdmVyc2lvbiwgbWlub3IKLXZlcnNpb24gd2l0aCBsZWFkaW5nIHplcm8sIGFuZCByZWxlYXNlIG51bWJlciB3aXRoIGxlYWRpbmcgemVybywKLShlLmcuLCBsaWJwbmdfdm4gZm9yIHZlcnNpb24gMS4wLjcgaXMgMTAwMDcpLgotCi1Ob3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIGEgcG5nX3B0ciwgc28geW91IGNhbiBjYWxsIGl0Ci1iZWZvcmUgeW91J3ZlIGNyZWF0ZWQgb25lLgotCi1Zb3UgY2FuIGFsc28gY2hlY2sgd2hpY2ggdmVyc2lvbiBvZiBwbmcuaCB5b3UgdXNlZCB3aGVuIGNvbXBpbGluZyB5b3VyCi1hcHBsaWNhdGlvbjoKLQotICAgcG5nX3VpbnRfMzIgYXBwbGljYXRpb25fdm4gPSBQTkdfTElCUE5HX1ZFUjsKLQotSVguICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS4wLnggdG8gMS4yLngKLQotU3VwcG9ydCBmb3IgdXNlciBtZW1vcnkgbWFuYWdlbWVudCB3YXMgZW5hYmxlZCBieSBkZWZhdWx0LiAgVG8KLWFjY29tcGxpc2ggdGhpcywgdGhlIGZ1bmN0aW9ucyBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIoKSwKLXBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSwgcG5nX3NldF9tZW1fZm4oKSwgcG5nX2dldF9tZW1fcHRyKCksCi1wbmdfbWFsbG9jX2RlZmF1bHQoKSwgYW5kIHBuZ19mcmVlX2RlZmF1bHQoKSB3ZXJlIGFkZGVkLgotCi1TdXBwb3J0IGZvciB0aGUgaVRYdCBjaHVuayBoYXMgYmVlbiBlbmFibGVkIGJ5IGRlZmF1bHQgYXMgb2YKLXZlcnNpb24gMS4yLjQxLgotCi1TdXBwb3J0IGZvciBjZXJ0YWluIE1ORyBmZWF0dXJlcyB3YXMgZW5hYmxlZC4KLQotU3VwcG9ydCBmb3IgbnVtYmVyZWQgZXJyb3IgbWVzc2FnZXMgd2FzIGFkZGVkLiAgSG93ZXZlciwgd2UgbmV2ZXIgZ290Ci1hcm91bmQgdG8gYWN0dWFsbHkgbnVtYmVyaW5nIHRoZSBlcnJvciBtZXNzYWdlcy4gIFRoZSBmdW5jdGlvbgotcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzKCkgd2FzIGFkZGVkIChOb3RlOiB0aGUgcHJvdG90eXBlIGZvciB0aGlzCi1mdW5jdGlvbiB3YXMgaW5hZHZlcnRlbnRseSByZW1vdmVkIGZyb20gcG5nLmggaW4gUE5HX05PX0FTU0VNQkxFUl9DT0RFCi1idWlsZHMgb2YgbGlicG5nLTEuMi4xNS4gIEl0IHdhcyByZXN0b3JlZCBpbiBsaWJwbmctMS4yLjM2KS4KLQotVGhlIHBuZ19tYWxsb2Nfd2FybigpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjMuICBUaGlzIGlzc3VlcwotYSBwbmdfd2FybmluZyBhbmQgcmV0dXJucyBOVUxMIGluc3RlYWQgb2YgYWJvcnRpbmcgd2hlbiBpdCBmYWlscyB0bwotYWNxdWlyZSB0aGUgcmVxdWVzdGVkIG1lbW9yeSBhbGxvY2F0aW9uLgotCi1TdXBwb3J0IGZvciBzZXR0aW5nIHVzZXIgbGltaXRzIG9uIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgd2FzIGVuYWJsZWQKLWJ5IGRlZmF1bHQuICBUaGUgZnVuY3Rpb25zIHBuZ19zZXRfdXNlcl9saW1pdHMoKSwgcG5nX2dldF91c2VyX3dpZHRoX21heCgpLAotYW5kIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4KCkgd2VyZSBhZGRlZCBhdCBsaWJwbmctMS4yLjYuCi0KLVRoZSBwbmdfc2V0X2FkZF9hbHBoYSgpIGZ1bmN0aW9uIHdhcyBhZGRlZCBhdCBsaWJwbmctMS4yLjcuCi0KLVRoZSBmdW5jdGlvbiBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKSB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi45LgotVW5saWtlIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCksIHRoZSBuZXcgZnVuY3Rpb24gZG9lcyBub3QgZXhwYW5kIHRoZQotdFJOUyBjaHVuayB0byBhbHBoYS4gVGhlIHBuZ19zZXRfZ3JheV8xXzJfNF90b184KCkgZnVuY3Rpb24gaXMKLWRlcHJlY2F0ZWQuCi0KLUEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIGluIHN1cHBvcnQgb2YgcnVudGltZSBzZWxlY3Rpb24gb2YKLWFzc2VtYmxlciBjb2RlIGZlYXR1cmVzIChlc3BlY2lhbGx5IEludGVsIE1NWCBjb2RlIHN1cHBvcnQpIHdlcmUKLWFkZGVkIGF0IGxpYnBuZy0xLjIuMDoKLQotICAgIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9DT01QSUxFRAotICAgIFBOR19BU01fRkxBR19NTVhfU1VQUE9SVF9JTl9DUFUKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfQ09NQklORV9ST1cKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfSU5URVJMQUNFCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9TVUIKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1VQCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9BVkcKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1JFQURfRklMVEVSX1BBRVRICi0gICAgUE5HX0FTTV9GTEFHU19JTklUSUFMSVpFRAotICAgIFBOR19NTVhfUkVBRF9GTEFHUwotICAgIFBOR19NTVhfRkxBR1MKLSAgICBQTkdfTU1YX1dSSVRFX0ZMQUdTCi0gICAgUE5HX01NWF9GTEFHUwotCi1XZSBhZGRlZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbiBzdXBwb3J0IG9mIHJ1bnRpbWUKLXNlbGVjdGlvbiBvZiBhc3NlbWJsZXIgY29kZSBmZWF0dXJlczoKLQotICAgIHBuZ19nZXRfbW14X2ZsYWdtYXNrKCkKLSAgICBwbmdfc2V0X21teF90aHJlc2hvbGRzKCkKLSAgICBwbmdfZ2V0X2FzbV9mbGFncygpCi0gICAgcG5nX2dldF9tbXhfYml0ZGVwdGhfdGhyZXNob2xkKCkKLSAgICBwbmdfZ2V0X21teF9yb3dieXRlc190aHJlc2hvbGQoKQotICAgIHBuZ19zZXRfYXNtX2ZsYWdzKCkKLQotV2UgcmVwbGFjZWQgYWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHNpbXBsZSBzdHVicyBpbiBsaWJwbmctMS4yLjIwLAotd2hlbiB0aGUgSW50ZWwgYXNzZW1ibGVyIGNvZGUgd2FzIHJlbW92ZWQgZHVlIHRvIGEgbGljZW5zaW5nIGlzc3VlLgotCi1UaGVzZSBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6Ci0KLSAgICBQTkdfUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKLSAgICBQTkdfUFJPR1JFU1NJVkVfUkVBRF9OT1RfU1VQUE9SVEVECi0gICAgUE5HX05PX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQKLSAgICBQTkdfV1JJVEVfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECi0gICAgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVECi0gICAgUE5HX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRAotCi1UaGV5IGhhdmUgYmVlbiByZXBsYWNlZCwgcmVzcGVjdGl2ZWx5LCBieToKLQotICAgIFBOR19OT19SRUFEX1RSQU5TRk9STVMKLSAgICBQTkdfTk9fUFJPR1JFU1NJVkVfUkVBRAotICAgIFBOR19OT19TRVFVRU5USUFMX1JFQUQKLSAgICBQTkdfTk9fV1JJVEVfVFJBTlNGT1JNUwotICAgIFBOR19OT19SRUFEX0FOQ0lMTEFSWV9DSFVOS1MKLSAgICBQTkdfTk9fV1JJVEVfQU5DSUxMQVJZX0NIVU5LUwotCi1QTkdfTUFYX1VJTlQgd2FzIHJlcGxhY2VkIHdpdGggUE5HX1VJTlRfMzFfTUFYLiAgSXQgaGFzIGJlZW4KLWRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTEuMC4xNiBhbmQgbGlicG5nLTEuMi42LgotCi1UaGUgZnVuY3Rpb24KLSAgICBwbmdfY2hlY2tfc2lnKHNpZywgbnVtKQotd2FzIHJlcGxhY2VkIHdpdGgKLSAgICAhcG5nX3NpZ19jbXAoc2lnLCAwLCBudW0pCi1JdCBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0wLjkwLgotCi1UaGUgZnVuY3Rpb24KLSAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpCi13aGljaCBhbHNvIGV4cGFuZHMgdFJOUyB0byBhbHBoYSB3YXMgcmVwbGFjZWQgd2l0aAotICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpCi13aGljaCBkb2VzIG5vdC4gSXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMS4wLjE4IGFuZCAxLjIuOS4KLQotWC4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueC8xLjIueCB0byAxLjQueAotCi1Qcml2YXRlIGxpYnBuZyBwcm90b3R5cGVzIGFuZCBtYWNybyBkZWZpbml0aW9ucyB3ZXJlIG1vdmVkIGZyb20KLXBuZy5oIGFuZCBwbmdjb25mLmggaW50byBhIG5ldyBwbmdwcml2LmggaGVhZGVyIGZpbGUuCi0KLUZ1bmN0aW9ucyBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSwgcG5nX2Jlbmlnbl9lcnJvcigpLCBhbmQKLXBuZ19jaHVua19iZW5pZ25fZXJyb3IoKSB3ZXJlIGFkZGVkLgotCi1TdXBwb3J0IGZvciBzZXR0aW5nIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdGhhdCB0aGUgYXBwbGljYXRpb24KLXdpbGwgYWxsb2NhdGUgZm9yIHJlYWRpbmcgY2h1bmtzIHdhcyBhZGRlZCwgYXMgYSBzZWN1cml0eSBtZWFzdXJlLgotVGhlIGZ1bmN0aW9ucyBwbmdfc2V0X2NodW5rX2NhY2hlX21heCgpIGFuZCBwbmdfZ2V0X2NodW5rX2NhY2hlX21heCgpCi13ZXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5LgotCi1XZSBpbXBsZW1lbnRlZCBzdXBwb3J0IGZvciBJL08gc3RhdGVzIGJ5IGFkZGluZyBwbmdfcHRyIG1lbWJlciBpb19zdGF0ZQotYW5kIGZ1bmN0aW9ucyBwbmdfZ2V0X2lvX2NodW5rX25hbWUoKSBhbmQgcG5nX2dldF9pb19zdGF0ZSgpIGluIHBuZ2dldC5jCi0KLVdlIGFkZGVkIFBOR19UUkFOU0ZPUk1fR1JBWV9UT19SR0IgdG8gdGhlIGF2YWlsYWJsZSBoaWdoLWxldmVsCi1pbnB1dCB0cmFuc2Zvcm1zLgotCi1DaGVja2luZyBmb3IgYW5kIHJlcG9ydGluZyBvZiBlcnJvcnMgaW4gdGhlIElIRFIgY2h1bmsgaXMgbW9yZSB0aG9yb3VnaC4KLQotU3VwcG9ydCBmb3IgZ2xvYmFsIGFycmF5cyB3YXMgcmVtb3ZlZCwgdG8gaW1wcm92ZSB0aHJlYWQgc2FmZXR5LgotCi1Tb21lIG9ic29sZXRlL2RlcHJlY2F0ZWQgbWFjcm9zIGFuZCBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQuCi0KLVR5cGVjYXN0ZWQgTlVMTCBkZWZpbml0aW9ucyBzdWNoIGFzCi0gICAjZGVmaW5lIHBuZ192b2lkcF9OVUxMICAgICAgICAgICAgKHBuZ192b2lkcClOVUxMCi13ZXJlIGVsaW1pbmF0ZWQuICBJZiB5b3UgdXNlZCB0aGVzZSBpbiB5b3VyIGFwcGxpY2F0aW9uLCBqdXN0IHVzZQotTlVMTCBpbnN0ZWFkLgotCi1UaGUgcG5nX3N0cnVjdCBhbmQgaW5mb19zdHJ1Y3QgbWVtYmVycyAidHJhbnMiIGFuZCAidHJhbnNfdmFsdWVzIiB3ZXJlCi1jaGFuZ2VkIHRvICJ0cmFuc19hbHBoYSIgYW5kICJ0cmFuc19jb2xvciIsIHJlc3BlY3RpdmVseS4KLQotVGhlIG9ic29sZXRlLCB1bnVzZWQgcG5nZ2NjcmQuYyBhbmQgcG5ndmNyZC5jIGZpbGVzIGFuZCByZWxhdGVkIG1ha2VmaWxlcwotd2VyZSByZW1vdmVkLgotCi1UaGUgUE5HXzFfMF9YIGFuZCBQTkdfMV8yX1ggbWFjcm9zIHdlcmUgZWxpbWluYXRlZC4KLQotVGhlIFBOR19MRUdBQ1lfU1VQUE9SVEVEIG1hY3JvIHdhcyBlbGltaW5hdGVkLgotCi1NYW55IFdJTjMyX1dDRSAjaWZkZWZzIHdlcmUgcmVtb3ZlZC4KLQotVGhlIGZ1bmN0aW9ucyBwbmdfcmVhZF9pbml0KGluZm9fcHRyKSwgcG5nX3dyaXRlX2luaXQoaW5mb19wdHIpLAotcG5nX2luZm9faW5pdChpbmZvX3B0ciksIHBuZ19yZWFkX2Rlc3Ryb3koKSwgYW5kIHBuZ193cml0ZV9kZXN0cm95KCkKLWhhdmUgYmVlbiByZW1vdmVkLiAgVGhleSBoYXZlIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMC45NS4KLQotVGhlIHBuZ19wZXJtaXRfZW1wdHlfcGx0ZSgpIHdhcyByZW1vdmVkLiBJdCBoYXMgYmVlbiBkZXByZWNhdGVkCi1zaW5jZSBsaWJwbmctMS4wLjkuICBVc2UgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMoKSBpbnN0ZWFkLgotCi1XZSByZW1vdmVkIHRoZSBvYnNvbGV0ZSBzdHViIGZ1bmN0aW9ucyBwbmdfZ2V0X21teF9mbGFnbWFzaygpLAotcG5nX3NldF9tbXhfdGhyZXNob2xkcygpLCBwbmdfZ2V0X2FzbV9mbGFncygpLAotcG5nX2dldF9tbXhfYml0ZGVwdGhfdGhyZXNob2xkKCksIHBuZ19nZXRfbW14X3Jvd2J5dGVzX3RocmVzaG9sZCgpLAotcG5nX3NldF9hc21fZmxhZ3MoKSwgYW5kIHBuZ19tbXhfc3VwcG9ydGVkKCkKLQotV2UgcmVtb3ZlZCB0aGUgb2Jzb2xldGUgcG5nX2NoZWNrX3NpZygpLCBwbmdfbWVtY3B5X2NoZWNrKCksIGFuZAotcG5nX21lbXNldF9jaGVjaygpIGZ1bmN0aW9ucy4gIEluc3RlYWQgdXNlICFwbmdfc2lnX2NtcCgpLCBtZW1jcHkoKSwKLWFuZCBtZW1zZXQoKSwgcmVzcGVjdGl2ZWx5LgotCi1UaGUgZnVuY3Rpb24gcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKSB3YXMgcmVtb3ZlZC4gSXQgaGFzIGJlZW4KLWRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTEuMC4xOCBhbmQgMS4yLjksIHdoZW4gaXQgd2FzIHJlcGxhY2VkIHdpdGgKLXBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpIGJlY2F1c2UgdGhlIGZvcm1lciBmdW5jdGlvbiBhbHNvCi1leHBhbmRlZCBhbnkgdFJOUyBjaHVuayB0byBhbiBhbHBoYSBjaGFubmVsLgotCi1NYWNyb3MgZm9yIHBuZ19nZXRfdWludF8xNiwgcG5nX2dldF91aW50XzMyLCBhbmQgcG5nX2dldF9pbnRfMzIKLXdlcmUgYWRkZWQgYW5kIGFyZSB1c2VkIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiB0aGUgY29ycmVzcG9uZGluZwotZnVuY3Rpb25zLiBVbmZvcnR1bmF0ZWx5LAotZnJvbSBsaWJwbmctMS40LjAgdW50aWwgMS40LjQsIHRoZSBwbmdfZ2V0X3VpbnRfMTYgbWFjcm8gKGJ1dCBub3QgdGhlCi1mdW5jdGlvbikgaW5jb3JyZWN0bHkgcmV0dXJuZWQgYSB2YWx1ZSBvZiB0eXBlIHBuZ191aW50XzMyLgotCi1XZSBjaGFuZ2VkIHRoZSBwcm90b3R5cGUgZm9yIHBuZ19tYWxsb2MoKSBmcm9tCi0gICAgcG5nX21hbGxvYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfdWludF8zMiBzaXplKQotdG8KLSAgICBwbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19hbGxvY19zaXplX3Qgc2l6ZSkKLQotVGhpcyBhbHNvIGFwcGxpZXMgdG8gdGhlIHByb3RvdHlwZSBmb3IgdGhlIHVzZXIgcmVwbGFjZW1lbnQgbWFsbG9jX2ZuKCkuCi0KLVRoZSBwbmdfY2FsbG9jKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGFuZCBpcyB1c2VkIGluIHBsYWNlIG9mCi1vZiAicG5nX21hbGxvYygpOyBtZW1zZXQoKTsiIGV4Y2VwdCBpbiB0aGUgY2FzZSBpbiBwbmdfcmVhZF9wbmcoKQotd2hlcmUgdGhlIGFycmF5IGNvbnNpc3RzIG9mIHBvaW50ZXJzOyBpbiB0aGlzIGNhc2UgYSAiZm9yIiBsb29wIGlzIHVzZWQKLWFmdGVyIHRoZSBwbmdfbWFsbG9jKCkgdG8gc2V0IHRoZSBwb2ludGVycyB0byBOVUxMLCB0byBnaXZlIHJvYnVzdC4KLWJlaGF2aW9yIGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHJ1bnMgb3V0IG9mIG1lbW9yeSBwYXJ0LXdheSB0aHJvdWdoCi10aGUgcHJvY2Vzcy4KLQotV2UgY2hhbmdlZCB0aGUgcHJvdG90eXBlcyBvZiBwbmdfZ2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKCkgYW5kCi1wbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKCkgdG8gd29yayB3aXRoIHBuZ19zaXplX3QgaW5zdGVhZCBvZgotcG5nX3VpbnRfMzIuCi0KLVN1cHBvcnQgZm9yIG51bWJlcmVkIGVycm9yIG1lc3NhZ2VzIHdhcyByZW1vdmVkIGJ5IGRlZmF1bHQsIHNpbmNlIHdlCi1uZXZlciBnb3QgYXJvdW5kIHRvIGFjdHVhbGx5IG51bWJlcmluZyB0aGUgZXJyb3IgbWVzc2FnZXMuIFRoZSBmdW5jdGlvbgotcG5nX3NldF9zdHJpcF9lcnJvcl9udW1iZXJzKCkgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlicmFyeSBieSBkZWZhdWx0LgotCi1UaGUgcG5nX3phbGxvYygpIGFuZCBwbmdfemZyZWUoKSBmdW5jdGlvbnMgYXJlIG5vIGxvbmdlciBleHBvcnRlZC4KLVRoZSBwbmdfemFsbG9jKCkgZnVuY3Rpb24gbm8gbG9uZ2VyIHplcm9lcyBvdXQgdGhlIG1lbW9yeSB0aGF0IGl0Ci1hbGxvY2F0ZXMuICBBcHBsaWNhdGlvbnMgdGhhdCBjYWxsZWQgcG5nX3phbGxvYyhwbmdfcHRyLCBudW1iZXIsIHNpemUpCi1jYW4gY2FsbCBwbmdfY2FsbG9jKHBuZ19wdHIsIG51bWJlcipzaXplKSBpbnN0ZWFkLCBhbmQgY2FuIGNhbGwKLXBuZ19mcmVlKCkgaW5zdGVhZCBvZiBwbmdfemZyZWUoKS4KLQotU3VwcG9ydCBmb3IgZGl0aGVyaW5nIHdhcyBkaXNhYmxlZCBieSBkZWZhdWx0IGluIGxpYnBuZy0xLjQuMCwgYmVjYXVzZQotaXQgaGFzIG5vdCBiZWVuIHdlbGwgdGVzdGVkIGFuZCBkb2Vzbid0IGFjdHVhbGx5ICJkaXRoZXIiLgotVGhlIGNvZGUgd2FzIG5vdAotcmVtb3ZlZCwgaG93ZXZlciwgYW5kIGNvdWxkIGJlIGVuYWJsZWQgYnkgYnVpbGRpbmcgbGlicG5nIHdpdGgKLVBOR19SRUFEX0RJVEhFUl9TVVBQT1JURUQgZGVmaW5lZC4gIEluIGxpYnBuZy0xLjQuMiwgdGhpcyBzdXBwb3J0Ci13YXMgcmUtZW5hYmxlZCwgYnV0IHRoZSBmdW5jdGlvbiB3YXMgcmVuYW1lZCBwbmdfc2V0X3F1YW50aXplKCkgdG8KLXJlZmxlY3QgbW9yZSBhY2N1cmF0ZWx5IHdoYXQgaXQgYWN0dWFsbHkgZG9lcy4gIEF0IHRoZSBzYW1lIHRpbWUsCi10aGUgUE5HX0RJVEhFUl9bUkVELEdSRUVOX0JMVUVdX0JJVFMgbWFjcm9zIHdlcmUgYWxzbyByZW5hbWVkIHRvCi1QTkdfUVVBTlRJWkVfW1JFRCxHUkVFTixCTFVFXV9CSVRTLCBhbmQgUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRAotd2FzIHJlbmFtZWQgdG8gUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVELgotCi1XZSByZW1vdmVkIHRoZSB0cmFpbGluZyAnLicgZnJvbSB0aGUgd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMuCi0KLVhJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuNC54IHRvIDEuNS54Ci0KLUZyb20gbGlicG5nLTEuNC4wIHVudGlsIDEuNC40LCB0aGUgcG5nX2dldF91aW50XzE2IG1hY3JvIChidXQgbm90IHRoZQotZnVuY3Rpb24pIGluY29ycmVjdGx5IHJldHVybmVkIGEgdmFsdWUgb2YgdHlwZSBwbmdfdWludF8zMi4KLVRoZSBpbmNvcnJlY3QgbWFjcm8gd2FzIHJlbW92ZWQgZnJvbSBsaWJwbmctMS40LjUuCi0KLUNoZWNraW5nIGZvciBpbnZhbGlkIHBhbGV0dGUgaW5kZXggb24gd3JpdGUgd2FzIGFkZGVkIGF0IGxpYnBuZwotMS41LjEwLiAgSWYgYSBwaXhlbCBjb250YWlucyBhbiBpbnZhbGlkIChvdXQtb2YtcmFuZ2UpIGluZGV4IGxpYnBuZyBpc3N1ZXMKLWEgYmVuaWduIGVycm9yLiAgVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGlzIGNvbmRpdGlvbiBpcyBhbgotZXJyb3IgYWNjb3JkaW5nIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgQ2xhdXNlIDExLjMuMiwgYnV0IHRoZSBlcnJvciBjYW4KLWJlIGlnbm9yZWQgaW4gZWFjaCBwbmdfcHRyIHdpdGgKLQotICAgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChwbmdfcHRyLCBhbGxvd2VkKTsKLQotICAgICAgYWxsb3dlZCAgLSBvbmUgb2YKLSAgICAgICAgICAgICAgICAgMDogZGlzYWJsZSBiZW5pZ24gZXJyb3IgKGFjY2VwdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBkYXRhIHdpdGhvdXQgd2FybmluZykuCi0gICAgICAgICAgICAgICAgIDE6IGVuYWJsZSBiZW5pZ24gZXJyb3IgKHRyZWF0IHRoZQotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGRhdGEgYXMgYW4gZXJyb3Igb3IgYQotICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKS4KLQotSWYgdGhlIGVycm9yIGlzIGlnbm9yZWQsIG9yIGlmIHBuZ19iZW5pZ25fZXJyb3IoKSB0cmVhdHMgaXQgYXMgYSB3YXJuaW5nLAotYW55IGludmFsaWQgcGl4ZWxzIGFyZSBkZWNvZGVkIGFzIG9wYXF1ZSBibGFjayBieSB0aGUgZGVjb2RlciBhbmQgd3JpdHRlbgotYXMtaXMgYnkgdGhlIGVuY29kZXIuCi0KLVJldHJpZXZpbmcgdGhlIG1heGltdW0gcGFsZXR0ZSBpbmRleCBmb3VuZCB3YXMgYWRkZWQgYXQgbGlicG5nLTEuNS4xNS4KLVRoaXMgc3RhdGVtZW50IG11c3QgYXBwZWFyIGFmdGVyIHBuZ19yZWFkX3BuZygpIG9yIHBuZ19yZWFkX2ltYWdlKCkgd2hpbGUKLXJlYWRpbmcsIGFuZCBhZnRlciBwbmdfd3JpdGVfcG5nKCkgb3IgcG5nX3dyaXRlX2ltYWdlKCkgd2hpbGUgd3JpdGluZy4KLQotICAgaW50IG1heF9wYWxldHRlID0gcG5nX2dldF9wYWxldHRlX21heChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG1heGltdW0gcGFsZXR0ZSBpbmRleCBmb3VuZCBpbiB0aGUgaW1hZ2UsIG9yICItMSIgaWYKLXRoZSBwYWxldHRlIHdhcyBub3QgY2hlY2tlZCwgb3IgIjAiIGlmIG5vIHBhbGV0dGUgd2FzIGZvdW5kLiAgTm90ZSB0aGF0IHRoaXMKLWRvZXMgbm90IGFjY291bnQgZm9yIGFueSBwYWxldHRlIGluZGV4IHVzZWQgYnkgYW5jaWxsYXJ5IGNodW5rcyBzdWNoIGFzIHRoZQotYktHRCBjaHVuazsgeW91IG11c3QgY2hlY2sgdGhvc2Ugc2VwYXJhdGVseSB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0KLXBhbGV0dGUgaW5kZXggYWN0dWFsbHkgdXNlZC4KLQotVGhlcmUgYXJlIG5vIHN1YnN0YW50aWFsIEFQSSBjaGFuZ2VzIGJldHdlZW4gdGhlIG5vbi1kZXByZWNhdGVkIHBhcnRzIG9mCi10aGUgMS40LjUgQVBJIGFuZCB0aGUgMS41LjAgQVBJOyBob3dldmVyLCB0aGUgYWJpbGl0eSB0byBkaXJlY3RseSBhY2Nlc3MKLW1lbWJlcnMgb2YgdGhlIG1haW4gbGlicG5nIGNvbnRyb2wgc3RydWN0dXJlcywgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8sCi1kZXByZWNhdGVkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgbGlicG5nLCBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlbW92ZWQgZnJvbQotbGlicG5nIDEuNSwgYW5kIG5ldyBwcml2YXRlICJwbmdzdHJ1Y3QuaCIsICJwbmdpbmZvLmgiLCBhbmQgInBuZ2RlYnVnLmgiCi1oZWFkZXIgZmlsZXMgd2VyZSBjcmVhdGVkLgotCi1XZSBubyBsb25nZXIgaW5jbHVkZSB6bGliLmggaW4gcG5nLmguICBUaGUgaW5jbHVkZSBzdGF0ZW1lbnQgaGFzIGJlZW4gbW92ZWQKLXRvIHBuZ3N0cnVjdC5oLCB3aGVyZSBpdCBpcyBub3QgYWNjZXNzaWJsZSBieSBhcHBsaWNhdGlvbnMuIEFwcGxpY2F0aW9ucyB0aGF0Ci1uZWVkIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBpbiB6bGliLmggd2lsbCBuZWVkIHRvIGFkZCB0aGUgJyNpbmNsdWRlICJ6bGliLmgiJwotZGlyZWN0aXZlLiAgSXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgdGhpcyBpcyBwbGFjZWQgcHJpb3IgdG8gb3IgYWZ0ZXIKLXRoZSAnIiNpbmNsdWRlIHBuZy5oIicgZGlyZWN0aXZlLgotCi1UaGUgcG5nX3NwcmludGYoKSwgcG5nX3N0cmNweSgpLCBhbmQgcG5nX3N0cm5jcHkoKSBtYWNyb3MgYXJlIG5vIGxvbmdlciB1c2VkCi1hbmQgd2VyZSByZW1vdmVkLgotCi1XZSBtb3ZlZCB0aGUgcG5nX3N0cmxlbigpLCBwbmdfbWVtY3B5KCksIHBuZ19tZW1zZXQoKSwgYW5kIHBuZ19tZW1jbXAoKQotbWFjcm9zIGludG8gYSBwcml2YXRlIGhlYWRlciBmaWxlIChwbmdwcml2LmgpIHRoYXQgaXMgbm90IGFjY2Vzc2libGUgdG8KLWFwcGxpY2F0aW9ucy4KLQotSW4gcG5nX2dldF9pQ0NQLCB0aGUgdHlwZSBvZiAicHJvZmlsZSIgd2FzIGNoYW5nZWQgZnJvbSBwbmdfY2hhcnBwCi10byBwbmdfYnl0ZXBwLCBhbmQgaW4gcG5nX3NldF9pQ0NQLCBmcm9tIHBuZ19jaGFycCB0byBwbmdfY29uc3RfYnl0ZXAuCi0KLVRoZXJlIGFyZSBjaGFuZ2VzIG9mIGZvcm0gaW4gcG5nLmgsIGluY2x1ZGluZyBuZXcgYW5kIGNoYW5nZWQgbWFjcm9zIHRvCi1kZWNsYXJlIHBhcnRzIG9mIHRoZSBBUEkuICBTb21lIEFQSSBmdW5jdGlvbnMgd2l0aCBhcmd1bWVudHMgdGhhdCBhcmUKLXBvaW50ZXJzIHRvIGRhdGEgbm90IG1vZGlmaWVkIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGNvcnJlY3RlZCB0bwotZGVjbGFyZSB0aGVzZSBhcmd1bWVudHMgd2l0aCBQTkdfQ09OU1QuCi0KLU11Y2ggb2YgdGhlIGludGVybmFsIHVzZSBvZiBDIG1hY3JvcyB0byBjb250cm9sIHRoZSBsaWJyYXJ5IGJ1aWxkIGhhcyBhbHNvCi1jaGFuZ2VkIGFuZCBzb21lIG9mIHRoaXMgaXMgdmlzaWJsZSBpbiB0aGUgZXhwb3J0ZWQgaGVhZGVyIGZpbGVzLCBpbgotcGFydGljdWxhciB0aGUgdXNlIG9mIG1hY3JvcyB0byBjb250cm9sIGRhdGEgYW5kIEFQSSBlbGVtZW50cyB2aXNpYmxlCi1kdXJpbmcgYXBwbGljYXRpb24gY29tcGlsYXRpb24gbWF5IHJlcXVpcmUgc2lnbmlmaWNhbnQgcmV2aXNpb24gdG8KLWFwcGxpY2F0aW9uIGNvZGUuICAoSXQgaXMgZXh0cmVtZWx5IHJhcmUgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuKQotCi1BbnkgcHJvZ3JhbSB0aGF0IGNvbXBpbGVkIGFnYWluc3QgbGlicG5nIDEuNCBhbmQgZGlkIG5vdCB1c2UgZGVwcmVjYXRlZAotZmVhdHVyZXMgb3IgYWNjZXNzIGludGVybmFsIGxpYnJhcnkgc3RydWN0dXJlcyBzaG91bGQgY29tcGlsZSBhbmQgd29yawotYWdhaW5zdCBsaWJwbmcgMS41LCBleGNlcHQgZm9yIHRoZSBjaGFuZ2UgaW4gdGhlIHByb3RvdHlwZSBmb3IKLXBuZ19nZXRfaUNDUCgpIGFuZCBwbmdfc2V0X2lDQ1AoKSBBUEkgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZS4KLQotbGlicG5nIDEuNS4wIGFkZHMgUE5HXyBQQVNTIG1hY3JvcyB0byBoZWxwIGluIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mCi1pbnRlcmxhY2VkIGltYWdlcy4gIFRoZSBtYWNyb3MgcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbgotZWFjaCBwYXNzIGFuZCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlLWludGVybGFjZSBhbmQgKGlmCi1hYnNvbHV0ZWx5IG5lY2Vzc2FyeSkgaW50ZXJsYWNlIGFuIGltYWdlLgotCi1saWJwbmcgMS41LjAgYWRkcyBhbiBBUEkgcG5nX2xvbmdqbXAocG5nX3B0ciwgdmFsdWUpLiAgVGhpcyBBUEkgY2FsbHMKLXRoZSBhcHBsaWNhdGlvbi1wcm92aWRlZCBwbmdfbG9uZ2ptcF9wdHIgb24gdGhlIGludGVybmFsLCBidXQgYXBwbGljYXRpb24KLWluaXRpYWxpemVkLCBsb25nam1wIGJ1ZmZlci4gIEl0IGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgdG8gYXZvaWQKLXRoZSBuZWVkIHRvIHVzZSB0aGUgcG5nX2ptcGJ1ZiBtYWNybywgd2hpY2ggaGFkIHRoZSB1bm5lY2Vzc2FyeSBzaWRlCi1lZmZlY3Qgb2YgcmVzZXR0aW5nIHRoZSBpbnRlcm5hbCBwbmdfbG9uZ2ptcF9wdHIgdmFsdWUuCi0KLWxpYnBuZyAxLjUuMCBpbmNsdWRlcyBhIGNvbXBsZXRlIGZpeGVkIHBvaW50IEFQSS4gIEJ5IGRlZmF1bHQgdGhpcyBpcwotcHJlc2VudCBhbG9uZyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZsb2F0aW5nIHBvaW50IEFQSS4gIEluIGdlbmVyYWwgdGhlCi1maXhlZCBwb2ludCBBUEkgaXMgZmFzdGVyIGFuZCBzbWFsbGVyIHRoYW4gdGhlIGZsb2F0aW5nIHBvaW50IG9uZSBiZWNhdXNlCi10aGUgUE5HIGZpbGUgZm9ybWF0IHVzZWQgZml4ZWQgcG9pbnQsIG5vdCBmbG9hdGluZyBwb2ludC4gIFRoaXMgYXBwbGllcwotZXZlbiBpZiB0aGUgbGlicmFyeSB1c2VzIGZsb2F0aW5nIHBvaW50IGluIGludGVybmFsIGNhbGN1bGF0aW9ucy4gIEEgbmV3Ci1tYWNybywgUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVELCByZXZlYWxzIHdoZXRoZXIgdGhlIGxpYnJhcnkKLXVzZXMgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyAodGhlIGRlZmF1bHQpIG9yIGZpeGVkIHBvaW50IGFyaXRobWV0aWMKLWludGVybmFsbHkgZm9yIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGNhbGN1bGF0aW9ucyBzdWNoIGFzIGdhbW1hIGNvcnJlY3Rpb24uCi1JbiBzb21lIGNhc2VzLCB0aGUgZ2FtbWEgY2FsY3VsYXRpb25zIG1heSBwcm9kdWNlIHNsaWdodGx5IGRpZmZlcmVudAotcmVzdWx0cy4gIFRoaXMgaGFzIGNoYW5nZWQgdGhlIHJlc3VsdHMgaW4gcG5nX3JnYl90b19ncmF5IGFuZCBpbiBhbHBoYQotY29tcG9zaXRpb24gKHBuZ19zZXRfYmFja2dyb3VuZCBmb3IgZXhhbXBsZSkuIFRoaXMgYXBwbGllcyBldmVuIGlmIHRoZQotb3JpZ2luYWwgaW1hZ2Ugd2FzIGFscmVhZHkgbGluZWFyIChnYW1tYSA9PSAxLjApIGFuZCwgdGhlcmVmb3JlLCBpdCBpcwotbm90IG5lY2Vzc2FyeSB0byBsaW5lYXJpemUgdGhlIGltYWdlLiAgVGhpcyBpcyBiZWNhdXNlIGxpYnBuZyBoYXMgKm5vdCoKLWJlZW4gY2hhbmdlZCB0byBvcHRpbWl6ZSB0aGF0IGNhc2UgY29ycmVjdGx5LCB5ZXQuCi0KLUZpeGVkIHBvaW50IHN1cHBvcnQgZm9yIHRoZSBzQ0FMIGNodW5rIGNvbWVzIHdpdGggYW4gaW1wb3J0YW50IGNhdmVhdDsKLXRoZSBzQ0FMIHNwZWNpZmljYXRpb24gdXNlcyBhIGRlY2ltYWwgZW5jb2Rpbmcgb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWVzCi1hbmQgdGhlIGFjY3VyYWN5IG9mIFBORyBmaXhlZCBwb2ludCB2YWx1ZXMgaXMgaW5zdWZmaWNpZW50IGZvcgotcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgdmFsdWVzLiBDb25zZXF1ZW50bHkgYSAic3RyaW5nIiBBUEkKLShwbmdfZ2V0X3NDQUxfcyBhbmQgcG5nX3NldF9zQ0FMX3MpIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHdheSBvZiByZWFkaW5nCi1hcmJpdHJhcnkgc0NBTCBjaHVua3MgaW4gdGhlIGFic2VuY2Ugb2YgZWl0aGVyIHRoZSBmbG9hdGluZyBwb2ludCBBUEkgb3IKLWludGVybmFsIGZsb2F0aW5nIHBvaW50IGNhbGN1bGF0aW9ucy4gIFN0YXJ0aW5nIHdpdGggbGlicG5nLTEuNS4wLCBib3RoCi1vZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHByZXNlbnQgd2hlbiBQTkdfc0NBTF9TVVBQT1JURUQgaXMgZGVmaW5lZC4gIFByaW9yCi10byBsaWJwbmctMS41LjAsIHRoZWlyIHByZXNlbmNlIGFsc28gZGVwZW5kZWQgdXBvbiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVECi1iZWluZyBkZWZpbmVkIGFuZCBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEIG5vdCBiZWluZyBkZWZpbmVkLgotCi1BcHBsaWNhdGlvbnMgbm8gbG9uZ2VyIG5lZWQgdG8gaW5jbHVkZSB0aGUgb3B0aW9uYWwgZGlzdHJpYnV0aW9uIGhlYWRlcgotZmlsZSBwbmd1c3IuaCBvciBkZWZpbmUgdGhlIGNvcnJlc3BvbmRpbmcgbWFjcm9zIGR1cmluZyBhcHBsaWNhdGlvbgotYnVpbGQgaW4gb3JkZXIgdG8gc2VlIHRoZSBjb3JyZWN0IHZhcmlhbnQgb2YgdGhlIGxpYnBuZyBBUEkuICBGcm9tIDEuNS4wCi1hcHBsaWNhdGlvbiBjb2RlIGNhbiBjaGVjayBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgX1NVUFBPUlRFRCBtYWNybzoKLQotI2lmZGVmIFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRAotICAgLyogY29kZSB0aGF0IHVzZXMgdGhlIGluY2ggY29udmVyc2lvbiBBUElzLiAqLwotI2VuZGlmCi0KLVRoaXMgbWFjcm8gd2lsbCBvbmx5IGJlIGRlZmluZWQgaWYgdGhlIGluY2ggY29udmVyc2lvbiBmdW5jdGlvbnMgaGF2ZSBiZWVuCi1jb21waWxlZCBpbnRvIGxpYnBuZy4gIFRoZSBmdWxsIHNldCBvZiBtYWNyb3MsIGFuZCB3aGV0aGVyIG9yIG5vdCBzdXBwb3J0Ci1oYXMgYmVlbiBjb21waWxlZCBpbiwgYXJlIGF2YWlsYWJsZSBpbiB0aGUgaGVhZGVyIGZpbGUgcG5nbGliY29uZi5oLgotVGhpcyBoZWFkZXIgZmlsZSBpcyBzcGVjaWZpYyB0byB0aGUgbGlicG5nIGJ1aWxkLiAgTm90aWNlIHRoYXQgcHJpb3IgdG8KLTEuNS4wIHRoZSBfU1VQUE9SVEVEIG1hY3JvcyB3b3VsZCBhbHdheXMgaGF2ZSB0aGUgZGVmYXVsdCBkZWZpbml0aW9uIHVubGVzcwotcmVzZXQgYnkgcG5ndXNyLmggb3IgYnkgZXhwbGljaXQgc2V0dGluZ3Mgb24gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4KLVRoZXNlIHNldHRpbmdzIG1heSBwcm9kdWNlIGNvbXBpbGVyIHdhcm5pbmdzIG9yIGVycm9ycyBpbiAxLjUuMCBiZWNhdXNlCi1vZiBtYWNybyByZWRlZmluaXRpb24uCi0KLUFwcGxpY2F0aW9ucyBjYW4gbm93IGNob29zZSB3aGV0aGVyIHRvIHVzZSB0aGVzZSBtYWNyb3Mgb3IgdG8gY2FsbCB0aGUKLWNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gYnkgZGVmaW5pbmcgUE5HX1VTRV9SRUFEX01BQ1JPUyBvcgotUE5HX05PX1VTRV9SRUFEX01BQ1JPUyBiZWZvcmUgaW5jbHVkaW5nIHBuZy5oLiAgTm90aWNlIHRoYXQgdGhpcyBpcwotb25seSBzdXBwb3J0ZWQgZnJvbSAxLjUuMDsgZGVmaW5pbmcgUE5HX05PX1VTRV9SRUFEX01BQ1JPUyBwcmlvciB0byAxLjUuMAotd2lsbCBsZWFkIHRvIGEgbGluayBmYWlsdXJlLgotCi1QcmlvciB0byBsaWJwbmctMS41LjQsIHRoZSB6bGliIGNvbXByZXNzb3IgdXNlZCB0aGUgc2FtZSBzZXQgb2YgcGFyYW1ldGVycwotd2hlbiBjb21wcmVzc2luZyB0aGUgSURBVCBkYXRhIGFuZCB0ZXh0dWFsIGRhdGEgc3VjaCBhcyB6VFh0IGFuZCBpQ0NQLgotSW4gbGlicG5nLTEuNS40IHdlIHJlaW5pdGlhbGl6ZWQgdGhlIHpsaWIgc3RyZWFtIGZvciBlYWNoIHR5cGUgb2YgZGF0YS4KLVdlIGFkZGVkIGZpdmUgcG5nX3NldF90ZXh0XyooKSBmdW5jdGlvbnMgZm9yIHNldHRpbmcgdGhlIHBhcmFtZXRlcnMgdG8KLXVzZSB3aXRoIHRleHR1YWwgZGF0YS4KLQotUHJpb3IgdG8gbGlicG5nLTEuNS40LCB0aGUgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKLW9wdGlvbiB3YXMgb2ZmIGJ5IGRlZmF1bHQsIGFuZCBzbGlnaHRseSBpbmFjY3VyYXRlIHNjYWxpbmcgb2NjdXJyZWQuCi1UaGlzIG9wdGlvbiBjYW4gbm8gbG9uZ2VyIGJlIHR1cm5lZCBvZmYsIGFuZCB0aGUgY2hvaWNlIG9mIGFjY3VyYXRlCi1vciBpbmFjY3VyYXRlIDE2LXRvLTggc2NhbGluZyBpcyBieSB1c2luZyB0aGUgbmV3IHBuZ19zZXRfc2NhbGVfMTZfdG9fOCgpCi1BUEkgZm9yIGFjY3VyYXRlIHNjYWxpbmcgb3IgdGhlIG9sZCBwbmdfc2V0X3N0cmlwXzE2X3RvXzgoKSBBUEkgZm9yIHNpbXBsZQotY2hvcHBpbmcuICBJbiBsaWJwbmctMS41LjQsIHRoZSBQTkdfUkVBRF8xNl9UT184X0FDQ1VSQVRFX1NDQUxFX1NVUFBPUlRFRAotbWFjcm8gYmVjYW1lIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVELCBhbmQgdGhlIFBOR19SRUFEXzE2X1RPXzgKLW1hY3JvIGJlY2FtZSBQTkdfUkVBRF9TVFJJUF8xNl9UT184X1NVUFBPUlRFRCwgdG8gZW5hYmxlIHRoZSB0d28KLXBuZ19zZXRfKl8xNl90b184KCkgZnVuY3Rpb25zIHNlcGFyYXRlbHkuCi0KLVByaW9yIHRvIGxpYnBuZy0xLjUuNCwgdGhlIHBuZ19zZXRfdXNlcl9saW1pdHMoKSBmdW5jdGlvbiBjb3VsZCBvbmx5IGJlCi11c2VkIHRvIHJlZHVjZSB0aGUgd2lkdGggYW5kIGhlaWdodCBsaW1pdHMgZnJvbSB0aGUgdmFsdWUgb2YKLVBOR19VU0VSX1dJRFRIX01BWCBhbmQgUE5HX1VTRVJfSEVJR0hUX01BWCwgYWx0aG91Z2ggdGhpcyBkb2N1bWVudCBzYWlkCi10aGF0IGl0IGNvdWxkIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlbS4gIE5vdyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVkdWNlIG9yCi1pbmNyZWFzZSB0aGUgbGltaXRzLgotCi1TdGFydGluZyBpbiBsaWJwbmctMS41LjEwLCB0aGUgdXNlciBsaW1pdHMgY2FuIGJlIHNldCBlbiBtYXNzZSB3aXRoIHRoZQotY29uZmlndXJhdGlvbiBvcHRpb24gUE5HX1NBRkVfTElNSVRTX1NVUFBPUlRFRC4gIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsCi1hIHNldCBvZiAic2FmZSIgbGltaXRzIGlzIGFwcGxpZWQgaW4gcG5ncHJpdi5oLiAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gYnkKLWFwcGxpY2F0aW9uIGNhbGxzIHRvIHBuZ19zZXRfdXNlcl9saW1pdHMoKSwgcG5nX3NldF91c2VyX2NodW5rX2NhY2hlX21heCgpLAotYW5kL29yIHBuZ19zZXRfdXNlcl9tYWxsb2NfbWF4KCkgdGhhdCBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgbGltaXRzLiAgQWxzbywKLWluIGxpYnBuZy0xLjUuMTAgdGhlIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCBsaW1pdHMgd2VyZSBpbmNyZWFzZWQKLWZyb20gMSwwMDAsMDAwIHRvIDB4N2ZmZmZmZmYgKGkuZS4sIG1hZGUgdW5saW1pdGVkKS4gIFRoZXJlZm9yZSwgdGhlCi1saW1pdHMgYXJlIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgICAgICBzYWZlCi0gICBwbmdfdXNlcl93aWR0aF9tYXggICAgICAgIDB4N2ZmZmZmZmYgICAgMSwwMDAsMDAwCi0gICBwbmdfdXNlcl9oZWlnaHRfbWF4ICAgICAgIDB4N2ZmZmZmZmYgICAgMSwwMDAsMDAwCi0gICBwbmdfdXNlcl9jaHVua19jYWNoZV9tYXggIDAgKHVubGltaXRlZCkgICAxMjgKLSAgIHBuZ191c2VyX2NodW5rX21hbGxvY19tYXggMCAodW5saW1pdGVkKSA4LDAwMCwwMDAKLQotVGhlIHBuZ19zZXRfb3B0aW9uKCkgZnVuY3Rpb24gKGFuZCB0aGUgIm9wdGlvbnMiIG1lbWJlciBvZiB0aGUgcG5nIHN0cnVjdCkgd2FzCi1hZGRlZCB0byBsaWJwbmctMS41LjE1LCB3aXRoIG9wdGlvbiBQTkdfQVJNX05FT04uCi0KLVRoZSBsaWJyYXJ5IG5vdyBzdXBwb3J0cyBhIGNvbXBsZXRlIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIGFuZCBjYW4KLXRodXMgYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSBubyBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG9yIHZlcnkKLWxpbWl0ZWQgb3Igc2xvdyBzdXBwb3J0LiAgUHJldmlvdXNseSBnYW1tYSBjb3JyZWN0aW9uLCBhbiBlc3NlbnRpYWwgcGFydAotb2YgY29tcGxldGUgUE5HIHN1cHBvcnQsIHJlcXVpcmVkIHJlYXNvbmFibHkgZmFzdCBmbG9hdGluZyBwb2ludC4KLQotQXMgcGFydCBvZiB0aGlzIHRoZSBjaG9pY2Ugb2YgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gbWFkZQotaW5kZXBlbmRlbnQgb2YgdGhlIGNob2ljZSBvZiBmaXhlZCB2ZXJzdXMgZmxvYXRpbmcgcG9pbnQgQVBJcyBhbmQgYWxsIHRoZQotbWlzc2luZyBmaXhlZCBwb2ludCBBUElzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQotVGhlIGV4YWN0IG1lY2hhbmlzbSB1c2VkIHRvIGNvbnRyb2wgYXR0cmlidXRlcyBvZiBBUEkgZnVuY3Rpb25zIGhhcwotY2hhbmdlZCwgYXMgZGVzY3JpYmVkIGluIHRoZSBJTlNUQUxMIGZpbGUuCi0KLUEgbmV3IHRlc3QgcHJvZ3JhbSwgcG5ndmFsaWQsIGlzIHByb3ZpZGVkIGluIGFkZGl0aW9uIHRvIHBuZ3Rlc3QuCi1wbmd2YWxpZCB2YWxpZGF0ZXMgdGhlIGFyaXRobWV0aWMgYWNjdXJhY3kgb2YgdGhlIGdhbW1hIGNvcnJlY3Rpb24KLWNhbGN1bGF0aW9ucyBhbmQgaW5jbHVkZXMgYSBudW1iZXIgb2YgdmFsaWRhdGlvbnMgb2YgdGhlIGZpbGUgZm9ybWF0LgotQSBzdWJzZXQgb2YgdGhlIGZ1bGwgcmFuZ2Ugb2YgdGVzdHMgaXMgcnVuIHdoZW4gIm1ha2UgY2hlY2siIGlzIGRvbmUKLShpbiB0aGUgJ2NvbmZpZ3VyZScgYnVpbGQuKSAgcG5ndmFsaWQgYWxzbyBhbGxvd3MgdG90YWwgYWxsb2NhdGVkIG1lbW9yeQotdXNhZ2UgdG8gYmUgZXZhbHVhdGVkIGFuZCBwZXJmb3JtcyBhZGRpdGlvbmFsIG1lbW9yeSBvdmVyd3JpdGUgdmFsaWRhdGlvbi4KLQotTWFueSBjaGFuZ2VzIHRvIGluZGl2aWR1YWwgZmVhdHVyZSBtYWNyb3MgaGF2ZSBiZWVuIG1hZGUuIFRoZSBmb2xsb3dpbmcKLWFyZSB0aGUgY2hhbmdlcyBtb3N0IGxpa2VseSB0byBiZSBub3RpY2VkIGJ5IGxpYnJhcnkgYnVpbGRlcnMgd2hvCi1jb25maWd1cmUgbGlicG5nOgotCi0xKSBBbGwgZmVhdHVyZSBtYWNyb3Mgbm93IGhhdmUgY29uc2lzdGVudCBuYW1pbmc6Ci0KLSNkZWZpbmUgUE5HX05PX2ZlYXR1cmUgdHVybnMgdGhlIGZlYXR1cmUgb2ZmCi0jZGVmaW5lIFBOR19mZWF0dXJlX1NVUFBPUlRFRCB0dXJucyB0aGUgZmVhdHVyZSBvbgotCi1wbmdsaWJjb25mLmggY29udGFpbnMgb25lIGxpbmUgZm9yIGVhY2ggZmVhdHVyZSBtYWNybyB3aGljaCBpcyBlaXRoZXI6Ci0KLSNkZWZpbmUgUE5HX2ZlYXR1cmVfU1VQUE9SVEVECi0KLWlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvcjoKLQotLyojdW5kZWYgUE5HX2ZlYXR1cmVfU1VQUE9SVEVEKi8KLQotaWYgaXQgaXMgbm90LiAgTGlicmFyeSBjb2RlIGNvbnNpc3RlbnRseSBjaGVja3MgZm9yIHRoZSAnU1VQUE9SVEVEJyBtYWNyby4KLUl0IGRvZXMgbm90LCBhbmQgbGlicG5nIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90LCBjaGVjayBmb3IgdGhlICdOTycgbWFjcm8KLXdoaWNoIHdpbGwgbm90IG5vcm1hbGx5IGJlIGRlZmluZWQgZXZlbiBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgotVGhlICdOTycgbWFjcm9zIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBmb3Igc2V0dGluZyBvciBub3Qgc2V0dGluZyB0aGUKLWNvcnJlc3BvbmRpbmcgJ1NVUFBPUlRFRCcgbWFjcm9zLgotCi1Db21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBuYW1lcyBpcyBwcm92aWRlZCBhcyBmb2xsb3dzOgotCi1QTkdfSU5DSF9DT05WRVJTSU9OUyB0dXJucyBvbiBQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQKLQotQW5kIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZGlzYWJsZSB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlOgotCi1QTkdfU0VUSk1QX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgU0VUSk1QCi1QTkdfUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgUkVBRF9UUkFOU0ZPUk1TCi1QTkdfTk9fUkVBRF9DT01QT1NJVEVEX05PRElWIGRpc2FibGVzIFJFQURfQ09NUE9TSVRFX05PRElWCi1QTkdfV1JJVEVfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFdSSVRFX1RSQU5TRk9STVMKLVBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRCBkaXNhYmxlcyBSRUFEX0FOQ0lMTEFSWV9DSFVOS1MKLVBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgV1JJVEVfQU5DSUxMQVJZX0NIVU5LUwotCi1MaWJyYXJ5IGJ1aWxkZXJzIHNob3VsZCByZW1vdmUgdXNlIG9mIHRoZSBhYm92ZSwgaW5jb25zaXN0ZW50LCBuYW1lcy4KLQotMikgV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nIHdhcyBwcmV2aW91c2x5IGNvbmRpdGlvbmFsIG9uCi10aGUgU1RESU8gZmVhdHVyZS4gVGhlIGxpYnJhcnkgaGFzIGJlZW4gY2hhbmdlZCB0byB1c2UgdGhlCi1DT05TT0xFX0lPIGZlYXR1cmUgaW5zdGVhZC4gVGhpcyBtZWFucyB0aGF0IGlmIENPTlNPTEVfSU8gaXMgZGlzYWJsZWQKLXRoZSBsaWJyYXJ5IG5vIGxvbmdlciB1c2VzIHRoZSBwcmludGYoMykgZnVuY3Rpb25zLCBldmVuIHRob3VnaCB0aGUKLWRlZmF1bHQgcmVhZC93cml0ZSBpbXBsZW1lbnRhdGlvbnMgdXNlIChGSUxFKSBzdHlsZSBzdGRpby5oIGZ1bmN0aW9ucy4KLQotMykgVGhyZWUgZmVhdHVyZSBtYWNyb3Mgbm93IGNvbnRyb2wgdGhlIGZpeGVkL2Zsb2F0aW5nIHBvaW50IGRlY2lzaW9uczoKLQotUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCBlbmFibGVzIHRoZSBmbG9hdGluZyBwb2ludCBBUElzCi0KLVBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQgZW5hYmxlcyB0aGUgZml4ZWQgcG9pbnQgQVBJczsgaG93ZXZlciwgaW4KLXByYWN0aWNlIHRoZXNlIGFyZSBub3JtYWxseSByZXF1aXJlZCBpbnRlcm5hbGx5IGFueXdheSAoYmVjYXVzZSB0aGUgUE5HCi1maWxlIGZvcm1hdCBpcyBmaXhlZCBwb2ludCksIHRoZXJlZm9yZSBpbiBtb3N0IGNhc2VzIFBOR19OT19GSVhFRF9QT0lOVAotbWVyZWx5IHN0b3BzIHRoZSBmdW5jdGlvbiBmcm9tIGJlaW5nIGV4cG9ydGVkLgotCi1QTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQgY2hvb3NlcyBiZXR3ZWVuIHRoZSBpbnRlcm5hbCBmbG9hdGluZwotcG9pbnQgaW1wbGVtZW50YXRpb24gb3IgdGhlIGZpeGVkIHBvaW50IG9uZS4gIFR5cGljYWxseSB0aGUgZml4ZWQgcG9pbnQKLWltcGxlbWVudGF0aW9uIGlzIGxhcmdlciBhbmQgc2xvd2VyIHRoYW4gdGhlIGZsb2F0aW5nIHBvaW50IGltcGxlbWVudGF0aW9uCi1vbiBhIHN5c3RlbSB0aGF0IHN1cHBvcnRzIGZsb2F0aW5nIHBvaW50OyBob3dldmVyLCBpdCBtYXkgYmUgZmFzdGVyIG9uIGEKLXN5c3RlbSB3aGljaCBsYWNrcyBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSBhbmQgdGhlcmVmb3JlIHVzZXMgYSBzb2Z0d2FyZQotZW11bGF0aW9uLgotCi00KSBBZGRlZCBQTkdfe1JFQUQsV1JJVEV9X0lOVF9GVU5DVElPTlNfU1VQUE9SVEVELiAgVGhpcyBhbGxvd3MgdGhlCi1mdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgaW50cyB0byBiZSBkaXNhYmxlZCBpbmRlcGVuZGVudGx5IG9mCi1QTkdfVVNFX1JFQURfTUFDUk9TLCB3aGljaCBhbGxvd3MgbGlicG5nIHRvIGJlIGJ1aWx0IHdpdGggdGhlIGZ1bmN0aW9ucwotZXZlbiB0aG91Z2ggdGhlIGRlZmF1bHQgaXMgdG8gdXNlIHRoZSBtYWNyb3MgLSB0aGlzIGFsbG93cyBhcHBsaWNhdGlvbnMKLXRvIGNob29zZSBhdCBhcHAgYnVpbGR0aW1lIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBtYWNyb3MgKHByZXZpb3VzbHkKLWltcG9zc2libGUgYmVjYXVzZSB0aGUgZnVuY3Rpb25zIHdlcmVuJ3QgaW4gdGhlIGRlZmF1bHQgYnVpbGQuKQotCi1YSUkuICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMS41LnggdG8gMS42LngKLQotQSAic2ltcGxpZmllZCBBUEkiIGhhcyBiZWVuIGFkZGVkIChzZWUgZG9jdW1lbnRhdGlvbiBpbiBwbmcuaCBhbmQgYSBzaW1wbGUKLWV4YW1wbGUgaW4gY29udHJpYi9leGFtcGxlcy9wbmd0b3BuZy5jKS4gIFRoZSBuZXcgcHVibGljbHkgdmlzaWJsZSBBUEkKLWluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6Ci0KLSAgIG1hY3JvczoKLSAgICAgUE5HX0ZPUk1BVF8qCi0gICAgIFBOR19JTUFHRV8qCi0gICBzdHJ1Y3R1cmVzOgotICAgICBwbmdfY29udHJvbAotICAgICBwbmdfaW1hZ2UKLSAgIHJlYWQgZnVuY3Rpb25zCi0gICAgIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZSgpCi0gICAgIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8oKQotICAgICBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeSgpCi0gICAgIHBuZ19pbWFnZV9maW5pc2hfcmVhZCgpCi0gICAgIHBuZ19pbWFnZV9mcmVlKCkKLSAgIHdyaXRlIGZ1bmN0aW9ucwotICAgICBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSgpCi0gICAgIHBuZ19pbWFnZV93cml0ZV90b19tZW1vcnkoKQotICAgICBwbmdfaW1hZ2Vfd3JpdGVfdG9fc3RkaW8oKQotCi1TdGFydGluZyB3aXRoIGxpYnBuZy0xLjYuMCwgeW91IGNhbiBjb25maWd1cmUgbGlicG5nIHRvIHByZWZpeCBhbGwgZXhwb3J0ZWQKLXN5bWJvbHMsIHVzaW5nIHRoZSBQTkdfUFJFRklYIG1hY3JvLgotCi1XZSBubyBsb25nZXIgaW5jbHVkZSBzdHJpbmcuaCBpbiBwbmcuaC4gIFRoZSBpbmNsdWRlIHN0YXRlbWVudCBoYXMgYmVlbiBtb3ZlZAotdG8gcG5ncHJpdi5oLCB3aGVyZSBpdCBpcyBub3QgYWNjZXNzaWJsZSBieSBhcHBsaWNhdGlvbnMuICBBcHBsaWNhdGlvbnMgdGhhdAotbmVlZCBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gaW4gc3RyaW5nLmggbXVzdCBhZGQgYW4gJyNpbmNsdWRlIDxzdHJpbmcuaD4nCi1kaXJlY3RpdmUuICBJdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciB0aGlzIGlzIHBsYWNlZCBwcmlvciB0byBvciBhZnRlcgotdGhlICcjaW5jbHVkZSAicG5nLmgiJyBkaXJlY3RpdmUuCi0KLVRoZSBmb2xsb3dpbmcgQVBJIGFyZSBub3cgREVQUkVDQVRFRDoKLSAgIHBuZ19pbmZvX2luaXRfMygpCi0gICBwbmdfY29udmVydF90b19yZmMxMTIzKCkgd2hpY2ggaGFzIGJlZW4gcmVwbGFjZWQKLSAgICAgd2l0aCBwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcigpCi0gICBwbmdfbWFsbG9jX2RlZmF1bHQoKQotICAgcG5nX2ZyZWVfZGVmYXVsdCgpCi0gICBwbmdfcmVzZXRfenN0cmVhbSgpCi0KLVRoZSBmb2xsb3dpbmcgaGF2ZSBiZWVuIHJlbW92ZWQ6Ci0gICBwbmdfZ2V0X2lvX2NodW5rX25hbWUoKSwgd2hpY2ggaGFzIGJlZW4gcmVwbGFjZWQKLSAgICAgd2l0aCBwbmdfZ2V0X2lvX2NodW5rX3R5cGUoKS4gIFRoZSBuZXcKLSAgICAgZnVuY3Rpb24gcmV0dXJucyBhIDMyLWJpdCBpbnRlZ2VyIGluc3RlYWQgb2YKLSAgICAgYSBzdHJpbmcuCi0gICBUaGUgcG5nX3NpemVvZigpLCBwbmdfc3RybGVuKCksIHBuZ19tZW1jcHkoKSwgcG5nX21lbWNtcCgpLCBhbmQKLSAgICAgcG5nX21lbXNldCgpIG1hY3JvcyBhcmUgbm8gbG9uZ2VyIHVzZWQgaW4gdGhlIGxpYnBuZyBzb3VyY2VzIGFuZAotICAgICBoYXZlIGJlZW4gcmVtb3ZlZC4gIFRoZXNlIGhhZCBhbHJlYWR5IGJlZW4gbWFkZSBpbnZpc2libGUgdG8gYXBwbGljYXRpb25zCi0gICAgIChpLmUuLCBkZWZpbmVkIGluIHRoZSBwcml2YXRlIHBuZ3ByaXYuaCBoZWFkZXIgZmlsZSkgc2luY2UgbGlicG5nLTEuNS4wLgotCi1UaGUgc2lnbmF0dXJlcyBvZiBtYW55IGV4cG9ydGVkIGZ1bmN0aW9ucyB3ZXJlIGNoYW5nZWQsIHN1Y2ggdGhhdAotICAgcG5nX3N0cnVjdHAgYmVjYW1lIHBuZ19zdHJ1Y3RycCBvciBwbmdfY29uc3Rfc3RydWN0cnAKLSAgIHBuZ19pbmZvcCBiZWNhbWUgcG5nX2luZm9ycCBvciBwbmdfY29uc3RfaW5mb3JwCi13aGVyZSAicnAiIGluZGljYXRlcyBhICJyZXN0cmljdGVkIHBvaW50ZXIiLgotCi1Ecm9wcGVkIHN1cHBvcnQgZm9yIDE2LWJpdCBwbGF0Zm9ybXMuIFRoZSBzdXBwb3J0IGZvciBGQVIvZmFyIHR5cGVzIGhhcwotYmVlbiBlbGltaW5hdGVkIGFuZCB0aGUgZGVmaW5pdGlvbiBvZiBwbmdfYWxsb2Nfc2l6ZV90IGlzIG5vdyBjb250cm9sbGVkCi1ieSBhIGZsYWcgc28gdGhhdCAnc21hbGwgc2l6ZV90JyBzeXN0ZW1zIGNhbiBzZWxlY3QgaXQgaWYgbmVjZXNzYXJ5LgotCi1FcnJvciBkZXRlY3Rpb24gaW4gc29tZSBjaHVua3MgaGFzIGltcHJvdmVkOyBpbiBwYXJ0aWN1bGFyIHRoZSBpQ0NQIGNodW5rCi1yZWFkZXIgbm93IGRvZXMgcHJldHR5IGNvbXBsZXRlIHZhbGlkYXRpb24gb2YgdGhlIGJhc2ljIGZvcm1hdC4gIFNvbWUgYmFkCi1wcm9maWxlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBhY2NlcHRlZCBhcmUgbm93IGFjY2VwdGVkIHdpdGggYSB3YXJuaW5nIG9yCi1yZWplY3RlZCwgZGVwZW5kaW5nIHVwb24gdGhlIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpIHNldHRpbmcsIGluIHBhcnRpY3VsYXIKLXRoZSB2ZXJ5IG9sZCBicm9rZW4gTWljcm9zb2Z0L0hQIDMxNDQtYnl0ZSBzUkdCIHByb2ZpbGUuICBTdGFydGluZyB3aXRoCi1saWJwbmctMS42LjExLCByZWNvZ25pemluZyBhbmQgY2hlY2tpbmcgc1JHQiBwcm9maWxlcyBjYW4gYmUgYXZvaWRlZCBieQotbWVhbnMgb2YKLQotICAgICNpZiBkZWZpbmVkKFBOR19TS0lQX3NSR0JfQ0hFQ0tfUFJPRklMRSkgJiYgXAotICAgICAgICBkZWZpbmVkKFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRCkKLSAgICAgICBwbmdfc2V0X29wdGlvbihwbmdfcHRyLCBQTkdfU0tJUF9zUkdCX0NIRUNLX1BST0ZJTEUsCi0gICAgICAgICAgIFBOR19PUFRJT05fT04pOwotICAgICNlbmRpZgotCi1JdCdzIG5vdCBhIGdvb2QgaWRlYSB0byBkbyB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgdGhlICJzaW1wbGlmaWVkIEFQSSIsCi13aGljaCBuZWVkcyB0byBiZSBhYmxlIHRvIHJlY29nbml6ZSBzUkdCIHByb2ZpbGVzIGNvbnZleWVkIHZpYSB0aGUgaUNDUAotY2h1bmsuCi0KLVRoZSBQTkcgc3BlYyByZXF1aXJlbWVudCB0aGF0IG9ubHkgZ3JheXNjYWxlIHByb2ZpbGVzIG1heSBhcHBlYXIgaW4gaW1hZ2VzCi13aXRoIGNvbG9yIHR5cGUgMCBvciA0IGFuZCB0aGF0IGV2ZW4gaWYgdGhlIGltYWdlIG9ubHkgY29udGFpbnMgZ3JheSBwaXhlbHMsCi1vbmx5IFJHQiBwcm9maWxlcyBtYXkgYXBwZWFyIGluIGltYWdlcyB3aXRoIGNvbG9yIHR5cGUgMiwgMywgb3IgNiwgaXMgbm93Ci1lbmZvcmNlZC4gIFRoZSBzUkdCIGNodW5rIGlzIGFsbG93ZWQgdG8gYXBwZWFyIGluIGltYWdlcyB3aXRoIGFueSBjb2xvciB0eXBlCi1hbmQgaXMgaW50ZXJwcmV0ZWQgYnkgbGlicG5nIHRvIGNvbnZleSBhIG9uZS10cmFjZXItY3VydmUgZ3JheSBwcm9maWxlIG9yIGEKLXRocmVlLXRyYWNlci1jdXJ2ZSBSR0IgcHJvZmlsZSBhcyBhcHByb3ByaWF0ZS4KLQotTGlicG5nIDEuNS54IGVycm9uZW91c2x5IHVzZWQgL01EIGZvciBEZWJ1ZyBETEwgYnVpbGRzOyBpZiB5b3UgdXNlZCB0aGUgZGVidWcKLWJ1aWxkcyBpbiB5b3VyIGFwcCBhbmQgeW91IGNoYW5nZWQgeW91ciBhcHAgdG8gdXNlIC9NRCB5b3Ugd2lsbCBuZWVkIHRvCi1jaGFuZ2UgaXQgYmFjayB0byAvTURkIGZvciBsaWJwbmcgMS42LnguCi0KLVByaW9yIHRvIGxpYnBuZy0xLjYuMCBhIHdhcm5pbmcgd291bGQgYmUgaXNzdWVkIGlmIHRoZSBpVFh0IGNodW5rIGNvbnRhaW5lZAotYW4gZW1wdHkgbGFuZ3VhZ2UgZmllbGQgb3IgYW4gZW1wdHkgdHJhbnNsYXRlZCBrZXl3b3JkLiAgQm90aCBvZiB0aGVzZQotYXJlIGFsbG93ZWQgYnkgdGhlIFBORyBzcGVjaWZpY2F0aW9uLCBzbyB0aGVzZSB3YXJuaW5ncyBhcmUgbm8gbG9uZ2VyIGlzc3VlZC4KLQotVGhlIGxpYnJhcnkgbm93IGlzc3VlcyBhbiBlcnJvciBpZiB0aGUgYXBwbGljYXRpb24gYXR0ZW1wdHMgdG8gc2V0IGEKLXRyYW5zZm9ybSBhZnRlciBpdCBjYWxscyBwbmdfcmVhZF91cGRhdGVfaW5mbygpIG9yIGlmIGl0IGF0dGVtcHRzIHRvIGNhbGwKLWJvdGggcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBhbmQgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvciB0byBjYWxsIGVpdGhlcgotb2YgdGhlbSBtb3JlIHRoYW4gb25jZS4KLQotVGhlIGRlZmF1bHQgY29uZGl0aW9uIGZvciBiZW5pZ25fZXJyb3JzIGlzIG5vdyB0byB0cmVhdCBiZW5pZ24gZXJyb3JzIGFzCi13YXJuaW5ncyB3aGlsZSByZWFkaW5nIGFuZCBhcyBlcnJvcnMgd2hpbGUgd3JpdGluZy4KLQotVGhlIGxpYnJhcnkgbm93IGlzc3VlcyBhIHdhcm5pbmcgaWYgYm90aCBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgYW5kIFJHQiB0bwotZ3JheSBhcmUgdXNlZCB3aGVuIGdhbW1hIGNvcnJlY3Rpb24gaGFwcGVucy4gQXMgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZgotdGhlIGxpYnJhcnkgdGhlIHJlc3VsdHMgYXJlIG51bWVyaWNhbGx5IHZlcnkgaW5jb3JyZWN0IGluIHRoaXMgY2FzZS4KLQotVGhlcmUgYXJlIHNvbWUgbWlub3IgYXJpdGhtZXRpYyBjaGFuZ2VzIGluIHNvbWUgdHJhbnNmb3JtcyBzdWNoIGFzCi1wbmdfc2V0X2JhY2tncm91bmQoKSwgdGhhdCBtaWdodCBiZSBkZXRlY3RlZCBieSBjZXJ0YWluIHJlZ3Jlc3Npb24gdGVzdHMuCi0KLVVua25vd24gY2h1bmsgaGFuZGxpbmcgaGFzIGJlZW4gaW1wcm92ZWQgaW50ZXJuYWxseSwgd2l0aG91dCBhbnkgQVBJIGNoYW5nZS4KLVRoaXMgYWRkcyBtb3JlIGNvcnJlY3Qgb3B0aW9uIGNvbnRyb2wgb2YgdGhlIHVua25vd24gaGFuZGxpbmcsIGNvcnJlY3RzCi1hIHByZS1leGlzdGluZyBidWcgd2hlcmUgdGhlIHBlci1jaHVuayAna2VlcCcgc2V0dGluZyBpcyBpZ25vcmVkLCBhbmQgbWFrZXMKLWl0IHBvc3NpYmxlIHRvIHNraXAgSURBVCBjaHVua3MgaW4gdGhlIHNlcXVlbnRpYWwgcmVhZGVyLgotCi1UaGUgbWFjaGluZS1nZW5lcmF0ZWQgY29uZmlndXJlIGZpbGVzIGFyZSBubyBsb25nZXIgaW5jbHVkZWQgaW4gYnJhbmNoZXMKLWxpYnBuZzE2IGFuZCBsYXRlciBvZiB0aGUgR0lUIHJlcG9zaXRvcnkuICBUaGV5IGNvbnRpbnVlIHRvIGJlIGluY2x1ZGVkCi1pbiB0aGUgdGFyYmFsbCByZWxlYXNlcywgaG93ZXZlci4KLQotTGlicG5nLTEuNi4wIHRocm91Z2ggMS42LjIgdXNlZCB0aGUgQ01GIGJ5dGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIElEQVQKLXN0cmVhbSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciByZWFkaW5nIGluc3RlYWQgb2YgdXNpbmcgdGhlCi1kZWZhdWx0IDMyLWtieXRlIHNsaWRpbmcgd2luZG93IHNpemUuICBJdCB3YXMgZGlzY292ZXJlZCB0aGF0IHRoZXJlIGFyZQotaHVuZHJlZHMgb2YgUE5HIGZpbGVzIGluIHRoZSB3aWxkIHRoYXQgaGF2ZSBpbmNvcnJlY3QgQ01GIGJ5dGVzIHRoYXQgY2F1c2VkCi16bGliIHRvIGlzc3VlIHRoZSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siIGVycm9yIGFuZCByZWplY3QgdGhlIGZpbGUuCi1MaWJwbmctMS42LjMgYW5kIGxhdGVyIGNhbGN1bGF0ZSB0aGVpciBvd24gc2FmZSBDTUYgZnJvbSB0aGUgaW1hZ2UgZGltZW5zaW9ucywKLXByb3ZpZGUgYSB3YXkgdG8gcmV2ZXJ0IHRvIHRoZSBsaWJwbmctMS41LnggYmVoYXZpb3IgKGlnbm9yaW5nIHRoZSBDTUYgYnl0ZXMKLWFuZCB1c2luZyBhIDMyLWtieXRlIHNsaWRpbmcgd2luZG93KSwgYnkgdXNpbmcKLQotICAgIHBuZ19zZXRfb3B0aW9uKHBuZ19wdHIsIFBOR19NQVhJTVVNX0lORkxBVEVfV0lORE9XLAotICAgICAgICBQTkdfT1BUSU9OX09OKTsKLQotYW5kIHByb3ZpZGUgYSB0b29sIChjb250cmliL3Rvb2xzL3BuZ2ZpeCkgZm9yIHJld3JpdGluZyBhIFBORyBmaWxlIHdoaWxlCi1vcHRpbWl6aW5nIHRoZSBDTUYgYnl0ZXMgaW4gaXRzIElEQVQgY2h1bmsgY29ycmVjdGx5LgotCi1MaWJwbmctMS42LjAgYW5kIGxpYnBuZy0xLjYuMSB3cm90ZSB1bmNvbXByZXNzZWQgaVRYdCBjaHVua3Mgd2l0aCB0aGUgd3JvbmcKLWxlbmd0aCwgd2hpY2ggcmVzdWx0ZWQgaW4gUE5HIGZpbGVzIHRoYXQgY2Fubm90IGJlIHJlYWQgYmV5b25kIHRoZSBiYWQgaVRYdAotY2h1bmsuICBUaGlzIGVycm9yIHdhcyBmaXhlZCBpbiBsaWJwbmctMS42LjMsIGFuZCBhIHRvb2wgKGNhbGxlZAotY29udHJpYi90b29scy9wbmctZml4LWl0eHQpIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBsaWJwbmcgZGlzdHJpYnV0aW9uLgotCi1TdGFydGluZyB3aXRoIGxpYnBuZy0xLjYuMTcsIHRoZSBQTkdfU0FGRV9MSU1JVFMgbWFjcm8gd2FzIGVsaW1pbmF0ZWQKLWFuZCBzYWZlIGxpbWl0cyBhcmUgdXNlZCBieSBkZWZhdWx0ICh1c2VycyB3aG8gbmVlZCBsYXJnZXIgbGltaXRzCi1jYW4gc3RpbGwgb3ZlcnJpZGUgdGhlbSBhdCBjb21waWxlIHRpbWUgb3IgcnVuIHRpbWUsIGFzIGRlc2NyaWJlZCBhYm92ZSkuCi0KLVRoZSBuZXcgbGltaXRzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICAgc3BlYyBsaW1pdAotICAgcG5nX3VzZXJfd2lkdGhfbWF4ICAgICAgICAgMSwwMDAsMDAwICAyLDE0Nyw0ODMsNjQ3Ci0gICBwbmdfdXNlcl9oZWlnaHRfbWF4ICAgICAgICAxLDAwMCwwMDAgIDIsMTQ3LDQ4Myw2NDcKLSAgIHBuZ191c2VyX2NodW5rX2NhY2hlX21heCAgICAgICAgIDEyOCAgdW5saW1pdGVkCi0gICBwbmdfdXNlcl9jaHVua19tYWxsb2NfbWF4ICA4LDAwMCwwMDAgIHVubGltaXRlZAotCi1TdGFydGluZyB3aXRoIGxpYnBuZy0xLjYuMTgsIGEgUE5HX1JFTEVBU0VfQlVJTEQgbWFjcm8gd2FzIGFkZGVkLCB3aGljaCBhbGxvd3MKLWxpYnJhcnkgYnVpbGRlcnMgdG8gY29udHJvbCBjb21waWxhdGlvbiBmb3IgYW4gaW5zdGFsbGVkIHN5c3RlbSAoYSByZWxlYXNlIGJ1aWxkKS4KLUl0IGNhbiBiZSBzZXQgZm9yIHRlc3RpbmcgZGVidWcgb3IgYmV0YSBidWlsZHMgdG8gZW5zdXJlIHRoYXQgdGhleSB3aWxsIGNvbXBpbGUKLXdoZW4gdGhlIGJ1aWxkIHR5cGUgaXMgc3dpdGNoZWQgdG8gUkMgb3IgU1RBQkxFLiBJbiBlc3NlbmNlIHRoaXMgb3ZlcnJpZGVzIHRoZQotUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZGlyZWN0bHkgdXNlciBjb250cm9sbGFibGUuCi0KLVN0YXJ0aW5nIHdpdGggbGlicG5nLTEuNi4xOSwgYXR0ZW1wdGluZyB0byBzZXQgYW4gb3Zlci1sZW5ndGggUExURSBjaHVuawotaXMgYW4gZXJyb3IuIFByZXZpb3VzbHkgdGhpcyByZXF1aXJlbWVudCBvZiB0aGUgUE5HIHNwZWNpZmljYXRpb24gd2FzIG5vdAotZW5mb3JjZWQsIGFuZCB0aGUgcGFsZXR0ZSB3YXMgYWx3YXlzIGxpbWl0ZWQgdG8gMjU2IGVudHJpZXMuIEFuIG92ZXItbGVuZ3RoCi1QTFRFIGNodW5rIGZvdW5kIGluIGFuIGlucHV0IFBORyBpcyBzaWxlbnRseSB0cnVuY2F0ZWQuCi0KLVhJSUkuICBEZXRlY3RpbmcgbGlicG5nCi0KLVRoZSBwbmdfZ2V0X2lvX3B0cigpIGZ1bmN0aW9uIGhhcyBiZWVuIHByZXNlbnQgc2luY2UgbGlicG5nLTAuODgsIGhhcyBuZXZlcgotY2hhbmdlZCwgYW5kIGlzIHVuYWZmZWN0ZWQgYnkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gbWFjcm9zLiAgSXQgaXMgdGhlCi1iZXN0IGNob2ljZSBmb3IgdXNlIGluIGNvbmZpZ3VyZSBzY3JpcHRzIGZvciBkZXRlY3RpbmcgdGhlIHByZXNlbmNlIG9mIGFueQotbGlicG5nIHZlcnNpb24gc2luY2UgMC44OC4gIEluIGFuIGF1dG9jb25mICJjb25maWd1cmUuaW4iIHlvdSBjb3VsZCB1c2UKLQotICAgIEFDX0NIRUNLX0xJQihwbmcsIHBuZ19nZXRfaW9fcHRyLCAuLi4KLQotWFYuIFNvdXJjZSBjb2RlIHJlcG9zaXRvcnkKLQotU2luY2UgYWJvdXQgRmVicnVhcnkgMjAwOSwgdmVyc2lvbiAxLjIuMzQsIGxpYnBuZyBoYXMgYmVlbiB1bmRlciAiZ2l0IiBzb3VyY2UKLWNvbnRyb2wuICBUaGUgZ2l0IHJlcG9zaXRvcnkgd2FzIGJ1aWx0IGZyb20gb2xkIGxpYnBuZy14Lnkuei50YXIuZ3ogZmlsZXMKLWdvaW5nIGJhY2sgdG8gdmVyc2lvbiAwLjcwLiAgWW91IGNhbiBhY2Nlc3MgdGhlIGdpdCByZXBvc2l0b3J5IChyZWFkIG9ubHkpCi1hdAotCi0gICAgZ2l0Oi8vZ2l0LmNvZGUuc2YubmV0L3AvbGlicG5nL2NvZGUKLQotb3IgeW91IGNhbiBicm93c2UgaXQgd2l0aCBhIHdlYiBicm93c2VyIGJ5IHNlbGVjdGluZyB0aGUgImNvZGUiIGJ1dHRvbiBhdAotCi0gICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGlicG5nCi0KLVBhdGNoZXMgY2FuIGJlIHNlbnQgdG8gZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQgb3IgdG8KLXBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNvdXJjZWZvcmdlLm5ldCBvciB5b3UgY2FuIHVwbG9hZCB0aGVtIHRvCi10aGUgbGlicG5nIGJ1ZyB0cmFja2VyIGF0Ci0KLSAgICBodHRwOi8vbGlicG5nLnNvdXJjZWZvcmdlLm5ldAotCi1XZSBhbHNvIGFjY2VwdCBwYXRjaGVzIGJ1aWx0IGZyb20gdGhlIHRhciBvciB6aXAgZGlzdHJpYnV0aW9ucywgYW5kCi1zaW1wbGUgdmVyYmFsIGRpc2NyaXB0aW9ucyBvZiBidWcgZml4ZXMsIHJlcG9ydGVkIGVpdGhlciB0byB0aGUKLVNvdXJjZUZvcmdlIGJ1ZyB0cmFja2VyLCB0byB0aGUgcG5nLW1uZy1pbXBsZW1lbnQgYXQgbGlzdHMuc2YubmV0Ci1tYWlsaW5nIGxpc3QsIG9yIGRpcmVjdGx5IHRvIGdsZW5ucnAuCi0KLVhWLiBDb2Rpbmcgc3R5bGUKLQotT3VyIGNvZGluZyBzdHlsZSBpcyBzaW1pbGFyIHRvIHRoZSAiQWxsbWFuIiBzdHlsZQotKFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0luZGVudF9zdHlsZSNBbGxtYW5fc3R5bGUpLCB3aXRoIGN1cmx5Ci1icmFjZXMgb24gc2VwYXJhdGUgbGluZXM6Ci0KLSAgICBpZiAoY29uZGl0aW9uKQotICAgIHsKLSAgICAgICBhY3Rpb247Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoYW5vdGhlciBjb25kaXRpb24pCi0gICAgewotICAgICAgIGFub3RoZXIgYWN0aW9uOwotICAgIH0KLQotVGhlIGJyYWNlcyBjYW4gYmUgb21pdHRlZCBmcm9tIHNpbXBsZSBvbmUtbGluZSBhY3Rpb25zOgotCi0gICAgaWYgKGNvbmRpdGlvbikKLSAgICAgICByZXR1cm4gKDApOwotCi1XZSB1c2UgMy1zcGFjZSBpbmRlbnRhdGlvbiwgZXhjZXB0IGZvciBjb250aW51ZWQgc3RhdGVtZW50cyB3aGljaAotYXJlIHVzdWFsbHkgaW5kZW50ZWQgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHN0YXRlbWVudAotcGx1cyBmb3VyIG1vcmUgc3BhY2VzLgotCi1Gb3IgbWFjcm8gZGVmaW5pdGlvbnMgd2UgdXNlIDItc3BhY2UgaW5kZW50YXRpb24sIGFsd2F5cyBsZWF2aW5nIHRoZSAiIyIKLWluIHRoZSBmaXJzdCBjb2x1bW4uCi0KLSAgICAjaWZuZGVmIFBOR19OT19GRUFUVVJFCi0gICAgIyAgaWZuZGVmIFBOR19GRUFUVVJFX1NVUFBPUlRFRAotICAgICMgICAgZGVmaW5lIFBOR19GRUFUVVJFX1NVUFBPUlRFRAotICAgICMgIGVuZGlmCi0gICAgI2VuZGlmCi0KLUNvbW1lbnRzIGFwcGVhciB3aXRoIHRoZSBsZWFkaW5nICIvKiIgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gYXMKLXRoZSBzdGF0ZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBjb21tZW50OgotCi0gICAgLyogU2luZ2xlLWxpbmUgY29tbWVudCAqLwotICAgIHN0YXRlbWVudDsKLQotICAgIC8qIFRoaXMgaXMgYSBtdWx0aXBsZS1saW5lCi0gICAgICogY29tbWVudC4KLSAgICAgKi8KLSAgICBzdGF0ZW1lbnQ7Ci0KLVZlcnkgc2hvcnQgY29tbWVudHMgY2FuIGJlIHBsYWNlZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBzdGF0ZW1lbnQKLXRvIHdoaWNoIHRoZXkgcGVydGFpbjoKLQotICAgIHN0YXRlbWVudDsgICAgLyogY29tbWVudCAqLwotCi1XZSBkb24ndCB1c2UgQysrIHN0eWxlICgiLy8iKSBjb21tZW50cy4gV2UgaGF2ZSwgaG93ZXZlciwKLXVzZWQgdGhlbSBpbiB0aGUgcGFzdCBpbiBzb21lIG5vdy1hYmFuZG9uZWQgTU1YIGFzc2VtYmxlcgotY29kZS4KLQotRnVuY3Rpb25zIGFuZCB0aGVpciBjdXJseSBicmFjZXMgYXJlIG5vdCBpbmRlbnRlZCwgYW5kCi1leHBvcnRlZCBmdW5jdGlvbnMgYXJlIG1hcmtlZCB3aXRoIFBOR0FQSToKLQotIC8qIFRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb24gdGhhdCBpcyB2aXNpYmxlIHRvCi0gICogYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMuIEl0IGRvZXMgdGh1cy1hbmQtc28uCi0gICovCi0gdm9pZCBQTkdBUEkKLSBwbmdfZXhwb3J0ZWRfZnVuY3Rpb24ocG5nX3B0ciwgcG5nX2luZm8sIGZvbykKLSB7Ci0gICAgYm9keTsKLSB9Ci0KLVRoZSByZXR1cm4gdHlwZSBhbmQgZGVjb3JhdGlvbnMgYXJlIHBsYWNlZCBvbiBhIHNlcGFyYXRlIGxpbmUKLWFoZWFkIG9mIHRoZSBmdW5jdGlvbiBuYW1lLCBhcyBpbGx1c3RyYXRlZCBhYm92ZS4KLQotVGhlIHByb3RvdHlwZXMgZm9yIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgYXBwZWFyIGluIHBuZy5oLAotYWJvdmUgdGhlIGNvbW1lbnQgdGhhdCBzYXlzCi0KLSAgICAvKiBNYWludGFpbmVyOiBQdXQgbmV3IHB1YmxpYyBwcm90b3R5cGVzIGhlcmUgLi4uICovCi0KLVdlIG1hcmsgYWxsIG5vbi1leHBvcnRlZCBmdW5jdGlvbnMgd2l0aCAiLyogUFJJVkFURSAqLyIiOgotCi0gdm9pZCAvKiBQUklWQVRFICovCi0gcG5nX25vbl9leHBvcnRlZF9mdW5jdGlvbihwbmdfcHRyLCBwbmdfaW5mbywgZm9vKQotIHsKLSAgICBib2R5OwotIH0KLQotVGhlIHByb3RvdHlwZXMgZm9yIG5vbi1leHBvcnRlZCBmdW5jdGlvbnMgKGV4Y2VwdCBmb3IgdGhvc2UgaW4KLXBuZ3Rlc3QpIGFwcGVhciBpbiBwbmdwcml2LmggYWJvdmUgdGhlIGNvbW1lbnQgdGhhdCBzYXlzCi0KLSAgLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwcml2YXRlIHByb3RvdHlwZXMgaGVyZSBeICovCi0KLVRvIGF2b2lkIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgdGhlIG5hbWVzIG9mIGFsbCBleHBvcnRlZAotZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYmVnaW4gd2l0aCAicG5nXyIsIGFuZCBhbGwgcHVibGljbHkgdmlzaWJsZSBDCi1wcmVwcm9jZXNzb3IgbWFjcm9zIGJlZ2luIHdpdGggIlBORyIuICBXZSByZXF1ZXN0IHRoYXQgYXBwbGljYXRpb25zIHRoYXQKLXVzZSBsaWJwbmcgKm5vdCogYmVnaW4gYW55IG9mIHRoZWlyIG93biBzeW1ib2xzIHdpdGggZWl0aGVyIG9mIHRoZXNlIHN0cmluZ3MuCi0KLVdlIHB1dCBhIHNwYWNlIGFmdGVyIHRoZSAic2l6ZW9mIiBvcGVyYXRvciBhbmQgd2Ugb21pdCB0aGUKLW9wdGlvbmFsIHBhcmVudGhlc2VzIGFyb3VuZCBpdHMgYXJndW1lbnQgd2hlbiB0aGUgYXJndW1lbnQKLWlzIGFuIGV4cHJlc3Npb24sIG5vdCBhIHR5cGUgbmFtZSwgYW5kIHdlIGFsd2F5cyBlbmNsb3NlIHRoZQotc2l6ZW9mIG9wZXJhdG9yLCB3aXRoIGl0cyBhcmd1bWVudCwgaW4gcGFyZW50aGVzZXM6Ci0KLSAgKHNpemVvZiAocG5nX3VpbnRfMzIpKQotICAoc2l6ZW9mIGFycmF5KQotCi1QcmlvciB0byBsaWJwbmctMS42LjAgd2UgdXNlZCBhICJwbmdfc2l6ZW9mKCkiIG1hY3JvLCBmb3JtYXR0ZWQgYXMKLXRob3VnaCBpdCB3ZXJlIGEgZnVuY3Rpb24uCi0KLUNvbnRyb2wga2V5d29yZHMgaWYsIGZvciwgd2hpbGUsIGFuZCBzd2l0Y2ggYXJlIGFsd2F5cyBmb2xsb3dlZCBieSBhIHNwYWNlCi10byBkaXN0aW5ndWlzaCB0aGVtIGZyb20gZnVuY3Rpb24gY2FsbHMsIHdoaWNoIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UuIAotCi1XZSBwdXQgYSBzcGFjZSBhZnRlciBlYWNoIGNvbW1hIGFuZCBhZnRlciBlYWNoIHNlbWljb2xvbgotaW4gImZvciIgc3RhdGVtZW50cywgYW5kIHdlIHB1dCBzcGFjZXMgYmVmb3JlIGFuZCBhZnRlciBlYWNoCi1DIGJpbmFyeSBvcGVyYXRvciBhbmQgYWZ0ZXIgImZvciIgb3IgIndoaWxlIiwgYW5kIGJlZm9yZQotIj8iLiAgV2UgZG9uJ3QgcHV0IGEgc3BhY2UgYmV0d2VlbiBhIHR5cGVjYXN0IGFuZCB0aGUgZXhwcmVzc2lvbgotYmVpbmcgY2FzdCwgbm9yIGRvIHdlIHB1dCBvbmUgYmV0d2VlbiBhIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZQotbGVmdCBwYXJlbnRoZXNpcyB0aGF0IGZvbGxvd3MgaXQ6Ci0KLSAgICBmb3IgKGkgPSAyOyBpID4gMDsgLS1pKQotICAgICAgIHlbaV0gPSBhKHgpICsgKGludCliOwotCi1XZSBwcmVmZXIgI2lmZGVmIGFuZCAjaWZuZGVmIHRvICNpZiBkZWZpbmVkKCkgYW5kICNpZiAhZGVmaW5lZCgpCi13aGVuIHRoZXJlIGlzIG9ubHkgb25lIG1hY3JvIGJlaW5nIHRlc3RlZC4gIFdlIGFsd2F5cyB1c2UgcGFyZW50aGVzZXMKLXdpdGggImRlZmluZWQiLgotCi1XZSBleHByZXNzIGludGVnZXIgY29uc3RhbnRzIHRoYXQgYXJlIHVzZWQgYXMgYml0IG1hc2tzIGluIGhleCBmb3JtYXQsCi13aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIGxvd2VyLWNhc2UgaGV4IGRpZ2l0cywgYW5kIHRvIG1ha2UgdGhlbSB1bnNpZ25lZAotKGUuZy4sIDB4MDBVLCAweGZmVSwgMHgwMTAwVSkgYW5kIGxvbmcgaWYgdGhleSBhcmUgZ3JlYXRlciB0aGFuIDB4N2ZmZgotKGUuZy4sIDB4ZmZmZlVMKS4KLQotV2UgcHJlZmVyIHRvIHVzZSB1bmRlcnNjb3JlcyByYXRoZXIgdGhhbiBjYW1lbENhc2UgaW4gbmFtZXMsIGV4Y2VwdAotZm9yIGEgZmV3IHR5cGUgbmFtZXMgdGhhdCB3ZSBpbmhlcml0IGZyb20gemxpYi5oLgotCi1XZSBwcmVmZXIgImlmIChzb21ldGhpbmcgIT0gMCkiIGFuZCAiaWYgKHNvbWV0aGluZyA9PSAwKSIKLW92ZXIgImlmIChzb21ldGhpbmcpIiBhbmQgaWYgIighc29tZXRoaW5nKSIsIHJlc3BlY3RpdmVseS4KLQotV2UgZG8gbm90IHVzZSB0aGUgVEFCIGNoYXJhY3RlciBmb3IgaW5kZW50YXRpb24gaW4gdGhlIEMgc291cmNlcy4KLQotTGluZXMgZG8gbm90IGV4Y2VlZCA4MCBjaGFyYWN0ZXJzLgotCi1PdGhlciBydWxlcyBjYW4gYmUgaW5mZXJyZWQgYnkgaW5zcGVjdGluZyB0aGUgbGlicG5nIHNvdXJjZS4KLQotWFZJLiBZMksgQ29tcGxpYW5jZSBpbiBsaWJwbmcKLQotU2luY2UgdGhlIFBORyBEZXZlbG9wbWVudCBncm91cCBpcyBhbiBhZC1ob2MgYm9keSwgd2UgY2FuJ3QgbWFrZQotYW4gb2ZmaWNpYWwgZGVjbGFyYXRpb24uCi0KLVRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKLXVwd2FyZCB0aHJvdWdoIDEuNi4yNCBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0IGVhcmxpZXIKLXZlcnNpb25zIHdlcmUgYWxzbyBZMksgY29tcGxpYW50LgotCi1MaWJwbmcgb25seSBoYXMgdHdvIHllYXIgZmllbGRzLiAgT25lIGlzIGEgMi1ieXRlIHVuc2lnbmVkIGludGVnZXIKLXRoYXQgd2lsbCBob2xkIHllYXJzIHVwIHRvIDY1NTM1LiAgVGhlIG90aGVyLCB3aGljaCBpcyBkZXByZWNhdGVkLAotaG9sZHMgdGhlIGRhdGUgaW4gdGV4dCBmb3JtYXQsIGFuZCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gOTk5OS4KLQotVGhlIGludGVnZXIgaXMKLSAgICAicG5nX3VpbnRfMTYgeWVhciIgaW4gcG5nX3RpbWVfc3RydWN0LgotCi1UaGUgc3RyaW5nIGlzCi0gICAgImNoYXIgdGltZV9idWZmZXJbMjldIiBpbiBwbmdfc3RydWN0LiAgVGhpcyBpcyBubyBsb25nZXIgdXNlZAotaW4gbGlicG5nLTEuNi54IGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBsaWJwbmctMS43LjAuCi0KLVRoZXJlIGFyZSBzZXZlbiB0aW1lLXJlbGF0ZWQgZnVuY3Rpb25zOgotCi0gICAgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjNfYnVmZmVyKCkgaW4gcG5nLmMKLSAgICAgIChmb3JtZXJseSBwbmdfY29udmVydF90b19yZmNfMTE1MigpIGluIGVycm9yLCBhbmQKLSAgICAgIGFsc28gZm9ybWVybHkgcG5nX2NvbnZlcnRfdG9fcmZjXzExMjMoKSkKLSAgICBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGluIHBuZ3dyaXRlLmMsIGNhbGxlZAotICAgICAgaW4gcG5nd3JpdGUuYwotICAgIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90KCkgaW4gcG5nd3JpdGUuYwotICAgIHBuZ19nZXRfdElNRSgpIGluIHBuZ2dldC5jCi0gICAgcG5nX2hhbmRsZV90SU1FKCkgaW4gcG5ncnV0aWwuYywgY2FsbGVkIGluIHBuZ3JlYWQuYwotICAgIHBuZ19zZXRfdElNRSgpIGluIHBuZ3NldC5jCi0gICAgcG5nX3dyaXRlX3RJTUUoKSBpbiBwbmd3dXRpbC5jLCBjYWxsZWQgaW4gcG5nd3JpdGUuYwotCi1BbGwgYXBwZWFyIHRvIGhhbmRsZSBkYXRlcyBwcm9wZXJseSBpbiBhIFkySyBlbnZpcm9ubWVudC4gIFRoZQotcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmdW5jdGlvbiBjYWxscyBnbXRpbWUoKSB0byBjb252ZXJ0IGZyb20gc3lzdGVtCi1jbG9jayB0aW1lLCB3aGljaCByZXR1cm5zICh5ZWFyIC0gMTkwMCksIHdoaWNoIHdlIHByb3Blcmx5IGNvbnZlcnQgdG8KLXRoZSBmdWxsIDQtZGlnaXQgeWVhci4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhcHBsaWNhdGlvbnMgdXNpbmcKLWxpYnBuZyBhcmUgbm90IHBhc3NpbmcgNC1kaWdpdCB5ZWFycyBpbnRvIHRoZSBwbmdfY29udmVydF90b19yZmNfMTEyMygpCi1mdW5jdGlvbiwgb3IgdGhhdCB0aGV5IGFyZSBpbmNvcnJlY3RseSBwYXNzaW5nIG9ubHkgYSAyLWRpZ2l0IHllYXIKLWluc3RlYWQgb2YgInllYXIgLSAxOTAwIiBpbnRvIHRoZSBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSgpIGZ1bmN0aW9uLAotYnV0IHRoaXMgaXMgbm90IHVuZGVyIG91ciBjb250cm9sLiAgVGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uIGhhcyBhbHdheXMKLXN0YXRlZCB0aGF0IGl0IHdvcmtzIHdpdGggNC1kaWdpdCB5ZWFycywgYW5kIHRoZSBBUElzIGhhdmUgYmVlbgotZG9jdW1lbnRlZCBhcyBzdWNoLgotCi1UaGUgdElNRSBjaHVuayBpdHNlbGYgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgdXNlcyBhIDItYnl0ZSB1bnNpZ25lZAotaW50ZWdlciB0byBob2xkIHRoZSB5ZWFyLCBhbmQgY2FuIGhvbGQgeWVhcnMgYXMgbGFyZ2UgYXMgNjU1MzUuCi0KLXpsaWIsIHVwb24gd2hpY2ggbGlicG5nIGRlcGVuZHMsIGlzIGFsc28gWTJLIGNvbXBsaWFudC4gIEl0IGNvbnRhaW5zCi1ubyBkYXRlLXJlbGF0ZWQgY29kZS4KLQotCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAgIGxpYnBuZyBtYWludGFpbmVyCi0gICBQTkcgRGV2ZWxvcG1lbnQgR3JvdXAKZGlmZiAtLWdpdCBhL2xpYnBuZy4zIGIvbGlicG5nLjMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjJkZjYuLjAwMDAwMDAKLS0tIGEvbGlicG5nLjMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTc0ICswLDAgQEAKLS5USCBMSUJQTkcgMyAiQXVndXN0IDQsIDIwMTYiCi0uU0ggTkFNRQotbGlicG5nIFwtIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgUmVmZXJlbmNlIExpYnJhcnkgMS42LjI0Ci0uU0ggU1lOT1BTSVMKLVxmQgotI2luY2x1ZGUgPHBuZy5oPlxmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyIFxmSSh2b2lkXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfYmVuaWduX2Vycm9yIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJZXJyb3JcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZSAoaW50IFxmUFxmSWJpdF9kZXB0aFxmUFxmQiwgcG5nX2NvbG9ycCBcZklwYWxldHRlXGZQXGZCKTtcZlAKLQotXGZCcG5nX3ZvaWRwIHBuZ19jYWxsb2MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19hbGxvY19zaXplX3QgXGZJc2l6ZVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX2NodW5rX2Jlbmlnbl9lcnJvciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2NoYXJwIFxmSWVycm9yXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfY2h1bmtfZXJyb3IgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkllcnJvclxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX2NodW5rX3dhcm5pbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZkltZXNzYWdlXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfY29udmVydF9mcm9tX3N0cnVjdF90bSAocG5nX3RpbWVwIFxmUFxmSXB0aW1lXGZQXGZCLCBzdHJ1Y3QgdG0gRkFSICogXGZJdHRpbWVcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19jb252ZXJ0X2Zyb21fdGltZV90IChwbmdfdGltZXAgXGZQXGZJcHRpbWVcZlBcZkIsIHRpbWVfdCBcZkl0dGltZVxmUFxmQik7XGZQCi0KLVxmQnBuZ19jaGFycCBwbmdfY29udmVydF90b19yZmMxMTIzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdGltZXAgXGZJcHRpbWVcZlBcZkIpO1xmUAotCi1cZkJwbmdfaW5mb3AgcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QgKHBuZ19jb25zdF9jaGFycCBcZlBcZkl1c2VyX3BuZ192ZXJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkllcnJvcl9wdHJcZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZQXGZJZXJyb3JfZm5cZlBcZkIsIHBuZ19lcnJvcl9wdHIgXGZJd2Fybl9mblxmUFxmQik7XGZQCi0KLVxmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMiAocG5nX2NvbnN0X2NoYXJwIFxmUFxmSXVzZXJfcG5nX3ZlclxmUFxmQiwgcG5nX3ZvaWRwIFxmUFxmSWVycm9yX3B0clxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkllcnJvcl9mblxmUFxmQiwgcG5nX2Vycm9yX3B0ciBcZlBcZkl3YXJuX2ZuXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJbWVtX3B0clxmUFxmQiwgcG5nX21hbGxvY19wdHIgXGZQXGZJbWFsbG9jX2ZuXGZQXGZCLCBwbmdfZnJlZV9wdHIgXGZJZnJlZV9mblxmUFxmQik7XGZQCi0KLVxmQnBuZ19zdHJ1Y3RwIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0IChwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmSXdhcm5fZm5cZlBcZkIpO1xmUAotCi1cZkJwbmdfc3RydWN0cCBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yIChwbmdfY29uc3RfY2hhcnAgXGZQXGZJdXNlcl9wbmdfdmVyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSXdhcm5fZm5cZlBcZkIsIHBuZ192b2lkcCBcZlBcZkltZW1fcHRyXGZQXGZCLCBwbmdfbWFsbG9jX3B0ciBcZlBcZkltYWxsb2NfZm5cZlBcZkIsIHBuZ19mcmVlX3B0ciBcZklmcmVlX2ZuXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfZGF0YV9mcmVlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJZnJlZXJcZlBcZkIsIHBuZ191aW50XzMyIFxmSW1hc2spXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wcCBcZklpbmZvX3B0cl9wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0IChwbmdfc3RydWN0cHAgXGZQXGZJcG5nX3B0cl9wdHJcZlBcZkIsIHBuZ19pbmZvcHAgXGZQXGZJaW5mb19wdHJfcHRyXGZQXGZCLCBwbmdfaW5mb3BwIFxmSWVuZF9pbmZvX3B0cl9wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAocG5nX3N0cnVjdHBwIFxmUFxmSXBuZ19wdHJfcHRyXGZQXGZCLCBwbmdfaW5mb3BwIFxmSWluZm9fcHRyX3B0clxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX2VyciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX2Vycm9yIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJZXJyb3JcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19mcmVlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZJcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfZnJlZV9jaHVua19saXN0IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfZnJlZV9kZWZhdWx0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZJcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfZnJlZV9kYXRhIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZkludW1cZlBcZkIpO1xmUAotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2JpdF9kZXB0aCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9iS0dEIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJKmJhY2tncm91bmRcZlBcZkIpO1xmUAotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2NoYW5uZWxzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NIUk0gKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgZG91YmxlIFxmUFxmSSp3aGl0ZV94XGZQXGZCLCBkb3VibGUgXGZQXGZJKndoaXRlX3lcZlBcZkIsIGRvdWJsZSBcZlBcZkkqcmVkX3hcZlBcZkIsIGRvdWJsZSBcZlBcZkkqcmVkX3lcZlBcZkIsIGRvdWJsZSBcZlBcZkkqZ3JlZW5feFxmUFxmQiwgZG91YmxlIFxmUFxmSSpncmVlbl95XGZQXGZCLCBkb3VibGUgXGZQXGZJKmJsdWVfeFxmUFxmQiwgZG91YmxlIFxmSSpibHVlX3lcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2NIUk1fZml4ZWQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKndoaXRlX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSp3aGl0ZV95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqcmVkX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZWRfeVxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKmdyZWVuX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpncmVlbl95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqYmx1ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZkkqYmx1ZV95XGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jSFJNX1hZWiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJKnJlZF9YXGZQXGZCLCBkb3VibGUgXGZQXGZJKnJlZF9ZXGZQXGZCLCBkb3VibGUgXGZQXGZJKnJlZF9aXGZQXGZCLCBkb3VibGUgXGZQXGZJKmdyZWVuX1hcZlBcZkIsIGRvdWJsZSBcZlBcZkkqZ3JlZW5fWVxmUFxmQiwgZG91YmxlIFxmUFxmSSpncmVlbl9aXGZQXGZCLCBkb3VibGUgXGZQXGZJKmJsdWVfWFxmUFxmQiwgZG91YmxlIFxmUFxmSSpibHVlX1lcZlBcZkIsIGRvdWJsZSBcZkkqYmx1ZV9aXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jSFJNX1hZWl9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJKmludF9yZWRfWFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSSppbnRfcmVkX1lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZkkqaW50X3JlZF9aXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJKmludF9ncmVlbl9YXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJKmludF9ncmVlbl9ZXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJKmludF9ncmVlbl9aXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJKmludF9ibHVlX1hcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZkkqaW50X2JsdWVfWVxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmSSppbnRfYmx1ZV9aXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jaHVua19jYWNoZV9tYXggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfYWxsb2Nfc2l6ZV90IHBuZ19nZXRfY2h1bmtfbWFsbG9jX21heCAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfY29sb3JfdHlwZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9jb3B5cmlnaHQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlciBcZkkocG5nX2NvbnN0X3N0cnVjdHBcZlBcZkIpO1xmUAotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIgXGZJKHBuZ19jb25zdF9zdHJ1Y3RwXGZQXGZCKTtcZlAKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfZXJyb3JfcHRyIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9maWx0ZXJfdHlwZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9nQU1BIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZkkqZmlsZV9nYW1tYVxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfZ0FNQV9maXhlZCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZkkqaW50X2ZpbGVfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2hlYWRlcl92ZXIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9oSVNUIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzE2cCBcZkkqaGlzdFxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfaUNDUCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY2hhcnBwIFxmUFxmSW5hbWVcZlBcZkIsIGludCBcZlBcZkkqY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgcG5nX2J5dGVwcCBcZlBcZklwcm9maWxlXGZQXGZCLCBwbmdfdWludF8zMiBcZkkqcHJvZmxlblxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfSUhEUiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqd2lkdGhcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpoZWlnaHRcZlBcZkIsIGludCBcZlBcZkkqYml0X2RlcHRoXGZQXGZCLCBpbnQgXGZQXGZJKmNvbG9yX3R5cGVcZlBcZkIsIGludCBcZlBcZkkqaW50ZXJsYWNlX3R5cGVcZlBcZkIsIGludCBcZlBcZkkqY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgaW50IFxmSSpmaWx0ZXJfdHlwZVxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfaW1hZ2VfaGVpZ2h0IChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X2ltYWdlX3dpZHRoIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfaW50XzMyIHBuZ19nZXRfaW50XzMyIChwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKLQotXGZCcG5nX2J5dGUgcG5nX2dldF9pbnRlcmxhY2VfdHlwZSAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pb19jaHVua190eXBlIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfaW9fcHRyIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9pb19zdGF0ZSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ19ieXRlIHBuZ19nZXRfbGlicG5nX3ZlciAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQmludCBwbmdfZ2V0X3BhbGV0dGVfbWF4KHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ192b2lkcCBwbmdfZ2V0X21lbV9wdHIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X29GRnMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKm9mZnNldF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkkqb2Zmc2V0X3lcZlBcZkIsIGludCBcZkkqdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9wQ0FMIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jaGFycCBcZlBcZkkqcHVycG9zZVxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZkkqWDBcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJKlgxXGZQXGZCLCBpbnQgXGZQXGZJKnR5cGVcZlBcZkIsIGludCBcZlBcZkkqbnBhcmFtc1xmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSSp1bml0c1xmUFxmQiwgcG5nX2NoYXJwcCBcZkkqcGFyYW1zXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9wSFlzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZXNfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlc195XGZQXGZCLCBpbnQgXGZJKnVuaXRfdHlwZVxmUFxmQik7XGZQCi0KLVxmQmZsb2F0IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3BIWXNfZHBpIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSSpyZXNfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJKnJlc195XGZQXGZCLCBpbnQgXGZJKnVuaXRfdHlwZVxmUFxmQik7XGZQCi0KLVxmQnBuZ19maXhlZF9wb2ludCBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpb19maXhlZCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9waXhlbHNfcGVyX2luY2ggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlciAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyIChwbmdfY29uc3Rfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF9QTFRFIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJKnBhbGV0dGVcZlBcZkIsIGludCBcZkkqbnVtX3BhbGV0dGVcZlBcZkIpO1xmUAotCi1cZkJwbmdfYnl0ZSBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfcm93Ynl0ZXMgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ19ieXRlcHAgcG5nX2dldF9yb3dzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3NCSVQgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2NvbG9yXzhwIFxmSSpzaWdfYml0XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfZ2V0X3NDQUwgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50KiBcZlBcZkl1bml0XGZQXGZCLCBkb3VibGUqIFxmUFxmSXdpZHRoXGZQXGZCLCBkb3VibGUqIFxmSWhlaWdodFxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX2dldF9zQ0FMX2ZpeGVkIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCogXGZQXGZJdW5pdFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50cCBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50cCBcZkloZWlnaHRcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19nZXRfc0NBTF9zIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCogXGZQXGZJdW5pdFxmUFxmQiwgcG5nX2NoYXJwcCBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX2NoYXJwcCBcZkloZWlnaHRcZlBcZkIpO1xmUAotCi1cZkJwbmdfYnl0ZXAgcG5nX2dldF9zaWduYXR1cmUgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfc1BMVCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfc3BhbGV0dGVfcCBcZkkqc3BsdF9wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3NSR0IgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmSSpmaWxlX3NyZ2JfaW50ZW50XGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF90ZXh0IChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ190ZXh0cCBcZlBcZkkqdGV4dF9wdHJcZlBcZkIsIGludCBcZkkqbnVtX3RleHRcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3RJTUUgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RpbWVwIFxmSSptb2RfdGltZVxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdFJOUyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJKnRyYW5zX2FscGhhXGZQXGZCLCBpbnQgXGZQXGZJKm51bV90cmFuc1xmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkkqdHJhbnNfY29sb3JcZlBcZkIpO1xmUAotCi1cZkIvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBhbiBpbmxpbmUgbWFjcm8uIFxmSSovCi0KLVxmQnBuZ191aW50XzE2IHBuZ19nZXRfdWludF8xNiAocG5nX2J5dGVwIFxmSWJ1ZlxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdWludF8zMSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmSWJ1ZlxmUFxmQik7XGZQCi0KLVxmQi8qIFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGFuIGlubGluZSBtYWNyby4gXGZJKi8KLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91aW50XzMyIChwbmdfYnl0ZXAgXGZJYnVmXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF91bmtub3duX2NodW5rcyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdW5rbm93bl9jaHVua3BwIFxmSXVua25vd25zXGZQXGZCKTtcZlAKLQotXGZCcG5nX3ZvaWRwIHBuZ19nZXRfdXNlcl9jaHVua19wdHIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ192b2lkcCBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0ciAocG5nX2NvbnN0X3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ191aW50XzMyIHBuZ19nZXRfdXNlcl93aWR0aF9tYXggKHBuZ19jb25zdF9zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3ZhbGlkIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSWZsYWdcZlBcZkIpO1xmUAotCi1cZkJmbG9hdCBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX2ZpeGVkX3BvaW50IHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfaW50XzMyIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX2ludF8zMiBwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscyAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaCAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIgKHBuZ19jb25zdF9zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQmZsb2F0IHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfZml4ZWRfcG9pbnQgcG5nX2dldF95X29mZnNldF9pbmNoZXNfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb25zdF9pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQnBuZ19pbnRfMzIgcG5nX2dldF95X29mZnNldF9taWNyb25zIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfaW50XzMyIHBuZ19nZXRfeV9vZmZzZXRfcGl4ZWxzIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoIChwbmdfY29uc3Rfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfZ2V0X3lfcGl4ZWxzX3Blcl9tZXRlciAocG5nX2NvbnN0X3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbnN0X2luZm9wIFxmSWluZm9fcHRyXGZQXGZCKTtcZlAKLQotXGZCaW50IHBuZ19oYW5kbGVfYXNfdW5rbm93biAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmSWNodW5rX25hbWVcZlBcZkIpO1xmUAotCi1cZkJpbnQgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlIChwbmdfaW1hZ2VwIFxmUFxmSWltYWdlXGZQXGZCLCBjb25zdCBjaGFyIFxmSSpmaWxlX25hbWVcZlBcZkIpO1xmUAotCi1cZkJpbnQgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbyAocG5nX2ltYWdlcCBcZlBcZklpbWFnZVxmUFxmQiwgRklMRSogXGZJZmlsZVxmUFxmQik7XGZQCi0KLVxmQmludCwgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnkgKHBuZ19pbWFnZXAgXGZQXGZJaW1hZ2VcZlBcZkIsIHBuZ19jb25zdF92b2lkcCBcZlBcZkltZW1vcnlcZlBcZkIsIHBuZ19zaXplX3QgXGZJc2l6ZVxmUFxmQik7XGZQCi0KLVxmQmludCBwbmdfaW1hZ2VfZmluaXNoX3JlYWQgKHBuZ19pbWFnZXAgXGZQXGZJaW1hZ2VcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJYmFja2dyb3VuZFxmUFxmQiwgdm9pZCBcZlBcZkkqYnVmZmVyXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSXJvd19zdHJpZGVcZlBcZkIsIHZvaWQgXGZJKmNvbG9ybWFwXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfaW1hZ2VfZnJlZSAocG5nX2ltYWdlcCBcZklpbWFnZVxmUFxmQik7XGZQCi0KLVxmQmludCBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSAocG5nX2ltYWdlcCBcZlBcZklpbWFnZVxmUFxmQiwgY29uc3QgY2hhciBcZlBcZkkqZmlsZVxmUFxmQiwgaW50IFxmUFxmSWNvbnZlcnRfdG9fOGJpdFxmUFxmQiwgY29uc3Qgdm9pZCBcZlBcZkkqYnVmZmVyXGZQXGZCLCBwbmdfaW50XzMyIFxmUFxmSXJvd19zdHJpZGVcZlBcZkIsIHZvaWQgXGZJKmNvbG9ybWFwXGZQXGZCKTtcZlAKLQotXGZCaW50IHBuZ19pbWFnZV93cml0ZV90b19tZW1vcnkgKHBuZ19pbWFnZXAgXGZQXGZJaW1hZ2VcZlBcZkIsIHZvaWQgXGZQXGZJKm1lbW9yeVxmUFxmQiwgcG5nX2FsbG9jX3NpemVfdCAqIFBOR19SRVNUUklDVCBcZlBcZkltZW1vcnlfYnl0ZXNcZlBcZkIsIGludCBcZlBcZkljb252ZXJ0X3RvXzhfYml0XGZQXGZCLCBjb25zdCB2b2lkIFxmUFxmSSpidWZmZXJcZlBcZkIsIHBuZ19pbnRfMzIgXGZQXGZJcm93X3N0cmlkZVxmUFxmQiwgY29uc3Qgdm9pZCBcZkkqY29sb3JtYXApXGZQXGZCKTtcZlAKLQotXGZCaW50IHBuZ19pbWFnZV93cml0ZV90b19zdGRpbyAocG5nX2ltYWdlcCBcZlBcZklpbWFnZVxmUFxmQiwgRklMRSBcZlBcZkkqZmlsZVxmUFxmQiwgaW50IFxmUFxmSWNvbnZlcnRfdG9fOF9iaXRcZlBcZkIsIGNvbnN0IHZvaWQgXGZQXGZJKmJ1ZmZlclxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZklyb3dfc3RyaWRlXGZQXGZCLCB2b2lkIFxmSSpjb2xvcm1hcClcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19pbmZvX2luaXRfMyAocG5nX2luZm9wcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3NpemVfdCBcZklwbmdfaW5mb19zdHJ1Y3Rfc2l6ZVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX2luaXRfaW8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIEZJTEUgXGZJKmZwXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfbG9uZ2ptcCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSXZhbFxmUFxmQik7XGZQCi0KLVxmQnBuZ192b2lkcCBwbmdfbWFsbG9jIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYWxsb2Nfc2l6ZV90IFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZkJwbmdfdm9pZHAgcG5nX21hbGxvY19kZWZhdWx0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYWxsb2Nfc2l6ZV90IFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZkJwbmdfdm9pZHAgcG5nX21hbGxvY193YXJuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYWxsb2Nfc2l6ZV90IFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfcGVybWl0X21uZ19mZWF0dXJlcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbW5nX2ZlYXR1cmVzX3Blcm1pdHRlZFxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3Byb2Nlc3NfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJYnVmZmVyXGZQXGZCLCBwbmdfc2l6ZV90IFxmSWJ1ZmZlcl9zaXplXGZQXGZCKTtcZlAKLQotXGZCcG5nX3NpemVfdCBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlIFxmUFxmSShwbmdfc3RydWN0cFxmUFxmQiwgaW50IFxmSXNhdmVcZlBcZkIpO1xmUAotCi1cZkJwbmdfdWludF8zMiBwbmdfcHJvY2Vzc19kYXRhX3NraXAgXGZJKHBuZ19zdHJ1Y3RwXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZklvbGRfcm93XGZQXGZCLCBwbmdfYnl0ZXAgXGZJbmV3X3Jvd1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3JlYWRfZW5kIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19yZWFkX2ltYWdlIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXBwIFxmSWltYWdlXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfcmVhZF9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19yZWFkX3BuZyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdHJhbnNmb3Jtc1xmUFxmQiwgcG5nX3ZvaWRwIFxmSXBhcmFtc1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3JlYWRfcm93IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJcm93XGZQXGZCLCBwbmdfYnl0ZXAgXGZJZGlzcGxheV9yb3dcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19yZWFkX3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZQXGZJcm93XGZQXGZCLCBwbmdfYnl0ZXBwIFxmUFxmSWRpc3BsYXlfcm93XGZQXGZCLCBwbmdfdWludF8zMiBcZkludW1fcm93c1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3JlYWRfdXBkYXRlX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQmludCBwbmdfcmVzZXRfenN0cmVhbSAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NhdmVfaW50XzMyIChwbmdfYnl0ZXAgXGZQXGZJYnVmXGZQXGZCLCBwbmdfaW50XzMyIFxmSWlcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zYXZlX3VpbnRfMTYgKHBuZ19ieXRlcCBcZlBcZklidWZcZlBcZkIsIHVuc2lnbmVkIGludCBcZklpXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2F2ZV91aW50XzMyIChwbmdfYnl0ZXAgXGZQXGZJYnVmXGZQXGZCLCBwbmdfdWludF8zMiBcZklpXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2FkZF9hbHBoYSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZmlsbGVyXGZQXGZCLCBpbnQgXGZJZmxhZ3NcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfYWxwaGFfbW9kZSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSW1vZGVcZlBcZkIsIGRvdWJsZSBcZklvdXRwdXRfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfYWxwaGFfbW9kZV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSW1vZGVcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZklvdXRwdXRfZ2FtbWFcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfYmFja2dyb3VuZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZlBcZkliYWNrZ3JvdW5kX2NvbG9yXGZQXGZCLCBpbnQgXGZQXGZJYmFja2dyb3VuZF9nYW1tYV9jb2RlXGZQXGZCLCBpbnQgXGZQXGZJbmVlZF9leHBhbmRcZlBcZkIsIGRvdWJsZSBcZkliYWNrZ3JvdW5kX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2JhY2tncm91bmRfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZQXGZJYmFja2dyb3VuZF9jb2xvclxmUFxmQiwgaW50IFxmUFxmSWJhY2tncm91bmRfZ2FtbWFfY29kZVxmUFxmQiwgaW50IFxmUFxmSW5lZWRfZXhwYW5kXGZQXGZCLCBwbmdfdWludF8zMiBcZkliYWNrZ3JvdW5kX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklhbGxvd2VkXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2JnciAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9iS0dEIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcl8xNnAgXGZJYmFja2dyb3VuZFxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChwbmdfc3RydWN0cnAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSWFsbG93ZWRcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfY0hSTSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJd2hpdGVfeFxmUFxmQiwgZG91YmxlIFxmUFxmSXdoaXRlX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRfeFxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF95XGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5feFxmUFxmQiwgZG91YmxlIFxmUFxmSWdyZWVuX3lcZlBcZkIsIGRvdWJsZSBcZlBcZklibHVlX3hcZlBcZkIsIGRvdWJsZSBcZklibHVlX3lcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfY0hSTV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aGl0ZV94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aGl0ZV95XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklyZWRfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVkX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSWdyZWVuX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSWdyZWVuX3lcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSWJsdWVfeFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJYmx1ZV95XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2NIUk1fWFlaIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRfWFxmUFxmQiwgZG91YmxlIFxmUFxmSXJlZF9ZXGZQXGZCLCBkb3VibGUgXGZQXGZJcmVkX1pcZlBcZkIsIGRvdWJsZSBcZlBcZklncmVlbl9YXGZQXGZCLCBkb3VibGUgXGZQXGZJZ3JlZW5fWVxmUFxmQiwgZG91YmxlIFxmUFxmSWdyZWVuX1pcZlBcZkIsIGRvdWJsZSBcZlBcZklibHVlX1hcZlBcZkIsIGRvdWJsZSBcZlBcZklibHVlX1lcZlBcZkIsIGRvdWJsZSBcZklibHVlX1pcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9yZWRfWFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9yZWRfWVxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9yZWRfWlxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9ncmVlbl9YXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZQXGZJaW50X2dyZWVuX1lcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfZ3JlZW5fWlxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSWludF9ibHVlX1hcZlBcZkIsIHBuZ19maXhlZF9wb2ludCBcZlBcZklpbnRfYmx1ZV9ZXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZJaW50X2JsdWVfWlxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9jaHVua19jYWNoZV9tYXggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXVzZXJfY2h1bmtfY2FjaGVfbWF4XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbGV2ZWxcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbWVtX2xldmVsXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX21ldGhvZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSW1ldGhvZFxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSXN0cmF0ZWd5XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJd2luZG93X2JpdHNcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfY3JjX2FjdGlvbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWNyaXRfYWN0aW9uXGZQXGZCLCBpbnQgXGZJYW5jaWxfYWN0aW9uXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2Vycm9yX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJZXJyb3JfcHRyXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmUFxmSWVycm9yX2ZuXGZQXGZCLCBwbmdfZXJyb3JfcHRyIFxmSXdhcm5pbmdfZm5cZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfZXhwYW5kIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2V4cGFuZF8xNiAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2ZpbGxlciAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJZmlsbGVyXGZQXGZCLCBpbnQgXGZJZmxhZ3NcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfZmlsdGVyIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZQXGZJbWV0aG9kXGZQXGZCLCBpbnQgXGZJZmlsdGVyc1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWhldXJpc3RpY19tZXRob2RcZlBcZkIsIGludCBcZlBcZkludW1fd2VpZ2h0c1xmUFxmQiwgcG5nX2RvdWJsZXAgXGZQXGZJZmlsdGVyX3dlaWdodHNcZlBcZkIsIHBuZ19kb3VibGVwIFxmSWZpbHRlcl9jb3N0c1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljc19maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSWhldXJpc3RpY19tZXRob2RcZlBcZkIsIGludCBcZlBcZkludW1fd2VpZ2h0c1xmUFxmQiwgcG5nX2ZpeGVkX3BvaW50X3AgXGZQXGZJZmlsdGVyX3dlaWdodHNcZlBcZkIsIHBuZ19maXhlZF9wb2ludF9wIFxmSWZpbHRlcl9jb3N0c1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9mbHVzaCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSW5yb3dzXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2dhbW1hIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBkb3VibGUgXGZQXGZJc2NyZWVuX2dhbW1hXGZQXGZCLCBkb3VibGUgXGZJZGVmYXVsdF9maWxlX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2dhbW1hX2ZpeGVkIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklzY3JlZW5fZ2FtbWFcZlBcZkIsIHBuZ191aW50XzMyIFxmSWRlZmF1bHRfZmlsZV9nYW1tYVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9nQU1BIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGRvdWJsZSBcZklmaWxlX2dhbW1hXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2dBTUFfZml4ZWQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJZmlsZV9nYW1tYVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9ncmF5XzFfMl80X3RvXzggKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfZ3JheV90b19yZ2IgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfaElTVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8xNnAgXGZJaGlzdFxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9pQ0NQIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb25zdF9jaGFycCBcZlBcZkluYW1lXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgcG5nX2NvbnN0X2J5dGVwIFxmUFxmSXByb2ZpbGVcZlBcZkIsIHBuZ191aW50XzMyIFxmSXByb2ZsZW5cZlBcZkIpO1xmUAotCi1cZkJpbnQgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfaW52YWxpZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZJbWFza1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9pbnZlcnRfYWxwaGEgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfaW52ZXJ0X21vbm8gKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfSUhEUiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl3aWR0aFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJaGVpZ2h0XGZQXGZCLCBpbnQgXGZQXGZJYml0X2RlcHRoXGZQXGZCLCBpbnQgXGZQXGZJY29sb3JfdHlwZVxmUFxmQiwgaW50IFxmUFxmSWludGVybGFjZV90eXBlXGZQXGZCLCBpbnQgXGZQXGZJY29tcHJlc3Npb25fdHlwZVxmUFxmQiwgaW50IFxmSWZpbHRlcl90eXBlXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZklrZWVwXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJY2h1bmtfbGlzdFxmUFxmQiwgaW50IFxmSW51bV9jaHVua3NcZlBcZkIpO1xmUAotCi1cZkJqbXBfYnVmKiBwbmdfc2V0X2xvbmdqbXBfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19sb25nam1wX3B0ciBcZlBcZklsb25nam1wX2ZuXGZQXGZCLCBzaXplX3QgXGZJam1wX2J1Zl9zaXplXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X2NodW5rX21hbGxvY19tYXggKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19hbGxvY19zaXplX3QgXGZJdXNlcl9jaHVua19jYWNoZV9tYXhcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXNpemVcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfbWVtX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJbWVtX3B0clxmUFxmQiwgcG5nX21hbGxvY19wdHIgXGZQXGZJbWFsbG9jX2ZuXGZQXGZCLCBwbmdfZnJlZV9wdHIgXGZJZnJlZV9mblxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9vRkZzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSW9mZnNldF94XGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZklvZmZzZXRfeVxmUFxmQiwgaW50IFxmSXVuaXRfdHlwZVxmUFxmQik7XGZQCi0KLVxmQmludCBwbmdfc2V0X29wdGlvbihwbmdfc3RydWN0cnAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmUFxmSW9wdGlvblxmUFxmQiwgaW50IFxmSW9ub2ZmXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3BhY2tpbmcgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfcGFja3N3YXAgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfcENBTCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJcHVycG9zZVxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZklYMFxmUFxmQiwgcG5nX2ludF8zMiBcZlBcZklYMVxmUFxmQiwgaW50IFxmUFxmSXR5cGVcZlBcZkIsIGludCBcZlBcZklucGFyYW1zXGZQXGZCLCBwbmdfY2hhcnAgXGZQXGZJdW5pdHNcZlBcZkIsIHBuZ19jaGFycHAgXGZJcGFyYW1zXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3BIWXMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3VpbnRfMzIgXGZQXGZJcmVzX3hcZlBcZkIsIHBuZ191aW50XzMyIFxmUFxmSXJlc195XGZQXGZCLCBpbnQgXGZJdW5pdF90eXBlXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZklwcm9ncmVzc2l2ZV9wdHJcZlBcZkIsIHBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0ciBcZlBcZklpbmZvX2ZuXGZQXGZCLCBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciBcZlBcZklyb3dfZm5cZlBcZkIsIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIFxmSWVuZF9mblxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9QTFRFIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19jb2xvcnAgXGZQXGZJcGFsZXR0ZVxmUFxmQiwgaW50IFxmSW51bV9wYWxldHRlXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3F1YW50aXplIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JwIFxmUFxmSXBhbGV0dGVcZlBcZkIsIGludCBcZlBcZkludW1fcGFsZXR0ZVxmUFxmQiwgaW50IFxmUFxmSW1heGltdW1fY29sb3JzXGZQXGZCLCBwbmdfdWludF8xNnAgXGZQXGZJaGlzdG9ncmFtXGZQXGZCLCBpbnQgXGZJZnVsbF9xdWFudGl6ZVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9yZWFkX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJaW9fcHRyXGZQXGZCLCBwbmdfcndfcHRyIFxmSXJlYWRfZGF0YV9mblxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9yZWFkX3N0YXR1c19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3JlYWRfc3RhdHVzX3B0ciBcZklyZWFkX3Jvd19mblxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkl1c2VyX2NodW5rX3B0clxmUFxmQiwgcG5nX3VzZXJfY2h1bmtfcHRyIFxmSXJlYWRfdXNlcl9jaHVua19mblxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIFxmSXJlYWRfdXNlcl90cmFuc2Zvcm1fZm5cZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfcmdiX3RvX2dyYXkgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZlBcZkllcnJvcl9hY3Rpb25cZlBcZkIsIGRvdWJsZSBcZlBcZklyZWRcZlBcZkIsIGRvdWJsZSBcZklncmVlblxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IGVycm9yX2FjdGlvbiBwbmdfdWludF8zMiBcZlBcZklyZWRcZlBcZkIsIHBuZ191aW50XzMyIFxmSWdyZWVuXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3Jvd3MgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX2J5dGVwcCBcZklyb3dfcG9pbnRlcnNcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfc0JJVCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJc2lnX2JpdFxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9zQ0FMIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZlBcZkl1bml0XGZQXGZCLCBkb3VibGUgXGZQXGZJd2lkdGhcZlBcZkIsIGRvdWJsZSBcZkloZWlnaHRcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfc0NBTF9maXhlZCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdW5pdFxmUFxmQiwgcG5nX2ZpeGVkX3BvaW50IFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfZml4ZWRfcG9pbnQgXGZJaGVpZ2h0XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3NDQUxfcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBpbnQgXGZQXGZJdW5pdFxmUFxmQiwgcG5nX2NoYXJwIFxmUFxmSXdpZHRoXGZQXGZCLCBwbmdfY2hhcnAgXGZJaGVpZ2h0XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3NjYWxlXzE2IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3NoaWZ0IChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29sb3JfOHAgXGZJdHJ1ZV9iaXRzXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3NpZ19ieXRlcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSW51bV9ieXRlc1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9zUExUIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19zcGFsZXR0ZV9wIFxmUFxmSXNwbHRfcHRyXGZQXGZCLCBpbnQgXGZJbnVtX3NwYWxldHRlc1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9zUkdCIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZklzcmdiX2ludGVudFxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmSXNyZ2JfaW50ZW50XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3N0cmlwXzE2IChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3N0cmlwX2FscGhhIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ191aW50XzMyIFxmSXN0cmlwX21vZGVcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfc3dhcCAocG5nX3N0cnVjdHAgXGZJcG5nX3B0clxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF9zd2FwX2FscGhhIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3RleHQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgcG5nX3RleHRwIFxmUFxmSXRleHRfcHRyXGZQXGZCLCBpbnQgXGZJbnVtX3RleHRcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9sZXZlbCAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgaW50IFxmSWxldmVsXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbWVtX2xldmVsXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fc3RyYXRlZ3kgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIGludCBcZklzdHJhdGVneVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJd2luZG93X2JpdHNcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIFxmUFxmSXBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZXRob2RcZlBcZkIsIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBpbnQgXGZJbWV0aG9kKVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF90SU1FIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ190aW1lcCBcZkltb2RfdGltZVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF90Uk5TIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkl0cmFuc19hbHBoYVxmUFxmQiwgaW50IFxmUFxmSW51bV90cmFuc1xmUFxmQiwgcG5nX2NvbG9yXzE2cCBcZkl0cmFuc19jb2xvclxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF90Uk5TX3RvX2FscGhhIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCcG5nX3VpbnRfMzIgcG5nX3NldF91bmtub3duX2NodW5rcyAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2luZm9wIFxmUFxmSWluZm9fcHRyXGZQXGZCLCBwbmdfdW5rbm93bl9jaHVua3AgXGZQXGZJdW5rbm93bnNcZlBcZkIsIGludCBcZlBcZkludW1cZlBcZkIsIGludCBcZklsb2NhdGlvblxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZQXGZJaW5mb19wdHJcZlBcZkIsIGludCBcZlBcZkljaHVua1xmUFxmQiwgaW50IFxmSWxvY2F0aW9uXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3VzZXJfbGltaXRzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdWludF8zMiBcZlBcZkl1c2VyX3dpZHRoX21heFxmUFxmQiwgcG5nX3VpbnRfMzIgXGZJdXNlcl9oZWlnaHRfbWF4XGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8gKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ192b2lkcCBcZlBcZkl1c2VyX3RyYW5zZm9ybV9wdHJcZlBcZkIsIGludCBcZlBcZkl1c2VyX3RyYW5zZm9ybV9kZXB0aFxmUFxmQiwgaW50IFxmSXVzZXJfdHJhbnNmb3JtX2NoYW5uZWxzXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3dyaXRlX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdm9pZHAgXGZQXGZJaW9fcHRyXGZQXGZCLCBwbmdfcndfcHRyIFxmUFxmSXdyaXRlX2RhdGFfZm5cZlBcZkIsIHBuZ19mbHVzaF9wdHIgXGZJb3V0cHV0X2ZsdXNoX2ZuXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3dyaXRlX3N0YXR1c19mbiAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX3dyaXRlX3N0YXR1c19wdHIgXGZJd3JpdGVfcm93X2ZuXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfc2V0X3dyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIFxmSXdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuXGZQXGZCKTtcZlAKLQotXGZCaW50IHBuZ19zaWdfY21wIChwbmdfYnl0ZXAgXGZQXGZJc2lnXGZQXGZCLCBwbmdfc2l6ZV90IFxmUFxmSXN0YXJ0XGZQXGZCLCBwbmdfc2l6ZV90IFxmSW51bV90b19jaGVja1xmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193YXJuaW5nIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfY29uc3RfY2hhcnAgXGZJbWVzc2FnZVxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2NodW5rIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXAgXGZQXGZJY2h1bmtfbmFtZVxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmtfZGF0YSAocG5nX3N0cnVjdHAgXGZQXGZJcG5nX3B0clxmUFxmQiwgcG5nX2J5dGVwIFxmUFxmSWRhdGFcZlBcZkIsIHBuZ19zaXplX3QgXGZJbGVuZ3RoXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmtfZW5kIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfd3JpdGVfY2h1bmtfc3RhcnQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZlBcZkljaHVua19uYW1lXGZQXGZCLCBwbmdfdWludF8zMiBcZklsZW5ndGhcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193cml0ZV9lbmQgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZklpbmZvX3B0clxmUFxmQik7XGZQCi0KLVxmQnZvaWQgcG5nX3dyaXRlX2ZsdXNoIChwbmdfc3RydWN0cCBcZklwbmdfcHRyXGZQXGZCKTtcZlAKLQotXGZCdm9pZCBwbmdfd3JpdGVfaW1hZ2UgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcHAgXGZJaW1hZ2VcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193cml0ZV9pbmZvIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfaW5mb3AgXGZJaW5mb19wdHJcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193cml0ZV9wbmcgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19pbmZvcCBcZlBcZklpbmZvX3B0clxmUFxmQiwgaW50IFxmUFxmSXRyYW5zZm9ybXNcZlBcZkIsIHBuZ192b2lkcCBcZklwYXJhbXNcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193cml0ZV9yb3cgKHBuZ19zdHJ1Y3RwIFxmUFxmSXBuZ19wdHJcZlBcZkIsIHBuZ19ieXRlcCBcZklyb3dcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193cml0ZV9yb3dzIChwbmdfc3RydWN0cCBcZlBcZklwbmdfcHRyXGZQXGZCLCBwbmdfYnl0ZXBwIFxmUFxmSXJvd1xmUFxmQiwgcG5nX3VpbnRfMzIgXGZJbnVtX3Jvd3NcZlBcZkIpO1xmUAotCi1cZkJ2b2lkIHBuZ193cml0ZV9zaWcgKHBuZ19zdHJ1Y3RwIFxmSXBuZ19wdHJcZlBcZkIpO1xmUAotCi0uU0ggREVTQ1JJUFRJT04KLVRoZQotLkkgbGlicG5nCi1saWJyYXJ5IHN1cHBvcnRzIGVuY29kaW5nLCBkZWNvZGluZywgYW5kIHZhcmlvdXMgbWFuaXB1bGF0aW9ucyBvZgotdGhlIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgZm9ybWF0IGltYWdlIGZpbGVzLiAgSXQgdXNlcyB0aGUKLS5JUiB6bGliKDMpCi1jb21wcmVzc2lvbiBsaWJyYXJ5LgotRm9sbG93aW5nIGlzIGEgY29weSBvZiB0aGUgbGlicG5nLW1hbnVhbC50eHQgZmlsZSB0aGF0IGFjY29tcGFuaWVzIGxpYnBuZy4KLS5TSCBMSUJQTkcuVFhUCi1saWJwbmctbWFudWFsLnR4dCAtIEEgZGVzY3JpcHRpb24gb24gaG93IHRvIHVzZSBhbmQgbW9kaWZ5IGxpYnBuZwotCi0gbGlicG5nIHZlcnNpb24gMS42LjI0IC0gQXVndXN0IDQsIDIwMTYKLSBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSA8Z2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0KLSBUaGlzIGRvY3VtZW50IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIEJhc2VkIG9uOgotCi0gbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjYuMjQgLSBBdWd1c3QgNCwgMjAxNgotIFVwZGF0ZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotCi0gbGlicG5nIDEuMCBiZXRhIDYgLSB2ZXJzaW9uIDAuOTYgLSBNYXkgMjgsIDE5OTcKLSBVcGRhdGVkIGFuZCBkaXN0cmlidXRlZCBieSBBbmRyZWFzIERpbGdlcgotIENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotCi0gbGlicG5nIDEuMCBiZXRhIDIgLSB2ZXJzaW9uIDAuODggLSBKYW51YXJ5IDI2LCAxOTk2Ci0gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQKLSBub3RpY2UgaW4gcG5nLmguIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYwotIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotCi0gVXBkYXRlZC9yZXdyaXR0ZW4gcGVyIHJlcXVlc3QgaW4gdGhlIGxpYnBuZyBGQVEKLSBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgRnJhbmsgSi4gVC4gV29qY2lrCi0gRGVjZW1iZXIgMTgsIDE5OTUgJiBKYW51YXJ5IDIwLCAxOTk2Ci0KLSBUQUJMRSBPRiBDT05URU5UUwotCi0gICAgSS4gSW50cm9kdWN0aW9uCi0gICBJSS4gU3RydWN0dXJlcwotICBJSUkuIFJlYWRpbmcKLSAgIElWLiBXcml0aW5nCi0gICAgVi4gU2ltcGxpZmllZCBBUEkKLSAgIFZJLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nCi0gIFZJSS4gTU5HIHN1cHBvcnQKLSBWSUlJLiBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMC44OAotICAgSVguIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueCB0byAxLjIueAotICAgIFguIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjAueC8xLjIueCB0byAxLjQueAotICAgWEkuIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjQueCB0byAxLjUueAotICBYSUkuIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjUueCB0byAxLjYueAotIFhJSUkuIERldGVjdGluZyBsaWJwbmcKLSAgWElWLiBTb3VyY2UgY29kZSByZXBvc2l0b3J5Ci0gICBYVi4gQ29kaW5nIHN0eWxlCi0gIFhWSS4gWTJLIENvbXBsaWFuY2UgaW4gbGlicG5nCi0KLS5TSCBJLiBJbnRyb2R1Y3Rpb24KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gdXNlIGFuZCBtb2RpZnkgdGhlIFBORyByZWZlcmVuY2UgbGlicmFyeQotKGtub3duIGFzIGxpYnBuZykgZm9yIHlvdXIgb3duIHVzZS4gIEluIGFkZGl0aW9uIHRvIHRoaXMKLWZpbGUsIGV4YW1wbGUuYyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVzaW5nIHRoZSBsaWJyYXJ5LCBhcwotaXQgaXMgaGVhdmlseSBjb21tZW50ZWQgYW5kIHNob3VsZCBpbmNsdWRlIGV2ZXJ5dGhpbmcgbW9zdCBwZW9wbGUKLXdpbGwgbmVlZC4gIFdlIGFzc3VtZSB0aGF0IGxpYnBuZyBpcyBhbHJlYWR5IGluc3RhbGxlZDsgc2VlIHRoZQotSU5TVEFMTCBmaWxlIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCBsaWJwbmcuCi0KLUZvciBleGFtcGxlcyBvZiBsaWJwbmcgdXNhZ2UsIHNlZSB0aGUgZmlsZXMgImV4YW1wbGUuYyIsICJwbmd0ZXN0LmMiLAotYW5kIHRoZSBmaWxlcyBpbiB0aGUgImNvbnRyaWIiIGRpcmVjdG9yeSwgYWxsIG9mIHdoaWNoIGFyZSBpbmNsdWRlZCBpbgotdGhlIGxpYnBuZyBkaXN0cmlidXRpb24uCi0KLUxpYnBuZyB3YXMgd3JpdHRlbiBhcyBhIGNvbXBhbmlvbiB0byB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGEgd2F5Ci1vZiByZWR1Y2luZyB0aGUgYW1vdW50IG9mIHRpbWUgYW5kIGVmZm9ydCBpdCB0YWtlcyB0byBzdXBwb3J0IHRoZSBQTkcKLWZpbGUgZm9ybWF0IGluIGFwcGxpY2F0aW9uIHByb2dyYW1zLgotCi1UaGUgUE5HIHNwZWNpZmljYXRpb24gKHNlY29uZCBlZGl0aW9uKSwgTm92ZW1iZXIgMjAwMywgaXMgYXZhaWxhYmxlIGFzCi1hIFczQyBSZWNvbW1lbmRhdGlvbiBhbmQgYXMgYW4gSVNPIFN0YW5kYXJkIChJU08vSUVDIDE1OTQ4OjIwMDQgKEUpKSBhdAotPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvUkVDLVBORy0yMDAzMTExMC8KLVRoZSBXM0MgYW5kIElTTyBkb2N1bWVudHMgaGF2ZSBpZGVudGljYWwgdGVjaG5pY2FsIGNvbnRlbnQuCi0KLVRoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlIGF0Ci08aHR0cDovL3BuZy1tbmcuc291cmNlZm9yZ2UubmV0L3B1Yi9wbmcvc3BlYy8xLjIvPi4KLUl0IGlzIHRlY2huaWNhbGx5IGVxdWl2YWxlbnQKLXRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiAoc2Vjb25kIGVkaXRpb24pIGJ1dCBoYXMgc29tZSBhZGRpdGlvbmFsIG1hdGVyaWFsLgotCi1UaGUgUE5HLTEuMCBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSBhcyBSRkMgMjA4MyAKLTxodHRwOi8vcG5nLW1uZy5zb3VyY2Vmb3JnZS5uZXQvcHViL3BuZy9zcGVjLzEuMC8+IGFuZCBhcyBhCi1XM0MgUmVjb21tZW5kYXRpb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmctOTYxMDAxPi4KLQotU29tZSBhZGRpdGlvbmFsIGNodW5rcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzcGVjaWFsLXB1cnBvc2UgcHVibGljIGNodW5rcwotZG9jdW1lbnRzIGF0IDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9zcGVjL3JlZ2lzdGVyLz4KLQotT3RoZXIgaW5mb3JtYXRpb24KLWFib3V0IFBORywgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBsaWJwbmcsIGNhbiBiZSBmb3VuZCBhdCB0aGUgUE5HIGhvbWUKLXBhZ2UsIDxodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy8+LgotCi1Nb3N0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gbW9kaWZ5IHRoZSBsaWJyYXJ5IHNpZ25pZmljYW50bHk7IGFkdmFuY2VkCi11c2VycyBtYXkgd2FudCB0byBtb2RpZnkgaXQgbW9yZS4gIEFsbCBhdHRlbXB0cyB3ZXJlIG1hZGUgdG8gbWFrZSBpdCBhcwotY29tcGxldGUgYXMgcG9zc2libGUsIHdoaWxlIGtlZXBpbmcgdGhlIGNvZGUgZWFzeSB0byB1bmRlcnN0YW5kLgotQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBDLiAgU3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCi1pcyBiZWluZyBjb25zaWRlcmVkLgotCi1MaWJwbmcgaGFzIGJlZW4gZGVzaWduZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlc3Npb25zIGF0IG9uZSB0aW1lLAotdG8gYmUgZWFzaWx5IG1vZGlmaWFibGUsIHRvIGJlIHBvcnRhYmxlIHRvIHRoZSB2YXN0IG1ham9yaXR5IG9mCi1tYWNoaW5lcyAoQU5TSSwgSyZSLCAxNi0sIDMyLSwgYW5kIDY0LWJpdCkgYXZhaWxhYmxlLCBhbmQgdG8gYmUgZWFzeQotdG8gdXNlLiAgVGhlIHVsdGltYXRlIGdvYWwgb2YgbGlicG5nIGlzIHRvIHByb21vdGUgdGhlIGFjY2VwdGFuY2Ugb2YKLXRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gd2hhdGV2ZXIgd2F5IHBvc3NpYmxlLiAgV2hpbGUgdGhlcmUgaXMgc3RpbGwKLXdvcmsgdG8gYmUgZG9uZSAoc2VlIHRoZSBUT0RPIGZpbGUpLCBsaWJwbmcgc2hvdWxkIGNvdmVyIHRoZQotbWFqb3JpdHkgb2YgdGhlIG5lZWRzIG9mIGl0cyB1c2Vycy4KLQotTGlicG5nIHVzZXMgemxpYiBmb3IgaXRzIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9mIFBORyBmaWxlcy4KLUZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgemxpYiwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliLCBjYW4KLWJlIGZvdW5kIGF0IHRoZSB6bGliIGhvbWUgcGFnZSwgPGh0dHA6Ly96bGliLm5ldC8+LgotVGhlIHpsaWIgY29tcHJlc3Npb24gdXRpbGl0eSBpcyBhIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IHRoYXQgaXMKLXVzZWZ1bCBmb3IgbW9yZSB0aGFuIFBORyBmaWxlcywgYW5kIGNhbiBiZSB1c2VkIHdpdGhvdXQgbGlicG5nLgotU2VlIHRoZSBkb2N1bWVudGF0aW9uIGRlbGl2ZXJlZCB3aXRoIHpsaWIgZm9yIG1vcmUgZGV0YWlscy4KLVlvdSBjYW4gdXN1YWxseSBmaW5kIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSB6bGliIHV0aWxpdHkgd2hlcmV2ZXIgeW91Ci1maW5kIHRoZSBsaWJwbmcgc291cmNlIGZpbGVzLgotCi1MaWJwbmcgaXMgdGhyZWFkIHNhZmUsIHByb3ZpZGVkIHRoZSB0aHJlYWRzIGFyZSB1c2luZyBkaWZmZXJlbnQKLWluc3RhbmNlcyBvZiB0aGUgc3RydWN0dXJlcy4gIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24KLXBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvIGluc3RhbmNlcywgYW5kIHRodXMgaXRzIG93biBpbWFnZS4KLUxpYnBuZyBkb2VzIG5vdCBwcm90ZWN0IGl0c2VsZiBhZ2FpbnN0IHR3byB0aHJlYWRzIHVzaW5nIHRoZQotc2FtZSBpbnN0YW5jZSBvZiBhIHN0cnVjdHVyZS4KLQotLlNIIElJLiBTdHJ1Y3R1cmVzCi0KLVRoZXJlIGFyZSB0d28gbWFpbiBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGltcG9ydGFudCB0byBsaWJwbmcsIHBuZ19zdHJ1Y3QKLWFuZCBwbmdfaW5mby4gIEJvdGggYXJlIGludGVybmFsIHN0cnVjdHVyZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGV4cG9zZWQKLWluIHRoZSBsaWJwbmcgaW50ZXJmYWNlIChhcyBvZiBsaWJwbmcgMS41LjApLgotCi1UaGUgcG5nX2luZm8gc3RydWN0dXJlIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1QTkcgZmlsZS4gIEF0IG9uZSB0aW1lLCB0aGUgZmllbGRzIG9mIHBuZ19pbmZvIHdlcmUgaW50ZW5kZWQgdG8gYmUKLWRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlIHVzZXIuICBIb3dldmVyLCB0aGlzIHRlbmRlZCB0byBjYXVzZSBwcm9ibGVtcwotd2l0aCBhcHBsaWNhdGlvbnMgdXNpbmcgZHluYW1pY2FsbHkgbG9hZGVkIGxpYnJhcmllcywgYW5kIGFzIGEgcmVzdWx0Ci1hIHNldCBvZiBpbnRlcmZhY2UgZnVuY3Rpb25zIGZvciBwbmdfaW5mbyAodGhlIHBuZ19nZXRfKigpIGFuZCBwbmdfc2V0XyooKQotZnVuY3Rpb25zKSB3YXMgZGV2ZWxvcGVkLCBhbmQgZGlyZWN0IGFjY2VzcyB0byB0aGUgcG5nX2luZm8gZmllbGRzIHdhcwotZGVwcmVjYXRlZC4uCi0KLVRoZSBwbmdfc3RydWN0IHN0cnVjdHVyZSBpcyB0aGUgb2JqZWN0IHVzZWQgYnkgdGhlIGxpYnJhcnkgdG8gZGVjb2RlIGEKLXNpbmdsZSBpbWFnZS4gIEFzIG9mIDEuNS4wIHRoaXMgc3RydWN0dXJlIGlzIGFsc28gbm90IGV4cG9zZWQuCi0KLUFsbW9zdCBhbGwgbGlicG5nIEFQSXMgcmVxdWlyZSBhIHBvaW50ZXIgdG8gYSBwbmdfc3RydWN0IGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KLU1hbnkgKGluIHBhcnRpY3VsYXIgdGhlIHBuZ19zZXQgYW5kIHBuZ19nZXQgQVBJcykgYWxzbyByZXF1aXJlIGEgcG9pbnRlcgotdG8gcG5nX2luZm8gYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gIFNvbWUgYXBwbGljYXRpb24gdmlzaWJsZSBtYWNyb3MKLWRlZmluZWQgaW4gcG5nLmggZGVzaWduZWQgZm9yIGJhc2ljIGRhdGEgYWNjZXNzIChyZWFkaW5nIGFuZCB3cml0aW5nCi1pbnRlZ2VycyBpbiB0aGUgUE5HIGZvcm1hdCkgZG9uJ3QgdGFrZSBhIHBuZ19pbmZvIHBvaW50ZXIsIGJ1dCBpdCdzIGFsbW9zdAotYWx3YXlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgYSAocG5nX3N0cnVjdCopIGhhcyB0byBiZSBwYXNzZWQgdG8gY2FsbCBhbiBBUEkKLWZ1bmN0aW9uLgotCi1Zb3UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBwbmdfaW5mbyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGFuIGltYWdlLAotYXMgaWxsdXN0cmF0ZWQgaW4gcG5ndGVzdC5jLCBvbmUgZm9yIGluZm9ybWF0aW9uIHZhbGlkIHByaW9yIHRvIHRoZQotSURBVCBjaHVua3MgYW5kIGFub3RoZXIgKGNhbGxlZCAiZW5kX2luZm8iIGJlbG93KSBmb3IgdGhpbmdzIGFmdGVyIHRoZW0uCi0KLVRoZSBwbmcuaCBoZWFkZXIgZmlsZSBpcyBhbiBpbnZhbHVhYmxlIHJlZmVyZW5jZSBmb3IgcHJvZ3JhbW1pbmcgd2l0aCBsaWJwbmcuCi1BbmQgd2hpbGUgSSdtIG9uIHRoZSB0b3BpYywgbWFrZSBzdXJlIHlvdSBpbmNsdWRlIHRoZSBsaWJwbmcgaGVhZGVyIGZpbGU6Ci0KLSNpbmNsdWRlIDxwbmcuaD4KLQotYW5kIGFsc28gKGFzIG9mIGxpYnBuZy0xLjUuMCkgdGhlIHpsaWIgaGVhZGVyIGZpbGUsIGlmIHlvdSBuZWVkIGl0OgotCi0jaW5jbHVkZSA8emxpYi5oPgotCi0uU1MgVHlwZXMKLQotVGhlIHBuZy5oIGhlYWRlciBmaWxlIGRlZmluZXMgYSBudW1iZXIgb2YgaW50ZWdyYWwgdHlwZXMgdXNlZCBieSB0aGUKLUFQSXMuICBNb3N0IG9mIHRoZXNlIGFyZSBmYWlybHkgb2J2aW91czsgZm9yIGV4YW1wbGUgdHlwZXMgY29ycmVzcG9uZGluZwotdG8gaW50ZWdlcnMgb2YgcGFydGljdWxhciBzaXplcyBhbmQgdHlwZXMgZm9yIHBhc3NpbmcgY29sb3IgdmFsdWVzLgotCi1PbmUgZXhjZXB0aW9uIGlzIGhvdyBub24taW50ZWdyYWwgbnVtYmVycyBhcmUgaGFuZGxlZC4gIEZvciBhcHBsaWNhdGlvbgotY29udmVuaWVuY2UgbW9zdCBBUElzIHRoYXQgdGFrZSBzdWNoIG51bWJlcnMgaGF2ZSBDIChkb3VibGUpIGFyZ3VtZW50czsKLWhvd2V2ZXIsIGludGVybmFsbHkgUE5HLCBhbmQgbGlicG5nLCB1c2UgMzIgYml0IHNpZ25lZCBpbnRlZ2VycyBhbmQgZW5jb2RlCi10aGUgdmFsdWUgYnkgbXVsdGlwbHlpbmcgYnkgMTAwLDAwMC4gIEFzIG9mIGxpYnBuZyAxLjUuMCBhIGNvbnZlbmllbmNlCi1tYWNybyBQTkdfRlBfMSBpcyBkZWZpbmVkIGluIHBuZy5oIGFsb25nIHdpdGggYSB0eXBlIChwbmdfZml4ZWRfcG9pbnQpCi13aGljaCBpcyBzaW1wbHkgKHBuZ19pbnRfMzIpLgotCi1BbGwgQVBJcyB0aGF0IHRha2UgKGRvdWJsZSkgYXJndW1lbnRzIGFsc28gaGF2ZSBhIG1hdGNoaW5nIEFQSSB0aGF0Ci10YWtlcyB0aGUgY29ycmVzcG9uZGluZyBmaXhlZCBwb2ludCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFRoZSBmaXhlZCBwb2ludAotQVBJIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmbG9hdGluZyBwb2ludCBvbmUgd2l0aCAiX2ZpeGVkIiBhcHBlbmRlZC4KLVRoZSBhY3R1YWwgcmFuZ2Ugb2YgdmFsdWVzIHBlcm1pdHRlZCBpbiB0aGUgQVBJcyBpcyBmcmVxdWVudGx5IGxlc3MgdGhhbgotdGhlIGZ1bGwgcmFuZ2Ugb2YgKHBuZ19maXhlZF9wb2ludCkgKFwtMjE0NzQgdG8gKzIxNDc0KS4gIFdoZW4gQVBJcyByZXF1aXJlCi1hIG5vbi1uZWdhdGl2ZSBhcmd1bWVudCB0aGUgdHlwZSBpcyByZWNvcmRlZCBhcyBwbmdfdWludF8zMiBhYm92ZS4gIENvbnN1bHQKLXRoZSBoZWFkZXIgZmlsZSBhbmQgdGhlIHRleHQgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVNwZWNpYWwgY2FyZSBtdXN0IGJlIHRha2Ugd2l0aCBzQ0FMIGNodW5rIGhhbmRsaW5nIGJlY2F1c2UgdGhlIGNodW5rIGl0c2VsZgotdXNlcyBub24taW50ZWdyYWwgdmFsdWVzIGVuY29kZWQgYXMgc3RyaW5ncyBjb250YWluaW5nIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQKLW51bWJlcnMuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBoZWFkZXIgZmlsZS4KLQotLlNTIENvbmZpZ3VyYXRpb24KLQotVGhlIG1haW4gaGVhZGVyIGZpbGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGFyZSBmcmVxdWVudGx5IHByb3RlY3RlZCBieSBDCi1wcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMgb2YgdGhlIGZvcm06Ci0KLSAgICAjaWZkZWYgUE5HX2ZlYXR1cmVfU1VQUE9SVEVECi0gICAgZGVjbGFyZS1mdW5jdGlvbgotICAgICNlbmRpZgotICAgIC4uLgotICAgICNpZmRlZiBQTkdfZmVhdHVyZV9TVVBQT1JURUQKLSAgICB1c2UtZnVuY3Rpb24KLSAgICAjZW5kaWYKLQotVGhlIGxpYnJhcnkgY2FuIGJlIGJ1aWx0IHdpdGhvdXQgc3VwcG9ydCBmb3IgdGhlc2UgQVBJcywgYWx0aG91Z2ggYQotc3RhbmRhcmQgYnVpbGQgd2lsbCBoYXZlIGFsbCBpbXBsZW1lbnRlZCBBUElzLiAgQXBwbGljYXRpb24gcHJvZ3JhbXMKLXNob3VsZCBjaGVjayB0aGUgZmVhdHVyZSBtYWNyb3MgYmVmb3JlIHVzaW5nIGFuIEFQSSBmb3IgbWF4aW11bQotcG9ydGFiaWxpdHkuICBGcm9tIGxpYnBuZyAxLjUuMCB0aGUgZmVhdHVyZSBtYWNyb3Mgc2V0IGR1cmluZyB0aGUgYnVpbGQKLW9mIGxpYnBuZyBhcmUgcmVjb3JkZWQgaW4gdGhlIGhlYWRlciBmaWxlICJwbmdsaWJjb25mLmgiIGFuZCB0aGlzIGZpbGUKLWlzIGFsd2F5cyBpbmNsdWRlZCBieSBwbmcuaC4KLQotSWYgeW91IGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZGVmYXVsdCwgc2tpcCB0bwotdGhlIG5leHQgc2VjdGlvbiAoIlJlYWRpbmciKS4KLQotTm90aWNlIHRoYXQgc29tZSBvZiB0aGUgbWFrZWZpbGVzIGluIHRoZSAnc2NyaXB0cycgZGlyZWN0b3J5IGFuZCAoaW4gMS41LjApIGFsbAotb2YgdGhlIGJ1aWxkIHByb2plY3QgZmlsZXMgaW4gdGhlICdwcm9qZWN0cycgZGlyZWN0b3J5IHNpbXBseSBjb3B5Ci1zY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCB0byBwbmdsaWJjb25mLmguICBUaGlzIG1lYW5zIHRoYXQgdGhlc2UgYnVpbGQKLXN5c3RlbXMgZG8gbm90IHBlcm1pdCBlYXN5IGF1dG8tY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeSAtIHRoZXkgb25seQotc3VwcG9ydCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgotCi1UaGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBtaW5vciBjaGFuZ2VzIHRvIHRoZSBsaWJwbmcgY29uZmlndXJhdGlvbiB3aGVuCi1hdXRvLWNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkIGlzIHRvIGFkZCBkZWZpbml0aW9ucyB0byB0aGUgY29tbWFuZCBsaW5lCi11c2luZyAodHlwaWNhbGx5KSBDUFBGTEFHUy4gIEZvciBleGFtcGxlOgotCi1DUFBGTEFHUz1cLURQTkdfTk9fRkxPQVRJTkdfQVJJVEhNRVRJQwotCi13aWxsIGNoYW5nZSB0aGUgaW50ZXJuYWwgbGlicG5nIG1hdGggaW1wbGVtZW50YXRpb24gZm9yIGdhbW1hIGNvcnJlY3Rpb24gYW5kCi1vdGhlciBhcml0aG1ldGljIGNhbGN1bGF0aW9ucyB0byBmaXhlZCBwb2ludCwgYXZvaWRpbmcgdGhlIG5lZWQgZm9yIGZhc3QKLWZsb2F0aW5nIHBvaW50IHN1cHBvcnQuICBUaGUgcmVzdWx0IGNhbiBiZSBzZWVuIGluIHRoZSBnZW5lcmF0ZWQgcG5nbGliY29uZi5oIC0KLW1ha2Ugc3VyZSBpdCBjb250YWlucyB0aGUgY2hhbmdlZCBmZWF0dXJlIG1hY3JvIHNldHRpbmcuCi0KLUlmIHlvdSBuZWVkIHRvIG1ha2UgbW9yZSBleHRlbnNpdmUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0gbW9yZSB0aGFuIG9uZSBvciB0d28KLWZlYXR1cmUgbWFjcm8gc2V0dGluZ3MgLSB5b3UgY2FuIGVpdGhlciBhZGQgXC1EUE5HX1VTRVJfQ09ORklHIHRvIHRoZSBidWlsZAotY29tbWFuZCBsaW5lIGFuZCBwdXQgYSBsaXN0IG9mIGZlYXR1cmUgbWFjcm8gc2V0dGluZ3MgaW4gcG5ndXNyLmggb3IgeW91IGNhbiBzZXQKLURGQV9YVFJBIChhIG1ha2VmaWxlIHZhcmlhYmxlKSB0byBhIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpbiB0aGUKLWZvcm0gb2YgJ29wdGlvbicgc2V0dGluZ3MuCi0KLUEuIENoYW5naW5nIHBuZ2xpYmNvbmYuaAotCi1BIHZhcmlldHkgb2YgbWV0aG9kcyBleGlzdCB0byBidWlsZCBsaWJwbmcuICBOb3QgYWxsIG9mIHRoZXNlIHN1cHBvcnQKLXJlY29uZmlndXJhdGlvbiBvZiBwbmdsaWJjb25mLmguICBUbyByZWNvbmZpZ3VyZSBwbmdsaWJjb25mLmggaXQgbXVzdCBlaXRoZXIgYmUKLXJlYnVpbHQgZnJvbSBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIHVzaW5nIGF3ayBvciBpdCBtdXN0IGJlIGVkaXRlZCBieSBoYW5kLgotCi1IYW5kIGVkaXRpbmcgaXMgYWNoaWV2ZWQgYnkgY29weWluZyBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCB0bwotcG5nbGliY29uZi5oIGFuZCBjaGFuZ2luZyB0aGUgbGluZXMgZGVmaW5pbmcgdGhlIHN1cHBvcnRlZCBmZWF0dXJlcywgcGF5aW5nCi12ZXJ5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgJ29wdGlvbicgaW5mb3JtYXRpb24gaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYQotdGhhdCBkZXNjcmliZXMgdGhvc2UgZmVhdHVyZXMgYW5kIHRoZWlyIHJlcXVpcmVtZW50cy4gIFRoaXMgaXMgZWFzeSB0byBnZXQKLXdyb25nLgotCi1CLiBDb25maWd1cmF0aW9uIHVzaW5nIERGQV9YVFJBCi0KLVJlYnVpbGRpbmcgZnJvbSBwbmdsaWJjb25mLmRmYSBpcyBlYXN5IGlmIGEgZnVuY3Rpb25pbmcgJ2F3aycsIG9yIGEgbGF0ZXIKLXZhcmlhbnQgc3VjaCBhcyAnbmF3aycgb3IgJ2dhd2snLCBpcyBhdmFpbGFibGUuICBUaGUgY29uZmlndXJlIGJ1aWxkIHdpbGwKLWF1dG9tYXRpY2FsbHkgZmluZCBhbiBhcHByb3ByaWF0ZSBhd2sgYW5kIGJ1aWxkIHBuZ2xpYmNvbmYuaC4KLVRoZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZpbGUgY29udGFpbnMgYSBzZXQgb2YgbWFrZSBydWxlcyBmb3IgZG9pbmcgdGhlCi1zYW1lIHRoaW5nIGlmIGNvbmZpZ3VyZSBpcyBub3QgdXNlZCwgYW5kIG1hbnkgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc2NyaXB0cwotZGlyZWN0b3J5IHVzZSB0aGlzIGFwcHJvYWNoLgotCi1XaGVuIHJlYnVpbGRpbmcgc2ltcGx5IHdyaXRlIGEgbmV3IGZpbGUgY29udGFpbmluZyBjaGFuZ2VkIG9wdGlvbnMgYW5kIHNldAotREZBX1hUUkEgdG8gdGhlIG5hbWUgb2YgdGhpcyBmaWxlLiAgVGhpcyBjYXVzZXMgdGhlIGJ1aWxkIHRvIGFwcGVuZCB0aGUgbmV3IGZpbGUKLXRvIHRoZSBlbmQgb2Ygc2NyaXB0cy9wbmdsaWJjb25mLmRmYS4gIFRoZSBwbmd1c3IuZGZhIGZpbGUgc2hvdWxkIGNvbnRhaW4gbGluZXMKLW9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0KLWV2ZXJ5dGhpbmcgPSBvZmYKLQotVGhpcyB0dXJucyBhbGwgb3B0aW9uYWwgZmVhdHVyZXMgb2ZmLiAgSW5jbHVkZSBpdCBhdCB0aGUgc3RhcnQgb2YgcG5ndXNyLmRmYSB0bwotbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgYSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24uICBZb3Ugd2lsbCBuZWVkIHRvIHR1cm4gYXQgbGVhc3QKLXNvbWUgZmVhdHVyZXMgb24gYWZ0ZXJ3YXJkIHRvIGVuYWJsZSBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nIGNvZGUsIG9yIGJvdGguCi0KLW9wdGlvbiBmZWF0dXJlIG9uCi1vcHRpb24gZmVhdHVyZSBvZmYKLQotRW5hYmxlIG9yIGRpc2FibGUgYSBzaW5nbGUgZmVhdHVyZS4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSBvdGhlcgotZmVhdHVyZXMgcmVxdWlyZWQgYnkgYSBmZWF0dXJlIHRoYXQgaXMgdHVybmVkIG9uIG9yIGRpc2FibGUgb3RoZXIgZmVhdHVyZXMgdGhhdAotcmVxdWlyZSBhIGZlYXR1cmUgd2hpY2ggaXMgdHVybmVkIG9mZi4gIENvbmZsaWN0aW5nIHNldHRpbmdzIHdpbGwgY2F1c2UgYW4gZXJyb3IKLW1lc3NhZ2UgdG8gYmUgZW1pdHRlZCBieSBhd2suCi0KLXNldHRpbmcgZmVhdHVyZSBkZWZhdWx0IHZhbHVlCi0KLUNoYW5nZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2V0dGluZyAnZmVhdHVyZScgdG8gJ3ZhbHVlJy4gIFRoZXJlIGFyZSBhIHNtYWxsCi1udW1iZXIgb2Ygc2V0dGluZ3MgbGlzdGVkIGF0IHRoZSB0b3Agb2YgcG5nbGliY29uZi5oLCB0aGV5IGFyZSBkb2N1bWVudGVkIGluIHRoZQotc291cmNlIGNvZGUuICBNb3N0IG9mIHRoZXNlIHZhbHVlcyBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBmb3IgdGhlIGxpYnJhcnkKLWJ1dCBtb3N0IG9mIHRoZW0gaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBvbiB0aGUgQVBJLiAgU29tZSBjYW4gYWxzbyBiZSBvdmVycmlkZGVuCi1mcm9tIHRoZSBBUEkuCi0KLVRoaXMgbWV0aG9kIG9mIGJ1aWxkaW5nIGEgY3VzdG9taXplZCBwbmdsaWJjb25mLmggaXMgaWxsdXN0cmF0ZWQgaW4KLWNvbnRyaWIvcG5nbWluaW0vKi4gIFNlZSB0aGUgIiQoUE5HQ09ORik6IiB0YXJnZXQgaW4gdGhlIG1ha2VmaWxlIGFuZAotcG5ndXNyLmRmYSBpbiB0aGVzZSBkaXJlY3Rvcmllcy4KLQotQy4gQ29uZmlndXJhdGlvbiB1c2luZyBQTkdfVVNFUl9DT05GSUcKLQotSWYgXC1EUE5HX1VTRVJfQ09ORklHIGlzIGFkZGVkIHRvIHRoZSBDUFBGTEFHUyB3aGVuIHBuZ2xpYmNvbmYuaCBpcyBidWlsdCwKLXRoZSBmaWxlIHBuZ3Vzci5oIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCBiZWZvcmUgdGhlIG9wdGlvbnMgaW4KLXNjcmlwdHMvcG5nbGliY29uZi5kZmEgYXJlIHByb2Nlc3NlZC4gIFlvdXIgcG5ndXNyLmggZmlsZSBzaG91bGQgY29udGFpbiBvbmx5Ci1tYWNybyBkZWZpbml0aW9ucyB0dXJuaW5nIGZlYXR1cmVzIG9uIG9yIG9mZiBvciBzZXR0aW5nIHNldHRpbmdzLgotCi1BcGFydCBmcm9tIHRoZSBnbG9iYWwgc2V0dGluZyAiZXZlcnl0aGluZyA9IG9mZiIgYWxsIHRoZSBvcHRpb25zIGxpc3RlZCBhYm92ZQotY2FuIGJlIHNldCB1c2luZyBtYWNyb3MgaW4gcG5ndXNyLmg6Ci0KLSNkZWZpbmUgUE5HX2ZlYXR1cmVfU1VQUE9SVEVECi0KLWlzIGVxdWl2YWxlbnQgdG86Ci0KLW9wdGlvbiBmZWF0dXJlIG9uCi0KLSNkZWZpbmUgUE5HX05PX2ZlYXR1cmUKLQotaXMgZXF1aXZhbGVudCB0bzoKLQotb3B0aW9uIGZlYXR1cmUgb2ZmCi0KLSNkZWZpbmUgUE5HX2ZlYXR1cmUgdmFsdWUKLQotaXMgZXF1aXZhbGVudCB0bzoKLQotc2V0dGluZyBmZWF0dXJlIGRlZmF1bHQgdmFsdWUKLQotTm90aWNlIHRoYXQgaW4gYm90aCBjYXNlcywgcG5ndXNyLmRmYSBhbmQgcG5ndXNyLmgsIHRoZSBjb250ZW50cyBvZiB0aGUKLXBuZ3VzciBmaWxlIHlvdSBzdXBwbHkgb3ZlcnJpZGUgdGhlIGNvbnRlbnRzIG9mIHNjcmlwdHMvcG5nbGliY29uZi5kZmEKLQotSWYgY29uZnVzaW5nIG9yIGluY29tcHJlaGVuc2libGUgYmVoYXZpb3IgcmVzdWx0cyBpdCBpcyBwb3NzaWJsZSB0bwotZXhhbWluZSB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgcG5nbGliY29uZi5kZm4gdG8gZmluZCB0aGUgZnVsbCBzZXQgb2YKLWRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yIGVhY2ggc2V0dGluZyBhbmQgb3B0aW9uLiAgU2ltcGx5IGxvY2F0ZSB0aGUKLWZlYXR1cmUgaW4gdGhlIGZpbGUgYW5kIHJlYWQgdGhlIEMgY29tbWVudHMgdGhhdCBwcmVjZWRlIGl0LgotCi1UaGlzIG1ldGhvZCBpcyBhbHNvIGlsbHVzdHJhdGVkIGluIHRoZSBjb250cmliL3BuZ21pbmltLyogbWFrZWZpbGVzIGFuZAotcG5ndXNyLmguCi0KLS5TSCBJSUkuIFJlYWRpbmcKLQotV2UnbGwgbm93IHdhbGsgeW91IHRocm91Z2ggdGhlIHBvc3NpYmxlIGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gcmVhZGluZwotaW4gYSBQTkcgZmlsZSBzZXF1ZW50aWFsbHksIGJyaWVmbHkgZXhwbGFpbmluZyB0aGUgc3ludGF4IGFuZCBwdXJwb3NlCi1vZiBlYWNoIG9uZS4gIFNlZSBleGFtcGxlLmMgYW5kIHBuZy5oIGZvciBtb3JlIGRldGFpbC4gIFdoaWxlCi1wcm9ncmVzc2l2ZSByZWFkaW5nIGlzIGNvdmVyZWQgaW4gdGhlIG5leHQgc2VjdGlvbiwgeW91IHdpbGwgc3RpbGwKLW5lZWQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGRpc2N1c3NlZCBpbiB0aGlzIHNlY3Rpb24gdG8gcmVhZCBhIFBORwotZmlsZS4KLQotLlNTIFNldHVwCi0KLVlvdSB3aWxsIHdhbnQgdG8gZG8gdGhlIEkvTyBpbml0aWFsaXphdGlvbigqKSBiZWZvcmUgeW91IGdldCBpbnRvIGxpYnBuZywKLXNvIGlmIGl0IGRvZXNuJ3Qgd29yaywgeW91IGRvbid0IGhhdmUgbXVjaCB0byB1bmRvLiAgT2YgY291cnNlLCB5b3UKLXdpbGwgYWxzbyB3YW50IHRvIGluc3VyZSB0aGF0IHlvdSBhcmUsIGluIGZhY3QsIGRlYWxpbmcgd2l0aCBhIFBORwotZmlsZS4gIExpYnBuZyBwcm92aWRlcyBhIHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYSBmaWxlIGlzIGEgUE5HIGZpbGUuCi1UbyB1c2UgaXQsIHBhc3MgaW4gdGhlIGZpcnN0IDEgdG8gOCBieXRlcyBvZiB0aGUgZmlsZSB0byB0aGUgZnVuY3Rpb24KLXBuZ19zaWdfY21wKCksIGFuZCBpdCB3aWxsIHJldHVybiAwIChmYWxzZSkgaWYgdGhlIGJ5dGVzIG1hdGNoIHRoZQotY29ycmVzcG9uZGluZyBieXRlcyBvZiB0aGUgUE5HIHNpZ25hdHVyZSwgb3Igbm9uemVybyAodHJ1ZSkgb3RoZXJ3aXNlLgotT2YgY291cnNlLCB0aGUgbW9yZSBieXRlcyB5b3UgcGFzcyBpbiwgdGhlIGdyZWF0ZXIgdGhlIGFjY3VyYWN5IG9mIHRoZQotcHJlZGljdGlvbi4KLQotSWYgeW91IGFyZSBpbnRlbmRpbmcgdG8ga2VlcCB0aGUgZmlsZSBwb2ludGVyIG9wZW4gZm9yIHVzZSBpbiBsaWJwbmcsCi15b3UgbXVzdCBlbnN1cmUgeW91IGRvbid0IHJlYWQgbW9yZSB0aGFuIDggYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nCi1vZiB0aGUgZmlsZSwgYW5kIHlvdSBhbHNvIGhhdmUgdG8gbWFrZSBhIGNhbGwgdG8gcG5nX3NldF9zaWdfYnl0ZXMoKQotd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSByZWFkIGZyb20gdGhlIGJlZ2lubmluZy4gIExpYnBuZyB3aWxsCi10aGVuIG9ubHkgY2hlY2sgdGhlIGJ5dGVzIChpZiBhbnkpIHRoYXQgeW91ciBwcm9ncmFtIGRpZG4ndCByZWFkLgotCi0oKik6IElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLCB5b3Ugd2lsbCBuZWVkCi10byByZXBsYWNlIHRoZW0gd2l0aCBjdXN0b20gZnVuY3Rpb25zLiAgU2VlIHRoZSBkaXNjdXNzaW9uIHVuZGVyCi1DdXN0b21pemluZyBsaWJwbmcuCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7Ci0gICAgaWYgKCFmcCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKGZyZWFkKGhlYWRlciwgMSwgbnVtYmVyLCBmcCkgIT0gbnVtYmVyKQotICAgIHsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBpc19wbmcgPSAhcG5nX3NpZ19jbXAoaGVhZGVyLCAwLCBudW1iZXIpOwotICAgIGlmICghaXNfcG5nKQotICAgIHsKLSAgICAgICByZXR1cm4gKE5PVF9QTkcpOwotICAgIH0KLQotTmV4dCwgcG5nX3N0cnVjdCBhbmQgcG5nX2luZm8gbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLiAgSW4KLW9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgY29ycmVjdCBldmVuIHdpdGggYQotZHluYW1pY2FsbHkgbGlua2VkIGxpYnBuZywgdGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZAotYWxsb2NhdGUgdGhlIHN0cnVjdHVyZXMuICBXZSBhbHNvIHBhc3MgdGhlIGxpYnJhcnkgdmVyc2lvbiwgb3B0aW9uYWwKLXBvaW50ZXJzIHRvIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucywgYW5kIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0IGZvcgotdXNlIGJ5IHRoZSBlcnJvciBmdW5jdGlvbnMsIGlmIG5lY2Vzc2FyeSAodGhlIHBvaW50ZXIgYW5kIGZ1bmN0aW9ucyBjYW4KLWJlIE5VTEwgaWYgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlcnMgYXJlIHRvIGJlIHVzZWQpLiAgU2VlIHRoZSBzZWN0aW9uCi1vbiBDaGFuZ2VzIHRvIExpYnBuZyBiZWxvdyByZWdhcmRpbmcgdGhlIG9sZCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCi1UaGUgc3RydWN0dXJlIGFsbG9jYXRpb24gZnVuY3Rpb25zIHF1aWV0bHkgcmV0dXJuIE5VTEwgaWYgdGhleSBmYWlsIHRvCi1jcmVhdGUgdGhlIHN0cnVjdHVyZSwgc28geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgY2hlY2sgZm9yIHRoYXQuCi0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAotICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4pOwotCi0gICAgaWYgKCFwbmdfcHRyKQotICAgICAgIHJldHVybiAoRVJST1IpOwotCi0gICAgcG5nX2luZm9wIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLQotICAgIGlmICghaW5mb19wdHIpCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLAotICAgICAgICAgICAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLUlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywKLXVzZSBhIGxpYnBuZyB0aGF0IHdhcyBidWlsdCB3aXRoIFBOR19VU0VSX01FTV9TVVBQT1JURUQgZGVmaW5lZCwgYW5kIHVzZQotcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCk6Ci0KLSAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yCi0gICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbiwgKHBuZ192b2lkcCkKLSAgICAgICAgdXNlcl9tZW1fcHRyLCB1c2VyX21hbGxvY19mbiwgdXNlcl9mcmVlX2ZuKTsKLQotVGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIHBhc3NlZCB0byBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KCkKLWFuZCB0aGUgbWVtb3J5IGFsbG9jL2ZyZWUgcm91dGluZXMgcGFzc2VkIHRvIHBuZ19jcmVhdGVfc3RydWN0XzIoKQotYXJlIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBsaWJwbmcgc3VwcGxpZWQgZXJyb3IKLWhhbmRsaW5nIGFuZCBtZW1vcnkgYWxsb2MvZnJlZSBmdW5jdGlvbnMuCi0KLVdoZW4gbGlicG5nIGVuY291bnRlcnMgYW4gZXJyb3IsIGl0IGV4cGVjdHMgdG8gbG9uZ2ptcCBiYWNrCi10byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBzZXRqbXAgYW5kIHBhc3MKLXlvdXIgcG5nX2ptcGJ1ZihwbmdfcHRyKS4gIElmIHlvdSByZWFkIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50Ci1yb3V0aW5lcywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGxvbmdqbXAgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IGVudGVyCi1hIG5ldyByb3V0aW5lIHRoYXQgd2lsbCBjYWxsIGEgcG5nXyooKSBmdW5jdGlvbi4KLQotU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcCBmb3IgeW91ciBjb21waWxlciBmb3IgbW9yZQotaW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUgdGhlIGRpc2N1c3Npb24gb24gbGlicG5nIGVycm9yCi1oYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nIHNlY3Rpb24gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuZCBsaWJwbmcgbG9uZ2ptcCdzCi1iYWNrIHRvIHlvdXIgc2V0am1wLCB5b3Ugd2lsbCB3YW50IHRvIGNhbGwgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSB0bwotZnJlZSBhbnkgbWVtb3J5LgotCi0gICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ19wdHIpKSkKLSAgICB7Ci0gICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAgICAgJmVuZF9pbmZvKTsKLSAgICAgICBmY2xvc2UoZnApOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotUGFzcyAocG5nX2luZm9wcClOVUxMIGluc3RlYWQgb2YgJmVuZF9pbmZvIGlmIHlvdSBkaWRuJ3QgY3JlYXRlCi1hbiBlbmRfaW5mbyBzdHJ1Y3R1cmUuCi0KLUlmIHlvdSB3b3VsZCByYXRoZXIgYXZvaWQgdGhlIGNvbXBsZXhpdHkgb2Ygc2V0am1wL2xvbmdqbXAgaXNzdWVzLAoteW91IGNhbiBjb21waWxlIGxpYnBuZyB3aXRoIFBOR19OT19TRVRKTVAsIGluIHdoaWNoIGNhc2UKLWVycm9ycyB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gUE5HX0FCT1JUKCkgd2hpY2ggZGVmYXVsdHMgdG8gYWJvcnQoKS4KLQotWW91IGNhbiAjZGVmaW5lIFBOR19BQk9SVCgpIHRvIGEgZnVuY3Rpb24gdGhhdCBkb2VzIHNvbWV0aGluZwotbW9yZSB1c2VmdWwgdGhhbiBhYm9ydCgpLCBhcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QKLXJldHVybi4KLQotTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgaW5wdXQgY29kZS4gIFRoZSBkZWZhdWx0IGZvciBsaWJwbmcgaXMgdG8KLXVzZSB0aGUgQyBmdW5jdGlvbiBmcmVhZCgpLiAgSWYgeW91IHVzZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgYQotdmFsaWQgRklMRSAqIGluIHRoZSBmdW5jdGlvbiBwbmdfaW5pdF9pbygpLiAgQmUgc3VyZSB0aGF0IHRoZSBmaWxlIGlzCi1vcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBJZiB5b3Ugd2lzaCB0byBoYW5kbGUgcmVhZGluZyBkYXRhIGluIGFub3RoZXIKLXdheSwgeW91IG5lZWQgbm90IGNhbGwgdGhlIHBuZ19pbml0X2lvKCkgZnVuY3Rpb24sIGJ1dCB5b3UgbXVzdCB0aGVuCi1pbXBsZW1lbnQgdGhlIGxpYnBuZyBJL08gbWV0aG9kcyBkaXNjdXNzZWQgaW4gdGhlIEN1c3RvbWl6aW5nIExpYnBuZwotc2VjdGlvbiBiZWxvdy4KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKLQotSWYgeW91IGhhZCBwcmV2aW91c2x5IG9wZW5lZCB0aGUgZmlsZSBhbmQgcmVhZCBhbnkgb2YgdGhlIHNpZ25hdHVyZSBmcm9tCi10aGUgYmVnaW5uaW5nIGluIG9yZGVyIHRvIHNlZSBpZiB0aGlzIHdhcyBhIFBORyBmaWxlLCB5b3UgbmVlZCB0byBsZXQKLWxpYnBuZyBrbm93IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnl0ZXMgbWlzc2luZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLQotICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIG51bWJlcik7Ci0KLVlvdSBjYW4gY2hhbmdlIHRoZSB6bGliIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQgd2hpbGUKLXJlYWRpbmcgY29tcHJlc3NlZCBkYXRhIHdpdGgKLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgYnVmZmVyX3NpemUpOwotCi13aGVyZSB0aGUgZGVmYXVsdCBzaXplIGlzIDgxOTIgYnl0ZXMuICBOb3RlIHRoYXQgdGhlIGJ1ZmZlciBzaXplCi1pcyBjaGFuZ2VkIGltbWVkaWF0ZWx5IGFuZCB0aGUgYnVmZmVyIGlzIHJlYWxsb2NhdGVkIGltbWVkaWF0ZWx5LAotaW5zdGVhZCBvZiBzZXR0aW5nIGEgZmxhZyB0byBiZSBhY3RlZCB1cG9uIGxhdGVyLgotCi1JZiB5b3Ugd2FudCBDUkMgZXJyb3JzIHRvIGJlIGhhbmRsZWQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYW4KLXRoZSBkZWZhdWx0LCB1c2UKLQotICAgIHBuZ19zZXRfY3JjX2FjdGlvbihwbmdfcHRyLCBjcml0X2FjdGlvbiwgYW5jaWxfYWN0aW9uKTsKLQotVGhlIHZhbHVlcyBmb3IgcG5nX3NldF9jcmNfYWN0aW9uKCkgc2F5IGhvdyBsaWJwbmcgaXMgdG8gaGFuZGxlIENSQyBlcnJvcnMgaW4KLWFuY2lsbGFyeSBhbmQgY3JpdGljYWwgY2h1bmtzLCBhbmQgd2hldGhlciB0byB1c2UgdGhlIGRhdGEgY29udGFpbmVkCi10aGVyZWluLiAgTm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gImRpc2NhcmQiIGRhdGEgaW4gYSBjcml0aWNhbAotY2h1bmsuCi0KLUNob2ljZXMgZm9yIChpbnQpIGNyaXRfYWN0aW9uIGFyZQotICAgUE5HX0NSQ19ERUZBVUxUICAgICAgMCAgZXJyb3IvcXVpdAotICAgUE5HX0NSQ19FUlJPUl9RVUlUICAgMSAgZXJyb3IvcXVpdAotICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQotICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKLSAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQotCi1DaG9pY2VzIGZvciAoaW50KSBhbmNpbF9hY3Rpb24gYXJlCi0gICBQTkdfQ1JDX0RFRkFVTFQgICAgICAwICBlcnJvci9xdWl0Ci0gICBQTkdfQ1JDX0VSUk9SX1FVSVQgICAxICBlcnJvci9xdWl0Ci0gICBQTkdfQ1JDX1dBUk5fRElTQ0FSRCAyICB3YXJuL2Rpc2NhcmQgZGF0YQotICAgUE5HX0NSQ19XQVJOX1VTRSAgICAgMyAgd2Fybi91c2UgZGF0YQotICAgUE5HX0NSQ19RVUlFVF9VU0UgICAgNCAgcXVpZXQvdXNlIGRhdGEKLSAgIFBOR19DUkNfTk9fQ0hBTkdFICAgIDUgIHVzZSB0aGUgY3VycmVudCB2YWx1ZQotCi0uU1MgU2V0dGluZyB1cCBjYWxsYmFjayBjb2RlCi0KLVlvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGFueSB1bmtub3duIGNodW5rcyBpbiB0aGUKLWlucHV0IHN0cmVhbS4gWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgotCi0gICAgcmVhZF9jaHVua19jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICAgcG5nX3Vua25vd25fY2h1bmtwIGNodW5rKTsKLSAgICB7Ci0gICAgICAgLyogVGhlIHVua25vd24gY2h1bmsgc3RydWN0dXJlIGNvbnRhaW5zIHlvdXIKLSAgICAgICAgICBjaHVuayBkYXRhLCBhbG9uZyB3aXRoIHNpbWlsYXIgZGF0YSBmb3IgYW55IG90aGVyCi0gICAgICAgICAgdW5rbm93biBjaHVua3M6ICovCi0KLSAgICAgICAgICAgcG5nX2J5dGUgbmFtZVs1XTsKLSAgICAgICAgICAgcG5nX2J5dGUgKmRhdGE7Ci0gICAgICAgICAgIHBuZ19zaXplX3Qgc2l6ZTsKLQotICAgICAgIC8qIE5vdGUgdGhhdCBsaWJwbmcgaGFzIGFscmVhZHkgdGFrZW4gY2FyZSBvZgotICAgICAgICAgIHRoZSBDUkMgaGFuZGxpbmcgKi8KLQotICAgICAgIC8qIHB1dCB5b3VyIGNvZGUgaGVyZS4gIFNlYXJjaCBmb3IgeW91ciBjaHVuayBpbiB0aGUKLSAgICAgICAgICB1bmtub3duIGNodW5rIHN0cnVjdHVyZSwgcHJvY2VzcyBpdCwgYW5kIHJldHVybiBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nOiAqLwotCi0gICAgICAgcmV0dXJuIChcLW4pOyAvKiBjaHVuayBoYWQgYW4gZXJyb3IgKi8KLSAgICAgICByZXR1cm4gKDApOyAvKiBkaWQgbm90IHJlY29nbml6ZSAqLwotICAgICAgIHJldHVybiAobik7IC8qIHN1Y2Nlc3MgKi8KLSAgICB9Ci0KLShZb3UgY2FuIGdpdmUgeW91ciBmdW5jdGlvbiBhbm90aGVyIG5hbWUgdGhhdCB5b3UgbGlrZSBpbnN0ZWFkIG9mCi0icmVhZF9jaHVua19jYWxsYmFjayIpCi0KLVRvIGluZm9ybSBsaWJwbmcgYWJvdXQgeW91ciBmdW5jdGlvbiwgdXNlCi0KLSAgICBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbihwbmdfcHRyLCB1c2VyX2NodW5rX3B0ciwKLSAgICAgICAgcmVhZF9jaHVua19jYWxsYmFjayk7Ci0KLVRoaXMgbmFtZXMgbm90IG9ubHkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCBidXQgYWxzbyBhIHVzZXIgcG9pbnRlciB0aGF0Ci15b3UgY2FuIHJldHJpZXZlIHdpdGgKLQotICAgIHBuZ19nZXRfdXNlcl9jaHVua19wdHIocG5nX3B0cik7Ci0KLUlmIHlvdSBjYWxsIHRoZSBwbmdfc2V0X3JlYWRfdXNlcl9jaHVua19mbigpIGZ1bmN0aW9uLCB0aGVuIGFsbCB1bmtub3duCi1jaHVua3Mgd2hpY2ggdGhlIGNhbGxiYWNrIGRvZXMgbm90IGhhbmRsZSB3aWxsIGJlIHNhdmVkIHdoZW4gcmVhZC4gIFlvdSBjYW4KLWNhdXNlIHRoZW0gdG8gYmUgZGlzY2FyZGVkIGJ5IHJldHVybmluZyAnMScgKCJoYW5kbGVkIikgaW5zdGVhZCBvZiAnMCcuICBUaGlzCi1iZWhhdmlvciB3aWxsIGNoYW5nZSBpbiBsaWJwbmcgMS43IGFuZCB0aGUgZGVmYXVsdCBoYW5kbGluZyBzZXQgYnkgdGhlCi1wbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbiwgZGVzY3JpYmVkIGJlbG93LCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUKLWNhbGxiYWNrIHJldHVybnMgMC4gIElmIHlvdSB3YW50IHRoZSBleGlzdGluZyBiZWhhdmlvciB5b3Ugc2hvdWxkIHNldCB0aGUgZ2xvYmFsCi1kZWZhdWx0IHRvIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSBub3c7IHRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBjdXJyZW50Ci12ZXJzaW9ucyBvZiBsaWJwbmcgYW5kIHdpdGggMS43LiAgTGlicG5nIDEuNiBpc3N1ZXMgYSB3YXJuaW5nIGlmIHlvdSBrZWVwIHRoZQotZGVmYXVsdCwgb3IgUE5HX0hBTkRMRV9DSFVOS19ORVZFUiwgYW5kIHRoZSBjYWxsYmFjayByZXR1cm5zIDAuCi0KLUF0IHRoaXMgcG9pbnQsIHlvdSBjYW4gc2V0IHVwIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlCi1jYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaGFzIGJlZW4gcmVhZCwgd2hpY2ggeW91IGNhbiB1c2UgdG8gY29udHJvbAotYSBwcm9ncmVzcyBtZXRlciBvciB0aGUgbGlrZS4gIEl0J3MgZGVtb25zdHJhdGVkIGluIHBuZ3Rlc3QuYy4KLVlvdSBtdXN0IHN1cHBseSBhIGZ1bmN0aW9uCi0KLSAgICB2b2lkIHJlYWRfcm93X2NhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgcG5nX3VpbnRfMzIgcm93LCBpbnQgcGFzcyk7Ci0gICAgewotICAgICAgLyogcHV0IHlvdXIgY29kZSBoZXJlICovCi0gICAgfQotCi0oWW91IGNhbiBnaXZlIGl0IGFub3RoZXIgbmFtZSB0aGF0IHlvdSBsaWtlIGluc3RlYWQgb2YgInJlYWRfcm93X2NhbGxiYWNrIikKLQotVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4ocG5nX3B0ciwgcmVhZF9yb3dfY2FsbGJhY2spOwotCi1XaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRoZSByb3cgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCBhbmQKLXRoZSAncm93JyBhbmQgJ3Bhc3MnIHJlZmVyIHRvIHRoZSBuZXh0IHJvdyB0byBiZSBoYW5kbGVkLiAgRm9yIHRoZQotbm9uLWludGVybGFjZWQgY2FzZSB0aGUgcm93IHRoYXQgd2FzIGp1c3QgaGFuZGxlZCBpcyBzaW1wbHkgb25lIGxlc3MgdGhhbiB0aGUKLXBhc3NlZCBpbiByb3cgbnVtYmVyLCBhbmQgcGFzcyB3aWxsIGFsd2F5cyBiZSAwLiAgRm9yIHRoZSBpbnRlcmxhY2VkIGNhc2UgdGhlCi1zYW1lIGFwcGxpZXMgdW5sZXNzIHRoZSByb3cgdmFsdWUgaXMgMCwgaW4gd2hpY2ggY2FzZSB0aGUgcm93IGp1c3QgaGFuZGxlZCB3YXMKLXRoZSBsYXN0IG9uZSBmcm9tIG9uZSBvZiB0aGUgcHJlY2VkaW5nIHBhc3Nlcy4gIEJlY2F1c2UgaW50ZXJsYWNpbmcgbWF5IHNraXAgYQotcGFzcyB5b3UgY2Fubm90IGJlIHN1cmUgdGhhdCB0aGUgcHJlY2VkaW5nIHBhc3MgaXMganVzdCAncGFzc1wtMSc7IGlmIHlvdSByZWFsbHkKLW5lZWQgdG8ga25vdyB3aGF0IHRoZSBsYXN0IHBhc3MgaXMgcmVjb3JkIChyb3cscGFzcykgZnJvbSB0aGUgY2FsbGJhY2sgYW5kIHVzZQotdGhlIGxhc3QgcmVjb3JkZWQgdmFsdWUgZWFjaCB0aW1lLgotCi1BcyB3aXRoIHRoZSB1c2VyIHRyYW5zZm9ybSB5b3UgY2FuIGZpbmQgdGhlIG91dHB1dCByb3cgdXNpbmcgdGhlCi1QTkdfUk9XX0ZST01fUEFTU19ST1cgbWFjcm8uCi0KLS5TUyBVbmtub3duLWNodW5rIGhhbmRsaW5nCi0KLU5vdyB5b3UgZ2V0IHRvIHNldCB0aGUgd2F5IHRoZSBsaWJyYXJ5IHByb2Nlc3NlcyB1bmtub3duIGNodW5rcyBpbiB0aGUKLWlucHV0IFBORyBzdHJlYW0uIEJvdGgga25vd24gYW5kIHVua25vd24gY2h1bmtzIHdpbGwgYmUgcmVhZC4gIE5vcm1hbAotYmVoYXZpb3IgaXMgdGhhdCBrbm93biBjaHVua3Mgd2lsbCBiZSBwYXJzZWQgaW50byBpbmZvcm1hdGlvbiBpbgotdmFyaW91cyBpbmZvX3B0ciBtZW1iZXJzIHdoaWxlIHVua25vd24gY2h1bmtzIHdpbGwgYmUgZGlzY2FyZGVkLiBUaGlzCi1iZWhhdmlvciBjYW4gYmUgd2FzdGVmdWwgaWYgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIHVzZSBzb21lIGtub3duCi1jaHVuayB0eXBlcy4gVG8gY2hhbmdlIHRoaXMsIHlvdSBjYW4gY2FsbDoKLQotICAgIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBrZWVwLAotICAgICAgICBjaHVua19saXN0LCBudW1fY2h1bmtzKTsKLQotICAgIGtlZXAgICAgICAgLSAwOiBkZWZhdWx0IHVua25vd24gY2h1bmsgaGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgMTogaWdub3JlOyBkbyBub3Qga2VlcAotICAgICAgICAgICAgICAgICAyOiBrZWVwIG9ubHkgaWYgc2FmZS10by1jb3B5Ci0gICAgICAgICAgICAgICAgIDM6IGtlZXAgZXZlbiBpZiB1bnNhZmUtdG8tY29weQotCi0gICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGVzZSBkZWZpbml0aW9uczoKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BU19ERUZBVUxUICAgMAotICAgICAgICAgICAgICAgICBQTkdfSEFORExFX0NIVU5LX05FVkVSICAgICAgICAxCi0gICAgICAgICAgICAgICAgIFBOR19IQU5ETEVfQ0hVTktfSUZfU0FGRSAgICAgIDIKLSAgICAgICAgICAgICAgICAgUE5HX0hBTkRMRV9DSFVOS19BTFdBWVMgICAgICAgMwotCi0gICAgY2h1bmtfbGlzdCAtIGxpc3Qgb2YgY2h1bmtzIGFmZmVjdGVkIChhIGJ5dGUgc3RyaW5nLAotICAgICAgICAgICAgICAgICBmaXZlIGJ5dGVzIHBlciBjaHVuaywgTlVMTCBvciAnXDAnIGlmCi0gICAgICAgICAgICAgICAgIG51bV9jaHVua3MgaXMgcG9zaXRpdmU7IGlnbm9yZWQgaWYKLSAgICAgICAgICAgICAgICAgbnVtY2h1bmtzIDw9IDApLgotCi0gICAgbnVtX2NodW5rcyAtIG51bWJlciBvZiBjaHVua3MgYWZmZWN0ZWQ7IGlmIDAsIGFsbAotICAgICAgICAgICAgICAgICB1bmtub3duIGNodW5rcyBhcmUgYWZmZWN0ZWQuICBJZiBwb3NpdGl2ZSwKLSAgICAgICAgICAgICAgICAgb25seSB0aGUgY2h1bmtzIGluIHRoZSBsaXN0IGFyZSBhZmZlY3RlZCwKLSAgICAgICAgICAgICAgICAgYW5kIGlmIG5lZ2F0aXZlIGFsbCB1bmtub3duIGNodW5rcyBhbmQKLSAgICAgICAgICAgICAgICAgYWxsIGtub3duIGNodW5rcyBleGNlcHQgZm9yIHRoZSBJSERSLAotICAgICAgICAgICAgICAgICBQTFRFLCB0Uk5TLCBJREFULCBhbmQgSUVORCBjaHVua3MgYXJlCi0gICAgICAgICAgICAgICAgIGFmZmVjdGVkLgotCi1Vbmtub3duIGNodW5rcyBkZWNsYXJlZCBpbiB0aGlzIHdheSB3aWxsIGJlIHNhdmVkIGFzIHJhdyBkYXRhIG9udG8gYQotbGlzdCBvZiBwbmdfdW5rbm93bl9jaHVuayBzdHJ1Y3R1cmVzLiAgSWYgYSBjaHVuayB0aGF0IGlzIG5vcm1hbGx5Ci1rbm93biB0byBsaWJwbmcgaXMgbmFtZWQgaW4gdGhlIGxpc3QsIGl0IHdpbGwgYmUgaGFuZGxlZCBhcyB1bmtub3duLAotYWNjb3JkaW5nIHRvIHRoZSAia2VlcCIgZGlyZWN0aXZlLiAgSWYgYSBjaHVuayBpcyBuYW1lZCBpbiBzdWNjZXNzaXZlCi1pbnN0YW5jZXMgb2YgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKCksIHRoZSBmaW5hbCBpbnN0YW5jZSB3aWxsCi10YWtlIHByZWNlZGVuY2UuICBUaGUgSUhEUiBhbmQgSUVORCBjaHVua3Mgc2hvdWxkIG5vdCBiZSBuYW1lZCBpbgotY2h1bmtfbGlzdDsgaWYgdGhleSBhcmUsIGxpYnBuZyB3aWxsIHByb2Nlc3MgdGhlbSBub3JtYWxseSBhbnl3YXkuCi1JZiB5b3Uga25vdyB0aGF0IHlvdXIgYXBwbGljYXRpb24gd2lsbCBuZXZlciBtYWtlIHVzZSBvZiBzb21lIHBhcnRpY3VsYXIKLWNodW5rcywgdXNlIFBOR19IQU5ETEVfQ0hVTktfTkVWRVIgKG9yIDEpIGFzIGRlbW9uc3RyYXRlZCBiZWxvdy4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSB1c2FnZSBvZiBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MoKSwKLXdoZXJlIHRoZSBwcml2YXRlICJ2cEFnIiBjaHVuayB3aWxsIGxhdGVyIGJlIHByb2Nlc3NlZCBieSBhIHVzZXIgY2h1bmsKLWNhbGxiYWNrIGZ1bmN0aW9uOgotCi0gICAgcG5nX2J5dGUgdnBBZ1s1XT17MTE4LCAxMTIsICA2NSwgMTAzLCAocG5nX2J5dGUpICdcMCd9OwotCi0gICAgI2lmIGRlZmluZWQoUE5HX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkKLSAgICAgIHBuZ19ieXRlIHVudXNlZF9jaHVua3NbXT0KLSAgICAgIHsKLSAgICAgICAgMTA0LCAgNzMsICA4MywgIDg0LCAocG5nX2J5dGUpICdcMCcsICAgLyogaElTVCAqLwotICAgICAgICAxMDUsICA4NCwgIDg4LCAxMTYsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBpVFh0ICovCi0gICAgICAgIDExMiwgIDY3LCAgNjUsICA3NiwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHBDQUwgKi8KLSAgICAgICAgMTE1LCAgNjcsICA2NSwgIDc2LCAocG5nX2J5dGUpICdcMCcsICAgLyogc0NBTCAqLwotICAgICAgICAxMTUsICA4MCwgIDc2LCAgODQsIChwbmdfYnl0ZSkgJ1wwJywgICAvKiBzUExUICovCi0gICAgICAgIDExNiwgIDczLCAgNzcsICA2OSwgKHBuZ19ieXRlKSAnXDAnLCAgIC8qIHRJTUUgKi8KLSAgICAgIH07Ci0gICAgI2VuZGlmCi0KLSAgICAuLi4KLQotICAgICNpZiBkZWZpbmVkKFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpCi0gICAgICAvKiBpZ25vcmUgYWxsIHVua25vd24gY2h1bmtzCi0gICAgICAgKiAodXNlIGdsb2JhbCBzZXR0aW5nICIyIiBmb3IgbGlicG5nMTYgYW5kIGVhcmxpZXIpOgotICAgICAgICovCi0gICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDIsIE5VTEwsIDApOwotCi0gICAgICAvKiBleGNlcHQgZm9yIHZwQWc6ICovCi0gICAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocmVhZF9wdHIsIDIsIHZwQWcsIDEpOwotCi0gICAgICAvKiBhbHNvIGlnbm9yZSB1bnVzZWQga25vd24gY2h1bmtzOiAqLwotICAgICAgcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzKHJlYWRfcHRyLCAxLCB1bnVzZWRfY2h1bmtzLAotICAgICAgICAgKGludCkoc2l6ZW9mIHVudXNlZF9jaHVua3MpLzUpOwotICAgICNlbmRpZgotCi0uU1MgVXNlciBsaW1pdHMKLQotVGhlIFBORyBzcGVjaWZpY2F0aW9uIGFsbG93cyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBhbiBpbWFnZSB0byBiZSBhcwotbGFyZ2UgYXMgMl4oMzFcLTEgKDB4N2ZmZmZmZmYpLCBvciBhYm91dCAyLjE0NyBiaWxsaW9uIHJvd3MgYW5kIGNvbHVtbnMuCi1Gb3Igc2FmZXR5LCBsaWJwbmcgaW1wb3NlcyBhIGRlZmF1bHQgbGltaXQgb2YgMSBtaWxsaW9uIHJvd3MgYW5kIGNvbHVtbnMuCi1MYXJnZXIgaW1hZ2VzIHdpbGwgYmUgcmVqZWN0ZWQgaW1tZWRpYXRlbHkgd2l0aCBhIHBuZ19lcnJvcigpIGNhbGwuIElmCi15b3Ugd2lzaCB0byBjaGFuZ2UgdGhlc2UgbGltaXRzLCB5b3UgY2FuIHVzZQotCi0gICBwbmdfc2V0X3VzZXJfbGltaXRzKHBuZ19wdHIsIHdpZHRoX21heCwgaGVpZ2h0X21heCk7Ci0KLXRvIHNldCB5b3VyIG93biBsaW1pdHMgKGxpYnBuZyBtYXkgcmVqZWN0IHNvbWUgdmVyeSB3aWRlIGltYWdlcwotYW55d2F5IGJlY2F1c2Ugb2YgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdyBjb25kaXRpb25zKS4KLQotWW91IHNob3VsZCBwdXQgdGhpcyBzdGF0ZW1lbnQgYWZ0ZXIgeW91IGNyZWF0ZSB0aGUgUE5HIHN0cnVjdHVyZSBhbmQKLWJlZm9yZSBjYWxsaW5nIHBuZ19yZWFkX2luZm8oKSwgcG5nX3JlYWRfcG5nKCksIG9yIHBuZ19wcm9jZXNzX2RhdGEoKS4KLQotV2hlbiB3cml0aW5nIGEgUE5HIGRhdGFzdHJlYW0sIHB1dCB0aGlzIHN0YXRlbWVudCBiZWZvcmUgY2FsbGluZwotcG5nX3dyaXRlX2luZm8oKSBvciBwbmdfd3JpdGVfcG5nKCkuCi0KLUlmIHlvdSBuZWVkIHRvIHJldHJpZXZlIHRoZSBsaW1pdHMgdGhhdCBhcmUgYmVpbmcgYXBwbGllZCwgdXNlCi0KLSAgIHdpZHRoX21heCA9IHBuZ19nZXRfdXNlcl93aWR0aF9tYXgocG5nX3B0cik7Ci0gICBoZWlnaHRfbWF4ID0gcG5nX2dldF91c2VyX2hlaWdodF9tYXgocG5nX3B0cik7Ci0KLVRoZSBQTkcgc3BlY2lmaWNhdGlvbiBzZXRzIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgYW5jaWxsYXJ5IGNodW5rcwotYWxsb3dlZCBpbiBhIFBORyBkYXRhc3RyZWFtLiAgQnkgZGVmYXVsdCwgbGlicG5nIGltcG9zZXMgYSBsaW1pdCBvZgotYSB0b3RhbCBvZiAxMDAwIHNQTFQsIHRFWHQsIGlUWHQsIHpUWHQsIGFuZCB1bmtub3duIGNodW5rcyB0byBiZSBzdG9yZWQuCi1JZiB5b3UgaGF2ZSBzZXQgdXAgYm90aCBpbmZvX3B0ciBhbmQgZW5kX2luZm9fcHRyLCB0aGUgbGltaXQgYXBwbGllcwotc2VwYXJhdGVseSB0byBlYWNoLiAgWW91IGNhbiBjaGFuZ2UgdGhlIGxpbWl0IG9uIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3VjaAotY2h1bmtzIHRoYXQgd2lsbCBiZSBzdG9yZWQsIHdpdGgKLQotICAgcG5nX3NldF9jaHVua19jYWNoZV9tYXgocG5nX3B0ciwgdXNlcl9jaHVua19jYWNoZV9tYXgpOwotCi13aGVyZSAweDdmZmZmZmZmTCBtZWFucyB1bmxpbWl0ZWQuICBZb3UgY2FuIHJldHJpZXZlIHRoaXMgbGltaXQgd2l0aAotCi0gICBjaHVua19jYWNoZV9tYXggPSBwbmdfZ2V0X2NodW5rX2NhY2hlX21heChwbmdfcHRyKTsKLQotTGlicG5nIGltcG9zZXMgYSBsaW1pdCBvZiA4IE1lZ2FieXRlcyAoOCwwMDAsMDAwIGJ5dGVzKSBvbiB0aGUgYW1vdW50IG9mCi1tZW1vcnkgdGhhdCBhIGNvbXByZXNzZWQgY2h1bmsgb3RoZXIgdGhhbiBJREFUIGNhbiBvY2N1cHksIHdoZW4gZGVjb21wcmVzc2VkLgotWW91IGNhbiBjaGFuZ2UgdGhpcyBsaW1pdCB3aXRoCi0KLSAgIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heChwbmdfcHRyLCB1c2VyX2NodW5rX21hbGxvY19tYXgpOwotCi1hbmQgeW91IGNhbiByZXRyaWV2ZSB0aGUgbGltaXQgd2l0aAotCi0gICBjaHVua19tYWxsb2NfbWF4ID0gcG5nX2dldF9jaHVua19tYWxsb2NfbWF4KHBuZ19wdHIpOwotCi1BbnkgY2h1bmtzIHRoYXQgd291bGQgY2F1c2UgZWl0aGVyIG9mIHRoZXNlIGxpbWl0cyB0byBiZSBleGNlZWRlZCB3aWxsCi1iZSBpZ25vcmVkLgotCi0uU1MgSW5mb3JtYXRpb24gYWJvdXQgeW91ciBzeXN0ZW0KLQotSWYgeW91IGludGVuZCB0byBkaXNwbGF5IHRoZSBQTkcgb3IgdG8gaW5jb3Jwb3JhdGUgaXQgaW4gb3RoZXIgaW1hZ2UgZGF0YSB5b3UKLW5lZWQgdG8gdGVsbCBsaWJwbmcgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBkaXNwbGF5IG9yIGRyYXdpbmcgc3VyZmFjZSBzbyB0aGF0Ci1saWJwbmcgY2FuIGNvbnZlcnQgdGhlIHZhbHVlcyBpbiB0aGUgaW1hZ2UgdG8gbWF0Y2ggdGhlIGRpc3BsYXkuCi0KLUZyb20gbGlicG5nLTEuNS40IHRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHNldCBiZWZvcmUgcmVhZGluZyB0aGUgUE5HIGZpbGUKLWhlYWRlci4gIEluIGVhcmxpZXIgdmVyc2lvbnMgcG5nX3NldF9nYW1tYSgpIGV4aXN0ZWQgYnV0IGJlaGF2ZWQgaW5jb3JyZWN0bHkgaWYKLWNhbGxlZCBiZWZvcmUgdGhlIFBORyBmaWxlIGhlYWRlciBoYWQgYmVlbiByZWFkIGFuZCBwbmdfc2V0X2FscGhhX21vZGUoKSBkaWQgbm90Ci1leGlzdC4KLQotSWYgeW91IG5lZWQgdG8gc3VwcG9ydCB2ZXJzaW9ucyBwcmlvciB0byBsaWJwbmctMS41LjQgdGVzdCB0aGUgdmVyc2lvbiBudW1iZXIKLWFzIGlsbHVzdHJhdGVkIGJlbG93IHVzaW5nICJQTkdfTElCUE5HX1ZFUiA+PSAxMDUwNCIgYW5kIGZvbGxvdyB0aGUgcHJvY2VkdXJlcwotZGVzY3JpYmVkIGluIHRoZSBhcHByb3ByaWF0ZSBtYW51YWwgcGFnZS4KLQotWW91IGdpdmUgbGlicG5nIHRoZSBlbmNvZGluZyBleHBlY3RlZCBieSB5b3VyIHN5c3RlbSBleHByZXNzZWQgYXMgYSAnZ2FtbWEnCi12YWx1ZS4gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIFBORyBmaWxlIGluCi1jYXNlIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nIGZyb20gdGhlIGZpbGUuICBCeSBkZWZhdWx0IGxpYnBuZwotYXNzdW1lcyB0aGF0IHRoZSBQTkcgZGF0YSBtYXRjaGVzIHlvdXIgc3lzdGVtLCB0byBrZWVwIHRoaXMgZGVmYXVsdCBjYWxsOgotCi0gICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgb3V0cHV0X2dhbW1hKTsKLQotb3IgeW91IGNhbiB1c2UgdGhlIGZpeGVkIHBvaW50IGVxdWl2YWxlbnQ6Ci0KLSAgIHBuZ19zZXRfZ2FtbWFfZml4ZWQocG5nX3B0ciwgUE5HX0ZQXzEqc2NyZWVuX2dhbW1hLAotICAgICAgUE5HX0ZQXzEqb3V0cHV0X2dhbW1hKTsKLQotSWYgeW91IGRvbid0IGtub3cgdGhlIGdhbW1hIGZvciB5b3VyIHN5c3RlbSBpdCBpcyBwcm9iYWJseSAyLjIgLSBhIGdvb2QKLWFwcHJveGltYXRpb24gdG8gdGhlIElFQyBzdGFuZGFyZCBmb3IgZGlzcGxheSBzeXN0ZW1zIChzUkdCKS4gIElmIGltYWdlcyBhcmUKLXRvbyBjb250cmFzdHkgb3Igd2FzaGVkIG91dCB5b3UgZ290IHRoZSB2YWx1ZSB3cm9uZyAtIGNoZWNrIHlvdXIgc3lzdGVtCi1kb2N1bWVudGF0aW9uIQotCi1NYW55IHN5c3RlbXMgcGVybWl0IHRoZSBzeXN0ZW0gZ2FtbWEgdG8gYmUgY2hhbmdlZCB2aWEgYSBsb29rdXAgdGFibGUgaW4gdGhlCi1kaXNwbGF5IGRyaXZlciwgYSBmZXcgc3lzdGVtcywgaW5jbHVkaW5nIG9sZGVyIE1hY3MsIGNoYW5nZSB0aGUgcmVzcG9uc2UgYnkKLWRlZmF1bHQuICBBcyBvZiAxLjUuNCB0aHJlZSBzcGVjaWFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlIHRvIGhhbmRsZSBjb21tb24KLXNpdHVhdGlvbnM6Ci0KLSAgIFBOR19ERUZBVUxUX3NSR0I6IEluZGljYXRlcyB0aGF0IHRoZSBzeXN0ZW0gY29uZm9ybXMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBJRUMgNjE5NjYtMi0xIHN0YW5kYXJkLiAgVGhpcyBtYXRjaGVzIGFsbW9zdAotICAgICAgICAgICAgICAgICAgICAgYWxsIHN5c3RlbXMuCi0gICBQTkdfR0FNTUFfTUFDXzE4OiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3lzdGVtIGlzIGFuIG9sZGVyCi0gICAgICAgICAgICAgICAgICAgICAocHJlIE1hYyBPUyAxMC42KSBBcHBsZSBNYWNpbnRvc2ggc3lzdGVtIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IHNldHRpbmdzLgotICAgUE5HX0dBTU1BX0xJTkVBUjogSnVzdCB0aGUgZml4ZWQgcG9pbnQgdmFsdWUgZm9yIDEuMCAtIGluZGljYXRlcwotICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgc3lzdGVtIGV4cGVjdHMgZGF0YSB3aXRoIG5vIGdhbW1hCi0gICAgICAgICAgICAgICAgICAgICBlbmNvZGluZy4KLQotWW91IHdvdWxkIHVzZSB0aGUgbGluZWFyICh1bmVuY29kZWQpIHZhbHVlIGlmIHlvdSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBpeGVsCi12YWx1ZXMgZnVydGhlciBiZWNhdXNlIHRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGRlY29kZSBhbmQgcmUtZW5jb2RlIGVhY2gKLWNvbXBvbmVudCB2YWx1ZSB3aGVuZXZlciBhcml0aG1ldGljIGlzIHBlcmZvcm1lZC4gIEEgbG90IG9mIGdyYXBoaWNzIHNvZnR3YXJlCi11c2VzIGxpbmVhciB2YWx1ZXMgZm9yIHRoaXMgcmVhc29uLCBvZnRlbiB3aXRoIGhpZ2hlciBwcmVjaXNpb24gY29tcG9uZW50IHZhbHVlcwotdG8gcHJlc2VydmUgb3ZlcmFsbCBhY2N1cmFjeS4KLQotCi1UaGUgb3V0cHV0X2dhbW1hIHZhbHVlIGV4cHJlc3NlcyBob3cgdG8gZGVjb2RlIHRoZSBvdXRwdXQgdmFsdWVzLCBub3QgaG93Ci10aGV5IGFyZSBlbmNvZGVkLiAgVGhlIHZhbHVlcyB1c2VkIGNvcnJlc3BvbmQgdG8gdGhlIG5vcm1hbCBudW1iZXJzIHVzZWQgdG8KLWRlc2NyaWJlIHRoZSBvdmVyYWxsIGdhbW1hIG9mIGEgY29tcHV0ZXIgZGlzcGxheSBzeXN0ZW07IGZvciBleGFtcGxlIDIuMiBmb3IKLWFuIHNSR0IgY29uZm9ybWFudCBzeXN0ZW0uICBUaGUgdmFsdWVzIGFyZSBzY2FsZWQgYnkgMTAwMDAwIGluIHRoZSBfZml4ZWQKLXZlcnNpb24gb2YgdGhlIEFQSSAoc28gMjIwMDAwIGZvciBzUkdCLikKLQotVGhlIGludmVyc2Ugb2YgdGhlIHZhbHVlIGlzIGFsd2F5cyB1c2VkIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGZvciB0aGUgUE5HIGZpbGUKLWVuY29kaW5nIGlmIGl0IGhhcyBubyBnQU1BIGNodW5rIGFuZCBpZiBwbmdfc2V0X2dhbW1hKCkgaGFzIG5vdCBiZWVuIGNhbGxlZAotdG8gb3ZlcnJpZGUgdGhlIFBORyBnYW1tYSBpbmZvcm1hdGlvbi4KLQotV2hlbiB0aGUgQUxQSEFfT1BUSU1JWkVEIG1vZGUgaXMgc2VsZWN0ZWQgdGhlIG91dHB1dCBnYW1tYSBpcyB1c2VkIHRvIGVuY29kZQotb3BhcXVlIHBpeGVscyBob3dldmVyIHBpeGVscyB3aXRoIGxvd2VyIGFscGhhIHZhbHVlcyBhcmUgbm90IGVuY29kZWQsCi1yZWdhcmRsZXNzIG9mIHRoZSBvdXRwdXQgZ2FtbWEgc2V0dGluZy4KLQotV2hlbiB0aGUgc3RhbmRhcmQgUG9ydGVyIER1ZmYgaGFuZGxpbmcgaXMgcmVxdWVzdGVkIHdpdGggbW9kZSAxIHRoZSBvdXRwdXQKLWVuY29kaW5nIGlzIHNldCB0byBiZSBsaW5lYXIgYW5kIHRoZSBvdXRwdXRfZ2FtbWEgdmFsdWUgaXMgb25seSByZWxldmFudAotYXMgYSBkZWZhdWx0IGZvciBpbnB1dCBkYXRhIHRoYXQgaGFzIG5vIGdhbW1hIGluZm9ybWF0aW9uLiAgVGhlIGxpbmVhciBvdXRwdXQKLWVuY29kaW5nIHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBwbmdfc2V0X2dhbW1hKCkgaXMgY2FsbGVkIC0gdGhlIHJlc3VsdHMgbWF5IGJlCi1oaWdobHkgdW5leHBlY3RlZCEKLQotVGhlIGZvbGxvd2luZyBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gdGhlIHNSR0Igc3RhbmRhcmQgYW5kIHRoZSByZXNlYXJjaAotYmVoaW5kIGl0LiAgc1JHQiBpcyBkZWZpbmVkIHRvIGJlIGFwcHJveGltYXRlZCBieSBhIFBORyBnQU1BIGNodW5rIHZhbHVlIG9mCi0wLjQ1NDU1ICgxLzIuMikgZm9yIFBORy4gIFRoZSB2YWx1ZSBpbXBsaWNpdGx5IGluY2x1ZGVzIGFueSB2aWV3aW5nCi1jb3JyZWN0aW9uIHJlcXVpcmVkIHRvIHRha2UgYWNjb3VudCBvZiBhbnkgZGlmZmVyZW5jZXMgaW4gdGhlIGNvbG9yCi1lbnZpcm9ubWVudCBvZiB0aGUgb3JpZ2luYWwgc2NlbmUgYW5kIHRoZSBpbnRlbmRlZCBkaXNwbGF5IGVudmlyb25tZW50OyB0aGUKLXZhbHVlIGV4cHJlc3NlcyBob3cgdG8gKmRlY29kZSogdGhlIGltYWdlIGZvciBkaXNwbGF5LCBub3QgaG93IHRoZSBvcmlnaW5hbAotZGF0YSB3YXMgKmVuY29kZWQqLgotCi1zUkdCIHByb3ZpZGVzIGEgcGVnIGZvciB0aGUgUE5HIHN0YW5kYXJkIGJ5IGRlZmluaW5nIGEgdmlld2luZyBlbnZpcm9ubWVudC4KLXNSR0IgaXRzZWxmLCBhbmQgZWFybGllciBUViBzdGFuZGFyZHMsIGFjdHVhbGx5IHVzZSBhIG1vcmUgY29tcGxleCB0cmFuc2Zvcm0KLShhIGxpbmVhciBwb3J0aW9uIHRoZW4gYSBnYW1tYSAyLjQgcG93ZXIgbGF3KSB0aGFuIFBORyBjYW4gZXhwcmVzcy4gIChQTkcgaXMKLWxpbWl0ZWQgdG8gc2ltcGxlIHBvd2VyIGxhd3MuKSAgQnkgc2F5aW5nIHRoYXQgYW4gaW1hZ2UgZm9yIGRpcmVjdCBkaXNwbGF5IG9uCi1hbiBzUkdCIGNvbmZvcm1hbnQgc3lzdGVtIHNob3VsZCBiZSBzdG9yZWQgd2l0aCBhIGdBTUEgY2h1bmsgdmFsdWUgb2YgNDU0NTUKLSgxMS4zLjMuMiBhbmQgMTEuMy4zLjUgb2YgdGhlIElTTyBQTkcgc3BlY2lmaWNhdGlvbikgdGhlIFBORyBzcGVjaWZpY2F0aW9uCi1tYWtlcyBpdCBwb3NzaWJsZSB0byBkZXJpdmUgdmFsdWVzIGZvciBvdGhlciBkaXNwbGF5IHN5c3RlbXMgYW5kCi1lbnZpcm9ubWVudHMuCi0KLVRoZSBNYWMgdmFsdWUgaXMgZGVkdWNlZCBmcm9tIHRoZSBzUkdCIGJhc2VkIG9uIGFuIGFzc3VtcHRpb24gdGhhdCB0aGUgYWN0dWFsCi1leHRyYSB2aWV3aW5nIGNvcnJlY3Rpb24gdXNlZCBpbiBlYXJseSBNYWMgZGlzcGxheSBzeXN0ZW1zIHdhcyBpbXBsZW1lbnRlZCBhcwotYSBwb3dlciAxLjQ1IGxvb2t1cCB0YWJsZS4KLQotQW55IHN5c3RlbSB3aGVyZSBhIHByb2dyYW1tYWJsZSBsb29rdXAgdGFibGUgaXMgdXNlZCBvciB3aGVyZSB0aGUgYmVoYXZpb3Igb2YKLXRoZSBmaW5hbCBkaXNwbGF5IGRldmljZSBjaGFyYWN0ZXJpc3RpY3MgY2FuIGJlIGNoYW5nZWQgcmVxdWlyZXMgc3lzdGVtCi1zcGVjaWZpYyBjb2RlIHRvIG9idGFpbiB0aGUgY3VycmVudCBjaGFyYWN0ZXJpc3RpYy4gIEhvd2V2ZXIgdGhpcyBjYW4gYmUKLWRpZmZpY3VsdCBhbmQgbW9zdCBQTkcgZ2FtbWEgY29ycmVjdGlvbiBvbmx5IHJlcXVpcmVzIGFuIGFwcHJveGltYXRlIHZhbHVlLgotCi1CeSBkZWZhdWx0LCBpZiBwbmdfc2V0X2FscGhhX21vZGUoKSBpcyBub3QgY2FsbGVkLCBsaWJwbmcgYXNzdW1lcyB0aGF0IGFsbAotdmFsdWVzIGFyZSB1bmVuY29kZWQsIGxpbmVhciwgdmFsdWVzIGFuZCB0aGF0IHRoZSBvdXRwdXQgZGV2aWNlIGFsc28gaGFzIGEKLWxpbmVhciBjaGFyYWN0ZXJpc3RpYy4gIFRoaXMgaXMgb25seSB2ZXJ5IHJhcmVseSBjb3JyZWN0IC0gaXQgaXMgaW52YXJpYWJseQotYmV0dGVyIHRvIGNhbGwgcG5nX3NldF9hbHBoYV9tb2RlKCkgd2l0aCBQTkdfREVGQVVMVF9zUkdCIHRoYW4gcmVseSBvbiB0aGUKLWRlZmF1bHQgaWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGUgcmlnaHQgYW5zd2VyIGlzIQotCi1UaGUgc3BlY2lhbCB2YWx1ZSBQTkdfR0FNTUFfTUFDXzE4IGluZGljYXRlcyBhbiBvbGRlciBNYWMgc3lzdGVtIChwcmUgTWFjIE9TCi0xMC42KSB3aGljaCB1c2VkIGEgY29ycmVjdGlvbiB0YWJsZSB0byBpbXBsZW1lbnQgYSBzb21ld2hhdCBsb3dlciBnYW1tYSBvbiBhbgotb3RoZXJ3aXNlIHNSR0Igc3lzdGVtLgotCi1Cb3RoIHRoZXNlIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgKG5vdCBzaW1wbGUgZ2FtbWEgdmFsdWVzKSBpbiBvcmRlciB0byBhbGxvdwotbW9yZSBwcmVjaXNlIGNvcnJlY3Rpb24gaW50ZXJuYWxseSBpbiB0aGUgZnV0dXJlLgotCi1OT1RFOiB0aGUgdmFsdWVzIGNhbiBiZSBwYXNzZWQgdG8gZWl0aGVyIHRoZSBmaXhlZCBvciBmbG9hdGluZwotcG9pbnQgQVBJcywgYnV0IHRoZSBmbG9hdGluZyBwb2ludCBBUEkgd2lsbCBhbHNvIGFjY2VwdCBmbG9hdGluZyBwb2ludAotdmFsdWVzLgotCi1UaGUgc2Vjb25kIHRoaW5nIHlvdSBtYXkgbmVlZCB0byB0ZWxsIGxpYnBuZyBhYm91dCBpcyBob3cgeW91ciBzeXN0ZW0gaGFuZGxlcwotYWxwaGEgY2hhbm5lbCBpbmZvcm1hdGlvbi4gIFNvbWUsIGJ1dCBub3QgYWxsLCBQTkcgZmlsZXMgY29udGFpbiBhbiBhbHBoYQotY2hhbm5lbC4gIFRvIGRpc3BsYXkgdGhlc2UgZmlsZXMgY29ycmVjdGx5IHlvdSBuZWVkIHRvIGNvbXBvc2UgdGhlIGRhdGEgb250byBhCi1zdWl0YWJsZSBiYWNrZ3JvdW5kLCBhcyBkZXNjcmliZWQgaW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uLgotCi1MaWJwbmcgb25seSBzdXBwb3J0cyBjb21wb3Npbmcgb250byBhIHNpbmdsZSBjb2xvciAodXNpbmcgcG5nX3NldF9iYWNrZ3JvdW5kOwotc2VlIGJlbG93KS4gIE90aGVyd2lzZSB5b3UgbXVzdCBkbyB0aGUgY29tcG9zaXRpb24geW91cnNlbGYgYW5kLCBpbiB0aGlzIGNhc2UsCi15b3UgbWF5IG5lZWQgdG8gY2FsbCBwbmdfc2V0X2FscGhhX21vZGU6Ci0KLSAgICNpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDUwNAotICAgICAgcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19wdHIsIG1vZGUsIHNjcmVlbl9nYW1tYSk7Ci0gICAjZWxzZQotICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIDEuMC9zY3JlZW5fZ2FtbWEpOwotICAgI2VuZGlmCi0KLVRoZSBzY3JlZW5fZ2FtbWEgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IHRvIHBuZ19zZXRfZ2FtbWE7IGhvd2V2ZXIsCi1ob3cgaXQgYWZmZWN0cyB0aGUgb3V0cHV0IGRlcGVuZHMgb24gdGhlIG1vZGUuICBwbmdfc2V0X2FscGhhX21vZGUoKSBzZXRzIHRoZQotZmlsZSBnYW1tYSBkZWZhdWx0IHRvIDEvc2NyZWVuX2dhbW1hLCBzbyBub3JtYWxseSB5b3UgZG9uJ3QgbmVlZCB0byBjYWxsCi1wbmdfc2V0X2dhbW1hLiAgSWYgeW91IG5lZWQgZGlmZmVyZW50IGRlZmF1bHRzIGNhbGwgcG5nX3NldF9nYW1tYSgpIGJlZm9yZQotcG5nX3NldF9hbHBoYV9tb2RlKCkgLSBpZiB5b3UgY2FsbCBpdCBhZnRlciBpdCB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5ncyBtYWRlCi1ieSBwbmdfc2V0X2FscGhhX21vZGUoKS4KLQotVGhlIG1vZGUgaXMgYXMgZm9sbG93czoKLQotICAgIFBOR19BTFBIQV9QTkc6IFRoZSBkYXRhIGlzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBQTkcKLXNwZWNpZmljYXRpb24uICBSZWQsIGdyZWVuIGFuZCBibHVlLCBvciBncmF5LCBjb21wb25lbnRzIGFyZQotZ2FtbWEgZW5jb2RlZCBjb2xvciB2YWx1ZXMgYW5kIGFyZSBub3QgcHJlbXVsdGlwbGllZCBieSB0aGUKLWFscGhhIHZhbHVlLiAgVGhlIGFscGhhIHZhbHVlIGlzIGEgbGluZWFyIG1lYXN1cmUgb2YgdGhlCi1jb250cmlidXRpb24gb2YgdGhlIHBpeGVsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZpbmFsIG91dHB1dCBwaXhlbC4KLQotWW91IHNob3VsZCBub3JtYWxseSB1c2UgdGhpcyBmb3JtYXQgaWYgeW91IGludGVuZCB0byBwZXJmb3JtCi1jb2xvciBjb3JyZWN0aW9uIG9uIHRoZSBjb2xvciB2YWx1ZXM7IG1vc3QsIG1heWJlIGFsbCwgY29sb3IKLWNvcnJlY3Rpb24gc29mdHdhcmUgaGFzIG5vIGhhbmRsaW5nIGZvciB0aGUgYWxwaGEgY2hhbm5lbCBhbmQsCi1hbnl3YXksIHRoZSBtYXRoIHRvIGhhbmRsZSBwcmUtbXVsdGlwbGllZCBjb21wb25lbnQgdmFsdWVzIGlzCi11bm5lY2Vzc2FyaWx5IGNvbXBsZXguCi0KLUJlZm9yZSB5b3UgZG8gYW55IGFyaXRobWV0aWMgb24gdGhlIGNvbXBvbmVudCB2YWx1ZXMgeW91IG5lZWQKLXRvIHJlbW92ZSB0aGUgZ2FtbWEgZW5jb2RpbmcgYW5kIG11bHRpcGx5IG91dCB0aGUgYWxwaGEKLWNoYW5uZWwuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbC4gIEl0IGlzCi1pbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHdoZW4gYW4gaW1hZ2Ugd2l0aCBhbiBhbHBoYSBjaGFubmVsIGlzCi1zY2FsZWQsIGxpbmVhciBlbmNvZGVkLCBwcmUtbXVsdGlwbGllZCBjb21wb25lbnQgdmFsdWVzIG11c3QKLWJlIHVzZWQhCi0KLVRoZSByZW1haW5pbmcgbW9kZXMgYXNzdW1lIHlvdSBkb24ndCBuZWVkIHRvIGRvIGFueSBmdXJ0aGVyIGNvbG9yIGNvcnJlY3Rpb24gb3IKLXRoYXQgaWYgeW91IGRvLCB5b3VyIGNvbG9yIGNvcnJlY3Rpb24gc29mdHdhcmUga25vd3MgYWxsIGFib3V0IGFscGhhIChpdAotcHJvYmFibHkgZG9lc24ndCEpLiAgVGhleSAnYXNzb2NpYXRlJyB0aGUgYWxwaGEgd2l0aCB0aGUgY29sb3IgaW5mb3JtYXRpb24gYnkKLXN0b3JpbmcgY29sb3IgY2hhbm5lbCB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gc2NhbGVkIGJ5IHRoZSBhbHBoYS4gIFRoZQotYWR2YW50YWdlIGlzIHRoYXQgdGhlIGNvbG9yIGNoYW5uZWxzIGNhbiBiZSByZXNhbXBsZWQgKHRoZSBpbWFnZSBjYW4gYmUKLXNjYWxlZCkgaW4gdGhpcyBmb3JtLiAgVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IG5vcm1hbCBwcmFjdGljZSBpcyB0byBzdG9yZQotbGluZWFyLCBub3QgKGdhbW1hKSBlbmNvZGVkLCB2YWx1ZXMgYW5kIHRoaXMgcmVxdWlyZXMgMTYtYml0IGNoYW5uZWxzIGZvcgotc3RpbGwgaW1hZ2VzIHJhdGhlciB0aGFuIHRoZSA4LWJpdCBjaGFubmVscyB0aGF0IGFyZSBqdXN0IGFib3V0IHN1ZmZpY2llbnQgaWYKLWdhbW1hIGVuY29kaW5nIGlzIHVzZWQuICBJbiBhZGRpdGlvbiBhbGwgbm9uLXRyYW5zcGFyZW50IHBpeGVsIHZhbHVlcywKLWluY2x1ZGluZyBjb21wbGV0ZWx5IG9wYXF1ZSBvbmVzLCBtdXN0IGJlIGdhbW1hIGVuY29kZWQgdG8gcHJvZHVjZSB0aGUgZmluYWwKLWltYWdlLiAgVGhlc2UgYXJlIHRoZSAnU1RBTkRBUkQnLCAnQVNTT0NJQVRFRCcgb3IgJ1BSRU1VTFRJUExJRUQnIG1vZGVzCi1kZXNjcmliZWQgYmVsb3cgKHRoZSBsYXR0ZXIgYmVpbmcgdGhlIHR3byBjb21tb24gbmFtZXMgZm9yIGFzc29jaWF0ZWQgYWxwaGEKLWNvbG9yIGNoYW5uZWxzKS4gTm90ZSB0aGF0IFBORyBmaWxlcyBhbHdheXMgY29udGFpbiBub24tYXNzb2NpYXRlZCBjb2xvcgotY2hhbm5lbHM7IHBuZ19zZXRfYWxwaGFfbW9kZSgpIHdpdGggb25lIG9mIHRoZSBtb2RlcyBjYXVzZXMgdGhlIGRlY29kZXIgdG8KLWNvbnZlcnQgdGhlIHBpeGVscyB0byBhbiBhc3NvY2lhdGVkIGZvcm0gYmVmb3JlIHJldHVybmluZyB0aGVtIHRvIHlvdXIKLWFwcGxpY2F0aW9uLiAKLQotU2luY2UgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBwZXJmb3JtIGFyaXRobWV0aWMgb24gb3BhcXVlIGNvbG9yIHZhbHVlcyBzbwotbG9uZyBhcyB0aGV5IGFyZSBub3QgdG8gYmUgcmVzYW1wbGVkIGFuZCBhcmUgaW4gdGhlIGZpbmFsIGNvbG9yIHNwYWNlIGl0IGlzCi1wb3NzaWJsZSB0byBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgYWxwaGEgYnkgc3RvcmluZyB0aGUgb3BhcXVlIHBpeGVscyBpbgotdGhlIFBORyBmb3JtYXQgKGFkanVzdGVkIGZvciB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlKSB3aGlsZSBzdG9yaW5nIHBhcnRpYWxseQotb3BhcXVlIHBpeGVscyBpbiB0aGUgc3RhbmRhcmQsIGxpbmVhciwgZm9ybWF0LiAgVGhlIGFjY3VyYWN5IHJlcXVpcmVkIGZvcgotc3RhbmRhcmQgYWxwaGEgY29tcG9zaXRpb24gaXMgcmVsYXRpdmVseSBsb3csIGJlY2F1c2UgdGhlIHBpeGVscyBhcmUKLWlzb2xhdGVkLCB0aGVyZWZvcmUgdHlwaWNhbGx5IHRoZSBhY2N1cmFjeSBsb3NzIGluIHN0b3JpbmcgOC1iaXQgbGluZWFyCi12YWx1ZXMgaXMgYWNjZXB0YWJsZS4gIChUaGlzIGlzIG5vdCB0cnVlIGlmIHRoZSBhbHBoYSBjaGFubmVsIGlzIHVzZWQgdG8KLXNpbXVsYXRlIHRyYW5zcGFyZW5jeSBvdmVyIGxhcmdlIGFyZWFzIC0gdXNlIDE2IGJpdHMgb3IgdGhlIFBORyBtb2RlIGluCi10aGlzIGNhc2UhKSAgVGhpcyBpcyB0aGUgJ09QVElNSVpFRCcgbW9kZS4gIEZvciB0aGlzIG1vZGUgYSBwaXhlbCBpcwotdHJlYXRlZCBhcyBvcGFxdWUgb25seSBpZiB0aGUgYWxwaGEgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIG1heGltdW0gdmFsdWUuCi0KLSAgICBQTkdfQUxQSEFfU1RBTkRBUkQ6ICBUaGUgZGF0YSBsaWJwbmcgcHJvZHVjZXMgaXMgZW5jb2RlZCBpbiB0aGUKLXN0YW5kYXJkIHdheSBhc3N1bWVkIGJ5IG1vc3QgY29ycmVjdGx5IHdyaXR0ZW4gZ3JhcGhpY3Mgc29mdHdhcmUuCi1UaGUgZ2FtbWEgZW5jb2Rpbmcgd2lsbCBiZSByZW1vdmVkIGJ5IGxpYnBuZyBhbmQgdGhlCi1saW5lYXIgY29tcG9uZW50IHZhbHVlcyB3aWxsIGJlIHByZS1tdWx0aXBsaWVkIGJ5IHRoZQotYWxwaGEgY2hhbm5lbC4KLQotV2l0aCB0aGlzIGZvcm1hdCB0aGUgZmluYWwgaW1hZ2UgbXVzdCBiZSByZS1lbmNvZGVkIHRvCi1tYXRjaCB0aGUgZGlzcGxheSBnYW1tYSBiZWZvcmUgdGhlIGltYWdlIGlzIGRpc3BsYXllZC4KLUlmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgZG8gdGhhdCwgeWV0IHN0aWxsIHNlZW1zIHRvCi1wZXJmb3JtIGFyaXRobWV0aWMgb24gdGhlIHBpeGVscyB3aXRob3V0IGRlY29kaW5nIHRoZW0sCi1pdCBpcyBicm9rZW4gLSBjaGVjayBvdXQgdGhlIG1vZGVzIGJlbG93LgotCi1XaXRoIFBOR19BTFBIQV9TVEFOREFSRCBsaWJwbmcgYWx3YXlzIHByb2R1Y2VzIGxpbmVhcgotY29tcG9uZW50IHZhbHVlcywgd2hhdGV2ZXIgc2NyZWVuX2dhbW1hIHlvdSBzdXBwbHkuICBUaGUKLXNjcmVlbl9nYW1tYSB2YWx1ZSBpcywgaG93ZXZlciwgdXNlZCBhcyBhIGRlZmF1bHQgZm9yCi10aGUgZmlsZSBnYW1tYSBpZiB0aGUgUE5HIGZpbGUgaGFzIG5vIGdhbW1hIGluZm9ybWF0aW9uLgotCi1JZiB5b3UgY2FsbCBwbmdfc2V0X2dhbW1hKCkgYWZ0ZXIgcG5nX3NldF9hbHBoYV9tb2RlKCkgeW91Ci13aWxsIG92ZXJyaWRlIHRoZSBsaW5lYXIgZW5jb2RpbmcuICBJbnN0ZWFkIHRoZQotcHJlLW11bHRpcGxpZWQgcGl4ZWwgdmFsdWVzIHdpbGwgYmUgZ2FtbWEgZW5jb2RlZCBidXQKLXRoZSBhbHBoYSBjaGFubmVsIHdpbGwgc3RpbGwgYmUgbGluZWFyLiAgVGhpcyBtYXkKLWFjdHVhbGx5IG1hdGNoIHRoZSByZXF1aXJlbWVudHMgb2Ygc29tZSBicm9rZW4gc29mdHdhcmUsCi1idXQgaXQgaXMgdW5saWtlbHkuCi0KLVdoaWxlIGxpbmVhciA4LWJpdCBkYXRhIGlzIG9mdGVuIHVzZWQgaXQgaGFzCi1pbnN1ZmZpY2llbnQgcHJlY2lzaW9uIGZvciBhbnkgaW1hZ2Ugd2l0aCBhIHJlYXNvbmFibGUKLWR5bmFtaWMgcmFuZ2UuICBUbyBhdm9pZCBwcm9ibGVtcywgYW5kIGlmIHlvdXIgc29mdHdhcmUKLXN1cHBvcnRzIGl0LCB1c2UgcG5nX3NldF9leHBhbmRfMTYoKSB0byBmb3JjZSBhbGwKLWNvbXBvbmVudHMgdG8gMTYgYml0cy4KLQotICAgIFBOR19BTFBIQV9PUFRJTUlaRUQ6IFRoaXMgbW9kZSBpcyB0aGUgc2FtZSBhcyBQTkdfQUxQSEFfU1RBTkRBUkQKLWV4Y2VwdCB0aGF0IGNvbXBsZXRlbHkgb3BhcXVlIHBpeGVscyBhcmUgZ2FtbWEgZW5jb2RlZCBhY2NvcmRpbmcgdG8KLXRoZSBzY3JlZW5fZ2FtbWEgdmFsdWUuICBQaXhlbHMgd2l0aCBhbHBoYSBsZXNzIHRoYW4gMS4wCi13aWxsIHN0aWxsIGhhdmUgbGluZWFyIGNvbXBvbmVudHMuCi0KLVVzZSB0aGlzIGZvcm1hdCBpZiB5b3UgaGF2ZSBjb250cm9sIG92ZXIgeW91cgotY29tcG9zaXRpbmcgc29mdHdhcmUgYW5kIHNvIGRvbid0IGRvIG90aGVyIGFyaXRobWV0aWMKLShzdWNoIGFzIHNjYWxpbmcpIG9uIHRoZSBkYXRhIHlvdSBnZXQgZnJvbSBsaWJwbmcuICBZb3VyCi1jb21wb3NpdGluZyBzb2Z0d2FyZSBjYW4gc2ltcGx5IGNvcHkgb3BhcXVlIHBpeGVscyB0bwotdGhlIG91dHB1dCBidXQgc3RpbGwgaGFzIGxpbmVhciB2YWx1ZXMgZm9yIHRoZQotbm9uLW9wYXF1ZSBwaXhlbHMuCi0KLUluIG5vcm1hbCBjb21wb3NpdGluZywgd2hlcmUgdGhlIGFscGhhIGNoYW5uZWwgZW5jb2RlcwotcGFydGlhbCBwaXhlbCBjb3ZlcmFnZSAoYXMgb3Bwb3NlZCB0byBicm9hZCBhcmVhCi10cmFuc2x1Y2VuY3kpLCB0aGUgaW5hY2N1cmFjaWVzIG9mIHRoZSA4LWJpdAotcmVwcmVzZW50YXRpb24gb2Ygbm9uLW9wYXF1ZSBwaXhlbHMgYXJlIGlycmVsZXZhbnQuCi0KLVlvdSBjYW4gYWxzbyB0cnkgdGhpcyBmb3JtYXQgaWYgeW91ciBzb2Z0d2FyZSBpcyBicm9rZW47Ci1pdCBtaWdodCBsb29rIGJldHRlci4KLQotICAgIFBOR19BTFBIQV9CUk9LRU46IFRoaXMgaXMgUE5HX0FMUEhBX1NUQU5EQVJEOyBob3dldmVyLCBhbGwgY29tcG9uZW50Ci12YWx1ZXMsIGluY2x1ZGluZyB0aGUgYWxwaGEgY2hhbm5lbCBhcmUgZ2FtbWEgZW5jb2RlZC4gIFRoaXMgaXMKLWJyb2tlbiBiZWNhdXNlLCBpbiBwcmFjdGljZSwgbm8gaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoaXMgY2hvaWNlCi1jb3JyZWN0bHkgdW5kb2VzIHRoZSBlbmNvZGluZyBiZWZvcmUgaGFuZGxpbmcgYWxwaGEgY29tcG9zaXRpb24uICBVc2UgdGhpcwotY2hvaWNlIG9ubHkgaWYgb3RoZXIgc2VyaW91cyBlcnJvcnMgaW4gdGhlIHNvZnR3YXJlIG9yIGhhcmR3YXJlIHlvdSB1c2UKLW1hbmRhdGUgaXQuICBJbiBtb3N0IGNhc2VzIG9mIGJyb2tlbiBzb2Z0d2FyZSBvciBoYXJkd2FyZSB0aGUgYnVnIGluIHRoZQotZmluYWwgZGlzcGxheSBtYW5pZmVzdHMgYXMgYSBzdWJ0bGUgaGFsbyBhcm91bmQgY29tcG9zaXRlZCBwYXJ0cyBvZiB0aGUKLWltYWdlLiAgWW91IG1heSBub3QgZXZlbiBwZXJjZWl2ZSB0aGlzIGFzIGEgaGFsbzsgdGhlIGNvbXBvc2l0ZWQgcGFydCBvZgotdGhlIGltYWdlIG1heSBzaW1wbHkgYXBwZWFyIHNlcGFyYXRlIGZyb20gdGhlIGJhY2tncm91bmQsIGFzIHRob3VnaCBpdCBoYWQKLWJlZW4gY3V0IG91dCBvZiBwYXBlciBhbmQgcGFzdGVkIG9uIGFmdGVyd2FyZC4KLQotSWYgeW91IGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIGJ1Z3MgaW4gc29mdHdhcmUgb3IgaGFyZHdhcmUsIG9yIGlmIHlvdSBjYW4gZml4Ci10aGVtLCB0aGVyZSBhcmUgdGhyZWUgcmVjb21tZW5kZWQgd2F5cyBvZiB1c2luZyBwbmdfc2V0X2FscGhhX21vZGUoKToKLQotICAgcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19wdHIsIFBOR19BTFBIQV9QTkcsCi0gICAgICAgc2NyZWVuX2dhbW1hKTsKLQotWW91IGNhbiBkbyBjb2xvciBjb3JyZWN0aW9uIG9uIHRoZSByZXN1bHQgKGxpYnBuZyBkb2VzIG5vdCBjdXJyZW50bHkKLXN1cHBvcnQgY29sb3IgY29ycmVjdGlvbiBpbnRlcm5hbGx5KS4gIFdoZW4geW91IGhhbmRsZSB0aGUgYWxwaGEgY2hhbm5lbAoteW91IG5lZWQgdG8gdW5kbyB0aGUgZ2FtbWEgZW5jb2RpbmcgYW5kIG11bHRpcGx5IG91dCB0aGUgYWxwaGEuCi0KLSAgIHBuZ19zZXRfYWxwaGFfbW9kZShwbmdfcHRyLCBQTkdfQUxQSEFfU1RBTkRBUkQsCi0gICAgICAgc2NyZWVuX2dhbW1hKTsKLSAgIHBuZ19zZXRfZXhwYW5kXzE2KHBuZ19wdHIpOwotCi1JZiB5b3UgYXJlIHVzaW5nIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSwgZG9uJ3QgY2FsbCBwbmdfc2V0X2V4cGFuZF8xNigpOwotaW5zdGVhZCBwYXNzIFBOR19UUkFOU0ZPUk1fRVhQQU5EXzE2IHRvIHRoZSBpbnRlcmZhY2UuCi0KLVdpdGggdGhpcyBtb2RlIHlvdSBjYW4ndCBkbyBjb2xvciBjb3JyZWN0aW9uLCBidXQgeW91IGNhbiBkbyBhcml0aG1ldGljLAotaW5jbHVkaW5nIGNvbXBvc2l0aW9uIGFuZCBzY2FsaW5nLCBvbiB0aGUgZGF0YSB3aXRob3V0IGZ1cnRoZXIgcHJvY2Vzc2luZy4KLQotICAgcG5nX3NldF9hbHBoYV9tb2RlKHBuZ19wdHIsIFBOR19BTFBIQV9PUFRJTUlaRUQsCi0gICAgICAgc2NyZWVuX2dhbW1hKTsKLQotWW91IGNhbiBhdm9pZCB0aGUgZXhwYW5zaW9uIHRvIDE2LWJpdCBjb21wb25lbnRzIHdpdGggdGhpcyBtb2RlLCBidXQgeW91Ci1sb3NlIHRoZSBhYmlsaXR5IHRvIHNjYWxlIHRoZSBpbWFnZSBvciBwZXJmb3JtIG90aGVyIGxpbmVhciBhcml0aG1ldGljLgotQWxsIHlvdSBjYW4gZG8gaXMgY29tcG9zZSB0aGUgcmVzdWx0IG9udG8gYSBtYXRjaGluZyBvdXRwdXQuICBTaW5jZSB0aGlzCi1tb2RlIGlzIGxpYnBuZy1zcGVjaWZpYyB5b3UgYWxzbyBuZWVkIHRvIHdyaXRlIHlvdXIgb3duIGNvbXBvc2l0aW9uCi1zb2Z0d2FyZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgZXhhbXBsZXMgb2YgY2FsbHMgdG8gcG5nX3NldF9hbHBoYV9tb2RlIHRvIGFjaGlldmUgdGhlCi1yZXF1aXJlZCBvdmVyYWxsIGdhbW1hIGNvcnJlY3Rpb24gYW5kLCB3aGVyZSBuZWNlc3NhcnksIGFscGhhCi1wcmVtdWx0aXBsaWNhdGlvbi4KLQotICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0RFRkFVTFRfc1JHQik7Ci0KLVRoaXMgaXMgdGhlIGRlZmF1bHQgbGlicG5nIGhhbmRsaW5nIG9mIHRoZSBhbHBoYSBjaGFubmVsIC0gaXQgaXMgbm90Ci1wcmUtbXVsdGlwbGllZCBpbnRvIHRoZSBjb2xvciBjb21wb25lbnRzLiAgSW4gYWRkaXRpb24gdGhlIGNhbGwgc3RhdGVzCi10aGF0IHRoZSBvdXRwdXQgaXMgZm9yIGEgc1JHQiBzeXN0ZW0gYW5kIGNhdXNlcyBhbGwgUE5HIGZpbGVzIHdpdGhvdXQgZ0FNQQotY2h1bmtzIHRvIGJlIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCB1c2luZyBzUkdCLgotCi0gICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfUE5HLCBQTkdfR0FNTUFfTUFDKTsKLQotSW4gdGhpcyBjYXNlIHRoZSBvdXRwdXQgaXMgYXNzdW1lZCB0byBiZSBzb21ldGhpbmcgbGlrZSBhbiBzUkdCIGNvbmZvcm1hbnQKLWRpc3BsYXkgcHJlY2VlZGVkIGJ5IGEgcG93ZXItbGF3IGxvb2t1cCB0YWJsZSBvZiBwb3dlciAxLjQ1LiAgVGhpcyBpcyBob3cKLWVhcmx5IE1hYyBzeXN0ZW1zIGJlaGF2ZWQuCi0KLSAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9TVEFOREFSRCwgUE5HX0dBTU1BX0xJTkVBUik7Ci0KLVRoaXMgaXMgdGhlIGNsYXNzaWMgSmltIEJsaW5uIGFwcHJvYWNoIGFuZCB3aWxsIHdvcmsgaW4gYWNhZGVtaWMKLWVudmlyb25tZW50cyB3aGVyZSBldmVyeXRoaW5nIGlzIGRvbmUgYnkgdGhlIGJvb2suICBJdCBoYXMgdGhlIHNob3J0Y29taW5nCi1vZiBhc3N1bWluZyB0aGF0IGlucHV0IFBORyBkYXRhIHdpdGggbm8gZ2FtbWEgaW5mb3JtYXRpb24gaXMgbGluZWFyIC0gdGhpcwotaXMgdW5saWtlbHkgdG8gYmUgY29ycmVjdCB1bmxlc3MgdGhlIFBORyBmaWxlcyB3aGVyZSBnZW5lcmF0ZWQgbG9jYWxseS4KLU1vc3Qgb2YgdGhlIHRpbWUgdGhlIG91dHB1dCBwcmVjaXNpb24gd2lsbCBiZSBzbyBsb3cgYXMgdG8gc2hvdwotc2lnbmlmaWNhbnQgYmFuZGluZyBpbiBkYXJrIGFyZWFzIG9mIHRoZSBpbWFnZS4KLQotICAgIHBuZ19zZXRfZXhwYW5kXzE2KHBwKTsKLSAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9TVEFOREFSRCwgUE5HX0RFRkFVTFRfc1JHQik7Ci0KLVRoaXMgaXMgYSBzb21ld2hhdCBtb3JlIHJlYWxpc3RpYyBKaW0gQmxpbm4gaW5zcGlyZWQgYXBwcm9hY2guICBQTkcgZmlsZXMKLWFyZSBhc3N1bWVkIHRvIGhhdmUgdGhlIHNSR0IgZW5jb2RpbmcgaWYgbm90IG1hcmtlZCB3aXRoIGEgZ2FtbWEgdmFsdWUgYW5kCi10aGUgb3V0cHV0IGlzIGFsd2F5cyAxNiBiaXRzIHBlciBjb21wb25lbnQuICBUaGlzIHBlcm1pdHMgYWNjdXJhdGUgc2NhbGluZwotYW5kIHByb2Nlc3Npbmcgb2YgdGhlIGRhdGEuICBJZiB5b3Uga25vdyB0aGF0IHlvdXIgaW5wdXQgUE5HIGZpbGVzIHdlcmUKLWdlbmVyYXRlZCBsb2NhbGx5IHlvdSBtaWdodCBuZWVkIHRvIHJlcGxhY2UgUE5HX0RFRkFVTFRfc1JHQiB3aXRoIHRoZQotY29ycmVjdCB2YWx1ZSBmb3IgeW91ciBzeXN0ZW0uCi0KLSAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9PUFRJTUlaRUQsIFBOR19ERUZBVUxUX3NSR0IpOwotCi1JZiB5b3UganVzdCBuZWVkIHRvIGNvbXBvc2l0ZSB0aGUgUE5HIGltYWdlIG9udG8gYW4gZXhpc3RpbmcgYmFja2dyb3VuZAotYW5kIGlmIHlvdSBjb250cm9sIHRoZSBjb2RlIHRoYXQgZG9lcyB0aGlzIHlvdSBjYW4gdXNlIHRoZSBvcHRpbWl6YXRpb24KLXNldHRpbmcuICBJbiB0aGlzIGNhc2UgeW91IGp1c3QgY29weSBjb21wbGV0ZWx5IG9wYXF1ZSBwaXhlbHMgdG8gdGhlCi1vdXRwdXQuICBGb3IgcGl4ZWxzIHRoYXQgYXJlIG5vdCBjb21wbGV0ZWx5IHRyYW5zcGFyZW50ICh5b3UganVzdCBza2lwCi10aG9zZSkgeW91IGRvIHRoZSBjb21wb3NpdGlvbiBtYXRoIHVzaW5nIHBuZ19jb21wb3NpdGUgb3IgcG5nX2NvbXBvc2l0ZV8xNgotYmVsb3cgdGhlbiBlbmNvZGUgdGhlIHJlc3VsdGFudCA4LWJpdCBvciAxNi1iaXQgdmFsdWVzIHRvIG1hdGNoIHRoZSBvdXRwdXQKLWVuY29kaW5nLgotCi0gICAgT3RoZXIgY2FzZXMKLQotSWYgbmVpdGhlciB0aGUgUE5HIG5vciB0aGUgc3RhbmRhcmQgbGluZWFyIGVuY29kaW5nIHdvcmsgZm9yIHlvdSBiZWNhdXNlCi1vZiB0aGUgc29mdHdhcmUgb3IgaGFyZHdhcmUgeW91IHVzZSB0aGVuIHlvdSBoYXZlIGEgYmlnIHByb2JsZW0uICBUaGUgUE5HCi1jYXNlIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluIGhhbG9zIGFyb3VuZCB0aGUgaW1hZ2UuICBUaGUgbGluZWFyIGVuY29kaW5nCi13aWxsIHByb2JhYmx5IHJlc3VsdCBpbiBhIHdhc2hlZCBvdXQsIHRvbyBicmlnaHQsIGltYWdlIChpdCdzIGFjdHVhbGx5IHRvbwotY29udHJhc3R5LikgIFRyeSB0aGUgQUxQSEFfT1BUSU1JWkVEIG1vZGUgYWJvdmUgLSB0aGlzIHdpbGwgcHJvYmFibHkKLXN1YnN0YW50aWFsbHkgcmVkdWNlIHRoZSBoYWxvcy4gIEFsdGVybmF0aXZlbHkgdHJ5OgotCi0gICAgcG5nX3NldF9hbHBoYV9tb2RlKHBwLCBQTkdfQUxQSEFfQlJPS0VOLCBQTkdfREVGQVVMVF9zUkdCKTsKLQotVGhpcyBvcHRpb24gd2lsbCBhbHNvIHJlZHVjZSB0aGUgaGFsb3MsIGJ1dCB0aGVyZSB3aWxsIGJlIHNsaWdodCBkYXJrCi1oYWxvcyByb3VuZCB0aGUgb3BhcXVlIHBhcnRzIG9mIHRoZSBpbWFnZSB3aGVyZSB0aGUgYmFja2dyb3VuZCBpcyBsaWdodC4KLUluIHRoZSBPUFRJTUlaRUQgbW9kZSB0aGUgaGFsb3Mgd2lsbCBiZSBsaWdodCBoYWxvcyB3aGVyZSB0aGUgYmFja2dyb3VuZAotaXMgZGFyay4gIFRha2UgeW91ciBwaWNrIC0gdGhlIGhhbG9zIGFyZSB1bmF2b2lkYWJsZSB1bmxlc3MgeW91IGNhbiBnZXQKLXlvdXIgaGFyZHdhcmUvc29mdHdhcmUgZml4ZWQhICAoVGhlIE9QVElNSVpFRCBhcHByb2FjaCBpcyBzbGlnaHRseQotZmFzdGVyLikKLQotV2hlbiB0aGUgZGVmYXVsdCBnYW1tYSBvZiBQTkcgZmlsZXMgZG9lc24ndCBtYXRjaCB0aGUgb3V0cHV0IGdhbW1hLgotSWYgeW91IGhhdmUgUE5HIGZpbGVzIHdpdGggbm8gZ2FtbWEgaW5mb3JtYXRpb24gcG5nX3NldF9hbHBoYV9tb2RlIGFsbG93cwoteW91IHRvIHByb3ZpZGUgYSBkZWZhdWx0IGdhbW1hLCBidXQgaXQgYWxzbyBzZXRzIHRoZSBvdXB1dCBnYW1tYSB0byB0aGUKLW1hdGNoaW5nIHZhbHVlLiAgSWYgeW91IGtub3cgeW91ciBQTkcgZmlsZXMgaGF2ZSBhIGdhbW1hIHRoYXQgZG9lc24ndAotbWF0Y2ggdGhlIG91dHB1dCB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQKLXBuZ19zZXRfYWxwaGFfbW9kZSBhbHdheXMgc2V0cyB0aGUgb3V0cHV0IGdhbW1hIGJ1dCBvbmx5IHNldHMgdGhlIFBORwotZGVmYXVsdCBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQ6Ci0KLSAgICBwbmdfc2V0X2FscGhhX21vZGUocHAsIFBOR19BTFBIQV9QTkcsIFBOR19ERUZBVUxUX3NSR0IpOwotICAgIHBuZ19zZXRfYWxwaGFfbW9kZShwcCwgUE5HX0FMUEhBX1BORywgUE5HX0dBTU1BX01BQyk7Ci0KLVRoZSBmaXJzdCBjYWxsIHNldHMgYm90aCB0aGUgZGVmYXVsdCBhbmQgdGhlIG91dHB1dCBnYW1tYSB2YWx1ZXMsIHRoZQotc2Vjb25kIGNhbGwgb3ZlcnJpZGVzIHRoZSBvdXRwdXQgZ2FtbWEgd2l0aG91dCBjaGFuZ2luZyB0aGUgZGVmYXVsdC4gIFRoaXMKLWlzIGVhc2llciB0aGFuIGFjaGlldmluZyB0aGUgc2FtZSBlZmZlY3Qgd2l0aCBwbmdfc2V0X2dhbW1hLiAgWW91IG11c3QgdXNlCi1QTkdfQUxQSEFfUE5HIGZvciB0aGUgZmlyc3QgY2FsbCAtIGludGVybmFsIGNoZWNraW5nIGluIHBuZ19zZXRfYWxwaGEgd2lsbAotZmlyZSBpZiBtb3JlIHRoYW4gb25lIGNhbGwgdG8gcG5nX3NldF9hbHBoYV9tb2RlIGFuZCBwbmdfc2V0X2JhY2tncm91bmQgaXMKLW1hZGUgaW4gdGhlIHNhbWUgcmVhZCBvcGVyYXRpb24sIGhvd2V2ZXIgbXVsdGlwbGUgY2FsbHMgd2l0aCBQTkdfQUxQSEFfUE5HCi1hcmUgaWdub3JlZC4KLQotSWYgeW91IGRvbid0IG5lZWQsIG9yIGNhbid0IGhhbmRsZSwgdGhlIGFscGhhIGNoYW5uZWwgeW91IGNhbiBjYWxsCi1wbmdfc2V0X2JhY2tncm91bmQoKSB0byByZW1vdmUgaXQgYnkgY29tcG9zaXRpbmcgYWdhaW5zdCBhIGZpeGVkIGNvbG9yLiAgRG9uJ3QKLWNhbGwgcG5nX3NldF9zdHJpcF9hbHBoYSgpIHRvIGRvIHRoaXMgLSBpdCB3aWxsIGxlYXZlIHNwdXJpb3VzIHBpeGVsIHZhbHVlcyBpbgotdHJhbnNwYXJlbnQgcGFydHMgb2YgdGhpcyBpbWFnZS4KLQotICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZiYWNrZ3JvdW5kX2NvbG9yLAotICAgICAgIFBOR19CQUNLR1JPVU5EX0dBTU1BX1NDUkVFTiwgMCwgMSk7Ci0KLVRoZSBiYWNrZ3JvdW5kX2NvbG9yIGlzIGFuIFJHQiBvciBncmF5c2NhbGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIGZvcm1hdAotbGlicG5nIHdpbGwgcHJvZHVjZSBmb3IgeW91LiAgQmVjYXVzZSB5b3UgZG9uJ3QgeWV0IGtub3cgdGhlIGZvcm1hdCBvZiB0aGUgUE5HCi1maWxlLCBpZiB5b3UgY2FsbCBwbmdfc2V0X2JhY2tncm91bmQgYXQgdGhpcyBwb2ludCB5b3UgbXVzdCBhcnJhbmdlIGZvciB0aGUKLWZvcm1hdCBwcm9kdWNlZCBieSBsaWJwbmcgdG8gYWx3YXlzIGhhdmUgOC1iaXQgb3IgMTYtYml0IGNvbXBvbmVudHMgYW5kIHRoZW4KLXN0b3JlIHRoZSBjb2xvciBhcyBhbiA4LWJpdCBvciAxNi1iaXQgY29sb3IgYXMgYXBwcm9wcmlhdGUuICBUaGUgY29sb3IgY29udGFpbnMKLXNlcGFyYXRlIGdyYXkgYW5kIFJHQiBjb21wb25lbnQgdmFsdWVzLCBzbyB5b3UgY2FuIGxldCBsaWJwbmcgcHJvZHVjZSBncmF5IG9yCi1SR0Igb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaW5wdXQgZm9ybWF0LCBidXQgbG93IGJpdCBkZXB0aCBncmF5c2NhbGUgaW1hZ2VzCi1tdXN0IGFsd2F5cyBiZSBjb252ZXJ0ZWQgdG8gYXQgbGVhc3QgOC1iaXQgZm9ybWF0LiAgKEV2ZW4gdGhvdWdoIGxvdyBiaXQgZGVwdGgKLWdyYXlzY2FsZSBpbWFnZXMgY2FuJ3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsIHRoZXkgY2FuIGhhdmUgYSB0cmFuc3BhcmVudAotY29sb3IhKQotCi1Zb3Ugc2V0IHRoZSB0cmFuc2Zvcm1zIHlvdSBuZWVkIGxhdGVyLCBlaXRoZXIgYXMgZmxhZ3MgdG8gdGhlIGhpZ2ggbGV2ZWwKLWludGVyZmFjZSBvciBsaWJwbmcgQVBJIGNhbGxzIGZvciB0aGUgbG93IGxldmVsIGludGVyZmFjZS4gIEZvciByZWZlcmVuY2UgdGhlCi1zZXR0aW5ncyBhbmQgQVBJIGNhbGxzIHJlcXVpcmVkIGFyZToKLQotOC1iaXQgdmFsdWVzOgotICAgUE5HX1RSQU5TRk9STV9TQ0FMRV8xNiB8IFBOR19FWFBBTkQKLSAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOyBwbmdfc2V0X3NjYWxlXzE2KHBuZ19wdHIpOwotCi0gICBJZiB5b3UgbXVzdCBnZXQgZXhhY3RseSB0aGUgc2FtZSBpbmFjY3VyYXRlIHJlc3VsdHMKLSAgIHByb2R1Y2VkIGJ5IGRlZmF1bHQgaW4gdmVyc2lvbnMgcHJpb3IgdG8gbGlicG5nLTEuNS40LAotICAgdXNlIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgYW5kIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cikKLSAgIGluc3RlYWQuCi0KLTE2LWJpdCB2YWx1ZXM6Ci0gICBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNgotICAgcG5nX3NldF9leHBhbmRfMTYocG5nX3B0cik7Ci0KLUluIGVpdGhlciBjYXNlIHBhbGV0dGUgaW1hZ2UgZGF0YSB3aWxsIGJlIGV4cGFuZGVkIHRvIFJHQi4gIElmIHlvdSBqdXN0IHdhbnQKLWNvbG9yIGRhdGEgeW91IGNhbiBhZGQgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiBvciBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpCi10byB0aGUgbGlzdC4KLQotQ2FsbGluZyBwbmdfc2V0X2JhY2tncm91bmQgYmVmb3JlIHRoZSBQTkcgZmlsZSBoZWFkZXIgaXMgcmVhZCB3aWxsIG5vdCB3b3JrCi1wcmlvciB0byBsaWJwbmctMS41LjQuICBCZWNhdXNlIHRoZSBmYWlsdXJlIG1heSByZXN1bHQgaW4gdW5leHBlY3RlZCB3YXJuaW5ncyBvcgotZXJyb3JzIGl0IGlzIHRoZXJlZm9yZSBtdWNoIHNhZmVyIHRvIGNhbGwgcG5nX3NldF9iYWNrZ3JvdW5kIGFmdGVyIHRoZSBoZWFkIGhhcwotYmVlbiByZWFkLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoYXQgcHJpb3IgdG8gbGlicG5nLTEuNS40IGl0IGNhbm5vdCBiZQotdXNlZCB3aXRoIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZS4KLQotLlNTIFRoZSBoaWdoLWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUF0IHRoaXMgcG9pbnQgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHByb2NlZWQ7IHRocm91Z2ggdGhlIGhpZ2gtbGV2ZWwKLXJlYWQgaW50ZXJmYWNlLCBvciB0aHJvdWdoIGEgc2VxdWVuY2Ugb2YgbG93LWxldmVsIHJlYWQgb3BlcmF0aW9ucy4KLVlvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiAoYSkgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQKLXRoZSBlbnRpcmUgaW1hZ2UgaW50byBtZW1vcnksIGFuZCAoYikgdGhlIGlucHV0IHRyYW5zZm9ybWF0aW9ucwoteW91IHdhbnQgdG8gZG8gYXJlIGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBzZXQ6Ci0KLSAgICBQTkdfVFJBTlNGT1JNX0lERU5USVRZICAgICAgTm8gdHJhbnNmb3JtYXRpb24KLSAgICBQTkdfVFJBTlNGT1JNX1NDQUxFXzE2ICAgICAgU3RyaXAgMTYtYml0IHNhbXBsZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC1iaXQgYWNjdXJhdGVseQotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfMTYgICAgICBDaG9wIDE2LWJpdCBzYW1wbGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgtYml0IGxlc3MgYWNjdXJhdGVseQotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfQUxQSEEgICBEaXNjYXJkIHRoZSBhbHBoYSBjaGFubmVsCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIEV4cGFuZCAxLCAyIGFuZCA0LWJpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIHRvIGJ5dGVzCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLU1dBUCAgICAgIENoYW5nZSBvcmRlciBvZiBwYWNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIExTQiBmaXJzdAotICAgIFBOR19UUkFOU0ZPUk1fRVhQQU5EICAgICAgICBQZXJmb3JtIHNldF9leHBhbmQoKQotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX01PTk8gICBJbnZlcnQgbW9ub2Nocm9tZSBpbWFnZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NISUZUICAgICAgICAgTm9ybWFsaXplIHBpeGVscyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JJVCBkZXB0aAotICAgIFBOR19UUkFOU0ZPUk1fQkdSICAgICAgICAgICBGbGlwIFJHQiB0byBCR1IsIFJHQkEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQkdSQQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9BTFBIQSAgICBGbGlwIFJHQkEgdG8gQVJHQiBvciBHQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBBRwotICAgIFBOR19UUkFOU0ZPUk1fSU5WRVJUX0FMUEhBICBDaGFuZ2UgYWxwaGEgZnJvbSBvcGFjaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyYW5zcGFyZW5jeQotICAgIFBOR19UUkFOU0ZPUk1fU1dBUF9FTkRJQU4gICBCeXRlLXN3YXAgMTYtYml0IHNhbXBsZXMKLSAgICBQTkdfVFJBTlNGT1JNX0dSQVlfVE9fUkdCICAgRXhwYW5kIGdyYXlzY2FsZSBzYW1wbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFJHQiAob3IgR0EgdG8gUkdCQSkKLSAgICBQTkdfVFJBTlNGT1JNX0VYUEFORF8xNiAgICAgRXhwYW5kIHNhbXBsZXMgdG8gMTYgYml0cwotCi0oVGhpcyBleGNsdWRlcyBzZXR0aW5nIGEgYmFja2dyb3VuZCBjb2xvciwgZG9pbmcgZ2FtbWEgdHJhbnNmb3JtYXRpb24sCi1xdWFudGl6aW5nLCBhbmQgc2V0dGluZyBmaWxsZXIuKSAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgc2ltcGx5IGRvIHRoaXM6Ci0KLSAgICBwbmdfcmVhZF9wbmcocG5nX3B0ciwgaW5mb19wdHIsIHBuZ190cmFuc2Zvcm1zLCBOVUxMKQotCi13aGVyZSBwbmdfdHJhbnNmb3JtcyBpcyBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygc29tZQotc2V0IG9mIHRyYW5zZm9ybWF0aW9uIGZsYWdzLiAgVGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gcG5nX3JlYWRfaW5mbygpLAotZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKLXRoZW4gcG5nX3JlYWRfaW1hZ2UoKSwgYW5kIGZpbmFsbHkgcG5nX3JlYWRfZW5kKCkuCi0KLShUaGUgZmluYWwgcGFyYW1ldGVyIG9mIHRoaXMgY2FsbCBpcyBub3QgeWV0IHVzZWQuICBTb21lZGF5IGl0IG1pZ2h0IHBvaW50Ci10byB0cmFuc2Zvcm1hdGlvbiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHNvbWUgZnV0dXJlIGlucHV0IHRyYW5zZm9ybS4pCi0KLVlvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCi13aGVuIHlvdSB1c2UgcG5nX3JlYWRfcG5nKCkuCi0KLUFmdGVyIHlvdSBoYXZlIGNhbGxlZCBwbmdfcmVhZF9wbmcoKSwgeW91IGNhbiByZXRyaWV2ZSB0aGUgaW1hZ2UgZGF0YQotd2l0aAotCi0gICByb3dfcG9pbnRlcnMgPSBwbmdfZ2V0X3Jvd3MocG5nX3B0ciwgaW5mb19wdHIpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBpeGVsIGRhdGEgZm9yIGVhY2ggcm93OgotCi0gICBwbmdfYnl0ZXAgcm93X3BvaW50ZXJzW2hlaWdodF07Ci0KLUlmIHlvdSBrbm93IHlvdXIgaW1hZ2Ugc2l6ZSBhbmQgcGl4ZWwgc2l6ZSBhaGVhZCBvZiB0aW1lLCB5b3UgY2FuIGFsbG9jYXRlCi1yb3dfcG9pbnRlcnMgcHJpb3IgdG8gY2FsbGluZyBwbmdfcmVhZF9wbmcoKSB3aXRoCi0KLSAgIGlmIChoZWlnaHQgPiBQTkdfVUlOVF8zMl9NQVgvKHNpemVvZiAocG5nX2J5dGUpKSkKLSAgICAgIHBuZ19lcnJvciAocG5nX3B0ciwKLSAgICAgICAgICAiSW1hZ2UgaXMgdG9vIHRhbGwgdG8gcHJvY2VzcyBpbiBtZW1vcnkiKTsKLQotICAgaWYgKHdpZHRoID4gUE5HX1VJTlRfMzJfTUFYL3BpeGVsX3NpemUpCi0gICAgICBwbmdfZXJyb3IgKHBuZ19wdHIsCi0gICAgICAgICAgIkltYWdlIGlzIHRvbyB3aWRlIHRvIHByb2Nlc3MgaW4gbWVtb3J5Iik7Ci0KLSAgIHJvd19wb2ludGVycyA9IHBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICBoZWlnaHQqKHNpemVvZiAocG5nX2J5dGVwKSkpOwotCi0gICBmb3IgKGludCBpPTA7IGk8aGVpZ2h0LCBpKyspCi0gICAgICByb3dfcG9pbnRlcnNbaV09TlVMTDsgIC8qIHNlY3VyaXR5IHByZWNhdXRpb24gKi8KLQotICAgZm9yIChpbnQgaT0wOyBpPGhlaWdodCwgaSsrKQotICAgICAgcm93X3BvaW50ZXJzW2ldPXBuZ19tYWxsb2MocG5nX3B0ciwKLSAgICAgICAgICB3aWR0aCpwaXhlbF9zaXplKTsKLQotICAgcG5nX3NldF9yb3dzKHBuZ19wdHIsIGluZm9fcHRyLCAmcm93X3BvaW50ZXJzKTsKLQotQWx0ZXJuYXRpdmVseSB5b3UgY291bGQgYWxsb2NhdGUgeW91ciBpbWFnZSBpbiBvbmUgYmlnIGJsb2NrIGFuZCBkZWZpbmUKLXJvd19wb2ludGVyc1tpXSB0byBwb2ludCBpbnRvIHRoZSBwcm9wZXIgcGxhY2VzIGluIHlvdXIgYmxvY2suCi0KLUlmIHlvdSB1c2UgcG5nX3NldF9yb3dzKCksIHRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZwotcm93X3BvaW50ZXJzIChhbmQgcm93X3BvaW50ZXJzW2ldLCBpZiB0aGV5IHdlcmUgc2VwYXJhdGVseSBhbGxvY2F0ZWQpLgotCi1JZiB5b3UgZG9uJ3QgYWxsb2NhdGUgcm93X3BvaW50ZXJzIGFoZWFkIG9mIHRpbWUsIHBuZ19yZWFkX3BuZygpIHdpbGwKLWRvIGl0LCBhbmQgaXQnbGwgYmUgZnJlZSdlZCBieSBsaWJwbmcgd2hlbiB5b3UgY2FsbCBwbmdfZGVzdHJveV8qKCkuCi0KLS5TUyBUaGUgbG93LWxldmVsIHJlYWQgaW50ZXJmYWNlCi0KLUlmIHlvdSBhcmUgZ29pbmcgdGhlIGxvdy1sZXZlbCByb3V0ZSwgeW91IGFyZSBub3cgcmVhZHkgdG8gcmVhZCBhbGwKLXRoZSBmaWxlIGluZm9ybWF0aW9uIHVwIHRvIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YS4gIFlvdSBkbyB0aGlzIHdpdGggYQotY2FsbCB0byBwbmdfcmVhZF9pbmZvKCkuCi0KLSAgICBwbmdfcmVhZF9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotVGhpcyB3aWxsIHByb2Nlc3MgYWxsIGNodW5rcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgaW1hZ2UgZGF0YS4KLQotVGhpcyBhbHNvIGNvcGllcyBzb21lIG9mIHRoZSBkYXRhIGZyb20gdGhlIFBORyBmaWxlIGludG8gdGhlIGRlY29kZSBzdHJ1Y3R1cmUKLWZvciB1c2UgaW4gbGF0ZXIgdHJhbnNmb3JtYXRpb25zLiAgSW1wb3J0YW50IGluZm9ybWF0aW9uIGNvcGllZCBpbiBpczoKLQotMSkgVGhlIFBORyBmaWxlIGdhbW1hIGZyb20gdGhlIGdBTUEgY2h1bmsuICBUaGlzIG92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgdmFsdWUKLXByb3ZpZGVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0byBwbmdfc2V0X2dhbW1hIG9yIHBuZ19zZXRfYWxwaGFfbW9kZS4KLQotMikgUHJpb3IgdG8gbGlicG5nLTEuNS40IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYSBiS0dkIGNodW5rLiAgVGhpcwotZGFtYWdlcyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIHBuZ19zZXRfYmFja2dyb3VuZAotcmVzdWx0aW5nIGluIHVuZXhwZWN0ZWQgYmVoYXZpb3IuICBMaWJwbmctMS41LjQgbm8gbG9uZ2VyIGRvZXMgdGhpcy4KLQotMykgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIGVhY2ggY29tcG9uZW50IHZhbHVlLiAgTGlicG5nIHVzZXMgdGhpcyB0bwotb3B0aW1pemUgZ2FtbWEgaGFuZGxpbmcgYnkgcmVkdWNpbmcgdGhlIGludGVybmFsIGxvb2t1cCB0YWJsZSBzaXplcy4KLQotNCkgVGhlIHRyYW5zcGFyZW50IGNvbG9yIGluZm9ybWF0aW9uIGZyb20gYSB0Uk5TIGNodW5rLiAgVGhpcyBjYW4gYmUgbW9kaWZpZWQgYnkKLWEgbGF0ZXIgY2FsbCB0byBwbmdfc2V0X3RSTlMuCi0KLS5TUyBRdWVyeWluZyB0aGUgaW5mbyBzdHJ1Y3R1cmUKLQotRnVuY3Rpb25zIGFyZSB1c2VkIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5mb19wdHIgb25jZSBpdAotaGFzIGJlZW4gcmVhZC4gIE5vdGUgdGhhdCB0aGVzZSBmaWVsZHMgbWF5IG5vdCBiZSBjb21wbGV0ZWx5IGZpbGxlZAotaW4gdW50aWwgcG5nX3JlYWRfZW5kKCkgaGFzIHJlYWQgdGhlIGNodW5rIGRhdGEgZm9sbG93aW5nIHRoZSBpbWFnZS4KLQotICAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LAotICAgICAgICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlX3R5cGUsCi0gICAgICAgJmNvbXByZXNzaW9uX3R5cGUsICZmaWx0ZXJfbWV0aG9kKTsKLQotICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLQotICAgIGhlaWdodCAgICAgICAgIC0gaG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCi0KLSAgICBiaXRfZGVwdGggICAgICAtIGhvbGRzIHRoZSBiaXQgZGVwdGggb2Ygb25lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgY2hhbm5lbHMuICAodmFsaWQgdmFsdWVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgMSwgMiwgNCwgOCwgMTYgYW5kIGRlcGVuZCBhbHNvIG9uCi0gICAgICAgICAgICAgICAgICAgICB0aGUgY29sb3JfdHlwZS4gIFNlZSBhbHNvCi0gICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FudCBiaXRzIChzQklUKSBiZWxvdykuCi0KLSAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYSBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwcmVzZW50LgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfR1JBWQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1BBTEVUVEUKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDEsIDIsIDQsIDgpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0IKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0X2RlcHRocyA4LCAxNikKLQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQ09MT1IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9NQVNLX0FMUEhBCi0KLSAgICBpbnRlcmxhY2VfdHlwZSAtIChQTkdfSU5URVJMQUNFX05PTkUgb3IKLSAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfQURBTTcpCi0KLSAgICBjb21wcmVzc2lvbl90eXBlIC0gKG11c3QgYmUgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRQotICAgICAgICAgICAgICAgICAgICAgZm9yIFBORyAxLjApCi0KLSAgICBmaWx0ZXJfbWV0aG9kICAtIChtdXN0IGJlIFBOR19GSUxURVJfVFlQRV9CQVNFCi0gICAgICAgICAgICAgICAgICAgICBmb3IgUE5HIDEuMCwgYW5kIGNhbiBhbHNvIGJlCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5UUkFQSVhFTF9ESUZGRVJFTkNJTkcgaWYKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBQTkcgZGF0YXN0cmVhbSBpcyBlbWJlZGRlZCBpbgotICAgICAgICAgICAgICAgICAgICAgYSBNTkctMS4wIGRhdGFzdHJlYW0pCi0KLSAgICBBbnkgb2Ygd2lkdGgsIGhlaWdodCwgY29sb3JfdHlwZSwgYml0X2RlcHRoLAotICAgIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlLCBvciBmaWx0ZXJfbWV0aG9kIGNhbgotICAgIGJlIE5VTEwgaWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGVpciB2YWx1ZXMuCi0KLSAgICBOb3RlIHRoYXQgcG5nX2dldF9JSERSKCkgcmV0dXJucyAzMi1iaXQgZGF0YSBpbnRvCi0gICAgdGhlIGFwcGxpY2F0aW9uJ3Mgd2lkdGggYW5kIGhlaWdodCB2YXJpYWJsZXMuCi0gICAgVGhpcyBpcyBhbiB1bnNhZmUgc2l0dWF0aW9uIGlmIHRoZXNlIGFyZSBub3QgcG5nX3VpbnRfMzIKLSAgICB2YXJpYWJsZXMuICBJbiBzdWNoIHNpdHVhdGlvbnMsIHRoZQotICAgIHBuZ19nZXRfaW1hZ2Vfd2lkdGgoKSBhbmQgcG5nX2dldF9pbWFnZV9oZWlnaHQoKQotICAgIGZ1bmN0aW9ucyBkZXNjcmliZWQgYmVsb3cgYXJlIHNhZmVyLgotCi0gICAgd2lkdGggICAgICAgICAgICA9IHBuZ19nZXRfaW1hZ2Vfd2lkdGgocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0KLSAgICBoZWlnaHQgICAgICAgICAgID0gcG5nX2dldF9pbWFnZV9oZWlnaHQocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0KLSAgICBiaXRfZGVwdGggICAgICAgID0gcG5nX2dldF9iaXRfZGVwdGgocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0KLSAgICBjb2xvcl90eXBlICAgICAgID0gcG5nX2dldF9jb2xvcl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgaW50ZXJsYWNlX3R5cGUgICA9IHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0KLSAgICBjb21wcmVzc2lvbl90eXBlID0gcG5nX2dldF9jb21wcmVzc2lvbl90eXBlKHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19wdHIpOwotCi0gICAgZmlsdGVyX21ldGhvZCAgICA9IHBuZ19nZXRfZmlsdGVyX3R5cGUocG5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3B0cik7Ci0KLSAgICBjaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgY2hhbm5lbHMgICAgICAgLSBudW1iZXIgb2YgY2hhbm5lbHMgb2YgaW5mbyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBjb2xvciB0eXBlICh2YWxpZCB2YWx1ZXMgYXJlIDEgKEdSQVksCi0gICAgICAgICAgICAgICAgICAgICBQQUxFVFRFKSwgMiAoR1JBWV9BTFBIQSksIDMgKFJHQiksCi0gICAgICAgICAgICAgICAgICAgICA0IChSR0JfQUxQSEEgb3IgUkdCICsgZmlsbGVyIGJ5dGUpKQotCi0gICAgcm93Ynl0ZXMgPSBwbmdfZ2V0X3Jvd2J5dGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgIHJvd2J5dGVzICAgICAgIC0gbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBob2xkIGEgcm93Ci0KLSAgICBzaWduYXR1cmUgPSBwbmdfZ2V0X3NpZ25hdHVyZShwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICBzaWduYXR1cmUgICAgICAtIGhvbGRzIHRoZSBzaWduYXR1cmUgcmVhZCBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgZmlsZSAoaWYgYW55KS4gIFRoZSBkYXRhIGlzIGtlcHQgaW4KLSAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIG9mZnNldCBpdCB3b3VsZCBiZSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHdob2xlIHNpZ25hdHVyZSB3ZXJlIHJlYWQgKGkuZS4gaWYgYW4KLSAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGhhZCBhbHJlYWR5IHJlYWQgaW4gNAotICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2Ygc2lnbmF0dXJlIGJlZm9yZSBzdGFydGluZwotICAgICAgICAgICAgICAgICAgICAgbGlicG5nLCB0aGUgcmVtYWluaW5nIDQgYnl0ZXMgd291bGQKLSAgICAgICAgICAgICAgICAgICAgIGJlIGluIHNpZ25hdHVyZVs0XSB0aHJvdWdoIHNpZ25hdHVyZVs3XQotICAgICAgICAgICAgICAgICAgICAgKHNlZSBwbmdfc2V0X3NpZ19ieXRlcygpKSkuCi0KLVRoZXNlIGFyZSBhbHNvIGltcG9ydGFudCwgYnV0IHRoZWlyIHZhbGlkaXR5IGRlcGVuZHMgb24gd2hldGhlciB0aGUgY2h1bmsKLWhhcyBiZWVuIHJlYWQuICBUaGUgcG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0lORk9fPGNodW5rPikgYW5kCi1wbmdfZ2V0XzxjaHVuaz4ocG5nX3B0ciwgaW5mb19wdHIsIC4uLikgZnVuY3Rpb25zIHJldHVybiBub24temVybyBpZiB0aGUKLWRhdGEgaGFzIGJlZW4gcmVhZCwgb3IgemVybyBpZiBpdCBpcyBtaXNzaW5nLiAgVGhlIHBhcmFtZXRlcnMgdG8gdGhlCi1wbmdfZ2V0XzxjaHVuaz4gYXJlIHNldCBkaXJlY3RseSBpZiB0aGV5IGFyZSBzaW1wbGUgZGF0YSB0eXBlcywgb3IgYQotcG9pbnRlciBpbnRvIHRoZSBpbmZvX3B0ciBpcyByZXR1cm5lZCBmb3IgYW55IGNvbXBsZXggdHlwZXMuCi0KLVRoZSBjb2xvcnNwYWNlIGRhdGEgZnJvbSBnQU1BLCBjSFJNLCBzUkdCLCBpQ0NQLCBhbmQgc0JJVCBjaHVua3MKLWlzIHNpbXBseSByZXR1cm5lZCB0byBnaXZlIHRoZSBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlCi1pbWFnZSB3YXMgZW5jb2RlZC4gIExpYnBuZyBpdHNlbGYgb25seSBkb2VzIHRyYW5zZm9ybWF0aW9ucyB1c2luZyB0aGUgZmlsZQotZ2FtbWEgd2hlbiBjb21iaW5pbmcgc2VtaXRyYW5zcGFyZW50IHBpeGVscyB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQsCi1zaW5jZSBsaWJwbmctMS42LjAsIHdoZW4gY29udmVydGluZyBiZXR3ZWVuIDgtYml0IHNSR0IgYW5kIDE2LWJpdCBsaW5lYXIgcGl4ZWxzCi13aXRoaW4gdGhlIHNpbXBsaWZpZWQgQVBJLiAgTGlicG5nIGFsc28gdXNlcyB0aGUgZmlsZSBnYW1tYSB3aGVuIGNvbnZlcnRpbmcKLVJHQiB0byBncmF5LCBiZWdpbm5pbmcgd2l0aCBsaWJwbmctMS4wLjUsIGlmIHRoZSBhcHBsaWNhdGlvbiBjYWxscwotcG5nX3NldF9yZ2JfdG9fZ3JheSgpKS4KLQotICAgIHBuZ19nZXRfUExURShwbmdfcHRyLCBpbmZvX3B0ciwgJnBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAmbnVtX3BhbGV0dGUpOwotCi0gICAgcGFsZXR0ZSAgICAgICAgLSB0aGUgcGFsZXR0ZSBmb3IgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIChhcnJheSBvZiBwbmdfY29sb3IpCi0KLSAgICBudW1fcGFsZXR0ZSAgICAtIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwYWxldHRlCi0KLSAgICBwbmdfZ2V0X2dBTUEocG5nX3B0ciwgaW5mb19wdHIsICZmaWxlX2dhbW1hKTsKLSAgICBwbmdfZ2V0X2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsICZpbnRfZmlsZV9nYW1tYSk7Ci0KLSAgICBmaWxlX2dhbW1hICAgICAtIHRoZSBnYW1tYSBhdCB3aGljaCB0aGUgZmlsZSBpcwotICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiAoUE5HX0lORk9fZ0FNQSkKLQotICAgIGludF9maWxlX2dhbW1hIC0gMTAwLDAwMCB0aW1lcyB0aGUgZ2FtbWEgYXQgd2hpY2ggdGhlCi0gICAgICAgICAgICAgICAgICAgICBmaWxlIGlzIHdyaXR0ZW4KLQotICAgIHBuZ19nZXRfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgICZ3aGl0ZV94LCAmd2hpdGVfeSwgJnJlZF94LAotICAgICAgICAgICAgICAgICAgICAgJnJlZF95LCAmZ3JlZW5feCwgJmdyZWVuX3ksICZibHVlX3gsICZibHVlX3kpCi0gICAgcG5nX2dldF9jSFJNX1hZWihwbmdfcHRyLCBpbmZvX3B0ciwgJnJlZF9YLCAmcmVkX1ksICZyZWRfWiwKLSAgICAgICAgICAgICAgICAgICAgICZncmVlbl9YLCAmZ3JlZW5fWSwgJmdyZWVuX1osICZibHVlX1gsICZibHVlX1ksCi0gICAgICAgICAgICAgICAgICAgICAmYmx1ZV9aKQotICAgIHBuZ19nZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgJmludF93aGl0ZV94LAotICAgICAgICAgICAgICAgICAgICAgJmludF93aGl0ZV95LCAmaW50X3JlZF94LCAmaW50X3JlZF95LAotICAgICAgICAgICAgICAgICAgICAgJmludF9ncmVlbl94LCAmaW50X2dyZWVuX3ksICZpbnRfYmx1ZV94LAotICAgICAgICAgICAgICAgICAgICAgJmludF9ibHVlX3kpCi0gICAgcG5nX2dldF9jSFJNX1hZWl9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgJmludF9yZWRfWCwgJmludF9yZWRfWSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRfcmVkX1osICZpbnRfZ3JlZW5fWCwgJmludF9ncmVlbl9ZLAotICAgICAgICAgICAgICAgICAgICAgJmludF9ncmVlbl9aLCAmaW50X2JsdWVfWCwgJmludF9ibHVlX1ksCi0gICAgICAgICAgICAgICAgICAgICAmaW50X2JsdWVfWikKLQotICAgIHt3aGl0ZSxyZWQsZ3JlZW4sYmx1ZX1fe3gseX0KLSAgICAgICAgICAgICAgICAgICAgIEEgY29sb3Igc3BhY2UgZW5jb2Rpbmcgc3BlY2lmaWVkIHVzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgY2hyb21hdGljaXRpZXMgb2YgdGhlIGVuZCBwb2ludHMgYW5kIHRoZQotICAgICAgICAgICAgICAgICAgICAgd2hpdGUgcG9pbnQuIChQTkdfSU5GT19jSFJNKQotCi0gICAge3JlZCxncmVlbixibHVlfV97WCxZLFp9Ci0gICAgICAgICAgICAgICAgICAgICBBIGNvbG9yIHNwYWNlIGVuY29kaW5nIHNwZWNpZmllZCB1c2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nIGVuZCBwb2ludHMgLSB0aGUgQ0lFIHRyaXN0aW11bHVzCi0gICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBpbnRlbmRlZCBjb2xvciBvZiB0aGUgcmVkLAotICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMgaW4gdGhlIFBORyBSR0IgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgIFRoZSB3aGl0ZSBwb2ludCBpcyBzaW1wbHkgdGhlIHN1bSBvZiB0aGUgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgIGVuZCBwb2ludHMuIChQTkdfSU5GT19jSFJNKQotCi0gICAgcG5nX2dldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCAmc3JnYl9pbnRlbnQpOwotCi0gICAgc3JnYl9pbnRlbnQgLSAgICB0aGUgcmVuZGVyaW5nIGludGVudCAoUE5HX0lORk9fc1JHQikKLSAgICAgICAgICAgICAgICAgICAgIFRoZSBwcmVzZW5jZSBvZiB0aGUgc1JHQiBjaHVuawotICAgICAgICAgICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgcGl4ZWwgZGF0YSBpcyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHNSR0IgY29sb3Igc3BhY2UuICBUaGlzIGNodW5rIGFsc28KLSAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMgc3BlY2lmaWMgdmFsdWVzIG9mIGdBTUEgYW5kCi0gICAgICAgICAgICAgICAgICAgICBjSFJNLgotCi0gICAgcG5nX2dldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCAmbmFtZSwKLSAgICAgICAmY29tcHJlc3Npb25fdHlwZSwgJnByb2ZpbGUsICZwcm9mbGVuKTsKLQotICAgIG5hbWUgICAgICAgICAgICAgLSBUaGUgcHJvZmlsZSBuYW1lLgotCi0gICAgY29tcHJlc3Npb25fdHlwZSAtIFRoZSBjb21wcmVzc2lvbiB0eXBlOyBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSBmb3IgUE5HIDEuMC4KLSAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBnaXZlIE5VTEwgdG8gdGhpcyBhcmd1bWVudCB0bwotICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgaXQuCi0KLSAgICBwcm9maWxlICAgICAgICAgIC0gSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtIGNvbG9yCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgZGF0YS4gTWF5IGNvbnRhaW4gTlVMcy4KLQotICAgIHByb2ZsZW4gICAgICAgICAgLSBsZW5ndGggb2YgcHJvZmlsZSBkYXRhIGluIGJ5dGVzLgotCi0gICAgcG5nX2dldF9zQklUKHBuZ19wdHIsIGluZm9fcHRyLCAmc2lnX2JpdCk7Ci0KLSAgICBzaWdfYml0ICAgICAgICAtIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zQklUKSBlYWNoIG9mIHRoZSBncmF5LAotICAgICAgICAgICAgICAgICAgICAgcmVkLCBncmVlbiwgYW5kIGJsdWUgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICB3aGljaGV2ZXIgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGNvbG9yIHR5cGUgKHBuZ19jb2xvcl8xNikKLQotICAgIHBuZ19nZXRfdFJOUyhwbmdfcHRyLCBpbmZvX3B0ciwgJnRyYW5zX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgJm51bV90cmFucywgJnRyYW5zX2NvbG9yKTsKLQotICAgIHRyYW5zX2FscGhhICAgIC0gYXJyYXkgb2YgYWxwaGEgKHRyYW5zcGFyZW5jeSkKLSAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgZm9yIHBhbGV0dGUgKFBOR19JTkZPX3RSTlMpCi0KLSAgICBudW1fdHJhbnMgICAgICAtIG51bWJlciBvZiB0cmFuc3BhcmVudCBlbnRyaWVzCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fdFJOUykKLQotICAgIHRyYW5zX2NvbG9yICAgIC0gZ3JheWxldmVsIG9yIGNvbG9yIHNhbXBsZSB2YWx1ZXMgb2YKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yCi0gICAgICAgICAgICAgICAgICAgICBub24tcGFsZXR0ZWQgaW1hZ2VzIChQTkdfSU5GT190Uk5TKQotCi0gICAgcG5nX2dldF9oSVNUKHBuZ19wdHIsIGluZm9fcHRyLCAmaGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9faElTVCkKLQotICAgIGhpc3QgICAgICAgICAgIC0gaGlzdG9ncmFtIG9mIHBhbGV0dGUgKGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICBwbmdfdWludF8xNikKLQotICAgIHBuZ19nZXRfdElNRShwbmdfcHRyLCBpbmZvX3B0ciwgJm1vZF90aW1lKTsKLQotICAgIG1vZF90aW1lICAgICAgIC0gdGltZSBpbWFnZSB3YXMgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAoUE5HX1ZBTElEX3RJTUUpCi0KLSAgICBwbmdfZ2V0X2JLR0QocG5nX3B0ciwgaW5mb19wdHIsICZiYWNrZ3JvdW5kKTsKLQotICAgIGJhY2tncm91bmQgICAgIC0gYmFja2dyb3VuZCBjb2xvciAob2YgdHlwZQotICAgICAgICAgICAgICAgICAgICAgcG5nX2NvbG9yXzE2cCkgKFBOR19WQUxJRF9iS0dEKQotICAgICAgICAgICAgICAgICAgICAgdmFsaWQgMTYtYml0IHJlZCwgZ3JlZW4gYW5kIGJsdWUKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVnYXJkbGVzcyBvZiBjb2xvcl90eXBlCi0KLSAgICBudW1fY29tbWVudHMgICA9IHBuZ19nZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X3B0ciwgJm51bV90ZXh0KTsKLQotICAgIG51bV9jb21tZW50cyAgIC0gbnVtYmVyIG9mIGNvbW1lbnRzCi0KLSAgICB0ZXh0X3B0ciAgICAgICAtIGFycmF5IG9mIHBuZ190ZXh0IGhvbGRpbmcgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzCi0KLSAgICB0ZXh0X3B0cltpXS5jb21wcmVzc2lvbiAtIHR5cGUgb2YgY29tcHJlc3Npb24gdXNlZAotICAgICAgICAgICAgICAgICBvbiAidGV4dCIgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdAotCi0gICAgdGV4dF9wdHJbaV0ua2V5ICAgLSBrZXl3b3JkIGZvciBjb21tZW50LiAgTXVzdCBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgMS03OSBjaGFyYWN0ZXJzLgotCi0gICAgdGV4dF9wdHJbaV0udGV4dCAgLSB0ZXh0IGNvbW1lbnRzIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC4gIENhbiBiZSBlbXB0eS4KLQotICAgIHRleHRfcHRyW2ldLnRleHRfbGVuZ3RoIC0gbGVuZ3RoIG9mIHRleHQgc3RyaW5nLAotICAgICAgICAgICAgICAgICBhZnRlciBkZWNvbXByZXNzaW9uLCAwIGZvciBpVFh0Ci0KLSAgICB0ZXh0X3B0cltpXS5pdHh0X2xlbmd0aCAtIGxlbmd0aCBvZiBpdHh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgdEVYdC96VFh0Ci0KLSAgICB0ZXh0X3B0cltpXS5sYW5nICAtIGxhbmd1YWdlIG9mIGNvbW1lbnQgKGVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciB1bmtub3duKS4KLQotICAgIHRleHRfcHRyW2ldLmxhbmdfa2V5ICAtIGtleXdvcmQgaW4gVVRGLTgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZW1wdHkgc3RyaW5nIGZvciB1bmtub3duKS4KLQotICAgIE5vdGUgdGhhdCB0aGUgaXR4dF9sZW5ndGgsIGxhbmcsIGFuZCBsYW5nX2tleQotICAgIG1lbWJlcnMgb2YgdGhlIHRleHRfcHRyIHN0cnVjdHVyZSBvbmx5IGV4aXN0IHdoZW4gdGhlCi0gICAgbGlicmFyeSBpcyBidWlsdCB3aXRoIGlUWHQgY2h1bmsgc3VwcG9ydC4gIFByaW9yIHRvCi0gICAgbGlicG5nLTEuNC4wIHRoZSBsaWJyYXJ5IHdhcyBidWlsdCBieSBkZWZhdWx0IHdpdGhvdXQKLSAgICBpVFh0IHN1cHBvcnQuIEFsc28gbm90ZSB0aGF0IHdoZW4gaVRYdCBpcyBzdXBwb3J0ZWQsCi0gICAgdGhleSBjb250YWluIE5VTEwgcG9pbnRlcnMgd2hlbiB0aGUgImNvbXByZXNzaW9uIgotICAgIGZpZWxkIGNvbnRhaW5zIFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkUgb3IKLSAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0LgotCi0gICAgbnVtX3RleHQgICAgICAgLSBudW1iZXIgb2YgY29tbWVudHMgKHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgIG51bV9jb21tZW50czsgeW91IGNhbiBwdXQgTlVMTCBoZXJlCi0gICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24pCi0KLSAgICBOb3RlIHdoaWxlIHBuZ19zZXRfdGV4dCgpIHdpbGwgYWNjZXB0IHRleHQsIGxhbmd1YWdlLAotICAgIGFuZCB0cmFuc2xhdGVkIGtleXdvcmRzIHRoYXQgY2FuIGJlIE5VTEwgcG9pbnRlcnMsIHRoZQotICAgIHN0cnVjdHVyZSByZXR1cm5lZCBieSBwbmdfZ2V0X3RleHQgd2lsbCBhbHdheXMgY29udGFpbgotICAgIHJlZ3VsYXIgemVyby10ZXJtaW5hdGVkIEMgc3RyaW5ncy4gIFRoZXkgbWlnaHQgYmUKLSAgICBlbXB0eSBzdHJpbmdzIGJ1dCB0aGV5IHdpbGwgbmV2ZXIgYmUgTlVMTCBwb2ludGVycy4KLQotICAgIG51bV9zcGFsZXR0ZXMgPSBwbmdfZ2V0X3NQTFQocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgJnBhbGV0dGVfcHRyKTsKLQotICAgIG51bV9zcGFsZXR0ZXMgIC0gbnVtYmVyIG9mIHNQTFQgY2h1bmtzIHJlYWQuCi0KLSAgICBwYWxldHRlX3B0ciAgICAtIGFycmF5IG9mIHBhbGV0dGUgc3RydWN0dXJlcyBob2xkaW5nCi0gICAgICAgICAgICAgICAgICAgICBjb250ZW50cyBvZiBvbmUgb3IgbW9yZSBzUExUIGNodW5rcwotICAgICAgICAgICAgICAgICAgICAgcmVhZC4KLQotICAgIHBuZ19nZXRfb0ZGcyhwbmdfcHRyLCBpbmZvX3B0ciwgJm9mZnNldF94LCAmb2Zmc2V0X3ksCi0gICAgICAgJnVuaXRfdHlwZSk7Ci0KLSAgICBvZmZzZXRfeCAgICAgICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSBsZWZ0IGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzY3JlZW4gKGNhbiBiZSBuZWdhdGl2ZSkKLQotICAgIG9mZnNldF95ICAgICAgIC0gcG9zaXRpdmUgb2Zmc2V0IGZyb20gdGhlIHRvcCBlZGdlCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuIChjYW4gYmUgbmVnYXRpdmUpCi0KLSAgICB1bml0X3R5cGUgICAgICAtIFBOR19PRkZTRVRfUElYRUwsIFBOR19PRkZTRVRfTUlDUk9NRVRFUgotCi0gICAgcG5nX2dldF9wSFlzKHBuZ19wdHIsIGluZm9fcHRyLCAmcmVzX3gsICZyZXNfeSwKLSAgICAgICAmdW5pdF90eXBlKTsKLQotICAgIHJlc194ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgotICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KLQotICAgIHJlc195ICAgICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbiBpbgotICAgICAgICAgICAgICAgICAgICAgeCBkaXJlY3Rpb24KLQotICAgIHVuaXRfdHlwZSAgICAgIC0gUE5HX1JFU09MVVRJT05fVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19SRVNPTFVUSU9OX01FVEVSCi0KLSAgICBwbmdfZ2V0X3NDQUwocG5nX3B0ciwgaW5mb19wdHIsICZ1bml0LCAmd2lkdGgsCi0gICAgICAgJmhlaWdodCkKLQotICAgIHVuaXQgICAgICAgIC0gcGh5c2ljYWwgc2NhbGUgdW5pdHMgKGFuIGludGVnZXIpCi0KLSAgICB3aWR0aCAgICAgICAtIHdpZHRoIG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLQotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIGRvdWJsZXMpCi0KLSAgICBwbmdfZ2V0X3NDQUxfcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVuaXQsICZ3aWR0aCwKLSAgICAgICAmaGVpZ2h0KQotCi0gICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKLQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgICAgICAgICAgICAgICAgKGV4cHJlc3NlZCBhcyBhIHN0cmluZykKLQotICAgIGhlaWdodCAgICAgIC0gaGVpZ2h0IG9mIGEgcGl4ZWwgaW4gcGh5c2ljYWwgc2NhbGUgdW5pdHMKLSAgICAgICAgICAgICAgICAgKHdpZHRoIGFuZCBoZWlnaHQgYXJlIHN0cmluZ3MgbGlrZSAiMi41NCIpCi0KLSAgICBudW1fdW5rbm93bl9jaHVua3MgPSBwbmdfZ2V0X3Vua25vd25fY2h1bmtzKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIsICZ1bmtub3ducykKLQotICAgIHVua25vd25zICAgICAgICAgIC0gYXJyYXkgb2YgcG5nX3Vua25vd25fY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgaG9sZGluZyB1bmtub3duIGNodW5rcwotCi0gICAgdW5rbm93bnNbaV0ubmFtZSAgLSBuYW1lIG9mIHVua25vd24gY2h1bmsKLQotICAgIHVua25vd25zW2ldLmRhdGEgIC0gZGF0YSBvZiB1bmtub3duIGNodW5rCi0KLSAgICB1bmtub3duc1tpXS5zaXplICAtIHNpemUgb2YgdW5rbm93biBjaHVuaydzIGRhdGEKLQotICAgIHVua25vd25zW2ldLmxvY2F0aW9uIC0gcG9zaXRpb24gb2YgY2h1bmsgaW4gZmlsZQotCi0gICAgVGhlIHZhbHVlIG9mICJpIiBjb3JyZXNwb25kcyB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlCi0gICAgY2h1bmtzIHdlcmUgcmVhZCBmcm9tIHRoZSBQTkcgZmlsZSBvciBpbnNlcnRlZCB3aXRoIHRoZQotICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKSBmdW5jdGlvbi4KLQotICAgIFRoZSB2YWx1ZSBvZiAibG9jYXRpb24iIGlzIGEgYml0d2lzZSAib3IiIG9mCi0KLSAgICAgICAgIFBOR19IQVZFX0lIRFIgICgweDAxKQotICAgICAgICAgUE5HX0hBVkVfUExURSAgKDB4MDIpCi0gICAgICAgICBQTkdfQUZURVJfSURBVCAoMHgwOCkKLQotVGhlIGRhdGEgZnJvbSB0aGUgcEhZcyBjaHVuayBjYW4gYmUgcmV0cmlldmVkIGluIHNldmVyYWwgY29udmVuaWVudAotZm9ybXM6Ci0KLSAgICByZXNfeCA9IHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0KLSAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0KLSAgICByZXNfeF9hbmRfeSA9IHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlcihwbmdfcHRyLAotICAgICAgIGluZm9fcHRyKQotCi0gICAgcmVzX3ggPSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0KLSAgICByZXNfeSA9IHBuZ19nZXRfeV9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLQotICAgIHJlc194X2FuZF95ID0gcG5nX2dldF9waXhlbHNfcGVyX2luY2gocG5nX3B0ciwKLSAgICAgICBpbmZvX3B0cikKLQotICAgIGFzcGVjdF9yYXRpbyA9IHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvKHBuZ19wdHIsCi0gICAgICAgaW5mb19wdHIpCi0KLSAgICBFYWNoIG9mIHRoZXNlIHJldHVybnMgMCBbc2lnbmlmeWluZyAidW5rbm93biJdIGlmCi0gICAgICAgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgcmVzX3ggaXMgMDsKLSAgICAgICByZXNfeF9hbmRfeSBpcyAwIGlmIHJlc194ICE9IHJlc195Ci0KLSAgICBOb3RlIHRoYXQgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSByZXNvbHV0aW9ucyBhcmUKLSAgICAgICBzdG9yZWQgaW50ZXJuYWxseSwgdGhlIGluY2ggY29udmVyc2lvbnMgd29uJ3QKLSAgICAgICBjb21lIG91dCB0byBleGFjdGx5IGV2ZW4gbnVtYmVyLiAgRm9yIGV4YW1wbGUsCi0gICAgICAgNzIgZHBpIGlzIHN0b3JlZCBhcyAwLjI4MzQ2IHBpeGVscy9tZXRlciwgYW5kCi0gICAgICAgd2hlbiB0aGlzIGlzIHJldHJpZXZlZCBpdCBpcyA3MS45OTg4IGRwaSwgc28KLSAgICAgICBiZSBzdXJlIHRvIHJvdW5kIHRoZSByZXR1cm5lZCB2YWx1ZSBhcHByb3ByaWF0ZWx5Ci0gICAgICAgaWYgeW91IHdhbnQgdG8gZGlzcGxheSBhIHJlYXNvbmFibGUtbG9va2luZyByZXN1bHQuCi0KLVRoZSBkYXRhIGZyb20gdGhlIG9GRnMgY2h1bmsgY2FuIGJlIHJldHJpZXZlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQKLWZvcm1zOgotCi0gICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgeV9vZmZzZXQgPSBwbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gICAgeF9vZmZzZXQgPSBwbmdfZ2V0X3hfb2Zmc2V0X2luY2hlcyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLSAgICB5X29mZnNldCA9IHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotICAgIEVhY2ggb2YgdGhlc2UgcmV0dXJucyAwIFtzaWduaWZ5aW5nICJ1bmtub3duIiBpZiBib3RoCi0gICAgICAgeCBhbmQgeSBhcmUgMF0gaWYgdGhlIGRhdGEgaXMgbm90IHByZXNlbnQgb3IgaWYgdGhlCi0gICAgICAgY2h1bmsgaXMgcHJlc2VudCBidXQgdGhlIHVuaXQgaXMgdGhlIHBpeGVsLiAgVGhlCi0gICAgICAgcmVtYXJrIGFib3V0IGluZXhhY3QgaW5jaCBjb252ZXJzaW9ucyBhcHBsaWVzIGhlcmUKLSAgICAgICBhcyB3ZWxsLCBiZWNhdXNlIGEgdmFsdWUgaW4gaW5jaGVzIGNhbid0IGFsd2F5cyBiZQotICAgICAgIGNvbnZlcnRlZCB0byBtaWNyb25zIGFuZCBiYWNrIHdpdGhvdXQgc29tZSBsb3NzCi0gICAgICAgb2YgcHJlY2lzaW9uLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZQotUE5HIHNwZWNpZmljYXRpb24gZm9yIGNodW5rIGNvbnRlbnRzLiAgQmUgY2FyZWZ1bCB3aXRoIHRydXN0aW5nCi1yb3dieXRlcywgYXMgc29tZSBvZiB0aGUgdHJhbnNmb3JtYXRpb25zIGNvdWxkIGluY3JlYXNlIHRoZSBzcGFjZQotbmVlZGVkIHRvIGhvbGQgYSByb3cgKGV4cGFuZCwgZmlsbGVyLCBncmF5X3RvX3JnYiwgZXRjLikuCi1TZWUgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSwgYmVsb3cuCi0KLUEgcXVpY2sgd29yZCBhYm91dCB0ZXh0X3B0ciBhbmQgbnVtX3RleHQuICBQTkcgc3RvcmVzIGNvbW1lbnRzIGluCi1rZXl3b3JkL3RleHQgcGFpcnMsIG9uZSBwYWlyIHBlciBjaHVuaywgd2l0aCBubyBsaW1pdCBvbiB0aGUgbnVtYmVyCi1vZiB0ZXh0IGNodW5rcywgYW5kIGEgMl4zMSBieXRlIGxpbWl0IG9uIHRoZWlyIHNpemUuICBXaGlsZSB0aGVyZSBhcmUKLXN1Z2dlc3RlZCBrZXl3b3JkcywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gcmVzdHJpY3QgdGhlIHVzZSB0byB0aGVzZQotc3RyaW5ncy4gIEl0IGlzIHN0cm9uZ2x5IHN1Z2dlc3RlZCB0aGF0IGtleXdvcmRzIGFuZCB0ZXh0IGJlIHNlbnNpYmxlCi10byBodW1hbnMgKHRoYXQncyB0aGUgcG9pbnQpLCBzbyBkb24ndCB1c2UgYWJicmV2aWF0aW9ucy4gIE5vbi1wcmludGluZwotc3ltYm9scyBhcmUgbm90IGFsbG93ZWQuICBTZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCi1UaGVyZSBpcyBhbHNvIG5vIHJlcXVpcmVtZW50IHRvIGhhdmUgdGV4dCBhZnRlciB0aGUga2V5d29yZC4KLQotS2V5d29yZHMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gNzkgTGF0aW4tMSBjaGFyYWN0ZXJzIHdpdGhvdXQgbGVhZGluZyBvcgotdHJhaWxpbmcgc3BhY2VzLCBidXQgbm9uLWNvbnNlY3V0aXZlIHNwYWNlcyBhcmUgYWxsb3dlZCB3aXRoaW4gdGhlCi1rZXl3b3JkLiAgSXQgaXMgcG9zc2libGUgdG8gaGF2ZSB0aGUgc2FtZSBrZXl3b3JkIGFueSBudW1iZXIgb2YgdGltZXMuCi1UaGUgdGV4dF9wdHIgaXMgYW4gYXJyYXkgb2YgcG5nX3RleHQgc3RydWN0dXJlcywgZWFjaCBob2xkaW5nIGEKLXBvaW50ZXIgdG8gYSBsYW5ndWFnZSBzdHJpbmcsIGEgcG9pbnRlciB0byBhIGtleXdvcmQgYW5kIGEgcG9pbnRlciB0bwotYSB0ZXh0IHN0cmluZy4gIFRoZSB0ZXh0IHN0cmluZywgbGFuZ3VhZ2UgY29kZSwgYW5kIHRyYW5zbGF0ZWQKLWtleXdvcmQgbWF5IGJlIGVtcHR5IG9yIE5VTEwgcG9pbnRlcnMuICBUaGUga2V5d29yZC90ZXh0Ci1wYWlycyBhcmUgcHV0IGludG8gdGhlIGFycmF5IGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlY2VpdmVkLgotSG93ZXZlciwgc29tZSBvciBhbGwgb2YgdGhlIHRleHQgY2h1bmtzIG1heSBiZSBhZnRlciB0aGUgaW1hZ2UsIHNvLCB0bwotbWFrZSBzdXJlIHlvdSBoYXZlIHJlYWQgYWxsIHRoZSB0ZXh0IGNodW5rcywgZG9uJ3QgbWVzcyB3aXRoIHRoZXNlCi11bnRpbCBhZnRlciB5b3UgcmVhZCB0aGUgc3R1ZmYgYWZ0ZXIgdGhlIGltYWdlLiAgVGhpcyB3aWxsIGJlCi1tZW50aW9uZWQgYWdhaW4gYmVsb3cgaW4gdGhlIGRpc2N1c3Npb24gdGhhdCBnb2VzIHdpdGggcG5nX3JlYWRfZW5kKCkuCi0KLS5TUyBJbnB1dCB0cmFuc2Zvcm1hdGlvbnMKLQotQWZ0ZXIgeW91J3ZlIHJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiwgeW91IGNhbiBzZXQgdXAgdGhlIGxpYnJhcnkKLXRvIGhhbmRsZSBhbnkgc3BlY2lhbCB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGltYWdlIGRhdGEuICBUaGUgdmFyaW91cwotd2F5cyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQotc2hvdWxkIG9jY3VyLiAgVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHNvbWUgb2YgdGhlc2UgY2hhbmdlIHRoZSBjb2xvcgotdHlwZSBhbmQvb3IgYml0IGRlcHRoIG9mIHRoZSBkYXRhLCBhbmQgc29tZSBvdGhlcnMgb25seSB3b3JrIG9uCi1jZXJ0YWluIGNvbG9yIHR5cGVzIGFuZCBiaXQgZGVwdGhzLgotCi1UcmFuc2Zvcm1hdGlvbnMgeW91IHJlcXVlc3QgYXJlIGlnbm9yZWQgaWYgdGhleSBkb24ndCBoYXZlIGFueSBtZWFuaW5nIGZvciBhCi1wYXJ0aWN1bGFyIGlucHV0IGRhdGEgZm9ybWF0LiAgSG93ZXZlciBzb21lIHRyYW5zZm9ybWF0aW9ucyBjYW4gaGF2ZSBhbiBlZmZlY3QKLWFzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMgdHJhbnNmb3JtYXRpb24uICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnRyYWRpY3Rvcnkgc2V0IG9mCi10cmFuc2Zvcm1hdGlvbnMsIGZvciBleGFtcGxlIGJvdGggYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgYWxwaGEgY2hhbm5lbCwgeW91Ci1jYW5ub3QgcHJlZGljdCB0aGUgZmluYWwgcmVzdWx0LgotCi1UaGUgY29sb3IgdXNlZCBmb3IgdGhlIHRyYW5zcGFyZW5jeSB2YWx1ZXMgc2hvdWxkIGJlIHN1cHBsaWVkIGluIHRoZSBzYW1lCi1mb3JtYXQvZGVwdGggYXMgdGhlIGN1cnJlbnQgaW1hZ2UgZGF0YS4gIEl0IGlzIHN0b3JlZCBpbiB0aGUgc2FtZSBmb3JtYXQvZGVwdGgKLWFzIHRoZSBpbWFnZSBkYXRhIGluIGEgdFJOUyBjaHVuaywgc28gdGhpcyBpcyB3aGF0IGxpYnBuZyBleHBlY3RzIGZvciB0aGlzIGRhdGEuCi0KLVRoZSBjb2xvciB1c2VkIGZvciB0aGUgYmFja2dyb3VuZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBuZWVkX2V4cGFuZCBhcmd1bWVudCBhcwotZGVzY3JpYmVkIGJlbG93LgotCi1EYXRhIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBzdXBwbGllZCByb3cgYnVmZmVycyBwYWNrZWQgaW50byBieXRlcwotdW5sZXNzIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRvbGQgdG8gdHJhbnNmb3JtIGl0IGludG8gYW5vdGhlciBmb3JtYXQuCi1Gb3IgZXhhbXBsZSwgNCBiaXQvcGl4ZWwgcGFsZXR0ZWQgb3IgZ3JheXNjYWxlIGRhdGEgd2lsbCBiZSByZXR1cm5lZAotMiBwaXhlbHMvYnl0ZSB3aXRoIHRoZSBsZWZ0bW9zdCBwaXhlbCBpbiB0aGUgaGlnaC1vcmRlciBiaXRzIG9mIHRoZSBieXRlLAotdW5sZXNzIHBuZ19zZXRfcGFja2luZygpIGlzIGNhbGxlZC4gIDgtYml0IFJHQiBkYXRhIHdpbGwgYmUgc3RvcmVkCi1pbiBSR0IgUkdCIFJHQiBmb3JtYXQgdW5sZXNzIHBuZ19zZXRfZmlsbGVyKCkgb3IgcG5nX3NldF9hZGRfYWxwaGEoKQotaXMgY2FsbGVkIHRvIGluc2VydCBmaWxsZXIgYnl0ZXMsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgZWFjaCBSR0IgdHJpcGxldC4KLQotMTYtYml0IFJHQiBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgUlJHR0JCIFJSR0dCQiwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAotYnl0ZSBvZiB0aGUgY29sb3IgdmFsdWUgZmlyc3QsIHVubGVzcyBwbmdfc2V0X3NjYWxlXzE2KCkgaXMgY2FsbGVkIHRvCi10cmFuc2Zvcm0gaXQgdG8gcmVndWxhciBSR0IgUkdCIHRyaXBsZXRzLCBvciBwbmdfc2V0X2ZpbGxlcigpIG9yCi1wbmdfc2V0X2FkZCBhbHBoYSgpIGlzIGNhbGxlZCB0byBpbnNlcnQgdHdvIGZpbGxlciBieXRlcywgZWl0aGVyIGJlZm9yZQotb3IgYWZ0ZXIgZWFjaCBSUkdHQkIgdHJpcGxldC4gIFNpbWlsYXJseSwgOC1iaXQgb3IgMTYtYml0IGdyYXlzY2FsZSBkYXRhIGNhbgotYmUgbW9kaWZpZWQgd2l0aCBwbmdfc2V0X2ZpbGxlcigpLCBwbmdfc2V0X2FkZF9hbHBoYSgpLCBwbmdfc2V0X3N0cmlwXzE2KCksCi1vciBwbmdfc2V0X3NjYWxlXzE2KCkuCi0KLVRoZSBmb2xsb3dpbmcgY29kZSB0cmFuc2Zvcm1zIGdyYXlzY2FsZSBpbWFnZXMgb2YgbGVzcyB0aGFuIDggdG8gOCBiaXRzLAotY2hhbmdlcyBwYWxldHRlZCBpbWFnZXMgdG8gUkdCLCBhbmQgYWRkcyBhIGZ1bGwgYWxwaGEgY2hhbm5lbCBpZiB0aGVyZSBpcwotdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGluIGEgdFJOUyBjaHVuay4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgb24KLWdyYXlzY2FsZSBpbWFnZXMgd2l0aCBiaXQgZGVwdGhzIG9mIDIgb3IgNCBvciBpZiB0aGVyZSBpcyBhIG11bHRpcGxlLWltYWdlCi12aWV3aW5nIGFwcGxpY2F0aW9uIHRoYXQgd2lzaGVzIHRvIHRyZWF0IGFsbCBpbWFnZXMgaW4gdGhlIHNhbWUgd2F5LgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKLSAgICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwbmdfcHRyKTsKLQotICAgIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLAotICAgICAgICBQTkdfSU5GT190Uk5TKSkgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZ19wdHIpOwotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJgotICAgICAgICBiaXRfZGVwdGggPCA4KSBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgocG5nX3B0cik7Ci0KLVRoZSBmaXJzdCB0d28gZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBhbGlhc2VzIGZvciBwbmdfc2V0X2V4cGFuZCgpLCBhZGRlZAotaW4gbGlicG5nIHZlcnNpb24gMS4wLjQsIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIGV4cGFuZGVkIHRvIGltcHJvdmUgY29kZQotcmVhZGFiaWxpdHkuICBJbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIHRoZXkgbWF5IGFjdHVhbGx5IGRvIGRpZmZlcmVudAotdGhpbmdzLgotCi1BcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjIuOSwgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzCi1hZGRlZC4gIEl0IGV4cGFuZHMgdGhlIHNhbXBsZSBkZXB0aCB3aXRob3V0IGNoYW5naW5nIHRSTlMgdG8gYWxwaGEuCi0KLUFzIG9mIGxpYnBuZyB2ZXJzaW9uIDEuNS4yLCBwbmdfc2V0X2V4cGFuZF8xNigpIHdhcyBhZGRlZC4gIEl0IGJlaGF2ZXMgYXMKLXBuZ19zZXRfZXhwYW5kKCk7IGhvd2V2ZXIsIHRoZSByZXN1bHRhbnQgY2hhbm5lbHMgaGF2ZSAxNiBiaXRzIHJhdGhlciB0aGFuIDguCi1Vc2UgdGhpcyB3aGVuIHRoZSBvdXRwdXQgY29sb3Igb3IgZ3JheSBjaGFubmVscyBhcmUgbWFkZSBsaW5lYXIgdG8gYXZvaWQgZmFpcmx5Ci1zZXZlcmUgYWNjdXJhY3kgbG9zcy4KLQotICAgaWYgKGJpdF9kZXB0aCA8IDE2KQotICAgICAgcG5nX3NldF9leHBhbmRfMTYocG5nX3B0cik7Ci0KLVBORyBjYW4gaGF2ZSBmaWxlcyB3aXRoIDE2IGJpdHMgcGVyIGNoYW5uZWwuICBJZiB5b3Ugb25seSBjYW4gaGFuZGxlCi04IGJpdHMgcGVyIGNoYW5uZWwsIHRoaXMgd2lsbCBzdHJpcCB0aGUgcGl4ZWxzIGRvd24gdG8gOC1iaXQuCi0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotI2lmIFBOR19MSUJQTkdfVkVSID49IDEwNTA0Ci0gICAgICAgcG5nX3NldF9zY2FsZV8xNihwbmdfcHRyKTsKLSNlbHNlCi0gICAgICAgcG5nX3NldF9zdHJpcF8xNihwbmdfcHRyKTsKLSNlbmRpZgotCi0oVGhlIG1vcmUgYWNjdXJhdGUgInBuZ19zZXRfc2NhbGVfMTYoKSIgQVBJIGJlY2FtZSBhdmFpbGFibGUgaW4gbGlicG5nIHZlcnNpb24KLTEuNS40KS4KLQotSWYgeW91IG5lZWQgdG8gcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCBvbiB0aGUgaW1hZ2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBpbWFnZQotZGF0YSAoZm9yIGV4YW1wbGUgaWYgeW91IGNvbnZlcnQgaXQgdG8gYSBiaXRtYXAgbWFzaykgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQotbGlicG5nIHN0cmlwIHRoZSBjaGFubmVsIGxlYXZpbmcganVzdCBSR0Igb3IgZ3JheSBkYXRhOgotCi0gICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSAgICAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZ19wdHIpOwotCi1JZiB5b3Ugc3RyaXAgdGhlIGFscGhhIGNoYW5uZWwgeW91IG5lZWQgdG8gZmluZCBzb21lIG90aGVyIHdheSBvZiBkZWFsaW5nIHdpdGgKLXRoZSBpbmZvcm1hdGlvbi4gIElmLCBpbnN0ZWFkLCB5b3Ugd2FudCB0byBjb252ZXJ0IHRoZSBpbWFnZSB0byBhbiBvcGFxdWUKLXZlcnNpb24gd2l0aCBubyBhbHBoYSBjaGFubmVsIHVzZSBwbmdfc2V0X2JhY2tncm91bmQ7IHNlZSBiZWxvdy4KLQotQXMgb2YgbGlicG5nIHZlcnNpb24gMS41LjIsIGFsbW9zdCBhbGwgdXNlZnVsIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZCwgdGhlCi1tYWpvciBvbW1pc3Npb25zIGFyZSBjb252ZXJzaW9uIG9mIGdyYXlzY2FsZSB0byBpbmRleGVkIGltYWdlcyAod2hpY2ggY2FuIGJlCi1kb25lIHRyaXZpYWxseSBpbiB0aGUgYXBwbGljYXRpb24pIGFuZCBjb252ZXJzaW9uIG9mIGluZGV4ZWQgdG8gZ3JheXNjYWxlICh3aGljaAotY2FuIGJlIGRvbmUgYnkgYSB0cml2aWFsIG1hbmlwdWxhdGlvbiBvZiB0aGUgcGFsZXR0ZS4pCi0KLUluIHRoZSBmb2xsb3dpbmcgdGFibGUsIHRoZSAwMSBtZWFucyBncmF5c2NhbGUgd2l0aCBkZXB0aDw4LCAzMSBtZWFucwotaW5kZXhlZCB3aXRoIGRlcHRoPDgsIG90aGVyIG51bWVyYWxzIHJlcHJlc2VudCB0aGUgY29sb3IgdHlwZSwgIlQiIG1lYW5zCi10aGUgdFJOUyBjaHVuayBpcyBwcmVzZW50LCBBIG1lYW5zIGFuIGFscGhhIGNoYW5uZWwgaXMgcHJlc2VudCwgYW5kIE8KLW1lYW5zIHRSTlMgb3IgYWxwaGEgaXMgcHJlc2VudCBidXQgYWxsIHBpeGVscyBpbiB0aGUgaW1hZ2UgYXJlIG9wYXF1ZS4KLQotICBGUk9NICAwMSAgMzEgICAwICAwVCAgME8gICAyICAyVCAgMk8gICAzICAzVCAgM08gIDRBICA0TyAgNkEgIDZPCi0gICBUTwotICAgMDEgICAgLSAgW0ddICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtICAgLSAgIC0gICAtCi0gICAzMSAgIFtRXSAgUSAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgIFEgICBRICAgUSAgW1FdIFtRXSAgUSAgIFEKLSAgICAwICAgIDEgICBHICAgKyAgIC4gICAuICAgRyAgIEcgICBHICAgRyAgIEcgICBHICAgQiAgIEIgIEdCICBHQgotICAgMFQgICAgbHQgIEd0ICB0ICAgKyAgIC4gICBHdCAgRyAgIEcgICBHdCAgRyAgIEcgICBCdCAgQnQgR0J0IEdCdAotICAgME8gICAgbHQgIEd0ICB0ICAgLiAgICsgICBHdCAgR3QgIEcgICBHdCAgR3QgIEcgICBCdCAgQnQgR0J0IEdCdAotICAgIDIgICAgQyAgIFAgICBDICAgQyAgIEMgICArICAgLiAgIC4gICBDICAgLSAgIC0gIENCICBDQiAgIEIgICBCCi0gICAyVCAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICArICAgdCAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0Ci0gICAyTyAgICBDdCAgLSAgIEN0ICBDICAgQyAgIHQgICB0ICAgKyAgIC0gICAtICAgLSAgQ0J0IENCdCAgQnQgIEJ0Ci0gICAgMyAgIFtRXSAgcCAgW1FdIFtRXSBbUV0gIFEgICBRICAgUSAgICsgICAuICAgLiAgW1FdIFtRXSAgUSAgIFEKLSAgIDNUICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgICsgICB0ICBbUXRdW1F0XSBRdCAgUXQKLSAgIDNPICAgW1F0XSBwICBbUXRdW1FdIFtRXSAgUXQgIFF0ICBRdCAgdCAgIHQgICArICBbUXRdW1F0XSBRdCAgUXQKLSAgIDRBICAgIGxBICBHICAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgKyAgIEJBICBHICBHQkEKLSAgIDRPICAgIGxBIEdCQSAgQSAgIFQgICBUICAgR0EgIEdUICBHVCAgR0EgIEdUICBHVCAgQkEgICsgIEdCQSAgRwotICAgNkEgICAgQ0EgIFBBICBDQSAgQyAgIEMgICBBICAgVCAgdFQgICBQQSAgUCAgIFAgICBDICBDQkEgICsgICBCQQotICAgNk8gICAgQ0EgUEJBICBDQSAgQyAgIEMgICBBICB0VCAgIFQgICBQQSAgUCAgIFAgIENCQSAgQyAgIEJBICArCi0KLVdpdGhpbiB0aGUgbWF0cml4LAotICAgICAiKyIgaWRlbnRpZmllcyBlbnRyaWVzIHdoZXJlICdmcm9tJyBhbmQgJ3RvJyBhcmUgdGhlIHNhbWUuCi0gICAgICItIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgIi4iIG1lYW5zIG5vdGhpbmcgaXMgbmVjZXNzYXJ5IChhIHRSTlMgY2h1bmsgY2FuIGp1c3QgYmUgaWdub3JlZCkuCi0gICAgICJ0IiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF90Uk5TLgotICAgICAiQSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfYWRkX2FscGhhKCkuCi0gICAgICJYIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9leHBhbmQoKS4KLSAgICAgIjEiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQotICAgICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgKGFuZCBieSBwbmdfc2V0X2V4cGFuZCgpCi0gICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc3BhcmVuY3kgaW4gdGhlIG9yaWdpbmFsIG9yIHRoZSBmaW5hbAotICAgICAgICAgZm9ybWF0KS4KLSAgICAgIkMiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieSBwbmdfc2V0X2dyYXlfdG9fcmdiKCkuCi0gICAgICJHIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkgcG5nX3NldF9yZ2JfdG9fZ3JheSgpLgotICAgICAiUCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5Ci0gICAgICAgICBwbmdfc2V0X2V4cGFuZF9wYWxldHRlX3RvX3JnYigpLgotICAgICAicCIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcGFja2luZygpLgotICAgICAiUSIgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHBuZ19zZXRfcXVhbnRpemUoKS4KLSAgICAgIlQiIG1lYW5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvYnRhaW5lZCBieQotICAgICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKCkuCi0gICAgICJCIiBtZWFucyB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb2J0YWluZWQgYnkKLSAgICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZCgpLCBvciBwbmdfc3RyaXBfYWxwaGEoKS4KLQotV2hlbiBhbiBlbnRyeSBoYXMgbXVsdGlwbGUgdHJhbnNmb3JtcyBsaXN0ZWQgYWxsIGFyZSByZXF1aXJlZCB0byBjYXVzZSB0aGUKLXJpZ2h0IG92ZXJhbGwgdHJhbnNmb3JtYXRpb24uICBXaGVuIHR3byB0cmFuc2Zvcm1zIGFyZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotZWl0aGVyIHdpbGwgZG8gdGhlIGpvYi4gIFdoZW4gdHJhbnNmb3JtcyBhcmUgZW5jbG9zZWQgaW4gW10gdGhlIHRyYW5zZm9ybSBzaG91bGQKLWRvIHRoZSBqb2IgYnV0IHRoaXMgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQgLSBhIGRpZmZlcmVudCBmb3JtYXQgd2lsbCByZXN1bHQKLWlmIHRoZSBzdWdnZXN0ZWQgdHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkLgotCi1JbiBQTkcgZmlsZXMsIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlCi1pcyB0aGUgbGV2ZWwgb2Ygb3BhY2l0eS4gIElmIHlvdSBuZWVkIHRoZSBhbHBoYSBjaGFubmVsIGluIGFuIGltYWdlIHRvCi1iZSB0aGUgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5IGluc3RlYWQgb2Ygb3BhY2l0eSwgeW91IGNhbiBpbnZlcnQgdGhlCi1hbHBoYSBjaGFubmVsIChvciB0aGUgdFJOUyBjaHVuayBkYXRhKSBhZnRlciBpdCdzIHJlYWQsIHNvIHRoYXQgMCBpcwotZnVsbHkgb3BhcXVlIGFuZCAyNTUgKGluIDgtYml0IG9yIHBhbGV0dGVkIGltYWdlcykgb3IgNjU1MzUgKGluIDE2LWJpdAotaW1hZ2VzKSBpcyBmdWxseSB0cmFuc3BhcmVudCwgd2l0aAotCi0gICAgcG5nX3NldF9pbnZlcnRfYWxwaGEocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBwYWNrIHBpeGVscyBvZiBiaXQgZGVwdGhzIDEsIDIsIGFuZCA0IGludG8gYnl0ZXMgYXMgc21hbGwgYXMKLXRoZXkgY2FuLCByZXN1bHRpbmcgaW4sIGZvciBleGFtcGxlLCA4IHBpeGVscyBwZXIgYnl0ZSBmb3IgMSBiaXQKLWZpbGVzLiAgVGhpcyBjb2RlIGV4cGFuZHMgdG8gMSBwaXhlbCBwZXIgYnl0ZSB3aXRob3V0IGNoYW5naW5nIHRoZQotdmFsdWVzIG9mIHRoZSBwaXhlbHM6Ci0KLSAgICBpZiAoYml0X2RlcHRoIDwgOCkKLSAgICAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBoYXZlIHBvc3NpYmxlIGJpdCBkZXB0aHMgb2YgMSwgMiwgNCwgOCwgYW5kIDE2LiAgQWxsIHBpeGVscwotc3RvcmVkIGluIGEgUE5HIGltYWdlIGhhdmUgYmVlbiAic2NhbGVkIiBvciAic2hpZnRlZCIgdXAgdG8gdGhlIG5leHQKLWhpZ2hlciBwb3NzaWJsZSBiaXQgZGVwdGggKGUuZy4gZnJvbSA1IGJpdHMvc2FtcGxlIGluIHRoZSByYW5nZSBbMCwzMV0KLXRvIDggYml0cy9zYW1wbGUgaW4gdGhlIHJhbmdlIFswLCAyNTVdKS4gIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUKLXRvIGNvbnZlcnQgdGhlIFBORyBwaXhlbCBkYXRhIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aCBvZiB0aGUKLWltYWdlLiAgVGhpcyBjYWxsIHJlZHVjZXMgdGhlIHBpeGVscyBiYWNrIGRvd24gdG8gdGhlIG9yaWdpbmFsIGJpdCBkZXB0aDoKLQotICAgIHBuZ19jb2xvcl84cCBzaWdfYml0OwotCi0gICAgaWYgKHBuZ19nZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpKQotICAgICAgIHBuZ19zZXRfc2hpZnQocG5nX3B0ciwgc2lnX2JpdCk7Ci0KLVBORyBmaWxlcyBzdG9yZSAzLWNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCi1jaGFuZ2VzIHRoZSBzdG9yYWdlIG9mIHRoZSBwaXhlbHMgdG8gYmx1ZSwgZ3JlZW4sIHJlZDoKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAotICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKLSAgICAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIFJHQiBwaXhlbHMgcGFja2VkIGludG8gMyBvciA2IGJ5dGVzLiBUaGlzIGNvZGUgZXhwYW5kcyB0aGVtCi1pbnRvIDQgb3IgOCBieXRlcyBmb3Igd2luZG93aW5nIHN5c3RlbXMgdGhhdCBuZWVkIHRoZW0gaW4gdGhpcyBmb3JtYXQ6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IpCi0gICAgICAgcG5nX3NldF9maWxsZXIocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0JFRk9SRSk7Ci0KLXdoZXJlICJmaWxsZXIiIGlzIHRoZSA4LWJpdCBvciAxNi1iaXQgbnVtYmVyIHRvIGZpbGwgd2l0aCwgYW5kIHRoZSBsb2NhdGlvbgotaXMgZWl0aGVyIFBOR19GSUxMRVJfQkVGT1JFIG9yIFBOR19GSUxMRVJfQUZURVIsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKLXlvdSB3YW50IHRoZSBmaWxsZXIgYmVmb3JlIHRoZSBSR0Igb3IgYWZ0ZXIuIFdoZW4gZmlsbGluZyBhbiA4LWJpdCBwaXhlbCwKLXRoZSBsZWFzdCBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG51bWJlciBhcmUgdXNlZCwgaWYgYSAxNi1iaXQgbnVtYmVyIGlzCi1zdXBwbGllZC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gZG9lcyBub3QgYWZmZWN0IGltYWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBmdWxsCi1hbHBoYSBjaGFubmVscy4gIFRvIGFkZCBhbiBvcGFxdWUgYWxwaGEgY2hhbm5lbCwgdXNlIGZpbGxlcj0weGZmZmYgYW5kCi1QTkdfRklMTEVSX0FGVEVSIHdoaWNoIHdpbGwgZ2VuZXJhdGUgUkdCQSBwaXhlbHMuCi0KLU5vdGUgdGhhdCBwbmdfc2V0X2ZpbGxlcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgdHlwZS4gIElmIHlvdSB3YW50Ci10byBkbyB0aGF0LCB5b3UgY2FuIGFkZCBhIHRydWUgYWxwaGEgY2hhbm5lbCB3aXRoCi0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgfHwKLSAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkpCi0gICAgICAgcG5nX3NldF9hZGRfYWxwaGEocG5nX3B0ciwgZmlsbGVyLCBQTkdfRklMTEVSX0FGVEVSKTsKLQotd2hlcmUgImZpbGxlciIgY29udGFpbnMgdGhlIGFscGhhIHZhbHVlIHRvIGFzc2lnbiB0byBlYWNoIHBpeGVsLgotVGhlIHBuZ19zZXRfYWRkX2FscGhhKCkgZnVuY3Rpb24gd2FzIGFkZGVkIGluIGxpYnBuZy0xLjIuNy4KLQotSWYgeW91IGFyZSByZWFkaW5nIGFuIGltYWdlIHdpdGggYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHlvdSBuZWVkIHRoZQotZGF0YSBhcyBBUkdCIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBQTkcgZm9ybWF0IFJHQkE6Ci0KLSAgICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEpCi0gICAgICAgcG5nX3NldF9zd2FwX2FscGhhKHBuZ19wdHIpOwotCi1Gb3Igc29tZSB1c2VzLCB5b3UgbWF5IHdhbnQgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMKLVJHQi4gIFRoaXMgY29kZSB3aWxsIGRvIHRoYXQgY29udmVyc2lvbjoKLQotICAgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKLSAgICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nX3B0cik7Ci0KLUNvbnZlcnNlbHksIHlvdSBjYW4gY29udmVydCBhbiBSR0Igb3IgUkdCQSBpbWFnZSB0byBncmF5c2NhbGUgb3IgZ3JheXNjYWxlCi13aXRoIGFscGhhLgotCi0gICAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCIHx8Ci0gICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBKQotICAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXkocG5nX3B0ciwgZXJyb3JfYWN0aW9uLAotICAgICAgICAgIGRvdWJsZSByZWRfd2VpZ2h0LCBkb3VibGUgZ3JlZW5fd2VpZ2h0KTsKLQotICAgIGVycm9yX2FjdGlvbiA9IDE6IHNpbGVudGx5IGRvIHRoZSBjb252ZXJzaW9uCi0KLSAgICBlcnJvcl9hY3Rpb24gPSAyOiBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQotCi0gICAgZXJyb3JfYWN0aW9uID0gMzogaXNzdWUgYW4gZXJyb3IgYW5kIGFib3J0IHRoZQotICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gaWYgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGFueSBwaXhlbCB3aGVyZQotICAgICAgICAgICAgICAgICAgICAgIHJlZCAhPSBncmVlbiBvciByZWQgIT0gYmx1ZQotCi0gICAgcmVkX3dlaWdodDogICAgICAgd2VpZ2h0IG9mIHJlZCBjb21wb25lbnQKLQotICAgIGdyZWVuX3dlaWdodDogICAgIHdlaWdodCBvZiBncmVlbiBjb21wb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICBJZiBlaXRoZXIgd2VpZ2h0IGlzIG5lZ2F0aXZlLCBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyBhcmUgdXNlZC4KLQotSW4gdGhlIGNvcnJlc3BvbmRpbmcgZml4ZWQgcG9pbnQgQVBJIHRoZSByZWRfd2VpZ2h0IGFuZCBncmVlbl93ZWlnaHQgdmFsdWVzIGFyZQotc2ltcGx5IHNjYWxlZCBieSAxMDAsMDAwOgotCi0gICAgcG5nX3NldF9yZ2JfdG9fZ3JheShwbmdfcHRyLCBlcnJvcl9hY3Rpb24sCi0gICAgICAgcG5nX2ZpeGVkX3BvaW50IHJlZF93ZWlnaHQsCi0gICAgICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVuX3dlaWdodCk7Ci0KLUlmIHlvdSBoYXZlIHNldCBlcnJvcl9hY3Rpb24gPSAxIG9yIDIsIHlvdSBjYW4KLWxhdGVyIGNoZWNrIHdoZXRoZXIgdGhlIGltYWdlIHJlYWxseSB3YXMgZ3JheSwgYWZ0ZXIgcHJvY2Vzc2luZwotdGhlIGltYWdlIHJvd3MsIHdpdGggdGhlIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzKHBuZ19wdHIpIGZ1bmN0aW9uLgotSXQgd2lsbCByZXR1cm4gYSBwbmdfYnl0ZSB0aGF0IGlzIHplcm8gaWYgdGhlIGltYWdlIHdhcyBncmF5IG9yCi0xIGlmIHRoZXJlIHdlcmUgYW55IG5vbi1ncmF5IHBpeGVscy4gIEJhY2tncm91bmQgYW5kIHNCSVQgZGF0YQotd2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gZ3JheXNjYWxlLCB1c2luZyB0aGUgZ3JlZW4gY2hhbm5lbAotZGF0YSBmb3Igc0JJVCwgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3JfYWN0aW9uIHNldHRpbmcuCi0KLVRoZSBkZWZhdWx0IHZhbHVlcyBjb21lIGZyb20gdGhlIFBORyBmaWxlIGNIUk0gY2h1bmsgaWYgcHJlc2VudDsgb3RoZXJ3aXNlLCB0aGUKLWRlZmF1bHRzIGNvcnJlc3BvbmQgdG8gdGhlIElUVS1SIHJlY29tbWVuZGF0aW9uIDcwOSwgYW5kIGFsc28gdGhlIHNSR0IgY29sb3IKLXNwYWNlLCBhcyByZWNvbW1lbmRlZCBpbiB0aGUgQ2hhcmxlcyBQb3ludG9uJ3MgQ29sb3VyIEZBUSwKLUNvcHlyaWdodCAoYykgMjAwNi0xMS0yOCBDaGFybGVzIFBveW50b24sIGluIHNlY3Rpb24gOToKLQotPGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzk+Ci0KLSAgICBZID0gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCCi0KLVByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQsIDE5OTggdGhyb3VnaCAyMDAyLCByZWNvbW1lbmRlZCBhIHNsaWdodGx5Ci1kaWZmZXJlbnQgZm9ybXVsYToKLQotICAgIFkgPSAwLjIxMjY3MSAqIFIgKyAwLjcxNTE2MCAqIEcgKyAwLjA3MjE2OSAqIEIKLQotTGlicG5nIHVzZXMgYW4gaW50ZWdlciBhcHByb3hpbWF0aW9uOgotCi0gICAgWSA9ICg2OTY4ICogUiArIDIzNDM0ICogRyArIDIzNjYgKiBCKS8zMjc2OAotCi1UaGUgY2FsY3VsYXRpb24gaXMgZG9uZSBpbiBhIGxpbmVhciBjb2xvcnNwYWNlLCBpZiB0aGUgaW1hZ2UgZ2FtbWEKLWNhbiBiZSBkZXRlcm1pbmVkLgotCi1UaGUgcG5nX3NldF9iYWNrZ3JvdW5kKCkgZnVuY3Rpb24gaGFzIGJlZW4gZGVzY3JpYmVkIGFscmVhZHk7IGl0IHRlbGxzIGxpYnBuZyB0bwotY29tcG9zaXRlIGltYWdlcyB3aXRoIGFscGhhIG9yIHNpbXBsZSB0cmFuc3BhcmVuY3kgYWdhaW5zdCB0aGUgc3VwcGxpZWQKLWJhY2tncm91bmQgY29sb3IuICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIG9mIGxpYnBuZyBlYXJsaWVyIHRoYW4KLWxpYnBuZy0xLjUuNCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjYWxsIHRoZSBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBmaWxlCi1oZWFkZXIsIGV2ZW4gaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoZSBjb2xvciBpbiBhIGJLR0QgY2h1bmssIGlmIG9uZSBleGlzdHMuCi0KLUlmIHRoZSBQTkcgZmlsZSBjb250YWlucyBhIGJLR0QgY2h1bmsgKFBOR19JTkZPX2JLR0QgdmFsaWQpLAoteW91IG1heSB1c2UgdGhpcyBjb2xvciwgb3Igc3VwcGx5IGFub3RoZXIgY29sb3IgbW9yZSBzdWl0YWJsZSBmb3IKLXRoZSBjdXJyZW50IGRpc3BsYXkgKGUuZy4sIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYSB3ZWIgcGFnZSkuICBZb3UKLW5lZWQgdG8gdGVsbCBsaWJwbmcgaG93IHRoZSBjb2xvciBpcyByZXByZXNlbnRlZCwgYm90aCB0aGUgZm9ybWF0IG9mIHRoZQotY29tcG9uZW50IHZhbHVlcyBpbiB0aGUgY29sb3IgKHRoZSBudW1iZXIgb2YgYml0cykgYW5kIHRoZSBnYW1tYSBlbmNvZGluZyBvZiB0aGUKLWNvbG9yLiAgVGhlIGZ1bmN0aW9uIHRha2VzIHR3byBhcmd1bWVudHMsIGJhY2tncm91bmRfZ2FtbWFfbW9kZSBhbmQgbmVlZF9leHBhbmQKLXRvIGNvbnZleSB0aGlzIGluZm9ybWF0aW9uOyBob3dldmVyLCBvbmx5IHR3byBjb21iaW5hdGlvbnMgYXJlIGxpa2VseSB0byBiZQotdXNlZnVsOgotCi0gICAgcG5nX2NvbG9yXzE2IG15X2JhY2tncm91bmQ7Ci0gICAgcG5nX2NvbG9yXzE2cCBpbWFnZV9iYWNrZ3JvdW5kOwotCi0gICAgaWYgKHBuZ19nZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2JhY2tncm91bmQpKQotICAgICAgIHBuZ19zZXRfYmFja2dyb3VuZChwbmdfcHRyLCBpbWFnZV9iYWNrZ3JvdW5kLAotICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9GSUxFLCAxLypuZWVkcyB0byBiZSBleHBhbmRlZCovLCAxKTsKLSAgICBlbHNlCi0gICAgICAgcG5nX3NldF9iYWNrZ3JvdW5kKHBuZ19wdHIsICZteV9iYWNrZ3JvdW5kLAotICAgICAgICAgICBQTkdfQkFDS0dST1VORF9HQU1NQV9TQ1JFRU4sIDAvKmRvIG5vdCBleHBhbmQqLywgMSk7Ci0KLVRoZSBzZWNvbmQgY2FsbCB3YXMgZGVzY3JpYmVkIGFib3ZlIC0gbXlfYmFja2dyb3VuZCBpcyBpbiB0aGUgZm9ybWF0IG9mIHRoZQotZmluYWwsIGRpc3BsYXksIG91dHB1dCBwcm9kdWNlZCBieSBsaWJwbmcuICBCZWNhdXNlIHlvdSBub3cga25vdyB0aGUgZm9ybWF0IG9mCi10aGUgUE5HIGl0IGlzIHBvc3NpYmxlIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNob29zZSBlaXRoZXIgOC1iaXQgb3IgMTYtYml0Ci1vdXRwdXQgYW5kIHRvIHJldGFpbiBwYWxldHRlIGltYWdlcyAodGhlIHBhbGV0dGUgY29sb3JzIHdpbGwgYmUgbW9kaWZpZWQKLWFwcHJvcHJpYXRlbHkgYW5kIHRoZSB0Uk5TIGNodW5rIHJlbW92ZWQuKSAgSG93ZXZlciwgaWYgeW91IGFyZSBkb2luZyB0aGlzLAotdGFrZSBncmVhdCBjYXJlIG5vdCB0byBhc2sgZm9yIHRyYW5zZm9ybWF0aW9ucyB3aXRob3V0IGNoZWNraW5nIGZpcnN0IHRoYXQKLXRoZXkgYXBwbHkhCi0KLUluIHRoZSBmaXJzdCBjYWxsIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGhhcyB0aGUgb3JpZ2luYWwgYml0IGRlcHRoIGFuZCBjb2xvciB0eXBlCi1vZiB0aGUgUE5HIGZpbGUuICBTbywgZm9yIHBhbGV0dGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBzdXBwbGllZCBhcyBhIHBhbGV0dGUKLWluZGV4IGFuZCBmb3IgbG93IGJpdCBncmV5c2NhbGUgaW1hZ2VzIHRoZSBjb2xvciBpcyBhIHJlZHVjZWQgYml0IHZhbHVlIGluCi1pbWFnZV9iYWNrZ3JvdW5kLT5ncmF5LgotCi1JZiB5b3UgZGlkbid0IGNhbGwgcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBmaWxlIGhlYWRlciwgZm9yIGV4YW1wbGUKLWlmIHlvdSBuZWVkIHlvdXIgY29kZSB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGxpYnBuZyBwcmlvcgotdG8gbGlicG5nLTEuNS40LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBjYWxsIGl0LgotCi1EbyBub3QgY2FsbCBpdCBpZiB5b3UgY2FsbGVkIHBuZ19zZXRfYWxwaGFfbW9kZSgpOyBkb2luZyBzbyB3aWxsIGRhbWFnZSB0aGUKLXNldHRpbmdzIHB1dCBpbiBwbGFjZSBieSBwbmdfc2V0X2FscGhhX21vZGUoKS4gIChJZiBwbmdfc2V0X2FscGhhX21vZGUoKSBpcwotc3VwcG9ydGVkIHRoZW4geW91IGNhbiBjZXJ0YWlubHkgZG8gcG5nX3NldF9nYW1tYSgpIGJlZm9yZSByZWFkaW5nIHRoZSBQTkcKLWhlYWRlci4pCi0KLVRoaXMgQVBJIHVuY29uZGl0aW9uYWxseSBzZXRzIHRoZSBzY3JlZW4gYW5kIGZpbGUgZ2FtbWEgdmFsdWVzLCBzbyBpdCB3aWxsCi1vdmVycmlkZSB0aGUgdmFsdWUgaW4gdGhlIFBORyBmaWxlIHVubGVzcyBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBQTkcgZmlsZQotcmVhZGluZyBzdGFydHMuICBGb3IgdGhpcyByZWFzb24geW91IG11c3QgYWx3YXlzIGNhbGwgaXQgd2l0aCB0aGUgUE5HIGZpbGUKLXZhbHVlIHdoZW4geW91IGNhbGwgaXQgaW4gdGhpcyBwb3NpdGlvbjoKLQotICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmZpbGVfZ2FtbWEpKQotICAgICAgcG5nX3NldF9nYW1tYShwbmdfcHRyLCBzY3JlZW5fZ2FtbWEsIGZpbGVfZ2FtbWEpOwotCi0gICBlbHNlCi0gICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIHNjcmVlbl9nYW1tYSwgMC40NTQ1NSk7Ci0KLUlmIHlvdSBuZWVkIHRvIHJlZHVjZSBhbiBSR0IgZmlsZSB0byBhIHBhbGV0dGVkIGZpbGUsIG9yIGlmIGEgcGFsZXR0ZWQKLWZpbGUgaGFzIG1vcmUgZW50cmllcyB0aGFuIHdpbGwgZml0IG9uIHlvdXIgc2NyZWVuLCBwbmdfc2V0X3F1YW50aXplKCkKLXdpbGwgZG8gdGhhdC4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgc2ltcGxlIG1hdGNoIHF1YW50aXphdGlvbiB0aGF0IG1lcmVseQotZmluZHMgdGhlIGNsb3Nlc3QgY29sb3IgYXZhaWxhYmxlLiAgVGhpcyBzaG91bGQgd29yayBmYWlybHkgd2VsbCB3aXRoCi1vcHRpbWl6ZWQgcGFsZXR0ZXMsIGJ1dCBmYWlybHkgYmFkbHkgd2l0aCBsaW5lYXIgY29sb3IgY3ViZXMuICBJZiB5b3UKLXBhc3MgYSBwYWxldHRlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bV9jb2xvcnMsIHRoZSBmaWxlIHdpbGwKLXJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgcGFsZXR0ZSBzbyBpdCB3aWxsIGZpdCBpbnRvCi1tYXhpbXVtX2NvbG9ycy4gIElmIHRoZXJlIGlzIGEgaGlzdG9ncmFtLCBsaWJwbmcgd2lsbCB1c2UgaXQgdG8gbWFrZQotbW9yZSBpbnRlbGxpZ2VudCBjaG9pY2VzIHdoZW4gcmVkdWNpbmcgdGhlIHBhbGV0dGUuICBJZiB0aGVyZSBpcyBubwotaGlzdG9ncmFtLCBpdCBtYXkgbm90IGRvIGFzIGdvb2QgYSBqb2IuCi0KLSAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICB7Ci0gICAgICBpZiAocG5nX2dldF92YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICAgICBQTkdfSU5GT19QTFRFKSkKLSAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzE2cCBoaXN0b2dyYW0gPSBOVUxMOwotCi0gICAgICAgICBwbmdfZ2V0X2hJU1QocG5nX3B0ciwgaW5mb19wdHIsCi0gICAgICAgICAgICAgJmhpc3RvZ3JhbSk7Ci0gICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHBhbGV0dGUsIG51bV9wYWxldHRlLAotICAgICAgICAgICAgbWF4X3NjcmVlbl9jb2xvcnMsIGhpc3RvZ3JhbSwgMSk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHBuZ19jb2xvciBzdGRfY29sb3JfY3ViZVtNQVhfU0NSRUVOX0NPTE9SU10gPQotICAgICAgICAgICAgeyAuLi4gY29sb3JzIC4uLiB9OwotCi0gICAgICAgICBwbmdfc2V0X3F1YW50aXplKHBuZ19wdHIsIHN0ZF9jb2xvcl9jdWJlLAotICAgICAgICAgICAgTUFYX1NDUkVFTl9DT0xPUlMsIE1BWF9TQ1JFRU5fQ09MT1JTLAotICAgICAgICAgICAgTlVMTCwwKTsKLSAgICAgIH0KLSAgIH0KLQotUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcgb25lLgotVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV2ZXJzZSB0aGlzIChtYWtlIGJsYWNrIGJlIG9uZSBhbmQgd2hpdGUgYmUKLXplcm8pOgotCi0gICBpZiAoYml0X2RlcHRoID09IDEgJiYgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZKQotICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGludmVydCBncmF5c2NhbGUgYW5kIGdyYXktYWxwaGEgaW1hZ2VzOgotCi0gICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKQotICAgICAgcG5nX3NldF9pbnZlcnRfbW9ubyhwbmdfcHRyKTsKLQotUE5HIGZpbGVzIHN0b3JlIDE2LWJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAotaWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgY2hhbmdlcyB0aGUgc3RvcmFnZSB0byB0aGUKLW90aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGZpcnN0LCB0aGUKLXdheSBQQ3Mgc3RvcmUgdGhlbSk6Ci0KLSAgICBpZiAoYml0X2RlcHRoID09IDE2KQotICAgICAgIHBuZ19zZXRfc3dhcChwbmdfcHRyKTsKLQotSWYgeW91IGFyZSB1c2luZyBwYWNrZWQtcGl4ZWwgaW1hZ2VzICgxLCAyLCBvciA0IGJpdHMvcGl4ZWwpLCBhbmQgeW91Ci1uZWVkIHRvIGNoYW5nZSB0aGUgb3JkZXIgdGhlIHBpeGVscyBhcmUgcGFja2VkIGludG8gYnl0ZXMsIHlvdSBjYW4gdXNlOgotCi0gICAgaWYgKGJpdF9kZXB0aCA8IDgpCi0gICAgICAgcG5nX3NldF9wYWNrc3dhcChwbmdfcHRyKTsKLQotRmluYWxseSwgeW91IGNhbiB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBpZiBub25lIG9mCi10aGUgZXhpc3Rpbmcgb25lcyBtZWV0cyB5b3VyIG5lZWRzLiAgVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgYSBjYWxsYmFjawotd2l0aAotCi0gICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKHBuZ19wdHIsCi0gICAgICAgIHJlYWRfdHJhbnNmb3JtX2ZuKTsKLQotWW91IG11c3Qgc3VwcGx5IHRoZSBmdW5jdGlvbgotCi0gICAgdm9pZCByZWFkX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCi0gICAgICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgZGF0YSkKLQotU2VlIHBuZ3Rlc3QuYyBmb3IgYSB3b3JraW5nIGV4YW1wbGUuICBZb3VyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi1hZnRlciBhbGwgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGFrZSBjYXJlIHdpdGgKLWludGVybGFjZWQgaW1hZ2VzIGlmIHlvdSBkbyB0aGUgaW50ZXJsYWNlIHlvdXJzZWxmIC0gdGhlIHdpZHRoIG9mIHRoZSByb3cgaXMgdGhlCi13aWR0aCBpbiAncm93X2luZm8nLCBub3QgdGhlIG92ZXJhbGwgaW1hZ2Ugd2lkdGguCi0KLUlmIHN1cHBvcnRlZCwgbGlicG5nIHByb3ZpZGVzIHR3byBpbmZvcm1hdGlvbiByb3V0aW5lcyB0aGF0IHlvdSBjYW4gdXNlIHRvIGZpbmQKLXdoZXJlIHlvdSBhcmUgaW4gcHJvY2Vzc2luZyB0aGUgaW1hZ2U6Ci0KLSAgIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwbmdfc3RydWN0cCBwbmdfcHRyKTsKLSAgIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotCi1Eb24ndCB0cnkgdXNpbmcgdGhlc2Ugb3V0c2lkZSBhIHRyYW5zZm9ybSBjYWxsYmFjayAtIGZpcnN0bHkgdGhleSBhcmUgb25seQotc3VwcG9ydGVkIGlmIHVzZXIgdHJhbnNmb3JtcyBhcmUgc3VwcG9ydGVkLCBzZWNvbmRseSB0aGV5IG1heSB3ZWxsIHJldHVybgotdW5leHBlY3RlZCByZXN1bHRzIHVubGVzcyB0aGUgcm93IGlzIGFjdHVhbGx5IGJlaW5nIHByb2Nlc3NlZCBhdCB0aGUgbW9tZW50IHRoZXkKLWFyZSBjYWxsZWQuCi0KLVdpdGggaW50ZXJsYWNlZAotaW1hZ2VzIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgcm93IGluIHRoZSBpbnB1dCBzdWItaW1hZ2UgaW1hZ2UuICBVc2UKLVBOR19ST1dfRlJPTV9QQVNTX1JPVyhyb3csIHBhc3MpIGFuZCBQTkdfQ09MX0ZST01fUEFTU19DT0woY29sLCBwYXNzKSB0bwotZmluZCB0aGUgb3V0cHV0IHBpeGVsICh4LHkpIGdpdmVuIGFuIGludGVybGFjZWQgc3ViLWltYWdlIHBpeGVsIChyb3csY29sLHBhc3MpLgotCi1UaGUgZGlzY3Vzc2lvbiBvZiBpbnRlcmxhY2UgaGFuZGxpbmcgYWJvdmUgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8KLXVzZSB0aGVzZSB2YWx1ZXMuCi0KLVlvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCi1jYWxsYmFjayBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gaW5mb3JtIGxpYnBuZyB0aGF0IHlvdXIgdHJhbnNmb3JtCi1mdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdCBkZXB0aCB3aXRoIHRoZQotZnVuY3Rpb24KLQotICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwKLSAgICAgICAgdXNlcl9kZXB0aCwgdXNlcl9jaGFubmVscyk7Ci0KLVRoZSB1c2VyJ3MgYXBwbGljYXRpb24sIG5vdCBsaWJwbmcsIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZAotZnJlZWluZyBhbnkgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgdXNlciBzdHJ1Y3R1cmUuCi0KLVlvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbgotcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIoKS4gIEZvciBleGFtcGxlOgotCi0gICAgdm9pZHAgcmVhZF91c2VyX3RyYW5zZm9ybV9wdHIgPQotICAgICAgICBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cihwbmdfcHRyKTsKLQotVGhlIGxhc3QgdGhpbmcgdG8gaGFuZGxlIGlzIGludGVybGFjaW5nOyB0aGlzIGlzIGNvdmVyZWQgaW4gZGV0YWlsIGJlbG93LAotYnV0IHlvdSBtdXN0IGNhbGwgdGhlIGZ1bmN0aW9uIGhlcmUgaWYgeW91IHdhbnQgbGlicG5nIHRvIGhhbmRsZSBleHBhbnNpb24KLW9mIHRoZSBpbnRlcmxhY2VkIGltYWdlLgotCi0gICAgbnVtYmVyX29mX3Bhc3NlcyA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi1BZnRlciBzZXR0aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGxpYnBuZyBjYW4gdXBkYXRlIHlvdXIgcG5nX2luZm8KLXN0cnVjdHVyZSB0byByZWZsZWN0IGFueSB0cmFuc2Zvcm1hdGlvbnMgeW91J3ZlIHJlcXVlc3RlZCB3aXRoIHRoaXMKLWNhbGwuCi0KLSAgICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLVRoaXMgaXMgbW9zdCB1c2VmdWwgdG8gdXBkYXRlIHRoZSBpbmZvIHN0cnVjdHVyZSdzIHJvd2J5dGVzCi1maWVsZCBzbyB5b3UgY2FuIHVzZSBpdCB0byBhbGxvY2F0ZSB5b3VyIGltYWdlIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24KLXdpbGwgYWxzbyB1cGRhdGUgeW91ciBwYWxldHRlIHdpdGggdGhlIGNvcnJlY3Qgc2NyZWVuX2dhbW1hIGFuZAotYmFja2dyb3VuZCBpZiB0aGVzZSBoYXZlIGJlZW4gZ2l2ZW4gd2l0aCB0aGUgY2FsbHMgYWJvdmUuICBZb3UgbWF5Ci1vbmx5IGNhbGwgcG5nX3JlYWRfdXBkYXRlX2luZm8oKSBvbmNlIHdpdGggYSBwYXJ0aWN1bGFyIGluZm9fcHRyLgotCi1BZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB5b3UgY2FuIGFsbG9jYXRlIGFueQotbWVtb3J5IHlvdSBuZWVkIHRvIGhvbGQgdGhlIGltYWdlLiAgVGhlIHJvdyBkYXRhIGlzIHNpbXBseQotcmF3IGJ5dGUgZGF0YSBmb3IgYWxsIGZvcm1zIG9mIGltYWdlcy4gIEFzIHRoZSBhY3R1YWwgYWxsb2NhdGlvbgotdmFyaWVzIGFtb25nIGFwcGxpY2F0aW9ucywgbm8gZXhhbXBsZSB3aWxsIGJlIGdpdmVuLiAgSWYgeW91Ci1hcmUgYWxsb2NhdGluZyBvbmUgbGFyZ2UgY2h1bmssIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgYW4KLWFycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LCBhcyBpdCB3aWxsIGJlIG5lZWRlZCBmb3Igc29tZQotb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdy4KLQotUmVtZW1iZXI6IEJlZm9yZSB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbygpLCB0aGUgcG5nX2dldF8qKCkKLWZ1bmN0aW9ucyByZXR1cm4gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmlnaW5hbCBQTkcgaW1hZ2UuCi1BZnRlciB5b3UgY2FsbCBwbmdfcmVhZF91cGRhdGVfaW5mbyB0aGUgdmFsdWVzIHJlZmVyIHRvIHRoZSBpbWFnZQotdGhhdCBsaWJwbmcgd2lsbCBvdXRwdXQuICBDb25zZXF1ZW50bHkgeW91IG11c3QgY2FsbCBhbGwgdGhlIHBuZ19zZXRfCi1mdW5jdGlvbnMgYmVmb3JlIHlvdSBjYWxsIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkuICBUaGlzIGlzIHBhcnRpY3VsYXJseQotaW1wb3J0YW50IGZvciBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIC0gaWYgeW91IGFyZSBnb2luZyB0byBjYWxsCi1wbmdfcmVhZF91cGRhdGVfaW5mbygpIHlvdSBtdXN0IGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBiZWZvcmUKLWl0IHVubGVzcyB5b3Ugd2FudCB0byByZWNlaXZlIGludGVybGFjZWQgb3V0cHV0LgotCi0uU1MgUmVhZGluZyBpbWFnZSBkYXRhCi0KLUFmdGVyIHlvdSd2ZSBhbGxvY2F0ZWQgbWVtb3J5LCB5b3UgY2FuIHJlYWQgdGhlIGltYWdlIGRhdGEuCi1UaGUgc2ltcGxlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgaW4gb25lIGZ1bmN0aW9uIGNhbGwuICBJZiB5b3UgYXJlCi1hbGxvY2F0aW5nIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgd2hvbGUgaW1hZ2UsIHlvdSBjYW4ganVzdAotY2FsbCBwbmdfcmVhZF9pbWFnZSgpIGFuZCBsaWJwbmcgd2lsbCByZWFkIGluIGFsbCB0aGUgaW1hZ2UgZGF0YQotYW5kIHB1dCBpdCBpbiB0aGUgbWVtb3J5IGFyZWEgc3VwcGxpZWQuICBZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4KLWFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGVhY2ggcm93LgotCi1UaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbnRlcmxhY2luZywgc28geW91IGRvbid0Ci1uZWVkIHRvIGNhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSAodW5sZXNzIHlvdSBjYWxsCi1wbmdfcmVhZF91cGRhdGVfaW5mbygpKSBvciBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMsIG9yIGFueQotb2YgdGhhdCBvdGhlciBzdHVmZiBuZWNlc3Nhcnkgd2l0aCBwbmdfcmVhZF9yb3dzKCkuCi0KLSAgIHBuZ19yZWFkX2ltYWdlKHBuZ19wdHIsIHJvd19wb2ludGVycyk7Ci0KLXdoZXJlIHJvd19wb2ludGVycyBpczoKLQotICAgcG5nX2J5dGVwIHJvd19wb2ludGVyc1toZWlnaHRdOwotCi1Zb3UgY2FuIHBvaW50IHRvIHZvaWQgb3IgY2hhciBvciB3aGF0ZXZlciB5b3UgdXNlIGZvciBwaXhlbHMuCi0KLUlmIHlvdSBkb24ndCB3YW50IHRvIHJlYWQgaW4gdGhlIHdob2xlIGltYWdlIGF0IG9uY2UsIHlvdSBjYW4KLXVzZSBwbmdfcmVhZF9yb3dzKCkgaW5zdGVhZC4gIElmIHRoZXJlIGlzIG5vIGludGVybGFjaW5nIChjaGVjawotaW50ZXJsYWNlX3R5cGUgPT0gUE5HX0lOVEVSTEFDRV9OT05FKSwgdGhpcyBpcyBzaW1wbGU6Ci0KLSAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgTlVMTCwKLSAgICAgICAgbnVtYmVyX29mX3Jvd3MpOwotCi13aGVyZSByb3dfcG9pbnRlcnMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHBuZ19yZWFkX2ltYWdlKCkgY2FsbC4KLQotSWYgeW91IGFyZSBkb2luZyB0aGlzIGp1c3Qgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCi1hIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKLQotICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKLSAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIsIE5VTEwpOwotCi1JZiB0aGUgZmlsZSBpcyBpbnRlcmxhY2VkIChpbnRlcmxhY2VfdHlwZSAhPSAwIGluIHRoZSBJSERSIGNodW5rKSwgdGhpbmdzCi1nZXQgc29tZXdoYXQgaGFyZGVyLiAgVGhlIG9ubHkgY3VycmVudCAoUE5HIFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIpCi1pbnRlcmxhY2luZyB0eXBlIGZvciBQTkcgaXMgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpOwotYSBzb21ld2hhdCBjb21wbGljYXRlZCAyRCBpbnRlcmxhY2Ugc2NoZW1lLCBrbm93biBhcyBBZGFtNywgdGhhdAotYnJlYWtzIGRvd24gYW4gaW1hZ2UgaW50byBzZXZlbiBzbWFsbGVyIGltYWdlcyBvZiB2YXJ5aW5nIHNpemUsIGJhc2VkCi1vbiBhbiA4eDggZ3JpZC4gIFRoaXMgbnVtYmVyIGlzIGRlZmluZWQgKGZyb20gbGlicG5nIDEuNSkgYXMKLVBOR19JTlRFUkxBQ0VfQURBTTdfUEFTU0VTIGluIHBuZy5oCi0KLWxpYnBuZyBjYW4gZmlsbCBvdXQgdGhvc2UgaW1hZ2VzIG9yIGl0IGNhbiBnaXZlIHRoZW0gdG8geW91ICJhcyBpcyIuCi1JdCBpcyBhbG1vc3QgYWx3YXlzIGJldHRlciB0byBoYXZlIGxpYnBuZyBoYW5kbGUgdGhlIGludGVybGFjaW5nIGZvciB5b3UuCi1JZiB5b3Ugd2FudCB0aGUgaW1hZ2VzIGZpbGxlZCBvdXQsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyB0aGF0LiAgVGhlIG9uZQotbWVudGlvbmVkIGluIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiBpcyB0byBleHBhbmQgZWFjaCBwaXhlbCB0byBjb3ZlcgotdGhvc2UgcGl4ZWxzIHRoYXQgaGF2ZSBub3QgYmVlbiByZWFkIHlldCAodGhlICJyZWN0YW5nbGUiIG1ldGhvZCkuCi1UaGlzIHJlc3VsdHMgaW4gYSBibG9ja3kgaW1hZ2UgZm9yIHRoZSBmaXJzdCBwYXNzLCB3aGljaCBncmFkdWFsbHkKLXNtb290aHMgb3V0IGFzIG1vcmUgcGl4ZWxzIGFyZSByZWFkLiAgVGhlIG90aGVyIG1ldGhvZCBpcyB0aGUgInNwYXJrbGUiCi1tZXRob2QsIHdoZXJlIHBpeGVscyBhcmUgZHJhd24gb25seSBpbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMsIHdpdGggdGhlCi1yZXN0IG9mIHRoZSBpbWFnZSByZW1haW5pbmcgd2hhdGV2ZXIgY29sb3JzIHRoZXkgd2VyZSBpbml0aWFsaXplZCB0bwotYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgcmVhZC4gIFRoZSBmaXJzdCBtZXRob2QgdXN1YWxseSBsb29rcyBiZXR0ZXIsCi1idXQgdGVuZHMgdG8gYmUgc2xvd2VyLCBhcyB0aGVyZSBhcmUgbW9yZSBwaXhlbHMgdG8gcHV0IGluIHRoZSByb3dzLgotCi1JZiwgYXMgaXMgbGlrZWx5LCB5b3Ugd2FudCBsaWJwbmcgdG8gZXhwYW5kIHRoZSBpbWFnZXMsIGNhbGwgdGhpcyBiZWZvcmUKLWNhbGxpbmcgcG5nX3N0YXJ0X3JlYWRfaW1hZ2UoKSBvciBwbmdfcmVhZF91cGRhdGVfaW5mbygpOgotCi0gICAgaWYgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCi0gICAgICAgbnVtYmVyX29mX3Bhc3NlcwotICAgICAgICAgICA9IHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi1UaGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFzc2VzIG5lZWRlZC4gIEN1cnJlbnRseSwgdGhpcyBpcyBzZXZlbiwKLWJ1dCBtYXkgY2hhbmdlIGlmIGFub3RoZXIgaW50ZXJsYWNlIHR5cGUgaXMgYWRkZWQuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZQotY2FsbGVkIGV2ZW4gaWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsIHdoZXJlIGl0IHdpbGwgcmV0dXJuIG9uZSBwYXNzLgotWW91IHRoZW4gbmVlZCB0byByZWFkIHRoZSB3aG9sZSBpbWFnZSAnbnVtYmVyX29mX3Bhc3NlcycgdGltZXMuICBFYWNoIHRpbWUKLXdpbGwgZGlzdHJpYnV0ZSB0aGUgcGl4ZWxzIGZyb20gdGhlIGN1cnJlbnQgcGFzcyB0byB0aGUgY29ycmVjdCBwbGFjZSBpbgotdGhlIG91dHB1dCBpbWFnZSwgc28geW91IG5lZWQgdG8gc3VwcGx5IHRoZSBzYW1lIHJvd3MgdG8gcG5nX3JlYWRfcm93cyBpbgotZWFjaCBwYXNzLgotCi1JZiB5b3UgYXJlIG5vdCBnb2luZyB0byBkaXNwbGF5IHRoZSBpbWFnZSBhZnRlciBlYWNoIHBhc3MsIGJ1dCBhcmUKLWdvaW5nIHRvIHdhaXQgdW50aWwgdGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGluLCB1c2UgdGhlIHNwYXJrbGUKLWVmZmVjdC4gIFRoaXMgZWZmZWN0IGlzIGZhc3RlciBhbmQgdGhlIGVuZCByZXN1bHQgb2YgZWl0aGVyIG1ldGhvZAotaXMgZXhhY3RseSB0aGUgc2FtZS4gIElmIHlvdSBhcmUgcGxhbm5pbmcgb24gZGlzcGxheWluZyB0aGUgaW1hZ2UKLWFmdGVyIGVhY2ggcGFzcywgdGhlICJyZWN0YW5nbGUiIGVmZmVjdCBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCB0aGUKLWJldHRlciBsb29raW5nIG9uZS4KLQotSWYgeW91IG9ubHkgd2FudCB0aGUgInNwYXJrbGUiIGVmZmVjdCwganVzdCBjYWxsIHBuZ19yZWFkX3JvdygpIG9yCi1wbmdfcmVhZF9yb3dzKCkgYXMKLW5vcm1hbCwgd2l0aCB0aGUgdGhpcmQgcGFyYW1ldGVyIE5VTEwuICBNYWtlIHN1cmUgeW91IG1ha2UgcGFzcyBvdmVyCi10aGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcywgYW5kIHlvdSBkb24ndCBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlCi1yb3dzIGJldHdlZW4gY2FsbHMuICBZb3UgY2FuIGNoYW5nZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBkYXRhLCBqdXN0Ci1ub3QgdGhlIGRhdGEuICBFYWNoIHBhc3Mgb25seSB3cml0ZXMgdGhlIHBpeGVscyBhcHByb3ByaWF0ZSBmb3IgdGhhdAotcGFzcywgYW5kIGFzc3VtZXMgdGhlIGRhdGEgZnJvbSBwcmV2aW91cyBwYXNzZXMgaXMgc3RpbGwgdmFsaWQuCi0KLSAgICBwbmdfcmVhZF9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgTlVMTCwKLSAgICAgICAgbnVtYmVyX29mX3Jvd3MpOwotICAgIG9yCi0gICAgcG5nX3JlYWRfcm93KHBuZ19wdHIsIHJvd19wb2ludGVycywgTlVMTCk7Ci0KLUlmIHlvdSBvbmx5IHdhbnQgdGhlIGZpcnN0IGVmZmVjdCAodGhlIHJlY3RhbmdsZXMpLCBkbyB0aGUgc2FtZSBhcwotYmVmb3JlIGV4Y2VwdCBwYXNzIHRoZSByb3cgYnVmZmVyIGluIHRoZSB0aGlyZCBwYXJhbWV0ZXIsIGFuZCBsZWF2ZQotdGhlIHNlY29uZCBwYXJhbWV0ZXIgTlVMTC4KLQotICAgIHBuZ19yZWFkX3Jvd3MocG5nX3B0ciwgTlVMTCwgcm93X3BvaW50ZXJzLAotICAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0gICAgb3IKLSAgICBwbmdfcmVhZF9yb3cocG5nX3B0ciwgTlVMTCwgcm93X3BvaW50ZXJzKTsKLQotSWYgeW91IGRvbid0IHdhbnQgbGlicG5nIHRvIGhhbmRsZSB0aGUgaW50ZXJsYWNpbmcgZGV0YWlscywganVzdCBjYWxsCi1wbmdfcmVhZF9yb3dzKCkgUE5HX0lOVEVSTEFDRV9BREFNN19QQVNTRVMgdGltZXMgdG8gcmVhZCBpbiBhbGwgdGhlIGltYWdlcy4KLUVhY2ggb2YgdGhlIGltYWdlcyBpcyBhIHZhbGlkIGltYWdlIGJ5IGl0c2VsZjsgaG93ZXZlciwgeW91IHdpbGwgYWxtb3N0Ci1jZXJ0YWlubHkgbmVlZCB0byBkaXN0cmlidXRlIHRoZSBwaXhlbHMgZnJvbSBlYWNoIHN1Yi1pbWFnZSB0byB0aGUKLWNvcnJlY3QgcGxhY2UuICBUaGlzIGlzIHdoZXJlIGV2ZXJ5dGhpbmcgZ2V0cyB2ZXJ5IHRyaWNreS4KLQotSWYgeW91IHdhbnQgdG8gcmV0cmlldmUgdGhlIHNlcGFyYXRlIGltYWdlcyB5b3UgbXVzdCBwYXNzIHRoZSBjb3JyZWN0Ci1udW1iZXIgb2Ygcm93cyB0byBlYWNoIHN1Y2Nlc3NpdmUgY2FsbCBvZiBwbmdfcmVhZF9yb3dzKCkuICBUaGUgY2FsY3VsYXRpb24KLWdldHMgcHJldHR5IGNvbXBsaWNhdGVkIGZvciBzbWFsbCBpbWFnZXMsIHdoZXJlIHNvbWUgc3ViLWltYWdlcyBtYXkKLW5vdCBldmVuIGV4aXN0IGJlY2F1c2UgZWl0aGVyIHRoZWlyIHdpZHRoIG9yIGhlaWdodCBlbmRzIHVwIHplcm8uCi1saWJwbmcgcHJvdmlkZXMgdHdvIG1hY3JvcyB0byBoZWxwIHlvdSBpbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zOgotCi0gICBwbmdfdWludF8zMiB3aWR0aCA9IFBOR19QQVNTX0NPTFMoaW1hZ2Vfd2lkdGgsIHBhc3NfbnVtYmVyKTsKLSAgIHBuZ191aW50XzMyIGhlaWdodCA9IFBOR19QQVNTX1JPV1MoaW1hZ2VfaGVpZ2h0LCBwYXNzX251bWJlcik7Ci0KLVJlc3BlY3RpdmVseSB0aGVzZSB0ZWxsIHlvdSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3ViLWltYWdlCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBudW1iZXJlZCBwYXNzLiAgJ3Bhc3MnIGlzIGluIGluIHRoZSByYW5nZSAwIHRvIDYgLQotdGhpcyBjYW4gYmUgY29uZnVzaW5nIGJlY2F1c2UgdGhlIHNwZWNpZmljYXRpb24gcmVmZXJzIHRvIHRoZSBzYW1lIHBhc3NlcwotYXMgMSB0byA3ISAgQmUgY2FyZWZ1bCwgeW91IG11c3QgY2hlY2sgYm90aCB0aGUgd2lkdGggYW5kIGhlaWdodCBiZWZvcmUKLWNhbGxpbmcgcG5nX3JlYWRfcm93cygpIGFuZCBub3QgY2FsbCBpdCBmb3IgdGhhdCBwYXNzIGlmIGVpdGhlciBpcyB6ZXJvLgotCi1Zb3UgY2FuLCBvZiBjb3Vyc2UsIHJlYWQgZWFjaCBzdWItaW1hZ2Ugcm93IGJ5IHJvdy4gIElmIHlvdSB3YW50IHRvCi1wcm9kdWNlIG9wdGltYWwgY29kZSB0byBtYWtlIGEgcGl4ZWwtYnktcGl4ZWwgdHJhbnNmb3JtYXRpb24gb2YgYW4KLWludGVybGFjZWQgaW1hZ2UgdGhpcyBpcyB0aGUgYmVzdCBhcHByb2FjaDsgcmVhZCBlYWNoIHJvdyBvZiBlYWNoIHBhc3MsCi10cmFuc2Zvcm0gaXQsIGFuZCB3cml0ZSBpdCBvdXQgdG8gYSBuZXcgaW50ZXJsYWNlZCBpbWFnZS4KLQotSWYgeW91IHdhbnQgdG8gZGUtaW50ZXJsYWNlIHRoZSBpbWFnZSB5b3Vyc2VsZiBsaWJwbmcgcHJvdmlkZXMgZnVydGhlcgotbWFjcm9zIHRvIGhlbHAgdGhhdCB0ZWxsIHlvdSB3aGVyZSB0byBwbGFjZSB0aGUgcGl4ZWxzIGluIHRoZSBvdXRwdXQgaW1hZ2UuCi1CZWNhdXNlIHRoZSBpbnRlcmxhY2luZyBzY2hlbWUgaXMgcmVjdGFuZ3VsYXIgLSBzdWItaW1hZ2UgcGl4ZWxzIGFyZSBhbHdheXMKLWFycmFuZ2VkIG9uIGEgcmVjdGFuZ3VsYXIgZ3JpZCAtIGFsbCB5b3UgbmVlZCB0byBrbm93IGZvciBlYWNoIHBhc3MgaXMgdGhlCi1zdGFydGluZyBjb2x1bW4gYW5kIHJvdyBpbiB0aGUgb3V0cHV0IGltYWdlIG9mIHRoZSBmaXJzdCBwaXhlbCBwbHVzIHRoZQotc3BhY2luZyBiZXR3ZWVuIGVhY2ggcGl4ZWwuICBBcyBvZiBsaWJwbmcgMS41IHRoZXJlIGFyZSBmb3VyIG1hY3JvcyB0bwotcmV0cmlldmUgdGhpcyBpbmZvcm1hdGlvbjoKLQotICAgcG5nX3VpbnRfMzIgeCA9IFBOR19QQVNTX1NUQVJUX0NPTChwYXNzKTsKLSAgIHBuZ191aW50XzMyIHkgPSBQTkdfUEFTU19TVEFSVF9ST1cocGFzcyk7Ci0gICBwbmdfdWludF8zMiB4U3RlcCA9IDFVIDw8IFBOR19QQVNTX0NPTF9TSElGVChwYXNzKTsKLSAgIHBuZ191aW50XzMyIHlTdGVwID0gMVUgPDwgUE5HX1BBU1NfUk9XX1NISUZUKHBhc3MpOwotCi1UaGVzZSBhbGxvdyB5b3UgdG8gd3JpdGUgdGhlIG9idmlvdXMgbG9vcDoKLQotICAgcG5nX3VpbnRfMzIgaW5wdXRfeSA9IDA7Ci0gICBwbmdfdWludF8zMiBvdXRwdXRfeSA9IFBOR19QQVNTX1NUQVJUX1JPVyhwYXNzKTsKLQotICAgd2hpbGUgKG91dHB1dF95IDwgb3V0cHV0X2ltYWdlX2hlaWdodCkKLSAgIHsKLSAgICAgIHBuZ191aW50XzMyIGlucHV0X3ggPSAwOwotICAgICAgcG5nX3VpbnRfMzIgb3V0cHV0X3ggPSBQTkdfUEFTU19TVEFSVF9DT0wocGFzcyk7Ci0KLSAgICAgIHdoaWxlIChvdXRwdXRfeCA8IG91dHB1dF9pbWFnZV93aWR0aCkKLSAgICAgIHsKLSAgICAgICAgIGltYWdlW291dHB1dF95XVtvdXRwdXRfeF0gPQotICAgICAgICAgICAgIHN1YmltYWdlW3Bhc3NdW2lucHV0X3ldW2lucHV0X3grK107Ci0KLSAgICAgICAgIG91dHB1dF94ICs9IHhTdGVwOwotICAgICAgfQotCi0gICAgICArK2lucHV0X3k7Ci0gICAgICBvdXRwdXRfeSArPSB5U3RlcDsKLSAgIH0KLQotTm90aWNlIHRoYXQgdGhlIHN0ZXBzIGJldHdlZW4gc3VjY2Vzc2l2ZSBvdXRwdXQgcm93cyBhbmQgY29sdW1ucyBhcmUKLXJldHVybmVkIGFzIHNoaWZ0cy4gIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB0aGUgcGl4ZWxzIGluIHRoZSBzdWJpbWFnZXMKLWFyZSBhbHdheXMgYSBwb3dlciBvZiAyIGFwYXJ0IC0gMSwgMiwgNCBvciA4IHBpeGVscyAtIGluIHRoZSBvcmlnaW5hbAotaW1hZ2UuICBJbiBwcmFjdGljZSB5b3UgbWF5IG5lZWQgdG8gZGlyZWN0bHkgY2FsY3VsYXRlIHRoZSBvdXRwdXQgY29vcmRpbmF0ZQotZ2l2ZW4gYW4gaW5wdXQgY29vcmRpbmF0ZS4gIGxpYnBuZyBwcm92aWRlcyB0d28gZnVydGhlciBtYWNyb3MgZm9yIHRoaXMKLXB1cnBvc2U6Ci0KLSAgIHBuZ191aW50XzMyIG91dHB1dF94ID0gUE5HX0NPTF9GUk9NX1BBU1NfQ09MKGlucHV0X3gsIHBhc3MpOwotICAgcG5nX3VpbnRfMzIgb3V0cHV0X3kgPSBQTkdfUk9XX0ZST01fUEFTU19ST1coaW5wdXRfeSwgcGFzcyk7Ci0KLUZpbmFsbHkgYSBwYWlyIG9mIG1hY3JvcyBhcmUgcHJvdmlkZWQgdG8gdGVsbCB5b3UgaWYgYSBwYXJ0aWN1bGFyIGltYWdlCi1yb3cgb3IgY29sdW1uIGFwcGVhcnMgaW4gYSBnaXZlbiBwYXNzOgotCi0gICBpbnQgY29sX2luX3Bhc3MgPSBQTkdfQ09MX0lOX0lOVEVSTEFDRV9QQVNTKG91dHB1dF94LCBwYXNzKTsKLSAgIGludCByb3dfaW5fcGFzcyA9IFBOR19ST1dfSU5fSU5URVJMQUNFX1BBU1Mob3V0cHV0X3ksIHBhc3MpOwotCi1CZWFyIGluIG1pbmQgdGhhdCB5b3Ugd2lsbCBwcm9iYWJseSBhbHNvIG5lZWQgdG8gY2hlY2sgdGhlIHdpZHRoIGFuZCBoZWlnaHQKLW9mIHRoZSBwYXNzIGluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSB0byBiZSBzdXJlIHRoZSBwYXNzIGV2ZW4gZXhpc3RzIQotCi1XaXRoIGFueSBsdWNrIHlvdSBhcmUgY29udmluY2VkIGJ5IG5vdyB0aGF0IHlvdSBkb24ndCB3YW50IHRvIGRvIHlvdXIgb3duCi1pbnRlcmxhY2UgaGFuZGxpbmcuICBJbiByZWFsaXR5IG5vcm1hbGx5IHRoZSBvbmx5IGdvb2QgcmVhc29uIGZvciBkb2luZyB0aGlzCi1pcyBpZiB5b3UgYXJlIHByb2Nlc3NpbmcgUE5HIGZpbGVzIG9uIGEgcGl4ZWwtYnktcGl4ZWwgYmFzaXMgYW5kIGRvbid0IHdhbnQKLXRvIGxvYWQgdGhlIHdob2xlIGZpbGUgaW50byBtZW1vcnkgd2hlbiBpdCBpcyBpbnRlcmxhY2VkLgotCi1saWJwbmcgaW5jbHVkZXMgYSB0ZXN0IHByb2dyYW0sIHBuZ3ZhbGlkLCB0aGF0IGlsbHVzdHJhdGVzIHJlYWRpbmcgYW5kCi13cml0aW5nIG9mIGludGVybGFjZWQgaW1hZ2VzLiAgSWYgeW91IGNhbid0IGdldCBpbnRlcmxhY2luZyB0byB3b3JrIGluIHlvdXIKLWNvZGUgYW5kIGRvbid0IHdhbnQgdG8gbGVhdmUgaXQgdG8gbGlicG5nICh0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2gpLCBzZWUKLWhvdyBwbmd2YWxpZC5jIGRvZXMgaXQuCi0KLS5TUyBGaW5pc2hpbmcgYSBzZXF1ZW50aWFsIHJlYWQKLQotQWZ0ZXIgeW91IGFyZSBmaW5pc2hlZCByZWFkaW5nIHRoZSBpbWFnZSB0aHJvdWdoIHRoZQotbG93LWxldmVsIGludGVyZmFjZSwgeW91IGNhbiBmaW5pc2ggcmVhZGluZyB0aGUgZmlsZS4KLQotSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGNyYyBhY3Rpb24gZm9yIGhhbmRsaW5nIENSQyBlcnJvcnMgaW4KLWNodW5rcyBhZnRlciB0aGUgaW1hZ2UgZGF0YSwgeW91IGNhbiBjYWxsIHBuZ19zZXRfY3JjX2FjdGlvbigpCi1hZ2FpbiBhdCB0aGlzIHBvaW50LgotCi1JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gY29tbWVudHMgb3IgdGltZSwgd2hpY2ggbWF5IGJlIHN0b3JlZCBlaXRoZXIKLWJlZm9yZSBvciBhZnRlciB0aGUgaW1hZ2UgZGF0YSwgeW91IHNob3VsZCBwYXNzIHRoZSBzZXBhcmF0ZSBwbmdfaW5mbwotc3RydWN0IGlmIHlvdSB3YW50IHRvIGtlZXAgdGhlIGNvbW1lbnRzIGZyb20gYmVmb3JlIGFuZCBhZnRlciB0aGUgaW1hZ2UKLXNlcGFyYXRlLgotCi0gICAgcG5nX2luZm9wIGVuZF9pbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLQotICAgIGlmICghZW5kX2luZm8pCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgcG5nX3JlYWRfZW5kKHBuZ19wdHIsIGVuZF9pbmZvKTsKLQotSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCwgeW91IHNob3VsZCBzdGlsbCBjYWxsIHBuZ19yZWFkX2VuZCgpCi1idXQgeW91IGNhbiBwYXNzIE5VTEwsIGF2b2lkaW5nIHRoZSBuZWVkIHRvIGNyZWF0ZSBhbiBlbmRfaW5mbyBzdHJ1Y3R1cmUuCi1JZiB5b3UgZG8gdGhpcywgbGlicG5nIHdpbGwgbm90IHByb2Nlc3MgYW55IGNodW5rcyBhZnRlciBJREFUIG90aGVyIHRoYW4KLXNraXBwaW5nIG92ZXIgdGhlbSBhbmQgcGVyaGFwcyAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IGhhdmUgY2FsbGVkCi1wbmdfc2V0X2NyY19hY3Rpb24pIGNoZWNraW5nIHRoZWlyIENSQ3Mgd2hpbGUgbG9va2luZyBmb3IgdGhlIElFTkQgY2h1bmsuCi0KLSAgIHBuZ19yZWFkX2VuZChwbmdfcHRyLCAocG5nX2luZm9wKU5VTEwpOwotCi1JZiB5b3UgZG9uJ3QgY2FsbCBwbmdfcmVhZF9lbmQoKSwgdGhlbiB5b3VyIGZpbGUgcG9pbnRlciB3aWxsIGJlCi1sZWZ0IHBvaW50aW5nIHRvIHRoZSBmaXJzdCBjaHVuayBhZnRlciB0aGUgbGFzdCBJREFULCB3aGljaCBpcyBwcm9iYWJseQotbm90IHdoYXQgeW91IHdhbnQgaWYgeW91IGV4cGVjdCB0byByZWFkIHNvbWV0aGluZyBiZXlvbmQgdGhlIGVuZCBvZgotdGhlIFBORyBkYXRhc3RyZWFtLgotCi1XaGVuIHlvdSBhcmUgZG9uZSwgeW91IGNhbiBmcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGxpYnBuZyBsaWtlIHRoaXM6Ci0KLSAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgJmVuZF9pbmZvKTsKLQotb3IsIGlmIHlvdSBkaWRuJ3QgY3JlYXRlIGFuIGVuZF9pbmZvIHN0cnVjdHVyZSwKLQotICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0ciwKLSAgICAgICAocG5nX2luZm9wcClOVUxMKTsKLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Ci1wb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi0gICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQotCi0gICAgbWFzayAtIGlkZW50aWZpZXMgZGF0YSB0byBiZSBmcmVlZCwgYSBtYXNrCi0gICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2Ygb25lIG9yCi0gICAgICAgICAgIG1vcmUgb2YKLSAgICAgICAgICAgICBQTkdfRlJFRV9QTFRFLCBQTkdfRlJFRV9UUk5TLAotICAgICAgICAgICAgIFBOR19GUkVFX0hJU1QsIFBOR19GUkVFX0lDQ1AsCi0gICAgICAgICAgICAgUE5HX0ZSRUVfUENBTCwgUE5HX0ZSRUVfUk9XUywKLSAgICAgICAgICAgICBQTkdfRlJFRV9TQ0FMLCBQTkdfRlJFRV9TUExULAotICAgICAgICAgICAgIFBOR19GUkVFX1RFWFQsIFBOR19GUkVFX1VOS04sCi0gICAgICAgICAgIG9yIHNpbXBseSBQTkdfRlJFRV9BTEwKLQotICAgIHNlcSAgLSBzZXF1ZW5jZSBudW1iZXIgb2YgaXRlbSB0byBiZSBmcmVlZAotICAgICAgICAgICAoXC0xIGZvciBhbGwgaXRlbXMpCi0KLVRoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgd2hlbiB0aGUgcmVsZXZhbnQgc3RvcmFnZSBoYXMKLWFscmVhZHkgYmVlbiBmcmVlZCwgb3IgaGFzIG5vdCB5ZXQgYmVlbiBhbGxvY2F0ZWQsIG9yIHdhcyBhbGxvY2F0ZWQKLWJ5IHRoZSB1c2VyIGFuZCBub3QgYnkgbGlicG5nLCAgYW5kIHdpbGwgaW4gdGhvc2UgY2FzZXMgZG8gbm90aGluZy4KLVRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtIG9mIHRoZSBzZWxlY3RlZCBkYXRhCi10eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QgXC0xLCBhbmQgbXVsdGlwbGUgaXRlbXMKLWFyZSBhbGxvd2VkIGZvciB0aGUgZGF0YSB0eXBlIGlkZW50aWZpZWQgaW4gdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvcgotc1BMVCwgb25seSB0aGUgbid0aCBpdGVtIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCi0KLVRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG9ubHkgdG8gZnJlZSBkYXRhIHRoYXQgd2FzIGFsbG9jYXRlZCBpbnRlcm5hbGx5Ci1ieSBsaWJwbmcuICBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBzbyB0aGF0IGxpYnBuZyB3aWxsIG5vdCBmcmVlIHRoZSBkYXRhLAotb3Igc28gdGhhdCBpdCB3aWxsIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgd2l0aCBwbmdfbWFsbG9jKCkKLW9yIHBuZ19jYWxsb2MoKSBhbmQgcGFzc2VkIGluIHZpYSBhIHBuZ19zZXRfKigpIGZ1bmN0aW9uLCB3aXRoCi0KLSAgICBwbmdfZGF0YV9mcmVlcihwbmdfcHRyLCBpbmZvX3B0ciwgZnJlZXIsIG1hc2spCi0KLSAgICBmcmVlciAgLSBvbmUgb2YKLSAgICAgICAgICAgICAgIFBOR19ERVNUUk9ZX1dJTExfRlJFRV9EQVRBCi0gICAgICAgICAgICAgICBQTkdfU0VUX1dJTExfRlJFRV9EQVRBCi0gICAgICAgICAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQQotCi0gICAgbWFzayAgIC0gd2hpY2ggZGF0YSBlbGVtZW50cyBhcmUgYWZmZWN0ZWQKLSAgICAgICAgICAgICBzYW1lIGNob2ljZXMgYXMgaW4gcG5nX2ZyZWVfZGF0YSgpCi0KLVRoaXMgZnVuY3Rpb24gb25seSBhZmZlY3RzIGRhdGEgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4KLVlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHJlYWRpbmcgdGhlIFBORyBkYXRhIGJ1dCBiZWZvcmUgY2FsbGluZwotYW55IHBuZ19zZXRfKigpIGZ1bmN0aW9ucywgdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHRoZSBwbmdfc2V0XyooKQotZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgYW55IGV4aXN0aW5nIGRhdGEgdGhhdCBtaWdodCBiZSBwcmVzZW50LAotYW5kIGFnYWluIGFmdGVyIHRoZSBwbmdfc2V0XyooKSBmdW5jdGlvbnMgdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyCi1vciBwbmdfZGVzdHJveV8qKCkgaXMgc3VwcG9zZWQgdG8gZnJlZSB0aGUgZGF0YS4gIFdoZW4gdGhlIHVzZXIgYXNzdW1lcwotcmVzcG9uc2liaWxpdHkgZm9yIGxpYnBuZy1hbGxvY2F0ZWQgZGF0YSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgdXNlCi1wbmdfZnJlZSgpIHRvIGZyZWUgaXQsIGFuZCB3aGVuIHRoZSB1c2VyIHRyYW5zZmVycyByZXNwb25zaWJpbGl0eSB0byBsaWJwbmcKLWZvciBkYXRhIHRoYXQgdGhlIHVzZXIgaGFzIGFsbG9jYXRlZCwgdGhlIHVzZXIgbXVzdCBoYXZlIHVzZWQgcG5nX21hbGxvYygpCi1vciBwbmdfY2FsbG9jKCkgdG8gYWxsb2NhdGUgaXQuCi0KLUlmIHlvdSBhbGxvY2F0ZWQgeW91ciByb3dfcG9pbnRlcnMgaW4gYSBzaW5nbGUgYmxvY2ssIGFzIHN1Z2dlc3RlZCBhYm92ZSBpbgotdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBoaWdoIGxldmVsIHJlYWQgaW50ZXJmYWNlLCB5b3UgbXVzdCBub3QgdHJhbnNmZXIKLXJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIGl0IHRvIHRoZSBwbmdfc2V0X3Jvd3Mgb3IgcG5nX3JlYWRfZGVzdHJveSBmdW5jdGlvbiwKLWJlY2F1c2UgdGhleSB3b3VsZCBhbHNvIHRyeSB0byBmcmVlIHRoZSBpbmRpdmlkdWFsIHJvd19wb2ludGVyc1tpXS4KLQotSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCi1zZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAotYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKLXRoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKLWlmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgotYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCi0KLVRoZSBwbmdfZnJlZV9kYXRhKCkgZnVuY3Rpb24gd2lsbCB0dXJuIG9mZiB0aGUgInZhbGlkIiBmbGFnIGZvciBhbnl0aGluZwotaXQgZnJlZXMuICBJZiB5b3UgbmVlZCB0byB0dXJuIHRoZSBmbGFnIG9mZiBmb3IgYSBjaHVuayB0aGF0IHdhcyBmcmVlZCBieQoteW91ciBhcHBsaWNhdGlvbiBpbnN0ZWFkIG9mIGJ5IGxpYnBuZywgeW91IGNhbiB1c2UKLQotICAgIHBuZ19zZXRfaW52YWxpZChwbmdfcHRyLCBpbmZvX3B0ciwgbWFzayk7Ci0KLSAgICBtYXNrIC0gaWRlbnRpZmllcyB0aGUgY2h1bmtzIHRvIGJlIG1hZGUgaW52YWxpZCwKLSAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKLSAgICAgICAgICAgbW9yZSBvZgotICAgICAgICAgICAgIFBOR19JTkZPX2dBTUEsIFBOR19JTkZPX3NCSVQsCi0gICAgICAgICAgICAgUE5HX0lORk9fY0hSTSwgUE5HX0lORk9fUExURSwKLSAgICAgICAgICAgICBQTkdfSU5GT190Uk5TLCBQTkdfSU5GT19iS0dELAotICAgICAgICAgICAgIFBOR19JTkZPX2hJU1QsIFBOR19JTkZPX3BIWXMsCi0gICAgICAgICAgICAgUE5HX0lORk9fb0ZGcywgUE5HX0lORk9fdElNRSwKLSAgICAgICAgICAgICBQTkdfSU5GT19wQ0FMLCBQTkdfSU5GT19zUkdCLAotICAgICAgICAgICAgIFBOR19JTkZPX2lDQ1AsIFBOR19JTkZPX3NQTFQsCi0gICAgICAgICAgICAgUE5HX0lORk9fc0NBTCwgUE5HX0lORk9fSURBVAotCi1Gb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiByZWFkaW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgotCi0uU1MgUmVhZGluZyBQTkcgZmlsZXMgcHJvZ3Jlc3NpdmVseQotCi1UaGUgcHJvZ3Jlc3NpdmUgcmVhZGVyIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBub24tcHJvZ3Jlc3NpdmUKLXJlYWRlci4gIEluc3RlYWQgb2YgY2FsbGluZyBwbmdfcmVhZF9pbmZvKCksIHBuZ19yZWFkX3Jvd3MoKSwgYW5kCi1wbmdfcmVhZF9lbmQoKSwgeW91IG1ha2Ugb25lIGNhbGwgdG8gcG5nX3Byb2Nlc3NfZGF0YSgpLCB3aGljaCBjYWxscwotY2FsbGJhY2tzIHdoZW4gaXQgaGFzIHRoZSBpbmZvLCBhIHJvdywgb3IgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBZb3UKLXNldCB1cCB0aGVzZSBjYWxsYmFja3Mgd2l0aCBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBkb24ndAotaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucyBvZiBsaWJwbmcsIGFzIHlvdSBhcmUKLWdpdmluZyB0aGUgbGlicmFyeSB0aGUgZGF0YSBkaXJlY3RseSBpbiBwbmdfcHJvY2Vzc19kYXRhKCkuICBJIHdpbGwKLWFzc3VtZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIHNlY3Rpb24gb24gcmVhZGluZyBQTkcgZmlsZXMgYWJvdmUsCi1zbyBJIHdpbGwgb25seSBoaWdobGlnaHQgdGhlIGRpZmZlcmVuY2VzIChhbHRob3VnaCBJIHdpbGwgc2hvdwotYWxsIG9mIHRoZSBjb2RlKS4KLQotcG5nX3N0cnVjdHAgcG5nX3B0cjsKLXBuZ19pbmZvcCBpbmZvX3B0cjsKLQotIC8qICBBbiBleGFtcGxlIGNvZGUgZnJhZ21lbnQgb2YgaG93IHlvdSB3b3VsZAotICAgICBpbml0aWFsaXplIHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgaW4geW91cgotICAgICBhcHBsaWNhdGlvbi4gKi8KLSBpbnQKLSBpbml0aWFsaXplX3BuZ19yZWFkZXIoKQotIHsKLSAgICBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdAotICAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICAgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKLQotICAgIGlmICghcG5nX3B0cikKLSAgICAgICAgcmV0dXJuIChFUlJPUik7Ci0KLSAgICBpbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nX3B0cik7Ci0KLSAgICBpZiAoIWluZm9fcHRyKQotICAgIHsKLSAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwKLSAgICAgICAgICAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgIHsKLSAgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyLAotICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgIC8qIFRoaXMgb25lJ3MgbmV3LiAgWW91IGNhbiBwcm92aWRlIGZ1bmN0aW9ucwotICAgICAgIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBoZWFkZXIgaW5mbyBpcyB2YWxpZCwKLSAgICAgICB3aGVuIGVhY2ggcm93IGlzIGNvbXBsZXRlZCwgYW5kIHdoZW4gdGhlIGltYWdlCi0gICAgICAgaXMgZmluaXNoZWQuICBJZiB5b3UgYXJlbid0IHVzaW5nIGFsbCBmdW5jdGlvbnMsCi0gICAgICAgeW91IGNhbiBzcGVjaWZ5IE5VTEwgcGFyYW1ldGVycy4gIEV2ZW4gd2hlbiBhbGwKLSAgICAgICB0aHJlZSBmdW5jdGlvbnMgYXJlIE5VTEwsIHlvdSBuZWVkIHRvIGNhbGwKLSAgICAgICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4oKS4gIFlvdSBjYW4gdXNlCi0gICAgICAgYW55IHN0cnVjdCBhcyB0aGUgdXNlcl9wdHIgKGNhc3QgdG8gYSB2b2lkIHBvaW50ZXIKLSAgICAgICBmb3IgdGhlIGZ1bmN0aW9uIGNhbGwpLCBhbmQgcmV0cmlldmUgdGhlIHBvaW50ZXIKLSAgICAgICBmcm9tIGluc2lkZSB0aGUgY2FsbGJhY2tzIHVzaW5nIHRoZSBmdW5jdGlvbgotCi0gICAgICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7Ci0KLSAgICAgICB3aGljaCB3aWxsIHJldHVybiBhIHZvaWQgcG9pbnRlciwgd2hpY2ggeW91IGhhdmUKLSAgICAgICB0byBjYXN0IGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19wdHIsICh2b2lkICopdXNlcl9wdHIsCi0gICAgICAgIGluZm9fY2FsbGJhY2ssIHJvd19jYWxsYmFjaywgZW5kX2NhbGxiYWNrKTsKLQotICAgIHJldHVybiAwOwotIH0KLQotIC8qIEEgY29kZSBmcmFnbWVudCB0aGF0IHlvdSBjYWxsIGFzIHlvdSByZWNlaXZlIGJsb2NrcwotICAgb2YgZGF0YSAqLwotIGludAotIHByb2Nlc3NfZGF0YShwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfdWludF8zMiBsZW5ndGgpCi0gewotICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwbmdfcHRyLCAmaW5mb19wdHIsCi0gICAgICAgICAgIChwbmdfaW5mb3BwKU5VTEwpOwotICAgICAgIHJldHVybiAoRVJST1IpOwotICAgIH0KLQotICAgIC8qIFRoaXMgb25lJ3MgbmV3IGFsc28uICBTaW1wbHkgZ2l2ZSBpdCBhIGNodW5rCi0gICAgICAgb2YgZGF0YSBmcm9tIHRoZSBmaWxlIHN0cmVhbSAoaW4gb3JkZXIsIG9mCi0gICAgICAgY291cnNlKS4gIE9uIG1hY2hpbmVzIHdpdGggc2VnbWVudGVkIG1lbW9yeQotICAgICAgIG1vZGVscyBtYWNoaW5lcywgZG9uJ3QgZ2l2ZSBpdCBhbnkgbW9yZSB0aGFuCi0gICAgICAgNjRLLiAgVGhlIGxpYnJhcnkgc2VlbXMgdG8gcnVuIGZpbmUgd2l0aCBzaXplcwotICAgICAgIG9mIDRLLiBBbHRob3VnaCB5b3UgY2FuIGdpdmUgaXQgbXVjaCBsZXNzIGlmCi0gICAgICAgbmVjZXNzYXJ5IChJIGFzc3VtZSB5b3UgY2FuIGdpdmUgaXQgY2h1bmtzIG9mCi0gICAgICAgMSBieXRlLCBJIGhhdmVuJ3QgdHJpZWQgbGVzcyB0aGFuIDI1NiBieXRlcwotICAgICAgIHlldCkuICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgeW91IG1heQotICAgICAgIHdhbnQgdG8gZGlzcGxheSBhbnkgcm93cyB0aGF0IHdlcmUgZ2VuZXJhdGVkCi0gICAgICAgaW4gdGhlIHJvdyBjYWxsYmFjayBpZiB5b3UgZG9uJ3QgYWxyZWFkeSBkbwotICAgICAgIHNvIHRoZXJlLgotICAgICAqLwotICAgIHBuZ19wcm9jZXNzX2RhdGEocG5nX3B0ciwgaW5mb19wdHIsIGJ1ZmZlciwgbGVuZ3RoKTsKLQotICAgIC8qIEF0IHRoaXMgcG9pbnQgeW91IGNhbiBjYWxsIHBuZ19wcm9jZXNzX2RhdGFfc2tpcCBpZgotICAgICAgIHlvdSB3YW50IHRvIGhhbmRsZSBkYXRhIHRoZSBsaWJyYXJ5IHdpbGwgc2tpcCB5b3Vyc2VsZjsKLSAgICAgICBpdCBzaW1wbHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgKGFuZCBzdG9wcwotICAgICAgIGxpYnBuZyBza2lwcGluZyB0aGF0IG51bWJlciBvZiBieXRlcyBvbiB0aGUgbmV4dAotICAgICAgIHBuZ19wcm9jZXNzX2RhdGEgY2FsbCkuCi0gICAgcmV0dXJuIDA7Ci0gfQotCi0gLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKGFzIHNldCBieQotICAgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbigpIGFib3ZlKSB3aGVuIGVub3VnaCBkYXRhCi0gICAgaGFzIGJlZW4gc3VwcGxpZWQgc28gYWxsIG9mIHRoZSBoZWFkZXIgaGFzIGJlZW4KLSAgICByZWFkLgotICovCi0gdm9pZAotIGluZm9fY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCi0gewotICAgIC8qIERvIGFueSBzZXR1cCBoZXJlLCBpbmNsdWRpbmcgc2V0dGluZyBhbnkgb2YKLSAgICAgICB0aGUgdHJhbnNmb3JtYXRpb25zIG1lbnRpb25lZCBpbiB0aGUgUmVhZGluZwotICAgICAgIFBORyBmaWxlcyBzZWN0aW9uLiAgRm9yIG5vdywgeW91IF9tdXN0XyBjYWxsCi0gICAgICAgZWl0aGVyIHBuZ19zdGFydF9yZWFkX2ltYWdlKCkgb3IKLSAgICAgICBwbmdfcmVhZF91cGRhdGVfaW5mbygpIGFmdGVyIGFsbCB0aGUKLSAgICAgICB0cmFuc2Zvcm1hdGlvbnMgYXJlIHNldCAoZXZlbiBpZiB5b3UgZG9uJ3Qgc2V0Ci0gICAgICAgYW55KS4gIFlvdSBtYXkgc3RhcnQgZ2V0dGluZyByb3dzIGJlZm9yZQotICAgICAgIHBuZ19wcm9jZXNzX2RhdGEoKSByZXR1cm5zLCBzbyB0aGlzIGlzIHlvdXIKLSAgICAgICBsYXN0IGNoYW5jZSB0byBwcmVwYXJlIGZvciB0aGF0LgotCi0gICAgICAgVGhpcyBpcyB3aGVyZSB5b3UgdHVybiBvbiBpbnRlcmxhY2UgaGFuZGxpbmcsCi0gICAgICAgYXNzdW1pbmcgeW91IGRvbid0IHdhbnQgdG8gZG8gaXQgeW91cnNlbGYuCi0KLSAgICAgICBJZiB5b3UgbmVlZCB0byB5b3UgY2FuIHN0b3AgdGhlIHByb2Nlc3Npbmcgb2YKLSAgICAgICB5b3VyIG9yaWdpbmFsIGlucHV0IGRhdGEgYXQgdGhpcyBwb2ludCBieSBjYWxsaW5nCi0gICAgICAgcG5nX3Byb2Nlc3NfZGF0YV9wYXVzZS4gIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyCi0gICAgICAgb2YgdW5wcm9jZXNzZWQgYnl0ZXMgZnJvbSB0aGUgbGFzdCBwbmdfcHJvY2Vzc19kYXRhCi0gICAgICAgY2FsbCAtIGl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB0aGUgbmV4dCBjYWxsCi0gICAgICAgc2VlcyB0aGVzZSBieXRlcyBhZ2Fpbi4gIElmIHlvdSBkb24ndCB3YW50IHRvIGJvdGhlcgotICAgICAgIHdpdGggdGhpcyB5b3UgY2FuIGdldCBsaWJwbmcgdG8gY2FjaGUgdGhlIHVucmVhZAotICAgICAgIGJ5dGVzIGJ5IHNldHRpbmcgdGhlICdzYXZlJyBwYXJhbWV0ZXIgKHNlZSBwbmcuaCkgYnV0Ci0gICAgICAgdGhlbiBsaWJwbmcgd2lsbCBoYXZlIHRvIGNvcHkgdGhlIGRhdGEgaW50ZXJuYWxseS4KLSAgICAgKi8KLSB9Ci0KLSAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGVhY2ggcm93IG9mIGltYWdlCi0gICAgZGF0YSBpcyBjb21wbGV0ZSAqLwotIHZvaWQKLSByb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIG5ld19yb3csCi0gICAgcG5nX3VpbnRfMzIgcm93X251bSwgaW50IHBhc3MpCi0gewotICAgIC8qIElmIHRoZSBpbWFnZSBpcyBpbnRlcmxhY2VkLCBhbmQgeW91IHR1cm5lZAotICAgICAgIG9uIHRoZSBpbnRlcmxhY2UgaGFuZGxlciwgdGhpcyBmdW5jdGlvbiB3aWxsCi0gICAgICAgYmUgY2FsbGVkIGZvciBldmVyeSByb3cgaW4gZXZlcnkgcGFzcy4gIFNvbWUKLSAgICAgICBvZiB0aGVzZSByb3dzIHdpbGwgbm90IGJlIGNoYW5nZWQgZnJvbSB0aGUKLSAgICAgICBwcmV2aW91cyBwYXNzLiAgV2hlbiB0aGUgcm93IGlzIG5vdCBjaGFuZ2VkLAotICAgICAgIHRoZSBuZXdfcm93IHZhcmlhYmxlIHdpbGwgYmUgTlVMTC4gIFRoZSByb3dzCi0gICAgICAgYW5kIHBhc3NlcyBhcmUgY2FsbGVkIGluIG9yZGVyLCBzbyB5b3UgZG9uJ3QKLSAgICAgICByZWFsbHkgbmVlZCB0aGUgcm93X251bSBhbmQgcGFzcywgYnV0IEknbQotICAgICAgIHN1cHBseWluZyB0aGVtIGJlY2F1c2UgaXQgbWF5IG1ha2UgeW91ciBsaWZlCi0gICAgICAgZWFzaWVyLgotCi0gICAgICAgSWYgeW91IGRpZCBub3QgdHVybiBvbiBpbnRlcmxhY2UgaGFuZGxpbmcgdGhlbgotICAgICAgIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgZm9yIGVhY2ggcm93IG9mIGVhY2gKLSAgICAgICBzdWItaW1hZ2Ugd2hlbiB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZC4gIEluIHRoaXMKLSAgICAgICBjYXNlICdyb3dfbnVtJyBpcyB0aGUgcm93IGluIHRoZSBzdWItaW1hZ2UsIG5vdAotICAgICAgIHRoZSByb3cgaW4gdGhlIG91dHB1dCBpbWFnZSBhcyBpdCBpcyBpbiBhbGwgb3RoZXIKLSAgICAgICBjYXNlcy4KLQotICAgICAgIEZvciB0aGUgbm9uLU5VTEwgcm93cyBvZiBpbnRlcmxhY2VkIGltYWdlcyB3aGVuCi0gICAgICAgeW91IGhhdmUgc3dpdGNoZWQgb24gbGlicG5nIGludGVybGFjZSBoYW5kbGluZywKLSAgICAgICB5b3UgbXVzdCBjYWxsIHBuZ19wcm9ncmVzc2l2ZV9jb21iaW5lX3JvdygpCi0gICAgICAgcGFzc2luZyBpbiB0aGUgcm93IGFuZCB0aGUgb2xkIHJvdy4gIFlvdSBjYW4KLSAgICAgICBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIE5VTEwgcm93cyAoaXQgd2lsbCBqdXN0Ci0gICAgICAgcmV0dXJuKSBhbmQgZm9yIG5vbi1pbnRlcmxhY2VkIGltYWdlcyAoaXQganVzdAotICAgICAgIGRvZXMgdGhlIG1lbWNweSBmb3IgeW91KSBpZiBpdCB3aWxsIG1ha2UgdGhlCi0gICAgICAgY29kZSBlYXNpZXIuICBUaHVzLCB5b3UgY2FuIGp1c3QgZG8gdGhpcyBmb3IKLSAgICAgICBhbGwgY2FzZXMgaWYgeW91IHN3aXRjaCBvbiBpbnRlcmxhY2UgaGFuZGxpbmc7Ci0gICAgICovCi0KLSAgICAgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIG9sZF9yb3csCi0gICAgICAgICAgbmV3X3Jvdyk7Ci0KLSAgICAvKiB3aGVyZSBvbGRfcm93IGlzIHdoYXQgd2FzIGRpc3BsYXllZAotICAgICAgIHByZXZpb3VzbHkgZm9yIHRoZSByb3cuICBOb3RlIHRoYXQgdGhlIGZpcnN0Ci0gICAgICAgcGFzcyAocGFzcyA9PSAwLCByZWFsbHkpIHdpbGwgY29tcGxldGVseSBjb3ZlcgotICAgICAgIHRoZSBvbGQgcm93LCBzbyB0aGUgcm93cyBkbyBub3QgaGF2ZSB0byBiZQotICAgICAgIGluaXRpYWxpemVkLiAgQWZ0ZXIgdGhlIGZpcnN0IHBhc3MgKGFuZCBvbmx5Ci0gICAgICAgZm9yIGludGVybGFjZWQgaW1hZ2VzKSwgeW91IHdpbGwgaGF2ZSB0byBwYXNzCi0gICAgICAgdGhlIGN1cnJlbnQgcm93LCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgY29tYmluZQotICAgICAgIHRoZSBvbGQgcm93IGFuZCB0aGUgbmV3IHJvdy4KLQotICAgICAgIFlvdSBjYW4gYWxzbyBjYWxsIHBuZ19wcm9jZXNzX2RhdGFfcGF1c2UgaW4gdGhpcwotICAgICAgIGNhbGxiYWNrIC0gc2VlIGFib3ZlLgotICAgICovCi0gfQotCi0gdm9pZAotIGVuZF9jYWxsYmFjayhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKLSB7Ci0gICAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHdob2xlIGltYWdlCi0gICAgICAgaGFzIGJlZW4gcmVhZCwgaW5jbHVkaW5nIGFueSBjaHVua3MgYWZ0ZXIgdGhlCi0gICAgICAgaW1hZ2UgKHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIElFTkQpLiAgWW91Ci0gICAgICAgd2lsbCB1c3VhbGx5IGhhdmUgdGhlIHNhbWUgaW5mbyBjaHVuayBhcyB5b3UKLSAgICAgICBoYWQgaW4gdGhlIGhlYWRlciwgYWx0aG91Z2ggc29tZSBkYXRhIG1heSBoYXZlCi0gICAgICAgYmVlbiBhZGRlZCB0byB0aGUgY29tbWVudHMgYW5kIHRpbWUgZmllbGRzLgotCi0gICAgICAgTW9zdCBwZW9wbGUgd29uJ3QgZG8gbXVjaCBoZXJlLCBwZXJoYXBzIHNldHRpbmcKLSAgICAgICBhIGZsYWcgdGhhdCBtYXJrcyB0aGUgaW1hZ2UgYXMgZmluaXNoZWQuCi0gICAgICovCi0gfQotCi0KLQotLlNIIElWLiBXcml0aW5nCi0KLU11Y2ggb2YgdGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gcmVhZGluZy4gIEhvd2V2ZXIsIGV2ZXJ5dGhpbmcgb2YKLWltcG9ydGFuY2UgaXMgcmVwZWF0ZWQgaGVyZSwgc28geW91IHdvbid0IGhhdmUgdG8gY29uc3RhbnRseSBsb29rCi1iYWNrIHVwIGluIHRoZSByZWFkaW5nIHNlY3Rpb24gdG8gdW5kZXJzdGFuZCB3cml0aW5nLgotCi0uU1MgU2V0dXAKLQotWW91IHdpbGwgd2FudCB0byBkbyB0aGUgSS9PIGluaXRpYWxpemF0aW9uIGJlZm9yZSB5b3UgZ2V0IGludG8gbGlicG5nLAotc28gaWYgaXQgZG9lc24ndCB3b3JrLCB5b3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byB1bmRvLiBJZiB5b3UgYXJlIG5vdAotdXNpbmcgdGhlIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHdpdGgKLWN1c3RvbSB3cml0aW5nIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZGlzY3Vzc2lvbiB1bmRlciBDdXN0b21pemluZyBsaWJwbmcuCi0KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7Ci0KLSAgICBpZiAoIWZwKQotICAgICAgIHJldHVybiAoRVJST1IpOwotCi1OZXh0LCBwbmdfc3RydWN0IGFuZCBwbmdfaW5mbyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCi1BcyB0aGVzZSBjYW4gYmUgYm90aCByZWxhdGl2ZWx5IGxhcmdlLCB5b3UgbWF5IG5vdCB3YW50IHRvIHN0b3JlIHRoZXNlCi1vbiB0aGUgc3RhY2ssIHVubGVzcyB5b3UgaGF2ZSBzdGFjayBzcGFjZSB0byBzcGFyZS4gIE9mIGNvdXJzZSwgeW91Ci13aWxsIHdhbnQgdG8gY2hlY2sgaWYgdGhleSByZXR1cm4gTlVMTC4gIElmIHlvdSBhcmUgYWxzbyByZWFkaW5nLAoteW91IHdvbid0IHdhbnQgdG8gbmFtZSB5b3VyIHJlYWQgc3RydWN0dXJlIGFuZCB5b3VyIHdyaXRlIHN0cnVjdHVyZQotYm90aCAicG5nX3B0ciI7IHlvdSBjYW4gY2FsbCB0aGVtIGFueXRoaW5nIHlvdSBsaWtlLCBzdWNoIGFzCi0icmVhZF9wdHIiIGFuZCAid3JpdGVfcHRyIi4gIExvb2sgYXQgcG5ndGVzdC5jLCBmb3IgZXhhbXBsZS4KLQotICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdAotICAgICAgIChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIChwbmdfdm9pZHApdXNlcl9lcnJvcl9wdHIsCi0gICAgICAgIHVzZXJfZXJyb3JfZm4sIHVzZXJfd2FybmluZ19mbik7Ci0KLSAgICBpZiAoIXBuZ19wdHIpCi0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0KLSAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOwotICAgIGlmICghaW5mb19wdHIpCi0gICAgewotICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwKLSAgICAgICAgICAgKHBuZ19pbmZvcHApTlVMTCk7Ci0gICAgICAgcmV0dXJuIChFUlJPUik7Ci0gICAgfQotCi1JZiB5b3Ugd2FudCB0byB1c2UgeW91ciBvd24gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMsCi1kZWZpbmUgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRCBhbmQgdXNlCi1wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCkgaW5zdGVhZCBvZiBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCgpOgotCi0gICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIKLSAgICAgICAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAocG5nX3ZvaWRwKXVzZXJfZXJyb3JfcHRyLAotICAgICAgICB1c2VyX2Vycm9yX2ZuLCB1c2VyX3dhcm5pbmdfZm4sIChwbmdfdm9pZHApCi0gICAgICAgIHVzZXJfbWVtX3B0ciwgdXNlcl9tYWxsb2NfZm4sIHVzZXJfZnJlZV9mbik7Ci0KLUFmdGVyIHlvdSBoYXZlIHRoZXNlIHN0cnVjdHVyZXMsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHVwIHRoZQotZXJyb3IgaGFuZGxpbmcuICBXaGVuIGxpYnBuZyBlbmNvdW50ZXJzIGFuIGVycm9yLCBpdCBleHBlY3RzIHRvCi1sb25nam1wKCkgYmFjayB0byB5b3VyIHJvdXRpbmUuICBUaGVyZWZvcmUsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbAotc2V0am1wKCkgYW5kIHBhc3MgdGhlIHBuZ19qbXBidWYocG5nX3B0cikuICBJZiB5b3UKLXdyaXRlIHRoZSBmaWxlIGZyb20gZGlmZmVyZW50IHJvdXRpbmVzLCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZQotdGhlIHBuZ19qbXBidWYocG5nX3B0cikgZXZlcnkgdGltZSB5b3UgZW50ZXIgYSBuZXcgcm91dGluZSB0aGF0IHdpbGwKLWNhbGwgYSBwbmdfKigpIGZ1bmN0aW9uLiAgU2VlIHlvdXIgZG9jdW1lbnRhdGlvbiBvZiBzZXRqbXAvbG9uZ2ptcAotZm9yIHlvdXIgY29tcGlsZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2V0am1wL2xvbmdqbXAuICBTZWUKLXRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBlcnJvciBoYW5kbGluZyBpbiB0aGUgQ3VzdG9taXppbmcgTGlicG5nCi1zZWN0aW9uIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBsaWJwbmcgZXJyb3IgaGFuZGxpbmcuCi0KLSAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nX3B0cikpKQotICAgIHsKLSAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0gICAgICAgZmNsb3NlKGZwKTsKLSAgICAgICByZXR1cm4gKEVSUk9SKTsKLSAgICB9Ci0gICAgLi4uCi0gICAgcmV0dXJuOwotCi1JZiB5b3Ugd291bGQgcmF0aGVyIGF2b2lkIHRoZSBjb21wbGV4aXR5IG9mIHNldGptcC9sb25nam1wIGlzc3VlcywKLXlvdSBjYW4gY29tcGlsZSBsaWJwbmcgd2l0aCBQTkdfTk9fU0VUSk1QLCBpbiB3aGljaCBjYXNlCi1lcnJvcnMgd2lsbCByZXN1bHQgaW4gYSBjYWxsIHRvIFBOR19BQk9SVCgpIHdoaWNoIGRlZmF1bHRzIHRvIGFib3J0KCkuCi0KLVlvdSBjYW4gI2RlZmluZSBQTkdfQUJPUlQoKSB0byBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBzb21ldGhpbmcKLW1vcmUgdXNlZnVsIHRoYW4gYWJvcnQoKSwgYXMgbG9uZyBhcyB5b3VyIGZ1bmN0aW9uIGRvZXMgbm90Ci1yZXR1cm4uCi0KLUNoZWNraW5nIGZvciBpbnZhbGlkIHBhbGV0dGUgaW5kZXggb24gd3JpdGUgd2FzIGFkZGVkIGF0IGxpYnBuZwotMS41LjEwLiAgSWYgYSBwaXhlbCBjb250YWlucyBhbiBpbnZhbGlkIChvdXQtb2YtcmFuZ2UpIGluZGV4IGxpYnBuZyBpc3N1ZXMKLWEgYmVuaWduIGVycm9yLiAgVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGlzIGNvbmRpdGlvbiBpcyBhbgotZXJyb3IgYWNjb3JkaW5nIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgQ2xhdXNlIDExLjMuMiwgYnV0IHRoZSBlcnJvciBjYW4KLWJlIGlnbm9yZWQgaW4gZWFjaCBwbmdfcHRyIHdpdGgKLQotICAgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChwbmdfcHRyLCAwKTsKLQotSWYgdGhlIGVycm9yIGlzIGlnbm9yZWQsIG9yIGlmIHBuZ19iZW5pZ25fZXJyb3IoKSB0cmVhdHMgaXQgYXMgYSB3YXJuaW5nLAotYW55IGludmFsaWQgcGl4ZWxzIGFyZSB3cml0dGVuIGFzLWlzIGJ5IHRoZSBlbmNvZGVyLCByZXN1bHRpbmcgaW4gYW4KLWludmFsaWQgUE5HIGRhdGFzdHJlYW0gYXMgb3V0cHV0LiAgSW4gdGhpcyBjYXNlIHRoZSBhcHBsaWNhdGlvbiBpcwotcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHBpeGVsIGluZGV4ZXMgYXJlIGluIHJhbmdlIHdoZW4gaXQgd3JpdGVzCi1hIFBMVEUgY2h1bmsgd2l0aCBmZXdlciBlbnRyaWVzIHRoYW4gdGhlIGJpdCBkZXB0aCB3b3VsZCBhbGxvdy4KLQotTm93IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgb3V0cHV0IGNvZGUuICBUaGUgZGVmYXVsdCBmb3IgbGlicG5nIGlzIHRvCi11c2UgdGhlIEMgZnVuY3Rpb24gZndyaXRlKCkuICBJZiB5b3UgdXNlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcGFzcyBhCi12YWxpZCBGSUxFICogaW4gdGhlIGZ1bmN0aW9uIHBuZ19pbml0X2lvKCkuICBCZSBzdXJlIHRoYXQgdGhlIGZpbGUgaXMKLW9wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIEFnYWluLCBpZiB5b3Ugd2lzaCB0byBoYW5kbGUgd3JpdGluZyBkYXRhIGluCi1hbm90aGVyIHdheSwgc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGxpYnBuZyBJL08gaGFuZGxpbmcgaW4gdGhlIEN1c3RvbWl6aW5nCi1MaWJwbmcgc2VjdGlvbiBiZWxvdy4KLQotICAgIHBuZ19pbml0X2lvKHBuZ19wdHIsIGZwKTsKLQotSWYgeW91IGFyZSBlbWJlZGRpbmcgeW91ciBQTkcgaW50byBhIGRhdGFzdHJlYW0gc3VjaCBhcyBNTkcsIGFuZCBkb24ndAotd2FudCBsaWJwbmcgdG8gd3JpdGUgdGhlIDgtYnl0ZSBzaWduYXR1cmUsIG9yIGlmIHlvdSBoYXZlIGFscmVhZHkKLXdyaXR0ZW4gdGhlIHNpZ25hdHVyZSBpbiB5b3VyIGFwcGxpY2F0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfc2lnX2J5dGVzKHBuZ19wdHIsIDgpOwotCi10byBpbmZvcm0gbGlicG5nIHRoYXQgaXQgc2hvdWxkIG5vdCB3cml0ZSBhIHNpZ25hdHVyZS4KLQotLlNTIFdyaXRlIGNhbGxiYWNrcwotCi1BdCB0aGlzIHBvaW50LCB5b3UgY2FuIHNldCB1cCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZQotY2FsbGVkIGFmdGVyIGVhY2ggcm93IGhhcyBiZWVuIHdyaXR0ZW4sIHdoaWNoIHlvdSBjYW4gdXNlIHRvIGNvbnRyb2wKLWEgcHJvZ3Jlc3MgbWV0ZXIgb3IgdGhlIGxpa2UuICBJdCdzIGRlbW9uc3RyYXRlZCBpbiBwbmd0ZXN0LmMuCi1Zb3UgbXVzdCBzdXBwbHkgYSBmdW5jdGlvbgotCi0gICAgdm9pZCB3cml0ZV9yb3dfY2FsbGJhY2socG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX3VpbnRfMzIgcm93LAotICAgICAgIGludCBwYXNzKTsKLSAgICB7Ci0gICAgICAvKiBwdXQgeW91ciBjb2RlIGhlcmUgKi8KLSAgICB9Ci0KLShZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIHRoYXQgeW91IGxpa2UgaW5zdGVhZCBvZiAid3JpdGVfcm93X2NhbGxiYWNrIikKLQotVG8gaW5mb3JtIGxpYnBuZyBhYm91dCB5b3VyIGZ1bmN0aW9uLCB1c2UKLQotICAgIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuKHBuZ19wdHIsIHdyaXRlX3Jvd19jYWxsYmFjayk7Ci0KLVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdGhlIHJvdyBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlbHkgcHJvY2Vzc2VkIGFuZAotaXQgaGFzIGFsc28gYmVlbiB3cml0dGVuIG91dC4gIFRoZSAncm93JyBhbmQgJ3Bhc3MnIHJlZmVyIHRvIHRoZSBuZXh0IHJvdyB0byBiZQotaGFuZGxlZC4gIEZvciB0aGUKLW5vbi1pbnRlcmxhY2VkIGNhc2UgdGhlIHJvdyB0aGF0IHdhcyBqdXN0IGhhbmRsZWQgaXMgc2ltcGx5IG9uZSBsZXNzIHRoYW4gdGhlCi1wYXNzZWQgaW4gcm93IG51bWJlciwgYW5kIHBhc3Mgd2lsbCBhbHdheXMgYmUgMC4gIEZvciB0aGUgaW50ZXJsYWNlZCBjYXNlIHRoZQotc2FtZSBhcHBsaWVzIHVubGVzcyB0aGUgcm93IHZhbHVlIGlzIDAsIGluIHdoaWNoIGNhc2UgdGhlIHJvdyBqdXN0IGhhbmRsZWQgd2FzCi10aGUgbGFzdCBvbmUgZnJvbSBvbmUgb2YgdGhlIHByZWNlZGluZyBwYXNzZXMuICBCZWNhdXNlIGludGVybGFjaW5nIG1heSBza2lwIGEKLXBhc3MgeW91IGNhbm5vdCBiZSBzdXJlIHRoYXQgdGhlIHByZWNlZGluZyBwYXNzIGlzIGp1c3QgJ3Bhc3NcLTEnLCBpZiB5b3UgcmVhbGx5Ci1uZWVkIHRvIGtub3cgd2hhdCB0aGUgbGFzdCBwYXNzIGlzIHJlY29yZCAocm93LHBhc3MpIGZyb20gdGhlIGNhbGxiYWNrIGFuZCB1c2UKLXRoZSBsYXN0IHJlY29yZGVkIHZhbHVlIGVhY2ggdGltZS4KLQotQXMgd2l0aCB0aGUgdXNlciB0cmFuc2Zvcm0geW91IGNhbiBmaW5kIHRoZSBvdXRwdXQgcm93IHVzaW5nIHRoZQotUE5HX1JPV19GUk9NX1BBU1NfUk9XIG1hY3JvLgotCi1Zb3Ugbm93IGhhdmUgdGhlIG9wdGlvbiBvZiBtb2RpZnlpbmcgaG93IHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHdpbGwKLXJ1bi4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBtYXkgYmUgdXNlZnVsCi1pbiBzb21lIGNhc2VzLCBsaWtlIGlmIHlvdSBuZWVkIHRvIHdyaXRlIFBORyBmaWxlcyBleHRyZW1lbHkgZmFzdCBhbmQKLWFyZSB3aWxsaW5nIHRvIGdpdmUgdXAgc29tZSBjb21wcmVzc2lvbiwgb3IgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZQotbWF4aW11bSBwb3NzaWJsZSBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBzbG93ZXIgd3JpdGluZy4gIElmIHlvdQotaGF2ZSBubyBzcGVjaWFsIG5lZWRzIGluIHRoaXMgYXJlYSwgbGV0IHRoZSBsaWJyYXJ5IGRvIHdoYXQgaXQgd2FudHMgYnkKLW5vdCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYXQgYWxsLCBhcyBpdCBoYXMgYmVlbiB0dW5lZCB0byBkZWxpdmVyIGEgZ29vZAotc3BlZWQvY29tcHJlc3Npb24gcmF0aW8uIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHBuZ19zZXRfZmlsdGVyKCkgaXMKLXRoZSBmaWx0ZXIgbWV0aG9kLCBmb3Igd2hpY2ggdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSAwIChhcyBvZiB0aGUKLUp1bHkgMTk5OSBQTkcgc3BlY2lmaWNhdGlvbiwgdmVyc2lvbiAxLjIpIG9yIDY0IChpZiB5b3UgYXJlIHdyaXRpbmcKLWEgUE5HIGRhdGFzdHJlYW0gdGhhdCBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORyBkYXRhc3RyZWFtKS4gIFRoZSB0aGlyZAotcGFyYW1ldGVyIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGljaCBmaWx0ZXIgdHlwZShzKSBhcmUgdG8gYmUgdGVzdGVkCi1mb3IgZWFjaCBzY2FubGluZS4gIFNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIHNwZWNpZmljCi1maWx0ZXIgdHlwZXMuCi0KLQotICAgIC8qIHR1cm4gb24gb3Igb2ZmIGZpbHRlcmluZywgYW5kL29yIGNob29zZQotICAgICAgIHNwZWNpZmljIGZpbHRlcnMuICBZb3UgY2FuIHVzZSBlaXRoZXIgYSBzaW5nbGUKLSAgICAgICBQTkdfRklMVEVSX1ZBTFVFX05BTUUgb3IgdGhlIGJpdHdpc2UgT1Igb2Ygb25lCi0gICAgICAgb3IgbW9yZSBQTkdfRklMVEVSX05BTUUgbWFza3MuCi0gICAgICovCi0gICAgcG5nX3NldF9maWx0ZXIocG5nX3B0ciwgMCwKLSAgICAgICBQTkdfRklMVEVSX05PTkUgIHwgUE5HX0ZJTFRFUl9WQUxVRV9OT05FIHwKLSAgICAgICBQTkdfRklMVEVSX1NVQiAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9TVUIgIHwKLSAgICAgICBQTkdfRklMVEVSX1VQICAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9VUCAgIHwKLSAgICAgICBQTkdfRklMVEVSX0FWRyAgIHwgUE5HX0ZJTFRFUl9WQUxVRV9BVkcgIHwKLSAgICAgICBQTkdfRklMVEVSX1BBRVRIIHwgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSHwKLSAgICAgICBQTkdfQUxMX0ZJTFRFUlMgIHwgUE5HX0ZBU1RfRklMVEVSUyk7Ci0KLUlmIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHN0YXJ0IGFuZCBzdG9wIHVzaW5nIHBhcnRpY3VsYXIgZmlsdGVycyBkdXJpbmcKLWNvbXByZXNzaW9uLCBpdCBzaG91bGQgc3RhcnQgb3V0IHdpdGggYWxsIG9mIHRoZSBmaWx0ZXJzICh0byBlbnN1cmUgdGhhdAotdGhlIHByZXZpb3VzIHJvdyBvZiBwaXhlbHMgd2lsbCBiZSBzdG9yZWQgaW4gY2FzZSBpdCdzIG5lZWRlZCBsYXRlciksCi1hbmQgdGhlbiBhZGQgYW5kIHJlbW92ZSB0aGVtIGFmdGVyIHRoZSBzdGFydCBvZiBjb21wcmVzc2lvbi4KLQotSWYgeW91IGFyZSB3cml0aW5nIGEgUE5HIGRhdGFzdHJlYW0gdGhhdCBpcyB0byBiZSBlbWJlZGRlZCBpbiBhIE1ORwotZGF0YXN0cmVhbSwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgY2FuIGJlIGVpdGhlciAwIG9yIDY0LgotCi1UaGUgcG5nX3NldF9jb21wcmVzc2lvbl8qKCkgZnVuY3Rpb25zIGludGVyZmFjZSB0byB0aGUgemxpYiBjb21wcmVzc2lvbgotbGlicmFyeSwgYW5kIHNob3VsZCBtb3N0bHkgYmUgaWdub3JlZCB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZQotZG9pbmcuICBUaGUgb25seSBnZW5lcmFsbHkgdXNlZnVsIGNhbGwgaXMgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCgpCi13aGljaCBjaGFuZ2VzIGhvdyBtdWNoIHRpbWUgemxpYiBzcGVuZHMgb24gdHJ5aW5nIHRvIGNvbXByZXNzIHRoZSBpbWFnZQotZGF0YS4gIFNlZSB0aGUgQ29tcHJlc3Npb24gTGlicmFyeSAoemxpYi5oIGFuZCBhbGdvcml0aG0udHh0LCBkaXN0cmlidXRlZAotd2l0aCB6bGliKSBmb3IgZGV0YWlscyBvbiB0aGUgY29tcHJlc3Npb24gbGV2ZWxzLgotCi0gICAgI2luY2x1ZGUgemxpYi5oCi0KLSAgICAvKiBTZXQgdGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsKHBuZ19wdHIsCi0gICAgICAgIFpfQkVTVF9DT01QUkVTU0lPTik7Ci0KLSAgICAvKiBTZXQgb3RoZXIgemxpYiBwYXJhbWV0ZXJzIGZvciBjb21wcmVzc2luZyBJREFUICovCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwocG5nX3B0ciwgOCk7Ci0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwgMTUpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWV0aG9kKHBuZ19wdHIsIDgpOwotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUocG5nX3B0ciwgODE5MikKLQotICAgIC8qIFNldCB6bGliIHBhcmFtZXRlcnMgZm9yIHRleHQgY29tcHJlc3Npb24KLSAgICAgKiBJZiB5b3UgZG9uJ3QgY2FsbCB0aGVzZSwgdGhlIHBhcmFtZXRlcnMKLSAgICAgKiBmYWxsIGJhY2sgb24gdGhvc2UgZGVmaW5lZCBmb3IgSURBVCBjaHVua3MKLSAgICAgKi8KLSAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIDgpOwotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl93aW5kb3dfYml0cyhwbmdfcHRyLCAxNSk7Ci0gICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCA4KTsKLQotLlNTIFNldHRpbmcgdGhlIGNvbnRlbnRzIG9mIGluZm8gZm9yIG91dHB1dAotCi1Zb3Ugbm93IG5lZWQgdG8gZmlsbCBpbiB0aGUgcG5nX2luZm8gc3RydWN0dXJlIHdpdGggYWxsIHRoZSBkYXRhIHlvdQotd2lzaCB0byB3cml0ZSBiZWZvcmUgdGhlIGFjdHVhbCBpbWFnZS4gIE5vdGUgdGhhdCB0aGUgb25seSB0aGluZyB5b3UKLWFyZSBhbGxvd2VkIHRvIHdyaXRlIGFmdGVyIHRoZSBpbWFnZSBpcyB0aGUgdGV4dCBjaHVua3MgYW5kIHRoZSB0aW1lCi1jaHVuayAoYXMgb2YgUE5HIFNwZWNpZmljYXRpb24gMS4yLCBhbnl3YXkpLiAgU2VlIHBuZ193cml0ZV9lbmQoKSBhbmQKLXRoZSBsYXRlc3QgUE5HIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhhdC4gIElmIHlvdQotd2lzaCB0byB3cml0ZSB0aGVtIGJlZm9yZSB0aGUgaW1hZ2UsIGZpbGwgdGhlbSBpbiBub3csIGFuZCBmbGFnIHRoYXQKLWRhdGEgYXMgYmVpbmcgdmFsaWQuICBJZiB5b3Ugd2FudCB0byB3YWl0IHVudGlsIGFmdGVyIHRoZSBkYXRhLCBkb24ndAotZmlsbCB0aGVtIHVudGlsIHBuZ193cml0ZV9lbmQoKS4gIEZvciBhbGwgdGhlIGZpZWxkcyBpbiBwbmdfaW5mbyBhbmQKLXRoZWlyIGRhdGEgdHlwZXMsIHNlZSBwbmcuaC4gIEZvciBleHBsYW5hdGlvbnMgb2Ygd2hhdCB0aGUgZmllbGRzCi1jb250YWluLCBzZWUgdGhlIFBORyBzcGVjaWZpY2F0aW9uLgotCi1Tb21lIG9mIHRoZSBtb3JlIGltcG9ydGFudCBwYXJ0cyBvZiB0aGUgcG5nX2luZm8gYXJlOgotCi0gICAgcG5nX3NldF9JSERSKHBuZ19wdHIsIGluZm9fcHRyLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgIGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGUsCi0gICAgICAgY29tcHJlc3Npb25fdHlwZSwgZmlsdGVyX21ldGhvZCkKLQotICAgIHdpZHRoICAgICAgICAgIC0gaG9sZHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgaW4gcGl4ZWxzICh1cCB0byAyXjMxKS4KLQotICAgIGhlaWdodCAgICAgICAgIC0gaG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgIGluIHBpeGVscyAodXAgdG8gMl4zMSkuCi0KLSAgICBiaXRfZGVwdGggICAgICAtIGhvbGRzIHRoZSBiaXQgZGVwdGggb2Ygb25lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgY2hhbm5lbHMuCi0gICAgICAgICAgICAgICAgICAgICAodmFsaWQgdmFsdWVzIGFyZSAxLCAyLCA0LCA4LCAxNgotICAgICAgICAgICAgICAgICAgICAgYW5kIGRlcGVuZCBhbHNvIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgY29sb3JfdHlwZS4gIFNlZSBhbHNvIHNpZ25pZmljYW50Ci0gICAgICAgICAgICAgICAgICAgICBiaXRzIChzQklUKSBiZWxvdykuCi0KLSAgICBjb2xvcl90eXBlICAgICAtIGRlc2NyaWJlcyB3aGljaCBjb2xvci9hbHBoYQotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9HUkFZCi0gICAgICAgICAgICAgICAgICAgICAgICAoYml0IGRlcHRocyAxLCAyLCA0LCA4LCAxNikKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgZGVwdGhzIDgsIDE2KQotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX1RZUEVfUEFMRVRURQotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCBkZXB0aHMgMSwgMiwgNCwgOCkKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQgotICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9kZXB0aHMgOCwgMTYpCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRfZGVwdGhzIDgsIDE2KQotCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19QQUxFVFRFCi0gICAgICAgICAgICAgICAgICAgICBQTkdfQ09MT1JfTUFTS19DT0xPUgotICAgICAgICAgICAgICAgICAgICAgUE5HX0NPTE9SX01BU0tfQUxQSEEKLQotICAgIGludGVybGFjZV90eXBlIC0gUE5HX0lOVEVSTEFDRV9OT05FIG9yCi0gICAgICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX0FEQU03Ci0KLSAgICBjb21wcmVzc2lvbl90eXBlIC0gKG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQpCi0KLSAgICBmaWx0ZXJfbWV0aG9kICAtIChtdXN0IGJlIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUCi0gICAgICAgICAgICAgICAgICAgICBvciwgaWYgeW91IGFyZSB3cml0aW5nIGEgUE5HIHRvCi0gICAgICAgICAgICAgICAgICAgICBiZSBlbWJlZGRlZCBpbiBhIE1ORyBkYXRhc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgY2FuIGFsc28gYmUKLSAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORykKLQotSWYgeW91IGNhbGwgcG5nX3NldF9JSERSKCksIHRoZSBjYWxsIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgb2YgdGhlCi1vdGhlciBwbmdfc2V0XyooKSBmdW5jdGlvbnMsIGJlY2F1c2UgdGhleSBtaWdodCByZXF1aXJlIGFjY2VzcyB0byBzb21lIG9mCi10aGUgSUhEUiBzZXR0aW5ncy4gIFRoZSByZW1haW5pbmcgcG5nX3NldF8qKCkgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQKLWluIGFueSBvcmRlci4KLQotSWYgeW91IHdpc2gsIHlvdSBjYW4gcmVzZXQgdGhlIGNvbXByZXNzaW9uX3R5cGUsIGludGVybGFjZV90eXBlLCBvcgotZmlsdGVyX21ldGhvZCBsYXRlciBieSBjYWxsaW5nIHBuZ19zZXRfSUhEUigpIGFnYWluOyBpZiB5b3UgZG8gdGhpcywgdGhlCi13aWR0aCwgaGVpZ2h0LCBiaXRfZGVwdGgsIGFuZCBjb2xvcl90eXBlIG11c3QgYmUgdGhlIHNhbWUgaW4gZWFjaCBjYWxsLgotCi0gICAgcG5nX3NldF9QTFRFKHBuZ19wdHIsIGluZm9fcHRyLCBwYWxldHRlLAotICAgICAgIG51bV9wYWxldHRlKTsKLQotICAgIHBhbGV0dGUgICAgICAgIC0gdGhlIHBhbGV0dGUgZm9yIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAoYXJyYXkgb2YgcG5nX2NvbG9yKQotICAgIG51bV9wYWxldHRlICAgIC0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBhbGV0dGUKLQotCi0gICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBmaWxlX2dhbW1hKTsKLSAgICBwbmdfc2V0X2dBTUFfZml4ZWQocG5nX3B0ciwgaW5mb19wdHIsIGludF9maWxlX2dhbW1hKTsKLQotICAgIGZpbGVfZ2FtbWEgICAgIC0gdGhlIGdhbW1hIGF0IHdoaWNoIHRoZSBpbWFnZSB3YXMKLSAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgKFBOR19JTkZPX2dBTUEpCi0KLSAgICBpbnRfZmlsZV9nYW1tYSAtIDEwMCwwMDAgdGltZXMgdGhlIGdhbW1hIGF0IHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICB0aGUgaW1hZ2Ugd2FzIGNyZWF0ZWQKLQotICAgIHBuZ19zZXRfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwgIHdoaXRlX3gsIHdoaXRlX3ksIHJlZF94LCByZWRfeSwKLSAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3gsIGdyZWVuX3ksIGJsdWVfeCwgYmx1ZV95KQotICAgIHBuZ19zZXRfY0hSTV9YWVoocG5nX3B0ciwgaW5mb19wdHIsIHJlZF9YLCByZWRfWSwgcmVkX1osIGdyZWVuX1gsCi0gICAgICAgICAgICAgICAgICAgICBncmVlbl9ZLCBncmVlbl9aLCBibHVlX1gsIGJsdWVfWSwgYmx1ZV9aKQotICAgIHBuZ19zZXRfY0hSTV9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgaW50X3doaXRlX3gsIGludF93aGl0ZV95LAotICAgICAgICAgICAgICAgICAgICAgaW50X3JlZF94LCBpbnRfcmVkX3ksIGludF9ncmVlbl94LCBpbnRfZ3JlZW5feSwKLSAgICAgICAgICAgICAgICAgICAgIGludF9ibHVlX3gsIGludF9ibHVlX3kpCi0gICAgcG5nX3NldF9jSFJNX1hZWl9maXhlZChwbmdfcHRyLCBpbmZvX3B0ciwgaW50X3JlZF9YLCBpbnRfcmVkX1ksCi0gICAgICAgICAgICAgICAgICAgICBpbnRfcmVkX1osIGludF9ncmVlbl9YLCBpbnRfZ3JlZW5fWSwgaW50X2dyZWVuX1osCi0gICAgICAgICAgICAgICAgICAgICBpbnRfYmx1ZV9YLCBpbnRfYmx1ZV9ZLCBpbnRfYmx1ZV9aKQotCi0gICAge3doaXRlLHJlZCxncmVlbixibHVlfV97eCx5fQotICAgICAgICAgICAgICAgICAgICAgQSBjb2xvciBzcGFjZSBlbmNvZGluZyBzcGVjaWZpZWQgdXNpbmcgdGhlIGNocm9tYXRpY2l0aWVzCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZW5kIHBvaW50cyBhbmQgdGhlIHdoaXRlIHBvaW50LgotCi0gICAge3JlZCxncmVlbixibHVlfV97WCxZLFp9Ci0gICAgICAgICAgICAgICAgICAgICBBIGNvbG9yIHNwYWNlIGVuY29kaW5nIHNwZWNpZmllZCB1c2luZyB0aGUgZW5jb2RpbmcgZW5kCi0gICAgICAgICAgICAgICAgICAgICBwb2ludHMgLSB0aGUgQ0lFIHRyaXN0aW11bHVzIHNwZWNpZmljYXRpb24gb2YgdGhlIGludGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICBjb2xvciBvZiB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBjaGFubmVscyBpbiB0aGUgUE5HIFJHQgotICAgICAgICAgICAgICAgICAgICAgZGF0YS4gIFRoZSB3aGl0ZSBwb2ludCBpcyBzaW1wbHkgdGhlIHN1bSBvZiB0aGUgdGhyZWUgZW5kCi0gICAgICAgICAgICAgICAgICAgICBwb2ludHMuCi0KLSAgICBwbmdfc2V0X3NSR0IocG5nX3B0ciwgaW5mb19wdHIsIHNyZ2JfaW50ZW50KTsKLQotICAgIHNyZ2JfaW50ZW50ICAgIC0gdGhlIHJlbmRlcmluZyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT19zUkdCKSBUaGUgcHJlc2VuY2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBzUkdCIGNodW5rIG1lYW5zIHRoYXQgdGhlIHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGluIHRoZSBzUkdCIGNvbG9yIHNwYWNlLgotICAgICAgICAgICAgICAgICAgICAgVGhpcyBjaHVuayBhbHNvIGltcGxpZXMgc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBvZiBnQU1BIGFuZCBjSFJNLiAgUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICBpbnRlbnQgaXMgdGhlIENTUy0xIHByb3BlcnR5IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIEludGVybmF0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yIENvbnNvcnRpdW0KLSAgICAgICAgICAgICAgICAgICAgIChodHRwOi8vd3d3LmNvbG9yLm9yZykuCi0gICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgb25lIG9mCi0gICAgICAgICAgICAgICAgICAgICBQTkdfc1JHQl9JTlRFTlRfU0FUVVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgIFBOR19zUkdCX0lOVEVOVF9QRVJDRVBUVUFMLAotICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX0FCU09MVVRFLCBvcgotICAgICAgICAgICAgICAgICAgICAgUE5HX3NSR0JfSU5URU5UX1JFTEFUSVZFLgotCi0KLSAgICBwbmdfc2V0X3NSR0JfZ0FNQV9hbmRfY0hSTShwbmdfcHRyLCBpbmZvX3B0ciwKLSAgICAgICBzcmdiX2ludGVudCk7Ci0KLSAgICBzcmdiX2ludGVudCAgICAtIHRoZSByZW5kZXJpbmcgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc1JHQikgVGhlIHByZXNlbmNlIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgc1JHQiBjaHVuayBtZWFucyB0aGF0IHRoZSBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBpbiB0aGUgc1JHQiBjb2xvciBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBjYXVzZXMgZ0FNQSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIGNIUk0gY2h1bmtzIHdpdGggdGhlIHNwZWNpZmljIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgdGhhdCBhcmUgY29uc2lzdGVudCB3aXRoIHNSR0IgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4uCi0KLSAgICBwbmdfc2V0X2lDQ1AocG5nX3B0ciwgaW5mb19wdHIsIG5hbWUsIGNvbXByZXNzaW9uX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHByb2ZsZW4pOwotCi0gICAgbmFtZSAgICAgICAgICAgICAtIFRoZSBwcm9maWxlIG5hbWUuCi0KLSAgICBjb21wcmVzc2lvbl90eXBlIC0gVGhlIGNvbXByZXNzaW9uIHR5cGU7IGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFIGZvciBQTkcgMS4wLgotICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGdpdmUgTlVMTCB0byB0aGlzIGFyZ3VtZW50IHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpdC4KLQotICAgIHByb2ZpbGUgICAgICAgICAgLSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gY29sb3IKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBkYXRhLiBNYXkgY29udGFpbiBOVUxzLgotCi0gICAgcHJvZmxlbiAgICAgICAgICAtIGxlbmd0aCBvZiBwcm9maWxlIGRhdGEgaW4gYnl0ZXMuCi0KLSAgICBwbmdfc2V0X3NCSVQocG5nX3B0ciwgaW5mb19wdHIsIHNpZ19iaXQpOwotCi0gICAgc2lnX2JpdCAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAoUE5HX0lORk9fc0JJVCkgZWFjaCBvZiB0aGUgZ3JheSwgcmVkLAotICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sIGFuZCBibHVlIGNoYW5uZWxzLCB3aGljaGV2ZXIgYXJlCi0gICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIChwbmdfY29sb3JfMTYpCi0KLSAgICBwbmdfc2V0X3RSTlMocG5nX3B0ciwgaW5mb19wdHIsIHRyYW5zX2FscGhhLAotICAgICAgIG51bV90cmFucywgdHJhbnNfY29sb3IpOwotCi0gICAgdHJhbnNfYWxwaGEgICAgLSBhcnJheSBvZiBhbHBoYSAodHJhbnNwYXJlbmN5KQotICAgICAgICAgICAgICAgICAgICAgZW50cmllcyBmb3IgcGFsZXR0ZSAoUE5HX0lORk9fdFJOUykKLQotICAgIG51bV90cmFucyAgICAgIC0gbnVtYmVyIG9mIHRyYW5zcGFyZW50IGVudHJpZXMKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfSU5GT190Uk5TKQotCi0gICAgdHJhbnNfY29sb3IgICAgLSBncmF5bGV2ZWwgb3IgY29sb3Igc2FtcGxlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgKGluIG9yZGVyIHJlZCwgZ3JlZW4sIGJsdWUpIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIHRyYW5zcGFyZW50IGNvbG9yIGZvcgotICAgICAgICAgICAgICAgICAgICAgbm9uLXBhbGV0dGVkIGltYWdlcyAoUE5HX0lORk9fdFJOUykKLQotICAgIHBuZ19zZXRfaElTVChwbmdfcHRyLCBpbmZvX3B0ciwgaGlzdCk7Ci0KLSAgICBoaXN0ICAgICAgICAgICAtIGhpc3RvZ3JhbSBvZiBwYWxldHRlIChhcnJheSBvZgotICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMTYpIChQTkdfSU5GT19oSVNUKQotCi0gICAgcG5nX3NldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCBtb2RfdGltZSk7Ci0KLSAgICBtb2RfdGltZSAgICAgICAtIHRpbWUgaW1hZ2Ugd2FzIGxhc3QgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgIChQTkdfVkFMSURfdElNRSkKLQotICAgIHBuZ19zZXRfYktHRChwbmdfcHRyLCBpbmZvX3B0ciwgYmFja2dyb3VuZCk7Ci0KLSAgICBiYWNrZ3JvdW5kICAgICAtIGJhY2tncm91bmQgY29sb3IgKG9mIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgIHBuZ19jb2xvcl8xNnApIChQTkdfVkFMSURfYktHRCkKLQotICAgIHBuZ19zZXRfdGV4dChwbmdfcHRyLCBpbmZvX3B0ciwgdGV4dF9wdHIsIG51bV90ZXh0KTsKLQotICAgIHRleHRfcHRyICAgICAgIC0gYXJyYXkgb2YgcG5nX3RleHQgaG9sZGluZyBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMKLQotICAgIHRleHRfcHRyW2ldLmNvbXByZXNzaW9uIC0gdHlwZSBvZiBjb21wcmVzc2lvbiB1c2VkCi0gICAgICAgICAgICAgICAgIG9uICJ0ZXh0IiBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0Ci0gICAgdGV4dF9wdHJbaV0ua2V5ICAgLSBrZXl3b3JkIGZvciBjb21tZW50LiAgTXVzdCBjb250YWluCi0gICAgICAgICAgICAgICAgIDEtNzkgY2hhcmFjdGVycy4KLSAgICB0ZXh0X3B0cltpXS50ZXh0ICAtIHRleHQgY29tbWVudHMgZm9yIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLiAgQ2FuIGJlIE5VTEwgb3IgZW1wdHkuCi0gICAgdGV4dF9wdHJbaV0udGV4dF9sZW5ndGggLSBsZW5ndGggb2YgdGV4dCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgIGFmdGVyIGRlY29tcHJlc3Npb24sIDAgZm9yIGlUWHQKLSAgICB0ZXh0X3B0cltpXS5pdHh0X2xlbmd0aCAtIGxlbmd0aCBvZiBpdHh0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb21wcmVzc2lvbiwgMCBmb3IgdEVYdC96VFh0Ci0gICAgdGV4dF9wdHJbaV0ubGFuZyAgLSBsYW5ndWFnZSBvZiBjb21tZW50IChOVUxMIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgZm9yIHVua25vd24pLgotICAgIHRleHRfcHRyW2ldLnRyYW5zbGF0ZWRfa2V5d29yZCAgLSBrZXl3b3JkIGluIFVURi04IChOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3IgZW1wdHkgZm9yIHVua25vd24pLgotCi0gICAgTm90ZSB0aGF0IHRoZSBpdHh0X2xlbmd0aCwgbGFuZywgYW5kIGxhbmdfa2V5Ci0gICAgbWVtYmVycyBvZiB0aGUgdGV4dF9wdHIgc3RydWN0dXJlIG9ubHkgZXhpc3Qgd2hlbiB0aGUKLSAgICBsaWJyYXJ5IGlzIGJ1aWx0IHdpdGggaVRYdCBjaHVuayBzdXBwb3J0LiAgUHJpb3IgdG8KLSAgICBsaWJwbmctMS40LjAgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IGJ5IGRlZmF1bHQgd2l0aG91dAotICAgIGlUWHQgc3VwcG9ydC4gQWxzbyBub3RlIHRoYXQgd2hlbiBpVFh0IGlzIHN1cHBvcnRlZCwKLSAgICB0aGV5IGNvbnRhaW4gTlVMTCBwb2ludGVycyB3aGVuIHRoZSAiY29tcHJlc3Npb24iCi0gICAgZmllbGQgY29udGFpbnMgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSBvcgotICAgIFBOR19URVhUX0NPTVBSRVNTSU9OX3pUWHQuCi0KLSAgICBudW1fdGV4dCAgICAgICAtIG51bWJlciBvZiBjb21tZW50cwotCi0gICAgcG5nX3NldF9zUExUKHBuZ19wdHIsIGluZm9fcHRyLCAmcGFsZXR0ZV9wdHIsCi0gICAgICAgbnVtX3NwYWxldHRlcyk7Ci0KLSAgICBwYWxldHRlX3B0ciAgICAtIGFycmF5IG9mIHBuZ19zUExUX3N0cnVjdCBzdHJ1Y3R1cmVzCi0gICAgICAgICAgICAgICAgICAgICB0byBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBwYWxldHRlcwotICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGluZm8gc3RydWN0dXJlLgotICAgIG51bV9zcGFsZXR0ZXMgIC0gbnVtYmVyIG9mIHBhbGV0dGUgc3RydWN0dXJlcyB0byBiZQotICAgICAgICAgICAgICAgICAgICAgYWRkZWQuCi0KLSAgICBwbmdfc2V0X29GRnMocG5nX3B0ciwgaW5mb19wdHIsIG9mZnNldF94LCBvZmZzZXRfeSwKLSAgICAgICAgdW5pdF90eXBlKTsKLQotICAgIG9mZnNldF94ICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSBsZWZ0Ci0gICAgICAgICAgICAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4KLQotICAgIG9mZnNldF95ICAtIHBvc2l0aXZlIG9mZnNldCBmcm9tIHRoZSB0b3AKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbgotCi0gICAgdW5pdF90eXBlIC0gUE5HX09GRlNFVF9QSVhFTCwgUE5HX09GRlNFVF9NSUNST01FVEVSCi0KLSAgICBwbmdfc2V0X3BIWXMocG5nX3B0ciwgaW5mb19wdHIsIHJlc194LCByZXNfeSwKLSAgICAgICAgdW5pdF90eXBlKTsKLQotICAgIHJlc194ICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgaW4geCBkaXJlY3Rpb24KLQotICAgIHJlc195ICAgICAgIC0gcGl4ZWxzL3VuaXQgcGh5c2ljYWwgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgaW4geSBkaXJlY3Rpb24KLQotICAgIHVuaXRfdHlwZSAgIC0gUE5HX1JFU09MVVRJT05fVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgIFBOR19SRVNPTFVUSU9OX01FVEVSCi0KLSAgICBwbmdfc2V0X3NDQUwocG5nX3B0ciwgaW5mb19wdHIsIHVuaXQsIHdpZHRoLCBoZWlnaHQpCi0KLSAgICB1bml0ICAgICAgICAtIHBoeXNpY2FsIHNjYWxlIHVuaXRzIChhbiBpbnRlZ2VyKQotCi0gICAgd2lkdGggICAgICAgLSB3aWR0aCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0KLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICAod2lkdGggYW5kIGhlaWdodCBhcmUgZG91YmxlcykKLQotICAgIHBuZ19zZXRfc0NBTF9zKHBuZ19wdHIsIGluZm9fcHRyLCB1bml0LCB3aWR0aCwgaGVpZ2h0KQotCi0gICAgdW5pdCAgICAgICAgLSBwaHlzaWNhbCBzY2FsZSB1bml0cyAoYW4gaW50ZWdlcikKLQotICAgIHdpZHRoICAgICAgIC0gd2lkdGggb2YgYSBwaXhlbCBpbiBwaHlzaWNhbCBzY2FsZSB1bml0cwotICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGEgc3RyaW5nCi0KLSAgICBoZWlnaHQgICAgICAtIGhlaWdodCBvZiBhIHBpeGVsIGluIHBoeXNpY2FsIHNjYWxlIHVuaXRzCi0gICAgICAgICAgICAgICAgICh3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzdHJpbmdzIGxpa2UgIjIuNTQiKQotCi0gICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnVua25vd25zLAotICAgICAgIG51bV91bmtub3ducykKLQotICAgIHVua25vd25zICAgICAgICAgIC0gYXJyYXkgb2YgcG5nX3Vua25vd25fY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgaG9sZGluZyB1bmtub3duIGNodW5rcwotICAgIHVua25vd25zW2ldLm5hbWUgIC0gbmFtZSBvZiB1bmtub3duIGNodW5rCi0gICAgdW5rbm93bnNbaV0uZGF0YSAgLSBkYXRhIG9mIHVua25vd24gY2h1bmsKLSAgICB1bmtub3duc1tpXS5zaXplICAtIHNpemUgb2YgdW5rbm93biBjaHVuaydzIGRhdGEKLSAgICB1bmtub3duc1tpXS5sb2NhdGlvbiAtIHBvc2l0aW9uIHRvIHdyaXRlIGNodW5rIGluIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGRvIG5vdCB3cml0ZSBjaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0hBVkVfSUhEUjogYmVmb3JlIFBMVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19IQVZFX1BMVEU6IGJlZm9yZSBJREFUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfQUZURVJfSURBVDogYWZ0ZXIgSURBVAotCi1UaGUgImxvY2F0aW9uIiBtZW1iZXIgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvCi13aGF0IHBhcnQgb2YgdGhlIG91dHB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLVlvdSBjYW4gY2hhbmdlIGl0cyB2YWx1ZSBhZnRlciBjYWxsaW5nIHBuZ19zZXRfdW5rbm93bl9jaHVua3MoKQotYXMgZGVtb25zdHJhdGVkIGluIHBuZ3Rlc3QuYy4gIFdpdGhpbiBlYWNoIG9mIHRoZSAibG9jYXRpb25zIiwKLXRoZSBjaHVua3MgYXJlIHNlcXVlbmNlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcG9zaXRpb24gaW4gdGhlCi1zdHJ1Y3R1cmUgKHRoYXQgaXMsIHRoZSB2YWx1ZSBvZiAiaSIsIHdoaWNoIGlzIHRoZSBvcmRlciBpbiB3aGljaAotdGhlIGNodW5rIHdhcyBlaXRoZXIgcmVhZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9yIGRlZmluZWQgd2l0aAotcG5nX3NldF91bmtub3duX2NodW5rcykuCi0KLUEgcXVpY2sgd29yZCBhYm91dCB0ZXh0IGFuZCBudW1fdGV4dC4gIHRleHQgaXMgYW4gYXJyYXkgb2YgcG5nX3RleHQKLXN0cnVjdHVyZXMuICBudW1fdGV4dCBpcyB0aGUgbnVtYmVyIG9mIHZhbGlkIHN0cnVjdHVyZXMgaW4gdGhlIGFycmF5LgotRWFjaCBwbmdfdGV4dCBzdHJ1Y3R1cmUgaG9sZHMgYSBsYW5ndWFnZSBjb2RlLCBhIGtleXdvcmQsIGEgdGV4dCB2YWx1ZSwKLWFuZCBhIGNvbXByZXNzaW9uIHR5cGUuCi0KLVRoZSBjb21wcmVzc2lvbiB0eXBlcyBoYXZlIHRoZSBzYW1lIHZhbGlkIG51bWJlcnMgYXMgdGhlIGNvbXByZXNzaW9uCi10eXBlcyBvZiB0aGUgaW1hZ2UgZGF0YS4gIEN1cnJlbnRseSwgdGhlIG9ubHkgdmFsaWQgbnVtYmVyIGlzIHplcm8uCi1Ib3dldmVyLCB5b3UgY2FuIHN0b3JlIHRleHQgZWl0aGVyIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkLCB1bmxpa2UKLWltYWdlcywgd2hpY2ggYWx3YXlzIGhhdmUgdG8gYmUgY29tcHJlc3NlZC4gIFNvIGlmIHlvdSBkb24ndCB3YW50IHRoZQotdGV4dCBjb21wcmVzc2VkLCBzZXQgdGhlIGNvbXByZXNzaW9uIHR5cGUgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORS4KLUJlY2F1c2UgdEVYdCBhbmQgelRYdCBjaHVua3MgZG9uJ3QgaGF2ZSBhIGxhbmd1YWdlIGZpZWxkLCBpZiB5b3UKLXNwZWNpZnkgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORSBvciBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0Ci1hbnkgbGFuZ3VhZ2UgY29kZSBvciB0cmFuc2xhdGVkIGtleXdvcmQgd2lsbCBub3QgYmUgd3JpdHRlbiBvdXQuCi0KLVVudGlsIHRleHQgZ2V0cyBhcm91bmQgYSBmZXcgaHVuZHJlZCBieXRlcywgaXQgaXMgbm90IHdvcnRoIGNvbXByZXNzaW5nIGl0LgotQWZ0ZXIgdGhlIHRleHQgaGFzIGJlZW4gd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUsIHRoZSBjb21wcmVzc2lvbiB0eXBlCi1pcyBzZXQgdG8gUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORV9XUiBvciBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0X1dSLAotc28gdGhhdCBpdCBpc24ndCB3cml0dGVuIG91dCBhZ2FpbiBhdCB0aGUgZW5kIChpbiBjYXNlIHlvdSBhcmUgY2FsbGluZwotcG5nX3dyaXRlX2VuZCgpIHdpdGggdGhlIHNhbWUgc3RydWN0KS4KLQotVGhlIGtleXdvcmRzIHRoYXQgYXJlIGdpdmVuIGluIHRoZSBQTkcgU3BlY2lmaWNhdGlvbiBhcmU6Ci0KLSAgICBUaXRsZSAgICAgICAgICAgIFNob3J0IChvbmUgbGluZSkgdGl0bGUgb3IKLSAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gZm9yIGltYWdlCi0KLSAgICBBdXRob3IgICAgICAgICAgIE5hbWUgb2YgaW1hZ2UncyBjcmVhdG9yCi0KLSAgICBEZXNjcmlwdGlvbiAgICAgIERlc2NyaXB0aW9uIG9mIGltYWdlIChwb3NzaWJseSBsb25nKQotCi0gICAgQ29weXJpZ2h0ICAgICAgICBDb3B5cmlnaHQgbm90aWNlCi0KLSAgICBDcmVhdGlvbiBUaW1lICAgIFRpbWUgb2Ygb3JpZ2luYWwgaW1hZ2UgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IFJGQyAxMTIzIGZvcm1hdCwgc2VlIGJlbG93KQotCi0gICAgU29mdHdhcmUgICAgICAgICBTb2Z0d2FyZSB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKLQotICAgIERpc2NsYWltZXIgICAgICAgTGVnYWwgZGlzY2xhaW1lcgotCi0gICAgV2FybmluZyAgICAgICAgICBXYXJuaW5nIG9mIG5hdHVyZSBvZiBjb250ZW50Ci0KLSAgICBTb3VyY2UgICAgICAgICAgIERldmljZSB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKLQotICAgIENvbW1lbnQgICAgICAgICAgTWlzY2VsbGFuZW91cyBjb21tZW50OyBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICBmcm9tIG90aGVyIGltYWdlIGZvcm1hdAotCi1UaGUga2V5d29yZC10ZXh0IHBhaXJzIHdvcmsgbGlrZSB0aGlzLiAgS2V5d29yZHMgc2hvdWxkIGJlIHNob3J0Ci1zaW1wbGUgZGVzY3JpcHRpb25zIG9mIHdoYXQgdGhlIGNvbW1lbnQgaXMgYWJvdXQuICBTb21lIHR5cGljYWwKLWtleXdvcmRzIGFyZSBmb3VuZCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24sIGFzIGlzIHNvbWUgcmVjb21tZW5kYXRpb25zCi1vbiBrZXl3b3Jkcy4gIFlvdSBjYW4gcmVwZWF0IGtleXdvcmRzIGluIGEgZmlsZS4gIFlvdSBjYW4gZXZlbiB3cml0ZQotc29tZSB0ZXh0IGJlZm9yZSB0aGUgaW1hZ2UgYW5kIHNvbWUgYWZ0ZXIuICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50Ci10byBwdXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW1hZ2UgYmVmb3JlIHRoZSBpbWFnZSwgYnV0IGxlYXZlIHRoZQotZGlzY2xhaW1lciB1bnRpbCBhZnRlciwgc28gdmlld2VycyB3b3JraW5nIG92ZXIgbW9kZW0gY29ubmVjdGlvbnMKLWRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGRpc2NsYWltZXIgdG8gZ28gb3ZlciB0aGUgbW9kZW0gYmVmb3JlCi10aGV5IHN0YXJ0IHNlZWluZyB0aGUgaW1hZ2UuICBGaW5hbGx5LCBrZXl3b3JkcyBzaG91bGQgYmUgZnVsbAotd29yZHMsIG5vdCBhYmJyZXZpYXRpb25zLiAgS2V5d29yZHMgYW5kIHRleHQgYXJlIGluIHRoZSBJU08gODg1OS0xCi0oTGF0aW4tMSkgY2hhcmFjdGVyIHNldCAoYSBzdXBlcnNldCBvZiByZWd1bGFyIEFTQ0lJKSBhbmQgY2FuIG5vdAotY29udGFpbiBOVUwgY2hhcmFjdGVycywgYW5kIHNob3VsZCBub3QgY29udGFpbiBjb250cm9sIG9yIG90aGVyCi11bnByaW50YWJsZSBjaGFyYWN0ZXJzLiAgVG8gbWFrZSB0aGUgY29tbWVudHMgd2lkZWx5IHJlYWRhYmxlLCBzdGljawotd2l0aCBiYXNpYyBBU0NJSSwgYW5kIGF2b2lkIG1hY2hpbmUgc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBleHRlbnNpb25zCi1saWtlIHRoZSBJQk0tUEMgY2hhcmFjdGVyIHNldC4gIFRoZSBrZXl3b3JkIG11c3QgYmUgcHJlc2VudCwgYnV0Ci15b3UgY2FuIGxlYXZlIG9mZiB0aGUgdGV4dCBzdHJpbmcgb24gbm9uLWNvbXByZXNzZWQgcGFpcnMuCi1Db21wcmVzc2VkIHBhaXJzIG11c3QgaGF2ZSBhIHRleHQgc3RyaW5nLCBhcyBvbmx5IHRoZSB0ZXh0IHN0cmluZwotaXMgY29tcHJlc3NlZCBhbnl3YXksIHNvIHRoZSBjb21wcmVzc2lvbiB3b3VsZCBiZSBtZWFuaW5nbGVzcy4KLQotUE5HIHN1cHBvcnRzIG1vZGlmaWNhdGlvbiB0aW1lIHZpYSB0aGUgcG5nX3RpbWUgc3RydWN0dXJlLiAgVHdvCi1jb252ZXJzaW9uIHJvdXRpbmVzIGFyZSBwcm92aWRlZCwgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBmb3IKLXRpbWVfdCBhbmQgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0oKSBmb3Igc3RydWN0IHRtLiAgVGhlCi10aW1lX3Qgcm91dGluZSB1c2VzIGdtdGltZSgpLiAgWW91IGRvbid0IGhhdmUgdG8gdXNlIGVpdGhlciBvZgotdGhlc2UsIGJ1dCBpZiB5b3Ugd2lzaCB0byBmaWxsIGluIHRoZSBwbmdfdGltZSBzdHJ1Y3R1cmUgZGlyZWN0bHksCi15b3Ugc2hvdWxkIHByb3ZpZGUgdGhlIHRpbWUgaW4gdW5pdmVyc2FsIHRpbWUgKEdNVCkgaWYgcG9zc2libGUKLWluc3RlYWQgb2YgeW91ciBsb2NhbCB0aW1lLiAgTm90ZSB0aGF0IHRoZSB5ZWFyIG51bWJlciBpcyB0aGUgZnVsbAoteWVhciAoZS5nLiAxOTk4LCByYXRoZXIgdGhhbiA5OCAtIFBORyBpcyB5ZWFyIDIwMDAgY29tcGxpYW50ISksIGFuZAotdGhhdCBtb250aHMgc3RhcnQgd2l0aCAxLgotCi1JZiB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdGltZSBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgY3JlYXRpb24sIHlvdSBzaG91bGQKLXVzZSBhIHBsYWluIHRFWHQgY2h1bmsgd2l0aCB0aGUgIkNyZWF0aW9uIFRpbWUiIGtleXdvcmQuICBUaGlzIGlzCi1uZWNlc3NhcnkgYmVjYXVzZSB0aGUgImNyZWF0aW9uIHRpbWUiIG9mIGEgUE5HIGltYWdlIGlzIHNvbWV3aGF0IHZhZ3VlLAotZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IG1lYW4gdGhlIFBORyBmaWxlLCB0aGUgdGltZSB0aGUgaW1hZ2Ugd2FzCi1jcmVhdGVkIGluIGEgbm9uLVBORyBmb3JtYXQsIGEgc3RpbGwgcGhvdG8gZnJvbSB3aGljaCB0aGUgaW1hZ2Ugd2FzCi1zY2FubmVkLCBvciBwb3NzaWJseSB0aGUgc3ViamVjdCBtYXR0ZXIgaXRzZWxmLiAgSW4gb3JkZXIgdG8gZmFjaWxpdGF0ZQotbWFjaGluZS1yZWFkYWJsZSBkYXRlcywgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgIkNyZWF0aW9uIFRpbWUiCi10RVh0IGNodW5rIHVzZSBSRkMgMTEyMyBmb3JtYXQgZGF0ZXMgKGUuZy4gIjIyIE1heSAxOTk3IDE4OjA3OjEwIEdNVCIpLAotYWx0aG91Z2ggdGhpcyBpc24ndCBhIHJlcXVpcmVtZW50LiAgVW5saWtlIHRoZSB0SU1FIGNodW5rLCB0aGUKLSJDcmVhdGlvbiBUaW1lIiB0RVh0IGNodW5rIGlzIG5vdCBleHBlY3RlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGNoYW5nZWQKLWJ5IHRoZSBzb2Z0d2FyZS4gIFRvIGZhY2lsaXRhdGUgdGhlIHVzZSBvZiBSRkMgMTEyMyBkYXRlcywgYSBmdW5jdGlvbgotcG5nX2NvbnZlcnRfdG9fcmZjMTEyM19idWZmZXIoYnVmZmVyLCBwbmdfdGltZXApIGlzIHByb3ZpZGVkIHRvCi1jb252ZXJ0IGZyb20gUE5HIHRpbWUgdG8gYW4gUkZDIDExMjMgZm9ybWF0IHN0cmluZy4gIFRoZSBjYWxsZXIgbXVzdCBwcm92aWRlCi1hIHdyaXRlYWJsZSBidWZmZXIgb2YgYXQgbGVhc3QgMjkgYnl0ZXMuCi0KLS5TUyBXcml0aW5nIHVua25vd24gY2h1bmtzCi0KLVlvdSBjYW4gdXNlIHRoZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzIGZ1bmN0aW9uIHRvIHF1ZXVlIHVwIHByaXZhdGUgY2h1bmtzCi1mb3Igd3JpdGluZy4gIFlvdSBnaXZlIGl0IGEgY2h1bmsgbmFtZSwgbG9jYXRpb24sIHJhdyBkYXRhLCBhbmQgYSBzaXplLiAgWW91Ci1hbHNvIG11c3QgdXNlIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcygpIHRvIGVuc3VyZSB0aGF0IGxpYnBuZyB3aWxsCi1oYW5kbGUgdGhlbS4gIFRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQuICBUaGUgY2h1bmtzIHdpbGwgYmUgd3JpdHRlbiBieSB0aGUKLW5leHQgZm9sbG93aW5nIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFLCBwbmdfd3JpdGVfaW5mbywgb3IgcG5nX3dyaXRlX2VuZAotZnVuY3Rpb24sIGRlcGVuZGluZyB1cG9uIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBBbnkgY2h1bmtzIHByZXZpb3VzbHkKLXJlYWQgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUncyB1bmtub3duLWNodW5rIGxpc3Qgd2lsbCBhbHNvIGJlIHdyaXR0ZW4gb3V0Ci1pbiBhIHNlcXVlbmNlIHRoYXQgc2F0aXNmaWVzIHRoZSBQTkcgc3BlY2lmaWNhdGlvbidzIG9yZGVyaW5nIHJ1bGVzLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd3JpdGluZyB0d28gcHJpdmF0ZSBjaHVua3MsIHByVnQgYW5kIG1pTkU6Ci0KLSAgICAjaWZkZWYgUE5HX1dSSVRFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAotICAgIC8qIFNldCB1bmtub3duIGNodW5rIGRhdGEgKi8KLSAgICBwbmdfdW5rbm93bl9jaHVuayB1bmtfY2h1bmtbMl07Ci0gICAgc3RyY3B5KChjaGFyICopIHVua19jaHVua1swXS5uYW1lLCAicHJWdCI7Ci0gICAgdW5rX2NodW5rWzBdLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSAiUFJJVkFURSBEQVRBIjsKLSAgICB1bmtfY2h1bmtbMF0uc2l6ZSA9IHN0cmxlbih1bmtfY2h1bmtbMF0uZGF0YSkrMTsKLSAgICB1bmtfY2h1bmtbMF0ubG9jYXRpb24gPSBQTkdfSEFWRV9JSERSOwotICAgIHN0cmNweSgoY2hhciAqKSB1bmtfY2h1bmtbMV0ubmFtZSwgIm1pTkUiOwotICAgIHVua19jaHVua1sxXS5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgIk1ZIENIVU5LIERBVEEiOwotICAgIHVua19jaHVua1sxXS5zaXplID0gc3RybGVuKHVua19jaHVua1swXS5kYXRhKSsxOwotICAgIHVua19jaHVua1sxXS5sb2NhdGlvbiA9IFBOR19BRlRFUl9JREFUOwotICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua3Mod3JpdGVfcHRyLCB3cml0ZV9pbmZvX3B0ciwKLSAgICAgICAgdW5rX2NodW5rLCAyKTsKLSAgICAvKiBOZWVkZWQgYmVjYXVzZSBtaU5FIGlzIG5vdCBzYWZlLXRvLWNvcHkgKi8KLSAgICBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3MocG5nLCBQTkdfSEFORExFX0NIVU5LX0FMV0FZUywKLSAgICAgICAocG5nX2J5dGVwKSAibWlORSIsIDEpOwotICAgICMgaWYgUE5HX0xJQlBOR19WRVIgPCAxMDYwMAotICAgICAgLyogRGVhbCB3aXRoIHVua25vd24gY2h1bmsgbG9jYXRpb24gYnVnIGluIDEuNS54IGFuZCBlYXJsaWVyICovCi0gICAgICBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24ocG5nLCBpbmZvLCAwLCBQTkdfSEFWRV9JSERSKTsKLSAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmcsIGluZm8sIDEsIFBOR19BRlRFUl9JREFUKTsKLSAgICAjIGVuZGlmCi0gICAgIyBpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNTAwCi0gICAgICAvKiBQTkdfQUZURVJfSURBVCB3cml0ZXMgdHdvIGNvcGllcyBvZiB0aGUgY2h1bmsgcHJpb3IgdG8gbGlicG5nLTEuNS4wLAotICAgICAgICogb25lIGJlZm9yZSBJREFUIGFuZCBhbm90aGVyIGFmdGVyIElEQVQsIHNvIGRvbid0IHVzZSBpdDsgb25seSB1c2UKLSAgICAgICAqIFBOR19IQVZFX0lIRFIgbG9jYXRpb24uICBUaGlzIGNhbGwgcmVzZXRzIHRoZSBsb2NhdGlvbiBwcmV2aW91c2x5Ci0gICAgICAgKiBzZXQgYnkgYXNzaWdubWVudCBhbmQgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uKCkgZm9yIGNodW5rIDEuCi0gICAgICAgKi8KLSAgICAgIHBuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbihwbmcsIGluZm8sIDEsIFBOR19IQVZFX0lIRFIpOwotICAgICMgZW5kaWYKLSAgICAjZW5kaWYKLQotLlNTIFRoZSBoaWdoLWxldmVsIHdyaXRlIGludGVyZmFjZQotCi1BdCB0aGlzIHBvaW50IHRoZXJlIGFyZSB0d28gd2F5cyB0byBwcm9jZWVkOyB0aHJvdWdoIHRoZSBoaWdoLWxldmVsCi13cml0ZSBpbnRlcmZhY2UsIG9yIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBsb3ctbGV2ZWwgd3JpdGUgb3BlcmF0aW9ucy4KLVlvdSBjYW4gdXNlIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBpZiB5b3VyIGltYWdlIGRhdGEgaXMgcHJlc2VudAotaW4gdGhlIGluZm8gc3RydWN0dXJlLiAgQWxsIGRlZmluZWQgb3V0cHV0Ci10cmFuc2Zvcm1hdGlvbnMgYXJlIHBlcm1pdHRlZCwgZW5hYmxlZCBieSB0aGUgZm9sbG93aW5nIG1hc2tzLgotCi0gICAgUE5HX1RSQU5TRk9STV9JREVOVElUWSAgICAgIE5vIHRyYW5zZm9ybWF0aW9uCi0gICAgUE5HX1RSQU5TRk9STV9QQUNLSU5HICAgICAgIFBhY2sgMSwgMiBhbmQgNC1iaXQgc2FtcGxlcwotICAgIFBOR19UUkFOU0ZPUk1fUEFDS1NXQVAgICAgICBDaGFuZ2Ugb3JkZXIgb2YgcGFja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0byBMU0IgZmlyc3QKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9NT05PICAgSW52ZXJ0IG1vbm9jaHJvbWUgaW1hZ2VzCi0gICAgUE5HX1RSQU5TRk9STV9TSElGVCAgICAgICAgIE5vcm1hbGl6ZSBwaXhlbHMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNCSVQgZGVwdGgKLSAgICBQTkdfVFJBTlNGT1JNX0JHUiAgICAgICAgICAgRmxpcCBSR0IgdG8gQkdSLCBSR0JBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEJHUkEKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfQUxQSEEgICAgRmxpcCBSR0JBIHRvIEFSR0Igb3IgR0EKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQUcKLSAgICBQTkdfVFJBTlNGT1JNX0lOVkVSVF9BTFBIQSAgQ2hhbmdlIGFscGhhIGZyb20gb3BhY2l0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cmFuc3BhcmVuY3kKLSAgICBQTkdfVFJBTlNGT1JNX1NXQVBfRU5ESUFOICAgQnl0ZS1zd2FwIDE2LWJpdCBzYW1wbGVzCi0gICAgUE5HX1RSQU5TRk9STV9TVFJJUF9GSUxMRVIgICAgICAgIFN0cmlwIG91dCBmaWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKGRlcHJlY2F0ZWQpLgotICAgIFBOR19UUkFOU0ZPUk1fU1RSSVBfRklMTEVSX0JFRk9SRSBTdHJpcCBvdXQgbGVhZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZXIgYnl0ZXMKLSAgICBQTkdfVFJBTlNGT1JNX1NUUklQX0ZJTExFUl9BRlRFUiAgU3RyaXAgb3V0IHRyYWlsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlciBieXRlcwotCi1JZiB5b3UgaGF2ZSB2YWxpZCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSAoeW91IGNhbiB1c2UKLXBuZ19zZXRfcm93cygpIHRvIHB1dCBpbWFnZSBkYXRhIGluIHRoZSBpbmZvIHN0cnVjdHVyZSksIHNpbXBseSBkbyB0aGlzOgotCi0gICAgcG5nX3dyaXRlX3BuZyhwbmdfcHRyLCBpbmZvX3B0ciwgcG5nX3RyYW5zZm9ybXMsIE5VTEwpCi0KLXdoZXJlIHBuZ190cmFuc2Zvcm1zIGlzIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBzb21lIHNldCBvZgotdHJhbnNmb3JtYXRpb24gZmxhZ3MuICBUaGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0byBwbmdfd3JpdGVfaW5mbygpLAotZm9sbG93ZWQgdGhlIHNldCBvZiB0cmFuc2Zvcm1hdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSB0cmFuc2Zvcm0gbWFzaywKLXRoZW4gcG5nX3dyaXRlX2ltYWdlKCksIGFuZCBmaW5hbGx5IHBuZ193cml0ZV9lbmQoKS4KLQotKFRoZSBmaW5hbCBwYXJhbWV0ZXIgb2YgdGhpcyBjYWxsIGlzIG5vdCB5ZXQgdXNlZC4gIFNvbWVkYXkgaXQgbWlnaHQgcG9pbnQKLXRvIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgc29tZSBmdXR1cmUgb3V0cHV0IHRyYW5zZm9ybS4pCi0KLVlvdSBtdXN0IHVzZSBwbmdfdHJhbnNmb3JtcyBhbmQgbm90IGNhbGwgYW55IHBuZ19zZXRfdHJhbnNmb3JtKCkgZnVuY3Rpb25zCi13aGVuIHlvdSB1c2UgcG5nX3dyaXRlX3BuZygpLgotCi0uU1MgVGhlIGxvdy1sZXZlbCB3cml0ZSBpbnRlcmZhY2UKLQotSWYgeW91IGFyZSBnb2luZyB0aGUgbG93LWxldmVsIHJvdXRlIGluc3RlYWQsIHlvdSBhcmUgbm93IHJlYWR5IHRvCi13cml0ZSBhbGwgdGhlIGZpbGUgaW5mb3JtYXRpb24gdXAgdG8gdGhlIGFjdHVhbCBpbWFnZSBkYXRhLiAgWW91IGRvCi10aGlzIHdpdGggYSBjYWxsIHRvIHBuZ193cml0ZV9pbmZvKCkuCi0KLSAgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLU5vdGUgdGhhdCB0aGVyZSBpcyBvbmUgdHJhbnNmb3JtYXRpb24geW91IG1heSBuZWVkIHRvIGRvIGJlZm9yZQotcG5nX3dyaXRlX2luZm8oKS4gIEluIFBORyBmaWxlcywgdGhlIGFscGhhIGNoYW5uZWwgaW4gYW4gaW1hZ2UgaXMgdGhlCi1sZXZlbCBvZiBvcGFjaXR5LiAgSWYgeW91ciBkYXRhIGlzIHN1cHBsaWVkIGFzIGEgbGV2ZWwgb2YgdHJhbnNwYXJlbmN5LAoteW91IGNhbiBpbnZlcnQgdGhlIGFscGhhIGNoYW5uZWwgYmVmb3JlIHlvdSB3cml0ZSBpdCwgc28gdGhhdCAwIGlzCi1mdWxseSB0cmFuc3BhcmVudCBhbmQgMjU1IChpbiA4LWJpdCBvciBwYWxldHRlZCBpbWFnZXMpIG9yIDY1NTM1Ci0oaW4gMTYtYml0IGltYWdlcykgaXMgZnVsbHkgb3BhcXVlLCB3aXRoCi0KLSAgICBwbmdfc2V0X2ludmVydF9hbHBoYShwbmdfcHRyKTsKLQotVGhpcyBtdXN0IGFwcGVhciBiZWZvcmUgcG5nX3dyaXRlX2luZm8oKSBpbnN0ZWFkIG9mIGxhdGVyIHdpdGggdGhlCi1vdGhlciB0cmFuc2Zvcm1hdGlvbnMgYmVjYXVzZSBpbiB0aGUgY2FzZSBvZiBwYWxldHRlZCBpbWFnZXMgdGhlIHRSTlMKLWNodW5rIGRhdGEgaGFzIHRvIGJlIGludmVydGVkIGJlZm9yZSB0aGUgdFJOUyBjaHVuayBpcyB3cml0dGVuLiAgSWYKLXlvdXIgaW1hZ2UgaXMgbm90IGEgcGFsZXR0ZWQgaW1hZ2UsIHRoZSB0Uk5TIGRhdGEgKHdoaWNoIGluIHN1Y2ggY2FzZXMKLXJlcHJlc2VudHMgYSBzaW5nbGUgY29sb3IgdG8gYmUgcmVuZGVyZWQgYXMgdHJhbnNwYXJlbnQpIHdvbid0IG5lZWQgdG8KLWJlIGNoYW5nZWQsIGFuZCB5b3UgY2FuIHNhZmVseSBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uIGFmdGVyIHlvdXIKLXBuZ193cml0ZV9pbmZvKCkgY2FsbC4KLQotSWYgeW91IG5lZWQgdG8gd3JpdGUgYSBwcml2YXRlIGNodW5rIHRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlZm9yZQotdGhlIFBMVEUgY2h1bmsgd2hlbiBQTFRFIGlzIHByZXNlbnQsIHlvdSBjYW4gd3JpdGUgdGhlIFBORyBpbmZvIGluCi10d28gc3RlcHMsIGFuZCBpbnNlcnQgY29kZSB0byB3cml0ZSB5b3VyIG93biBjaHVuayBiZXR3ZWVuIHRoZW06Ci0KLSAgICBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURShwbmdfcHRyLCBpbmZvX3B0cik7Ci0gICAgcG5nX3NldF91bmtub3duX2NodW5rcyhwbmdfcHRyLCBpbmZvX3B0ciwgLi4uKTsKLSAgICBwbmdfd3JpdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLUFmdGVyIHlvdSd2ZSB3cml0dGVuIHRoZSBmaWxlIGluZm9ybWF0aW9uLCB5b3UgY2FuIHNldCB1cCB0aGUgbGlicmFyeQotdG8gaGFuZGxlIGFueSBzcGVjaWFsIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgaW1hZ2UgZGF0YS4gIFRoZSB2YXJpb3VzCi13YXlzIHRvIHRyYW5zZm9ybSB0aGUgZGF0YSB3aWxsIGJlIGRlc2NyaWJlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5Ci1zaG91bGQgb2NjdXIuICBUaGlzIGlzIGltcG9ydGFudCwgYXMgc29tZSBvZiB0aGVzZSBjaGFuZ2UgdGhlIGNvbG9yCi10eXBlIGFuZC9vciBiaXQgZGVwdGggb2YgdGhlIGRhdGEsIGFuZCBzb21lIG90aGVycyBvbmx5IHdvcmsgb24KLWNlcnRhaW4gY29sb3IgdHlwZXMgYW5kIGJpdCBkZXB0aHMuICBFdmVuIHRob3VnaCBlYWNoIHRyYW5zZm9ybWF0aW9uCi1jaGVja3MgdG8gc2VlIGlmIGl0IGhhcyBkYXRhIHRoYXQgaXQgY2FuIGRvIHNvbWV0aGluZyB3aXRoLCB5b3Ugc2hvdWxkCi1tYWtlIHN1cmUgdG8gb25seSBlbmFibGUgYSB0cmFuc2Zvcm1hdGlvbiBpZiBpdCB3aWxsIGJlIHZhbGlkIGZvciB0aGUKLWRhdGEuICBGb3IgZXhhbXBsZSwgZG9uJ3Qgc3dhcCByZWQgYW5kIGJsdWUgb24gZ3JheXNjYWxlIGRhdGEuCi0KLVBORyBmaWxlcyBzdG9yZSBSR0IgcGl4ZWxzIHBhY2tlZCBpbnRvIDMgb3IgNiBieXRlcy4gIFRoaXMgY29kZSB0ZWxscwotdGhlIGxpYnJhcnkgdG8gc3RyaXAgaW5wdXQgZGF0YSB0aGF0IGhhcyA0IG9yIDggYnl0ZXMgcGVyIHBpeGVsIGRvd24KLXRvIDMgb3IgNiBieXRlcyAob3Igc3RyaXAgMiBvciA0LWJ5dGUgZ3JheXNjYWxlK2ZpbGxlciBkYXRhIHRvIDEgb3IgMgotYnl0ZXMgcGVyIHBpeGVsKS4KLQotICAgIHBuZ19zZXRfZmlsbGVyKHBuZ19wdHIsIDAsIFBOR19GSUxMRVJfQkVGT1JFKTsKLQotd2hlcmUgdGhlIDAgaXMgdW51c2VkLCBhbmQgdGhlIGxvY2F0aW9uIGlzIGVpdGhlciBQTkdfRklMTEVSX0JFRk9SRSBvcgotUE5HX0ZJTExFUl9BRlRFUiwgZGVwZW5kaW5nIHVwb24gd2hldGhlciB0aGUgZmlsbGVyIGJ5dGUgaW4gdGhlIHBpeGVsCi1pcyBzdG9yZWQgWFJHQiBvciBSR0JYLgotCi1QTkcgZmlsZXMgcGFjayBwaXhlbHMgb2YgYml0IGRlcHRocyAxLCAyLCBhbmQgNCBpbnRvIGJ5dGVzIGFzIHNtYWxsIGFzCi10aGV5IGNhbiwgcmVzdWx0aW5nIGluLCBmb3IgZXhhbXBsZSwgOCBwaXhlbHMgcGVyIGJ5dGUgZm9yIDEgYml0IGZpbGVzLgotSWYgdGhlIGRhdGEgaXMgc3VwcGxpZWQgYXQgMSBwaXhlbCBwZXIgYnl0ZSwgdXNlIHRoaXMgY29kZSwgd2hpY2ggd2lsbAotY29ycmVjdGx5IHBhY2sgdGhlIHBpeGVscyBpbnRvIGEgc2luZ2xlIGJ5dGU6Ci0KLSAgICBwbmdfc2V0X3BhY2tpbmcocG5nX3B0cik7Ci0KLVBORyBmaWxlcyByZWR1Y2UgcG9zc2libGUgYml0IGRlcHRocyB0byAxLCAyLCA0LCA4LCBhbmQgMTYuICBJZiB5b3VyCi1kYXRhIGlzIG9mIGFub3RoZXIgYml0IGRlcHRoLCB5b3UgY2FuIHdyaXRlIGFuIHNCSVQgY2h1bmsgaW50byB0aGUKLWZpbGUgc28gdGhhdCBkZWNvZGVycyBjYW4gcmVjb3ZlciB0aGUgb3JpZ2luYWwgZGF0YSBpZiBkZXNpcmVkLgotCi0gICAgLyogU2V0IHRoZSB0cnVlIGJpdCBkZXB0aCBvZiB0aGUgaW1hZ2UgZGF0YSAqLwotICAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpCi0gICAgewotICAgICAgIHNpZ19iaXQucmVkID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgICAgc2lnX2JpdC5ncmVlbiA9IHRydWVfYml0X2RlcHRoOwotICAgICAgIHNpZ19iaXQuYmx1ZSA9IHRydWVfYml0X2RlcHRoOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgc2lnX2JpdC5ncmF5ID0gdHJ1ZV9iaXRfZGVwdGg7Ci0gICAgfQotCi0gICAgaWYgKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkKLSAgICB7Ci0gICAgICAgc2lnX2JpdC5hbHBoYSA9IHRydWVfYml0X2RlcHRoOwotICAgIH0KLQotICAgIHBuZ19zZXRfc0JJVChwbmdfcHRyLCBpbmZvX3B0ciwgJnNpZ19iaXQpOwotCi1JZiB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHJvdyBidWZmZXIgaW4gYSBiaXQgZGVwdGggb3RoZXIgdGhhbgotb25lIHN1cHBvcnRlZCBieSBQTkcgKGUuZy4gMyBiaXQgZGF0YSBpbiB0aGUgcmFuZ2UgMC03IGZvciBhIDQtYml0IFBORyksCi10aGlzIHdpbGwgc2NhbGUgdGhlIHZhbHVlcyB0byBhcHBlYXIgdG8gYmUgdGhlIGNvcnJlY3QgYml0IGRlcHRoIGFzCi1pcyByZXF1aXJlZCBieSBQTkcuCi0KLSAgICBwbmdfc2V0X3NoaWZ0KHBuZ19wdHIsICZzaWdfYml0KTsKLQotUE5HIGZpbGVzIHN0b3JlIDE2LWJpdCBwaXhlbHMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWctZW5kaWFuLAotaWUuIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmaXJzdCkuICBUaGlzIGNvZGUgd291bGQgYmUgdXNlZCBpZiB0aGV5IGFyZQotc3VwcGxpZWQgdGhlIG90aGVyIHdheSAobGl0dGxlLWVuZGlhbiwgaS5lLiBsZWFzdCBzaWduaWZpY2FudCBiaXRzCi1maXJzdCwgdGhlIHdheSBQQ3Mgc3RvcmUgdGhlbSk6Ci0KLSAgICBpZiAoYml0X2RlcHRoID4gOCkKLSAgICAgICBwbmdfc2V0X3N3YXAocG5nX3B0cik7Ci0KLUlmIHlvdSBhcmUgdXNpbmcgcGFja2VkLXBpeGVsIGltYWdlcyAoMSwgMiwgb3IgNCBiaXRzL3BpeGVsKSwgYW5kIHlvdQotbmVlZCB0byBjaGFuZ2UgdGhlIG9yZGVyIHRoZSBwaXhlbHMgYXJlIHBhY2tlZCBpbnRvIGJ5dGVzLCB5b3UgY2FuIHVzZToKLQotICAgIGlmIChiaXRfZGVwdGggPCA4KQotICAgICAgIHBuZ19zZXRfcGFja3N3YXAocG5nX3B0cik7Ci0KLVBORyBmaWxlcyBzdG9yZSAzIGNvbG9yIHBpeGVscyBpbiByZWQsIGdyZWVuLCBibHVlIG9yZGVyLiAgVGhpcyBjb2RlCi13b3VsZCBiZSB1c2VkIGlmIHRoZXkgYXJlIHN1cHBsaWVkIGFzIGJsdWUsIGdyZWVuLCByZWQ6Ci0KLSAgICBwbmdfc2V0X2JncihwbmdfcHRyKTsKLQotUE5HIGZpbGVzIGRlc2NyaWJlIG1vbm9jaHJvbWUgYXMgYmxhY2sgYmVpbmcgemVybyBhbmQgd2hpdGUgYmVpbmcKLW9uZS4gVGhpcyBjb2RlIHdvdWxkIGJlIHVzZWQgaWYgdGhlIHBpeGVscyBhcmUgc3VwcGxpZWQgd2l0aCB0aGlzIHJldmVyc2VkCi0oYmxhY2sgYmVpbmcgb25lIGFuZCB3aGl0ZSBiZWluZyB6ZXJvKToKLQotICAgIHBuZ19zZXRfaW52ZXJ0X21vbm8ocG5nX3B0cik7Ci0KLUZpbmFsbHksIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaWYgbm9uZSBvZgotdGhlIGV4aXN0aW5nIG9uZXMgbWVldHMgeW91ciBuZWVkcy4gIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIGEgY2FsbGJhY2sKLXdpdGgKLQotICAgIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4ocG5nX3B0ciwKLSAgICAgICB3cml0ZV90cmFuc2Zvcm1fZm4pOwotCi1Zb3UgbXVzdCBzdXBwbHkgdGhlIGZ1bmN0aW9uCi0KLSAgICB2b2lkIHdyaXRlX3RyYW5zZm9ybV9mbihwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfcm93X2luZm9wCi0gICAgICAgcm93X2luZm8sIHBuZ19ieXRlcCBkYXRhKQotCi1TZWUgcG5ndGVzdC5jIGZvciBhIHdvcmtpbmcgZXhhbXBsZS4gIFlvdXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLWJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBhcmUgcHJvY2Vzc2VkLiAgSWYgc3VwcG9ydGVkCi1saWJwbmcgYWxzbyBzdXBwbGllcyBhbiBpbmZvcm1hdGlvbiByb3V0aW5lIHRoYXQgbWF5IGJlIGNhbGxlZCBmcm9tCi15b3VyIGNhbGxiYWNrOgotCi0gICBwbmdfZ2V0X2N1cnJlbnRfcm93X251bWJlcihwbmdfcHRyKTsKLSAgIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlcihwbmdfcHRyKTsKLQotVGhpcyByZXR1cm5zIHRoZSBjdXJyZW50IHJvdyBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybS4gIFdpdGggaW50ZXJsYWNlZAotaW1hZ2VzIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgcm93IGluIHRoZSBpbnB1dCBzdWItaW1hZ2UgaW1hZ2UuICBVc2UKLVBOR19ST1dfRlJPTV9QQVNTX1JPVyhyb3csIHBhc3MpIGFuZCBQTkdfQ09MX0ZST01fUEFTU19DT0woY29sLCBwYXNzKSB0bwotZmluZCB0aGUgb3V0cHV0IHBpeGVsICh4LHkpIGdpdmVuIGFuIGludGVybGFjZWQgc3ViLWltYWdlIHBpeGVsIChyb3csY29sLHBhc3MpLgotCi1UaGUgZGlzY3Vzc2lvbiBvZiBpbnRlcmxhY2UgaGFuZGxpbmcgYWJvdmUgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8KLXVzZSB0aGVzZSB2YWx1ZXMuCi0KLVlvdSBjYW4gYWxzbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgdXNlciBzdHJ1Y3R1cmUgZm9yIHVzZSBieSB5b3VyCi1jYWxsYmFjayBmdW5jdGlvbi4KLQotICAgIHBuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbyhwbmdfcHRyLCB1c2VyX3B0ciwgMCwgMCk7Ci0KLVRoZSB1c2VyX2NoYW5uZWxzIGFuZCB1c2VyX2RlcHRoIHBhcmFtZXRlcnMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgaWdub3JlZAotd2hlbiB3cml0aW5nOyB5b3UgY2FuIHNldCB0aGVtIHRvIHplcm8gYXMgc2hvd24uCi0KLVlvdSBjYW4gcmV0cmlldmUgdGhlIHBvaW50ZXIgdmlhIHRoZSBmdW5jdGlvbiBwbmdfZ2V0X3VzZXJfdHJhbnNmb3JtX3B0cigpLgotRm9yIGV4YW1wbGU6Ci0KLSAgICB2b2lkcCB3cml0ZV91c2VyX3RyYW5zZm9ybV9wdHIgPQotICAgICAgIHBuZ19nZXRfdXNlcl90cmFuc2Zvcm1fcHRyKHBuZ19wdHIpOwotCi1JdCBpcyBwb3NzaWJsZSB0byBoYXZlIGxpYnBuZyBmbHVzaCBhbnkgcGVuZGluZyBvdXRwdXQsIGVpdGhlciBtYW51YWxseSwKLW9yIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluIG51bWJlciBvZiBsaW5lcyBoYXZlIGJlZW4gd3JpdHRlbi4gIFRvCi1mbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBhIHNpbmdsZSB0aW1lIGNhbGw6Ci0KLSAgICBwbmdfd3JpdGVfZmx1c2gocG5nX3B0cik7Ci0KLWFuZCB0byBoYXZlIGxpYnBuZyBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBwZXJpb2RpY2FsbHkgYWZ0ZXIgYSBjZXJ0YWluCi1udW1iZXIgb2Ygc2NhbmxpbmVzIGhhdmUgYmVlbiB3cml0dGVuLCBjYWxsOgotCi0gICAgcG5nX3NldF9mbHVzaChwbmdfcHRyLCBucm93cyk7Ci0KLU5vdGUgdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiByb3dzIGlzIGZyb20gdGhlIGxhc3QgdGltZSBwbmdfd3JpdGVfZmx1c2goKQotd2FzIGNhbGxlZCwgb3IgdGhlIGZpcnN0IHJvdyBvZiB0aGUgaW1hZ2UgaWYgaXQgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLgotU28gaWYgeW91IHdyaXRlIDUwIGxpbmVzLCBhbmQgdGhlbiBwbmdfc2V0X2ZsdXNoIDI1LCBpdCB3aWxsIGZsdXNoIHRoZQotb3V0cHV0IG9uIHRoZSBuZXh0IHNjYW5saW5lLCBhbmQgZXZlcnkgMjUgbGluZXMgdGhlcmVhZnRlciwgdW5sZXNzCi1wbmdfd3JpdGVfZmx1c2goKSBpcyBjYWxsZWQgYmVmb3JlIDI1IG1vcmUgbGluZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uCi1JZiBucm93cyBpcyB0b28gc21hbGwgKGxlc3MgdGhhbiBhYm91dCAxMCBsaW5lcyBmb3IgYSA2NDAgcGl4ZWwgd2lkZQotUkdCIGltYWdlKSB0aGUgaW1hZ2UgY29tcHJlc3Npb24gbWF5IGRlY3JlYXNlIG5vdGljZWFibHkgKGFsdGhvdWdoIHRoaXMKLW1heSBiZSBhY2NlcHRhYmxlIGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zKS4gIEluZnJlcXVlbnQgZmx1c2hpbmcgd2lsbAotb25seSBkZWdyYWRlIHRoZSBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZSBieSBhIGZldyBwZXJjZW50IG92ZXIgaW1hZ2VzCi10aGF0IGRvIG5vdCB1c2UgZmx1c2hpbmcuCi0KLS5TUyBXcml0aW5nIHRoZSBpbWFnZSBkYXRhCi0KLVRoYXQncyBpdCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9ucy4gIE5vdyB5b3UgY2FuIHdyaXRlIHRoZSBpbWFnZSBkYXRhLgotVGhlIHNpbXBsZXN0IHdheSB0byBkbyB0aGlzIGlzIGluIG9uZSBmdW5jdGlvbiBjYWxsLiAgSWYgeW91IGhhdmUgdGhlCi13aG9sZSBpbWFnZSBpbiBtZW1vcnksIHlvdSBjYW4ganVzdCBjYWxsIHBuZ193cml0ZV9pbWFnZSgpIGFuZCBsaWJwbmcKLXdpbGwgd3JpdGUgdGhlIGltYWdlLiAgWW91IHdpbGwgbmVlZCB0byBwYXNzIGluIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCi1lYWNoIHJvdy4gIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGludGVybGFjaW5nLCBzbyB5b3UgZG9uJ3QKLW5lZWQgdG8gY2FsbCBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZygpIG9yIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZQotdGltZXMsIG9yIGFueSBvZiB0aGF0IG90aGVyIHN0dWZmIG5lY2Vzc2FyeSB3aXRoIHBuZ193cml0ZV9yb3dzKCkuCi0KLSAgICBwbmdfd3JpdGVfaW1hZ2UocG5nX3B0ciwgcm93X3BvaW50ZXJzKTsKLQotd2hlcmUgcm93X3BvaW50ZXJzIGlzOgotCi0gICAgcG5nX2J5dGUgKnJvd19wb2ludGVyc1toZWlnaHRdOwotCi1Zb3UgY2FuIHBvaW50IHRvIHZvaWQgb3IgY2hhciBvciB3aGF0ZXZlciB5b3UgdXNlIGZvciBwaXhlbHMuCi0KLUlmIHlvdSBkb24ndCB3YW50IHRvIHdyaXRlIHRoZSB3aG9sZSBpbWFnZSBhdCBvbmNlLCB5b3UgY2FuCi11c2UgcG5nX3dyaXRlX3Jvd3MoKSBpbnN0ZWFkLiAgSWYgdGhlIGZpbGUgaXMgbm90IGludGVybGFjZWQsCi10aGlzIGlzIHNpbXBsZToKLQotICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywKLSAgICAgICBudW1iZXJfb2Zfcm93cyk7Ci0KLXJvd19wb2ludGVycyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcG5nX3dyaXRlX2ltYWdlKCkgY2FsbC4KLQotSWYgeW91IGFyZSBqdXN0IHdyaXRpbmcgb25lIHJvdyBhdCBhIHRpbWUsIHlvdSBjYW4gZG8gdGhpcyB3aXRoCi1hIHNpbmdsZSByb3dfcG9pbnRlciBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIHJvd19wb2ludGVyczoKLQotICAgIHBuZ19ieXRlcCByb3dfcG9pbnRlciA9IHJvdzsKLQotICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgcm93X3BvaW50ZXIpOwotCi1XaGVuIHRoZSBmaWxlIGlzIGludGVybGFjZWQsIHRoaW5ncyBjYW4gZ2V0IGEgZ29vZCBkZWFsIG1vcmUgY29tcGxpY2F0ZWQuCi1UaGUgb25seSBjdXJyZW50bHkgKGFzIG9mIHRoZSBQTkcgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMiwgZGF0ZWQgSnVseQotMTk5OSkgZGVmaW5lZCBpbnRlcmxhY2luZyBzY2hlbWUgZm9yIFBORyBmaWxlcyBpcyB0aGUgIkFkYW03IiBpbnRlcmxhY2UKLXNjaGVtZSwgdGhhdCBicmVha3MgZG93biBhbiBpbWFnZSBpbnRvIHNldmVuIHNtYWxsZXIgaW1hZ2VzIG9mIHZhcnlpbmcKLXNpemUuICBsaWJwbmcgd2lsbCBidWlsZCB0aGVzZSBpbWFnZXMgZm9yIHlvdSwgb3IgeW91IGNhbiBkbyB0aGVtCi15b3Vyc2VsZi4gIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZW0geW91cnNlbGYsIHNlZSB0aGUgUE5HIHNwZWNpZmljYXRpb24KLWZvciBkZXRhaWxzIG9mIHdoaWNoIHBpeGVscyB0byB3cml0ZSB3aGVuLgotCi1JZiB5b3UgZG9uJ3Qgd2FudCBsaWJwbmcgdG8gaGFuZGxlIHRoZSBpbnRlcmxhY2luZyBkZXRhaWxzLCBqdXN0Ci11c2UgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBhbmQgY2FsbCBwbmdfd3JpdGVfcm93cygpIHRoZQotY29ycmVjdCBudW1iZXIgb2YgdGltZXMgdG8gd3JpdGUgYWxsIHRoZSBzdWItaW1hZ2VzCi0ocG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViLWltYWdlcy4pCi0KLUlmIHlvdSB3YW50IGxpYnBuZyB0byBidWlsZCB0aGUgc3ViLWltYWdlcywgY2FsbCB0aGlzIGJlZm9yZSB5b3Ugc3RhcnQKLXdyaXRpbmcgYW55IHJvd3M6Ci0KLSAgICBudW1iZXJfb2ZfcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXNzZXMgbmVlZGVkLiAgQ3VycmVudGx5LCB0aGlzIGlzIHNldmVuLAotYnV0IG1heSBjaGFuZ2UgaWYgYW5vdGhlciBpbnRlcmxhY2UgdHlwZSBpcyBhZGRlZC4KLQotVGhlbiB3cml0ZSB0aGUgY29tcGxldGUgaW1hZ2UgbnVtYmVyX29mX3Bhc3NlcyB0aW1lcy4KLQotICAgIHBuZ193cml0ZV9yb3dzKHBuZ19wdHIsIHJvd19wb2ludGVycywgbnVtYmVyX29mX3Jvd3MpOwotCi1UaGluayBjYXJlZnVsbHkgYmVmb3JlIHlvdSB3cml0ZSBhbiBpbnRlcmxhY2VkIGltYWdlLiAgVHlwaWNhbGx5IGNvZGUgdGhhdAotcmVhZHMgc3VjaCBpbWFnZXMgcmVhZHMgYWxsIHRoZSBpbWFnZSBkYXRhIGludG8gbWVtb3J5LCB1bmNvbXByZXNzZWQsIGJlZm9yZQotZG9pbmcgYW55IHByb2Nlc3NpbmcuICBPbmx5IGNvZGUgdGhhdCBjYW4gZGlzcGxheSBhbiBpbWFnZSBvbiB0aGUgZmx5IGNhbgotdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGludGVybGFjaW5nIGFuZCBldmVuIHRoZW4gdGhlIGltYWdlIGhhcyB0byBiZSBleGFjdGx5Ci10aGUgY29ycmVjdCBzaXplIGZvciB0aGUgb3V0cHV0IGRldmljZSwgYmVjYXVzZSBzY2FsaW5nIGFuIGltYWdlIHJlcXVpcmVzCi1hZGphY2VudCBwaXhlbHMgYW5kIHRoZXNlIGFyZSBub3QgYXZhaWxhYmxlIHVudGlsIGFsbCB0aGUgcGFzc2VzIGhhdmUgYmVlbgotcmVhZC4KLQotSWYgeW91IGRvIHdyaXRlIGFuIGludGVybGFjZWQgaW1hZ2UgeW91IHdpbGwgaGFyZGx5IGV2ZXIgbmVlZCB0byBoYW5kbGUKLXRoZSBpbnRlcmxhY2luZyB5b3Vyc2VsZi4gIENhbGwgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoKSBhbmQgdXNlIHRoZQotYXBwcm9hY2ggZGVzY3JpYmVkIGFib3ZlLgotCi1UaGUgb25seSB0aW1lIGl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgeW91IHdpbGwgcmVhbGx5IG5lZWQgdG8gd3JpdGUgYW4KLWludGVybGFjZWQgaW1hZ2UgcGFzcy1ieS1wYXNzIGlzIHdoZW4geW91IGhhdmUgcmVhZCBvbmUgcGFzcyBieSBwYXNzIGFuZAotbWFkZSBzb21lIHBpeGVsLWJ5LXBpeGVsIHRyYW5zZm9ybWF0aW9uIHRvIGl0LCBhcyBkZXNjcmliZWQgaW4gdGhlIHJlYWQKLWNvZGUgYWJvdmUuICBJbiB0aGlzIGNhc2UgdXNlIHRoZSBQTkdfUEFTU19ST1dTIGFuZCBQTkdfUEFTU19DT0xTIG1hY3JvcwotdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGVhY2ggc3ViLWltYWdlIGluIHR1cm4gYW5kIHNpbXBseSB3cml0ZSB0aGUgcm93cwoteW91IG9idGFpbmVkIGZyb20gdGhlIHJlYWQgY29kZS4KLQotLlNTIEZpbmlzaGluZyBhIHNlcXVlbnRpYWwgd3JpdGUKLQotQWZ0ZXIgeW91IGFyZSBmaW5pc2hlZCB3cml0aW5nIHRoZSBpbWFnZSwgeW91IHNob3VsZCBmaW5pc2ggd3JpdGluZwotdGhlIGZpbGUuICBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd3JpdGluZyBjb21tZW50cyBvciB0aW1lLCB5b3Ugc2hvdWxkCi1wYXNzIGFuIGFwcHJvcHJpYXRlbHkgZmlsbGVkIHBuZ19pbmZvIHBvaW50ZXIuICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkLAoteW91IGNhbiBwYXNzIE5VTEwuCi0KLSAgICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLQotV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSBjYW4gZnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgbGlicG5nIGxpa2UgdGhpczoKLQotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmRpdmlkdWFsbHkgZnJlZSB0aGUgaW5mb19wdHIgbWVtYmVycyB0aGF0Ci1wb2ludCB0byBsaWJwbmctYWxsb2NhdGVkIHN0b3JhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgotCi0gICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgbWFzaywgc2VxKQotCi0gICAgbWFzayAgLSBpZGVudGlmaWVzIGRhdGEgdG8gYmUgZnJlZWQsIGEgbWFzawotICAgICAgICAgICAgY29udGFpbmluZyB0aGUgYml0d2lzZSBPUiBvZiBvbmUgb3IKLSAgICAgICAgICAgIG1vcmUgb2YKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfUExURSwgUE5HX0ZSRUVfVFJOUywKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfSElTVCwgUE5HX0ZSRUVfSUNDUCwKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfUENBTCwgUE5HX0ZSRUVfUk9XUywKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfU0NBTCwgUE5HX0ZSRUVfU1BMVCwKLSAgICAgICAgICAgICAgUE5HX0ZSRUVfVEVYVCwgUE5HX0ZSRUVfVU5LTiwKLSAgICAgICAgICAgIG9yIHNpbXBseSBQTkdfRlJFRV9BTEwKLQotICAgIHNlcSAgIC0gc2VxdWVuY2UgbnVtYmVyIG9mIGl0ZW0gdG8gYmUgZnJlZWQKLSAgICAgICAgICAgIChcLTEgZm9yIGFsbCBpdGVtcykKLQotVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCB3aGVuIHRoZSByZWxldmFudCBzdG9yYWdlIGhhcwotYWxyZWFkeSBiZWVuIGZyZWVkLCBvciBoYXMgbm90IHlldCBiZWVuIGFsbG9jYXRlZCwgb3Igd2FzIGFsbG9jYXRlZAotYnkgdGhlIHVzZXIgIGFuZCBub3QgYnkgbGlicG5nLCAgYW5kIHdpbGwgaW4gdGhvc2UgY2FzZXMgZG8gbm90aGluZy4KLVRoZSAic2VxIiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiBvbmx5IG9uZSBpdGVtIG9mIHRoZSBzZWxlY3RlZCBkYXRhCi10eXBlLCBzdWNoIGFzIFBMVEUsIGlzIGFsbG93ZWQuICBJZiAic2VxIiBpcyBub3QgXC0xLCBhbmQgbXVsdGlwbGUgaXRlbXMKLWFyZSBhbGxvd2VkIGZvciB0aGUgZGF0YSB0eXBlIGlkZW50aWZpZWQgaW4gdGhlIG1hc2ssIHN1Y2ggYXMgdGV4dCBvcgotc1BMVCwgb25seSB0aGUgbid0aCBpdGVtIGluIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIHdoZXJlIG4gaXMgInNlcSIuCi0KLUlmIHlvdSBhbGxvY2F0ZWQgZGF0YSBzdWNoIGFzIGEgcGFsZXR0ZSB0aGF0IHlvdSBwYXNzZWQgaW4gdG8gbGlicG5nCi13aXRoIHBuZ19zZXRfKiwgeW91IG11c3Qgbm90IGZyZWUgaXQgdW50aWwganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8KLXBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpLgotCi1UaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBvbmx5IHRvIGZyZWUgZGF0YSB0aGF0IHdhcyBhbGxvY2F0ZWQgaW50ZXJuYWxseQotYnkgbGlicG5nLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCwgc28gdGhhdCBsaWJwbmcgd2lsbCBub3QgZnJlZSB0aGUgZGF0YSwKLW9yIHNvIHRoYXQgaXQgd2lsbCBmcmVlIGRhdGEgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIHdpdGggcG5nX21hbGxvYygpCi1vciBwbmdfY2FsbG9jKCkgYW5kIHBhc3NlZCBpbiB2aWEgYSBwbmdfc2V0XyooKSBmdW5jdGlvbiwgd2l0aAotCi0gICAgcG5nX2RhdGFfZnJlZXIocG5nX3B0ciwgaW5mb19wdHIsIGZyZWVyLCBtYXNrKQotCi0gICAgZnJlZXIgIC0gb25lIG9mCi0gICAgICAgICAgICAgICBQTkdfREVTVFJPWV9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQQotICAgICAgICAgICAgICAgUE5HX1VTRVJfV0lMTF9GUkVFX0RBVEEKLQotICAgIG1hc2sgICAtIHdoaWNoIGRhdGEgZWxlbWVudHMgYXJlIGFmZmVjdGVkCi0gICAgICAgICAgICAgc2FtZSBjaG9pY2VzIGFzIGluIHBuZ19mcmVlX2RhdGEoKQotCi1Gb3IgZXhhbXBsZSwgdG8gdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIHNvbWUgZGF0YSBmcm9tIGEgcmVhZCBzdHJ1Y3R1cmUKLXRvIGEgd3JpdGUgc3RydWN0dXJlLCB5b3UgY291bGQgdXNlCi0KLSAgICBwbmdfZGF0YV9mcmVlcihyZWFkX3B0ciwgcmVhZF9pbmZvX3B0ciwKLSAgICAgICBQTkdfVVNFUl9XSUxMX0ZSRUVfREFUQSwKLSAgICAgICBQTkdfRlJFRV9QTFRFfFBOR19GUkVFX3RSTlN8UE5HX0ZSRUVfaElTVCkKLQotICAgIHBuZ19kYXRhX2ZyZWVyKHdyaXRlX3B0ciwgd3JpdGVfaW5mb19wdHIsCi0gICAgICAgUE5HX0RFU1RST1lfV0lMTF9GUkVFX0RBVEEsCi0gICAgICAgUE5HX0ZSRUVfUExURXxQTkdfRlJFRV90Uk5TfFBOR19GUkVFX2hJU1QpCi0KLXRoZXJlYnkgYnJpZWZseSByZWFzc2lnbmluZyByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0byB0aGUgdXNlciBidXQKLWltbWVkaWF0ZWx5IGFmdGVyd2FyZHMgcmVhc3NpZ25pbmcgaXQgb25jZSBtb3JlIHRvIHRoZSB3cml0ZV9kZXN0cm95Ci1mdW5jdGlvbi4gIEhhdmluZyBkb25lIHRoaXMsIGl0IHdvdWxkIHRoZW4gYmUgc2FmZSB0byBkZXN0cm95IHRoZSByZWFkCi1zdHJ1Y3R1cmUgYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgUExURSwgdFJOUywgYW5kIGhJU1QgZGF0YSBpbiB0aGUgd3JpdGUKLXN0cnVjdHVyZS4KLQotVGhpcyBmdW5jdGlvbiBvbmx5IGFmZmVjdHMgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLgotWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgYWZ0ZXIgdGhlIHBuZ19zZXRfKigpIGZ1bmN0aW9ucwotdG8gY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG9yIHBuZ19kZXN0cm95XyooKSBpcyBzdXBwb3NlZCB0byBmcmVlIHRoZSBkYXRhLgotV2hlbiB0aGUgdXNlciBhc3N1bWVzIHJlc3BvbnNpYmlsaXR5IGZvciBsaWJwbmctYWxsb2NhdGVkIGRhdGEsIHRoZQotYXBwbGljYXRpb24gbXVzdCB1c2UKLXBuZ19mcmVlKCkgdG8gZnJlZSBpdCwgYW5kIHdoZW4gdGhlIHVzZXIgdHJhbnNmZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGxpYnBuZwotZm9yIGRhdGEgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkLCB0aGUgdXNlciBtdXN0IGhhdmUgdXNlZCBwbmdfbWFsbG9jKCkKLW9yIHBuZ19jYWxsb2MoKSB0byBhbGxvY2F0ZSBpdC4KLQotSWYgeW91IGFsbG9jYXRlZCB0ZXh0X3B0ci50ZXh0LCB0ZXh0X3B0ci5sYW5nLCBhbmQgdGV4dF9wdHIudHJhbnNsYXRlZF9rZXl3b3JkCi1zZXBhcmF0ZWx5LCBkbyBub3QgdHJhbnNmZXIgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgdGV4dF9wdHIgdG8gbGlicG5nLAotYmVjYXVzZSB3aGVuIGxpYnBuZyBmaWxscyBhIHBuZ190ZXh0IHN0cnVjdHVyZSBpdCBjb21iaW5lcyB0aGVzZSBtZW1iZXJzIHdpdGgKLXRoZSBrZXkgbWVtYmVyLCBhbmQgcG5nX2ZyZWVfZGF0YSgpIHdpbGwgZnJlZSBvbmx5IHRleHRfcHRyLmtleS4gIFNpbWlsYXJseSwKLWlmIHlvdSB0cmFuc2ZlciByZXNwb25zaWJpbGl0eSBmb3IgZnJlZSdpbmcgdGV4dF9wdHIgZnJvbSBsaWJwbmcgdG8geW91cgotYXBwbGljYXRpb24sIHlvdXIgYXBwbGljYXRpb24gbXVzdCBub3Qgc2VwYXJhdGVseSBmcmVlIHRob3NlIG1lbWJlcnMuCi1Gb3IgYSBtb3JlIGNvbXBhY3QgZXhhbXBsZSBvZiB3cml0aW5nIGEgUE5HIGltYWdlLCBzZWUgdGhlIGZpbGUgZXhhbXBsZS5jLgotCi0uU0ggVi4gU2ltcGxpZmllZCBBUEkKLQotVGhlIHNpbXBsaWZpZWQgQVBJLCB3aGljaCBiZWNhbWUgYXZhaWxhYmxlIGluIGxpYnBuZy0xLjYuMCwgaGlkZXMgdGhlIGRldGFpbHMKLW9mIGJvdGggbGlicG5nIGFuZCB0aGUgUE5HIGZpbGUgZm9ybWF0IGl0c2VsZi4KLUl0IGFsbG93cyBQTkcgZmlsZXMgdG8gYmUgcmVhZCBpbnRvIGEgdmVyeSBsaW1pdGVkIG51bWJlciBvZgotaW4tbWVtb3J5IGJpdG1hcCBmb3JtYXRzIG9yIHRvIGJlIHdyaXR0ZW4gZnJvbSB0aGUgc2FtZSBmb3JtYXRzLiAgSWYgdGhlc2UKLWZvcm1hdHMgZG8gbm90IGFjY29tbW9kYXRlIHlvdXIgbmVlZHMgdGhlbiB5b3UgY2FuLCBhbmQgc2hvdWxkLCB1c2UgdGhlIG1vcmUKLXNvcGhpc3RpY2F0ZWQgQVBJcyBhYm92ZSAtIHRoZXNlIHN1cHBvcnQgYSB3aWRlIHZhcmlldHkgb2YgaW4tbWVtb3J5IGZvcm1hdHMKLWFuZCBhIHdpZGUgdmFyaWV0eSBvZiBzb3BoaXN0aWNhdGVkIHRyYW5zZm9ybWF0aW9ucyB0byB0aG9zZSBmb3JtYXRzIGFzIHdlbGwKLWFzIGEgd2lkZSB2YXJpZXR5IG9mIEFQSXMgdG8gbWFuaXB1bGF0ZSBhbmNpbGxpYXJ5IGluZm9ybWF0aW9uLgotCi1UbyByZWFkIGEgUE5HIGZpbGUgdXNpbmcgdGhlIHNpbXBsaWZpZWQgQVBJOgotCi0gIDEpIERlY2xhcmUgYSAncG5nX2ltYWdlJyBzdHJ1Y3R1cmUgKHNlZSBiZWxvdykgb24gdGhlIHN0YWNrLCBzZXQgdGhlCi0gICAgIHZlcnNpb24gZmllbGQgdG8gUE5HX0lNQUdFX1ZFUlNJT04gYW5kIHRoZSAnb3BhcXVlJyBwb2ludGVyIHRvIE5VTEwKLSAgICAgKHRoaXMgaXMgUkVRVUlSRUQsIHlvdXIgcHJvZ3JhbSBtYXkgY3Jhc2ggaWYgeW91IGRvbid0IGRvIGl0LikKLQotICAyKSBDYWxsIHRoZSBhcHByb3ByaWF0ZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZC4uLiBmdW5jdGlvbi4KLQotICAzKSBTZXQgdGhlIHBuZ19pbWFnZSAnZm9ybWF0JyBtZW1iZXIgdG8gdGhlIHJlcXVpcmVkIHNhbXBsZSBmb3JtYXQuCi0KLSAgNCkgQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBpbWFnZSBhbmQsIGlmIHJlcXVpcmVkLCB0aGUgY29sb3ItbWFwLgotCi0gIDUpIENhbGwgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkIHRvIHJlYWQgdGhlIGltYWdlIGFuZCwgaWYgcmVxdWlyZWQsIHRoZQotICAgICBjb2xvci1tYXAgaW50byB5b3VyIGJ1ZmZlcnMuCi0KLVRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGZvcm1hdCBvZiB0aGUgUE5HIGlucHV0IGl0c2VsZjsgYWxsIHZhbGlkCi1jb2xvciB0eXBlcywgYml0IGRlcHRocywgYW5kIGludGVybGFjZSBtZXRob2RzIGFyZSBhY2NlcHRhYmxlLCBhbmQgdGhlCi1pbnB1dCBpbWFnZSBpcyB0cmFuc2Zvcm1lZCBhcyBuZWNlc3NhcnkgdG8gdGhlIHJlcXVlc3RlZCBpbi1tZW1vcnkgZm9ybWF0Ci1kdXJpbmcgdGhlIHBuZ19pbWFnZV9maW5pc2hfcmVhZCgpIHN0ZXAuICBUaGUgb25seSBjYXZlYXQgaXMgdGhhdCBpZiB5b3UKLXJlcXVlc3QgYSBjb2xvci1tYXBwZWQgaW1hZ2UgZnJvbSBhIFBORyB0aGF0IGlzIGZ1bGwtY29sb3Igb3IgbWFrZXMKLWNvbXBsZXggdXNlIG9mIGFuIGFscGhhIGNoYW5uZWwgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGV4dHJlbWVseSBsb3NzeSBhbmQgdGhlCi1yZXN1bHQgbWF5IGxvb2sgdGVycmlibGUuCi0KLVRvIHdyaXRlIGEgUE5HIGZpbGUgdXNpbmcgdGhlIHNpbXBsaWZpZWQgQVBJOgotCi0gIDEpIERlY2xhcmUgYSAncG5nX2ltYWdlJyBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrIGFuZCBtZW1zZXQoKQotICAgICBpdCB0byBhbGwgemVyby4KLQotICAyKSBJbml0aWFsaXplIHRoZSBtZW1iZXJzIG9mIHRoZSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZSB0aGUKLSAgICAgaW1hZ2UsIHNldHRpbmcgdGhlICdmb3JtYXQnIG1lbWJlciB0byB0aGUgZm9ybWF0IG9mIHRoZQotICAgICBpbWFnZSBzYW1wbGVzLgotCi0gIDMpIENhbGwgdGhlIGFwcHJvcHJpYXRlIHBuZ19pbWFnZV93cml0ZS4uLiBmdW5jdGlvbiB3aXRoIGEKLSAgICAgcG9pbnRlciB0byB0aGUgaW1hZ2UgYW5kLCBpZiBuZWNlc3NhcnksIHRoZSBjb2xvci1tYXAgdG8gd3JpdGUKLSAgICAgdGhlIFBORyBkYXRhLgotCi1wbmdfaW1hZ2UgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgdGhlIGluLW1lbW9yeSBmb3JtYXQgb2YgYW4gaW1hZ2UKLXdoZW4gaXQgaXMgYmVpbmcgcmVhZCBvciBkZWZpbmVzIHRoZSBpbi1tZW1vcnkgZm9ybWF0IG9mIGFuIGltYWdlIHRoYXQgeW91Ci1uZWVkIHRvIHdyaXRlLiAgVGhlICJwbmdfaW1hZ2UiIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6Ci0KLSAgIHBuZ19jb250cm9scCBvcGFxdWUgIEluaXRpYWxpemUgdG8gTlVMTCwgZnJlZSB3aXRoIHBuZ19pbWFnZV9mcmVlCi0gICBwbmdfdWludF8zMiAgdmVyc2lvbiBTZXQgdG8gUE5HX0lNQUdFX1ZFUlNJT04KLSAgIHBuZ191aW50XzMyICB3aWR0aCAgIEltYWdlIHdpZHRoIGluIHBpeGVscyAoY29sdW1ucykKLSAgIHBuZ191aW50XzMyICBoZWlnaHQgIEltYWdlIGhlaWdodCBpbiBwaXhlbHMgKHJvd3MpCi0gICBwbmdfdWludF8zMiAgZm9ybWF0ICBJbWFnZSBmb3JtYXQgYXMgZGVmaW5lZCBiZWxvdwotICAgcG5nX3VpbnRfMzIgIGZsYWdzICAgQSBiaXQgbWFzayBjb250YWluaW5nIGluZm9ybWF0aW9uYWwgZmxhZ3MKLSAgIHBuZ191aW50XzMyICBjb2xvcm1hcF9lbnRyaWVzOyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29sb3ItbWFwCi0gICBwbmdfdWludF8zMiAgd2FybmluZ19vcl9lcnJvcjsKLSAgIGNoYXIgICAgICAgICBtZXNzYWdlWzY0XTsKLQotSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIG9yIHdhcm5pbmcgdGhlICJ3YXJuaW5nX29yX2Vycm9yIgotZmllbGQgd2lsbCBiZSBzZXQgdG8gYSBub24temVybyB2YWx1ZSBhbmQgdGhlICdtZXNzYWdlJyBmaWVsZCB3aWxsIGNvbnRhaW4KLWEgJ1wwJyB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBsaWJwbmcgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLiAgSWYgYm90aAotd2FybmluZ3MgYW5kIGFuIGVycm9yIHdlcmUgZW5jb3VudGVyZWQsIG9ubHkgdGhlIGVycm9yIGlzIHJlY29yZGVkLiAgSWYgdGhlcmUKLWFyZSBtdWx0aXBsZSB3YXJuaW5ncywgb25seSB0aGUgZmlyc3Qgb25lIGlzIHJlY29yZGVkLgotCi1UaGUgdXBwZXIgMzAgYml0cyBvZiB0aGUgIndhcm5pbmdfb3JfZXJyb3IiIHZhbHVlIGFyZSByZXNlcnZlZDsgdGhlIGxvdyB0d28KLWJpdHMgY29udGFpbiBhIHR3byBiaXQgY29kZSBzdWNoIHRoYXQgYSB2YWx1ZSBtb3JlIHRoYW4gMSBpbmRpY2F0ZXMgYSBmYWlsdXJlCi1pbiB0aGUgQVBJIGp1c3QgY2FsbGVkOgotCi0gICAwIC0gbm8gd2FybmluZyBvciBlcnJvcgotICAgMSAtIHdhcm5pbmcKLSAgIDIgLSBlcnJvcgotICAgMyAtIGVycm9yIHByZWNlZGVkIGJ5IHdhcm5pbmcKLQotVGhlIHBpeGVscyAoc2FtcGxlcykgb2YgdGhlIGltYWdlIGhhdmUgb25lIHRvIGZvdXIgY2hhbm5lbHMgd2hvc2UgY29tcG9uZW50cwotaGF2ZSBvcmlnaW5hbCB2YWx1ZXMgaW4gdGhlIHJhbmdlIDAgdG8gMS4wOgotCi0gIDE6IEEgc2luZ2xlIGdyYXkgb3IgbHVtaW5hbmNlIGNoYW5uZWwgKEcpLgotICAyOiBBIGdyYXkvbHVtaW5hbmNlIGNoYW5uZWwgYW5kIGFuIGFscGhhIGNoYW5uZWwgKEdBKS4KLSAgMzogVGhyZWUgcmVkLCBncmVlbiwgYmx1ZSBjb2xvciBjaGFubmVscyAoUkdCKS4KLSAgNDogVGhyZWUgY29sb3IgY2hhbm5lbHMgYW5kIGFuIGFscGhhIGNoYW5uZWwgKFJHQkEpLgotCi1UaGUgY2hhbm5lbHMgYXJlIGVuY29kZWQgaW4gb25lIG9mIHR3byB3YXlzOgotCi0gIGEpIEFzIGEgc21hbGwgaW50ZWdlciwgdmFsdWUgMC4uMjU1LCBjb250YWluZWQgaW4gYSBzaW5nbGUgYnl0ZS4gIEZvciB0aGUKLWFscGhhIGNoYW5uZWwgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIHNpbXBseSB2YWx1ZS8yNTUuICBGb3IgdGhlIGNvbG9yIG9yCi1sdW1pbmFuY2UgY2hhbm5lbHMgdGhlIHZhbHVlIGlzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzUkdCIHNwZWNpZmljYXRpb24KLWFuZCBtYXRjaGVzIHRoZSA4LWJpdCBmb3JtYXQgZXhwZWN0ZWQgYnkgdHlwaWNhbCBkaXNwbGF5IGRldmljZXMuCi0KLVRoZSBjb2xvci9ncmF5IGNoYW5uZWxzIGFyZSBub3Qgc2NhbGVkIChwcmUtbXVsdGlwbGllZCkgYnkgdGhlIGFscGhhCi1jaGFubmVsIGFuZCBhcmUgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gY29sb3IgbWFuYWdlbWVudCBzb2Z0d2FyZS4KLQotICBiKSBBcyBhIHZhbHVlIGluIHRoZSByYW5nZSAwLi42NTUzNSwgY29udGFpbmVkIGluIGEgMi1ieXRlIGludGVnZXIsIGluCi10aGUgbmF0aXZlIGJ5dGUgb3JkZXIgb2YgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLgotQWxsIGNoYW5uZWxzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIGJ5IGRpdmlkaW5nIGJ5IDY1NTM1OyBhbGwKLWNoYW5uZWxzIGFyZSBsaW5lYXIuICBDb2xvciBjaGFubmVscyB1c2UgdGhlIFJHQiBlbmNvZGluZyAoUkdCIGVuZC1wb2ludHMpIG9mCi10aGUgc1JHQiBzcGVjaWZpY2F0aW9uLiAgVGhpcyBlbmNvZGluZyBpcyBpZGVudGlmaWVkIGJ5IHRoZQotUE5HX0ZPUk1BVF9GTEFHX0xJTkVBUiBmbGFnIGJlbG93LgotCi1XaGVuIHRoZSBzaW1wbGlmaWVkIEFQSSBuZWVkcyB0byBjb252ZXJ0IGJldHdlZW4gc1JHQiBhbmQgbGluZWFyIGNvbG9yc3BhY2VzLAotdGhlIGFjdHVhbCBzUkdCIHRyYW5zZmVyIGN1cnZlIGRlZmluZWQgaW4gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiAoc2VlIHRoZQotYXJ0aWNsZSBhdCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NSR0IpIGlzIHVzZWQsIG5vdCB0aGUgZ2FtbWE9MS8yLjIKLWFwcHJveGltYXRpb24gdXNlZCBlbHNld2hlcmUgaW4gbGlicG5nLgotCi1XaGVuIGFuIGFscGhhIGNoYW5uZWwgaXMgcHJlc2VudCBpdCBpcyBleHBlY3RlZCB0byBkZW5vdGUgcGl4ZWwgY292ZXJhZ2UKLW9mIHRoZSBjb2xvciBvciBsdW1pbmFuY2UgY2hhbm5lbHMgYW5kIGlzIHJldHVybmVkIGFzIGFuIGFzc29jaWF0ZWQgYWxwaGEKLWNoYW5uZWw6IHRoZSBjb2xvci9ncmF5IGNoYW5uZWxzIGFyZSBzY2FsZWQgKHByZS1tdWx0aXBsaWVkKSBieSB0aGUgYWxwaGEKLXZhbHVlLgotCi1UaGUgc2FtcGxlcyBhcmUgZWl0aGVyIGNvbnRhaW5lZCBkaXJlY3RseSBpbiB0aGUgaW1hZ2UgZGF0YSwgYmV0d2VlbiAxIGFuZCA4Ci1ieXRlcyBwZXIgcGl4ZWwgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZywgb3IgYXJlIGhlbGQgaW4gYSBjb2xvci1tYXAgaW5kZXhlZAotYnkgYnl0ZXMgaW4gdGhlIGltYWdlIGRhdGEuICBJbiB0aGUgY2FzZSBvZiBhIGNvbG9yLW1hcCB0aGUgY29sb3ItbWFwIGVudHJpZXMKLWFyZSBpbmRpdmlkdWFsIHNhbXBsZXMsIGVuY29kZWQgYXMgYWJvdmUsIGFuZCB0aGUgaW1hZ2UgZGF0YSBoYXMgb25lIGJ5dGUgcGVyCi1waXhlbCB0byBzZWxlY3QgdGhlIHJlbGV2YW50IHNhbXBsZSBmcm9tIHRoZSBjb2xvci1tYXAuCi0KLVBOR19GT1JNQVRfKgotCi1UaGUgI2RlZmluZXMgdG8gYmUgdXNlZCBpbiBwbmdfaW1hZ2U6OmZvcm1hdC4gIEVhY2ggI2RlZmluZSBpZGVudGlmaWVzIGEKLXBhcnRpY3VsYXIgbGF5b3V0IG9mIGNoYW5uZWwgZGF0YSBhbmQsIGlmIHByZXNlbnQsIGFscGhhIHZhbHVlcy4gIFRoZXJlIGFyZQotc2VwYXJhdGUgZGVmaW5lcyBmb3IgZWFjaCBvZiB0aGUgdHdvIGNvbXBvbmVudCBlbmNvZGluZ3MuCi0KLUEgZm9ybWF0IGlzIGJ1aWx0IHVwIHVzaW5nIHNpbmdsZSBiaXQgZmxhZyB2YWx1ZXMuICBBbGwgY29tYmluYXRpb25zIGFyZQotdmFsaWQuICBGb3JtYXRzIGNhbiBiZSBidWlsdCB1cCBmcm9tIHRoZSBmbGFnIHZhbHVlcyBvciB5b3UgY2FuIHVzZSBvbmUgb2YKLXRoZSBwcmVkZWZpbmVkIHZhbHVlcyBiZWxvdy4gIFdoZW4gdGVzdGluZyBmb3JtYXRzIGFsd2F5cyB1c2UgdGhlIEZPUk1BVF9GTEFHCi1tYWNyb3MgdG8gdGVzdCBmb3IgaW5kaXZpZHVhbCBmZWF0dXJlcyAtIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBtYXkKLWFkZCBuZXcgZmxhZ3MuCi0KLVdoZW4gcmVhZGluZyBvciB3cml0aW5nIGNvbG9yLW1hcHBlZCBpbWFnZXMgdGhlIGZvcm1hdCBzaG91bGQgYmUgc2V0IHRvIHRoZQotZm9ybWF0IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgdGhlbiBwbmdfaW1hZ2Vfe3JlYWQsd3JpdGV9X2NvbG9ybWFwCi1jYWxsZWQgdG8gcmVhZCBvciB3cml0ZSB0aGUgY29sb3ItbWFwIGFuZCBzZXQgdGhlIGZvcm1hdCBjb3JyZWN0bHkgZm9yIHRoZQotaW1hZ2UgZGF0YS4gIERvIG5vdCBzZXQgdGhlIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCBiaXQgZGlyZWN0bHkhCi0KLU5PVEU6IGxpYnBuZyBjYW4gYmUgYnVpbHQgd2l0aCBwYXJ0aWN1bGFyIGZlYXR1cmVzIGRpc2FibGVkLiBJZiB5b3Ugc2VlCi1jb21waWxlciBlcnJvcnMgYmVjYXVzZSB0aGUgZGVmaW5pdGlvbiBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFncyBoYXMgYmVlbgotY29tcGlsZWQgb3V0IGl0IGlzIGJlY2F1c2UgbGlicG5nIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIHN1cHBvcnQuICBJdCBpcwotcG9zc2libGUsIGhvd2V2ZXIsIGZvciB0aGUgbGlicG5nIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHRoZSBmb3JtYXQgb24ganVzdAotcmVhZCBvciBqdXN0IHdyaXRlOyBpbiB0aGF0IGNhc2UgeW91IG1heSBzZWUgYW4gZXJyb3IgYXQgcnVuIHRpbWUuCi1Zb3UgY2FuIGd1YXJkIGFnYWluc3QgdGhpcyBieSBjaGVja2luZyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlCi1hcHByb3ByaWF0ZSAiX1NVUFBPUlRFRCIgbWFjcm8sIG9uZSBvZjoKLQotICAgUE5HX1NJTVBMSUZJRURfe1JFQUQsV1JJVEV9X3tCR1IsQUZJUlNUfV9TVVBQT1JURUQKLQotICAgUE5HX0ZPUk1BVF9GTEFHX0FMUEhBICAgIGZvcm1hdCB3aXRoIGFuIGFscGhhIGNoYW5uZWwKLSAgIFBOR19GT1JNQVRfRkxBR19DT0xPUiAgICBjb2xvciBmb3JtYXQ6IG90aGVyd2lzZSBncmF5c2NhbGUKLSAgIFBOR19GT1JNQVRfRkxBR19MSU5FQVIgICAyLWJ5dGUgY2hhbm5lbHMgZWxzZSAxLWJ5dGUKLSAgIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCBpbWFnZSBkYXRhIGlzIGNvbG9yLW1hcHBlZAotICAgUE5HX0ZPUk1BVF9GTEFHX0JHUiAgICAgIEJHUiBjb2xvcnMsIGVsc2Ugb3JkZXIgaXMgUkdCCi0gICBQTkdfRk9STUFUX0ZMQUdfQUZJUlNUICAgYWxwaGEgY2hhbm5lbCBjb21lcyBmaXJzdAotCi1TdXBwb3J0ZWQgZm9ybWF0cyBhcmUgYXMgZm9sbG93cy4gIEZ1dHVyZSB2ZXJzaW9ucyBvZiBsaWJwbmcgbWF5IHN1cHBvcnQgbW9yZQotZm9ybWF0czsgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgY2hlY2sgaWYgdGhlIGZvcm1hdAotbWFjcm8gaXMgZGVmaW5lZCB1c2luZyAjaWZkZWYuICBUaGVzZSBkZWZpbmVzIGRlc2NyaWJlIHRoZSBpbi1tZW1vcnkgbGF5b3V0Ci1vZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgcGl4ZWxzIG9mIHRoZSBpbWFnZS4KLQotRmlyc3QgdGhlIHNpbmdsZSBieXRlIChzUkdCKSBmb3JtYXRzOgotCi0gICBQTkdfRk9STUFUX0dSQVkKLSAgIFBOR19GT1JNQVRfR0EKLSAgIFBOR19GT1JNQVRfQUcKLSAgIFBOR19GT1JNQVRfUkdCCi0gICBQTkdfRk9STUFUX0JHUgotICAgUE5HX0ZPUk1BVF9SR0JBCi0gICBQTkdfRk9STUFUX0FSR0IKLSAgIFBOR19GT1JNQVRfQkdSQQotICAgUE5HX0ZPUk1BVF9BQkdSCi0KLVRoZW4gdGhlIGxpbmVhciAyLWJ5dGUgZm9ybWF0cy4gIFdoZW4gbmFtaW5nIHRoZXNlICJZIiBpcyB1c2VkIHRvCi1pbmRpY2F0ZSBhIGx1bWluYW5jZSAoZ3JheSkgY2hhbm5lbC4gIFRoZSBjb21wb25lbnQgb3JkZXIgd2l0aGluIHRoZSBwaXhlbAotaXMgYWx3YXlzIHRoZSBzYW1lIC0gdGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvciBzd2FwcGluZyB0aGUgb3JkZXIgb2YgdGhlCi1jb21wb25lbnRzIGluIHRoZSBsaW5lYXIgZm9ybWF0LiAgVGhlIGNvbXBvbmVudHMgYXJlIDE2LWJpdCBpbnRlZ2VycyBpbgotdGhlIG5hdGl2ZSBieXRlIG9yZGVyIGZvciB5b3VyIHBsYXRmb3JtLCBhbmQgdGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvcgotc3dhcHBpbmcgdGhlIGJ5dGVzIHRvIGEgZGlmZmVyZW50IGVuZGlhbiBjb25kaXRpb24uCi0KLSAgIFBOR19GT1JNQVRfTElORUFSX1kKLSAgIFBOR19GT1JNQVRfTElORUFSX1lfQUxQSEEKLSAgIFBOR19GT1JNQVRfTElORUFSX1JHQgotICAgUE5HX0ZPUk1BVF9MSU5FQVJfUkdCX0FMUEhBCi0KLVdpdGggY29sb3ItbWFwcGVkIGZvcm1hdHMgdGhlIGltYWdlIGRhdGEgaXMgb25lIGJ5dGUgZm9yIGVhY2ggcGl4ZWwuIFRoZSBieXRlCi1pcyBhbiBpbmRleCBpbnRvIHRoZSBjb2xvci1tYXAgd2hpY2ggaXMgZm9ybWF0dGVkIGFzIGFib3ZlLiAgVG8gb2J0YWluIGEKLWNvbG9yLW1hcHBlZCBmb3JtYXQgaXQgaXMgc3VmZmljaWVudCBqdXN0IHRvIGFkZCB0aGUgUE5HX0ZPTUFUX0ZMQUdfQ09MT1JNQVAKLXRvIG9uZSBvZiB0aGUgYWJvdmUgZGVmaW5pdGlvbnMsIG9yIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZGVmaW5pdGlvbnMgYmVsb3cuCi0KLSAgIFBOR19GT1JNQVRfUkdCX0NPTE9STUFQCi0gICBQTkdfRk9STUFUX0JHUl9DT0xPUk1BUAotICAgUE5HX0ZPUk1BVF9SR0JBX0NPTE9STUFQCi0gICBQTkdfRk9STUFUX0FSR0JfQ09MT1JNQVAKLSAgIFBOR19GT1JNQVRfQkdSQV9DT0xPUk1BUAotICAgUE5HX0ZPUk1BVF9BQkdSX0NPTE9STUFQCi0KLVBOR19JTUFHRSBtYWNyb3MKLQotVGhlc2UgYXJlIGNvbnZlbmllbmNlIG1hY3JvcyB0byBkZXJpdmUgaW5mb3JtYXRpb24gZnJvbSBhIHBuZ19pbWFnZQotc3RydWN0dXJlLiAgVGhlIFBOR19JTUFHRV9TQU1QTEVfIG1hY3JvcyByZXR1cm4gdmFsdWVzIGFwcHJvcHJpYXRlIHRvIHRoZQotYWN0dWFsIGltYWdlIHNhbXBsZSB2YWx1ZXMgLSBlaXRoZXIgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCBvciB0aGUKLXBpeGVscyBpbiB0aGUgaW1hZ2UuICBUaGUgUE5HX0lNQUdFX1BJWEVMXyBtYWNyb3MgcmV0dXJuIGNvcnJlc3BvbmRpbmcgdmFsdWVzCi1mb3IgdGhlIHBpeGVscyBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIDEgZm9yIGNvbG9yLW1hcHBlZCBmb3JtYXRzLiAgVGhlCi1yZW1haW5pbmcgbWFjcm9zIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm93cyBpbiB0aGUgaW1hZ2UgYW5kIHRoZQotY29tcGxldGUgaW1hZ2UuCi0KLU5PVEU6IEFsbCB0aGUgbWFjcm9zIHRoYXQgdGFrZSBhIHBuZ19pbWFnZTo6Zm9ybWF0IHBhcmFtZXRlciBhcmUgY29tcGlsZSB0aW1lCi1jb25zdGFudHMgaWYgdGhlIGZvcm1hdCBwYXJhbWV0ZXIgaXMsIGl0c2VsZiwgYSBjb25zdGFudC4gIFRoZXJlZm9yZSB0aGVzZQotbWFjcm9zIGNhbiBiZSB1c2VkIGluIGFycmF5IGRlY2xhcmF0aW9ucyBhbmQgY2FzZSBsYWJlbHMgd2hlcmUgcmVxdWlyZWQuCi1TaW1pbGFybHkgdGhlIG1hY3JvcyBhcmUgYWxzbyBwcmUtcHJvY2Vzc29yIGNvbnN0YW50cyAoc2l6ZW9mIGlzIG5vdCB1c2VkKSBzbwotdGhleSBjYW4gYmUgdXNlZCBpbiAjaWYgdGVzdHMuCi0KLSAgUE5HX0lNQUdFX1NBTVBMRV9DSEFOTkVMUyhmbXQpCi0gICAgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIGluIGEgZ2l2ZW4gZm9ybWF0OiAxLi40Ci0KLSAgUE5HX0lNQUdFX1NBTVBMRV9DT01QT05FTlRfU0laRShmbXQpCi0gICAgUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQgb2YgYSBwaXhlbCBvciBjb2xvci1tYXAKLSAgICBlbnRyeSAoYXMgYXBwcm9wcmlhdGUpIGluIHRoZSBpbWFnZTogMSBvciAyLgotCi0gIFBOR19JTUFHRV9TQU1QTEVfU0laRShmbXQpCi0gICAgVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGRhdGEgZm9yIG9uZSBzYW1wbGUuICBJZiB0aGUgaW1hZ2UgaXMKLSAgICBjb2xvci1tYXBwZWQgaXQgaXMgdGhlIHNpemUgb2Ygb25lIGNvbG9yLW1hcCBlbnRyeSAoYW5kIGltYWdlIHBpeGVscyBhcmUKLSAgICBvbmUgYnl0ZSBpbiBzaXplKSwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBzaXplIG9mIG9uZSBpbWFnZSBwaXhlbC4KLQotICBQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKGZtdCkKLSAgICBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb2xvci1tYXAgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdCBleHByZXNzZWQgaW4gYQotICAgIGNvdW50IG9mIGNvbXBvbmVudHMuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbXBpbGUtdGltZSBhbGxvY2F0ZSBhCi0gICAgY29sb3ItbWFwOgotCi0gICAgcG5nX3VpbnRfMTYgY29sb3JtYXBbUE5HX0lNQUdFX01BWElNVU1fQ09MT1JNQVBfQ09NUE9ORU5UUyhsaW5lYXJfZm10KV07Ci0KLSAgICBwbmdfYnl0ZSBjb2xvcm1hcFtQTkdfSU1BR0VfTUFYSU1VTV9DT0xPUk1BUF9DT01QT05FTlRTKHNSR0JfZm10KV07Ci0KLSAgICBBbHRlcm5hdGl2ZWx5IHVzZSB0aGUgUE5HX0lNQUdFX0NPTE9STUFQX1NJWkUgbWFjcm8gYmVsb3cgdG8gdXNlIHRoZQotICAgIGluZm9ybWF0aW9uIGZyb20gb25lIG9mIHRoZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF8gQVBJcyBhbmQgZHluYW1pY2FsbHkKLSAgICBhbGxvY2F0ZSB0aGUgcmVxdWlyZWQgbWVtb3J5LgotCi0gIFBOR19JTUFHRV9DT0xPUk1BUF9TSVpFKGZtdCkKLSAgIFRoZSBzaXplIG9mIHRoZSBjb2xvci1tYXAgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdDsgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUKLSAgIGNvbG9yLW1hcCBidWZmZXIgcGFzc2VkIHRvIHRoZSBwbmdfaW1hZ2Vfe3JlYWQsd3JpdGV9X2NvbG9ybWFwIEFQSXMuIEl0IGlzCi0gICBhIGZpeGVkIG51bWJlciBkZXRlcm1pbmVkIGJ5IHRoZSBmb3JtYXQgc28gY2FuIGVhc2lseSBiZSBhbGxvY2F0ZWQgb24gdGhlCi0gICBzdGFjayBpZiBuZWNlc3NhcnkuCi0KLUNvcnJlc3BvbmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBpeGVscwotCi0gIFBOR19JTUFHRV9QSVhFTF9DSEFOTkVMUyhmbXQpCi0gICBUaGUgbnVtYmVyIG9mIHNlcGFyYXRlIGNoYW5uZWxzIChjb21wb25lbnRzKSBpbiBhIHBpeGVsOyAxIGZvciBhCi0gICBjb2xvci1tYXBwZWQgaW1hZ2UuCi0KLSAgUE5HX0lNQUdFX1BJWEVMX0NPTVBPTkVOVF9TSVpFKGZtdClcCi0gICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGVhY2ggY29tcG9uZW50IGluIGEgcGl4ZWw7IDEgZm9yIGEgY29sb3ItbWFwcGVkCi0gICBpbWFnZS4KLQotICBQTkdfSU1BR0VfUElYRUxfU0laRShmbXQpCi0gICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGEgY29tcGxldGUgcGl4ZWw7IDEgZm9yIGEgY29sb3ItbWFwcGVkIGltYWdlLgotCi1JbmZvcm1hdGlvbiBhYm91dCB0aGUgd2hvbGUgcm93LCBvciB3aG9sZSBpbWFnZQotCi0gIFBOR19JTUFHRV9ST1dfU1RSSURFKGltYWdlKQotICAgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYSBzaW5nbGUgcm93IG9mIHRoZSBpbWFnZTsgdGhpcwotICAgaXMgdGhlIG1pbmltdW0gJ3JvdyBzdHJpZGUnLCB0aGUgbWluaW11bSBjb3VudCBvZiBjb21wb25lbnRzIGJldHdlZW4gZWFjaAotICAgcm93LiAgRm9yIGEgY29sb3ItbWFwcGVkIGltYWdlIHRoaXMgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEKLSAgIHJvdy4KLQotICAgSWYgeW91IG5lZWQgdGhlIHN0cmlkZSBtZWFzdXJlZCBpbiBieXRlcywgcm93X3N0cmlkZV9ieXRlcyBpcwotICAgUE5HX0lNQUdFX1JPV19TVFJJREUoaW1hZ2UpICogUE5HX0lNQUdFX1BJWEVMX0NPTVBPTkVOVF9TSVpFKGZtdCkKLSAgIHBsdXMgYW55IHBhZGRpbmcgYnl0ZXMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIG1pZ2h0IG5lZWQsIGZvciBleGFtcGxlCi0gICB0byBzdGFydCB0aGUgbmV4dCByb3cgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi0KLSAgUE5HX0lNQUdFX0JVRkZFUl9TSVpFKGltYWdlLCByb3dfc3RyaWRlKQotICAgUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgYW4gaW1hZ2UgYnVmZmVyIGdpdmVuIGEgcG5nX2ltYWdlIGFuZCBhIHJvdwotICAgc3RyaWRlIC0gdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRvIGxlYXZlIHNwYWNlIGZvciBpbiBlYWNoIHJvdy4KLQotICBQTkdfSU1BR0VfU0laRShpbWFnZSkKLSAgIFJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBpbWFnZSBpbiBtZW1vcnkgZ2l2ZW4ganVzdCBhIHBuZ19pbWFnZTsKLSAgIHRoZSByb3cgc3RyaWRlIGlzIHRoZSBtaW5pbXVtIHN0cmlkZSByZXF1aXJlZCBmb3IgdGhlIGltYWdlLgotCi0gIFBOR19JTUFHRV9DT0xPUk1BUF9TSVpFKGltYWdlKQotICAgUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGNvbG9yLW1hcCBvZiB0aGlzIGltYWdlLiAgSWYgdGhlIGltYWdlCi0gICBmb3JtYXQgaXMgbm90IGEgY29sb3ItbWFwIGZvcm1hdCB0aGlzIHdpbGwgcmV0dXJuIGEgc2l6ZSBzdWZmaWNpZW50IGZvcgotICAgMjU2IGVudHJpZXMgaW4gdGhlIGdpdmVuIGZvcm1hdDsgY2hlY2sgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQIGlmCi0gICB5b3UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhIGNvbG9yLW1hcCBpbiB0aGlzIGNhc2UuCi0KLVBOR19JTUFHRV9GTEFHXyoKLQotRmxhZ3MgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbWFnZSBhcmUgaGVsZCBpbgotdGhlICdmbGFncycgZmllbGQgb2YgcG5nX2ltYWdlLgotCi0gIFBOR19JTUFHRV9GTEFHX0NPTE9SU1BBQ0VfTk9UX3NSR0IgPT0gMHgwMQotICAgIFRoaXMgaW5kaWNhdGVzIHRoZSB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgaW4tbWVtb3J5IGJpdG1hcCBkbyBub3QKLSAgICBjb3JyZXNwb25kIHRvIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGVuZC1wb2ludHMgZGVmaW5lZCBieSBzUkdCLgotCi0gIFBOR19JTUFHRV9GTEFHX0ZBU1QgPT0gMHgwMgotICAgT24gd3JpdGUgZW1waGFzaXNlIHNwZWVkIG92ZXIgY29tcHJlc3Npb247IHRoZSByZXN1bHRhbnQgUE5HIGZpbGUgd2lsbCBiZQotICAgbGFyZ2VyIGJ1dCB3aWxsIGJlIHByb2R1Y2VkIHNpZ25pZmljYW50bHkgZmFzdGVyLCBwYXJ0aWN1bGFyIGZvciBsYXJnZQotICAgaW1hZ2VzLiAgRG8gbm90IHVzZSB0aGlzIG9wdGlvbiBmb3IgaW1hZ2VzIHdoaWNoIHdpbGwgYmUgZGlzdHJpYnV0ZWQsIG9ubHkKLSAgIHVzZWQgaXQgd2hlbiBwcm9kdWNpbmcgaW50ZXJtZWRpYXRlIGZpbGVzIHRoYXQgd2lsbCBiZSByZWFkIGJhY2sgaW4KLSAgIHJlcGVhdGVkbHkuICBGb3IgYSB0eXBpY2FsIDI0LWJpdCBpbWFnZSB0aGUgb3B0aW9uIHdpbGwgZG91YmxlIHRoZSByZWFkCi0gICBzcGVlZCBhdCB0aGUgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSBpbWFnZSBzaXplIGJ5IDI1JSwgaG93ZXZlciBmb3IgbWFueQotICAgbW9yZSBjb21wcmVzc2libGUgaW1hZ2VzIHRoZSBQTkcgZmlsZSBjYW4gYmUgMTAgdGltZXMgbGFyZ2VyIHdpdGggb25seSBhCi0gICBzbGlnaHQgc3BlZWQgZ2Fpbi4KLQotICBQTkdfSU1BR0VfRkxBR18xNkJJVF9zUkdCID09IDB4MDQKLSAgICBPbiByZWFkIGlmIHRoZSBpbWFnZSBpcyBhIDE2LWJpdCBwZXIgY29tcG9uZW50IGltYWdlIGFuZCB0aGVyZSBpcyBubyBnQU1BCi0gICAgb3Igc1JHQiBjaHVuayBhc3N1bWUgdGhhdCB0aGUgY29tcG9uZW50cyBhcmUgc1JHQiBlbmNvZGVkLiAgTm90aWNlIHRoYXQKLSAgICBpbWFnZXMgb3V0cHV0IGJ5IHRoZSBzaW1wbGlmaWVkIEFQSSBhbHdheXMgaGF2ZSBnYW1tYSBpbmZvcm1hdGlvbjsgc2V0dGluZwotICAgIHRoaXMgZmxhZyBvbmx5IGFmZmVjdHMgdGhlIGludGVycHJldGF0aW9uIG9mIDE2LWJpdCBpbWFnZXMgZnJvbSBhbgotICAgIGV4dGVybmFsIHNvdXJjZS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGV4cG9zZSB0aGlzIGZsYWcKLSAgICB0byB0aGUgdXNlcjsgdGhlIHVzZXIgY2FuIG5vcm1hbGx5IGVhc2lseSByZWNvZ25pemUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICAgIGxpbmVhciBhbmQgc1JHQiBlbmNvZGluZy4gIFRoaXMgZmxhZyBoYXMgbm8gZWZmZWN0IG9uIHdyaXRlIC0gdGhlIGRhdGEKLSAgICBwYXNzZWQgdG8gdGhlIHdyaXRlIEFQSXMgbXVzdCBoYXZlIHRoZSBjb3JyZWN0IGVuY29kaW5nIChhcyBkZWZpbmVkCi0gICAgYWJvdmUuKQotCi0gICAgSWYgdGhlIGZsYWcgaXMgbm90IHNldCAodGhlIGRlZmF1bHQpIGlucHV0IDE2LWJpdCBwZXIgY29tcG9uZW50IGRhdGEgaXMKLSAgICBhc3N1bWVkIHRvIGJlIGxpbmVhci4KLQotICAgIE5PVEU6IHRoZSBmbGFnIGNhbiBvbmx5IGJlIHNldCBhZnRlciB0aGUgcG5nX2ltYWdlX2JlZ2luX3JlYWRfIGNhbGwsCi0gICAgYmVjYXVzZSB0aGF0IGNhbGwgaW5pdGlhbGl6ZXMgdGhlICdmbGFncycgZmllbGQuCi0KLVJFQUQgQVBJcwotCi0gICBUaGUgcG5nX2ltYWdlIHBhc3NlZCB0byB0aGUgcmVhZCBBUElzIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IHNldHRpbmcKLSAgIHRoZSBwbmdfY29udHJvbHAgZmllbGQgJ29wYXF1ZScgdG8gTlVMTCAob3IsIGJldHRlciwgbWVtc2V0IHRoZSB3aG9sZSB0aGluZy4pCi0KLSAgIGludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUoIHBuZ19pbWFnZXAgaW1hZ2UsCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKLQotICAgICBUaGUgbmFtZWQgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWQgYW5kIHRoZSBpbWFnZSBoZWFkZXIKLSAgICAgaXMgZmlsbGVkIGluIGZyb20gdGhlIFBORyBoZWFkZXIgaW4gdGhlIGZpbGUuCi0KLSAgIGludCBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvIChwbmdfaW1hZ2VwIGltYWdlLAotICAgICBGSUxFKiBmaWxlKQotCi0gICAgICBUaGUgUE5HIGhlYWRlciBpcyByZWFkIGZyb20gdGhlIHN0ZGlvIEZJTEUgb2JqZWN0LgotCi0gICBpbnQgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9tZW1vcnkocG5nX2ltYWdlcCBpbWFnZSwKLSAgICAgIHBuZ19jb25zdF92b2lkcCBtZW1vcnksIHBuZ19zaXplX3Qgc2l6ZSkKLQotICAgICAgVGhlIFBORyBoZWFkZXIgaXMgcmVhZCBmcm9tIHRoZSBnaXZlbiBtZW1vcnkgYnVmZmVyLgotCi0gICBpbnQgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKHBuZ19pbWFnZXAgaW1hZ2UsCi0gICAgICBwbmdfY29sb3JwIGJhY2tncm91bmQsIHZvaWQgKmJ1ZmZlciwKLSAgICAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgdm9pZCAqY29sb3JtYXApKTsKLQotICAgICAgRmluaXNoIHJlYWRpbmcgdGhlIGltYWdlIGludG8gdGhlIHN1cHBsaWVkIGJ1ZmZlciBhbmQKLSAgICAgIGNsZWFuIHVwIHRoZSBwbmdfaW1hZ2Ugc3RydWN0dXJlLgotCi0gICAgICByb3dfc3RyaWRlIGlzIHRoZSBzdGVwLCBpbiBwbmdfYnl0ZSBvciBwbmdfdWludF8xNiB1bml0cwotICAgICAgYXMgYXBwcm9wcmlhdGUsIGJldHdlZW4gYWRqYWNlbnQgcm93cy4gIEEgcG9zaXRpdmUgc3RyaWRlCi0gICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgdG9wLW1vc3Qgcm93IGlzIGZpcnN0IGluIHRoZSBidWZmZXIgLQotICAgICAgdGhlIG5vcm1hbCB0b3AtZG93biBhcnJhbmdlbWVudC4gIEEgbmVnYXRpdmUgc3RyaWRlCi0gICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgYm90dG9tLW1vc3Qgcm93IGlzIGZpcnN0IGluIHRoZSBidWZmZXIuCi0KLSAgICAgIGJhY2tncm91bmQgbmVlZCBvbmx5IGJlIHN1cHBsaWVkIGlmIGFuIGFscGhhIGNoYW5uZWwgbXVzdAotICAgICAgYmUgcmVtb3ZlZCBmcm9tIGEgcG5nX2J5dGUgZm9ybWF0IGFuZCB0aGUgcmVtb3ZhbCBpcyB0byBiZQotICAgICAgZG9uZSBieSBjb21wb3NpdGluZyBvbiBhIHNvbGlkIGNvbG9yOyBvdGhlcndpc2UgaXQgbWF5IGJlCi0gICAgICBOVUxMIGFuZCBhbnkgY29tcG9zaXRpb24gd2lsbCBiZSBkb25lIGRpcmVjdGx5IG9udG8gdGhlCi0gICAgICBidWZmZXIuICBUaGUgdmFsdWUgaXMgYW4gc1JHQiBjb2xvciB0byB1c2UgZm9yIHRoZQotICAgICAgYmFja2dyb3VuZCwgZm9yIGdyYXlzY2FsZSBvdXRwdXQgdGhlIGdyZWVuIGNoYW5uZWwgaXMgdXNlZC4KLQotICAgICAgRm9yIGxpbmVhciBvdXRwdXQgcmVtb3ZpbmcgdGhlIGFscGhhIGNoYW5uZWwgaXMgYWx3YXlzIGRvbmUKLSAgICAgIGJ5IGNvbXBvc2l0aW5nIG9uIGJsYWNrLgotCi0gICB2b2lkIHBuZ19pbWFnZV9mcmVlKHBuZ19pbWFnZXAgaW1hZ2UpCi0KLSAgICAgIEZyZWUgYW55IGRhdGEgYWxsb2NhdGVkIGJ5IGxpYnBuZyBpbiBpbWFnZS0+b3BhcXVlLAotICAgICAgc2V0dGluZyB0aGUgcG9pbnRlciB0byBOVUxMLiAgTWF5IGJlIGNhbGxlZCBhdCBhbnkgdGltZQotICAgICAgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KLQotV2hlbiB0aGUgc2ltcGxpZmllZCBBUEkgbmVlZHMgdG8gY29udmVydCBiZXR3ZWVuIHNSR0IgYW5kIGxpbmVhciBjb2xvcnNwYWNlcywKLXRoZSBhY3R1YWwgc1JHQiB0cmFuc2ZlciBjdXJ2ZSBkZWZpbmVkIGluIHRoZSBzUkdCIHNwZWNpZmljYXRpb24gKHNlZSB0aGUKLWFydGljbGUgYXQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUkdCKSBpcyB1c2VkLCBub3QgdGhlIGdhbW1hPTEvMi4yCi1hcHByb3hpbWF0aW9uIHVzZWQgZWxzZXdoZXJlIGluIGxpYnBuZy4KLQotV1JJVEUgQVBJUwotCi1Gb3Igd3JpdGUgeW91IG11c3QgaW5pdGlhbGl6ZSBhIHBuZ19pbWFnZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGltYWdlIHRvCi1iZSB3cml0dGVuOgotCi0gICB2ZXJzaW9uOiBtdXN0IGJlIHNldCB0byBQTkdfSU1BR0VfVkVSU0lPTgotICAgb3BhcXVlOiBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE5VTEwKLSAgIHdpZHRoOiBpbWFnZSB3aWR0aCBpbiBwaXhlbHMKLSAgIGhlaWdodDogaW1hZ2UgaGVpZ2h0IGluIHJvd3MKLSAgIGZvcm1hdDogdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSB5b3Ugd2lzaCB0byB3cml0ZQotICAgZmxhZ3M6IHNldCB0byAwIHVubGVzcyBvbmUgb2YgdGhlIGRlZmluZWQgZmxhZ3MgYXBwbGllczsgc2V0Ci0gICAgICBQTkdfSU1BR0VfRkxBR19DT0xPUlNQQUNFX05PVF9zUkdCIGZvciBjb2xvciBmb3JtYXQgaW1hZ2VzCi0gICAgICB3aGVyZSB0aGUgUkdCIHZhbHVlcyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgY29sb3JzIGluIHNSR0IuCi0gICBjb2xvcm1hcF9lbnRyaWVzOiBzZXQgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb2xvci1tYXAgKDAgdG8gMjU2KQotCi0gICBpbnQgcG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUsIChwbmdfaW1hZ2VwIGltYWdlLAotICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGNvbnZlcnRfdG9fOGJpdCwgY29uc3Qgdm9pZCAqYnVmZmVyLAotICAgICAgcG5nX2ludF8zMiByb3dfc3RyaWRlLCBjb25zdCB2b2lkICpjb2xvcm1hcCkpOwotCi0gICAgICBXcml0ZSB0aGUgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUuCi0KLSAgIGludCBwbmdfaW1hZ2Vfd3JpdGVfdG9fbWVtb3J5IChwbmdfaW1hZ2VwIGltYWdlLCB2b2lkICptZW1vcnksCi0gICAgICBwbmdfYWxsb2Nfc2l6ZV90ICogUE5HX1JFU1RSSUNUIG1lbW9yeV9ieXRlcywKLSAgICAgIGludCBjb252ZXJ0X3RvXzhfYml0LCBjb25zdCB2b2lkICpidWZmZXIsIHB0cmRpZmZfdCByb3dfc3RyaWRlLAotICAgICAgY29uc3Qgdm9pZCAqY29sb3JtYXApKTsKLQotICAgICAgV3JpdGUgdGhlIGltYWdlIHRvIG1lbW9yeS4KLQotICAgaW50IHBuZ19pbWFnZV93cml0ZV90b19zdGRpbyhwbmdfaW1hZ2VwIGltYWdlLCBGSUxFICpmaWxlLAotICAgICAgaW50IGNvbnZlcnRfdG9fOF9iaXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgY29uc3Qgdm9pZCAqY29sb3JtYXApCi0KLSAgICAgIFdyaXRlIHRoZSBpbWFnZSB0byB0aGUgZ2l2ZW4gKEZJTEUqKS4KLQotV2l0aCBhbGwgd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGgKLShwbmdfdWludF8xNikgZGF0YSB0aGVuIHNldHRpbmcgY29udmVydF90b184X2JpdCB3aWxsIGNhdXNlIHRoZSBvdXRwdXQgdG8gYmUKLWEgKHBuZ19ieXRlKSBQTkcgZ2FtbWEgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIHNSR0Igc3BlY2lmaWNhdGlvbiwgb3RoZXJ3aXNlCi1hIDE2LWJpdCBsaW5lYXIgZW5jb2RlZCBQTkcgZmlsZSBpcyB3cml0dGVuLgotCi1XaXRoIGFsbCBBUElzIHJvd19zdHJpZGUgaXMgaGFuZGxlZCBhcyBpbiB0aGUgcmVhZCBBUElzIC0gaXQgaXMgdGhlIHNwYWNpbmcKLWZyb20gb25lIHJvdyB0byB0aGUgbmV4dCBpbiBjb21wb25lbnQgc2l6ZWQgdW5pdHMgKGZsb2F0KSBhbmQgaWYgbmVnYXRpdmUKLWluZGljYXRlcyBhIGJvdHRvbS11cCByb3cgbGF5b3V0IGluIHRoZSBidWZmZXIuICBJZiB5b3UgcGFzcyB6ZXJvLCBsaWJwbmcgd2lsbAotY2FsY3VsYXRlIHRoZSByb3dfc3RyaWRlIGZvciB5b3UgZnJvbSB0aGUgd2lkdGggYW5kIG51bWJlciBvZiBjaGFubmVscy4KLQotTm90ZSB0aGF0IHRoZSB3cml0ZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmxhY2luZywgc3ViLTgtYml0IHBpeGVscywKLWluZGV4ZWQgKHBhbGV0dGVkKSBpbWFnZXMsIG9yIG1vc3QgYW5jaWxsYXJ5IGNodW5rcy4KLQotLlNIIFZJLiBNb2RpZnlpbmcvQ3VzdG9taXppbmcgbGlicG5nCi0KLVRoZXJlIGFyZSB0d28gaXNzdWVzIGhlcmUuICBUaGUgZmlyc3QgaXMgY2hhbmdpbmcgaG93IGxpYnBuZyBkb2VzCi1zdGFuZGFyZCB0aGluZ3MgbGlrZSBtZW1vcnkgYWxsb2NhdGlvbiwgaW5wdXQvb3V0cHV0LCBhbmQgZXJyb3IgaGFuZGxpbmcuCi1UaGUgc2Vjb25kIGRlYWxzIHdpdGggbW9yZSBjb21wbGljYXRlZCB0aGluZ3MgbGlrZSBhZGRpbmcgbmV3IGNodW5rcywKLWFkZGluZyBuZXcgdHJhbnNmb3JtYXRpb25zLCBhbmQgZ2VuZXJhbGx5IGNoYW5naW5nIGhvdyBsaWJwbmcgd29ya3MuCi1Cb3RoIG9mIHRob3NlIGFyZSBjb21waWxlLXRpbWUgaXNzdWVzOyB0aGF0IGlzLCB0aGV5IGFyZSBnZW5lcmFsbHkKLWRldGVybWluZWQgYXQgdGhlIHRpbWUgdGhlIGNvZGUgaXMgd3JpdHRlbiwgYW5kIHRoZXJlIGlzIHJhcmVseSBhIG5lZWQKLXRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhIG1lYW5zIG9mIGNoYW5naW5nIHRoZW0uCi0KLU1lbW9yeSBhbGxvY2F0aW9uLCBpbnB1dC9vdXRwdXQsIGFuZCBlcnJvciBoYW5kbGluZwotCi1BbGwgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uLCBpbnB1dC9vdXRwdXQsIGFuZCBlcnJvciBoYW5kbGluZyBpbiBsaWJwbmcKLWdvZXMgdGhyb3VnaCBjYWxsYmFja3MgdGhhdCBhcmUgdXNlci1zZXR0YWJsZS4gIFRoZSBkZWZhdWx0IHJvdXRpbmVzIGFyZQotaW4gcG5nbWVtLmMsIHBuZ3Jpby5jLCBwbmd3aW8uYywgYW5kIHBuZ2Vycm9yLmMsIHJlc3BlY3RpdmVseS4gIFRvIGNoYW5nZQotdGhlc2UgZnVuY3Rpb25zLCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBwbmdfc2V0XypfZm4oKSBmdW5jdGlvbi4KLQotTWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSB0aHJvdWdoIHRoZSBmdW5jdGlvbnMgcG5nX21hbGxvYygpLCBwbmdfY2FsbG9jKCksCi1hbmQgcG5nX2ZyZWUoKS4gIFRoZSBwbmdfbWFsbG9jKCkgYW5kIHBuZ19mcmVlKCkgZnVuY3Rpb25zIGN1cnJlbnRseSBqdXN0Ci1jYWxsIHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucyBhbmQgcG5nX2NhbGxvYygpIGNhbGxzIHBuZ19tYWxsb2MoKSBhbmQgdGhlbgotY2xlYXJzIHRoZSBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IHRvIHplcm87IG5vdGUgdGhhdCBwbmdfY2FsbG9jKHBuZ19wdHIsIHNpemUpCi1pcyBub3QgdGhlIHNhbWUgYXMgdGhlIGNhbGxvYyhudW1iZXIsIHNpemUpIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHN0ZGxpYi5oLgotVGhlcmUgaXMgbGltaXRlZCBzdXBwb3J0IGZvciBjZXJ0YWluIHN5c3RlbXMgd2l0aCBzZWdtZW50ZWQgbWVtb3J5Ci1hcmNoaXRlY3R1cmVzIGFuZCB0aGUgdHlwZXMgb2YgcG9pbnRlcnMgZGVjbGFyZWQgYnkgcG5nLmggbWF0Y2ggdGhpczsgeW91Ci13aWxsIGhhdmUgdG8gdXNlIGFwcHJvcHJpYXRlIHBvaW50ZXJzIGluIHlvdXIgYXBwbGljYXRpb24uICBJZiB5b3UgcHJlZmVyCi10byB1c2UgYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgZGF0YSwgeW91IGNhbiB1c2UKLXBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMigpIG9yIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XzIoKSB0byByZWdpc3RlciB5b3VyCi1vd24gZnVuY3Rpb25zIGFzIGRlc2NyaWJlZCBhYm92ZS4gIFRoZXNlIGZ1bmN0aW9ucyBhbHNvIHByb3ZpZGUgYSB2b2lkCi1wb2ludGVyIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEKLQotICAgIG1lbV9wdHI9cG5nX2dldF9tZW1fcHRyKHBuZ19wdHIpOwotCi1Zb3VyIHJlcGxhY2VtZW50IG1lbW9yeSBmdW5jdGlvbnMgbXVzdCBoYXZlIHByb3RvdHlwZXMgYXMgZm9sbG93czoKLQotICAgIHBuZ192b2lkcCBtYWxsb2NfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBmcmVlX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ192b2lkcCBwdHIpOwotCi1Zb3VyIG1hbGxvY19mbigpIG11c3QgcmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLiAgVGhlIHBuZ19tYWxsb2MoKQotZnVuY3Rpb24gd2lsbCBub3JtYWxseSBjYWxsIHBuZ19lcnJvcigpIGlmIGl0IHJlY2VpdmVzIGEgTlVMTCBmcm9tIHRoZQotc3lzdGVtIG1lbW9yeSBhbGxvY2F0b3Igb3IgZnJvbSB5b3VyIHJlcGxhY2VtZW50IG1hbGxvY19mbigpLgotCi1Zb3VyIGZyZWVfZm4oKSB3aWxsIG5ldmVyIGJlIGNhbGxlZCB3aXRoIGEgTlVMTCBwdHIsIHNpbmNlIGxpYnBuZydzCi1wbmdfZnJlZSgpIGNoZWNrcyBmb3IgTlVMTCBiZWZvcmUgY2FsbGluZyBmcmVlX2ZuKCkuCi0KLUlucHV0L091dHB1dCBpbiBsaWJwbmcgaXMgZG9uZSB0aHJvdWdoIHBuZ19yZWFkKCkgYW5kIHBuZ193cml0ZSgpLAotd2hpY2ggY3VycmVudGx5IGp1c3QgY2FsbCBmcmVhZCgpIGFuZCBmd3JpdGUoKS4gIFRoZSBGSUxFICogaXMgc3RvcmVkIGluCi1wbmdfc3RydWN0IGFuZCBpcyBpbml0aWFsaXplZCB2aWEgcG5nX2luaXRfaW8oKS4gIElmIHlvdSB3aXNoIHRvIGNoYW5nZQotdGhlIG1ldGhvZCBvZiBJL08sIHRoZSBsaWJyYXJ5IHN1cHBsaWVzIGNhbGxiYWNrcyB0aGF0IHlvdSBjYW4gc2V0Ci10aHJvdWdoIHRoZSBmdW5jdGlvbiBwbmdfc2V0X3JlYWRfZm4oKSBhbmQgcG5nX3NldF93cml0ZV9mbigpIGF0IHJ1bgotdGltZSwgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBwbmdfaW5pdF9pbygpIGZ1bmN0aW9uLiAgVGhlc2UgZnVuY3Rpb25zCi1hbHNvIHByb3ZpZGUgYSB2b2lkIHBvaW50ZXIgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHZpYSB0aGUgZnVuY3Rpb24KLXBuZ19nZXRfaW9fcHRyKCkuICBGb3IgZXhhbXBsZToKLQotICAgIHBuZ19zZXRfcmVhZF9mbihwbmdfc3RydWN0cCByZWFkX3B0ciwKLSAgICAgICAgdm9pZHAgcmVhZF9pb19wdHIsIHBuZ19yd19wdHIgcmVhZF9kYXRhX2ZuKQotCi0gICAgcG5nX3NldF93cml0ZV9mbihwbmdfc3RydWN0cCB3cml0ZV9wdHIsCi0gICAgICAgIHZvaWRwIHdyaXRlX2lvX3B0ciwgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuLAotICAgICAgICBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbik7Ci0KLSAgICB2b2lkcCByZWFkX2lvX3B0ciA9IHBuZ19nZXRfaW9fcHRyKHJlYWRfcHRyKTsKLSAgICB2b2lkcCB3cml0ZV9pb19wdHIgPSBwbmdfZ2V0X2lvX3B0cih3cml0ZV9wdHIpOwotCi1UaGUgcmVwbGFjZW1lbnQgSS9PIGZ1bmN0aW9ucyBtdXN0IGhhdmUgcHJvdG90eXBlcyBhcyBmb2xsb3dzOgotCi0gICAgdm9pZCB1c2VyX3JlYWRfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpOwotCi0gICAgdm9pZCB1c2VyX3dyaXRlX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKTsKLQotICAgIHZvaWQgdXNlcl9mbHVzaF9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpOwotCi1UaGUgdXNlcl9yZWFkX2RhdGEoKSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGFuZAotaGFuZGxpbmcgZW5kLW9mLWRhdGEgZXJyb3JzLgotCi1TdXBwbHlpbmcgTlVMTCBmb3IgdGhlIHJlYWQsIHdyaXRlLCBvciBmbHVzaCBmdW5jdGlvbnMgc2V0cyB0aGVtIGJhY2sKLXRvIHVzaW5nIHRoZSBkZWZhdWx0IEMgc3RyZWFtIGZ1bmN0aW9ucywgd2hpY2ggZXhwZWN0IHRoZSBpb19wdHIgdG8KLXBvaW50IHRvIGEgc3RhbmRhcmQgKkZJTEUgc3RydWN0dXJlLiAgSXQgaXMgcHJvYmFibHkgYSBtaXN0YWtlCi10byB1c2UgTlVMTCBmb3Igb25lIG9mIHdyaXRlX2RhdGFfZm4gYW5kIG91dHB1dF9mbHVzaF9mbiBidXQgbm90IGJvdGgKLW9mIHRoZW0sIHVubGVzcyB5b3UgaGF2ZSBidWlsdCBsaWJwbmcgd2l0aCBQTkdfTk9fV1JJVEVfRkxVU0ggZGVmaW5lZC4KLUl0IGlzIGFuIGVycm9yIHRvIHJlYWQgZnJvbSBhIHdyaXRlIHN0cmVhbSwgYW5kIHZpY2UgdmVyc2EuCi0KLUVycm9yIGhhbmRsaW5nIGluIGxpYnBuZyBpcyBkb25lIHRocm91Z2ggcG5nX2Vycm9yKCkgYW5kIHBuZ193YXJuaW5nKCkuCi1FcnJvcnMgaGFuZGxlZCB0aHJvdWdoIHBuZ19lcnJvcigpIGFyZSBmYXRhbCwgbWVhbmluZyB0aGF0IHBuZ19lcnJvcigpCi1zaG91bGQgbmV2ZXIgcmV0dXJuIHRvIGl0cyBjYWxsZXIuICBDdXJyZW50bHksIHRoaXMgaXMgaGFuZGxlZCB2aWEKLXNldGptcCgpIGFuZCBsb25nam1wKCkgKHVubGVzcyB5b3UgaGF2ZSBjb21waWxlZCBsaWJwbmcgd2l0aAotUE5HX05PX1NFVEpNUCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBoYW5kbGVkIHZpYSBQTkdfQUJPUlQoKSksCi1idXQgeW91IGNvdWxkIGNoYW5nZSB0aGlzIHRvIGRvIHRoaW5ncyBsaWtlIGV4aXQoKSBpZiB5b3Ugc2hvdWxkIHdpc2gsCi1hcyBsb25nIGFzIHlvdXIgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuLgotCi1PbiBub24tZmF0YWwgZXJyb3JzLCBwbmdfd2FybmluZygpIGlzIGNhbGxlZAotdG8gcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgY2FsbGluZyBjb2RlLgotQnkgZGVmYXVsdCBwbmdfZXJyb3IoKSBhbmQgcG5nX3dhcm5pbmcoKSBwcmludCBhIG1lc3NhZ2Ugb24gc3RkZXJyIHZpYQotZnByaW50ZigpIHVubGVzcyB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIFBOR19OT19DT05TT0xFX0lPIGRlZmluZWQKLShiZWNhdXNlIHlvdSBkb24ndCB3YW50IHRoZSBtZXNzYWdlcykgb3IgUE5HX05PX1NURElPIGRlZmluZWQgKGJlY2F1c2UKLWZwcmludGYoKSBpc24ndCBhdmFpbGFibGUpLiAgSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUgZXJyb3IKLWZ1bmN0aW9ucywgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgeW91ciBvd24gbWVzc2FnZSBjYWxsYmFja3MuICBUaGVzZQotZnVuY3Rpb25zIGFyZSBub3JtYWxseSBzdXBwbGllZCBhdCB0aGUgdGltZSB0aGF0IHRoZSBwbmdfc3RydWN0IGlzIGNyZWF0ZWQuCi1JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlZGlyZWN0IGVycm9ycyBhbmQgd2FybmluZ3MgdG8geW91ciBvd24gcmVwbGFjZW1lbnQKLWZ1bmN0aW9ucyBhZnRlciBwbmdfY3JlYXRlXypfc3RydWN0KCkgaGFzIGJlZW4gY2FsbGVkIGJ5IGNhbGxpbmc6Ci0KLSAgICBwbmdfc2V0X2Vycm9yX2ZuKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsCi0gICAgICAgIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sCi0gICAgICAgIHBuZ19lcnJvcl9wdHIgd2FybmluZ19mbik7Ci0KLSAgICBwbmdfdm9pZHAgZXJyb3JfcHRyID0gcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cik7Ci0KLUlmIE5VTEwgaXMgc3VwcGxpZWQgZm9yIGVpdGhlciBlcnJvcl9mbiBvciB3YXJuaW5nX2ZuLCB0aGVuIHRoZSBsaWJwbmcKLWRlZmF1bHQgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLCBjYWxsaW5nIGZwcmludGYoKSBhbmQvb3IgbG9uZ2ptcCgpIGlmIGEKLXByb2JsZW0gaXMgZW5jb3VudGVyZWQuICBUaGUgcmVwbGFjZW1lbnQgZXJyb3IgZnVuY3Rpb25zIHNob3VsZCBoYXZlCi1wYXJhbWV0ZXJzIGFzIGZvbGxvd3M6Ci0KLSAgICB2b2lkIHVzZXJfZXJyb3JfZm4ocG5nX3N0cnVjdHAgcG5nX3B0ciwKLSAgICAgICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZyk7Ci0KLSAgICB2b2lkIHVzZXJfd2FybmluZ19mbihwbmdfc3RydWN0cCBwbmdfcHRyLAotICAgICAgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tc2cpOwotCi1UaGUgbW90aXZhdGlvbiBiZWhpbmQgdXNpbmcgc2V0am1wKCkgYW5kIGxvbmdqbXAoKSBpcyB0aGUgQysrIHRocm93IGFuZAotY2F0Y2ggZXhjZXB0aW9uIGhhbmRsaW5nIG1ldGhvZHMuICBUaGlzIG1ha2VzIHRoZSBjb2RlIG11Y2ggZWFzaWVyIHRvIHdyaXRlLAotYXMgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBldmVyeSByZXR1cm4gY29kZSBvZiBldmVyeSBmdW5jdGlvbiBjYWxsLgotSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdW5jZXJ0YWludGllcyBhYm91dCB0aGUgc3RhdHVzIG9mIGxvY2FsIHZhcmlhYmxlcwotYWZ0ZXIgYSBsb25nam1wLCBzbyB0aGUgdXNlciBtYXkgd2FudCB0byBiZSBjYXJlZnVsIGFib3V0IGRvaW5nIGFueXRoaW5nCi1hZnRlciBzZXRqbXAgcmV0dXJucyBub24temVybyBiZXNpZGVzIHJldHVybmluZyBpdHNlbGYuICBDb25zdWx0IHlvdXIKLWNvbXBpbGVyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gIEZvciBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCwgeW91Ci1tYXkgd2lzaCB0byB1c2UgdGhlICJjZXhjZXB0IiBmYWNpbGl0eSAoc2VlIGh0dHA6Ly9jZXhjZXB0LnNvdXJjZWZvcmdlLm5ldCksCi13aGljaCBpcyBpbGx1c3RyYXRlZCBpbiBwbmd2YWxpZC5jIGFuZCBpbiBjb250cmliL3Zpc3VwbmcuCi0KLUJlZ2lubmluZyBpbiBsaWJwbmctMS40LjAsIHRoZSBwbmdfc2V0X2Jlbmlnbl9lcnJvcnMoKSBBUEkgYmVjYW1lIGF2YWlsYWJsZS4KLVlvdSBjYW4gdXNlIHRoaXMgdG8gaGFuZGxlIGNlcnRhaW4gZXJyb3JzIChub3JtYWxseSBoYW5kbGVkIGFzIGVycm9ycykKLWFzIHdhcm5pbmdzLgotCi0gICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzIChwbmdfcHRyLCBpbnQgYWxsb3dlZCk7Ci0KLSAgICBhbGxvd2VkOiAwOiB0cmVhdCBwbmdfYmVuaWduX2Vycm9yKCkgYXMgYW4gZXJyb3IuCi0gICAgICAgICAgICAgMTogdHJlYXQgcG5nX2Jlbmlnbl9lcnJvcigpIGFzIGEgd2FybmluZy4KLQotQXMgb2YgbGlicG5nLTEuNi4wLCB0aGUgZGVmYXVsdCBjb25kaXRpb24gaXMgdG8gdHJlYXQgYmVuaWduIGVycm9ycyBhcwotd2FybmluZ3Mgd2hpbGUgcmVhZGluZyBhbmQgYXMgZXJyb3JzIHdoaWxlIHdyaXRpbmcuCi0KLS5TUyBDdXN0b20gY2h1bmtzCi0KLUlmIHlvdSBuZWVkIHRvIHJlYWQgb3Igd3JpdGUgY3VzdG9tIGNodW5rcywgeW91IG1heSBuZWVkIHRvIGdldCBkZWVwZXIKLWludG8gdGhlIGxpYnBuZyBjb2RlLiAgVGhlIGxpYnJhcnkgbm93IGhhcyBtZWNoYW5pc21zIGZvciBzdG9yaW5nCi1hbmQgd3JpdGluZyBjaHVua3Mgb2YgdW5rbm93biB0eXBlOyB5b3UgY2FuIGV2ZW4gZGVjbGFyZSBjYWxsYmFja3MKLWZvciBjdXN0b20gY2h1bmtzLiAgSG93ZXZlciwgdGhpcyBtYXkgbm90IGJlIGdvb2QgZW5vdWdoIGlmIHRoZQotbGlicmFyeSBjb2RlIGl0c2VsZiBuZWVkcyB0byBrbm93IGFib3V0IGludGVyYWN0aW9ucyBiZXR3ZWVuIHlvdXIKLWNodW5rIGFuZCBleGlzdGluZyBgaW50cmluc2ljJyBjaHVua3MuCi0KLUlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbmV3IGludHJpbnNpYyBjaHVuaywgZmlyc3QgcmVhZCB0aGUgUE5HCi1zcGVjaWZpY2F0aW9uLiBBY3F1aXJlIGEgZmlyc3QgbGV2ZWwgb2YgdW5kZXJzdGFuZGluZyBvZiBob3cgaXQgd29ya3MuCi1QYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIHNlY3Rpb25zIHRoYXQgZGVzY3JpYmUgY2h1bmsgbmFtZXMsCi1hbmQgbG9vayBhdCBob3cgb3RoZXIgY2h1bmtzIHdlcmUgZGVzaWduZWQsIHNvIHlvdSBjYW4gZG8gdGhpbmdzCi1zaW1pbGFybHkuICBTZWNvbmQsIGNoZWNrIG91dCB0aGUgc2VjdGlvbnMgb2YgbGlicG5nIHRoYXQgcmVhZCBhbmQKLXdyaXRlIGNodW5rcy4gIFRyeSB0byBmaW5kIGEgY2h1bmsgdGhhdCBpcyBzaW1pbGFyIHRvIHlvdXJzIGFuZCB1c2UKLWl0IGFzIGEgdGVtcGxhdGUuICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBjb21tZW50cyBpbnNpZGUKLXRoZSBjb2RlLiAgSXQgaXMgYmVzdCB0byBoYW5kbGUgcHJpdmF0ZSBvciB1bmtub3duIGNodW5rcyBpbiBhIGdlbmVyaWMgbWV0aG9kLAotdmlhIGNhbGxiYWNrIGZ1bmN0aW9ucywgaW5zdGVhZCBvZiBieSBtb2RpZnlpbmcgbGlicG5nIGZ1bmN0aW9ucy4gVGhpcwotaXMgaWxsdXN0cmF0ZWQgaW4gcG5ndGVzdC5jLCB3aGljaCB1c2VzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGEKLXByaXZhdGUgInZwQWciIGNodW5rIGFuZCB0aGUgbmV3ICJzVEVSIiBjaHVuaywgd2hpY2ggYXJlIGJvdGggdW5rbm93biB0bwotbGlicG5nLgotCi1JZiB5b3Ugd2lzaCB0byB3cml0ZSB5b3VyIG93biB0cmFuc2Zvcm1hdGlvbiBmb3IgdGhlIGRhdGEsIGxvb2sgdGhyb3VnaAotdGhlIHBhcnQgb2YgdGhlIGNvZGUgdGhhdCBkb2VzIHRoZSB0cmFuc2Zvcm1hdGlvbnMsIGFuZCBjaGVjayBvdXQgc29tZSBvZgotdGhlIHNpbXBsZXIgb25lcyB0byBnZXQgYW4gaWRlYSBvZiBob3cgdGhleSB3b3JrLiAgVHJ5IHRvIGZpbmQgYSBzaW1pbGFyCi10cmFuc2Zvcm1hdGlvbiB0byB0aGUgb25lIHlvdSB3YW50IHRvIGFkZCBhbmQgY29weSBvZmYgb2YgaXQuICBNb3JlIGRldGFpbHMKLWNhbiBiZSBmb3VuZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlIHRoZSBjb2RlIGl0c2VsZi4KLQotLlNTIENvbmZpZ3VyaW5nIGZvciBndWkvd2luZG93aW5nIHBsYXRmb3JtczoKLQotWW91IHdpbGwgbmVlZCB0byB3cml0ZSBuZXcgZXJyb3IgYW5kIHdhcm5pbmcgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZSBHVUkKLWludGVyZmFjZSwgYXMgZGVzY3JpYmVkIHByZXZpb3VzbHksIGFuZCBzZXQgdGhlbSB0byBiZSB0aGUgZXJyb3IgYW5kCi13YXJuaW5nIGZ1bmN0aW9ucyBhdCB0aGUgdGltZSB0aGF0IHBuZ19jcmVhdGVfKl9zdHJ1Y3QoKSBpcyBjYWxsZWQsCi1pbiBvcmRlciB0byBoYXZlIHRoZW0gYXZhaWxhYmxlIGR1cmluZyB0aGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgotVGhleSBjYW4gYmUgY2hhbmdlZCBsYXRlciB2aWEgcG5nX3NldF9lcnJvcl9mbigpLiAgT24gc29tZSBjb21waWxlcnMsCi15b3UgbWF5IGFsc28gaGF2ZSB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3JzIChwbmdfbWFsbG9jLCBldGMuKS4KLQotLlNTIENvbmZpZ3VyaW5nIHpsaWI6Ci0KLVRoZXJlIGFyZSBzcGVjaWFsIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgdGhlIGNvbXByZXNzaW9uLiAgUGVyaGFwcyB0aGUKLW1vc3QgdXNlZnVsIG9uZSBjaGFuZ2VzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCwgd2hpY2ggY3VycmVudGx5IHVzZXMKLWlucHV0IGNvbXByZXNzaW9uIHZhbHVlcyBpbiB0aGUgcmFuZ2UgMCAtIDkuICBUaGUgbGlicmFyeSBub3JtYWxseQotdXNlcyB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCAoWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gNikuICBUZXN0cwotaGF2ZSBzaG93biB0aGF0IGZvciBhIGxhcmdlIG1ham9yaXR5IG9mIGltYWdlcywgY29tcHJlc3Npb24gdmFsdWVzIGluCi10aGUgcmFuZ2UgMy02IGNvbXByZXNzIG5lYXJseSBhcyB3ZWxsIGFzIGhpZ2hlciBsZXZlbHMsIGFuZCBkbyBzbyBtdWNoCi1mYXN0ZXIuICBGb3Igb25saW5lIGFwcGxpY2F0aW9ucyBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGhhdmUgbWF4aW11bSBzcGVlZAotKFpfQkVTVF9TUEVFRCA9IDEpLiAgV2l0aCB2ZXJzaW9ucyBvZiB6bGliIGFmdGVyIHYwLjk5LCB5b3UgY2FuIGFsc28KLXNwZWNpZnkgbm8gY29tcHJlc3Npb24gKFpfTk9fQ09NUFJFU1NJT04gPSAwKSwgYnV0IHRoaXMgd291bGQgY3JlYXRlCi1maWxlcyBsYXJnZXIgdGhhbiBqdXN0IHN0b3JpbmcgdGhlIHJhdyBiaXRtYXAuICBZb3UgY2FuIHNwZWNpZnkgdGhlCi1jb21wcmVzc2lvbiBsZXZlbCBieSBjYWxsaW5nOgotCi0gICAgI2luY2x1ZGUgemxpYi5oCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBsZXZlbCk7Ci0KLUFub3RoZXIgdXNlZnVsIG9uZSBpcyB0byByZWR1Y2UgdGhlIG1lbW9yeSBsZXZlbCB1c2VkIGJ5IHRoZSBsaWJyYXJ5LgotVGhlIG1lbW9yeSBsZXZlbCBkZWZhdWx0cyB0byA4LCBidXQgaXQgY2FuIGJlIGxvd2VyZWQgaWYgeW91IGFyZQotc2hvcnQgb24gbWVtb3J5IChydW5uaW5nIERPUywgZm9yIGV4YW1wbGUsIHdoZXJlIHlvdSBvbmx5IGhhdmUgNjQwSykuCi1Ob3RlIHRoYXQgdGhlIG1lbW9yeSBsZXZlbCBkb2VzIGhhdmUgYW4gZWZmZWN0IG9uIGNvbXByZXNzaW9uOyBhbW9uZwotb3RoZXIgdGhpbmdzLCBsb3dlciBsZXZlbHMgd2lsbCByZXN1bHQgaW4gc2VjdGlvbnMgb2YgaW5jb21wcmVzc2libGUKLWRhdGEgYmVpbmcgZW1pdHRlZCBpbiBzbWFsbGVyIHN0b3JlZCBibG9ja3MsIHdpdGggYSBjb3JyZXNwb25kaW5nbHkKLWxhcmdlciByZWxhdGl2ZSBvdmVyaGVhZCBvZiB1cCB0byAxNSUgaW4gdGhlIHdvcnN0IGNhc2UuCi0KLSAgICAjaW5jbHVkZSB6bGliLmgKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbChwbmdfcHRyLCBsZXZlbCk7Ci0KLVRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIGZvciBjb25maWd1cmluZyB6bGliLiAgVGhleSBhcmUgbm90IHJlY29tbWVuZGVkCi1mb3Igbm9ybWFsIHVzZSBhbmQgbWF5IHJlc3VsdCBpbiB3cml0aW5nIGFuIGludmFsaWQgUE5HIGZpbGUuICBTZWUKLXpsaWIuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHRoZXNlIG1lYW4uCi0KLSAgICAjaW5jbHVkZSB6bGliLmgKLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5KHBuZ19wdHIsCi0gICAgICAgIHN0cmF0ZWd5KTsKLQotICAgIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwKLSAgICAgICAgd2luZG93X2JpdHMpOwotCi0gICAgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QocG5nX3B0ciwgbWV0aG9kKTsKLQotVGhpcyBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgSURBVCBjaHVua3MgKGRlZmF1bHQgODE5Mik6Ci0KLSAgICBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplKHBuZ19wdHIsIHNpemUpOwotCi1BcyBvZiBsaWJwbmcgdmVyc2lvbiAxLjUuNCwgYWRkaXRpb25hbCBBUElzIGJlY2FtZQotYXZhaWxhYmxlIHRvIHNldCB0aGVzZSBzZXBhcmF0ZWx5IGZvciBub24tSURBVAotY29tcHJlc3NlZCBjaHVua3Mgc3VjaCBhcyB6VFh0LCBpVFh0LCBhbmQgaUNDUDoKLQotICAgICNpbmNsdWRlIHpsaWIuaAotICAgICNpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDUwNAotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9sZXZlbChwbmdfcHRyLCBsZXZlbCk7Ci0KLSAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWVtX2xldmVsKHBuZ19wdHIsIGxldmVsKTsKLQotICAgIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneShwbmdfcHRyLAotICAgICAgICBzdHJhdGVneSk7Ci0KLSAgICBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMocG5nX3B0ciwKLSAgICAgICAgd2luZG93X2JpdHMpOwotCi0gICAgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21ldGhvZChwbmdfcHRyLCBtZXRob2QpOwotICAgICNlbmRpZgotCi0uU1MgQ29udHJvbGxpbmcgcm93IGZpbHRlcmluZwotCi1JZiB5b3Ugd2FudCB0byBjb250cm9sIHdoZXRoZXIgbGlicG5nIHVzZXMgZmlsdGVyaW5nIG9yIG5vdCwgd2hpY2gKLWZpbHRlcnMgYXJlIHVzZWQsIGFuZCBob3cgaXQgZ29lcyBhYm91dCBwaWNraW5nIHJvdyBmaWx0ZXJzLCB5b3UKLWNhbiBjYWxsIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuICBUaGUgc2VsZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uCi1vZiByb3cgZmlsdGVycyBjYW4gaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCBvbiB0aGUgc2l6ZSBhbmQKLWVuY29kaW5nIHNwZWVkIGFuZCBhIHNvbWV3aGF0IGxlc3NlciBpbXBhY3Qgb24gdGhlIGRlY29kaW5nIHNwZWVkCi1vZiBhbiBpbWFnZS4gIEZpbHRlcmluZyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIFJHQiBhbmQgZ3JheXNjYWxlCi1pbWFnZXMgKHdpdGggYW5kIHdpdGhvdXQgYWxwaGEpLCBidXQgbm90IGZvciBwYWxldHRlZCBpbWFnZXMgbm9yCi1mb3IgYW55IGltYWdlcyB3aXRoIGJpdCBkZXB0aHMgbGVzcyB0aGFuIDggYml0cy9waXhlbC4KLQotVGhlICdtZXRob2QnIHBhcmFtZXRlciBzZXRzIHRoZSBtYWluIGZpbHRlcmluZyBtZXRob2QsIHdoaWNoIGlzCi1jdXJyZW50bHkgb25seSAnMCcgaW4gdGhlIFBORyAxLjIgc3BlY2lmaWNhdGlvbi4gIFRoZSAnZmlsdGVycycKLXBhcmFtZXRlciBzZXRzIHdoaWNoIGZpbHRlcihzKSwgaWYgYW55LCBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaAotc2NhbmxpbmUuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIFBOR19BTExfRklMVEVSUywgUE5HX05PX0ZJTFRFUlMsCi1vciBQTkdfRkFTVF9GSUxURVJTIHRvIHR1cm4gZmlsdGVyaW5nIG9uIGFuZCBvZmYsIG9yIHRvIHR1cm4gb24KLWp1c3QgdGhlIGZhc3QtZGVjb2Rpbmcgc3Vic2V0IG9mIGZpbHRlcnMsIHJlc3BlY3RpdmVseS4KLQotSW5kaXZpZHVhbCBmaWx0ZXIgdHlwZXMgYXJlIFBOR19GSUxURVJfTk9ORSwgUE5HX0ZJTFRFUl9TVUIsCi1QTkdfRklMVEVSX1VQLCBQTkdfRklMVEVSX0FWRywgUE5HX0ZJTFRFUl9QQUVUSCwgd2hpY2ggY2FuIGJlIGJpdHdpc2UKLU9SZWQgdG9nZXRoZXIgd2l0aCAnfCcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWx0ZXJzIHRvIHVzZS4KLVRoZXNlIGZpbHRlcnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgUE5HIHNwZWNpZmljYXRpb24uCi1JZiB5b3UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZmlsdGVyIHR5cGUgZHVyaW5nIHRoZSBjb3Vyc2Ugb2Ygd3JpdGluZwotdGhlIGltYWdlLCB5b3Ugc2hvdWxkIHN0YXJ0IHdpdGggZmxhZ3Mgc2V0IGZvciBhbGwgb2YgdGhlIGZpbHRlcnMKLXlvdSBpbnRlbmQgdG8gdXNlIHNvIHRoYXQgbGlicG5nIGNhbiBpbml0aWFsaXplIGl0cyBpbnRlcm5hbAotc3RydWN0dXJlcyBhcHByb3ByaWF0ZWx5IGZvciBhbGwgb2YgdGhlIGZpbHRlciB0eXBlcy4gIChOb3RlIHRoYXQgdGhpcwotbWVhbnMgdGhlIGZpcnN0IHJvdyBtdXN0IGFsd2F5cyBiZSBhZGFwdGl2ZWx5IGZpbHRlcmVkLCBiZWNhdXNlIGxpYnBuZwotY3VycmVudGx5IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBmaWx0ZXIgYnVmZmVycyB1bnRpbCBwbmdfd3JpdGVfcm93KCkKLWlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuKQotCi0gICAgZmlsdGVycyA9IFBOR19OT19GSUxURVJTOwotICAgIGZpbHRlcnMgPSBQTkdfQUxMX0ZJTFRFUlM7Ci0gICAgZmlsdGVycyA9IFBOR19GQVNUX0ZJTFRFUlM7Ci0KLSAgICBvcgotCi0gICAgZmlsdGVycyA9IFBOR19GSUxURVJfTk9ORSB8IFBOR19GSUxURVJfU1VCIHwKLSAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9VUCB8IFBOR19GSUxURVJfQVZHIHwKLSAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9QQUVUSDsKLQotICAgIHBuZ19zZXRfZmlsdGVyKHBuZ19wdHIsIFBOR19GSUxURVJfVFlQRV9CQVNFLAotICAgICAgIGZpbHRlcnMpOwotCi0gICAgICAgICAgICAgIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBhbHNvIGJlCi0gICAgICAgICAgICAgIFBOR19JTlRSQVBJWEVMX0RJRkZFUkVOQ0lORyBpZiB5b3UgYXJlCi0gICAgICAgICAgICAgIHdyaXRpbmcgYSBQTkcgdG8gYmUgZW1iZWRkZWQgaW4gYSBNTkcKLSAgICAgICAgICAgICAgZGF0YXN0cmVhbS4gIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgdGhlCi0gICAgICAgICAgICAgIHNhbWUgYXMgdGhlIHZhbHVlIG9mIGZpbHRlcl9tZXRob2QgdXNlZAotICAgICAgICAgICAgICBpbiBwbmdfc2V0X0lIRFIoKS4KLQotLlNTIFJlcXVlc3RpbmcgZGVidWcgcHJpbnRvdXQKLQotVGhlIG1hY3JvIGRlZmluaXRpb24gUE5HX0RFQlVHIGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgZGVidWdnaW5nCi1wcmludG91dC4gIFNldCBpdCB0byBhbiBpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDMuICBIaWdoZXIKLW51bWJlcnMgcmVzdWx0IGluIGluY3JlYXNpbmcgYW1vdW50cyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUKLWluZm9ybWF0aW9uIGlzIHByaW50ZWQgdG8gdGhlICJzdGRlcnIiIGZpbGUsIHVubGVzcyBhbm90aGVyIGZpbGUKLW5hbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBQTkdfREVCVUdfRklMRSBtYWNybyBkZWZpbml0aW9uLgotCi1XaGVuIFBOR19ERUJVRyA+IDAsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIChtYWNyb3MpIGJlY29tZSBhdmFpbGFibGU6Ci0KLSAgIHBuZ19kZWJ1ZyhsZXZlbCwgbWVzc2FnZSkKLSAgIHBuZ19kZWJ1ZzEobGV2ZWwsIG1lc3NhZ2UsIHAxKQotICAgcG5nX2RlYnVnMihsZXZlbCwgbWVzc2FnZSwgcDEsIHAyKQotCi1pbiB3aGljaCAibGV2ZWwiIGlzIGNvbXBhcmVkIHRvIFBOR19ERUJVRyB0byBkZWNpZGUgd2hldGhlciB0byBwcmludAotdGhlIG1lc3NhZ2UsICJtZXNzYWdlIiBpcyB0aGUgZm9ybWF0dGVkIHN0cmluZyB0byBiZSBwcmludGVkLAotYW5kIHAxIGFuZCBwMiBhcmUgcGFyYW1ldGVycyB0aGF0IGFyZSB0byBiZSBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nCi1hY2NvcmRpbmcgdG8gcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAotCi0gICBwbmdfZGVidWcxKDIsICJmb289JWQiLCBmb28pOwotCi1pcyBleHBhbmRlZCB0bwotCi0gICBpZiAoUE5HX0RFQlVHID4gMikKLSAgICAgIGZwcmludGYoUE5HX0RFQlVHX0ZJTEUsICJmb289JWRcZW4iLCBmb28pOwotCi1XaGVuIFBOR19ERUJVRyBpcyBkZWZpbmVkIGJ1dCBpcyB6ZXJvLCB0aGUgbWFjcm9zIGFyZW4ndCBkZWZpbmVkLCBidXQgeW91Ci1jYW4gc3RpbGwgdXNlIFBOR19ERUJVRyB0byBjb250cm9sIHlvdXIgb3duIGRlYnVnZ2luZzoKLQotICAgI2lmZGVmIFBOR19ERUJVRwotICAgICAgIGZwcmludGYoc3RkZXJyLCAuLi4KLSAgICNlbmRpZgotCi1XaGVuIFBOR19ERUJVRyA9IDEsIHRoZSBtYWNyb3MgYXJlIGRlZmluZWQsIGJ1dCBvbmx5IHBuZ19kZWJ1ZyBzdGF0ZW1lbnRzCi1oYXZpbmcgbGV2ZWwgPSAwIHdpbGwgYmUgcHJpbnRlZC4gIFRoZXJlIGFyZW4ndCBhbnkgc3VjaCBzdGF0ZW1lbnRzIGluCi10aGlzIHZlcnNpb24gb2YgbGlicG5nLCBidXQgaWYgeW91IGluc2VydCBzb21lIHRoZXkgd2lsbCBiZSBwcmludGVkLgotCi0uU0ggVklJLiAgTU5HIHN1cHBvcnQKLQotVGhlIE1ORyBzcGVjaWZpY2F0aW9uIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9tbmcpIGFsbG93cwotY2VydGFpbiBleHRlbnNpb25zIHRvIFBORyBmb3IgUE5HIGltYWdlcyB0aGF0IGFyZSBlbWJlZGRlZCBpbiBNTkcgZGF0YXN0cmVhbXMuCi1MaWJwbmcgY2FuIHN1cHBvcnQgc29tZSBvZiB0aGVzZSBleHRlbnNpb25zLiAgVG8gZW5hYmxlIHRoZW0sIHVzZSB0aGUKLXBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzKCkgZnVuY3Rpb246Ci0KLSAgIGZlYXR1cmVfc2V0ID0gcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMocG5nX3B0ciwgbWFzaykKLQotICAgbWFzayBpcyBhIHBuZ191aW50XzMyIGNvbnRhaW5pbmcgdGhlIGJpdHdpc2UgT1Igb2YgdGhlCi0gICAgICAgIGZlYXR1cmVzIHlvdSB3YW50IHRvIGVuYWJsZS4gIFRoZXNlIGluY2x1ZGUKLSAgICAgICAgUE5HX0ZMQUdfTU5HX0VNUFRZX1BMVEUKLSAgICAgICAgUE5HX0ZMQUdfTU5HX0ZJTFRFUl82NAotICAgICAgICBQTkdfQUxMX01OR19GRUFUVVJFUwotCi0gICBmZWF0dXJlX3NldCBpcyBhIHBuZ191aW50XzMyIHRoYXQgaXMgdGhlIGJpdHdpc2UgQU5EIG9mCi0gICAgICB5b3VyIG1hc2sgd2l0aCB0aGUgc2V0IG9mIE1ORyBmZWF0dXJlcyB0aGF0IGlzCi0gICAgICBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgbGlicG5nIHRoYXQgeW91IGFyZSB1c2luZy4KLQotSXQgaXMgYW4gZXJyb3IgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgYSBzdGFuZGFsb25lCi1QTkcgZmlsZSB3aXRoIHRoZSBQTkcgOC1ieXRlIHNpZ25hdHVyZS4gIFRoZSBQTkcgZGF0YXN0cmVhbSBtdXN0IGJlIHdyYXBwZWQKLWluIGEgTU5HIGRhdGFzdHJlYW0uICBBcyBhIG1pbmltdW0sIGl0IG11c3QgaGF2ZSB0aGUgTU5HIDgtYnl0ZSBzaWduYXR1cmUKLWFuZCB0aGUgTUhEUiBhbmQgTUVORCBjaHVua3MuICBMaWJwbmcgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGVzZQotb3IgYW55IG90aGVyIE1ORyBjaHVua3M7IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGl0cyBvd24gc3VwcG9ydCBmb3IKLXRoZW0uICBZb3UgbWF5IHdpc2ggdG8gY29uc2lkZXIgdXNpbmcgbGlibW5nIChhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cubGlibW5nLmNvbSkgaW5zdGVhZC4KLQotLlNIIFZJSUkuICBDaGFuZ2VzIHRvIExpYnBuZyBmcm9tIHZlcnNpb24gMC44OAotCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB2ZXJzaW9ucyBvZiBsaWJwbmcgbGF0ZXIgdGhhbiAwLjk2IGFyZSBub3QKLWRpc3RyaWJ1dGVkIGJ5IHRoZSBvcmlnaW5hbCBsaWJwbmcgYXV0aG9yLCBHdXkgU2NoYWxuYXQsIG5vciBieQotQW5kcmVhcyBEaWxnZXIsIHdobyBoYWQgdGFrZW4gb3ZlciBmcm9tIEd1eSBkdXJpbmcgMTk5NiBhbmQgMTk5NywgYW5kCi1kaXN0cmlidXRlZCB2ZXJzaW9ucyAwLjg5IHRocm91Z2ggMC45NiwgYnV0IHJhdGhlciBieSBhbm90aGVyIG1lbWJlcgotb2YgdGhlIG9yaWdpbmFsIFBORyBHcm91cCwgR2xlbm4gUmFuZGVycy1QZWhyc29uLiAgR3V5IGFuZCBBbmRyZWFzIGFyZQotc3RpbGwgYWxpdmUgYW5kIHdlbGwsIGJ1dCB0aGV5IGhhdmUgbW92ZWQgb24gdG8gb3RoZXIgdGhpbmdzLgotCi1UaGUgb2xkIGxpYnBuZyBmdW5jdGlvbnMgcG5nX3JlYWRfaW5pdCgpLCBwbmdfd3JpdGVfaW5pdCgpLAotcG5nX2luZm9faW5pdCgpLCBwbmdfcmVhZF9kZXN0cm95KCksIGFuZCBwbmdfd3JpdGVfZGVzdHJveSgpIGhhdmUgYmVlbgotbW92ZWQgdG8gUE5HX0lOVEVSTkFMIGluIHZlcnNpb24gMC45NSB0byBkaXNjb3VyYWdlIHRoZWlyIHVzZS4gIFRoZXNlCi1mdW5jdGlvbnMgd2lsbCBiZSByZW1vdmVkIGZyb20gbGlicG5nIHZlcnNpb24gMS40LjAuCi0KLVRoZSBwcmVmZXJyZWQgbWV0aG9kIG9mIGNyZWF0aW5nIGFuZCBpbml0aWFsaXppbmcgdGhlIGxpYnBuZyBzdHJ1Y3R1cmVzIGlzCi12aWEgdGhlIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoKSwgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoKSwgYW5kCi1wbmdfY3JlYXRlX2luZm9fc3RydWN0KCkgYmVjYXVzZSB0aGV5IGlzb2xhdGUgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZXMKLWZyb20gdGhlIGFwcGxpY2F0aW9uLCBhbGxvdyB2ZXJzaW9uIGVycm9yIGNoZWNraW5nLCBhbmQgYWxzbyBhbGxvdyB0aGUKLXVzZSBvZiBjdXN0b20gZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiwgd2hpY2gKLXRoZSBvbGQgZnVuY3Rpb25zIGRvIG5vdC4gIFRoZSBmdW5jdGlvbnMgcG5nX3JlYWRfZGVzdHJveSgpIGFuZAotcG5nX3dyaXRlX2Rlc3Ryb3koKSBkbyBub3QgYWN0dWFsbHkgZnJlZSB0aGUgbWVtb3J5IHRoYXQgbGlicG5nCi1hbGxvY2F0ZWQgZm9yIHRoZXNlIHN0cnVjdHMsIGJ1dCBqdXN0IHJlc2V0IHRoZSBkYXRhIHN0cnVjdHVyZXMsIHNvIHRoZXkKLWNhbiBiZSB1c2VkIGluc3RlYWQgb2YgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKSBhbmQKLXBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgpIGlmIHlvdSBmZWVsIHRoZXJlIGlzIHRvbyBtdWNoIHN5c3RlbSBvdmVyaGVhZAotYWxsb2NhdGluZyBhbmQgZnJlZWluZyB0aGUgcG5nX3N0cnVjdCBmb3IgZWFjaCBpbWFnZSByZWFkLgotCi1TZXR0aW5nIHRoZSBlcnJvciBjYWxsYmFja3MgdmlhIHBuZ19zZXRfbWVzc2FnZV9mbigpIGJlZm9yZQotcG5nX3JlYWRfaW5pdCgpIGFzIHdhcyBzdWdnZXN0ZWQgaW4gbGlicG5nLTAuODggaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAotYmVjYXVzZSB0aGlzIGNhdXNlZCBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgdXNlIGN1c3RvbSBlcnJvciBmdW5jdGlvbnMKLXRvIGZhaWwgaWYgdGhlIHBuZ19wdHIgd2FzIG5vdCBpbml0aWFsaXplZCB0byB6ZXJvLiAgSXQgaXMgc3RpbGwgcG9zc2libGUKLXRvIHNldCB0aGUgZXJyb3IgY2FsbGJhY2tzIEFGVEVSIHBuZ19yZWFkX2luaXQoKSwgb3IgdG8gY2hhbmdlIHRoZW0gd2l0aAotcG5nX3NldF9lcnJvcl9mbigpLCB3aGljaCBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBmdW5jdGlvbiwgYnV0IHdpdGggYSBuZXcKLW5hbWUgdG8gZm9yY2UgY29tcGlsYXRpb24gZXJyb3JzIHdpdGggYXBwbGljYXRpb25zIHRoYXQgdHJ5IHRvIHVzZSB0aGUgb2xkCi1tZXRob2QuCi0KLVN1cHBvcnQgZm9yIHRoZSBzQ0FMLCBpQ0NQLCBpVFh0LCBhbmQgc1BMVCBjaHVua3Mgd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjAuNjsKLWhvd2V2ZXIsIGlUWHQgc3VwcG9ydCB3YXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLQotU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuMC43LCB5b3UgY2FuIGZpbmQgb3V0IHdoaWNoIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKLXlvdSBhcmUgdXNpbmcgYXQgcnVuLXRpbWU6Ci0KLSAgIHBuZ191aW50XzMyIGxpYnBuZ192biA9IHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIoKTsKLQotVGhlIG51bWJlciBsaWJwbmdfdm4gaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbWFqb3IgdmVyc2lvbiwgbWlub3IKLXZlcnNpb24gd2l0aCBsZWFkaW5nIHplcm8sIGFuZCByZWxlYXNlIG51bWJlciB3aXRoIGxlYWRpbmcgemVybywKLShlLmcuLCBsaWJwbmdfdm4gZm9yIHZlcnNpb24gMS4wLjcgaXMgMTAwMDcpLgotCi1Ob3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIGEgcG5nX3B0ciwgc28geW91IGNhbiBjYWxsIGl0Ci1iZWZvcmUgeW91J3ZlIGNyZWF0ZWQgb25lLgotCi1Zb3UgY2FuIGFsc28gY2hlY2sgd2hpY2ggdmVyc2lvbiBvZiBwbmcuaCB5b3UgdXNlZCB3aGVuIGNvbXBpbGluZyB5b3VyCi1hcHBsaWNhdGlvbjoKLQotICAgcG5nX3VpbnRfMzIgYXBwbGljYXRpb25fdm4gPSBQTkdfTElCUE5HX1ZFUjsKLQotLlNIIElYLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuMC54IHRvIDEuMi54Ci0KLVN1cHBvcnQgZm9yIHVzZXIgbWVtb3J5IG1hbmFnZW1lbnQgd2FzIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFRvCi1hY2NvbXBsaXNoIHRoaXMsIHRoZSBmdW5jdGlvbnMgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdF8yKCksCi1wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yKCksIHBuZ19zZXRfbWVtX2ZuKCksIHBuZ19nZXRfbWVtX3B0cigpLAotcG5nX21hbGxvY19kZWZhdWx0KCksIGFuZCBwbmdfZnJlZV9kZWZhdWx0KCkgd2VyZSBhZGRlZC4KLQotU3VwcG9ydCBmb3IgdGhlIGlUWHQgY2h1bmsgaGFzIGJlZW4gZW5hYmxlZCBieSBkZWZhdWx0IGFzIG9mCi12ZXJzaW9uIDEuMi40MS4KLQotU3VwcG9ydCBmb3IgY2VydGFpbiBNTkcgZmVhdHVyZXMgd2FzIGVuYWJsZWQuCi0KLVN1cHBvcnQgZm9yIG51bWJlcmVkIGVycm9yIG1lc3NhZ2VzIHdhcyBhZGRlZC4gIEhvd2V2ZXIsIHdlIG5ldmVyIGdvdAotYXJvdW5kIHRvIGFjdHVhbGx5IG51bWJlcmluZyB0aGUgZXJyb3IgbWVzc2FnZXMuICBUaGUgZnVuY3Rpb24KLXBuZ19zZXRfc3RyaXBfZXJyb3JfbnVtYmVycygpIHdhcyBhZGRlZCAoTm90ZTogdGhlIHByb3RvdHlwZSBmb3IgdGhpcwotZnVuY3Rpb24gd2FzIGluYWR2ZXJ0ZW50bHkgcmVtb3ZlZCBmcm9tIHBuZy5oIGluIFBOR19OT19BU1NFTUJMRVJfQ09ERQotYnVpbGRzIG9mIGxpYnBuZy0xLjIuMTUuICBJdCB3YXMgcmVzdG9yZWQgaW4gbGlicG5nLTEuMi4zNikuCi0KLVRoZSBwbmdfbWFsbG9jX3dhcm4oKSBmdW5jdGlvbiB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi4zLiAgVGhpcyBpc3N1ZXMKLWEgcG5nX3dhcm5pbmcgYW5kIHJldHVybnMgTlVMTCBpbnN0ZWFkIG9mIGFib3J0aW5nIHdoZW4gaXQgZmFpbHMgdG8KLWFjcXVpcmUgdGhlIHJlcXVlc3RlZCBtZW1vcnkgYWxsb2NhdGlvbi4KLQotU3VwcG9ydCBmb3Igc2V0dGluZyB1c2VyIGxpbWl0cyBvbiBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IHdhcyBlbmFibGVkCi1ieSBkZWZhdWx0LiAgVGhlIGZ1bmN0aW9ucyBwbmdfc2V0X3VzZXJfbGltaXRzKCksIHBuZ19nZXRfdXNlcl93aWR0aF9tYXgoKSwKLWFuZCBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCgpIHdlcmUgYWRkZWQgYXQgbGlicG5nLTEuMi42LgotCi1UaGUgcG5nX3NldF9hZGRfYWxwaGEoKSBmdW5jdGlvbiB3YXMgYWRkZWQgYXQgbGlicG5nLTEuMi43LgotCi1UaGUgZnVuY3Rpb24gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgd2FzIGFkZGVkIGF0IGxpYnBuZy0xLjIuOS4KLVVubGlrZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpLCB0aGUgbmV3IGZ1bmN0aW9uIGRvZXMgbm90IGV4cGFuZCB0aGUKLXRSTlMgY2h1bmsgdG8gYWxwaGEuIFRoZSBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIGZ1bmN0aW9uIGlzCi1kZXByZWNhdGVkLgotCi1BIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyBpbiBzdXBwb3J0IG9mIHJ1bnRpbWUgc2VsZWN0aW9uIG9mCi1hc3NlbWJsZXIgY29kZSBmZWF0dXJlcyAoZXNwZWNpYWxseSBJbnRlbCBNTVggY29kZSBzdXBwb3J0KSB3ZXJlCi1hZGRlZCBhdCBsaWJwbmctMS4yLjA6Ci0KLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfQ09NUElMRUQKLSAgICBQTkdfQVNNX0ZMQUdfTU1YX1NVUFBPUlRfSU5fQ1BVCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0NPTUJJTkVfUk9XCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0lOVEVSTEFDRQotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfU1VCCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9VUAotICAgIFBOR19BU01fRkxBR19NTVhfUkVBRF9GSUxURVJfQVZHCi0gICAgUE5HX0FTTV9GTEFHX01NWF9SRUFEX0ZJTFRFUl9QQUVUSAotICAgIFBOR19BU01fRkxBR1NfSU5JVElBTElaRUQKLSAgICBQTkdfTU1YX1JFQURfRkxBR1MKLSAgICBQTkdfTU1YX0ZMQUdTCi0gICAgUE5HX01NWF9XUklURV9GTEFHUwotICAgIFBOR19NTVhfRkxBR1MKLQotV2UgYWRkZWQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW4gc3VwcG9ydCBvZiBydW50aW1lCi1zZWxlY3Rpb24gb2YgYXNzZW1ibGVyIGNvZGUgZmVhdHVyZXM6Ci0KLSAgICBwbmdfZ2V0X21teF9mbGFnbWFzaygpCi0gICAgcG5nX3NldF9tbXhfdGhyZXNob2xkcygpCi0gICAgcG5nX2dldF9hc21fZmxhZ3MoKQotICAgIHBuZ19nZXRfbW14X2JpdGRlcHRoX3RocmVzaG9sZCgpCi0gICAgcG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKCkKLSAgICBwbmdfc2V0X2FzbV9mbGFncygpCi0KLVdlIHJlcGxhY2VkIGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgd2l0aCBzaW1wbGUgc3R1YnMgaW4gbGlicG5nLTEuMi4yMCwKLXdoZW4gdGhlIEludGVsIGFzc2VtYmxlciBjb2RlIHdhcyByZW1vdmVkIGR1ZSB0byBhIGxpY2Vuc2luZyBpc3N1ZS4KLQotVGhlc2UgbWFjcm9zIGFyZSBkZXByZWNhdGVkOgotCi0gICAgUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVECi0gICAgUE5HX1BST0dSRVNTSVZFX1JFQURfTk9UX1NVUFBPUlRFRAotICAgIFBOR19OT19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVECi0gICAgUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAotICAgIFBOR19SRUFEX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRAotICAgIFBOR19XUklURV9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQKLQotVGhleSBoYXZlIGJlZW4gcmVwbGFjZWQsIHJlc3BlY3RpdmVseSwgYnk6Ci0KLSAgICBQTkdfTk9fUkVBRF9UUkFOU0ZPUk1TCi0gICAgUE5HX05PX1BST0dSRVNTSVZFX1JFQUQKLSAgICBQTkdfTk9fU0VRVUVOVElBTF9SRUFECi0gICAgUE5HX05PX1dSSVRFX1RSQU5TRk9STVMKLSAgICBQTkdfTk9fUkVBRF9BTkNJTExBUllfQ0hVTktTCi0gICAgUE5HX05PX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1MKLQotUE5HX01BWF9VSU5UIHdhcyByZXBsYWNlZCB3aXRoIFBOR19VSU5UXzMxX01BWC4gIEl0IGhhcyBiZWVuCi1kZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0xLjAuMTYgYW5kIGxpYnBuZy0xLjIuNi4KLQotVGhlIGZ1bmN0aW9uCi0gICAgcG5nX2NoZWNrX3NpZyhzaWcsIG51bSkKLXdhcyByZXBsYWNlZCB3aXRoCi0gICAgIXBuZ19zaWdfY21wKHNpZywgMCwgbnVtKQotSXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMC45MC4KLQotVGhlIGZ1bmN0aW9uCi0gICAgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoKQotd2hpY2ggYWxzbyBleHBhbmRzIHRSTlMgdG8gYWxwaGEgd2FzIHJlcGxhY2VkIHdpdGgKLSAgICBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzgoKQotd2hpY2ggZG9lcyBub3QuIEl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgbGlicG5nLTEuMC4xOCBhbmQgMS4yLjkuCi0KLS5TSCBYLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuMC54LzEuMi54IHRvIDEuNC54Ci0KLVByaXZhdGUgbGlicG5nIHByb3RvdHlwZXMgYW5kIG1hY3JvIGRlZmluaXRpb25zIHdlcmUgbW92ZWQgZnJvbQotcG5nLmggYW5kIHBuZ2NvbmYuaCBpbnRvIGEgbmV3IHBuZ3ByaXYuaCBoZWFkZXIgZmlsZS4KLQotRnVuY3Rpb25zIHBuZ19zZXRfYmVuaWduX2Vycm9ycygpLCBwbmdfYmVuaWduX2Vycm9yKCksIGFuZAotcG5nX2NodW5rX2Jlbmlnbl9lcnJvcigpIHdlcmUgYWRkZWQuCi0KLVN1cHBvcnQgZm9yIHNldHRpbmcgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0aGF0IHRoZSBhcHBsaWNhdGlvbgotd2lsbCBhbGxvY2F0ZSBmb3IgcmVhZGluZyBjaHVua3Mgd2FzIGFkZGVkLCBhcyBhIHNlY3VyaXR5IG1lYXN1cmUuCi1UaGUgZnVuY3Rpb25zIHBuZ19zZXRfY2h1bmtfY2FjaGVfbWF4KCkgYW5kIHBuZ19nZXRfY2h1bmtfY2FjaGVfbWF4KCkKLXdlcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkuCi0KLVdlIGltcGxlbWVudGVkIHN1cHBvcnQgZm9yIEkvTyBzdGF0ZXMgYnkgYWRkaW5nIHBuZ19wdHIgbWVtYmVyIGlvX3N0YXRlCi1hbmQgZnVuY3Rpb25zIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSgpIGFuZCBwbmdfZ2V0X2lvX3N0YXRlKCkgaW4gcG5nZ2V0LmMKLQotV2UgYWRkZWQgUE5HX1RSQU5TRk9STV9HUkFZX1RPX1JHQiB0byB0aGUgYXZhaWxhYmxlIGhpZ2gtbGV2ZWwKLWlucHV0IHRyYW5zZm9ybXMuCi0KLUNoZWNraW5nIGZvciBhbmQgcmVwb3J0aW5nIG9mIGVycm9ycyBpbiB0aGUgSUhEUiBjaHVuayBpcyBtb3JlIHRob3JvdWdoLgotCi1TdXBwb3J0IGZvciBnbG9iYWwgYXJyYXlzIHdhcyByZW1vdmVkLCB0byBpbXByb3ZlIHRocmVhZCBzYWZldHkuCi0KLVNvbWUgb2Jzb2xldGUvZGVwcmVjYXRlZCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZC4KLQotVHlwZWNhc3RlZCBOVUxMIGRlZmluaXRpb25zIHN1Y2ggYXMKLSAgICNkZWZpbmUgcG5nX3ZvaWRwX05VTEwgICAgICAgICAgICAocG5nX3ZvaWRwKU5VTEwKLXdlcmUgZWxpbWluYXRlZC4gIElmIHlvdSB1c2VkIHRoZXNlIGluIHlvdXIgYXBwbGljYXRpb24sIGp1c3QgdXNlCi1OVUxMIGluc3RlYWQuCi0KLVRoZSBwbmdfc3RydWN0IGFuZCBpbmZvX3N0cnVjdCBtZW1iZXJzICJ0cmFucyIgYW5kICJ0cmFuc192YWx1ZXMiIHdlcmUKLWNoYW5nZWQgdG8gInRyYW5zX2FscGhhIiBhbmQgInRyYW5zX2NvbG9yIiwgcmVzcGVjdGl2ZWx5LgotCi1UaGUgb2Jzb2xldGUsIHVudXNlZCBwbmdnY2NyZC5jIGFuZCBwbmd2Y3JkLmMgZmlsZXMgYW5kIHJlbGF0ZWQgbWFrZWZpbGVzCi13ZXJlIHJlbW92ZWQuCi0KLVRoZSBQTkdfMV8wX1ggYW5kIFBOR18xXzJfWCBtYWNyb3Mgd2VyZSBlbGltaW5hdGVkLgotCi1UaGUgUE5HX0xFR0FDWV9TVVBQT1JURUQgbWFjcm8gd2FzIGVsaW1pbmF0ZWQuCi0KLU1hbnkgV0lOMzJfV0NFICNpZmRlZnMgd2VyZSByZW1vdmVkLgotCi1UaGUgZnVuY3Rpb25zIHBuZ19yZWFkX2luaXQoaW5mb19wdHIpLCBwbmdfd3JpdGVfaW5pdChpbmZvX3B0ciksCi1wbmdfaW5mb19pbml0KGluZm9fcHRyKSwgcG5nX3JlYWRfZGVzdHJveSgpLCBhbmQgcG5nX3dyaXRlX2Rlc3Ryb3koKQotaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGV5IGhhdmUgYmVlbiBkZXByZWNhdGVkIHNpbmNlIGxpYnBuZy0wLjk1LgotCi1UaGUgcG5nX3Blcm1pdF9lbXB0eV9wbHRlKCkgd2FzIHJlbW92ZWQuIEl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQKLXNpbmNlIGxpYnBuZy0xLjAuOS4gIFVzZSBwbmdfcGVybWl0X21uZ19mZWF0dXJlcygpIGluc3RlYWQuCi0KLVdlIHJlbW92ZWQgdGhlIG9ic29sZXRlIHN0dWIgZnVuY3Rpb25zIHBuZ19nZXRfbW14X2ZsYWdtYXNrKCksCi1wbmdfc2V0X21teF90aHJlc2hvbGRzKCksIHBuZ19nZXRfYXNtX2ZsYWdzKCksCi1wbmdfZ2V0X21teF9iaXRkZXB0aF90aHJlc2hvbGQoKSwgcG5nX2dldF9tbXhfcm93Ynl0ZXNfdGhyZXNob2xkKCksCi1wbmdfc2V0X2FzbV9mbGFncygpLCBhbmQgcG5nX21teF9zdXBwb3J0ZWQoKQotCi1XZSByZW1vdmVkIHRoZSBvYnNvbGV0ZSBwbmdfY2hlY2tfc2lnKCksIHBuZ19tZW1jcHlfY2hlY2soKSwgYW5kCi1wbmdfbWVtc2V0X2NoZWNrKCkgZnVuY3Rpb25zLiAgSW5zdGVhZCB1c2UgIXBuZ19zaWdfY21wKCksIG1lbWNweSgpLAotYW5kIG1lbXNldCgpLCByZXNwZWN0aXZlbHkuCi0KLVRoZSBmdW5jdGlvbiBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIHdhcyByZW1vdmVkLiBJdCBoYXMgYmVlbgotZGVwcmVjYXRlZCBzaW5jZSBsaWJwbmctMS4wLjE4IGFuZCAxLjIuOSwgd2hlbiBpdCB3YXMgcmVwbGFjZWQgd2l0aAotcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCkgYmVjYXVzZSB0aGUgZm9ybWVyIGZ1bmN0aW9uIGFsc28KLWV4cGFuZGVkIGFueSB0Uk5TIGNodW5rIHRvIGFuIGFscGhhIGNoYW5uZWwuCi0KLU1hY3JvcyBmb3IgcG5nX2dldF91aW50XzE2LCBwbmdfZ2V0X3VpbnRfMzIsIGFuZCBwbmdfZ2V0X2ludF8zMgotd2VyZSBhZGRlZCBhbmQgYXJlIHVzZWQgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIHRoZSBjb3JyZXNwb25kaW5nCi1mdW5jdGlvbnMuIFVuZm9ydHVuYXRlbHksCi1mcm9tIGxpYnBuZy0xLjQuMCB1bnRpbCAxLjQuNCwgdGhlIHBuZ19nZXRfdWludF8xNiBtYWNybyAoYnV0IG5vdCB0aGUKLWZ1bmN0aW9uKSBpbmNvcnJlY3RseSByZXR1cm5lZCBhIHZhbHVlIG9mIHR5cGUgcG5nX3VpbnRfMzIuCi0KLVdlIGNoYW5nZWQgdGhlIHByb3RvdHlwZSBmb3IgcG5nX21hbGxvYygpIGZyb20KLSAgICBwbmdfbWFsbG9jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ191aW50XzMyIHNpemUpCi10bwotICAgIHBuZ19tYWxsb2MocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2FsbG9jX3NpemVfdCBzaXplKQotCi1UaGlzIGFsc28gYXBwbGllcyB0byB0aGUgcHJvdG90eXBlIGZvciB0aGUgdXNlciByZXBsYWNlbWVudCBtYWxsb2NfZm4oKS4KLQotVGhlIHBuZ19jYWxsb2MoKSBmdW5jdGlvbiB3YXMgYWRkZWQgYW5kIGlzIHVzZWQgaW4gcGxhY2Ugb2YKLW9mICJwbmdfbWFsbG9jKCk7IG1lbXNldCgpOyIgZXhjZXB0IGluIHRoZSBjYXNlIGluIHBuZ19yZWFkX3BuZygpCi13aGVyZSB0aGUgYXJyYXkgY29uc2lzdHMgb2YgcG9pbnRlcnM7IGluIHRoaXMgY2FzZSBhICJmb3IiIGxvb3AgaXMgdXNlZAotYWZ0ZXIgdGhlIHBuZ19tYWxsb2MoKSB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIE5VTEwsIHRvIGdpdmUgcm9idXN0LgotYmVoYXZpb3IgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gcnVucyBvdXQgb2YgbWVtb3J5IHBhcnQtd2F5IHRocm91Z2gKLXRoZSBwcm9jZXNzLgotCi1XZSBjaGFuZ2VkIHRoZSBwcm90b3R5cGVzIG9mIHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSBhbmQKLXBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUoKSB0byB3b3JrIHdpdGggcG5nX3NpemVfdCBpbnN0ZWFkIG9mCi1wbmdfdWludF8zMi4KLQotU3VwcG9ydCBmb3IgbnVtYmVyZWQgZXJyb3IgbWVzc2FnZXMgd2FzIHJlbW92ZWQgYnkgZGVmYXVsdCwgc2luY2Ugd2UKLW5ldmVyIGdvdCBhcm91bmQgdG8gYWN0dWFsbHkgbnVtYmVyaW5nIHRoZSBlcnJvciBtZXNzYWdlcy4gVGhlIGZ1bmN0aW9uCi1wbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMoKSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaWJyYXJ5IGJ5IGRlZmF1bHQuCi0KLVRoZSBwbmdfemFsbG9jKCkgYW5kIHBuZ196ZnJlZSgpIGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIGV4cG9ydGVkLgotVGhlIHBuZ196YWxsb2MoKSBmdW5jdGlvbiBubyBsb25nZXIgemVyb2VzIG91dCB0aGUgbWVtb3J5IHRoYXQgaXQKLWFsbG9jYXRlcy4gIEFwcGxpY2F0aW9ucyB0aGF0IGNhbGxlZCBwbmdfemFsbG9jKHBuZ19wdHIsIG51bWJlciwgc2l6ZSkKLWNhbiBjYWxsIHBuZ19jYWxsb2MocG5nX3B0ciwgbnVtYmVyKnNpemUpIGluc3RlYWQsIGFuZCBjYW4gY2FsbAotcG5nX2ZyZWUoKSBpbnN0ZWFkIG9mIHBuZ196ZnJlZSgpLgotCi1TdXBwb3J0IGZvciBkaXRoZXJpbmcgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQgaW4gbGlicG5nLTEuNC4wLCBiZWNhdXNlCi1pdCBoYXMgbm90IGJlZW4gd2VsbCB0ZXN0ZWQgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgImRpdGhlciIuCi1UaGUgY29kZSB3YXMgbm90Ci1yZW1vdmVkLCBob3dldmVyLCBhbmQgY291bGQgYmUgZW5hYmxlZCBieSBidWlsZGluZyBsaWJwbmcgd2l0aAotUE5HX1JFQURfRElUSEVSX1NVUFBPUlRFRCBkZWZpbmVkLiAgSW4gbGlicG5nLTEuNC4yLCB0aGlzIHN1cHBvcnQKLXdhcyByZS1lbmFibGVkLCBidXQgdGhlIGZ1bmN0aW9uIHdhcyByZW5hbWVkIHBuZ19zZXRfcXVhbnRpemUoKSB0bwotcmVmbGVjdCBtb3JlIGFjY3VyYXRlbHkgd2hhdCBpdCBhY3R1YWxseSBkb2VzLiAgQXQgdGhlIHNhbWUgdGltZSwKLXRoZSBQTkdfRElUSEVSX1tSRUQsR1JFRU5fQkxVRV1fQklUUyBtYWNyb3Mgd2VyZSBhbHNvIHJlbmFtZWQgdG8KLVBOR19RVUFOVElaRV9bUkVELEdSRUVOLEJMVUVdX0JJVFMsIGFuZCBQTkdfUkVBRF9ESVRIRVJfU1VQUE9SVEVECi13YXMgcmVuYW1lZCB0byBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQuCi0KLVdlIHJlbW92ZWQgdGhlIHRyYWlsaW5nICcuJyBmcm9tIHRoZSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KLQotLlNIIFhJLiAgQ2hhbmdlcyB0byBMaWJwbmcgZnJvbSB2ZXJzaW9uIDEuNC54IHRvIDEuNS54Ci0KLUZyb20gbGlicG5nLTEuNC4wIHVudGlsIDEuNC40LCB0aGUgcG5nX2dldF91aW50XzE2IG1hY3JvIChidXQgbm90IHRoZQotZnVuY3Rpb24pIGluY29ycmVjdGx5IHJldHVybmVkIGEgdmFsdWUgb2YgdHlwZSBwbmdfdWludF8zMi4KLVRoZSBpbmNvcnJlY3QgbWFjcm8gd2FzIHJlbW92ZWQgZnJvbSBsaWJwbmctMS40LjUuCi0KLUNoZWNraW5nIGZvciBpbnZhbGlkIHBhbGV0dGUgaW5kZXggb24gd3JpdGUgd2FzIGFkZGVkIGF0IGxpYnBuZwotMS41LjEwLiAgSWYgYSBwaXhlbCBjb250YWlucyBhbiBpbnZhbGlkIChvdXQtb2YtcmFuZ2UpIGluZGV4IGxpYnBuZyBpc3N1ZXMKLWEgYmVuaWduIGVycm9yLiAgVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGlzIGNvbmRpdGlvbiBpcyBhbgotZXJyb3IgYWNjb3JkaW5nIHRvIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiwgQ2xhdXNlIDExLjMuMiwgYnV0IHRoZSBlcnJvciBjYW4KLWJlIGlnbm9yZWQgaW4gZWFjaCBwbmdfcHRyIHdpdGgKLQotICAgcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleChwbmdfcHRyLCBhbGxvd2VkKTsKLQotICAgICAgYWxsb3dlZCAgLSBvbmUgb2YKLSAgICAgICAgICAgICAgICAgMDogZGlzYWJsZSBiZW5pZ24gZXJyb3IgKGFjY2VwdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBkYXRhIHdpdGhvdXQgd2FybmluZykuCi0gICAgICAgICAgICAgICAgIDE6IGVuYWJsZSBiZW5pZ24gZXJyb3IgKHRyZWF0IHRoZQotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGRhdGEgYXMgYW4gZXJyb3Igb3IgYQotICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKS4KLQotSWYgdGhlIGVycm9yIGlzIGlnbm9yZWQsIG9yIGlmIHBuZ19iZW5pZ25fZXJyb3IoKSB0cmVhdHMgaXQgYXMgYSB3YXJuaW5nLAotYW55IGludmFsaWQgcGl4ZWxzIGFyZSBkZWNvZGVkIGFzIG9wYXF1ZSBibGFjayBieSB0aGUgZGVjb2RlciBhbmQgd3JpdHRlbgotYXMtaXMgYnkgdGhlIGVuY29kZXIuCi0KLVJldHJpZXZpbmcgdGhlIG1heGltdW0gcGFsZXR0ZSBpbmRleCBmb3VuZCB3YXMgYWRkZWQgYXQgbGlicG5nLTEuNS4xNS4KLVRoaXMgc3RhdGVtZW50IG11c3QgYXBwZWFyIGFmdGVyIHBuZ19yZWFkX3BuZygpIG9yIHBuZ19yZWFkX2ltYWdlKCkgd2hpbGUKLXJlYWRpbmcsIGFuZCBhZnRlciBwbmdfd3JpdGVfcG5nKCkgb3IgcG5nX3dyaXRlX2ltYWdlKCkgd2hpbGUgd3JpdGluZy4KLQotICAgaW50IG1heF9wYWxldHRlID0gcG5nX2dldF9wYWxldHRlX21heChwbmdfcHRyLCBpbmZvX3B0cik7Ci0KLVRoaXMgd2lsbCByZXR1cm4gdGhlIG1heGltdW0gcGFsZXR0ZSBpbmRleCBmb3VuZCBpbiB0aGUgaW1hZ2UsIG9yICJcLTEiIGlmCi10aGUgcGFsZXR0ZSB3YXMgbm90IGNoZWNrZWQsIG9yICIwIiBpZiBubyBwYWxldHRlIHdhcyBmb3VuZC4gIE5vdGUgdGhhdCB0aGlzCi1kb2VzIG5vdCBhY2NvdW50IGZvciBhbnkgcGFsZXR0ZSBpbmRleCB1c2VkIGJ5IGFuY2lsbGFyeSBjaHVua3Mgc3VjaCBhcyB0aGUKLWJLR0QgY2h1bms7IHlvdSBtdXN0IGNoZWNrIHRob3NlIHNlcGFyYXRlbHkgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtCi1wYWxldHRlIGluZGV4IGFjdHVhbGx5IHVzZWQuCi0KLVRoZXJlIGFyZSBubyBzdWJzdGFudGlhbCBBUEkgY2hhbmdlcyBiZXR3ZWVuIHRoZSBub24tZGVwcmVjYXRlZCBwYXJ0cyBvZgotdGhlIDEuNC41IEFQSSBhbmQgdGhlIDEuNS4wIEFQSTsgaG93ZXZlciwgdGhlIGFiaWxpdHkgdG8gZGlyZWN0bHkgYWNjZXNzCi1tZW1iZXJzIG9mIHRoZSBtYWluIGxpYnBuZyBjb250cm9sIHN0cnVjdHVyZXMsIHBuZ19zdHJ1Y3QgYW5kIHBuZ19pbmZvLAotZGVwcmVjYXRlZCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIGxpYnBuZywgaGFzIGJlZW4gY29tcGxldGVseSByZW1vdmVkIGZyb20KLWxpYnBuZyAxLjUsIGFuZCBuZXcgcHJpdmF0ZSAicG5nc3RydWN0LmgiLCAicG5naW5mby5oIiwgYW5kICJwbmdkZWJ1Zy5oIgotaGVhZGVyIGZpbGVzIHdlcmUgY3JlYXRlZC4KLQotV2Ugbm8gbG9uZ2VyIGluY2x1ZGUgemxpYi5oIGluIHBuZy5oLiAgVGhlIGluY2x1ZGUgc3RhdGVtZW50IGhhcyBiZWVuIG1vdmVkCi10byBwbmdzdHJ1Y3QuaCwgd2hlcmUgaXQgaXMgbm90IGFjY2Vzc2libGUgYnkgYXBwbGljYXRpb25zLiBBcHBsaWNhdGlvbnMgdGhhdAotbmVlZCBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gaW4gemxpYi5oIHdpbGwgbmVlZCB0byBhZGQgdGhlICcjaW5jbHVkZSAiemxpYi5oIicKLWRpcmVjdGl2ZS4gIEl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIHRoaXMgaXMgcGxhY2VkIHByaW9yIHRvIG9yIGFmdGVyCi10aGUgJyIjaW5jbHVkZSBwbmcuaCInIGRpcmVjdGl2ZS4KLQotVGhlIHBuZ19zcHJpbnRmKCksIHBuZ19zdHJjcHkoKSwgYW5kIHBuZ19zdHJuY3B5KCkgbWFjcm9zIGFyZSBubyBsb25nZXIgdXNlZAotYW5kIHdlcmUgcmVtb3ZlZC4KLQotV2UgbW92ZWQgdGhlIHBuZ19zdHJsZW4oKSwgcG5nX21lbWNweSgpLCBwbmdfbWVtc2V0KCksIGFuZCBwbmdfbWVtY21wKCkKLW1hY3JvcyBpbnRvIGEgcHJpdmF0ZSBoZWFkZXIgZmlsZSAocG5ncHJpdi5oKSB0aGF0IGlzIG5vdCBhY2Nlc3NpYmxlIHRvCi1hcHBsaWNhdGlvbnMuCi0KLUluIHBuZ19nZXRfaUNDUCwgdGhlIHR5cGUgb2YgInByb2ZpbGUiIHdhcyBjaGFuZ2VkIGZyb20gcG5nX2NoYXJwcAotdG8gcG5nX2J5dGVwcCwgYW5kIGluIHBuZ19zZXRfaUNDUCwgZnJvbSBwbmdfY2hhcnAgdG8gcG5nX2NvbnN0X2J5dGVwLgotCi1UaGVyZSBhcmUgY2hhbmdlcyBvZiBmb3JtIGluIHBuZy5oLCBpbmNsdWRpbmcgbmV3IGFuZCBjaGFuZ2VkIG1hY3JvcyB0bwotZGVjbGFyZSBwYXJ0cyBvZiB0aGUgQVBJLiAgU29tZSBBUEkgZnVuY3Rpb25zIHdpdGggYXJndW1lbnRzIHRoYXQgYXJlCi1wb2ludGVycyB0byBkYXRhIG5vdCBtb2RpZmllZCB3aXRoaW4gdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBjb3JyZWN0ZWQgdG8KLWRlY2xhcmUgdGhlc2UgYXJndW1lbnRzIHdpdGggUE5HX0NPTlNULgotCi1NdWNoIG9mIHRoZSBpbnRlcm5hbCB1c2Ugb2YgQyBtYWNyb3MgdG8gY29udHJvbCB0aGUgbGlicmFyeSBidWlsZCBoYXMgYWxzbwotY2hhbmdlZCBhbmQgc29tZSBvZiB0aGlzIGlzIHZpc2libGUgaW4gdGhlIGV4cG9ydGVkIGhlYWRlciBmaWxlcywgaW4KLXBhcnRpY3VsYXIgdGhlIHVzZSBvZiBtYWNyb3MgdG8gY29udHJvbCBkYXRhIGFuZCBBUEkgZWxlbWVudHMgdmlzaWJsZQotZHVyaW5nIGFwcGxpY2F0aW9uIGNvbXBpbGF0aW9uIG1heSByZXF1aXJlIHNpZ25pZmljYW50IHJldmlzaW9uIHRvCi1hcHBsaWNhdGlvbiBjb2RlLiAgKEl0IGlzIGV4dHJlbWVseSByYXJlIGZvciBhbiBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLikKLQotQW55IHByb2dyYW0gdGhhdCBjb21waWxlZCBhZ2FpbnN0IGxpYnBuZyAxLjQgYW5kIGRpZCBub3QgdXNlIGRlcHJlY2F0ZWQKLWZlYXR1cmVzIG9yIGFjY2VzcyBpbnRlcm5hbCBsaWJyYXJ5IHN0cnVjdHVyZXMgc2hvdWxkIGNvbXBpbGUgYW5kIHdvcmsKLWFnYWluc3QgbGlicG5nIDEuNSwgZXhjZXB0IGZvciB0aGUgY2hhbmdlIGluIHRoZSBwcm90b3R5cGUgZm9yCi1wbmdfZ2V0X2lDQ1AoKSBhbmQgcG5nX3NldF9pQ0NQKCkgQVBJIGZ1bmN0aW9ucyBtZW50aW9uZWQgYWJvdmUuCi0KLWxpYnBuZyAxLjUuMCBhZGRzIFBOR18gUEFTUyBtYWNyb3MgdG8gaGVscCBpbiB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotaW50ZXJsYWNlZCBpbWFnZXMuICBUaGUgbWFjcm9zIHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4KLWVhY2ggcGFzcyBhbmQgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZS1pbnRlcmxhY2UgYW5kIChpZgotYWJzb2x1dGVseSBuZWNlc3NhcnkpIGludGVybGFjZSBhbiBpbWFnZS4KLQotbGlicG5nIDEuNS4wIGFkZHMgYW4gQVBJIHBuZ19sb25nam1wKHBuZ19wdHIsIHZhbHVlKS4gIFRoaXMgQVBJIGNhbGxzCi10aGUgYXBwbGljYXRpb24tcHJvdmlkZWQgcG5nX2xvbmdqbXBfcHRyIG9uIHRoZSBpbnRlcm5hbCwgYnV0IGFwcGxpY2F0aW9uCi1pbml0aWFsaXplZCwgbG9uZ2ptcCBidWZmZXIuICBJdCBpcyBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIHRvIGF2b2lkCi10aGUgbmVlZCB0byB1c2UgdGhlIHBuZ19qbXBidWYgbWFjcm8sIHdoaWNoIGhhZCB0aGUgdW5uZWNlc3Nhcnkgc2lkZQotZWZmZWN0IG9mIHJlc2V0dGluZyB0aGUgaW50ZXJuYWwgcG5nX2xvbmdqbXBfcHRyIHZhbHVlLgotCi1saWJwbmcgMS41LjAgaW5jbHVkZXMgYSBjb21wbGV0ZSBmaXhlZCBwb2ludCBBUEkuICBCeSBkZWZhdWx0IHRoaXMgaXMKLXByZXNlbnQgYWxvbmcgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmbG9hdGluZyBwb2ludCBBUEkuICBJbiBnZW5lcmFsIHRoZQotZml4ZWQgcG9pbnQgQVBJIGlzIGZhc3RlciBhbmQgc21hbGxlciB0aGFuIHRoZSBmbG9hdGluZyBwb2ludCBvbmUgYmVjYXVzZQotdGhlIFBORyBmaWxlIGZvcm1hdCB1c2VkIGZpeGVkIHBvaW50LCBub3QgZmxvYXRpbmcgcG9pbnQuICBUaGlzIGFwcGxpZXMKLWV2ZW4gaWYgdGhlIGxpYnJhcnkgdXNlcyBmbG9hdGluZyBwb2ludCBpbiBpbnRlcm5hbCBjYWxjdWxhdGlvbnMuICBBIG5ldwotbWFjcm8sIFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCwgcmV2ZWFscyB3aGV0aGVyIHRoZSBsaWJyYXJ5Ci11c2VzIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgKHRoZSBkZWZhdWx0KSBvciBmaXhlZCBwb2ludCBhcml0aG1ldGljCi1pbnRlcm5hbGx5IGZvciBwZXJmb3JtYW5jZSBjcml0aWNhbCBjYWxjdWxhdGlvbnMgc3VjaCBhcyBnYW1tYSBjb3JyZWN0aW9uLgotSW4gc29tZSBjYXNlcywgdGhlIGdhbW1hIGNhbGN1bGF0aW9ucyBtYXkgcHJvZHVjZSBzbGlnaHRseSBkaWZmZXJlbnQKLXJlc3VsdHMuICBUaGlzIGhhcyBjaGFuZ2VkIHRoZSByZXN1bHRzIGluIHBuZ19yZ2JfdG9fZ3JheSBhbmQgaW4gYWxwaGEKLWNvbXBvc2l0aW9uIChwbmdfc2V0X2JhY2tncm91bmQgZm9yIGV4YW1wbGUpLiBUaGlzIGFwcGxpZXMgZXZlbiBpZiB0aGUKLW9yaWdpbmFsIGltYWdlIHdhcyBhbHJlYWR5IGxpbmVhciAoZ2FtbWEgPT0gMS4wKSBhbmQsIHRoZXJlZm9yZSwgaXQgaXMKLW5vdCBuZWNlc3NhcnkgdG8gbGluZWFyaXplIHRoZSBpbWFnZS4gIFRoaXMgaXMgYmVjYXVzZSBsaWJwbmcgaGFzICpub3QqCi1iZWVuIGNoYW5nZWQgdG8gb3B0aW1pemUgdGhhdCBjYXNlIGNvcnJlY3RseSwgeWV0LgotCi1GaXhlZCBwb2ludCBzdXBwb3J0IGZvciB0aGUgc0NBTCBjaHVuayBjb21lcyB3aXRoIGFuIGltcG9ydGFudCBjYXZlYXQ7Ci10aGUgc0NBTCBzcGVjaWZpY2F0aW9uIHVzZXMgYSBkZWNpbWFsIGVuY29kaW5nIG9mIGZsb2F0aW5nIHBvaW50IHZhbHVlcwotYW5kIHRoZSBhY2N1cmFjeSBvZiBQTkcgZml4ZWQgcG9pbnQgdmFsdWVzIGlzIGluc3VmZmljaWVudCBmb3IKLXJlcHJlc2VudGF0aW9uIG9mIHRoZXNlIHZhbHVlcy4gQ29uc2VxdWVudGx5IGEgInN0cmluZyIgQVBJCi0ocG5nX2dldF9zQ0FMX3MgYW5kIHBuZ19zZXRfc0NBTF9zKSBpcyB0aGUgb25seSByZWxpYWJsZSB3YXkgb2YgcmVhZGluZwotYXJiaXRyYXJ5IHNDQUwgY2h1bmtzIGluIHRoZSBhYnNlbmNlIG9mIGVpdGhlciB0aGUgZmxvYXRpbmcgcG9pbnQgQVBJIG9yCi1pbnRlcm5hbCBmbG9hdGluZyBwb2ludCBjYWxjdWxhdGlvbnMuICBTdGFydGluZyB3aXRoIGxpYnBuZy0xLjUuMCwgYm90aAotb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBwcmVzZW50IHdoZW4gUE5HX3NDQUxfU1VQUE9SVEVEIGlzIGRlZmluZWQuICBQcmlvcgotdG8gbGlicG5nLTEuNS4wLCB0aGVpciBwcmVzZW5jZSBhbHNvIGRlcGVuZGVkIHVwb24gUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRAotYmVpbmcgZGVmaW5lZCBhbmQgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCBub3QgYmVpbmcgZGVmaW5lZC4KLQotQXBwbGljYXRpb25zIG5vIGxvbmdlciBuZWVkIHRvIGluY2x1ZGUgdGhlIG9wdGlvbmFsIGRpc3RyaWJ1dGlvbiBoZWFkZXIKLWZpbGUgcG5ndXNyLmggb3IgZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIG1hY3JvcyBkdXJpbmcgYXBwbGljYXRpb24KLWJ1aWxkIGluIG9yZGVyIHRvIHNlZSB0aGUgY29ycmVjdCB2YXJpYW50IG9mIHRoZSBsaWJwbmcgQVBJLiAgRnJvbSAxLjUuMAotYXBwbGljYXRpb24gY29kZSBjYW4gY2hlY2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIF9TVVBQT1JURUQgbWFjcm86Ci0KLSNpZmRlZiBQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQKLSAgIC8qIGNvZGUgdGhhdCB1c2VzIHRoZSBpbmNoIGNvbnZlcnNpb24gQVBJcy4gKi8KLSNlbmRpZgotCi1UaGlzIG1hY3JvIHdpbGwgb25seSBiZSBkZWZpbmVkIGlmIHRoZSBpbmNoIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhhdmUgYmVlbgotY29tcGlsZWQgaW50byBsaWJwbmcuICBUaGUgZnVsbCBzZXQgb2YgbWFjcm9zLCBhbmQgd2hldGhlciBvciBub3Qgc3VwcG9ydAotaGFzIGJlZW4gY29tcGlsZWQgaW4sIGFyZSBhdmFpbGFibGUgaW4gdGhlIGhlYWRlciBmaWxlIHBuZ2xpYmNvbmYuaC4KLVRoaXMgaGVhZGVyIGZpbGUgaXMgc3BlY2lmaWMgdG8gdGhlIGxpYnBuZyBidWlsZC4gIE5vdGljZSB0aGF0IHByaW9yIHRvCi0xLjUuMCB0aGUgX1NVUFBPUlRFRCBtYWNyb3Mgd291bGQgYWx3YXlzIGhhdmUgdGhlIGRlZmF1bHQgZGVmaW5pdGlvbiB1bmxlc3MKLXJlc2V0IGJ5IHBuZ3Vzci5oIG9yIGJ5IGV4cGxpY2l0IHNldHRpbmdzIG9uIHRoZSBjb21waWxlciBjb21tYW5kIGxpbmUuCi1UaGVzZSBzZXR0aW5ncyBtYXkgcHJvZHVjZSBjb21waWxlciB3YXJuaW5ncyBvciBlcnJvcnMgaW4gMS41LjAgYmVjYXVzZQotb2YgbWFjcm8gcmVkZWZpbml0aW9uLgotCi1BcHBsaWNhdGlvbnMgY2FuIG5vdyBjaG9vc2Ugd2hldGhlciB0byB1c2UgdGhlc2UgbWFjcm9zIG9yIHRvIGNhbGwgdGhlCi1jb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGJ5IGRlZmluaW5nIFBOR19VU0VfUkVBRF9NQUNST1Mgb3IKLVBOR19OT19VU0VfUkVBRF9NQUNST1MgYmVmb3JlIGluY2x1ZGluZyBwbmcuaC4gIE5vdGljZSB0aGF0IHRoaXMgaXMKLW9ubHkgc3VwcG9ydGVkIGZyb20gMS41LjA7IGRlZmluaW5nIFBOR19OT19VU0VfUkVBRF9NQUNST1MgcHJpb3IgdG8gMS41LjAKLXdpbGwgbGVhZCB0byBhIGxpbmsgZmFpbHVyZS4KLQotUHJpb3IgdG8gbGlicG5nLTEuNS40LCB0aGUgemxpYiBjb21wcmVzc29yIHVzZWQgdGhlIHNhbWUgc2V0IG9mIHBhcmFtZXRlcnMKLXdoZW4gY29tcHJlc3NpbmcgdGhlIElEQVQgZGF0YSBhbmQgdGV4dHVhbCBkYXRhIHN1Y2ggYXMgelRYdCBhbmQgaUNDUC4KLUluIGxpYnBuZy0xLjUuNCB3ZSByZWluaXRpYWxpemVkIHRoZSB6bGliIHN0cmVhbSBmb3IgZWFjaCB0eXBlIG9mIGRhdGEuCi1XZSBhZGRlZCBmaXZlIHBuZ19zZXRfdGV4dF8qKCkgZnVuY3Rpb25zIGZvciBzZXR0aW5nIHRoZSBwYXJhbWV0ZXJzIHRvCi11c2Ugd2l0aCB0ZXh0dWFsIGRhdGEuCi0KLVByaW9yIHRvIGxpYnBuZy0xLjUuNCwgdGhlIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVECi1vcHRpb24gd2FzIG9mZiBieSBkZWZhdWx0LCBhbmQgc2xpZ2h0bHkgaW5hY2N1cmF0ZSBzY2FsaW5nIG9jY3VycmVkLgotVGhpcyBvcHRpb24gY2FuIG5vIGxvbmdlciBiZSB0dXJuZWQgb2ZmLCBhbmQgdGhlIGNob2ljZSBvZiBhY2N1cmF0ZQotb3IgaW5hY2N1cmF0ZSAxNi10by04IHNjYWxpbmcgaXMgYnkgdXNpbmcgdGhlIG5ldyBwbmdfc2V0X3NjYWxlXzE2X3RvXzgoKQotQVBJIGZvciBhY2N1cmF0ZSBzY2FsaW5nIG9yIHRoZSBvbGQgcG5nX3NldF9zdHJpcF8xNl90b184KCkgQVBJIGZvciBzaW1wbGUKLWNob3BwaW5nLiAgSW4gbGlicG5nLTEuNS40LCB0aGUgUE5HX1JFQURfMTZfVE9fOF9BQ0NVUkFURV9TQ0FMRV9TVVBQT1JURUQKLW1hY3JvIGJlY2FtZSBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRCwgYW5kIHRoZSBQTkdfUkVBRF8xNl9UT184Ci1tYWNybyBiZWNhbWUgUE5HX1JFQURfU1RSSVBfMTZfVE9fOF9TVVBQT1JURUQsIHRvIGVuYWJsZSB0aGUgdHdvCi1wbmdfc2V0XypfMTZfdG9fOCgpIGZ1bmN0aW9ucyBzZXBhcmF0ZWx5LgotCi1QcmlvciB0byBsaWJwbmctMS41LjQsIHRoZSBwbmdfc2V0X3VzZXJfbGltaXRzKCkgZnVuY3Rpb24gY291bGQgb25seSBiZQotdXNlZCB0byByZWR1Y2UgdGhlIHdpZHRoIGFuZCBoZWlnaHQgbGltaXRzIGZyb20gdGhlIHZhbHVlIG9mCi1QTkdfVVNFUl9XSURUSF9NQVggYW5kIFBOR19VU0VSX0hFSUdIVF9NQVgsIGFsdGhvdWdoIHRoaXMgZG9jdW1lbnQgc2FpZAotdGhhdCBpdCBjb3VsZCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZW0uICBOb3cgdGhpcyBmdW5jdGlvbiB3aWxsIHJlZHVjZSBvcgotaW5jcmVhc2UgdGhlIGxpbWl0cy4KLQotU3RhcnRpbmcgaW4gbGlicG5nLTEuNS4xMCwgdGhlIHVzZXIgbGltaXRzIGNhbiBiZSBzZXQgZW4gbWFzc2Ugd2l0aCB0aGUKLWNvbmZpZ3VyYXRpb24gb3B0aW9uIFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQuICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLAotYSBzZXQgb2YgInNhZmUiIGxpbWl0cyBpcyBhcHBsaWVkIGluIHBuZ3ByaXYuaC4gIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5Ci1hcHBsaWNhdGlvbiBjYWxscyB0byBwbmdfc2V0X3VzZXJfbGltaXRzKCksIHBuZ19zZXRfdXNlcl9jaHVua19jYWNoZV9tYXgoKSwKLWFuZC9vciBwbmdfc2V0X3VzZXJfbWFsbG9jX21heCgpIHRoYXQgaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGxpbWl0cy4gIEFsc28sCi1pbiBsaWJwbmctMS41LjEwIHRoZSBkZWZhdWx0IHdpZHRoIGFuZCBoZWlnaHQgbGltaXRzIHdlcmUgaW5jcmVhc2VkCi1mcm9tIDEsMDAwLDAwMCB0byAweDdmZmZmZmZmIChpLmUuLCBtYWRlIHVubGltaXRlZCkuICBUaGVyZWZvcmUsIHRoZQotbGltaXRzIGFyZSBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICAgICAgc2FmZQotICAgcG5nX3VzZXJfd2lkdGhfbWF4ICAgICAgICAweDdmZmZmZmZmICAgIDEsMDAwLDAwMAotICAgcG5nX3VzZXJfaGVpZ2h0X21heCAgICAgICAweDdmZmZmZmZmICAgIDEsMDAwLDAwMAotICAgcG5nX3VzZXJfY2h1bmtfY2FjaGVfbWF4ICAwICh1bmxpbWl0ZWQpICAgMTI4Ci0gICBwbmdfdXNlcl9jaHVua19tYWxsb2NfbWF4IDAgKHVubGltaXRlZCkgOCwwMDAsMDAwCi0KLVRoZSBwbmdfc2V0X29wdGlvbigpIGZ1bmN0aW9uIChhbmQgdGhlICJvcHRpb25zIiBtZW1iZXIgb2YgdGhlIHBuZyBzdHJ1Y3QpIHdhcwotYWRkZWQgdG8gbGlicG5nLTEuNS4xNSwgd2l0aCBvcHRpb24gUE5HX0FSTV9ORU9OLgotCi1UaGUgbGlicmFyeSBub3cgc3VwcG9ydHMgYSBjb21wbGV0ZSBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBhbmQgY2FuCi10aHVzIGJlIHVzZWQgb24gc3lzdGVtcyB0aGF0IGhhdmUgbm8gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBvciB2ZXJ5Ci1saW1pdGVkIG9yIHNsb3cgc3VwcG9ydC4gIFByZXZpb3VzbHkgZ2FtbWEgY29ycmVjdGlvbiwgYW4gZXNzZW50aWFsIHBhcnQKLW9mIGNvbXBsZXRlIFBORyBzdXBwb3J0LCByZXF1aXJlZCByZWFzb25hYmx5IGZhc3QgZmxvYXRpbmcgcG9pbnQuCi0KLUFzIHBhcnQgb2YgdGhpcyB0aGUgY2hvaWNlIG9mIGludGVybmFsIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIG1hZGUKLWluZGVwZW5kZW50IG9mIHRoZSBjaG9pY2Ugb2YgZml4ZWQgdmVyc3VzIGZsb2F0aW5nIHBvaW50IEFQSXMgYW5kIGFsbCB0aGUKLW1pc3NpbmcgZml4ZWQgcG9pbnQgQVBJcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0KLVRoZSBleGFjdCBtZWNoYW5pc20gdXNlZCB0byBjb250cm9sIGF0dHJpYnV0ZXMgb2YgQVBJIGZ1bmN0aW9ucyBoYXMKLWNoYW5nZWQsIGFzIGRlc2NyaWJlZCBpbiB0aGUgSU5TVEFMTCBmaWxlLgotCi1BIG5ldyB0ZXN0IHByb2dyYW0sIHBuZ3ZhbGlkLCBpcyBwcm92aWRlZCBpbiBhZGRpdGlvbiB0byBwbmd0ZXN0LgotcG5ndmFsaWQgdmFsaWRhdGVzIHRoZSBhcml0aG1ldGljIGFjY3VyYWN5IG9mIHRoZSBnYW1tYSBjb3JyZWN0aW9uCi1jYWxjdWxhdGlvbnMgYW5kIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHZhbGlkYXRpb25zIG9mIHRoZSBmaWxlIGZvcm1hdC4KLUEgc3Vic2V0IG9mIHRoZSBmdWxsIHJhbmdlIG9mIHRlc3RzIGlzIHJ1biB3aGVuICJtYWtlIGNoZWNrIiBpcyBkb25lCi0oaW4gdGhlICdjb25maWd1cmUnIGJ1aWxkLikgIHBuZ3ZhbGlkIGFsc28gYWxsb3dzIHRvdGFsIGFsbG9jYXRlZCBtZW1vcnkKLXVzYWdlIHRvIGJlIGV2YWx1YXRlZCBhbmQgcGVyZm9ybXMgYWRkaXRpb25hbCBtZW1vcnkgb3ZlcndyaXRlIHZhbGlkYXRpb24uCi0KLU1hbnkgY2hhbmdlcyB0byBpbmRpdmlkdWFsIGZlYXR1cmUgbWFjcm9zIGhhdmUgYmVlbiBtYWRlLiBUaGUgZm9sbG93aW5nCi1hcmUgdGhlIGNoYW5nZXMgbW9zdCBsaWtlbHkgdG8gYmUgbm90aWNlZCBieSBsaWJyYXJ5IGJ1aWxkZXJzIHdobwotY29uZmlndXJlIGxpYnBuZzoKLQotMSkgQWxsIGZlYXR1cmUgbWFjcm9zIG5vdyBoYXZlIGNvbnNpc3RlbnQgbmFtaW5nOgotCi0jZGVmaW5lIFBOR19OT19mZWF0dXJlIHR1cm5zIHRoZSBmZWF0dXJlIG9mZgotI2RlZmluZSBQTkdfZmVhdHVyZV9TVVBQT1JURUQgdHVybnMgdGhlIGZlYXR1cmUgb24KLQotcG5nbGliY29uZi5oIGNvbnRhaW5zIG9uZSBsaW5lIGZvciBlYWNoIGZlYXR1cmUgbWFjcm8gd2hpY2ggaXMgZWl0aGVyOgotCi0jZGVmaW5lIFBOR19mZWF0dXJlX1NVUFBPUlRFRAotCi1pZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3I6Ci0KLS8qI3VuZGVmIFBOR19mZWF0dXJlX1NVUFBPUlRFRCovCi0KLWlmIGl0IGlzIG5vdC4gIExpYnJhcnkgY29kZSBjb25zaXN0ZW50bHkgY2hlY2tzIGZvciB0aGUgJ1NVUFBPUlRFRCcgbWFjcm8uCi1JdCBkb2VzIG5vdCwgYW5kIGxpYnBuZyBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCwgY2hlY2sgZm9yIHRoZSAnTk8nIG1hY3JvCi13aGljaCB3aWxsIG5vdCBub3JtYWxseSBiZSBkZWZpbmVkIGV2ZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4KLVRoZSAnTk8nIG1hY3JvcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgZm9yIHNldHRpbmcgb3Igbm90IHNldHRpbmcgdGhlCi1jb3JyZXNwb25kaW5nICdTVVBQT1JURUQnIG1hY3Jvcy4KLQotQ29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgbmFtZXMgaXMgcHJvdmlkZWQgYXMgZm9sbG93czoKLQotUE5HX0lOQ0hfQ09OVkVSU0lPTlMgdHVybnMgb24gUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECi0KLUFuZCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGRpc2FibGUgdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZToKLQotUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFNFVEpNUAotUE5HX1JFQURfVFJBTlNGT1JNU19OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFJFQURfVFJBTlNGT1JNUwotUE5HX05PX1JFQURfQ09NUE9TSVRFRF9OT0RJViBkaXNhYmxlcyBSRUFEX0NPTVBPU0lURV9OT0RJVgotUE5HX1dSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRCBkaXNhYmxlcyBXUklURV9UUkFOU0ZPUk1TCi1QTkdfUkVBRF9BTkNJTExBUllfQ0hVTktTX05PVF9TVVBQT1JURUQgZGlzYWJsZXMgUkVBRF9BTkNJTExBUllfQ0hVTktTCi1QTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEIGRpc2FibGVzIFdSSVRFX0FOQ0lMTEFSWV9DSFVOS1MKLQotTGlicmFyeSBidWlsZGVycyBzaG91bGQgcmVtb3ZlIHVzZSBvZiB0aGUgYWJvdmUsIGluY29uc2lzdGVudCwgbmFtZXMuCi0KLTIpIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZyB3YXMgcHJldmlvdXNseSBjb25kaXRpb25hbCBvbgotdGhlIFNURElPIGZlYXR1cmUuIFRoZSBsaWJyYXJ5IGhhcyBiZWVuIGNoYW5nZWQgdG8gdXNlIHRoZQotQ09OU09MRV9JTyBmZWF0dXJlIGluc3RlYWQuIFRoaXMgbWVhbnMgdGhhdCBpZiBDT05TT0xFX0lPIGlzIGRpc2FibGVkCi10aGUgbGlicmFyeSBubyBsb25nZXIgdXNlcyB0aGUgcHJpbnRmKDMpIGZ1bmN0aW9ucywgZXZlbiB0aG91Z2ggdGhlCi1kZWZhdWx0IHJlYWQvd3JpdGUgaW1wbGVtZW50YXRpb25zIHVzZSAoRklMRSkgc3R5bGUgc3RkaW8uaCBmdW5jdGlvbnMuCi0KLTMpIFRocmVlIGZlYXR1cmUgbWFjcm9zIG5vdyBjb250cm9sIHRoZSBmaXhlZC9mbG9hdGluZyBwb2ludCBkZWNpc2lvbnM6Ci0KLVBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgZW5hYmxlcyB0aGUgZmxvYXRpbmcgcG9pbnQgQVBJcwotCi1QTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEIGVuYWJsZXMgdGhlIGZpeGVkIHBvaW50IEFQSXM7IGhvd2V2ZXIsIGluCi1wcmFjdGljZSB0aGVzZSBhcmUgbm9ybWFsbHkgcmVxdWlyZWQgaW50ZXJuYWxseSBhbnl3YXkgKGJlY2F1c2UgdGhlIFBORwotZmlsZSBmb3JtYXQgaXMgZml4ZWQgcG9pbnQpLCB0aGVyZWZvcmUgaW4gbW9zdCBjYXNlcyBQTkdfTk9fRklYRURfUE9JTlQKLW1lcmVseSBzdG9wcyB0aGUgZnVuY3Rpb24gZnJvbSBiZWluZyBleHBvcnRlZC4KLQotUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEIGNob29zZXMgYmV0d2VlbiB0aGUgaW50ZXJuYWwgZmxvYXRpbmcKLXBvaW50IGltcGxlbWVudGF0aW9uIG9yIHRoZSBmaXhlZCBwb2ludCBvbmUuICBUeXBpY2FsbHkgdGhlIGZpeGVkIHBvaW50Ci1pbXBsZW1lbnRhdGlvbiBpcyBsYXJnZXIgYW5kIHNsb3dlciB0aGFuIHRoZSBmbG9hdGluZyBwb2ludCBpbXBsZW1lbnRhdGlvbgotb24gYSBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBmbG9hdGluZyBwb2ludDsgaG93ZXZlciwgaXQgbWF5IGJlIGZhc3RlciBvbiBhCi1zeXN0ZW0gd2hpY2ggbGFja3MgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUgYW5kIHRoZXJlZm9yZSB1c2VzIGEgc29mdHdhcmUKLWVtdWxhdGlvbi4KLQotNCkgQWRkZWQgUE5HX3tSRUFELFdSSVRFfV9JTlRfRlVOQ1RJT05TX1NVUFBPUlRFRC4gIFRoaXMgYWxsb3dzIHRoZQotZnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIGludHMgdG8gYmUgZGlzYWJsZWQgaW5kZXBlbmRlbnRseSBvZgotUE5HX1VTRV9SRUFEX01BQ1JPUywgd2hpY2ggYWxsb3dzIGxpYnBuZyB0byBiZSBidWlsdCB3aXRoIHRoZSBmdW5jdGlvbnMKLWV2ZW4gdGhvdWdoIHRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgbWFjcm9zIC0gdGhpcyBhbGxvd3MgYXBwbGljYXRpb25zCi10byBjaG9vc2UgYXQgYXBwIGJ1aWxkdGltZSB3aGV0aGVyIG9yIG5vdCB0byB1c2UgbWFjcm9zIChwcmV2aW91c2x5Ci1pbXBvc3NpYmxlIGJlY2F1c2UgdGhlIGZ1bmN0aW9ucyB3ZXJlbid0IGluIHRoZSBkZWZhdWx0IGJ1aWxkLikKLQotLlNIIFhJSS4gIENoYW5nZXMgdG8gTGlicG5nIGZyb20gdmVyc2lvbiAxLjUueCB0byAxLjYueAotCi1BICJzaW1wbGlmaWVkIEFQSSIgaGFzIGJlZW4gYWRkZWQgKHNlZSBkb2N1bWVudGF0aW9uIGluIHBuZy5oIGFuZCBhIHNpbXBsZQotZXhhbXBsZSBpbiBjb250cmliL2V4YW1wbGVzL3BuZ3RvcG5nLmMpLiAgVGhlIG5ldyBwdWJsaWNseSB2aXNpYmxlIEFQSQotaW5jbHVkZXMgdGhlIGZvbGxvd2luZzoKLQotICAgbWFjcm9zOgotICAgICBQTkdfRk9STUFUXyoKLSAgICAgUE5HX0lNQUdFXyoKLSAgIHN0cnVjdHVyZXM6Ci0gICAgIHBuZ19jb250cm9sCi0gICAgIHBuZ19pbWFnZQotICAgcmVhZCBmdW5jdGlvbnMKLSAgICAgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlKCkKLSAgICAgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9zdGRpbygpCi0gICAgIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fbWVtb3J5KCkKLSAgICAgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkKCkKLSAgICAgcG5nX2ltYWdlX2ZyZWUoKQotICAgd3JpdGUgZnVuY3Rpb25zCi0gICAgIHBuZ19pbWFnZV93cml0ZV90b19maWxlKCkKLSAgICAgcG5nX2ltYWdlX3dyaXRlX3RvX21lbW9yeSgpCi0gICAgIHBuZ19pbWFnZV93cml0ZV90b19zdGRpbygpCi0KLVN0YXJ0aW5nIHdpdGggbGlicG5nLTEuNi4wLCB5b3UgY2FuIGNvbmZpZ3VyZSBsaWJwbmcgdG8gcHJlZml4IGFsbCBleHBvcnRlZAotc3ltYm9scywgdXNpbmcgdGhlIFBOR19QUkVGSVggbWFjcm8uCi0KLVdlIG5vIGxvbmdlciBpbmNsdWRlIHN0cmluZy5oIGluIHBuZy5oLiAgVGhlIGluY2x1ZGUgc3RhdGVtZW50IGhhcyBiZWVuIG1vdmVkCi10byBwbmdwcml2LmgsIHdoZXJlIGl0IGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IGFwcGxpY2F0aW9ucy4gIEFwcGxpY2F0aW9ucyB0aGF0Ci1uZWVkIGFjY2VzcyB0byBpbmZvcm1hdGlvbiBpbiBzdHJpbmcuaCBtdXN0IGFkZCBhbiAnI2luY2x1ZGUgPHN0cmluZy5oPicKLWRpcmVjdGl2ZS4gIEl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIHRoaXMgaXMgcGxhY2VkIHByaW9yIHRvIG9yIGFmdGVyCi10aGUgJyNpbmNsdWRlICJwbmcuaCInIGRpcmVjdGl2ZS4KLQotVGhlIGZvbGxvd2luZyBBUEkgYXJlIG5vdyBERVBSRUNBVEVEOgotICAgcG5nX2luZm9faW5pdF8zKCkKLSAgIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMoKSB3aGljaCBoYXMgYmVlbiByZXBsYWNlZAotICAgICB3aXRoIHBuZ19jb252ZXJ0X3RvX3JmYzExMjNfYnVmZmVyKCkKLSAgIHBuZ19tYWxsb2NfZGVmYXVsdCgpCi0gICBwbmdfZnJlZV9kZWZhdWx0KCkKLSAgIHBuZ19yZXNldF96c3RyZWFtKCkKLQotVGhlIGZvbGxvd2luZyBoYXZlIGJlZW4gcmVtb3ZlZDoKLSAgIHBuZ19nZXRfaW9fY2h1bmtfbmFtZSgpLCB3aGljaCBoYXMgYmVlbiByZXBsYWNlZAotICAgICB3aXRoIHBuZ19nZXRfaW9fY2h1bmtfdHlwZSgpLiAgVGhlIG5ldwotICAgICBmdW5jdGlvbiByZXR1cm5zIGEgMzItYml0IGludGVnZXIgaW5zdGVhZCBvZgotICAgICBhIHN0cmluZy4KLSAgIFRoZSBwbmdfc2l6ZW9mKCksIHBuZ19zdHJsZW4oKSwgcG5nX21lbWNweSgpLCBwbmdfbWVtY21wKCksIGFuZAotICAgICBwbmdfbWVtc2V0KCkgbWFjcm9zIGFyZSBubyBsb25nZXIgdXNlZCBpbiB0aGUgbGlicG5nIHNvdXJjZXMgYW5kCi0gICAgIGhhdmUgYmVlbiByZW1vdmVkLiAgVGhlc2UgaGFkIGFscmVhZHkgYmVlbiBtYWRlIGludmlzaWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICAgKGkuZS4sIGRlZmluZWQgaW4gdGhlIHByaXZhdGUgcG5ncHJpdi5oIGhlYWRlciBmaWxlKSBzaW5jZSBsaWJwbmctMS41LjAuCi0KLVRoZSBzaWduYXR1cmVzIG9mIG1hbnkgZXhwb3J0ZWQgZnVuY3Rpb25zIHdlcmUgY2hhbmdlZCwgc3VjaCB0aGF0Ci0gICBwbmdfc3RydWN0cCBiZWNhbWUgcG5nX3N0cnVjdHJwIG9yIHBuZ19jb25zdF9zdHJ1Y3RycAotICAgcG5nX2luZm9wIGJlY2FtZSBwbmdfaW5mb3JwIG9yIHBuZ19jb25zdF9pbmZvcnAKLXdoZXJlICJycCIgaW5kaWNhdGVzIGEgInJlc3RyaWN0ZWQgcG9pbnRlciIuCi0KLURyb3BwZWQgc3VwcG9ydCBmb3IgMTYtYml0IHBsYXRmb3Jtcy4gVGhlIHN1cHBvcnQgZm9yIEZBUi9mYXIgdHlwZXMgaGFzCi1iZWVuIGVsaW1pbmF0ZWQgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHBuZ19hbGxvY19zaXplX3QgaXMgbm93IGNvbnRyb2xsZWQKLWJ5IGEgZmxhZyBzbyB0aGF0ICdzbWFsbCBzaXplX3QnIHN5c3RlbXMgY2FuIHNlbGVjdCBpdCBpZiBuZWNlc3NhcnkuCi0KLUVycm9yIGRldGVjdGlvbiBpbiBzb21lIGNodW5rcyBoYXMgaW1wcm92ZWQ7IGluIHBhcnRpY3VsYXIgdGhlIGlDQ1AgY2h1bmsKLXJlYWRlciBub3cgZG9lcyBwcmV0dHkgY29tcGxldGUgdmFsaWRhdGlvbiBvZiB0aGUgYmFzaWMgZm9ybWF0LiAgU29tZSBiYWQKLXByb2ZpbGVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGFjY2VwdGVkIGFyZSBub3cgYWNjZXB0ZWQgd2l0aCBhIHdhcm5pbmcgb3IKLXJlamVjdGVkLCBkZXBlbmRpbmcgdXBvbiB0aGUgcG5nX3NldF9iZW5pZ25fZXJyb3JzKCkgc2V0dGluZywgaW4gcGFydGljdWxhcgotdGhlIHZlcnkgb2xkIGJyb2tlbiBNaWNyb3NvZnQvSFAgMzE0NC1ieXRlIHNSR0IgcHJvZmlsZS4gIFN0YXJ0aW5nIHdpdGgKLWxpYnBuZy0xLjYuMTEsIHJlY29nbml6aW5nIGFuZCBjaGVja2luZyBzUkdCIHByb2ZpbGVzIGNhbiBiZSBhdm9pZGVkIGJ5Ci1tZWFucyBvZgotCi0gICAgI2lmIGRlZmluZWQoUE5HX1NLSVBfc1JHQl9DSEVDS19QUk9GSUxFKSAmJiBcCi0gICAgICAgIGRlZmluZWQoUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVEKQotICAgICAgIHBuZ19zZXRfb3B0aW9uKHBuZ19wdHIsIFBOR19TS0lQX3NSR0JfQ0hFQ0tfUFJPRklMRSwKLSAgICAgICAgICAgUE5HX09QVElPTl9PTik7Ci0gICAgI2VuZGlmCi0KLUl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIGRvIHRoaXMgaWYgeW91IGFyZSB1c2luZyB0aGUgInNpbXBsaWZpZWQgQVBJIiwKLXdoaWNoIG5lZWRzIHRvIGJlIGFibGUgdG8gcmVjb2duaXplIHNSR0IgcHJvZmlsZXMgY29udmV5ZWQgdmlhIHRoZSBpQ0NQCi1jaHVuay4KLQotVGhlIFBORyBzcGVjIHJlcXVpcmVtZW50IHRoYXQgb25seSBncmF5c2NhbGUgcHJvZmlsZXMgbWF5IGFwcGVhciBpbiBpbWFnZXMKLXdpdGggY29sb3IgdHlwZSAwIG9yIDQgYW5kIHRoYXQgZXZlbiBpZiB0aGUgaW1hZ2Ugb25seSBjb250YWlucyBncmF5IHBpeGVscywKLW9ubHkgUkdCIHByb2ZpbGVzIG1heSBhcHBlYXIgaW4gaW1hZ2VzIHdpdGggY29sb3IgdHlwZSAyLCAzLCBvciA2LCBpcyBub3cKLWVuZm9yY2VkLiAgVGhlIHNSR0IgY2h1bmsgaXMgYWxsb3dlZCB0byBhcHBlYXIgaW4gaW1hZ2VzIHdpdGggYW55IGNvbG9yIHR5cGUKLWFuZCBpcyBpbnRlcnByZXRlZCBieSBsaWJwbmcgdG8gY29udmV5IGEgb25lLXRyYWNlci1jdXJ2ZSBncmF5IHByb2ZpbGUgb3IgYQotdGhyZWUtdHJhY2VyLWN1cnZlIFJHQiBwcm9maWxlIGFzIGFwcHJvcHJpYXRlLgotCi1MaWJwbmcgMS41LnggZXJyb25lb3VzbHkgdXNlZCAvTUQgZm9yIERlYnVnIERMTCBidWlsZHM7IGlmIHlvdSB1c2VkIHRoZSBkZWJ1ZwotYnVpbGRzIGluIHlvdXIgYXBwIGFuZCB5b3UgY2hhbmdlZCB5b3VyIGFwcCB0byB1c2UgL01EIHlvdSB3aWxsIG5lZWQgdG8KLWNoYW5nZSBpdCBiYWNrIHRvIC9NRGQgZm9yIGxpYnBuZyAxLjYueC4KLQotUHJpb3IgdG8gbGlicG5nLTEuNi4wIGEgd2FybmluZyB3b3VsZCBiZSBpc3N1ZWQgaWYgdGhlIGlUWHQgY2h1bmsgY29udGFpbmVkCi1hbiBlbXB0eSBsYW5ndWFnZSBmaWVsZCBvciBhbiBlbXB0eSB0cmFuc2xhdGVkIGtleXdvcmQuICBCb3RoIG9mIHRoZXNlCi1hcmUgYWxsb3dlZCBieSB0aGUgUE5HIHNwZWNpZmljYXRpb24sIHNvIHRoZXNlIHdhcm5pbmdzIGFyZSBubyBsb25nZXIgaXNzdWVkLgotCi1UaGUgbGlicmFyeSBub3cgaXNzdWVzIGFuIGVycm9yIGlmIHRoZSBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byBzZXQgYQotdHJhbnNmb3JtIGFmdGVyIGl0IGNhbGxzIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCkgb3IgaWYgaXQgYXR0ZW1wdHMgdG8gY2FsbAotYm90aCBwbmdfcmVhZF91cGRhdGVfaW5mbygpIGFuZCBwbmdfc3RhcnRfcmVhZF9pbWFnZSgpIG9yIHRvIGNhbGwgZWl0aGVyCi1vZiB0aGVtIG1vcmUgdGhhbiBvbmNlLgotCi1UaGUgZGVmYXVsdCBjb25kaXRpb24gZm9yIGJlbmlnbl9lcnJvcnMgaXMgbm93IHRvIHRyZWF0IGJlbmlnbiBlcnJvcnMgYXMKLXdhcm5pbmdzIHdoaWxlIHJlYWRpbmcgYW5kIGFzIGVycm9ycyB3aGlsZSB3cml0aW5nLgotCi1UaGUgbGlicmFyeSBub3cgaXNzdWVzIGEgd2FybmluZyBpZiBib3RoIGJhY2tncm91bmQgcHJvY2Vzc2luZyBhbmQgUkdCIHRvCi1ncmF5IGFyZSB1c2VkIHdoZW4gZ2FtbWEgY29ycmVjdGlvbiBoYXBwZW5zLiBBcyB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mCi10aGUgbGlicmFyeSB0aGUgcmVzdWx0cyBhcmUgbnVtZXJpY2FsbHkgdmVyeSBpbmNvcnJlY3QgaW4gdGhpcyBjYXNlLgotCi1UaGVyZSBhcmUgc29tZSBtaW5vciBhcml0aG1ldGljIGNoYW5nZXMgaW4gc29tZSB0cmFuc2Zvcm1zIHN1Y2ggYXMKLXBuZ19zZXRfYmFja2dyb3VuZCgpLCB0aGF0IG1pZ2h0IGJlIGRldGVjdGVkIGJ5IGNlcnRhaW4gcmVncmVzc2lvbiB0ZXN0cy4KLQotVW5rbm93biBjaHVuayBoYW5kbGluZyBoYXMgYmVlbiBpbXByb3ZlZCBpbnRlcm5hbGx5LCB3aXRob3V0IGFueSBBUEkgY2hhbmdlLgotVGhpcyBhZGRzIG1vcmUgY29ycmVjdCBvcHRpb24gY29udHJvbCBvZiB0aGUgdW5rbm93biBoYW5kbGluZywgY29ycmVjdHMKLWEgcHJlLWV4aXN0aW5nIGJ1ZyB3aGVyZSB0aGUgcGVyLWNodW5rICdrZWVwJyBzZXR0aW5nIGlzIGlnbm9yZWQsIGFuZCBtYWtlcwotaXQgcG9zc2libGUgdG8gc2tpcCBJREFUIGNodW5rcyBpbiB0aGUgc2VxdWVudGlhbCByZWFkZXIuCi0KLVRoZSBtYWNoaW5lLWdlbmVyYXRlZCBjb25maWd1cmUgZmlsZXMgYXJlIG5vIGxvbmdlciBpbmNsdWRlZCBpbiBicmFuY2hlcwotbGlicG5nMTYgYW5kIGxhdGVyIG9mIHRoZSBHSVQgcmVwb3NpdG9yeS4gIFRoZXkgY29udGludWUgdG8gYmUgaW5jbHVkZWQKLWluIHRoZSB0YXJiYWxsIHJlbGVhc2VzLCBob3dldmVyLgotCi1MaWJwbmctMS42LjAgdGhyb3VnaCAxLjYuMiB1c2VkIHRoZSBDTUYgYnl0ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgSURBVAotc3RyZWFtIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgc2xpZGluZyB3aW5kb3cgZm9yIHJlYWRpbmcgaW5zdGVhZCBvZiB1c2luZyB0aGUKLWRlZmF1bHQgMzIta2J5dGUgc2xpZGluZyB3aW5kb3cgc2l6ZS4gIEl0IHdhcyBkaXNjb3ZlcmVkIHRoYXQgdGhlcmUgYXJlCi1odW5kcmVkcyBvZiBQTkcgZmlsZXMgaW4gdGhlIHdpbGQgdGhhdCBoYXZlIGluY29ycmVjdCBDTUYgYnl0ZXMgdGhhdCBjYXVzZWQKLXpsaWIgdG8gaXNzdWUgdGhlICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIgZXJyb3IgYW5kIHJlamVjdCB0aGUgZmlsZS4KLUxpYnBuZy0xLjYuMyBhbmQgbGF0ZXIgY2FsY3VsYXRlIHRoZWlyIG93biBzYWZlIENNRiBmcm9tIHRoZSBpbWFnZSBkaW1lbnNpb25zLAotcHJvdmlkZSBhIHdheSB0byByZXZlcnQgdG8gdGhlIGxpYnBuZy0xLjUueCBiZWhhdmlvciAoaWdub3JpbmcgdGhlIENNRiBieXRlcwotYW5kIHVzaW5nIGEgMzIta2J5dGUgc2xpZGluZyB3aW5kb3cpLCBieSB1c2luZwotCi0gICAgcG5nX3NldF9vcHRpb24ocG5nX3B0ciwgUE5HX01BWElNVU1fSU5GTEFURV9XSU5ET1csCi0gICAgICAgIFBOR19PUFRJT05fT04pOwotCi1hbmQgcHJvdmlkZSBhIHRvb2wgKGNvbnRyaWIvdG9vbHMvcG5nZml4KSBmb3IgcmV3cml0aW5nIGEgUE5HIGZpbGUgd2hpbGUKLW9wdGltaXppbmcgdGhlIENNRiBieXRlcyBpbiBpdHMgSURBVCBjaHVuayBjb3JyZWN0bHkuCi0KLUxpYnBuZy0xLjYuMCBhbmQgbGlicG5nLTEuNi4xIHdyb3RlIHVuY29tcHJlc3NlZCBpVFh0IGNodW5rcyB3aXRoIHRoZSB3cm9uZwotbGVuZ3RoLCB3aGljaCByZXN1bHRlZCBpbiBQTkcgZmlsZXMgdGhhdCBjYW5ub3QgYmUgcmVhZCBiZXlvbmQgdGhlIGJhZCBpVFh0Ci1jaHVuay4gIFRoaXMgZXJyb3Igd2FzIGZpeGVkIGluIGxpYnBuZy0xLjYuMywgYW5kIGEgdG9vbCAoY2FsbGVkCi1jb250cmliL3Rvb2xzL3BuZy1maXgtaXR4dCkgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGxpYnBuZyBkaXN0cmlidXRpb24uCi0KLVN0YXJ0aW5nIHdpdGggbGlicG5nLTEuNi4xNywgdGhlIFBOR19TQUZFX0xJTUlUUyBtYWNybyB3YXMgZWxpbWluYXRlZAotYW5kIHNhZmUgbGltaXRzIGFyZSB1c2VkIGJ5IGRlZmF1bHQgKHVzZXJzIHdobyBuZWVkIGxhcmdlciBsaW1pdHMKLWNhbiBzdGlsbCBvdmVycmlkZSB0aGVtIGF0IGNvbXBpbGUgdGltZSBvciBydW4gdGltZSwgYXMgZGVzY3JpYmVkIGFib3ZlKS4KLQotVGhlIG5ldyBsaW1pdHMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgICBzcGVjIGxpbWl0Ci0gICBwbmdfdXNlcl93aWR0aF9tYXggICAgICAgICAxLDAwMCwwMDAgIDIsMTQ3LDQ4Myw2NDcKLSAgIHBuZ191c2VyX2hlaWdodF9tYXggICAgICAgIDEsMDAwLDAwMCAgMiwxNDcsNDgzLDY0NwotICAgcG5nX3VzZXJfY2h1bmtfY2FjaGVfbWF4ICAgICAgICAgMTI4ICB1bmxpbWl0ZWQKLSAgIHBuZ191c2VyX2NodW5rX21hbGxvY19tYXggIDgsMDAwLDAwMCAgdW5saW1pdGVkCi0KLVN0YXJ0aW5nIHdpdGggbGlicG5nLTEuNi4xOCwgYSBQTkdfUkVMRUFTRV9CVUlMRCBtYWNybyB3YXMgYWRkZWQsIHdoaWNoIGFsbG93cwotbGlicmFyeSBidWlsZGVycyB0byBjb250cm9sIGNvbXBpbGF0aW9uIGZvciBhbiBpbnN0YWxsZWQgc3lzdGVtIChhIHJlbGVhc2UgYnVpbGQpLgotSXQgY2FuIGJlIHNldCBmb3IgdGVzdGluZyBkZWJ1ZyBvciBiZXRhIGJ1aWxkcyB0byBlbnN1cmUgdGhhdCB0aGV5IHdpbGwgY29tcGlsZQotd2hlbiB0aGUgYnVpbGQgdHlwZSBpcyBzd2l0Y2hlZCB0byBSQyBvciBTVEFCTEUuIEluIGVzc2VuY2UgdGhpcyBvdmVycmlkZXMgdGhlCi1QTkdfTElCUE5HX0JVSUxEX0JBU0VfVFlQRSBkZWZpbml0aW9uIHdoaWNoIGlzIG5vdCBkaXJlY3RseSB1c2VyIGNvbnRyb2xsYWJsZS4KLQotU3RhcnRpbmcgd2l0aCBsaWJwbmctMS42LjE5LCBhdHRlbXB0aW5nIHRvIHNldCBhbiBvdmVyLWxlbmd0aCBQTFRFIGNodW5rCi1pcyBhbiBlcnJvci4gUHJldmlvdXNseSB0aGlzIHJlcXVpcmVtZW50IG9mIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiB3YXMgbm90Ci1lbmZvcmNlZCwgYW5kIHRoZSBwYWxldHRlIHdhcyBhbHdheXMgbGltaXRlZCB0byAyNTYgZW50cmllcy4gQW4gb3Zlci1sZW5ndGgKLVBMVEUgY2h1bmsgZm91bmQgaW4gYW4gaW5wdXQgUE5HIGlzIHNpbGVudGx5IHRydW5jYXRlZC4KLQotLlNIIFhJSUkuICBEZXRlY3RpbmcgbGlicG5nCi0KLVRoZSBwbmdfZ2V0X2lvX3B0cigpIGZ1bmN0aW9uIGhhcyBiZWVuIHByZXNlbnQgc2luY2UgbGlicG5nLTAuODgsIGhhcyBuZXZlcgotY2hhbmdlZCwgYW5kIGlzIHVuYWZmZWN0ZWQgYnkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gbWFjcm9zLiAgSXQgaXMgdGhlCi1iZXN0IGNob2ljZSBmb3IgdXNlIGluIGNvbmZpZ3VyZSBzY3JpcHRzIGZvciBkZXRlY3RpbmcgdGhlIHByZXNlbmNlIG9mIGFueQotbGlicG5nIHZlcnNpb24gc2luY2UgMC44OC4gIEluIGFuIGF1dG9jb25mICJjb25maWd1cmUuaW4iIHlvdSBjb3VsZCB1c2UKLQotICAgIEFDX0NIRUNLX0xJQihwbmcsIHBuZ19nZXRfaW9fcHRyLCAuLi4KLQotLlNIIFhWLiBTb3VyY2UgY29kZSByZXBvc2l0b3J5Ci0KLVNpbmNlIGFib3V0IEZlYnJ1YXJ5IDIwMDksIHZlcnNpb24gMS4yLjM0LCBsaWJwbmcgaGFzIGJlZW4gdW5kZXIgImdpdCIgc291cmNlCi1jb250cm9sLiAgVGhlIGdpdCByZXBvc2l0b3J5IHdhcyBidWlsdCBmcm9tIG9sZCBsaWJwbmcteC55LnoudGFyLmd6IGZpbGVzCi1nb2luZyBiYWNrIHRvIHZlcnNpb24gMC43MC4gIFlvdSBjYW4gYWNjZXNzIHRoZSBnaXQgcmVwb3NpdG9yeSAocmVhZCBvbmx5KQotYXQKLQotICAgIGdpdDovL2dpdC5jb2RlLnNmLm5ldC9wL2xpYnBuZy9jb2RlCi0KLW9yIHlvdSBjYW4gYnJvd3NlIGl0IHdpdGggYSB3ZWIgYnJvd3NlciBieSBzZWxlY3RpbmcgdGhlICJjb2RlIiBidXR0b24gYXQKLQotICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnBuZwotCi1QYXRjaGVzIGNhbiBiZSBzZW50IHRvIGdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0IG9yIHRvCi1wbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgb3IgeW91IGNhbiB1cGxvYWQgdGhlbSB0bwotdGhlIGxpYnBuZyBidWcgdHJhY2tlciBhdAotCi0gICAgaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQKLQotV2UgYWxzbyBhY2NlcHQgcGF0Y2hlcyBidWlsdCBmcm9tIHRoZSB0YXIgb3IgemlwIGRpc3RyaWJ1dGlvbnMsIGFuZAotc2ltcGxlIHZlcmJhbCBkaXNjcmlwdGlvbnMgb2YgYnVnIGZpeGVzLCByZXBvcnRlZCBlaXRoZXIgdG8gdGhlCi1Tb3VyY2VGb3JnZSBidWcgdHJhY2tlciwgdG8gdGhlIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAotbWFpbGluZyBsaXN0LCBvciBkaXJlY3RseSB0byBnbGVubnJwLgotCi0uU0ggWFYuIENvZGluZyBzdHlsZQotCi1PdXIgY29kaW5nIHN0eWxlIGlzIHNpbWlsYXIgdG8gdGhlICJBbGxtYW4iIHN0eWxlCi0oU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5kZW50X3N0eWxlI0FsbG1hbl9zdHlsZSksIHdpdGggY3VybHkKLWJyYWNlcyBvbiBzZXBhcmF0ZSBsaW5lczoKLQotICAgIGlmIChjb25kaXRpb24pCi0gICAgewotICAgICAgIGFjdGlvbjsKLSAgICB9Ci0KLSAgICBlbHNlIGlmIChhbm90aGVyIGNvbmRpdGlvbikKLSAgICB7Ci0gICAgICAgYW5vdGhlciBhY3Rpb247Ci0gICAgfQotCi1UaGUgYnJhY2VzIGNhbiBiZSBvbWl0dGVkIGZyb20gc2ltcGxlIG9uZS1saW5lIGFjdGlvbnM6Ci0KLSAgICBpZiAoY29uZGl0aW9uKQotICAgICAgIHJldHVybiAoMCk7Ci0KLVdlIHVzZSAzLXNwYWNlIGluZGVudGF0aW9uLCBleGNlcHQgZm9yIGNvbnRpbnVlZCBzdGF0ZW1lbnRzIHdoaWNoCi1hcmUgdXN1YWxseSBpbmRlbnRlZCB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RhdGVtZW50Ci1wbHVzIGZvdXIgbW9yZSBzcGFjZXMuCi0KLUZvciBtYWNybyBkZWZpbml0aW9ucyB3ZSB1c2UgMi1zcGFjZSBpbmRlbnRhdGlvbiwgYWx3YXlzIGxlYXZpbmcgdGhlICIjIgotaW4gdGhlIGZpcnN0IGNvbHVtbi4KLQotICAgICNpZm5kZWYgUE5HX05PX0ZFQVRVUkUKLSAgICAjICBpZm5kZWYgUE5HX0ZFQVRVUkVfU1VQUE9SVEVECi0gICAgIyAgICBkZWZpbmUgUE5HX0ZFQVRVUkVfU1VQUE9SVEVECi0gICAgIyAgZW5kaWYKLSAgICAjZW5kaWYKLQotQ29tbWVudHMgYXBwZWFyIHdpdGggdGhlIGxlYWRpbmcgIi8qIiBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBhcwotdGhlIHN0YXRlbWVudCB0aGF0IGZvbGxvd3MgdGhlIGNvbW1lbnQ6Ci0KLSAgICAvKiBTaW5nbGUtbGluZSBjb21tZW50ICovCi0gICAgc3RhdGVtZW50OwotCi0gICAgLyogVGhpcyBpcyBhIG11bHRpcGxlLWxpbmUKLSAgICAgKiBjb21tZW50LgotICAgICAqLwotICAgIHN0YXRlbWVudDsKLQotVmVyeSBzaG9ydCBjb21tZW50cyBjYW4gYmUgcGxhY2VkIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudAotdG8gd2hpY2ggdGhleSBwZXJ0YWluOgotCi0gICAgc3RhdGVtZW50OyAgICAvKiBjb21tZW50ICovCi0KLVdlIGRvbid0IHVzZSBDKysgc3R5bGUgKCIvLyIpIGNvbW1lbnRzLiBXZSBoYXZlLCBob3dldmVyLAotdXNlZCB0aGVtIGluIHRoZSBwYXN0IGluIHNvbWUgbm93LWFiYW5kb25lZCBNTVggYXNzZW1ibGVyCi1jb2RlLgotCi1GdW5jdGlvbnMgYW5kIHRoZWlyIGN1cmx5IGJyYWNlcyBhcmUgbm90IGluZGVudGVkLCBhbmQKLWV4cG9ydGVkIGZ1bmN0aW9ucyBhcmUgbWFya2VkIHdpdGggUE5HQVBJOgotCi0gLyogVGhpcyBpcyBhIHB1YmxpYyBmdW5jdGlvbiB0aGF0IGlzIHZpc2libGUgdG8KLSAgKiBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycy4gSXQgZG9lcyB0aHVzLWFuZC1zby4KLSAgKi8KLSB2b2lkIFBOR0FQSQotIHBuZ19leHBvcnRlZF9mdW5jdGlvbihwbmdfcHRyLCBwbmdfaW5mbywgZm9vKQotIHsKLSAgICBib2R5OwotIH0KLQotVGhlIHJldHVybiB0eXBlIGFuZCBkZWNvcmF0aW9ucyBhcmUgcGxhY2VkIG9uIGEgc2VwYXJhdGUgbGluZQotYWhlYWQgb2YgdGhlIGZ1bmN0aW9uIG5hbWUsIGFzIGlsbHVzdHJhdGVkIGFib3ZlLgotCi1UaGUgcHJvdG90eXBlcyBmb3IgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyBhcHBlYXIgaW4gcG5nLmgsCi1hYm92ZSB0aGUgY29tbWVudCB0aGF0IHNheXMKLQotICAgIC8qIE1haW50YWluZXI6IFB1dCBuZXcgcHVibGljIHByb3RvdHlwZXMgaGVyZSAuLi4gKi8KLQotV2UgbWFyayBhbGwgbm9uLWV4cG9ydGVkIGZ1bmN0aW9ucyB3aXRoICIvKiBQUklWQVRFICovIiI6Ci0KLSB2b2lkIC8qIFBSSVZBVEUgKi8KLSBwbmdfbm9uX2V4cG9ydGVkX2Z1bmN0aW9uKHBuZ19wdHIsIHBuZ19pbmZvLCBmb28pCi0gewotICAgIGJvZHk7Ci0gfQotCi1UaGUgcHJvdG90eXBlcyBmb3Igbm9uLWV4cG9ydGVkIGZ1bmN0aW9ucyAoZXhjZXB0IGZvciB0aG9zZSBpbgotcG5ndGVzdCkgYXBwZWFyIGluIHBuZ3ByaXYuaCBhYm92ZSB0aGUgY29tbWVudCB0aGF0IHNheXMKLQotICAvKiBNYWludGFpbmVyOiBQdXQgbmV3IHByaXZhdGUgcHJvdG90eXBlcyBoZXJlIF4gKi8KLQotVG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCB0aGUgbmFtZXMgb2YgYWxsIGV4cG9ydGVkCi1mdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBiZWdpbiB3aXRoICJwbmdfIiwgYW5kIGFsbCBwdWJsaWNseSB2aXNpYmxlIEMKLXByZXByb2Nlc3NvciBtYWNyb3MgYmVnaW4gd2l0aCAiUE5HIi4gIFdlIHJlcXVlc3QgdGhhdCBhcHBsaWNhdGlvbnMgdGhhdAotdXNlIGxpYnBuZyAqbm90KiBiZWdpbiBhbnkgb2YgdGhlaXIgb3duIHN5bWJvbHMgd2l0aCBlaXRoZXIgb2YgdGhlc2Ugc3RyaW5ncy4KLQotV2UgcHV0IGEgc3BhY2UgYWZ0ZXIgdGhlICJzaXplb2YiIG9wZXJhdG9yIGFuZCB3ZSBvbWl0IHRoZQotb3B0aW9uYWwgcGFyZW50aGVzZXMgYXJvdW5kIGl0cyBhcmd1bWVudCB3aGVuIHRoZSBhcmd1bWVudAotaXMgYW4gZXhwcmVzc2lvbiwgbm90IGEgdHlwZSBuYW1lLCBhbmQgd2UgYWx3YXlzIGVuY2xvc2UgdGhlCi1zaXplb2Ygb3BlcmF0b3IsIHdpdGggaXRzIGFyZ3VtZW50LCBpbiBwYXJlbnRoZXNlczoKLQotICAoc2l6ZW9mIChwbmdfdWludF8zMikpCi0gIChzaXplb2YgYXJyYXkpCi0KLVByaW9yIHRvIGxpYnBuZy0xLjYuMCB3ZSB1c2VkIGEgInBuZ19zaXplb2YoKSIgbWFjcm8sIGZvcm1hdHRlZCBhcwotdGhvdWdoIGl0IHdlcmUgYSBmdW5jdGlvbi4KLQotQ29udHJvbCBrZXl3b3JkcyBpZiwgZm9yLCB3aGlsZSwgYW5kIHN3aXRjaCBhcmUgYWx3YXlzIGZvbGxvd2VkIGJ5IGEgc3BhY2UKLXRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBmdW5jdGlvbiBjYWxscywgd2hpY2ggaGF2ZSBubyB0cmFpbGluZyBzcGFjZS4gCi0KLVdlIHB1dCBhIHNwYWNlIGFmdGVyIGVhY2ggY29tbWEgYW5kIGFmdGVyIGVhY2ggc2VtaWNvbG9uCi1pbiAiZm9yIiBzdGF0ZW1lbnRzLCBhbmQgd2UgcHV0IHNwYWNlcyBiZWZvcmUgYW5kIGFmdGVyIGVhY2gKLUMgYmluYXJ5IG9wZXJhdG9yIGFuZCBhZnRlciAiZm9yIiBvciAid2hpbGUiLCBhbmQgYmVmb3JlCi0iPyIuICBXZSBkb24ndCBwdXQgYSBzcGFjZSBiZXR3ZWVuIGEgdHlwZWNhc3QgYW5kIHRoZSBleHByZXNzaW9uCi1iZWluZyBjYXN0LCBub3IgZG8gd2UgcHV0IG9uZSBiZXR3ZWVuIGEgZnVuY3Rpb24gbmFtZSBhbmQgdGhlCi1sZWZ0IHBhcmVudGhlc2lzIHRoYXQgZm9sbG93cyBpdDoKLQotICAgIGZvciAoaSA9IDI7IGkgPiAwOyBcLVwtaSkKLSAgICAgICB5W2ldID0gYSh4KSArIChpbnQpYjsKLQotV2UgcHJlZmVyICNpZmRlZiBhbmQgI2lmbmRlZiB0byAjaWYgZGVmaW5lZCgpIGFuZCAjaWYgIWRlZmluZWQoKQotd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBtYWNybyBiZWluZyB0ZXN0ZWQuICBXZSBhbHdheXMgdXNlIHBhcmVudGhlc2VzCi13aXRoICJkZWZpbmVkIi4KLQotV2UgZXhwcmVzcyBpbnRlZ2VyIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIGFzIGJpdCBtYXNrcyBpbiBoZXggZm9ybWF0LAotd2l0aCBhbiBldmVuIG51bWJlciBvZiBsb3dlci1jYXNlIGhleCBkaWdpdHMsIGFuZCB0byBtYWtlIHRoZW0gdW5zaWduZWQKLShlLmcuLCAweDAwVSwgMHhmZlUsIDB4MDEwMFUpIGFuZCBsb25nIGlmIHRoZXkgYXJlIGdyZWF0ZXIgdGhhbiAweDdmZmYKLShlLmcuLCAweGZmZmZVTCkuCi0KLVdlIHByZWZlciB0byB1c2UgdW5kZXJzY29yZXMgcmF0aGVyIHRoYW4gY2FtZWxDYXNlIGluIG5hbWVzLCBleGNlcHQKLWZvciBhIGZldyB0eXBlIG5hbWVzIHRoYXQgd2UgaW5oZXJpdCBmcm9tIHpsaWIuaC4KLQotV2UgcHJlZmVyICJpZiAoc29tZXRoaW5nICE9IDApIiBhbmQgImlmIChzb21ldGhpbmcgPT0gMCkiCi1vdmVyICJpZiAoc29tZXRoaW5nKSIgYW5kIGlmICIoIXNvbWV0aGluZykiLCByZXNwZWN0aXZlbHkuCi0KLVdlIGRvIG5vdCB1c2UgdGhlIFRBQiBjaGFyYWN0ZXIgZm9yIGluZGVudGF0aW9uIGluIHRoZSBDIHNvdXJjZXMuCi0KLUxpbmVzIGRvIG5vdCBleGNlZWQgODAgY2hhcmFjdGVycy4KLQotT3RoZXIgcnVsZXMgY2FuIGJlIGluZmVycmVkIGJ5IGluc3BlY3RpbmcgdGhlIGxpYnBuZyBzb3VyY2UuCi0KLS5TSCBYVkkuIFkySyBDb21wbGlhbmNlIGluIGxpYnBuZwotCi1TaW5jZSB0aGUgUE5HIERldmVsb3BtZW50IGdyb3VwIGlzIGFuIGFkLWhvYyBib2R5LCB3ZSBjYW4ndCBtYWtlCi1hbiBvZmZpY2lhbCBkZWNsYXJhdGlvbi4KLQotVGhpcyBpcyB5b3VyIHVub2ZmaWNpYWwgYXNzdXJhbmNlIHRoYXQgbGlicG5nIGZyb20gdmVyc2lvbiAwLjcxIGFuZAotdXB3YXJkIHRocm91Z2ggMS42LjI0IGFyZSBZMksgY29tcGxpYW50LiAgSXQgaXMgbXkgYmVsaWVmIHRoYXQgZWFybGllcgotdmVyc2lvbnMgd2VyZSBhbHNvIFkySyBjb21wbGlhbnQuCi0KLUxpYnBuZyBvbmx5IGhhcyB0d28geWVhciBmaWVsZHMuICBPbmUgaXMgYSAyLWJ5dGUgdW5zaWduZWQgaW50ZWdlcgotdGhhdCB3aWxsIGhvbGQgeWVhcnMgdXAgdG8gNjU1MzUuICBUaGUgb3RoZXIsIHdoaWNoIGlzIGRlcHJlY2F0ZWQsCi1ob2xkcyB0aGUgZGF0ZSBpbiB0ZXh0IGZvcm1hdCwgYW5kIHdpbGwgaG9sZCB5ZWFycyB1cCB0byA5OTk5LgotCi1UaGUgaW50ZWdlciBpcwotICAgICJwbmdfdWludF8xNiB5ZWFyIiBpbiBwbmdfdGltZV9zdHJ1Y3QuCi0KLVRoZSBzdHJpbmcgaXMKLSAgICAiY2hhciB0aW1lX2J1ZmZlclsyOV0iIGluIHBuZ19zdHJ1Y3QuICBUaGlzIGlzIG5vIGxvbmdlciB1c2VkCi1pbiBsaWJwbmctMS42LnggYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjcuMC4KLQotVGhlcmUgYXJlIHNldmVuIHRpbWUtcmVsYXRlZCBmdW5jdGlvbnM6Ci0KLSAgICBwbmdfY29udmVydF90b19yZmNfMTEyM19idWZmZXIoKSBpbiBwbmcuYwotICAgICAgKGZvcm1lcmx5IHBuZ19jb252ZXJ0X3RvX3JmY18xMTUyKCkgaW4gZXJyb3IsIGFuZAotICAgICAgYWxzbyBmb3JtZXJseSBwbmdfY29udmVydF90b19yZmNfMTEyMygpKQotICAgIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgaW4gcG5nd3JpdGUuYywgY2FsbGVkCi0gICAgICBpbiBwbmd3cml0ZS5jCi0gICAgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QoKSBpbiBwbmd3cml0ZS5jCi0gICAgcG5nX2dldF90SU1FKCkgaW4gcG5nZ2V0LmMKLSAgICBwbmdfaGFuZGxlX3RJTUUoKSBpbiBwbmdydXRpbC5jLCBjYWxsZWQgaW4gcG5ncmVhZC5jCi0gICAgcG5nX3NldF90SU1FKCkgaW4gcG5nc2V0LmMKLSAgICBwbmdfd3JpdGVfdElNRSgpIGluIHBuZ3d1dGlsLmMsIGNhbGxlZCBpbiBwbmd3cml0ZS5jCi0KLUFsbCBhcHBlYXIgdG8gaGFuZGxlIGRhdGVzIHByb3Blcmx5IGluIGEgWTJLIGVudmlyb25tZW50LiAgVGhlCi1wbmdfY29udmVydF9mcm9tX3RpbWVfdCgpIGZ1bmN0aW9uIGNhbGxzIGdtdGltZSgpIHRvIGNvbnZlcnQgZnJvbSBzeXN0ZW0KLWNsb2NrIHRpbWUsIHdoaWNoIHJldHVybnMgKHllYXIgLSAxOTAwKSwgd2hpY2ggd2UgcHJvcGVybHkgY29udmVydCB0bwotdGhlIGZ1bGwgNC1kaWdpdCB5ZWFyLiAgVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFwcGxpY2F0aW9ucyB1c2luZwotbGlicG5nIGFyZSBub3QgcGFzc2luZyA0LWRpZ2l0IHllYXJzIGludG8gdGhlIHBuZ19jb252ZXJ0X3RvX3JmY18xMTIzKCkKLWZ1bmN0aW9uLCBvciB0aGF0IHRoZXkgYXJlIGluY29ycmVjdGx5IHBhc3Npbmcgb25seSBhIDItZGlnaXQgeWVhcgotaW5zdGVhZCBvZiAieWVhciAtIDE5MDAiIGludG8gdGhlIHBuZ19jb252ZXJ0X2Zyb21fc3RydWN0X3RtKCkgZnVuY3Rpb24sCi1idXQgdGhpcyBpcyBub3QgdW5kZXIgb3VyIGNvbnRyb2wuICBUaGUgbGlicG5nIGRvY3VtZW50YXRpb24gaGFzIGFsd2F5cwotc3RhdGVkIHRoYXQgaXQgd29ya3Mgd2l0aCA0LWRpZ2l0IHllYXJzLCBhbmQgdGhlIEFQSXMgaGF2ZSBiZWVuCi1kb2N1bWVudGVkIGFzIHN1Y2guCi0KLVRoZSB0SU1FIGNodW5rIGl0c2VsZiBpcyBhbHNvIFkySyBjb21wbGlhbnQuICBJdCB1c2VzIGEgMi1ieXRlIHVuc2lnbmVkCi1pbnRlZ2VyIHRvIGhvbGQgdGhlIHllYXIsIGFuZCBjYW4gaG9sZCB5ZWFycyBhcyBsYXJnZSBhcyA2NTUzNS4KLQotemxpYiwgdXBvbiB3aGljaCBsaWJwbmcgZGVwZW5kcywgaXMgYWxzbyBZMksgY29tcGxpYW50LiAgSXQgY29udGFpbnMKLW5vIGRhdGUtcmVsYXRlZCBjb2RlLgotCi0KLSAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICAgbGlicG5nIG1haW50YWluZXIKLSAgIFBORyBEZXZlbG9wbWVudCBHcm91cAotCi0uU0ggTk9URQotCi1Ob3RlIGFib3V0IGxpYnBuZyB2ZXJzaW9uIG51bWJlcnM6Ci0KLUR1ZSB0byB2YXJpb3VzIG1pc2NvbW11bmljYXRpb25zLCB1bmZvcmVzZWVuIGNvZGUgaW5jb21wYXRpYmlsaXRpZXMKLWFuZCBvY2Nhc2lvbmFsIGZhY3RvcnMgb3V0c2lkZSB0aGUgYXV0aG9ycycgY29udHJvbCwgdmVyc2lvbiBudW1iZXJpbmcKLW9uIHRoZSBsaWJyYXJ5IGhhcyBub3QgYWx3YXlzIGJlZW4gY29uc2lzdGVudCBhbmQgc3RyYWlnaHRmb3J3YXJkLgotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIG1hdHRlcnMgc2luY2UgdmVyc2lvbiAwLjg5Yywgd2hpY2ggd2FzCi10aGUgZmlyc3Qgd2lkZWx5IHVzZWQgcmVsZWFzZToKLQotIHNvdXJjZSAgICAgICAgICAgICBwbmcuaCAgcG5nLmggIHNoYXJlZC1saWIKLSB2ZXJzaW9uICAgICAgICAgICAgc3RyaW5nICAgaW50ICB2ZXJzaW9uCi0gLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLSAgLS0tLS0gLS0tLS0tLS0tLQotIDAuODljICIxLjAgYmV0YSAzIiAgICAgMC44OSAgICAgIDg5ICAxLjAuODkKLSAwLjkwICAiMS4wIGJldGEgNCIgICAgIDAuOTAgICAgICA5MCAgMC45MCAgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjkwXQotIDAuOTUgICIxLjAgYmV0YSA1IiAgICAgMC45NSAgICAgIDk1ICAwLjk1ICBbc2hvdWxkIGhhdmUgYmVlbiAyLjAuOTVdCi0gMC45NiAgIjEuMCBiZXRhIDYiICAgICAwLjk2ICAgICAgOTYgIDAuOTYgIFtzaG91bGQgaGF2ZSBiZWVuIDIuMC45Nl0KLSAwLjk3YiAiMS4wMC45NyBiZXRhIDciIDEuMDAuOTcgICA5NyAgMS4wLjEgW3Nob3VsZCBoYXZlIGJlZW4gMi4wLjk3XQotIDAuOTdjICAgICAgICAgICAgICAgICAgMC45NyAgICAgIDk3ICAyLjAuOTcKLSAwLjk4ICAgICAgICAgICAgICAgICAgIDAuOTggICAgICA5OCAgMi4wLjk4Ci0gMC45OSAgICAgICAgICAgICAgICAgICAwLjk5ICAgICAgOTggIDIuMC45OQotIDAuOTlhLW0gICAgICAgICAgICAgICAgMC45OSAgICAgIDk5ICAyLjAuOTkKLSAxLjAwICAgICAgICAgICAgICAgICAgIDEuMDAgICAgIDEwMCAgMi4xLjAgWzEwMCBzaG91bGQgYmUgMTAwMDBdCi0gMS4wLjAgICAgICAoZnJvbSBoZXJlIG9uLCB0aGUgICAxMDAgIDIuMS4wIFsxMDAgc2hvdWxkIGJlIDEwMDAwXQotIDEuMC4xICAgICAgIHBuZy5oIHN0cmluZyBpcyAgIDEwMDAxICAyLjEuMAotIDEuMC4xYS1lICAgIGlkZW50aWNhbCB0byB0aGUgIDEwMDAyICBmcm9tIGhlcmUgb24sIHRoZSBzaGFyZWQgbGlicmFyeQotIDEuMC4yICAgICAgIHNvdXJjZSB2ZXJzaW9uKSAgIDEwMDAyICBpcyAyLlYgd2hlcmUgViBpcyB0aGUgc291cmNlIGNvZGUKLSAxLjAuMmEtYiAgICAgICAgICAgICAgICAgICAgICAxMDAwMyAgdmVyc2lvbiwgZXhjZXB0IGFzIG5vdGVkLgotIDEuMC4zICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAzCi0gMS4wLjNhLWQgICAgICAgICAgICAgICAgICAgICAgMTAwMDQKLSAxLjAuNCAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNAotIDEuMC40YS1mICAgICAgICAgICAgICAgICAgICAgIDEwMDA1Ci0gMS4wLjUgKCsgMiBwYXRjaGVzKSAgICAgICAgICAgMTAwMDUKLSAxLjAuNWEtZCAgICAgICAgICAgICAgICAgICAgICAxMDAwNgotIDEuMC41ZS1yICAgICAgICAgICAgICAgICAgICAgIDEwMTAwIChub3Qgc291cmNlIGNvbXBhdGlibGUpCi0gMS4wLjVzLXYgICAgICAgICAgICAgICAgICAgICAgMTAwMDYgKG5vdCBiaW5hcnkgY29tcGF0aWJsZSkKLSAxLjAuNiAoKyAzIHBhdGNoZXMpICAgICAgICAgICAxMDAwNiAoc3RpbGwgYmluYXJ5IGluY29tcGF0aWJsZSkKLSAxLjAuNmQtZiAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAoc3RpbGwgYmluYXJ5IGluY29tcGF0aWJsZSkKLSAxLjAuNmcgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNwotIDEuMC42aCAgICAgICAgICAgICAgICAgICAgICAgIDEwMDA3ICAxMC42aCAodGVzdGluZyB4eS56IHNvLW51bWJlcmluZykKLSAxLjAuNmkgICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMTAuNmkKLSAxLjAuNmogICAgICAgICAgICAgICAgICAgICAgICAxMDAwNyAgMi4xLjAuNmogKGluY29tcGF0aWJsZSB3aXRoIDEuMC4wKQotIDEuMC43YmV0YTExLTE0ICAgICAgICBETExOVU0gIDEwMDA3ICAyLjEuMC43YmV0YTExLTE0IChiaW5hcnkgY29tcGF0aWJsZSkKLSAxLjAuN2JldGExNS0xOCAgICAgICAgICAgMSAgICAxMDAwNyAgMi4xLjAuN2JldGExNS0xOCAoYmluYXJ5IGNvbXBhdGlibGUpCi0gMS4wLjdyYzEtMiAgICAgICAgICAgICAgIDEgICAgMTAwMDcgIDIuMS4wLjdyYzEtMiAoYmluYXJ5IGNvbXBhdGlibGUpCi0gMS4wLjcgICAgICAgICAgICAgICAgICAgIDEgICAgMTAwMDcgIChzdGlsbCBjb21wYXRpYmxlKQotIC4uLgotIDEuMC4xOSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE5ICAxMC5zby4wLjE5Wy4wXQotIC4uLgotIDEuMi41NiAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjU2ICAxMi5zby4wLjU2Wy4wXQotIC4uLgotIDEuNS4yNyAgICAgICAgICAgICAgICAgIDE1ICAgIDEwNTI3ICAxNS5zby4xNS4yN1suMF0KLSAuLi4KLSAxLjYuMjQgICAgICAgICAgICAgICAgICAxNiAgICAxMDYyNCAgMTYuc28uMTYuMjRbLjBdCi0KLUhlbmNlZm9ydGggdGhlIHNvdXJjZSB2ZXJzaW9uIHdpbGwgbWF0Y2ggdGhlIHNoYXJlZC1saWJyYXJ5IG1pbm9yCi1hbmQgcGF0Y2ggbnVtYmVyczsgdGhlIHNoYXJlZC1saWJyYXJ5IG1ham9yIHZlcnNpb24gbnVtYmVyIHdpbGwgYmUKLXVzZWQgZm9yIGNoYW5nZXMgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYXMgaXQgaXMgaW50ZW5kZWQuICBUaGUKLVBOR19QTkdMSUJfVkVSIG1hY3JvLCB3aGljaCBpcyBub3QgdXNlZCB3aXRoaW4gbGlicG5nIGJ1dCBpcyBhdmFpbGFibGUKLWZvciBhcHBsaWNhdGlvbnMsIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgb2YgdGhlIGZvcm0geHl5enogY29ycmVzcG9uZGluZwotdG8gdGhlIHNvdXJjZSB2ZXJzaW9uIHgueS56IChsZWFkaW5nIHplcm9zIGluIHkgYW5kIHopLiAgQmV0YSB2ZXJzaW9ucwotd2VyZSBnaXZlbiB0aGUgcHJldmlvdXMgcHVibGljIHJlbGVhc2UgbnVtYmVyIHBsdXMgYSBsZXR0ZXIsIHVudGlsCi12ZXJzaW9uIDEuMC42ajsgZnJvbSB0aGVuIG9uIHRoZXkgd2VyZSBnaXZlbiB0aGUgdXBjb21pbmcgcHVibGljCi1yZWxlYXNlIG51bWJlciBwbHVzICJiZXRhTk4iIG9yICJyY05OIi4KLQotLlNIICJTRUUgQUxTTyIKLS5JUiBsaWJwbmdwZigzKSAiLCAiIHBuZyg1KQotLkxQCi0uSVIgbGlicG5nIDoKLS5JUAotaHR0cDovL2xpYnBuZy5zb3VyY2Vmb3JnZS5uZXQgKGZvbGxvdyB0aGUgW0RPV05MT0FEXSBsaW5rKQotaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcKLQotLkxQCi0uSVIgemxpYiA6Ci0uSVAKLShnZW5lcmFsbHkpIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzCi0uSSBsaWJwbmcKLW9yIGF0Ci0uYnIKLWZ0cDovL2Z0cC5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvemxpYgotCi0uTFAKLS5JUiBQTkcgc3BlY2lmaWNhdGlvbjogUkZDIDIwODMKLS5JUAotKGdlbmVyYWxseSkgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMKLS5JIGxpYnBuZwotb3IgYXQKLS5icgotZnRwOi8vZnRwLnJmYy1lZGl0b3Iub3JnOi9pbi1ub3Rlcy9yZmMyMDgzLnR4dAotLmJyCi1vciAoYXMgYSBXM0MgUmVjb21tZW5kYXRpb24pIGF0Ci0uYnIKLWh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1wbmcuaHRtbAotCi0uTFAKLUluIHRoZSBjYXNlIG9mIGFueSBpbmNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIFBORyBzcGVjaWZpY2F0aW9uCi1hbmQgdGhpcyBsaWJyYXJ5LCB0aGUgc3BlY2lmaWNhdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgotCi0uU0ggQVVUSE9SUwotVGhpcyBtYW4gcGFnZTogR2xlbm4gUmFuZGVycy1QZWhyc29uCi08Z2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0KLVRoZSBjb250cmlidXRpbmcgYXV0aG9ycyB3b3VsZCBsaWtlIHRvIHRoYW5rIGFsbCB0aG9zZSB3aG8gaGVscGVkCi13aXRoIHRlc3RpbmcsIGJ1ZyBmaXhlcywgYW5kIHBhdGllbmNlLiAgVGhpcyB3b3VsZG4ndCBoYXZlIGJlZW4KLXBvc3NpYmxlIHdpdGhvdXQgYWxsIG9mIHlvdS4KLQotVGhhbmtzIHRvIEZyYW5rIEouIFQuIFdvamNpayBmb3IgaGVscGluZyB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLgotCi1MaWJwbmcgdmVyc2lvbiAxLjYuMjQgLSBBdWd1c3QgNCwgMjAxNjoKLUluaXRpYWxseSBjcmVhdGVkIGluIDE5OTUgYnkgR3V5IEVyaWMgU2NoYWxuYXQsIHRoZW4gb2YgR3JvdXAgNDIsIEluYy4KLUN1cnJlbnRseSBtYWludGFpbmVkIGJ5IEdsZW5uIFJhbmRlcnMtUGVocnNvbiAoZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpLgotCi1TdXBwb3J0ZWQgYnkgdGhlIFBORyBkZXZlbG9wbWVudCBncm91cAotLmJyCi1wbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zZi5uZXQKLShzdWJzY3JpcHRpb24gcmVxdWlyZWQ7IHZpc2l0Ci1wbmctbW5nLWltcGxlbWVudCBhdCBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKLWh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50Ci10byBzdWJzY3JpYmUpLgotCi0uU0ggTk9USUNFUzoKLQotVGhpcyBjb3B5IG9mIHRoZSBsaWJwbmcgbm90aWNlcyBpcyBwcm92aWRlZCBmb3IgeW91ciBjb252ZW5pZW5jZS4gIEluIGNhc2Ugb2YKLWFueSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoaXMgY29weSBhbmQgdGhlIG5vdGljZXMgaW4gdGhlIGZpbGUgcG5nLmggdGhhdCBpcwotaW5jbHVkZWQgaW4gdGhlIGxpYnBuZyBkaXN0cmlidXRpb24sIHRoZSBsYXR0ZXIgc2hhbGwgcHJldmFpbC4KLQotQ09QWVJJR0hUIE5PVElDRSwgRElTQ0xBSU1FUiwgYW5kIExJQ0VOU0U6Ci0KLUlmIHlvdSBtb2RpZnkgbGlicG5nIHlvdSBtYXkgaW5zZXJ0IGFkZGl0aW9uYWwgbm90aWNlcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKLXRoaXMgc2VudGVuY2UuCi0KLVRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0KLWxpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwIHRocm91Z2ggMS42LjI0LCBBdWd1c3QgNCwgMjAxNiBhcmUKLUNvcHlyaWdodCAoYykgMjAwMC0yMDAyLCAyMDA0LCAyMDA2LTIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhcmUKLWRlcml2ZWQgZnJvbSBsaWJwbmctMS4wLjYsIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lCi1kaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjAuNiB3aXRoIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMKLWFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgotCi0gICBTaW1vbi1QaWVycmUgQ2FkaWV1eAotICAgRXJpYyBTLiBSYXltb25kCi0gICBNYW5zIFJ1bGxnYXJkCi0gICBDb3NtaW4gVHJ1dGEKLSAgIEdpbGxlcyBWb2xsYW50Ci0gICBKYW1lcyBZdQotCi1hbmQgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB0byB0aGUgZGlzY2xhaW1lcjoKLQotICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyIGVuam95bWVudCBvZiB0aGUKLSAgIGxpYnJhcnkgb3IgYWdhaW5zdCBpbmZyaW5nZW1lbnQuICBUaGVyZSBpcyBubyB3YXJyYW50eSB0aGF0IG91cgotICAgZWZmb3J0cyBvciB0aGUgbGlicmFyeSB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcwotICAgb3IgbmVlZHMuICBUaGlzIGxpYnJhcnkgaXMgcHJvdmlkZWQgd2l0aCBhbGwgZmF1bHRzLCBhbmQgdGhlIGVudGlyZQotICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQgZWZmb3J0IGlzIHdpdGgKLSAgIHRoZSB1c2VyLgotCi1Tb21lIGZpbGVzIGluIHRoZSAiY29udHJpYiIgZGlyZWN0b3J5IGFuZCBzb21lIGNvbmZpZ3VyZS1nZW5lcmF0ZWQKLWZpbGVzIHRoYXQgYXJlIGRpc3RyaWJ1dGVkIHdpdGggbGlicG5nIGhhdmUgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhbmQKLWFyZSByZWxlYXNlZCB1bmRlciBvdGhlciBvcGVuIHNvdXJjZSBsaWNlbnNlcy4KLQotbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZQotQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhcmUgZGVyaXZlZCBmcm9tCi1saWJwbmctMC45NiwgYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQKLWxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsIHdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdAotb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6Ci0KLSAgIFRvbSBMYW5lCi0gICBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAgIFdpbGxlbSB2YW4gU2NoYWlrCi0KLWxpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQotQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQW5kcmVhcyBEaWxnZXIsIGFyZSBkZXJpdmVkIGZyb20gbGlicG5nLTAuODgsCi1hbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzCi1saWJwbmctMC44OCwgd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mCi1Db250cmlidXRpbmcgQXV0aG9yczoKLQotICAgSm9obiBCb3dsZXIKLSAgIEtldmluIEJyYWNleQotICAgU2FtIEJ1c2hlbGwKLSAgIE1hZ251cyBIb2xtZ3JlbgotICAgR3JlZyBSb2Vsb2ZzCi0gICBUb20gVGFubmVyCi0KLVNvbWUgZmlsZXMgaW4gdGhlICJzY3JpcHRzIiBkaXJlY3RvcnkgaGF2ZSBvdGhlciBjb3B5cmlnaHQgb3duZXJzCi1idXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoaXMgbGljZW5zZS4KLQotbGlicG5nIHZlcnNpb25zIDAuNSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2LCBhcmUKLUNvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotCi1Gb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiCi1pcyBkZWZpbmVkIGFzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGluZGl2aWR1YWxzOgotCi0gICBBbmRyZWFzIERpbGdlcgotICAgRGF2ZSBNYXJ0aW5kYWxlCi0gICBHdXkgRXJpYyBTY2hhbG5hdAotICAgUGF1bCBTY2htaWR0Ci0gICBUaW0gV2VnbmVyCi0KLVRoZSBQTkcgUmVmZXJlbmNlIExpYnJhcnkgaXMgc3VwcGxpZWQgIkFTIElTIi4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycwotYW5kIEdyb3VwIDQyLCBJbmMuIGRpc2NsYWltIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwKLWluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGUgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIG9mCi1maXRuZXNzIGZvciBhbnkgcHVycG9zZS4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4KLWFzc3VtZSBubyBsaWFiaWxpdHkgZm9yIGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKLW9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIFBORwotUmVmZXJlbmNlIExpYnJhcnksIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKLXNvdXJjZSBjb2RlLCBvciBwb3J0aW9ucyBoZXJlb2YsIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QKLXRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZC4KLQotICAyLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCBhbmQgbXVzdCBub3QKLSAgICAgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZS4KLQotICAzLiBUaGlzIENvcHlyaWdodCBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkKLSAgICAgc291cmNlIG9yIGFsdGVyZWQgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLiBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0Ci1mZWUsIGFuZCBlbmNvdXJhZ2UgdGhlIHVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGFzIGEgY29tcG9uZW50IHRvCi1zdXBwb3J0aW5nIHRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4gIElmIHlvdSB1c2UgdGhpcwotc291cmNlIGNvZGUgaW4gYSBwcm9kdWN0LCBhY2tub3dsZWRnbWVudCBpcyBub3QgcmVxdWlyZWQgYnV0IHdvdWxkIGJlCi1hcHByZWNpYXRlZC4KLQotRU5EIE9GIENPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFLgotCi1UUkFERU1BUks6Ci0KLVRoZSBuYW1lICJsaWJwbmciIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZSBDb3B5cmlnaHQgb3duZXIKLWFzIGEgdHJhZGVtYXJrIGluIGFueSBqdXJpc2RpY3Rpb24uICBIb3dldmVyLCBiZWNhdXNlIGxpYnBuZyBoYXMKLWJlZW4gZGlzdHJpYnV0ZWQgYW5kIG1haW50YWluZWQgd29ybGQtd2lkZSwgY29udGludWFsbHkgc2luY2UgMTk5NSwKLXRoZSBDb3B5cmlnaHQgb3duZXIgY2xhaW1zICJjb21tb24tbGF3IHRyYWRlbWFyayBwcm90ZWN0aW9uIiBpbiBhbnkKLWp1cmlzZGljdGlvbiB3aGVyZSBjb21tb24tbGF3IHRyYWRlbWFyayBpcyByZWNvZ25pemVkLgotCi1PU0kgQ0VSVElGSUNBVElPTjoKLQotTGlicG5nIGlzIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgU29mdHdhcmUuICBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIGlzCi1hIGNlcnRpZmljYXRpb24gbWFyayBvZiB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4gT1NJIGhhcyBub3QgYWRkcmVzc2VkCi10aGUgYWRkaXRpb25hbCBkaXNjbGFpbWVycyBpbnNlcnRlZCBhdCB2ZXJzaW9uIDEuMC43LgotCi1FWFBPUlQgQ09OVFJPTDoKLQotVGhlIENvcHlyaWdodCBvd25lciBiZWxpZXZlcyB0aGF0IHRoZSBFeHBvcnQgQ29udHJvbCBDbGFzc2lmaWNhdGlvbgotTnVtYmVyIChFQ0NOKSBmb3IgbGlicG5nIGlzIEVBUjk5LCB3aGljaCBtZWFucyBub3Qgc3ViamVjdCB0byBleHBvcnQKLWNvbnRyb2xzIG9yIEludGVybmF0aW9uYWwgVHJhZmZpYyBpbiBBcm1zIFJlZ3VsYXRpb25zIChJVEFSKSBiZWNhdXNlCi1pdCBpcyBvcGVuIHNvdXJjZSwgcHVibGljbHkgYXZhaWxhYmxlIHNvZnR3YXJlLCB0aGF0IGRvZXMgbm90IGNvbnRhaW4KLWFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLiAgU2VlIHRoZSBFQVIsIHBhcmFncmFwaHMgNzM0LjMoYikoMykgYW5kCi03MzQuNyhiKS4KLQotQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKLWJveGVzIGFuZCB0aGUgbGlrZToKLQotICAgcHJpbnRmKCIlcyIsIHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKLQotQWxzbywgdGhlIFBORyBsb2dvIChpbiBQTkcgZm9ybWF0LCBvZiBjb3Vyc2UpIGlzIHN1cHBsaWVkIGluIHRoZQotZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KLQotR2xlbm4gUmFuZGVycy1QZWhyc29uCi1nbGVubnJwIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotQXVndXN0IDQsIDIwMTYKLQotLlwiIGVuZCBvZiBtYW4gcGFnZQotCmRpZmYgLS1naXQgYS9saWJwbmcucGMuaW4gYi9saWJwbmcucGMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlN2UyYzUuLjAwMDAwMDAKLS0tIGEvbGlicG5nLnBjLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHJlZml4PUBwcmVmaXhACi1leGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACi1saWJkaXI9QGxpYmRpckAKLWluY2x1ZGVkaXI9QGluY2x1ZGVkaXJAL2xpYnBuZ0BQTkdMSUJfTUFKT1JAQFBOR0xJQl9NSU5PUkAKLQotTmFtZTogbGlicG5nCi1EZXNjcmlwdGlvbjogTG9hZHMgYW5kIHNhdmVzIFBORyBmaWxlcwotVmVyc2lvbjogQFBOR0xJQl9WRVJTSU9OQAotTGliczogLUwke2xpYmRpcn0gLWxwbmdAUE5HTElCX01BSk9SQEBQTkdMSUJfTUlOT1JACi1MaWJzLnByaXZhdGU6IEBMSUJTQAotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYnBuZ3BmLjMgYi9saWJwbmdwZi4zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZThlNmVkLi4wMDAwMDAwCi0tLSBhL2xpYnBuZ3BmLjMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0uVEggTElCUE5HUEYgMyAiQXVndXN0IDQsIDIwMTYiCi0uU0ggTkFNRQotbGlicG5nIFwtIFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORykgUmVmZXJlbmNlIExpYnJhcnkgMS42LjI0Ci0ocHJpdmF0ZSBmdW5jdGlvbnMpCi0uU0ggU1lOT1BTSVMKLVxmQiNpbmNsdWRlIFxmSSJwbmdwcml2LmgiCi0KLVxmQkFzIG9mIGxpYnBuZyB2ZXJzaW9uIFxmUFxmSTEuNS4xXGZQXGZCLCB0aGlzIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIFxmUFxmSW1haW50YWluZWRcZlBcZkIsIG5vdyB0aGF0IHRoZSBwcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgYXJlIGhpZGRlbiBpbiBwbmdwcml2LmggYW5kIG5vdCBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9ucy4gTG9vayBpbiBwbmdwcml2LmggZm9yIHRoZSBwcm90b3R5cGVzIGFuZCBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIGVhY2ggXGZJZnVuY3Rpb24uCi0KLS5TSCBERVNDUklQVElPTgotVGhlIGZ1bmN0aW9ucyBwcmV2aW91c2x5IGxpc3RlZCBoZXJlIGFyZSB1c2VkIHByaXZhdGVseSBieSBsaWJwbmcgYW5kIGFyZSBub3QKLWF2YWlsYWJsZSBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucy4gIFRoZXkgYXJlIG5vdCAiZXhwb3J0ZWQiIHRvIGFwcGxpY2F0aW9ucwotdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQotLlNIIFNFRSBBTFNPCi0uQlIgInBuZyIoNSksICIgbGlicG5nIigzKSwgIiB6bGliIigzKSwgIiBkZWZsYXRlIig1KSwgIiAiIGFuZCAiIHpsaWIiKDUpCi0uU0ggQVVUSE9SCi1HbGVubiBSYW5kZXJzLVBlaHJzb24KZGlmZiAtLWdpdCBhL3BuZy41IGIvcG5nLjUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjZmOWEuLjAwMDAwMDAKLS0tIGEvcG5nLjUKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0uVEggUE5HIDUgIkF1Z3VzdCA0LCAyMDE2IgotLlNIIE5BTUUKLXBuZyBcLSBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIGZvcm1hdAotLlNIIERFU0NSSVBUSU9OCi1QTkcgKFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MpIGlzIGFuIGV4dGVuc2libGUgZmlsZSBmb3JtYXQgZm9yIHRoZQotbG9zc2xlc3MsIHBvcnRhYmxlLCB3ZWxsLWNvbXByZXNzZWQgc3RvcmFnZSBvZiByYXN0ZXIgaW1hZ2VzLiBQTkcgcHJvdmlkZXMKLWEgcGF0ZW50LWZyZWUgcmVwbGFjZW1lbnQgZm9yIEdJRiBhbmQgY2FuIGFsc28gcmVwbGFjZSBtYW55Ci1jb21tb24gdXNlcyBvZiBUSUZGLiBJbmRleGVkLWNvbG9yLCBncmF5c2NhbGUsIGFuZCB0cnVlY29sb3IgaW1hZ2VzIGFyZQotc3VwcG9ydGVkLCBwbHVzIGFuIG9wdGlvbmFsIGFscGhhIGNoYW5uZWwuIFNhbXBsZSBkZXB0aHMgcmFuZ2UgZnJvbQotMSB0byAxNiBiaXRzLgotLmJyCi0KLVBORyBpcyBkZXNpZ25lZCB0byB3b3JrIHdlbGwgaW4gb25saW5lIHZpZXdpbmcgYXBwbGljYXRpb25zLCBzdWNoIGFzIHRoZQotV29ybGQgV2lkZSBXZWIsIHNvIGl0IGlzIGZ1bGx5IHN0cmVhbWFibGUgd2l0aCBhIHByb2dyZXNzaXZlIGRpc3BsYXkKLW9wdGlvbi4gUE5HIGlzIHJvYnVzdCwgcHJvdmlkaW5nIGJvdGggZnVsbCBmaWxlIGludGVncml0eSBjaGVja2luZyBhbmQKLWZhc3QsIHNpbXBsZSBkZXRlY3Rpb24gb2YgY29tbW9uIHRyYW5zbWlzc2lvbiBlcnJvcnMuIEFsc28sIFBORyBjYW4gc3RvcmUKLWdhbW1hIGFuZCBjaHJvbWF0aWNpdHkgZGF0YSBmb3IgaW1wcm92ZWQgY29sb3IgbWF0Y2hpbmcgb24gaGV0ZXJvZ2VuZW91cwotcGxhdGZvcm1zLgotCi0uU0ggIlNFRSBBTFNPIgotLkJSICJsaWJwbmciKDMpLCAiIGxpYnBuZ3BmIigzKSwgIiB6bGliIigzKSwgIiBkZWZsYXRlIig1KSwgIiAiIGFuZCAiIHpsaWIiKDUpCi0uTFAKLVBORyBzcGVjaWZpY2F0aW9uIChzZWNvbmQgZWRpdGlvbiksIE5vdmVtYmVyIDIwMDM6Ci0uSVAKLS5icgotICA8aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtUE5HLTIwMDMxMTEwLwotUE5HIDEuMiBzcGVjaWZpY2F0aW9uLCBKdWx5IDE5OTk6Ci0uSVAKLS5icgotaHR0cDovL3BuZy1tbmcuc291cmNlZm9yZ2UubmV0L3B1Yi9wbmcvc3BlYy8xLjIvCi0uTFAKLVBORyAxLjAgc3BlY2lmaWNhdGlvbiwgT2N0b2JlciAxOTk2OgotLklQCi0uYnIKLVJGQyAyMDgzCi0uSVAKLS5icgotaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA4My50eHQKLS5icgotb3IgKGFzIGEgVzNDIFJlY29tbWVuZGF0aW9uKSBhdAotLmJyCi1odHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtcG5nLTk2MTAwMQotLlNIIEFVVEhPUlMKLVRoaXMgbWFuIHBhZ2U6IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gKFNlY29uZCBFZGl0aW9uKQotSW5mb3JtYXRpb24gdGVjaG5vbG9neSAtIENvbXB1dGVyIGdyYXBoaWNzIGFuZCBpbWFnZSBwcm9jZXNzaW5nIC0KLVBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgKFBORyk6IEZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbi4KLUlTTy9JRUMgMTU5NDg6MjAwMyAoRSkgKE5vdmVtYmVyIDEwLCAyMDAzKTogRGF2aWQgRHVjZSBhbmQgb3RoZXJzLgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjIgKEp1bHkgOCwgMTk5OSk6Ci1HbGVubiBSYW5kZXJzLVBlaHJzb24gYW5kIG90aGVycyAocG5nLWxpc3QpLgotLkxQCi1Qb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzIChQTkcpIFNwZWNpZmljYXRpb24gVmVyc2lvbiAxLjAgKE9jdG9iZXIgMSwgMTk5Nik6Ci1UaG9tYXMgQm91dGVsbCBhbmQgb3RoZXJzIChwbmctbGlzdCkuCi0uTFAKLQotCi0uU0ggQ09QWVJJR0hUIE5PVElDRQotLkxQCi1UaGlzIG1hbiBwYWdlIGlzIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4gIFNlZSBwbmcuaAotZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCi0uTFAKLVRoZSBQTkcgU3BlY2lmaWNhdGlvbiAoU2Vjb25kIEVkaXRpb24pIGlzCi1Db3B5cmlnaHQgKGMpIDIwMDMgVzNDLiAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0uTFAKLVRoZSBQTkctMS4yIHNwZWNpZmljYXRpb24gaXMgY29weXJpZ2h0IChjKSAxOTk5IEdsZW5uIFJhbmRlcnMtUGVocnNvbi4KLVNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY29uZGl0aW9ucyBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbi4KLS5MUAotVGhlIFBORy0xLjAgc3BlY2lmaWNhdGlvbiBpcyBjb3B5cmlnaHQgKGMpIDE5OTYgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLVRlY2hub2xvZ3kuICBTZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIGNvbmRpdGlvbnMgb2YgdXNlIGFuZCBkaXN0cmlidXRpb24uCi0uTFAKLS5cIiBlbmQgb2YgbWFuIHBhZ2UKLQpkaWZmIC0tZ2l0IGEvcG5nYmFyLmpwZyBiL3BuZ2Jhci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmE4ZDguLjAwMDAwMDAKLS0tIGEvcG5nYmFyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BuZ2Jhci5wbmcgYi9wbmdiYXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc5OGM4Li4wMDAwMDAwCi0tLSBhL3BuZ2Jhci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCBiL3BuZ2xpYmNvbmYuaApzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdApyZW5hbWUgdG8gcG5nbGliY29uZi5oCmluZGV4IGQ5MWQ5ZjQuLjM3NThiY2YgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0CisrKyBiL3BuZ2xpYmNvbmYuaApAQCAtMSwyMSArMSwxNiBAQAotLyogbGlicG5nIDEuNi4yNCBTVEFOREFSRCBBUEkgREVGSU5JVElPTiAqLwotCisvKiBsaWJwbmcgMS42LjIyIENVU1RPTSBBUEkgREVGSU5JVElPTiAqLwogLyogcG5nbGliY29uZi5oIC0gbGlicmFyeSBidWlsZCBjb25maWd1cmF0aW9uICovCi0KLS8qIExpYnBuZyB2ZXJzaW9uIDEuNi4yNCAtIEF1Z3VzdCA0LCAyMDE2ICovCi0KKy8qIExpYnBuZyB2ZXJzaW9uIDEuNi4yMiAtIE1heSAyOSwgMjAxNiAqLwogLyogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uICovCi0KIC8qIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuICovCiAvKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyICovCiAvKiBhbmQgbGljZW5zZSBpbiBwbmcuaCAqLwotCiAvKiBwbmdsaWJjb25mLmggKi8KLS8qIE1hY2hpbmUgZ2VuZXJhdGVkIGZpbGU6IERPIE5PVCBFRElUICovCiAvKiBEZXJpdmVkIGZyb206IHNjcmlwdHMvcG5nbGliY29uZi5kZmEgKi8KICNpZm5kZWYgUE5HTENPTkZfSAogI2RlZmluZSBQTkdMQ09ORl9ICi0vKiBvcHRpb25zICovCisvKiBkZWZhdWx0IG9wdGlvbnMgKi8KKy8qIFRoZXNlIGFyZSBQTkcgb3B0aW9ucyB0aGF0IG1hdGNoIHRoZSBkZWZhdWx0IGluIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgKi8KICNkZWZpbmUgUE5HXzE2QklUX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfQUxJR05FRF9NRU1PUllfU1VQUE9SVEVECiAvKiN1bmRlZiBQTkdfQVJNX05FT05fQVBJX1NVUFBPUlRFRCovCkBAIC0yMywxMSArMTgsNyBAQAogI2RlZmluZSBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX0JFTklHTl9SRUFEX0VSUk9SU19TVVBQT1JURUQKIC8qI3VuZGVmIFBOR19CRU5JR05fV1JJVEVfRVJST1JTX1NVUFBPUlRFRCovCi0jZGVmaW5lIFBOR19CVUlMRF9HUkFZU0NBTEVfUEFMRVRURV9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX0NPTlNPTEVfSU9fU1VQUE9SVEVECi0jZGVmaW5lIFBOR19DT05WRVJUX3RJTUVfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19FQVNZX0FDQ0VTU19TVVBQT1JURUQKIC8qI3VuZGVmIFBOR19FUlJPUl9OVU1CRVJTX1NVUFBPUlRFRCovCiAjZGVmaW5lIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRApAQCAtMzcsMTIgKzI4LDggQEAKICNkZWZpbmUgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19GT1JNQVRfQkdSX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfR0FNTUFfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19IQU5ETEVfQVNfVU5LTk9XTl9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19JTkZPX0lNQUdFX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfSU9fU1RBVEVfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19QT0lOVEVSX0lOREVYSU5HX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfMTZCSVRfU1VQUE9SVEVECkBAIC01MCwyMyArMzcsMTcgQEAKICNkZWZpbmUgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfQkdSX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfQ09NUE9TSVRFX05PRElWX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9DT01QUkVTU0VEX1RFWFRfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19SRUFEX0VYUEFORF8xNl9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19SRUFEX0dSQVlfVE9fUkdCX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfSU5UX0ZVTkNUSU9OU19TVVBQT1JURUQKLSNkZWZpbmUgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19SRUFEX09QVF9QTFRFX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfUEFDS19TVVBQT1JURUQKLSNkZWZpbmUgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9TSElGVF9TVVBQT1JURUQKQEAgLTgwLDI4ICs2MSwxNyBAQAogI2RlZmluZSBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19SRUFEX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9jSFJNX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9wQ0FMX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9zQ0FMX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRAotI2RlZmluZSBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRAogI2RlZmluZSBQTkdfU0FWRV9JTlRfMzJfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19TQVZFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfU0VUSk1QX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfU0VUX09QVElPTl9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1NFVF9VU0VSX0xJTUlUU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1NJTVBMSUZJRURfUkVBRF9BRklSU1RfU1VQUE9SVEVECkBAIC0xMTQsNyArODQsNiBAQAogI2RlZmluZSBQTkdfU1RESU9fU1VQUE9SVEVECiAjZGVmaW5lIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1RFWFRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVECkBAIC0xMjUsMTkgKzk0LDE0IEBACiAjZGVmaW5lIFBOR19XUklURV8xNkJJVF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1NfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19XUklURV9CR1JfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX0NPTVBSRVNTRURfVEVYVF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX0NVU1RPTUlaRV9DT01QUkVTU0lPTl9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfV1JJVEVfRklMTEVSX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfV1JJVEVfRklMVEVSX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9HRVRfUEFMRVRURV9NQVhfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX0lOVF9GVU5DVElPTlNfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9JTlZFUlRfQUxQSEFfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9PUFRJTUlaRV9DTUZfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19XUklURV9QQUNLU1dBUF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQKQEAgLTE0OSw0MiArMTEzLDc3IEBACiAjZGVmaW5lIFBOR19XUklURV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfV1JJVEVfYktHRF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX2NIUk1fU1VQUE9SVEVECiAjZGVmaW5lIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9pVFh0X1NVUFBPUlRFRAotI2RlZmluZSBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQKLSNkZWZpbmUgUE5HX1dSSVRFX3BDQUxfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfV1JJVEVfc0JJVF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV9zUExUX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfV1JJVEVfc1JHQl9TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX3RFWHRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19XUklURV90SU1FX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfV1JJVEVfdFJOU19TVVBQT1JURUQKICNkZWZpbmUgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19iS0dEX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfY0hSTV9TVVBQT1JURUQKICNkZWZpbmUgUE5HX2dBTUFfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19oSVNUX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfaUNDUF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX2lUWHRfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19vRkZzX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfcENBTF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX3BIWXNfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19zQklUX1NVUFBPUlRFRAotI2RlZmluZSBQTkdfc0NBTF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX3NQTFRfU1VQUE9SVEVECiAjZGVmaW5lIFBOR19zUkdCX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfdEVYdF9TVVBQT1JURUQKLSNkZWZpbmUgUE5HX3RJTUVfU1VQUE9SVEVECiAjZGVmaW5lIFBOR190Uk5TX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfelRYdF9TVVBQT1JURUQKIC8qIGVuZCBvZiBvcHRpb25zICovCi0vKiBzZXR0aW5ncyAqLworLyogY2hyb21pdW0gb3B0aW9ucyAqLworLyogVGhlc2UgYXJlIFBORyBvcHRpb25zIHRoYXQgY2hyb21pdW0gY2hvb3NlcyB0byBleHBsaWNpdGx5IGRpc2FibGUgKi8KKy8qI3VuZGVmIFBOR19CVUlMRF9HUkFZU0NBTEVfUEFMRVRURV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfQ09OU09MRV9JT19TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX0NPTlZFUlRfdElNRV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX0dFVF9QQUxFVFRFX01BWF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19SRUFEX0dFVF9QQUxFVFRFX01BWF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19SRUFEX09QVF9QTFRFX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfcEhZc19TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfc1BMVF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1JFQURfdElNRV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19XUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX0dFVF9QQUxFVFRFX01BWF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX0lOVkVSVF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX09QVElNSVpFX0NNRl9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX2JLR0RfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19XUklURV9oSVNUX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfV1JJVEVfcEhZc19TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX3NCSVRfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19XUklURV9zQ0FMX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX1dSSVRFX3RJTUVfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19iS0dEX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfaElTVF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX2lUWHRfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19vRkZzX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfcENBTF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX3BIWXNfU1VQUE9SVEVEKi8KKy8qI3VuZGVmIFBOR19zQ0FMX1NVUFBPUlRFRCovCisvKiN1bmRlZiBQTkdfc1BMVF9TVVBQT1JURUQqLworLyojdW5kZWYgUE5HX3RJTUVfU1VQUE9SVEVEKi8KKy8qIGVuZCBvZiBjaHJvbWl1bSBvcHRpb25zICovCisvKiBkZWZhdWx0IHNldHRpbmdzICovCisvKiBUaGVzZSBhcmUgUE5HIHNldHRpbmdzIHRoYXQgbWF0Y2ggdGhlIGRlZmF1bHQgaW4gc2NyaXB0cy9wbmdsaWJjb25mLmRmYSAqLwogI2RlZmluZSBQTkdfQVBJX1JVTEUgMAogI2RlZmluZSBQTkdfREVGQVVMVF9SRUFEX01BQ1JPUyAxCiAjZGVmaW5lIFBOR19HQU1NQV9USFJFU0hPTERfRklYRUQgNTAwMApAQCAtMjAwLDggKzE5OSw2IEBACiAjZGVmaW5lIFBOR19RVUFOVElaRV9SRURfQklUUyA1CiAjZGVmaW5lIFBOR19URVhUX1pfREVGQVVMVF9DT01QUkVTU0lPTiAoLTEpCiAjZGVmaW5lIFBOR19URVhUX1pfREVGQVVMVF9TVFJBVEVHWSAwCi0jZGVmaW5lIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWCAxMDAwCi0jZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggODAwMDAwMAogI2RlZmluZSBQTkdfVVNFUl9IRUlHSFRfTUFYIDEwMDAwMDAKICNkZWZpbmUgUE5HX1VTRVJfV0lEVEhfTUFYIDEwMDAwMDAKICNkZWZpbmUgUE5HX1pCVUZfU0laRSA4MTkyCkBAIC0yMTEsNSArMjA4LDE5IEBACiAjZGVmaW5lIFBOR19aX0RFRkFVTFRfU1RSQVRFR1kgMQogI2RlZmluZSBQTkdfc0NBTF9QUkVDSVNJT04gNQogI2RlZmluZSBQTkdfc1JHQl9QUk9GSUxFX0NIRUNLUyAyCi0vKiBlbmQgb2Ygc2V0dGluZ3MgKi8KKy8qIGVuZCBvZiBkZWZhdWx0IHNldHRpbmdzICovCisvKiBjaHJvbWl1bSBzZXR0aW5ncyAqLworLyogVGhlc2UgYXJlIFBORyBzZXR0aW5nIHRoYXQgY2hyb21pdW0gaGFzIG1vZGlmaWVkICovCisvKiBjcmJ1Zy5jb20vMTE3MzY5ICovCisjZGVmaW5lIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWCAxMjgKKyNkZWZpbmUgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCA0MDAwMDAwTAorLyogZW5kIG9mIGNocm9taXVtIHNldHRpbmdzICovCisvKiBjaHJvbWl1bSBwcmVmaXhpbmcgKi8KKy8qCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBidWlsZCBtdWx0aXBsZSBjb3BpZXMgb2YgbGlicG5nLiAgV2UgbmVlZCB0aGlzIHdoaWxlIHBkZml1bSBidWlsZHMKKyAqIGl0cyBvd24gY29weSBvZiBsaWJwbmcuCisgKi8KKyNkZWZpbmUgUE5HX1BSRUZJWAorI2luY2x1ZGUgInBuZ3ByZWZpeC5oIgorLyogZW5kIG9mIGNocm9taXVtIHByZWZpeGluZyAqLwogI2VuZGlmIC8qIFBOR0xDT05GX0ggKi8KZGlmZiAtLWdpdCBhL3BuZ25vdy5wbmcgYi9wbmdub3cucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mjc5M2ViLi4wMDAwMDAwCi0tLSBhL3BuZ25vdy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbmdwcmVmaXguaCBiL3BuZ3ByZWZpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjhiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbmdwcmVmaXguaApAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKgorICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKyAqLworI2lmbmRlZiBQTkdQUkVGSVhfSAorI2RlZmluZSBQTkdQUkVGSVhfSAorLyoKKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGJ1aWxkIG11bHRpcGxlIGNvcGllcyBvZiBsaWJwbmcuICBXZSBuZWVkIHRoaXMgd2hpbGUgcGRmaXVtIGhhcworICogaXRzIG93biBjb3B5IG9mIGxpYnBuZy4KKyAqLworI2RlZmluZSBwbmdfc1JHQl90YWJsZSB3a19wbmdfc1JHQl90YWJsZQorI2RlZmluZSBwbmdfc1JHQl9iYXNlIHdrX3BuZ19zUkdCX2Jhc2UKKyNkZWZpbmUgcG5nX3NSR0JfZGVsdGEgd2tfcG5nX3NSR0JfZGVsdGEKKyNkZWZpbmUgcG5nX3pzdHJlYW1fZXJyb3Igd2tfcG5nX3pzdHJlYW1fZXJyb3IKKyNkZWZpbmUgcG5nX2ZyZWVfYnVmZmVyX2xpc3Qgd2tfcG5nX2ZyZWVfYnVmZmVyX2xpc3QKKyNkZWZpbmUgcG5nX2ZpeGVkIHdrX3BuZ19maXhlZAorI2RlZmluZSBwbmdfdXNlcl92ZXJzaW9uX2NoZWNrIHdrX3BuZ191c2VyX3ZlcnNpb25fY2hlY2sKKyNkZWZpbmUgcG5nX21hbGxvY19iYXNlIHdrX3BuZ19tYWxsb2NfYmFzZQorI2RlZmluZSBwbmdfbWFsbG9jX2FycmF5IHdrX3BuZ19tYWxsb2NfYXJyYXkKKyNkZWZpbmUgcG5nX3JlYWxsb2NfYXJyYXkgd2tfcG5nX3JlYWxsb2NfYXJyYXkKKyNkZWZpbmUgcG5nX2NyZWF0ZV9wbmdfc3RydWN0IHdrX3BuZ19jcmVhdGVfcG5nX3N0cnVjdAorI2RlZmluZSBwbmdfZGVzdHJveV9wbmdfc3RydWN0IHdrX3BuZ19kZXN0cm95X3BuZ19zdHJ1Y3QKKyNkZWZpbmUgcG5nX2ZyZWVfam1wYnVmIHdrX3BuZ19mcmVlX2ptcGJ1ZgorI2RlZmluZSBwbmdfemFsbG9jIHdrX3BuZ196YWxsb2MKKyNkZWZpbmUgcG5nX3pmcmVlIHdrX3BuZ196ZnJlZQorI2RlZmluZSBwbmdfZGVmYXVsdF9yZWFkX2RhdGEgd2tfcG5nX2RlZmF1bHRfcmVhZF9kYXRhCisjZGVmaW5lIHBuZ19wdXNoX2ZpbGxfYnVmZmVyIHdrX3BuZ19wdXNoX2ZpbGxfYnVmZmVyCisjZGVmaW5lIHBuZ19kZWZhdWx0X3dyaXRlX2RhdGEgd2tfcG5nX2RlZmF1bHRfd3JpdGVfZGF0YQorI2RlZmluZSBwbmdfZGVmYXVsdF9mbHVzaCB3a19wbmdfZGVmYXVsdF9mbHVzaAorI2RlZmluZSBwbmdfcmVzZXRfY3JjIHdrX3BuZ19yZXNldF9jcmMKKyNkZWZpbmUgcG5nX3dyaXRlX2RhdGEgd2tfcG5nX3dyaXRlX2RhdGEKKyNkZWZpbmUgcG5nX3JlYWRfc2lnIHdrX3BuZ19yZWFkX3NpZworI2RlZmluZSBwbmdfcmVhZF9jaHVua19oZWFkZXIgd2tfcG5nX3JlYWRfY2h1bmtfaGVhZGVyCisjZGVmaW5lIHBuZ19yZWFkX2RhdGEgd2tfcG5nX3JlYWRfZGF0YQorI2RlZmluZSBwbmdfY3JjX3JlYWQgd2tfcG5nX2NyY19yZWFkCisjZGVmaW5lIHBuZ19jcmNfZmluaXNoIHdrX3BuZ19jcmNfZmluaXNoCisjZGVmaW5lIHBuZ19jcmNfZXJyb3Igd2tfcG5nX2NyY19lcnJvcgorI2RlZmluZSBwbmdfY2FsY3VsYXRlX2NyYyB3a19wbmdfY2FsY3VsYXRlX2NyYworI2RlZmluZSBwbmdfZmx1c2ggd2tfcG5nX2ZsdXNoCisjZGVmaW5lIHBuZ193cml0ZV9JSERSIHdrX3BuZ193cml0ZV9JSERSCisjZGVmaW5lIHBuZ193cml0ZV9QTFRFIHdrX3BuZ193cml0ZV9QTFRFCisjZGVmaW5lIHBuZ19jb21wcmVzc19JREFUIHdrX3BuZ19jb21wcmVzc19JREFUCisjZGVmaW5lIHBuZ193cml0ZV9JRU5EIHdrX3BuZ193cml0ZV9JRU5ECisjZGVmaW5lIHBuZ193cml0ZV9nQU1BX2ZpeGVkIHdrX3BuZ193cml0ZV9nQU1BX2ZpeGVkCisjZGVmaW5lIHBuZ193cml0ZV9zQklUIHdrX3BuZ193cml0ZV9zQklUCisjZGVmaW5lIHBuZ193cml0ZV9jSFJNX2ZpeGVkIHdrX3BuZ193cml0ZV9jSFJNX2ZpeGVkCisjZGVmaW5lIHBuZ193cml0ZV9zUkdCIHdrX3BuZ193cml0ZV9zUkdCCisjZGVmaW5lIHBuZ193cml0ZV9pQ0NQIHdrX3BuZ193cml0ZV9pQ0NQCisjZGVmaW5lIHBuZ193cml0ZV9zUExUIHdrX3BuZ193cml0ZV9zUExUCisjZGVmaW5lIHBuZ193cml0ZV90Uk5TIHdrX3BuZ193cml0ZV90Uk5TCisjZGVmaW5lIHBuZ193cml0ZV9iS0dEIHdrX3BuZ193cml0ZV9iS0dECisjZGVmaW5lIHBuZ193cml0ZV9oSVNUIHdrX3BuZ193cml0ZV9oSVNUCisjZGVmaW5lIHBuZ193cml0ZV90RVh0IHdrX3BuZ193cml0ZV90RVh0CisjZGVmaW5lIHBuZ193cml0ZV96VFh0IHdrX3BuZ193cml0ZV96VFh0CisjZGVmaW5lIHBuZ193cml0ZV9pVFh0IHdrX3BuZ193cml0ZV9pVFh0CisjZGVmaW5lIHBuZ19zZXRfdGV4dF8yIHdrX3BuZ19zZXRfdGV4dF8yCisjZGVmaW5lIHBuZ193cml0ZV9vRkZzIHdrX3BuZ193cml0ZV9vRkZzCisjZGVmaW5lIHBuZ193cml0ZV9wQ0FMIHdrX3BuZ193cml0ZV9wQ0FMCisjZGVmaW5lIHBuZ193cml0ZV9wSFlzIHdrX3BuZ193cml0ZV9wSFlzCisjZGVmaW5lIHBuZ193cml0ZV90SU1FIHdrX3BuZ193cml0ZV90SU1FCisjZGVmaW5lIHBuZ193cml0ZV9zQ0FMX3Mgd2tfcG5nX3dyaXRlX3NDQUxfcworI2RlZmluZSBwbmdfd3JpdGVfZmluaXNoX3JvdyB3a19wbmdfd3JpdGVfZmluaXNoX3JvdworI2RlZmluZSBwbmdfd3JpdGVfc3RhcnRfcm93IHdrX3BuZ193cml0ZV9zdGFydF9yb3cKKyNkZWZpbmUgcG5nX2NvbWJpbmVfcm93IHdrX3BuZ19jb21iaW5lX3JvdworI2RlZmluZSBwbmdfZG9fcmVhZF9pbnRlcmxhY2Ugd2tfcG5nX2RvX3JlYWRfaW50ZXJsYWNlCisjZGVmaW5lIHBuZ19kb193cml0ZV9pbnRlcmxhY2Ugd2tfcG5nX2RvX3dyaXRlX2ludGVybGFjZQorI2RlZmluZSBwbmdfcmVhZF9maWx0ZXJfcm93IHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3cKKyNkZWZpbmUgcG5nX3JlYWRfZmlsdGVyX3Jvd191cF9uZW9uIHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3dfdXBfbmVvbgorI2RlZmluZSBwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjNfbmVvbiB3a19wbmdfcmVhZF9maWx0ZXJfcm93X3N1YjNfbmVvbgorI2RlZmluZSBwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjRfbmVvbiB3a19wbmdfcmVhZF9maWx0ZXJfcm93X3N1YjRfbmVvbgorI2RlZmluZSBwbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzNfbmVvbiB3a19wbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzNfbmVvbgorI2RlZmluZSBwbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzRfbmVvbiB3a19wbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzRfbmVvbgorI2RlZmluZSBwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoM19uZW9uIHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGgzX25lb24KKyNkZWZpbmUgcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDRfbmVvbiB3a19wbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoNF9uZW9uCisjZGVmaW5lIHBuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViM19zc2UyIHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViM19zc2UyCisjZGVmaW5lIHBuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViNF9zc2UyIHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViNF9zc2UyCisjZGVmaW5lIHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnM19zc2UyIHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnM19zc2UyCisjZGVmaW5lIHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnNF9zc2UyIHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnNF9zc2UyCisjZGVmaW5lIHBuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGgzX3NzZTIgd2tfcG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDNfc3NlMgorI2RlZmluZSBwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoNF9zc2UyIHdrX3BuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGg0X3NzZTIKKyNkZWZpbmUgcG5nX3dyaXRlX2ZpbmRfZmlsdGVyIHdrX3BuZ193cml0ZV9maW5kX2ZpbHRlcgorI2RlZmluZSBwbmdfcmVhZF9JREFUX2RhdGEgd2tfcG5nX3JlYWRfSURBVF9kYXRhCisjZGVmaW5lIHBuZ19yZWFkX2ZpbmlzaF9JREFUIHdrX3BuZ19yZWFkX2ZpbmlzaF9JREFUCisjZGVmaW5lIHBuZ19yZWFkX2ZpbmlzaF9yb3cgd2tfcG5nX3JlYWRfZmluaXNoX3JvdworI2RlZmluZSBwbmdfcmVhZF9zdGFydF9yb3cgd2tfcG5nX3JlYWRfc3RhcnRfcm93CisjZGVmaW5lIHBuZ19yZWFkX3RyYW5zZm9ybV9pbmZvIHdrX3BuZ19yZWFkX3RyYW5zZm9ybV9pbmZvCisjZGVmaW5lIHBuZ19kb19yZWFkX2ZpbGxlciB3a19wbmdfZG9fcmVhZF9maWxsZXIKKyNkZWZpbmUgcG5nX2RvX3JlYWRfc3dhcF9hbHBoYSB3a19wbmdfZG9fcmVhZF9zd2FwX2FscGhhCisjZGVmaW5lIHBuZ19kb193cml0ZV9zd2FwX2FscGhhIHdrX3BuZ19kb193cml0ZV9zd2FwX2FscGhhCisjZGVmaW5lIHBuZ19kb19yZWFkX2ludmVydF9hbHBoYSB3a19wbmdfZG9fcmVhZF9pbnZlcnRfYWxwaGEKKyNkZWZpbmUgcG5nX2RvX3dyaXRlX2ludmVydF9hbHBoYSB3a19wbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhCisjZGVmaW5lIHBuZ19kb19zdHJpcF9jaGFubmVsIHdrX3BuZ19kb19zdHJpcF9jaGFubmVsCisjZGVmaW5lIHBuZ19kb19zd2FwIHdrX3BuZ19kb19zd2FwCisjZGVmaW5lIHBuZ19kb19wYWNrc3dhcCB3a19wbmdfZG9fcGFja3N3YXAKKyNkZWZpbmUgcG5nX2RvX3JnYl90b19ncmF5IHdrX3BuZ19kb19yZ2JfdG9fZ3JheQorI2RlZmluZSBwbmdfZG9fZ3JheV90b19yZ2Igd2tfcG5nX2RvX2dyYXlfdG9fcmdiCisjZGVmaW5lIHBuZ19kb191bnBhY2sgd2tfcG5nX2RvX3VucGFjaworI2RlZmluZSBwbmdfZG9fdW5zaGlmdCB3a19wbmdfZG9fdW5zaGlmdAorI2RlZmluZSBwbmdfZG9faW52ZXJ0IHdrX3BuZ19kb19pbnZlcnQKKyNkZWZpbmUgcG5nX2RvX3NjYWxlXzE2X3RvXzggd2tfcG5nX2RvX3NjYWxlXzE2X3RvXzgKKyNkZWZpbmUgcG5nX2RvX2Nob3Agd2tfcG5nX2RvX2Nob3AKKyNkZWZpbmUgcG5nX2RvX3F1YW50aXplIHdrX3BuZ19kb19xdWFudGl6ZQorI2RlZmluZSBwbmdfZG9fYmdyIHdrX3BuZ19kb19iZ3IKKyNkZWZpbmUgcG5nX2RvX3BhY2sgd2tfcG5nX2RvX3BhY2sKKyNkZWZpbmUgcG5nX2RvX3NoaWZ0IHdrX3BuZ19kb19zaGlmdAorI2RlZmluZSBwbmdfZG9fY29tcG9zZSB3a19wbmdfZG9fY29tcG9zZQorI2RlZmluZSBwbmdfZG9fZ2FtbWEgd2tfcG5nX2RvX2dhbW1hCisjZGVmaW5lIHBuZ19kb19lbmNvZGVfYWxwaGEgd2tfcG5nX2RvX2VuY29kZV9hbHBoYQorI2RlZmluZSBwbmdfZG9fZXhwYW5kX3BhbGV0dGUgd2tfcG5nX2RvX2V4cGFuZF9wYWxldHRlCisjZGVmaW5lIHBuZ19kb19leHBhbmQgd2tfcG5nX2RvX2V4cGFuZAorI2RlZmluZSBwbmdfZG9fZXhwYW5kXzE2IHdrX3BuZ19kb19leHBhbmRfMTYKKyNkZWZpbmUgcG5nX2hhbmRsZV9JSERSIHdrX3BuZ19oYW5kbGVfSUhEUgorI2RlZmluZSBwbmdfaGFuZGxlX1BMVEUgd2tfcG5nX2hhbmRsZV9QTFRFCisjZGVmaW5lIHBuZ19oYW5kbGVfSUVORCB3a19wbmdfaGFuZGxlX0lFTkQKKyNkZWZpbmUgcG5nX2hhbmRsZV9iS0dEIHdrX3BuZ19oYW5kbGVfYktHRAorI2RlZmluZSBwbmdfaGFuZGxlX2NIUk0gd2tfcG5nX2hhbmRsZV9jSFJNCisjZGVmaW5lIHBuZ19oYW5kbGVfZ0FNQSB3a19wbmdfaGFuZGxlX2dBTUEKKyNkZWZpbmUgcG5nX2hhbmRsZV9oSVNUIHdrX3BuZ19oYW5kbGVfaElTVAorI2RlZmluZSBwbmdfaGFuZGxlX2lDQ1Agd2tfcG5nX2hhbmRsZV9pQ0NQCisjZGVmaW5lIHBuZ19oYW5kbGVfaVRYdCB3a19wbmdfaGFuZGxlX2lUWHQKKyNkZWZpbmUgcG5nX2hhbmRsZV9vRkZzIHdrX3BuZ19oYW5kbGVfb0ZGcworI2RlZmluZSBwbmdfaGFuZGxlX3BDQUwgd2tfcG5nX2hhbmRsZV9wQ0FMCisjZGVmaW5lIHBuZ19oYW5kbGVfcEhZcyB3a19wbmdfaGFuZGxlX3BIWXMKKyNkZWZpbmUgcG5nX2hhbmRsZV9zQklUIHdrX3BuZ19oYW5kbGVfc0JJVAorI2RlZmluZSBwbmdfaGFuZGxlX3NDQUwgd2tfcG5nX2hhbmRsZV9zQ0FMCisjZGVmaW5lIHBuZ19oYW5kbGVfc1BMVCB3a19wbmdfaGFuZGxlX3NQTFQKKyNkZWZpbmUgcG5nX2hhbmRsZV9zUkdCIHdrX3BuZ19oYW5kbGVfc1JHQgorI2RlZmluZSBwbmdfaGFuZGxlX3RFWHQgd2tfcG5nX2hhbmRsZV90RVh0CisjZGVmaW5lIHBuZ19oYW5kbGVfdElNRSB3a19wbmdfaGFuZGxlX3RJTUUKKyNkZWZpbmUgcG5nX2hhbmRsZV90Uk5TIHdrX3BuZ19oYW5kbGVfdFJOUworI2RlZmluZSBwbmdfaGFuZGxlX3pUWHQgd2tfcG5nX2hhbmRsZV96VFh0CisjZGVmaW5lIHBuZ19jaGVja19jaHVua19uYW1lIHdrX3BuZ19jaGVja19jaHVua19uYW1lCisjZGVmaW5lIHBuZ19oYW5kbGVfdW5rbm93biB3a19wbmdfaGFuZGxlX3Vua25vd24KKyNkZWZpbmUgcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcgd2tfcG5nX2NodW5rX3Vua25vd25faGFuZGxpbmcKKyNkZWZpbmUgcG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zIHdrX3BuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucworI2RlZmluZSBwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zIHdrX3BuZ19kb193cml0ZV90cmFuc2Zvcm1hdGlvbnMKKyNkZWZpbmUgcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMgd2tfcG5nX2luaXRfcmVhZF90cmFuc2Zvcm1hdGlvbnMKKyNkZWZpbmUgcG5nX3B1c2hfcmVhZF9jaHVuayB3a19wbmdfcHVzaF9yZWFkX2NodW5rCisjZGVmaW5lIHBuZ19wdXNoX3JlYWRfc2lnIHdrX3BuZ19wdXNoX3JlYWRfc2lnCisjZGVmaW5lIHBuZ19wdXNoX2NoZWNrX2NyYyB3a19wbmdfcHVzaF9jaGVja19jcmMKKyNkZWZpbmUgcG5nX3B1c2hfY3JjX3NraXAgd2tfcG5nX3B1c2hfY3JjX3NraXAKKyNkZWZpbmUgcG5nX3B1c2hfY3JjX2ZpbmlzaCB3a19wbmdfcHVzaF9jcmNfZmluaXNoCisjZGVmaW5lIHBuZ19wdXNoX3NhdmVfYnVmZmVyIHdrX3BuZ19wdXNoX3NhdmVfYnVmZmVyCisjZGVmaW5lIHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyIHdrX3BuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyCisjZGVmaW5lIHBuZ19wdXNoX3JlYWRfSURBVCB3a19wbmdfcHVzaF9yZWFkX0lEQVQKKyNkZWZpbmUgcG5nX3Byb2Nlc3NfSURBVF9kYXRhIHdrX3BuZ19wcm9jZXNzX0lEQVRfZGF0YQorI2RlZmluZSBwbmdfcHVzaF9wcm9jZXNzX3JvdyB3a19wbmdfcHVzaF9wcm9jZXNzX3JvdworI2RlZmluZSBwbmdfcHVzaF9oYW5kbGVfdW5rbm93biB3a19wbmdfcHVzaF9oYW5kbGVfdW5rbm93bgorI2RlZmluZSBwbmdfcHVzaF9oYXZlX2luZm8gd2tfcG5nX3B1c2hfaGF2ZV9pbmZvCisjZGVmaW5lIHBuZ19wdXNoX2hhdmVfZW5kIHdrX3BuZ19wdXNoX2hhdmVfZW5kCisjZGVmaW5lIHBuZ19wdXNoX2hhdmVfcm93IHdrX3BuZ19wdXNoX2hhdmVfcm93CisjZGVmaW5lIHBuZ19wdXNoX3JlYWRfZW5kIHdrX3BuZ19wdXNoX3JlYWRfZW5kCisjZGVmaW5lIHBuZ19wcm9jZXNzX3NvbWVfZGF0YSB3a19wbmdfcHJvY2Vzc19zb21lX2RhdGEKKyNkZWZpbmUgcG5nX3JlYWRfcHVzaF9maW5pc2hfcm93IHdrX3BuZ19yZWFkX3B1c2hfZmluaXNoX3JvdworI2RlZmluZSBwbmdfcHVzaF9oYW5kbGVfdEVYdCB3a19wbmdfcHVzaF9oYW5kbGVfdEVYdAorI2RlZmluZSBwbmdfcHVzaF9yZWFkX3RFWHQgd2tfcG5nX3B1c2hfcmVhZF90RVh0CisjZGVmaW5lIHBuZ19wdXNoX2hhbmRsZV96VFh0IHdrX3BuZ19wdXNoX2hhbmRsZV96VFh0CisjZGVmaW5lIHBuZ19wdXNoX3JlYWRfelRYdCB3a19wbmdfcHVzaF9yZWFkX3pUWHQKKyNkZWZpbmUgcG5nX3B1c2hfaGFuZGxlX2lUWHQgd2tfcG5nX3B1c2hfaGFuZGxlX2lUWHQKKyNkZWZpbmUgcG5nX3B1c2hfcmVhZF9pVFh0IHdrX3BuZ19wdXNoX3JlYWRfaVRYdAorI2RlZmluZSBwbmdfZG9fcmVhZF9pbnRyYXBpeGVsIHdrX3BuZ19kb19yZWFkX2ludHJhcGl4ZWwKKyNkZWZpbmUgcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwgd2tfcG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwKKyNkZWZpbmUgcG5nX2NvbG9yc3BhY2Vfc2V0X2dhbW1hIHdrX3BuZ19jb2xvcnNwYWNlX3NldF9nYW1tYQorI2RlZmluZSBwbmdfY29sb3JzcGFjZV9zeW5jX2luZm8gd2tfcG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvCisjZGVmaW5lIHBuZ19jb2xvcnNwYWNlX3N5bmMgd2tfcG5nX2NvbG9yc3BhY2Vfc3luYworI2RlZmluZSBwbmdfY29sb3JzcGFjZV9zZXRfY2hyb21hdGljaXRpZXMgd2tfcG5nX2NvbG9yc3BhY2Vfc2V0X2Nocm9tYXRpY2l0aWVzCisjZGVmaW5lIHBuZ19jb2xvcnNwYWNlX3NldF9lbmRwb2ludHMgd2tfcG5nX2NvbG9yc3BhY2Vfc2V0X2VuZHBvaW50cworI2RlZmluZSBwbmdfY29sb3JzcGFjZV9zZXRfc1JHQiB3a19wbmdfY29sb3JzcGFjZV9zZXRfc1JHQgorI2RlZmluZSBwbmdfY29sb3JzcGFjZV9zZXRfSUNDIHdrX3BuZ19jb2xvcnNwYWNlX3NldF9JQ0MKKyNkZWZpbmUgcG5nX2ljY19jaGVja19sZW5ndGggd2tfcG5nX2ljY19jaGVja19sZW5ndGgKKyNkZWZpbmUgcG5nX2ljY19jaGVja19oZWFkZXIgd2tfcG5nX2ljY19jaGVja19oZWFkZXIKKyNkZWZpbmUgcG5nX2ljY19jaGVja190YWdfdGFibGUgd2tfcG5nX2ljY19jaGVja190YWdfdGFibGUKKyNkZWZpbmUgcG5nX2ljY19zZXRfc1JHQiB3a19wbmdfaWNjX3NldF9zUkdCCisjZGVmaW5lIHBuZ19jb2xvcnNwYWNlX3NldF9yZ2JfY29lZmZpY2llbnRzIHdrX3BuZ19jb2xvcnNwYWNlX3NldF9yZ2JfY29lZmZpY2llbnRzCisjZGVmaW5lIHBuZ19jaGVja19JSERSIHdrX3BuZ19jaGVja19JSERSCisjZGVmaW5lIHBuZ19kb19jaGVja19wYWxldHRlX2luZGV4ZXMgd2tfcG5nX2RvX2NoZWNrX3BhbGV0dGVfaW5kZXhlcworI2RlZmluZSBwbmdfZml4ZWRfZXJyb3Igd2tfcG5nX2ZpeGVkX2Vycm9yCisjZGVmaW5lIHBuZ19zYWZlY2F0IHdrX3BuZ19zYWZlY2F0CisjZGVmaW5lIHBuZ19mb3JtYXRfbnVtYmVyIHdrX3BuZ19mb3JtYXRfbnVtYmVyCisjZGVmaW5lIHBuZ193YXJuaW5nX3BhcmFtZXRlciB3a19wbmdfd2FybmluZ19wYXJhbWV0ZXIKKyNkZWZpbmUgcG5nX3dhcm5pbmdfcGFyYW1ldGVyX3Vuc2lnbmVkIHdrX3BuZ193YXJuaW5nX3BhcmFtZXRlcl91bnNpZ25lZAorI2RlZmluZSBwbmdfd2FybmluZ19wYXJhbWV0ZXJfc2lnbmVkIHdrX3BuZ193YXJuaW5nX3BhcmFtZXRlcl9zaWduZWQKKyNkZWZpbmUgcG5nX2Zvcm1hdHRlZF93YXJuaW5nIHdrX3BuZ19mb3JtYXR0ZWRfd2FybmluZworI2RlZmluZSBwbmdfYXBwX3dhcm5pbmcgd2tfcG5nX2FwcF93YXJuaW5nCisjZGVmaW5lIHBuZ19hcHBfZXJyb3Igd2tfcG5nX2FwcF9lcnJvcgorI2RlZmluZSBwbmdfY2h1bmtfcmVwb3J0IHdrX3BuZ19jaHVua19yZXBvcnQKKyNkZWZpbmUgcG5nX2FzY2lpX2Zyb21fZnAgd2tfcG5nX2FzY2lpX2Zyb21fZnAKKyNkZWZpbmUgcG5nX2FzY2lpX2Zyb21fZml4ZWQgd2tfcG5nX2FzY2lpX2Zyb21fZml4ZWQKKyNkZWZpbmUgcG5nX2NoZWNrX2ZwX251bWJlciB3a19wbmdfY2hlY2tfZnBfbnVtYmVyCisjZGVmaW5lIHBuZ19jaGVja19mcF9zdHJpbmcgd2tfcG5nX2NoZWNrX2ZwX3N0cmluZworI2RlZmluZSBwbmdfbXVsZGl2IHdrX3BuZ19tdWxkaXYKKyNkZWZpbmUgcG5nX211bGRpdl93YXJuIHdrX3BuZ19tdWxkaXZfd2FybgorI2RlZmluZSBwbmdfcmVjaXByb2NhbCB3a19wbmdfcmVjaXByb2NhbAorI2RlZmluZSBwbmdfcmVjaXByb2NhbDIgd2tfcG5nX3JlY2lwcm9jYWwyCisjZGVmaW5lIHBuZ19nYW1tYV9zaWduaWZpY2FudCB3a19wbmdfZ2FtbWFfc2lnbmlmaWNhbnQKKyNkZWZpbmUgcG5nX2dhbW1hX2NvcnJlY3Qgd2tfcG5nX2dhbW1hX2NvcnJlY3QKKyNkZWZpbmUgcG5nX2dhbW1hXzE2Yml0X2NvcnJlY3Qgd2tfcG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QKKyNkZWZpbmUgcG5nX2dhbW1hXzhiaXRfY29ycmVjdCB3a19wbmdfZ2FtbWFfOGJpdF9jb3JyZWN0CisjZGVmaW5lIHBuZ19kZXN0cm95X2dhbW1hX3RhYmxlIHdrX3BuZ19kZXN0cm95X2dhbW1hX3RhYmxlCisjZGVmaW5lIHBuZ19idWlsZF9nYW1tYV90YWJsZSB3a19wbmdfYnVpbGRfZ2FtbWFfdGFibGUKKyNkZWZpbmUgcG5nX3NhZmVfZXJyb3Igd2tfcG5nX3NhZmVfZXJyb3IKKyNkZWZpbmUgcG5nX3NhZmVfd2FybmluZyB3a19wbmdfc2FmZV93YXJuaW5nCisjZGVmaW5lIHBuZ19zYWZlX2V4ZWN1dGUgd2tfcG5nX3NhZmVfZXhlY3V0ZQorI2RlZmluZSBwbmdfaW1hZ2VfZXJyb3Igd2tfcG5nX2ltYWdlX2Vycm9yCisjZGVmaW5lIHBuZ19hY2Nlc3NfdmVyc2lvbl9udW1iZXIgd2tfcG5nX2FjY2Vzc192ZXJzaW9uX251bWJlcgorI2RlZmluZSBwbmdfYnVpbGRfZ3JheXNjYWxlX3BhbGV0dGUgd2tfcG5nX2J1aWxkX2dyYXlzY2FsZV9wYWxldHRlCisjZGVmaW5lIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMgd2tfcG5nX2NvbnZlcnRfdG9fcmZjMTEyMworI2RlZmluZSBwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlciB3a19wbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlcgorI2RlZmluZSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IHdrX3BuZ19jcmVhdGVfaW5mb19zdHJ1Y3QKKyNkZWZpbmUgcG5nX2RhdGFfZnJlZXIgd2tfcG5nX2RhdGFfZnJlZXIKKyNkZWZpbmUgcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3Qgd2tfcG5nX2Rlc3Ryb3lfaW5mb19zdHJ1Y3QKKyNkZWZpbmUgcG5nX2ZyZWVfZGF0YSB3a19wbmdfZnJlZV9kYXRhCisjZGVmaW5lIHBuZ19nZXRfY29weXJpZ2h0IHdrX3BuZ19nZXRfY29weXJpZ2h0CisjZGVmaW5lIHBuZ19nZXRfaGVhZGVyX3ZlciB3a19wbmdfZ2V0X2hlYWRlcl92ZXIKKyNkZWZpbmUgcG5nX2dldF9oZWFkZXJfdmVyc2lvbiB3a19wbmdfZ2V0X2hlYWRlcl92ZXJzaW9uCisjZGVmaW5lIHBuZ19nZXRfaW9fcHRyIHdrX3BuZ19nZXRfaW9fcHRyCisjZGVmaW5lIHBuZ19nZXRfbGlicG5nX3ZlciB3a19wbmdfZ2V0X2xpYnBuZ192ZXIKKyNkZWZpbmUgcG5nX2hhbmRsZV9hc191bmtub3duIHdrX3BuZ19oYW5kbGVfYXNfdW5rbm93bgorI2RlZmluZSBwbmdfaW1hZ2VfZnJlZSB3a19wbmdfaW1hZ2VfZnJlZQorI2RlZmluZSBwbmdfaW5mb19pbml0XzMgd2tfcG5nX2luZm9faW5pdF8zCisjZGVmaW5lIHBuZ19pbml0X2lvIHdrX3BuZ19pbml0X2lvCisjZGVmaW5lIHBuZ19yZXNldF96c3RyZWFtIHdrX3BuZ19yZXNldF96c3RyZWFtCisjZGVmaW5lIHBuZ19zYXZlX2ludF8zMiB3a19wbmdfc2F2ZV9pbnRfMzIKKyNkZWZpbmUgcG5nX3NldF9vcHRpb24gd2tfcG5nX3NldF9vcHRpb24KKyNkZWZpbmUgcG5nX3NldF9zaWdfYnl0ZXMgd2tfcG5nX3NldF9zaWdfYnl0ZXMKKyNkZWZpbmUgcG5nX3NpZ19jbXAgd2tfcG5nX3NpZ19jbXAKKyNkZWZpbmUgcG5nX2Jlbmlnbl9lcnJvciB3a19wbmdfYmVuaWduX2Vycm9yCisjZGVmaW5lIHBuZ19jaHVua19iZW5pZ25fZXJyb3Igd2tfcG5nX2NodW5rX2Jlbmlnbl9lcnJvcgorI2RlZmluZSBwbmdfY2h1bmtfZXJyb3Igd2tfcG5nX2NodW5rX2Vycm9yCisjZGVmaW5lIHBuZ19jaHVua193YXJuaW5nIHdrX3BuZ19jaHVua193YXJuaW5nCisjZGVmaW5lIHBuZ19lcnJvciB3a19wbmdfZXJyb3IKKyNkZWZpbmUgcG5nX2dldF9lcnJvcl9wdHIgd2tfcG5nX2dldF9lcnJvcl9wdHIKKyNkZWZpbmUgcG5nX2xvbmdqbXAgd2tfcG5nX2xvbmdqbXAKKyNkZWZpbmUgcG5nX3NldF9lcnJvcl9mbiB3a19wbmdfc2V0X2Vycm9yX2ZuCisjZGVmaW5lIHBuZ19zZXRfbG9uZ2ptcF9mbiB3a19wbmdfc2V0X2xvbmdqbXBfZm4KKyNkZWZpbmUgcG5nX3dhcm5pbmcgd2tfcG5nX3dhcm5pbmcKKyNkZWZpbmUgcG5nX2dldF9iaXRfZGVwdGggd2tfcG5nX2dldF9iaXRfZGVwdGgKKyNkZWZpbmUgcG5nX2dldF9iS0dEIHdrX3BuZ19nZXRfYktHRAorI2RlZmluZSBwbmdfZ2V0X2NoYW5uZWxzIHdrX3BuZ19nZXRfY2hhbm5lbHMKKyNkZWZpbmUgcG5nX2dldF9jSFJNIHdrX3BuZ19nZXRfY0hSTQorI2RlZmluZSBwbmdfZ2V0X2NIUk1fZml4ZWQgd2tfcG5nX2dldF9jSFJNX2ZpeGVkCisjZGVmaW5lIHBuZ19nZXRfY0hSTV9YWVogd2tfcG5nX2dldF9jSFJNX1hZWgorI2RlZmluZSBwbmdfZ2V0X2NIUk1fWFlaX2ZpeGVkIHdrX3BuZ19nZXRfY0hSTV9YWVpfZml4ZWQKKyNkZWZpbmUgcG5nX2dldF9jaHVua19jYWNoZV9tYXggd2tfcG5nX2dldF9jaHVua19jYWNoZV9tYXgKKyNkZWZpbmUgcG5nX2dldF9jaHVua19tYWxsb2NfbWF4IHdrX3BuZ19nZXRfY2h1bmtfbWFsbG9jX21heAorI2RlZmluZSBwbmdfZ2V0X2NvbG9yX3R5cGUgd2tfcG5nX2dldF9jb2xvcl90eXBlCisjZGVmaW5lIHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgd2tfcG5nX2dldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZQorI2RlZmluZSBwbmdfZ2V0X2NvbXByZXNzaW9uX3R5cGUgd2tfcG5nX2dldF9jb21wcmVzc2lvbl90eXBlCisjZGVmaW5lIHBuZ19nZXRfZmlsdGVyX3R5cGUgd2tfcG5nX2dldF9maWx0ZXJfdHlwZQorI2RlZmluZSBwbmdfZ2V0X2dBTUEgd2tfcG5nX2dldF9nQU1BCisjZGVmaW5lIHBuZ19nZXRfZ0FNQV9maXhlZCB3a19wbmdfZ2V0X2dBTUFfZml4ZWQKKyNkZWZpbmUgcG5nX2dldF9oSVNUIHdrX3BuZ19nZXRfaElTVAorI2RlZmluZSBwbmdfZ2V0X2lDQ1Agd2tfcG5nX2dldF9pQ0NQCisjZGVmaW5lIHBuZ19nZXRfSUhEUiB3a19wbmdfZ2V0X0lIRFIKKyNkZWZpbmUgcG5nX2dldF9pbWFnZV9oZWlnaHQgd2tfcG5nX2dldF9pbWFnZV9oZWlnaHQKKyNkZWZpbmUgcG5nX2dldF9pbWFnZV93aWR0aCB3a19wbmdfZ2V0X2ltYWdlX3dpZHRoCisjZGVmaW5lIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUgd2tfcG5nX2dldF9pbnRlcmxhY2VfdHlwZQorI2RlZmluZSBwbmdfZ2V0X2lvX2NodW5rX3R5cGUgd2tfcG5nX2dldF9pb19jaHVua190eXBlCisjZGVmaW5lIHBuZ19nZXRfaW9fc3RhdGUgd2tfcG5nX2dldF9pb19zdGF0ZQorI2RlZmluZSBwbmdfZ2V0X29GRnMgd2tfcG5nX2dldF9vRkZzCisjZGVmaW5lIHBuZ19nZXRfcGFsZXR0ZV9tYXggd2tfcG5nX2dldF9wYWxldHRlX21heAorI2RlZmluZSBwbmdfZ2V0X3BDQUwgd2tfcG5nX2dldF9wQ0FMCisjZGVmaW5lIHBuZ19nZXRfcEhZcyB3a19wbmdfZ2V0X3BIWXMKKyNkZWZpbmUgcG5nX2dldF9wSFlzX2RwaSB3a19wbmdfZ2V0X3BIWXNfZHBpCisjZGVmaW5lIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvIHdrX3BuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvCisjZGVmaW5lIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvX2ZpeGVkIHdrX3BuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvX2ZpeGVkCisjZGVmaW5lIHBuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoIHdrX3BuZ19nZXRfcGl4ZWxzX3Blcl9pbmNoCisjZGVmaW5lIHBuZ19nZXRfcGl4ZWxzX3Blcl9tZXRlciB3a19wbmdfZ2V0X3BpeGVsc19wZXJfbWV0ZXIKKyNkZWZpbmUgcG5nX2dldF9QTFRFIHdrX3BuZ19nZXRfUExURQorI2RlZmluZSBwbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cyB3a19wbmdfZ2V0X3JnYl90b19ncmF5X3N0YXR1cworI2RlZmluZSBwbmdfZ2V0X3Jvd2J5dGVzIHdrX3BuZ19nZXRfcm93Ynl0ZXMKKyNkZWZpbmUgcG5nX2dldF9yb3dzIHdrX3BuZ19nZXRfcm93cworI2RlZmluZSBwbmdfZ2V0X3NCSVQgd2tfcG5nX2dldF9zQklUCisjZGVmaW5lIHBuZ19nZXRfc0NBTCB3a19wbmdfZ2V0X3NDQUwKKyNkZWZpbmUgcG5nX2dldF9zQ0FMX2ZpeGVkIHdrX3BuZ19nZXRfc0NBTF9maXhlZAorI2RlZmluZSBwbmdfZ2V0X3NDQUxfcyB3a19wbmdfZ2V0X3NDQUxfcworI2RlZmluZSBwbmdfZ2V0X3NpZ25hdHVyZSB3a19wbmdfZ2V0X3NpZ25hdHVyZQorI2RlZmluZSBwbmdfZ2V0X3NQTFQgd2tfcG5nX2dldF9zUExUCisjZGVmaW5lIHBuZ19nZXRfc1JHQiB3a19wbmdfZ2V0X3NSR0IKKyNkZWZpbmUgcG5nX2dldF90ZXh0IHdrX3BuZ19nZXRfdGV4dAorI2RlZmluZSBwbmdfZ2V0X3RJTUUgd2tfcG5nX2dldF90SU1FCisjZGVmaW5lIHBuZ19nZXRfdFJOUyB3a19wbmdfZ2V0X3RSTlMKKyNkZWZpbmUgcG5nX2dldF91bmtub3duX2NodW5rcyB3a19wbmdfZ2V0X3Vua25vd25fY2h1bmtzCisjZGVmaW5lIHBuZ19nZXRfdXNlcl9jaHVua19wdHIgd2tfcG5nX2dldF91c2VyX2NodW5rX3B0cgorI2RlZmluZSBwbmdfZ2V0X3VzZXJfaGVpZ2h0X21heCB3a19wbmdfZ2V0X3VzZXJfaGVpZ2h0X21heAorI2RlZmluZSBwbmdfZ2V0X3VzZXJfd2lkdGhfbWF4IHdrX3BuZ19nZXRfdXNlcl93aWR0aF9tYXgKKyNkZWZpbmUgcG5nX2dldF92YWxpZCB3a19wbmdfZ2V0X3ZhbGlkCisjZGVmaW5lIHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzIHdrX3BuZ19nZXRfeF9vZmZzZXRfaW5jaGVzCisjZGVmaW5lIHBuZ19nZXRfeF9vZmZzZXRfaW5jaGVzX2ZpeGVkIHdrX3BuZ19nZXRfeF9vZmZzZXRfaW5jaGVzX2ZpeGVkCisjZGVmaW5lIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyB3a19wbmdfZ2V0X3hfb2Zmc2V0X21pY3JvbnMKKyNkZWZpbmUgcG5nX2dldF94X29mZnNldF9waXhlbHMgd2tfcG5nX2dldF94X29mZnNldF9waXhlbHMKKyNkZWZpbmUgcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaCB3a19wbmdfZ2V0X3hfcGl4ZWxzX3Blcl9pbmNoCisjZGVmaW5lIHBuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyIHdrX3BuZ19nZXRfeF9waXhlbHNfcGVyX21ldGVyCisjZGVmaW5lIHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzIHdrX3BuZ19nZXRfeV9vZmZzZXRfaW5jaGVzCisjZGVmaW5lIHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzX2ZpeGVkIHdrX3BuZ19nZXRfeV9vZmZzZXRfaW5jaGVzX2ZpeGVkCisjZGVmaW5lIHBuZ19nZXRfeV9vZmZzZXRfbWljcm9ucyB3a19wbmdfZ2V0X3lfb2Zmc2V0X21pY3JvbnMKKyNkZWZpbmUgcG5nX2dldF95X29mZnNldF9waXhlbHMgd2tfcG5nX2dldF95X29mZnNldF9waXhlbHMKKyNkZWZpbmUgcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaCB3a19wbmdfZ2V0X3lfcGl4ZWxzX3Blcl9pbmNoCisjZGVmaW5lIHBuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyIHdrX3BuZ19nZXRfeV9waXhlbHNfcGVyX21ldGVyCisjZGVmaW5lIHBuZ19jYWxsb2Mgd2tfcG5nX2NhbGxvYworI2RlZmluZSBwbmdfZnJlZSB3a19wbmdfZnJlZQorI2RlZmluZSBwbmdfZnJlZV9kZWZhdWx0IHdrX3BuZ19mcmVlX2RlZmF1bHQKKyNkZWZpbmUgcG5nX2dldF9tZW1fcHRyIHdrX3BuZ19nZXRfbWVtX3B0cgorI2RlZmluZSBwbmdfbWFsbG9jIHdrX3BuZ19tYWxsb2MKKyNkZWZpbmUgcG5nX21hbGxvY19kZWZhdWx0IHdrX3BuZ19tYWxsb2NfZGVmYXVsdAorI2RlZmluZSBwbmdfbWFsbG9jX3dhcm4gd2tfcG5nX21hbGxvY193YXJuCisjZGVmaW5lIHBuZ19zZXRfbWVtX2ZuIHdrX3BuZ19zZXRfbWVtX2ZuCisjZGVmaW5lIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyIHdrX3BuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyCisjZGVmaW5lIHBuZ19wcm9jZXNzX2RhdGEgd2tfcG5nX3Byb2Nlc3NfZGF0YQorI2RlZmluZSBwbmdfcHJvY2Vzc19kYXRhX3BhdXNlIHdrX3BuZ19wcm9jZXNzX2RhdGFfcGF1c2UKKyNkZWZpbmUgcG5nX3Byb2Nlc3NfZGF0YV9za2lwIHdrX3BuZ19wcm9jZXNzX2RhdGFfc2tpcAorI2RlZmluZSBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgd2tfcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93CisjZGVmaW5lIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbiB3a19wbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4KKyNkZWZpbmUgcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCB3a19wbmdfY3JlYXRlX3JlYWRfc3RydWN0CisjZGVmaW5lIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3RfMiB3a19wbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIKKyNkZWZpbmUgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3Qgd2tfcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QKKyNkZWZpbmUgcG5nX2ltYWdlX2JlZ2luX3JlYWRfZnJvbV9maWxlIHdrX3BuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fZmlsZQorI2RlZmluZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeSB3a19wbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX21lbW9yeQorI2RlZmluZSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX3N0ZGlvIHdrX3BuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8KKyNkZWZpbmUgcG5nX2ltYWdlX2ZpbmlzaF9yZWFkIHdrX3BuZ19pbWFnZV9maW5pc2hfcmVhZAorI2RlZmluZSBwbmdfcmVhZF9lbmQgd2tfcG5nX3JlYWRfZW5kCisjZGVmaW5lIHBuZ19yZWFkX2ltYWdlIHdrX3BuZ19yZWFkX2ltYWdlCisjZGVmaW5lIHBuZ19yZWFkX2luZm8gd2tfcG5nX3JlYWRfaW5mbworI2RlZmluZSBwbmdfcmVhZF9wbmcgd2tfcG5nX3JlYWRfcG5nCisjZGVmaW5lIHBuZ19yZWFkX3JvdyB3a19wbmdfcmVhZF9yb3cKKyNkZWZpbmUgcG5nX3JlYWRfcm93cyB3a19wbmdfcmVhZF9yb3dzCisjZGVmaW5lIHBuZ19yZWFkX3VwZGF0ZV9pbmZvIHdrX3BuZ19yZWFkX3VwZGF0ZV9pbmZvCisjZGVmaW5lIHBuZ19zZXRfcmVhZF9zdGF0dXNfZm4gd2tfcG5nX3NldF9yZWFkX3N0YXR1c19mbgorI2RlZmluZSBwbmdfc3RhcnRfcmVhZF9pbWFnZSB3a19wbmdfc3RhcnRfcmVhZF9pbWFnZQorI2RlZmluZSBwbmdfc2V0X3JlYWRfZm4gd2tfcG5nX3NldF9yZWFkX2ZuCisjZGVmaW5lIHBuZ19zZXRfYWxwaGFfbW9kZSB3a19wbmdfc2V0X2FscGhhX21vZGUKKyNkZWZpbmUgcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkIHdrX3BuZ19zZXRfYWxwaGFfbW9kZV9maXhlZAorI2RlZmluZSBwbmdfc2V0X2JhY2tncm91bmQgd2tfcG5nX3NldF9iYWNrZ3JvdW5kCisjZGVmaW5lIHBuZ19zZXRfYmFja2dyb3VuZF9maXhlZCB3a19wbmdfc2V0X2JhY2tncm91bmRfZml4ZWQKKyNkZWZpbmUgcG5nX3NldF9jcmNfYWN0aW9uIHdrX3BuZ19zZXRfY3JjX2FjdGlvbgorI2RlZmluZSBwbmdfc2V0X2V4cGFuZCB3a19wbmdfc2V0X2V4cGFuZAorI2RlZmluZSBwbmdfc2V0X2V4cGFuZF8xNiB3a19wbmdfc2V0X2V4cGFuZF8xNgorI2RlZmluZSBwbmdfc2V0X2V4cGFuZF9ncmF5XzFfMl80X3RvXzggd2tfcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184CisjZGVmaW5lIHBuZ19zZXRfZ2FtbWEgd2tfcG5nX3NldF9nYW1tYQorI2RlZmluZSBwbmdfc2V0X2dhbW1hX2ZpeGVkIHdrX3BuZ19zZXRfZ2FtbWFfZml4ZWQKKyNkZWZpbmUgcG5nX3NldF9ncmF5X3RvX3JnYiB3a19wbmdfc2V0X2dyYXlfdG9fcmdiCisjZGVmaW5lIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2Igd2tfcG5nX3NldF9wYWxldHRlX3RvX3JnYgorI2RlZmluZSBwbmdfc2V0X3F1YW50aXplIHdrX3BuZ19zZXRfcXVhbnRpemUKKyNkZWZpbmUgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuIHdrX3BuZ19zZXRfcmVhZF91c2VyX3RyYW5zZm9ybV9mbgorI2RlZmluZSBwbmdfc2V0X3JnYl90b19ncmF5IHdrX3BuZ19zZXRfcmdiX3RvX2dyYXkKKyNkZWZpbmUgcG5nX3NldF9yZ2JfdG9fZ3JheV9maXhlZCB3a19wbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkCisjZGVmaW5lIHBuZ19zZXRfc2NhbGVfMTYgd2tfcG5nX3NldF9zY2FsZV8xNgorI2RlZmluZSBwbmdfc2V0X3N0cmlwXzE2IHdrX3BuZ19zZXRfc3RyaXBfMTYKKyNkZWZpbmUgcG5nX3NldF9zdHJpcF9hbHBoYSB3a19wbmdfc2V0X3N0cmlwX2FscGhhCisjZGVmaW5lIHBuZ19zZXRfdFJOU190b19hbHBoYSB3a19wbmdfc2V0X3RSTlNfdG9fYWxwaGEKKyNkZWZpbmUgcG5nX2dldF9pbnRfMzIgd2tfcG5nX2dldF9pbnRfMzIKKyNkZWZpbmUgcG5nX2dldF91aW50XzE2IHdrX3BuZ19nZXRfdWludF8xNgorI2RlZmluZSBwbmdfZ2V0X3VpbnRfMzEgd2tfcG5nX2dldF91aW50XzMxCisjZGVmaW5lIHBuZ19nZXRfdWludF8zMiB3a19wbmdfZ2V0X3VpbnRfMzIKKyNkZWZpbmUgcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMgd2tfcG5nX3Blcm1pdF9tbmdfZmVhdHVyZXMKKyNkZWZpbmUgcG5nX3NldF9iZW5pZ25fZXJyb3JzIHdrX3BuZ19zZXRfYmVuaWduX2Vycm9ycworI2RlZmluZSBwbmdfc2V0X2JLR0Qgd2tfcG5nX3NldF9iS0dECisjZGVmaW5lIHBuZ19zZXRfY2hlY2tfZm9yX2ludmFsaWRfaW5kZXggd2tfcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleAorI2RlZmluZSBwbmdfc2V0X2NIUk0gd2tfcG5nX3NldF9jSFJNCisjZGVmaW5lIHBuZ19zZXRfY0hSTV9maXhlZCB3a19wbmdfc2V0X2NIUk1fZml4ZWQKKyNkZWZpbmUgcG5nX3NldF9jSFJNX1hZWiB3a19wbmdfc2V0X2NIUk1fWFlaCisjZGVmaW5lIHBuZ19zZXRfY0hSTV9YWVpfZml4ZWQgd2tfcG5nX3NldF9jSFJNX1hZWl9maXhlZAorI2RlZmluZSBwbmdfc2V0X2NodW5rX2NhY2hlX21heCB3a19wbmdfc2V0X2NodW5rX2NhY2hlX21heAorI2RlZmluZSBwbmdfc2V0X2NodW5rX21hbGxvY19tYXggd2tfcG5nX3NldF9jaHVua19tYWxsb2NfbWF4CisjZGVmaW5lIHBuZ19zZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgd2tfcG5nX3NldF9jb21wcmVzc2lvbl9idWZmZXJfc2l6ZQorI2RlZmluZSBwbmdfc2V0X2dBTUEgd2tfcG5nX3NldF9nQU1BCisjZGVmaW5lIHBuZ19zZXRfZ0FNQV9maXhlZCB3a19wbmdfc2V0X2dBTUFfZml4ZWQKKyNkZWZpbmUgcG5nX3NldF9oSVNUIHdrX3BuZ19zZXRfaElTVAorI2RlZmluZSBwbmdfc2V0X2lDQ1Agd2tfcG5nX3NldF9pQ0NQCisjZGVmaW5lIHBuZ19zZXRfSUhEUiB3a19wbmdfc2V0X0lIRFIKKyNkZWZpbmUgcG5nX3NldF9pbnZhbGlkIHdrX3BuZ19zZXRfaW52YWxpZAorI2RlZmluZSBwbmdfc2V0X2tlZXBfdW5rbm93bl9jaHVua3Mgd2tfcG5nX3NldF9rZWVwX3Vua25vd25fY2h1bmtzCisjZGVmaW5lIHBuZ19zZXRfb0ZGcyB3a19wbmdfc2V0X29GRnMKKyNkZWZpbmUgcG5nX3NldF9wQ0FMIHdrX3BuZ19zZXRfcENBTAorI2RlZmluZSBwbmdfc2V0X3BIWXMgd2tfcG5nX3NldF9wSFlzCisjZGVmaW5lIHBuZ19zZXRfUExURSB3a19wbmdfc2V0X1BMVEUKKyNkZWZpbmUgcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4gd2tfcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4KKyNkZWZpbmUgcG5nX3NldF9yb3dzIHdrX3BuZ19zZXRfcm93cworI2RlZmluZSBwbmdfc2V0X3NCSVQgd2tfcG5nX3NldF9zQklUCisjZGVmaW5lIHBuZ19zZXRfc0NBTCB3a19wbmdfc2V0X3NDQUwKKyNkZWZpbmUgcG5nX3NldF9zQ0FMX2ZpeGVkIHdrX3BuZ19zZXRfc0NBTF9maXhlZAorI2RlZmluZSBwbmdfc2V0X3NDQUxfcyB3a19wbmdfc2V0X3NDQUxfcworI2RlZmluZSBwbmdfc2V0X3NQTFQgd2tfcG5nX3NldF9zUExUCisjZGVmaW5lIHBuZ19zZXRfc1JHQiB3a19wbmdfc2V0X3NSR0IKKyNkZWZpbmUgcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0gd2tfcG5nX3NldF9zUkdCX2dBTUFfYW5kX2NIUk0KKyNkZWZpbmUgcG5nX3NldF90ZXh0IHdrX3BuZ19zZXRfdGV4dAorI2RlZmluZSBwbmdfc2V0X3RJTUUgd2tfcG5nX3NldF90SU1FCisjZGVmaW5lIHBuZ19zZXRfdFJOUyB3a19wbmdfc2V0X3RSTlMKKyNkZWZpbmUgcG5nX3NldF91bmtub3duX2NodW5rX2xvY2F0aW9uIHdrX3BuZ19zZXRfdW5rbm93bl9jaHVua19sb2NhdGlvbgorI2RlZmluZSBwbmdfc2V0X3Vua25vd25fY2h1bmtzIHdrX3BuZ19zZXRfdW5rbm93bl9jaHVua3MKKyNkZWZpbmUgcG5nX3NldF91c2VyX2xpbWl0cyB3a19wbmdfc2V0X3VzZXJfbGltaXRzCisjZGVmaW5lIHBuZ19nZXRfY3VycmVudF9wYXNzX251bWJlciB3a19wbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIKKyNkZWZpbmUgcG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIgd2tfcG5nX2dldF9jdXJyZW50X3Jvd19udW1iZXIKKyNkZWZpbmUgcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIgd2tfcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIKKyNkZWZpbmUgcG5nX3NldF9hZGRfYWxwaGEgd2tfcG5nX3NldF9hZGRfYWxwaGEKKyNkZWZpbmUgcG5nX3NldF9iZ3Igd2tfcG5nX3NldF9iZ3IKKyNkZWZpbmUgcG5nX3NldF9maWxsZXIgd2tfcG5nX3NldF9maWxsZXIKKyNkZWZpbmUgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcgd2tfcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcKKyNkZWZpbmUgcG5nX3NldF9pbnZlcnRfYWxwaGEgd2tfcG5nX3NldF9pbnZlcnRfYWxwaGEKKyNkZWZpbmUgcG5nX3NldF9pbnZlcnRfbW9ubyB3a19wbmdfc2V0X2ludmVydF9tb25vCisjZGVmaW5lIHBuZ19zZXRfcGFja2luZyB3a19wbmdfc2V0X3BhY2tpbmcKKyNkZWZpbmUgcG5nX3NldF9wYWNrc3dhcCB3a19wbmdfc2V0X3BhY2tzd2FwCisjZGVmaW5lIHBuZ19zZXRfc2hpZnQgd2tfcG5nX3NldF9zaGlmdAorI2RlZmluZSBwbmdfc2V0X3N3YXAgd2tfcG5nX3NldF9zd2FwCisjZGVmaW5lIHBuZ19zZXRfc3dhcF9hbHBoYSB3a19wbmdfc2V0X3N3YXBfYWxwaGEKKyNkZWZpbmUgcG5nX3NldF91c2VyX3RyYW5zZm9ybV9pbmZvIHdrX3BuZ19zZXRfdXNlcl90cmFuc2Zvcm1faW5mbworI2RlZmluZSBwbmdfc2V0X3dyaXRlX2ZuIHdrX3BuZ19zZXRfd3JpdGVfZm4KKyNkZWZpbmUgcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0gd2tfcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0KKyNkZWZpbmUgcG5nX2NvbnZlcnRfZnJvbV90aW1lX3Qgd2tfcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QKKyNkZWZpbmUgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3Qgd2tfcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QKKyNkZWZpbmUgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMiB3a19wbmdfY3JlYXRlX3dyaXRlX3N0cnVjdF8yCisjZGVmaW5lIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCB3a19wbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QKKyNkZWZpbmUgcG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUgd2tfcG5nX2ltYWdlX3dyaXRlX3RvX2ZpbGUKKyNkZWZpbmUgcG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvIHdrX3BuZ19pbWFnZV93cml0ZV90b19zdGRpbworI2RlZmluZSBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIHdrX3BuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwKKyNkZWZpbmUgcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgd2tfcG5nX3NldF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwKKyNkZWZpbmUgcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2Qgd2tfcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QKKyNkZWZpbmUgcG5nX3NldF9jb21wcmVzc2lvbl9zdHJhdGVneSB3a19wbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5CisjZGVmaW5lIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgd2tfcG5nX3NldF9jb21wcmVzc2lvbl93aW5kb3dfYml0cworI2RlZmluZSBwbmdfc2V0X2ZpbHRlciB3a19wbmdfc2V0X2ZpbHRlcgorI2RlZmluZSBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzIHdrX3BuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MKKyNkZWZpbmUgcG5nX3NldF9maWx0ZXJfaGV1cmlzdGljc19maXhlZCB3a19wbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzX2ZpeGVkCisjZGVmaW5lIHBuZ19zZXRfZmx1c2ggd2tfcG5nX3NldF9mbHVzaAorI2RlZmluZSBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbGV2ZWwgd2tfcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX2xldmVsCisjZGVmaW5lIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZW1fbGV2ZWwgd2tfcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21lbV9sZXZlbAorI2RlZmluZSBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fbWV0aG9kIHdrX3BuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZXRob2QKKyNkZWZpbmUgcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5IHdrX3BuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9zdHJhdGVneQorI2RlZmluZSBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgd2tfcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3dpbmRvd19iaXRzCisjZGVmaW5lIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuIHdrX3BuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuCisjZGVmaW5lIHBuZ19zZXRfd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm4gd2tfcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbgorI2RlZmluZSBwbmdfd3JpdGVfZW5kIHdrX3BuZ193cml0ZV9lbmQKKyNkZWZpbmUgcG5nX3dyaXRlX2ZsdXNoIHdrX3BuZ193cml0ZV9mbHVzaAorI2RlZmluZSBwbmdfd3JpdGVfaW1hZ2Ugd2tfcG5nX3dyaXRlX2ltYWdlCisjZGVmaW5lIHBuZ193cml0ZV9pbmZvIHdrX3BuZ193cml0ZV9pbmZvCisjZGVmaW5lIHBuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFIHdrX3BuZ193cml0ZV9pbmZvX2JlZm9yZV9QTFRFCisjZGVmaW5lIHBuZ193cml0ZV9wbmcgd2tfcG5nX3dyaXRlX3BuZworI2RlZmluZSBwbmdfd3JpdGVfcm93IHdrX3BuZ193cml0ZV9yb3cKKyNkZWZpbmUgcG5nX3dyaXRlX3Jvd3Mgd2tfcG5nX3dyaXRlX3Jvd3MKKyNkZWZpbmUgcG5nX3NhdmVfdWludF8xNiB3a19wbmdfc2F2ZV91aW50XzE2CisjZGVmaW5lIHBuZ19zYXZlX3VpbnRfMzIgd2tfcG5nX3NhdmVfdWludF8zMgorI2RlZmluZSBwbmdfd3JpdGVfY2h1bmsgd2tfcG5nX3dyaXRlX2NodW5rCisjZGVmaW5lIHBuZ193cml0ZV9jaHVua19kYXRhIHdrX3BuZ193cml0ZV9jaHVua19kYXRhCisjZGVmaW5lIHBuZ193cml0ZV9jaHVua19zdGFydCB3a19wbmdfd3JpdGVfY2h1bmtfc3RhcnQKKyNkZWZpbmUgcG5nX3dyaXRlX2NodW5rX2VuZCB3a19wbmdfd3JpdGVfY2h1bmtfZW5kCisjZGVmaW5lIHBuZ193cml0ZV9zaWcgd2tfcG5nX3dyaXRlX3NpZworI2RlZmluZSBwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zX25lb24gd2tfcG5nX2luaXRfZmlsdGVyX2Z1bmN0aW9uc19uZW9uCisjZGVmaW5lIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnNfc3NlMiB3a19wbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zX3NzZTIKKyNlbmRpZiAgLy8gUE5HUFJFRklYX0gKZGlmZiAtLWdpdCBhL3BuZ3ByaXYuaCBiL3BuZ3ByaXYuaAppbmRleCBmZTMzNTVkLi42MTYyYmU1IDEwMDY0NAotLS0gYS9wbmdwcml2LmgKKysrIGIvcG5ncHJpdi5oCkBAIC0xODIsNiArMTgyLDQyIEBACiAjICBlbmRpZgogI2VuZGlmIC8qIFBOR19BUk1fTkVPTl9PUFQgPiAwICovCiAKKyNpZm5kZWYgUE5HX0lOVEVMX1NTRV9PUFQKKyMgICBpZmRlZiBQTkdfSU5URUxfU1NFCisgICAgICAvKiBPbmx5IGNoZWNrIGZvciBTU0UgaWYgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbW9kaWZpZWQgdG8KKyAgICAgICAqIGVuYWJsZSBTU0Ugb3B0aW1pemF0aW9ucy4gIFRoaXMgbWVhbnMgdGhhdCB0aGVzZSBvcHRpbWl6YXRpb25zIHdpbGwKKyAgICAgICAqIGJlIG9mZiBieSBkZWZhdWx0LiAgU2VlIGNvbnRyaWIvaW50ZWwgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgICAqLworIyAgICAgaWYgZGVmaW5lZChfX1NTRTRfMV9fKSB8fCBkZWZpbmVkKF9fQVZYX18pIHx8IGRlZmluZWQoX19TU1NFM19fKSB8fCBcCisgICAgICAgZGVmaW5lZChfX1NTRTJfXykgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IFwKKyAgICAgICAoZGVmaW5lZChfTV9JWDg2X0ZQKSAmJiBfTV9JWDg2X0ZQID49IDIpCisjICAgICAgICAgZGVmaW5lIFBOR19JTlRFTF9TU0VfT1BUIDEKKyMgICAgICBlbmRpZgorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmIFBOR19JTlRFTF9TU0VfT1BUID4gMAorIyAgIGlmbmRlZiBQTkdfSU5URUxfU1NFX0lNUExFTUVOVEFUSU9OCisjICAgICAgaWYgZGVmaW5lZChfX1NTRTRfMV9fKSB8fCBkZWZpbmVkKF9fQVZYX18pCisgICAgICAgICAgLyogV2UgYXJlIG5vdCBhY3R1YWxseSB1c2luZyBBVlgsIGJ1dCBjaGVja2luZyBmb3IgQVZYIGlzIHRoZSBiZXN0CisgICAgICAgICAgICAgd2F5IHdlIGNhbiBkZXRlY3QgU1NFNC4xIGFuZCBTU1NFMyBvbiBNU1ZDLgorICAgICAgICAgICovCisjICAgICAgICAgZGVmaW5lIFBOR19JTlRFTF9TU0VfSU1QTEVNRU5UQVRJT04gMworIyAgICAgIGVsaWYgZGVmaW5lZChfX1NTU0UzX18pCisjICAgICAgICAgZGVmaW5lIFBOR19JTlRFTF9TU0VfSU1QTEVNRU5UQVRJT04gMgorIyAgICAgIGVsaWYgZGVmaW5lZChfX1NTRTJfXykgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IFwKKyAgICAgICAoZGVmaW5lZChfTV9JWDg2X0ZQKSAmJiBfTV9JWDg2X0ZQID49IDIpCisjICAgICAgICAgZGVmaW5lIFBOR19JTlRFTF9TU0VfSU1QTEVNRU5UQVRJT04gMQorIyAgICAgIGVsc2UKKyMgICAgICAgICBkZWZpbmUgUE5HX0lOVEVMX1NTRV9JTVBMRU1FTlRBVElPTiAwCisjICAgICAgZW5kaWYKKyMgICBlbmRpZgorCisjICAgaWYgUE5HX0lOVEVMX1NTRV9JTVBMRU1FTlRBVElPTiA+IDAKKyMgICAgICBkZWZpbmUgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnNfc3NlMgorIyAgIGVuZGlmCisjZW5kaWYKKwogLyogSXMgdGhpcyBhIGJ1aWxkIG9mIGEgRExMIHdoZXJlIGNvbXBpbGF0aW9uIG9mIHRoZSBvYmplY3QgbW9kdWxlcyByZXF1aXJlcwogICogZGlmZmVyZW50IHByZXByb2Nlc3NvciBzZXR0aW5ncyB0byB0aG9zZSByZXF1aXJlZCBmb3IgYSBzaW1wbGUgbGlicmFyeT8gIElmCiAgKiBzbyBQTkdfQlVJTERfRExMIG11c3QgYmUgc2V0LgpAQCAtMTE5MCw2ICsxMjI2LDIxIEBACiBQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoNF9uZW9uLChwbmdfcm93X2luZm9wCiAgICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsKICNlbmRpZgorIAorI2lmIFBOR19JTlRFTF9TU0VfSU1QTEVNRU5UQVRJT04gPiAwCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjNfc3NlMiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjRfc3NlMiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzNfc3NlMiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzRfc3NlMiwocG5nX3Jvd19pbmZvcAorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7CitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoM19zc2UyLChwbmdfcm93X2luZm9wCisgICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsKK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGg0X3NzZTIsKHBuZ19yb3dfaW5mb3AKKyAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOworI2VuZGlmCiAKIC8qIENob29zZSB0aGUgYmVzdCBmaWx0ZXIgdG8gdXNlIGFuZCBmaWx0ZXIgdGhlIHJvdyBkYXRhICovCiBQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfZmluZF9maWx0ZXIsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLApAQCAtMTkxOSw2ICsxOTcwLDEwIEBACiBQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgcG5nX2luaXRfZmlsdGVyX2Z1bmN0aW9uc19uZW9uLAogICAgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHVuc2lnbmVkIGludCBicHApLCBQTkdfRU1QVFkpOwogIyAgZW5kaWYKKyMgIGlmIFBOR19JTlRFTF9TU0VfSU1QTEVNRU5UQVRJT04gPiAwCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgcG5nX2luaXRfZmlsdGVyX2Z1bmN0aW9uc19zc2UyLAorICAgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHVuc2lnbmVkIGludCBicHApLCBQTkdfRU1QVFkpOworIyAgZW5kaWYKICNlbmRpZgogCiBQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3VpbnRfMzIsIHBuZ19jaGVja19rZXl3b3JkLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCmRpZmYgLS1naXQgYS9wbmd0ZXN0LnBuZyBiL3BuZ3Rlc3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjNmZWY0Li4wMDAwMDAwCi0tLSBhL3BuZ3Rlc3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcG5ndXNyLmRmYSBiL3BuZ3Vzci5kZmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDY3YzMuLjAwMDAwMDAKLS0tIGEvcG5ndXNyLmRmYQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgcG5ndXNyLmRmYQotIwotIyBCdWlsZCB0aW1lIGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nCi0jCi0jIEVudGVyIGJ1aWxkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGlzIGZpbGUKLSMKLSMgU2VjdXJpdHkgc2V0dGluZ3M6IGJ5IGRlZmF1bHQgdGhlc2UgbGltaXRzIGFyZSB1bnNldCwgeW91IGNhbiBjaGFuZ2UgdGhlbQotIyBoZXJlIGJ5IGVudGVyaW5nIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMgYXMgI2RlZmluZXMgcHJlY2VkZWQgYnkgJ0AnICh0byBjYXVzZSwKLSMgdGhlbSB0byBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgYnVpbGQgb2YgcG5nbGliY29uZi5oKSwgZm9yIGV4YW1wbGU6Ci0jCi0jIEAjIGRlZmluZSBQTkdfVVNFUl9XSURUSF9NQVggNjU1MzUKLSMgQCMgZGVmaW5lIFBOR19VU0VSX0hFSUdIVF9NQVggNjU1MzUKLSMgQCMgZGVmaW5lIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWCAyNTYKLSMgQCMgZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggNjQwMDAwCmRpZmYgLS1naXQgYS9wcm9qZWN0cy9vd2F0Y29tL2xpYnBuZy50Z3QgYi9wcm9qZWN0cy9vd2F0Y29tL2xpYnBuZy50Z3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOTYyMmUuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvb3dhdGNvbS9saWJwbmcudGd0CisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLTQwDQotdGFyZ2V0SWRlbnQNCi0wDQotTVByb2plY3QNCi0xDQotTUNvbXBvbmVudA0KLTANCi0yDQotV1N0cmluZw0KLTMNCi1MSUINCi0zDQotV1N0cmluZw0KLTUNCi1uXzJzbg0KLTENCi0wDQotMA0KLTQNCi1NQ29tbWFuZA0KLTANCi01DQotTUNvbW1hbmQNCi0wDQotNg0KLU1JdGVtDQotMTANCi1saWJwbmcubGliDQotNw0KLVdTdHJpbmcNCi0zDQotTElCDQotOA0KLVdWTGlzdA0KLTANCi05DQotV1ZMaXN0DQotMQ0KLTEwDQotQWN0aW9uU3RhdGVzDQotMTENCi1XU3RyaW5nDQotNQ0KLSZNYWtlDQotMTINCi1XVkxpc3QNCi0wDQotLTENCi0xDQotMQ0KLTANCi0xMw0KLVdQaWNrTGlzdA0KLTE2DQotMTQNCi1NSXRlbQ0KLTMNCi0qLmMNCi0xNQ0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTE2DQotV1ZMaXN0DQotMg0KLTE3DQotTVZTdGF0ZQ0KLTE4DQotV1N0cmluZw0KLTMNCi1XQ0MNCi0xOQ0KLVdTdHJpbmcNCi0yNQ0KLW4/Pz8/SW5jbHVkZSBkaXJlY3RvcmllczoNCi0xDQotMjANCi1XU3RyaW5nDQotMzkNCi0iJCglemxpYik7JCgld2F0Y29tKS9oOyQoJXdhdGNvbSkvaC9udCINCi0wDQotMjENCi1NVlN0YXRlDQotMjINCi1XU3RyaW5nDQotMw0KLVdDQw0KLTIzDQotV1N0cmluZw0KLTI1DQotbj8/Pz9JbmNsdWRlIGRpcmVjdG9yaWVzOg0KLTANCi0yNA0KLVdTdHJpbmcNCi0zOQ0KLSIkKCV6bGliKTskKCV3YXRjb20pL2g7JCgld2F0Y29tKS9oL250Ig0KLTANCi0yNQ0KLVdWTGlzdA0KLTENCi0yNg0KLUFjdGlvblN0YXRlcw0KLTI3DQotV1N0cmluZw0KLTUNCi0mTWFrZQ0KLTI4DQotV1ZMaXN0DQotMA0KLS0xDQotMQ0KLTENCi0wDQotMjkNCi1NSXRlbQ0KLTExDQotLi5cLi5ccG5nLmMNCi0zMA0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTMxDQotV1ZMaXN0DQotMA0KLTMyDQotV1ZMaXN0DQotMA0KLTE0DQotMQ0KLTENCi0wDQotMzMNCi1NSXRlbQ0KLTE2DQotLi5cLi5ccG5nZXJyb3IuYw0KLTM0DQotV1N0cmluZw0KLTQNCi1DT0JKDQotMzUNCi1XVkxpc3QNCi0wDQotMzYNCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCi0zNw0KLU1JdGVtDQotMTQNCi0uLlwuLlxwbmdnZXQuYw0KLTM4DQotV1N0cmluZw0KLTQNCi1DT0JKDQotMzkNCi1XVkxpc3QNCi0wDQotNDANCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCi00MQ0KLU1JdGVtDQotMTQNCi0uLlwuLlxwbmdtZW0uYw0KLTQyDQotV1N0cmluZw0KLTQNCi1DT0JKDQotNDMNCi1XVkxpc3QNCi0wDQotNDQNCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCi00NQ0KLU1JdGVtDQotMTYNCi0uLlwuLlxwbmdwcmVhZC5jDQotNDYNCi1XU3RyaW5nDQotNA0KLUNPQkoNCi00Nw0KLVdWTGlzdA0KLTANCi00OA0KLVdWTGlzdA0KLTANCi0xNA0KLTENCi0xDQotMA0KLTQ5DQotTUl0ZW0NCi0xNQ0KLS4uXC4uXHBuZ3JlYWQuYw0KLTUwDQotV1N0cmluZw0KLTQNCi1DT0JKDQotNTENCi1XVkxpc3QNCi0wDQotNTINCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCi01Mw0KLU1JdGVtDQotMTQNCi0uLlwuLlxwbmdyaW8uYw0KLTU0DQotV1N0cmluZw0KLTQNCi1DT0JKDQotNTUNCi1XVkxpc3QNCi0wDQotNTYNCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCi01Nw0KLU1JdGVtDQotMTYNCi0uLlwuLlxwbmdydHJhbi5jDQotNTgNCi1XU3RyaW5nDQotNA0KLUNPQkoNCi01OQ0KLVdWTGlzdA0KLTANCi02MA0KLVdWTGlzdA0KLTANCi0xNA0KLTENCi0xDQotMA0KLTYxDQotTUl0ZW0NCi0xNg0KLS4uXC4uXHBuZ3J1dGlsLmMNCi02Mg0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTYzDQotV1ZMaXN0DQotMA0KLTY0DQotV1ZMaXN0DQotMA0KLTE0DQotMQ0KLTENCi0wDQotNjUNCi1NSXRlbQ0KLTE0DQotLi5cLi5ccG5nc2V0LmMNCi02Ng0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTY3DQotV1ZMaXN0DQotMA0KLTY4DQotV1ZMaXN0DQotMA0KLTE0DQotMQ0KLTENCi0wDQotNjkNCi1NSXRlbQ0KLTE2DQotLi5cLi5ccG5ndHJhbnMuYw0KLTcwDQotV1N0cmluZw0KLTQNCi1DT0JKDQotNzENCi1XVkxpc3QNCi0wDQotNzINCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCi03Mw0KLU1JdGVtDQotMTQNCi0uLlwuLlxwbmd3aW8uYw0KLTc0DQotV1N0cmluZw0KLTQNCi1DT0JKDQotNzUNCi1XVkxpc3QNCi0wDQotNzYNCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCi03Nw0KLU1JdGVtDQotMTYNCi0uLlwuLlxwbmd3cml0ZS5jDQotNzgNCi1XU3RyaW5nDQotNA0KLUNPQkoNCi03OQ0KLVdWTGlzdA0KLTANCi04MA0KLVdWTGlzdA0KLTANCi0xNA0KLTENCi0xDQotMA0KLTgxDQotTUl0ZW0NCi0xNg0KLS4uXC4uXHBuZ3d0cmFuLmMNCi04Mg0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTgzDQotV1ZMaXN0DQotMA0KLTg0DQotV1ZMaXN0DQotMA0KLTE0DQotMQ0KLTENCi0wDQotODUNCi1NSXRlbQ0KLTE2DQotLi5cLi5ccG5nd3V0aWwuYw0KLTg2DQotV1N0cmluZw0KLTQNCi1DT0JKDQotODcNCi1XVkxpc3QNCi0wDQotODgNCi1XVkxpc3QNCi0wDQotMTQNCi0xDQotMQ0KLTANCmRpZmYgLS1naXQgYS9wcm9qZWN0cy9vd2F0Y29tL2xpYnBuZy53cGogYi9wcm9qZWN0cy9vd2F0Y29tL2xpYnBuZy53cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGQ5NWYuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvb3dhdGNvbS9saWJwbmcud3BqCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTQwDQotcHJvamVjdElkZW50DQotMA0KLVZwZU1haW4NCi0xDQotV1JlY3QNCi0yNTYNCi0wDQotODk2MA0KLTkyOTQNCi0yDQotTVByb2plY3QNCi0zDQotTUNvbW1hbmQNCi0zMjINCi0jIExvY2F0aW9ucyBvZiB6bGliIGFuZCAoaWYgcmVxdWlyZWQpIGF3ayAoY2hhbmdlIGFzIHJlcXVpcmVkOikNCi1zZXQgemxpYj0uLlwuLlwuLlx6bGliDQotc2V0IGF3az0NCi0jDQotQGlmIG5vdCBleGlzdCBwbmdjb25maWcuZGZhICQoTUFLRSkgJChfX01BS0VPUFRTX18pIC1mIHBuZ2NvbmZpZy5tYWsgZGVmYXVsdHMNCi1AaWYgZXhpc3QgY29uZmlnLmluZiB0eXBlIGNvbmZpZy5pbmYNCi1AZWNobyBDaGVja2luZyBmb3IgdGhlIGxpYnBuZyBjb25maWd1cmF0aW9uIGZpbGUgcG5nbGliY29uZi5oDQotJChNQUtFKSAkKF9fTUFLRU9QVFNfXykgLWYgcG5nY29uZmlnLm1haw0KLTQNCi1NQ29tbWFuZA0KLTE5DQotQHR5cGUgcG5nY29uZmlnLmluZg0KLTQNCi01DQotV0ZpbGVOYW1lDQotMTANCi1saWJwbmcudGd0DQotNg0KLVdGaWxlTmFtZQ0KLTExDQotcG5ndGVzdC50Z3QNCi03DQotV0ZpbGVOYW1lDQotMTINCi1wbmd2YWxpZC50Z3QNCi04DQotV0ZpbGVOYW1lDQotMTINCi1wbmdzdGVzdC50Z3QNCi05DQotV1ZMaXN0DQotNA0KLTEwDQotVkNvbXBvbmVudA0KLTExDQotV1JlY3QNCi0wDQotMA0KLTU2MzgNCi00MTc0DQotMA0KLTANCi0xMg0KLVdGaWxlTmFtZQ0KLTEwDQotbGlicG5nLnRndA0KLTANCi0wDQotMTMNCi1WQ29tcG9uZW50DQotMTQNCi1XUmVjdA0KLTEyODANCi0xNTUwDQotNTYzOA0KLTQxNzQNCi0wDQotMA0KLTE1DQotV0ZpbGVOYW1lDQotMTENCi1wbmd0ZXN0LnRndA0KLTANCi0xDQotMTYNCi1WQ29tcG9uZW50DQotMTcNCi1XUmVjdA0KLTUyNA0KLTQ5Nw0KLTU2MzgNCi00MTc0DQotMA0KLTANCi0xOA0KLVdGaWxlTmFtZQ0KLTEyDQotcG5ndmFsaWQudGd0DQotMA0KLTENCi0xOQ0KLVZDb21wb25lbnQNCi0yMA0KLVdSZWN0DQotMjA1NA0KLTI3MDENCi01Njc0DQotNDIzMg0KLTANCi0wDQotMjENCi1XRmlsZU5hbWUNCi0xMg0KLXBuZ3N0ZXN0LnRndA0KLTANCi0xDQotMTkNCmRpZmYgLS1naXQgYS9wcm9qZWN0cy9vd2F0Y29tL3BuZ2NvbmZpZy5tYWsgYi9wcm9qZWN0cy9vd2F0Y29tL3BuZ2NvbmZpZy5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NGEzZmMuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvb3dhdGNvbS9wbmdjb25maWcubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLSMgVGhpcyBpcyBhbiBPcGVuV2F0Y29tIG1ha2UgZmlsZSB3aGljaCBidWlsZHMgcG5nbGliY29uZi5oIC0gdGhlIGxpYnBuZw0KLSMgY29uZmlndXJhdGlvbiBoZWFkZXIuICBZb3UgY2FuIGlnbm9yZSB0aGlzIGZpbGUgaWYgeW91IGRvbid0IG5lZWQgdG8NCi0jIGNvbmZpZ3VyZSBsaWJwbmc7IGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpbGwgYmUgYnVpbHQuDQotIw0KLSMgRm9yIG1vcmUgaW5mb3JtYXRpb24gYnVpbGQgbGlicG5nLndwaiB1bmRlciB0aGUgSURFIGFuZCB0aGVuIHJlYWQgdGhlDQotIyBnZW5lcmF0ZWQgZmlsZXM6DQotIw0KLSMgICAgY29uZmlnLmluZjogQmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBzdGFuZGFyZCBidWlsZC4NCi0jICAgIHBuZ2NvbmZpZy5kZmE6IEFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gZm9yIG5vbi1zdGFuZGFyZCBsaWJwbmcgYnVpbGRzLg0KLSMNCi1ERUxFVEU9cm0gLWYNCi1FQ0hPPWVjaG8NCi1DT1BZPWNvcHkNCi0jDQotIyBJZiB5b3VyIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gdGVzdCBjb21waWxlciBmbGFncyB3aGVuIGJ1aWxkaW5nDQotIyBwbmdsaWJjb25mLmggeW91IG1heSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgb24gdGhlIHdtYWtlIGNvbW1hbmQNCi0jIGxpbmU6DQotQ0ZMQUdTPQ0KLUNDPXdjbDM4Ng0KLUNQUD0kKENDKSAtcHcwDQotIw0KLSMgUmVhZCBhd2sgZnJvbSB0aGUgZW52aXJvbm1lbnQgaWYgc2V0LCBlbHNlIGl0IGNhbiBiZSBzZXQgb24gdGhlIGNvbW1hbmQNCi0jIGxpbmUgKHRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHRvIHNldCB0aGUgJWF3ayUgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlDQotIyBJREUgbGlicG5nLndwaiAnYmVmb3JlJyBydWxlIC0gdGhpcyBzZXR0aW5nIGlzIGxvY2FsLikNCi0haWZkZWYgJWF3aw0KLUFXSz0kKCVhd2spDQotIWVuZGlmDQotIw0KLSMgcG5nbGliY29uZi5oIG11c3QgZXhpc3QgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIHRoaXMgaXMgdGhlIGZpbmFsIHJ1bGUNCi0jIHdoaWNoIGNvcGllcyB0aGUgbG9jYWwgYnVpbHQgdmVyc2lvbiAoYW5kIHRoaXMgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0IGZvcg0KLSMgdGhpcyBtYWtlZmlsZS4pDQotLi5cLi5ccG5nbGliY29uZi5oOiBwbmdsaWJjb25mLmgNCi0gJChDT1BZKSBwbmdsaWJjb25mLmggJEANCi0NCi0haWZkZWYgQVdLDQotIyBDUFBGTEFHUyBzaG91bGQgY29udGFpbiB0aGUgb3B0aW9ucyB0byBjb250cm9sIHRoZSByZXN1bHQsDQotIyBidXQgREVGUyBhbmQgQ0ZMQUdTIGFyZSBhbHNvIHN1cHBvcnRlZCBoZXJlLCBvdmVycmlkZQ0KLSMgYXMgYXBwcm9wcmlhdGUNCi1ERk5GTEFHUyA9ICQoREVGUykgJChDUFBGTEFHUykgJChDRkxBR1MpDQotDQotcG5nbGliY29uZi5oOiBwbmdsaWJjb25mLmRmbg0KLSAkKERFTEVURSkgJEAgZGZuLmMgZGZuMS5vdXQgZGZuMi5vdXQNCi0gJChFQ0hPKSAkI2luY2x1ZGUgInBuZ2xpYmNvbmYuZGZuIiA+ZGZuLmMNCi0gJChDUFApICQoREZORkxBR1MpIGRmbi5jID5kZm4xLm91dA0KLSAkKEFXSykgLWYgPDwgZGZuMS5vdXQgPmRmbjIub3V0DQotL14uKlBOR19ERUZOX01BR0lDLS4qLVBOR19ERUZOX0VORC4qJCQvew0KLSBzdWIoL14uKlBOR19ERUZOX01BR0lDLS8sICIiKQ0KLSBzdWIoLyAqLVBOR19ERUZOX0VORC4qJCQvLCAiIikNCi0gZ3N1YigvICpAQEAgKi8sICIiKQ0KLSBwcmludA0KLX0NCi08PA0KLSAkKENPUFkpIGRmbjIub3V0ICRADQotIEB0eXBlIDw8ID5wbmdjb25maWcuaW5mDQotVGhpcyBpcyBhIGxvY2FsbHkgY29uZmlndXJhYmxlIGJ1aWxkIG9mIGxpYnBuZy5saWI7IGZvciBjb25maWd1cmF0aW9uDQotaW5zdHJ1Y3Rpb25zIGNvbnN1bHQgYW5kIGVkaXQgcHJvamVjdHMvb3BlbndhdGNvbS9wbmdjb25maWcuZGZhDQotPDwNCi0gJChERUxFVEUpIGRmbi5jIGRmbjEub3V0IGRmbjIub3V0DQotDQotcG5nbGliY29uZi5kZm46IC4uXC4uXHNjcmlwdHNccG5nbGliY29uZi5kZmEgLi5cLi5cc2NyaXB0c1xvcHRpb25zLmF3ayBwbmdjb25maWcuZGZhIC4uXC4uXHBuZ2NvbmYuaA0KLSAkKERFTEVURSkgJEAgZGZuMS5vdXQgZGZuMi5vdXQNCi0gJChBV0spIC1mIC4uXC4uXHNjcmlwdHNcb3B0aW9ucy5hd2sgb3V0PWRmbjEub3V0IHZlcnNpb249c2VhcmNoIC4uXC4uXHBuZ2NvbmYuaCAuLlwuLlxzY3JpcHRzXHBuZ2xpYmNvbmYuZGZhIHBuZ2NvbmZpZy5kZmEgJChERkFfWFRSQSkgMT4mMg0KLSAkKEFXSykgLWYgLi5cLi5cc2NyaXB0c1xvcHRpb25zLmF3ayBvdXQ9ZGZuMi5vdXQgZGZuMS5vdXQgMT4mMg0KLSAkKENPUFkpIGRmbjIub3V0ICRADQotICQoREVMRVRFKSBkZm4xLm91dCBkZm4yLm91dA0KLQ0KLSFlbHNlDQotIyBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSB1c2VkIHRvIGNvcHkgc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgYW5kIG1ha2UNCi0jIHRoZSByZXF1aXJlZCBjaGFuZ2UgdG8gdGhlIGNhbGxpbmcgY29udmVudGlvbi4NCi0jDQotIyBCeSBkZWZhdWx0IGxpYnBuZyBpcyBidWlsdCB0byB1c2UgdGhlIF9fY2RlY2wgY2FsbGluZyBjb252ZW50aW9uIG9uDQotIyBXaW5kb3dzLiAgVGhpcyBnaXZlcyBjb21wYXRpYmlsaXR5IHdpdGggTVNWQyBhbmQgR0NDLiAgVW5mb3J0dW5hdGVseSBpdA0KLSMgZG9lcyBub3Qgd29yayB3aXRoIE9wZW5XYXRjb20gYmVjYXVzZSBPcGVuV2F0Y29tIGltcGxlbWVudHMgbG9uZ2ptcCB1c2luZw0KLSMgdGhlIF9fd2F0Y2FsbCBjb252ZW50aW9uIChjb21wYXJlZCB3aXRoIGJvdGggTVNWQyBhbmQgR0NDIHdoaWNoIHVzZSBfX2NkZWNsDQotIyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuKQ0KLSMNCi0jIFRodXMgdGhlIGRlZmF1bHQgbXVzdCBiZSBjaGFuZ2VkIHRvIGJ1aWxkIG9uIE9wZW5XYXRjb20gYW5kLCBvbmNlIGNoYW5nZWQsDQotIyB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIGNvbXBhdGlibGUgd2l0aCBhcHBsaWNhdGlvbnMgYnVpbHQgdXNpbmcgb3RoZXINCi0jIGNvbXBpbGVycyAoaW4gZmFjdCBhdHRlbXB0cyB0byBidWlsZCB3aWxsIGZhaWwgYXQgY29tcGlsZSB0aW1lLikNCi0jDQotcG5nbGliY29uZi5oOiAuLlwuLlxzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdCAuZXhpc3Rzb25seQ0KLSBAJChFQ0hPKSAuDQotIEAkKEVDSE8pIC4NCi0gQCQoRUNITykgJCQoQVdLKSBOT1QgQVZBSUxBQkxFOiBDT1BZSU5HIHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0DQotIEAkKEVDSE8pIC4NCi0gQCQoRUNITykgLg0KLSB2aSAtcSAtayAiOjEsJCRzL1BOR19BUElfUlVMRSAwJCQvUE5HX0FQSV9SVUxFIDIvXG46dyEgJEBcbjpxIVxuIiAuLlwuLlxzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdA0KLSBAJChFQ0hPKSAuDQotIEAkKEVDSE8pIC4NCi0gQCQoRUNITykgWU9VIEhBVkUgQSBERUZBVUxUIENPTkZJR1VSQVRJT04gQkVDQVVTRSBZT1UgRE8gTk9UIEhBVkUgQVdLIQ0KLSBAJChFQ0hPKSAuDQotIEAkKEVDSE8pIC4NCi0gQHR5cGUgPDwgPnBuZ2NvbmZpZy5pbmYNCi1UaGlzIGlzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgbGlicG5nLmxpYiwgaWYgeW91IHdpc2ggdG8NCi1jaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gcGxlYXNlIGNvbnN1bHQgdGhlIGluc3RydWN0aW9ucyBpbg0KLXByb2plY3RzL293YXRjb20vcG5nY29uZmlnLmRmYS4NCi08PA0KLQ0KLSFlbmRpZg0KLQ0KLSMgTWFrZSB0aGUgZGVmYXVsdCBmaWxlcw0KLWRlZmF1bHRzOiAuc3ltYm9saWMNCi0gQCQoQ09QWSkgPDwgY29uZmlnLmluZg0KLSQjIFRoZSBsaWJwbmcgcHJvamVjdCBpcyBpbmNvbXBsZXRlbHkgY29uZmlndXJlZC4gIFRvIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24NCi0kIyBwbGVhc2UgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczoNCi0kIw0KLSQjICAgMSkgRWRpdCB0aGUgJ2JlZm9yZScgcnVsZSBvZiBsaWJwbmcud3BqIChmcm9tIHRoZSBJREUpIHRvIGRlZmluZSB0aGUNCi0kIyAgICAgIGxvY2F0aW9ucyBvZiB0aGUgemxpYiBpbmNsdWRlIGZpbGUgemxpYi5oIGFuZCB0aGUgYnVpbHQgemxpYiBsaWJyYXJ5LA0KLSQjICAgICAgemxpYi5saWIuDQotJCMNCi0kIyAgIDIpIElmIHlvdSB3YW50IHRvIGNoYW5nZSBsaWJwbmcgdG8gYSBub24tc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbHNvDQotJCMgICAgICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgJ2F3aycgaW4gdGhlIGJlZm9yZSBydWxlIHRvIHRoZSBuYW1lIG9mIHlvdXINCi0kIyAgICAgIGF3ayBjb21tYW5kLiAgRm9yIG1vcmUgaW5zdHJ1Y3Rpb25zIG9uIGNvbmZpZ3VyYXRpb24gcmVhZA0KLSQjICAgICAgcG5nY29uZmlnLmRmYS4NCi0kIw0KLSQjICAgMykgRGVsZXRlIHRoaXMgZmlsZSAoY29uZmlnLmluZikuDQotPDwNCi0gQCQoQ09QWSkgPDwgcG5nY29uZmlnLmRmYQ0KLSQjIHBuZ2NvbmZpZy5kZmE6IHRoaXMgZmlsZSBjb250YWlucyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGxpYnBuZy4NCi0kIyBJZiBlbXRweSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiB3aWxsIGJlIGJ1aWx0LiAgRm9yIHRoaXMgZmlsZSB0byBiZQ0KLSQjIHVzZWQgYSB3b3JraW5nIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gJ2F3aycgaXMgcmVxdWlyZWQgYW5kIHRoZSBwcm9ncmFtDQotJCMgbXVzdCBiZSBpZGVudGlmaWVkIGluIHRoZSAnYmVmb3JlJyBydWxlIG9mIHRoZSBwcm9qZWN0Lg0KLSQjDQotJCMgSWYgeW91IGRvbid0IGFscmVhZHkgaGF2ZSAnYXdrJywgb3IgdGhlIHZlcnNpb24gb2YgYXdrIHlvdSBoYXZlIHNlZW1zIG5vdA0KLSQjIHRvIHdvcmssIGRvd25sb2FkIEJyaWFuIEtlcm5pZ2hhbidzIGF3ayAoQnJpYW4gS2VybmlnaGFuIGlzIHRoZSBhdXRob3Igb2YNCi0kIyBhd2suKSAgWW91IGNhbiBmaW5kIHNvdXJjZSBjb2RlIGFuZCBhIGJ1aWx0IGV4ZWN1dGFibGUgKGNhbGxlZCBhd2s5NS5leGUpDQotJCMgaGVyZToNCi0kIw0KLSQjICAgICBodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmJ3ay9idGwubWlycm9yLw0KLSQjDQotJCMgVGhlIGV4ZWN1dGFibGUgd29ya3MganVzdCBmaW5lLg0KLSQjDQotJCMgSWYgYnVpbGQgaXNzdWVzIGVycm9ycyBhZnRlciBhIGNoYW5nZSB0byBwbmdjb25maWcuZGZhIHlvdSBoYXZlIGVudGVyZWQNCi0kIyBpbmNvbnNpc3RlbnQgZmVhdHVyZSByZXF1ZXN0cywgb3IgZXZlbiBtYWxmb3JtZWQgcmVxdWVzdHMsIGluDQotJCMgcG5nY29uZmlnLmRmYS4gIFRoZSBlcnJvciBtZXNzYWdlcyBmcm9tIGF3ayBzaG91bGQgYmUgY29tcHJlaGVuc2libGUsIGJ1dA0KLSQjIGlmIG5vdCBzaW1wbHkgZ28gYmFjayB0byB0aGUgc3RhcnQgKG5vdGhpbmcgYnV0IGNvbW1lbnRzIGluIHRoaXMgZmlsZSkgYW5kDQotJCMgZW50ZXIgY29uZmlndXJhdGlvbiBsaW5lcyBvbmUgYnkgb25lIHVudGlsIG9uZSBwcm9kdWNlcyBhbiBlcnJvci4gIChPciwgb2YNCi0kIyBjb3Vyc2UsIGRvIHRoZSBzdGFuZGFyZCBiaW5hcnkgY2hvcC4pDQotJCMNCi0kIyBZb3UgbmVlZCB0byByZWJ1aWxkIGV2ZXJ5dGhpbmcgYWZ0ZXIgYSBjaGFuZ2UgdG8gcG5nbGliY29uZi5kZmEgLSBpLmUuIHlvdQ0KLSQjIG11c3QgZG8gQWN0aW9ucy9NYXJrIEFsbCBUYXJnZXRzIGZvciBSZW1ha2UuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyDQotJCMgZ2VuZXJhdGVkIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gKGFzIG9mIE9wZW5XYXRjb20gMS45KSBkb2VzIG5vdCByZWNvcmQgdGhlDQotJCMgZGVwZW5kZW5jeSBvbiBwbmdsaWJjb25mLmggY29ycmVjdGx5Lg0KLSQjDQotJCMgSWYgYXdrIGlzbid0IHNldCB0aGVuIHRoaXMgZmlsZSBpcyBieXBhc3NlZC4gIElmIHlvdSBqdXN0IHdhbnQgdGhlIHN0YW5kYXJkDQotJCMgY29uZmlndXJhdGlvbiBpdCBpcyBhdXRvbWF0aWNhbGx5IHByb2R1Y2VkIGZyb20gdGhlIGRpc3RyaWJ1dGVkIHZlcnNpb24NCi0kIyAoc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQpIGJ5IGVkaXR0aW5nIFBOR19BUElfUlVMRSB0byAyICh0byBmb3JjZSB1c2UNCi0kIyBvZiB0aGUgT3BlbldhdGNvbSBsaWJyYXJ5IGNhbGxpbmcgY29udmVudGlvbi4pDQotJCMNCi08PA0KLQ0KLWNsZWFuOjogLnN5bWJvbGljDQotICQoREVMRVRFKSAuLlwuLlxwbmdsaWJjb25mLmggcG5nbGliY29uZi4qIGRmbi5jICoub3V0IHBuZ2NvbmZpZy5pbmYNCi0gJChERUxFVEUpICoub2JqICoubWJyICouc3ltICouZXJyICoucGNoIGxpYnBuZy5taw0KLSAkKERFTEVURSkgbGlicG5nLmxpYiBsaWJwbmcubGJyIGxpYnBuZy5sYjEgbGlicG5nLmNiciBsaWJwbmcubWsxDQotICQoREVMRVRFKSBwbmd0ZXN0LmV4ZSBwbmd0ZXN0Lm1hcCBwbmd0ZXN0LmxrMSBwbmd0ZXN0Lm1rMQ0KLSAkKERFTEVURSkgcG5ndmFsaWQuZXhlIHBuZ3ZhbGlkLm1hcCBwbmd2YWxpZC5sazEgcG5ndmFsaWQubWsxDQotDQotZGlzdGNsZWFuOjogY2xlYW4gLnN5bWJvbGljDQotICQoREVMRVRFKSB6bGliLmluZiBhd2suaW5mIGNvbmZpZy5pbmYgcG5nY29uZmlnLmRmYQ0KZGlmZiAtLWdpdCBhL3Byb2plY3RzL293YXRjb20vcG5nc3Rlc3QudGd0IGIvcHJvamVjdHMvb3dhdGNvbS9wbmdzdGVzdC50Z3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDAyNDUuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvb3dhdGNvbS9wbmdzdGVzdC50Z3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotNDANCi10YXJnZXRJZGVudA0KLTANCi1NUHJvamVjdA0KLTENCi1NQ29tcG9uZW50DQotMA0KLTINCi1XU3RyaW5nDQotNA0KLU5FWEUNCi0zDQotV1N0cmluZw0KLTUNCi1uYzJlbg0KLTENCi0wDQotMA0KLTQNCi1NQ29tbWFuZA0KLTANCi01DQotTUNvbW1hbmQNCi0xMTE4DQotcG5nc3Rlc3QgLS1zdHJpY3QgLS1sb2cgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDQucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAxLnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcgLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nIC4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZyAuLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmcNCi02DQotTUl0ZW0NCi0xMg0KLXBuZ3N0ZXN0LmV4ZQ0KLTcNCi1XU3RyaW5nDQotNA0KLU5FWEUNCi04DQotV1ZMaXN0DQotNg0KLTkNCi1NVlN0YXRlDQotMTANCi1XU3RyaW5nDQotNw0KLVdJTkxJTksNCi0xMQ0KLVdTdHJpbmcNCi0xMQ0KLT8/Pz8/U3RhY2s6DQotMQ0KLTEyDQotV1N0cmluZw0KLTQNCi03NjhrDQotMA0KLTEzDQotTVZTdGF0ZQ0KLTE0DQotV1N0cmluZw0KLTcNCi1XSU5MSU5LDQotMTUNCi1XU3RyaW5nDQotMjgNCi0/Pz8/P0xpYnJhcnkgZGlyZWN0b3JpZXMoOyk6DQotMQ0KLTE2DQotV1N0cmluZw0KLTgNCi0kKCV6bGliKQ0KLTANCi0xNw0KLU1WU3RhdGUNCi0xOA0KLVdTdHJpbmcNCi03DQotV0lOTElOSw0KLTE5DQotV1N0cmluZw0KLTE4DQotPz8/Pz9MaWJyYXJpZXMoLCk6DQotMQ0KLTIwDQotV1N0cmluZw0KLTE5DQotbGlicG5nLmxpYiB6bGliLmxpYg0KLTANCi0yMQ0KLU1WU3RhdGUNCi0yMg0KLVdTdHJpbmcNCi03DQotV0lOTElOSw0KLTIzDQotV1N0cmluZw0KLTExDQotPz8/Pz9TdGFjazoNCi0wDQotMjQNCi1XU3RyaW5nDQotNA0KLTc2OGsNCi0wDQotMjUNCi1NVlN0YXRlDQotMjYNCi1XU3RyaW5nDQotNw0KLVdJTkxJTksNCi0yNw0KLVdTdHJpbmcNCi0yOA0KLT8/Pz8/TGlicmFyeSBkaXJlY3Rvcmllcyg7KToNCi0wDQotMjgNCi1XU3RyaW5nDQotOA0KLSQoJXpsaWIpDQotMA0KLTI5DQotTVZTdGF0ZQ0KLTMwDQotV1N0cmluZw0KLTcNCi1XSU5MSU5LDQotMzENCi1XU3RyaW5nDQotMTgNCi0/Pz8/P0xpYnJhcmllcygsKToNCi0wDQotMzINCi1XU3RyaW5nDQotMTkNCi1saWJwbmcubGliIHpsaWIubGliDQotMA0KLTMzDQotV1ZMaXN0DQotMQ0KLTM0DQotQWN0aW9uU3RhdGVzDQotMzUNCi1XU3RyaW5nDQotNA0KLSZSdW4NCi0zNg0KLVdWTGlzdA0KLTANCi0tMQ0KLTENCi0xDQotMA0KLTM3DQotV1BpY2tMaXN0DQotMg0KLTM4DQotTUl0ZW0NCi0zDQotKi5jDQotMzkNCi1XU3RyaW5nDQotNA0KLUNPQkoNCi00MA0KLVdWTGlzdA0KLTINCi00MQ0KLU1WU3RhdGUNCi00Mg0KLVdTdHJpbmcNCi0zDQotV0NDDQotNDMNCi1XU3RyaW5nDQotMjUNCi1uPz8/P0luY2x1ZGUgZGlyZWN0b3JpZXM6DQotMQ0KLTQ0DQotV1N0cmluZw0KLTM5DQotIiQoJXpsaWIpOyQoJXdhdGNvbSkvaDskKCV3YXRjb20pL2gvbnQiDQotMA0KLTQ1DQotTVZTdGF0ZQ0KLTQ2DQotV1N0cmluZw0KLTMNCi1XQ0MNCi00Nw0KLVdTdHJpbmcNCi0yNQ0KLW4/Pz8/SW5jbHVkZSBkaXJlY3RvcmllczoNCi0wDQotNDgNCi1XU3RyaW5nDQotMzkNCi0iJCglemxpYik7JCgld2F0Y29tKS9oOyQoJXdhdGNvbSkvaC9udCINCi0wDQotNDkNCi1XVkxpc3QNCi0wDQotLTENCi0xDQotMQ0KLTANCi01MA0KLU1JdGVtDQotMzMNCi0uLlwuLlxjb250cmliXGxpYnRlc3RzXHBuZ3N0ZXN0LmMNCi01MQ0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTUyDQotV1ZMaXN0DQotMA0KLTUzDQotV1ZMaXN0DQotMA0KLTM4DQotMQ0KLTENCi0wDQpkaWZmIC0tZ2l0IGEvcHJvamVjdHMvb3dhdGNvbS9wbmd0ZXN0LnRndCBiL3Byb2plY3RzL293YXRjb20vcG5ndGVzdC50Z3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWYxYTcuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvb3dhdGNvbS9wbmd0ZXN0LnRndAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi00MA0KLXRhcmdldElkZW50DQotMA0KLU1Qcm9qZWN0DQotMQ0KLU1Db21wb25lbnQNCi0wDQotMg0KLVdTdHJpbmcNCi00DQotTkVYRQ0KLTMNCi1XU3RyaW5nDQotNQ0KLW5jMmVuDQotMQ0KLTANCi0wDQotNA0KLU1Db21tYW5kDQotMA0KLTUNCi1NQ29tbWFuZA0KLTM0DQotY2QgLi5cLi4NCi1wcm9qZWN0c1xvd2F0Y29tXHBuZ3Rlc3QNCi02DQotTUl0ZW0NCi0xMQ0KLXBuZ3Rlc3QuZXhlDQotNw0KLVdTdHJpbmcNCi00DQotTkVYRQ0KLTgNCi1XVkxpc3QNCi00DQotOQ0KLU1WU3RhdGUNCi0xMA0KLVdTdHJpbmcNCi03DQotV0lOTElOSw0KLTExDQotV1N0cmluZw0KLTI4DQotPz8/Pz9MaWJyYXJ5IGRpcmVjdG9yaWVzKDspOg0KLTENCi0xMg0KLVdTdHJpbmcNCi04DQotJCglemxpYikNCi0wDQotMTMNCi1NVlN0YXRlDQotMTQNCi1XU3RyaW5nDQotNw0KLVdJTkxJTksNCi0xNQ0KLVdTdHJpbmcNCi0xOA0KLT8/Pz8/TGlicmFyaWVzKCwpOg0KLTENCi0xNg0KLVdTdHJpbmcNCi0xOQ0KLWxpYnBuZy5saWIgemxpYi5saWINCi0wDQotMTcNCi1NVlN0YXRlDQotMTgNCi1XU3RyaW5nDQotNw0KLVdJTkxJTksNCi0xOQ0KLVdTdHJpbmcNCi0yOA0KLT8/Pz8/TGlicmFyeSBkaXJlY3Rvcmllcyg7KToNCi0wDQotMjANCi1XU3RyaW5nDQotOA0KLSQoJXpsaWIpDQotMA0KLTIxDQotTVZTdGF0ZQ0KLTIyDQotV1N0cmluZw0KLTcNCi1XSU5MSU5LDQotMjMNCi1XU3RyaW5nDQotMTgNCi0/Pz8/P0xpYnJhcmllcygsKToNCi0wDQotMjQNCi1XU3RyaW5nDQotMTkNCi1saWJwbmcubGliIHpsaWIubGliDQotMA0KLTI1DQotV1ZMaXN0DQotMA0KLS0xDQotMQ0KLTENCi0wDQotMjYNCi1XUGlja0xpc3QNCi0yDQotMjcNCi1NSXRlbQ0KLTMNCi0qLmMNCi0yOA0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTI5DQotV1ZMaXN0DQotMg0KLTMwDQotTVZTdGF0ZQ0KLTMxDQotV1N0cmluZw0KLTMNCi1XQ0MNCi0zMg0KLVdTdHJpbmcNCi0yNQ0KLW4/Pz8/SW5jbHVkZSBkaXJlY3RvcmllczoNCi0xDQotMzMNCi1XU3RyaW5nDQotMzkNCi0iJCglemxpYik7JCgld2F0Y29tKS9oOyQoJXdhdGNvbSkvaC9udCINCi0wDQotMzQNCi1NVlN0YXRlDQotMzUNCi1XU3RyaW5nDQotMw0KLVdDQw0KLTM2DQotV1N0cmluZw0KLTI1DQotbj8/Pz9JbmNsdWRlIGRpcmVjdG9yaWVzOg0KLTANCi0zNw0KLVdTdHJpbmcNCi0zOQ0KLSIkKCV6bGliKTskKCV3YXRjb20pL2g7JCgld2F0Y29tKS9oL250Ig0KLTANCi0zOA0KLVdWTGlzdA0KLTANCi0tMQ0KLTENCi0xDQotMA0KLTM5DQotTUl0ZW0NCi0xNQ0KLS4uXC4uXHBuZ3Rlc3QuYw0KLTQwDQotV1N0cmluZw0KLTQNCi1DT0JKDQotNDENCi1XVkxpc3QNCi0wDQotNDINCi1XVkxpc3QNCi0wDQotMjcNCi0xDQotMQ0KLTANCmRpZmYgLS1naXQgYS9wcm9qZWN0cy9vd2F0Y29tL3BuZ3ZhbGlkLnRndCBiL3Byb2plY3RzL293YXRjb20vcG5ndmFsaWQudGd0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTc4ZTc1Li4wMDAwMDAwCi0tLSBhL3Byb2plY3RzL293YXRjb20vcG5ndmFsaWQudGd0CisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTQwDQotdGFyZ2V0SWRlbnQNCi0wDQotTVByb2plY3QNCi0xDQotTUNvbXBvbmVudA0KLTANCi0yDQotV1N0cmluZw0KLTQNCi1ORVhFDQotMw0KLVdTdHJpbmcNCi01DQotbmMyZW4NCi0xDQotMA0KLTANCi00DQotTUNvbW1hbmQNCi0wDQotNQ0KLU1Db21tYW5kDQotOA0KLXBuZ3ZhbGlkDQotNg0KLU1JdGVtDQotMTINCi1wbmd2YWxpZC5leGUNCi03DQotV1N0cmluZw0KLTQNCi1ORVhFDQotOA0KLVdWTGlzdA0KLTYNCi05DQotTVZTdGF0ZQ0KLTEwDQotV1N0cmluZw0KLTcNCi1XSU5MSU5LDQotMTENCi1XU3RyaW5nDQotMTENCi0/Pz8/P1N0YWNrOg0KLTENCi0xMg0KLVdTdHJpbmcNCi00DQotNzY4aw0KLTANCi0xMw0KLU1WU3RhdGUNCi0xNA0KLVdTdHJpbmcNCi03DQotV0lOTElOSw0KLTE1DQotV1N0cmluZw0KLTI4DQotPz8/Pz9MaWJyYXJ5IGRpcmVjdG9yaWVzKDspOg0KLTENCi0xNg0KLVdTdHJpbmcNCi04DQotJCglemxpYikNCi0wDQotMTcNCi1NVlN0YXRlDQotMTgNCi1XU3RyaW5nDQotNw0KLVdJTkxJTksNCi0xOQ0KLVdTdHJpbmcNCi0xOA0KLT8/Pz8/TGlicmFyaWVzKCwpOg0KLTENCi0yMA0KLVdTdHJpbmcNCi0xOQ0KLWxpYnBuZy5saWIgemxpYi5saWINCi0wDQotMjENCi1NVlN0YXRlDQotMjINCi1XU3RyaW5nDQotNw0KLVdJTkxJTksNCi0yMw0KLVdTdHJpbmcNCi0xMQ0KLT8/Pz8/U3RhY2s6DQotMA0KLTI0DQotV1N0cmluZw0KLTQNCi03NjhrDQotMA0KLTI1DQotTVZTdGF0ZQ0KLTI2DQotV1N0cmluZw0KLTcNCi1XSU5MSU5LDQotMjcNCi1XU3RyaW5nDQotMjgNCi0/Pz8/P0xpYnJhcnkgZGlyZWN0b3JpZXMoOyk6DQotMA0KLTI4DQotV1N0cmluZw0KLTgNCi0kKCV6bGliKQ0KLTANCi0yOQ0KLU1WU3RhdGUNCi0zMA0KLVdTdHJpbmcNCi03DQotV0lOTElOSw0KLTMxDQotV1N0cmluZw0KLTE4DQotPz8/Pz9MaWJyYXJpZXMoLCk6DQotMA0KLTMyDQotV1N0cmluZw0KLTE5DQotbGlicG5nLmxpYiB6bGliLmxpYg0KLTANCi0zMw0KLVdWTGlzdA0KLTANCi0tMQ0KLTENCi0xDQotMA0KLTM0DQotV1BpY2tMaXN0DQotMg0KLTM1DQotTUl0ZW0NCi0zDQotKi5jDQotMzYNCi1XU3RyaW5nDQotNA0KLUNPQkoNCi0zNw0KLVdWTGlzdA0KLTINCi0zOA0KLU1WU3RhdGUNCi0zOQ0KLVdTdHJpbmcNCi0zDQotV0NDDQotNDANCi1XU3RyaW5nDQotMjUNCi1uPz8/P0luY2x1ZGUgZGlyZWN0b3JpZXM6DQotMQ0KLTQxDQotV1N0cmluZw0KLTM5DQotIiQoJXpsaWIpOyQoJXdhdGNvbSkvaDskKCV3YXRjb20pL2gvbnQiDQotMA0KLTQyDQotTVZTdGF0ZQ0KLTQzDQotV1N0cmluZw0KLTMNCi1XQ0MNCi00NA0KLVdTdHJpbmcNCi0yNQ0KLW4/Pz8/SW5jbHVkZSBkaXJlY3RvcmllczoNCi0wDQotNDUNCi1XU3RyaW5nDQotMzkNCi0iJCglemxpYik7JCgld2F0Y29tKS9oOyQoJXdhdGNvbSkvaC9udCINCi0wDQotNDYNCi1XVkxpc3QNCi0wDQotLTENCi0xDQotMQ0KLTANCi00Nw0KLU1JdGVtDQotMzMNCi0uLlwuLlxjb250cmliXGxpYnRlc3RzXHBuZ3ZhbGlkLmMNCi00OA0KLVdTdHJpbmcNCi00DQotQ09CSg0KLTQ5DQotV1ZMaXN0DQotMA0KLTUwDQotV1ZMaXN0DQotMA0KLTM1DQotMQ0KLTENCi0wDQpkaWZmIC0tZ2l0IGEvcHJvamVjdHMvdmlzdWFsYzcxL1BSSjAwNDEubWFrIGIvcHJvamVjdHMvdmlzdWFsYzcxL1BSSjAwNDEubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E2OGI1Li4wMDAwMDAwCi0tLSBhL3Byb2plY3RzL3Zpc3VhbGM3MS9QUkowMDQxLm1haworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgUHJldmVudCAiQ2Fubm90IGZpbmQgbWlzc2luZyBkZXBlbmRlbmN5Li4uIiB3YXJuaW5ncyB3aGlsZSBjb21waWxpbmcKLSMgcG5nd2luLnJjIChQUkowMDQxKS4KLQotYWxsOiAkKEludERpcilcYWxsb2MuaCBcCi0JICQoSW50RGlyKVxmcC5oIFwKLQkgJChJbnREaXIpXG02ODg4MS5oIFwKLQkgJChJbnREaXIpXG1lbS5oIFwKLQkgJChJbnREaXIpXHBuZ3Vzci5oIFwKLQkgJChJbnREaXIpXHN0cmluZ3MuaCBcCi0JICQoSW50RGlyKVx1bmlzdGQuaCBcCi0JICQoSW50RGlyKVx1bml4aW8uaAotCi0kKEludERpcilcYWxsb2MuaCBcCi0kKEludERpcilcZnAuaCBcCi0kKEludERpcilcbTY4ODgxLmggXAotJChJbnREaXIpXG1lbS5oIFwKLSQoSW50RGlyKVxwbmd1c3IuaCBcCi0kKEludERpcilcc3RyaW5ncy5oIFwKLSQoSW50RGlyKVx1bmlzdGQuaCBcCi0kKEludERpcilcdW5peGlvLmg6Ci0JQCFlY2hvLj4kQApkaWZmIC0tZ2l0IGEvcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRS50eHQgYi9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1NjVlNC4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLU1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSwgRm9ybWF0IFZlcnNpb24gNy4xMCBmb3IgbGlicG5nLgotCi1Db3B5cmlnaHQgKEMpIDIwMDQgU2ltb24tUGllcnJlIENhZGlldXguCi0KLVRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi1Gb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcG5nLmgKLQotTk9URTogVGhpcyBwcm9qZWN0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjUuMC4gIEl0IGhhcwotYmVlbiByZXBsYWNlZCB3aXRoIHRoZSAidnN0dWRpbyIgcHJvamVjdC4KLQotQXNzdW1wdGlvbnM6Ci0qIFRoZSBsaWJwbmcgc291cmNlIGZpbGVzIGFyZSBpbiAuLlwuLgotKiBUaGUgemxpYiBzb3VyY2UgZmlsZXMgYXJlIGluIC4uXC4uXC4uXHpsaWIKLSogVGhlIHpsaWIgcHJvamVjdCBmaWxlIGlzIGluIC4gLyogV2FybmluZzogVGhpcyBpcyB1bnRpbCB0aGUgemxpYiBwcm9qZWN0Ci0gIGZpbGVzIGdldCBpbnRlcmdyYXRlZCBpbnRvIHRoZSBuZXh0IHpsaWIgcmVsZWFzZS4gVGhlIGZpbmFsIHpsaWIgcHJvamVjdAotICBkaXJlY3Rvcnkgd2lsbCB0aGVuIGJlIC4uXC4uXC4uXHpsaWJccHJvamVjdHNcdmlzdWFsYzcxLiAqLwotCi1UbyB1c2U6Ci0KLTEpIE9uIHRoZSBtYWluIG1lbnUsIHNlbGVjdCAiRmlsZSB8IE9wZW4gU29sdXRpb24iLgotICAgT3BlbiAibGlicG5nLnNsbiIuCi0KLTIpIERpc3BsYXkgdGhlIFNvbHV0aW9uIEV4cGxvcmVyIHZpZXcgKEN0cmwrQWx0K0wpCi0KLTMpIFNldCBvbmUgb2YgdGhlIHByb2plY3QgYXMgdGhlIFN0YXJ0VXAgcHJvamVjdC4gSWYgeW91IGp1c3Qgd2FudCB0byBidWlsZCB0aGUKLSAgIGJpbmFyaWVzIHNldCAibGlicG5nIiBhcyB0aGUgc3RhcnR1cCBwcm9qZWN0IChTZWxlY3QgImxpYnBuZyIgdHJlZSB2aWV3Ci0gICBpdGVtICsgUHJvamVjdCB8IFNldCBhcyBTdGFydFVwIHByb2plY3QpLiBJZiB5b3Ugd2FudCB0byBidWlsZCBhbmQgdGVzdCB0aGUKLSAgIGJpbmFyaWVzIHNldCBpdCB0byAicG5ndGVzdCIgKFNlbGVjdCAicG5ndGVzdCIgdHJlZSB2aWV3IGl0ZW0gKwotICAgUHJvamVjdCB8IFNldCBhcyBTdGFydFVwIHByb2plY3QpCi0KLTQpIFNlbGVjdCAiQnVpbGQgfCBDb25maWd1cmF0aW9uIE1hbmFnZXIuLi4iLgotICAgQ2hvb3NlIHRoZSBjb25maWd1cmF0aW9uIHlvdSB3aXNoIHRvIGJ1aWxkLgotCi01KSBTZWxlY3QgIkJ1aWxkIHwgQ2xlYW4gU29sdXRpb24iLgotCi02KSBTZWxlY3QgIkJ1aWxkIHwgQnVpbGQgU29sdXRpb24gKEN0cmwtU2hpZnQtQikiCi0KLVRoaXMgcHJvamVjdCBidWlsZHMgdGhlIGxpYnBuZyBiaW5hcmllcyBhcyBmb2xsb3dzOgotCi0qIFdpbjMyX0RMTF9SZWxlYXNlXGxpYnBuZzE2LmRsbCAgICAgIERMTCBidWlsZAotKiBXaW4zMl9ETExfRGVidWdcbGlicG5nMTZkLmRsbCAgICAgICBETEwgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0qIFdpbjMyX0RMTF9WQlxsaWJwbmcxNnZiLmRsbCAgICAgICAgIERMTCBidWlsZCBmb3IgVmlzdWFsIEJhc2ljLCB1c2luZyBzdGRjYWxsCi0qIFdpbjMyX0xJQl9SZWxlYXNlXGxpYnBuZy5saWIgICAgICAgIHN0YXRpYyBidWlsZAotKiBXaW4zMl9MSUJfRGVidWdcbGlicG5nZC5saWIgICAgICAgICBzdGF0aWMgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0KLU5vdGVzOgotCi1JZiB5b3UgY2hhbmdlIGFueXRoaW5nIGluIHRoZSBzb3VyY2UgZmlsZXMsIG9yIHNlbGVjdCBkaWZmZXJlbnQgY29tcGlsZXIKLXNldHRpbmdzLCBwbGVhc2UgY2hhbmdlIHRoZSBETEwgbmFtZSB0byBzb21ldGhpbmcgZGlmZmVyZW50IHRoYW4gYW55IG9mCi10aGUgYWJvdmUgbmFtZXMuIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGluIHlvdXIgInBuZ3Vzci5oIiB5b3UgZGVmaW5lCi1QTkdfVVNFUl9QUklWQVRFQlVJTEQgYW5kIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVggYWNjb3JkaW5nIHRvIHRoZQotaW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGluICJwbmdjb25mLmgiLgotCi1BbGwgRExMcyBidWlsdCBieSB0aGlzIHByb2plY3QgdXNlIHRoZSBNaWNyb3NvZnQgZHluYW1pYyBDIHJ1bnRpbWUgbGlicmFyeQotTVNWQ1I3MS5ETEwgKE1TVkNSNzFELkRMTCBmb3IgZGVidWcgdmVyc2lvbnMpLiAgSWYgeW91IGRpc3RyaWJ1dGUgYW55IG9mIHRoZQotYWJvdmUgbWVudGlvbmVkIGxpYnJhcmllcyB5b3UgbWF5IGhhdmUgdG8gaW5jbHVkZSB0aGlzIERMTCBpbiB5b3VyIHBhY2thZ2UuCi1Gb3IgYSBsaXN0IG9mIGZpbGVzIHRoYXQgYXJlIHJlZGlzdHJpYnV0YWJsZSBpbiBWaXN1YWwgU3R1ZGlvIHNlZQotJChWQ0lOU1RBTExESVIpXHJlZGlzdC50eHQuCmRpZmYgLS1naXQgYS9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0IGIvcHJvamVjdHMvdmlzdWFsYzcxL1JFQURNRV96bGliLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMTFjYi4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92aXN1YWxjNzEvUkVBRE1FX3psaWIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogV0FSTklORzogVGhpcyBmaWxlIHdhcyBwdXQgaW4gdGhlIExpYlBORyBkaXN0cmlidXRpb24gZm9yIGNvbnZlbmllbmNlIG9ubHkuCi0gICAgICAgICAgICBJdCBpcyBleHBlY3RlZCB0byBiZSBwYXJ0IG9mIHRoZSBuZXh0IHpsaWIgcmVsZWFzZSB1bmRlcgotICAgICAgICAgICAgInByb2plY3RzXHZpc3VhbGM3MVxSRUFETUUudHh0LiIgKi8KLQotTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA3LjEwIGZvciB6bGliLgotCi1Db3B5cmlnaHQgKEMpIDIwMDQgU2ltb24tUGllcnJlIENhZGlldXguCi1Db3B5cmlnaHQgKEMpIDIwMDQgQ29zbWluIFRydXRhLgotCi1UaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaC4KLQotTk9URTogVGhpcyBwcm9qZWN0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGxpYnBuZy0xLjUuMC4gIEl0IGhhcwotYmVlbiByZXBsYWNlZCB3aXRoIHRoZSAidnN0dWRpbyIgcHJvamVjdC4KLQotVG8gdXNlOgotCi0xKSBPbiB0aGUgbWFpbiBtZW51LCBzZWxlY3QgIkZpbGUgfCBPcGVuIFNvbHV0aW9uIi4KLSAgIE9wZW4gInpsaWIuc2xuIi4KLQotMikgRGlzcGxheSB0aGUgU29sdXRpb24gRXhwbG9yZXIgdmlldyAoQ3RybCtBbHQrTCkKLQotMykgU2V0IG9uZSBvZiB0aGUgcHJvamVjdCBhcyB0aGUgU3RhcnRVcCBwcm9qZWN0LiBJZiB5b3UganVzdCB3YW50IHRvIGJ1aWxkIHRoZQotICAgYmluYXJpZXMgc2V0ICJ6bGliIiBhcyB0aGUgc3RhcnR1cCBwcm9qZWN0IChTZWxlY3QgInpsaWIiIHRyZWUgdmlldyBpdGVtICsKLSAgIFByb2plY3QgfCBTZXQgYXMgU3RhcnRVcCBwcm9qZWN0KS4gSWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHRlc3QgdGhlCi0gICBiaW5hcmllcyBzZXQgaXQgdG8gImV4YW1wbGUiIChTZWxlY3QgImV4YW1wbGUiIHRyZWUgdmlldyBpdGVtICsgUHJvamVjdCB8Ci0gICBTZXQgYXMgU3RhcnRVcCBwcm9qZWN0KSwgSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIG1pbmlnemlwIHV0aWxpdHkgc2V0IGl0IHRvCi0gICAibWluaWd6aXAiIChTZWxlY3QgIm1pbmlnemlwIiB0cmVlIHZpZXcgaXRlbSArIFByb2plY3QgfCBTZXQgYXMgU3RhcnRVcAotICAgcHJvamVjdAotCi00KSBTZWxlY3QgIkJ1aWxkIHwgQ29uZmlndXJhdGlvbiBNYW5hZ2VyLi4uIi4KLSAgIENob29zZSB0aGUgY29uZmlndXJhdGlvbiB5b3Ugd2lzaCB0byBidWlsZC4KLQotNSkgU2VsZWN0ICJCdWlsZCB8IENsZWFuIFNvbHV0aW9uIi4KLQotNikgU2VsZWN0ICJCdWlsZCB8IEJ1aWxkIFNvbHV0aW9uIChDdHJsLVNoaWZ0LUIpIgotCi1UaGlzIHByb2plY3QgYnVpbGRzIHRoZSB6bGliIGJpbmFyaWVzIGFzIGZvbGxvd3M6Ci0KLSogV2luMzJfRExMX1JlbGVhc2VcemxpYjEuZGxsICAgICAgIERMTCBidWlsZAotKiBXaW4zMl9ETExfRGVidWdcemxpYjFkLmRsbCAgICAgICAgRExMIGJ1aWxkIChkZWJ1ZyB2ZXJzaW9uKQotKiBXaW4zMl9MSUJfUmVsZWFzZVx6bGliLmxpYiAgICAgICAgc3RhdGljIGJ1aWxkCi0qIFdpbjMyX0xJQl9EZWJ1Z1x6bGliZC5saWIgICAgICAgICBzdGF0aWMgYnVpbGQgKGRlYnVnIHZlcnNpb24pCi0KZGlmZiAtLWdpdCBhL3Byb2plY3RzL3Zpc3VhbGM3MS9saWJwbmcuc2xuIGIvcHJvamVjdHMvdmlzdWFsYzcxL2xpYnBuZy5zbG4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjEwMWYuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvdmlzdWFsYzcxL2xpYnBuZy5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwCi1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImxpYnBuZyIsICJsaWJwbmcudmNwcm9qIiwgInswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9IgotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKLQkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0gPSB7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfQotCUVuZFByb2plY3RTZWN0aW9uCi1FbmRQcm9qZWN0Ci1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInBuZ3Rlc3QiLCAicG5ndGVzdC52Y3Byb2oiLCAie0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0iCi0JUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAotCQl7MDAwODk2MEUtRTBERC00MUE2LTgyNjUtMDBCMzFEREI0QzIxfSA9IHswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9Ci0JRW5kUHJvamVjdFNlY3Rpb24KLUVuZFByb2plY3QKLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiemxpYiIsICJ6bGliLnZjcHJvaiIsICJ7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfSIKLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0Ci0JRW5kUHJvamVjdFNlY3Rpb24KLUVuZFByb2plY3QKLUdsb2JhbAotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uCi0JCURMTCBEZWJ1ZyA9IERMTCBEZWJ1ZwotCQlETEwgUmVsZWFzZSA9IERMTCBSZWxlYXNlCi0JCURMTCBWQiA9IERMTCBWQgotCQlMSUIgRGVidWcgPSBMSUIgRGVidWcKLQkJTElCIFJlbGVhc2UgPSBMSUIgUmVsZWFzZQotCUVuZEdsb2JhbFNlY3Rpb24KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uKSA9IHBvc3RTb2x1dGlvbgotCQl7MDAwODk2MEUtRTBERC00MUE2LTgyNjUtMDBCMzFEREI0QzIxfS5ETEwgRGVidWcuQWN0aXZlQ2ZnID0gRExMIERlYnVnfFdpbjMyCi0JCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBEZWJ1Zy5CdWlsZC4wID0gRExMIERlYnVnfFdpbjMyCi0JCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBSZWxlYXNlLkFjdGl2ZUNmZyA9IERMTCBSZWxlYXNlfFdpbjMyCi0JCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBSZWxlYXNlLkJ1aWxkLjAgPSBETEwgUmVsZWFzZXxXaW4zMgotCQl7MDAwODk2MEUtRTBERC00MUE2LTgyNjUtMDBCMzFEREI0QzIxfS5ETEwgVkIuQWN0aXZlQ2ZnID0gRExMIFZCfFdpbjMyCi0JCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkRMTCBWQi5CdWlsZC4wID0gRExMIFZCfFdpbjMyCi0JCXswMDA4OTYwRS1FMERELTQxQTYtODI2NS0wMEIzMUREQjRDMjF9LkxJQiBEZWJ1Zy5BY3RpdmVDZmcgPSBMSUIgRGVidWd8V2luMzIKLQkJezAwMDg5NjBFLUUwREQtNDFBNi04MjY1LTAwQjMxRERCNEMyMX0uTElCIERlYnVnLkJ1aWxkLjAgPSBMSUIgRGVidWd8V2luMzIKLQkJezAwMDg5NjBFLUUwREQtNDFBNi04MjY1LTAwQjMxRERCNEMyMX0uTElCIFJlbGVhc2UuQWN0aXZlQ2ZnID0gTElCIFJlbGVhc2V8V2luMzIKLQkJezAwMDg5NjBFLUUwREQtNDFBNi04MjY1LTAwQjMxRERCNEMyMX0uTElCIFJlbGVhc2UuQnVpbGQuMCA9IExJQiBSZWxlYXNlfFdpbjMyCi0JCXtGRDFDMkY4Ni05RUVGLTQ3QkQtOTVBNC01MzA5MTdFMTdGREF9LkRMTCBEZWJ1Zy5BY3RpdmVDZmcgPSBETEwgRGVidWd8V2luMzIKLQkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIERlYnVnLkJ1aWxkLjAgPSBETEwgRGVidWd8V2luMzIKLQkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIFJlbGVhc2UuQWN0aXZlQ2ZnID0gRExMIFJlbGVhc2V8V2luMzIKLQkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIFJlbGVhc2UuQnVpbGQuMCA9IERMTCBSZWxlYXNlfFdpbjMyCi0JCXtGRDFDMkY4Ni05RUVGLTQ3QkQtOTVBNC01MzA5MTdFMTdGREF9LkRMTCBWQi5BY3RpdmVDZmcgPSBETEwgVkJ8V2luMzIKLQkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uRExMIFZCLkJ1aWxkLjAgPSBETEwgVkJ8V2luMzIKLQkJe0ZEMUMyRjg2LTlFRUYtNDdCRC05NUE0LTUzMDkxN0UxN0ZEQX0uTElCIERlYnVnLkFjdGl2ZUNmZyA9IExJQiBEZWJ1Z3xXaW4zMgotCQl7RkQxQzJGODYtOUVFRi00N0JELTk1QTQtNTMwOTE3RTE3RkRBfS5MSUIgRGVidWcuQnVpbGQuMCA9IExJQiBEZWJ1Z3xXaW4zMgotCQl7RkQxQzJGODYtOUVFRi00N0JELTk1QTQtNTMwOTE3RTE3RkRBfS5MSUIgUmVsZWFzZS5BY3RpdmVDZmcgPSBMSUIgUmVsZWFzZXxXaW4zMgotCQl7RkQxQzJGODYtOUVFRi00N0JELTk1QTQtNTMwOTE3RTE3RkRBfS5MSUIgUmVsZWFzZS5CdWlsZC4wID0gTElCIFJlbGVhc2V8V2luMzIKLQkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0uRExMIERlYnVnLkFjdGl2ZUNmZyA9IERMTCBEZWJ1Z3xXaW4zMgotCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5ETEwgRGVidWcuQnVpbGQuMCA9IERMTCBEZWJ1Z3xXaW4zMgotCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5ETEwgUmVsZWFzZS5BY3RpdmVDZmcgPSBETEwgUmVsZWFzZXxXaW4zMgotCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5ETEwgUmVsZWFzZS5CdWlsZC4wID0gRExMIFJlbGVhc2V8V2luMzIKLQkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0uRExMIFZCLkFjdGl2ZUNmZyA9IERMTCBSZWxlYXNlfFdpbjMyCi0JCXsyRDRGODEwNS03RDIxLTQ1NEMtOTkzMi1CNDdDQUI3MUE1QzB9LkRMTCBWQi5CdWlsZC4wID0gRExMIFJlbGVhc2V8V2luMzIKLQkJezJENEY4MTA1LTdEMjEtNDU0Qy05OTMyLUI0N0NBQjcxQTVDMH0uTElCIERlYnVnLkFjdGl2ZUNmZyA9IExJQiBEZWJ1Z3xXaW4zMgotCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5MSUIgRGVidWcuQnVpbGQuMCA9IExJQiBEZWJ1Z3xXaW4zMgotCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5MSUIgUmVsZWFzZS5BY3RpdmVDZmcgPSBMSUIgUmVsZWFzZXxXaW4zMgotCQl7MkQ0RjgxMDUtN0QyMS00NTRDLTk5MzItQjQ3Q0FCNzFBNUMwfS5MSUIgUmVsZWFzZS5CdWlsZC4wID0gTElCIFJlbGVhc2V8V2luMzIKLQlFbmRHbG9iYWxTZWN0aW9uCi0JR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KLQlFbmRHbG9iYWxTZWN0aW9uCi0JR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5QWRkSW5zKSA9IHBvc3RTb2x1dGlvbgotCUVuZEdsb2JhbFNlY3Rpb24KLUVuZEdsb2JhbApkaWZmIC0tZ2l0IGEvcHJvamVjdHMvdmlzdWFsYzcxL2xpYnBuZy52Y3Byb2ogYi9wcm9qZWN0cy92aXN1YWxjNzEvbGlicG5nLnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ZWM0ZS4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92aXN1YWxjNzEvbGlicG5nLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0Ci0JUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCi0JVmVyc2lvbj0iNy4xMCIKLQlOYW1lPSJsaWJwbmciCi0JUm9vdE5hbWVzcGFjZT0ibGlicG5nIj4KLQk8UGxhdGZvcm1zPgotCQk8UGxhdGZvcm0KLQkJCU5hbWU9IldpbjMyIi8+Ci0JPC9QbGF0Zm9ybXM+Ci0JPENvbmZpZ3VyYXRpb25zPgotCQk8Q29uZmlndXJhdGlvbgotCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1JlbGVhc2UiCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1JlbGVhc2UiCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMiI+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi47Li5cLi5cLi5cemxpYiIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO1BOR19CVUlMRF9ETEw7WkxJQl9ETEw7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiCi0JCQkJU3RyaW5nUG9vbGluZz0iVFJVRSIKLQkJCQlSdW50aW1lTGlicmFyeT0iMiIKLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSIKLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMyIKLQkJCQlQcmVjb21waWxlZEhlYWRlclRocm91Z2g9InBuZ3ByaXYuaCIKLQkJCQlXYXJuaW5nTGV2ZWw9IjMiCi0JCQkJQ29tcGlsZUFzPSIwIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbGlicG5nMTYuZGxsIgotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCi0JCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgLi5cLi5ccG5nbGliY29uZi5oIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCi0JCQkJQ3VsdHVyZT0iMTAzMyIKLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLjsuLlwuLlwuLlx6bGliOyQoSW50RGlyKSIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCTwvQ29uZmlndXJhdGlvbj4KLQkJPENvbmZpZ3VyYXRpb24KLQkJCU5hbWU9IkRMTCBEZWJ1Z3xXaW4zMiIKLQkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9ETExfRGVidWciCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX0RlYnVnIgotCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCU9wdGltaXphdGlvbj0iMCIKLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLjsuLlwuLlwuLlx6bGliIgotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7REVCVUc7UE5HX0RFQlVHPTE7UE5HX0JVSUxEX0RMTDtaTElCX0RMTDtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJUaHJvdWdoPSJwbmdwcml2LmgiCi0JCQkJV2FybmluZ0xldmVsPSIzIgotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCi0JCQkJQ29tcGlsZUFzPSIwIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbGlicG5nMTZkLmRsbCIKLQkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgotCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXC4uXHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0IC4uXC4uXHBuZ2xpYmNvbmYuaCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHLFBOR19ERUJVRz0xIgotCQkJCUN1bHR1cmU9IjEwMzMiCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi47Li5cLi5cLi5cemxpYjskKEludERpcikiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQk8L0NvbmZpZ3VyYXRpb24+Ci0JCTxDb25maWd1cmF0aW9uCi0JCQlOYW1lPSJETEwgVkJ8V2luMzIiCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1ZCIgotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9WQiIKLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIj4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLjsuLlwuLlwuLlx6bGliIgotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7UE5HX0JVSUxEX0RMTDtaTElCX0RMTDtQTkdBUEk9X19zdGRjYWxsO1BOR19OT19NT0RVTEVERUY7UE5HX0xJQlBOR19TUEVDSUFMQlVJTEQ7UE5HX1VTRVJfUFJJVkFURUJVSUxEO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgotCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCi0JCQkJUnVudGltZUxpYnJhcnk9IjIiCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJUaHJvdWdoPSJwbmdwcml2LmgiCi0JCQkJV2FybmluZ0xldmVsPSIzIgotCQkJCUNvbXBpbGVBcz0iMCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2xpYnBuZzE2dmIuZGxsIgotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCi0JCQkJQ29tbWFuZExpbmU9ImNvcHkgLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgLi5cLi5ccG5nbGliY29uZi5oIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgotCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvZCBQTkdfTk9fUEVEQU5USUNfV0FSTklOR1MgL2QgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYPSZxdW90OyZxdW90OyZxdW90OyZxdW90O1ZCJnF1b3Q7JnF1b3Q7JnF1b3Q7JnF1b3Q7IC9kIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxEPSZxdW90OyZxdW90OyZxdW90OyZxdW90O19fc3RkY2FsbCBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgZXhwb3J0ZWQgZnVuY3Rpb25zJnF1b3Q7JnF1b3Q7JnF1b3Q7JnF1b3Q7IgotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCi0JCQkJQ3VsdHVyZT0iMTAzMyIKLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLjsuLlwuLlwuLlx6bGliOyQoSW50RGlyKSIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCTwvQ29uZmlndXJhdGlvbj4KLQkJPENvbmZpZ3VyYXRpb24KLQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIgotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9SZWxlYXNlIgotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9SZWxlYXNlIgotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uOy4uXC4uXC4uXHpsaWIiCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKLQkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIzIgotCQkJCVByZWNvbXBpbGVkSGVhZGVyVGhyb3VnaD0icG5ncHJpdi5oIgotCQkJCVdhcm5pbmdMZXZlbD0iMyIKLQkJCQlDb21waWxlQXM9IjAiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9saWJwbmcubGliIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKLQkJCQlDb21tYW5kTGluZT0iY29weSAuLlwuLlxzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdCAuLlwuLlxwbmdsaWJjb25mLmgiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KLQkJPC9Db25maWd1cmF0aW9uPgotCQk8Q29uZmlndXJhdGlvbgotCQkJTmFtZT0iTElCIERlYnVnfFdpbjMyIgotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9EZWJ1ZyIKLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxXaW4zMl9MSUJfRGVidWciCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCI+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJT3B0aW1pemF0aW9uPSIwIgotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uOy4uXC4uXC4uXHpsaWIiCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztERUJVRztQTkdfREVCVUc9MTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjMiCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJUaHJvdWdoPSJwbmdwcml2LmgiCi0JCQkJV2FybmluZ0xldmVsPSIzIgotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCi0JCQkJQ29tcGlsZUFzPSIwIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbGlicG5nZC5saWIiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgotCQkJCUNvbW1hbmRMaW5lPSJjb3B5IC4uXC4uXHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0IC4uXC4uXHBuZ2xpYmNvbmYuaCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQk8L0NvbmZpZ3VyYXRpb24+Ci0JPC9Db25maWd1cmF0aW9ucz4KLQk8UmVmZXJlbmNlcz4KLQk8L1JlZmVyZW5jZXM+Ci0JPEZpbGVzPgotCQk8RmlsdGVyCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiCi0JCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZy5jIj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iRExMIERlYnVnfFdpbjMyIj4KLQkJCQkJPFRvb2wKLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkRMTCBWQnxXaW4zMiI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgRGVidWd8V2luMzIiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmdlcnJvci5jIj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iRExMIERlYnVnfFdpbjMyIj4KLQkJCQkJPFRvb2wKLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMSIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkRMTCBWQnxXaW4zMiI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgRGVidWd8V2luMzIiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmdnZXQuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5nbWVtLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3ByZWFkLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3JlYWQuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5ncmlvLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3J0cmFuLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3J1dGlsLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3NldC5jIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmd0cmFucy5jIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmd3aW8uYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5nd3JpdGUuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5nd3RyYW4uYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5nd3V0aWwuYyI+Ci0JCQk8L0ZpbGU+Ci0JCTwvRmlsdGVyPgotCQk8RmlsdGVyCi0JCQlOYW1lPSJIZWFkZXIgRmlsZXMiCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZy5oIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxwbmdjb25mLmgiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHBuZ3ByaXYuaCI+Ci0JCQk8L0ZpbGU+Ci0JCTwvRmlsdGVyPgotCQk8RmlsdGVyCi0JCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKLQkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIj4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzY3JpcHRzXHBuZ3dpbi5yYyI+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIgotCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iTElCIERlYnVnfFdpbjMyIgotCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCTwvRmlsZT4KLQkJPC9GaWx0ZXI+Ci0JCTxGaWxlCi0JCQlSZWxhdGl2ZVBhdGg9Ii5cUFJKMDA0MS5tYWsiPgotCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiPgotCQkJCTxUb29sCi0JCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgotCQkJCQlEZXNjcmlwdGlvbj0iQ3JlYXRlIGR1bW15IGluY2x1ZGUgZmlsZXMgdG8gcHJldmVudCAmcXVvdDtDYW5ub3QgZmluZCBtaXNzaW5nIGRlcGVuZGVuY3kuLi4mcXVvdDsgd2FybmluZ3MuIgotCQkJCQlDb21tYW5kTGluZT0ibm1ha2UgLWYgUFJKMDA0MS5tYWsgSW50RGlyPSQoSW50RGlyKSIKLQkJCQkJT3V0cHV0cz0iJChJbnREaXIpXGFsbG9jLmg7JChJbnREaXIpXGZwLmg7JChJbnREaXIpXG02ODg4MS5oOyQoSW50RGlyKVxtZW0uaDskKEludERpcilccG5ndXNyLmg7JChJbnREaXIpXHN0cmluZ3MuaDskKEludERpcilcdW5pc3RkLmg7JChJbnREaXIpXHVuaXhpby5oIi8+Ci0JCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJTmFtZT0iRExMIERlYnVnfFdpbjMyIj4KLQkJCQk8VG9vbAotCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKLQkJCQkJRGVzY3JpcHRpb249IkNyZWF0ZSBkdW1teSBpbmNsdWRlIGZpbGVzIHRvIHByZXZlbnQgJnF1b3Q7Q2Fubm90IGZpbmQgbWlzc2luZyBkZXBlbmRlbmN5Li4uJnF1b3Q7IHdhcm5pbmdzLiIKLQkJCQkJQ29tbWFuZExpbmU9Im5tYWtlIC1mIFBSSjAwNDEubWFrIEludERpcj0kKEludERpcikiCi0JCQkJCU91dHB1dHM9IiQoSW50RGlyKVxhbGxvYy5oOyQoSW50RGlyKVxmcC5oOyQoSW50RGlyKVxtNjg4ODEuaDskKEludERpcilcbWVtLmg7JChJbnREaXIpXHBuZ3Vzci5oOyQoSW50RGlyKVxzdHJpbmdzLmg7JChJbnREaXIpXHVuaXN0ZC5oOyQoSW50RGlyKVx1bml4aW8uaCIvPgotCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCU5hbWU9IkRMTCBWQnxXaW4zMiI+Ci0JCQkJPFRvb2wKLQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCi0JCQkJCURlc2NyaXB0aW9uPSJDcmVhdGUgZHVtbXkgaW5jbHVkZSBmaWxlcyB0byBwcmV2ZW50ICZxdW90O0Nhbm5vdCBmaW5kIG1pc3NpbmcgZGVwZW5kZW5jeS4uLiZxdW90OyB3YXJuaW5ncy4iCi0JCQkJCUNvbW1hbmRMaW5lPSJubWFrZSAtZiBQUkowMDQxLm1hayBJbnREaXI9JChJbnREaXIpIgotCQkJCQlPdXRwdXRzPSIkKEludERpcilcYWxsb2MuaDskKEludERpcilcZnAuaDskKEludERpcilcbTY4ODgxLmg7JChJbnREaXIpXG1lbS5oOyQoSW50RGlyKVxwbmd1c3IuaDskKEludERpcilcc3RyaW5ncy5oOyQoSW50RGlyKVx1bmlzdGQuaDskKEludERpcilcdW5peGlvLmgiLz4KLQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCTwvRmlsZT4KLQkJPEZpbGUKLQkJCVJlbGF0aXZlUGF0aD0iUkVBRE1FLnR4dCI+Ci0JCTwvRmlsZT4KLQk8L0ZpbGVzPgotCTxHbG9iYWxzPgotCTwvR2xvYmFscz4KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Byb2plY3RzL3Zpc3VhbGM3MS9wbmd0ZXN0LnZjcHJvaiBiL3Byb2plY3RzL3Zpc3VhbGM3MS9wbmd0ZXN0LnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0OGYxYy4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92aXN1YWxjNzEvcG5ndGVzdC52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Ci08VmlzdWFsU3R1ZGlvUHJvamVjdAotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgotCVZlcnNpb249IjcuMTAiCi0JTmFtZT0icG5ndGVzdCIKLQlSb290TmFtZXNwYWNlPSJwbmd0ZXN0Ij4KLQk8UGxhdGZvcm1zPgotCQk8UGxhdGZvcm0KLQkJCU5hbWU9IldpbjMyIi8+Ci0JPC9QbGF0Zm9ybXM+Ci0JPENvbmZpZ3VyYXRpb25zPgotCQk8Q29uZmlndXJhdGlvbgotCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1JlbGVhc2VcVGVzdCIKLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxXaW4zMl9ETExfUmVsZWFzZVxUZXN0IgotCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHNjcmlwdHM7Li5cLi5cLi5cemxpYiIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO1BOR19ETEw7UE5HX05PX1NURElPO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgotCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCi0JCQkJUnVudGltZUxpYnJhcnk9IjIiCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiCi0JCQkJV2FybmluZ0xldmVsPSIzIgotCQkJCUNvbXBpbGVBcz0iMCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKLQkJCQlEZXNjcmlwdGlvbj0iVGVzdGluZy4uLiIKLQkJCQlDb21tYW5kTGluZT0ic2V0IHBhdGg9JChPdXREaXIpXC4uOyQoT3V0RGlyKVwuLlxaTGliCi0kKFRhcmdldFBhdGgpIC4uXC4uXHBuZ3Rlc3QucG5nICQoSW50RGlyKVxwbmdvdXQucG5nIgotCQkJCU91dHB1dHM9IiQoSW50RGlyKVxwbmdvdXQucG5nIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvcG5ndGVzdC5leGUiCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIgotCQkJCVN1YlN5c3RlbT0iMSIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQk8L0NvbmZpZ3VyYXRpb24+Ci0JCTxDb25maWd1cmF0aW9uCi0JCQlOYW1lPSJETEwgRGVidWd8V2luMzIiCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfRExMX0RlYnVnXFRlc3QiCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX0RlYnVnXFRlc3QiCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMSI+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJT3B0aW1pemF0aW9uPSIwIgotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHNjcmlwdHM7Li5cLi5cLi5cemxpYiIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO1BOR19ETEw7UE5HX05PX1NURElPO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKLQkJCQlSdW50aW1lTGlicmFyeT0iMyIKLQkJCQlXYXJuaW5nTGV2ZWw9IjMiCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKLQkJCQlDb21waWxlQXM9IjAiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCi0JCQkJRGVzY3JpcHRpb249IlRlc3RpbmcuLi4iCi0JCQkJQ29tbWFuZExpbmU9InNldCBwYXRoPSQoT3V0RGlyKVwuLjskKE91dERpcilcLi5cWkxpYgotJChUYXJnZXRQYXRoKSAuLlwuLlxwbmd0ZXN0LnBuZyAkKEludERpcilccG5nb3V0LnBuZyIKLQkJCQlPdXRwdXRzPSIkKEludERpcilccG5nb3V0LnBuZyIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3BuZ3Rlc3QuZXhlIgotCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSIKLQkJCQlTdWJTeXN0ZW09IjEiCi0JCQkJVGFyZ2V0TWFjaGluZT0iMSIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQk8L0NvbmZpZ3VyYXRpb24+Ci0JCTxDb25maWd1cmF0aW9uCi0JCQlOYW1lPSJETEwgVkJ8V2luMzIiCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1ZCXFRlc3QiCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX1ZCXFRlc3QiCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMSI+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cc2NyaXB0czsuLlwuLlwuLlx6bGliIgotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7UE5HX0RMTDtQTkdfTk9fU1RESU87UE5HQVBJPV9fc3RkY2FsbDtQTkdfVVNFUl9QUklWQVRFQlVJTEQ7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiCi0JCQkJU3RyaW5nUG9vbGluZz0iVFJVRSIKLQkJCQlSdW50aW1lTGlicmFyeT0iMiIKLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSIKLQkJCQlXYXJuaW5nTGV2ZWw9IjIiCi0JCQkJQ2FsbGluZ0NvbnZlbnRpb249IjIiCi0JCQkJQ29tcGlsZUFzPSIwIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgotCQkJCURlc2NyaXB0aW9uPSJUZXN0aW5nLi4uIgotCQkJCUNvbW1hbmRMaW5lPSJzZXQgcGF0aD0kKE91dERpcilcLi47JChPdXREaXIpXC4uXC4uXFdpbjMyX0RMTF9SZWxlYXNlXFpMaWIKLSQoVGFyZ2V0UGF0aCkgLi5cLi5ccG5ndGVzdC5wbmcgJChJbnREaXIpXHBuZ291dC5wbmciCi0JCQkJT3V0cHV0cz0iJChJbnREaXIpXHBuZ291dC5wbmciLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNMaW5rZXJUb29sIgotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9wbmd0ZXN0LmV4ZSIKLQkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCi0JCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iJChJbnREaXIpXGxpYnBuZzE2Yi5saWIiCi0JCQkJU3ViU3lzdGVtPSIxIgotCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KLQkJPC9Db25maWd1cmF0aW9uPgotCQk8Q29uZmlndXJhdGlvbgotCQkJTmFtZT0iTElCIFJlbGVhc2V8V2luMzIiCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfTElCX1JlbGVhc2VcVGVzdCIKLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxXaW4zMl9MSUJfUmVsZWFzZVxUZXN0IgotCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHNjcmlwdHM7Li5cLi5cLi5cemxpYiIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgotCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiCi0JCQkJV2FybmluZ0xldmVsPSIzIgotCQkJCUNvbXBpbGVBcz0iMCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKLQkJCQlEZXNjcmlwdGlvbj0iVGVzdGluZy4uLiIKLQkJCQlDb21tYW5kTGluZT0ic2V0IHBhdGg9JChPdXREaXIpXC4uOyQoT3V0RGlyKVwuLlxaTGliCi0kKFRhcmdldFBhdGgpIC4uXC4uXHBuZ3Rlc3QucG5nICQoSW50RGlyKVxwbmdvdXQucG5nIgotCQkJCU91dHB1dHM9IiQoSW50RGlyKVxwbmdvdXQucG5nIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvcG5ndGVzdC5leGUiCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIgotCQkJCVN1YlN5c3RlbT0iMSIKLQkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCTwvQ29uZmlndXJhdGlvbj4KLQkJPENvbmZpZ3VyYXRpb24KLQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKLQkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9MSUJfRGVidWdcVGVzdCIKLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxXaW4zMl9MSUJfRGVidWdcVGVzdCIKLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIj4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQlPcHRpbWl6YXRpb249IjAiCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cc2NyaXB0czsuLlwuLlwuLlx6bGliIgotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIgotCQkJCVdhcm5pbmdMZXZlbD0iMyIKLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgotCQkJCUNvbXBpbGVBcz0iMCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKLQkJCQlEZXNjcmlwdGlvbj0iVGVzdGluZy4uLiIKLQkJCQlDb21tYW5kTGluZT0ic2V0IHBhdGg9JChPdXREaXIpXC4uOyQoT3V0RGlyKVwuLlxaTGliCi0kKFRhcmdldFBhdGgpIC4uXC4uXHBuZ3Rlc3QucG5nICQoSW50RGlyKVxwbmdvdXQucG5nIgotCQkJCU91dHB1dHM9IiQoSW50RGlyKVxwbmdvdXQucG5nIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKLQkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvcG5ndGVzdC5leGUiCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIgotCQkJCVN1YlN5c3RlbT0iMSIKLQkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCTwvQ29uZmlndXJhdGlvbj4KLQk8L0NvbmZpZ3VyYXRpb25zPgotCTxSZWZlcmVuY2VzPgotCTwvUmVmZXJlbmNlcz4KLQk8RmlsZXM+Ci0JCTxGaWx0ZXIKLQkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKLQkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccG5ndGVzdC5jIj4KLQkJCTwvRmlsZT4KLQkJPC9GaWx0ZXI+Ci0JPC9GaWxlcz4KLQk8R2xvYmFscz4KLQk8L0dsb2JhbHM+Ci08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcm9qZWN0cy92aXN1YWxjNzEvemxpYi52Y3Byb2ogYi9wcm9qZWN0cy92aXN1YWxjNzEvemxpYi52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMjE4NDguLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvdmlzdWFsYzcxL3psaWIudmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgotPFZpc3VhbFN0dWRpb1Byb2plY3QKLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKLQlWZXJzaW9uPSI3LjEwIgotCU5hbWU9InpsaWIiPgotCTxQbGF0Zm9ybXM+Ci0JCTxQbGF0Zm9ybQotCQkJTmFtZT0iV2luMzIiLz4KLQk8L1BsYXRmb3Jtcz4KLQk8Q29uZmlndXJhdGlvbnM+Ci0JCTxDb25maWd1cmF0aW9uCi0JCQlOYW1lPSJETEwgUmVsZWFzZXxXaW4zMiIKLQkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9ETExfUmVsZWFzZVxaTGliIgotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0RMTF9SZWxlYXNlXFpMaWIiCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMiI+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5cemxpYiIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUyIKLQkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgotCQkJCVdhcm5pbmdMZXZlbD0iMyIKLQkJCQlDb21waWxlQXM9IjEiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNMaW5rZXJUb29sIgotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGliMS5kbGwiCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIgotCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuLlwuLlwuLlx6bGliXHdpbjMyXHpsaWIuZGVmIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgotCQkJCUN1bHR1cmU9IjEwMzMiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQk8L0NvbmZpZ3VyYXRpb24+Ci0JCTxDb25maWd1cmF0aW9uCi0JCQlOYW1lPSJETEwgRGVidWd8V2luMzIiCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cV2luMzJfRExMX0RlYnVnXFpMaWIiCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cV2luMzJfRExMX0RlYnVnXFpMaWIiCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMiI+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJT3B0aW1pemF0aW9uPSIwIgotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXHpsaWIiCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgotCQkJCVdhcm5pbmdMZXZlbD0iMyIKLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgotCQkJCUNvbXBpbGVBcz0iMSIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCi0JCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWIxZC5kbGwiCi0JCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii4uXC4uXC4uXHpsaWJcd2luMzJcemxpYi5kZWYiCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTUlETFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgotCQkJCUN1bHR1cmU9IjEwMzMiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgotCQk8L0NvbmZpZ3VyYXRpb24+Ci0JCTxDb25maWd1cmF0aW9uCi0JCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKLQkJCU91dHB1dERpcmVjdG9yeT0iLlxXaW4zMl9MSUJfUmVsZWFzZVxaTGliIgotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9SZWxlYXNlXFpMaWIiCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCI+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5cemxpYiIKLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUyIKLQkJCQlTdHJpbmdQb29saW5nPSJUUlVFIgotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIgotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgotCQkJCVdhcm5pbmdMZXZlbD0iMyIKLQkJCQlDb21waWxlQXM9IjEiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGliLmxpYiIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ01JRExUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KLQkJPC9Db25maWd1cmF0aW9uPgotCQk8Q29uZmlndXJhdGlvbgotCQkJTmFtZT0iTElCIERlYnVnfFdpbjMyIgotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliIgotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXFdpbjMyX0xJQl9EZWJ1Z1xaTGliIgotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCU9wdGltaXphdGlvbj0iMCIKLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlx6bGliIgotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIgotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKLQkJCQlSdW50aW1lTGlicmFyeT0iMSIKLQkJCQlXYXJuaW5nTGV2ZWw9IjMiCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKLQkJCQlDb21waWxlQXM9IjEiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgotCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGliZC5saWIiLz4KLQkJCTxUb29sCi0JCQkJTmFtZT0iVkNNSURMVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgotCQkJPFRvb2wKLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDTWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCQk8VG9vbAotCQkJCU5hbWU9IlZDQXV4aWxpYXJ5TWFuYWdlZFdyYXBwZXJHZW5lcmF0b3JUb29sIi8+Ci0JCTwvQ29uZmlndXJhdGlvbj4KLQk8L0NvbmZpZ3VyYXRpb25zPgotCTxSZWZlcmVuY2VzPgotCTwvUmVmZXJlbmNlcz4KLQk8RmlsZXM+Ci0JCTxGaWx0ZXIKLQkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKLQkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxhZGxlcjMyLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcY29tcHJlc3MuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxjcmMzMi5jIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGRlZmxhdGUuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxnemxpYi5jIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGd6Y2xvc2UuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxnenJlYWQuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxnendyaXRlLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mYmFjay5jIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGluZmZhc3QuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxpbmZsYXRlLmMiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mdHJlZXMuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx0cmVlcy5jIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXHVuY29tcHIuYyI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx3aW4zMlx6bGliLmRlZiI+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIgotCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcenV0aWwuYyI+Ci0JCQk8L0ZpbGU+Ci0JCTwvRmlsdGVyPgotCQk8RmlsdGVyCi0JCQlOYW1lPSJIZWFkZXIgRmlsZXMiCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcY3JjMzIuaCI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxkZWZsYXRlLmgiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mZmFzdC5oIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGluZmZpeGVkLmgiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcaW5mbGF0ZS5oIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGluZnRyZWVzLmgiPgotCQkJPC9GaWxlPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcdHJlZXMuaCI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx6Y29uZi5oIj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXHpsaWIuaCI+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlx6dXRpbC5oIj4KLQkJCTwvRmlsZT4KLQkJPC9GaWx0ZXI+Ci0JCTxGaWx0ZXIKLQkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgotCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiPgotCQkJPEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWJcd2luMzJcemxpYjEucmMiPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQk8L0ZpbGU+Ci0JCTwvRmlsdGVyPgotCQk8RmlsdGVyCi0JCQlOYW1lPSJBc3NlbWJsZXIgRmlsZXMgKFVuc3VwcG9ydGVkKSIKLQkJCUZpbHRlcj0iYXNtO29iajtjO2NwcDtjeHg7aDtocHA7aHh4Ij4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGNvbnRyaWJcbWFzbXg4Nlxndm1hdDMyLmFzbSI+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkRMTCBSZWxlYXNlfFdpbjMyIgotCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkRMTCBEZWJ1Z3xXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgRGVidWd8V2luMzIiCi0JCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KLQkJCQkJPFRvb2wKLQkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6bGliXGNvbnRyaWJcbWFzbXg4Nlxndm1hdDMyYy5jIj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiCi0JCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KLQkJCQkJPFRvb2wKLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJETEwgRGVidWd8V2luMzIiCi0JCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KLQkJCQkJPFRvb2wKLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJCTxGaWxlQ29uZmlndXJhdGlvbgotCQkJCQlOYW1lPSJMSUIgUmVsZWFzZXxXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemxpYlxjb250cmliXG1hc214ODZcaW5mZmFzMzIuYXNtIj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iRExMIFJlbGVhc2V8V2luMzIiCi0JCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJUUlVFIj4KLQkJCQkJPFRvb2wKLQkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+Ci0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KLQkJCQkJTmFtZT0iRExMIERlYnVnfFdpbjMyIgotCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkxJQiBSZWxlYXNlfFdpbjMyIgotCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0iVFJVRSI+Ci0JCQkJCTxUb29sCi0JCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIvPgotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+Ci0JCQkJPEZpbGVDb25maWd1cmF0aW9uCi0JCQkJCU5hbWU9IkxJQiBEZWJ1Z3xXaW4zMiIKLQkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9IlRSVUUiPgotCQkJCQk8VG9vbAotCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPgotCQkJPC9GaWxlPgotCQk8L0ZpbHRlcj4KLQkJPEZpbGUKLQkJCVJlbGF0aXZlUGF0aD0iUkVBRE1FLnR4dCI+Ci0JCTwvRmlsZT4KLQk8L0ZpbGVzPgotCTxHbG9iYWxzPgotCTwvR2xvYmFscz4KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Byb2plY3RzL3ZzdHVkaW8vUkVBRE1FLnR4dCBiL3Byb2plY3RzL3ZzdHVkaW8vUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhYmRiNy4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92c3R1ZGlvL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0KLVZpc3VhbFN0dWRpbyBpbnN0cnVjdGlvbnMKLQotbGlicG5nIHZlcnNpb24gMS42LjI0IC0gQXVndXN0IDQsIDIwMTYKLQotQ29weXJpZ2h0IChjKSAyMDEwLDIwMTMsMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLUZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLWFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLVRoaXMgZGlyZWN0b3J5ICBjb250YWlucyBzdXBwb3J0IGZvciBidWlsZGluZyBsaWJwbmcgdW5kZXIgTWljcm9Tb2Z0Ci1WaXN1YWxTdHVkaW8gMjAxMC4gIEl0IG1heSBhbHNvIHdvcmsgdW5kZXIgbGF0ZXIgdmVyc2lvbnMgb2YgVmlzdWFsU3R1ZGlvLgotWW91IHNob3VsZCBiZSBmYW1pbGlhciB3aXRoIFZpc3VhbFN0dWRpbyBiZWZvcmUgdXNpbmcgdGhpcyBkaXJlY3RvcnkuCi0KLUluaXRpYWwgcHJlcGFyYXRpb25zCi09PT09PT09PT09PT09PT09PT09PQotWW91IG11c3QgZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB6bGliLnByb3BzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGJ1aWxkCi13aXRoIHRoaXMgJ3NvbHV0aW9uJy4gIFBsZWFzZSByZWFkIGFuZCBlZGl0IHpsaWIucHJvcHMgZmlyc3QuICBZb3Ugd2lsbAotcHJvYmFibHkgbm90IGJlIGZhbWlsaWFyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHpsaWIucHJvcHMgLSBkbyBub3Qgd29ycnksCi1pdCBpcyBtb3N0bHkgaGFybWxlc3MuCi0KLVRoaXMgaXMgYWxsIHlvdSBuZWVkIHRvIGRvIHRvIGJ1aWxkIHRoZSAncmVsZWFzZScgYW5kICdyZWxlYXNlIGxpYnJhcnknCi1jb25maWd1cmF0aW9ucy4KLQotRGVidWdnaW5nCi09PT09PT09PT0KLVRoZSByZWxlYXNlIGNvbmZpZ3VyYXRpb25zIGRlZmF1bHQgdG8gL094IG9wdGltaXphdGlvbi4gIEZ1bGwgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBpcyBwcm9kdWNlZCAoaW4gdGhlIC5wZGIpLCBidXQgaWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gdGhlCi1vcHRpbWl6YXRpb24gbWF5IG1ha2UgaXQgZGlmZmljdWx0IHRvIGRlYnVnLiAgU2ltcGx5IHJlYnVpbGQgd2l0aCBhIGxvd2VyCi1vcHRpbWl6YXRpb24gbGV2ZWwgKGUuZy4gL09kLikKLQotTGlua2luZyB5b3VyIGFwcGxpY2F0aW9uCi09PT09PT09PT09PT09PT09PT09PT09PT0KLU5vcm1hbGx5IHlvdSBzaG91bGQgbGluayBhZ2FpbnN0IHRoZSAncmVsZWFzZScgY29uZmlndXJhdGlvbi4gIFRoaXMgYnVpbGRzIGEKLURMTCBmb3IgbGlicG5nIHdpdGggdGhlIGRlZmF1bHQgcnVudGltZSBvcHRpb25zIHVzZWQgYnkgVmlzdWFsIFN0dWRpbyAyMDEwLgotSW4gcGFydGljdWxhciB0aGUgcnVudGltZSBsaWJyYXJ5IGlzIHRoZSAiTXVsdGlUaHJlYWRlZCBETEwiIHZlcnNpb24uCi1JZiB5b3UgdXNlIFZpc3VhbCBTdHVkaW8gZGVmYXVsdHMgdG8gYnVpbGQgeW91ciBhcHBsaWNhdGlvbiB5b3Ugd2lsbCBoYXZlIG5vCi1wcm9ibGVtcy4KLQotSWYgeW91IGRvbid0IHVzZSB0aGUgVmlzdWFsIFN0dWRpbyBkZWZhdWx0cyB5b3VyIGFwcGxpY2F0aW9uIG11c3Qgc3RpbGwgYmUKLWJ1aWx0IHdpdGggdGhlIGRlZmF1bHQgcnVudGltZSBvcHRpb24gKC9NRCkuICBJZiwgZm9yIHNvbWUgcmVhc29uLCBpdCBpcyBub3QKLXRoZW4geW91ciBhcHBsaWNhdGlvbiB3aWxsIGNyYXNoIGluc2lkZSBsaWJwbmcxNi5kbGwgYXMgc29vbiBhcyBsaWJwbmcKLXRyaWVzIHRvIHJlYWQgZnJvbSBhIGZpbGUgaGFuZGxlIHlvdSBwYXNzIGluLgotCi1JZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBETEwsIGZvciBleGFtcGxlIGZvciBhIHZlcnkgc21hbGwgYXBwbGljYXRpb24sCi10aGUgJ3JlbGVhc2UgbGlicmFyeScgY29uZmlndXJhdGlvbiBtYXkgYmUgbW9yZSBhcHByb3ByaWF0ZS4gIFRoaXMgaXMgYnVpbHQKLXdpdGggYSBub24tc3RhbmRhcmQgcnVudGltZSBsaWJyYXJ5IC0gdGhlICJNdWx0aVRocmVhZGVkIiB2ZXJzaW9uLiAgV2hlbiB5b3UKLWJ1aWxkIHlvdXIgYXBwbGljYXRpb24gaXQgbXVzdCBiZSBjb21waWxlZCB3aXRoIHRoaXMgb3B0aW9uICgvTVQpLCBvdGhlcndpc2UKLWl0IHdpbGwgbm90IGJ1aWxkIChpZiB5b3UgYXJlIGx1Y2t5KSBvciBjcmFzaCAoaWYgeW91IGFyZSBub3QuKSBTZWUgdGhlCi1XQVJOSU5HIGZpbGUgdGhhdCBpcyBkaXN0cmlidXRlZCBhbG9uZyB3aXRoIHRoaXMgcmVhZG1lLnR4dC4KLQotU3RvcCByZWFkaW5nIGhlcmUKLT09PT09PT09PT09PT09PT09Ci1Zb3UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYnVpbGQgYSB3b3JraW5nIGFwcGxpY2F0aW9uLgotCi1EZWJ1ZyB2ZXJzaW9ucyBoYXZlIGxpbWl0ZWQgc3VwcG9ydAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVRoaXMgc29sdXRpb24gaW5jbHVkZXMgbGltaXRlZCBzdXBwb3J0IGZvciBkZWJ1ZyB2ZXJzaW9ucyBvZiBsaWJwbmcuICBZb3UKLWRvIG5vdCBuZWVkIHRoZXNlIHVubGVzcyB5b3VyIG93biBzb2x1dGlvbiBpdHNlbGYgdXNlcyBkZWJ1ZyBidWlsZHMgKGl0IGlzCi1mYXIgbW9yZSBlZmZlY3RpdmUgdG8gZGVidWcgb24gdGhlIHJlbGVhc2UgYnVpbGRzLCB0aGVyZSBpcyBubyBwb2ludCBidWlsZGluZwotYSBzcGVjaWFsIGRlYnVnIGJ1aWxkIHVubGVzcyB5b3UgaGF2ZSBoZWFwIGNvcnJ1cHRpb24gcHJvYmxlbXMgdGhhdCB5b3UgY2FuJ3QKLXRyYWNrIGRvd24uKQotCi1UaGUgZGVidWcgYnVpbGQgb2YgbGlicG5nIGlzIG1pbmltYWxseSBzdXBwb3J0ZWQuICBTdXBwb3J0IGZvciBkZWJ1ZyBidWlsZHMgb2YKLXpsaWIgaXMgYWxzbyBtaW5pbWFsLiAgWW91IHJlYWxseSBkb24ndCB3YW50IHRvIGRvIHRoaXMuCi0KLVdBUk5JTkcKLT09PT09PT0KLUxpYnBuZyAxLjYueCBkb2VzIG5vdCB1c2UgdGhlIGRlZmF1bHQgcnVuLXRpbWUgbGlicmFyeSB3aGVuIGJ1aWxkaW5nIHN0YXRpYwotbGlicmFyeSBidWlsZHMgb2YgbGlicG5nOyBpbnN0ZWFkIG9mIHRoZSBzaGFyZWQgRExMIHJ1bnRpbWUgaXQgdXNlcyBhIHN0YXRpYwotcnVudGltZS4gIElmIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGlzIG1ha2Ugc3VyZSB0byBjaGFuZ2UgdGhlIHNldHRpbmcgb24gYWxsIHRoZQotcmVsZXZhbnQgcHJvamVjdHM6Ci0KLSAgICBsaWJwbmcKLSAgICB6bGliCi0gICAgYWxsIHRoZSB0ZXN0IHByb2dyYW1zCi0KLVRoZSBydW50aW1lIGxpYnJhcnkgc2V0dGluZ3MgZm9yIGVhY2ggYnVpbGQgYXJlIGFzIGZvbGxvd3M6Ci0KLSAgICAgICAgICAgICAgIFJlbGVhc2UgICAgICAgIERlYnVnCi0gICAgRExMICAgICAgICAgL01EICAgICAgICAgICAgL01EZAotICAgIExpYnJhcnkgICAgIC9NVCAgICAgICAgICAgIC9NVGQKLQotTk9USUNFIHRoYXQgbGlicG5nIDEuNS54IGVycm9uZW91c2x5IHVzZWQgL01EIGZvciBEZWJ1ZyBETEwgYnVpbGRzOyBpZiB5b3UgdXNlZAotdGhlIGRlYnVnIGJ1aWxkcyBpbiB5b3VyIGFwcCBhbmQgeW91IGNoYW5nZWQgeW91ciBhcHAgdG8gdXNlIC9NRCB5b3Ugd2lsbCBuZWVkCi10byBjaGFuZ2UgaXQgYmFjayB0byAvTURkIGZvciBsaWJwbmcgMS42LjAgYW5kIGxhdGVyLgotCi1UaGUgVmlzdWFsIFN0dWRpbyAyMDEwIGRlZmF1bHRzIGZvciBhIFdpbjMyIERMTCBvciBTdGF0aWMgTGlicmFyeSBwcm9qZWN0IGFyZQotYXMgZm9sbG93czoKLQotICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSAgICAgRGVidWcKLSAgICBETEwgICAgICAgICAgICAgICAvTUQgICAgICAgICAvTURkCi0gICAgU3RhdGljIExpYnJhcnkgICAgL01EICAgICAgICAgL01EZAotCi1BbHNvLCBiZSBzdXJlIHRvIGJ1aWxkIGxpYnBuZywgemxpYiwgYW5kIHlvdXIgcHJvamVjdCBhbGwgZm9yIHRoZSBzYW1lCi1wbGF0Zm9ybSAoZS5nLiwgMzItYml0IG9yIDY0LWJpdCkuCmRpZmYgLS1naXQgYS9wcm9qZWN0cy92c3R1ZGlvL2xpYnBuZy9saWJwbmcudmN4cHJvaiBiL3Byb2plY3RzL3ZzdHVkaW8vbGlicG5nL2xpYnBuZy52Y3hwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZiNzE4Li4wMDAwMDAwCi0tLSBhL3Byb2plY3RzL3ZzdHVkaW8vbGlicG5nL2xpYnBuZy52Y3hwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICA8L0l0ZW1Hcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgotICAgIDxQcm9qZWN0R3VpZD57RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfTwvUHJvamVjdEd1aWQ+Ci0gICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgotICAgIDxSb290TmFtZXNwYWNlPmxpYnBuZzwvUm9vdE5hbWVzcGFjZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXHpsaWIucHJvcHMiIC8+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgotICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPC9DdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNjwvVGFyZ2V0TmFtZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+Ci0gICAgPEN1c3RvbUJ1aWxkQmVmb3JlVGFyZ2V0cyAvPgotICAgIDxUYXJnZXROYW1lPiQoUHJvamVjdE5hbWUpMTY8L1RhcmdldE5hbWU+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPC9DdXN0b21CdWlsZEJlZm9yZVRhcmdldHM+Ci0gICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNjwvVGFyZ2V0TmFtZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRCZWZvcmVUYXJnZXRzIC8+Ci0gICAgPFRhcmdldE5hbWU+JChQcm9qZWN0TmFtZSkxNjwvVGFyZ2V0TmFtZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Vc2U8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgICA8VHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT5mYWxzZTwvVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlckZpbGU+cG5ncHJpdi5oPC9QcmVjb21waWxlZEhlYWRlckZpbGU+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0M8L0NvbXBpbGVBcz4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPnpsaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPFZlcnNpb24+MTY8L1ZlcnNpb24+Ci0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Ci0gICAgPC9MaW5rPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+VXNlPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19XSU5ET1dTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KLSAgICAgIDxUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPmZhbHNlPC9UcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyRmlsZT5wbmdwcml2Lmg8L1ByZWNvbXBpbGVkSGVhZGVyRmlsZT4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQzwvQ29tcGlsZUFzPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4kKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgIDwvTGluaz4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Vc2U8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KLSAgICAgIDxUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPmZhbHNlPC9UcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyRmlsZT5wbmdwcml2Lmg8L1ByZWNvbXBpbGVkSGVhZGVyRmlsZT4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQzwvQ29tcGlsZUFzPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxPcHRpbWl6YXRpb24+RnVsbDwvT3B0aW1pemF0aW9uPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+Ci0gICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPnpsaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPFZlcnNpb24+MTY8L1ZlcnNpb24+Ci0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Ci0gICAgPC9MaW5rPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+VXNlPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgotICAgICAgPFRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU+ZmFsc2U8L1RyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXJGaWxlPnBuZ3ByaXYuaDwvUHJlY29tcGlsZWRIZWFkZXJGaWxlPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDPC9Db21waWxlQXM+Ci0gICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgotICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4kKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+Ci0gICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgotICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+Ci0gICAgPC9MaW5rPgotICAgIDxMaWI+Ci0gICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPgotICAgIDwvTGliPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmcuYyI+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+Q3JlYXRlPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5DcmVhdGU8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Q3JlYXRlPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ2Vycm9yLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdnZXQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ21lbS5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5ncHJlYWQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3JlYWQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3Jpby5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5ncnRyYW4uYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3J1dGlsLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmdzZXQuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3RyYW5zLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmd3aW8uYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3dyaXRlLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxwbmd3dHJhbi5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5ccG5nd3V0aWwuYyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxzY3JpcHRzXHBuZ3dpbi5yYyI+Ci0gICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+Ci0gICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KLSAgICA8L1Jlc291cmNlQ29tcGlsZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcm9qZWN0cy92c3R1ZGlvL3BuZ2xpYmNvbmYvcG5nbGliY29uZi52Y3hwcm9qIGIvcHJvamVjdHMvdnN0dWRpby9wbmdsaWJjb25mL3BuZ2xpYmNvbmYudmN4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjYzQ0MC4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92c3R1ZGlvL3BuZ2xpYmNvbmYvcG5nbGliY29uZi52Y3hwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gIDwvSXRlbUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+Ci0gICAgPFByb2plY3RHdWlkPntFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9PC9Qcm9qZWN0R3VpZD4KLSAgICA8Um9vdE5hbWVzcGFjZT5wbmdsaWJjb25mPC9Sb290TmFtZXNwYWNlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgotICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+Ci0gICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+Ci0gICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXHpsaWIucHJvcHMiIC8+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPEN1c3RvbUJ1aWxkQmVmb3JlVGFyZ2V0cz5CdWlsZDwvQ3VzdG9tQnVpbGRCZWZvcmVUYXJnZXRzPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8V2FybmluZ0xldmVsPiQoV2FybmluZ0xldmVsKTwvV2FybmluZ0xldmVsPgotICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+Ci0gICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxDb21tYW5kPmNvcHkgLi5cLi5cLi5cc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQgLi5cLi5cLi5ccG5nbGliY29uZi5oPC9Db21tYW5kPgotICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgotICAgIDxDdXN0b21CdWlsZFN0ZXA+Ci0gICAgICA8TWVzc2FnZT5HZW5lcmF0aW5nIHBuZ2xpYmNvbmYuaDwvTWVzc2FnZT4KLSAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KLSAgICA8Q3VzdG9tQnVpbGRTdGVwPgotICAgICAgPE91dHB1dHM+Li5cLi5cLi5ccG5nbGliY29uZi5oPC9PdXRwdXRzPgotICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgotICAgIDxDdXN0b21CdWlsZFN0ZXA+Ci0gICAgICA8SW5wdXRzPi4uXC4uXC4uXHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0PC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcm9qZWN0cy92c3R1ZGlvL3BuZ3N0ZXN0L3BuZ3N0ZXN0LnZjeHByb2ogYi9wcm9qZWN0cy92c3R1ZGlvL3BuZ3N0ZXN0L3BuZ3N0ZXN0LnZjeHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODEwZTMuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvdnN0dWRpby9wbmdzdGVzdC9wbmdzdGVzdC52Y3hwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICA8L0l0ZW1Hcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgotICAgIDxQcm9qZWN0R3VpZD57Mjc3QUM1N0YtMzEzQi00RDA2LUIxMTktQTNDREI2NzJEMkZGfTwvUHJvamVjdEd1aWQ+Ci0gICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgotICAgIDxSb290TmFtZXNwYWNlPnBuZ3N0ZXN0PC9Sb290TmFtZXNwYWNlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChTb2x1dGlvbkRpcilcemxpYi5wcm9wcyIgLz4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgotICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgotICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgotICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+Ci0gICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8V2FybmluZ0xldmVsPiQoV2FybmluZ0xldmVsKTwvV2FybmluZ0xldmVsPgotICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfQ09OU09MRTtQTkdfVVNFX0RMTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4kKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPiQoVHJlYXRXYXJuaW5nQXNFcnJvcik8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBsaWJwbmcgc2ltcGxpZmllZCBBUEkgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZSIgLS1zdHJpY3QgLS1sb2cgLS10b3VjaCAiJChJbnREaXIpcG5nc3Rlc3Qub3V0IiAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDIucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJybjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRid24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ5bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMW4zcDA4LnBuZzwvQ29tbWFuZD4KLSAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3N0ZXN0Lm91dDwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5nc3Rlc3QuZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8V2FybmluZ0xldmVsPiQoV2FybmluZ0xldmVsKTwvV2FybmluZ0xldmVsPgotICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPiQoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjt6bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBsaWJwbmcgc2ltcGxpZmllZCBBUEkgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZSIgLS1zdHJpY3QgLS1sb2cgLS10b3VjaCAiJChJbnREaXIpcG5nc3Rlc3Qub3V0IiAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAxLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc24zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc240YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Jhc242YTE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDIucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzA0LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiZ24yYzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJybjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRid24wZzE2LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ5bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4wZzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMW4zcDA4LnBuZzwvQ29tbWFuZD4KLSAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3N0ZXN0Lm91dDwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5nc3Rlc3QuZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFO1BOR19VU0VfRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPiQoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+Ci0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+Ci0gICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+Ci0gICAgPC9MaW5rPgotICAgIDxDdXN0b21CdWlsZFN0ZXA+Ci0gICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgbGlicG5nIHNpbXBsaWZpZWQgQVBJIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KLSAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmdzdGVzdC5leGUiIC0tc3RyaWN0IC0tbG9nIC0tdG91Y2ggIiQoSW50RGlyKXBuZ3N0ZXN0Lm91dCIgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmc8L0NvbW1hbmQ+Ci0gICAgICA8T3V0cHV0cz4kKEludERpcilwbmdzdGVzdC5vdXQ8L091dHB1dHM+Ci0gICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZTwvSW5wdXRzPgotICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPiQoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+Ci0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+Ci0gICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjt6bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+Ci0gICAgPC9MaW5rPgotICAgIDxDdXN0b21CdWlsZFN0ZXA+Ci0gICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgbGlicG5nIHNpbXBsaWZpZWQgQVBJIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KLSAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmdzdGVzdC5leGUiIC0tc3RyaWN0IC0tbG9nIC0tdG91Y2ggIiQoSW50RGlyKXBuZ3N0ZXN0Lm91dCIgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMS5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwMi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuM3AwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNGExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmEwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9iYXNuNmExNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjBnMDEucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4wZzAyLnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmJuMGcwNC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJibjJjMTYucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRiYm4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YmduMmMxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJnbjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRicm4yYzA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0YnduMGcxNi5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdGJ3bjNwMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRieW4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDBuMGcwOC5wbmcgLi4vLi4vLi4vY29udHJpYi9wbmdzdWl0ZS9mdHAwbjJjMDgucG5nIC4uLy4uLy4uL2NvbnRyaWIvcG5nc3VpdGUvZnRwMG4zcDA4LnBuZyAuLi8uLi8uLi9jb250cmliL3BuZ3N1aXRlL2Z0cDFuM3AwOC5wbmc8L0NvbW1hbmQ+Ci0gICAgICA8T3V0cHV0cz4kKEludERpcilwbmdzdGVzdC5vdXQ8L091dHB1dHM+Ci0gICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3N0ZXN0LmV4ZTwvSW5wdXRzPgotICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb250cmliXGxpYnRlc3RzXHBuZ3N0ZXN0LmMiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgotICA8L0ltcG9ydEdyb3VwPgotPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJvamVjdHMvdnN0dWRpby9wbmd0ZXN0L3BuZ3Rlc3QudmN4cHJvaiBiL3Byb2plY3RzL3ZzdHVkaW8vcG5ndGVzdC9wbmd0ZXN0LnZjeHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGYwN2QuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvdnN0dWRpby9wbmd0ZXN0L3BuZ3Rlc3QudmN4cHJvagorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIExpYnJhcnl8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWcgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UgTGlicmFyeXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlIExpYnJhcnk8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KLSAgICA8UHJvamVjdEd1aWQ+ezIyOEJBOTY1LTUwRDUtNDJCMi04QkNGLUFGQ0MyMjdFM0MxRH08L1Byb2plY3RHdWlkPgotICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KLSAgICA8Um9vdE5hbWVzcGFjZT5wbmd0ZXN0PC9Sb290TmFtZXNwYWNlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChTb2x1dGlvbkRpcilcemxpYi5wcm9wcyIgLz4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgotICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgotICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgotICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+Ci0gICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8V2FybmluZ0xldmVsPiQoV2FybmluZ0xldmVsKTwvV2FybmluZ0xldmVsPgotICAgICAgPE1pbmltYWxSZWJ1aWxkPmZhbHNlPC9NaW5pbWFsUmVidWlsZD4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4kKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPiQoVHJlYXRXYXJuaW5nQXNFcnJvcik8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Rlc3QuZXhlIiAuLlwuLlwuLlxwbmd0ZXN0LnBuZyAiJChJbnREaXIpcG5nb3V0LnBuZyI8L0NvbW1hbmQ+Ci0gICAgICA8T3V0cHV0cz4kKEludERpcilwbmdvdXQucG5nPC9PdXRwdXRzPgotICAgICAgPElucHV0cz4uLlwuLlwuLlxwbmd0ZXN0LnBuZzskKE91dERpcilwbmd0ZXN0LmV4ZTwvSW5wdXRzPgotICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFpMaWJTcmNEaXIpOy4uXC4uXC4uXHNjcmlwdHM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4kKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPiQoVHJlYXRXYXJuaW5nQXNFcnJvcik8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgotICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+Ci0gICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJwbmcxNi5saWI7emxpYi5saWI8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Ci0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Ci0gICAgPC9MaW5rPgotICAgIDxDdXN0b21CdWlsZFN0ZXA+Ci0gICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KLSAgICAgIDxDb21tYW5kPiIkKE91dERpcilwbmd0ZXN0LmV4ZSIgLi5cLi5cLi5ccG5ndGVzdC5wbmcgIiQoSW50RGlyKXBuZ291dC5wbmciPC9Db21tYW5kPgotICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5nb3V0LnBuZzwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+Li5cLi5cLi5ccG5ndGVzdC5wbmc7JChPdXREaXIpcG5ndGVzdC5leGU8L0lucHV0cz4KLSAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KLSAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgotICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoT3V0RGlyKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdGVzdCBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Rlc3QuZXhlIiAuLlwuLlwuLlxwbmd0ZXN0LnBuZyAiJChJbnREaXIpcG5nb3V0LnBuZyI8L0NvbW1hbmQ+Ci0gICAgICA8T3V0cHV0cz4kKEludERpcilwbmdvdXQucG5nPC9PdXRwdXRzPgotICAgICAgPElucHV0cz4uLlwuLlwuLlxwbmd0ZXN0LnBuZzskKE91dERpcilwbmd0ZXN0LmV4ZTwvSW5wdXRzPgotICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPENsQ29tcGlsZT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+ZmFsc2U8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPiQoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPgotICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+Ci0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+Ci0gICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KLSAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnBuZzE2LmxpYjt6bGliLmxpYjwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KLSAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+Ci0gICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKE91dERpcik8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Ci0gICAgPC9MaW5rPgotICAgIDxDdXN0b21CdWlsZFN0ZXA+Ci0gICAgICA8TWVzc2FnZT5FeGVjdXRpbmcgUE5HIHRlc3QgcHJvZ3JhbTwvTWVzc2FnZT4KLSAgICAgIDxDb21tYW5kPiQoT3V0RGlyKXBuZ3Rlc3QuZXhlIC4uXC4uXC4uXHBuZ3Rlc3QucG5nICQoSW50RGlyKXBuZ291dC5wbmc8L0NvbW1hbmQ+Ci0gICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndGVzdC5leGUiIC4uXC4uXC4uXHBuZ3Rlc3QucG5nICIkKEludERpcilwbmdvdXQucG5nIjwvQ29tbWFuZD4KLSAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ291dC5wbmc8L091dHB1dHM+Ci0gICAgICA8SW5wdXRzPi4uXC4uXC4uXHBuZ3Rlc3QucG5nOyQoT3V0RGlyKXBuZ3Rlc3QuZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHBuZ3Rlc3QuYyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcm9qZWN0cy92c3R1ZGlvL3BuZ3Vua25vd24vcG5ndW5rbm93bi52Y3hwcm9qIGIvcHJvamVjdHMvdnN0dWRpby9wbmd1bmtub3duL3BuZ3Vua25vd24udmN4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5ZDY2Mi4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92c3R1ZGlvL3BuZ3Vua25vd24vcG5ndW5rbm93bi52Y3hwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWcgTGlicmFyeXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZyBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSBMaWJyYXJ5fFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICA8L0l0ZW1Hcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgotICAgIDxQcm9qZWN0R3VpZD57QzVEMzE1NkMtOEM4Qy00OTM2LUIzNUYtMkI4MjlCQTM2RkVDfTwvUHJvamVjdEd1aWQ+Ci0gICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgotICAgIDxSb290TmFtZXNwYWNlPnBuZ3Vua25vd248L1Jvb3ROYW1lc3BhY2U+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVx6bGliLnByb3BzIiAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+Ci0gICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFO1BOR19VU0VfRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPiQoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgICA8Q3VzdG9tQnVpbGRTdGVwPgotICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB2YWxpZGF0aW9uIHByb2dyYW08L01lc3NhZ2U+Ci0gICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndW5rbm93bi5leGUiIC0tc3RyaWN0IC0tZGVmYXVsdCAtLXRvdWNoICIkKEludERpcilwbmd1bmtub3duLm91dCIgLi4vLi4vLi4vcG5ndGVzdC5wbmc8L0NvbW1hbmQ+Ci0gICAgICA8T3V0cHV0cz4kKEludERpcilwbmd1bmtub3duLm91dDwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5ndW5rbm93bi5leGU8L0lucHV0cz4KLSAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliO3psaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgICA8Q3VzdG9tQnVpbGRTdGVwPgotICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB2YWxpZGF0aW9uIHByb2dyYW08L01lc3NhZ2U+Ci0gICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndW5rbm93bi5leGUiIC0tc3RyaWN0IC0tZGVmYXVsdCAtLXRvdWNoICIkKEludERpcilwbmd1bmtub3duLm91dCIgLi4vLi4vLi4vcG5ndGVzdC5wbmc8L0NvbW1hbmQ+Ci0gICAgICA8T3V0cHV0cz4kKEludERpcilwbmd1bmtub3duLm91dDwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5ndW5rbm93bi5leGU8L0lucHV0cz4KLSAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7UE5HX1VTRV9ETEw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KLSAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlIiAtLXN0cmljdCAtLWRlZmF1bHQgLS10b3VjaCAiJChJbnREaXIpcG5ndW5rbm93bi5vdXQiIC4uLy4uLy4uL3BuZ3Rlc3QucG5nPC9Db21tYW5kPgotICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5ndW5rbm93bi5vdXQ8L091dHB1dHM+Ci0gICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KLSAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliO3psaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlIiAtLXN0cmljdCAtLWRlZmF1bHQgLS10b3VjaCAiJChJbnREaXIpcG5ndW5rbm93bi5vdXQiIC4uLy4uLy4uL3BuZ3Rlc3QucG5nPC9Db21tYW5kPgotICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5ndW5rbm93bi5vdXQ8L091dHB1dHM+Ci0gICAgICA8SW5wdXRzPiQoT3V0RGlyKXBuZ3Vua25vd24uZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNvbnRyaWJcbGlidGVzdHNccG5ndW5rbm93bi5jIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KLSAgPC9JbXBvcnRHcm91cD4KLTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Byb2plY3RzL3ZzdHVkaW8vcG5ndmFsaWQvcG5ndmFsaWQudmN4cHJvaiBiL3Byb2plY3RzL3ZzdHVkaW8vcG5ndmFsaWQvcG5ndmFsaWQudmN4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExN2QyOS4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92c3R1ZGlvL3BuZ3ZhbGlkL3BuZ3ZhbGlkLnZjeHByb2oKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyBMaWJyYXJ5fFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnIExpYnJhcnk8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIExpYnJhcnl8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZSBMaWJyYXJ5PC9Db25maWd1cmF0aW9uPgotICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgotICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KLSAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gIDwvSXRlbUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+Ci0gICAgPFByb2plY3RHdWlkPns5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9PC9Qcm9qZWN0R3VpZD4KLSAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+Ci0gICAgPFJvb3ROYW1lc3BhY2U+cG5ndmFsaWQ8L1Jvb3ROYW1lc3BhY2U+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKFNvbHV0aW9uRGlyKVx6bGliLnByb3BzIiAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+Ci0gICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KLSAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KLSAgICA8Q3VzdG9tQnVpbGRBZnRlclRhcmdldHMgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+Ci0gICAgPEN1c3RvbUJ1aWxkQWZ0ZXJUYXJnZXRzIC8+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZSBMaWJyYXJ5fFdpbjMyJyI+Ci0gICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgotICAgIDxDdXN0b21CdWlsZEFmdGVyVGFyZ2V0cyAvPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFO1BOR19VU0VfRExMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoWkxpYlNyY0Rpcik7Li5cLi5cLi5cc2NyaXB0czslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgotICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPiQoRGlzYWJsZVNwZWNpZmljV2FybmluZ3MpPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPgotICAgICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+JChUcmVhdFdhcm5pbmdBc0Vycm9yKTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliO3psaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgICA8Q3VzdG9tQnVpbGRTdGVwPgotICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB2YWxpZGF0aW9uIHByb2dyYW08L01lc3NhZ2U+Ci0gICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndmFsaWQuZXhlIiAtLXRvdWNoICIkKEludERpcilwbmd2YWxpZC5vdXQiPC9Db21tYW5kPgotICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5ndmFsaWQub3V0PC9PdXRwdXRzPgotICAgICAgPElucHV0cz4kKE91dERpcilwbmd2YWxpZC5leGU8L0lucHV0cz4KLSAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8TWluaW1hbFJlYnVpbGQ+ZmFsc2U8L01pbmltYWxSZWJ1aWxkPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgotICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPmZhbHNlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliO3psaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgIDwvTGluaz4KLSAgICA8Q3VzdG9tQnVpbGRTdGVwPgotICAgICAgPE1lc3NhZ2U+RXhlY3V0aW5nIFBORyB2YWxpZGF0aW9uIHByb2dyYW08L01lc3NhZ2U+Ci0gICAgICA8Q29tbWFuZD4iJChPdXREaXIpcG5ndmFsaWQuZXhlIiAtLXRvdWNoICIkKEludERpcilwbmd2YWxpZC5vdXQiPC9Db21tYW5kPgotICAgICAgPE91dHB1dHM+JChJbnREaXIpcG5ndmFsaWQub3V0PC9PdXRwdXRzPgotICAgICAgPElucHV0cz4kKE91dERpcilwbmd2YWxpZC5leGU8L0lucHV0cz4KLSAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7UE5HX1VTRV9ETEw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KLSAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliO3psaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3ZhbGlkLmV4ZSIgLS10b3VjaCAiJChJbnREaXIpcG5ndmFsaWQub3V0IjwvQ29tbWFuZD4KLSAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3ZhbGlkLm91dDwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5ndmFsaWQuZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkZ1bGw8L09wdGltaXphdGlvbj4KLSAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChaTGliU3JjRGlyKTsuLlwuLlwuLlxzY3JpcHRzOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPgotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KLSAgICAgIDxNaW5pbWFsUmVidWlsZD5mYWxzZTwvTWluaW1hbFJlYnVpbGQ+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPExpbms+Ci0gICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KLSAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgotICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlicG5nMTYubGliO3psaWIubGliPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgotICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChPdXREaXIpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgotICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+VXNlTGlua1RpbWVDb2RlR2VuZXJhdGlvbjwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4KLSAgICA8L0xpbms+Ci0gICAgPEN1c3RvbUJ1aWxkU3RlcD4KLSAgICAgIDxNZXNzYWdlPkV4ZWN1dGluZyBQTkcgdmFsaWRhdGlvbiBwcm9ncmFtPC9NZXNzYWdlPgotICAgICAgPENvbW1hbmQ+IiQoT3V0RGlyKXBuZ3ZhbGlkLmV4ZSIgLS10b3VjaCAiJChJbnREaXIpcG5ndmFsaWQub3V0IjwvQ29tbWFuZD4KLSAgICAgIDxPdXRwdXRzPiQoSW50RGlyKXBuZ3ZhbGlkLm91dDwvT3V0cHV0cz4KLSAgICAgIDxJbnB1dHM+JChPdXREaXIpcG5ndmFsaWQuZXhlPC9JbnB1dHM+Ci0gICAgPC9DdXN0b21CdWlsZFN0ZXA+Ci0gIDwvSXRlbURlZmluaXRpb25Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNvbnRyaWJcbGlidGVzdHNccG5ndmFsaWQuYyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcm9qZWN0cy92c3R1ZGlvL3ZzdHVkaW8uc2xuIGIvcHJvamVjdHMvdnN0dWRpby92c3R1ZGlvLnNsbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwYjFiYS4uMDAwMDAwMAotLS0gYS9wcm9qZWN0cy92c3R1ZGlvL3ZzdHVkaW8uc2xuCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLU1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCi0jIFZpc3VhbCBTdHVkaW8gMjAxMAotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ6bGliIiwgInpsaWJcemxpYi52Y3hwcm9qIiwgIns2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9IgotRW5kUHJvamVjdAotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJwbmdsaWJjb25mIiwgInBuZ2xpYmNvbmZccG5nbGliY29uZi52Y3hwcm9qIiwgIntFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9IgotRW5kUHJvamVjdAotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJwbmciLCAibGlicG5nXGxpYnBuZy52Y3hwcm9qIiwgIntENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9IgotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKLQkJezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0gPSB7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfQotCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fSA9IHtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9Ci0JRW5kUHJvamVjdFNlY3Rpb24KLUVuZFByb2plY3QKLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAicG5ndGVzdCIsICJwbmd0ZXN0XHBuZ3Rlc3QudmN4cHJvaiIsICJ7MjI4QkE5NjUtNTBENS00MkIyLThCQ0YtQUZDQzIyN0UzQzFEfSIKLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0Ci0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9ID0gezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0KLQkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0gPSB7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fQotCQl7RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfSA9IHtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9Ci0JRW5kUHJvamVjdFNlY3Rpb24KLUVuZFByb2plY3QKLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAicG5ndmFsaWQiLCAicG5ndmFsaWRccG5ndmFsaWQudmN4cHJvaiIsICJ7OUIzNkI2RkUtN0ZDMC00MzRGLUE3MUYtQkJFRjgwOTlGMUQ4fSIKLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0Ci0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9ID0gezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0KLQkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0gPSB7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fQotCQl7RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfSA9IHtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9Ci0JRW5kUHJvamVjdFNlY3Rpb24KLUVuZFByb2plY3QKLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAicG5nc3Rlc3QiLCAicG5nc3Rlc3RccG5nc3Rlc3QudmN4cHJvaiIsICJ7Mjc3QUM1N0YtMzEzQi00RDA2LUIxMTktQTNDREI2NzJEMkZGfSIKLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0Ci0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9ID0gezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0KLQkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0gPSB7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fQotCQl7RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfSA9IHtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9Ci0JRW5kUHJvamVjdFNlY3Rpb24KLUVuZFByb2plY3QKLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAicG5ndW5rbm93biIsICJwbmd1bmtub3duXHBuZ3Vua25vd24udmN4cHJvaiIsICJ7QzVEMzE1NkMtOEM4Qy00OTM2LUIzNUYtMkI4MjlCQTM2RkVDfSIKLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0Ci0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9ID0gezYwRjg5OTU1LTkxQzYtM0EzNi04MDAwLTEzQzU5MkZFQzJERn0KLQkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0gPSB7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fQotCQl7RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfSA9IHtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9Ci0JRW5kUHJvamVjdFNlY3Rpb24KLUVuZFByb2plY3QKLUdsb2JhbAotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCi0JCURlYnVnIExpYnJhcnl8V2luMzIgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCi0JCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzIKLQkJUmVsZWFzZSBMaWJyYXJ5fFdpbjMyID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCi0JRW5kR2xvYmFsU2VjdGlvbgotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCi0JCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LkRlYnVnIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgTGlicmFyeXxXaW4zMgotCQl7RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfS5EZWJ1ZyBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCi0JCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCi0JCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgotCQl7RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXtENjk3MzA3Ni05MzE3LTRFRjItQTBCOC1CN0ExOEFDMDcxM0V9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7RDY5NzMwNzYtOTMxNy00RUYyLUEwQjgtQjdBMThBQzA3MTNFfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LkRlYnVnIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgTGlicmFyeXxXaW4zMgotCQl7MjI4QkE5NjUtNTBENS00MkIyLThCQ0YtQUZDQzIyN0UzQzFEfS5EZWJ1ZyBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCi0JCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCi0JCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgotCQl7MjI4QkE5NjUtNTBENS00MkIyLThCQ0YtQUZDQzIyN0UzQzFEfS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXsyMjhCQTk2NS01MEQ1LTQyQjItOEJDRi1BRkNDMjI3RTNDMUR9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7MjI4QkE5NjUtNTBENS00MkIyLThCQ0YtQUZDQzIyN0UzQzFEfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LkRlYnVnIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgTGlicmFyeXxXaW4zMgotCQl7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfS5EZWJ1ZyBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCi0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCi0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgotCQl7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXs2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7NjBGODk5NTUtOTFDNi0zQTM2LTgwMDAtMTNDNTkyRkVDMkRGfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LkRlYnVnIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgTGlicmFyeXxXaW4zMgotCQl7OUIzNkI2RkUtN0ZDMC00MzRGLUE3MUYtQkJFRjgwOTlGMUQ4fS5EZWJ1ZyBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCi0JCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCi0JCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgotCQl7OUIzNkI2RkUtN0ZDMC00MzRGLUE3MUYtQkJFRjgwOTlGMUQ4fS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXs5QjM2QjZGRS03RkMwLTQzNEYtQTcxRi1CQkVGODA5OUYxRDh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7OUIzNkI2RkUtN0ZDMC00MzRGLUE3MUYtQkJFRjgwOTlGMUQ4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9LkRlYnVnIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fS5EZWJ1ZyBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKLQkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKLQkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKLQkJe0VCMzM1NjZFLURBN0YtNEQyOC05MDc3LTg4QzBCN0M3N0UzNX0uUmVsZWFzZSBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXtFQjMzNTY2RS1EQTdGLTREMjgtOTA3Ny04OEMwQjdDNzdFMzV9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7RUIzMzU2NkUtREE3Ri00RDI4LTkwNzctODhDMEI3Qzc3RTM1fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LkRlYnVnIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgTGlicmFyeXxXaW4zMgotCQl7Mjc3QUM1N0YtMzEzQi00RDA2LUIxMTktQTNDREI2NzJEMkZGfS5EZWJ1ZyBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCi0JCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCi0JCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgotCQl7Mjc3QUM1N0YtMzEzQi00RDA2LUIxMTktQTNDREI2NzJEMkZGfS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXsyNzdBQzU3Ri0zMTNCLTREMDYtQjExOS1BM0NEQjY3MkQyRkZ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7Mjc3QUM1N0YtMzEzQi00RDA2LUIxMTktQTNDREI2NzJEMkZGfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LkRlYnVnIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgTGlicmFyeXxXaW4zMgotCQl7QzVEMzE1NkMtOEM4Qy00OTM2LUIzNUYtMkI4MjlCQTM2RkVDfS5EZWJ1ZyBMaWJyYXJ5fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBMaWJyYXJ5fFdpbjMyCi0JCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCi0JCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgotCQl7QzVEMzE1NkMtOEM4Qy00OTM2LUIzNUYtMkI4MjlCQTM2RkVDfS5SZWxlYXNlIExpYnJhcnl8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LlJlbGVhc2UgTGlicmFyeXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBMaWJyYXJ5fFdpbjMyCi0JCXtDNUQzMTU2Qy04QzhDLTQ5MzYtQjM1Ri0yQjgyOUJBMzZGRUN9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgotCQl7QzVEMzE1NkMtOEM4Qy00OTM2LUIzNUYtMkI4MjlCQTM2RkVDfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCi0JRW5kR2xvYmFsU2VjdGlvbgotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQotCUVuZEdsb2JhbFNlY3Rpb24KLUVuZEdsb2JhbApkaWZmIC0tZ2l0IGEvcHJvamVjdHMvdnN0dWRpby96bGliLnByb3BzIGIvcHJvamVjdHMvdnN0dWRpby96bGliLnByb3BzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM3MGIyLi4wMDAwMDAwCi0tLSBhL3Byb2plY3RzL3ZzdHVkaW8vemxpYi5wcm9wcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gKiB6bGliLnByb3BzIC0gbG9jYXRpb24gb2YgemxpYiBzb3VyY2UKLSAqCi0gKiBsaWJwbmcgdmVyc2lvbiAxLjYuMjQgLSBBdWd1c3QgNCwgMjAxNgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDExIEdsZW5uIFJhbmRlcnMtUGVocnNvbgotICoKLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0gKiBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0gKiBZb3UgbXVzdCBlZGl0IHRoaXMgZmlsZSB0byByZWNvcmQgdGhlIGxvY2F0aW9uIG9mIHRoZSB6bGliCi0gKiBzb3VyY2UgY29kZS4KLSAtLT4KLQotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiCi0gICB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgotICAgIDwhLS0gUGxhY2UgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2Ugb2YgemxpYiB1c2VkIGZvcgotCSBkZWJ1Z2dpbmcgaW4gdGhpcyBwcm9wZXJ0eS4KLQotICAgICAgICAgVGhlIGRpcmVjdG9yeSBuZWVkIG9ubHkgY29udGFpbiB0aGUgJy5jJyBhbmQgJy5oJyBmaWxlcyBmcm9tIHRoZQotCSBzb3VyY2UuCi0KLQkgSWYgeW91IHVzZSBhIHJlbGF0aXZlIGRpcmVjdG9yeSBuYW1lIChhcyBiZWxvdykgdGhlbiBpdCBtdXN0IGJlCi0JIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yaWVzOyB0aGVzZSBhcmUgb25lIGxldmVsIGRlZXBlciB0aGFuCi0JIHRoZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoaXMgZmlsZS4KLQotCSBJZiB0aGUgdmVyc2lvbiBvZiB6bGliIHlvdSB1c2UgZG9lcyBub3QgbWF0Y2ggdGhhdCB1c2VkIHdoZW4gdGhlCi0JIGRpc3RyaWJ1dGlvbiB3YXMgYnVpbHQgeW91IHdpbGwgZ2V0IHdhcm5pbmdzIGZyb20gcG5ndGVzdCB0aGF0IHRoZSB6bGliCi0JIHZlcnNpb25zIGRvIG5vdCBtYXRjaC4gIFRoZSB6bGliIHZlcnNpb24gdXNlZCBpbiB0aGlzIGJ1aWxkIGlzIHJlY29yZGVkCi0JIGJlbG93OgotICAgICAtLT4KLSAgICA8WkxpYlNyY0Rpcj4uLlwuLlwuLlwuLlx6bGliLTEuMi44PC9aTGliU3JjRGlyPgotCi0gICAgPCEtLSBUaGUgZm9sbG93aW5nIGxpbmUgYWxsb3dzIGNvbXBpbGF0aW9uIGZvciBhbiBBUk0gdGFyZ2V0IHdpdGggVmlzdWFsCi0gICAgICAgICBTdHVkaW8gMjAxMi4gIE5vdGljZSB0aGF0IHRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgVmlzdWFsIFN0dWRpbwotICAgICAgICAgMjAxMiBJREUgYW5kIHRoYXQgdGhlIHByb2dyYW1zIHRoYXQgcmVzdWx0IGNhbm5vdCBiZSBydW4gdW5sZXNzIHRoZXkKLSAgICAgICAgIHNpZ25lZCBieSBNaWNyb3NvZnQuICBUaGlzIGlzIHRoZXJlZm9yZSB1bnRlc3RlZDsgb25seSBNaWNyb3NvZnQgY2FuCi0gICAgICAgICB0ZXN0IGl0OgotICAgICAtLT4KLSAgICA8V2luZG93c1NES0Rlc2t0b3BBUk1TdXBwb3J0PnRydWU8L1dpbmRvd3NTREtEZXNrdG9wQVJNU3VwcG9ydD4KLQotICAgIDwhLS0gVGhlIGZvbGxvd2luZyBsaW5lcyBwcm92aWRlIGEgZ2xvYmFsIChzb2x1dGlvbiBsZXZlbCkgY29udHJvbCBvZiB0aGUKLSAgICAgICAgIHdhcm5pbmdzIGlzc3VlZCBieSB0aGUgY29tcGlsZXIsIHRoZXNlIGFyZSB1c2VkIGluIHRoZSBpbmRpdmlkdWFsCi0gICAgICAgICBwcm9qZWN0IGZpbGVzICgqLyoudmN4cHJvaikgd2l0aCwgZm9yIHpsaWIsIHNvbWUgZXh0cmEgZGlzYWJsZXMuCi0KLSAgICAgICAgIERpZmZlcmVudCB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvIG1heSByZXF1aXJlIGRpZmZlcmVudCBzZXR0aW5ncywKLSAgICAgICAgIHRoZXNlIHNldHRpbmdzIHdvcmsgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMTMuICBKdXN0IHNldAotICAgICAgICAgVHJlYXRXYXJuaW5nQXNFcnJvciB0byBmYWxzZSB0byBjaGVjayB0aGUgYnVpbGQgd2l0aG91dCBmYWlsaW5nIG9uCi0gICAgICAgICBlcnJvcnMuCi0gICAgIC0tPgotICAgPFdhcm5pbmdMZXZlbD5FbmFibGVBbGxXYXJuaW5nczwvV2FybmluZ0xldmVsPgotICAgPFRyZWF0V2FybmluZ0FzRXJyb3I+dHJ1ZTwvVHJlYXRXYXJuaW5nQXNFcnJvcj4KLSAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MjU1OzQ2Njg7NDcxMDs0NzExOzQ3NDY7NDgyMDs0OTk2PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJvamVjdHMvdnN0dWRpby96bGliL3psaWIudmN4cHJvaiBiL3Byb2plY3RzL3ZzdHVkaW8vemxpYi96bGliLnZjeHByb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjE2ZGIuLjAwMDAwMDAKLS0tIGEvcHJvamVjdHMvdnN0dWRpby96bGliL3psaWIudmN4cHJvagorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIExpYnJhcnl8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWcgTGlicmFyeTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UgTGlicmFyeXxXaW4zMiI+Ci0gICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlIExpYnJhcnk8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgotICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+Ci0gICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgotICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KLSAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGFkbGVyMzIuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcY29tcHJlc3MuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcY3JjMzIuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcZGVmbGF0ZS5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxpbmZiYWNrLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXGluZmZhc3QuYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoWkxpYlNyY0RpcilcaW5mbGF0ZS5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVxpbmZ0cmVlcy5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVx0cmVlcy5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChaTGliU3JjRGlyKVx1bmNvbXByLmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFpMaWJTcmNEaXIpXHp1dGlsLmMiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+Ci0gICAgPFByb2plY3RHdWlkPns2MEY4OTk1NS05MUM2LTNBMzYtODAwMC0xM0M1OTJGRUMyREZ9PC9Qcm9qZWN0R3VpZD4KLSAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+Ci0gICAgPFJvb3ROYW1lc3BhY2U+emxpYjwvUm9vdE5hbWVzcGFjZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXHpsaWIucHJvcHMiIC8+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+Ci0gICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KLSAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgotICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KLSAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KLSAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiAvPgotICA8L0ltcG9ydEdyb3VwPgotICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIExpYnJhcnl8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIC8+Ci0gIDwvSW1wb3J0R3JvdXA+Ci0gIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KLSAgPC9JbXBvcnRHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWcgTGlicmFyeXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19XSU5ET1dTO1pfU09MTzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KLSAgICAgIDxXYXJuaW5nTGV2ZWw+JChXYXJuaW5nTGV2ZWwpPC9XYXJuaW5nTGV2ZWw+Ci0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+Ci0gICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk7NDEyNzs0MTMxOzQyNDI7NDI0NDwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgPC9MaW5rPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8Q2xDb21waWxlPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfV0lORE9XUztaX1NPTE87JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFdhcm5pbmdMZXZlbD4kKFdhcm5pbmdMZXZlbCk8L1dhcm5pbmdMZXZlbD4KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4KLSAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj50cnVlPC9Ccm93c2VJbmZvcm1hdGlvbj4KLSAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KLSAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4kKERpc2FibGVTcGVjaWZpY1dhcm5pbmdzKTs0MTI3OzQxMzE7NDI0Mjs0MjQ0PC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4KLSAgICAgIDxUcmVhdFdhcm5pbmdBc0Vycm9yPiQoVHJlYXRXYXJuaW5nQXNFcnJvcik8L1RyZWF0V2FybmluZ0FzRXJyb3I+Ci0gICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8TGluaz4KLSAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+Ci0gICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgotICAgIDwvTGluaz4KLSAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgotICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgTGlicmFyeXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8V2FybmluZ0xldmVsPiQoV2FybmluZ0xldmVsKTwvV2FybmluZ0xldmVsPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgotICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk7NDEyNzs0MTMxOzQyNDI7NDI0NDwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztaX1NPTE87JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgPC9MaW5rPgotICAgIDxMaWI+Ci0gICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPgotICAgIDwvTGliPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgotICAgIDxDbENvbXBpbGU+Ci0gICAgICA8V2FybmluZ0xldmVsPiQoV2FybmluZ0xldmVsKTwvV2FybmluZ0xldmVsPgotICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PgotICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgotICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+Ci0gICAgICA8QnJvd3NlSW5mb3JtYXRpb24+dHJ1ZTwvQnJvd3NlSW5mb3JtYXRpb24+Ci0gICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+Ci0gICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+JChEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncyk7NDEyNzs0MTMxOzQyNDI7NDI0NDwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+Ci0gICAgICA8VHJlYXRXYXJuaW5nQXNFcnJvcj4kKFRyZWF0V2FybmluZ0FzRXJyb3IpPC9UcmVhdFdhcm5pbmdBc0Vycm9yPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztaX1NPTE87JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxMaW5rPgotICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4KLSAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+Ci0gICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgotICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+Ci0gICAgPC9MaW5rPgotICAgIDxMaWI+Ci0gICAgICA8TGlua1RpbWVDb2RlR2VuZXJhdGlvbj50cnVlPC9MaW5rVGltZUNvZGVHZW5lcmF0aW9uPgotICAgIDwvTGliPgotICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+Ci0gIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9zY3JpcHRzL1JFQURNRS50eHQgYi9zY3JpcHRzL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTMzZjIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotCi1NYWtlZmlsZXMgZm9yICBsaWJwbmcgdmVyc2lvbiAxLjYuMjQgLSBBdWd1c3QgNCwgMjAxNgotCi1wbmdsaWJjb25mLmgucHJlYnVpbHQgICAgICAgPT4gIFN0b3JlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gbWFrZWZpbGUubGludXggICAgPT4gIExpbnV4L0VMRiBtYWtlZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAoZ2NjLCBjcmVhdGVzIGxpYnBuZzE2LnNvLjE2LjEuNi4yNCkKLSBtYWtlZmlsZS5nY2MgICAgICA9PiAgR2VuZXJpYyBtYWtlZmlsZSAoZ2NjLCBjcmVhdGVzIHN0YXRpYyBsaWJwbmcuYSkKLSBtYWtlZmlsZS5rbnIgICAgICA9PiAgQXJjaGFpYyBVTklYIE1ha2VmaWxlIHRoYXQgY29udmVydHMgZmlsZXMgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICBhbnNpMmtuciAoUmVxdWlyZXMgYW5zaTJrbnIuYyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgIGZ0cDovL2Z0cC5jcy53aXNjLmVkdS9naG9zdCkKLSBtYWtlZmlsZS5hY29ybiAgICA9PiAgQWNvcm4gbWFrZWZpbGUKLSBtYWtlZmlsZS5haXggICAgICA9PiAgQUlYL2djYyBtYWtlZmlsZQotIG1ha2VmaWxlLmFtaWdhICAgID0+ICBBbWlnYSBtYWtlZmlsZQotIG1ha2VmaWxlLmF0YXJpICAgID0+ICBBdGFyaSBtYWtlZmlsZQotIG1ha2VmaWxlLmJjMzIgICAgID0+ICAzMi1iaXQgQm9ybGFuZCBDKysgKGFsbCBtb2R1bGVzIGNvbXBpbGVkIGluIEMgbW9kZSkKLSBtYWtlZmlsZS5iZW9zICAgICA9PiAgYmVvcyBtYWtlZmlsZQotIG1ha2VmaWxlLmJvciAgICAgID0+ICBCb3JsYW5kIG1ha2VmaWxlICh1c2VzIGJjYykKLSBtYWtlZmlsZS5jZWdjYyAgICA9PiAgbWluZ2UzMmNlIGZvciBXaW5kb3dzIENFIG1ha2VmaWxlCi0gbWFrZWZpbGUuZGFyd2luICAgPT4gIERhcndpbiBtYWtlZmlsZSwgY2FuIHVzZSBvbiBNYWNvc1gKLSBtYWtlZmlsZS5kZWMgICAgICA9PiAgREVDIEFscGhhIFVOSVggbWFrZWZpbGUKLSBtYWtlZmlsZS5kajIgICAgICA9PiAgREpHUFAgMiBtYWtlZmlsZQotIG1ha2VmaWxlLmZyZWVic2QgID0+ICBGcmVlQlNEIG1ha2VmaWxlCi0gbWFrZWZpbGUuZ2NjICAgICAgPT4gIEdlbmVyaWMgZ2NjIG1ha2VmaWxlCi0gbWFrZWZpbGUuaHBnY2MgICAgPT4gIEhQVVggbWFrZWZpbGUgdXNpbmcgZ2NjCi0gbWFrZWZpbGUuaHB1eCAgICAgPT4gIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgbWFrZWZpbGUKLSBtYWtlZmlsZS5ocDY0ICAgICA9PiAgSFBVWCAoMTAuMjAgYW5kIDExLjAwKSBtYWtlZmlsZSwgNjQtYml0Ci0gbWFrZWZpbGUuaWJtYyAgICAgPT4gIElCTSBDL0MrKyB2ZXJzaW9uIDMueCBmb3IgV2luMzIgYW5kIE9TLzIgKHN0YXRpYykKLSBtYWtlZmlsZS5pbnRlbCAgICA9PiAgSW50ZWwgQy9DKysgdmVyc2lvbiA0LjAgYW5kIGxhdGVyCi0gbWFrZWZpbGUubWlwcyAgICAgPT4gIE1JUFMgbWFrZWZpbGUKLSBtYWtlZmlsZS5tc2MgICAgICA9PiAgTWljcm9zb2Z0IEMgbWFrZWZpbGUKLSBtYWtlZmlsZS5uZXRic2QgICA9PiAgTmV0QlNEL2NjIG1ha2VmaWxlLCBtYWtlcyBsaWJwbmcuc28uCi0gbWFrZWZpbGUub3BlbmJzZCAgPT4gIE9wZW5CU0QgbWFrZWZpbGUKLSBtYWtlZmlsZS5vczIgICAgICA9PiAgT1MvMiBNYWtlZmlsZSAoZ2NjIGFuZCBlbXgsIHJlcXVpcmVzIGxpYnBuZy5kZWYpCi0gbWFrZWZpbGUuc2NvICAgICAgPT4gIEZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCi0gbWFrZWZpbGUuc2dnY2MgICAgPT4gIFNpbGljb24gR3JhcGhpY3MgKGdjYywKLSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlcyBsaWJwbmcxNi5zby4xNi4xLjYuMjQpCi0gbWFrZWZpbGUuc2dpICAgICAgPT4gIFNpbGljb24gR3JhcGhpY3MgSVJJWCBtYWtlZmlsZSAoY2MsIGNyZWF0ZXMgc3RhdGljIGxpYikKLSBtYWtlZmlsZS5zb2xhcmlzICA9PiAgU29sYXJpcyAyLlggbWFrZWZpbGUgKGdjYywKLSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlcyBsaWJwbmcxNi5zby4xNi4xLjYuMjQpCi0gbWFrZWZpbGUuc285ICAgICAgPT4gIFNvbGFyaXMgOSBtYWtlZmlsZSAoZ2NjLAotICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVzIGxpYnBuZzE2LnNvLjE2LjEuNi4yNCkKLSBtYWtlZmlsZS5zdGQgICAgICA9PiAgR2VuZXJpYyBVTklYIG1ha2VmaWxlIChjYywgY3JlYXRlcyBzdGF0aWMgbGlicG5nLmEpCi0gbWFrZWZpbGUuc3Vub3MgICAgPT4gIFN1biBtYWtlZmlsZQotIG1ha2VmaWxlLjMyc3VudSAgID0+ICBTdW4gVWx0cmEgMzItYml0IG1ha2VmaWxlCi0gbWFrZWZpbGUuNjRzdW51ICAgPT4gIFN1biBVbHRyYSA2NC1iaXQgbWFrZWZpbGUKLSBtYWtlZmlsZS50YzMgICAgICA9PiAgVHVyYm8gQyAzLjAgbWFrZWZpbGUKLSBtYWtlZmlsZS52Y3dpbjMyICA9PiAgbWFrZWZpbGUgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIDQuMCBhbmQgbGF0ZXIKLSBtYWtldm1zLmNvbSAgICAgICA9PiAgVk1TIGJ1aWxkIHNjcmlwdAotIHNtYWtlZmlsZS5wcGMgICAgID0+ICBBTUlHQSBzbWFrZWZpbGUgZm9yIFNBUyBDIFY2LjU4LzcuMDAgUFBDIGNvbXBpbGVyCi0gICAgICAgICAgICAgICAgICAgICAgIChSZXF1aXJlcyBTQ09QVElPTlMsIGNvcGllZCBmcm9tIHNjcmlwdHMvU0NPUFRJT05TLnBwYykKLQotT3RoZXIgc3VwcG9ydGluZyBzY3JpcHRzOgotIFJFQURNRS50eHQgICAgICAgID0+ICBUaGlzIGZpbGUKLSBkZXNjcmlwLm1tcyAgICAgICA9PiAgVk1TIG1ha2VmaWxlIGZvciBNTVMgb3IgTU1LCi0gbGlicG5nLWNvbmZpZy1ib2R5LmluID0+IHVzZWQgYnkgc2V2ZXJhbCBtYWtlZmlsZXMgdG8gY3JlYXRlIGxpYnBuZy1jb25maWcKLSBsaWJwbmctY29uZmlnLWhlYWQuaW4gPT4gdXNlZCBieSBzZXZlcmFsIG1ha2VmaWxlcyB0byBjcmVhdGUgbGlicG5nLWNvbmZpZwotIGxpYnBuZy5wYy5pbiAgICAgID0+ICBVc2VkIGJ5IHNldmVyYWwgbWFrZWZpbGVzIHRvIGNyZWF0ZSBsaWJwbmcucGMKLSBwbmd3aW4ucmMgICAgICAgICA9PiAgVXNlZCBieSB0aGUgdmlzdWFsYzcxIHByb2plY3QuCi0gcG5nd2luLmRlZiAgICAgICAgPT4gIFVzZWQgYnkgbWFrZWZpbGUub3MyCi0gcG5nd2luLmRmbiAgICAgICAgPT4gIFVzZWQgdG8gbWFpbnRhaW4gcG5nd2luLmRlZgotIFNDT1BUSU9OUy5wcGMgICAgID0+ICBVc2VkIHdpdGggc21ha2VmaWxlLnBwYwotCi0gY2hlY2tzeW0uYXdrICAgICAgID0+ICBVc2VkIGZvciBtYWludGFpbmluZyBwbmdsaWJjb25mLmgKLSBkZWYuZGZuICAgICAgICAgICAgPT4gIFVzZWQgZm9yIG1haW50YWluaW5nIHBuZ2xpYmNvbmYuaAotIG9wdGlvbnMuYXdrICAgICAgICA9PiAgVXNlZCBmb3IgbWFpbnRhaW5pbmcgcG5nbGliY29uZi5oCi0gcG5nbGliY29uZi5kZmEgICAgID0+ICBVc2VkIGZvciBtYWludGFpbmluZyBwbmdsaWJjb25mLmgKLSBwbmdsaWJjb25mLm1hayAgICAgPT4gIFVzZWQgZm9yIG1haW50YWluaW5nIHBuZ2xpYmNvbmYuaAotIHN5bS5kZm4gICAgICAgICAgICA9PiAgVXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcKLSBzeW1ib2xzLmRlZiAgICAgICAgPT4gIFVzZWQgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nCi0gc3ltYm9scy5kZm4gICAgICAgID0+ICBVc2VkIGZvciBzeW1ib2wgdmVyc2lvbmluZwotIHZlcnMuZGZuICAgICAgICAgICA9PiAgVXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcKLQotIGxpYnRvb2wubTQgICAgICAgID0+ICBVc2VkIGJ5IGF1dG9jb25mIHRvb2xzCi0gbHRvcHRpb25zLm00ICAgICAgPT4gIFVzZWQgYnkgYXV0b2NvbmYgdG9vbHMKLSBsdHN1Z2FyLm00ICAgICAgICA9PiAgVXNlZCBieSBhdXRvY29uZiB0b29scwotIGx0dmVyc2lvbi5tNCAgICAgID0+ICBVc2VkIGJ5IGF1dG9jb25mIHRvb2xzCi0gbHR+b2Jzb2xldGUubTQgICAgPT4gIFVzZWQgYnkgYXV0b2NvbmYgdG9vbHMKLQotIGludHByZWZpeC5kZm4gICAgID0+ICBVc2VkIGJ5IGF1dG9jb25mIHRvb2xzCi0gbWFjcm8ubHN0ICAgICAgICAgPT4gIFVzZWQgYnkgYXV0b2NvbmYgdG9vbHMKLSBwcmVmaXguZGZuICAgICAgICA9PiAgVXNlZCBieSBhdXRvY29uZiB0b29scwotCi0KLUZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIGNvbW1lbnRzIGluIHRoZSBpbmRpdmlkdWFsIG1ha2VmaWxlcy4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvU0NPUFRJT05TLnBwYyBiL3NjcmlwdHMvU0NPUFRJT05TLnBwYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzNTAzZS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL1NDT1BUSU9OUy5wcGMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU9QVElNSVpFCi1PUFRQRUVQCi1PUFRUSU1FCi1PUFRTQ0hFRAotQVVUT1JFR0lTVEVSCi1QQVJNUz1SRUdJU1RFUlMKLUlOQ0xVREVESVI9aGxwOnBwYy9pbmNsdWRlCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrc3ltLmF3ayBiL3NjcmlwdHMvY2hlY2tzeW0uYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTNhZjU1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY2hlY2tzeW0uYXdrCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLSMhL2Jpbi9hd2sgLWYKLSMgQ2hlY2sgYSBsaXN0IG9mIHN5bWJvbHMgYWdhaW5zdCB0aGUgbWFzdGVyIGRlZmluaXRpb24KLSMgKG9mZmljaWFsKSBsaXN0LiAgQXJndW1lbnRzOgotIwotIyBhd2sgLWYgY2hlY2tzeW0uYXdrIG9mZmljaWFsLWRlZiBsaXN0LXRvLWNoZWNrCi0jCi0jIE91dHB1dCBpcyBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNhbGxlZCAnc3ltYm9scy5uZXcnLAotIyB0aGUgdmFsdWUgb2YgdGhlIGF3ayB2YXJpYWJsZSAib2YiICh3aGljaCBjYW4gYmUgY2hhbmdlZCBvbiB0aGUKLSMgY29tbWFuZCBsaW5lIGlmIHJlcXVpcmVkLikgIHN0ZG91dCBob2xkcyBlcnJvciBtZXNzYWdlcy4gIEVycm9yCi0jIGNvZGUgaW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KLSMKLSMgTk9URTogdGhpcyBpcyBhIHB1cmUsIG9sZCBmYXNoaW9uZWQsIGF3ayBzY3JpcHQuICBJdCB3aWxsCi0jIHdvcmsgd2l0aCBhbnkgYXdrCi0KLUJFR0lOewotICAgZXJyPTAKLSAgIG1hc3Rlcj0iIiAgICAgICAgIyBtYXN0ZXIgZmlsZQotICAgb2ZmaWNpYWxbMV0gPSAiIiAjIGRlZmluZWQgc3ltYm9scyBmcm9tIG1hc3RlciBmaWxlCi0gICBzeW1ib2xbMV0gPSAiIiAgICMgZGVmaW5lZCBzeW1ib2xzIGZyb20gcG5nLmgKLSAgIHJlbW92ZWRbMV0gPSAiIiAgIyByZW1vdmVkIHN5bWJvbHMgZnJvbSBwbmcuaAotICAgbGFzdG8gPSAwICAgICAgICAjIGxhc3Qgb3JkaW5hbCB2YWx1ZSBmcm9tIHBuZy5oCi0gICBtYXN0ZXJvID0gMCAgICAgICMgaGlnaGVzdCBvcmRpbmFsIGluIG1hc3RlciBmaWxlCi0gICBzeW1ib2xvID0gMCAgICAgICMgaGlnaGVzdCBvcmRpbmFsIGluIHBuZy5oCi0gICBtaXNzaW5nID0gImVycm9yIiMgbG9nIGFuIGVycm9yIG9uIG1pc3Npbmcgc3ltYm9scwotICAgb2Y9InN5bWJvbHMubmV3IiAjIGRlZmF1bHQgdG8gYSBmaXhlZCBuYW1lCi19Ci0KLSMgUmVhZCBleGlzdGluZyBkZWZpbml0aW9ucyBmcm9tIHRoZSBtYXN0ZXIgZmlsZSAodGhlIGZpcnN0Ci0jIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZS4pICBUaGlzIG11c3QgYmUgYSBkZWYgZmlsZSBhbmQgaXQKLSMgaGFzIGRlZmluaXRpb24gbGluZXMgKG90aGVycyBhcmUgaWdub3JlZCkgb2YgdGhlIGZvcm06Ci0jCi0jICAgc3ltYm9sIEBvcmRpbmFsCi0jCi1tYXN0ZXIgPT0gIiIgewotICAgbWFzdGVyID0gRklMRU5BTUUKLX0KLUZJTEVOQU1FPT1tYXN0ZXIgJiYgTkY9PTIgJiYgJDJ+L15ALyAmJiAkMSF+L147LyB7Ci0gICBvPTArc3Vic3RyKCQyLDIpCi0gICBpZiAobyA+IDApIHsKLSAgICAgIGlmIChvZmZpY2lhbFtvXSA9PSAiIikgewotICAgICAgICAgb2ZmaWNpYWxbb10gPSAkMQotICAgICAgICAgaWYgKG8gPiBtYXN0ZXJvKSBtYXN0ZXJvID0gbwotICAgICAgICAgbmV4dAotICAgICAgfSBlbHNlCi0gICAgICAgICBwcmludCBtYXN0ZXIgIjogZHVwbGljYXRlZCBzeW1ib2w6Iiwgb2ZmaWNpYWxbb10gIjoiLCAkMAotICAgfSBlbHNlCi0gICAgICBwcmludCBtYXN0ZXIgIjogYmFkIGV4cG9ydCBsaW5lIGZvcm1hdDoiLCAkMAotICAgZXJyID0gMQotfQotRklMRU5BTUU9PW1hc3RlciAmJiAkMT09IjttaXNzaW5nIiAmJiBORj09MnsKLSAgICMgVGhpcyBhbGxvd3MgdGhlIG1hc3RlciBmaWxlIHRvIGNvbnRyb2wgaG93IG1pc3Npbmcgc3ltYm9scwotICAgIyBhcmUgaGFuZGxlZDsgc3ltYm9scyB0aGF0IGFyZW4ndCBpbiBlaXRoZXIgdGhlIG1hc3RlciBvcgotICAgIyB0aGUgbmV3IGZpbGUuICBWYWxpZCB2YWx1ZXMgYXJlICdpZ25vcmUnLCAnd2FybmluZycgYW5kCi0gICAjICdlcnJvcicKLSAgIG1pc3NpbmcgPSAkMgotfQotRklMRU5BTUU9PW1hc3RlciB7Ci0gICBuZXh0Ci19Ci0KLSMgUmVhZCBuZXcgZGVmaW5pdGlvbnMsIHRoZXNlIGFyZSBmcmVlIGZvcm0gYnV0IHRoZSBsaW5lcyBtdXN0Ci0jIGp1c3QgYmUgc3ltYm9sIGRlZmluaXRpb25zLiAgTGluZXMgd2lsbCBiZSBjb21tZW50ZWQgb3V0IGZvcgotIyAncmVtb3ZlZCcgc3ltYm9scywgaW50cm9kdWNlZCBpbiBwbmcuaCB1c2luZyBQTkdfUkVNT1ZFRCByYXRoZXIKLSMgdGhhbiBQTkdfRVhQT1JULiAgVXNlIHN5bWJvbHMuZGZuIG9yIHBuZ3dpbi5kZm4gdG8gZ2VuZXJhdGUgdGhlCi0jIGlucHV0IGZpbGUuCi0jCi0jICBzeW1ib2wgQG9yZGluYWwgICAjIHR3byBmaWVsZHMsIGV4cG9ydGVkIHN5bWJvbAotIyAgOyBzeW1ib2wgQG9yZGluYWwgIyB0aHJlZSBmaWVsZHMsIHJlbW92ZWQgc3ltYm9sCi0jICA7IEBvcmRpbmFsICAgICAgICAjIHR3byBmaWVsZHMsIHRoZSBsYXN0IG9yZGluYWwKLU5GPT0yICYmICQxID09ICI7IiAmJiAkMiB+IC9eQFsxLTldWzAtOV0qJC8geyAjIGxhc3Qgb3JkaW5hbAotICAgbz0wK3N1YnN0cigkMiwyKQotICAgaWYgKGxhc3RvID09IDAgfHwgbGFzdG8gPT0gbykKLSAgICAgIGxhc3RvPW8KLSAgIGVsc2UgewotICAgICAgcHJpbnQgInBuZy5oOiBkdXBsaWNhdGVkIGxhc3Qgb3JkaW5hbDoiLCBsYXN0bywgbwotICAgICAgZXJyID0gMQotICAgfQotICAgbmV4dAotfQotTkY9PTMgJiYgJDEgPT0gIjsiICYmICQzIH4gL15AWzEtOV1bMC05XSokLyB7ICMgcmVtb3ZlZCBzeW1ib2wKLSAgIG89MCtzdWJzdHIoJDMsMikKLSAgIGlmIChyZW1vdmVkW29dID09ICIiIHx8IHJlbW92ZWRbb10gPT0gJDIpIHsKLSAgICAgIHJlbW92ZWRbb10gPSAkMgotICAgICAgaWYgKG8gPiBzeW1ib2xvKSBzeW1ib2xvID0gbwotICAgfSBlbHNlIHsKLSAgICAgIHByaW50ICJwbmcuaDogZHVwbGljYXRlZCByZW1vdmVkIHN5bWJvbCIsIG8gIjogJyIgcmVtb3ZlZFtvXSAiJyAhPSAnIiAkMiAiJyIKLSAgICAgIGVyciA9IDEKLSAgIH0KLSAgIG5leHQKLX0KLU5GPT0yICYmICQyIH4gL15AWzEtOV1bMC05XSokLyB7ICMgZXhwb3J0ZWQgc3ltYm9sCi0gICBvPTArc3Vic3RyKCQyLDIpCi0gICBpZiAoc3ltYm9sW29dID09ICIiIHx8IHN5bWJvbFtvXSA9PSAkMSkgewotICAgICAgc3ltYm9sW29dID0gJDEKLSAgICAgIGlmIChvID4gc3ltYm9sbykgc3ltYm9sbyA9IG8KLSAgIH0gZWxzZSB7Ci0gICAgICBwcmludCAicG5nLmg6IGR1cGxpY2F0ZWQgc3ltYm9sIiwgbyAiOiAnIiBzeW1ib2xbb10gIicgIT0gJyIgJDEgIiciCi0gICAgICBlcnIgPSAxCi0gICB9Ci19Ci17Ci0gICBuZXh0ICMgc2tpcCBhbGwgb3RoZXIgbGluZXMKLX0KLQotIyBBdCB0aGUgZW5kIGNoZWNrIGZvciBzeW1ib2xzIG1hcmtlZCBhcyBib3RoIGR1cGxpY2F0ZWQgYW5kIHJlbW92ZWQKLUVORHsKLSAgIGlmIChzeW1ib2xvID4gbGFzdG8pIHsKLSAgICAgIHByaW50ICJoaWdoZXN0IHN5bWJvbCBvcmRpbmFsIGluIHBuZy5oLCIsIHN5bWJvbG8gIiwgZXhjZWVkcyBsYXN0IG9yZGluYWwgZnJvbSBwbmcuaCIsIGxhc3RvCi0gICAgICBlcnIgPSAxCi0gICB9Ci0gICBpZiAobWFzdGVybyA+IGxhc3RvKSB7Ci0gICAgICBwcmludCAiaGlnaGVzdCBzeW1ib2wgb3JkaW5hbCBpbiIsIG1hc3RlciAiLCIsIG1hc3Rlcm8gIiwgZXhjZWVkcyBsYXN0IG9yZGluYWwgZnJvbSBwbmcuaCIsIGxhc3RvCi0gICAgICBlcnIgPSAxCi0gICB9Ci0gICB1bmV4cG9ydGVkPTAKLSAgICMgQWRkIGEgc3RhbmRhcmQgaGVhZGVyIHRvIHN5bWJvbHMubmV3OgotICAgcHJpbnQgIjtWZXJzaW9uIElOU0VSVC1WRVJTSU9OLUhFUkUiID5vZgotICAgcHJpbnQgIjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPm9mCi0gICBwcmludCAiOyBMSUJQTkcgc3ltYm9sIGxpc3QgYXMgYSBXaW4zMiBERUYgZmlsZSIgPm9mCi0gICBwcmludCAiOyBDb250YWlucyBhbGwgdGhlIHN5bWJvbHMgdGhhdCBjYW4gYmUgZXhwb3J0ZWQgZnJvbSBsaWJwbmciID5vZgotICAgcHJpbnQgIjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPm9mCi0gICBwcmludCAiTElCUkFSWSIgPm9mCi0gICBwcmludCAiIiA+b2YKLSAgIHByaW50ICJFWFBPUlRTIiA+b2YKLQotICAgZm9yIChvPTE7IG88PWxhc3RvOyArK28pIHsKLSAgICAgIGlmIChzeW1ib2xbb10gPT0gIiIgJiYgcmVtb3ZlZFtvXSA9PSAiIikgewotICAgICAgICAgaWYgKHVuZXhwb3J0ZWQgPT0gMCkgdW5leHBvcnRlZCA9IG8KLSAgICAgICAgIGlmIChvZmZpY2lhbFtvXSA9PSAiIikgewotICAgICAgICAgICAgIyBtaXNzaW5nIGluIGV4cG9ydCBsaXN0IHRvbywgc28gb2sKLSAgICAgICAgICAgIGlmIChvIDwgbGFzdG8pIGNvbnRpbnVlCi0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAodW5leHBvcnRlZCAhPSAwKSB7Ci0gICAgICAgICAjIFN5bWJvbHMgaW4gdGhlIC5kZWYgYnV0IG5vdCBpbiB0aGUgbmV3IGZpbGUgYXJlIGVycm9ycywgYnV0Ci0gICAgICAgICAjIHRoZSAndW5leHBvcnRlZCcgc3ltYm9scyBhcmVuJ3QgaW4gZWl0aGVyLiAgQnkgZGVmYXVsdCB0aGlzCi0gICAgICAgICAjIGlzIGFuIGVycm9yIHRvbyAoc2VlIHRoZSBzZXR0aW5nIG9mICdtaXNzaW5nJyBhdCB0aGUgc3RhcnQpLAotICAgICAgICAgIyBidXQgdGhpcyBjYW4gYmUgcmVzZXQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBieSBzdHVmZiBpbiB0aGUKLSAgICAgICAgICMgZmlsZSAtIHNlZSB0aGUgY29tbWVudHMgYWJvdmUuCi0gICAgICAgICBpZiAobWlzc2luZyAhPSAiaWdub3JlIikgewotICAgICAgICAgICAgaWYgKG8tMSA+IHVuZXhwb3J0ZWQpCi0gICAgICAgICAgICAgICBwcmludCAicG5nLmg6IiwgbWlzc2luZyAiOiBtaXNzaW5nIHN5bWJvbHM6IiwgdW5leHBvcnRlZCAiLSIgby0xCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwcmludCAicG5nLmg6IiwgbWlzc2luZyAiOiBtaXNzaW5nIHN5bWJvbDoiLCB1bmV4cG9ydGVkCi0gICAgICAgICAgICBpZiAobWlzc2luZyAhPSAid2FybmluZyIpCi0gICAgICAgICAgICAgICBlcnIgPSAxCi0gICAgICAgICB9Ci0gICAgICAgICB1bmV4cG9ydGVkID0gMAotICAgICAgfQotICAgICAgaWYgKHN5bWJvbFtvXSAhPSAiIiAmJiByZW1vdmVkW29dICE9ICIiKSB7Ci0gICAgICAgICBwcmludCAicG5nLmg6IHN5bWJvbCIsIG8sICJib3RoIGV4cG9ydGVkIGFzICciIHN5bWJvbFtvXSAiJyBhbmQgcmVtb3ZlZCBhcyAnIiByZW1vdmVkW29dICInIgotICAgICAgICAgZXJyID0gMQotICAgICAgfSBlbHNlIGlmIChzeW1ib2xbb10gIT0gb2ZmaWNpYWxbb10pIHsKLSAgICAgICAgICMgZWl0aGVyIHRoZSBzeW1ib2wgaXMgbWlzc2luZyBzb21ld2hlcmUgb3IgaXQgY2hhbmdlZAotICAgICAgICAgZXJyID0gMQotICAgICAgICAgaWYgKHN5bWJvbFtvXSA9PSAiIikKLSAgICAgICAgICAgIHByaW50ICJwbmcuaDogc3ltYm9sIiwgbywgImlzIGV4cG9ydGVkIGFzICciIG9mZmljaWFsW29dICInIGluIiwgbWFzdGVyCi0gICAgICAgICBlbHNlIGlmIChvZmZpY2lhbFtvXSA9PSAiIikKLSAgICAgICAgICAgIHByaW50ICJwbmcuaDogZXhwb3J0ZWQgc3ltYm9sIiwgbywgIiciIHN5bWJvbFtvXSAiJyBub3QgcHJlc2VudCBpbiIsIG1hc3RlcgotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnQgInBuZy5oOiBleHBvcnRlZCBzeW1ib2wiLCBvLCAiJyIgc3ltYm9sW29dICInIGV4aXN0cyBhcyAnIiBvZmZpY2lhbFtvXSAiJyBpbiIsIG1hc3RlcgotICAgICAgfQotCi0gICAgICAjIEZpbmFsbHkgZ2VuZXJhdGUgc3ltYm9scy5uZXcKLSAgICAgIGlmIChzeW1ib2xbb10gIT0gIiIpCi0gICAgICAgICBwcmludCAiICIgc3ltYm9sW29dLCAiQCIgbyA+IG9mCi0gICB9Ci0KLSAgIGlmIChlcnIgIT0gMCkgewotICAgICAgcHJpbnQgIioqKiBBIG5ldyBsaXN0IGlzIGluIiwgb2YsICIqKioiCi0gICAgICBleGl0IDEKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZGVmLmMgYi9zY3JpcHRzL2RlZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA0ODc1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvZGVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBkZWYuYyAtIGRlZmluZSBmb3JtYXQgb2YgbGlicG5nLmRlZgotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKi8KLQotLyogV3JpdGUgdGhlIGV4cG9ydCBmaWxlIGhlYWRlcjogKi8KLVBOR19ERk4gIjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLVBOR19ERk4gIjsgTElCUE5HIG1vZHVsZSBkZWZpbml0aW9uIGZpbGUgZm9yIE9TLzIiCi1QTkdfREZOICI7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi1QTkdfREZOICIiCi1QTkdfREZOICI7IElmIHlvdSBnaXZlIHRoZSBsaWJyYXJ5IGFuIGV4cGxpY2l0IG5hbWUgb25lIG9yIG90aGVyIGZpbGVzIgotUE5HX0RGTiAiOyBtYXkgbmVlZCBtb2RpZnlpbmcgdG8gc3VwcG9ydCB0aGUgbmV3IG5hbWUgb24gb25lIG9yIG1vcmUiCi1QTkdfREZOICI7IHN5c3RlbXMuIgotUE5HX0RGTiAiTElCUkFSWSIKLVBOR19ERk4gIk9TMiBERVNDUklQVElPTiAiUE5HIGltYWdlIGNvbXByZXNzaW9uIGxpYnJhcnkiIgotUE5HX0RGTiAiT1MyIENPREUgUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRSIKLVBOR19ERk4gIiIKLVBOR19ERk4gIkVYUE9SVFMiCi1QTkdfREZOICI7VmVyc2lvbiAxLjYuMjQiCi0KLSNkZWZpbmUgUE5HX0VYUE9SVEEob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncywgYXR0cmlidXRlcylcCi0gICAgICAgIFBOR19ERk4gIkAiIFNZTUJPTF9QUkVGSVggIkBAIiBuYW1lICJAIgotCi0jaW5jbHVkZSAiLi4vcG5nLmgiCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Rlc2NyaXAubW1zIGIvc2NyaXB0cy9kZXNjcmlwLm1tcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzYzQyNS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Rlc2NyaXAubW1zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotCi1jY19kZWZzID0gL2luYz0kKFpMSUJTUkMpCi1jX2RlYiA9Ci0KLS5pZmRlZiBfX0RFQ0NfXwotcHJlZiA9IC9wcmVmaXg9YWxsCi0uZW5kaWYKLQotCi0KLU9CSlMgPSBwbmcub2JqLCBwbmdzZXQub2JqLCBwbmdnZXQub2JqLCBwbmdydXRpbC5vYmosIHBuZ3RyYW5zLm9iaixcCi0JcG5nd3V0aWwub2JqLCBwbmdyZWFkLm9iaiwgcG5nbWVtLm9iaiwgcG5nd3JpdGUub2JqLCBwbmdydHJhbi5vYmosXAotCXBuZ3d0cmFuLm9iaiwgcG5ncmlvLm9iaiwgcG5nd2lvLm9iaiwgcG5nZXJyb3Iub2JqLCBwbmdwcmVhZC5vYmoKLQotCi1DRkxBR1M9ICQoQ19ERUIpICQoQ0NfREVGUykgJChQUkVGKQotCi1hbGwgOiBwbmd0ZXN0LmV4ZSBsaWJwbmcub2xiCi0JCUAgd3JpdGUgc3lzJG91dHB1dCAiIHBuZ3Rlc3QgYXZhaWxhYmxlIgotCi1saWJwbmcub2xiIDogbGlicG5nLm9sYigkKE9CSlMpKQotCUAgd3JpdGUgc3lzJG91dHB1dCAiIExpYnBuZyBhdmFpbGFibGUiCi0KLQotcG5ndGVzdC5leGUgOiBwbmd0ZXN0Lm9iaiBsaWJwbmcub2xiCi0gICAgICAgICAgICAgIGxpbmsgcG5ndGVzdCxsaWJwbmcub2xiL2xpYiwkKFpMSUJTUkMpbGliei5vbGIvbGliCi0KLXRlc3QgOiBwbmd0ZXN0LmV4ZQotICAgcnVuIHBuZ3Rlc3QKLQotY2xlYW4gOgotCWRlbGV0ZSAqLm9iajsqLCouZXhlOwotCi0KLSMgT3RoZXIgZGVwZW5kZW5jaWVzLgotcG5nLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ2xpYmNvbmYuaCwgcG5ncHJpdi5oLCBwbmdzdHJ1Y3QuaCxwbmdpbmZvLmgsIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ2xpYmNvbmYuaCwgcG5ncHJpdi5oLCBwbmdzdHJ1Y3QuaCxwbmdpbmZvLmgsIHBuZ2RlYnVnLmgKLXBuZ3NldC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmdnZXQub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5nbGliY29uZi5oLCBwbmdwcml2LmgsIHBuZ3N0cnVjdC5oLHBuZ2luZm8uaCwgcG5nZGVidWcuaAotcG5ncmVhZC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmdtZW0ub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5nbGliY29uZi5oLCBwbmdwcml2LmgsIHBuZ3N0cnVjdC5oLHBuZ2luZm8uaCwgcG5nZGVidWcuaAotcG5ncmlvLm9iaiA6IHBuZy5oLCBwbmdjb25mLmgsIHBuZ2xpYmNvbmYuaCwgcG5ncHJpdi5oLCBwbmdzdHJ1Y3QuaCxwbmdpbmZvLmgsIHBuZ2RlYnVnLmgKLXBuZ3dpby5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vYmogOiBwbmcuaCwgcG5nY29uZi5oLCBwbmdsaWJjb25mLmgsIHBuZ3ByaXYuaCwgcG5nc3RydWN0LmgscG5naW5mby5oLCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3Qub2JqIDogcG5nLmgsIHBuZ2NvbmYuaCwgcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Rmbi5hd2sgYi9zY3JpcHRzL2Rmbi5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NmI5ZGIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9kZm4uYXdrCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5jaGsuY21ha2UuaW4gYi9zY3JpcHRzL2dlbmNoay5jbWFrZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzYjlkNy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2dlbmNoay5jbWFrZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgZ2VuY2hrLmNtYWtlLmluCi0jIEdlbmVyYXRlIC5jaGsgZnJvbSAub3V0IHdpdGggYXdrIChnZW5lcmljKSwgYmFzZWQgdXBvbiB0aGUgYXV0b21ha2UgbG9naWMuCi0KLSMgQ29weXJpZ2h0IChDKSAyMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBXcml0dGVuIGJ5IFJvZ2VyIExlaWdoLCAyMDE2Ci0KLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIFZhcmlhYmxlcyBzdWJzdGl0dXRlZCBmcm9tIENNYWtlTGlzdHMudHh0Ci1zZXQoU1JDRElSICJAQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSQCIpCi0KLXNldChBV0sgIkBBV0tAIikKLQotZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChJTlBVVEVYVCAiJHtJTlBVVH0iIEVYVCkKLWdldF9maWxlbmFtZV9jb21wb25lbnQoT1VUUFVURVhUICIke09VVFBVVH0iIEVYVCkKLWdldF9maWxlbmFtZV9jb21wb25lbnQoSU5QVVRCQVNFICIke0lOUFVUfSIgTkFNRV9XRSkKLWdldF9maWxlbmFtZV9jb21wb25lbnQoT1VUUFVUQkFTRSAiJHtPVVRQVVR9IiBOQU1FX1dFKQotZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChJTlBVVERJUiAiJHtJTlBVVH0iIFBBVEgpCi1nZXRfZmlsZW5hbWVfY29tcG9uZW50KE9VVFBVVERJUiAiJHtPVVRQVVR9IiBQQVRIKQotCi1pZigiJHtJTlBVVEVYVH0iIFNUUkVRVUFMICIub3V0IiBBTkQgIiR7T1VUUFVURVhUfSIgU1RSRVFVQUwgIi5jaGsiKQotICAjIEdlbmVyYXRlIC5jaGsgZnJvbSAub3V0IHdpdGggYXdrIChnZW5lcmljKQotICBmaWxlKFJFTU9WRSAiJHtPVVRQVVR9IiAiJHtPVVRQVVRESVJ9LyR7T1VUUFVUQkFTRX0ubmV3IikKLSAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7QVdLfSIgLWYgIiR7U1JDRElSfS9zY3JpcHRzL2NoZWNrc3ltLmF3ayIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7U1JDRElSfS9zY3JpcHRzLyR7SU5QVVRCQVNFfS5kZWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvZj0ke09VVFBVVERJUn0vJHtPVVRQVVRCQVNFfS5uZXciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIke0lOUFVUfSIKLSAgICAgICAgICAgICAgICAgIFJFU1VMVF9WQVJJQUJMRSBBV0tfRkFJTCkKLSAgaWYoQVdLX0ZBSUwpCi0gICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRmFpbGVkIHRvIGdlbmVyYXRlICR7T1VUUFVURElSfS8ke09VVFBVVEJBU0V9Lm5ldyIpCi0gIGVuZGlmKCkKLSAgZmlsZShSRU5BTUUgIiR7T1VUUFVURElSfS8ke09VVFBVVEJBU0V9Lm5ldyIgIiR7T1VUUFVUfSIpCi1lbHNlKCkKLSAgbWVzc2FnZShGQVRBTF9FUlJPUiAiVW5zdXBwb3J0ZWQgY29udmVyc2lvbjogJHtJTlBVVEVYVH0gdG8gJHtPVVRQVVRFWFR9IikKLWVuZGlmKCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vub3V0LmNtYWtlLmluIGIvc2NyaXB0cy9nZW5vdXQuY21ha2UuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjEyZGUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9nZW5vdXQuY21ha2UuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0jIGdlbm91dC5jbWFrZS5pbgotIyBHZW5lcmF0ZSAub3V0IGZyb20gLmMgd2l0aCBhd2sgKGdlbmVyaWMpLCBiYXNlZCB1cG9uIHRoZSBhdXRvbWFrZSBsb2dpYy4KLQotIyBDb3B5cmlnaHQgKEMpIDIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIFdyaXR0ZW4gYnkgUm9nZXIgTGVpZ2gsIDIwMTYKLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgVmFyaWFibGVzIHN1YnN0aXR1dGVkIGZyb20gQ01ha2VMaXN0cy50eHQKLXNldChTUkNESVIgIkBDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJAIikKLXNldChCSU5ESVIgIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAIikKLQotc2V0KEFXSyAiQEFXS0AiKQotc2V0KENNQUtFX0NfQ09NUElMRVIgIkBDTUFLRV9DX0NPTVBJTEVSQCIpCi1zZXQoQ01BS0VfQ19GTEFHUyBAQ01BS0VfQ19GTEFHU0ApCi1zZXQoSU5DRElSICJAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQCIpCi1zZXQoUE5HX1BSRUZJWCAiQFBOR19QUkVGSVhAIikKLXNldChQTkdMSUJfTUFKT1IgIkBQTkdMSUJfTUFKT1JAIikKLXNldChQTkdMSUJfTUlOT1IgIkBQTkdMSUJfTUlOT1JAIikKLXNldChQTkdMSUJfVkVSU0lPTiAiQFBOR0xJQl9WRVJTSU9OQCIpCi1zZXQoWkxJQklOQ0RJUiAiQFpMSUJfSU5DTFVERV9ESVJAIikKLQotc2V0KFBMQVRGT1JNX0NfRkxBR1MpCi1pZihBUFBMRSkKLSAgc2V0KENNQUtFX09TWF9BUkNISVRFQ1RVUkVTICJAQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVNAIikKLSAgc2V0KENNQUtFX09TWF9TWVNST09UICJAQ01BS0VfT1NYX1NZU1JPT1RAIikKLSAgaWYoQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVMpCi0gICAgc2V0KFBMQVRGT1JNX0NfRkxBR1MgJHtQTEFURk9STV9DX0ZMQUdTfSAtYXJjaCAke0NNQUtFX09TWF9BUkNISVRFQ1RVUkVTfSkKLSAgZW5kaWYoKQotICBpZihDTUFLRV9PU1hfU1lTUk9PVCkKLSAgICBzZXQoUExBVEZPUk1fQ19GTEFHUyAke1BMQVRGT1JNX0NfRkxBR1N9IC1pc3lzcm9vdCAke0NNQUtFX09TWF9TWVNST09UfSkKLSAgZW5kaWYoKQotZW5kaWYoKQotCi1nZXRfZmlsZW5hbWVfY29tcG9uZW50KElOUFVURVhUICIke0lOUFVUfSIgRVhUKQotZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChPVVRQVVRFWFQgIiR7T1VUUFVUfSIgRVhUKQotZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChJTlBVVEJBU0UgIiR7SU5QVVR9IiBOQU1FX1dFKQotZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChPVVRQVVRCQVNFICIke09VVFBVVH0iIE5BTUVfV0UpCi1nZXRfZmlsZW5hbWVfY29tcG9uZW50KElOUFVURElSICIke0lOUFVUfSIgUEFUSCkKLWdldF9maWxlbmFtZV9jb21wb25lbnQoT1VUUFVURElSICIke09VVFBVVH0iIFBBVEgpCi0KLWlmICgiJHtJTlBVVEVYVH0iIFNUUkVRVUFMICIuYyIgQU5EICIke09VVFBVVEVYVH0iIFNUUkVRVUFMICIub3V0IikKLSAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChHRU5ESVIgIiR7T1VUUFVUfSIgUEFUSCkKLSAgZmlsZShNQUtFX0RJUkVDVE9SWSAiJHtHRU5ESVJ9IikKLQotICBmaWxlKFJFTU9WRSAiJHtPVVRQVVR9LnRmMSIgIiR7T1VUUFVUfS50ZjIiKQotCi0gIHNldChJTkNMVURFUyAiLUkke0lOQ0RJUn0iKQotICBpZihaTElCSU5DRElSKQotICAgIGZvcmVhY2goZGlyICR7WkxJQklOQ0RJUn0pCi0gICAgICBsaXN0KEFQUEVORCBJTkNMVURFUyAiLUkke2Rpcn0iKQotICAgIGVuZGZvcmVhY2goKQotICBlbmRpZigpCi0KLSAgaWYoUE5HX1BSRUZJWCkKLSAgICBzZXQoUE5HX1BSRUZJWF9ERUYgIi1EUE5HX1BSRUZJWD0ke1BOR19QUkVGSVh9IikKLSAgZW5kaWYoKQotCi0gIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke0NNQUtFX0NfQ09NUElMRVJ9IiAiLUUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ19GTEFHU30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJHtQTEFURk9STV9DX0ZMQUdTfQotICAgICAgICAgICAgICAgICAgICAgICAgICAiLUkke1NSQ0RJUn0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICItSSR7QklORElSfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJHtJTkNMVURFU30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIi1EUE5HTElCX0xJQk5BTUU9UE5HJHtQTkdMSUJfTUFKT1J9JHtQTkdMSUJfTUlOT1J9XzAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICItRFBOR0xJQl9WRVJTSU9OPSR7UE5HTElCX1ZFUlNJT059IgotICAgICAgICAgICAgICAgICAgICAgICAgICAiLURTWU1CT0xfUFJFRklYPSR7U1lNQk9MX1BSRUZJWH0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICItRFBOR19OT19VU0VfUkVBRF9NQUNST1MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICItRFBOR19CVUlMRElOR19TWU1CT0xfVEFCTEUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICR7UE5HX1BSRUZJWF9ERUZ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICIke0lOUFVUfSIKLSAgICAgICAgICAgICAgICAgIE9VVFBVVF9GSUxFICIke09VVFBVVH0udGYxIgotICAgICAgICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgIiR7QklORElSfSIKLSAgICAgICAgICAgICAgICAgIFJFU1VMVF9WQVJJQUJMRSBDUFBfRkFJTCkKLSAgaWYoQ1BQX0ZBSUwpCi0gICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRmFpbGVkIHRvIGdlbmVyYXRlICR7T1VUUFVUfS50ZjEiKQotICBlbmRpZigpCi0KLSAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7QVdLfSIgLWYgIiR7U1JDRElSfS9zY3JpcHRzL2Rmbi5hd2siCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQ9JHtPVVRQVVR9LnRmMiIgIiR7T1VUUFVUfS50ZjEiCi0gICAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAiJHtCSU5ESVJ9IgotICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIEFXS19GQUlMKQotICBpZihBV0tfRkFJTCkKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGYWlsZWQgdG8gZ2VuZXJhdGUgJHtPVVRQVVR9LnRmMiIpCi0gIGVuZGlmKCkKLQotICBmaWxlKFJFTU9WRSAiJHtPVVRQVVR9LnRmMSIpCi0gIGZpbGUoUkVOQU1FICIke09VVFBVVH0udGYyIiAiJHtPVVRQVVR9IikKLWVsc2UoKQotICBtZXNzYWdlKEZBVEFMX0VSUk9SICJVbnN1cHBvcnRlZCBjb252ZXJzaW9uOiAke0lOUFVURVhUfSB0byAke09VVFBVVEVYVH0iKQotZW5kaWYoKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5zcmMuY21ha2UuaW4gYi9zY3JpcHRzL2dlbnNyYy5jbWFrZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4YTYyMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2dlbnNyYy5jbWFrZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0jIGdlbnNyYy5jbWFrZS5pbgotIyBHZW5lcmF0ZSBzb3VyY2UgZmlsZXMgd2l0aCBhd2ssIGJhc2VkIHVwb24gdGhlIGF1dG9tYWtlIGxvZ2ljLgotCi0jIENvcHlyaWdodCAoQykgMjAxNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgV3JpdHRlbiBieSBSb2dlciBMZWlnaCwgMjAxNgotCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBWYXJpYWJsZXMgc3Vic3RpdHV0ZWQgZnJvbSBDTWFrZUxpc3RzLnR4dAotc2V0KFNSQ0RJUiAiQENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUkAiKQotc2V0KEJJTkRJUiAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAiKQotCi1zZXQoQVdLICJAQVdLQCIpCi1zZXQoREZBX1hUUkEgIkBERkFfWFRSQUAiKQotc2V0KFBOR19QUkVGSVggIkBQTkdfUFJFRklYQCIpCi1zZXQoUE5HTElCX1ZFUlNJT04gIkBQTkdMSUJfVkVSU0lPTkAiKQotCi1pZigiJHtPVVRQVVR9IiBTVFJFUVVBTCAic2NyaXB0cy9wbmdsaWJjb25mLmMiKQotICAjIEdlbmVyYXRlIHNjcmlwdHMvcG5nbGliY29uZi5jCi0KLSAgZmlsZShSRU1PVkUgIiR7QklORElSfS9wbmdsaWJjb25mLnRmNiIgIiR7QklORElSfS9wbmdsaWJjb25mLnRmNyIpCi0KLSAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7Q01BS0VfQ09NTUFORH0iIC1FIGVjaG8gImNvbSAke1BOR0xJQl9WRVJTSU9OfSBTVEFOREFSRCBBUEkgREVGSU5JVElPTiIKLSAgICAgICAgICAgICAgICAgIENPTU1BTkQgIiR7QVdLfSIgLWYgIiR7U1JDRElSfS9zY3JpcHRzL29wdGlvbnMuYXdrIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0PXBuZ2xpYmNvbmYudGY2IiAibG9ndW5zdXBwb3J0ZWQ9MSIgInZlcnNpb249c2VhcmNoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtTUkNESVJ9L3BuZ2NvbmYuaCIgIi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIke1NSQ0RJUn0vc2NyaXB0cy9wbmdsaWJjb25mLmRmYSIKLSAgICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICIke0JJTkRJUn0iCi0gICAgICAgICAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgQVdLX0ZBSUwpCi0gIGlmKEFXS19GQUlMKQotICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZhaWxlZCB0byBnZW5lcmF0ZSBwbmdsaWJjb25mLnRmNiIpCi0gIGVuZGlmKCkKLQotICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtBV0t9IiAtZiAiJHtTUkNESVJ9L3NjcmlwdHMvb3B0aW9ucy5hd2siCi0gICAgICAgICAgICAgICAgICAib3V0PXBuZ2xpYmNvbmYudGY3IiAicG5nbGliY29uZi50ZjYiCi0gICAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAiJHtCSU5ESVJ9IgotICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIEFXS19GQUlMKQotICBpZihBV0tfRkFJTCkKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGYWlsZWQgdG8gZ2VuZXJhdGUgcG5nbGliY29uZi50ZjciKQotICBlbmRpZigpCi0KLSAgZmlsZShSRU1PVkUgInBuZ2xpYmNvbmYudGY2IikKLSAgZmlsZShNQUtFX0RJUkVDVE9SWSAiJHtCSU5ESVJ9L3NjcmlwdHMiKQotICBmaWxlKFJFTkFNRSAicG5nbGliY29uZi50ZjciICIke0JJTkRJUn0vc2NyaXB0cy9wbmdsaWJjb25mLmMiKQotCi1lbHNlaWYgKCIke09VVFBVVH0iIFNUUkVRVUFMICJwbmdsaWJjb25mLmMiKQotICAjIEdlbmVyYXRlIHBuZ2xpYmNvbmYuYwotCi0gIGZpbGUoUkVNT1ZFICIke0JJTkRJUn0vcG5nbGliY29uZi50ZjQiICIke0JJTkRJUn0vcG5nbGliY29uZi50ZjUiKQotCi0gIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke0FXS30iIC1mICIke1NSQ0RJUn0vc2NyaXB0cy9vcHRpb25zLmF3ayIKLSAgICAgICAgICAgICAgICAgIG91dD1wbmdsaWJjb25mLnRmNCB2ZXJzaW9uPXNlYXJjaAotICAgICAgICAgICAgICAgICAgJHtTUkNESVJ9L3BuZ2NvbmYuaCAke1NSQ0RJUn0vc2NyaXB0cy9wbmdsaWJjb25mLmRmYQotICAgICAgICAgICAgICAgICAgJHtTUkNESVJ9L3BuZ3Vzci5kZmEgJHtERkFfWFRSQX0KLSAgICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICIke0JJTkRJUn0iCi0gICAgICAgICAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgQVdLX0ZBSUwpCi0gIGlmKEFXS19GQUlMKQotICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZhaWxlZCB0byBnZW5lcmF0ZSBwbmdsaWJjb25mLnRmNCIpCi0gIGVuZGlmKCkKLQotICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtBV0t9IiAtZiAiJHtTUkNESVJ9L3NjcmlwdHMvb3B0aW9ucy5hd2siCi0gICAgICAgICAgICAgICAgICBvdXQ9cG5nbGliY29uZi50ZjUgcG5nbGliY29uZi50ZjQKLSAgICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICIke0JJTkRJUn0iCi0gICAgICAgICAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgQVdLX0ZBSUwpCi0gIGlmKEFXS19GQUlMKQotICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZhaWxlZCB0byBnZW5lcmF0ZSBwbmdsaWJjb25mLnRmNSIpCi0gIGVuZGlmKCkKLQotICBmaWxlKFJFTU9WRSAicG5nbGliY29uZi50ZjQiKQotICBmaWxlKE1BS0VfRElSRUNUT1JZICIke0JJTkRJUn0vc2NyaXB0cyIpCi0gIGZpbGUoUkVOQU1FICJwbmdsaWJjb25mLnRmNSIgIiR7QklORElSfS9wbmdsaWJjb25mLmMiKQotCi1lbHNlaWYgKCIke09VVFBVVH0iIFNUUkVRVUFMICJwbmdsaWJjb25mLmgiKQotICAjIEdlbmVyYXRlIHBuZ2xpYmNvbmYuaAotCi0gIGZpbGUoUkVNT1ZFICIke0JJTkRJUn0vJHtPVVRQVVR9IikKLSAgaWYoUE5HX1BSRUZJWCkKLSAgICBmaWxlKFJFTU9WRSAicG5nbGliY29uZi50ZjgiKQotCi0gICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7QVdLfSIgInM9PTAgJiYgTlI+MXtwcmludCBwcmV2fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzPT0we3ByZXY9XCQwfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzPT0xe3ByaW50IFwiI2RlZmluZVwiLCBcJDEsIFwiJHtQTkdfUFJFRklYfVwiIFwkMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcz09MntwcmludCBcIiNkZWZpbmUgJHtQTkdfUFJFRklYfXBuZ19cIiBcJDEsIFwiUE5HX1wiIFwkMX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5Ee3ByaW50IHByZXZ9IiBzPTAgcG5nbGliY29uZi5vdXQgcz0xICIke0JJTkRJUn0vc2NyaXB0cy9wcmVmaXgub3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzPTIgIiR7U1JDRElSfS9zY3JpcHRzL21hY3JvLmxzdCIKLSAgICAgICAgICAgICAgICAgICAgT1VUUFVUX0ZJTEUgcG5nbGliY29uZi50ZjgKLSAgICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIEFXS19GQUlMKQotICAgIGlmKEFXS19GQUlMKQotICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRmFpbGVkIHRvIGdlbmVyYXRlIHBuZ2xpYmNvbmYudGY4IikKLSAgICBlbmRpZigpCi0KLSAgICBmaWxlKFJFTkFNRSAicG5nbGliY29uZi50ZjgiICIke0JJTkRJUn0vJHtPVVRQVVR9IikKLSAgZWxzZSgpCi0gICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgIiR7Q01BS0VfQ09NTUFORH0iIC1FIGNvcHkgIiR7QklORElSfS9wbmdsaWJjb25mLm91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtCSU5ESVJ9LyR7T1VUUFVUfSIKLSAgICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIENPUFlfRkFJTCkKLSAgICBpZihDT1BZX0ZBSUwpCi0gICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGYWlsZWQgdG8gY3JlYXRlIHBuZ2xpYmNvbmYuaCIpCi0gICAgZW5kaWYoKQotICBlbmRpZigpCi0KLWVsc2VpZiAoIiR7T1VUUFVUfSIgU1RSRVFVQUwgInBuZ3ByZWZpeC5oIikKLSAgIyBHZW5lcmF0ZSBwbmdwcmVmaXguaAotCi0gIGZpbGUoUkVNT1ZFICIke0JJTkRJUn0vJHtPVVRQVVR9IikKLQotICBpZihQTkdfUFJFRklYKQotICAgIGZpbGUoUkVNT1ZFICJwbmdwcmVmaXgudGYxIikKLQotICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke0FXS30iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIntwcmludCBcIiNkZWZpbmVcIiwgXCQxLCBcIiR7UE5HX1BSRUZJWH1cIiBcJDF9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke0JJTkRJUn0vc2NyaXB0cy9pbnRwcmVmaXgub3V0IgotICAgICAgICAgICAgICAgICAgICBPVVRQVVRfRklMRSAicG5ncHJlZml4LnRmMSIKLSAgICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIEFXS19GQUlMKQotICAgIGlmKEFXS19GQUlMKQotICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRmFpbGVkIHRvIGdlbmVyYXRlIHBuZ3ByZWZpeC50ZjEiKQotICAgIGVuZGlmKCkKLQotICAgIGZpbGUoUkVOQU1FICJwbmdwcmVmaXgudGYxIiAiJHtCSU5ESVJ9LyR7T1VUUFVUfSIpCi0gIGVsc2UoKQotICAgIGZpbGUoV1JJVEUgIiR7QklORElSfS8ke09VVFBVVH0iICIvKiBObyBsaWJwbmcgc3ltYm9sIHByZWZpeCBjb25maWd1cmVkLiAqLyIpCi0gIGVuZGlmKCkKLQotZWxzZWlmKCIke09VVFBVVH0iIFNUUkVRVUFMICJzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCIpCi0gICMgR2VuZXJhdGUgc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQgKGZhaWxzIGJ1aWxkKQotCi0gIG1lc3NhZ2UoU1RBVFVTICJBdHRlbXB0aW5nIHRvIGJ1aWxkIHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0IikKLSAgbWVzc2FnZShTVEFUVVMgIlRoaXMgaXMgYSBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlLCBidXQgaWYgeW91IHdhbnQgdG8gbWFrZSIpCi0gIG1lc3NhZ2UoU1RBVFVTICJhIG5ldyBvbmUgc2ltcGx5IGJ1aWxkIHRoZSAnZ2VuZmlsZXMnIHRhcmdldCwgYW5kIGNvcHkiKQotICBtZXNzYWdlKFNUQVRVUyAic2NyaXB0cy9wbmdsaWJjb25mLm91dCB0byBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCIpCi0gIG1lc3NhZ2UoU1RBVFVTICJBTkQgc2V0IFBOR19aTElCX1ZFUk5VTSB0byAwICh5b3UgTVVTVCBkbyB0aGlzKSIpCi0gIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlN0b3BwaW5nIGJ1aWxkIikKLQotZWxzZSgpCi0gIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVuc3VwcG9ydGVkIG91dHB1dDogJHtPVVRQVVR9IikKLWVuZGlmKCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvaW50cHJlZml4LmMgYi9zY3JpcHRzL2ludHByZWZpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTRmOGU5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvaW50cHJlZml4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0KLS8qIGludHByZWZpeC5jIC0gZ2VuZXJhdGUgYW4gdW5wcmVmaXhlZCBpbnRlcm5hbCBzeW1ib2wgbGlzdAotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKi8KLQotI2RlZmluZSBQTkdfSU5URVJOQUxfREFUQSh0eXBlLCBuYW1lLCBhcnJheSlcCi0gICAgICAgIFBOR19ERk4gIkAiIG5hbWUgIkAiCi0KLSNkZWZpbmUgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAotICAgICAgICBQTkdfREZOICJAIiBuYW1lICJAIgotCi0jZGVmaW5lIFBOR19JTlRFUk5BTF9DQUxMQkFDSyh0eXBlLCBuYW1lLCBhcmdzLCBhdHRyaWJ1dGVzKVwKLSAgICAgICAgUE5HX0RGTiAiQCIgbmFtZSAiQCIKLQotI2RlZmluZSBQTkdQUkVGSVhfSCAvKiBzZWxmIGdlbmVyYXRpb24gKi8KLSNpbmNsdWRlICIuLi9wbmdwcml2LmgiCmRpZmYgLS1naXQgYS9zY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiBiL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY2NDMyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotCi11c2FnZSgpCi17Ci0gICAgY2F0IDw8RU9GCi1Vc2FnZTogbGlicG5nLWNvbmZpZyBbT1BUSU9OXSAuLi4KLQotS25vd24gdmFsdWVzIGZvciBPUFRJT04gYXJlOgotCi0gIC0tcHJlZml4ICAgICAgICBwcmludCBsaWJwbmcgcHJlZml4Ci0gIC0tbGliZGlyICAgICAgICBwcmludCBwYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIGxpYnJhcnkKLSAgLS1saWJzICAgICAgICAgIHByaW50IGxpYnJhcnkgbGlua2luZyBpbmZvcm1hdGlvbgotICAtLWNjb3B0cyAgICAgICAgcHJpbnQgY29tcGlsZXIgb3B0aW9ucwotICAtLWNwcGZsYWdzICAgICAgcHJpbnQgcHJlLXByb2Nlc3NvciBmbGFncwotICAtLWNmbGFncyAgICAgICAgcHJpbnQgcHJlcHJvY2Vzc29yIGZsYWdzLCBJX29wdHMsIGFuZCBjb21waWxlciBvcHRpb25zCi0gIC0tSV9vcHRzICAgICAgICBwcmludCAiLUkiIGluY2x1ZGUgb3B0aW9ucwotICAtLUxfb3B0cyAgICAgICAgcHJpbnQgbGlua2VyICItTCIgZmxhZ3MgZm9yIGR5bmFtaWMgbGlua2luZwotICAtLVJfb3B0cyAgICAgICAgcHJpbnQgZHluYW1pYyBsaW5rZXIgIi1SIiBvciAiLXJwYXRoIiBmbGFncwotICAtLWxkb3B0cyAgICAgICAgcHJpbnQgbGlua2VyIG9wdGlvbnMKLSAgLS1sZGZsYWdzICAgICAgIHByaW50IGxpbmtlciBmbGFncyAobGRvcHRzLCBMX29wdHMsIFJfb3B0cywgYW5kIGxpYnMpCi0gIC0tc3RhdGljICAgICAgICByZXZpc2Ugc3Vic2VxdWVudCBvdXRwdXRzIGZvciBzdGF0aWMgbGlua2luZwotICAtLWhlbHAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0Ci0gIC0tdmVyc2lvbiAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi1FT0YKLQotICAgIGV4aXQgJDEKLX0KLQotaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgotICAgIHVzYWdlIDEKLWZpCi0KLXdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgY2FzZSAiJDEiIGluCi0KLSAgICAtLXByZWZpeCkKLSAgICAgICAgZWNobyAke3ByZWZpeH0KLSAgICAgICAgOzsKLQotICAgIC0tdmVyc2lvbikKLSAgICAgICAgZWNobyAke3ZlcnNpb259Ci0gICAgICAgIGV4aXQgMAotICAgICAgICA7OwotCi0gICAgLS1oZWxwKQotICAgICAgICB1c2FnZSAwCi0gICAgICAgIDs7Ci0KLSAgICAtLWNjb3B0cykKLSAgICAgICAgZWNobyAke2Njb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tY3BwZmxhZ3MpCi0gICAgICAgIGVjaG8gJHtjcHBmbGFnc30KLSAgICAgICAgOzsKLQotICAgIC0tY2ZsYWdzKQotICAgICAgICBlY2hvICR7SV9vcHRzfSAke2NwcGZsYWdzfSAke2Njb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tbGliZGlyKQotICAgICAgICBlY2hvICR7bGliZGlyfQotICAgICAgICA7OwotCi0gICAgLS1saWJzKQotICAgICAgICBlY2hvICR7bGlic30KLSAgICAgICAgOzsKLQotICAgIC0tSV9vcHRzKQotICAgICAgICBlY2hvICR7SV9vcHRzfQotICAgICAgICA7OwotCi0gICAgLS1MX29wdHMpCi0gICAgICAgIGVjaG8gJHtMX29wdHN9Ci0gICAgICAgIDs7Ci0KLSAgICAtLVJfb3B0cykKLSAgICAgICAgZWNobyAke1Jfb3B0c30KLSAgICAgICAgOzsKLQotICAgIC0tbGRmbGFncykKLSAgICAgICAgZWNobyAke2xkZmxhZ3N9ICR7TF9vcHRzfSAke1Jfb3B0c30gJHtsaWJzfQotICAgICAgICA7OwotCi0gICAgLS1zdGF0aWMpCi0gICAgICAgIFJfb3B0cz0iIgotICAgICAgICA7OwotCi0gICAgKikKLSAgICAgICAgdXNhZ2UKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIHNoaWZ0Ci1kb25lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW4gYi9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjNmUzOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBsaWJwbmctY29uZmlnCi0jIHByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgbGlicG5nLgotCi0jIENvcHlyaWdodCAoQykgMjAwMiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTW9kZWxlZCBhZnRlciBsaWJ4bWwtY29uZmlnLgotCi12ZXJzaW9uPTEuNi4yNAotcHJlZml4PSIiCi1saWJkaXI9IiIKLWxpYnM9IiIKLUlfb3B0cz0iIgotTF9vcHRzPSIiCi1SX29wdHM9IiIKLWNwcGZsYWdzPSIiCi1jY29wdHM9IiIKLWxkb3B0cz0iIgotCmRpZmYgLS1naXQgYS9zY3JpcHRzL2xpYnBuZy5wYy5pbiBiL3NjcmlwdHMvbGlicG5nLnBjLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQ4MWQzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbGlicG5nLnBjLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcHJlZml4PUBwcmVmaXhACi1leGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACi1saWJkaXI9QGxpYmRpckAKLWluY2x1ZGVkaXI9QGluY2x1ZGVkaXJAL2xpYnBuZzE2Ci0KLU5hbWU6IGxpYnBuZwotRGVzY3JpcHRpb246IExvYWRzIGFuZCBzYXZlcyBQTkcgZmlsZXMKLVZlcnNpb246IDEuNi4yNAotTGliczogLUwke2xpYmRpcn0gLWxwbmcxNgotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFjcm8ubHN0IGIvc2NyaXB0cy9tYWNyby5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTI0YjcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWNyby5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWdldF91aW50XzMyKGJ1ZikKLWdldF91aW50XzE2KGJ1ZikKLWdldF9pbnRfMzIoYnVmKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS4zMnN1bnUgYi9zY3JpcHRzL21ha2VmaWxlLjMyc3VudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0YjdjNS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2VmaWxlLjMyc3VudQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gU29sYXJpcyAyLnggd2l0aCBjYwotIyBDb250cmlidXRlZCBieSBXaWxsaWFtIEwuIFNlYm9rLCBiYXNlZCBvbiBtYWtlZmlsZS5saW51eAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRT1saWJwbmcxNgotUE5HTUFKID0gMTYKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc28KLQotIyBVdGlsaXRpZXM6Ci1DQz1jYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9ZWNobwotUk1fRj0vYmluL3JtIC1mCi0KLVNVTl9DQ19GTEFHUz0tZmFzdCAteHRhcmdldD11bHRyYQotU1VOX0xEX0ZMQUdTPS1mYXN0IC14dGFyZ2V0PXVsdHJhCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvIGFuZCBsaWJwbmcxNi9wbmcuaAotcHJlZml4PS9hCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jIENoYW5naW5nIHRoZXNlIHRvIC4uL3psaWIgcG9zZXMgYSBzZWN1cml0eSByaXNrLiAgSWYgeW91IHdhbnQKLSMgdG8gaGF2ZSB6bGliIGluIGFuIGFkamFjZW50IGRpcmVjdG9yeSwgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIGluc3RlYWQgb2YgIi4uIi4KLSNaTElCTElCPS4uL3psaWIKLSNaTElCSU5DPS4uL3psaWIKLQotWkxJQkxJQj0vdXNyL2xpYgotWkxJQklOQz0vdXNyL2luY2x1ZGUKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi1DUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01Ci1DRkxBR1M9JChTVU5fQ0NfRkxBR1MpICMgJChXQVJOTU9SRSkgLWcKLUxERkxBR1M9JChTVU5fTERfRkxBR1MpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgbGlicG5nLmEgLWx6IC1sbQotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1pbmNsdWRlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsKLURFTEVURSA9ICQoUk1fRikKLURGTkZMQUdTID0gJChERUZTKSAkKENQUEZMQUdTKQotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBsaWJkaXI9XCIkKExJQlBBVEgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBSX29wdHM9XCItUiQoTElCUEFUSClcIjsgXAotCWVjaG8gY2NvcHRzPVwiLWZhc3QgLXh0YXJnZXQ9dWx0cmFcIjsgXAotCWVjaG8gbGRvcHRzPVwiLWZhc3QgLXh0YXJnZXQ9dWx0cmFcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCUBjYXNlICJgdHlwZSBsZGAiIGluICp1Y2IqKSBcCi0JZWNobzsgXAotCWVjaG8gJyMjIFdBUk5JTkc6JzsgXAotCWVjaG8gJyMjIFRoZSBjb21tYW5kcyAiQ0MiIGFuZCAiTEQiIG11c3QgTk9UIHJlZmVyIHRvIC91c3IvdWNiL2NjJzsgXAotCWVjaG8gJyMjIGFuZCAvdXNyL3VjYi9sZC4gIElmIHRoZXkgZG8sIHlvdSBuZWVkIHRvIGFkanVzdCB5b3VyIFBBVEgnOyBcCi0JZWNobyAnIyMgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcHV0IC91c3IvY2NzL2JpbiBhaGVhZCBvZiAvdXNyL3VjYi4nOyBcCi0JZWNobyAnIyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExEX0xJQlJBUllfUEFUSCBzaG91bGQgbm90IGJlIHNldCc7IFwKLQllY2hvICcjIyBhdCBhbGwuICBJZiBpdCBpcywgdGhpbmdzIGFyZSBsaWtlbHkgdG8gYnJlYWsgYmVjYXVzZSBvZic7IFwKLQllY2hvICcjIyB0aGUgbGlidWNiIGRlcGVuZGVuY3kgdGhhdCBpcyBjcmVhdGVkLic7IFwKLQllY2hvOyBcCi0JOzsgXAotCWVzYWMKLQkkKExEKSAtRyAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpIC1oICQoTElCU09NQUopIFwKLQkgLW8gJChMSUJTT01BSikgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYwotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCi0JJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgJChTVU5fQ0NfRkxBR1MpIC1JJChESSkgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RkIC1MJChETCkgLVIkKERMKSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKFNVTl9DQ19GTEFHUykgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgICQoU1VOX0xEX0ZMQUdTKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuNjRzdW51IGIvc2NyaXB0cy9tYWtlZmlsZS42NHN1bnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWZjZTkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS42NHN1bnUKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggY2MKLSMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5OCBHcmVnIFJvZWxvZnMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0KLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLUxJQk5BTUU9bGlicG5nMTYKLVBOR01BSiA9IDE2Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotQ0M9Y2MKLUFSX1JDPWFyIHJjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtZiAtcwotUkFOTElCPWVjaG8KLVJNX0Y9L2Jpbi9ybSAtZgotCi1TVU5fQ0NfRkxBR1M9LWZhc3QgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5Ci1TVU5fTERfRkxBR1M9LWZhc3QgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5Ci0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvIGFuZCBsaWJwbmcxNi9wbmcuaAotcHJlZml4PS9hCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jIENoYW5naW5nIHRoZXNlIHRvIC4uL3psaWIgcG9zZXMgYSBzZWN1cml0eSByaXNrLiAgSWYgeW91IHdhbnQKLSMgdG8gaGF2ZSB6bGliIGluIGFuIGFkamFjZW50IGRpcmVjdG9yeSwgc3BlY2lmeSB0aGUgZnVsbCBwYXRoIGluc3RlYWQgb2YgIi4uIi4KLSNaTElCTElCPS4uL3psaWIKLSNaTElCSU5DPS4uL3psaWIKLQotWkxJQkxJQj0vdXNyL2xpYgotWkxJQklOQz0vdXNyL2luY2x1ZGUKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi1DUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01Ci1DRkxBR1M9ICQoU1VOX0NDX0ZMQUdTKSAjICQoV0FSTk1PUkUpIC1nCi1MREZMQUdTPS1MLiAtUi4gJChTVU5fTERfRkxBR1MpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1LUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWluY2x1ZGUgc2NyaXB0cy9wbmdsaWJjb25mLm1hawotREVMRVRFID0gJChSTV9GKQotREZORkxBR1MgPSAkKERFRlMpICQoQ1BQRkxBR1MpCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1SJChMSUJQQVRIKVwiOyBcCi0JZWNobyBjY29wdHM9XCItZmFzdCAteHRhcmdldD11bHRyYSAteGFyY2g9djlcIjsgXAotCWVjaG8gbGRvcHRzPVwiLWZhc3QgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5XCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAotCWVjaG87IFwKLQllY2hvICcjIyBXQVJOSU5HOic7IFwKLQllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKLQllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAotCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAotCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCi0JZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCi0JZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCi0JZWNobzsgXAotCTs7IFwKLQllc2FjCi0JJChMRCkgLUcgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtaCAkKExJQlNPTUFKKSBcCi0JIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYwotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCi0JJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgJChTVU5fQ0NfRkxBR1MpIC1JJChESSkgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RkIC1MJChETCkgLVIkKERMKSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAkKFNVTl9MRF9GTEFHUykgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKFNVTl9DQ19GTEFHUykgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgICQoU1VOX0xEX0ZMQUdTKSAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQlsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuYWNvcm4gYi9zY3JpcHRzL21ha2VmaWxlLmFjb3JuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGI4ZmI1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuYWNvcm4KKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFByb2plY3Q6ICAgbGlicG5nCi0KLQotIyBUb29sZmxhZ3M6Ci1DQ2ZsYWdzID0gLWMgLWRlcGVuZCAhRGVwZW5kIC1JQzosWmxpYjogLWcgLXRocm93YmFjayAgLURSSVNDT1MgIC1mbmFoCi1DKytmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC10aHJvd2JhY2sKLUxpbmtmbGFncyA9IC1haWYgLWMrKyAtbyAkQAotT2JqQXNtZmxhZ3MgPSAtdGhyb3diYWNrIC1Ob0NhY2hlIC1kZXBlbmQgIURlcGVuZAotQ01IR2ZsYWdzID0KLUxpYkZpbGVmbGFncyA9IC1jIC1sIC1vICRACi1TcXVlZXplZmxhZ3MgPSAtbyAkQAotCi0jIEZpbmFsIHRhcmdldHM6Ci1ALmxpYnBuZy1saWI6ICAgQC5vLnBuZyBALm8ucG5nZXJyb3IgQC5vLnBuZ3JpbyBALm8ucG5nd2lvIEAuby5wbmdtZW0gXAotCUAuby5wbmdwcmVhZCBALm8ucG5nc2V0IEAuby5wbmdnZXQgQC5vLnBuZ3JlYWQgQC5vLnBuZ3J0cmFuIFwKLQlALm8ucG5ncnV0aWwgQC5vLnBuZ3RyYW5zIEAuby5wbmd3cml0ZSBALm8ucG5nd3RyYW4gQC5vLnBuZ3d1dGlsCi0JTGliRmlsZSAkKExpYkZpbGVmbGFncykgQC5vLnBuZyBALm8ucG5nZXJyb3IgQC5vLnBuZ3JpbyBALm8ucG5ncnRyYW4gXAotCUAuby5wbmdtZW0gQC5vLnBuZ3ByZWFkIEAuby5wbmdzZXQgQC5vLnBuZ2dldCBALm8ucG5ncmVhZCBALm8ucG5nd2lvIFwKLQlALm8ucG5ncnV0aWwgQC5vLnBuZ3RyYW5zICBALm8ucG5nd3JpdGUgQC5vLnBuZ3d0cmFuIEAuby5wbmd3dXRpbAotQC5tbS1saWJwbmctbGliOiAgIEAubW0ucG5nIEAubW0ucG5nZXJyb3IgQC5tbS5wbmdyaW8gQC5tbS5wbmd3aW8gQC5tbS5wbmdtZW0gXAotCUAubW0ucG5ncHJlYWQgQC5tbS5wbmdzZXQgQC5tbS5wbmdnZXQgQC5tbS5wbmdyZWFkIEAubW0ucG5ncnRyYW4gXAotCUAubW0ucG5ncnV0aWwgQC5tbS5wbmd0cmFucyBALm1tLnBuZ3dyaXRlIEAubW0ucG5nd3RyYW4gQC5tbS5wbmd3dXRpbAotCUxpYkZpbGUgJChMaWJGaWxlZmxhZ3MpIEAubW0ucG5nIEAubW0ucG5nZXJyb3IgQC5tbS5wbmdyaW8gXAotCUAubW0ucG5nd2lvIEAubW0ucG5nbWVtIEAubW0ucG5ncHJlYWQgQC5tbS5wbmdzZXQgQC5tbS5wbmdnZXQgXAotCUAubW0ucG5ncmVhZCBALm1tLnBuZ3J0cmFuIEAubW0ucG5ncnV0aWwgQC5tbS5wbmd0cmFucyBALm1tLnBuZ3dyaXRlIFwKLQlALm1tLnBuZ3d0cmFuIEAubW0ucG5nd3V0aWwKLQotCi0jIFVzZXItZWRpdGFibGUgZGVwZW5kZW5jaWVzOgotIyAoQykgQ29weXJpZ2h0IDE5OTcgVG9tIFRhbm5lcgotVGVzdDogQC5wbmd0ZXN0Ci0JPFByZWZpeCREaXI+LnBuZ3Rlc3QKLQlAcmVtb3ZlIDxQcmVmaXgkRGlyPi5wbmd0ZXN0Ci0KLSNJdCB3b3VsZCBiZSBuaWNlIGlmIHlvdSBjb3VsZCBzdG9wICJtYWtlIiBsaXN0aW5nIGZyb20gaGVyZSBvbiEKLUAucG5ndGVzdDogICBALm8ucG5ndGVzdCBALmxpYnBuZy1saWIgQzpvLlN0dWJzIFpsaWI6emxpYl9saWIKLQlMaW5rICQoTGlua2ZsYWdzKSBALm8ucG5ndGVzdCBALmxpYnBuZy1saWIgQzpvLlN0dWJzIFpsaWI6emxpYl9saWIKLQotLlNVRkZJWEVTOiAubyAubW0gLmMKLQotLmMubW06Ci0JTWVtQ2hlY2suQ0MgY2MgJChjY2ZsYWdzKSAtbyAkQCBMaWJQbmc6JDwKLS5jLm86Ci0JY2MgJChjY2ZsYWdzKSAtbyAkQCAkPAotCi0jIFNlZSBzY3JpcHRzLm1hay5saWJwbmdjb25mIGZvciBob3cgdG8gZ2VuZXJhdGUgdGhpczoKLUAuaC5saWJwbmdjb25mOiBALnNjcmlwdHMuaC5saWJwbmdjb25mCi0JY29weSBALnNjcmlwdHMuaC5saWJwbmdjb25mICRACi0KLSMgU3RhdGljIGRlcGVuZGVuY2llczoKLUAuby5wbmcgQC5vLnBuZ2Vycm9yIEAuby5wbmdyaW8gQC5vLnBuZ3dpbyBALm8ucG5nbWVtIFwKLUAuby5wbmdwcmVhZCBALm8ucG5nc2V0IEAuby5wbmdnZXQgQC5vLnBuZ3JlYWQgQC5vLnBuZ3J0cmFuIFwKLUAuby5wbmdydXRpbCBALm8ucG5ndHJhbnMgQC5vLnBuZ3dyaXRlIEAuby5wbmd3dHJhbiBALm8ucG5nd3V0aWwgXAotQC5vLnBuZ3Rlc3Q6IEAuaC5saWJwbmdjb25mCi0KLQotIyBEeW5hbWljIGRlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuYWl4IGIvc2NyaXB0cy9tYWtlZmlsZS5haXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjJkNTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5haXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIHVzaW5nIGdjYyAoZ2VuZXJpYywgc3RhdGljIGxpYnJhcnkpCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNi0yMDA5LCAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAgQ29zbWluIFRydXRhCi0jIENvcHlyaWdodCAoQykgMjAwMCBNYXJjIE8uIEdsb29yIChBSVggc3VwcG9ydCBhZGRlZCwgZnJvbSBtYWtlZmlsZS5nY2MpCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExvY2F0aW9uIG9mIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMKLVpMSUJJTkMgPSAuLi96bGliCi1aTElCTElCID0gLi4vemxpYgotCi0jIENvbXBpbGVyLCBsaW5rZXIsIGxpYiBhbmQgb3RoZXIgdG9vbHMKLUNDID0gZ2NjCi1MRCA9ICQoQ0MpCi1BUl9SQyA9IGFyIHJjcwotTUtESVJfUCA9IG1rZGlyIC1wCi1SQU5MSUIgPSByYW5saWIKLVJNX0YgPSBybSAtZgotTE5fU0YgPSBsbiAtZiAtcwotCi1MSUJOQU1FID0gbGlicG5nMTYKLVBOR01BSiA9IDE2Ci0KLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi0KLVdBUk5NT1JFID0KLUNQUEZMQUdTID0gLUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQotQ0ZMQUdTID0gLVcgLVdhbGwgLU8yICMgJChXQVJOTU9SRSkgLWcKLUxERkxBR1MgPSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nMTYgLWx6IC1sbQotCi0jIFZhcmlhYmxlcwotT0JKUyA9ICBwbmcubyBwbmdlcnJvci5vIHBuZ2dldC5vIHBuZ21lbS5vIHBuZ3ByZWFkLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmdydHJhbi5vIHBuZ3J1dGlsLm8gcG5nc2V0Lm8gXAotCXBuZ3RyYW5zLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmd3dHJhbi5vIHBuZ3d1dGlsLm8KLQotIyBUYXJnZXRzCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1hbGw6ICQoTElCTkFNRSkuYSBwbmd0ZXN0JChFKQotCi1pbmNsdWRlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsKLVJFTU9WRSA9ICQoUk1fRikKLURGTkZMQUdTID0gJChERUZTKSAkKENQUEZMQUdTKQotCi0kKExJQk5BTUUpLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXRlc3Q6IHBuZ3Rlc3QkKEUpCi0JLi9wbmd0ZXN0JChFKQotCi1wbmd0ZXN0JChFKTogcG5ndGVzdC5vICQoTElCTkFNRSkuYQotCSQoTEQpIC1vICRAIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLWluc3RhbGw6ICQoTElCTkFNRSkuYQotCS1AaWYgWyAhIC1kICQoREkpICBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSAgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERJKS8kKExJQk5BTUUpL3BuZy5oCi0JLUAkKFJNX0YpICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oCi0JLUAkKFJNX0YpICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oCi0JLUAkKFJNX0YpICQoREkpL3BuZ2NvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmdsaWJjb25mLmgKLQljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCBcCi0JJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggXAotCSQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpIC1yICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCS1AJChSTV9GKSAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQljcCAkKExJQk5BTUUpLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCShjZCAkKERJKTsgJChMTl9TRikgbGlicG5nLyogLjspCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vICQoTElCTkFNRSkuYSBwbmd0ZXN0IHBuZ291dC5wbmcgcG5nbGliY29uZi5oCi0KLXBuZy5vOiAgICAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vOiAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3NldC5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotcG5ndGVzdC5vOiAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5hbWlnYSBiL3NjcmlwdHMvbWFrZWZpbGUuYW1pZ2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTRiZDUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5hbWlnYQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMgQ29tbW9kb3JlIEFtaWdhIE1ha2VmaWxlCi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgYW5kIFNBUyBDIFY2LjV4IGNvbXBpbGVyCi0jIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFdvbGYgRmF1c3QKLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotIwotIyBMb2NhdGlvbi9wYXRoIG9mIHpsaWIgaW5jbHVkZSBmaWxlcwotWkxJQj0vemxpYgotI2NvbXBpbGVyCi1DQz1zYwotI2NvbXBpbGVyIGZsYWdzCi0jIFdBUk5JTkc6IGEgYnVnIGluIFY2LjUxIGNhdXNlcyBiYWQgY29kZSB3aXRoIE9QVEdPCi0jICAgICAgICAgIFNvIHVzZSBWNi41NSBvciBzZXQgTk9PUFRHTyEhISEhISEhIQotQ0ZMQUdTPSBOT1NUS0NISyBQQVJNUz1SRUcgT1BUSU1JWkUgT1BUR08gT1BUUEVFUCBPUFRJTkxPQ0FMIE9QVElOTFwKLQlPUFRMT09QIE9QVFJERVA9NCBPUFRERVA9NCBPUFRDT01QPTQgSU5DTFVERURJUj0kKFpMSUIpIFwKLQlERUZJTkU9UE5HX0lOVEVSTkFMCi0jbGlua2VyIGZsYWdzCi1MREZMQUdTPSBTRCBORCBCQVRDSAotI2xpbmsgbGlicwotTERMSUJTPSBsaWJwbmcubGliIGxpYmd6LmxpYiBMSUI6c2NtLmxpYiBMSUI6c2MubGliIExpYjphbWlnYS5saWIKLSMgbGlua2VyCi1MTj0gc2xpbmsKLSMgZmlsZSBkZWxldGlvbiBjb21tYW5kCi1STT0gZGVsZXRlIHF1aWV0Ci0jIGxpYnJhcnkgKC5saWIpIGZpbGUgY3JlYXRpb24gY29tbWFuZAotQVI9IG9tbAotIyBtYWtlIGRpcmVjdG9yeSBjb21tYW5kCi1NS0RJUj0gbWFrZWRpcgotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotYWxsOiBsaWJwbmcubGliIHBuZ3Rlc3QKLQotbGlicG5nLmxpYjogJChPQkpTKQotLSQoUk0pIGxpYnBuZy5saWIKLSQoQVIpIGxpYnBuZy5saWIgciAkKE9CSlMpCi0KLSQoT0JKUyk6IHBuZ3ByaXYuaCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ2luZm8uaCBwbmdzdHJ1Y3QuaCBwbmdkZWJ1Zy5oCi0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi1DT1BZICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSBUTyBwbmdsaWJjb25mLmgKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5saWIKLSQoTE4pIDxXSVRIIDwKLSQoTERGTEFHUykKLVRPIHBuZ3Rlc3QKLUZST00gTElCOmMubyBwbmd0ZXN0Lm8KLUxJQiAkKExETElCUykKLTwKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5hdGFyaSBiL3NjcmlwdHMvbWFrZWZpbGUuYXRhcmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGJkNDkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5hdGFyaQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotIwotIyBNb2RpZmllZCBmb3IgTEM1Ni9BVEFSSSBhc3N1bWVzIGxpYnoubGliIGlzIGluIHNhbWUgZGlyIGFuZCB1c2VzIGRlZmF1bHQKLSMgcnVsZXMgZm9yIGxpYnJhcnkgbWFuYWdlbWVudAotIwotQ1BQRkxBR1MgPSAtSS4uXHpsaWIKLUNGTEFHUyA9IC1PCi1MQlIgPSBwbmcubGliCi1MREZMQUdTID0gLUwuIC1MLi5cemxpYiAtbHBuZyAtbHogLWxtCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKHByZWZpeCkvbGliCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotT0JKUyA9ICQoTEJSKShwbmcubykgJChMQlIpKHBuZ3NldC5vKSAkKExCUikocG5nZ2V0Lm8pICQoTEJSKShwbmdydXRpbC5vKVwKLQkkKExCUikocG5ndHJhbnMubykgJChMQlIpKHBuZ3d1dGlsLm8pXAotCSQoTEJSKShwbmdyZWFkLm8pICQoTEJSKShwbmdlcnJvci5vKSAkKExCUikocG5nd3JpdGUubylcCi0JJChMQlIpKHBuZ3J0cmFuLm8pICQoTEJSKShwbmd3dHJhbi5vKVwKLQkkKExCUikocG5nbWVtLm8pICQoTEJSKShwbmdyaW8ubykgJChMQlIpKHBuZ3dpby5vKSAkKExCUikocG5ncHJlYWQubykKLQotYWxsOiAkKExCUikgcG5ndGVzdC50dHAKLQotLmMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJDwKLQotJChMQlIpOiAkKE9CSlMpCi0KLSQoT0JKUyk6IHBuZ3ByaXYuaCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ2luZm8uaCBwbmdzdHJ1Y3QuaCBwbmdkZWJ1Zy5oCi0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi0JY3AgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACi0KLXBuZ3Rlc3QudHRwOiBwbmd0ZXN0Lm8gJChMQlIpCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8kQCBwbmd0ZXN0Lm8KLQotaW5zdGFsbDogbGlicG5nLmEKLQktQG1rZGlyICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQktQG1rZGlyICQoREVTVERJUikkKExJQlBBVEgpCi0JLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nY29uZi5oCi0JLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdsaWJjb25mLmgKLQljcCBwbmcuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljcCBwbmdjb25mLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY3AgcG5nbGliY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nLmgKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2NvbmYuaAotCWNobW9kIDY0NCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcvcG5nbGliY29uZi5oCi0JKGNkICQoREVTVERJUikkKElOQ1BBVEgpOyBsbiAtZiAtcyAkKExJQk5BTUUpIGxpYnBuZzsgXAotCWxuIC1mIC1zICQoTElCTkFNRSkvKiAuKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5iYzMyIGIvc2NyaXB0cy9tYWtlZmlsZS5iYzMyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGJjNGNiLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuYmMzMgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBsaWJwbmcKLSMgMzItYml0IEJvcmxhbmQgQysrIChOb3RlOiBBbGwgbW9kdWxlcyBhcmUgY29tcGlsZWQgaW4gQyBtb2RlKQotIyBUbyBidWlsZCB0aGUgbGlicmFyeSwgZG86Ci0jICAgICAgICJtYWtlIC1mbWFrZWZpbGUuYmMzMiIKLSMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gMzItYml0IEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMjIyBBYnNvbHV0ZWx5IG5lY2Vzc2FyeSBmb3IgdGhpcyBtYWtlZmlsZSB0byB3b3JrCi0uQVVUT0RFUEVORAotCi0jIyBXaGVyZSB6bGliLmgsIHpjb25mLmggYW5kIHpsaWIubGliIGFyZQotWkxJQl9ESVI9Li5cemxpYgotCi0jIyBDb21waWxlciwgbGlua2VyLCBsaWJyYXJpYW4gYW5kIG90aGVyIHRvb2xzCi1DQz1iY2MzMgotTEQ9YmNjMzIKLUxJQj10bGliCi1DUD1jb3B5Ci0KLSMgLTMgPSAzODYsIC00ID0gNDg2LCAtNSA9IFBlbnRpdW0gZXRjLgotIWlmbmRlZiBUQVJHRVRfQ1BVCi0jVEFSR0VUX0NQVT0tNgotIWVuZGlmCi0KLSMgVXNlIHRoaXMgaWYgeW91IGRvbid0IHdhbnQgQm9ybGFuZCdzIGZhbmN5IGV4Y2VwdGlvbiBoYW5kbGluZwotIyAoQ2F1dGlvbjogZG9lc24ndCB3b3JrIHdpdGggQ0J1aWxkZXJYKQotI05PRUhMSUI9bm9laDMyLmxpYgotCi0haWZkZWYgREVCVUcKLUNERUJVRz0tdgotTERFQlVHPS12Ci0hZWxzZQotQ0RFQlVHPQotTERFQlVHPQotIWVuZGlmCi0KLSMgU1RBQ0tPRkxPVz0xCi0haWZkZWYgU1RBQ0tPRkxPVwotQ0RFQlVHPSQoQ0RFQlVHKSAtTgotTERFQlVHPSQoTERFQlVHKSAtTgotIWVuZGlmCi0KLSMgLU8yIG9wdGltaXplIGZvciBzcGVlZAotIyAtZCAgbWVyZ2UgZHVwbGljYXRlIHN0cmluZ3MKLSMgLWstIHR1cm4gb2ZmIHN0YW5kYXJkIHN0YWNrIGZyYW1lCi0jIC13ICBkaXNwbGF5IGFsbCB3YXJuaW5ncwotQ1BQRkxBR1M9LUkkKFpMSUJfRElSKQotQ0ZMQUdTPS1PMiAtZCAtay0gLXcgJChUQVJHRVRfQ1BVKSAkKENERUJVRykKLQotIyAtTSAgZ2VuZXJhdGUgbWFwIGZpbGUKLUxERkxBR1M9LUwkKFpMSUJfRElSKSAtTSAkKExERUJVRykKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0c1xwbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi0haWZuZGVmIFBOR0xJQkNPTkZfSF9QUkVCVUlMVAotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQKLSFlbmRpZgotCi0jIyBWYXJpYWJsZXMKLU9CSlMgPSBcCi0JcG5nLm9iaiBcCi0JcG5nZXJyb3Iub2JqIFwKLQlwbmdnZXQub2JqIFwKLQlwbmdtZW0ub2JqIFwKLQlwbmdwcmVhZC5vYmogXAotCXBuZ3JlYWQub2JqIFwKLQlwbmdyaW8ub2JqIFwKLQlwbmdydHJhbi5vYmogXAotCXBuZ3J1dGlsLm9iaiBcCi0JcG5nc2V0Lm9iaiBcCi0JcG5ndHJhbnMub2JqIFwKLQlwbmd3aW8ub2JqIFwKLQlwbmd3cml0ZS5vYmogXAotCXBuZ3d0cmFuLm9iaiBcCi0JcG5nd3V0aWwub2JqCi0KLUxJQk9CSlMgPSBcCi0JK3BuZy5vYmogXAotCStwbmdlcnJvci5vYmogXAotCStwbmdnZXQub2JqIFwKLQkrcG5nbWVtLm9iaiBcCi0JK3BuZ3ByZWFkLm9iaiBcCi0JK3BuZ3JlYWQub2JqIFwKLQkrcG5ncmlvLm9iaiBcCi0JK3BuZ3J0cmFuLm9iaiBcCi0JK3BuZ3J1dGlsLm9iaiBcCi0JK3BuZ3NldC5vYmogXAotCStwbmd0cmFucy5vYmogXAotCStwbmd3aW8ub2JqIFwKLQkrcG5nd3JpdGUub2JqIFwKLQkrcG5nd3RyYW4ub2JqIFwKLQkrcG5nd3V0aWwub2JqCi0KLUxJQk5BTUU9bGlicG5nLmxpYgotCi0jIyBJbXBsaWNpdCBydWxlcwotIyBCcmFjZXMgbGV0IG1ha2UgImJhdGNoIiBjYWxscyB0byB0aGUgY29tcGlsZXIsCi0jIDIgY2FsbHMgaW5zdGVhZCBvZiAxMjsgc3BhY2UgaXMgaW1wb3J0YW50LgotLmMub2JqOgotCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtYyB7JCouYyB9Ci0KLS5jLmV4ZToKLQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAkKi5jIFwKLQkgICQoTElCTkFNRSkgemxpYi5saWIgJChOT0VITElCKQotCi0ub2JqLmV4ZToKLQkkKExEKSAkKExERkxBR1MpICQqLm9iaiAkKExJQk5BTUUpIHpsaWIubGliICQoTk9FSExJQikKLQotIyMgTWFqb3IgdGFyZ2V0cwotYWxsOiBsaWJwbmcgcG5ndGVzdAotCi1saWJwbmc6ICQoTElCTkFNRSkKLQotcG5ndGVzdDogcG5ndGVzdC5leGUKLQotdGVzdDogcG5ndGVzdC5leGUKLQlwbmd0ZXN0Ci0KLSMjIE1pbm9yIFRhcmdldHMKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotcG5nLm9iajogcG5nLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm9iajogcG5nZXJyb3IuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm9iajogcG5nZ2V0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vYmo6IHBuZ21lbS5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vYmo6IHBuZ3ByZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQub2JqOiBwbmdyZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vYmo6IHBuZ3Jpby5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vYmo6IHBuZ3J0cmFuLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm9iajogcG5ncnV0aWwuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm9iajogcG5nc2V0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm9iajogcG5ndHJhbnMuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm9iajogcG5nd2lvLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm9iajogcG5nd3JpdGUuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ub2JqOiBwbmd3dHJhbi5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vYmo6IHBuZ3d1dGlsLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Rlc3Qub2JqOiBwbmd0ZXN0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCi0kKExJQk5BTUUpOiAkKE9CSlMpCi0JLWRlbCAkKExJQk5BTUUpCi0JJChMSUIpICQoTElCTkFNRSkgQCYmfAotJChMSUJPQkpTKSwgbGlicG5nCi18Ci0KLSMgQ2xlYW51cAotY2xlYW46Ci0JLWRlbCBwbmdsaWJjb25mLmgKLQktZGVsICoub2JqCi0JLWRlbCAkKExJQk5BTUUpCi0JLWRlbCBwbmd0ZXN0LmV4ZQotCS1kZWwgKi5sc3QKLQktZGVsICoubWFwCi0JLWRlbCAqLnRkcwotCS1kZWwgcG5nb3V0LnBuZwotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLmJlb3MgYi9zY3JpcHRzL21ha2VmaWxlLmJlb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzQ2ZjEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5iZW9zCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBCZU9TIHg4NiBFTEYgd2l0aCBnY2MKLSMgbW9kaWZpZWQgZnJvbSBtYWtlZmlsZS5saW51eCBieSBTYW5kZXIgU3Rva3MKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA4LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5OSBHcmVnIFJvZWxvZnMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FPWxpYnBuZzE2Ci1QTkdNQUogPSAxNgotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotCi0jIFV0aWxpdGllczoKLUNDPWdjYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotQ1A9Y3AKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9L3Vzci9sb2NhbC9saWIKLVpMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0KLUFMSUdOPQotIyBGb3IgaTM4NjoKLSMgQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLSMgT24gQmVPUywgLU8xIGlzIGFjdHVhbGx5IGJldHRlciB0aGFuIC1PMy4gIFRoaXMgaXMgYSBrbm93biBidWcgYnV0IGl0J3MKLSMgc3RpbGwgaGVyZSBpbiBSNC41Ci1DUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01Ci1DRkxBR1M9LVcgLVdhbGwgLU8xIC1mdW5yb2xsLWxvb3BzICQoQUxJR04pICMgJChXQVJOTU9SRSkgLWcKLSMgTERGTEFHUz0tTC4gLVdsLC1ycGF0aCwuIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgLWxwbmcgLWx6Ci1MREZMQUdTPS1MLiAtV2wsLXNvbmFtZT0kKExJQlNPTUFKKSAtTCQoWkxJQkxJQikgLWx6Ci0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvKiwgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUykKLQotLlNVRkZJWEVTOiAgICAgIC5jIC5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNiAtbHogXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0JY3AgJChMSUJTTykqIC9ib290L2hvbWUvY29uZmlnL2xpYgotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCSQoQ0MpIC1ub3N0YXJ0IC1XbCwtc29uYW1lLCQoTElCU09NQUopIC1vIFwKLQkkKExJQlNPTUFKKSAkKE9CSlNETEwpICQoTERGTEFHUykKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLUwkKFpMSUJMSUIpIC1MLiAtbHogLWxwbmcxNiAtbyBwbmd0ZXN0IHBuZ3Rlc3QubwotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYwotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCi0JJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAkKENQUEZMQUdTKSAkKENGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGggJChaTElCTElCKTokKERMKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcgbGlicG5nLWNvbmZpZyBcCi0JJChMSUJTTykgJChMSUJTT01BSikqIHBuZ3Rlc3RpIFwKLQlwbmdsaWJjb25mLmggbGlicG5nLnBjCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLmJvciBiL3NjcmlwdHMvbWFrZWZpbGUuYm9yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjkzNzcyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuYm9yCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZwotIyAxNi1iaXQgQm9ybGFuZCBDKysgKE5vdGU6IEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUpCi0jIFRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCBkbzoKLSMgICAgICAgIm1ha2UgLWZtYWtlZmlsZS5ib3IgLURNT0RFTD1jIgotIyBvcjogICAibWFrZSAtZm1ha2VmaWxlLmJvciAtRE1PREVMPWwiCi0jCi0jIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KLQotIyMjIEFic29sdXRlbHkgbmVjZXNzYXJ5IGZvciB0aGlzIG1ha2VmaWxlIHRvIHdvcmsKLS5BVVRPREVQRU5ECi0KLSMjIFdoZXJlIHpsaWIuaCwgemNvbmYuaCBhbmQgemxpYl9NT0RFTC5saWIgYXJlCi1aTElCX0RJUj0uLlx6bGliCi0KLSMjIENvbXBpbGVyLCBsaW5rZXIsIGxpYnJhcmlhbiBhbmQgb3RoZXIgdG9vbHMKLUNDPWJjYwotTEQ9YmNjCi1MSUI9dGxpYgotQ1A9Y29weQotCi0haWZuZGVmIE1PREVMCi1NT0RFTD1sCi0hZW5kaWYKLQotTU9ERUxfQVJHPS1tJChNT0RFTCkKLQotI1RBUkdFVF9DUFU9MwotIyAyID0gMjg2LCAzID0gMzg2LCBldGMuCi0haWZuZGVmIFRBUkdFVF9DUFUKLVRBUkdFVF9DUFU9MgotIWVuZGlmCi0KLSMgVXNlIHRoaXMgaWYgeW91IGRvbid0IHdhbnQgQm9ybGFuZCdzIGZhbmN5IGV4Y2VwdGlvbiBoYW5kbGluZwotIyAoZm9yIEJvcmxhbmQgQysrIDQuMCBvciBsYXRlcikKLSNOT0VITElCPW5vZWgkKE1PREVMKS5saWIKLQotIWlmZGVmIERFQlVHCi1DREVCVUc9LXYKLUxERUJVRz0tdgotIWVsc2UKLUNERUJVRz0KLUxERUJVRz0KLSFlbmRpZgotCi0jIFNUQUNLT0ZMT1c9MQotIWlmZGVmIFNUQUNLT0ZMT1cKLUNERUJVRz0kKENERUJVRykgLU4KLUxERUJVRz0kKExERUJVRykgLU4KLSFlbmRpZgotCi0jIC1YLSB0dXJuIG9uIGRlcGVuZGVuY3kgZ2VuZXJhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUKLSMgLXcgIHNldCBhbGwgd2FybmluZ3Mgb24KLSMgLU8yIG9wdGltaXplIGZvciBzcGVlZAotIyAtWiAgZ2xvYmFsIG9wdGltaXphdGlvbgotQ1BQRkxBR1M9LUkkKFpMSUJfRElSKQotQ0ZMQUdTPS1PMiAtWiAtWC0gLXcgLSQoVEFSR0VUX0NQVSkgJChNT0RFTF9BUkcpICQoQ0RFQlVHKQotCi0jIC1NICBnZW5lcmF0ZSBtYXAgZmlsZQotTERGTEFHUz0tTSAtTCQoWkxJQl9ESVIpICQoTU9ERUxfQVJHKSAkKExERUJVRykKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0c1xwbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi0haWZuZGVmIFBOR0xJQkNPTkZfSF9QUkVCVUlMVAotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQKLSFlbmRpZgotCi0jIyBWYXJpYWJsZXMKLQotT0JKUyA9IFwKLQlwbmcub2JqIFwKLQlwbmdlcnJvci5vYmogXAotCXBuZ2dldC5vYmogXAotCXBuZ21lbS5vYmogXAotCXBuZ3ByZWFkLm9iaiBcCi0JcG5ncmVhZC5vYmogXAotCXBuZ3Jpby5vYmogXAotCXBuZ3J0cmFuLm9iaiBcCi0JcG5ncnV0aWwub2JqIFwKLQlwbmdzZXQub2JqIFwKLQlwbmd0cmFucy5vYmogXAotCXBuZ3dpby5vYmogXAotCXBuZ3dyaXRlLm9iaiBcCi0JcG5nd3RyYW4ub2JqIFwKLQlwbmd3dXRpbC5vYmoKLQotTElCT0JKUyA9IFwKLQkrcG5nLm9iaiBcCi0JK3BuZ2Vycm9yLm9iaiBcCi0JK3BuZ2dldC5vYmogXAotCStwbmdtZW0ub2JqIFwKLQkrcG5ncHJlYWQub2JqIFwKLQkrcG5ncmVhZC5vYmogXAotCStwbmdyaW8ub2JqIFwKLQkrcG5ncnRyYW4ub2JqIFwKLQkrcG5ncnV0aWwub2JqIFwKLQkrcG5nc2V0Lm9iaiBcCi0JK3BuZ3RyYW5zLm9iaiBcCi0JK3BuZ3dpby5vYmogXAotCStwbmd3cml0ZS5vYmogXAotCStwbmd3dHJhbi5vYmogXAotCStwbmd3dXRpbC5vYmoKLQotTElCTkFNRT1saWJwbmckKE1PREVMKS5saWIKLQotIyMgSW1wbGljaXQgcnVsZXMKLQotIyBCcmFjZXMgbGV0IG1ha2UgImJhdGNoIiBjYWxscyB0byB0aGUgY29tcGlsZXIsCi0jIDIgY2FsbHMgaW5zdGVhZCBvZiAxMjsgc3BhY2UgaXMgaW1wb3J0YW50LgotLmMub2JqOgotCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtYyB7JCouYyB9Ci0KLS5jLmV4ZToKLQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAkKi5jIFwKLQkgICQoTElCTkFNRSkgemxpYl8kKE1PREVMKS5saWIgJChOT0VITElCKQotCi0jIyBNYWpvciB0YXJnZXRzCi0KLWFsbDogbGlicG5nIHBuZ3Rlc3QKLQotIyB0cnkgIWluY2x1ZGUgc2NyaXB0c1xwbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmc6ICQoTElCTkFNRSkKLQotcG5ndGVzdDogcG5ndGVzdCQoTU9ERUwpLmV4ZQotCi10ZXN0OiBwbmd0ZXN0JChNT0RFTCkuZXhlCi0JcG5ndGVzdCQoTU9ERUwpCi0KLSMjIE1pbm9yIFRhcmdldHMKLQotcG5nLm9iajogcG5nLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm9iajogcG5nZXJyb3IuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm9iajogcG5nZ2V0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vYmo6IHBuZ21lbS5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vYmo6IHBuZ3ByZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQub2JqOiBwbmdyZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vYmo6IHBuZ3Jpby5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vYmo6IHBuZ3J0cmFuLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm9iajogcG5ncnV0aWwuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm9iajogcG5nc2V0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm9iajogcG5ndHJhbnMuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm9iajogcG5nd2lvLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm9iajogcG5nd3JpdGUuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ub2JqOiBwbmd3dHJhbi5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vYmo6IHBuZ3d1dGlsLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotJChMSUJOQU1FKTogJChPQkpTKQotCS1kZWwgJChMSUJOQU1FKQotCSQoTElCKSAkKExJQk5BTUUpIEAmJnwKLSQoTElCT0JKUyksIGxpYnBuZyQoTU9ERUwpCi18Ci0KLXBuZ3Rlc3QkKE1PREVMKS5vYmo6IHBuZ3Rlc3QuYyBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0JJChDQykgJChDRkxBR1MpIC1vcG5ndGVzdCQoTU9ERUwpIC1jIHBuZ3Rlc3QuYwotCi1wbmd0ZXN0JChNT0RFTCkuZXhlOiBwbmd0ZXN0JChNT0RFTCkub2JqCi0JJChMRCkgJChMREZMQUdTKSBwbmd0ZXN0JChNT0RFTCkub2JqICQoTElCTkFNRSkgemxpYl8kKE1PREVMKS5saWIgJChOT0VITElCKQotCi0jIENsZWFuIHVwIGFueXRoaW5nIGVsc2UgeW91IHdhbnQKLWNsZWFuOgotCS1kZWwgcG5nbGliY29uZi5oCi0JLWRlbCAqLm9iagotCS1kZWwgKi5leGUKLQktZGVsICoubGliCi0JLWRlbCAqLmxzdAotCS1kZWwgKi5tYXAKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5jZWdjYyBiL3NjcmlwdHMvbWFrZWZpbGUuY2VnY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTM2MWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5jZWdjYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBjcmVhdGluZyBXaW5kb3dzIENFIHJlbGVhc2UgYXJjaGl2ZXMsIHdpdGggdGhlCi0jIG1pbmd3MzJjZSBjb21waWxlci4KLQotIyBMYXN0IHVwZGF0ZWQ6IDIyLUp1bC0yMDA4Ci0KLSMgQ29weXJpZ2h0IChDKSAyMDA4IFZpbmNlbnQgVG9ycmkKLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgVG8gZ2V0IHNvbWUgaGVscCwgdHlwZQotIwotIyBtYWtlIGhlbHAKLSMKLSMgVG8gY3JlYXRlIHRoZSBhcmNoaXZlcwotIwotIyBtYWtlCi0jCi0jIFRvIHJlbW92ZSBldmVyeXRoaW5nLCB0eXBlOgotIwotIyBtYWtlIGNsZWFuCi0KLVZFUk1BSiA9IDEKLVZFUk1JTiA9IDYKLVZFUk1JQyA9IDI0Ci1WRVIgPSAkKFZFUk1BSikuJChWRVJNSU4pLiQoVkVSTUlDKQotTkFNRSA9IGxpYnBuZwotUEFDS0FHRSA9ICQoTkFNRSktJChWRVIpCi0KLUJJTiA9IGxpYnBuZzE2LTAuZGxsCi1MSUIgPSBsaWJwbmcxNi5hIGxpYnBuZzE2LmRsbC5hIGxpYnBuZy5hIGxpYnBuZy5kbGwuYQotSU5DTFVERSA9IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1QQyA9IGxpYnBuZzE2LnBjIGxpYnBuZy5wYwotCi1NQU5JRkVTVFZFUkJJTiA9ICJMaWJwbmctJChWRVIpOiBCaW5hcnkgZmlsZXMiCi1NQU5JRkVTVFZFUkRFViA9ICJMaWJwbmctJChWRVIpOiBEZXZlbG9wZXIgZmlsZXMiCi1NQU5JRkVTVFZFUkRFU0MgPSAiTGlicG5nOiB0aGUgb2ZmaWNpYWwgUE5HIHJlZmVyZW5jZSBsaWJyYXJ5IgotCi1hbGw6ICQoTkFNRSkKLQotJChOQU1FKTogcmVtb3ZlLW9sZCBjb3B5LXNyYyBjb21waWxhdGlvbiBjb3B5IG1hbmlmZXN0IGFyY2hpdmUKLQlAZWNobyAiICogUmVtb3ZhbCBvZiB0aGUgZGlyZWN0b3JpZXMiCi0JQHJtIC1yZiAkKFBBQ0tBR0UpLyAkKFBBQ0tBR0UpLWJpbi8gJChQQUNLQUdFKS1kZXYvCi0KLXJlbW92ZS1vbGQ6Ci0JQGVjaG8gIiAqIFJlbW92YWwgb2YgdGhlIG9sZCBmaWxlcyIKLQlAcm0gLXJmICQoUEFDS0FHRSktYmluKgotCUBybSAtcmYgJChQQUNLQUdFKS1kZXYqCi0KLWNvcHktc3JjOgotCUBlY2hvICIgKiBDb3B5IG9mIHNvdXJjZSBmaWxlcyIKLQlAY3AgLVIgLi4vc3JjLyQoUEFDS0FHRSkgLgotCUBlY2hvICIgKiBDcmVhdGlvbiBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMiCi0JQG1rZGlyIC1wICQoUEFDS0FHRSktYmluL2JpbgotCUBta2RpciAtcCAkKFBBQ0tBR0UpLWJpbi9tYW5pZmVzdAotCUBta2RpciAtcCAkKFBBQ0tBR0UpLWRldi9saWIvcGtnY29uZmlnCi0JQG1rZGlyIC1wICQoUEFDS0FHRSktZGV2L2luY2x1ZGUvJChOQU1FKSQoVkVSTUFKKSQoVkVSTUlOKQotCUBta2RpciAtcCAkKFBBQ0tBR0UpLWRldi9tYW5pZmVzdAotCUB0b3VjaCAkKFBBQ0tBR0UpLWJpbi9tYW5pZmVzdC8kKFBBQ0tBR0UpLWJpbi5tZnQKLQlAdG91Y2ggJChQQUNLQUdFKS1iaW4vbWFuaWZlc3QvJChQQUNLQUdFKS1iaW4udmVyCi0JQHRvdWNoICQoUEFDS0FHRSktZGV2L21hbmlmZXN0LyQoUEFDS0FHRSktZGV2Lm1mdAotCUB0b3VjaCAkKFBBQ0tBR0UpLWRldi9tYW5pZmVzdC8kKFBBQ0tBR0UpLWRldi52ZXIKLQotY29tcGlsYXRpb246Ci0JQGVjaG8gIiAqIENvbXBpbGF0aW9uIG9mICQoUEFDS0FHRSkiCi0JY2QgJChQQUNLQUdFKSAmJiBDUFBGTEFHUz0iJChDUFBGTEFHUykgLURQTkdfQ09OU09MRV9JT19TVVBQT1JURUQgLURfV0lOMzJfV0NFPTB4MDQyMCIgXAotCQlDRkxBR1M9IiQoQ0ZMQUdTKSAtbW1zLWJpdGZpZWxkcyAtTzMgLXBpcGUgLWZvbWl0LWZyYW1lLXBvaW50ZXIiIFwKLQkJTERGTEFHUz0iJChMREZMQUdTKSAtV2wsLS1lbmFibGUtYXV0by1pbXBvcnQgLVdsLC1zIiBcCi0JCS4vY29uZmlndXJlIC0tcHJlZml4PS9vcHQvd2luY2UgLS1ob3N0PWFybS1taW5ndzMyY2UgJiYgbWFrZQotCi1jb3B5OgotCUBlY2hvICIgKiBDb3B5IG9mIGJpbmFyeSBhbmQgZGV2ZWxvcG1lbnQgZmlsZXMiCi0JQGZvciBpIGluICQoQklOKTsgZG8gXAotCSAgY3AgJChQQUNLQUdFKS8ubGlicy8kJGkgJChQQUNLQUdFKS1iaW4vYmluOyBcCi0JZG9uZQotCUBmb3IgaSBpbiAkKExJQik7IGRvIFwKLQkgIGNwICQoUEFDS0FHRSkvLmxpYnMvJCRpICQoUEFDS0FHRSktZGV2L2xpYjsgXAotCWRvbmUKLQlAZm9yIGkgaW4gJChJTkNMVURFKTsgZG8gXAotCSAgY3AgJChQQUNLQUdFKS8kJGkgJChQQUNLQUdFKS1kZXYvaW5jbHVkZS8kKE5BTUUpJChWRVJNQUopJChWRVJNSU4pOyBcCi0JZG9uZQotCUBmb3IgaSBpbiAkKFBDKTsgZG8gXAotCSAgY3AgJChQQUNLQUdFKS8kJGkgJChQQUNLQUdFKS1kZXYvbGliL3BrZ2NvbmZpZzsgXAotCWRvbmUKLQotbWFuaWZlc3Q6Ci0JQGVjaG8gIiAqIENyZWF0aW9uIG9mIHRoZSBtYW5pZmVzdCIKLQlAY2QgJChQQUNLQUdFKS1iaW4gJiYgZmluZCAqID4+IG1hbmlmZXN0LyQoUEFDS0FHRSktYmluLm1mdAotCUBjZCAkKFBBQ0tBR0UpLWJpbiAmJiBcCi0JICBlY2hvICQoTUFOSUZFU1RWRVJCSU4pID4+IG1hbmlmZXN0LyQoUEFDS0FHRSktYmluLnZlciAmJiBcCi0JICBlY2hvICQoTUFOSUZFU1RWRVJERVNDKSA+PiBtYW5pZmVzdC8kKFBBQ0tBR0UpLWJpbi52ZXIKLQlAY2QgJChQQUNLQUdFKS1kZXYgJiYgZmluZCAqID4+IG1hbmlmZXN0LyQoUEFDS0FHRSktZGV2Lm1mdAotCUBjZCAkKFBBQ0tBR0UpLWRldiAmJiBcCi0JICBlY2hvICQoTUFOSUZFU1RWRVJERVYpID4+IG1hbmlmZXN0LyQoUEFDS0FHRSktZGV2LnZlciAmJiBcCi0JICBlY2hvICQoTUFOSUZFU1RWRVJERVNDKSA+PiBtYW5pZmVzdC8kKFBBQ0tBR0UpLWRldi52ZXIKLQotYXJjaGl2ZToKLQlAZWNobyAiICogQ3JlYXRpb24gb2YgdGhlIGFyY2hpdmVzIgotCUB0YXIgY2YgJChQQUNLQUdFKS1iaW4udGFyICQoUEFDS0FHRSktYmluCi0JQGJ6aXAyIC05ICQoUEFDS0FHRSktYmluLnRhcgotCUB0YXIgY2YgJChQQUNLQUdFKS1kZXYudGFyICQoUEFDS0FHRSktZGV2Ci0JQGJ6aXAyIC05ICQoUEFDS0FHRSktZGV2LnRhcgotCi1jbGVhbjoKLQlAZWNobyAiICogQ2xlYW5pbmciCi0JQHJtIC1yZiAkKFBBQ0tBR0UpKgotCi1oZWxwOgotCUBlY2hvCi0JQGVjaG8gIlRvIGNyZWF0ZSB0aGUgYXJjaGl2ZXMsIHR5cGU6IgotCUBlY2hvICIgbWFrZSIKLQlAZWNobwotCUBlY2hvICJUbyByZW1vdmUgZXZlcnl0aGluZywgdHlwZToiCi0JQGVjaG8gIiBtYWtlIGNsZWFuIgotCUBlY2hvCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLmRhcndpbiBiL3NjcmlwdHMvbWFrZWZpbGUuZGFyd2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTNmOTJjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuZGFyd2luCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBEYXJ3aW4gLyBNYWMgT1MgWAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDYsIDIwMDgsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAyMDAxIENocmlzdG9waCBQZmlzdGVyZXIKLSMgZGVyaXZlZCBmcm9tIG1ha2VmaWxlLmxpbnV4OgotIyAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEdyZWcgUm9lbG9mcwotIyAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyB3aGVyZSAibWFrZSBpbnN0YWxsIiBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNi5keWxpYiwgcG5nLmgsIHBuZ2NvbmYuaCwKLSMgYW5kIHBuZ2xpYmNvbmYuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9L3Vzci9saWIKLVpMSUJJTkM9L3Vzci9pbmNsdWRlCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE2Ci1QTkdNQUogPSAxNgotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5keWxpYgotTElCU09NQUo9JChMSUJOQU1FKS4kKFBOR01BSikuZHlsaWIKLUxJQlNPUkVMPSQoTElCTkFNRSkuJChQTkdNQUopLiQoUkVMRUFTRSkuZHlsaWIKLU9MRFNPPWxpYnBuZy5keWxpYgotCi0jIFV0aWxpdGllczoKLUNDPWNjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1DUD1jcAotUk1fRj0vYmluL3JtIC1mCi0KLUNQUEZMQUdTPS1JJChaTElCSU5DKQotIyBDRkxBR1M9LVcgLVdhbGwgLU8zIC1mdW5yb2xsLWxvb3BzCi1DRkxBR1M9LVcgLVdhbGwgLU8gLWZ1bnJvbGwtbG9vcHMKLUxERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZzE2IC1segotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1mbm8tY29tbW9uIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi0JJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHohID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6XCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlNETEwpCi0JJChDQykgLWR5bmFtaWNsaWIgXAotCSAtaW5zdGFsbF9uYW1lICQoTElCUEFUSCkvJChMSUJTT01BSikgXAotCSAtY3VycmVudF92ZXJzaW9uIDE2IC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gMTYgXAotCSAtbyAkKExJQlNPTUFKKSBcCi0JICQoT0JKU0RMTCkgLUwkKFpMSUJMSUIpIC1segotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCSQoUkFOTElCKSAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09NQUopCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT01BSikKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIGxpYnBuZy1jb25maWcgXAotCWxpYnBuZy5wYyAkKExJQk5BTUUpLipkeWxpYiBwbmd0ZXN0aSBwbmdsaWJjb25mLmgKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuZGVjIGIvc2NyaXB0cy9tYWtlZmlsZS5kZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjZhMDIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5kZWMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIERFQyBBbHBoYSBVbml4Ci0jIENvcHlyaWdodCAoQykgMjAwMC0yMDAyLCAyMDA2LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExpYnJhcnkgbmFtZToKLVBOR01BSiA9IDE2Ci1MSUJOQU1FID0gbGlicG5nMTYKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc28KLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Y2MKLU1LRElSX1A9bWtkaXIKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9cmFubGliCi1DUD1jcAotUk1fRj0vYmluL3JtIC1mCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLUNQUEZMQUdTPS1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKLUNGTEFHUz0tc3RkIC13MSAtTyAjIC1nCi1MREZMQUdTPS1MJChaTElCTElCKSAtcnBhdGggJChaTElCTElCKSBsaWJwbmcuYSAtbHogLWxtCi0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1hbGw6ICQoTElCU08pIGxpYnBuZy5hIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIi1zdGRcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKUykKLQkkKENDKSAtc2hhcmVkIC1vICRAICQoT0JKUykgLUwkKFpMSUJMSUIpIFwKLQktc29uYW1lICQoTElCU09NQUopCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKLQktQC9iaW4vcm0gLWYgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAotCS1AL2Jpbi9ybSAtZiAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQC9iaW4vcm0gLWYgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AL2Jpbi9ybSAtZiAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAvYmluL3JtIC1mICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AL2Jpbi9ybSAtZiAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQC9iaW4vcm0gLWYgJChEQikvbGlicG5nLWNvbmZpZwotCS1AL2Jpbi9ybSAtZiAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLXcxIC1JJChESSkgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpICAtUiQoWkxJQkxJQikgLVIkKERMKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAtdzEgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCWxpYnBuZy5wYyBwbmdsaWJjb25mLmgKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLmRqMiBiL3NjcmlwdHMvbWFrZWZpbGUuZGoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTljNDMyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuZGoyCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyBESkdQUCAoRE9TIGdjYykgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDktMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHdpbGwgcHV0IGxpYnBuZy5hIGFuZCBwbmcuaAotI3ByZWZpeD0vdXNyL2xvY2FsCi1wcmVmaXg9LgotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKHByZWZpeCkvbGliCi0KLUNDPWdjYwotQ1BQRkxBR1M9LUkuLi96bGliIC1EUE5HX05PX1NOUFJJTlRGCi1DRkxBR1M9LU8KLUxERkxBR1M9LUwuIC1MLi4vemxpYi8gLWxwbmcgLWx6IC1sbQotCi1SQU5MSUI9cmFubGliCi0KLUNQPWNwCi1STV9GPXJtIC1mCi0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIHBuZ3d0cmFuLm8gXAotCXBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nLmE6ICQoT0JKUykKLQlhciByYyAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCWNvZmYyZXhlIHBuZ3Rlc3QKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIHBuZ2xpYmNvbmYuaAotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZCBiL3NjcmlwdHMvbWFrZWZpbGUuZnJlZWJzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkMWE1YS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2VmaWxlLmZyZWVic2QKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdW5kZXIgRnJlZUJTRAotIyBDb3B5cmlnaHQgKEMpIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uIGFuZCBBbmRyZXkgQS4gQ2hlcm5vdgotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcsIDIwMDkgR2xlbm4gUmFuZGVycy1QZWhyc29uIGFuZCBBbmRyZXkgQS4gQ2hlcm5vdgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLVBSRUZJWD89ICAgICAgICAvdXNyL2xvY2FsCi1TSExJQl9WRVI/PSAgICAgMTYKLQotTElCPQkJcG5nCi1TSExJQl9NQUpPUj0JJHtTSExJQl9WRVJ9Ci1TSExJQl9NSU5PUj0JMAotTk9fUFJPRklMRT0JWUVTCi1OT19PQko9CQlZRVMKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKLURFU1RESVI9CSR7UFJFRklYfQotTElCRElSPQkJL2xpYgotSU5DUz0JCXBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1JTkNTRElSPQkvaW5jbHVkZS9saWJwbmcKLUlOQ0RJUj0JCSR7SU5DU0RJUn0JCSMgZm9yIDQueCBic2QubGliLm1rCi1NQU49CQlsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci1NQU5ESVI9CQkvbWFuL21hbgotU1lNTElOS1M9ICAgICAgIGxpYnBuZy9wbmcuaCAke0lOQ1NESVJ9Ly4uL3BuZy5oIFwKLQkJbGlicG5nL3BuZ2NvbmYuaCAke0lOQ1NESVJ9Ly4uL3BuZ2NvbmYuaCBcCi0JCWxpYnBuZy9wbmdsaWJjb25mLmggJHtJTkNTRElSfS8uLi9wbmdsaWJjb25mLmgKLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgZmluZHMgbGliei5hIGFuZCB6bGliLmgKLVpMSUJMSUI9CS91c3IvbGliCi1aTElCSU5DPQkvdXNyL2luY2x1ZGUKLQotTERBREQrPQkJLWxtIC1segotI0xEQUREKz0JLWxtIC1seiAtbHNzcF9ub25zaGFyZWQgICAjIGZvciBPU1ZFUlNJT04gPCA4MDAwMDAgPwotCi1EUEFERCs9CQkke0xJQk19ICR7TElCWn0KLQotQ1BQRkxBR1MrPQktSS4gLUkke1pMSUJJTkN9Ci1DRkxBR1MrPQktVyAtV2FsbAotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVD0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotU1JDUz0JcG5nLmMgcG5nc2V0LmMgcG5nZ2V0LmMgcG5ncnV0aWwuYyBwbmd0cmFucy5jIHBuZ3d1dGlsLmMgXAotCXBuZ3JlYWQuYyBwbmdyaW8uYyBwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3J0cmFuLmMgXAotCXBuZ3d0cmFuLmMgcG5nbWVtLmMgcG5nZXJyb3IuYyBwbmdwcmVhZC5jCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSR7Q0N9ICR7Q0ZMQUdTfSAtTC4gLXN0YXRpYyAtbyBwbmd0ZXN0IHBuZ3Rlc3QubyAtTCR7WkxJQkxJQn0gXAotCS1scG5nICR7TERBRER9Ci0KLUNMRUFORklMRVM9IHBuZ3Rlc3QgcG5ndGVzdC5vIHBuZ291dC5wbmcKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCWNwICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0uaW5jbHVkZSA8YnNkLmxpYi5taz4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuZ2NjIGIvc2NyaXB0cy9tYWtlZmlsZS5nY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOTJkMTUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5nY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdXNpbmcgZ2NjIChnZW5lcmljLCBzdGF0aWMgbGlicmFyeSkKLSMgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAgQ29zbWluIFRydXRhCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIExvY2F0aW9uIG9mIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMKLVpMSUJJTkMgPSAuLi96bGliCi1aTElCTElCID0gLi4vemxpYgotCi0jIENvbXBpbGVyLCBsaW5rZXIsIGxpYiBhbmQgb3RoZXIgdG9vbHMKLUNDID0gZ2NjCi1MRCA9ICQoQ0MpCi1BUl9SQyA9IGFyIHJjcwotUkFOTElCID0gcmFubGliCi1DUCA9IGNwCi1STV9GID0gcm0gLWYKLQotV0FSTk1PUkUgPSAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMgLVdjb252ZXJzaW9uCi1DUFBGTEFHUyA9IC1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKLUNGTEFHUyA9IC1XIC1XYWxsIC1PMiAjICQoV0FSTk1PUkUpIC1nCi1MREZMQUdTID0KLUxJQlMgPSAtbHogLWxtCi0KLSMgRmlsZSBleHRlbnNpb25zCi1FWEVFWFQgPQotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLSMgVmFyaWFibGVzCi1PQkpTID0gIHBuZy5vIHBuZ2Vycm9yLm8gcG5nZ2V0Lm8gcG5nbWVtLm8gcG5ncHJlYWQubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3J0cmFuLm8gcG5ncnV0aWwubyBwbmdzZXQubyBcCi0JcG5ndHJhbnMubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3d0cmFuLm8gcG5nd3V0aWwubwotCi0jIFRhcmdldHMKLWFsbDogc3RhdGljCi0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi0JJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLXN0YXRpYzogbGlicG5nLmEgcG5ndGVzdCQoRVhFRVhUKQotCi1zaGFyZWQ6Ci0JQGVjaG8gVGhpcyBpcyBhIGdlbmVyaWMgbWFrZWZpbGUgdGhhdCBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMuCi0JQGVjaG8gUGxlYXNlIHVzZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byB5b3VyIHBsYXRmb3JtLgotCUBmYWxzZQotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotdGVzdDogcG5ndGVzdCQoRVhFRVhUKQotCS4vcG5ndGVzdCQoRVhFRVhUKQotCi1wbmd0ZXN0JChFWEVFWFQpOiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKExEKSAkKExERkxBR1MpIC1MJChaTElCTElCKSAtbyAkQCBwbmd0ZXN0Lm8gbGlicG5nLmEgJChMSUJTKQotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0JChFWEVFWFQpIHBuZ291dC5wbmcgcG5nbGliY29uZi5oCi0KLXBuZy5vOiAgICAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vOiAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3NldC5vOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotcG5ndGVzdC5vOiAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5ocDY0IGIvc2NyaXB0cy9tYWtlZmlsZS5ocDY0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ4YmU4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuaHA2NAorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcsIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgdXNpbmcgdGhlIEFOU0kvQyBwcm9kdWN0LgotIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiwgMjAwNiwgMjAwOSwgMjAxMC0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyCi0jIGNvbnRyaWJ1dGVkIGJ5IEppbSBSaWNlIGFuZCB1cGRhdGVkIGJ5IENocmlzIFNjaGxlaWNoZXIsIEhld2xldHQgUGFja2FyZAotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0vb3B0L3psaWIvbGliCi1aTElCSU5DPS9vcHQvemxpYi9pbmNsdWRlCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSBwbGFuIHRvIGJ1aWxkIGEgbGlicG5nIHNoYXJlZCBsaWJyYXJ5LCB6bGliIG11c3QgYWxzbwotIyBiZSBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCB6bGliJ3MgY29uZmlndXJlIGRvZXMgbm90IGRvLiAgQWZ0ZXIgcnVubmluZwotIyB6bGliJ3MgY29uZmlndXJlLCBlZGl0IHRoZSBhcHByb3ByaWF0ZSBsaW5lcyBvZiBtYWtlZmlsZSB0byByZWFkOgotIyAgIENGTEFHUz0tTzEgLURIQVZFX1VOSVNURCAtRFVTRV9NQVAgLWZQSUMgXAotIyAgIExEU0hBUkVEPWxkIC1iCi0jICAgU0hBUkVETElCPWxpYnouc2wKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTYKLVBOR01BSiA9IDE2Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNsCi1MSUJTT01BSj0kKExJQk5BTUUpLnNsLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNsCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWNjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1yYW5saWIKLUNQPWNwCi1STV9GPS9iaW4vcm0gLWYKLQotQ1BQRkxBR1M9LUkkKFpMSUJJTkMpIFwKLSAgICAgICAgLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1ESEFWRV9VTklTVERfSCAtRFVTRV9NTUFQCi1DRkxBR1M9LU8gLUFlIC1XbCwrdm5vY29tcGF0d2FybmluZ3MgK0RENjQgK1oKLSMgQ2F1dGlvbjogYmUgc3VyZSB5b3UgaGF2ZSBidWlsdCB6bGliIHdpdGggdGhlIHNhbWUgQ0ZMQUdTLgotQ0NGTEFHUz0tTyAtQWUgLVdsLCt2bm9jb21wYXR3YXJuaW5ncyArREQ2NCArWgotCi1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNi5zbCwgYW5kIHBuZy5oCi1wcmVmaXg9L29wdC9saWJwbmcKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6CS5jIC5vIC5waWMubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgK3ogLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY2NvcHRzPVwiLU8gLUFlIC1XbCwrdm5vY29tcGF0d2FybmluZ3MgK0RENjQgK1pcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQkkKExEKSAtYiArcyBcCi0JK2ggJChMSUJTT01BSikgLW8gJChMSUJTT01BSikgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0NGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgJChDQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgJChDUFBGTEFHUykgJChDQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQlsaWJwbmcucGMgcG5nbGliY29uZi5oCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5ocGdjYyBiL3NjcmlwdHMvbWFrZWZpbGUuaHBnY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODc5MWIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5ocGdjYworKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gSFAtVVggdXNpbmcgR0NDIHdpdGggdGhlIEhQIEFOU0kvQyBsaW5rZXIuCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNi0yMDA4LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMjAwMSwgTGF1cmVudCBmYWlsbGllCi0jIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBHcmVnIFJvZWxvZnMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTYKLVBOR01BSiA9IDE2Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNsCi1MSUJTT01BSj0kKExJQk5BTUUpLnNsLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNsCi0KLSMgVXRpbGl0aWVzOgotQ0M9Z2NjCi1MRD1sZAotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPXJhbmxpYgotQ1A9Y3AKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlICJtYWtlIGluc3RhbGwiIHB1dHMgbGlicG5nLmEsICQoT0xEU08pKiwgcG5nLmgsIHBuZ2NvbmYuaAotIyBhbmQgcG5nbGliY29uZi5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0vb3B0L3psaWIvbGliCi1aTElCSU5DPS9vcHQvemxpYi9pbmNsdWRlCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSBwbGFuIHRvIGJ1aWxkIGEgbGlicG5nIHNoYXJlZCBsaWJyYXJ5LCB6bGliIG11c3QgYWxzbwotIyBiZSBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCB6bGliJ3MgY29uZmlndXJlIGRvZXMgbm90IGRvLiAgQWZ0ZXIgcnVubmluZwotIyB6bGliJ3MgY29uZmlndXJlLCBlZGl0IHRoZSBhcHByb3ByaWF0ZSBsaW5lcyBvZiBtYWtlZmlsZSB0byByZWFkOgotIyAgIENGTEFHUz0tTzEgLURIQVZFX1VOSVNURCAtRFVTRV9NQVAgLWZQSUMgXAotIyAgIExEU0hBUkVEPWxkIC1iCi0jICAgU0hBUkVETElCPWxpYnouc2wKLQotQUxJR049Ci0jIGZvciBpMzg2OgotI0FMSUdOPS1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotCi0jIGZvciBwZ2NjIHZlcnNpb24gMi45NS4xLCAtTzMgaXMgYnVnZ3k7IGRvbid0IHVzZSBpdC4KLQotQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQotQ0ZMQUdTPS1XIC1XYWxsIC1PMyAtZnVucm9sbC1sb29wcyAkKEFMSUdOKSAjICQoV0FSTk1PUkUpIC1nCi0jTERGTEFHUz0tTC4gLVdsLC1ycGF0aCwuIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCi1MREZMQUdTPS1MLiAtTCQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLU9CSlMgPSBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotT0JKU0RMTCA9ICQoT0JKUzoubz0ucGljLm8pCi0KLS5TVUZGSVhFUzogICAgICAuYyAubyAucGljLm8KLQotLmMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKLQotLmMucGljLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1mUElDIC1vICRAICQqLmMKLQotYWxsOiBsaWJwbmcuYSAkKExJQlNPKSBwbmd0ZXN0IGxpYnBuZy5wYyBsaWJwbmctY29uZmlnCi0KLWxpYnBuZy5hOiAkKE9CSlMpCi0JJChBUl9SQykgJEAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQkkKExEKSAtYiArcyBcCi0JK2ggJChMSUJTT01BSikgLW8gJChMSUJTT01BSikgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gJChMSUJTTykKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoREwpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKENQUEZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JbGlicG5nLnBjIHBuZ2xpYmNvbmYuaAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5ocHV4IGIvc2NyaXB0cy9tYWtlZmlsZS5ocHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDc2MTJkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuaHB1eAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcsIEhQVVggKDEwLjIwIGFuZCAxMS4wMCkgdXNpbmcgdGhlIEFOU0kvQyBwcm9kdWN0LgotIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiwgMjAwNiwgMjAxMC0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTUgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyCi0jIGNvbnRyaWJ1dGVkIGJ5IEppbSBSaWNlIGFuZCB1cGRhdGVkIGJ5IENocmlzIFNjaGxlaWNoZXIsIEhld2xldHQgUGFja2FyZAotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotWkxJQkxJQj0vb3B0L3psaWIvbGliCi1aTElCSU5DPS9vcHQvemxpYi9pbmNsdWRlCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSBwbGFuIHRvIGJ1aWxkIGEgbGlicG5nIHNoYXJlZCBsaWJyYXJ5LCB6bGliIG11c3QgYWxzbwotIyBiZSBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCB6bGliJ3MgY29uZmlndXJlIGRvZXMgbm90IGRvLiAgQWZ0ZXIgcnVubmluZwotIyB6bGliJ3MgY29uZmlndXJlLCBlZGl0IHRoZSBhcHByb3ByaWF0ZSBsaW5lcyBvZiBtYWtlZmlsZSB0byByZWFkOgotIyAgIENQUEZMQUdTPS1ESEFWRV9VTklTVEQgLURVU0VfTUFQCi0jICAgQ0ZMQUdTPS1PMSAtZlBJQwotIyAgIExEU0hBUkVEPWxkIC1iCi0jICAgU0hBUkVETElCPWxpYnouc2wKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTYKLVBOR01BSiA9IDE2Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNsCi1MSUJTT01BSj0kKExJQk5BTUUpLnNsLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNsCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWNjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1yYW5saWIKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNi5zbCwgYW5kIHBuZy5oCi1wcmVmaXg9L29wdC9saWJwbmcKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotQ1BQRkxBR1M9LUkkKFpMSUJJTkMpCi1DRkxBR1M9LU8gLUFlICtEQTEuMSArRFMyLjAKLSMgQ2F1dGlvbjogYmUgc3VyZSB5b3UgaGF2ZSBidWlsdCB6bGliIHdpdGggdGhlIHNhbWUgQ0ZMQUdTLgotQ0NGTEFHUz0tTyAtQWUgK0RBMS4xICtEUzIuMAotTERGTEFHUz0tTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6CS5jIC5vIC5waWMubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi0uYy5waWMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgK3ogLW8gJEAgJCouYwotCi1hbGw6IGxpYnBuZy5hICQoTElCU08pIHBuZ3Rlc3QgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY2NvcHRzPVwiLU8gLUFlICtEQTEuMSArRFMyLjBcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQkkKExEKSAtYiArcyBcCi0JK2ggJChMSUJTT01BSikgLW8gJChMSUJTT01BSikgJChPQkpTRExMKQotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0NGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgJChDQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgJChDUFBGTEFHUykgJChDQ0ZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQlsaWJwbmcucGMgcG5nbGliY29uZi5oCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5pYm1jIGIvc2NyaXB0cy9tYWtlZmlsZS5pYm1jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWIxMTk2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuaWJtYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGxpYnBuZyAoc3RhdGljKQotIyBJQk0gQyB2ZXJzaW9uIDMueCBmb3IgV2luMzIgYW5kIE9TLzIKLSMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAgQ29zbWluIFRydXRhCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSMKLSMgTm90ZXM6Ci0jICAgRGVyaXZlZCBmcm9tIG1ha2VmaWxlLnN0ZAotIyAgIEFsbCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbiBDIG1vZGUKLSMgICBUZXN0ZWQgdW5kZXIgV2luMzIsIGV4cGVjdGVkIHRvIHdvcmsgdW5kZXIgT1MvMgotIyAgIENhbiBiZSBlYXNpbHkgYWRhcHRlZCBmb3IgSUJNIFZpc3VhbEFnZS9DKysgZm9yIEFJWAotCi0jIExvY2F0aW9uIG9mIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMKLVpMSUJJTkMgPSAuLi96bGliCi1aTElCTElCID0gLi4vemxpYgotCi0jIENvbXBpbGVyLCBsaW5rZXIsIGxpYiBhbmQgb3RoZXIgdG9vbHMKLUNDID0gaWNjCi1MRCA9IGlsaW5rCi1BUiA9IGlsaWIKLUNQID0gY29weQotUk0gPSBkZWwKLQotQ1BQRkxBR1MgPSAtSSQoWkxJQklOQykKLUNGTEFHUyA9IC1NYyAtTzIgLVczCi1MREZMQUdTID0KLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi0jIEZpbGUgZXh0ZW5zaW9ucwotTz0ub2JqCi1BPS5saWIKLUU9LmV4ZQotCi0jIFZhcmlhYmxlcwotT0JKUyA9IHBuZyQoTykgcG5nZXJyb3IkKE8pIHBuZ2dldCQoTykgcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgXAotCXBuZ3JlYWQkKE8pIHBuZ3JpbyQoTykgcG5ncnRyYW4kKE8pIHBuZ3J1dGlsJChPKSBwbmdzZXQkKE8pIFwKLQlwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQotCi1MSUJTID0gbGlicG5nJChBKSAkKFpMSUJMSUIpL3psaWIkKEEpCi0KLSMgVGFyZ2V0cwotLmMkKE8pOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAotCi1hbGw6IGxpYnBuZyQoQSkgcG5ndGVzdCQoRSkKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nJChBKTogJChPQkpTKQotCSQoQVIpIC1vdXQ6JEAgJChPQkpTKQotCi10ZXN0OiBwbmd0ZXN0JChFKQotCXBuZ3Rlc3QkKEUpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QkKEUpCi0KLXBuZ3Rlc3QkKEUpOiBwbmd0ZXN0JChPKSBsaWJwbmckKEEpCi0JJChMRCkgJChMREZMQUdTKSBwbmd0ZXN0JChPKSAkKExJQlMpCi0KLWNsZWFuOgotCSQoUk0pICokKE8pCi0JJChSTSkgbGlicG5nJChBKQotCSQoUk0pIHBuZ2xpYmNvbmYuaAotCSQoUk0pIHBuZ3Rlc3QkKEUpCi0JJChSTSkgcG5nb3V0LnBuZwotCi1wbmckKE8pOiAgICAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQkKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdtZW0kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkJChPKTogIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyaW8kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdzZXQkKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8kKE8pOiAgIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QkKE8pOiAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5pbnRlbCBiL3NjcmlwdHMvbWFrZWZpbGUuaW50ZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODcyNjEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5pbnRlbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBsaWJwbmcKLSMgTWljcm9zb2Z0IFZpc3VhbCBDKysgd2l0aCBJbnRlbCBDL0MrKyBDb21waWxlciA0LjAgYW5kIGxhdGVyCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDIwMDAsIFBhd2VsIE1yb2NoZW4sIGJhc2VkIG9uIG1ha2VmaWxlLm1zYyB3aGljaCBpcwotIyBjb3B5cmlnaHQgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotIwotIyBUbyB1c2UsIGRvICJubWFrZSAvZiBzY3JpcHRzXG1ha2VmaWxlLmludGVsIgotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tIEludGVsIEMvQysrIENvbXBpbGVyIDQuMCBhbmQgbGF0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLVpMSUJMSUI9Li5cemxpYgotWkxJQklOQz0uLlx6bGliCi0KLSMgVGFyZ2V0IENQVQotQ1BVPTYJCSMgUGVudGl1bSBJSQotI0NQVT01CQkjIFBlbnRpdW0KLQotIyBDYWxsaW5nIGNvbnZlbnRpb24KLUNBTExJTkc9cgkjIF9fZmFzdGNhbGwKLSNDQUxMSU5HPXoJIyBfX3N0ZGNhbGwKLSNDQUxMSU5HPWQJIyBfX2NkZWNsCi0KLSMgVW5jb21tZW50IG5leHQgdG8gcHV0IGVycm9yIG1lc3NhZ2VzIGluIGEgZmlsZQotI0VSUkZJTEU9Pj5wbmdlcnJzCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ0M9aWNsIC1jCi1DUFBGTEFHUz0tSSQoWkxJQklOQykKLUNGTEFHUz0tTzIgLUckKENQVSkkKENBTExJTkcpIC1RaXAgLVF1bnJvbGw0IC1ub2xvZ28KLUxEPWxpbmsKLUxERkxBR1M9L1NVQlNZU1RFTTpDT05TT0xFIC9OT0xPR08KLUNQPWNwCi0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHNccG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0c1xwbmdsaWJjb25mLmgucHJlYnVpbHQKLQotTz0ub2JqCi0KLU9CSlM9cG5nJChPKSBwbmdzZXQkKE8pIHBuZ2dldCQoTykgcG5ncnV0aWwkKE8pIHBuZ3RyYW5zJChPKSBwbmd3dXRpbCQoTykgXAotcG5nbWVtJChPKSBwbmdwcmVhZCQoTykgcG5ncmVhZCQoTykgcG5nZXJyb3IkKE8pIHBuZ3dyaXRlJChPKSBcCi1wbmdydHJhbiQoTykgcG5nd3RyYW4kKE8pIHBuZ3JpbyQoTykgcG5nd2lvJChPKQotCi1hbGw6IHRlc3QKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotcG5nJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3NldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdwcmVhZCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdydXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdlcnJvciQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncmlvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3dpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0cmFucyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3dXRpbCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1saWJwbmcubGliOiAkKE9CSlMpCi0JaWYgZXhpc3QgbGlicG5nLmxpYiBkZWwgbGlicG5nLmxpYgotCWxpYiAvTk9MT0dPIC9PVVQ6bGlicG5nLmxpYiAkKE9CSlMpCi0KLXBuZ3Rlc3QuZXhlOiBwbmd0ZXN0Lm9iaiBsaWJwbmcubGliCi0JJChMRCkgJChMREZMQUdTKSAvT1VUOnBuZ3Rlc3QuZXhlIHBuZ3Rlc3Qub2JqIGxpYnBuZy5saWIgJChaTElCTElCKVx6bGliLmxpYgotCi1wbmd0ZXN0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotdGVzdDogcG5ndGVzdC5leGUKLQlwbmd0ZXN0LmV4ZQotCi0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBsaWJwbmcKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUua25yIGIvc2NyaXB0cy9tYWtlZmlsZS5rbnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGUwNjQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5rbnIKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwOSwgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0jCi0jIFRoaXMgbWFrZWZpbGUgcmVxdWlyZXMgdGhlIGZpbGUgYW5zaTJrbnIuYywgd2hpY2ggeW91IGNhbiBnZXQKLSMgZnJvbSB0aGUgR2hvc3RzY3JpcHQgZnRwIHNpdGUgYXQgZnRwOi8vZnRwLmNzLndpc2MuZWR1L2dob3N0LwotIyBJZiB5b3UgaGF2ZSBsaWJqcGVnLCB5b3UgcHJvYmFibHkgYWxyZWFkeSBoYXZlIGFuc2kya25yLmMgaW4gdGhlIGpwZWcKLSMgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotIyB3aGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSBhbmQgcG5nLmgKLXByZWZpeD0vdXNyL2xvY2FsCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQocHJlZml4KS9saWIKLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotQ0MgPSBjYwotQ1BQRkxBR1MgPSAtSS4uL3psaWIKLUNGTEFHUyA9IC1PCi1MREZMQUdTID0gLUwuIC1MLi4vemxpYi8gLWxwbmcgLWx6IC1sbQotIyBmbGFncyBmb3IgYW5zaTJrbnIKLUFOU0kyS05SRkxBR1M9Ci0KLVJBTkxJQiA9IHJhbmxpYgotI1JBTkxJQiA9IGVjaG8KLQotQ1AgPSBjcAotUk1fRiA9IHJtIC1mCi0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi1hbGw6IGFuc2kya25yIGxpYnBuZy5hIHBuZ3Rlc3QKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotIyBnZW5lcmFsIHJ1bGUgdG8gYWxsb3cgYW5zaTJrbnIgdG8gd29yawotLmMubzoKLQkuL2Fuc2kya25yICQqLmMgVCQqLmMKLQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgLWMgVCQqLmMKLQlybSAtZiBUJCouYyAkKi5vCi0JbXYgVCQqLm8gJCoubwotCi1hbnNpMmtucjogYW5zaTJrbnIuYwotCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEFOU0kyS05SRkxBR1MpIC1vIGFuc2kya25yIGFuc2kya25yLmMKLQotbGlicG5nLmE6IGFuc2kya25yICQoT0JKUykKLQlhciByYyAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGw6IGxpYnBuZy5hIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLQktQG1rZGlyICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQktQG1rZGlyICQoREVTVERJUikkKExJQlBBVEgpCi0JLUBybSAtZiAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nY29uZi5oCi0JY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2xpYmNvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2xpYmNvbmYuaAotCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgbG4gLWYgLXMgbGlicG5nLyogLikKLQljcCBsaWJwbmcuYSAkKERFU1RESVIpJChMSUJQQVRIKQotCWNobW9kIDY0NCAkKERFU1RESVIpJChMSUJQQVRIKS9saWJwbmcuYQotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcgYW5zaTJrbnIgcG5nbGliY29uZi5oCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5saW51eCBiL3NjcmlwdHMvbWFrZWZpbGUubGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMGQ2NWUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcuYSBhbmQgbGlicG5nMTYuc28gb24gTGludXggRUxGIHdpdGggZ2NjCi0jIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMiwgMjAwNiwgMjAwOCwgMjAxMC0yMDE0IEdyZWcgUm9lbG9mcyBhbmQKLSMgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE2Ci1QTkdNQUogPSAxNgotUkVMRUFTRSA9IDI0Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWdjYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLXNmCi1SQU5MSUI9cmFubGliCi1DUD1jcAotUk1fRj0vYmluL3JtIC1mCi0KLSMgd2hlcmUgIm1ha2UgaW5zdGFsbCIgcHV0cyBsaWJwbmcxNi5hLCBsaWJwbmcxNi5zbyosCi0jIGxpYnBuZzE2L3BuZy5oLCBsaWJwbmcxNi9wbmdjb25mLmgsIGFuZCBsaWJwbmcxNi9wbmdsaWJjb25mLmgKLSMgUHJlZml4IG11c3QgYmUgYSBmdWxsIHBhdGhuYW1lLgotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQuCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi1BTElHTj0KLSMgZm9yIGkzODY6Ci0jQUxJR049LW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIKLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyBcCi0JLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3RyYWRpdGlvbmFsIC1XY2FzdC1hbGlnbiBcCi0JLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAjLVdjb252ZXJzaW9uCi0KLSMgZm9yIHBnY2MgdmVyc2lvbiAyLjk1LjEsIC1PMyBpcyBidWdneTsgZG9uJ3QgdXNlIGl0LgotCi1DUFBGTEFHUz0tSSQoWkxJQklOQykgIyAtRFBOR19ERUJVRz01Ci1DRkxBR1M9IC1XIC1XYWxsIC1PMyAtZnVucm9sbC1sb29wcyBcCi0JJChBTElHTikgIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci0KLUxERkxBR1M9LUwuIC1XbCwtcnBhdGgsLiAtTCQoWkxJQkxJQikgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIC1scG5nMTYgLWx6IC1sbQotTERGTEFHU19BPS1MJChaTElCTElCKSAtV2wsLXJwYXRoLCQoWkxJQkxJQikgbGlicG5nLmEgLWx6IC1sbQotCi1JTkNQQVRIPSQocHJlZml4KS9pbmNsdWRlCi1MSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLU9CSlMgPSAgcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtZlBJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBwbmd0ZXN0LXN0YXRpYyBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVdsLC1ycGF0aCwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQkkKENDKSAtc2hhcmVkIC1XbCwtc29uYW1lLCQoTElCU09NQUopIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotcG5ndGVzdC1zdGF0aWM6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3Qtc3RhdGljICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTX0EpCi0KLXRlc3Q6IHBuZ3Rlc3QgcG5ndGVzdC1zdGF0aWMKLQlAZWNobyAiIgotCUBlY2hvICIgICBSdW5uaW5nIHBuZ3Rlc3QgZHluYW1pY2FsbHkgbGlua2VkIHdpdGggJChMSUJTTyk6IgotCUBlY2hvICIiCi0JLi9wbmd0ZXN0Ci0JQGVjaG8gIiIKLQlAZWNobyAiICAgUnVubmluZyBwbmd0ZXN0IHN0YXRpY2FsbHkgbGlua2VkIHdpdGggbGlicG5nLmE6IgotCUBlY2hvICIiCi0JLi9wbmd0ZXN0LXN0YXRpYwotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAkKENQUEZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgLVdsLCAtcnBhdGgsJChETCkgLVdsLC1ycGF0aCwkKFpMSUJMSUIpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQkkKENDKSAkKENQUEZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIC1XbCwtcnBhdGgsJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIGxpYnBuZy1jb25maWcgXAotCSQoTElCU08pICQoTElCU09NQUopKiBwbmd0ZXN0LXN0YXRpYyBwbmd0ZXN0aSBcCi0JbGlicG5nLnBjIHBuZ2xpYmNvbmYuaAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5taXBzIGIvc2NyaXB0cy9tYWtlZmlsZS5taXBzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjMzNjA4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUubWlwcworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcKLSMgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1DQz1jYwotQ1BQRkxBR1M9LUkuLi96bGliIC1EU1lTViAtRG1pcHMKLUNGTEFHUz0tTyAtc3lzdHlwZSBzeXN2IC13Ci0jQ0ZMQUdTPS1PCi1MREZMQUdTPS1MLiAtTC4uL3psaWIvIC1scG5nIC1seiAtbG0KLQotI1JBTkxJQj1yYW5saWIKLVJBTkxJQj1lY2hvCi0KLUNQPWNwCi0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nLmE6ICQoT0JKUykKLQlhciByYyAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGw6IGxpYnBuZy5hCi0JLUBta2RpciAkKERFU1RESVIpJChJTkNQQVRIKQotCS1AbWtkaXIgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JLUBta2RpciAkKERFU1RESVIpJChMSUJQQVRIKQotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nLmgKLQktQHJtIC1mICQoREVTVERJUikkKElOQ1BBVEgpL3BuZ2NvbmYuaAotCS1Acm0gLWYgJChERVNURElSKSQoSU5DUEFUSCkvcG5nbGliY29uZi5oCi0JY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2xpYmNvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2xpYmNvbmYuaAotCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgbG4gLWYgLXMgbGlicG5nLyogLikKLQljcCBsaWJwbmcuYSAkKERFU1RESVIpJChMSUJQQVRIKQotCWNobW9kIDY0NCAkKERFU1RESVIpJChMSUJQQVRIKS9saWJwbmcuYQotCi1jbGVhbjoKLQlybSAtZiAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmdvdXQucG5nIHBuZ2xpYmNvbmYuaAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUubXNjIGIvc2NyaXB0cy9tYWtlZmlsZS5tc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWQ2MmUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5tc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5LCAyMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0jCi0jIEFzc3VtZXMgdGhhdCB6bGliLmxpYiwgemNvbmYuaCwgYW5kIHpsaWIuaCBoYXZlIGJlZW4gY29waWVkIHRvIC4uXHpsaWIKLQotIyAtLS0tLS0tLSBNaWNyb3NvZnQgQyA1LjEgYW5kIGxhdGVyLCBkb2VzIG5vdCB1c2UgYXNzZW1ibGVyIGNvZGUgLS0tLS0tLS0KLU1PREVMPUwKLUNQUEZMQUdTPS1JLi5cemxpYgotQ0ZMQUdTPS1PYWl0IC1HcyAtbm9sb2dvIC1XMyAtQSQoTU9ERUwpCi0jLU94IGdlbmVyYXRlcyBiYWQgY29kZSB3aXRoIE1TQyA1LjEKLUNDPWNsCi1MRD1saW5rCi1MREZMQUdTPS9lL3N0OjB4MTUwMC9ub2UKLUNQPWNvcHkKLU89Lm9iagotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzXHBuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHNccG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLSN1bmNvbW1lbnQgbmV4dCB0byBwdXQgZXJyb3IgbWVzc2FnZXMgaW4gYSBmaWxlCi1FUlJGSUxFPSA+PiBwbmdlcnJzCi0KLSMgdmFyaWFibGVzCi1PQkpTMSA9IHBuZyQoTykgcG5nc2V0JChPKSBwbmdnZXQkKE8pIHBuZ3J1dGlsJChPKSBwbmd0cmFucyQoTykgcG5nd3V0aWwkKE8pCi1PQkpTMiA9IHBuZ21lbSQoTykgcG5ncHJlYWQkKE8pIHBuZ3JlYWQkKE8pIHBuZ2Vycm9yJChPKSBwbmd3cml0ZSQoTykKLU9CSlMzID0gcG5ncnRyYW4kKE8pIHBuZ3d0cmFuJChPKSBwbmdyaW8kKE8pIHBuZ3dpbyQoTykKLQotYWxsOiBsaWJwbmcubGliCi0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi0JJChDUCkgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACi0KLXBuZyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdzZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZ2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncHJlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncnRyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nZXJyb3IkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nbWVtJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3JpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd3aW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ndHJhbnMkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3JpdGUkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd3V0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotbGlicG5nLmxpYjogJChPQkpTMSkgJChPQkpTMikgJChPQkpTMykKLQlkZWwgbGlicG5nLmxpYgotCWxpYiBsaWJwbmcgJChPQkpTMSk7Ci0JbGliIGxpYnBuZyAkKE9CSlMyKTsKLQlsaWIgbGlicG5nICQoT0JKUzMpOwotCi1wbmd0ZXN0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5ndGVzdC5leGU6IHBuZ3Rlc3Qub2JqIGxpYnBuZy5saWIKLQkkKExEKSAkKExERkxBR1MpIHBuZ3Rlc3Qub2JqLCwsbGlicG5nLmxpYiAuLlx6bGliXHpsaWIubGliIDsKLQotdGVzdDogcG5ndGVzdC5leGUKLQlwbmd0ZXN0Ci0KLSMgRW5kIG9mIG1ha2VmaWxlIGZvciBsaWJwbmcKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5tc3lzIGIvc2NyaXB0cy9tYWtlZmlsZS5tc3lzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJkODhjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUubXN5cworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgdXNpbmcgTVNZUy9nY2MgKHNoYXJlZCwgc3RhdGljIGxpYnJhcnkpCi0jIENvcHlyaWdodCAoQykgMjAxMiBHbGVubiBSYW5kZXJzLVBlaHJzb24gYW5kIENocmlzdG9waGVyIE0uIFdoZWVsZXIKLSMKLSMgUG9ydGlvbnMgdGFrZW4gZnJvbSBtYWtlZmlsZS5saW51eDoKLSMgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAyLCAyMDA2LCAyMDA4LCAyMDEwLTIwMTQgR3JlZyBSb2Vsb2ZzIGFuZAotIyBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAyMDAwIENvc21pbiBUcnV0YQotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0jICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTYKLVBOR01BSiA9IDE2Ci1SRUxFQVNFID0gMjQKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuZGxsCi1MSUJTT01BSj0kKExJQk5BTUUpLmRsbC4kKFBOR01BSikKLUxJQlNPUkVMPSQoUE5HTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuZGxsCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZC4KLSNaTElCTElCPS4uL3psaWIKLSNaTElCSU5DPS4uL3psaWIKLVpMSUJMSUI9L3Vzci9sb2NhbC9saWIKLVpMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0KLSMgQ29tcGlsZXIsIGxpbmtlciwgbGliIGFuZCBvdGhlciB0b29scwotQ0MgPSBnY2MKLUxEID0gJChDQykKLUFSX1JDID0gYXIgcmNzCi1SQU5MSUIgPSByYW5saWIKLUNQID0gY3AKLVJNX0YgPSBybSAtcmYKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotCi0jQVJDSCA9IC1tYXJjaD1wZW50aXVtMwotI0FSQ0ggPSAtbWFyY2g9aTY4NgotQVJDSCA9Ci1DUFBGTEFHUyA9ICMgLURQTkdfREVCVUc9NQotQ0ZMQUdTID0gLVcgLVdhbGwgLU8yICQoQVJDSCkgIyAtZwotTERGTEFHUyA9Ci1MSUJTID0gLWx6IC1sbQotCi0jIEZpbGUgZXh0ZW5zaW9ucwotRVhFRVhUPS5leGUKLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLSMgVmFyaWFibGVzCi1PQkpTID0gIHBuZy5vIHBuZ2Vycm9yLm8gcG5nZ2V0Lm8gcG5nbWVtLm8gcG5ncHJlYWQubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3J0cmFuLm8gcG5ncnV0aWwubyBwbmdzZXQubyBcCi0JcG5ndHJhbnMubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3d0cmFuLm8gcG5nd3V0aWwubwotCi0jIFRhcmdldHMKLWFsbDogc3RhdGljIHNoYXJlZAotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkPAotCi1zdGF0aWM6IGxpYnBuZy5hIHBuZ3Rlc3QkKEVYRUVYVCkKLQotc2hhcmVkOiAkKExJQlNPTUFKKQotCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsJChMSUJTT01BSikgLW8gJChMSUJTTykKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6Ci0JJChDQykgLXNoYXJlZCAtV2wsLXNvbmFtZSwkKExJQlNPTUFKKSAtbyAkKExJQlNPTUFKKQotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIFJfb3B0cz1cIi1XbCwtcnBhdGgsJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNiAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTTykgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi10ZXN0OiBwbmd0ZXN0JChFWEVFWFQpCi0JLi9wbmd0ZXN0JChFWEVFWFQpCi0KLXBuZ3Rlc3QkKEVYRUVYVCk6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoTEQpICQoTERGTEFHUykgLUwkKFpMSUJMSUIpIC1vICRAIHBuZ3Rlc3QubyBsaWJwbmcuYSAkKExJQlMpCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QkKEVYRUVYVCkgcG5nb3V0LnBuZyBwbmdsaWJjb25mLmggJChMSUJTTykgXAotCSQoTElCU09NQUopIGxpYnBuZy1jb25maWcKLQotcG5nLm86ICAgICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubzogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkLm86ICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm86ICAgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubzogICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86ICBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QgYi9zY3JpcHRzL21ha2VmaWxlLm5lMTJic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOGJkYjEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5uZTEyYnNkCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIGZvciBOZXRCU0QgZm9yIHRoZSBzdGFuZGFyZAotIyBtYWtlIG9iaiAmJiBtYWtlIGRlcGVuZCAmJiBtYWtlICYmIG1ha2UgdGVzdAotIyBtYWtlIGluY2x1ZGVzICYmIG1ha2UgaW5zdGFsbAotIyBDb3B5cmlnaHQgKEMpIDIwMDIgUGF0cmljayBSLkwuIFdlbGNoZQotIyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDksIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBZb3Ugc2hvdWxkIGFsc28gcnVuIG1ha2VmaWxlLm5ldGJzZAotCi1MT0NBTEJBU0U/PS91c3IvbG9jYWwKLUxJQkRJUj0JJHtMT0NBTEJBU0V9L2xpYgotTUFORElSPSAke0xPQ0FMQkFTRX0vbWFuCi1JTkNTRElSPSR7TE9DQUxCQVNFfS9pbmNsdWRlL2xpYnBuZzE2Ci0KLUxJQj0JcG5nMTYKLVNITElCX01BSk9SPQkwCi1TSExJQl9NSU5PUj0JMS42LjI0Ci1TUkNTPQlwbmcuYyBwbmdzZXQuYyBwbmdnZXQuYyBwbmdydXRpbC5jIHBuZ3RyYW5zLmMgcG5nd3V0aWwuYyBcCi0JcG5ncmVhZC5jIHBuZ3Jpby5jIHBuZ3dpby5jIHBuZ3dyaXRlLmMgcG5ncnRyYW4uYyBcCi0JcG5nd3RyYW4uYyBwbmdtZW0uYyBwbmdlcnJvci5jIHBuZ3ByZWFkLmMKLUlOQ1M9CXBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLU1BTj0JbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCi1DUFBGTEFHUys9LUkkey5DVVJESVJ9Ci0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi0jIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZCBvZiB0aGUgbWFudWFsCi0jIHVuY29tbWVudGluZywgYnV0IGl0IGNvcmUgZHVtcHMgZm9yIG1lIGF0IHRoZSBtb21lbnQ6Ci0jIC5pZiAke01BQ0hJTkVfQVJDSH0gPT0gImkzODYiCi0jICAgTUtMSU5UPSBubwotIyAuZW5kaWYKLQotQ0xFQU5GSUxFUys9cG5ndGVzdC5vIHBuZ3Rlc3QgcG5nbGliY29uZi5oCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi0JY3AgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACi0KLXBuZ3Rlc3QubzoJcG5ndGVzdC5jCi0JJHtDQ30gLWMgJHtDUFBGTEFHU30gJHtDRkxBR1N9ICR7LkFMTFNSQ30gLW8gJHsuVEFSR0VUfQotCi1wbmd0ZXN0Oglwbmd0ZXN0Lm8gbGlicG5nLmEKLQkke0NDfSAke0xERkxBR1N9ICR7LkFMTFNSQ30gLW8key5UQVJHRVR9IC1seiAtbG0KLQotdGVzdDoJcG5ndGVzdAotCWNkICR7LkNVUkRJUn0gJiYgJHsuT0JKRElSfS9wbmd0ZXN0Ci0KLS5pbmNsdWRlIDxic2QubGliLm1rPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5uZXRic2QgYi9zY3JpcHRzL21ha2VmaWxlLm5ldGJzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjMmVhNC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2VmaWxlLm5ldGJzZAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBmb3IgTmV0QlNEIGZvciB0aGUgc3RhbmRhcmQKLSMgbWFrZSBvYmogJiYgbWFrZSBkZXBlbmQgJiYgbWFrZSAmJiBtYWtlIHRlc3QKLSMgbWFrZSBpbmNsdWRlcyAmJiBtYWtlIGluc3RhbGwKLSMgQ29weXJpZ2h0IChDKSAyMDAyIFBhdHJpY2sgUi5MLiBXZWxjaGUKLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDksIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBZb3Ugc2hvdWxkIGFsc28gcnVuIG1ha2VmaWxlLm5lMTZic2QKLQotTE9DQUxCQVNFPz0vdXNyL2xvY2FsCi1MSUJESVI9CSR7TE9DQUxCQVNFfS9saWIKLU1BTkRJUj0gJHtMT0NBTEJBU0V9L21hbgotSU5DU0RJUj0ke0xPQ0FMQkFTRX0vaW5jbHVkZQotCi1MSUI9CXBuZwotU0hMSUJfTUFKT1I9CTE2Ci1TSExJQl9NSU5PUj0JMS42LjI0Ci1TUkNTPQlwbmcuYyBwbmdzZXQuYyBwbmdnZXQuYyBwbmdydXRpbC5jIHBuZ3RyYW5zLmMgcG5nd3V0aWwuYyBcCi0JcG5ncmVhZC5jIHBuZ3Jpby5jIHBuZ3dpby5jIHBuZ3dyaXRlLmMgcG5ncnRyYW4uYyBcCi0JcG5nd3RyYW4uYyBwbmdtZW0uYyBwbmdlcnJvci5jIHBuZ3ByZWFkLmMKLUlOQ1M9CXBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLU1BTj0JbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCi1DUFBGTEFHUys9LUkkey5DVVJESVJ9Ci0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi0jIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZCBvZiB0aGUgbWFudWFsCi0jIHVuY29tbWVudGluZywgYnV0IGl0IGNvcmUgZHVtcHMgZm9yIG1lIGF0IHRoZSBtb21lbnQ6Ci0jIC5pZiAke01BQ0hJTkVfQVJDSH0gPT0gImkzODYiCi0jICAgTUtMSU5UPSBubwotIyAuZW5kaWYKLQotQ0xFQU5GSUxFUys9cG5ndGVzdC5vIHBuZ3Rlc3QgcG5nbGliY29uZi5oCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi0JY3AgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACi0KLXBuZ3Rlc3QubzoJcG5ndGVzdC5jCi0JJHtDQ30gLWMgJHtDUFBGTEFHU30gJHtDRkxBR1N9ICR7LkFMTFNSQ30gLW8gJHsuVEFSR0VUfQotCi1wbmd0ZXN0Oglwbmd0ZXN0Lm8gbGlicG5nLmEKLQkke0NDfSAke0xERkxBR1N9ICR7LkFMTFNSQ30gLW8key5UQVJHRVR9IC1seiAtbG0KLQotdGVzdDoJcG5ndGVzdAotCWNkICR7LkNVUkRJUn0gJiYgJHsuT0JKRElSfS9wbmd0ZXN0Ci0KLS5pbmNsdWRlIDxic2QubGliLm1rPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5vcGVuYnNkIGIvc2NyaXB0cy9tYWtlZmlsZS5vcGVuYnNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2I4MTgzLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUub3BlbmJzZAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSwgMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLVBSRUZJWD89IC91c3IvbG9jYWwKLUxJQkRJUj0JJHtQUkVGSVh9L2xpYgotTUFORElSPSAke1BSRUZJWH0vbWFuL2NhdAotCi1TSExJQl9NQUpPUj0JMTYKLVNITElCX01JTk9SPQkxLjYuMjQKLQotTElCPQlwbmcKLVNSQ1M9CXBuZy5jIHBuZ2Vycm9yLmMgcG5nZ2V0LmMgcG5nbWVtLmMgcG5ncHJlYWQuYyBcCi0JcG5ncmVhZC5jIHBuZ3Jpby5jIHBuZ3J0cmFuLmMgcG5ncnV0aWwuYyBwbmdzZXQuYyBwbmd0cmFucy5jIFwKLQlwbmd3aW8uYyBwbmd3cml0ZS5jIHBuZ3d0cmFuLmMgcG5nd3V0aWwuYwotCi1IRFJTPQlwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0KLUNGTEFHUys9IC1XIC1XYWxsCi1DUFBGTEFHUys9IC1JJHsuQ1VSRElSfQotCi1OT1BST0ZJTEU9IFllcwotCi1DTEVBTkZJTEVTKz0gcG5ndGVzdC5vIHBuZ3Rlc3QgcG5nbGliY29uZi5oCi0KLU1BTj0JbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotRE9DUz0JQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTyBcCi0JbGlicG5nLW1hbnVhbC50eHQKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQ9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLXBuZ2xpYmNvbmYuaDogJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpCi0JY3AgJChQTkdMSUJDT05GX0hfUFJFQlVJTFQpICRACi0KLXBuZ3Rlc3QubzoJcG5ndGVzdC5jCi0JJHtDQ30gJHtDUFBGTEFHU30gJHtDRkxBR1N9IC1jICR7LkFMTFNSQ30gLW8gJHsuVEFSR0VUfQotCi1wbmd0ZXN0Oglwbmd0ZXN0Lm8KLQkke0NDfSAke0xERkxBR1N9ICR7LkFMTFNSQ30gLW8gJHsuVEFSR0VUfSAtTCR7Lk9CSkRJUn0gLWxwbmcgLWx6IC1sbQotCi10ZXN0Oglwbmd0ZXN0Ci0JY2QgJHsuT0JKRElSfSAmJiBlbnYgXAotCQlMRF9MSUJSQVJZX1BBVEg9IiR7Lk9CSkRJUn0iICR7Lk9CSkRJUn0vcG5ndGVzdAotCi1iZWZvcmVpbnN0YWxsOgotCWlmIFsgISAtZCAke0RFU1RESVJ9JHtQUkVGSVh9L2luY2x1ZGUvbGlicG5nIF07IHRoZW4gXAotCSAgJHtJTlNUQUxMfSAtZCAtbyByb290IC1nIHdoZWVsICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZTsgXAotCWZpCi0JaWYgWyAhIC1kICR7REVTVERJUn0ke0xJQkRJUn0gXTsgdGhlbiBcCi0JICAke0lOU1RBTEx9IC1kIC1vIHJvb3QgLWcgd2hlZWwgJHtERVNURElSfSR7TElCRElSfTsgXAotCWZpCi0JaWYgWyAhIC1kICR7REVTVERJUn0ke0xJQkRJUn0vZGVidWcgXTsgdGhlbiBcCi0JICAke0lOU1RBTEx9IC1kIC1vIHJvb3QgLWcgd2hlZWwgJHtERVNURElSfSR7TElCRElSfS9kZWJ1ZzsgXAotCWZpCi0JaWYgWyAhIC1kICR7REVTVERJUn0ke01BTkRJUn0zIF07IHRoZW4gXAotCSAgJHtJTlNUQUxMfSAtZCAtbyByb290IC1nIHdoZWVsICR7REVTVERJUn0ke01BTkRJUn0zOyBcCi0JZmkKLQlpZiBbICEgLWQgJHtERVNURElSfSR7TUFORElSfTUgXTsgdGhlbiBcCi0JICAke0lOU1RBTEx9IC1kIC1vIHJvb3QgLWcgd2hlZWwgJHtERVNURElSfSR7TUFORElSfTU7IFwKLQlmaQotCWlmIFsgISAtZCAke0RFU1RESVJ9JHtQUkVGSVh9L3NoYXJlL2RvYy9wbmcgXTsgdGhlbiBcCi0JICAke0lOU1RBTEx9IC1kIC1vIHJvb3QgLWcgd2hlZWwgJHtERVNURElSfSR7UFJFRklYfS9zaGFyZS9kb2MvcG5nOyBcCi0JZmkKLQotYWZ0ZXJpbnN0YWxsOgotCUBybSAtZiAke0RFU1RESVJ9JHtMSUJESVJ9L2xpYnBuZ19waWMuYQotCUBybSAtZiAke0RFU1RESVJ9JHtMSUJESVJ9L2RlYnVnL2xpYnBuZy5hCi0JQHJtIC1mICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZS9wbmcuaAotCUBybSAtZiAke0RFU1RESVJ9JHtQUkVGSVh9L2luY2x1ZGUvcG5nY29uZi5oCi0JQHJtIC1mICR7REVTVERJUn0ke1BSRUZJWH0vaW5jbHVkZS9wbmdsaWJjb25mLmgKLQlAcm1kaXIgJHtERVNURElSfSR7TElCRElSfS9kZWJ1ZyAyPi9kZXYvbnVsbCB8fCB0cnVlCi0JJHtJTlNUQUxMfSAke0lOU1RBTExfQ09QWX0gLW8gJHtTSEFSRU9XTn0gLWcgJHtTSEFSRUdSUH0gXAotCQktbSAke05PTkJJTk1PREV9ICR7SERSU30gJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlCi0JJHtJTlNUQUxMfSAke0lOU1RBTExfQ09QWX0gLW8gJHtTSEFSRU9XTn0gLWcgJHtTSEFSRUdSUH0gXAotCQktbSAke05PTkJJTk1PREV9ICR7SERSU30gJHtERVNURElSfSR7UFJFRklYfS9pbmNsdWRlCi0JJHtJTlNUQUxMfSAke0lOU1RBTExfQ09QWX0gLW8gJHtTSEFSRU9XTn0gLWcgJHtTSEFSRUdSUH0gXAotCQktbSAke05PTkJJTk1PREV9ICR7RE9DU30gJHtERVNURElSfSR7UFJFRklYfS9zaGFyZS9kb2MvcG5nCi0KLS5pbmNsdWRlIDxic2QubGliLm1rPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5zY28gYi9zY3JpcHRzL21ha2VmaWxlLnNjbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljN2M0MC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2VmaWxlLnNjbworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBTQ08gT1NyNSAgRUxGIGFuZCBVbml4d2FyZSA3IHdpdGggTmF0aXZlIGNjCi0jIENvbnRyaWJ1dGVkIGJ5IE1pa2UgSG9wa2lyayAoaG9wc0BzY28uY29tKSBtb2RpZmllZCBmcm9tIE1ha2VmaWxlLmxueAotIyAgIGZvcmNlIEVMRiBidWlsZCBkeW5hbWljIGxpbmtpbmcsIFNPTkFNRSBzZXR0aW5nIGluIGxpYiBhbmQgUlBBVEggaW4gYXBwCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAxMC0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgotIyBDb3B5cmlnaHQgKEMpIDE5OTggR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE2Ci1QTkdNQUogPSAxNgotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotCi0jIFV0aWxpdGllczoKLUNDPWNjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpcgotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1lY2hvCi1DUD1jcAotUk1fRj0vYmluL3JtIC1mCi0KLSMgd2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsICQoT0xEU08pKiwgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotWkxJQkxJQj0uLi96bGliCi1aTElCSU5DPS4uL3psaWIKLQotQ1BQRkxBR1M9LUkkKFpMSUJJTkMpCi1DRkxBR1M9IC1keSAtYmVsZiAtTzMKLUxERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBjY29wdHM9XCItYmVsZlwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCSQoQ0MpIC1HICAtV2wsLWgsJChMSUJTT01BSikgLW8gJChMSUJTT01BSikgXAotCSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCUxEX1JVTl9QQVRIPS46JChaTElCTElCKSAkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCS1AJChSTV9GKSAkKERJKS9wbmcuaAotCS1AJChSTV9GKSAkKERJKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nbGliY29uZi5oCi0JY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5nb3V0LnBuZyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogcG5ndGVzdC1zdGF0aWMgcG5ndGVzdGkgXAotCXBuZ2xpYmNvbmYuaCBsaWJwbmcucGMKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuc2dnY2MgYi9zY3JpcHRzL21ha2VmaWxlLnNnZ2NjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGQwNTFkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuc2dnY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nLmEgYW5kIGxpYnBuZzE2LnNvLCBTR0kgSVJJWCB3aXRoICdjYycKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIsIDIwMDYsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRT1saWJwbmcxNgotUE5HTUFKID0gMTYKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc28KLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Z2NjCi1NS0RJUl9QPW1rZGlyIC1wCi1MTl9TRj1sbiAtc2YKLVJBTkxJQj1lY2hvCi1DUD1jcAotUk1fRj0vYmluL3JtIC1mCi0KLSMgV2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvLCBhbmQgbGlicG5nMTYvcG5nLmgKLSMgUHJlZml4IG11c3QgYmUgYSBmdWxsIHBhdGhuYW1lLgotCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIzMgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYgotI1pMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi1aTElCTElCPS4uL3psaWIKLVpMSUJJTkM9Li4vemxpYgotCi0jIEFCSSBjYW4gYmUgYmxhbmsgdG8gdXNlIGRlZmF1bHQgZm9yIHlvdXIgc3lzdGVtLCAtMzIsIC1vMzIsIC1uMzIsIG9yIC02NAotIyBTZWUgIm1hbiBhYmkiLiAgemxpYiBtdXN0IGJlIGJ1aWx0IHdpdGggdGhlIHNhbWUgQUJJLgotQUJJPQotCi1XQVJOTU9SRT0KLUNQUEZMQUdTPS1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKLUNGTEFHUz0kKEFCSSkgLU8gJChXQVJOTU9SRSkgLWZQSUMgLW1hYmk9bjMyICMgLWcKLUxERkxBR1M9JChBQkkpIC1MLiAtTCQoWkxJQkxJQikgLWxwbmcgLWx6IC1sbQotTERTSEFSRUQ9Y2MgJChBQkkpIC1zaGFyZWQgLXNvbmFtZSAkKExJQlNPTUFKKSBcCi0JLXNldF92ZXJzaW9uIHNnaSQoUE5HTUFKKS4wCi0jIFNlZSAibWFuIGRzbyIgZm9yIGluZm8gYWJvdXQgc2hhcmVkIG9iamVjdHMKLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLSNMSUJQQVRIPSQoZXhlY19wcmVmaXgpL2xpYjMyCi1NQU5QQVRIPSQocHJlZml4KS9tYW4KLUJJTlBBVEg9JChleGVjX3ByZWZpeCkvYmluCi0KLSMgb3ZlcnJpZGUgREVTVERJUj0gb24gdGhlIG1ha2UgaW5zdGFsbCBjb21tYW5kIGxpbmUgdG8gZWFzaWx5IHN1cHBvcnQKLSMgaW5zdGFsbGluZyBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLiAgRXhhbXBsZToKLSMKLSMgICAgbWFrZSBpbnN0YWxsIERFU1RESVI9L3RtcC9idWlsZC9saWJwbmcKLSMKLSMgSWYgeW91J3JlIGdvaW5nIHRvIGluc3RhbGwgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbgotIyB2aWEgREVTVERJUiwgJChERVNURElSKSQocHJlZml4KSBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlCi0jIHlvdSBleGVjdXRlIG1ha2UgaW5zdGFsbC4KLURFU1RESVI9Ci0KLURCPSQoREVTVERJUikkKEJJTlBBVEgpCi1EST0kKERFU1RESVIpJChJTkNQQVRIKQotREw9JChERVNURElSKSQoTElCUEFUSCkKLURNPSQoREVTVERJUikkKE1BTlBBVEgpCi0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotT0JKUyA9ICBwbmcubyBwbmdzZXQubyBwbmdnZXQubyBwbmdydXRpbC5vIHBuZ3RyYW5zLm8gcG5nd3V0aWwubyBcCi0JcG5ncmVhZC5vIHBuZ3Jpby5vIHBuZ3dpby5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBcCi0JcG5nd3RyYW4ubyBwbmdtZW0ubyBwbmdlcnJvci5vIHBuZ3ByZWFkLm8KLQotLmMubzoKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgLW8gJEAgJDwKLQotYWxsOiBsaWJwbmcuYSBwbmd0ZXN0IHNoYXJlZCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotc2hhcmVkOiAkKExJQlNPTUFKKQotCi1saWJwbmcucGM6Ci0JY2F0IHNjcmlwdHMvbGlicG5nLnBjLmluIHwgc2VkIC1lIHMhQHByZWZpeEAhJChwcmVmaXgpISBcCi0JLWUgcyFAZXhlY19wcmVmaXhAISQoZXhlY19wcmVmaXgpISBcCi0JLWUgcyFAbGliZGlyQCEkKExJQlBBVEgpISBcCi0JLWUgcyFAaW5jbHVkZWRpckAhJChJTkNQQVRIKSEgXAotCS1lIHMhLWxwbmcxNiEtbHBuZzE2XCAtbHpcIC1sbSEgPiBsaWJwbmcucGMKLQotbGlicG5nLWNvbmZpZzoKLQkoIGNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctaGVhZC5pbjsgXAotCWVjaG8gcHJlZml4PVwiJChwcmVmaXgpXCI7IFwKLQllY2hvIElfb3B0cz1cIi1JJChJTkNQQVRIKS8kKExJQk5BTUUpXCI7IFwKLQllY2hvIGNjb3B0cz1cIiQoQUJJKVwiOyBcCi0JZWNobyBjcHBmbGFncz1cIlwiOyBcCi0JZWNobyBsZG9wdHM9XCIkKEFCSSlcIjsgXAotCWVjaG8gTF9vcHRzPVwiLUwkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYmRpcj1cIiQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTKQotCSQoTERTSEFSRUQpIC1vICRAICQoT0JKUykKLQkkKFJNX0YpICQoTElCU08pICQoTElCU09NQUopCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQllY2hvCi0JZWNobyBUZXN0aW5nIGxvY2FsIHN0YXRpYyBsaWJyYXJ5LgotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIFwKLQkgICAtcnBhdGggJChaTElCTElCKTokKERMKSBcCi0JICAgLW8gcG5ndGVzdGQgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKENQUEZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKFpMSUJMSUIpIFwKLQkgICAtcnBhdGggJChaTElCTElCKTpgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxpYmRpcmAgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIGxpYnBuZy5wYyBcCi0Jc29fbG9jYXRpb25zIGxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIHBuZ2xpYmNvbmYuaAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZXJyb3IubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdtZW0ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3NldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuc2dpIGIvc2NyaXB0cy9tYWtlZmlsZS5zZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZjA5MDIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5zZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nLmEgYW5kIGxpYnBuZzE2LnNvLCBTR0kgSVJJWCB3aXRoICdjYycKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIsIDIwMDYsIDIwMDcsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk1IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRT1saWJwbmcxNgotUE5HTUFKID0gMTYKLQotIyBTaGFyZWQgbGlicmFyeSBuYW1lczoKLUxJQlNPPSQoTElCTkFNRSkuc28KLUxJQlNPTUFKPSQoTElCTkFNRSkuc28uJChQTkdNQUopCi1MSUJTT1JFTD0kKExJQlNPTUFKKS4kKFJFTEVBU0UpCi1PTERTTz1saWJwbmcuc28KLQotIyBVdGlsaXRpZXM6Ci1BUl9SQz1hciByYwotQ0M9Y2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1zZgotUkFOTElCPWVjaG8KLUNQPWNwCi1STV9GPS9iaW4vcm0gLWYKLQotIyBXaGVyZSBtYWtlIGluc3RhbGwgcHV0cyBsaWJwbmcuYSwgbGlicG5nMTYuc28sIGFuZCBsaWJwbmcxNi9wbmcuaAotIyBQcmVmaXggbXVzdCBiZSBhIGZ1bGwgcGF0aG5hbWUuCi0KLXByZWZpeD0vdXNyL2xvY2FsCi1leGVjX3ByZWZpeD0kKHByZWZpeCkKLQotIyBXaGVyZSB0aGUgemxpYiBsaWJyYXJ5IGFuZCBpbmNsdWRlIGZpbGVzIGFyZSBsb2NhdGVkCi0jWkxJQkxJQj0vdXNyL2xvY2FsL2xpYjMyCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLSMgQUJJIGNhbiBiZSBibGFuayB0byB1c2UgZGVmYXVsdCBmb3IgeW91ciBzeXN0ZW0sIC0zMiwgLW8zMiwgLW4zMiwgb3IgLTY0Ci0jIFNlZSAibWFuIGFiaSIuICB6bGliIG11c3QgYmUgYnVpbHQgd2l0aCB0aGUgc2FtZSBBQkkuCi1BQkk9Ci0KLVdBUk5NT1JFPS1mdWxsd2FybgotIyBOb3RlOiAtS1BJQyBpcyB0aGUgZGVmYXVsdCBhbnlob3cKLUNQUEZMQUdTPS1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKLSNDRkxBR1M9ICQoQUJJKSAtTyAkKFdBUk5NT1JFKSAtS1BJQyAjIC1nCi1DRkxBR1M9JChBQkkpIC1PICQoV0FSTk1PUkUpCi1MREZMQUdTX0E9JChBQkkpIC1MLiAtTCQoWkxJQkxJQikgLWxwbmcxNiAtbHogLWxtCi1MREZMQUdTPSQoQUJJKSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLUxEU0hBUkVEPWNjICQoQUJJKSAtc2hhcmVkIC1zb25hbWUgJChMSUJTT01BSikgXAotCS1zZXRfdmVyc2lvbiBzZ2kkKFBOR01BSikuMAotIyBTZWUgIm1hbiBkc28iIGZvciBpbmZvIGFib3V0IHNoYXJlZCBvYmplY3RzCi0KLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChleGVjX3ByZWZpeCkvbGliCi0jTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIzMgotTUFOUEFUSD0kKHByZWZpeCkvbWFuCi1CSU5QQVRIPSQoZXhlY19wcmVmaXgpL2JpbgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi1EQj0kKERFU1RESVIpJChCSU5QQVRIKQotREk9JChERVNURElSKSQoSU5DUEFUSCkKLURMPSQoREVTVERJUikkKExJQlBBVEgpCi1ETT0kKERFU1RESVIpJChNQU5QQVRIKQotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzL3BuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLVBOR0xJQkNPTkZfSF9QUkVCVUlMVCA9IHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0Ci0KLU9CSlMgPSAgcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWFsbDogbGlicG5nLmEgcG5ndGVzdCBzaGFyZWQgbGlicG5nLnBjIGxpYnBuZy1jb25maWcKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLWxpYnBuZy5wYzoKLQljYXQgc2NyaXB0cy9saWJwbmcucGMuaW4gfCBzZWQgLWUgcyFAcHJlZml4QCEkKHByZWZpeCkhIFwKLQktZSBzIUBleGVjX3ByZWZpeEAhJChleGVjX3ByZWZpeCkhIFwKLQktZSBzIUBsaWJkaXJAISQoTElCUEFUSCkhIFwKLQktZSBzIUBpbmNsdWRlZGlyQCEkKElOQ1BBVEgpISBcCi0JLWUgcyEtbHBuZzE2IS1scG5nMTZcIC1selwgLWxtISA+IGxpYnBuZy5wYwotCi1saWJwbmctY29uZmlnOgotCSggY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1oZWFkLmluOyBcCi0JZWNobyBwcmVmaXg9XCIkKHByZWZpeClcIjsgXAotCWVjaG8gSV9vcHRzPVwiLUkkKElOQ1BBVEgpLyQoTElCTkFNRSlcIjsgXAotCWVjaG8gY2NvcHRzPVwiJChBQkkpXCI7IFwKLQllY2hvIGxkb3B0cz1cIiQoQUJJKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gbGliZGlyPVwiJChMSUJQQVRIKVwiOyBcCi0JZWNobyBsaWJzPVwiLWxwbmcxNiAtbHogLWxtXCI7IFwKLQljYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWJvZHkuaW4gKSA+IGxpYnBuZy1jb25maWcKLQljaG1vZCAreCBsaWJwbmctY29uZmlnCi0KLSQoTElCU08pOiAkKExJQlNPTUFKKQotCSQoTE5fU0YpICQoTElCU09NQUopICQoTElCU08pCi0KLSQoTElCU09NQUopOiAkKE9CSlMpCi0JJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKQotCSQoUk1fRikgJChMSUJTTykgJChMSUJTT01BSikKLQotcG5ndGVzdDogcG5ndGVzdC5vIGxpYnBuZy5hCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCWVjaG8KLQllY2hvIFRlc3RpbmcgbG9jYWwgc3RhdGljIGxpYnJhcnkuCi0JLi9wbmd0ZXN0Ci0KLWluc3RhbGwtaGVhZGVyczogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCS1AaWYgWyAhIC1kICQoREkpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKTsgZmkKLQktQGlmIFsgISAtZCAkKERJKS8kKExJQk5BTUUpIF07IHRoZW4gJChNS0RJUl9QKSAkKERJKS8kKExJQk5BTUUpOyBmaQotCWNwIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggJChESSkvJChMSUJOQU1FKQotCWNobW9kIDY0NCAkKERJKS8kKExJQk5BTUUpL3BuZy5oICQoREkpLyQoTElCTkFNRSkvcG5nY29uZi5oICQoREkpLyQoTElCTkFNRSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL3BuZy5oICQoREkpL3BuZ2NvbmYuaCAkKERJKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvbGlicG5nCi0JKGNkICQoREkpOyAkKExOX1NGKSAkKExJQk5BTUUpIGxpYnBuZzsgJChMTl9TRikgJChMSUJOQU1FKS8qIC4pCi0KLWluc3RhbGwtc3RhdGljOiBpbnN0YWxsLWhlYWRlcnMgbGlicG5nLmEKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JY3AgbGlicG5nLmEgJChETCkvJChMSUJOQU1FKS5hCi0JY2htb2QgNjQ0ICQoREwpLyQoTElCTkFNRSkuYQotCS1AJChSTV9GKSAkKERMKS9saWJwbmcuYQotCShjZCAkKERMKTsgJChMTl9TRikgJChMSUJOQU1FKS5hIGxpYnBuZy5hKQotCi1pbnN0YWxsLXNoYXJlZDogaW5zdGFsbC1oZWFkZXJzICQoTElCU09NQUopIGxpYnBuZy5wYwotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQktQCQoUk1fRikgJChETCkvJChMSUJTTykKLQktQCQoUk1fRikgJChETCkvJChMSUJTT1JFTCkKLQktQCQoUk1fRikgJChETCkvJChPTERTTykKLQljcCAkKExJQlNPTUFKKSAkKERMKS8kKExJQlNPUkVMKQotCWNobW9kIDc1NSAkKERMKS8kKExJQlNPUkVMKQotCShjZCAkKERMKTsgXAotCSQoTE5fU0YpICQoTElCU09SRUwpICQoTElCU08pOyBcCi0JJChMTl9TRikgJChMSUJTTykgJChPTERTTykpCi0JLUBpZiBbICEgLWQgJChETCkvcGtnY29uZmlnIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKS9wa2djb25maWc7IGZpCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JLUAkKFJNX0YpICQoREwpL3BrZ2NvbmZpZy9saWJwbmcucGMKLQljcCBsaWJwbmcucGMgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQljaG1vZCA2NDQgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQkoY2QgJChETCkvcGtnY29uZmlnOyAkKExOX1NGKSAkKExJQk5BTUUpLnBjIGxpYnBuZy5wYykKLQotaW5zdGFsbC1tYW46IGxpYnBuZy4zIGxpYnBuZ3BmLjMgcG5nLjUKLQktQGlmIFsgISAtZCAkKERNKSBdOyB0aGVuICQoTUtESVJfUCkgJChETSk7IGZpCi0JLUBpZiBbICEgLWQgJChETSkvbWFuMyBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuMzsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmcuMwotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZ3BmLjMKLQljcCBsaWJwbmcuMyAkKERNKS9tYW4zCi0JY3AgbGlicG5ncGYuMyAkKERNKS9tYW4zCi0JLUBpZiBbICEgLWQgJChETSkvbWFuNSBdOyB0aGVuICQoTUtESVJfUCkgJChETSkvbWFuNTsgZmkKLQktQCQoUk1fRikgJChETSkvbWFuNS9wbmcuNQotCWNwIHBuZy41ICQoRE0pL21hbjUKLQotaW5zdGFsbC1jb25maWc6IGxpYnBuZy1jb25maWcKLQktQGlmIFsgISAtZCAkKERCKSBdOyB0aGVuICQoTUtESVJfUCkgJChEQik7IGZpCi0JLUAkKFJNX0YpICQoREIpL2xpYnBuZy1jb25maWcKLQktQCQoUk1fRikgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljcCBsaWJwbmctY29uZmlnICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY2htb2QgNzU1ICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JKGNkICQoREIpOyAkKExOX1NGKSAkKExJQk5BTUUpLWNvbmZpZyBsaWJwbmctY29uZmlnKQotCi1pbnN0YWxsOiBpbnN0YWxsLXN0YXRpYyBpbnN0YWxsLXNoYXJlZCBpbnN0YWxsLW1hbiBpbnN0YWxsLWNvbmZpZwotCi0jIElmIHlvdSBpbnN0YWxsZWQgaW4gJChERVNURElSKSwgdGVzdC1pbnN0YWxsZWQgd29uJ3Qgd29yayB1bnRpbCB5b3UKLSMgbW92ZSB0aGUgbGlicmFyeSB0byBpdHMgZmluYWwgbG9jYXRpb24uICBVc2UgdGVzdC1kZCB0byB0ZXN0IGl0Ci0jIGJlZm9yZSB0aGVuLgotCi10ZXN0LWRkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkgaW4gJChETCkuCi0JJChDQykgLUkkKERJKSAkKENQUEZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLUwkKERMKSAtTCQoWkxJQkxJQikgXAotCSAgIC1ycGF0aCAkKFpMSUJMSUIpOiQoREwpIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgotCSQoQ0MpICQoQ1BQRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtTCQoWkxJQkxJQikgXAotCSAgIC1ycGF0aCAkKFpMSUJMSUIpOmAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGliZGlyYCBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYAotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIGxpYnBuZy5wYyBsaWJwbmctY29uZmlnIFwKLQkkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCXNvX2xvY2F0aW9ucyBwbmdsaWJjb25mLmgKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLnNvOSBiL3NjcmlwdHMvbWFrZWZpbGUuc285CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTkzMDhjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuc285CisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZyBvbiBTb2xhcmlzIDkgKGJldGEpIHdpdGggRm9ydGUgY2MKLSMgVXBkYXRlZCBieSBDaGFkIFNjaHJvY2sgZm9yIFNvbGFyaXMgOQotIyBDb250cmlidXRlZCBieSBXaWxsaWFtIEwuIFNlYm9rLCBiYXNlZCBvbiBtYWtlZmlsZS5saW51eAotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMDgsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgR3JlZyBSb2Vsb2ZzCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1QTkdNQUogPSAxNgotTElCTkFNRSA9IGxpYnBuZzE2Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotIyBnY2MgMi45NSBkb2Vzbid0IHdvcmsuCi1DQz1jYwotQVJfUkM9YXIgcmMKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9ZWNobwotQ1A9Y3AKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIFdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCAkKE9MRFNPKSosIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgQ2hhbmdpbmcgdGhlc2UgdG8gLi4vemxpYiBwb3NlcyBhIHNlY3VyaXR5IHJpc2suICBJZiB5b3Ugd2FudAotIyB0byBoYXZlIHpsaWIgaW4gYW4gYWRqYWNlbnQgZGlyZWN0b3J5LCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGggaW5zdGVhZCBvZiAiLi4iLgotI1pMSUJMSUI9Li4vemxpYgotI1pMSUJJTkM9Li4vemxpYgotI1pMSUJMSUI9L3Vzci9sb2NhbC9saWIKLSNaTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotI1VzZSB0aGUgcHJlaW5zdGFsbGVkIHpsaWIgdGhhdCBjb21lcyB3aXRoIFNvbGFyaXMgOToKLVpMSUJMSUI9L3Vzci9saWIKLVpMSUJJTkM9L3Vzci9pbmNsdWRlCi0KLSNXQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KLUNQUEZMQUdTPS1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKLSNDRkxBR1M9LVcgLVdhbGwgLU8zICQoV0FSTk1PUkUpIC1nCi1DRkxBR1M9LU8zCi1MREZMQUdTPS1MLiAtUi4gLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtS1BJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAotCWVjaG87IFwKLQllY2hvICcjIyBXQVJOSU5HOic7IFwKLQllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKLQllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAotCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAotCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCi0JZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCi0JZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCi0JZWNobzsgXAotCTs7IFwKLQllc2FjCi0JJChMRCkgLUcgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAgLVIkKFpMSUJMSUIpIC1SJChETCkKLQkuL3BuZ3Rlc3RkIHBuZ3Rlc3QucG5nCi0KLXRlc3QtaW5zdGFsbGVkOgotCWVjaG8KLQllY2hvIFRlc3RpbmcgaW5zdGFsbGVkIGR5bmFtaWMgc2hhcmVkIGxpYnJhcnkuCi0JJChDQykgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RpIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikKLQkuL3BuZ3Rlc3RpIHBuZ3Rlc3QucG5nCi0KLWNsZWFuOgotCSQoUk1fRikgKi5vIGxpYnBuZy5hIHBuZ3Rlc3QgcG5ndGVzdGkgcG5nb3V0LnBuZyBcCi0JbGlicG5nLWNvbmZpZyAkKExJQlNPKSAkKExJQlNPTUFKKSogXAotCWxpYnBuZy5wYyBwbmdsaWJjb25mLmgKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubyBwbmcucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vIHBuZ2Vycm9yLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm8gcG5ncmlvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd2lvLm8gcG5nd2lvLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm8gcG5nbWVtLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm8gcG5nc2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZ2V0Lm8gcG5nZ2V0LnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vIHBuZ3JlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydHJhbi5vIHBuZ3J0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnV0aWwubyBwbmdydXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3RyYW5zLm8gcG5ndHJhbnMucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3cml0ZS5vIHBuZ3dyaXRlLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3RyYW4ubyBwbmd3dHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d1dGlsLm8gcG5nd3V0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdwcmVhZC5vIHBuZ3ByZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCi1wbmd0ZXN0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcyBiL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0NTBkMy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2VmaWxlLnNvbGFyaXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotIyBtYWtlZmlsZSBmb3IgbGlicG5nIG9uIFNvbGFyaXMgMi54IHdpdGggZ2NjCi0jIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNi0yMDA4LCAyMDEwLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvbnRyaWJ1dGVkIGJ5IFdpbGxpYW0gTC4gU2Vib2ssIGJhc2VkIG9uIG1ha2VmaWxlLmxpbnV4Ci0jIENvcHlyaWdodCAoQykgMTk5OCBHcmVnIFJvZWxvZnMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBMaWJyYXJ5IG5hbWU6Ci1MSUJOQU1FID0gbGlicG5nMTYKLVBOR01BSiA9IDE2Ci0KLSMgU2hhcmVkIGxpYnJhcnkgbmFtZXM6Ci1MSUJTTz0kKExJQk5BTUUpLnNvCi1MSUJTT01BSj0kKExJQk5BTUUpLnNvLiQoUE5HTUFKKQotTElCU09SRUw9JChMSUJTT01BSikuJChSRUxFQVNFKQotT0xEU089bGlicG5nLnNvCi0KLSMgVXRpbGl0aWVzOgotQVJfUkM9YXIgcmMKLUNDPWdjYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1lY2hvCi1DUD1jcAotUk1fRj0vYmluL3JtIC1mCi0KLSMgV2hlcmUgbWFrZSBpbnN0YWxsIHB1dHMgbGlicG5nLmEsIGxpYnBuZzE2LnNvKiwgYW5kIHBuZy5oCi1wcmVmaXg9L3Vzci9sb2NhbAotZXhlY19wcmVmaXg9JChwcmVmaXgpCi0KLSMgV2hlcmUgdGhlIHpsaWIgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBhcmUgbG9jYXRlZAotIyBDaGFuZ2luZyB0aGVzZSB0byAuLi96bGliIHBvc2VzIGEgc2VjdXJpdHkgcmlzay4gIElmIHlvdSB3YW50Ci0jIHRvIGhhdmUgemxpYiBpbiBhbiBhZGphY2VudCBkaXJlY3RvcnksIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkIG9mICIuLiIuCi0jWkxJQkxJQj0uLi96bGliCi0jWkxJQklOQz0uLi96bGliCi0KLVpMSUJMSUI9L3Vzci9sb2NhbC9saWIKLVpMSUJJTkM9L3Vzci9sb2NhbC9pbmNsdWRlCi0KLVdBUk5NT1JFPS1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdzaGFkb3cgXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgIy1XY29udmVyc2lvbgotQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQotQ0ZMQUdTPSAtVyAtV2FsbCAtTyBcCi0JIyAkKFdBUk5NT1JFKSAtZyAtRFBOR19ERUJVRz01Ci1MREZMQUdTPS1MLiAtUi4gLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtZlBJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBjcHBmbGFncz1cIlwiOyBcCi0JZWNobyBMX29wdHM9XCItTCQoTElCUEFUSClcIjsgXAotCWVjaG8gUl9vcHRzPVwiLVIkKExJQlBBVEgpXCI7IFwKLQllY2hvIGxpYnM9XCItbHBuZzE2IC1seiAtbG1cIjsgXAotCWNhdCBzY3JpcHRzL2xpYnBuZy1jb25maWctYm9keS5pbiApID4gbGlicG5nLWNvbmZpZwotCWNobW9kICt4IGxpYnBuZy1jb25maWcKLQotJChMSUJTTyk6ICQoTElCU09NQUopCi0JJChMTl9TRikgJChMSUJTT01BSikgJChMSUJTTykKLQotJChMSUJTT01BSik6ICQoT0JKU0RMTCkKLQlAY2FzZSAiYHR5cGUgbGRgIiBpbiAqdWNiKikgXAotCWVjaG87IFwKLQllY2hvICcjIyBXQVJOSU5HOic7IFwKLQllY2hvICcjIyBUaGUgY29tbWFuZHMgIkNDIiBhbmQgIkxEIiBtdXN0IE5PVCByZWZlciB0byAvdXNyL3VjYi9jYyc7IFwKLQllY2hvICcjIyBhbmQgL3Vzci91Y2IvbGQuICBJZiB0aGV5IGRvLCB5b3UgbmVlZCB0byBhZGp1c3QgeW91ciBQQVRIJzsgXAotCWVjaG8gJyMjIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHB1dCAvdXNyL2Njcy9iaW4gYWhlYWQgb2YgL3Vzci91Y2IuJzsgXAotCWVjaG8gJyMjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9MSUJSQVJZX1BBVEggc2hvdWxkIG5vdCBiZSBzZXQnOyBcCi0JZWNobyAnIyMgYXQgYWxsLiAgSWYgaXQgaXMsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGJyZWFrIGJlY2F1c2Ugb2YnOyBcCi0JZWNobyAnIyMgdGhlIGxpYnVjYiBkZXBlbmRlbmN5IHRoYXQgaXMgY3JlYXRlZC4nOyBcCi0JZWNobzsgXAotCTs7IFwKLQllc2FjCi0JJChMRCkgLUcgLWggJChMSUJTT01BSikgXAotCSAtbyAkKExJQlNPTUFKKSAkKE9CSlNETEwpCi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyAkKExJQlNPKQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbC1oZWFkZXJzOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0JLUBpZiBbICEgLWQgJChESSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpOyBmaQotCS1AaWYgWyAhIC1kICQoREkpLyQoTElCTkFNRSkgXTsgdGhlbiAkKE1LRElSX1ApICQoREkpLyQoTElCTkFNRSk7IGZpCi0JY3AgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCAkKERJKS8kKExJQk5BTUUpCi0JY2htb2QgNjQ0ICQoREkpLyQoTElCTkFNRSkvcG5nLmggJChESSkvJChMSUJOQU1FKS9wbmdjb25mLmggJChESSkvJChMSUJOQU1FKS9wbmdsaWJjb25mLmgKLQktQCQoUk1fRikgJChESSkvcG5nLmggJChESSkvcG5nY29uZi5oICQoREkpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9saWJwbmcKLQkoY2QgJChESSk7ICQoTE5fU0YpICQoTElCTkFNRSkgbGlicG5nOyAkKExOX1NGKSAkKExJQk5BTUUpLyogLikKLQotaW5zdGFsbC1zdGF0aWM6IGluc3RhbGwtaGVhZGVycyBsaWJwbmcuYQotCS1AaWYgWyAhIC1kICQoREwpIF07IHRoZW4gJChNS0RJUl9QKSAkKERMKTsgZmkKLQljcCBsaWJwbmcuYSAkKERMKS8kKExJQk5BTUUpLmEKLQljaG1vZCA2NDQgJChETCkvJChMSUJOQU1FKS5hCi0JLUAkKFJNX0YpICQoREwpL2xpYnBuZy5hCi0JKGNkICQoREwpOyAkKExOX1NGKSAkKExJQk5BTUUpLmEgbGlicG5nLmEpCi0KLWluc3RhbGwtc2hhcmVkOiBpbnN0YWxsLWhlYWRlcnMgJChMSUJTT01BSikgbGlicG5nLnBjCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPKQotCS1AJChSTV9GKSAkKERMKS8kKExJQlNPUkVMKQotCS1AJChSTV9GKSAkKERMKS8kKE9MRFNPKQotCWNwICQoTElCU09NQUopICQoREwpLyQoTElCU09SRUwpCi0JY2htb2QgNzU1ICQoREwpLyQoTElCU09SRUwpCi0JKGNkICQoREwpOyBcCi0JJChMTl9TRikgJChMSUJTT1JFTCkgJChMSUJTTyk7IFwKLQkkKExOX1NGKSAkKExJQlNPKSAkKE9MRFNPKSkKLQktQGlmIFsgISAtZCAkKERMKS9wa2djb25maWcgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpL3BrZ2NvbmZpZzsgZmkKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnLyQoTElCTkFNRSkucGMKLQktQCQoUk1fRikgJChETCkvcGtnY29uZmlnL2xpYnBuZy5wYwotCWNwIGxpYnBuZy5wYyAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCWNobW9kIDY0NCAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCShjZCAkKERMKS9wa2djb25maWc7ICQoTE5fU0YpICQoTElCTkFNRSkucGMgbGlicG5nLnBjKQotCi1pbnN0YWxsLW1hbjogbGlicG5nLjMgbGlicG5ncGYuMyBwbmcuNQotCS1AaWYgWyAhIC1kICQoRE0pIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKTsgZmkKLQktQGlmIFsgISAtZCAkKERNKS9tYW4zIF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW4zOyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW4zL2xpYnBuZy4zCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5ncGYuMwotCWNwIGxpYnBuZy4zICQoRE0pL21hbjMKLQljcCBsaWJwbmdwZi4zICQoRE0pL21hbjMKLQktQGlmIFsgISAtZCAkKERNKS9tYW41IF07IHRoZW4gJChNS0RJUl9QKSAkKERNKS9tYW41OyBmaQotCS1AJChSTV9GKSAkKERNKS9tYW41L3BuZy41Ci0JY3AgcG5nLjUgJChETSkvbWFuNQotCi1pbnN0YWxsLWNvbmZpZzogbGlicG5nLWNvbmZpZwotCS1AaWYgWyAhIC1kICQoREIpIF07IHRoZW4gJChNS0RJUl9QKSAkKERCKTsgZmkKLQktQCQoUk1fRikgJChEQikvbGlicG5nLWNvbmZpZwotCS1AJChSTV9GKSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNwIGxpYnBuZy1jb25maWcgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQljaG1vZCA3NTUgJChEQikvJChMSUJOQU1FKS1jb25maWcKLQkoY2QgJChEQik7ICQoTE5fU0YpICQoTElCTkFNRSktY29uZmlnIGxpYnBuZy1jb25maWcpCi0KLWluc3RhbGw6IGluc3RhbGwtc3RhdGljIGluc3RhbGwtc2hhcmVkIGluc3RhbGwtbWFuIGluc3RhbGwtY29uZmlnCi0KLSMgSWYgeW91IGluc3RhbGxlZCBpbiAkKERFU1RESVIpLCB0ZXN0LWluc3RhbGxlZCB3b24ndCB3b3JrIHVudGlsIHlvdQotIyBtb3ZlIHRoZSBsaWJyYXJ5IHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIFVzZSB0ZXN0LWRkIHRvIHRlc3QgaXQKLSMgYmVmb3JlIHRoZW4uCi0KLXRlc3QtZGQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeSBpbiAkKERMKS4KLQkkKENDKSAtSSQoREkpICQoQ1BQRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0ZCBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAtTCQoREwpIC1MJChaTElCTElCKSAtUiQoWkxJQkxJQikgLVIkKERMKQotCS4vcG5ndGVzdGQgcG5ndGVzdC5wbmcKLQotdGVzdC1pbnN0YWxsZWQ6Ci0JZWNobwotCWVjaG8gVGVzdGluZyBpbnN0YWxsZWQgZHluYW1pYyBzaGFyZWQgbGlicmFyeS4KLQkkKENDKSAkKENQUEZMQUdTKSBcCi0JICAgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1jZmxhZ3NgIHBuZ3Rlc3QuYyBcCi0JICAgLW8gcG5ndGVzdGkgYCQoQklOUEFUSCkvJChMSUJOQU1FKS1jb25maWcgLS1sZGZsYWdzYCBcCi0JICAgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKQotCS4vcG5ndGVzdGkgcG5ndGVzdC5wbmcKLQotY2xlYW46Ci0JJChSTV9GKSAqLm8gbGlicG5nLmEgcG5ndGVzdCBwbmd0ZXN0aSBwbmdvdXQucG5nIFwKLQlsaWJwbmctY29uZmlnICQoTElCU08pICQoTElCU09NQUopKiBcCi0JbGlicG5nLnBjIHBuZ2xpYmNvbmYuaAotCi1ET0NTID0gQU5OT1VOQ0UgQ0hBTkdFUyBJTlNUQUxMIEtOT1dOQlVHIExJQ0VOU0UgUkVBRE1FIFRPRE8gWTJLSU5GTwotd3JpdGVsb2NrOgotCWNobW9kIGEtdyAqLltjaDM1XSAkKERPQ1MpIHNjcmlwdHMvKgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCi0KLXBuZy5vIHBuZy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm8gcG5nZXJyb3IucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyaW8ubyBwbmdyaW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubyBwbmd3aW8ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdtZW0ubyBwbmdtZW0ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdzZXQubyBwbmdzZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubyBwbmdnZXQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyZWFkLm8gcG5ncmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J0cmFuLm8gcG5ncnRyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vIHBuZ3J1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ndHJhbnMubyBwbmd0cmFucy5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm8gcG5nd3JpdGUucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vIHBuZ3d0cmFuLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubyBwbmd3dXRpbC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm8gcG5ncHJlYWQucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzLXg4NiBiL3NjcmlwdHMvbWFrZWZpbGUuc29sYXJpcy14ODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDI0MzcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS5zb2xhcmlzLXg4NgorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0jIG1ha2VmaWxlIGZvciBsaWJwbmcgb24gU29sYXJpcyAyLnggd2l0aCBnY2MKLSMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2LTIwMDgsIDIwMTAtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgQ29udHJpYnV0ZWQgYnkgV2lsbGlhbSBMLiBTZWJvaywgYmFzZWQgb24gbWFrZWZpbGUubGludXgKLSMgQ29weXJpZ2h0IChDKSAxOTk4IEdyZWcgUm9lbG9mcwotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKLQotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLSMgTGlicmFyeSBuYW1lOgotTElCTkFNRSA9IGxpYnBuZzE2Ci1QTkdNQUogPSAxNgotCi0jIFNoYXJlZCBsaWJyYXJ5IG5hbWVzOgotTElCU089JChMSUJOQU1FKS5zbwotTElCU09NQUo9JChMSUJOQU1FKS5zby4kKFBOR01BSikKLUxJQlNPUkVMPSQoTElCU09NQUopLiQoUkVMRUFTRSkKLU9MRFNPPWxpYnBuZy5zbwotCi0jIFV0aWxpdGllczoKLUFSX1JDPWFyIHJjCi1DQz1nY2MKLU1LRElSX1A9bWtkaXIgLXAKLUxOX1NGPWxuIC1mIC1zCi1SQU5MSUI9ZWNobwotQ1A9Y3AKLVJNX0Y9L2Jpbi9ybSAtZgotCi0jIFdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hLCBsaWJwbmcxNi5zbyosIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLWV4ZWNfcHJlZml4PSQocHJlZml4KQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgQ2hhbmdpbmcgdGhlc2UgdG8gLi4vemxpYiBwb3NlcyBhIHNlY3VyaXR5IHJpc2suICBJZiB5b3Ugd2FudAotIyB0byBoYXZlIHpsaWIgaW4gYW4gYWRqYWNlbnQgZGlyZWN0b3J5LCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGggaW5zdGVhZCBvZiAiLi4iLgotI1pMSUJMSUI9Li4vemxpYgotI1pMSUJJTkM9Li4vemxpYgotCi1aTElCTElCPS91c3IvbG9jYWwvbGliCi1aTElCSU5DPS91c3IvbG9jYWwvaW5jbHVkZQotCi1XQVJOTU9SRT0tV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1Xc2hhZG93IFwKLQktV21pc3NpbmctZGVjbGFyYXRpb25zIC1XdHJhZGl0aW9uYWwgLVdjYXN0LWFsaWduIFwKLQktV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzICMtV2NvbnZlcnNpb24KLUNQUEZMQUdTPS1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKLUNGTEFHUz0tVyAtV2FsbCAtTyAjICQoV0FSTk1PUkUpIC1nCi1MREZMQUdTPS1MLiAtUi4gLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtbHBuZzE2IC1seiAtbG0KLQotSU5DUEFUSD0kKHByZWZpeCkvaW5jbHVkZQotTElCUEFUSD0kKGV4ZWNfcHJlZml4KS9saWIKLU1BTlBBVEg9JChwcmVmaXgpL21hbgotQklOUEFUSD0kKGV4ZWNfcHJlZml4KS9iaW4KLQotIyBvdmVycmlkZSBERVNURElSPSBvbiB0aGUgbWFrZSBpbnN0YWxsIGNvbW1hbmQgbGluZSB0byBlYXNpbHkgc3VwcG9ydAotIyBpbnN0YWxsaW5nIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24uICBFeGFtcGxlOgotIwotIyAgICBtYWtlIGluc3RhbGwgREVTVERJUj0vdG1wL2J1aWxkL2xpYnBuZwotIwotIyBJZiB5b3UncmUgZ29pbmcgdG8gaW5zdGFsbCBpbnRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uCi0jIHZpYSBERVNURElSLCAkKERFU1RESVIpJChwcmVmaXgpIG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUKLSMgeW91IGV4ZWN1dGUgbWFrZSBpbnN0YWxsLgotREVTVERJUj0KLQotREI9JChERVNURElSKSQoQklOUEFUSCkKLURJPSQoREVTVERJUikkKElOQ1BBVEgpCi1ETD0kKERFU1RESVIpJChMSUJQQVRIKQotRE09JChERVNURElSKSQoTUFOUEFUSCkKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLU9CSlNETEwgPSAkKE9CSlM6Lm89LnBpYy5vKQotCi0uU1VGRklYRVM6ICAgICAgLmMgLm8gLnBpYy5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLS5jLnBpYy5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAtZlBJQyAtbyAkQCAkKi5jCi0KLWFsbDogbGlicG5nLmEgJChMSUJTTykgcG5ndGVzdCBsaWJwbmcucGMgbGlicG5nLWNvbmZpZwotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICQoT0JKUykKLQkkKFJBTkxJQikgJEAKLQotbGlicG5nLnBjOgotCWNhdCBzY3JpcHRzL2xpYnBuZy5wYy5pbiB8IHNlZCAtZSBzIUBwcmVmaXhAISQocHJlZml4KSEgXAotCS1lIHMhQGV4ZWNfcHJlZml4QCEkKGV4ZWNfcHJlZml4KSEgXAotCS1lIHMhQGxpYmRpckAhJChMSUJQQVRIKSEgXAotCS1lIHMhQGluY2x1ZGVkaXJAISQoSU5DUEFUSCkhIFwKLQktZSBzIS1scG5nMTYhLWxwbmcxNlwgLWx6XCAtbG0hID4gbGlicG5nLnBjCi0KLWxpYnBuZy1jb25maWc6Ci0JKCBjYXQgc2NyaXB0cy9saWJwbmctY29uZmlnLWhlYWQuaW47IFwKLQllY2hvIHByZWZpeD1cIiQocHJlZml4KVwiOyBcCi0JZWNobyBJX29wdHM9XCItSSQoSU5DUEFUSCkvJChMSUJOQU1FKVwiOyBcCi0JZWNobyBjcHBmbGFncz1cIiI7IFwKLQllY2hvIExfb3B0cz1cIi1MJChMSUJQQVRIKVwiOyBcCi0JZWNobyBSX29wdHM9XCItUiQoTElCUEFUSClcIjsgXAotCWVjaG8gbGlicz1cIi1scG5nMTYgLWx6IC1sbVwiOyBcCi0JY2F0IHNjcmlwdHMvbGlicG5nLWNvbmZpZy1ib2R5LmluICkgPiBsaWJwbmctY29uZmlnCi0JY2htb2QgK3ggbGlicG5nLWNvbmZpZwotCi0kKExJQlNPKTogJChMSUJTT01BSikKLQkkKExOX1NGKSAkKExJQlNPTUFKKSAkKExJQlNPKQotCi0kKExJQlNPTUFKKTogJChPQkpTRExMKQotCUBjYXNlICJgdHlwZSBsZGAiIGluICp1Y2IqKSBcCi0JZWNobzsgXAotCWVjaG8gJyMjIFdBUk5JTkc6JzsgXAotCWVjaG8gJyMjIFRoZSBjb21tYW5kcyAiQ0MiIGFuZCAiTEQiIG11c3QgTk9UIHJlZmVyIHRvIC91c3IvdWNiL2NjJzsgXAotCWVjaG8gJyMjIGFuZCAvdXNyL3VjYi9sZC4gIElmIHRoZXkgZG8sIHlvdSBuZWVkIHRvIGFkanVzdCB5b3VyIFBBVEgnOyBcCi0JZWNobyAnIyMgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcHV0IC91c3IvY2NzL2JpbiBhaGVhZCBvZiAvdXNyL3VjYi4nOyBcCi0JZWNobyAnIyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExEX0xJQlJBUllfUEFUSCBzaG91bGQgbm90IGJlIHNldCc7IFwKLQllY2hvICcjIyBhdCBhbGwuICBJZiBpdCBpcywgdGhpbmdzIGFyZSBsaWtlbHkgdG8gYnJlYWsgYmVjYXVzZSBvZic7IFwKLQllY2hvICcjIyB0aGUgbGlidWNiIGRlcGVuZGVuY3kgdGhhdCBpcyBjcmVhdGVkLic7IFwKLQllY2hvOyBcCi0JOzsgXAotCWVzYWMKLQkkKExEKSAtRyAtaCAkKExJQlNPTUFKKSBcCi0JIC1vICQoTElCU09NQUopICQoT0JKU0RMTCkKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCU08pCi0JJChDQykgLW8gcG5ndGVzdCAkKENGTEFHUykgcG5ndGVzdC5vICQoTERGTEFHUykKLQotdGVzdDogcG5ndGVzdAotCS4vcG5ndGVzdAotCi1pbnN0YWxsLWhlYWRlcnM6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLQktQGlmIFsgISAtZCAkKERJKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSk7IGZpCi0JLUBpZiBbICEgLWQgJChESSkvJChMSUJOQU1FKSBdOyB0aGVuICQoTUtESVJfUCkgJChESSkvJChMSUJOQU1FKTsgZmkKLQljcCBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oICQoREkpLyQoTElCTkFNRSkKLQljaG1vZCA2NDQgJChESSkvJChMSUJOQU1FKS9wbmcuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2NvbmYuaCAkKERJKS8kKExJQk5BTUUpL3BuZ2xpYmNvbmYuaAotCS1AJChSTV9GKSAkKERJKS9wbmcuaCAkKERJKS9wbmdjb25mLmggJChESSkvcG5nbGliY29uZi5oCi0JLUAkKFJNX0YpICQoREkpL2xpYnBuZwotCShjZCAkKERJKTsgJChMTl9TRikgJChMSUJOQU1FKSBsaWJwbmc7ICQoTE5fU0YpICQoTElCTkFNRSkvKiAuKQotCi1pbnN0YWxsLXN0YXRpYzogaW5zdGFsbC1oZWFkZXJzIGxpYnBuZy5hCi0JLUBpZiBbICEgLWQgJChETCkgXTsgdGhlbiAkKE1LRElSX1ApICQoREwpOyBmaQotCWNwIGxpYnBuZy5hICQoREwpLyQoTElCTkFNRSkuYQotCWNobW9kIDY0NCAkKERMKS8kKExJQk5BTUUpLmEKLQktQCQoUk1fRikgJChETCkvbGlicG5nLmEKLQkoY2QgJChETCk7ICQoTE5fU0YpICQoTElCTkFNRSkuYSBsaWJwbmcuYSkKLQotaW5zdGFsbC1zaGFyZWQ6IGluc3RhbGwtaGVhZGVycyAkKExJQlNPTUFKKSBsaWJwbmcucGMKLQktQGlmIFsgISAtZCAkKERMKSBdOyB0aGVuICQoTUtESVJfUCkgJChETCk7IGZpCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU08pCi0JLUAkKFJNX0YpICQoREwpLyQoTElCU09SRUwpCi0JLUAkKFJNX0YpICQoREwpLyQoT0xEU08pCi0JY3AgJChMSUJTT01BSikgJChETCkvJChMSUJTT1JFTCkKLQljaG1vZCA3NTUgJChETCkvJChMSUJTT1JFTCkKLQkoY2QgJChETCk7IFwKLQkkKExOX1NGKSAkKExJQlNPUkVMKSAkKExJQlNPKTsgXAotCSQoTE5fU0YpICQoTElCU08pICQoT0xEU08pKQotCS1AaWYgWyAhIC1kICQoREwpL3BrZ2NvbmZpZyBdOyB0aGVuICQoTUtESVJfUCkgJChETCkvcGtnY29uZmlnOyBmaQotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvJChMSUJOQU1FKS5wYwotCS1AJChSTV9GKSAkKERMKS9wa2djb25maWcvbGlicG5nLnBjCi0JY3AgbGlicG5nLnBjICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JY2htb2QgNjQ0ICQoREwpL3BrZ2NvbmZpZy8kKExJQk5BTUUpLnBjCi0JKGNkICQoREwpL3BrZ2NvbmZpZzsgJChMTl9TRikgJChMSUJOQU1FKS5wYyBsaWJwbmcucGMpCi0KLWluc3RhbGwtbWFuOiBsaWJwbmcuMyBsaWJwbmdwZi4zIHBuZy41Ci0JLUBpZiBbICEgLWQgJChETSkgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pOyBmaQotCS1AaWYgWyAhIC1kICQoRE0pL21hbjMgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjM7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjMvbGlicG5nLjMKLQktQCQoUk1fRikgJChETSkvbWFuMy9saWJwbmdwZi4zCi0JY3AgbGlicG5nLjMgJChETSkvbWFuMwotCWNwIGxpYnBuZ3BmLjMgJChETSkvbWFuMwotCS1AaWYgWyAhIC1kICQoRE0pL21hbjUgXTsgdGhlbiAkKE1LRElSX1ApICQoRE0pL21hbjU7IGZpCi0JLUAkKFJNX0YpICQoRE0pL21hbjUvcG5nLjUKLQljcCBwbmcuNSAkKERNKS9tYW41Ci0KLWluc3RhbGwtY29uZmlnOiBsaWJwbmctY29uZmlnCi0JLUBpZiBbICEgLWQgJChEQikgXTsgdGhlbiAkKE1LRElSX1ApICQoREIpOyBmaQotCS1AJChSTV9GKSAkKERCKS9saWJwbmctY29uZmlnCi0JLUAkKFJNX0YpICQoREIpLyQoTElCTkFNRSktY29uZmlnCi0JY3AgbGlicG5nLWNvbmZpZyAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCWNobW9kIDc1NSAkKERCKS8kKExJQk5BTUUpLWNvbmZpZwotCShjZCAkKERCKTsgJChMTl9TRikgJChMSUJOQU1FKS1jb25maWcgbGlicG5nLWNvbmZpZykKLQotaW5zdGFsbDogaW5zdGFsbC1zdGF0aWMgaW5zdGFsbC1zaGFyZWQgaW5zdGFsbC1tYW4gaW5zdGFsbC1jb25maWcKLQotIyBJZiB5b3UgaW5zdGFsbGVkIGluICQoREVTVERJUiksIHRlc3QtaW5zdGFsbGVkIHdvbid0IHdvcmsgdW50aWwgeW91Ci0jIG1vdmUgdGhlIGxpYnJhcnkgdG8gaXRzIGZpbmFsIGxvY2F0aW9uLiAgVXNlIHRlc3QtZGQgdG8gdGVzdCBpdAotIyBiZWZvcmUgdGhlbi4KLQotdGVzdC1kZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5IGluICQoREwpLgotCSQoQ0MpIC1JJChESSkgJChDUFBGTEFHUykgXAotCSAgIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tY2ZsYWdzYCBwbmd0ZXN0LmMgXAotCSAgIC1vIHBuZ3Rlc3RkIGAkKEJJTlBBVEgpLyQoTElCTkFNRSktY29uZmlnIC0tbGRmbGFnc2AgXAotCSAgIC1MJChETCkgLUwkKFpMSUJMSUIpIC1SJChaTElCTElCKSAtUiQoREwpCi0JLi9wbmd0ZXN0ZCBwbmd0ZXN0LnBuZwotCi10ZXN0LWluc3RhbGxlZDoKLQllY2hvCi0JZWNobyBUZXN0aW5nIGluc3RhbGxlZCBkeW5hbWljIHNoYXJlZCBsaWJyYXJ5LgotCSQoQ0MpICQoQ1BQRkxBR1MpIFwKLQkgICBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWNmbGFnc2AgcG5ndGVzdC5jIFwKLQkgICAtbyBwbmd0ZXN0aSBgJChCSU5QQVRIKS8kKExJQk5BTUUpLWNvbmZpZyAtLWxkZmxhZ3NgIFwKLQkgICAtTCQoWkxJQkxJQikgLVIkKFpMSUJMSUIpCi0JLi9wbmd0ZXN0aSBwbmd0ZXN0LnBuZwotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ3Rlc3RpIHBuZ291dC5wbmcgXAotCWxpYnBuZy1jb25maWcgJChMSUJTTykgJChMSUJTT01BSikqIFwKLQlsaWJwbmcucGMgcG5nbGliY29uZi5oCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm8gcG5nLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nZXJyb3IubyBwbmdlcnJvci5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3Jpby5vIHBuZ3Jpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dpby5vIHBuZ3dpby5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vIHBuZ21lbS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3NldC5vIHBuZ3NldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2dldC5vIHBuZ2dldC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQubyBwbmdyZWFkLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnRyYW4ubyBwbmdydHJhbi5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm8gcG5ncnV0aWwucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vIHBuZ3RyYW5zLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubyBwbmd3cml0ZS5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm8gcG5nd3RyYW4ucGljLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vIHBuZ3d1dGlsLnBpYy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncHJlYWQubyBwbmdwcmVhZC5waWMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLnN0ZCBiL3NjcmlwdHMvbWFrZWZpbGUuc3RkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTZhODY4Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvbWFrZWZpbGUuc3RkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLUNDID0gY2MKLUFSX1JDID0gYXIgcmMKLU1LRElSX1AgPSBta2RpcgotTE5fU0YgPSBsbiAtc2YKLVJBTkxJQiA9IHJhbmxpYgotQ1AgPSBjcAotUk1fRiA9IHJtIC1mCi1BV0sgPSBhd2sKLVNFRCA9IHNlZAotQ1BQID0gJChDQykgLUUKLUVDSE8gPSBlY2hvCi0KLURGTkZMQUdTID0gIyBERk5GTEFHUyBjb250YWlucyAtRCBvcHRpb25zIHRvIHVzZSBpbiB0aGUgbGlicG5nIGJ1aWxkCi1ERkFfRVhUUkEgPSAjIGV4dHJhIGZpbGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBjb25maWd1cmF0aW9uCi1DUFBGTEFHUyA9IC1JJChaTElCSU5DKSAjIC1EUE5HX0RFQlVHPTUKLUNGTEFHUyA9IC1PICMgLWcKLUxERkxBR1MgPSAtTC4gLUwkKFpMSUJMSUIpIC1scG5nIC1seiAtbG0KLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0cy9wbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi1PQkpTID0gcG5nLm8gcG5nc2V0Lm8gcG5nZ2V0Lm8gcG5ncnV0aWwubyBwbmd0cmFucy5vIHBuZ3d1dGlsLm8gXAotCXBuZ3JlYWQubyBwbmdyaW8ubyBwbmd3aW8ubyBwbmd3cml0ZS5vIHBuZ3J0cmFuLm8gXAotCXBuZ3d0cmFuLm8gcG5nbWVtLm8gcG5nZXJyb3IubyBwbmdwcmVhZC5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpIC1vICRAICQ8Ci0KLWFsbDogbGlicG5nLmEgcG5ndGVzdAotCi0jIFRoZSBzdGFuZGFyZCBwbmdsaWJjb25mLmggZXhpc3RzIGFzIHNjcmlwdHMvcG5nbGliY29uZi5oLnByZWJ1aWx0LAotIyBjb3B5IHRoaXMgaWYgdGhlIGZvbGxvd2luZyBkb2Vzbid0IHdvcmsuCi1wbmdsaWJjb25mLmg6IHBuZ2xpYmNvbmYuZGZuCi0JJChSTV9GKSAkQCBwbmdsaWJjb25mLmMgcG5nbGliY29uZi5vdXQgcG5nbGliY29uZi50bXAKLQkkKEVDSE8pICcjaW5jbHVkZSAicG5nbGliY29uZi5kZm4iJyA+cG5nbGliY29uZi5jCi0JJChFQ0hPKSAiSWYgJyQoQ0MpIC1FJyBjcmFzaGVzIHRyeSAvbGliL2NwcCAoZS5nLiBDUFA9Jy9saWIvY3BwJykiID4mMgotCSQoQ1BQKSAkKERGTkZMQUdTKSBwbmdsaWJjb25mLmMgPnBuZ2xpYmNvbmYub3V0Ci0JJChBV0spIC1mICJzY3JpcHRzL2Rmbi5hd2siIG91dD0icG5nbGliY29uZi50bXAiIHBuZ2xpYmNvbmYub3V0IDE+JjIKLQltdiBwbmdsaWJjb25mLnRtcCAkQAotCi1wbmdsaWJjb25mLmRmbjogc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBzY3JpcHRzL29wdGlvbnMuYXdrIHBuZ2NvbmYuaCBwbmd1c3IuZGZhICQoREZBX1hUUkEpCi0JJChSTV9GKSAkQCBwbmdsaWJjb25mLnByZSBwbmdsaWJjb25mLnRtcAotCSQoRUNITykgIkNhbGxpbmcgJChBV0spIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLm1hayIgPiYyCi0JJChFQ0hPKSAiSWYgJ2F3aycgY3Jhc2hlcyB0cnkgYSBiZXR0ZXIgYXdrIChlLmcuIEFXSz0nbmF3aycpIiA+JjIKLQkkKEFXSykgLWYgc2NyaXB0cy9vcHRpb25zLmF3ayBvdXQ9InBuZ2xpYmNvbmYucHJlIlwKLQkgICAgdmVyc2lvbj1zZWFyY2ggcG5nY29uZi5oIHNjcmlwdHMvcG5nbGliY29uZi5kZmFcCi0JICAgIHBuZ3Vzci5kZmEgJChERkFfWFRSQSkgMT4mMgotCSQoQVdLKSAtZiBzY3JpcHRzL29wdGlvbnMuYXdrIG91dD0icG5nbGliY29uZi50bXAiIHBuZ2xpYmNvbmYucHJlIDE+JjIKLQltdiBwbmdsaWJjb25mLnRtcCAkQAotCi1saWJwbmcuYTogJChPQkpTKQotCSQoQVJfUkMpICRAICAkKE9CSlMpCi0JJChSQU5MSUIpICRACi0KLXBuZ3Rlc3Q6IHBuZ3Rlc3QubyBsaWJwbmcuYQotCSQoQ0MpIC1vIHBuZ3Rlc3QgJChDRkxBR1MpIHBuZ3Rlc3QubyAkKExERkxBR1MpCi0KLXRlc3Q6IHBuZ3Rlc3QKLQkuL3BuZ3Rlc3QKLQotaW5zdGFsbDogbGlicG5nLmEgcG5nbGliY29uZi5oCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCS1AJChNS0RJUl9QKSAkKERFU1RESVIpJChMSUJQQVRIKQotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChERVNURElSKSQoSU5DUEFUSCkvcG5nbGliY29uZi5oCi0JY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2xpYmNvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2xpYmNvbmYuaAotCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgbG4gLWYgLXMgbGlicG5nLyogLikKLQljcCBsaWJwbmcuYSAkKERFU1RESVIpJChMSUJQQVRIKQotCWNobW9kIDY0NCAkKERFU1RESVIpJChMSUJQQVRIKS9saWJwbmcuYQotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcgcG5nbGliY29uZi5oIHBuZ2xpYmNvbmYuYyBcCi0JcG5nbGliY29uZi5vdXQKLQotRE9DUyA9IEFOTk9VTkNFIENIQU5HRVMgSU5TVEFMTCBLTk9XTkJVRyBMSUNFTlNFIFJFQURNRSBUT0RPIFkyS0lORk8KLXdyaXRlbG9jazoKLQljaG1vZCBhLXcgKi5bY2gzNV0gJChET0NTKSBzY3JpcHRzLyoKLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1wbmcubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2Vycm9yLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdyaW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dpby5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nbWVtLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdzZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ2dldC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmVhZC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncnRyYW4ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J1dGlsLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd0cmFucy5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3JpdGUubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3d0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncHJlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQotcG5ndGVzdC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLnN1bm9zIGIvc2NyaXB0cy9tYWtlZmlsZS5zdW5vcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlMzA4Yy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2VmaWxlLnN1bm9zCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYsIDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jIENvcHlyaWdodCAoQykgMTk5NSBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4KLSMKLSMgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotIyBhbmQgbGljZW5zZSBpbiBwbmcuaAotCi0jIHdoZXJlIG1ha2UgaW5zdGFsbCBwdXRzIGxpYnBuZy5hIGFuZCBwbmcuaAotcHJlZml4PS91c3IvbG9jYWwKLUlOQ1BBVEg9JChwcmVmaXgpL2luY2x1ZGUKLUxJQlBBVEg9JChwcmVmaXgpL2xpYgotCi0jIG92ZXJyaWRlIERFU1RESVI9IG9uIHRoZSBtYWtlIGluc3RhbGwgY29tbWFuZCBsaW5lIHRvIGVhc2lseSBzdXBwb3J0Ci0jIGluc3RhbGxpbmcgaW50byBhIHRlbXBvcmFyeSBsb2NhdGlvbi4gIEV4YW1wbGU6Ci0jCi0jICAgIG1ha2UgaW5zdGFsbCBERVNURElSPS90bXAvYnVpbGQvbGlicG5nCi0jCi0jIElmIHlvdSdyZSBnb2luZyB0byBpbnN0YWxsIGludG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24KLSMgdmlhIERFU1RESVIsICQoREVTVERJUikkKHByZWZpeCkgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZQotIyB5b3UgZXhlY3V0ZSBtYWtlIGluc3RhbGwuCi1ERVNURElSPQotCi0jIFdoZXJlIHRoZSB6bGliIGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMgYXJlIGxvY2F0ZWQKLSNaTElCTElCPS91c3IvbG9jYWwvbGliCi0jWkxJQklOQz0vdXNyL2xvY2FsL2luY2x1ZGUKLVpMSUJMSUI9Li4vemxpYgotWkxJQklOQz0uLi96bGliCi0KLQotV0FSTk1PUkU9LVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV3NoYWRvdyAtV2NvbnZlcnNpb24gXAotCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVd0cmFkaXRpb25hbCAtV2Nhc3QtYWxpZ24gXAotCS1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKLQotQ0M9Z2NjCi1BUl9SQz1hciByYwotTUtESVJfUD1ta2RpciAtcAotTE5fU0Y9bG4gLWYgLXMKLVJBTkxJQj1yYW5saWIKLUNQPWNwCi1STV9GPS9iaW4vcm0gLWYKLQotQ1BQRkxBR1M9LUkkKFpMSUJJTkMpICMgLURQTkdfREVCVUc9NQotQ0ZMQUdTPS1PICMgJChXQVJOTU9SRSkKLUxERkxBR1M9LUwuIC1MJChaTElCTElCKSAtbHBuZyAtbHogLWxtCi0KLSMgUHJlLWJ1aWx0IGNvbmZpZ3VyYXRpb24KLSMgU2VlIHNjcmlwdHMvcG5nbGliY29uZi5tYWsgZm9yIG1vcmUgb3B0aW9ucwotUE5HTElCQ09ORl9IX1BSRUJVSUxUID0gc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIFwKLQlwbmdyZWFkLm8gcG5ncmlvLm8gcG5nd2lvLm8gcG5nd3JpdGUubyBwbmdydHJhbi5vIFwKLQlwbmd3dHJhbi5vIHBuZ21lbS5vIHBuZ2Vycm9yLm8gcG5ncHJlYWQubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtbyAkQCAkPAotCi1hbGw6IGxpYnBuZy5hIHBuZ3Rlc3QKLQotcG5nbGliY29uZi5oOiAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkKLQkkKENQKSAkKFBOR0xJQkNPTkZfSF9QUkVCVUlMVCkgJEAKLQotbGlicG5nLmE6ICQoT0JKUykKLQkkKEFSX1JDKSAkQCAgJChPQkpTKQotCSQoUkFOTElCKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0Lm8gbGlicG5nLmEKLQkkKENDKSAtbyBwbmd0ZXN0ICQoQ0ZMQUdTKSBwbmd0ZXN0Lm8gJChMREZMQUdTKQotCi10ZXN0OiBwbmd0ZXN0Ci0JLi9wbmd0ZXN0Ci0KLWluc3RhbGw6IGxpYnBuZy5hCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpCi0JLUAkKE1LRElSX1ApICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCS1AJChNS0RJUl9QKSAkKERFU1RESVIpJChMSUJQQVRIKQotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmcuaAotCS1AJChSTV9GKSAkKERFU1RESVIpJChJTkNQQVRIKS9wbmdjb25mLmgKLQktQCQoUk1fRikgJChERVNURElSKSQoSU5DUEFUSCkvcG5nbGliY29uZi5oCi0JY3AgcG5nLmggJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nCi0JY3AgcG5nY29uZi5oICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZwotCWNwIHBuZ2xpYmNvbmYuaCAkKERFU1RESVIpJChJTkNQQVRIKS9saWJwbmcKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZy5oCi0JY2htb2QgNjQ0ICQoREVTVERJUikkKElOQ1BBVEgpL2xpYnBuZy9wbmdjb25mLmgKLQljaG1vZCA2NDQgJChERVNURElSKSQoSU5DUEFUSCkvbGlicG5nL3BuZ2xpYmNvbmYuaAotCShjZCAkKERFU1RESVIpJChJTkNQQVRIKTsgJChMTl9TRikgbGlicG5nLyogLikKLQljcCBsaWJwbmcuYSAkKERFU1RESVIpJChMSUJQQVRIKQotCWNobW9kIDY0NCAkKERFU1RESVIpJChMSUJQQVRIKS9saWJwbmcuYQotCi1jbGVhbjoKLQkkKFJNX0YpICoubyBsaWJwbmcuYSBwbmd0ZXN0IHBuZ291dC5wbmcgcG5nbGliY29uZi5oCi0KLURPQ1MgPSBBTk5PVU5DRSBDSEFOR0VTIElOU1RBTEwgS05PV05CVUcgTElDRU5TRSBSRUFETUUgVE9ETyBZMktJTkZPCi13cml0ZWxvY2s6Ci0JY2htb2QgYS13ICouW2NoMzVdICQoRE9DUykgc2NyaXB0cy8qCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KLQotcG5nLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdlcnJvci5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ncmlvLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3aW8ubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ21lbS5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nc2V0Lm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdnZXQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3JlYWQubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3J0cmFuLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmdydXRpbC5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5ndHJhbnMubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3dyaXRlLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi1wbmd3dHJhbi5vOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotcG5nd3V0aWwubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLXBuZ3ByZWFkLm86IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0KLXBuZ3Rlc3QubzogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlZmlsZS50YzMgYi9zY3JpcHRzL21ha2VmaWxlLnRjMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwMTUwMi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2VmaWxlLnRjMworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBsaWJwbmcKLSMgVHVyYm9DL0MrKyAoTm90ZTogQWxsIG1vZHVsZXMgYXJlIGNvbXBpbGVkIGluIEMgbW9kZSkKLQotIyBUbyB1c2UsIGRvICJtYWtlIC1mbWFrZWZpbGUudGMzIgotCi0jIC0tLS0tIFR1cmJvIEMrKyAzLjAgLS0tLS0KLQotTU9ERUw9bAotQ1BQRkxBR1M9LUkuLlx6bGliCi1DRkxBR1M9LU8yIC1aIC1tJChNT0RFTCkKLUNDPXRjYwotTEQ9dGNjCi1MSUI9dGxpYgotTERGTEFHUz0tbSQoTU9ERUwpIC1MLi5cemxpYgotQ1A9Y29weQotCi0jIFByZS1idWlsdCBjb25maWd1cmF0aW9uCi0jIFNlZSBzY3JpcHRzXHBuZ2xpYmNvbmYubWFrIGZvciBtb3JlIG9wdGlvbnMKLSFpZm5kZWYgUE5HTElCQ09ORl9IX1BSRUJVSUxUCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdAotIWVuZGlmCi0KLU89Lm9iagotRT0uZXhlCi0KLSMgdmFyaWFibGVzCi1PQkpTMSA9IHBuZyQoTykgcG5nc2V0JChPKSBwbmdnZXQkKE8pIHBuZ3J1dGlsJChPKSBwbmd0cmFucyQoTykgcG5nd3V0aWwkKE8pCi1PQkpTMiA9IHBuZ21lbSQoTykgcG5ncHJlYWQkKE8pIHBuZ3JlYWQkKE8pIHBuZ2Vycm9yJChPKSBwbmd3cml0ZSQoTykKLU9CSlMzID0gcG5ncnRyYW4kKE8pIHBuZ3d0cmFuJChPKSBwbmdyaW8kKE8pIHBuZ3dpbyQoTykKLU9CSlNMMSA9ICtwbmckKE8pICtwbmdzZXQkKE8pICtwbmdnZXQkKE8pICtwbmdydXRpbCQoTykgK3BuZ3RyYW5zJChPKQotT0JKU0wyID0gK3BuZ3d1dGlsJChPKSArcG5nbWVtJChPKSArcG5ncHJlYWQkKE8pICtwbmdyZWFkJChPKSArcG5nZXJyb3IkKE8pCi1PQkpTTDMgPSArcG5nd3JpdGUkKE8pICtwbmdydHJhbiQoTykgK3BuZ3d0cmFuJChPKSArcG5ncmlvJChPKSArcG5nd2lvJChPKQotCi1hbGw6IGxpYnBuZyQoTU9ERUwpLmxpYiBwbmd0ZXN0JChFKQotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1wbmd0ZXN0OiBwbmd0ZXN0JChFKQotCi10ZXN0OiBwbmd0ZXN0JChFKQotCXBuZ3Rlc3QkKEUpCi0KLXBuZyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JCSAgJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKLQotcG5nc2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkJICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYwotCi1wbmdnZXQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCQkgICQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3JlYWQkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCQkgICQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkJICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYwotCi1wbmdydHJhbiQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JCSAgJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKLQotcG5ncnV0aWwkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCQkgICQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYwotCi1wbmdtZW0kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3JpbyQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKLQotcG5nd2lvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYwotCi1wbmd0ZXN0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYwotCi1wbmd3cml0ZSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMKLQotcG5nd3RyYW4kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jCi0KLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYwotCi1saWJwbmckKE1PREVMKS5saWI6ICQoT0JKUzEpICQoT0JKUzIpICQoT0JKUzMpCi0JJChMSUIpIGxpYnBuZyQoTU9ERUwpICskKE9CSlNMMSkKLQkkKExJQikgbGlicG5nJChNT0RFTCkgKyQoT0JKU0wyKQotCSQoTElCKSBsaWJwbmckKE1PREVMKSArJChPQkpTTDMpCi0KLXBuZ3Rlc3QkKEUpOiBwbmd0ZXN0JChPKSBsaWJwbmckKE1PREVMKS5saWIKLQkkKExEKSAkKExERkxBR1MpIHBuZ3Rlc3Qub2JqIGxpYnBuZyQoTU9ERUwpLmxpYiB6bGliXyQoTU9ERUwpLmxpYgotCi0jIEVuZCBvZiBtYWtlZmlsZSBmb3IgbGlicG5nCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2VmaWxlLnZjd2luMzIgYi9zY3JpcHRzL21ha2VmaWxlLnZjd2luMzIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDE0M2MuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9tYWtlZmlsZS52Y3dpbjMyCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgbWFrZWZpbGUgZm9yIGxpYnBuZwotIyBDb3B5cmlnaHQgKEMpIDE5OTggVGltIFdlZ25lcgotIyBDb3B5cmlnaHQgKEMpIDIwMDYsMjAwOSwyMDExLDIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSMKLSMgQXNzdW1lcyB0aGF0IHpsaWIubGliLCB6Y29uZi5oLCBhbmQgemxpYi5oIGhhdmUgYmVlbiBjb3BpZWQgdG8gLi5cemxpYgotIyBUbyB1c2UsIGRvICJubWFrZSAvZiBzY3JpcHRzXG1ha2VmaWxlLnZjd2luMzIiCi0KLSMgLS0tLS0tLS0gTWljcm9zb2Z0IFZpc3VhbCBDKysgMi4wIGFuZCBsYXRlciAtLS0tLS0tLQotCi0jIENvbXBpbGVyLCBsaW5rZXIsIGxpYnJhcmlhbiBhbmQgb3RoZXIgdG9vbHMKLUNDID0gY2wKLUxEID0gbGluawotQVIgPSBsaWIKLUNQUEZMQUdTID0gLUkuLlx6bGliCi1DRkxBR1MgID0gLW5vbG9nbyAtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIC1NRCAtTzIgLVczCi1MREZMQUdTID0gLW5vbG9nbwotQVJGTEFHUyA9IC1ub2xvZ28KLUNQID0gY29weQotUk0gPSBkZWwKLQotIyBQcmUtYnVpbHQgY29uZmlndXJhdGlvbgotIyBTZWUgc2NyaXB0c1xwbmdsaWJjb25mLm1hayBmb3IgbW9yZSBvcHRpb25zCi1QTkdMSUJDT05GX0hfUFJFQlVJTFQgPSBzY3JpcHRzXHBuZ2xpYmNvbmYuaC5wcmVidWlsdAotCi0jIEZpbGUgZXh0ZW5zaW9ucwotTz0ub2JqCi0KLSN1bmNvbW1lbnQgbmV4dCB0byBwdXQgZXJyb3IgbWVzc2FnZXMgaW4gYSBmaWxlCi0jRVJSRklMRT0gPj4gcG5nZXJycy5sb2cKLQotIyBWYXJpYWJsZXMKLU9CSlMxID0gcG5nJChPKSBwbmdlcnJvciQoTykgcG5nZ2V0JChPKSBwbmdtZW0kKE8pIHBuZ3ByZWFkJChPKQotT0JKUzIgPSBwbmdyZWFkJChPKSBwbmdyaW8kKE8pIHBuZ3J0cmFuJChPKSBwbmdydXRpbCQoTykgcG5nc2V0JChPKQotT0JKUzMgPSBwbmd0cmFucyQoTykgcG5nd2lvJChPKSBwbmd3cml0ZSQoTykgcG5nd3RyYW4kKE8pIHBuZ3d1dGlsJChPKQotT0JKUyAgPSAkKE9CSlMxKSAkKE9CSlMyKSAkKE9CSlMzKQotCi0jIFRhcmdldHMKLWFsbDogbGlicG5nLmxpYgotCi1wbmdsaWJjb25mLmg6ICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKQotCSQoQ1ApICQoUE5HTElCQ09ORl9IX1BSRUJVSUxUKSAkQAotCi1wbmckKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nc2V0JChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2dldCQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3ByZWFkJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3J1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ2Vycm9yJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ21lbSQoTyk6IHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmggcG5ncHJpdi5oIHBuZ3N0cnVjdC5oIHBuZ2luZm8uaCBwbmdkZWJ1Zy5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmdyaW8kKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oIHBuZ3ByaXYuaCBwbmdzdHJ1Y3QuaCBwbmdpbmZvLmggcG5nZGVidWcuaAotCSQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKi5jICQoRVJSRklMRSkKLQotcG5nd2lvJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3RyYW5zJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3dyaXRlJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d0cmFuJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLXBuZ3d1dGlsJChPKTogcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLQkkKENDKSAtYyAkKENQUEZMQUdTKSAkKENGTEFHUykgJCouYyAkKEVSUkZJTEUpCi0KLWxpYnBuZy5saWI6ICQoT0JKUykKLQktJChSTSkgJEAKLQkkKEFSKSAkKEFSRkxBR1MpIC1vdXQ6JEAgJChPQkpTKSAkKEVSUkZJTEUpCi0KLXBuZ3Rlc3QkKE8pOiBwbmcuaCBwbmdjb25mLmggcG5nbGliY29uZi5oCi0JJChDQykgLWMgJChDUFBGTEFHUykgJChDRkxBR1MpICQqLmMgJChFUlJGSUxFKQotCi1wbmd0ZXN0LmV4ZTogcG5ndGVzdCQoTykgbGlicG5nLmxpYgotCSQoTEQpICQoTERGTEFHUykgLW91dDokQCBwbmd0ZXN0JChPKSBsaWJwbmcubGliIC4uXHpsaWJcemxpYi5saWIgJChFUlJGSUxFKQotCi10ZXN0OiBwbmd0ZXN0LmV4ZQotCXBuZ3Rlc3QKLQotY2xlYW46Ci0JLSQoUk0pICokKE8pCi0JLSQoUk0pIGxpYnBuZy5saWIKLQktJChSTSkgcG5nbGliY29uZi5oCi0JLSQoUk0pIHBuZ3Rlc3QuZXhlCi0JLSQoUk0pIHBuZ291dC5wbmcKLQotIyBFbmQgb2YgbWFrZWZpbGUgZm9yIGxpYnBuZwotCmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2V2bXMuY29tIGIvc2NyaXB0cy9tYWtldm1zLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjMzI2MS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL21ha2V2bXMuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSQhIG1ha2UgbGlicG5nIHVuZGVyIFZNUwotJCEKLSQhCi0kISBDaGVjayBmb3IgTU1LL01NUwotJCEKLSQhIFRoaXMgcHJvY2VkdXJlIGFjY2VwdHMgb25lIHBhcmFtZXRlciAoY29udHJpYiksIHdoaWNoIGNhdXNlcyBpdCB0byBidWlsZAotJCEgdGhlIHByb2dyYW1zIGZyb20gdGhlIGNvbnRyaWIgZGlyZWN0b3J5IGluc3RlYWQgb2YgbGlicG5nLgotJCEKLSQgcDEgPSBmJGVkaXQocDEsIlVQQ0FTRSIpCi0kIGlmIHAxIC5lcXMuICJDT05UUklCIgotJCB0aGVuCi0kICAgc2V0IGRlZiBbLmNvbnRyaWIuZ3JlZ2Jvb2tdCi0kICAgQG1ha2V2bXMKLSQgICBzZXQgZGVmIFstLnBuZ21pbnVzXQotJCAgIEBtYWtldm1zCi0kICAgc2V0IGRlZiBbLS1dCi0kICAgZXhpdAotJCBlbmRpZgotJCBNYWtlID0gIiIKLSQgSWYgRiRTZWFyY2ggKCJTeXMkU3lzdGVtOk1NUy5FWEUiKSAubmVzLiAiIiBUaGVuIE1ha2UgPSAiTU1TIgotJCBJZiBGJFR5cGUgKE1NSykgLmVxcy4gIlNUUklORyIgVGhlbiBNYWtlID0gIk1NSyIKLSQhCi0kISBMb29rIGZvciB0aGUgY29tcGlsZXIgdXNlZAotJCEKLSQgemxpYnNyYyA9ICJbLS56bGliXSIKLSQgY2NvcHQ9Ii9pbmNsdWRlPScnemxpYnNyYyciCi0kIGlmIGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQKLSQgdGhlbgotJCAgY2NvcHQgPSAiL3ByZWZpeD1hbGwiK2Njb3B0Ci0kICBjb21wICA9ICJfX2RlY2NfXz0xIgotJCAgaWYgZiR0cm5sbm0oIlNZUyIpLmVxcy4iIiB0aGVuIGRlZmluZSBzeXMgc3lzJGxpYnJhcnk6Ci0kIGVsc2UKLSQgIGlmIGYkc2VhcmNoKCJTWVMkU1lTVEVNOkRFQ0MkQ09NUElMRVIuRVhFIikuZXFzLiIiCi0kICAgdGhlbgotJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKLSQgICAgaWYgZiRzZWFyY2goIlNZUyRTWVNURU06VkFYQy5FWEUiKS5lcXMuIiIKLSQgICAgIHRoZW4KLSQgICAgICBjb21wICA9ICJfX2djY19fPTEiCi0kICAgICAgQ0MgOj09IEdDQwotJCAgICAgZWxzZQotJCAgICAgIGNvbXAgPSAiX192YXhjX189MSIKLSQgICAgIGVuZGlmCi0kICAgZWxzZQotJCAgICBpZiBmJHRybmxubSgiU1lTIikuZXFzLiIiIHRoZW4gZGVmaW5lIHN5cyBkZWNjJGxpYnJhcnlfaW5jbHVkZToKLSQgICAgY2NvcHQgPSAiL2RlY2MvcHJlZml4PWFsbCIrY2NvcHQKLSQgICAgY29tcCAgPSAiX19kZWNjX189MSIKLSQgIGVuZGlmCi0kIGVuZGlmCi0kIQotJCEgQnVpbGQgdGhlIHRoaW5nIHBsYWluIG9yIHdpdGggbW1zL21tawotJCEKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nIExpYnBuZyBzb3VyY2VzIC4uLiIKLSQgaWYgbWFrZS5lcXMuIiIKLSQgIHRoZW4KLSQgICBkZWxlIHBuZ3Rlc3Qub2JqOyoKLSQgICBDQUxMIE1BS0UgcG5nLk9CSiAiY2MgJydDQ09QVCcgcG5nIiAtCi0JcG5nLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nc2V0Lk9CSiAiY2MgJydDQ09QVCcgcG5nc2V0IiAtCi0JcG5nc2V0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nZ2V0Lk9CSiAiY2MgJydDQ09QVCcgcG5nZ2V0IiAtCi0JcG5nZ2V0LmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5ncmVhZC5PQkogImNjICcnQ0NPUFQnIHBuZ3JlYWQiIC0KLQlwbmdyZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5ncHJlYWQuT0JKICJjYyAnJ0NDT1BUJyBwbmdwcmVhZCIgLQotCXBuZ3ByZWFkLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5ncnRyYW4uT0JKICJjYyAnJ0NDT1BUJyBwbmdydHJhbiIgLQotCXBuZ3J0cmFuLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5ncnV0aWwuT0JKICJjYyAnJ0NDT1BUJyBwbmdydXRpbCIgLQotCXBuZ3J1dGlsLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nZXJyb3IuT0JKICJjYyAnJ0NDT1BUJyBwbmdlcnJvciIgLQotCXBuZ2Vycm9yLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nbWVtLk9CSiAiY2MgJydDQ09QVCcgcG5nbWVtIiAtCi0JcG5nbWVtLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5ncmlvLk9CSiAiY2MgJydDQ09QVCcgcG5ncmlvIiAtCi0JcG5ncmlvLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nd2lvLk9CSiAiY2MgJydDQ09QVCcgcG5nd2lvIiAtCi0JcG5nd2lvLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5ndHJhbnMuT0JKICJjYyAnJ0NDT1BUJyBwbmd0cmFucyIgLQotCXBuZ3RyYW5zLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nd3JpdGUuT0JKICJjYyAnJ0NDT1BUJyBwbmd3cml0ZSIgLQotCXBuZ3dyaXRlLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nd3RyYW4uT0JKICJjYyAnJ0NDT1BUJyBwbmd3dHJhbiIgLQotCXBuZ3d0cmFuLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICBDQUxMIE1BS0UgcG5nd3V0aWwuT0JKICJjYyAnJ0NDT1BUJyBwbmd3dXRpbCIgLQotCXBuZ3d1dGlsLmMgcG5nLmggcG5nY29uZi5oIHBuZ2xpYmNvbmYuaCBwbmdwcml2LmggcG5nc3RydWN0LmggcG5naW5mby5oIHBuZ2RlYnVnLmgKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBMaWJwbmcgLi4uIgotJCAgIENBTEwgTUFLRSBsaWJwbmcuT0xCICJsaWIvY3JlYSBsaWJwbmcub2xiICoub2JqIiAqLk9CSgotJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIHBuZ3Rlc3QuLi4iCi0kICAgQ0FMTCBNQUtFIHBuZ3Rlc3QuT0JKICJjYyAnJ0NDT1BUJyBwbmd0ZXN0IiAtCi0JcG5ndGVzdC5jIHBuZy5oIHBuZ2NvbmYuaCBwbmdsaWJjb25mLmgKLSQgICBjYWxsIG1ha2UgcG5ndGVzdC5leGUgLQotCSJMSU5LIHBuZ3Rlc3QsbGlicG5nLm9sYi9saWIsJyd6bGlic3JjJ2xpYnoub2xiL2xpYiIgLQotCXBuZ3Rlc3Qub2JqIGxpYnBuZy5vbGIKLSQgICB3cml0ZSBzeXMkb3V0cHV0ICJUZXN0aW5nIExpYnBuZy4uLiIKLSQgICBydW4gcG5ndGVzdAotJCAgZWxzZQotJCAgIGlmIGYkc2VhcmNoKCJERVNDUklQLk1NUyIpIC5lcXMuICIiIHRoZW4gY29weS9ub2xvZyBbLlNDUklQVFNdREVTQ1JJUC5NTVMgW10KLSQgICAnbWFrZScvbWFjcm89KCdjb21wJyx6bGlic3JjPSd6bGlic3JjJykKLSQgIGVuZGlmCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkxpYnBuZyBidWlsZCBjb21wbGV0ZWQiCi0kIGV4aXQKLSQhCi0kIQotJE1BS0U6IFNVQlJPVVRJTkUgICAhU1VCUk9VVElORSBUTyBDSEVDSyBERVBFTkRFTkNJRVMKLSQgViA9ICdGJFZlcmlmeSgwKQotJCEgUDEgPSBXaGF0IHdlIGFyZSB0cnlpbmcgdG8gbWFrZQotJCEgUDIgPSBDb21tYW5kIHRvIG1ha2UgaXQKLSQhIFAzIC0gUDggIFdoYXQgaXQgZGVwZW5kcyBvbgotJAotJCBJZiBGJFNlYXJjaChQMSkgLkVxcy4gIiIgVGhlbiBHb3RvIE1ha2VpdAotJCBUaW1lID0gRiRDdlRpbWUoRiRGaWxlKFAxLCJSRFQiKSkKLSRhcmc9MwotJExvb3A6Ci0kICAgICAgIEFyZ3VtZW50ID0gUCdhcmcKLSQgICAgICAgSWYgQXJndW1lbnQgLkVxcy4gIiIgVGhlbiBHb3RvIEV4aXQKLSQgICAgICAgRWw9MAotJExvb3AyOgotJCAgICAgICBGaWxlID0gRiRFbGVtZW50KEVsLCIgIixBcmd1bWVudCkKLSQgICAgICAgSWYgRmlsZSAuRXFzLiAiICIgVGhlbiBHb3RvIEVuZGwKLSQgICAgICAgQUZpbGUgPSAiIgotJExvb3AzOgotJCAgICAgICBPRmlsZSA9IEFGaWxlCi0kICAgICAgIEFGaWxlID0gRiRTZWFyY2goRmlsZSkKLSQgICAgICAgSWYgQUZpbGUgLkVxcy4gIiIgLk9yLiBBRmlsZSAuRXFzLiBPRmlsZSBUaGVuIEdvdG8gTmV4dEVsCi0kICAgICAgIElmIEYkQ3ZUaW1lKEYkRmlsZShBRmlsZSwiUkRUIikpIC5HZXMuIFRpbWUgVGhlbiBHb3RvIE1ha2VpdAotJCAgICAgICBHb3RvIExvb3AzCi0kTmV4dEVMOgotJCAgICAgICBFbCA9IEVsICsgMQotJCAgICAgICBHb3RvIExvb3AyCi0kRW5kTDoKLSQgYXJnPWFyZysxCi0kIElmIGFyZyAuTGUuIDggVGhlbiBHb3RvIExvb3AKLSQgR290byBFeGl0Ci0kCi0kTWFrZWl0OgotJCBWVj1GJFZFUklGWSgwKQotJCB3cml0ZSBzeXMkb3V0cHV0IFAyCi0kICdQMgotJCBWVj0nRiRWZXJpZnkoVlYpCi0kRXhpdDoKLSQgSWYgViBUaGVuIFNldCBWZXJpZnkKLSRFTkRTVUJST1VUSU5FCmRpZmYgLS1naXQgYS9zY3JpcHRzL29wdGlvbnMuYXdrIGIvc2NyaXB0cy9vcHRpb25zLmF3awpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODFiODJmZi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL29wdGlvbnMuYXdrCisrKyAvZGV2L251bGwKQEAgLTEsODk4ICswLDAgQEAKLSMhL2Jpbi9hd2sgLWYKLSMgc2NyaXB0cy9vcHRpb25zLmF3ayAtIGxpYnJhcnkgYnVpbGQgY29uZmlndXJhdGlvbiBjb250cm9sCi0jCi0jIGxhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTEgLSBKdW5lIDUsIDIwMTQKLSMKLSMgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0jCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotIyBUaGUgb3V0cHV0IG9mIHRoaXMgc2NyaXB0IGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgZ2l2ZW4gYnkKLSMgdGhlIHZhcmlhYmxlICdvdXQnLiAgVGhlIHNjcmlwdCBpcyBydW4gdHdpY2UsIG9uY2Ugd2l0aAotIyBhbiBpbnRlcm1lZGlhdGUgb3V0cHV0IGZpbGUsICdvcHRpb25zLnRtcCcgdGhlbiBhZ2FpbiBvbgotIyB0aGF0IGZpbGUgdG8gcHJvZHVjZSB0aGUgZmluYWwgb3V0cHV0OgotIwotIyAgYXdrIC1mIHNjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PW9wdGlvbnMudG1wIHNjcmlwdHMvb3B0aW9ucy5kZmEgMT4mMgotIyAgYXdrIC1mIHNjcmlwdHMvb3B0aW9ucy5hd2sgb3V0PW9wdGlvbnMuZGZuIG9wdGlvbnMudG1wIDE+JjIKLSMKLSMgU29tZSBvcHRpb25zIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZToKLSMKLSMgIGRlYj0xICAgICAgICAgICAgQ2F1c2VzIGRlYnVnZ2luZyB0byBiZSBvdXRwdXQKLSMgIGxvZ3Vuc3VwcG9ydGVkPTEgQ2F1c2VzIGFsbCBvcHRpb25zIHRvIGJlIHJlY29yZGVkIGluIHRoZSBvdXRwdXQKLSMgIGV2ZXJ5dGhpbmc9b2ZmICAgQ2F1c2VzIGFsbCBvcHRpb25zIHRvIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSMgIGV2ZXJ5dGhpbmc9b24gICAgQ2F1c2VzIGFsbCBvcHRpb25zIHRvIGJlIGVuYWJsZWQgYnkgZGVmYXVsdAotIwotIyBJZiBhd2sgZmFpbHMgb24geW91ciBwbGF0Zm9ybSwgdHJ5IG5hd2sgaW5zdGVhZC4KLSMKLSMgVGhlc2Ugb3B0aW9ucyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGZpbGUgKGFuZAotIyBhcmUgY29waWVkIHRvIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSkuCi0KLUJFR0lOewotICAgb3V0PSIiICAgICAgICAgICAgICAgICAgICAgICAjIGludGVybWVkaWF0ZSwgcHJlcHJvY2Vzc2VkLCBmaWxlCi0gICBwcmU9LTEgICAgICAgICAgICAgICAgICAgICAgICMgcHJlcHJvY2VzcyAoZmlyc3QgbGluZSkKLSAgIHZlcnNpb249ImxpYnBuZyB2ZXJzaW9uIHVua25vd24iICMgdmVyc2lvbiBpbmZvcm1hdGlvbgotICAgdmVyc2lvbl9maWxlPSIiICAgICAgICAgICAgICAjIHdoZXJlIHRvIGZpbmQgdGhlIHZlcnNpb24KLSAgIGVycj0wICAgICAgICAgICAgICAgICAgICAgICAgIyBpbi1saW5lIGV4aXQgc2V0cyB0aGlzCi0gICAjIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgcHJldmVudCB0aGUgQyBwcmVwcm9jZXNzb3Igbm90aWNpbmcgdGhlIGxpbmVzCi0gICAjIHRoYXQgd2lsbCBiZSBpbiB0aGUgZmluYWwgb3V0cHV0IGZpbGUuICBTb21lIEMgcHJlcHJvY2Vzc29ycyB0b2tlbmlzZQotICAgIyB0aGUgbGluZXMsIGZvciBleGFtcGxlIGJ5IGluc2VydGluZyBzcGFjZXMgYXJvdW5kIG9wZXJhdG9ycywgYW5kIGFsbAotICAgIyBDIHByZXByb2Nlc3NvcnMgbm90aWNlIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCAnIycsIG1vc3QgcmVtb3ZlIGNvbW1lbnRzLgotICAgIyBUaGUgdGVjaG5pcXVlIGFkb3B0ZWQgaGVyZSBpcyB0byBtYWtlIHRoZSBmaW5hbCBvdXRwdXQgbGluZXMgaW50bwotICAgIyBDIHN0cmluZ3MgKGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMpLCBwcmVjZWVkZWQgYnkgUE5HX0RGTi4gIEFzIGEKLSAgICMgY29uc2VxdWVuY2UgdGhlIG91dHB1dCBjYW5ub3QgY29udGFpbiBhICdyYXcnIGRvdWJsZSBxdW90ZSAtIGluc3RlYWQgcHV0Ci0gICAjIEAnIGluLCB0aGlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgIiBhZnRlcndhcmQuICBTZWUgdGhlIHBhcnNlcgotICAgIyBzY3JpcHQgZGZuLmF3ayBmb3IgbW9yZSBjYXBhYmlsaXRpZXMgKG5vdCByZXF1aXJlZCBoZXJlKS4gIE5vdGUgdGhhdCBpZgotICAgIyB5b3UgbmVlZCBhICIgaW4gYSAnc2V0dGluZycgaW4gcG5nbGliY29uZi5kZmEgaXQgbXVzdCBhbHNvIGJlIEAnIQotICAgZHE9IkAnIiAgICAgICAgICAgICAgICAgICAgICAjIEZvciBhIHNpbmdsZSBkb3VibGUgcXVvdGUKLSAgIHN0YXJ0PSIgUE5HX0RGTiBcIiIgICAgICAgICAgIyBTdGFydCBzdHVmZiB0byBvdXRwdXQgKGNhbid0IGNvbnRhaW4gYSAiISkKLSAgIGVuZD0iXCIgIiAgICAgICAgICAgICAgICAgICAgIyBFbmQgc3R1ZmYgdG8gb3V0cHV0Ci0gICBzdWJzPSJAXCIgIiAgICAgICAgICAgICAgICAgICMgU3Vic3RpdHV0ZSBzdGFydCAoc3Vic3RpdHV0ZSBhIEMgbWFjcm8pCi0gICBzdWJlPSIgXCJAIiAgICAgICAgICAgICAgICAgICMgU3Vic3RpdHV0ZSBlbmQKLSAgIGNvbW1lbnQ9c3RhcnQgIi8qIiAgICAgICAgICAgIyBDb21tZW50IHN0YXJ0Ci0gICBjZW5kPSIqLyIgZW5kICAgICAgICAgICAgICAgICMgQ29tbWVudCBlbmQKLSAgIGRlZj1zdGFydCAiI2RlZmluZSBQTkdfIiAgICAgIyBBcmJpdHJhcnkgZGVmaW5lCi0gICBzdXA9Il9TVVBQT1JURUQiIGVuZCAgICAgICAgICMgZW5kIHN1cHBvcnRlZCBvcHRpb24KLSAgIHVuZD1jb21tZW50ICIjdW5kZWYgUE5HXyIgICAgIyBVbnN1cHBvcnRlZCBvcHRpb24KLSAgIHVuZT0iX1NVUFBPUlRFRCIgY2VuZCAgICAgICAgIyBlbmQgdW5zdXBwb3J0ZWQgb3B0aW9uCi0gICBlcnJvcj1zdGFydCAiRVJST1I6IiAgICAgICAgICMgZXJyb3IgbWVzc2FnZSwgdGVybWluYXRlIHdpdGggJ2VuZCcKLQotICAgIyBWYXJpYWJsZXMKLSAgIGRlYj0wICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWJ1ZyAtIHNldCBvbiBjb21tYW5kIGxpbmUKLSAgIGV2ZXJ5dGhpbmc9IiIgICAgICAgICAgICAgICAgIyBkbyBub3Qgb3ZlcnJpZGUgZGVmYXVsdHMKLSAgIGxvZ3Vuc3VwcG9ydGVkPTAgICAgICAgICAgICAgIyB3cml0ZSB1bnN1cHBvcnRlZCBvcHRpb25zIHRvbwotCi0gICAjIFByZWNyZWF0ZSBhcnJheXMKLSAgICMgZm9yIGVhY2ggb3B0aW9uOgotICAgb3B0aW9uWyIiXSA9ICIiICAgICMgbGlzdCBvZiBhbGwgb3B0aW9uczogZGVmYXVsdCBlbmFibGVkL2Rpc2FibGVkCi0gICBkb25lWyIiXSA9IDEgICAgICAgIyBtYXJrcyBvcHRpb24gYXMgaGF2aW5nIGJlZW4gb3V0cHV0Ci0gICByZXF1aXJlc1siIl0gPSAiIiAgIyByZXF1aXJlcyBieSBvcHRpb24KLSAgIGlmZnNbIiJdID0gIiIgICAgICAjIGlmIGJ5IG9wdGlvbgotICAgZW5hYmxlZGJ5WyIiXSA9ICIiICMgb3B0aW9ucyB0aGF0IGVuYWJsZSBpdCBieSBvcHRpb24KLSAgIHNldHNbIiJdID0gIiIgICAgICAjIHNldHRpbmdzIHNldCBieSBlYWNoIG9wdGlvbgotICAgc2V0dmFsWyIiXSA9ICIiICAgICMgdmFsdWUgdG8gc2V0IChpbmRleGVkOiAnb3B0aW9uIHNldHNbb3B0aW9uXScpCi0gICAjIGZvciBlYWNoIHNldHRpbmc6Ci0gICBzZXR0aW5nWyIiXSA9ICIiICAgIyByZXF1aXJlcyBieSBzZXR0aW5nCi0gICBkZWZhdWx0c1siIl0gPSAiIiAgIyB1c2VkIGZvciBhIGRlZmF1bHRlZCB2YWx1ZQotICAgZG9uZXNldFsiIl0gPSAxICAgICMgbWFya3Mgc2V0dGluZyBhcyBoYXZpbmcgYmVlbiBvdXRwdXQKLSAgIHJbIiJdID0gIiIgICAgICAgICAjIFRlbXBvcmFyeSBhcnJheQotCi0gICAjIEZvciBkZWNvcmF0aW5nIHRoZSBvdXRwdXQgZmlsZQotICAgcHJvdGVjdCA9ICIiCi19Ci0KLSMgVGhlIG91dHB1dCBmaWxlIG11c3QgYmUgc3BlY2lmaWVkIGJlZm9yZSBhbnkgaW5wdXQ6Ci1vdXQgPT0gIiIgewotICAgcHJpbnQgIm91dD1vdXRwdXQuZmlsZSBtdXN0IGJlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUiCi0gICBlcnIgPSAxCi0gICBleGl0IDEKLX0KLQotIyBUaGUgdmVyeSBmaXJzdCBsaW5lIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSByZWFkaW5nIHByZS1wcm9jZXNzZWQKLSMgaW5wdXQgb3Igbm90LCB0aGlzIG11c3QgY29tZSAqZmlyc3QqIGJlY2F1c2UgJ1BSRVBST0NFU1NFRCcgbmVlZHMKLSMgdG8gYmUgdGhlIHZlcnkgZmlyc3QgbGluZSBpbiB0aGUgdGVtcG9yYXJ5IGZpbGUuCi1wcmUgPT0gLTF7Ci0gICBpZiAoJDAgPT0gIlBSRVBST0NFU1NFRCIpIHsKLSAgICAgIHByZSA9IDAKLSAgICAgIG5leHQKLSAgIH0gZWxzZSB7Ci0gICAgICBwcmUgPSAxCi0gICAgICBwcmludCAiUFJFUFJPQ0VTU0VEIiA+b3V0Ci0gICAgICAjIEFuZCBmYWxsIHRocm91Z2ggdG8gY29udGludWUgcHJvY2Vzc2luZwotICAgfQotfQotCi0jIFdoaWxlIHByZS1wcm9jZXNzaW5nIGlmIHZlcnNpb24gaXMgc2V0IHRvICJzZWFyY2giIGxvb2sgZm9yIGEgdmVyc2lvbiBzdHJpbmcKLSMgaW4gdGhlIGZvbGxvd2luZyBmaWxlLgotcHJlICYmIHZlcnNpb24gPT0gInNlYXJjaCIgJiYgdmVyc2lvbl9maWxlID09ICIiewotICAgdmVyc2lvbl9maWxlID0gRklMRU5BTUUKLX0KLQotcHJlICYmIHZlcnNpb24gPT0gInNlYXJjaCIgJiYgdmVyc2lvbl9maWxlICE9IEZJTEVOQU1FewotICAgcHJpbnQgInZlcnNpb24gc3RyaW5nIG5vdCBmb3VuZCBpbiIsIHZlcnNpb25fZmlsZQotICAgZXJyID0gMQotICAgZXhpdCAxCi19Ci0KLXByZSAmJiB2ZXJzaW9uID09ICJzZWFyY2giICYmICQwIH4gL14gXCogbGlicG5nIHZlcnNpb24vewotICAgdmVyc2lvbiA9IHN1YnN0cigkMCwgNCkKLSAgIHByaW50ICJ2ZXJzaW9uID0iLCB2ZXJzaW9uID5vdXQKLSAgIG5leHQKLX0KLQotcHJlICYmIEZJTEVOQU1FID09IHZlcnNpb25fZmlsZXsKLSAgIG5leHQKLX0KLQotIyB2YXJpYWJsZT12YWx1ZQotIyAgIFNldHMgdGhlIGdpdmVuIHZhcmlhYmxlIHRvIHRoZSBnaXZlbiB2YWx1ZSAodGhlIHN5bnRheCBpcyBmYWlybHkKLSMgICBmcmVlIGZvcm0sIGV4Y2VwdCBmb3IgZGViICh5b3UgYXJlIGV4cGVjdGVkIHRvIHVuZGVyc3RhbmQgaG93IHRvCi0jICAgc2V0IHRoZSBkZWJ1ZyB2YXJpYWJsZS4uLikKLSMKLSMgICBUaGlzIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGVjayBvbiAncHJlJyBiZWxvdyBza2lwcyBtb3N0IG9mIHRoZQotIyAgIHJlc3Qgb2YgdGhlIGFjdGlvbnMsIHNvIHRoZSB2YXJpYWJsZSBzZXR0aW5ncyBoYXBwZW4gZHVyaW5nCi0jICAgcHJlcHJvY2Vzc2luZyBidXQgYXJlIHJlY29yZGVkIGluIHRoZSBFTkQgYWN0aW9uIHRvby4gIFRoaXMKLSMgICBhbGxvd3MgdGhlbSB0byBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZSB0b28uCi0kMCB+IC9eWyAJXSp2ZXJzaW9uWyAJXSo9L3sKLSAgIHN1YigvXlsgIF0qdmVyc2lvblsgIF0qPVsgIF0qLywgIiIpCi0gICB2ZXJzaW9uID0gJDAKLSAgIG5leHQKLX0KLSQwIH4gL15bIAldKmV2ZXJ5dGhpbmdbIAk9XSpvZmZbIAldKiQvewotICAgZXZlcnl0aGluZyA9ICJvZmYiCi0gICBuZXh0Ci19Ci0kMCB+IC9eWyAJXSpldmVyeXRoaW5nWyAJPV0qb25bIAldKiQvewotICAgZXZlcnl0aGluZyA9ICJvbiIKLSAgIG5leHQKLX0KLSQwIH4gL15bIAldKmxvZ3Vuc3VwcG9ydGVkWyAJPV0qMFsgCV0qJC97Ci0gICBsb2d1bnN1cHBvcnRlZCA9IDAKLSAgIG5leHQKLX0KLSQwIH4gL15bIAldKmxvZ3Vuc3VwcG9ydGVkWyAJPV0qMVsgCV0qJC97Ci0gICBsb2d1bnN1cHBvcnRlZCA9IDEKLSAgIG5leHQKLX0KLSQxID09ICJkZWIiICYmICQyID09ICI9IiAmJiBORiA9PSAzewotICAgZGViID0gJDMKLSAgIG5leHQKLX0KLQotIyBQcmVwcm9jZXNzaW5nIC0gdGhpcyBqdXN0IGNvcGllcyB0aGUgaW5wdXQgZmlsZSB3aXRoIGxpbmVzCi0jIHRoYXQgbmVlZCBwcmVwcm9jZXNzaW5nIChqdXN0IGNodW5rIGF0IHByZXNlbnQpIGV4cGFuZGVkCi0jIFRoZSBiYXJlICJwcmUiIGluc3RlYWQgb2YgInByZSAhPSAwIiBjcmFzaGVzIHVuZGVyIFN1bm9zIGF3awotcHJlICYmICQxICE9ICJjaHVuayJ7Ci0gICBwcmludCA+b3V0Ci0gICBuZXh0Ci19Ci0KLSMgVGhlIGZpcnN0IGNoYXJhY3RlcnMgb2YgdGhlIGxpbmUgZGV0ZXJtaW5lIGhvdyBpdCBpcyBwcm9jZXNzZWQsCi0jIGxlYWRpbmcgc3BhY2VzIGFyZSBpZ25vcmVkLiAgSW4gZ2VuZXJhbCB0b2tlbnMgdGhhdCBhcmUgbm90Ci0jIGtleXdvcmRzIGFyZSB0aGUgbmFtZXMgb2Ygb3B0aW9ucy4gIEFuIG9wdGlvbiAnbmFtZScgaXMKLSMgY29udHJvbGxlZCBieSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBtYWNyb3M6Ci0jCi0jICAgUE5HX25hbWVfU1VQUE9SVEVEICAgIFRoZSBvcHRpb24gaXMgdHVybmVkIG9uCi0jICAgUE5HX05PX25hbWUKLSMgICBQTkdfTk9fbmFtZV9TVVBQT1JURUQgSWYgdGhlIGZpcnN0IG1hY3JvIGlzIG5vdCBkZWZpbmVkCi0jICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciBvZiB0aGVzZSB3aWxsIHR1cm4gdGhlIG9wdGlvbiBvZmYKLSMKLSMgSWYgbm9uZSBvZiB0aGVzZSBtYWNyb3MgYXJlIGRlZmluZWQgdGhlIG9wdGlvbiBpcyB0dXJuZWQgb24sIHVubGVzcwotIyB0aGUga2V5d29yZCAnb2ZmJyBpcyBnaXZlbiBpbiBhIGxpbmUgcmVsYXRpbmcgdG8gdGhlIG9wdGlvbi4gIFRoZQotIyBrZXl3b3JkICdvbicgY2FuIGFsc28gYmUgZ2l2ZW4sIGJ1dCBpdCB3aWxsIGJlIGlnbm9yZWQgKHNpbmNlIGl0IGlzCi0jIHRoZSBkZWZhdWx0LikKLSMKLSMgSW4gdGhlIHN5bnRheCBiZWxvdyBhICduYW1lJyBpcyBpbmRpY2F0ZWQgYnkgIk5BTUUiLCBvdGhlciBtYWNybwotIyB2YWx1ZXMgYXJlIGluZGljYXRlZCBieSAiTUFDUk8iLCBhcyB3aXRoICJOQU1FIiB0aGUgbGVhZGluZyAiUE5HXyIKLSMgaXMgb21pdHRlZCwgYnV0IGluIHRoaXMgY2FzZSB0aGUgIk5PXyIgcHJlZml4IGFuZCB0aGUgIl9TVVBQT1JURUQiCi0jIHN1ZmZpeCBhcmUgbmV2ZXIgdXNlZC4KLSMKLSMgRWFjaCBsaW5lIGlzIGludHJvZHVjZWQgYnkgYSBrZXl3b3JkIC0gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyYWN0ZXJzCi0jIG9uIHRoZSBsaW5lLiAgQSBsaW5lIHN0YXJ0aW5nIHdpdGggYSAnIycgaXMgYSBjb21tZW50IC0gaXQgaXMgdG90YWxseQotIyBpZ25vcmVkLiAgS2V5d29yZHMgYXJlIGFzIGZvbGxvd3MsIGEgTkFNRSwgaXMgc2ltcGx5IGEgbWFjcm8gbmFtZQotIyB3aXRob3V0IHRoZSBsZWFkaW5nIFBOR18sIFBOR19OT18gb3IgdGhlIHRyYWlsaW5nIF9TVVBQT1JURUQuCi0KLSQxIH4gL14jLyB8fCAkMCB+IC9eWyAJXSokL3sKLSAgIG5leHQKLX0KLQotIyBjb20gPGNvbW1lbnQ+Ci0jICAgVGhlIHdob2xlIGxpbmUgaXMgcGxhY2VkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhIGNvbW1lbnQgd2l0aAotIyAgIHRoZSBwcmVjZWRpbmcgJ2NvbScgcmVtb3ZlZAotJDEgPT0gImNvbSJ7Ci0gICBpZiAoTkYgPiAxKSB7Ci0gICAgICAjIHN1YigvXlsgCV0qY29tWyAJXSovLCAiIikKLSAgICAgICQxID0gIiIKLSAgICAgIHByaW50IGNvbW1lbnQgJDAsIGNlbmQgPm91dAotICAgfSBlbHNlCi0gICAgICBwcmludCBzdGFydCBlbmQgPm91dAotICAgbmV4dAotfQotCi0jIHZlcnNpb24KLSMgICBJbnNlcnRzIGEgdmVyc2lvbiBjb21tZW50Ci0kMSA9PSAidmVyc2lvbiIgJiYgTkYgPT0gMXsKLSAgIGlmICh2ZXJzaW9uID09ICIiKSB7Ci0gICAgICBwcmludCAiRVJST1I6IG5vIHZlcnNpb24gc3RyaW5nIHNldCIKLSAgICAgIGVyciA9IDEgIyBwcmV2ZW50IEVORHt9IHJ1bm5pbmcKLSAgICAgIGV4aXQgMQotICAgfQotCi0gICBwcmludCBjb21tZW50LCB2ZXJzaW9uLCBjZW5kID5vdXQKLSAgIG5leHQKLX0KLQotIyBmaWxlIG91dHB1dCBpbnB1dCBwcm90ZWN0Ci0jICAgSW5mb3JtYXRpb25hbDogdGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgKHdpdGhvdXQKLSMgICBtYWtlIGdlbmVyYXRlZCBsb2NhbCBkaXJlY3RvcmllcyksIHRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZQotIyAgIG91dHB1dCBmaWxlIGFuZCwgaWYgcmVxdWlyZWQsIGEgbmFtZSB0byB1c2UgaW4gYSBwcm90ZWN0aW9uCi0jICAgbWFjcm8gZm9yIHRoZSBjb250ZW50cy4KLSQxID09ICJmaWxlIiAmJiBORiA+PSAyewotICAgcHJpbnQgY29tbWVudCwgJDIsIGNlbmQgPm91dAotICAgcHJpbnQgY29tbWVudCwgIk1hY2hpbmUgZ2VuZXJhdGVkIGZpbGU6IERPIE5PVCBFRElUIiwgY2VuZCA+b3V0Ci0gICBpZiAoTkYgPj0gMykKLSAgICAgIHByaW50IGNvbW1lbnQsICJEZXJpdmVkIGZyb206IiwgJDMsIGNlbmQgPm91dAotICAgcHJvdGVjdCA9ICQ0Ci0gICBpZiAocHJvdGVjdCAhPSAiIikgewotICAgICAgcHJpbnQgc3RhcnQgIiNpZm5kZWYiLCBwcm90ZWN0IGVuZCA+b3V0Ci0gICAgICBwcmludCBzdGFydCAiI2RlZmluZSIsIHByb3RlY3QgZW5kID5vdXQKLSAgIH0KLSAgIG5leHQKLX0KLQotIyBvcHRpb24gTkFNRSAoIChyZXF1aXJlc3xlbmFibGVzfGlmKSBOQU1FKiB8IG9uIHwgb2ZmIHwgZGlzYWJsZWQgfAotIyAgICAgICAgICAgICAgICBzZXRzIFNFVFRJTkcgVkFMVUUrICkqCi0jICAgICAKLSMgICBEZWNsYXJlcyBhbiBvcHRpb24gJ05BTUUnIGFuZCBkZXNjcmliZXMgaXRzIGRlZmF1bHQgc2V0dGluZyAoZGlzYWJsZWQpCi0jICAgYW5kIGl0cyByZWxhdGlvbnNoaXAgdG8gb3RoZXIgb3B0aW9ucy4gIFRoZSBvcHRpb24gaXMgZGlzYWJsZWQKLSMgICB1bmxlc3MgKmFsbCogdGhlIG9wdGlvbnMgbGlzdGVkIGFmdGVyICdyZXF1aXJlcycgYXJlIHNldCBhbmQgYXQKLSMgICBsZWFzdCBvbmUgb2YgdGhlIG9wdGlvbnMgbGlzdGVkIGFmdGVyICdpZicgaXMgc2V0LiAgSWYgdGhlCi0jICAgb3B0aW9uIGlzIHNldCB0aGVuIGl0IHR1cm5zIG9uIGFsbCB0aGUgb3B0aW9ucyBsaXN0ZWQgYWZ0ZXIgJ2VuYWJsZXMnLgotIwotIyAgIE5vdGUgdGhhdCAiZW5hYmxlcyIgdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGUgcmVxdWlyZWQvaWYvZGlzYWJsZWQvb2ZmCi0jICAgc2V0dGluZyBvZiB0aGUgdGFyZ2V0IG9wdGlvbi4KLSMKLSMgICBUaGUgZGVmaW5pdGlvbiBmaWxlIG1heSBsaXN0IGFuIG9wdGlvbiBhcyAnZGlzYWJsZWQnOiBvZmYgYnkgZGVmYXVsdCwKLSMgICBvdGhlcndpc2UgdGhlIG9wdGlvbiBpcyBlbmFibGVkOiBvbiBieSBkZWZhdWx0LiAgQSBsYXRlciAoYW5kIGl0IG11c3QKLSMgICBiZSBsYXRlcikgZW50cnkgbWF5IHR1cm4gYW4gb3B0aW9uIG9uIG9yIG9mZiBleHBsaWNpdGx5LgotCi0kMSA9PSAib3B0aW9uIiAmJiBORiA+PSAyewotICAgb3B0ID0gJDIKLSAgIHN1YigvLCQvLCIiLG9wdCkKLSAgIG9ub2ZmID0gb3B0aW9uW29wdF0gICMgcmVjb3JkcyBjdXJyZW50IChhbmQgdGhlIGRlZmF1bHQgaXMgIiIsIGVuYWJsZWQpCi0gICBrZXkgPSAiIgotICAgaXN0YXJ0ID0gMwotICAgZG8gewotICAgICAgaWYgKGlzdGFydCA9PSAxKSB7ICAgICAjIGNvbnRpbnVhdGlvbiBsaW5lCi0gICAgICAgICB2YWwgPSBnZXRsaW5lCi0KLSAgICAgICAgIGlmICh2YWwgIT0gMSkgeyAjIGVycm9yIHJlYWRpbmcgaXQKLSAgICAgICAgICAgIGlmICh2YWwgPT0gMCkKLSAgICAgICAgICAgICAgIHByaW50ICJvcHRpb24iLCBvcHQgIjogRVJST1I6IG1pc3NpbmcgY29udGludWF0aW9uIGxpbmUiCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwcmludCAib3B0aW9uIiwgb3B0ICI6IEVSUk9SOiBlcnJvciByZWFkaW5nIGNvbnRpbnVhdGlvbiBsaW5lIgotCi0gICAgICAgICAgICAjIFRoaXMgaXMgYSBoYXJkIGVycm9yCi0gICAgICAgICAgICBlcnIgPSAxICMgcHJldmVudCBFTkR7fSBydW5uaW5nCi0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChpPWlzdGFydDsgaTw9TkY7ICsraSkgewotICAgICAgICAgdmFsPSQoaSkKLSAgICAgICAgIHN1YigvLCQvLCIiLHZhbCkKLSAgICAgICAgIGlmICh2YWwgPT0gIm9uIiB8fCB2YWwgPT0gIm9mZiIgfHwgdmFsID09ICJkaXNhYmxlZCIgfHwgdmFsID09ImVuYWJsZWQiKSB7Ci0gICAgICAgICAgICBrZXkgPSAiIgotICAgICAgICAgICAgaWYgKG9ub2ZmICE9IHZhbCkgewotICAgICAgICAgICAgICAgIyBvbiBvciBvZmYgY2FuIHphcCBkaXNhYmxlZCBvciBlbmFibGVkOgotICAgICAgICAgICAgICAgaWYgKG9ub2ZmID09ICIiIHx8IChvbm9mZiA9PSAiZGlzYWJsZWQiIHx8IG9ub2ZmID09ICJlbmFibGVkIikgJiYKLSAgICAgICAgICAgICAgICAgICAodmFsID09ICJvbiIgfHwgdmFsID09ICJvZmYiKSkgewotICAgICAgICAgICAgICAgICAgIyBJdCdzIGVhc3kgdG8gbWlzLXNwZWxsIHRoZSBvcHRpb24gd2hlbiB0dXJuaW5nIGl0Ci0gICAgICAgICAgICAgICAgICAjIG9uIG9yIG9mZiwgc28gd2FybiBhYm91dCBpdCBoZXJlOgotICAgICAgICAgICAgICAgICAgaWYgKG9ub2ZmID09ICIiICYmICh2YWwgPT0gIm9uIiB8fCB2YWwgPT0gIm9mZiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBwcmludCAib3B0aW9uIiwgb3B0ICI6IEVSUk9SOiB0dXJuaW5nIHVucmVjb2duaXplZCBvcHRpb24iLCB2YWwKLSAgICAgICAgICAgICAgICAgICAgICMgRm9yIHRoZSBtb21lbnQgZXJyb3Igb3V0IC0gaXQgaXMgc2FmZXIKLSAgICAgICAgICAgICAgICAgICAgIGVyciA9IDEgIyBwcmV2ZW50IEVORHt9IHJ1bm5pbmcKLSAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgb25vZmYgPSB2YWwKLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAjIFByaW50IGEgbWVzc2FnZSwgb3RoZXJ3aXNlIHRoZSBlcnJvcgotICAgICAgICAgICAgICAgICAgIyBiZWxvdyBpcyBpbmNvbXByZWhlbnNpYmxlCi0gICAgICAgICAgICAgICAgICBwcmludCAib3B0aW9uIiwgb3B0ICI6IGN1cnJlbnRseSIsIG9ub2ZmICI6IGF0dGVtcHQgdG8gdHVybiIsIHZhbAotICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gZWxzZSBpZiAodmFsID09ICJyZXF1aXJlcyIgfHwgdmFsID09ICJpZiIgfHwgdmFsID09ICJlbmFibGVzIiB8fCB2YWwgPT0ic2V0cyIpIHsKLSAgICAgICAgICAgIGtleSA9IHZhbAotICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gInJlcXVpcmVzIikgewotICAgICAgICAgICAgcmVxdWlyZXNbb3B0XSA9IHJlcXVpcmVzW29wdF0gIiAiIHZhbAotICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gImlmIikgewotICAgICAgICAgICAgaWZmc1tvcHRdID0gaWZmc1tvcHRdICIgIiB2YWwKLSAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09ICJlbmFibGVzIikgewotICAgICAgICAgICAgZW5hYmxlZGJ5W3ZhbF0gPSBlbmFibGVkYnlbdmFsXSAiICIgb3B0Ci0gICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAic2V0cyIpIHsKLSAgICAgICAgICAgIHNldHNbb3B0XSA9IHNldHNbb3B0XSAiICIgdmFsCi0gICAgICAgICAgICBrZXkgPSAic2V0dmFsIgotICAgICAgICAgICAgc2V0ID0gdmFsCi0gICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAic2V0dmFsIikgewotICAgICAgICAgICAgc2V0dmFsW29wdCAiICIgc2V0XSA9IHNldHZhbFtvcHQgIiAiIHNldF0gIiAiIHZhbAotICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBicmVhayAjIGJhZCBsaW5lIGZvcm1hdAotICAgICAgfQotCi0gICAgICBpc3RhcnQgPSAxCi0gICB9IHdoaWxlIChpID4gTkYgJiYgJDAgfiAvLCQvKQotCi0gICBpZiAoaSA+IE5GKSB7Ci0gICAgICAjIFNldCB0aGUgb3B0aW9uLCBkZWZhdWx0aW5nIHRvICdlbmFibGVkJwotICAgICAgaWYgKG9ub2ZmID09ICIiKSBvbm9mZiA9ICJlbmFibGVkIgotICAgICAgb3B0aW9uW29wdF0gPSBvbm9mZgotICAgICAgbmV4dAotICAgfQotICAgIyBFbHNlIGZhbGwgdGhyb3VnaCB0byB0aGUgZXJyb3IgaGFuZGxlcgotfQotCi0jIGNodW5rIE5BTUUgW3JlcXVpcmVzIE9QVF0gW2VuYWJsZXMgTElTVF0gW29ufG9mZnxkaXNhYmxlZF0KLSMgICBFeHBhbmRzIHRvIHRoZSAnb3B0aW9uJyBzZXR0aW5ncyBhcHByb3ByaWF0ZSB0byB0aGUgcmVhZGluZyBhbmQKLSMgICB3cml0aW5nIG9mIGFuIGFuY2lsbGlhcnkgUE5HIGNodW5rICdOQU1FJzoKLSMKLSMgICBvcHRpb24gUkVBRF9OQU1FIHJlcXVpcmVzIFJFQURfQU5DSUxMQVJZX0NIVU5LUyBbUkVBRF9PUFRdCi0jICAgb3B0aW9uIFJFQURfTkFNRSBlbmFibGVzIE5BTUUgTElTVAotIyAgIFtvcHRpb24gUkVBRF9OQU1FIG9mZl0KLSMgICBvcHRpb24gV1JJVEVfTkFNRSByZXF1aXJlcyBXUklURV9BTkNJTExBUllfQ0hVTktTIFtXUklURV9PUFRdCi0jICAgb3B0aW9uIFdSSVRFX05BTUUgZW5hYmxlcyBOQU1FIExJU1QKLSMgICBbb3B0aW9uIFdSSVRFX05BTUUgb2ZmXQotCi1wcmUgIT0gMCAmJiAkMSA9PSAiY2h1bmsiICYmIE5GID49IDJ7Ci0gICAjICdjaHVuaycgaXMgaGFuZGxlZCBvbiB0aGUgZmlyc3QgcGFzcyBieSB3cml0aW5nIGFwcHJvcHJpYXRlCi0gICAjICdvcHRpb24nIGxpbmVzIGludG8gdGhlIGludGVybWVkaWF0ZSBmaWxlLgotICAgb3B0ID0gJDIKLSAgIHN1YigvLCQvLCIiLG9wdCkKLSAgIG9ub2ZmID0gIiIKLSAgIHJlcXJlYWQgPSAiIgotICAgcmVxd3JpdGUgPSAiIgotICAgZW5hYmxlcyA9ICIiCi0gICByZXEgPSAwCi0gICBpc3RhcnQgPSAzCi0gICBkbyB7Ci0gICAgICBpZiAoaXN0YXJ0ID09IDEpIHsgICAgICMgY29udGludWF0aW9uIGxpbmUKLSAgICAgICAgIHZhbCA9IGdldGxpbmUKLQotICAgICAgICAgaWYgKHZhbCAhPSAxKSB7ICMgZXJyb3IgcmVhZGluZyBpdAotICAgICAgICAgICAgaWYgKHZhbCA9PSAwKQotICAgICAgICAgICAgICAgcHJpbnQgImNodW5rIiwgb3B0ICI6IEVSUk9SOiBtaXNzaW5nIGNvbnRpbnVhdGlvbiBsaW5lIgotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgcHJpbnQgImNodW5rIiwgb3B0ICI6IEVSUk9SOiBlcnJvciByZWFkaW5nIGNvbnRpbnVhdGlvbiBsaW5lIgotCi0gICAgICAgICAgICAjIFRoaXMgaXMgYSBoYXJkIGVycm9yCi0gICAgICAgICAgICBlcnIgPSAxICMgcHJldmVudCBFTkR7fSBydW5uaW5nCi0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgIyByZWFkIHRoZSBrZXl3b3Jkcy9hZGRpdGlvbmFsIE9QVFMKLSAgICAgIGZvciAoaT1pc3RhcnQ7IGk8PU5GOyArK2kpIHsKLSAgICAgICAgIHZhbCA9ICQoaSkKLSAgICAgICAgIHN1YigvLCQvLCIiLHZhbCkKLSAgICAgICAgIGlmICh2YWwgPT0gIm9uIiB8fCB2YWwgPT0gIm9mZiIgfHwgdmFsID09ICJkaXNhYmxlZCIpIHsKLSAgICAgICAgICAgIGlmIChvbm9mZiAhPSB2YWwpIHsKLSAgICAgICAgICAgICAgIGlmIChvbm9mZiA9PSAiIikKLSAgICAgICAgICAgICAgICAgIG9ub2ZmID0gdmFsCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBicmVhayAjIG9uL29mZiBjb25mbGljdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVxID0gMAotICAgICAgICAgfSBlbHNlIGlmICh2YWwgPT0gInJlcXVpcmVzIikKLSAgICAgICAgICAgIHJlcSA9IDEKLSAgICAgICAgIGVsc2UgaWYgKHZhbCA9PSAiZW5hYmxlcyIpCi0gICAgICAgICAgICByZXEgPSAyCi0gICAgICAgICBlbHNlIGlmIChyZXEgPT0gMSl7Ci0gICAgICAgICAgICByZXFyZWFkID0gcmVxcmVhZCAiIFJFQURfIiB2YWwKLSAgICAgICAgICAgIHJlcXdyaXRlID0gcmVxd3JpdGUgIiBXUklURV8iIHZhbAotICAgICAgICAgfSBlbHNlIGlmIChyZXEgPT0gMikKLSAgICAgICAgICAgIGVuYWJsZXMgPSBlbmFibGVzICIgIiB2YWwKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJyZWFrICMgYmFkIGxpbmU6IGhhbmRsZWQgYmVsb3cKLSAgICAgIH0KLQotICAgICAgaXN0YXJ0ID0gMQotICAgfSB3aGlsZSAoaSA+IE5GICYmICQwIH4gLywkLykKLQotICAgaWYgKGkgPiBORikgewotICAgICAgIyBPdXRwdXQgbmV3ICdvcHRpb24nIGxpbmVzIHRvIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSAob3V0KQotICAgICAgcHJpbnQgIm9wdGlvbiBSRUFEXyIgb3B0LCAicmVxdWlyZXMgUkVBRF9BTkNJTExBUllfQ0hVTktTIiByZXFyZWFkLCAiZW5hYmxlcyIsIG9wdCBlbmFibGVzICwgb25vZmYgPm91dAotICAgICAgcHJpbnQgIm9wdGlvbiBXUklURV8iIG9wdCwgInJlcXVpcmVzIFdSSVRFX0FOQ0lMTEFSWV9DSFVOS1MiIHJlcXdyaXRlLCAiZW5hYmxlcyIsIG9wdCBlbmFibGVzLCBvbm9mZiA+b3V0Ci0gICAgICBuZXh0Ci0gICB9Ci0gICAjIEVsc2UgaGl0IHRoZSBlcnJvciBoYW5kbGVyIGJlbG93IC0gYmFkIGxpbmUgZm9ybWF0IQotfQotCi0jIHNldHRpbmcgTUFDUk8gKCByZXF1aXJlcyBNQUNSTyogKSogWyBkZWZhdWx0IFZBTFVFIF0KLSMgICBCZWhhdmVzIGluIGEgc2ltaWxhciB3YXkgdG8gJ29wdGlvbicgd2l0aG91dCBsb29raW5nIGZvciBOT18gb3IKLSMgICBfU1VQUE9SVEVEOyB0aGUgbWFjcm8gaXMgZW5hYmxlZCBpZiBpdCBpcyBkZWZpbmVkIHNvIGxvbmcgYXMgYWxsCi0jICAgdGhlICdyZXF1aXJlcycgbWFjcm9zIGFyZSBhbHNvIGRlZmluZWQuICBUaGUgZGVmaW5pdGlvbnMgbWF5IGJlCi0jICAgZW1wdHksIGFuIGVycm9yIHdpbGwgYmUgaXNzdWVkIGlmIHRoZSAncmVxdWlyZXMnIG1hY3JvcyBhcmUKLSMgICAqbm90KiBkZWZpbmVkLiAgSWYgZ2l2ZW4gdGhlICdkZWZhdWx0JyB2YWx1ZSBpcyB1c2VkIGlmIHRoZQotIyAgIG1hY3JvIGlzIG5vdCBkZWZpbmVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSByZS10b2tlbmlzZWQuCi0jICAgKEJUVzogdGhpcyBpcyBzb21ld2hhdCByZXN0cmljdGl2ZSwgaXQgbWFpbmx5IGV4aXN0cyBmb3IgdGhlCi0jICAgc3VwcG9ydCBvZiBub24tc3RhbmRhcmQgY29uZmlndXJhdGlvbnMgYW5kIG51bWVyaWMgcGFyYW1ldGVycywKLSMgICBzZWUgdGhlIHVzZXMgaW4gc2NyaXB0cy9vcHRpb25zLmRhdAotCi0kMSA9PSAic2V0dGluZyIgJiYgKE5GID09IDIgfHwgTkYgPj0gMyAmJiAoJDMgPT0gInJlcXVpcmVzIiB8fCAkMyA9PSAiZGVmYXVsdCIpKXsKLSAgIHJlcXMgPSAiIgotICAgZGVmbHQgPSAiIgotICAgaXNkZWYgPSAwCi0gICBrZXkgPSAiIgotICAgZm9yIChpPTM7IGk8PU5GOyArK2kpCi0gICAgICBpZiAoJChpKSA9PSAicmVxdWlyZXMiIHx8ICQoaSkgPT0gImRlZmF1bHQiKSB7Ci0gICAgICAgICBrZXkgPSAkKGkpCi0gICAgICAgICBpZiAoa2V5ID09ICJkZWZhdWx0IikgaXNkZWYgPSAxCi0gICAgICB9IGVsc2UgaWYgKGtleSA9PSAicmVxdWlyZXMiKQotICAgICAgICAgcmVxcyA9IHJlcXMgIiAiICQoaSkKLSAgICAgIGVsc2UgaWYgKGtleSA9PSAiZGVmYXVsdCIpCi0gICAgICAgICBkZWZsdCA9IGRlZmx0ICIgIiAkKGkpCi0gICAgICBlbHNlCi0gICAgICAgICBicmVhayAjIEZvcm1hdCBlcnJvciwgaGFuZGxlZCBiZWxvdwotCi0gICBzZXR0aW5nWyQyXSA9IHJlcXMKLSAgICMgTk9URTogdGhpcyBvdmVyd3JpdGVzIGEgcHJldmlvdXMgdmFsdWUgc2lsZW50bHkKLSAgIGlmIChpc2RlZiAmJiBkZWZsdCA9PSAiIikKLSAgICAgIGRlZmx0ID0gIiAiICMgYXMgYSBmbGFnIHRvIGZvcmNlIG91dHB1dAotICAgZGVmYXVsdHNbJDJdID0gZGVmbHQKLSAgIG5leHQKLX0KLQotIyBUaGUgb3JkZXIgb2YgdGhlIGRlcGVuZGVuY3kgbGluZXMgKG9wdGlvbiwgY2h1bmssIHNldHRpbmcpIGlzIGlycmVsZXZhbnQKLSMgLSB0aGUgJ2VuYWJsZXMnLCAncmVxdWlyZXMnIGFuZCAnaWYnIHNldHRpbmdzIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUKLSMgdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhlIG91dHB1dCBhbmQgdGhlIGZpbmFsIHZhbHVlcyBpbiBwbmdsaWJjb25mLmggYXJlCi0jIG5vdCBvcmRlciBkZXBlbmRlbnQuICAncmVxdWlyZXMnIGFuZCAnaWYnIGVudHJpZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIKLSMgJ2VuYWJsZXMnIGZyb20gb3RoZXIgb3B0aW9uczsgaWYgYW4gb3B0aW9uIHJlcXVpcmVzIGFub3RoZXIgb3B0aW9uIGl0Ci0jIHdvbid0IGJlIHNldCByZWdhcmRsZXNzIG9mIGFueSBvcHRpb25zIHRoYXQgZW5hYmxlIGl0IHVubGVzcyB0aGUgb3RoZXIKLSMgb3B0aW9uIGlzIGFsc28gZW5hYmxlZC4KLSMKLSMgU2ltaWxhcmx5ICdlbmFibGVzJyB0cnVtcHMgYSBOT18gZGVmaW5pdGlvbiBpbiBDRkxBR1Mgb3IgcG5ndXNyLmgKLSMKLSMgRm9yIHNpbXBsaWNpdHkgY3ljbGVzIGluIHRoZSBkZWZpbml0aW9ucyBhcmUgcmVnYXJkZWQgYXMgZXJyb3JzLAotIyBldmVuIGlmIHRoZXkgYXJlIG5vdCBhbWJpZ3VvdXMuCi0jIEEgZ2l2ZW4gTkFNRSBjYW4gYmUgc3BlY2lmaWVkIGluIGFzIG1hbnkgJ29wdGlvbicgbGluZXMgYXMgcmVxdWlyZWQsIHRoZQotIyBkZWZpbml0aW9ucyBhcmUgYWRkaXRpdmUuCi0KLSMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGVxdWl2YWxlbnQgbWFjcm9zIG1heSBiZSBsaXN0ZWQgdGh1czoKLSMKLSMgPSBbTk9fXU5BTUUgTUFDUk8KLSMgICBNYWtlcyAtRE1BQ1JPIGVxdWl2YWxlbnQgdG8gLURQTkdfTk9fTkFNRSBvciAtRFBOR19OQU1FX1NVUFBPUlRFRAotIyAgIGFzIGFwcHJvcHJpYXRlLgotIwotIyBUaGUgZGVmaW5pdGlvbiBpcyBpbmplY3RlZCBpbnRvIHRoZSBDIGNvbXBpbGVyIGlucHV0IHdoZW4gZW5jb3VudGVyZWQKLSMgaW4gdGhlIHNlY29uZCBwYXNzIChzbyBhbGwgdGhlc2UgZGVmaW5pdGlvbnMgYXBwZWFyICphZnRlciogdGhlIEAKLSMgbGluZXMhKQotIwotIyAnTkFNRScgaXMgYXMgYWJvdmUsIGJ1dCAnTUFDUk8nIGlzIHRoZSBmdWxsIHRleHQgb2YgdGhlIGVxdWl2YWxlbnQKLSMgb2xkLCBkZXByZWNhdGVkLCBtYWNyby4KLQotJDEgPT0gIj0iICYmIE5GID09IDN7Ci0gICBwcmludCAiI2lmZGVmIFBOR18iICQzID5vdXQKLSAgIGlmICgkMiB+IC9eTk9fLykKLSAgICAgIHByaW50ICIjICAgZGVmaW5lIFBOR18iICQyID5vdXQKLSAgIGVsc2UKLSAgICAgIHByaW50ICIjICAgZGVmaW5lIFBOR18iICQyICJfU1VQUE9SVEVEIiA+b3V0Ci0gICBwcmludCAiI2VuZGlmIiA+b3V0Ci0gICBuZXh0Ci19Ci0KLSMgTGluZXMgbWF5IGJlIGluamVjdGVkIGludG8gdGhlIEMgY29tcGlsZXIgaW5wdXQgYnkgcHJlY2VkaW5nIHRoZW0KLSMgd2l0aCBhbiAiQCIgY2hhcmFjdGVyLiAgVGhlIGxpbmUgaXMgY29waWVkIHdpdGgganVzdCB0aGUgbGVhZGluZwotIyBAIHJlbW92ZWQuCi0KLSQxIH4gL15AL3sKLSAgICMgc3ViKC9eWyAJXSpALywgIiIpCi0gICAkMSA9IHN1YnN0cigkMSwgMikKLSAgIHByaW50ID5vdXQKLSAgIG5leHQKLX0KLQotIyBDaGVjayBmb3IgdW5yZWNvZ25pemVkIGxpbmVzLCBiZWNhdXNlIG9mIHRoZSBwcmVwcm9jZXNzaW5nIGNodW5rCi0jIGZvcm1hdCBlcnJvcnMgd2lsbCBiZSBkZXRlY3RlZCBvbiB0aGUgZmlyc3QgcGFzcyBpbmRlcGVuZGVudCBvZgotIyBhbnkgb3RoZXIgZm9ybWF0IGVycm9ycy4KLXsKLSAgIHByaW50ICJvcHRpb25zLmF3azogYmFkIGxpbmUgKCIgTlIgIik6IiwgJDAKLSAgIGVyciA9IDEgIyBwcmV2ZW50IEVORHt9IHJ1bm5pbmcKLSAgIGV4aXQgMQotfQotCi0jIEZvciBjaGVja2luZyBwdXJwb3NlcyBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggIm9rXyIgb3IgImZhaWxfIiBhcmUKLSMgbm90IG91dHB1dCB0byBwbmdsaWJjb25mLmggYW5kIG11c3QgYmUgZWl0aGVyIGVuYWJsZWQgb3IgZGlzYWJsZWQKLSMgcmVzcGVjdGl2ZWx5IGZvciB0aGUgYnVpbGQgdG8gc3VjY2VlZC4gIFRoaXMgYWxsb3dzIGludGVyZGVwZW5kZW5jaWVzCi0jIGJldHdlZW4gb3B0aW9ucyBvZiB0aGUgZm9ybSAiYXQgbGVhc3Qgb25lIG9mIiBvciAiYXQgbW9zdCBvbmUgb2YiCi0jIHRvIGJlIGNoZWNrZWQuICBGb3IgZXhhbXBsZToKLSMKLSMgb3B0aW9uIEZMT0FUSU5HX1BPSU5UIGVuYWJsZXMgb2tfbWF0aAotIyBvcHRpb24gRklYRURfUE9JTlQgZW5hYmxlcyBva19tYXRoCi0jICAgVGhpcyBlbnN1cmVzIHRoYXQgYXQgbGVhc3Qgb25lIG9mIEZMT0FUSU5HX1BPSU5UIGFuZCBGSVhFRF9QT0lOVAotIyAgIG11c3QgYmUgc2V0IGZvciB0aGUgYnVpbGQgdG8gc3VjY2VlZC4KLSMKLSMgb3B0aW9uIGZhaWxfbWF0aCByZXF1aXJlcyBGTE9BVElOR19QT0lOVCBGSVhFRF9QT0lOVAotIyAgIFRoaXMgbWVhbnMgdGhlIGJ1aWxkIHdpbGwgZmFpbCBpZiAqYm90aCogRkxPQVRJTkdfUE9JTlQgYW5kCi0jICAgRklYRURfUE9JTlQgYXJlIHNldCAodGhpcyBpcyBhbiBleGFtcGxlOyBpbiBmYWN0IGJvdGggYXJlIGFsbG93ZWQuKQotIwotIyBJZiBhbGwgdGhlc2Ugb3B0aW9ucyB3ZXJlIGdpdmVuIHRoZSBidWlsZCB3b3VsZCByZXF1aXJlIGV4YWN0bHkgb25lCi0jIG9mIHRoZSBuYW1lcyB0byBiZSBlbmFibGVkLgotCi1FTkR7Ci0gICAjIEVORHt9IGdldHMgcnVuIG9uIGFuIGV4aXQgKGEgdHJhZGl0aW9uYWwgYXdrIGZlYXR1cmUpCi0gICBpZiAoZXJyKSBleGl0IDEKLQotICAgaWYgKHByZSkgewotICAgICAgIyBSZWNvcmQgdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSB2YXJpYWJsZXMKLSAgICAgIHByaW50ICJkZWIgPSIsIGRlYiA+b3V0Ci0gICAgICBpZiAoZXZlcnl0aGluZyAhPSAiIikgewotICAgICAgICAgcHJpbnQgImV2ZXJ5dGhpbmcgPSIsIGV2ZXJ5dGhpbmcgPm91dAotICAgICAgfQotICAgICAgcHJpbnQgImxvZ3Vuc3VwcG9ydGVkID0iLCBsb2d1bnN1cHBvcnRlZCA+b3V0Ci0gICAgICBleGl0IDAKLSAgIH0KLQotICAgIyBEbyB0aGUgb3B0aW9ucyBmaXJzdCAoYWxsb3dpbmcgb3B0aW9ucyB0byBzZXQgc2V0dGluZ3MpLiAgVGhlIGRlcGVuZGVuY3kKLSAgICMgdHJlZSBpcyB0aHVzOgotICAgIwotICAgIyAgIG5hbWUgICAgID4gICAgIG5hbWUKLSAgICMgICBuYW1lIHJlcXVpcmVzICBuYW1lCi0gICAjICAgbmFtZSBpZiAgICAgICAgbmFtZQotICAgIyAgIG5hbWUgZW5hYmxlZGJ5IG5hbWUKLSAgICMKLSAgICMgRmlyc3QgYnVpbGQgYSBsaXN0ICd0cmVlJyBieSBvcHRpb24gb2YgYWxsIHRoZSB0aGluZ3Mgb24gd2hpY2gKLSAgICMgaXQgZGVwZW5kcy4KLSAgIHByaW50ICIiID5vdXQKLSAgIHByaW50ICIvKiBPUFRJT05TICovIiA+b3V0Ci0gICBwcmludCBjb21tZW50LCAib3B0aW9ucyIsIGNlbmQgPm91dAotICAgZm9yIChvcHQgaW4gZW5hYmxlZGJ5KSB0cmVlW29wdF0gPSAxICAjIG1heSBub3QgYmUgZXhwbGljaXQgb3B0aW9ucwotICAgZm9yIChvcHQgaW4gb3B0aW9uKSBpZiAob3B0ICE9ICIiKSB7Ci0gICAgICBvID0gb3B0aW9uW29wdF0KLSAgICAgICMgb3B0aW9uIHNob3VsZCBhbHdheXMgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCi0gICAgICBpZiAobyAhPSAib24iICYmIG8gIT0gIm9mZiIgJiYgbyAhPSAiZGlzYWJsZWQiICYmIG8gIT0gImVuYWJsZWQiKSB7Ci0gICAgICAgICBwcmludCAiaW50ZXJuYWwgb3B0aW9uIGVycm9yICgiIG8gIikiCi0gICAgICAgICBleGl0IDEKLSAgICAgIH0KLSAgICAgIHRyZWVbb3B0XSA9ICIiICAgIyBzbyB1bmxpc3RlZCBvcHRpb25zIG1hcmtlZAotICAgfQotICAgZm9yIChvcHQgaW4gdHJlZSkgaWYgKG9wdCAhPSAiIikgewotICAgICAgaWYgKHRyZWVbb3B0XSA9PSAxKSB7Ci0gICAgICAgICB0cmVlW29wdF0gPSAiIgotICAgICAgICAgaWYgKG9wdGlvbltvcHRdICE9ICIiKSB7Ci0gICAgICAgICAgICBwcmludCAiaW50ZXJuYWwgZXJyb3IgKDEpIgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICB9Ci0gICAgICAgICAjIE1hY3JvcyBvbmx5IGxpc3RlZCBpbiAnZW5hYmxlcycgcmVtYWluIG9mZiB1bmxlc3MKLSAgICAgICAgICMgb25lIG9mIHRoZSBlbmFibGluZyBtYWNyb3MgaXMgb24uCi0gICAgICAgICBvcHRpb25bb3B0XSA9ICJkaXNhYmxlZCIKLSAgICAgIH0KLQotICAgICAgc3BsaXQoIiIsIGxpc3QpICMgY2xlYXIgJ2xpc3QnCi0gICAgICAjIE5vdyBhZGQgZXZlcnkgcmVxdWlyZXMsIGlmZnMgb3IgZW5hYmxlZGJ5IGVudHJ5IHRvICdsaXN0JwotICAgICAgIyBzbyB0aGF0IHdlIGNhbiBhZGQgYSB1bmlxdWUgbGlzdCBvZiByZXF1aXJlbWVudHMgdG8gdHJlZVtpXQotICAgICAgc3BsaXQocmVxdWlyZXNbb3B0XSBpZmZzW29wdF0gZW5hYmxlZGJ5W29wdF0sIHIpCi0gICAgICBmb3IgKGkgaW4gcikgbGlzdFtyW2ldXSA9IDEKLSAgICAgIGZvciAoaSBpbiBsaXN0KSB0cmVlW29wdF0gPSB0cmVlW29wdF0gIiAiIGkKLSAgIH0KLQotICAgIyBwcmludCB0aGUgdHJlZSBmb3IgZXh0cmVtZSBkZWJ1Z2dpbmcKLSAgIGlmIChkZWIgPiAyKSBmb3IgKGkgaW4gdHJlZSkgaWYgKGkgIT0gIiIpIHByaW50IGksICJkZXBlbmRzLW9uIiB0cmVlW2ldCi0KLSAgICMgT2ssIG5vdyBjaGVjayBhbGwgb3B0aW9ucyBtYXJrZWQgZXhwbGljaXRseSAnb24nIG9yICdvZmYnOgotICAgIwotICAgIyBJZiBhbiBvcHRpb25bb3B0XSBpcyAnb24nIHRoZW4gdHVybiBvbiBhbGwgcmVxdWlyZXNbb3B0XQotICAgIyBJZiBhbiBvcHRpb25bb3B0XSBpcyAnb2ZmJyB0aGVuIHR1cm4gb2ZmIGFsbCBlbmFibGVkYnlbb3B0XQotICAgIwotICAgIyBFcnJvciBvdXQgaWYgd2UgaGF2ZSB0byB0dXJuICdvbicgdG8gYW4gJ29mZicgb3B0aW9uIG9yIHZpY2UgdmVyc2EuCi0gICBucGVuZGluZyA9IDAKLSAgIGZvciAob3B0IGluIG9wdGlvbikgaWYgKG9wdCAhPSAiIikgewotICAgICAgaWYgKG9wdGlvbltvcHRdID09ICJvbiIgfHwgb3B0aW9uW29wdF0gPT0gIm9mZiIpIHsKLSAgICAgICAgIHBlbmRpbmdbKytucGVuZGluZ10gPSBvcHQKLSAgICAgIH0KLSAgIH0KLQotICAgZXJyID0gMCAjIHNldCBvbiBlcnJvcgotICAgd2hpbGUgKG5wZW5kaW5nID4gMCkgewotICAgICAgb3B0ID0gcGVuZGluZ1tucGVuZGluZy0tXQotICAgICAgaWYgKG9wdGlvbltvcHRdID09ICJvbiIpIHsKLSAgICAgICAgIG5yZXFzID0gc3BsaXQocmVxdWlyZXNbb3B0XSwgcikKLSAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uW3Jbal1dID09ICJvZmYiKSB7Ci0gICAgICAgICAgICAgICBwcmludCAib3B0aW9uIiwgb3B0LCAidHVybmVkIG9uLCBidXQgcmVxdWlyZW1lbnQiLCByW2pdLCAiaXMgdHVybmVkIG9mZiIKLSAgICAgICAgICAgICAgIGVyciA9IDEKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uW3Jbal1dICE9ICJvbiIpIHsKLSAgICAgICAgICAgICAgIG9wdGlvbltyW2pdXSA9ICJvbiIKLSAgICAgICAgICAgICAgIHBlbmRpbmdbKytucGVuZGluZ10gPSByW2pdCi0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgaWYgKG9wdGlvbltvcHRdICE9ICJvZmYiKSB7Ci0gICAgICAgICAgICBwcmludCAiaW50ZXJuYWwgZXJyb3IgKDIpIgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICB9Ci0gICAgICAgICBucmVxcyA9IHNwbGl0KGVuYWJsZWRieVtvcHRdLCByKQotICAgICAgICAgZm9yIChqPTE7IGo8PW5yZXFzOyArK2opIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25bcltqXV0gPT0gIm9uIikgewotICAgICAgICAgICAgICAgcHJpbnQgIm9wdGlvbiIsIG9wdCwgInR1cm5lZCBvZmYsIGJ1dCBlbmFibGVkIGJ5IiwgcltqXSwgIndoaWNoIGlzIHR1cm5lZCBvbiIKLSAgICAgICAgICAgICAgIGVyciA9IDEKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uW3Jbal1dICE9ICJvZmYiKSB7Ci0gICAgICAgICAgICAgICBvcHRpb25bcltqXV0gPSAib2ZmIgotICAgICAgICAgICAgICAgcGVuZGluZ1srK25wZW5kaW5nXSA9IHJbal0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLSAgIGlmIChlcnIpIGV4aXQgMQotCi0gICAjIFNvcnQgb3B0aW9uczoKLSAgIHByaW50ICJQTkdfREZOX1NUQVJUX1NPUlQgMiIgPm91dAotCi0gICAjIG9wdGlvbltpXSBpcyBub3cgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYWxsIHRoZSB0b2tlbnMgd2UgbWF5Ci0gICAjIG5lZWQgdG8gb3V0cHV0LCBnbyB0aHJvdWdoIGl0IGFzIGFib3ZlLCBkZXB0aCBmaXJzdC4KLSAgIGZpbmlzaGVkID0gMAotICAgd2hpbGUgKCFmaW5pc2hlZCkgewotICAgICAgZmluaXNoZWQgPSAxCi0gICAgICBtb3ZlbWVudCA9IDAgIyBkb25lIG5vdGhpbmcKLSAgICAgIGZvciAoaSBpbiBvcHRpb24pIGlmICghZG9uZVtpXSkgewotICAgICAgICAgbnJlcXMgPSBzcGxpdCh0cmVlW2ldLCByKQotICAgICAgICAgaWYgKG5yZXFzID4gMCkgewotICAgICAgICAgICAgZm9yIChqPTE7IGo8PW5yZXFzOyArK2opIGlmICghZG9uZVtyW2pdXSkgewotICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqPD1ucmVxcykgewotICAgICAgICAgICAgICAgZmluaXNoZWQgPSAwCi0gICAgICAgICAgICAgICBjb250aW51ZSAgIyBuZXh0IG9wdGlvbgotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICAjIEFsbCB0aGUgcmVxdWlyZW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIG91dHB1dAotICAgICAgICAgIyB0aGlzIG9wdGlvbi4gIEFuIG9wdGlvbiBpcyBfU1VQUE9SVEVEIGlmOgotICAgICAgICAgIwotICAgICAgICAgIyBhbGwgJ3JlcXVpcmVzJyBhcmUgX1NVUFBPUlRFRCBBTkQKLSAgICAgICAgICMgYXQgbGVhc3Qgb25lIG9mIHRoZSAnaWYnIG9wdGlvbnMgYXJlIF9TVVBQT1JURUQgQU5ECi0gICAgICAgICAjIEVJVEhFUjoKLSAgICAgICAgICMgICBUaGUgbmFtZSBpcyBfU1VQUE9SVEVEIChvbiB0aGUgY29tbWFuZCBsaW5lKQotICAgICAgICAgIyBPUjoKLSAgICAgICAgICMgICBhbiAnZW5hYmxlZGJ5JyBpcyBfU1VQUE9SVEVECi0gICAgICAgICAjIE9SOgotICAgICAgICAgIyAgIE5PX25hbWUgaXMgbm90IGRlZmluZWQgQU5ECi0gICAgICAgICAjICAgdGhlIG9wdGlvbiBpcyBub3QgZGlzYWJsZWQ7IGFuIG9wdGlvbiBpcyBkaXNhYmxlZCBpZjoKLSAgICAgICAgICMgICAgb3B0aW9uID09IG9mZgotICAgICAgICAgIyAgICBvcHRpb24gPT0gZGlzYWJsZWQgJiYgZXZlcnl0aGluZyAhPSBvbgotICAgICAgICAgIyAgICBvcHRpb24gPT0gIiIgJiYgZXZlcnl0aGluZyA9PSBvZmYKLSAgICAgICAgIGlmIChkZWIpIHByaW50ICJvcHRpb24iLCBpCi0gICAgICAgICBwcmludCAiIiA+b3V0Ci0gICAgICAgICBwcmludCAiLyogb3B0aW9uOiIsIGksIG9wdGlvbltpXSA+b3V0Ci0gICAgICAgICBwcmludCAiICogICByZXF1aXJlczogICIgcmVxdWlyZXNbaV0gPm91dAotICAgICAgICAgcHJpbnQgIiAqICAgaWY6ICAgICAgICAiIGlmZnNbaV0gPm91dAotICAgICAgICAgcHJpbnQgIiAqICAgZW5hYmxlZC1ieToiIGVuYWJsZWRieVtpXSA+b3V0Ci0gICAgICAgICBwcmludCAiICogICBzZXRzOiAgICAgICIgc2V0c1tpXSwgIiovIiA+b3V0Ci0gICAgICAgICBwcmludCAiI3VuZGVmIFBOR19vbiIgPm91dAotICAgICAgICAgcHJpbnQgIiNkZWZpbmUgUE5HX29uIDEiID5vdXQKLQotICAgICAgICAgIyByZXF1aXJlcwotICAgICAgICAgbnJlcXMgPSBzcGxpdChyZXF1aXJlc1tpXSwgcikKLSAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSB7Ci0gICAgICAgICAgICBwcmludCAiI2lmbmRlZiBQTkdfIiByW2pdICJfU1VQUE9SVEVEIiA+b3V0Ci0gICAgICAgICAgICBwcmludCAiIyAgIHVuZGVmIFBOR19vbiAvKiEiIHJbal0gIiovIiA+b3V0Ci0gICAgICAgICAgICAjIFRoaXMgZXJyb3IgYXBwZWFycyBpbiB0aGUgZmluYWwgb3V0cHV0IGlmIHNvbWV0aGluZwotICAgICAgICAgICAgIyB3YXMgc3dpdGNoZWQgJ29uJyBidXQgdGhlIHByb2Nlc3NpbmcgYWJvdmUgdG8gZm9yY2UKLSAgICAgICAgICAgICMgdGhlIHJlcXVpcmVzIGRpZCBub3Qgd29yawotICAgICAgICAgICAgaWYgKG9wdGlvbltpXSA9PSAib24iKSB7Ci0gICAgICAgICAgICAgICBwcmludCBlcnJvciwgaSwgInJlcXVpcmVzIiwgcltqXSBlbmQgPm91dAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnQgIiNlbmRpZiIgPm91dAotICAgICAgICAgfQotCi0gICAgICAgICAjIGlmCi0gICAgICAgICBoYXZlX2lmcyA9IDAKLSAgICAgICAgIG5yZXFzID0gc3BsaXQoaWZmc1tpXSwgcikKLSAgICAgICAgIHByaW50ICIjdW5kZWYgUE5HX25vX2lmIiA+b3V0Ci0gICAgICAgICBpZiAobnJlcXMgPiAwKSB7Ci0gICAgICAgICAgICBoYXZlX2lmcyA9IDEKLSAgICAgICAgICAgIHByaW50ICIvKiBpZiIgaWZmc1tpXSwgIiovIiA+b3V0Ci0gICAgICAgICAgICBwcmludCAiI2RlZmluZSBQTkdfbm9faWYgMSIgPm91dAotICAgICAgICAgICAgZm9yIChqPTE7IGo8PW5yZXFzOyArK2opIHsKLSAgICAgICAgICAgICAgIHByaW50ICIjaWZkZWYgUE5HXyIgcltqXSAiX1NVUFBPUlRFRCIgPm91dAotICAgICAgICAgICAgICAgcHJpbnQgIiMgICB1bmRlZiBQTkdfbm9faWYgLyoiIHJbal0gIiovIiA+b3V0Ci0gICAgICAgICAgICAgICBwcmludCAiI2VuZGlmIiA+b3V0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludCAiI2lmZGVmIFBOR19ub19pZiAvKm1pc3NpbmcgaWYqLyIgPm91dAotICAgICAgICAgICAgcHJpbnQgIiMgICB1bmRlZiBQTkdfb24iID5vdXQKLSAgICAgICAgICAgICMgVGhlcmUgaXMgbm8gY2hlY2tpbmcgYWJvdmUgZm9yIHRoaXMsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICMgZG9uJ3Qga25vdyB3aGljaCAnaWYnIHRvIGNob29zZSwgc28gd2hpbmUgYWJvdXQKLSAgICAgICAgICAgICMgaXQgaGVyZToKLSAgICAgICAgICAgIGlmIChvcHRpb25baV0gPT0gIm9uIikgewotICAgICAgICAgICAgICAgcHJpbnQgZXJyb3IsIGksICJuZWVkcyBvbmUgb2Y6IiwgaWZmc1tpXSBlbmQgPm91dAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnQgIiNlbmRpZiIgPm91dAotICAgICAgICAgfQotCi0gICAgICAgICBwcmludCAiI2lmZGVmIFBOR19vbiAvKnJlcXVpcmVzLCBpZiovIiA+b3V0Ci0gICAgICAgICAjIGVuYWJsZXMKLSAgICAgICAgIHByaW50ICIjICAgdW5kZWYgUE5HX25vdF9lbmFibGVkIiA+b3V0Ci0gICAgICAgICBwcmludCAiIyAgIGRlZmluZSBQTkdfbm90X2VuYWJsZWQgMSIgPm91dAotICAgICAgICAgcHJpbnQgIiAgIC8qIGVuYWJsZWQgYnkiIGVuYWJsZWRieVtpXSwgIiovIiA+b3V0Ci0gICAgICAgICBucmVxcyA9IHNwbGl0KGVuYWJsZWRieVtpXSwgcikKLSAgICAgICAgIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSB7Ci0gICAgICAgICAgICBwcmludCAiI2lmZGVmIFBOR18iIHJbal0gIl9TVVBQT1JURUQiID5vdXQKLSAgICAgICAgICAgIHByaW50ICIjICAgdW5kZWYgUE5HX25vdF9lbmFibGVkIC8qIiByW2pdICIqLyIgPm91dAotICAgICAgICAgICAgIyBPb3BzLCBwcm9iYWJseSBub3QgaW50ZW5kZWQgKHNob3VsZCBiZSBmYWN0b3JlZAotICAgICAgICAgICAgIyBvdXQgYnkgdGhlIGNoZWNrcyBhYm92ZSkuCi0gICAgICAgICAgICBpZiAob3B0aW9uW2ldID09ICJvZmYiKSB7Ci0gICAgICAgICAgICAgICBwcmludCBlcnJvciwgaSwgImVuYWJsZWQgYnk6IiwgcltqXSBlbmQgPm91dAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnQgIiNlbmRpZiIgPm91dAotICAgICAgICAgfQotCi0gICAgICAgICBwcmludCAiIyAgIGlmbmRlZiBQTkdfIiBpICJfU1VQUE9SVEVEIC8qIWNvbW1hbmQgbGluZSovIiA+b3V0Ci0gICAgICAgICBwcmludCAiIyAgICBpZmRlZiBQTkdfbm90X2VuYWJsZWQgLyohZW5hYmxlZCovIiA+b3V0Ci0gICAgICAgICAjICdoYXZlX2lmcycgaGVyZSBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcgPSAib2ZmIiBzdGlsbCBhbGxvd3MgYW4gJ2lmJyBvbgotICAgICAgICAgIyBhbiBvdGhlcndpc2UgZW5hYmxlZCBvcHRpb24gdG8gdHVybiBpdCBvbjsgb3RoZXJ3aXNlIHRoZSAnaWYnCi0gICAgICAgICAjIGhhbmRsaW5nIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkIGJ5ICdldmVyeXRoaW5nID0gb2ZmJwotICAgICAgICAgaWYgKG9wdGlvbltpXSA9PSAib2ZmIiB8fCBvcHRpb25baV0gPT0gImRpc2FibGVkIiAmJiBldmVyeXRoaW5nICE9ICJvbiIgfHwgb3B0aW9uW2ldID09ICJlbmFibGVkIiAmJiBldmVyeXRoaW5nID09ICJvZmYiICYmICFoYXZlX2lmcykgewotICAgICAgICAgICAgcHJpbnQgIiMgICAgICB1bmRlZiBQTkdfb24gLypkZWZhdWx0IG9mZiovIiA+b3V0Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnQgIiMgICAgICBpZmRlZiBQTkdfTk9fIiBpID5vdXQKLSAgICAgICAgICAgIHByaW50ICIjICAgICAgIHVuZGVmIFBOR19vbiAvKnR1cm5lZCBvZmYqLyIgPm91dAotICAgICAgICAgICAgcHJpbnQgIiMgICAgICBlbmRpZiIgPm91dAotICAgICAgICAgICAgcHJpbnQgIiMgICAgICBpZmRlZiBQTkdfTk9fIiBpICJfU1VQUE9SVEVEIiA+b3V0Ci0gICAgICAgICAgICBwcmludCAiIyAgICAgICB1bmRlZiBQTkdfb24gLyp0dXJuZWQgb2ZmKi8iID5vdXQKLSAgICAgICAgICAgIHByaW50ICIjICAgICAgZW5kaWYiID5vdXQKLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50ICIjICAgIGVuZGlmIC8qIWVuYWJsZWQqLyIgPm91dAotICAgICAgICAgcHJpbnQgIiMgICAgaWZkZWYgUE5HX29uIiA+b3V0Ci0gICAgICAgICAjIFRoZSBfU1VQUE9SVEVEIG1hY3JvIG11c3QgYmUgZGVmaW5lZCBzbyB0aGF0IGRlcGVuZGVudAotICAgICAgICAgIyBvcHRpb25zIG91dHB1dCBsYXRlciB3b3JrLgotICAgICAgICAgcHJpbnQgIiMgICAgICBkZWZpbmUgUE5HXyIgaSAiX1NVUFBPUlRFRCIgPm91dAotICAgICAgICAgcHJpbnQgIiMgICAgZW5kaWYiID5vdXQKLSAgICAgICAgIHByaW50ICIjICAgZW5kaWYgLyohY29tbWFuZCBsaW5lKi8iID5vdXQKLSAgICAgICAgICMgSWYgUE5HX29uIGlzIHN0aWxsIHNldCB0aGUgb3B0aW9uIHNob3VsZCBiZSBkZWZpbmVkIGluCi0gICAgICAgICAjIHBuZ2xpYmNvbmYuaAotICAgICAgICAgcHJpbnQgIiMgICBpZmRlZiBQTkdfb24iID5vdXQKLSAgICAgICAgIGlmIChpIH4gL15mYWlsXy8pIHsKLSAgICAgICAgICAgIHByaW50IGVycm9yLCBpLCAiaXMgb246IGVuYWJsZWQgYnk6IiBpZmZzW2ldIGVuYWJsZWRieVtpXSAiLCByZXF1aXJlcyIgcmVxdWlyZXNbaV0gZW5kID5vdXQKLSAgICAgICAgIH0gZWxzZSBpZiAoaSAhfiAvXm9rXy8pIHsKLSAgICAgICAgICAgIHByaW50IGRlZiBpIHN1cCA+b3V0Ci0gICAgICAgICAgICAjIFN1cHBvcnRlZCBvcHRpb24sIHNldCByZXF1aXJlZCBzZXR0aW5ncwotICAgICAgICAgICAgbnJlcXMgPSBzcGxpdChzZXRzW2ldLCByKQotICAgICAgICAgICAgZm9yIChqPTE7IGo8PW5yZXFzOyArK2opIHsKLSAgICAgICAgICAgICAgIHByaW50ICIjICAgIGlmZGVmIFBOR19zZXRfIiByW2pdID5vdXQKLSAgICAgICAgICAgICAgICMgU29tZSBvdGhlciBvcHRpb24gaGFzIGFscmVhZHkgc2V0IGEgdmFsdWU6Ci0gICAgICAgICAgICAgICBwcmludCBlcnJvciwgaSwgInNldHMiLCByW2pdICI6IGR1cGxpY2F0ZSBzZXR0aW5nIiBlbmQgPm91dAotICAgICAgICAgICAgICAgcHJpbnQgZXJyb3IsICIgICBwcmV2aW91cyB2YWx1ZTogIiBlbmQgIlBOR19zZXRfIiByW2pdID5vdXQKLSAgICAgICAgICAgICAgIHByaW50ICIjICAgIGVsc2UiID5vdXQKLSAgICAgICAgICAgICAgICMgRWxzZSBzZXQgdGhlIGRlZmF1bHQ6IG5vdGUgdGhhdCB0aGlzIHdvbid0IGFjY2VwdCBhcmJpdHJhcnkKLSAgICAgICAgICAgICAgICMgdmFsdWVzLCB0aGUgc2V0dmFsIHN0cmluZyBtdXN0IGJlIGFjY2VwdGFibGUgdG8gYWxsIHRoZSBDCi0gICAgICAgICAgICAgICAjIGNvbXBpbGVycyB3ZSB1c2UuICBUaGF0IG1lYW5zIGl0IG11c3QgYmUgVkVSWSBzaW1wbGU7IGEgbnVtYmVyLAotICAgICAgICAgICAgICAgIyBhIG5hbWUgb3IgYSBzdHJpbmcuCi0gICAgICAgICAgICAgICBwcmludCAiIyAgICAgZGVmaW5lIFBOR19zZXRfIiByW2pdLCBzZXR2YWxbaSAiICIgcltqXV0gPm91dAotICAgICAgICAgICAgICAgcHJpbnQgIiMgICAgZW5kaWYiID5vdXQKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50ICIjICAgZW5kaWYgLyogZGVmaW5pdGlvbiAqLyIgPm91dAotICAgICAgICAgcHJpbnQgIiNlbmRpZiAvKnJlcXVpcmVzLCBpZiovIiA+b3V0Ci0gICAgICAgICBpZiAobG9ndW5zdXBwb3J0ZWQgfHwgaSB+IC9eb2tfLykgewotICAgICAgICAgICAgcHJpbnQgIiNpZm5kZWYgIFBOR19vbiIgPm91dAotICAgICAgICAgICAgaWYgKGxvZ3Vuc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICBwcmludCB1bmQgaSB1bmUgPm91dAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgfiAvXm9rXy8pIHsKLSAgICAgICAgICAgICAgIHByaW50IGVycm9yLCBpLCAibm90IGVuYWJsZWQ6IHJlcXVpcmVzOiIgcmVxdWlyZXNbaV0gIiwgZW5hYmxlZCBieToiIGlmZnNbaV0gZW5hYmxlZGJ5W2ldIGVuZCA+b3V0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludCAiI2VuZGlmIiA+b3V0Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGRvbmVbaV0gPSAxCi0gICAgICAgICArK21vdmVtZW50Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZmluaXNoZWQgJiYgIW1vdmVtZW50KSB7Ci0gICAgICAgICBwcmludCAib3B0aW9uOiBsb29wIG9yIG1pc3Npbmcgb3B0aW9uIGluIGRlcGVuZGVuY3kgdHJlZSwgY2Fubm90IHByb2Nlc3M6IgotICAgICAgICAgZm9yIChpIGluIG9wdGlvbikgaWYgKCFkb25lW2ldKSB7Ci0gICAgICAgICAgICBwcmludCAiICBvcHRpb24iLCBpLCAiZGVwZW5kcyBvbiIgdHJlZVtpXSwgIm5lZWRzOiIKLSAgICAgICAgICAgIG5yZXFzID0gc3BsaXQodHJlZVtpXSwgcikKLSAgICAgICAgICAgIGlmIChucmVxcyA+IDApIGZvciAoaj0xOyBqPD1ucmVxczsgKytqKSBpZiAoIWRvbmVbcltqXV0pIHsKLSAgICAgICAgICAgICAgIHByaW50ICIgICAiIHJbal0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGV4aXQgMQotICAgICAgfQotICAgfQotICAgcHJpbnQgIlBOR19ERk5fRU5EX1NPUlQiID5vdXQKLSAgIHByaW50IGNvbW1lbnQsICJlbmQgb2Ygb3B0aW9ucyIsIGNlbmQgPm91dAotCi0gICAjIERvIHRoZSAnc2V0dGluZycgdmFsdWVzIHNlY29uZCwgdGhlIGFsZ29yaXRobSB0aGUgc3RhbmRhcmQKLSAgICMgdHJlZSB3YWxrIChPKDEpKSBkb25lIGluIGFuIE8oMikgd2hpbGUvZm9yIGxvb3A7IGludGVyYXRpb25zCi0gICAjIHNldHRpbmdzIHggZGVwdGgsIG91dHB1dGluZyB0aGUgZGVlcGVzdCByZXF1aXJlZCBtYWNyb3MKLSAgICMgZmlyc3QuCi0gICBwcmludCAiIiA+b3V0Ci0gICBwcmludCAiLyogU0VUVElOR1MgKi8iID5vdXQKLSAgIHByaW50IGNvbW1lbnQsICJzZXR0aW5ncyIsIGNlbmQgPm91dAotICAgIyBTb3J0IChpbiBkZm4uYXdrKSBvbiBmaWVsZCAyLCB0aGUgc2V0dGluZyBuYW1lCi0gICBwcmludCAiUE5HX0RGTl9TVEFSVF9TT1JUIDIiID5vdXQKLSAgIGZpbmlzaGVkID0gMAotICAgd2hpbGUgKCFmaW5pc2hlZCkgewotICAgICAgZmluaXNoZWQgPSAxCi0gICAgICBtb3ZlbWVudCA9IDAgIyBkb25lIG5vdGhpbmcKLSAgICAgIGZvciAoaSBpbiBzZXR0aW5nKSBpZiAoIWRvbmVzZXRbaV0pIHsKLSAgICAgICAgIG5yZXFzID0gc3BsaXQoc2V0dGluZ1tpXSwgcikKLSAgICAgICAgIGlmIChucmVxcyA+IDApIHsKLSAgICAgICAgICAgICMgQnkgZGVmYXVsdCBhc3N1bWUgdGhlIHJlcXVpcmVzIHZhbHVlcyBhcmUgb3B0aW9ucywgYnV0IGlmIHRoZXJlCi0gICAgICAgICAgICAjIGlzIG5vIG9wdGlvbiB3aXRoIHRoYXQgbmFtZSBjaGVjayBmb3IgYSBzZXR0aW5nCi0gICAgICAgICAgICBmb3IgKGo9MTsgajw9bnJlcXM7ICsraikgaWYgKG9wdGlvbltyW2pdXSA9PSAiIiAmJiAhZG9uZXNldFtyW2pdXSkgewotICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqPD1ucmVxcykgewotICAgICAgICAgICAgICAgZmluaXNoZWQgPSAwCi0gICAgICAgICAgICAgICBjb250aW51ZSAjIHRyeSBhIGRpZmZlcmVudCBzZXR0aW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgICMgQWxsIHRoZSByZXF1aXJlbWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgb3V0cHV0Ci0gICAgICAgICAjIHRoaXMgc2V0dGluZy4KLSAgICAgICAgIGlmIChkZWIpIHByaW50ICJzZXR0aW5nIiwgaQotICAgICAgICAgZGVmbHQgPSBkZWZhdWx0c1tpXQotICAgICAgICAgIyBSZW1vdmUgYW55IHNwdXJpb3VzIHRyYWlsaW5nIHNwYWNlcwotICAgICAgICAgc3ViKC8gKiQvLCIiLGRlZmx0KQotICAgICAgICAgIyBBIGxlYWRpbmcgQCBtZWFucyBsZWF2ZSBpdCB1bnF1b3RlZCBzbyB0aGUgcHJlcHJvY2Vzc29yCi0gICAgICAgICAjIGNhbiBzdWJzdGl0dXRlIHRoZSBidWlsZCB0aW1lIHZhbHVlCi0gICAgICAgICBpZiAoZGVmbHQgfiAvXiBALykKLSAgICAgICAgICAgIGRlZmx0ID0gIiAiIHN1YnMgc3Vic3RyKGRlZmx0LCAzKSBzdWJlCi0gICAgICAgICBwcmludCAiIiA+b3V0Ci0gICAgICAgICBwcmludCAiLyogc2V0dGluZzogIiwgaSA+b3V0Ci0gICAgICAgICBwcmludCAiICogICByZXF1aXJlczoiIHNldHRpbmdbaV0gPm91dAotICAgICAgICAgcHJpbnQgIiAqICAgZGVmYXVsdDogIiwgZGVmYXVsdHNbaV0gZGVmbHQsICIqLyIgPm91dAotICAgICAgICAgZm9yIChqPTE7IGo8PW5yZXFzOyArK2opIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25bcltqXV0gIT0gIiIpCi0gICAgICAgICAgICAgICBwcmludCAiI2lmbmRlZiBQTkdfIiByW2pdICJfU1VQUE9SVEVEIiA+b3V0Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwcmludCAiI2lmbmRlZiBQTkdfIiByW2pdID5vdXQKLSAgICAgICAgICAgIHByaW50IGVycm9yLCBpLCAicmVxdWlyZXMiLCByW2pdIGVuZCA+b3V0Ci0gICAgICAgICAgICBwcmludCAiIyBlbmRpZiIgPm91dAotICAgICAgICAgfQotICAgICAgICAgIyBUaGUgcHJlY2VkZW5jZSBpczoKLSAgICAgICAgICMKLSAgICAgICAgICMgIDEpIEV4dGVybmFsIGRlZmluaXRpb247IHRydW1wczoKLSAgICAgICAgICMgIDIpIE9wdGlvbiAnc2V0cycgdmFsdWU7IHRydW1wczoKLSAgICAgICAgICMgIDMpIFNldHRpbmcgJ2RlZmF1bHQnCi0gICAgICAgICAjCi0gICAgICAgICBwcmludCAiI2lmZGVmIFBOR18iIGkgPm91dAotICAgICAgICAgIyBQTkdfPGk+IGlzIGRlZmluZWQsIHNvIHN1YnN0aXR1dGUgdGhlIHZhbHVlOgotICAgICAgICAgcHJpbnQgZGVmIGksIHN1YnMgIlBOR18iIGkgc3ViZSBlbmQgPm91dAotICAgICAgICAgcHJpbnQgIiNlbHNlIC8qIHVzZSBkZWZhdWx0ICovIiA+b3V0Ci0gICAgICAgICBwcmludCAiIyBpZmRlZiBQTkdfc2V0XyIgaSA+b3V0Ci0gICAgICAgICAjIFZhbHVlIGZyb20gYW4gb3B0aW9uICdzZXRzJyBhcmd1bWVudAotICAgICAgICAgcHJpbnQgZGVmIGksIHN1YnMgIlBOR19zZXRfIiBpIHN1YmUgZW5kID5vdXQKLSAgICAgICAgICMgVGhpcyBpcyBzbyB0aGF0IHN1YnNlcXVlbnQgdGVzdHMgb24gdGhlIHNldHRpbmcgd29yazoKLSAgICAgICAgIHByaW50ICIjICBkZWZpbmUgUE5HXyIgaSwgIjEiID5vdXQKLSAgICAgICAgIGlmIChkZWZhdWx0c1tpXSAhPSAiIikgewotICAgICAgICAgICAgcHJpbnQgIiMgZWxzZSAvKmRlZmF1bHQqLyIgPm91dAotICAgICAgICAgICAgcHJpbnQgZGVmIGkgZGVmbHQgZW5kID5vdXQKLSAgICAgICAgICAgIHByaW50ICIjICBkZWZpbmUgUE5HXyIgaSwgIjEiID5vdXQKLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50ICIjIGVuZGlmIC8qIGRlZmF1bHRzICovIiA+b3V0Ci0gICAgICAgICBwcmludCAiI2VuZGlmIC8qIHNldHRpbmciLCBpLCAiKi8iID5vdXQKLQotICAgICAgICAgZG9uZXNldFtpXSA9IDEKLSAgICAgICAgICsrbW92ZW1lbnQKLSAgICAgIH0KLQotICAgICAgaWYgKCFmaW5pc2hlZCAmJiAhbW92ZW1lbnQpIHsKLSAgICAgICAgIHByaW50ICJzZXR0aW5nOiBsb29wIG9yIG1pc3Npbmcgc2V0dGluZyBpbiAncmVxdWlyZXMnLCBjYW5ub3QgcHJvY2VzczoiCi0gICAgICAgICBmb3IgKGkgaW4gc2V0dGluZykgaWYgKCFkb25lc2V0W2ldKSB7Ci0gICAgICAgICAgICBwcmludCAiICBzZXR0aW5nIiwgaSwgInJlcXVpcmVzIiBzZXR0aW5nW2ldCi0gICAgICAgICB9Ci0gICAgICAgICBleGl0IDEKLSAgICAgIH0KLSAgIH0KLSAgIHByaW50ICJQTkdfREZOX0VORF9TT1JUIiA+b3V0Ci0gICBwcmludCBjb21tZW50LCAiZW5kIG9mIHNldHRpbmdzIiwgY2VuZCA+b3V0Ci0KLSAgICMgUmVndWxhciBlbmQgLSBldmVyeXRoaW5nIGxvb2tzIG9rCi0gICBpZiAocHJvdGVjdCAhPSAiIikgewotICAgICAgcHJpbnQgc3RhcnQgIiNlbmRpZiIsICIvKiIsIHByb3RlY3QsICIqLyIgZW5kID5vdXQKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcG5nbGliY29uZi5kZmEgYi9zY3JpcHRzL3BuZ2xpYmNvbmYuZGZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTljMDZkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcG5nbGliY29uZi5kZmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTEgKzAsMCBAQAotIyBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhIC0gbGlicmFyeSBidWlsZCBjb25maWd1cmF0aW9uIGNvbnRyb2wKLSMKLUAvKi0gcG5nbGliY29uZi5kZm4gaW50ZXJtZWRpYXRlIGZpbGUKLUAgKiAgZ2VuZXJhdGVkIGZyb20gc2NyaXB0cy9wbmdsaWJjb25mLmRmYQotQCAqLwotIwotY29tIHBuZ2xpYmNvbmYuaCAtIGxpYnJhcnkgYnVpbGQgY29uZmlndXJhdGlvbgotY29tCi12ZXJzaW9uCi1jb20KLWNvbSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLWNvbQotY29tIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi1jb20gRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotY29tIGFuZCBsaWNlbnNlIGluIHBuZy5oCi1jb20KLQotZmlsZSBwbmdsaWJjb25mLmggc2NyaXB0cy9wbmdsaWJjb25mLmRmYSBQTkdMQ09ORl9ICi0KLSMgVGhpcyBmaWxlIGlzIHByZXByb2Nlc3NlZCBieSBzY3JpcHRzL29wdGlvbnMuYXdrIGFuZCB0aGUKLSMgQyBjb21waWxlciB0byBnZW5lcmF0ZSAncG5nbGliY29uZi5oJyAtIGEgbGlzdCBvZiBhbGwgdGhlCi0jIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gIFRoZSBmaWxlIGxpc3RzIHRoZSB2YXJpb3VzIG9wdGlvbnMKLSMgdGhhdCBjYW4gKm9ubHkqIGJlIHNwZWNpZmllZCBkdXJpbmcgdGhlIGxpYnBuZyBidWlsZDsKLSMgcG5nbGliY29uZi5oIGZyZWV6ZXMgdGhlIGRlZmluaXRpb25zIHNlbGVjdGVkIGZvciB0aGUgc3BlY2lmaWMKLSMgYnVpbGQuCi0jCi0jIFRoZSBzeW50YXggaXMgZGV0YWlsZWQgaW4gc2NyaXB0cy9vcHRpb25zLmF3azsgdGhpcyBpcyBhIHN1bW1hcnkKLSMgb25seToKLSMKLSMgc2V0dGluZyA8bmFtZT4gW3JlcXVpcmVzIC4uLl0gW2RlZmF1bHRdCi0jICAgICNkZWZpbmUgUE5HXzxuYW1lPiA8dmFsdWU+ICAvKiB2YWx1ZSBjb21lcyBmcm9tIGN1cnJlbnQgc2V0dGluZyAqLwotIyBvcHRpb24gPG5hbWU+IFtyZXF1aXJlcyAuLi5dIFtpZiAuLi5dIFtlbmFibGVzIC4uLl0gW2Rpc2FibGVkXQotIyAgICAjZGVmaW5lIFBOR188bmFtZT5fU1VQUE9SVEVEIGlmIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldCBhbmQKLSMgICAgZW5hYmxlIHRoZSBvdGhlciBvcHRpb25zIGxpc3RlZAotIyBjaHVuayA8bmFtZT4gW3JlcXVpcmVzIC4uLl0gW2VuYWJsZXMgLi4uXSBbZGlzYWJsZWRdCi0jICAgIEVuYWJsZSBjaHVuayBwcm9jZXNzaW5nIGZvciB0aGUgZ2l2ZW4gYW5jaWxsYXJ5IGNodW5rOyBhbnkKLSMgICAgJ3JlcXVpcmVzIHNvbWV0aGluZycgZXhwYW5kcyB0byBSRUFEX3NvbWV0aGluZyBmb3IgcmVhZCBhbmQKLSMgICAgV1JJVEVfc29tZXRoaW5nIGZvciB3cml0ZSwgYnV0IHRoZSBlbmFibGVzIGxpc3QgbWVtYmVycyBhcmUKLSMgICAgdXNlZCBhcyBnaXZlbiAoZS5nLiBlbmFibGVzIEdBTU1BIGp1c3QgZXhwYW5kcyB0byB0aGF0IG9uIHRoZQotIyAgICBjb3JyZXNwb25kIFJFQURfbmFtZSBhbmQgV1JJVEVfbmFtZSBsaW5lcy4pCi0jCi0jICIsIiBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBvcHRpb25zIG9uIGFuICdvcHRpb24nIGxpbmUgYW5kIGlzIGlnbm9yZWQ7IGl0Ci0jIGRvZXNuJ3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBsaW5lLiAgKE5PVCBzZXR0aW5nLCB3aGVyZSAiLCIgYmVjb21lcwotIyBwYXJ0IG9mIHRoZSBzZXR0aW5nISkgIEEgY29tbWEgYXQgdGhlIGVuZCBvZiBhbiBvcHRpb24gbGluZSBjYXVzZXMgYQotIyBjb250aW51YXRpb24gKHRoZSBuZXh0IGxpbmUgaXMgaW5jbHVkZWQgaW4gdGhlIG9wdGlvbiB0b28uKQotIwotIyBOb3RlIHRoYXQgdGhlICdvbicgYW5kICdvZmYnIGtleXdvcmRzLCB3aGlsZSB2YWxpZCBvbiBib3RoIG9wdGlvbgotIyBhbmQgY2h1bmssIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGlzIGZpbGUgYmVjYXVzZSB0aGV5IGZvcmNlIHRoZQotIyByZWxldmFudCBvcHRpb25zIG9uIG9yIG9mZi4KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBUaGUgZm9sbG93aW5nIHNldHRpbmcsIG9wdGlvbiBhbmQgY2h1bmsgdmFsdWVzIGNhbiBhbGwgYmUgY2hhbmdlZAotIyB3aGlsZSBidWlsZGluZyBsaWJwbmc6Ci0jCi0jIHNldHRpbmc6IGNoYW5nZSAnc2V0dGluZycgbGluZXMgdG8gZmluZSB0dW5lIGxpYnJhcnkgcGVyZm9ybWFuY2U7Ci0jICAgY2hhbmdlcyB0byB0aGUgc2V0dGluZ3MgZG9uJ3QgYWZmZWN0IHRoZSBsaWJwbmcgQVBJIGZ1bmN0aW9uYWxseQotIwotIyBvcHRpb246IGNoYW5nZSAnb3B0aW9uJyBsaW5lcyB0byByZW1vdmUgb3IgYWRkIGNhcGFiaWxpdGllcyBmcm9tCi0jICAgb3IgdG8gdGhlIGxpYnJhcnk7IG9wdGlvbnMgY2hhbmdlIHRoZSBsaWJyYXJ5IEFQSQotIwotIyBjaHVuazogY2hhbmdlICdjaHVuaycgbGluZXMgdG8gcmVtb3ZlIGNhcGFiaWxpdGllcyB0byBwcm9jZXNzCi0jICAgb3B0aW9uYWwgKCdhbmNpbGxhcnknKSBjaHVua3MuICBUaGlzIGRvZXMgbm90IHByZXZlbnQgUE5HCi0jICAgZGVjb2RpbmcgYnV0IGRvZXMgY2hhbmdlIHRoZSBsaWJwbmcgQVBJIGJlY2F1c2Ugc29tZSBjaHVua3MKLSMgICB3aWxsIGJlIGlnbm9yZWQuCi0jCi0jIFRoZXJlIGFyZSB0aHJlZSB3YXlzIG9mIGRpc2FibGluZyBmZWF0dXJlcywgaW4gbm8gcGFydGljdWxhciBvcmRlcjoKLSMKLSMgMSkgQ3JlYXRlICdwbmd1c3IuaCcsIGVudGVyIHRoZSByZXF1aXJlZCBwcml2YXRlIGJ1aWxkIGluZm9ybWF0aW9uCi0jIGRldGFpbGVkIGJlbG93IGFuZCAjZGVmaW5lIFBOR19OT188b3B0aW9uPiBmb3IgZWFjaCBvcHRpb24geW91Ci0jIGRvbid0IHdhbnQgaW4gdGhhdCBmaWxlIGluIHRoYXQgZmlsZS4gIFlvdSBjYW4gYWxzbyB0dXJuIG9uIG9wdGlvbnMKLSMgdXNpbmcgUE5HXzxvcHRpb24+X1NVUFBPUlRFRC4gIFdoZW4geW91IGhhdmUgZmluaXNoZWQgcmVydW4KLSMgY29uZmlndXJlIGFuZCByZWJ1aWxkIHBuZ2xpYmNvbmYuaCBmaWxlIHdpdGggLURQTkdfVVNFUl9DT05GSUc6Ci0jCi0jICBtYWtlIGNsZWFuCi0jICBDUFBGTEFHUz0nLURQTkdfVVNFUl9DT05GSUcnIC4vY29uZmlndXJlCi0jICBtYWtlIHBuZ2xpYmNvbmYuaAotIwotIyBwbmd1c3IuaCBpcyBvbmx5IHVzZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBwbmdsaWJjb25mLmgsIGJ1dCBpdAotIyBpcyBzYWZlciB0byBlbnN1cmUgdGhhdCAtRFBOR19VU0VSX0NPTkZJRyBpcyBzcGVjaWZpZWQgdGhyb3VnaG91dAotIyB0aGUgYnVpbGQgYnkgY2hhbmdpbmcgdGhlIENQUEZMQUdTIHBhc3NlZCB0byB0aGUgaW5pdGlhbCAuL2NvbmZpZ3VyZQotIwotIyAyKSBBZGQgZGVmaW5pdGlvbnMgb2YgdGhlIHNldHRpbmdzIHlvdSB3YW50IHRvIGNoYW5nZSB0bwotIyBDUFBGTEFHUzsgZm9yIGV4YW1wbGU6Ci0jCi0jICAgLURQTkdfREVGQVVMVF9SRUFEX01BQ1JPUz0wCi0jCi0jIChUaGlzIHdvdWxkIGNoYW5nZSB0aGUgZGVmYXVsdCB0byAqbm90KiB1c2UgcmVhZCBtYWNyb3MuKSAgQmUKLSMgdmVyeSBjYXJlZnVsIHRvIGNoYW5nZSBvbmx5IHNldHRpbmdzIHRoYXQgZG9uJ3QgYWx0ZXIgdGhlIEFQSQotIyBiZWNhdXNlIHRoaXMgYXBwcm9hY2ggYnlwYXNzZXMgdGhlIHByaXZhdGUgYnVpbGQgY2hlY2tpbmcuICBZb3UKLSMgY2FuIGFsc28gY2hhbmdlIHNldHRpbmdzIGZyb20gcG5ncHJpdi5oIChyZWFkIHBuZ3ByaXYuaCkgc2FmZWx5Ci0jIHdpdGhvdXQgQVBJIGNoYW5nZXMuICBEbyB0aGF0IGluIHRoZSBzYW1lIHdheS4KLSMKLSMgMykgV3JpdGUgYSBuZXcgJy5kZmEnIGZpbGUgKHNheSAncG5ndXNyLmRmYScpIGFuZCBpbiB0aGlzIGZpbGUKLSMgcHJvdmlkZSBvdmVycmlkZSB2YWx1ZXMgZm9yIHNldHRpbmcgZW50cmllcyBhbmQgdHVybiBvcHRpb24gb3IKLSMgY2h1bmsgdmFsdWVzIGV4cGxpY2l0bHkgJ29uJyBvciAnb2ZmJzoKLSMKLSMgICAgc2V0dGluZyBGT08gZGVmYXVsdCBWQUxVRQotIyAgICBvcHRpb24gQkFSIFtvbnxvZmZdCi0jCi0jIFRoZW4gYWRkIHRoaXMgZmlsZSB0byB0aGUgb3B0aW9ucy5hd2sgY29tbWFuZCBsaW5lICh0aGUgKmZpcnN0KgotIyBvbmUpIGFmdGVyIHRoaXMgZmlsZS4gIFRoZSBtYWtlIG1hY3JvIERGQV9YVFJBIGlzIHByb3ZpZGVkIHRvIG1ha2UKLSMgdGhpcyBlYXNpZXIgKHNldCBpdCBsaWtlIENQUEZMQUdTIHByaW9yIHRvIHJ1bm5pbmcgLi9jb25maWd1cmUpLgotIyBMb29rIGF0IHRoZSBidWlsZHMgYmVsb3cgY29udHJpYi9wbmdtaW5pbSBmb3Igc29tZSBleHRyZW1lIGV4YW1wbGVzCi0jIG9mIGhvdyB0aGlzIGNhbiBiZSB1c2VkLgotIwotIyBEb24ndCBlZGl0IHRoaXMgZmlsZSB1bmxlc3MgeW91IGFyZSBjb250cmlidXRpbmcgYSBwYXRjaCB0bwotIyBsaWJwbmcgYW5kIG5lZWQgbmV3IG9yIG1vZGlmaWVkIG9wdGlvbnMvc2V0dGluZ3MuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFRoZSBmb2xsb3dpbmcgY2F1c2VzIGNvbW1lbnRlZCBvdXQgI3VuZGVmIGxpbmVzIHRvIGJlIHdyaXR0ZW4gdG8KLSMgcG5nbGliY29uZi5oOyB0aGlzIGNhbiBiZSBzdG9wcGVkIGJ5IGxvZ3Vuc3VwcG9ydGVkPTAgaW4gYSBsYXRlcgotIyBmaWxlIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUgKGFmdGVyIHBuZ2xpYmNvbmYuZGZhKQotCi1sb2d1bnN1cHBvcnRlZCA9IDEKLQotIyBUaGUgZm9sbG93aW5nIGFsbG93cyB0aGUgb3V0cHV0IGZyb20gY29uZmlndXJlIHRvIG1vZGlmeSB0aGUgY29udGVudHMgb2YKLSMgcG5nbGliY29uZi5oCi0KLUAjaWZkZWYgSEFWRV9DT05GSUdfSAotQCMgIGluY2x1ZGUgImNvbmZpZy5oIgotQCNlbmRpZgotCi0jIFBOR19VU0VSX0NPTkZJRyBoYXMgdG8gYmUgZGVmaW5lZCBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lCi0jIHRvIGNhdXNlIHBuZ3Vzci5oIHRvIGJlIHJlYWQgd2hpbGUgY29uc3RydWN0aW5nIHBuZ2xpYmNvbmYuaAotIwotIyBJZiB5b3UgY3JlYXRlIGEgcHJpdmF0ZSBETEwgeW91IG5lZWQgdG8gZGVmaW5lIHRoZSBmb2xsb3dpbmcKLSMgbWFjcm9zIGluIHRoZSBmaWxlICdwbmd1c3IuaCcgYW5kIHNldCAtRFBOR19VU0VSX0NPTkZJRyBmb3IKLSMgY29tcGlsYXRpb24gKGkuZS4gaW4gQ1BQRkxBR1MuKQotIyAjZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRCBcCi0jICAgICA8RGVzY3JpYmVzIGJ5IHdob20gYW5kIHdoeSB0aGlzIHZlcnNpb24gb2YgdGhlIERMTCB3YXMgYnVpbHQ+Ci0jICBlLmcuICNkZWZpbmUgUE5HX1VTRVJfUFJJVkFURUJVSUxEICJCdWlsZCBieSBNeUNvbXBhbnkgZm9yIHh5eiByZWFzb25zLiIKLSMgI2RlZmluZSBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYIDx0d28tbGV0dGVyIHBvc3RmaXggdGhhdCBzZXJ2ZSB0bwotIyAgICAgICAgZGlzdGluZ3Vpc2ggeW91ciBETEwgZnJvbSB0aG9zZSBvZiB0aGUgb2ZmaWNpYWwgcmVsZWFzZS4gVGhlc2UKLSMgICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIHRyYWlsaW5nIGxldHRlcnMgdGhhdCBjb21lIGFmdGVyIHRoZSB2ZXJzaW9uCi0jICAgICAgICBudW1iZXIgYW5kIG11c3QgbWF0Y2ggeW91ciBwcml2YXRlIERMTCBuYW1lPgotIyAgZS5nLiAvLyBwcml2YXRlIERMTCAibGlicG5nMTNneC5kbGwiCi0jICAgICAgICNkZWZpbmUgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWCAiZ3giCi0jCi0jIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBhbHNvIGF0IHlvdXIgZGlzcG9zYWwgaWYgeW91IHdhbnQgdG8gY29tcGxldGUgdGhlCi0jIERMTCBWRVJTSU9OSU5GTyBzdHJ1Y3R1cmUuCi0jIC0gUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NTUVOVFMKLSMgLSBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01QQU5ZTkFNRQotIyAtIFBOR19VU0VSX1ZFUlNJT05JTkZPX0xFR0FMVFJBREVNQVJLUwotCi0jIEl0IGlzIG5lY2Vzc2FyeSB0byBpbmNsdWRlIGNvbmZpZ3VyZXMgZGVmaW5pdGlvbnMgaGVyZSBzbyB0aGF0IEFDX0RFRklORQotIyBpbiBjb25maWd1cmUuYWMgd29ya3MgaW4gYSBjb21wcmVoZW5zaWJsZSB3YXkKLUAjaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKSAmJiAhZGVmaW5lZChQTkdfTk9fQ09ORklHX0gpCi1AIyAgaW5jbHVkZSAiY29uZmlnLmgiCi1AI2VuZGlmCi0KLUAjaWZkZWYgUE5HX1VTRVJfQ09ORklHCi1AIyAgaW5jbHVkZSAicG5ndXNyLmgiCi1AI2VuZGlmCi0KLSMgVGhpcyBpcyBhIHNwZWNpYWwgZml4dXAgZm9yIHRoZSBXYXRjb20gQyBjb21waWxlciBvbiBXaW5kb3dzLCB3aGljaCBoYXMKLSMgbXVsdGlwbGUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmRzLiAgVW5sZXNzIFBOR19BUElfUlVMRSBpcyBzZXQgZXhwbGljaXRseQotIyAoaS5lLiBpZiBpdCBpcyBub3QgZGVmaW5lZCBhdCB0aGlzIHBvaW50KSBpdCB3aWxsIGJlIGZvcmNlZCB0byAnMicgaGVyZSB3aGVuCi0jIHVzaW5nIFdhdGNvbS4gIFRoaXMgaW5kaWNhdGVzIHRvIHRoZSBvdGhlciBoZWFkZXIgZmlsZXMgdGhhdCBXYXRjb20gYmVoYXZpb3VyCi0jIGlzIHJlcXVpcmVkIHdoZXJlIGFwcHJvcHJpYXRlLgotCi1AI2lmZGVmIF9fV0FUQ09NQ19fCi1AIyAgaWZuZGVmIFBOR19BUElfUlVMRQotQCMgICAgIGRlZmluZSBQTkdfQVBJX1JVTEUgMiAvKiBVc2UgV2F0Y29tIGNhbGxpbmcgY29udmVudGlvbnMgKi8KLUAjICBlbmRpZgotQCNlbmRpZgotCi0jIElOIERFVkVMT1BNRU5UCi0jIFRoZXNlIGFyZSBjdXJyZW50bHkgZXhwZXJpbWVudGFsIGZlYXR1cmVzOyBkZWZpbmUgdGhlbSBpZiB5b3Ugd2FudCAoTk9URToKLSMgZXhwZXJpbWVudGFsIG9wdGlvbnMgbXVzdCBiZSBkaXNhYmxlZCBiZWZvcmUgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUhKQotCi0jIE5PTkUKLQotIyBOb3RlIHRoYXQgUE5HX1VTRVJfQ09ORklHIG9ubHkgaGFzIGFuIGVmZmVjdCB3aGVuIGJ1aWxkaW5nCi0jIHBuZ2xpYmNvbmYuaAotCi1zZXR0aW5nIFVTRVJfQ09ORklHCi1zZXR0aW5nIFVTRVJfUFJJVkFURUJVSUxECi1zZXR0aW5nIFVTRVJfRExMRk5BTUVfUE9TVEZJWAotc2V0dGluZyBVU0VSX1ZFUlNJT05JTkZPX0NPTU1FTlRTCi1zZXR0aW5nIFVTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUKLXNldHRpbmcgVVNFUl9WRVJTSU9OSU5GT19MRUdBTFRSQURFTUFSS1MKLQotIyBSZWNvcmQgdGhlICdBUEkgcnVsZScgdXNlZCB0byBzZWxlY3QgY2FsbGluZyBjb252ZW50aW9ucyBvbgotIyB0aG9zZSBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzdWNoIHRoaW5ncyAoc2VlIGFsbCB0aGUgY29tbWVudHMgaW4KLSMgcG5nY29uZi5oKQotIyBDaGFuZ2luZyB0aGlzIHNldHRpbmcgaGFzIGEgZnVuZGFtZW50YWwgYWZmZWN0IG9uIHRoZSBQTkcgQUJJLAotIyBkbyBub3QgcmVsZWFzZSBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhpcyBjaGFuZ2VkLgotCi1zZXR0aW5nIEFQSV9SVUxFIGRlZmF1bHQgMAotCi0jIFRoaXMgYWxsb3dzIGEgcHJlZml4IHRvIGJlIGFkZGVkIHRvIHRoZSBmcm9udCBvZiBldmVyeSBBUEkgZnVuY3RvbiBuYW1lIChhbmQKLSMgdGhlcmVmb3JlIGV2ZXJ5IHN5bWJvbCkgYnkgcmVkZWZpbmluZyBhbGwgdGhlIGZ1bmN0aW9uIG5hbWVzIHdpdGggdGhlIHByZWZpeAotIyBhdCB0aGUgZW5kIG9mIHBuZ2xpYmNvbmYuaC4gIEl0IGFsc28gdHVybnMgb24gc2ltaWxhciBpbnRlcm5hbCBzeW1ib2wgcmVuYW1pbmcKLSMgYnkgY2F1c2luZyBhIHNpbWlsYXIgYnVpbGQtdGltZSBvbmx5IGZpbGUsIHBuZ3ByZWZpeC5oLCB0byBiZSBnZW5lcmF0ZWQuCi0KLXNldHRpbmcgUFJFRklYCi0KLSMgSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udHJvbCBvZiB0aGUgb3B0aW1pemF0aW9ucywgZW5hYmxlZCBieSB0aG9zZQotIyBoYXJkd2FyZSBvciBzb2Z0d2FyZSBvcHRpb25zIHRoYXQgbmVlZCBpdCAodHlwaWNhbGx5IHdoZW4gcnVuLXRpbWUgY2hvaWNlcwotIyBtdXN0IGJlIG1hZGUgYnkgdGhlIHVzZXIpCi1vcHRpb24gU0VUX09QVElPTiBkaXNhYmxlZAotCi0jIFRoZXNlIG9wdGlvbnMgYXJlIHNwZWNpZmljIHRvIHRoZSBBUk0gTkVPTiBoYXJkd2FyZSBvcHRpbWl6YXRpb25zLiAgQXQgcHJlc2VudAotIyB0aGVzZSBvcHRpbWl6YXRpb25zIGRlcGVuZCBvbiBHQ0Mgc3BlY2lmaWMgcHJlLXByb2Nlc3Npbmcgb2YgYW4gYXNzZW1ibGVyICguUykKLSMgZmlsZSBzbyB0aGV5IHByb2JhYmx5IHdvbid0IHdvcmsgd2l0aCBvdGhlciBjb21waWxlcnMuCi0jCi0jIEFSTV9ORU9OX09QVDogdW5zZXQ6IGNoZWNrIGF0IGNvbXBpbGUgdGltZSAoX19BUk1fTkVPTl9fIG11c3QgYmUgZGVmaW5lZCBieQotIyAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcGlsZXIsIHR5cGljYWxseSBhcyBhIHJlc3VsdCBvZiBzcGVjaWZ5aW5nCi0jICAgICAgICAgICAgICAgICAgICAgIENDPSJnY2MgLW1mcHU9bmVvbiIuKQotIyAgICAgICAgICAgICAgICAgICAwOiBkaXNhYmxlIChldmVuIGlmIHRoZSBDUFUgaGFzIGEgTkVPTiBGUFUuKQotIyAgICAgICAgICAgICAgICAgICAxOiBjaGVjayBhdCBydW4gdGltZSAodmlhIEFSTV9ORU9OX3tBUEksQ0hFQ0t9KQotIyAgICAgICAgICAgICAgICAgICAyOiBzd2l0Y2ggb24gdW5jb25kaXRpb25hbGx5IChpbmFkdmlzYWJsZSAtIGluc3RlYWQgcGFzcwotIyAgICAgICAgICAgICAgICAgICAgICAtbWZwdT1uZW9uIHRvIEdDQyBpbiBDQykKLSMgICAgICAgICAgIFdoZW4gYnVpbGRpbmcgbGlicG5nIGF2b2lkIHVzaW5nIGFueSBzZXR0aW5nIG90aGVyIHRoYW4gJzAnOyAnMScgaXMKLSMgICAgICAgICAgIHNldCBhdXRvbWF0aWNhbGx5IHdoZW4gZWl0aGVyICdBUEknIG9yICdDSEVDSycgYXJlIGNvbmZpZ3VyZWQgaW4sCi0jICAgICAgICAgICAnMicgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgYXMgLW1mcHU9bmVvbiB3aWxsIGFjaGlldmUgdGhlIHNhbWUKLSMgICAgICAgICAgIGVmZmVjdCBhcyB3ZWxsIGFzIGFwcGx5aW5nIE5FT04gb3B0aW1pemF0aW9ucyB0byB0aGUgcmVzdCBvZiB0aGUKLSMgICAgICAgICAgIGxpYnBuZyBjb2RlLgotIyAgICAgICAgICAgTk9URTogYW55IHNldHRpbmcgb3RoZXIgdGhhbiAnMCcgcmVxdWlyZXMgQUxJR05FRF9NRU1PUlkKLSMgQVJNX05FT05fQVBJOiAgIChQTkdfQVJNX05FT04gPT0gMSkgYWxsb3cgdGhlIG9wdGltaXphdGlvbiB0byBiZSBzd2l0Y2hlZCBvbgotIyAgICAgICAgICAgICAgICAgd2l0aCBwbmdfc2V0X29wdGlvbgotIyBBUk1fTkVPTl9DSEVDSzogKFBOR19BUk1fTkVPTiA9PSAxKSBjb21waWxlIGEgcnVuLXRpbWUgY2hlY2sgdG8gc2VlIGlmIE5lb24KLSMgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZC4gVGhpcyBpcyBwb29ybHkgc3VwcG9ydGVkIGFuZAotIyAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCAtIHVzZSB0aGUgcG5nX3NldF9vcHRpb24gQVBJLgotc2V0dGluZyBBUk1fTkVPTl9PUFQKLW9wdGlvbiBBUk1fTkVPTl9BUEkgZGlzYWJsZWQgcmVxdWlyZXMgQUxJR05FRF9NRU1PUlkgZW5hYmxlcyBTRVRfT1BUSU9OLAotICAgc2V0cyBBUk1fTkVPTl9PUFQgMQotb3B0aW9uIEFSTV9ORU9OX0NIRUNLIGRpc2FibGVkIHJlcXVpcmVzIEFMSUdORURfTUVNT1JZLAotICAgc2V0cyBBUk1fTkVPTl9PUFQgMQotCi0jIFRoZXNlIHNldHRpbmdzIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCAoMC05KSBhbmQgJ3N0cmF0ZWd5JzsKLSMgc3RyYXRlZ3kgaXMgYXMgZGVmaW5lZCBieSB0aGUgaW1wbGVtZW50b3JzIG9mIHpsaWIuIEl0IGRlc2NyaWJlcyB0aGUgaW5wdXQKLSMgZGF0YSBhbmQgbW9kaWZpZXMgdGhlIHpsaWIgcGFyYW1ldGVycyBpbiBhbiBhdHRlbXB0IHRvIG9wdGltaXplIHRoZSBiYWxhbmNlCi0jIGJldHdlZW4gc2VhcmNoIGFuZCBodWZmbWFuIGVuY29kaW5nIGluIHRoZSB6bGliIGFsZ29yaXRobXMuICBUaGUgZGVmYXVsdHMgYXJlCi0jIHRoZSB6bGliLmggZGVmYXVsdHMgLSB0aGUgYXBwYXJlbnRseSByZWN1cnNpdmUgZGVmaW5pdGlvbiBkb2VzIG5vdCBhcmlzZQotIyBiZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBzZXR0aW5nIGlzIHByZWZpeGVkIGJ5IFBOR18KLSMKLSMgVGhlIFRFWFQgdmFsdWVzIGFyZSB0aGUgZGVmYXVsdHMgd2hlbiB3cml0aW5nIGNvbXByZXNzZWQgdGV4dCAoYWxsIGZvcm1zKQotCi0jIEluY2x1ZGUgdGhlIHpsaWIgaGVhZGVyIHNvIHRoYXQgdGhlIGRlZmF1bHRzIGJlbG93IGFyZSBrbm93bgotQCMgIGluY2x1ZGUgPHpsaWIuaD4KLQotIyBUaGUgJ0AnIGhlcmUgbWVhbnMgdG8gc3Vic3RpdHV0ZSB0aGUgdmFsdWUgd2hlbiBwbmdsaWJjb25mLmggaXMgYnVpbHQKLXNldHRpbmcgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIGRlZmF1bHQgQFpfREVGQVVMVF9DT01QUkVTU0lPTgotIyBUT0RPOiB3aHkgYXJlbid0IHRoZXNlIFpfUkxFOyB6bGliLmggc2F5cyB0aGF0IFpfUkxFLCBzcGVjaWZpY2FsbHksIGlzCi0jIGFwcHJvcHJpYXRlIGZvciBQTkcgaW1hZ2VzLCBtYXliZSBpdCBkb2Vzbid0IGV4aXN0IGluIGFsbCB2ZXJzaW9ucz8KLXNldHRpbmcgWl9ERUZBVUxUX1NUUkFURUdZIGRlZmF1bHQgQFpfRklMVEVSRUQKLXNldHRpbmcgWl9ERUZBVUxUX05PRklMVEVSX1NUUkFURUdZIGRlZmF1bHQgQFpfREVGQVVMVF9TVFJBVEVHWQotc2V0dGluZyBaTElCX1ZFUk5VTSBkZWZhdWx0IEBaTElCX1ZFUk5VTQotCi0jIExpbmthZ2Ugb2Y6Ci0jCi0jICBBUEk6ICAgICAgbGlicG5nIEFQSSBmdW5jdGlvbnMKLSMgIENBTExCQUNLOiBpbnRlcm5hbCBub24tZmlsZS1sb2NhbCBjYWxsYmFja3MKLSMgIEZVTkNUSU9OOiBpbnRlcm5hbCBub24tZmlsZS1sb2NhbCBmdW5jdGlvbnMKLSMgIERBVEE6ICAgICBpbnRlcm5hbCBub24tZmlsZS1sb2NhbCAoY29uc3QpIGRhdGEKLXNldHRpbmcgTElOS0FHRV9BUEkgZGVmYXVsdCBleHRlcm4KLXNldHRpbmcgTElOS0FHRV9DQUxMQkFDSyBkZWZhdWx0IGV4dGVybgotc2V0dGluZyBMSU5LQUdFX0ZVTkNUSU9OIGRlZmF1bHQgZXh0ZXJuCi1zZXR0aW5nIExJTktBR0VfREFUQSBkZWZhdWx0IGV4dGVybgotCi1zZXR0aW5nIFRFWFRfWl9ERUZBVUxUX0NPTVBSRVNTSU9OIGRlZmF1bHQgQFpfREVGQVVMVF9DT01QUkVTU0lPTgotc2V0dGluZyBURVhUX1pfREVGQVVMVF9TVFJBVEVHWSBkZWZhdWx0IEBaX0RFRkFVTFRfU1RSQVRFR1kKLQotIyBEZWZhdWx0IHRvIHVzaW5nIHRoZSByZWFkIG1hY3JvcwotCi1zZXR0aW5nIERFRkFVTFRfUkVBRF9NQUNST1MgZGVmYXVsdCAxCi0KLSMgVGhlIGFsdGVybmF0aXZlIGlzIHRvIGNhbGwgZnVuY3Rpb25zIHRvIHJlYWQgUE5HIHZhbHVlcywgaWYKLSMgdGhlIGZ1bmN0aW9ucyBhcmUgdHVybmVkICpvZmYqIHRoZSByZWFkIG1hY3JvcyBtdXN0IGFsd2F5cwotIyBiZSBlbmFibGVkLCBzbyB0dXJuaW5nIHRoaXMgb2ZmIHdpbGwgYWN0dWFsbHkgZm9yY2UgdGhlCi0jIFVTRV9SRUFEX01BQ1JPUyBvcHRpb24gb24gKHNlZSBwbmdjb25mLmgpCi0KLW9wdGlvbiBSRUFEX0lOVF9GVU5DVElPTlMgcmVxdWlyZXMgUkVBRAotCi0jIFRoZSBzYW1lIGZvciB3cml0ZSAgYnV0IHRoZXNlIGNhbiBvbmx5IGJlIHN3aXRjaGVkIG9mZiBpZiBubyB3cml0aW5nCi0jIGlzIHJlcXVpcmVkIGF0IGFsbCAtIGhlbmNlIHRoZSB1c2Ugb2YgYSAnZGlzYWJsZWQnLCBub3QgYSAncmVxdWlyZXMnLgotIyBJZiB0aGVzZSBhcmUgbmVlZGVkLCB0aGV5IGFyZSBlbmFibGVkIGluIHRoZSAnV1JJVEUgb3B0aW9ucycgc2VjdGlvbgotIyBiZWxvdy4KLQotb3B0aW9uIFdSSVRFX0lOVF9GVU5DVElPTlMgZGlzYWJsZWQKLQotIyBFcnJvciBjb250cm9scwotIwotIyBXQVJOSU5HUzogbm9ybWFsbHkgb24sIGlmIG9mZiBubyB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkCi0jIEVSUk9SX1RFWFQ6IG5vcm1hbGx5IG9uLCBpZiBvZmYgZXJyb3JzIGhhcHBlbiBidXQgdGhlcmUgaXMgbm8gbWVzc2FnZQotIyBFUlJPUl9OVU1CRVJTOiB1bmltcGxlbWVudGVkIGZlYXR1cmUsIHRoZXJlZm9yZSBkaXNhYmxlZAotIyBCRU5JR05fRVJST1JTOiBzdXBwb3J0IGZvciBqdXN0IGlzc3Vpbmcgd2FybmluZ3MgZm9yIHJlY292ZXJhYmxlIGVycm9ycwotIwotIyBCRU5JR05fUkVBRF9FUlJPUlM6Ci0jICAgICBCeSBkZWZhdWx0IHJlY292ZXJhYmxlIGVycm9ycyBvbiByZWFkIHNob3VsZCBqdXN0IGdlbmVyYXRlIHdhcm5pbmdzLAotIyAgICAgZ2VuZXJhbGx5IHNhZmUgYnV0IFBORyBmaWxlcyB0aGF0IGRvbid0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmljYXRpb24gd2lsbAotIyAgICAgYmUgYWNjZXB0ZWQgaWYgYSBtZWFuaW5nZnVsIHJlc3VsdCBjYW4gYmUgcHJvZHVjZWQuCi0jCi0jIEJFTklHTl9XUklURV9FUlJPUlM6Ci0jICAgICBCeSBkZWZhdWx0IHJlY292ZXJhYmxlIGVycm9ycyBvbiB3cml0ZSBzaG91bGQganVzdCBnZW5lcmF0ZSB3YXJuaW5ncywKLSMgICAgIG5vdCBnZW5lcmFsbHkgc2FmZSBiZWNhdXNlIHRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byB3cml0ZSBpbnZhbGlkCi0jICAgICBQTkcgZmlsZXMuICBBcHBsaWNhdGlvbnMgc2hvdWxkIGVuYWJsZSB0aGlzIHRoZW1zZWx2ZXM7IGl0J3MgdXNlZnVsCi0jICAgICBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgYSBmYWlsdXJlIHRvIHdyaXRlIGFuIGFuY2lsbGlhcnkgY2h1bmsgY2FuIG9mdGVuIGJlCi0jICAgICBpZ25vcmVkLgotCi1vcHRpb24gV0FSTklOR1MKLW9wdGlvbiBFUlJPUl9URVhUCi1vcHRpb24gRVJST1JfTlVNQkVSUyBkaXNhYmxlZAotCi1vcHRpb24gQkVOSUdOX0VSUk9SUwotb3B0aW9uIEJFTklHTl9XUklURV9FUlJPUlMgcmVxdWlyZXMgQkVOSUdOX0VSUk9SUyBkaXNhYmxlZAotb3B0aW9uIEJFTklHTl9SRUFEX0VSUk9SUyByZXF1aXJlcyBCRU5JR05fRVJST1JTCi0KLQotIyBHZW5lcmljIG9wdGlvbnMgLSBhZmZlY3QgYm90aCByZWFkIGFuZCB3cml0ZS4KLQotb3B0aW9uIE1OR19GRUFUVVJFUwotCi0jIEFyaXRobWV0aWMgb3B0aW9ucywgdGhlIGZpcnN0IGlzIHRoZSBiaWcgc3dpdGNoIHRoYXQgY2hvb3NlcyBiZXR3ZWVuIGludGVybmFsCi0jIGZsb2F0aW5nIGFuZCBmaXhlZCBwb2ludCBhcml0aG1ldGljIGltcGxlbWVudGF0aW9ucyAtIGl0IGRvZXMgbm90IGFmZmVjdCBhbnkKLSMgQVBJcy4gIFRoZSBzZWNvbmQgdHdvICh0aGUgX1BPSU5UIHNldHRpbmdzKSBzd2l0Y2ggb2ZmIGluZGl2aWR1YWwgQVBJcy4KLSMKLSMgUHJpb3IgdG8gbGlicG5nIDEuNi44IG9uZSBvZiB0aGUgQVBJIChfUE9JTlQpIHZhcmlhbnRzIGhhZCB0byBiZSBzZWxlY3RlZC4gIEF0Ci0jIDEuNi44IHRoaXMgcmVzdHJpY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZDsgdGhlIHNpbXBsaWZpZWQgQVBJIGNhbiBiZSB1c2VkCi0jIHdpdGhvdXQgZW5hYmxpbmcgYW55IG9mIHRoZSBsb3cgbGV2ZWwgZml4ZWQvZmxvYXRpbmcgQVBJcy4KLQotb3B0aW9uIEZMT0FUSU5HX0FSSVRITUVUSUMKLW9wdGlvbiBGTE9BVElOR19QT0lOVAotb3B0aW9uIEZJWEVEX1BPSU5UCi0KLSMgVGhpcyBwcm90ZWN0cyB1cyBhZ2FpbnN0IGNvbXBpbGVycyB0aGF0IHJ1biBvbiBhIHdpbmRvd2luZyBzeXN0ZW0KLSMgYW5kIHRodXMgZG9uJ3QgaGF2ZSBvciB3b3VsZCByYXRoZXIgdXMgbm90IHVzZSB0aGUgc3RkaW8gdHlwZXM6Ci0jIHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIuICBUaGUgb25seSBvbmUgY3VycmVudGx5IHVzZWQgaXMgc3RkZXJyCi0jIGluIHBuZ19lcnJvcigpIGFuZCBwbmdfd2FybmluZygpLiAgI2RlZmluaW5nIFBOR19OT19DT05TT0xFX0lPIHdpbGwKLSMgcHJldmVudCB0aGVzZSBmcm9tIGJlaW5nIGNvbXBpbGVkIGFuZCB1c2VkLiAjZGVmaW5pbmcgUE5HX05PX1NURElPCi0jIHdpbGwgYWxzbyBwcmV2ZW50IHRoZXNlLCBwbHVzIHdpbGwgcHJldmVudCB0aGUgZW50aXJlIHNldCBvZiBzdGRpbwotIyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyAoRklMRSAqLCBwcmludGYsIGV0Yy4pIGZyb20gYmVpbmcgY29tcGlsZWQgYW5kIHVzZWQsCi0jIHVubGVzcyAoUE5HX0RFQlVHID4gMCkgaGFzIGJlZW4gI2RlZmluZWQuCi0KLW9wdGlvbiBTVERJTwotb3B0aW9uIENPTlNPTEVfSU8gcmVxdWlyZXMgU1RESU8KLQotIyBOb3RlOiBwcmlvciB0byAxLjUuMCB0aGlzIG9wdGlvbiBjb3VsZCBub3QgYmUgZGlzYWJsZWQgaWYgU1RESU8KLSMgd2FzIGVuYWJsZWQuICBQcmlvciB0byAxLjUuMyB0aGlzIG9wdGlvbiByZXF1aXJlZCBTVERJTwotCi1vcHRpb24gVElNRV9SRkMxMTIzCi0KLSMgUE5HX1NFVEpNUF9OT1RfU1VQUE9SVEVEIGlzIGFuIG9sZCBlcXVpdmFsZW50IGZvciBOT19TRVRKTVAKLQotb3B0aW9uIFNFVEpNUAotPSBOT19TRVRKTVAgU0VUSk1QX05PVF9TVVBQT1JURUQKLQotIyBJZiB0aGlzIGlzIGRpc2FibGVkIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYXBwcyB0byBnZXQgdGhlCi0jIHZhbHVlcyBmcm9tIHRoZSAnaW5mbycgc3RydWN0dXJlLCB0aGlzIGVmZmVjdGl2ZWx5IHJlbW92ZXMKLSMgcXVpdGUgYSBsb3Qgb2YgdGhlIFJFQUQgQVBJLgotCi1vcHRpb24gRUFTWV9BQ0NFU1MKLQotIyBBZGRlZCBhdCBsaWJwbmctMS4yLjAKLQotb3B0aW9uIFVTRVJfTUVNCi0KLSMgQWRkZWQgYXQgbGlicG5nLTEuNC4wCi0KLW9wdGlvbiBJT19TVEFURQotCi0jIExpYnBuZyBsaW1pdHM6IGxpbWl0IHRoZSBzaXplIG9mIGltYWdlcyBhbmQgZGF0YSBvbiByZWFkLgotIwotIyBJZiB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZCBhbGwgdGhlIGxpbWl0IGNoZWNraW5nIGNvZGUgd2lsbCBiZSBkaXNhYmxlZDoKLQotb3B0aW9uIFVTRVJfTElNSVRTIHJlcXVpcmVzIFJFQUQKLQotIyBUaGUgZGVmYXVsdCBzZXR0aW5ncyBnaXZlbiBiZWxvdyBmb3IgdGhlIGxpbWl0cyBtZWFuIHRoYXQgbGlicG5nIHdpbGwKLSMgbGltaXQgdGhlIHNpemUgb2YgaW1hZ2VzIG9yIHRoZSBzaXplIG9mIGRhdGEgaW4gYW5jaWxsaWFyeSBjaHVua3MgdG8gbGVzcwotIyB0aGFuIHRoZSBzcGVjaWZpY2F0aW9uIG9yIGltcGxlbWVudGF0aW9uIGxpbWl0cy4gU2V0dGluZ3MgaGF2ZSB0aGUKLSMgZm9sbG93aW5nIGludGVycHJldGF0aW9uczoKLSMKLSMgVVNFUl9XSURUSF9NQVg6IG1heGltdW0gd2lkdGggb2YgYW4gaW1hZ2UgdGhhdCB3aWxsIGJlIHJlYWQKLSMgVVNFUl9IRUlHSFRfTUFYOiBtYXhpbXVtIGhlaWdodAotIyBVU0VSX0NIVU5LX01BTExPQ19NQVg6IG1heGltdW0gaW4tbWVtb3J5IChkZWNvbXByZXNzZWQpIHNpemUgb2YgYSBzaW5nbGUgY2h1bmsKLSMgVVNFUl9DSFVOS19DQUNIRV9NQVg6IG1heGltdW0gbnVtYmVyIG9mIGNodW5rcyB0byBiZSBjYWNoZWQKLSMKLSMgT25seSBjaHVua3MgdGhhdCBhcmUgdmFyaWFibGUgaW4gbnVtYmVyIGFyZSBjb3VudGVkIHRvd2FyZHMgdGhlCi0KLSMgVXNlIDB4N2ZmZmZmZmYgZm9yIHVubGltaXRlZAotc2V0dGluZyBVU0VSX1dJRFRIX01BWCBkZWZhdWx0ICAgICAgICAxMDAwMDAwCi1zZXR0aW5nIFVTRVJfSEVJR0hUX01BWCBkZWZhdWx0ICAgICAgIDEwMDAwMDAKLQotIyBVc2UgMCBmb3IgdW5saW1pdGVkCi1zZXR0aW5nIFVTRVJfQ0hVTktfQ0FDSEVfTUFYIGRlZmF1bHQgICAgIDEwMDAKLXNldHRpbmcgVVNFUl9DSFVOS19NQUxMT0NfTUFYIGRlZmF1bHQgODAwMDAwMAotCi0jIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgQVBJcyB0byBzZXQgdGhlIGFib3ZlIGxpbWl0cyBhdCBydW4gdGltZSBhcmUgYWRkZWQ7Ci0jIHdpdGhvdXQgdGhpcyB0aGUgaGFyZHdpcmVkIChjb21waWxlIHRpbWUpIGxpbWl0cyB3aWxsIGJlIHVzZWQuCi1vcHRpb24gU0VUX1VTRVJfTElNSVRTIHJlcXVpcmVzIFVTRVJfTElNSVRTCi0KLSMgQWxsIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyByZWxhdGUgdG8gY29kZSBjYXBhYmlsaXRpZXMgZm9yCi0jIHByb2Nlc3NpbmcgaW1hZ2UgZGF0YSBiZWZvcmUgY3JlYXRpbmcgYSBQTkcgb3IgYWZ0ZXIgcmVhZGluZyBvbmUuCi0jIFlvdSBjYW4gcmVtb3ZlIHRoZXNlIGNhcGFiaWxpdGllcyBzYWZlbHkgYW5kIHN0aWxsIGJlIFBORwotIyBjb25mb3JtYW50LCBob3dldmVyIHRoZSBsaWJyYXJ5IHRoYXQgcmVzdWx0cyBpcyBzdGlsbCBub24tc3RhbmRhcmQuCi0jIFNlZSB0aGUgY29tbWVudHMgYWJvdmUgYWJvdXQgaG93IHRvIGNoYW5nZSBvcHRpb25zIGFuZCBzZXR0aW5ncy4KLQotIyBSRUFEIG9wdGlvbnMKLSMKLSMgV0FSTklORzogaW4gbGlicG5nIDEuNSBtYWludGFpbmVkIGNvbmZpZ3VyYXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIKLSMgdmVyc2lvbnMuICBJbiBzb21lIGNhc2VzIHR1cm5pbmcgb2ZmIGFuIG9wdGlvbiB0dXJuZWQgb2ZmIG90aGVyIG9wdGlvbnMsIGluCi0jIG90aGVycyBpdCB3YXMgaW5lZmZlY3RpdmUgdW5sZXNzIGRlcGVuZGVudCBvcHRpb25zIHdlcmUgYWxzbyB0dXJuZWQgb2ZmLgotIyBMaWJwbmcgMS42IGNoYW5nZXMgdGhpczogaW4gZ2VuZXJhbCBpZiB5b3UgdHVybiBvZmYgYW4gb3B0aW9uIHRoYXQgYWZmZWN0cwotIyBBUElzIGl0IHN0YXlzIG9mZiBhbmQgc2ltcGx5IGRpc2FibGVzIEFQSXMgdGhhdCBkZXBlbmQgb24gaXQuCi0jCi0jIEFzIGEgcmVzdWx0IGlmIHlvdSBzaW1wbHkgcG9ydCB0aGUgbGlicG5nIDEuNSBjb25maWd1cmF0aW9uIHRvIGxpYnBuZyAxLjYgeW91Ci0jIHdpbGwgcHJvYmFibHkgc2VlIGJ1aWxkIGZhaWx1cmVzIGR1ZSB0byBtaXNzaW5nIEFQSXMuICBGaXhpbmcgdGhlc2UgZmFpbHVyZXMKLSMgcmVxdWlyZXMgc29tZSwgcGVyaGFwcyBjb25zaWRlcmFibGUsIGtub3dsZWRnZSBvZiB3aGF0IHlvdXIgbGlicG5nIHVzaW5nCi0jIGFwcGxpY2F0aW9ucyBhcmUgZG9pbmcsIGZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGdyZWF0IHJlYXNvbiBmb3IgeW91IHRvIG1vdmUKLSMgdG8gbGlicG5nIDEuNjsgdGhlIG5ldyBpbnRlcmZhY2VzIGluIDEuNiB3aWxsIHRha2Ugc2V2ZXJhbCB5ZWFycyB0byBiZWNvbWUKLSMgcG9wdWxhci4KLQotb3B0aW9uIFJFQUQgZW5hYmxlcyBSRUFEX0lOVEVSTEFDSU5HIFNFVF9PUFRJT04KLQotIyBEaXNhYmxpbmcgUkVBRF8xNkJJVCBkb2VzIG5vdCBkaXNhYmxlIHJlYWRpbmcgMTYtYml0IFBORyBmaWxlcywgYnV0IGl0Ci0jIGZvcmNlcyB0aGVtIHRvIGJlIGNob3BwZWQgZG93biB0byA4LWJpdCwgYW5kIGRpc2FibGVzIGFueSAxNi1iaXQKLSMgcHJvY2Vzc2luZyBhZnRlciB0aGF0IGhhcyBoYXBwZW5lZC4gIFlvdSBuZWVkIHRvIGJlIHN1cmUgdG8gZW5hYmxlCi0jIFJFQURfU0NBTEVfMTZfVE9fOCBvciBSRUFEX1NUUklQXzE2X1RPXzggd2hlbiB5b3UgZGlzYWJsZSBSRUFEXzE2QklUIGZvcgotIyB0aGlzIHRvIHdvcmsgcHJvcGVybHkuICBZb3Ugc2hvdWxkIGRpc2FibGUgdGhlIG90aGVyIG9wdGlvbiBpZiB5b3UgbmVlZCB0bwotIyBlbnN1cmUgYSBwYXJ0aWN1bGFyIGNvbnZlcnNpb24gKG90aGVyd2lzZSB0aGUgYXBwIGNhbiBjaG9zZS4pCi0KLW9wdGlvbiBSRUFEXzE2QklUIHJlcXVpcmVzIFJFQUQgZW5hYmxlcyAxNkJJVAotCi1vcHRpb24gUkVBRF9RVUFOVElaRSByZXF1aXJlcyBSRUFECi0KLW9wdGlvbiBSRUFEX1RSQU5TRk9STVMgcmVxdWlyZXMgUkVBRAotPSBOT19SRUFEX1RSQU5TRk9STVMgUkVBRF9UUkFOU0ZPUk1TX05PVF9TVVBQT1JURUQKLQotIyBSZWFkIGdhbW1hIGhhbmRsaW5nLiAgR2FtbWEgcHJvY2Vzc2luZyBpcyBhIGNvcmUgcGFydCBvZiBsaWJwbmcgYW5kIG1hbnkgb2YKLSMgdGhlIGNhcGFiaWxpdGllcyBhcmUgZGVwZW5kZW50IG9uIGxpYnBuZyBwZXJmb3JtaW5nIGdhbW1hIGNvcnJlY3Rpb24uCi0jCi0jIEluIGxpYnBuZyAxLjYgZGlzYWJsaW5nIGdhbW1hIHByb2Nlc3NpbmcgKHNldHRpbmcgUE5HX05PX1JFQURfR0FNTUEpCi0jIGNvbnNpc3RlbnRseSBkaXNhYmxlcyB0aG9zZSBwYXJ0cyBvZiB0aGUgQVBJIHRoYXQgZGVwZW5kIG9uIGl0LiAgUHJpb3IgdG8KLSMgMS42LjAgdGhpcyB3YXMgbm90IHRydWU7IHRoZSByZXN1bHRzIHdlcmUgdW5wcmVkaWN0YWJsZSBhbmQgdmFyaWVkIGJldHdlZW4KLSMgcmVsZWFzZXMuCi0jCi0jIElmIHlvdSBkaXNhYmxlIGdhbW1hIHByb2Nlc3NpbmcgYW5kIHlvdXIgcHJvZ3JhbSBubyBsb25nZXIgY29tcGlsZXMgeW91IG5lZWQKLSMgdG8gYXNrIHdoZXRoZXIgeW91IHJlYWxseSBuZWVkIHRoZSBBUElzIHRoYXQgYXJlIG1pc3NpbmcuICBJZiB5b3UgZG8gdGhlbiB5b3UKLSMgYWxtb3N0IGNlcnRhaW5seSBuZWVkIHRoZSBnYW1tYSBwcm9jZXNzaW5nLgotIwotIyBJZiB5b3UgaGFuZGxlIGdhbW1hIGlzc3VlcyBvdXRzaWRlIGxpYnBuZyB0aGVuIHlvdSBkbyBub3QgbmVlZCB0aGUgbGlicG5nCi0jIGdhbW1hIHByb2Nlc3Npbmc7IGFuZCBpdCBpcyBhbiBlbm9ybW91cyB3YXN0ZSBvZiBzcGFjZS4gIFlvdSBqdXN0IG5lZWQgdG8KLSMgcmVtb3ZlIHRoZSB1c2Ugb2YgbGlicG5nIEFQSXMgdGhhdCBkZXBlbmQgb24gaXQuCi1vcHRpb24gUkVBRF9HQU1NQSByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMsIFJFQURfZ0FNQSwgUkVBRF9zUkdCCi0KLW9wdGlvbiBSRUFEX0FMUEhBX01PREUgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TLCBSRUFEX0dBTU1BCi1vcHRpb24gUkVBRF9CQUNLR1JPVU5EIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUywgUkVBRF9TVFJJUF9BTFBIQSwgUkVBRF9HQU1NQQotb3B0aW9uIFJFQURfQkdSIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUwotb3B0aW9uIFJFQURfRVhQQU5EXzE2IHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUywgUkVBRF8xNkJJVCwgUkVBRF9FWFBBTkQKLW9wdGlvbiBSRUFEX0VYUEFORCByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKLW9wdGlvbiBSRUFEX0ZJTExFUiByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKLW9wdGlvbiBSRUFEX0dSQVlfVE9fUkdCIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUwotb3B0aW9uIFJFQURfSU5WRVJUX0FMUEhBIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUwotb3B0aW9uIFJFQURfSU5WRVJUIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUwotb3B0aW9uIFJFQURfUEFDSyByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKLW9wdGlvbiBSRUFEX1BBQ0tTV0FQIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUwotb3B0aW9uIFJFQURfUkdCX1RPX0dSQVkgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TLCBSRUFEX0dBTU1BIGVuYWJsZXMgQ09MT1JTUEFDRQotb3B0aW9uIFJFQURfU0NBTEVfMTZfVE9fOCByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKLW9wdGlvbiBSRUFEX1NISUZUIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUwotb3B0aW9uIFJFQURfU1RSSVBfMTZfVE9fOCByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKLW9wdGlvbiBSRUFEX1NUUklQX0FMUEhBIHJlcXVpcmVzIFJFQURfVFJBTlNGT1JNUwotb3B0aW9uIFJFQURfU1dBUF9BTFBIQSByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKLW9wdGlvbiBSRUFEX1NXQVAgcmVxdWlyZXMgUkVBRF9UUkFOU0ZPUk1TLCBSRUFEXzE2QklUCi1vcHRpb24gUkVBRF9VU0VSX1RSQU5TRk9STSByZXF1aXJlcyBSRUFEX1RSQU5TRk9STVMKLQotb3B0aW9uIFBST0dSRVNTSVZFX1JFQUQgcmVxdWlyZXMgUkVBRAotb3B0aW9uIFNFUVVFTlRJQUxfUkVBRCByZXF1aXJlcyBSRUFECi0KLSMgWW91IGNhbiBkZWZpbmUgUE5HX05PX1BST0dSRVNTSVZFX1JFQUQgaWYgeW91IGRvbid0IGRvIHByb2dyZXNzaXZlIHJlYWRpbmcuCi0jIFRoaXMgaXMgbm90IHRhbGtpbmcgYWJvdXQgaW50ZXJsYWNpbmcgY2FwYWJpbGl0eSEgIFlvdSdsbCBzdGlsbCBoYXZlCi0jIGludGVybGFjaW5nIHVubGVzcyB5b3UgdHVybiBvZmYgdGhlIGZvbGxvd2luZyB3aGljaCBpcyByZXF1aXJlZAotIyBmb3IgUE5HLWNvbXBsaWFudCBkZWNvZGVycy4gIChJbiBvdGhlciB3b3JkcywgZG8gbm90IGRvIHRoaXMgLSBpbgotIyBmYWN0IGl0IGNhbid0IGJlIGRpc2FibGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSEpCi0jb3B0aW9uIFJFQURfSU5URVJMQUNJTkcgcmVxdWlyZXMgUkVBRAotCi1vcHRpb24gUkVBRF9DT01QT1NJVEVfTk9ESVYgcmVxdWlyZXMgUkVBRAotPSBOT19SRUFEX0NPTVBPU0lURV9OT0RJViBOT19SRUFEX0NPTVBPU0lURURfTk9ESVYKLQotIyBJbmNoIGNvbnZlcnNpb25zCi0KLW9wdGlvbiBJTkNIX0NPTlZFUlNJT05TCi09IElOQ0hfQ09OVkVSU0lPTlMgSU5DSF9DT05WRVJTSU9OUwotCi0jIEFQSSB0byBidWlsZCBhIGdyYXlzY2FsZSBwYWxldHRlCi0jIE5PVEU6IHRoaXMgaXMgbm90IHVzZWQgaW50ZXJuYWxseSBieSBsaWJwbmcgYXQgcHJlc2VudC4KLQotb3B0aW9uIEJVSUxEX0dSQVlTQ0FMRV9QQUxFVFRFCi0KLSMgV1JJVEUgb3B0aW9ucwotCi1vcHRpb24gV1JJVEUgZW5hYmxlcyBXUklURV9JTlRfRlVOQ1RJT05TCi0KLSMgRGlzYWJsaW5nIFdSSVRFXzE2QklUIHByZXZlbnRzIDE2LWJpdCBQTkcgZmlsZXMgZnJvbSBiZWluZwotIyBnZW5lcmF0ZWQuCi1vcHRpb24gV1JJVEVfMTZCSVQgcmVxdWlyZXMgV1JJVEUgZW5hYmxlcyAxNkJJVAotCi1vcHRpb24gV1JJVEVfVFJBTlNGT1JNUyByZXF1aXJlcyBXUklURQotPSBOT19XUklURV9UUkFOU0ZPUk1TIFdSSVRFX1RSQU5TRk9STVNfTk9UX1NVUFBPUlRFRAotCi1vcHRpb24gV1JJVEVfU0hJRlQgcmVxdWlyZXMgV1JJVEVfVFJBTlNGT1JNUwotb3B0aW9uIFdSSVRFX1BBQ0sgcmVxdWlyZXMgV1JJVEVfVFJBTlNGT1JNUwotb3B0aW9uIFdSSVRFX0JHUiByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCi1vcHRpb24gV1JJVEVfU1dBUCByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TLCBXUklURV8xNkJJVAotb3B0aW9uIFdSSVRFX1BBQ0tTV0FQIHJlcXVpcmVzIFdSSVRFX1RSQU5TRk9STVMKLW9wdGlvbiBXUklURV9JTlZFUlQgcmVxdWlyZXMgV1JJVEVfVFJBTlNGT1JNUwotb3B0aW9uIFdSSVRFX0ZJTExFUiByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCi1vcHRpb24gV1JJVEVfU1dBUF9BTFBIQSByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCi1vcHRpb24gV1JJVEVfSU5WRVJUX0FMUEhBIHJlcXVpcmVzIFdSSVRFX1RSQU5TRk9STVMKLW9wdGlvbiBXUklURV9VU0VSX1RSQU5TRk9STSByZXF1aXJlcyBXUklURV9UUkFOU0ZPUk1TCi0KLSMgVGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIFBORy1jb21wbGlhbnQgZW5jb2RlcnMsIGJ1dCBjYW4gY2F1c2UKLSMgdHJvdWJsZSBpZiBsZWZ0IHVuZGVmaW5lZAotCi1vcHRpb24gV1JJVEVfSU5URVJMQUNJTkcgcmVxdWlyZXMgV1JJVEUKLQotIyBEZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQuCi1vcHRpb24gV1JJVEVfV0VJR0hURURfRklMVEVSIHJlcXVpcmVzIFdSSVRFCi0KLW9wdGlvbiBXUklURV9GTFVTSCByZXF1aXJlcyBXUklURQotCi0jIE5vdGU6IHRoZXNlIGNhbiBiZSB0dXJuZWQgb2ZmIGV4cGxpY2l0bHkgaWYgbm90IHJlcXVpcmVkIGJ5IHRoZQotIyBhcHBzIGltcGxlbWVudGluZyB0aGUgdXNlciB0cmFuc2Zvcm1zCi1vcHRpb24gVVNFUl9UUkFOU0ZPUk1fUFRSIGlmIFJFQURfVVNFUl9UUkFOU0ZPUk0sIFdSSVRFX1VTRVJfVFJBTlNGT1JNCi1vcHRpb24gVVNFUl9UUkFOU0ZPUk1fSU5GTyBpZiBSRUFEX1VTRVJfVFJBTlNGT1JNLCBXUklURV9VU0VSX1RSQU5TRk9STQotCi0jIFRoaXMgZW5hYmxlcyBBUEkgdG8gc2V0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW5nCi0jIG5vbi1JREFUIGNodW5rcyAoelRYdCwgaVRYdCwgaUNDUCwgYW5kIHVua25vd24gY2h1bmtzKS4gIFRoaXMgZmVhdHVyZQotIyB3YXMgYWRkZWQgYXQgbGlicG5nLTEuNS4zLgotb3B0aW9uIFdSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OIHJlcXVpcmVzIFdSSVRFCi1vcHRpb24gV1JJVEVfQ1VTVE9NSVpFX0NPTVBSRVNTSU9OIHJlcXVpcmVzIFdSSVRFCi0KLSMgQW55IGNodW5rcyB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluLCB5b3UgY2FuIHVuZGVmIGhlcmUuICBUaGUKLSMgb25lcyB0aGF0IGFsbG9jYXRlIG1lbW9yeSBtYXkgYmUgZXhwZWNpYWxseSBpbXBvcnRhbnQgKGhJU1QsCi0jIHRFWHQsIHpUWHQsIHRSTlMsIHBDQUwpLiAgT3RoZXJzIHdpbGwganVzdCBzYXZlIHRpbWUgYW5kIG1ha2UgcG5nX2luZm8KLSMgYSBiaXQgc21hbGxlci4KLQotIyBUaGUgc2l6ZSBvZiB0aGUgcG5nX3RleHQgc3RydWN0dXJlIGNoYW5nZWQgaW4gbGlicG5nLTEuMC42IHdoZW4KLSMgaVRYdCBzdXBwb3J0IHdhcyBhZGRlZC4gIGlUWHQgc3VwcG9ydCB3YXMgdHVybmVkIG9mZiBieSBkZWZhdWx0IHRocm91Z2gKLSMgbGlicG5nLTEuMi54LCB0byBzdXBwb3J0IG9sZCBhcHBzIHRoYXQgbWFsbG9jIHRoZSBwbmdfdGV4dCBzdHJ1Y3R1cmUKLSMgaW5zdGVhZCBvZiBjYWxsaW5nIHBuZ19zZXRfdGV4dCgpIGFuZCBsZXR0aW5nIGxpYnBuZyBtYWxsb2MgaXQuICBJdAotIyB3YXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQgaW4gbGlicG5nLTEuNC4wLgotCi1vcHRpb24gUkVBRF9BTkNJTExBUllfQ0hVTktTIHJlcXVpcmVzIFJFQUQKLSMgUE5HX1JFQURfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEIGlzIGRlcHJlY2F0ZWQuCi09IE5PX1JFQURfQU5DSUxMQVJZX0NIVU5LUyBSRUFEX0FOQ0lMTEFSWV9DSFVOS1NfTk9UX1NVUFBPUlRFRAotCi1vcHRpb24gV1JJVEVfQU5DSUxMQVJZX0NIVU5LUyByZXF1aXJlcyBXUklURQotIyBQTkdfV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVEIGlzIGRlcHJlY2F0ZWQuCi09IE5PX1dSSVRFX0FOQ0lMTEFSWV9DSFVOS1MgV1JJVEVfQU5DSUxMQVJZX0NIVU5LU19OT1RfU1VQUE9SVEVECi0KLSMgVGhlc2Ugb3B0aW9ucyBkaXNhYmxlICphbGwqIHRoZSB0ZXh0IGNodW5rcyBpZiB0dXJuZWQgb2ZmCi0KLW9wdGlvbiBURVhUIGRpc2FibGVkCi1vcHRpb24gUkVBRF9URVhUIHJlcXVpcmVzIFJFQURfQU5DSUxMQVJZX0NIVU5LUyBlbmFibGVzIFRFWFQKLW9wdGlvbiBXUklURV9URVhUIHJlcXVpcmVzIFdSSVRFX0FOQ0lMTEFSWV9DSFVOS1MgZW5hYmxlcyBURVhUCi0KLSMgTW92ZWQgdG8gcG5nbGliY29uZi5oIGF0IGxpYnBuZy0xLjUuMAotIyBGZWF0dXJlIHN1cHBvcnQ6IGluIDEuNCB0aGlzIHdhcyBpbiBwbmdjb25mLmgsIGJ1dCB0aGUgZm9sbG93aW5nCi0jIGZlYXR1cmVzIGhhdmUgbm8gYWZmZWN0IG9uIHRoZSBsaWJwbmcgQVBJLiAgQWRkIGxpYnJhcnkKLSMgb25seSBmZWF0dXJlcyB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4gIEFkZCBmZWF0dXJlcyB0aGF0Ci0jIGFmZmVjdCB0aGUgQVBJIGFib3ZlLiAgKE5vdGU6IHRoZSBsaXN0IG9mIGNodW5rcyBmb2xsb3dzCi0jIHRoZSBsaWJyYXJ5LW9ubHkgc2V0dGluZ3MuKQotIwotIyBCVUlMRCBUSU1FIE9OTFkgT1BUSU9OUwotIyAgIFRoZXNlIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgQVBJIGJ1dCByYXRoZXIgYWx0ZXIgaG93IHRoZQotIyAgIEFQSSBpcyBpbXBsZW1lbnRlZCwgdGhleSBnZXQgcmVjb3JkZWQgaW4gcG5nbGliY29uZi5oLCBidXQKLSMgICBjYW4ndCBiZSBjaGFuZ2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLQotIyBDb2xvcnNwYWNlIHN1cHBvcnQgKGVuYWJsZWQgYXMgcmVxdWlyZWQpOyBqdXN0IHRoZSBzdXBwb3J0IGZvciBjb2xvcmFudAotIyBpbmZvcm1hdGlvbi4gIEdhbW1hIHN1cHBvcnQsIGxpa2V3aXNlLCBpcyBqdXN0IHN1cHBvcnQgZm9yIHRoZSBnYW1tYQotIyBpbmZvcm1hdGlvbiwgUkVBRF9HQU1NQSBpcyByZXF1aXJlZCBmb3IgZ2FtbWEgdHJhbnNmb3JtYXRpb25zIChzbyBpdAotIyBpcyBwb3NzaWJsZSB0byByZWFkIFBORyBnYW1tYSB3aXRob3V0IGVuYWJsaW5nIGFsbCB0aGUgbGlicG5nIHRyYW5zZm9ybQotIyBjb2RlIC0gZG8gdGhpcyBmb3IgYXBwbGljYXRpb25zIHRoYXQgZG8gdGhlaXIgb3duIGdhbW1hIHByb2Nlc3NpbmcpCi0jCi0jIEFzIG9mIDEuNi4wIENPTE9SU1BBQ0UgaXMgb25seSB1c2VmdWwgaWYgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3NlcyB0aGUKLSMgaW5mb3JtYXRpb247IHRoaXMgaXMgYmVjYXVzZSB0aGUgbGlicmFyeSBkb2VzIG5vdCBkbyBhbnkgY29sb3JzcGFjZQotIyBwcm9jZXNzaW5nLCBpdCBqdXN0IHZhbGlkYXRlcyB0aGUgZGF0YSBpbiB0aGUgUE5HIGZpbGUuCi0KLW9wdGlvbiBHQU1NQSBkaXNhYmxlZAotb3B0aW9uIENPTE9SU1BBQ0UgZW5hYmxlcyBHQU1NQSBkaXNhYmxlZAotCi0jIFdoZW4gYW4gSUNDIHByb2ZpbGUgaXMgcmVhZCwgb3IgcG5nX3NldCwgaXQgd2lsbCBiZSBjaGVja2VkIGZvciBhIG1hdGNoCi0jIGFnYWluc3Qga25vd24gc1JHQiBwcm9maWxlcyBpZiB0aGUgc1JHQiBoYW5kbGluZyBpcyBlbmFibGVkLiAgVGhlCi0jIFBOR19zUkdCX1BST0ZJTEVfQ0hFQ0tTIHNldHRpbmcgY29udHJvbHMgaG93IG11Y2ggd29yayBpcyBkb25lIGR1cmluZyB0aGUKLSMgY2hlY2s6Ci0jCi0jIC0xOiBEb24ndCBkbyBhbnkgc1JHQiBwcm9maWxlIGNoZWNraW5nLgotIwotIyAgMDogSnVzdCB2YWxpZGF0ZSB0aGUgcHJvZmlsZSBNRDUgc2lnbmF0dXJlIGlmIHByZXNlbnQsIG90aGVyd2lzZSB1c2UKLSMgICAgIHRoZSBjaGVja3MgaW4gb3B0aW9uIDEuCi0jCi0jICAxOiBBZGRpdGlvbmFsbHkgY2hlY2sgdGhlIGxlbmd0aCwgaW50ZW50IGFuZCBhZGxlcjMyIGNoZWNrc3VtIG9mIHRoZQotIyAgICAgYWN0dWFsIGRhdGEuICAgSWYgZW5hYmxlZCB0aGlzIHdpbGwgcmVqZWN0IGtub3duIHByb2ZpbGVzIHRoYXQgaGF2ZQotIyAgICAgaGFkIHRoZSByZW5kZXJpbmcgaW50ZW50IGluIHRoZSBoZWFkZXIgY2hhbmdlZCBhcyB3ZWxsIGFzIG90aGVyIGVkaXRzCi0jICAgICBkb25lIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGNoZWNrc3VtLiAgU2VlIHRoZSBkaXNjdXNzaW9uIGJlbG93LgotIwotIyAgMjogQWRkaXRpb25hbGx5IGNoZWNrc3VtIGFsbCB0aGUgZGF0YSB1c2luZyB0aGUgZXRoZXJuZXQgQ1JDMzIgYWxnb3JpdGhtLgotIyAgICAgVGhpcyBtYWtlcyBpdCBtb3JlIGRpZmZpY3VsdCB0byBmYWtlIHByb2ZpbGVzIGFuZCBtYWtlcyBpdCBsZXNzIGxpa2VseQotIyAgICAgdG8gZ2V0IGEgZmFsc2UgcG9zaXRpdmUgb24gcHJvZmlsZXMgd2l0aCBubyBzaWduYXR1cmUsIGJ1dCBpcyBwcm9iYWJseQotIyAgICAganVzdCBhIHdhc3RlIG9mIHRpbWUgc2luY2UgYWxsIGN1cnJlbnRseSBhcHByb3ZlZCBJQ0Mgc1JHQiBwcm9maWxlcyBoYXZlCi0jICAgICBhIHNlY3VyZSBNRDUgc2lnbmF0dXJlLgotIwotIyBUaGUgcmVuZGVyaW5nIGludGVudC4gIEFuIElDQyBwcm9maWxlIHN0b3JlcyBhbiBpbnRlbmRlZCByZW5kZXJpbmcgaW50ZW50LAotIyBidXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgdmFsdWUgaW4gdGhlIHNpZ25hdHVyZS4gIFRoZSBpbnRlbnQgaXMgZG9jdW1lbnRlZAotIyBhcyB0aGUgaW50ZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBjb21iaW5pbmcgdHdvIHByb2ZpbGVzLiAgVGhlIHNSR0IKLSMgcHJvZmlsZSBpcyBpbnRlbmRlZCwgaG93ZXZlciwgdG8gYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgZm91ciBkZWZpbmVkIGludGVudHMuCi0jIEZvciB0aGlzIHJlYXNvbiB0aGUgc1JHQiBjaHVuayBpbmNsdWRlcyBhbiAnaW50ZW50JyB0byBiZSB1c2VkIHdoZW4gZGlzcGxheWluZwotIyB0aGUgaW1hZ2UgKGludGVudCBpcyByZWFsbHkgYSBwcm9wZXJ0eSBvZiB0aGUgaW1hZ2Ugbm90IHRoZSBwcm9maWxlLikKLSMKLSMgVW5mb3J0dW5hdGVseSB0aGUgaUNDUCBjaHVuayBkb2VzIG5vdC4gIEl0IG1heSB0aGVyZWZvcmUgYmUgdGhhdCBzb21lCi0jIGFwcGxpY2F0aW9ucyBtb2RpZnkgdGhlIGludGVudCBpbiBwcm9maWxlcyAoaW5jbHVkaW5nIHNSR0IgcHJvZmlsZXMpIHRvIHdvcmsKLSMgcm91bmQgdGhpcyBwcm9ibGVtLiAgU2VsZWN0aW5nIGFuIG9wdGlvbiBvdGhlciB0aGFuIG9wdGlvbiAnMCcgd2lsbCBjYXVzZSBzdWNoCi0jIG1vZGlmaWVkIHByb2ZpbGVzIHRvIGJlIHJlamVjdGVkLgotIwotIyBTZWN1cml0eS4gIFRoZSB1c2Ugb2YgQWRsZXIzMiBhbmQgQ1JDMzIgY2hlY2tzdW1zIGRvZXMgbm90IGhlbHAgc2lnbmlmaWNhbnRseQotIyB3aXRoIGFueSBzZWN1cml0eSBpc3N1ZXMuICBJdCBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gcHJvZHVjZSBhcmJpdHJhcnkgcHJvZmlsZXMKLSMgd2l0aCB0aGUgcmVxdWlyZWQgY2hlY2tzdW1zIG9uIGN1cnJlbnQgY29tcHV0ZXIgc3lzdGVtcy4gIE5ldmVydGhlbGVzcwotIyBzZWN1cml0eSBkb2VzIG5vdCBzZWVtIHRvIGJlIGFuIGlzc3VlIGJlY2F1c2UgdGhlIG9ubHkgY29uc2VxdWVuY2Ugb2YgYSBmYWxzZQotIyBwb3NpdGl2ZSBpcyBhIGZhbHNlIGFzc2VydGlvbiB0aGF0IHRoZSBwcm9maWxlIGlzIGFuIHNSR0IgcHJvZmlsZS4gIFRoaXMgbWlnaHQKLSMgYmUgdXNlZCB0byBoaWRlIGRhdGEgZnJvbSBsaWJwbmcgdXNpbmcgYXBwbGljYXRpb25zLCBidXQgaXQgZG9lc24ndCBzZWVtCi0jIHBvc3NpYmxlIHRvIGRhbWFnZSB0aGVtLgotCi1zZXR0aW5nIHNSR0JfUFJPRklMRV9DSEVDS1MgZGVmYXVsdCAyCi0KLSMgQXJ0aWZpY2lhbGx5IGFsaWduIG1lbW9yeSAtIHRoZSBjb2RlIHR5cGljYWxseSBhbGlnbnMgdG8gOCBieXRlCi0jIGJvdW5kYXJpZXMgaWYgdGhpcyBpcyBzd2l0Y2hlZCBvbiwgaXQncyBhIHNtYWxsIHdhc3RlIG9mIHNwYWNlCi0jIGJ1dCBjYW4gaGVscCAoaW4gdGhlb3J5KSBvbiBzb21lIGFyY2hpdGVjdHVyZXMuICBPbmx5IGFmZmVjdHMKLSMgaW50ZXJuYWwgc3RydWN0dXJlcy4gIEFkZGVkIGF0IGxpYnBuZyAxLjQuMAotCi1vcHRpb24gQUxJR05FRF9NRU1PUlkKLQotIyBCdWdneSBjb21waWxlcnMgKGUuZy4sIGdjYyAyLjcuMi4yKSBuZWVkIFBOR19OT19QT0lOVEVSX0lOREVYSU5HCi0jIFNlZSBwbmdbd3JddXRpbC5jLCBub3JtYWxseSB0aGlzIHNob3VsZCBhbHdheXMgYmUgKm9uKgotCi1vcHRpb24gUE9JTlRFUl9JTkRFWElORwotCi0jIE90aGVyIGRlZmluZXMgZm9yIHRoaW5ncyBsaWtlIG1lbW9yeSBhbmQgdGhlIGxpa2UgY2FuIGdvIGhlcmUuCi0KLSMgQlVJTEQgVElNRSBTRVRUSU5HUwotIyBMaWtlIGJ1aWxkIHRpbWUgb3B0aW9ucyB0aGVzZSBkbyBub3QgYWZmZWN0IHRoZSBBUEksIGJ1dCB0aGV5Ci0jIG1heSBiZSB1c2VmdWwgdG8gYXBwbGljYXRpb25zIGJlY2F1c2UgdGhleSByZWNvcmQgZGV0YWlscyBvZgotIyBob3cgdGhlIEFQSSB3aWxsIGJlaGF2ZSBwYXJ0aWN1bGFybHkgd2l0aCByZWdhcmQgdG8gb3ZlcmFsbAotIyBhY2N1cmFjeS4KLQotIyBUaGlzIGNvbnRyb2xzIGhvdyBmaW5lIHRoZSBxdWFudGl6aW5nIGdldHMuICBBcyB0aGlzIGFsbG9jYXRlcwotIyBhIGxhcmdpc2ggY2h1bmsgb2YgbWVtb3J5ICgzMkspLCB0aG9zZSB3aG8gYXJlIG5vdCBhcyBjb25jZXJuZWQKLSMgd2l0aCBxdWFudGl6aW5nIHF1YWxpdHkgY2FuIGRlY3JlYXNlIHNvbWUgb3IgYWxsIG9mIHRoZXNlLgotCi1zZXR0aW5nIFFVQU5USVpFX1JFRF9CSVRTIGRlZmF1bHQgNQotc2V0dGluZyBRVUFOVElaRV9HUkVFTl9CSVRTIGRlZmF1bHQgNQotc2V0dGluZyBRVUFOVElaRV9CTFVFX0JJVFMgZGVmYXVsdCA1Ci0KLSMgVGhpcyBjb250cm9scyBob3cgZmluZSB0aGUgZ2FtbWEgY29ycmVjdGlvbiBiZWNvbWVzIHdoZW4geW91Ci0jIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gOCBiaXRzIGFueXdheS4gIEluY3JlYXNpbmcgdGhpcyB2YWx1ZQotIyByZXN1bHRzIGluIG1vcmUgbWVtb3J5IGJlaW5nIHVzZWQsIGFuZCBtb3JlIHBvdygpIGZ1bmN0aW9ucwotIyBiZWluZyBjYWxsZWQgdG8gZmlsbCBpbiB0aGUgZ2FtbWEgdGFibGVzLiAgRG9uJ3Qgc2V0IHRoaXMgdmFsdWUKLSMgbGVzcyB0aGFuIDgsIGFuZCBldmVuIHRoYXQgbWF5IG5vdCB3b3JrIChJIGhhdmVuJ3QgdGVzdGVkIGl0KS4KLQotc2V0dGluZyBNQVhfR0FNTUFfOCBkZWZhdWx0IDExCi0KLSMgVGhpcyBjb250cm9scyBob3cgbXVjaCBhIGRpZmZlcmVuY2UgaW4gZ2FtbWEgd2UgY2FuIHRvbGVyYXRlIGJlZm9yZQotIyB3ZSBhY3R1YWxseSBzdGFydCBkb2luZyBnYW1tYSBjb252ZXJzaW9uLCBpdCdzIGEgZml4ZWQgcG9pbnQgdmFsdWUsCi0jIHNvIHRoZSBkZWZhdWx0IGJlbG93IGlzIDAuMDUsIG1lYW5pbmcgbGlicG5nIGlnbm9yZXMgY29ycmVjdGlvbnMgaW4KLSMgdGhlIHJhbmdlIDAuOTUgdG8gMS4wNQotCi1zZXR0aW5nIEdBTU1BX1RIUkVTSE9MRF9GSVhFRCBkZWZhdWx0IDUwMDAKLQotIyBQcmVjaXNpb24gdG8gdXNlIHdoZW4gY29udmVydGluZyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGEgUE5HCi0jIGV4dGVuc2lvbiBmb3JtYXQgc3RyaW5nIGluIGFuIHNDQUwgY2h1bmsgKG9ubHkgcmVsZXZhbnQgaWYgdGhlCi0jIGZsb2F0aW5nIHBvaW50IEFQSSBpcyBlbmFibGVkKQotCi1zZXR0aW5nIHNDQUxfUFJFQ0lTSU9OIGRlZmF1bHQgNQotCi0jIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlciwgYW5kIHRodXMgdGhlIHNpemUgb2YKLSMgYW4gSURBVCBjaHVuay4gIE1ha2UgdGhpcyB3aGF0ZXZlciBzaXplIHlvdSBmZWVsIGlzIGJlc3QgZm9yIHlvdXIKLSMgbWFjaGluZS4gIE9uZSBvZiB0aGVzZSB3aWxsIGJlIGFsbG9jYXRlZCBwZXIgcG5nX3N0cnVjdC4gIFdoZW4gdGhpcwotIyBpcyBmdWxsLCBpdCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlIGRpc2ssIGFuZCBkb2VzIHNvbWUgb3RoZXIKLSMgY2FsY3VsYXRpb25zLiAgTWFraW5nIHRoaXMgYW4gZXh0cmVtZWx5IHNtYWxsIHNpemUgbWF5IHNsb3cKLSMgdGhlIGxpYnJhcnkgZG93biwgYnV0IHlvdSBtYXkgd2FudCB0byBleHBlcmltZW50IHRvIGRldGVybWluZQotIyB3aGVyZSBpdCBiZWNvbWVzIHNpZ25pZmljYW50LCBpZiB5b3UgYXJlIGNvbmNlcm5lZCB3aXRoIG1lbW9yeQotIyB1c2FnZS4gIE5vdGUgdGhhdCB6bGliIGFsbG9jYXRlcyBhdCBsZWFzdCAzMktiIGFsc28uICBGb3IgcmVhZGVycywKLSMgdGhpcyBkZXNjcmliZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhdmFpbGFibGUgdG8gcmVhZCB0aGUgZGF0YSBpbi4KLSMgVW5sZXNzIHRoaXMgZ2V0cyBzbWFsbGVyIHRoYW4gdGhlIHNpemUgb2YgYSByb3cgKGNvbXByZXNzZWQpLAotIyBpdCBzaG91bGQgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlIGhvdyBiaWcgdGhpcyBpcy4KLQotc2V0dGluZyBaQlVGX1NJWkUgZGVmYXVsdCA4MTkyCi0KLSMgVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgZGVjb21wcmVzc2lvbiBidWZmZXIgdXNlZCB3aGVuIGNvdW50aW5nIG9yIGNoZWNraW5nCi0jIHRoZSBkZWNvbXByZXNzZWQgc2l6ZSBvZiBhbiBMWiBzdHJlYW0gZnJvbSBhIGNvbXByZXNzZWQgYW5jaWxsaWFyeSBjaHVuazsgdGhlCi0jIGRlY29tcHJlc3NlZCBkYXRhIGlzIG5ldmVyIHVzZWQgc28gYSBkaWZmZXJlbnQgc2l6ZSBtYXkgYmUgb3B0aW1hbC4gIFRoaXMgc2l6ZQotIyB3YXMgZGV0ZXJtaW5lZCB1c2luZyBjb250cmliL2xpYnRlc3RzL3RpbWVwbmcuYyB3aXRoIGNvbXByZXNzZWQgelRYdCBkYXRhCi0jIGFyb3VuZCAxMU1CeXRlIGluIHNpemUuICBTbGlnaHQgc3BlZWQgaW1wcm92ZW1lbnRzICh1cCB0byBhYm91dCAxNCUgaW4KLSMgdGltZXBuZykgY2FuIGJlIGFjaGlldmVkIGJ5IHZlcnkgbGFyZ2UgaW5jcmVhc2VzICh0byAzMmtieXRlKSBvbiByZWd1bGFyIGRhdGEsCi0jIGJ1dCBoaWdobHkgY29tcHJlc3NpYmxlIGRhdGEgc2hvd3Mgb25seSBhcm91bmQgMiUgaW1wcm92ZW1lbnQuICAgVGhlIHNpemUgaXMKLSMgY2hvc2VuIHRvIG1pbmltaXplIHRoZSBlZmZlY3RzIG9mIERvUyBhdHRhY2tzIGJhc2VkIG9uIHVzaW5nIHZlcnkgbGFyZ2UKLSMgYW1vdW50cyBvZiBoaWdobHkgY29tcHJlc3NpYmxlIGRhdGEuCi0KLXNldHRpbmcgSU5GTEFURV9CVUZfU0laRSBkZWZhdWx0IDEwMjQKLQotIyBUaGlzIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBJREFUIGRhdGEgdGhhdCB0aGUgc2VxdWVudGlhbCByZWFkZXIgd2lsbAotIyBwcm9jZXNzIGF0IG9uZSB0aW1lLiAgVGhlIHNldHRpbmcgZG9lcyBub3QgYWZmZWN0IHRoZSBzaXplIG9mIElEQVQgY2h1bmtzCi0jIHJlYWQsIGp1c3QgdGhlIGFtb3VudCByZWFkIGF0IG9uY2UuICBOZWl0aGVyIGRvZXMgaXQgYWZmZWN0IHRoZSBwcm9ncmVzc2l2ZQotIyByZWFkZXIsIHdoaWNoIHByb2Nlc3NlcyBqdXN0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGUgYXBwbGljYXRpb24gZ2l2ZXMgaXQuCi0jIFRoZSBzZXF1ZW50aWFsIHJlYWRlciBpcyBjdXJyZW50bHkgdW5hYmxlIHRvIHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBJREFUIGF0Ci0jIG9uY2UgLSBpdCBoYXMgdG8gcmVhZCBhbmQgcHJvY2VzcyBlYWNoIG9uZSBpbiB0dXJuLiAgVGhlcmUgaXMgbm8gcG9pbnQgc2V0dGluZwotIyB0aGlzIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIElEQVQgY2h1bmtzIHR5cGljYWxseSBlbmNvdW50ZXJlZCAoaXQgd291bGQKLSMganVzdCB3YXN0ZSBtZW1vcnkpIGJ1dCB0aGVyZSBtYXkgYmUgc29tZSBwb2ludCBpbiByZWR1Y2luZyBpdCBiZWxvdyB0aGUgdmFsdWUKLSMgb2YgWkJVRl9TSVpFICh0aGUgc2l6ZSBvZiBJREFUIGNodW5rcyB3cml0dGVuIGJ5IGxpYnBuZy4pCi0KLXNldHRpbmcgSURBVF9SRUFEX1NJWkUgZGVmYXVsdCBQTkdfWkJVRl9TSVpFCi0KLSMgQW5jaWxsYXJ5IGNodW5rcwotY2h1bmsgYktHRAotY2h1bmsgY0hSTSBlbmFibGVzIENPTE9SU1BBQ0UKLWNodW5rIGdBTUEgZW5hYmxlcyBHQU1NQQotY2h1bmsgaElTVAotY2h1bmsgaUNDUCBlbmFibGVzIENPTE9SU1BBQ0UsIEdBTU1BCi1jaHVuayBpVFh0IGVuYWJsZXMgVEVYVAotY2h1bmsgb0ZGcwotY2h1bmsgcENBTAotY2h1bmsgcEhZcwotY2h1bmsgc0JJVAotY2h1bmsgc0NBTAotY2h1bmsgc1BMVAotY2h1bmsgc1JHQiBlbmFibGVzIENPTE9SU1BBQ0UsIEdBTU1BLCBTRVRfT1BUSU9OCi1jaHVuayB0RVh0IHJlcXVpcmVzIFRFWFQKLWNodW5rIHRJTUUKLWNodW5rIHRSTlMKLWNodW5rIHpUWHQgZW5hYmxlcyBURVhUCi0KLSMgVGhpcyBvbmx5IGFmZmVjdHMgc3VwcG9ydCBvZiB0aGUgb3B0aW9uYWwgUExURSBjaHVuayBpbiBSR0IgYW5kIFJHQkEKLSMgaW1hZ2VzLiAgTm90aWNlIHRoYXQgUkVBRF9BTkNJTExBUllfQ0hVTktTIHRoZXJlZm9yZSBkaXNhYmxlcyBwYXJ0Ci0jIG9mIHRoZSByZWd1bGFyIGNodW5rIHJlYWRpbmcgdG9vLgotCi1vcHRpb24gUkVBRF9PUFRfUExURSByZXF1aXJlcyBSRUFEX0FOQ0lMTEFSWV9DSFVOS1MKLQotIyBVbmtub3duIGNodW5rIGhhbmRsaW5nCi0jCi0jICdVTktOT1dOX0NIVU5LUycgaXMgYSBnbG9iYWwgb3B0aW9uIHRvIGRpc2FibGUgYWxsIHVua25vd24gY2h1bmsgaGFuZGxpbmcgb24KLSMgcmVhZCBvciB3cml0ZTsgZXZlcnl0aGluZyBlbHNlIGJlbG93IHJlcXVpcmVzIGl0IChkaXJlY3RseSBvciBpbmRpcmVjdGx5KS4KLW9wdGlvbiBVTktOT1dOX0NIVU5LUwotCi0jIFRoZXJlIGFyZSB0aHJlZSBtYWluIG9wdGlvbnMgdG8gY29udHJvbCB0aGUgYWJpbGl0eSB0byByZWFkIGFuZCB3cml0ZSB1bmtub3duCi0jIGNodW5rcy4gIElmIGVpdGhlciByZWFkIG9wdGlvbiBpcyB0dXJuZWQgb24gdGhlbiB1bmtub3duIGNodW5rcyB3aWxsIGJlIHJlYWQsCi0jIG90aGVyd2lzZSB0aGV5IGFyZSBza2lwcGVkLiAgSWYgdGhlIHdyaXRlIG9wdGlvbiBpcyB0dXJuZWQgb24gdW5rbm93biBjaHVua3MKLSMgc2V0IGJ5IHBuZ19zZXRfdW5rbm93bl9jaHVua3Mgd2lsbCBiZSB3cml0dGVuIG90aGVyd2lzZSBpdCBpcyBhbiBlcnJvciB0byBjYWxsCi0jIHRoYXQgQVBJIG9uIGEgd3JpdGUgc3RydWN0Lgotb3B0aW9uIFdSSVRFX1VOS05PV05fQ0hVTktTIHJlcXVpcmVzIFdSSVRFIHJlcXVpcmVzIFVOS05PV05fQ0hVTktTCi1vcHRpb24gV1JJVEVfVU5LTk9XTl9DSFVOS1MgZW5hYmxlcyBTVE9SRV9VTktOT1dOX0NIVU5LUwotCi0jIFRoZSBmaXJzdCB3YXkgdG8gcmVhZCB1c2VyIGNodW5rcyBpcyB0byBoYXZlIGxpYnBuZyBzYXZlIHRoZW0gZm9yIGEgbGF0ZXIgY2FsbAotIyB0byBwbmdfZ2V0X3Vua25vd25fY2h1bmtzLCB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsCi0jIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyB0byBjYXVzZSB0aGlzIHRvIGFjdHVhbGx5IGhhcHBlbiAoc2VlIHBuZy5oKQotb3B0aW9uIFNBVkVfVU5LTk9XTl9DSFVOS1MgcmVxdWlyZXMgUkVBRCByZXF1aXJlcyBTRVRfVU5LTk9XTl9DSFVOS1MKLW9wdGlvbiBTQVZFX1VOS05PV05fQ0hVTktTIGVuYWJsZXMgUkVBRF9VTktOT1dOX0NIVU5LUywgU1RPUkVfVU5LTk9XTl9DSFVOS1MKLQotIyBUaGUgc2Vjb25kIGFwcHJvYWNoIGlzIHRvIHVzZSBhbiBhcHBsaWNhdGlvbiBwcm92aWRlZCBjYWxsYmFjayB0byBwcm9jZXNzIHRoZQotIyBjaHVua3MsIHRoZSBjYWxsYmFjayBjYW4gZWl0aGVyIGhhbmRsZSB0aGUgY2h1bmsgZW50aXJlbHkgaXRzZWxmIG9yIHJlcXVlc3QKLSMgdGhhdCBsaWJwbmcgc3RvcmUgdGhlIGNodW5rIGZvciBsYXRlciByZXRyaWV2YWwgdmlhIHBuZ19nZXRfdW5rbm93bl9jaHVua3MuCi0jCi0jIE5PVEU6IElmIFNUT1JFX1VOS05PV05fQ0hVTktTIGlzIG5vdCBlbmFibGVkICh3aGljaCBpcyB0aGUgZGVmYXVsdCBpZgotIyBib3RoIFNBVkVfVU5LTk9XTl9DSFVOS1MgYW5kIFdSSVRFX1VOS05PV05fQ0hVTktTIGFyZSBkaXNhYmxlZCkgdGhlbiBhCi0jIDAgcmVzdWx0IGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgaWdub3JlZCBiZWNhdXNlIG5vIHN1cHBvcnQgZm9yIHNhdmluZwotIyB1bmtub3duIGNodW5rcyBoYXMgYmVlbiBjb21waWxlZCBpbi4gIFRoZSBub3JtYWwgc3ltcHRvbSBpcyB0aGF0IHlvdXIgYXBwCi0jIGZhaWxzIHRvIGNvbXBpbGUgYmVjYXVzZSBwbmdfZ2V0X3Vua25vd25fY2h1bmtzIGlzIG5vIGxvbmdlciBkZWZpbmVkIGluIHBuZy5oLgotIyBJZiB5b3UgZW5jb3VudGVyIHRoaXMgaXNzdWUgc2ltcGx5IGVuYWJsZSBTVE9SRV9VTktOT1dOX0NIVU5LUyBpbiB5b3VyIGJ1aWxkLgotIwotIyBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gJ1dSSVRFX1VTRVJfQ0hVTktTJyBzbyB0aGUgVVNFUl9DSFVOS1Mgb3B0aW9uIGlzIGFsd2F5cwotIyB0aGUgc2FtZSBhcyBSRUFEX1VTRVJfQ0hVTktTIGF0IHByZXNlbnQKLW9wdGlvbiBSRUFEX1VTRVJfQ0hVTktTIHJlcXVpcmVzIFJFQUQsIFVOS05PV05fQ0hVTktTCi1vcHRpb24gUkVBRF9VU0VSX0NIVU5LUyBlbmFibGVzIFJFQURfVU5LTk9XTl9DSFVOS1MsIFVTRVJfQ0hVTktTCi0KLSMgVHdvIGZ1cnRoZXIgb3B0aW9ucyBhcmUgcHJvdmlkZWQgdG8gYWxsb3cgZGV0YWlsZWQgY29udHJvbCBvZiB0aGUgaGFuZGxpbmcuCi0jIFRoZSBmaXJzdCBlbmFibGVzIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rczsgdGhpcyBhbGxvd3MgdGhlIGRlZmF1bHQgdG8gYmUKLSMgY2hhbmdlZCBmcm9tIGRpc2NhcmRpbmcgdW5rbm93biBjaHVua3MgYW5kIGFsbG93cyBwZXItY2h1bmsgY29udHJvbC4gIFRoaXMgaXMKLSMgcmVxdWlyZWQgdG8gdXNlIHRoZSBTQVZFX1VOS05PV05fQ0hVTktTIG9wdGlvbi4gIElmIGVuYWJsZWQgdGhpcyBvcHRpb24gYWxzbwotIyBhcHBsaWVzIHRvIHdyaXRlIChzZWUgcG5nLmgpLCBvdGhlcndpc2UgdGhlIHdyaXRlIEFQSSBzaW1wbHkgd3JpdGVzIGFsbCB0aGUKLSMgY2h1bmtzIGl0IGlzIGdpdmVuLgotIwotIyBUaGUgc2Vjb25kIG9wdGlvbiBleHRlbmRzIHRoZSB1bmtub3duIGhhbmRsaW5nIHRvIGFsbG93IGtub3duIGNodW5rcyB0byBiZQotIyBoYW5kbGVkIGFzIHRob3VnaCB0aGV5IHdlcmUgdW5rbm93bi4gIFRoaXMgb3B0aW9uIGRvZXNuJ3QgY2hhbmdlIGFueSBBUElzLCBpdAotIyBtZXJlbHkgdHVybnMgb24gdGhlIGNvZGUgdG8gY2hlY2sga25vd24gYXMgd2VsbCBhcyB1bmtub3duIGNodW5rcy4KLSMKLSMgVGhpcyBvcHRpb24gbm8gbG9uZ2VyIGFmZmVjdHMgdGhlIHdyaXRlIGNvZGUuICBJdCBjYW4gYmUgc2FmZWx5IGRpc2FibGVkIGFuZAotIyB3aWxsIHByZXZlbnQgYXBwbGljYXRpb25zIHN0b3BwaW5nIGxpYnBuZyByZWFkaW5nIGtub3duIGNodW5rcy4KLW9wdGlvbiBTRVRfVU5LTk9XTl9DSFVOS1MgcmVxdWlyZXMgVU5LTk9XTl9DSFVOS1MKLW9wdGlvbiBIQU5ETEVfQVNfVU5LTk9XTiByZXF1aXJlcyBTRVRfVU5LTk9XTl9DSFVOS1MKLQotIyBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgYWJvdmUgYW5kIHNob3VsZCBub3QgYmUgdHVybmVkIG9uCi0jIGV4cGxpY2l0bHkuCi1vcHRpb24gUkVBRF9VTktOT1dOX0NIVU5LUyByZXF1aXJlcyBVTktOT1dOX0NIVU5LUyBkaXNhYmxlZAotb3B0aW9uIFNUT1JFX1VOS05PV05fQ0hVTktTIHJlcXVpcmVzIFVOS05PV05fQ0hVTktTIGRpc2FibGVkCi0KLW9wdGlvbiBDT05WRVJUX3RJTUUgcmVxdWlyZXMgV1JJVEVfQU5DSUxMQVJZX0NIVU5LUwotIyBUaGUgInRtIiBzdHJ1Y3R1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzQ0UKLQotQCNpZmRlZiBfV0lOMzJfV0NFCi1AIyAgIGRlZmluZSBQTkdfTk9fQ09OVkVSVF90SU1FCi1AI2VuZGlmCi0KLW9wdGlvbiBXUklURV9GSUxURVIgcmVxdWlyZXMgV1JJVEUKLQotb3B0aW9uIFNBVkVfSU5UXzMyIGRpc2FibGVkCi0jIHBuZ19zYXZlX2ludF8zMiBpcyByZXF1aXJlZCBpbnRlcm5hbGx5IGZvciB3cml0aW5nIHRoZSBhbmNpbGxhcnkgY2h1bmtzIG9GRnMKLSMgYW5kIHBDQUwgYW5kIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgaUNDUCAoZm9yIHRoZSBnZW5lcmF0aW9uL2NoZWNraW5nIG9mCi0jIHRoZSBjb3JyZXNwb25kaW5nIGNIUk0vZ0FNQSBjaHVua3MpIGlmIGZ1bGwgSUNDIGlzIHN1cHBvcnRlZC4KLQotIyBhZGRlZCBhdCBsaWJwbmctMS41LjQKLQotb3B0aW9uIFdSSVRFX09QVElNSVpFX0NNRiByZXF1aXJlcyBXUklURQotCi1vcHRpb24gUkVBRF9DT01QUkVTU0VEX1RFWFQgZGlzYWJsZWQKLW9wdGlvbiBSRUFEX2lDQ1AgZW5hYmxlcyBSRUFEX0NPTVBSRVNTRURfVEVYVAotb3B0aW9uIFJFQURfaVRYdCBlbmFibGVzIFJFQURfQ09NUFJFU1NFRF9URVhUCi1vcHRpb24gUkVBRF96VFh0IGVuYWJsZXMgUkVBRF9DT01QUkVTU0VEX1RFWFQKLQotb3B0aW9uIFdSSVRFX29GRnMgZW5hYmxlcyBTQVZFX0lOVF8zMgotb3B0aW9uIFdSSVRFX3BDQUwgZW5hYmxlcyBTQVZFX0lOVF8zMgotb3B0aW9uIFdSSVRFX2NIUk0gZW5hYmxlcyBTQVZFX0lOVF8zMgotCi1vcHRpb24gV1JJVEVfQ09NUFJFU1NFRF9URVhUIGRpc2FibGVkCi1vcHRpb24gV1JJVEVfaUNDUCBlbmFibGVzIFdSSVRFX0NPTVBSRVNTRURfVEVYVAotb3B0aW9uIFdSSVRFX2lUWHQgZW5hYmxlcyBXUklURV9DT01QUkVTU0VEX1RFWFQKLW9wdGlvbiBXUklURV96VFh0IGVuYWJsZXMgV1JJVEVfQ09NUFJFU1NFRF9URVhUCi0KLSMgVHVybiB0aGlzIG9mZiB0byBkaXNhYmxlIHBuZ19yZWFkX3BuZygpIGFuZCBwbmdfd3JpdGVfcG5nKCkgYW5kCi0jIGxlYXZlIHRoZSByb3dfcG9pbnRlcnMgbWVtYmVyIG91dCBvZiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0KLW9wdGlvbiBJTkZPX0lNQUdFCi0KLSMgYWRkZWQgYXQgbGlicG5nLTEuNS4xMAotIyBUdXJuIHRoaXMgb2ZmIHRvIGRpc2FibGUgd2FybmluZyBhYm91dCBpbnZhbGlkIHBhbGV0dGUgaW5kZXggYW5kCi0jIGxlYXZlIHRoZSBudW1fcGFsZXR0ZV9tYXggbWVtYmVyIG91dCBvZiB0aGUgcG5nIHN0cnVjdHVyZS4KLQotb3B0aW9uIENIRUNLX0ZPUl9JTlZBTElEX0lOREVYIGVuYWJsZXMgUkVBRF9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWAotb3B0aW9uIENIRUNLX0ZPUl9JTlZBTElEX0lOREVYIGVuYWJsZXMgV1JJVEVfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVgKLW9wdGlvbiBSRUFEX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYIHJlcXVpcmVzIFJFQUQsIENIRUNLX0ZPUl9JTlZBTElEX0lOREVYCi1vcHRpb24gV1JJVEVfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVggcmVxdWlyZXMgV1JJVEUsIENIRUNLX0ZPUl9JTlZBTElEX0lOREVYCi0KLSMgYWRkZWQgYXQgbGlicG5nLTEuNS4xNQotb3B0aW9uIEdFVF9QQUxFVFRFX01BWCBlbmFibGVzIFJFQURfR0VUX1BBTEVUVEVfTUFYIFdSSVRFX0dFVF9QQUxFVFRFX01BWAotb3B0aW9uIFJFQURfR0VUX1BBTEVUVEVfTUFYIHJlcXVpcmVzIFJFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVggZGlzYWJsZWQKLW9wdGlvbiBXUklURV9HRVRfUEFMRVRURV9NQVggcmVxdWlyZXMgV1JJVEVfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVggZGlzYWJsZWQKLQotIyBTaW1wbGlmaWVkIEFQSSBvcHRpb25zIChhZGRlZCBhdCBsaWJwbmctMS42LjApCi0jICBJbiBsaWJwbmcgMS42LjggdGhlIGhhbmRsaW5nIG9mIHRoZXNlIG9wdGlvbnMgd2FzIGNoYW5nZWQgdG8gdXNlZCAncmVxdWlyZXMnCi0jICB0aHJvdWdob3V0LCBzbyB0aGF0IGRpc2FibGluZyBzb21lIG9mIHRoZSBsb3cgbGV2ZWwgc3VwcG9ydCBhbHdheXMgZGlzYWJsZXMKLSMgIHRoZSBiYXNlIHNpbXBsaWZpZWQgcmVhZC93cml0ZSBBUEkuICBUaGlzIG11Y2ggc2ltcGxpZmllcyB0aGUgaGFuZGxpbmcgYW5kCi0jICBtYWtlcyAnZXZlcnl0aGluZyA9IG9mZicgd29yayBpbiBhIG1vcmUgaW50dWl0aXZlIHdheS4gIEl0IGVsaW1pbmF0ZXMgYQotIyAgcHJldmlvdXNseSByZXBvcnRlZCBmZWF0dXJlIHRoYXQgQVBJcyBwcmV2aW91c2x5IGVuYWJsZWQgYnkgdGhlIHNpbXBsaWZpZWQKLSMgIEFQSSBjb3VsZG4ndCBiZSB0dXJuZWQgb2ZmIHdpdGhvdXQgZXhwbGljaXRseSB0dXJuaW5nIG9mZiB0aGUgc2ltcGxpZmllZAotIyAgQVBJcy4KLSMKLSMgUmVhZDoKLW9wdGlvbiBTSU1QTElGSUVEX1JFQUQsCi0gICByZXF1aXJlcyBTRVFVRU5USUFMX1JFQUQsIFJFQURfVFJBTlNGT1JNUywgU0VUSk1QLCBCRU5JR05fRVJST1JTLAotICAgICAgUkVBRF9FWFBBTkQsIFJFQURfMTZCSVQsIFJFQURfRVhQQU5EXzE2LCBSRUFEX1NDQUxFXzE2X1RPXzgsCi0gICAgICBSRUFEX1JHQl9UT19HUkFZLCBSRUFEX0FMUEhBX01PREUsIFJFQURfQkFDS0dST1VORCwgUkVBRF9TVFJJUF9BTFBIQSwKLSAgICAgIFJFQURfRklMTEVSLCBSRUFEX1NXQVAsIFJFQURfUEFDSywgUkVBRF9HUkFZX1RPX1JHQiwgUkVBRF9HQU1NQSwKLSAgICAgIFJFQURfdFJOUywgUkVBRF9iS0dELCBSRUFEX2dBTUEsIFJFQURfY0hSTSwgUkVBRF9zUkdCLCBSRUFEX3NCSVQKLQotIyBBRklSU1QgYW5kIEJHUiByZWFkIG9wdGlvbnM6Ci0jICBQcmlvciB0byBsaWJwbmcgMS42LjggdGhlc2Ugd2VyZSBkaXNhYmxlZCBidXQgc3dpdGNoZWQgb24gaWYgdGhlIGxvdyBsZXZlbAotIyAgbGlicG5nIHJvdXRpbmVzIHRoYXQgZG8gdGhlIHN3YXBzIHdlcmUgZW5hYmxlZC4gIFRoaXMgd29ya2VkIGJ1dCB3YXMKLSMgIGNvbmZ1c2luZy4gIEluIGxpYnBuZyAxLjYuOCB0aGUgb3B0aW9ucyB3ZXJlIGNoYW5nZWQgdG8gc2ltcGxlICdyZXF1aXJlcycKLSMgIGFuZCBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgVGhpcyBzaG91bGQgd29yayB0aGUgc2FtZSB3YXkgaW4gcHJhY3RpY2UuCi1vcHRpb24gU0lNUExJRklFRF9SRUFEX0FGSVJTVCBlbmFibGVzIEZPUk1BVF9BRklSU1QsCi0gICByZXF1aXJlcyBTSU1QTElGSUVEX1JFQUQgUkVBRF9TV0FQX0FMUEhBCi0KLW9wdGlvbiBTSU1QTElGSUVEX1JFQURfQkdSIGVuYWJsZXMgRk9STUFUX0JHUiwKLSAgIHJlcXVpcmVzIFNJTVBMSUZJRURfUkVBRCBSRUFEX0JHUgotCi0jIFdyaXRlOgotb3B0aW9uIFNJTVBMSUZJRURfV1JJVEUsCi0gICByZXF1aXJlcyBXUklURSwgU0VUSk1QLCBXUklURV9TV0FQLCBXUklURV9QQUNLLAotICAgICAgV1JJVEVfdFJOUywgV1JJVEVfZ0FNQSwgV1JJVEVfc1JHQiwgV1JJVEVfY0hSTQotCi0jIDEuNi4yMjogYWxsb3cgc2ltcGxpZmllZCB3cml0ZSB3aXRob3V0IHN0ZGlvIHN1cHBvcnQ6Ci1vcHRpb24gU0lNUExJRklFRF9XUklURV9TVERJTyByZXF1aXJlcyBTSU1QTElGSUVEX1dSSVRFIFNURElPCi0KLW9wdGlvbiBTSU1QTElGSUVEX1dSSVRFX0FGSVJTVCBlbmFibGVzIEZPUk1BVF9BRklSU1QsCi0gICByZXF1aXJlcyBTSU1QTElGSUVEX1dSSVRFIFdSSVRFX1NXQVBfQUxQSEEKLQotb3B0aW9uIFNJTVBMSUZJRURfV1JJVEVfQkdSIGVuYWJsZXMgRk9STUFUX0JHUiwKLSAgIHJlcXVpcmVzIFNJTVBMSUZJRURfV1JJVEUgV1JJVEVfQkdSCi0KLSMgRm9ybWF0czoKLW9wdGlvbiBGT1JNQVRfQUZJUlNUIGRpc2FibGVkCi1vcHRpb24gRk9STUFUX0JHUiBkaXNhYmxlZApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wbmdsaWJjb25mLm1hayBiL3NjcmlwdHMvcG5nbGliY29uZi5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxMjVjYTIuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wbmdsaWJjb25mLm1haworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMhL3Vzci9iaW4vbWFrZSAtZgotIyBwbmdsaWJjb25mLm1hayAtIHN0YW5kYXJkIG1ha2UgbGluZXMgZm9yIHBuZ2xpYmNvbmYuaAotIwotIyBUaGVzZSBsaW5lcyBhcmUgY29waWVkIGZyb20gTWFrZWZpbGUuYW0sIHRoZXkgaWxsdXN0cmF0ZQotIyBob3cgdG8gYXV0b21hdGUgdGhlIGJ1aWxkIG9mIHBuZ2xpYmNvbmYuaCBmcm9tIHNjcmlwdHMvcG5nbGliY29uZi5kZmEKLSMgZ2l2ZW4ganVzdCAnYXdrJywgYSBDIHByZXByb2Nlc3NvciBhbmQgc3RhbmRhcmQgY29tbWFuZCBsaW5lIHV0aWxpdGllcwotCi0jIE92ZXJyaWRlIGFzIGFwcHJvcHJpYXRlLCB0aGVzZSBkZWZpbml0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBvbgotIyB0aGUgbWFrZSBjb21tYW5kIGxpbmUgKEFXSz0nbmF3aycgZm9yIGV4YW1wbGUpLgotQVdLID0gZ2F3awotQVdLID0gbWF3awotQVdLID0gbmF3awotQVdLID0gb25lLXRydWUtYXdrCi1BV0sgPSBhd2sgICMgQ3Jhc2hlcyBvbiBTdW5PUyA1LjEwIC0gdXNlICduYXdrJwotQ1BQID0gJChDQykgLUUgIyBPbiBTVU4gT1MgNS4xMCBpZiB0aGlzIGNhdXNlcyBwcm9ibGVtcyB1c2UgL2xpYi9jcHAKLQotTU9WRSA9IG12Ci1ERUxFVEUgPSBybSAtZgotRUNITyA9IGVjaG8KLURGQV9YVFJBID0gIyBQdXQgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgaGVyZSwgc2VlIHNjcmlwdHMvcG5nbGliY29uZi5kZmEuICBFZzoKLSMgREZBX1hUUkEgPSBwbmd1c3IuZGZhCi0KLSMgQ1BQRkxBR1Mgc2hvdWxkIGNvbnRhaW4gdGhlIG9wdGlvbnMgdG8gY29udHJvbCB0aGUgcmVzdWx0LAotIyBidXQgREVGUyBhbmQgQ0ZMQUdTIGFyZSBhbHNvIHN1cHBvcnRlZCBoZXJlLCBvdmVycmlkZQotIyBhcyBhcHByb3ByaWF0ZQotREZORkxBR1MgPSAkKERFRlMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKQotCi0jIHNyY2RpciBpcyBhIGRlZmFjdG8gc3RhbmRhcmQgZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgc291cmNlCi1zcmNkaXIgPSAuCi0KLSMgVGhlIHN0YW5kYXJkIHBuZ2xpYmNvbmYuaCBleGlzdHMgYXMgc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQsCi0jIGNvcHkgdGhpcyBpZiB0aGUgZm9sbG93aW5nIGRvZXNuJ3Qgd29yay4KLXBuZ2xpYmNvbmYuaDogcG5nbGliY29uZi5kZm4KLQkkKERFTEVURSkgJEAgcG5nbGliY29uZi5jIHBuZ2xpYmNvbmYub3V0IHBuZ2xpYmNvbmYudG1wCi0JJChFQ0hPKSAnI2luY2x1ZGUgInBuZ2xpYmNvbmYuZGZuIicgPnBuZ2xpYmNvbmYuYwotCSQoRUNITykgIklmICckKENDKSAtRScgY3Jhc2hlcyB0cnkgL2xpYi9jcHAgKGUuZy4gQ1BQPScvbGliL2NwcCcpIiA+JjIKLQkkKENQUCkgJChERk5GTEFHUykgcG5nbGliY29uZi5jID5wbmdsaWJjb25mLm91dAotCSQoQVdLKSAtZiAiJChzcmNkaXIpL3NjcmlwdHMvZGZuLmF3ayIgb3V0PSJwbmdsaWJjb25mLnRtcCIgcG5nbGliY29uZi5vdXQgMT4mMgotCSQoTU9WRSkgcG5nbGliY29uZi50bXAgJEAKLQotcG5nbGliY29uZi5kZm46ICQoc3JjZGlyKS9zY3JpcHRzL3BuZ2xpYmNvbmYuZGZhICQoc3JjZGlyKS9zY3JpcHRzL29wdGlvbnMuYXdrICQoc3JjZGlyKS9wbmdjb25mLmggJChzcmNkaXIpL3BuZ3Vzci5kZmEgJChERkFfWFRSQSkKLQkkKERFTEVURSkgJEAgcG5nbGliY29uZi5wcmUgcG5nbGliY29uZi50bXAKLQkkKEVDSE8pICJDYWxsaW5nICQoQVdLKSBmcm9tIHNjcmlwdHMvcG5nbGliY29uZi5tYWsiID4mMgotCSQoRUNITykgIklmICdhd2snIGNyYXNoZXMgdHJ5IGEgYmV0dGVyIGF3ayAoZS5nLiBBV0s9J25hd2snKSIgPiYyCi0JJChBV0spIC1mICQoc3JjZGlyKS9zY3JpcHRzL29wdGlvbnMuYXdrIG91dD0icG5nbGliY29uZi5wcmUiXAotCSAgICB2ZXJzaW9uPXNlYXJjaCAkKHNyY2RpcikvcG5nY29uZi5oICQoc3JjZGlyKS9zY3JpcHRzL3BuZ2xpYmNvbmYuZGZhXAotCSAgICAkKHNyY2RpcikvcG5ndXNyLmRmYSAkKERGQV9YVFJBKSAxPiYyCi0JJChBV0spIC1mICQoc3JjZGlyKS9zY3JpcHRzL29wdGlvbnMuYXdrIG91dD0icG5nbGliY29uZi50bXAiIHBuZ2xpYmNvbmYucHJlIDE+JjIKLQkkKE1PVkUpIHBuZ2xpYmNvbmYudG1wICRACi0KLWNsZWFuLXBuZ2xpYmNvbmY6Ci0JJChERUxFVEUpIHBuZ2xpYmNvbmYuaCBwbmdsaWJjb25mLmMgcG5nbGliY29uZi5vdXQgcG5nbGliY29uZi5wcmUgXAotCXBuZ2xpYmNvbmYuZGZuCi0KLWNsZWFuOiBjbGVhbi1wbmdsaWJjb25mCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BuZ3dpbi5yYyBiL3NjcmlwdHMvcG5nd2luLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM1Y2JiLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcG5nd2luLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSNkZWZpbmUgUE5HX1ZFUlNJT05fSU5GT19PTkxZCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSAiLi4vcG5nLmgiCi0KLSNkZWZpbmUgX1FVT1RFKHgpICMgeAotI2RlZmluZSBRVU9URSh4KSBfUVVPVEUoeCkKLQotI2RlZmluZSBQTkdfTElCUE5HX0RMTEZOQU1FICJMSUJQTkciCi0KLS8qIFN1cHBvcnQgZGVwcmVjYXRlZCBQUklWQVRFQlVJTEQgbWFjcm8gKi8KLSNpZiBkZWZpbmVkKFBSSVZBVEVCVUlMRCkgJiYgIWRlZmluZWQoUE5HX1VTRVJfUFJJVkFURUJVSUxEKQotIyAgZGVmaW5lIFBOR19VU0VSX1BSSVZBVEVCVUlMRCBQUklWQVRFQlVJTEQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYKSAmJiAhZGVmaW5lZChQTkdfVVNFUl9QUklWQVRFQlVJTEQpCi0jICBlcnJvciAiUE5HX1VTRVJfUFJJVkFURUJVSUxEIG11c3QgYmUgZGVmaW5lZCBhcyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZVwKLSBjdXN0b20gY2hhbmdlcyBtYWRlIHRvIHRoZSBsaWJyYXJ5LiIKLSNlbmRpZgotCi0vKiBQcmlvcml0aXplIFBOR19VU0VSX3ggb3ZlciBQTkdfTElCUE5HX3ggKi8KLSNpZmRlZiBQTkdfVVNFUl9ETExGTkFNRV9QT1NURklYCi0jICB1bmRlZiBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVgKLSMgIGRlZmluZSBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVggUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWAotI2VuZGlmCi0KLSNpZmRlZiBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01NRU5UUwotIyAgdW5kZWYgUE5HX0xJQlBOR19WRVJTSU9OSU5GT19DT01NRU5UUwotIyAgZGVmaW5lIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMgUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NTUVOVFMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChQTkdfREVCVUcpICYmIChQTkdfREVCVUcgPiAwKQotIyAgZGVmaW5lIFZTX0RFQlVHIFZTX0ZGX0RFQlVHCi0jICBpZm5kZWYgUE5HX0xJQlBOR19ETExGTkFNRV9QT1NURklYCi0jICAgIGRlZmluZSBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVggIkQiCi0jICBlbmRpZiAvKiBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVggKi8KLSMgIGlmbmRlZiBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTCi0jICAgIGRlZmluZSBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTICJQTkdfREVCVUc9IiBRVU9URShQTkdfREVCVUcpCi0jICBlbmRpZiAvKiBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTICovCi0jZWxzZQotIyAgZGVmaW5lIFZTX0RFQlVHIDAKLSMgIGlmbmRlZiBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVgKLSMgICAgIGRlZmluZSBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVgKLSMgIGVuZGlmIC8qIFBOR19MSUJQTkdfRExMRk5BTUVfUE9TVEZJWCAqLwotI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpLi4uICovCi0KLSNpZmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQKLSMgIGRlZmluZSBWU19QUklWQVRFQlVJTEQgVlNfRkZfUFJJVkFURUJVSUxECi0jZWxzZQotIyAgZGVmaW5lIFZTX1BSSVZBVEVCVUlMRCAwCi0jZW5kaWYgLyogUE5HX1VTRVJfUFJJVkFURUJVSUxEICovCi0KLSNpZmRlZiBQTkdfTElCUE5HX1NQRUNJQUxCVUlMRAotIyAgZGVmaW5lIFZTX1NQRUNJQUxCVUlMRCBWU19GRl9TUEVDSUFMQlVJTEQKLSNlbHNlCi0jICBkZWZpbmUgVlNfU1BFQ0lBTEJVSUxEIDAKLSNlbmRpZiAvKiBQTkdfTElCUE5HX0JVSUxEX1NQRUNJQUwgKi8KLQotI2lmICgoUE5HX0xJQlBOR19CVUlMRF9CQVNFX1RZUEUgJiBQTkdfTElCUE5HX1JFTEVBU0VfU1RBVFVTX01BU0spICE9XAotICAgICAgUE5HX0xJQlBOR19CVUlMRF9TVEFCTEUpCi0jICBkZWZpbmUgVlNfUFJFUkVMRUFTRSBWU19GRl9QUkVSRUxFQVNFCi0jICBkZWZpbmUgVlNfUEFUQ0hFRCAwCi0jZWxzZQotIyAgZGVmaW5lIFZTX1BSRVJFTEVBU0UgMAotIyAgaWYgKFBOR19MSUJQTkdfQlVJTERfQkFTRV9UWVBFICYgUE5HX0xJQlBOR19CVUlMRF9QQVRDSEVEKQotIyAgICBkZWZpbmUgVlNfUEFUQ0hFRCBWU19GRl9QQVRDSEVECi0jICBlbHNlCi0jICAgIGRlZmluZSBWU19QQVRDSEVEIDAKLSMgIGVuZGlmCi0jZW5kaWYKLQotVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCi1GSUxFVkVSU0lPTiBQTkdfTElCUE5HX1ZFUl9NQUpPUiwgUE5HX0xJQlBOR19WRVJfTUlOT1IsIFBOR19MSUJQTkdfVkVSX1JFTEVBU0UsIFBOR19MSUJQTkdfVkVSX0JVSUxECi1QUk9EVUNUVkVSU0lPTiBQTkdfTElCUE5HX1ZFUl9NQUpPUiwgUE5HX0xJQlBOR19WRVJfTUlOT1IsIFBOR19MSUJQTkdfVkVSX1JFTEVBU0UsIFBOR19MSUJQTkdfVkVSX0JVSUxECi1GSUxFRkxBR1NNQVNLIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCi1GSUxFRkxBR1MgVlNfREVCVUcgfCBWU19QUklWQVRFQlVJTEQgfCBWU19TUEVDSUFMQlVJTEQgfCBWU19QUkVSRUxFQVNFIHwgVlNfUEFUQ0hFRAotRklMRU9TIFZPU19fV0lORE9XUzMyCi1GSUxFVFlQRSBWRlRfRExMCi1GSUxFU1VCVFlQRSBWRlQyX1VOS05PV04KLUJFR0lOCi0gIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKLSAgQkVHSU4gQkxPQ0sgIjA0MDkwNEU0IiAvKiBMYW5ndWFnZSB0eXBlID0gVS5TIEVuZ2xpc2goMHgwNDA5KSBhbmQgQ2hhcmFjdGVyIFNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbCgweDA0RTQpICovCi0gICAgQkVHSU4KLSNpZmRlZiBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTCi0gICAgICBWQUxVRSAiQ29tbWVudHMiLCBQTkdfTElCUE5HX1ZFUlNJT05JTkZPX0NPTU1FTlRTICJcMDAwIgotI2VuZGlmIC8qIFBOR19MSUJQTkdfVkVSU0lPTklORk9fQ09NTUVOVFMgKi8KLSNpZmRlZiBQTkdfVVNFUl9WRVJTSU9OSU5GT19DT01QQU5ZTkFNRQotICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUgIlwwMDAiCi0jZW5kaWYgLyogUE5HX1VTRVJfVkVSU0lPTklORk9fQ09NUEFOWU5BTUUgKi8KLSAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiUE5HIGltYWdlIGNvbXByZXNzaW9uIGxpYnJhcnlcMDAwIgotICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgUE5HX0xJQlBOR19WRVJfU1RSSU5HICJcMDAwIgotICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsIFBOR19MSUJQTkdfRExMRk5BTUUgUVVPVEUoUE5HX0xJQlBOR19WRVJfRExMTlVNKSBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVggIiAoV2luZG93cyAzMiBiaXQpXDAwMCIKLSAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJcMjUxIDE5OTgtMjAwOSBHbGVubiBSYW5kZXJzLVBlaHJzb24gZXQgYWwuXDAwMCIKLSNpZmRlZiBQTkdfVVNFUl9WRVJTSU9OSU5GT19MRUdBTFRSQURFTUFSS1MKLSAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCBQTkdfVVNFUl9WRVJTSU9OSU5GT19MRUdBTFRSQURFTUFSS1MgIlwwMDAiCi0jZW5kaWYgLyogUE5HX1VTRVJfVkVSU0lPTklORk9fTEVHQUxUUkFERU1BUktTICovCi0gICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsIFBOR19MSUJQTkdfRExMRk5BTUUgUVVPVEUoUE5HX0xJQlBOR19WRVJfRExMTlVNKSBQTkdfTElCUE5HX0RMTEZOQU1FX1BPU1RGSVggIi5ETExcMDAwIgotI2lmZGVmIFBOR19VU0VSX1BSSVZBVEVCVUlMRAotICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsIFBOR19VU0VSX1BSSVZBVEVCVUlMRCAiXDAwMCIKLSNlbmRpZiAvKiBQTkdfVVNFUl9QUklWQVRFQlVJTEQgKi8KLSAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJMaWJQTkdcMDAwIgotICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjFcMDAwIgotI2lmZGVmIFBOR19MSUJQTkdfU1BFQ0lBTEJVSUxECi0gICAgICBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQgIlwwMDAiCi0jZW5kaWYgLyogUE5HX0xJQlBOR19TUEVDSUFMQlVJTEQgKi8KLSAgICBFTkQKLSAgRU5ECi0gIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgQkVHSU4KLSAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDB4MDRFNAotICBFTkQKLUVORApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wcmVmaXguYyBiL3NjcmlwdHMvcHJlZml4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjA0YTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9wcmVmaXguYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLQotLyogcHJlZml4LmMgLSBnZW5lcmF0ZSBhbiB1bnByZWZpeGVkIHN5bWJvbCBsaXN0Ci0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyB2ZXJzaW9uIDEuNi4xNiBbRGVjZW1iZXIgMjIsIDIwMTRdCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqLwotCi0jZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAotICAgICAgICBQTkdfREZOICJAIiBuYW1lICJAIgotCi0vKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqYmVmb3JlKiB0aGUgYWRkaXRpb25hbCBvZiBzeW1ib2wgcmVuYW1lcywKLSAqIHRoZSBsaXN0IGlzIHRoZSBDIG5hbWUgbGlzdDsgbm8gc3ltYm9sIHByZWZpeC4KLSAqLwotI2luY2x1ZGUgInBuZ2xpYmNvbmYub3V0IgotCi1QTkdfREZOX1NUQVJUX1NPUlQgMQotCi0jaW5jbHVkZSAiLi4vcG5nLmgiCi0KLVBOR19ERk5fRU5EX1NPUlQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc21ha2VmaWxlLnBwYyBiL3NjcmlwdHMvc21ha2VmaWxlLnBwYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3MzgwYi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3NtYWtlZmlsZS5wcGMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIEFtaWdhIHBvd2VyVVAgKFRNKSBNYWtlZmlsZQotIyBtYWtlZmlsZSBmb3IgbGlicG5nIGFuZCBTQVMgQyBWNi41OC83LjAwIFBQQyBjb21waWxlcgotIyBDb3B5cmlnaHQgKEMpIDE5OTggYnkgQW5kcmVhcyBSLiBLbGVpbmVydAotIwotIyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyCi0jIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0KLUNDICAgICAgID0gc2NwcGMKLUNGTEFHUyAgID0gTk9TVEtDSEsgTk9TSU5UIE9QVElNSVpFIE9QVEdPIE9QVFBFRVAgT1BUSU5MT0NBTCBPUFRJTkwgSURJUiAvemxpYiBcCi0gICAgICAgICAgIE9QVExPT1AgT1BUUkRFUD04IE9QVERFUD04IE9QVENPTVA9OAotTElCTkFNRSAgPSBsaWJwbmcuYQotQVIgICAgICAgPSBwcGMtYW1pZ2Fvcy1hcgotQVJfRkxBR1MgPSBjcgotUkFOTElCICAgPSBwcGMtYW1pZ2Fvcy1yYW5saWIKLUxERkxBR1MgID0gLXIgLW8KLUxETElCUyAgID0gIC4uL3psaWIvbGliemlwLmEgTElCOnNjcHBjLmEKLUxOICAgICAgID0gcHBjLWFtaWdhb3MtbGQKLVJNICAgICAgID0gZGVsZXRlIHF1aWV0Ci1NS0RJUiAgICA9IG1ha2VkaXIKLQotT0JKUyA9IHBuZy5vIHBuZ3NldC5vIHBuZ2dldC5vIHBuZ3J1dGlsLm8gcG5ndHJhbnMubyBwbmd3dXRpbC5vIHBuZ3JlYWQubyBcCi0gICAgICAgcG5nZXJyb3IubyBwbmdwcmVhZC5vIHBuZ3dyaXRlLm8gcG5ncnRyYW4ubyBwbmd3dHJhbi5vIHBuZ3Jpby5vIFwKLSAgICAgICBwbmd3aW8ubyBwbmdtZW0ubwotCi1hbGw6ICQoTElCTkFNRSkgcG5ndGVzdAotCi0kKExJQk5BTUUpOiAkKE9CSlMpCi0gICAgICAgICAgICAkKEFSKSAkKEFSX0ZMQUdTKSAkQCAkKE9CSlMpCi0gICAgICAgICAgICAkKFJBTkxJQikgJEAKLQotcG5ndGVzdDogcG5ndGVzdC5vICQoTElCTkFNRSkKLSAgICAgICAgJChMTikgJChMREZMQUdTKSBwbmd0ZXN0IExJQjpjX3BwYy5vIHBuZ3Rlc3QubyAkKExJQk5BTUUpICQoTERMSUJTKSBcCi1MSUI6ZW5kLm8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvc3ltLmMgYi9zY3JpcHRzL3N5bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTllNGM1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvc3ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLS8qIHN5bS5jIC0gZGVmaW5lIGZvcm1hdCBvZiBsaWJwbmcuc3ltCi0gKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyB2ZXJzaW9uIDEuNi4xNiBbRGVjZW1iZXIgMjIsIDIwMTRdCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSAqCi0gKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcgotICogYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLSAqLwotCi0jZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAotICAgICAgICBQTkdfREZOICJAIiBTWU1CT0xfUFJFRklYICJAQCIgbmFtZSAiQCIKLQotI2luY2x1ZGUgIi4uL3BuZy5oIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zeW1ib2xzLmMgYi9zY3JpcHRzL3N5bWJvbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiODQxZC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3N5bWJvbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLQotLyogc3ltYm9scy5jIC0gZmluZCBhbGwgZXhwb3J0ZWQgc3ltYm9scwotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKi8KLQotLyogTk9URTogbWFraW5nICdzeW1ib2xzLmNoaycgY2hlY2tzIGJvdGggdGhhdCB0aGUgZXhwb3J0ZWQKLSAqIHN5bWJvbHMgaW4gdGhlIGxpYnJhcnkgZG9uJ3QgY2hhbmdlIGFuZCAoaW1wbGljaXRseSkgdGhhdAotICogc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQgaXMgYXMgZXhwZWN0ZWQuCi0gKiBJZiBzY3JpcHRzL3BuZ2xpYmNvbmYuaC5wcmVidWlsdCBpcyByZW1hZGUgdXNpbmcKLSAqIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgdGhlbiB0aGlzIGNoZWNrcyB0aGUgLmRmYSBmaWxlIHRvby4KLSAqLwotCi0jZGVmaW5lIFBOR19FWFBPUlRBKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXAotICAgICAgICBQTkdfREZOICJAIiBuYW1lICJAIEBAIiBvcmRpbmFsICJAIgotI2RlZmluZSBQTkdfUkVNT1ZFRChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzLCBhdHRyaWJ1dGVzKVwKLSAgICAgICAgUE5HX0RGTiAiOyBAIiBuYW1lICJAIEBAIiBvcmRpbmFsICJAIgotI2RlZmluZSBQTkdfRVhQT1JUX0xBU1RfT1JESU5BTChvcmRpbmFsKVwKLSAgICAgICAgUE5HX0RGTiAiOyBAQCIgb3JkaW5hbCAiQCIKLQotLyogUmVhZCB0aGUgZGVmYXVsdHMsIGJ1dCB1c2Ugc2NyaXB0cy9wbmdsaWJjb25mLmgucHJlYnVpbHQ7IHRoZSAnc3RhbmRhcmQnCi0gKiBoZWFkZXIgZmlsZS4KLSAqLwotI2luY2x1ZGUgInBuZ2xpYmNvbmYuaC5wcmVidWlsdCIKLSNpbmNsdWRlICIuLi9wbmcuaCIKLQotLyogU29tZSB0aGluZ3MgYXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gIFR1cm4gdGhlc2UgdGhpbmdzCi0gKiBvbiBoZXJlIChieSBoYW5kKSB0byBnZXQgdGhlIEFQSXMgdGhleSBleHBvc2UgYW5kIHZhbGlkYXRlCi0gKiB0aGF0IG5vIGhhcm0gaXMgZG9uZS4gIFRoaXMgbGlzdCBpcyB0aGUgc2V0IG9mIG9wdGlvbnMKLSAqIGRlZmF1bHRlZCB0byAnb2ZmJyBpbiBzY3JpcHRzL3BuZ2xpYmNvbmYuZGZhCi0gKgotICogTWFpbnRlbmFuY2U6IGlmIHNjcmlwdHMvcG5nbGliY29uZi5kZmEgb3B0aW9ucyBhcmUgY2hhbmdlZAotICogZnJvbSwgb3IgdG8sICdkaXNhYmxlZCcgdGhpcyBuZWVkcyB1cGRhdGluZyEKLSAqLwotI2RlZmluZSBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQKLSNkZWZpbmUgUE5HX0VSUk9SX05VTUJFUlNfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19SRUFEX0JJR19FTkRJQU5fU1VQUE9SVEVEICAvKiBzaG91bGQgZG8gbm90aGluZyEgKi8KLSNkZWZpbmUgUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfQUNDVVJBVEVfU0NBTEVfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRAotCi0jdW5kZWYgUE5HX0gKLSNpbmNsdWRlICIuLi9wbmcuaCIKLQotLyogRmluYWxseSB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgcGxhY2VzIHdoZXJlIG9wdGlvbiBzdXBwb3J0Ci0gKiBhY3R1YWxseSBjaGFuZ2VzIHRoZSBBUElzIHJldmVhbGVkIHVzaW5nIGEgI2lmLyNlbHNlLyNlbmRpZgotICogdGVzdCBpbiBwbmcuaCwgdGVzdCB0aGVzZSBoZXJlLgotICovCi0jdW5kZWYgIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQgLyogRXhwb3NlcyAnZml4ZWQnIEFQSXMgKi8KLSN1bmRlZiAgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEICAgICAvKiBFeHBvc2VzIHVuc3VwcG9ydGVkIEFQSXMgKi8KLQotI3VuZGVmIFBOR19ICi0jaW5jbHVkZSAiLi4vcG5nLmgiCmRpZmYgLS1naXQgYS9zY3JpcHRzL3N5bWJvbHMuZGVmIGIvc2NyaXB0cy9zeW1ib2xzLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4NTFmNS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3N5bWJvbHMuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLTtWZXJzaW9uIDEuNi4yNAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExJQlBORyBzeW1ib2wgbGlzdCBhcyBhIFdpbjMyIERFRiBmaWxlCi07IENvbnRhaW5zIGFsbCB0aGUgc3ltYm9scyB0aGF0IGNhbiBiZSBleHBvcnRlZCBmcm9tIGxpYnBuZwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJSQVJZCi0KLUVYUE9SVFMKLSBwbmdfYWNjZXNzX3ZlcnNpb25fbnVtYmVyIEAxCi0gcG5nX3NldF9zaWdfYnl0ZXMgQDIKLSBwbmdfc2lnX2NtcCBAMwotIHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QgQDQKLSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCBANQotIHBuZ19nZXRfY29tcHJlc3Npb25fYnVmZmVyX3NpemUgQDYKLSBwbmdfc2V0X2NvbXByZXNzaW9uX2J1ZmZlcl9zaXplIEA3Ci0gcG5nX3NldF9sb25nam1wX2ZuIEA4Ci0gcG5nX2xvbmdqbXAgQDkKLSBwbmdfcmVzZXRfenN0cmVhbSBAMTAKLSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIgQDExCi0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RfMiBAMTIKLSBwbmdfd3JpdGVfc2lnIEAxMwotIHBuZ193cml0ZV9jaHVuayBAMTQKLSBwbmdfd3JpdGVfY2h1bmtfc3RhcnQgQDE1Ci0gcG5nX3dyaXRlX2NodW5rX2RhdGEgQDE2Ci0gcG5nX3dyaXRlX2NodW5rX2VuZCBAMTcKLSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IEAxOAotIHBuZ19pbmZvX2luaXRfMyBAMTkKLSBwbmdfd3JpdGVfaW5mb19iZWZvcmVfUExURSBAMjAKLSBwbmdfd3JpdGVfaW5mbyBAMjEKLSBwbmdfcmVhZF9pbmZvIEAyMgotIHBuZ19jb252ZXJ0X3RvX3JmYzExMjMgQDIzCi0gcG5nX2NvbnZlcnRfZnJvbV9zdHJ1Y3RfdG0gQDI0Ci0gcG5nX2NvbnZlcnRfZnJvbV90aW1lX3QgQDI1Ci0gcG5nX3NldF9leHBhbmQgQDI2Ci0gcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184IEAyNwotIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IgQDI4Ci0gcG5nX3NldF90Uk5TX3RvX2FscGhhIEAyOQotIHBuZ19zZXRfYmdyIEAzMAotIHBuZ19zZXRfZ3JheV90b19yZ2IgQDMxCi0gcG5nX3NldF9yZ2JfdG9fZ3JheSBAMzIKLSBwbmdfc2V0X3JnYl90b19ncmF5X2ZpeGVkIEAzMwotIHBuZ19nZXRfcmdiX3RvX2dyYXlfc3RhdHVzIEAzNAotIHBuZ19idWlsZF9ncmF5c2NhbGVfcGFsZXR0ZSBAMzUKLSBwbmdfc2V0X3N0cmlwX2FscGhhIEAzNgotIHBuZ19zZXRfc3dhcF9hbHBoYSBAMzcKLSBwbmdfc2V0X2ludmVydF9hbHBoYSBAMzgKLSBwbmdfc2V0X2ZpbGxlciBAMzkKLSBwbmdfc2V0X2FkZF9hbHBoYSBANDAKLSBwbmdfc2V0X3N3YXAgQDQxCi0gcG5nX3NldF9wYWNraW5nIEA0MgotIHBuZ19zZXRfcGFja3N3YXAgQDQzCi0gcG5nX3NldF9zaGlmdCBANDQKLSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyBANDUKLSBwbmdfc2V0X2ludmVydF9tb25vIEA0NgotIHBuZ19zZXRfYmFja2dyb3VuZCBANDcKLSBwbmdfc2V0X3N0cmlwXzE2IEA0OAotIHBuZ19zZXRfcXVhbnRpemUgQDQ5Ci0gcG5nX3NldF9nYW1tYSBANTAKLSBwbmdfc2V0X2ZsdXNoIEA1MQotIHBuZ193cml0ZV9mbHVzaCBANTIKLSBwbmdfc3RhcnRfcmVhZF9pbWFnZSBANTMKLSBwbmdfcmVhZF91cGRhdGVfaW5mbyBANTQKLSBwbmdfcmVhZF9yb3dzIEA1NQotIHBuZ19yZWFkX3JvdyBANTYKLSBwbmdfcmVhZF9pbWFnZSBANTcKLSBwbmdfd3JpdGVfcm93IEA1OAotIHBuZ193cml0ZV9yb3dzIEA1OQotIHBuZ193cml0ZV9pbWFnZSBANjAKLSBwbmdfd3JpdGVfZW5kIEA2MQotIHBuZ19yZWFkX2VuZCBANjIKLSBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCBANjMKLSBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCBANjQKLSBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QgQDY1Ci0gcG5nX3NldF9jcmNfYWN0aW9uIEA2NgotIHBuZ19zZXRfZmlsdGVyIEA2NwotIHBuZ19zZXRfZmlsdGVyX2hldXJpc3RpY3MgQDY4Ci0gcG5nX3NldF9jb21wcmVzc2lvbl9sZXZlbCBANjkKLSBwbmdfc2V0X2NvbXByZXNzaW9uX21lbV9sZXZlbCBANzAKLSBwbmdfc2V0X2NvbXByZXNzaW9uX3N0cmF0ZWd5IEA3MQotIHBuZ19zZXRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgQDcyCi0gcG5nX3NldF9jb21wcmVzc2lvbl9tZXRob2QgQDczCi0gcG5nX2luaXRfaW8gQDc0Ci0gcG5nX3NldF9lcnJvcl9mbiBANzUKLSBwbmdfZ2V0X2Vycm9yX3B0ciBANzYKLSBwbmdfc2V0X3dyaXRlX2ZuIEA3NwotIHBuZ19zZXRfcmVhZF9mbiBANzgKLSBwbmdfZ2V0X2lvX3B0ciBANzkKLSBwbmdfc2V0X3JlYWRfc3RhdHVzX2ZuIEA4MAotIHBuZ19zZXRfd3JpdGVfc3RhdHVzX2ZuIEA4MQotIHBuZ19zZXRfbWVtX2ZuIEA4MgotIHBuZ19nZXRfbWVtX3B0ciBAODMKLSBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4gQDg0Ci0gcG5nX3NldF93cml0ZV91c2VyX3RyYW5zZm9ybV9mbiBAODUKLSBwbmdfc2V0X3VzZXJfdHJhbnNmb3JtX2luZm8gQDg2Ci0gcG5nX2dldF91c2VyX3RyYW5zZm9ybV9wdHIgQDg3Ci0gcG5nX3NldF9yZWFkX3VzZXJfY2h1bmtfZm4gQDg4Ci0gcG5nX2dldF91c2VyX2NodW5rX3B0ciBAODkKLSBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4gQDkwCi0gcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIgQDkxCi0gcG5nX3Byb2Nlc3NfZGF0YSBAOTIKLSBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgQDkzCi0gcG5nX21hbGxvYyBAOTQKLSBwbmdfY2FsbG9jIEA5NQotIHBuZ19tYWxsb2Nfd2FybiBAOTYKLSBwbmdfZnJlZSBAOTcKLSBwbmdfZnJlZV9kYXRhIEA5OAotIHBuZ19kYXRhX2ZyZWVyIEA5OQotIHBuZ19tYWxsb2NfZGVmYXVsdCBAMTAwCi0gcG5nX2ZyZWVfZGVmYXVsdCBAMTAxCi0gcG5nX2Vycm9yIEAxMDIKLSBwbmdfY2h1bmtfZXJyb3IgQDEwMwotIHBuZ19lcnIgQDEwNAotIHBuZ193YXJuaW5nIEAxMDUKLSBwbmdfY2h1bmtfd2FybmluZyBAMTA2Ci0gcG5nX2Jlbmlnbl9lcnJvciBAMTA3Ci0gcG5nX2NodW5rX2Jlbmlnbl9lcnJvciBAMTA4Ci0gcG5nX3NldF9iZW5pZ25fZXJyb3JzIEAxMDkKLSBwbmdfZ2V0X3ZhbGlkIEAxMTAKLSBwbmdfZ2V0X3Jvd2J5dGVzIEAxMTEKLSBwbmdfZ2V0X3Jvd3MgQDExMgotIHBuZ19zZXRfcm93cyBAMTEzCi0gcG5nX2dldF9jaGFubmVscyBAMTE0Ci0gcG5nX2dldF9pbWFnZV93aWR0aCBAMTE1Ci0gcG5nX2dldF9pbWFnZV9oZWlnaHQgQDExNgotIHBuZ19nZXRfYml0X2RlcHRoIEAxMTcKLSBwbmdfZ2V0X2NvbG9yX3R5cGUgQDExOAotIHBuZ19nZXRfZmlsdGVyX3R5cGUgQDExOQotIHBuZ19nZXRfaW50ZXJsYWNlX3R5cGUgQDEyMAotIHBuZ19nZXRfY29tcHJlc3Npb25fdHlwZSBAMTIxCi0gcG5nX2dldF9waXhlbHNfcGVyX21ldGVyIEAxMjIKLSBwbmdfZ2V0X3hfcGl4ZWxzX3Blcl9tZXRlciBAMTIzCi0gcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIgQDEyNAotIHBuZ19nZXRfcGl4ZWxfYXNwZWN0X3JhdGlvIEAxMjUKLSBwbmdfZ2V0X3hfb2Zmc2V0X3BpeGVscyBAMTI2Ci0gcG5nX2dldF95X29mZnNldF9waXhlbHMgQDEyNwotIHBuZ19nZXRfeF9vZmZzZXRfbWljcm9ucyBAMTI4Ci0gcG5nX2dldF95X29mZnNldF9taWNyb25zIEAxMjkKLSBwbmdfZ2V0X3NpZ25hdHVyZSBAMTMwCi0gcG5nX2dldF9iS0dEIEAxMzEKLSBwbmdfc2V0X2JLR0QgQDEzMgotIHBuZ19nZXRfY0hSTSBAMTMzCi0gcG5nX2dldF9jSFJNX2ZpeGVkIEAxMzQKLSBwbmdfc2V0X2NIUk0gQDEzNQotIHBuZ19zZXRfY0hSTV9maXhlZCBAMTM2Ci0gcG5nX2dldF9nQU1BIEAxMzcKLSBwbmdfZ2V0X2dBTUFfZml4ZWQgQDEzOAotIHBuZ19zZXRfZ0FNQSBAMTM5Ci0gcG5nX3NldF9nQU1BX2ZpeGVkIEAxNDAKLSBwbmdfZ2V0X2hJU1QgQDE0MQotIHBuZ19zZXRfaElTVCBAMTQyCi0gcG5nX2dldF9JSERSIEAxNDMKLSBwbmdfc2V0X0lIRFIgQDE0NAotIHBuZ19nZXRfb0ZGcyBAMTQ1Ci0gcG5nX3NldF9vRkZzIEAxNDYKLSBwbmdfZ2V0X3BDQUwgQDE0NwotIHBuZ19zZXRfcENBTCBAMTQ4Ci0gcG5nX2dldF9wSFlzIEAxNDkKLSBwbmdfc2V0X3BIWXMgQDE1MAotIHBuZ19nZXRfUExURSBAMTUxCi0gcG5nX3NldF9QTFRFIEAxNTIKLSBwbmdfZ2V0X3NCSVQgQDE1MwotIHBuZ19zZXRfc0JJVCBAMTU0Ci0gcG5nX2dldF9zUkdCIEAxNTUKLSBwbmdfc2V0X3NSR0IgQDE1NgotIHBuZ19zZXRfc1JHQl9nQU1BX2FuZF9jSFJNIEAxNTcKLSBwbmdfZ2V0X2lDQ1AgQDE1OAotIHBuZ19zZXRfaUNDUCBAMTU5Ci0gcG5nX2dldF9zUExUIEAxNjAKLSBwbmdfc2V0X3NQTFQgQDE2MQotIHBuZ19nZXRfdGV4dCBAMTYyCi0gcG5nX3NldF90ZXh0IEAxNjMKLSBwbmdfZ2V0X3RJTUUgQDE2NAotIHBuZ19zZXRfdElNRSBAMTY1Ci0gcG5nX2dldF90Uk5TIEAxNjYKLSBwbmdfc2V0X3RSTlMgQDE2NwotIHBuZ19nZXRfc0NBTCBAMTY4Ci0gcG5nX2dldF9zQ0FMX3MgQDE2OQotIHBuZ19zZXRfc0NBTCBAMTcwCi0gcG5nX3NldF9zQ0FMX3MgQDE3MQotIHBuZ19zZXRfa2VlcF91bmtub3duX2NodW5rcyBAMTcyCi0gcG5nX2hhbmRsZV9hc191bmtub3duIEAxNzMKLSBwbmdfc2V0X3Vua25vd25fY2h1bmtzIEAxNzQKLSBwbmdfc2V0X3Vua25vd25fY2h1bmtfbG9jYXRpb24gQDE3NQotIHBuZ19nZXRfdW5rbm93bl9jaHVua3MgQDE3NgotIHBuZ19zZXRfaW52YWxpZCBAMTc3Ci0gcG5nX3JlYWRfcG5nIEAxNzgKLSBwbmdfd3JpdGVfcG5nIEAxNzkKLSBwbmdfZ2V0X2NvcHlyaWdodCBAMTgwCi0gcG5nX2dldF9oZWFkZXJfdmVyIEAxODEKLSBwbmdfZ2V0X2hlYWRlcl92ZXJzaW9uIEAxODIKLSBwbmdfZ2V0X2xpYnBuZ192ZXIgQDE4MwotIHBuZ19wZXJtaXRfbW5nX2ZlYXR1cmVzIEAxODQKLSBwbmdfc2V0X3N0cmlwX2Vycm9yX251bWJlcnMgQDE4NQotIHBuZ19zZXRfdXNlcl9saW1pdHMgQDE4NgotIHBuZ19nZXRfdXNlcl93aWR0aF9tYXggQDE4NwotIHBuZ19nZXRfdXNlcl9oZWlnaHRfbWF4IEAxODgKLSBwbmdfc2V0X2NodW5rX2NhY2hlX21heCBAMTg5Ci0gcG5nX2dldF9jaHVua19jYWNoZV9tYXggQDE5MAotIHBuZ19zZXRfY2h1bmtfbWFsbG9jX21heCBAMTkxCi0gcG5nX2dldF9jaHVua19tYWxsb2NfbWF4IEAxOTIKLSBwbmdfZ2V0X3BpeGVsc19wZXJfaW5jaCBAMTkzCi0gcG5nX2dldF94X3BpeGVsc19wZXJfaW5jaCBAMTk0Ci0gcG5nX2dldF95X3BpeGVsc19wZXJfaW5jaCBAMTk1Ci0gcG5nX2dldF94X29mZnNldF9pbmNoZXMgQDE5NgotIHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzIEAxOTcKLSBwbmdfZ2V0X3BIWXNfZHBpIEAxOTgKLSBwbmdfZ2V0X2lvX3N0YXRlIEAxOTkKLSBwbmdfZ2V0X3VpbnRfMzIgQDIwMQotIHBuZ19nZXRfdWludF8xNiBAMjAyCi0gcG5nX2dldF9pbnRfMzIgQDIwMwotIHBuZ19nZXRfdWludF8zMSBAMjA0Ci0gcG5nX3NhdmVfdWludF8zMiBAMjA1Ci0gcG5nX3NhdmVfaW50XzMyIEAyMDYKLSBwbmdfc2F2ZV91aW50XzE2IEAyMDcKLSBwbmdfc2V0X2dhbW1hX2ZpeGVkIEAyMDgKLSBwbmdfc2V0X2ZpbHRlcl9oZXVyaXN0aWNzX2ZpeGVkIEAyMDkKLSBwbmdfZ2V0X3BpeGVsX2FzcGVjdF9yYXRpb19maXhlZCBAMjEwCi0gcG5nX2dldF94X29mZnNldF9pbmNoZXNfZml4ZWQgQDIxMQotIHBuZ19nZXRfeV9vZmZzZXRfaW5jaGVzX2ZpeGVkIEAyMTIKLSBwbmdfc2V0X3NDQUxfZml4ZWQgQDIxMwotIHBuZ19nZXRfc0NBTF9maXhlZCBAMjE0Ci0gcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkIEAyMTUKLSBwbmdfZ2V0X2lvX2NodW5rX3R5cGUgQDIxNgotIHBuZ19nZXRfY3VycmVudF9yb3dfbnVtYmVyIEAyMTcKLSBwbmdfZ2V0X2N1cnJlbnRfcGFzc19udW1iZXIgQDIxOAotIHBuZ19wcm9jZXNzX2RhdGFfcGF1c2UgQDIxOQotIHBuZ19wcm9jZXNzX2RhdGFfc2tpcCBAMjIwCi0gcG5nX3NldF9leHBhbmRfMTYgQDIyMQotIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9sZXZlbCBAMjIyCi0gcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX21lbV9sZXZlbCBAMjIzCi0gcG5nX3NldF90ZXh0X2NvbXByZXNzaW9uX3N0cmF0ZWd5IEAyMjQKLSBwbmdfc2V0X3RleHRfY29tcHJlc3Npb25fd2luZG93X2JpdHMgQDIyNQotIHBuZ19zZXRfdGV4dF9jb21wcmVzc2lvbl9tZXRob2QgQDIyNgotIHBuZ19zZXRfYWxwaGFfbW9kZSBAMjI3Ci0gcG5nX3NldF9hbHBoYV9tb2RlX2ZpeGVkIEAyMjgKLSBwbmdfc2V0X3NjYWxlXzE2IEAyMjkKLSBwbmdfZ2V0X2NIUk1fWFlaIEAyMzAKLSBwbmdfZ2V0X2NIUk1fWFlaX2ZpeGVkIEAyMzEKLSBwbmdfc2V0X2NIUk1fWFlaIEAyMzIKLSBwbmdfc2V0X2NIUk1fWFlaX2ZpeGVkIEAyMzMKLSBwbmdfaW1hZ2VfYmVnaW5fcmVhZF9mcm9tX2ZpbGUgQDIzNAotIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fc3RkaW8gQDIzNQotIHBuZ19pbWFnZV9iZWdpbl9yZWFkX2Zyb21fbWVtb3J5IEAyMzYKLSBwbmdfaW1hZ2VfZmluaXNoX3JlYWQgQDIzNwotIHBuZ19pbWFnZV9mcmVlIEAyMzgKLSBwbmdfaW1hZ2Vfd3JpdGVfdG9fZmlsZSBAMjM5Ci0gcG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvIEAyNDAKLSBwbmdfY29udmVydF90b19yZmMxMTIzX2J1ZmZlciBAMjQxCi0gcG5nX3NldF9jaGVja19mb3JfaW52YWxpZF9pbmRleCBAMjQyCi0gcG5nX2dldF9wYWxldHRlX21heCBAMjQzCi0gcG5nX3NldF9vcHRpb24gQDI0NAotIHBuZ19pbWFnZV93cml0ZV90b19tZW1vcnkgQDI0NQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90ZXN0LmNtYWtlLmluIGIvc2NyaXB0cy90ZXN0LmNtYWtlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTZhODg5Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvdGVzdC5jbWFrZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgdGVzdC5jbWFrZS5pbgotCi0jIENvcHlyaWdodCAoQykgMjAxNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KLSMgV3JpdHRlbiBieSBSb2dlciBMZWlnaCwgMjAxNgotCi0jIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuCi0jIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSMgYW5kIGxpY2Vuc2UgaW4gcG5nLmgKLQotc2V0KFRFU1RfT1BUSU9OUyAiQFRFU1RfT1BUSU9OU0AiKQotc2V0KFRFU1RfRklMRVMgIkBURVNUX0ZJTEVTQCIpCi0KLWZvcmVhY2goZmlsZSAke1RFU1RfRklMRVN9KQotICBmaWxlKFRPX05BVElWRV9QQVRIICIke2ZpbGV9IiBuYXRpdmVfZmlsZSkKLSAgbGlzdChBUFBFTkQgTkFUSVZFX1RFU1RfRklMRVMgIiR7bmF0aXZlX2ZpbGV9IikKLWVuZGZvcmVhY2goKQotCi0jIEFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbGlicG5nIHRvIHRoZSBQQVRIIChXaW5kb3dzIG9ubHkpCi1pZihXSU4zMikKLSAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChMSUJQTkdfRElSICIke0xJQlBOR30iIFBBVEgpCi0gIGZpbGUoVE9fTkFUSVZFX1BBVEggIiR7TElCUE5HX0RJUn0iIExJQlBOR19ESVIpCi0gIHNldChFTlZ7UEFUSH0gIiR7TElCUE5HX0RJUn07JEVOVntQQVRIfSIpCi1lbmRpZigpCi0KLWV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICIke0NNQUtFX0NPTU1BTkR9IiAtRSBlY2hvICJSdW5uaW5nICR7VEVTVF9DT01NQU5EfSIgJHtURVNUX09QVElPTlN9ICR7TkFUSVZFX1RFU1RfRklMRVN9KQotCi1leGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtURVNUX0NPTU1BTkR9IiAke1RFU1RfT1BUSU9OU30gJHtOQVRJVkVfVEVTVF9GSUxFU30KLSAgICAgICAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgVEVTVF9TVEFUVVMpCi1pZihURVNUX1NUQVRVUykKLSAgbWVzc2FnZShGQVRBTF9FUlJPUiAiUmV0dXJuZWQgZmFpbGVkIHN0YXR1cyAke1RFU1RfU1RBVFVTfSEiKQotZW5kaWYoKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy92ZXJzLmMgYi9zY3JpcHRzL3ZlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3MzE5Ny4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3ZlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQotLyogdmVycy5jIC0gZGVmaW5lIGZvcm1hdCBvZiBsaWJwbmcudmVycwotICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgdmVyc2lvbiAxLjYuMTYgW0RlY2VtYmVyIDIyLCAyMDE0XQotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCi0gKgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXIKLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oCi0gKi8KLQotI2RlZmluZSBQTkdfRVhQT1JUQShvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzLCBhdHRyaWJ1dGVzKVwKLSAgICAgICAgUE5HX0RGTiAiIEAiIFNZTUJPTF9QUkVGSVggIkBAIiBuYW1lICJAOyIKLQotUE5HX0RGTiAiQCIgUE5HTElCX0xJQk5BTUUgIkAge2dsb2JhbDoiCi0KLSNpbmNsdWRlICIuLi9wbmcuaCIKLQotUE5HX0RGTiAibG9jYWw6ICo7IH07IgpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5naW1hZ2UtZnVsbCBiL3Rlc3RzL3BuZ2ltYWdlLWZ1bGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExOThlZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5naW1hZ2UtZnVsbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5naW1hZ2UgLS1leGhhdXN0aXZlIC0tbGlzdC1jb21ib3MgLS1sb2cgIiR7c3JjZGlyfS9jb250cmliL3BuZ3N1aXRlLyIqLnBuZwpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5naW1hZ2UtcXVpY2sgYi90ZXN0cy9wbmdpbWFnZS1xdWljawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzI4ZGMyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmdpbWFnZS1xdWljaworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5naW1hZ2UgLS1saXN0LWNvbWJvcyAtLWxvZyAiJHtzcmNkaXJ9L2NvbnRyaWIvcG5nc3VpdGUvIioucG5nCmRpZmYgLS1naXQgYS90ZXN0cy9wbmdzdGVzdCBiL3Rlc3RzL3BuZ3N0ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDFiNzc2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3N0ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIFVzYWdlOgotIwotIyAgdGVzdHMvcG5nc3Rlc3QgZ2FtbWEgYWxwaGEKLSMKLSMgUnVuIC4vcG5nc3Rlc3Qgb24gdGhlIFBORyBmaWxlcyBpbiAkc3JjZGlyL2NvbnRyaWIvdGVzdHBuZ3Mgd2hpY2ggaGF2ZSB0aGUKLSMgZ2l2ZW4gZ2FtbWEgYW5kIG9wYWNpdHk6Ci0jCi0jICBnYW1tYTogb25lIG9mOyBsaW5lYXIsIDEuOCwgc1JHQiwgbm9uZS4KLSMgIGFscGhhOiBvbmUgb2Y7IG9wYXF1ZSwgdFJOUywgYWxwaGEsIG5vbmUuICAnbm9uZScgaXMgZXF1aXZhbGVudCB0byAhYWxwaGEKLSMKLSMgTk9URTogdGhlIHRlbXBvcmFyeSBmaWxlcyBwbmdzdGVzdCBnZW5lcmF0ZXMgaGF2ZSB0aGUgYmFzZSBuYW1lIGdhbW1hLWFscGhhIHRvCi0jIGF2b2lkIGlzc3VlcyB3aXRoIG1ha2UgLWoKLSMKLWdhbW1hPSIkMSIKLXNoaWZ0Ci1hbHBoYT0iJDEiCi1zaGlmdAotYXJncz0KLUxDX0FMTD0iQyIgIyBmaXggZ2xvYiBzb3J0IG9yZGVyIHRvIEFTQ0lJOgotZm9yIGYgaW4gIiR7c3JjZGlyfS9jb250cmliL3Rlc3RwbmdzLyIqLnBuZwotZG8KLSAgIGc9Ci0gICBjYXNlICIkZiIgaW4KLSAgICAgICotbGluZWFyWy4tXSopCi0gICAgICAgICB0ZXN0ICIkZ2FtbWEiID0gImxpbmVhciIgJiYgZz0iJGYiOzsKLQotICAgICAgKi1zUkdCWy4tXSopCi0gICAgICAgICB0ZXN0ICIkZ2FtbWEiID0gInNSR0IiICYmIGc9IiRmIjs7Ci0KLSAgICAgICotMS44Wy4tXSopCi0gICAgICAgICB0ZXN0ICIkZ2FtbWEiID0gIjEuOCIgJiYgZz0iJGYiOzsKLQotICAgICAgKikKLSAgICAgICAgIHRlc3QgIiRnYW1tYSIgPSAibm9uZSIgJiYgZz0iJGYiOzsKLSAgIGVzYWMKLQotICAgY2FzZSAiJGciIGluCi0gICAgICAiIikKLSAgICAgICAgIDo7OwotCi0gICAgICAqLWFscGhhWy0uXSopCi0gICAgICAgICB0ZXN0ICIkYWxwaGEiID0gImFscGhhIiAmJiBhcmdzPSIkYXJncyAkZyI7OwotCi0gICAgICAqLXRSTlNbLS5dKikKLSAgICAgICAgIHRlc3QgIiRhbHBoYSIgPSAidFJOUyIgLW8gIiRhbHBoYSIgPSAibm9uZSIgJiYgYXJncz0iJGFyZ3MgJGciOzsKLQotICAgICAgKikKLSAgICAgICAgIHRlc3QgIiRhbHBoYSIgPSAib3BhcXVlIiAtbyAiJGFscGhhIiA9ICJub25lIiAmJiBhcmdzPSIkYXJncyAkZyI7OwotICAgZXNhYwotZG9uZQotIyBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIGFyZ3VtZW50cyBkb24ndCBjb250YWluIHNwYWNlczsgdGhleSBkb24ndC4KLWV4ZWMgLi9wbmdzdGVzdCAtLXRtcGZpbGUgIiR7Z2FtbWF9LSR7YWxwaGF9LSIgLS1sb2cgJHsxKyIkQCJ9ICRhcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9wbmdzdGVzdC0xLjggYi90ZXN0cy9wbmdzdGVzdC0xLjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyZWMyMWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5nc3Rlc3QtMS44CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgIiR7c3JjZGlyfS90ZXN0cy9wbmdzdGVzdCIgMS44IG5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3N0ZXN0LTEuOC1hbHBoYSBiL3Rlc3RzL3BuZ3N0ZXN0LTEuOC1hbHBoYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDAwNTk2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmdzdGVzdC0xLjgtYWxwaGEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAiJHtzcmNkaXJ9L3Rlc3RzL3BuZ3N0ZXN0IiAxLjggYWxwaGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3N0ZXN0LWxpbmVhciBiL3Rlc3RzL3BuZ3N0ZXN0LWxpbmVhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGE1YjNmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmdzdGVzdC1saW5lYXIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAiJHtzcmNkaXJ9L3Rlc3RzL3BuZ3N0ZXN0IiBsaW5lYXIgbm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5nc3Rlc3QtbGluZWFyLWFscGhhIGIvdGVzdHMvcG5nc3Rlc3QtbGluZWFyLWFscGhhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MTE0MjEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3N0ZXN0LWxpbmVhci1hbHBoYQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjICIke3NyY2Rpcn0vdGVzdHMvcG5nc3Rlc3QiIGxpbmVhciBhbHBoYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5nc3Rlc3Qtbm9uZSBiL3Rlc3RzL3BuZ3N0ZXN0LW5vbmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5YWQ3NDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5nc3Rlc3Qtbm9uZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjICIke3NyY2Rpcn0vdGVzdHMvcG5nc3Rlc3QiIG5vbmUgbm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5nc3Rlc3Qtbm9uZS1hbHBoYSBiL3Rlc3RzL3BuZ3N0ZXN0LW5vbmUtYWxwaGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmNjA4M2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5nc3Rlc3Qtbm9uZS1hbHBoYQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjICIke3NyY2Rpcn0vdGVzdHMvcG5nc3Rlc3QiIG5vbmUgYWxwaGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3N0ZXN0LXNSR0IgYi90ZXN0cy9wbmdzdGVzdC1zUkdCCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODQ2MDgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3N0ZXN0LXNSR0IKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAiJHtzcmNkaXJ9L3Rlc3RzL3BuZ3N0ZXN0IiBzUkdCIG5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3N0ZXN0LXNSR0ItYWxwaGEgYi90ZXN0cy9wbmdzdGVzdC1zUkdCLWFscGhhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMWU1N2QzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3N0ZXN0LXNSR0ItYWxwaGEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAiJHtzcmNkaXJ9L3Rlc3RzL3BuZ3N0ZXN0IiBzUkdCIGFscGhhCmRpZmYgLS1naXQgYS90ZXN0cy9wbmd0ZXN0IGIvdGVzdHMvcG5ndGVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEzOTczYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd0ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd0ZXN0IC0tc3RyaWN0ICR7c3JjZGlyfS9wbmd0ZXN0LnBuZwpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndW5rbm93bi1JREFUIGIvdGVzdHMvcG5ndW5rbm93bi1JREFUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZTcyODFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3Vua25vd24tSURBVAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndW5rbm93biAtLXN0cmljdCBkZWZhdWx0PWRpc2NhcmQgSURBVD1zYXZlICIke3NyY2Rpcn0vcG5ndGVzdC5wbmciCmRpZmYgLS1naXQgYS90ZXN0cy9wbmd1bmtub3duLWRpc2NhcmQgYi90ZXN0cy9wbmd1bmtub3duLWRpc2NhcmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5NmRhYjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5ndW5rbm93bi1kaXNjYXJkCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd1bmtub3duIC0tc3RyaWN0IGRlZmF1bHQ9ZGlzY2FyZCAiJHtzcmNkaXJ9L3BuZ3Rlc3QucG5nIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndW5rbm93bi1pZi1zYWZlIGIvdGVzdHMvcG5ndW5rbm93bi1pZi1zYWZlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMWE0OTU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3Vua25vd24taWYtc2FmZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndW5rbm93biAtLXN0cmljdCBkZWZhdWx0PWlmLXNhZmUgIiR7c3JjZGlyfS9wbmd0ZXN0LnBuZyIKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3Vua25vd24tc0FQSSBiL3Rlc3RzL3BuZ3Vua25vd24tc0FQSQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDMxN2IxOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd1bmtub3duLXNBUEkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAuL3BuZ3Vua25vd24gLS1zdHJpY3QgYktHRD1zYXZlIGNIUk09c2F2ZSBnQU1BPXNhdmUgYWxsPWRpc2NhcmQgaUNDUD1zYXZlIHNCSVQ9c2F2ZSBzUkdCPXNhdmUgIiR7c3JjZGlyfS9wbmd0ZXN0LnBuZyIKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3Vua25vd24tc1RFUiBiL3Rlc3RzL3BuZ3Vua25vd24tc1RFUgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTljNWVjZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd1bmtub3duLXNURVIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAuL3BuZ3Vua25vd24gLS1zdHJpY3Qgc1RFUj1pZi1zYWZlICIke3NyY2Rpcn0vcG5ndGVzdC5wbmciCmRpZmYgLS1naXQgYS90ZXN0cy9wbmd1bmtub3duLXNhdmUgYi90ZXN0cy9wbmd1bmtub3duLXNhdmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxNDEyYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5ndW5rbm93bi1zYXZlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd1bmtub3duIC0tc3RyaWN0IGRlZmF1bHQ9c2F2ZSAiJHtzcmNkaXJ9L3BuZ3Rlc3QucG5nIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndW5rbm93bi12cEFnIGIvdGVzdHMvcG5ndW5rbm93bi12cEFnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGYwN2I2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3Vua25vd24tdnBBZworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndW5rbm93biAtLXN0cmljdCB2cEFnPWlmLXNhZmUgIiR7c3JjZGlyfS9wbmd0ZXN0LnBuZyIKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLTE2LXRvLTggYi90ZXN0cy9wbmd2YWxpZC1nYW1tYS0xNi10by04CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzQ5NDVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLTE2LXRvLTgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAuL3BuZ3ZhbGlkIC0tc3RyaWN0IC0tZ2FtbWEtMTYtdG8tOApkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtYWxwaGEtbW9kZSBiL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWFscGhhLW1vZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxNmU4YWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtYWxwaGEtbW9kZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS1nYW1tYS1hbHBoYS1tb2RlCmRpZmYgLS1naXQgYS90ZXN0cy9wbmd2YWxpZC1nYW1tYS1iYWNrZ3JvdW5kIGIvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtYmFja2dyb3VuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2RiZjU4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd2YWxpZC1nYW1tYS1iYWNrZ3JvdW5kCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLWJhY2tncm91bmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LWFscGhhLW1vZGUgYi90ZXN0cy9wbmd2YWxpZC1nYW1tYS1leHBhbmQxNi1hbHBoYS1tb2RlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmExMGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LWFscGhhLW1vZGUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAuL3BuZ3ZhbGlkIC0tc3RyaWN0IC0tZ2FtbWEtYWxwaGEtbW9kZSAtLWV4cGFuZDE2CmRpZmYgLS1naXQgYS90ZXN0cy9wbmd2YWxpZC1nYW1tYS1leHBhbmQxNi1iYWNrZ3JvdW5kIGIvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtYmFja2dyb3VuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQ5YTkxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd2YWxpZC1nYW1tYS1leHBhbmQxNi1iYWNrZ3JvdW5kCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLWJhY2tncm91bmQgLS1leHBhbmQxNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtdHJhbnNmb3JtIGIvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtZXhwYW5kMTYtdHJhbnNmb3JtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmQxZjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLWV4cGFuZDE2LXRyYW5zZm9ybQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS1nYW1tYS10cmFuc2Zvcm0gLS1leHBhbmQxNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtc2JpdCBiL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLXNiaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjYTA4ZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtc2JpdAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS1nYW1tYS1zYml0CmRpZmYgLS1naXQgYS90ZXN0cy9wbmd2YWxpZC1nYW1tYS10aHJlc2hvbGQgYi90ZXN0cy9wbmd2YWxpZC1nYW1tYS10aHJlc2hvbGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmZTRlZGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtdGhyZXNob2xkCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLWdhbW1hLXRocmVzaG9sZApkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtdHJhbnNmb3JtIGIvdGVzdHMvcG5ndmFsaWQtZ2FtbWEtdHJhbnNmb3JtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmE2MmM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3ZhbGlkLWdhbW1hLXRyYW5zZm9ybQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS1nYW1tYS10cmFuc2Zvcm0KZGlmZiAtLWdpdCBhL3Rlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLWludGVybGFjZS1zdGFuZGFyZCBiL3Rlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLWludGVybGFjZS1zdGFuZGFyZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYThjZGY5ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1pbnRlcmxhY2Utc3RhbmRhcmQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyAuL3BuZ3ZhbGlkIC0tc3RyaWN0IC0tc3RhbmRhcmQgLS1wcm9ncmVzc2l2ZS1yZWFkIC0taW50ZXJsYWNlCmRpZmYgLS1naXQgYS90ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1zaXplIGIvdGVzdHMvcG5ndmFsaWQtcHJvZ3Jlc3NpdmUtc2l6ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY4ZDZkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1zaXplCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLXNpemUgLS1wcm9ncmVzc2l2ZS1yZWFkCmRpZmYgLS1naXQgYS90ZXN0cy9wbmd2YWxpZC1wcm9ncmVzc2l2ZS1zdGFuZGFyZCBiL3Rlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLXN0YW5kYXJkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjdlNWMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3ZhbGlkLXByb2dyZXNzaXZlLXN0YW5kYXJkCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV4ZWMgLi9wbmd2YWxpZCAtLXN0cmljdCAtLXN0YW5kYXJkIC0tcHJvZ3Jlc3NpdmUtcmVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndmFsaWQtc3RhbmRhcmQgYi90ZXN0cy9wbmd2YWxpZC1zdGFuZGFyZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTg5Yjg4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9wbmd2YWxpZC1zdGFuZGFyZAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS1zdGFuZGFyZApkaWZmIC0tZ2l0IGEvdGVzdHMvcG5ndmFsaWQtdHJhbnNmb3JtIGIvdGVzdHMvcG5ndmFsaWQtdHJhbnNmb3JtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNzUzNmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3BuZ3ZhbGlkLXRyYW5zZm9ybQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1leGVjIC4vcG5ndmFsaWQgLS1zdHJpY3QgLS10cmFuc2Zvcm0K