ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKRGFuaWVsIFMgKDIxIEp1bmUgMjAwNykKLSBHZXJyaXQgQnJ1Y2ho5HVzZXIgcG9pbnRlZCBvdXQgYSB3YXJuaW5nIHRoYXQgdGhlIEludGVsKFIpIFRocmVhZCBDaGVja2VyCiAgdG9vbCByZXBvcnRzIGFuZCBpdCB3YXMgaW5kZWVkIGEgbGVnaXRpbWF0ZSBvbmUgYW5kIGl0IGlzIG9uZSBmaXhlZC4gSXQgd2FzCiAgYSB1c2Ugb2YgYSBzaGFyZSB3aXRob3V0IGRvaW5nIHRoZSBwcm9wZXIgbG9ja2luZyBmaXJzdC4KICAKRGFuaWVsIFMgKDIwIEp1bmUgMjAwNykKLSBBZGFtIFBpZ2dvdHQgZmlsZWQgYnVnIHJlcG9ydCAjMTc0MDI2MwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzQwMjYzKS4gQWRhbSBkaXNjb3ZlcmVkIHRoYXQgd2hlbgogIGdldHRpbmcgYSBsYXJnZSBhbW91bnQgb2YgVVJMcyB3aXRoIGN1cmwsIHRoZXkgd2VyZSBmZXRjaGVkIHNsb3dlciBhbmQKICBzbG93ZXIuLi4gd2hpY2ggdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIHRoZSAtLWxpYmN1cmwgZGF0YSBjb2xsZWN0aW5nIHdoaWNoCiAgd3JvbmdseSBhbHdheXMgd2FzIGVuYWJsZWQsIGJ1dCBubyBsb25nZXIgaXMuLi4KCkRhbmllbCBTICgxOCBKdW5lIDIwMDcpCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzM5MTAwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzkxMDApIHRoYXQgbWVudGlvbmVkIHRoYXQgbGliY3VybAogIGNvdWxkIG5vdCBhY3R1YWxseSBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYSBnaXZlbiBGVFAKICBzZXJ2ZXIgaWYgdGhlIGxvZ2luIGRpcmVjdG9yeSBpc24ndCByb290LiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZAogIHRocmVlIHRlc3QgY2FzZXMgKG9uZSBpcyBkaXNhYmxlZCBmb3Igbm93IHNpbmNlIEkgaWRlbnRpZmllZCBLTk9XTl9CVUdTICM0NCwKICB3ZSBjYW5ub3QgdXNlIC0tZnRwLW1ldGhvZCBub2N3ZCBhbmQgbGlzdCBmdHAgZGlyZWN0b3JpZXMpLgoKRGFuaWVsIFMgKDE0IEp1bmUgMjAwNykKLSBTaG11bGlrIFJlZ2V2OgoKICBJJ3ZlIGVuY291bnRlcmVkIChhbmQgaG9wZWZ1bGx5IGZpeGVkKSBhIHByb2JsZW0gaW52b2x2aW5nIHByb3h5IENPTk5FQ1QKICByZXF1ZXN0cyBhbmQgZWFzeSBoYW5kbGVzIHN0YXRlIG1hbmFnZW1lbnQuIFRoZSBwcm9ibGVtIGlzbid0IHNpbXBsZSB0bwogIHJlcHJvZHVjZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHNvY2tldCBzdGF0ZS4gSXQgb25seSBtYW5pZmVzdHMgaXRzZWxmIHdoZW4KICB3b3JraW5nIHdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMuCgogIEhlcmUgaXMgdGhlIHNjZW5hcmlvOgoKICAxLiBpbiBtdWx0aV9ydW5zaW5nbGUgdGhlIGVhc3kgaGFuZGxlIGlzIGluIHRoZSBDVVJMTV9TVEFURV9XQUlUQ09OTkVDVCBhbmQKICBjYWxscyBDdXJsX3Byb3RvY29sX2Nvbm5lY3QKCiAgMi4gaW4gQ3VybF9wcm94eUNPTk5FQ1QsIGxpbmUgMTI0NywgaWYgdGhlIHNvY2tldCBpc24ndCByZWFkeSB0aGUgZnVuY3Rpb24KICByZXR1cm5zIGFuZCBjb25uLT5iaXRzLnR1bm5lbF9jb25uZWN0aW5nIGlzIFRSVUUKCiAgMy4gd2hlbiB0aGUgY2FsbCB0byBDdXJsX3Byb3RvY29sX2Nvbm5lY3QgcmV0dXJucyB0aGUgcHJvdG9jb2xfY29ubmVjdCBmbGFnCiAgaXMgZmFsc2UgYW5kIHRoZSBlYXN5IHN0YXRlIGlzIGNoYW5nZWQgdG8gQ1VSTE1fU1RBVEVfUFJPVE9DT05ORUNUIHdoaWNoCiAgaXNuJ3QgY29ycmVjdCBpZiBhIHByb3h5IGlzIHVzZWQuICBSYXRoZXIgQ1VSTE1fU1RBVEVfV0FJVFBST1hZQ09OTkVDVAogIHNob3VsZCBiZSB1c2VkLgoKICBJIGRpc2NvdmVyZWQgdGhpcyB3aGlsZSBwZXJmb3JtaW5nIGFuIEhUVFBTIHJlcXVlc3QgdGhyb3VnaCBhIHByb3h5IChzcXVpZCkKICBvbiBteSBsb2NhbCBuZXR3b3JrLiBUaGUgcHJvYmxlbSBjYXVzZWQgb3BlbnNzbCB0byBmYWlsIGFzIGl0IHJlYWQgdGhlIHByb3h5CiAgcmVzcG9uc2UgdG8gdGhlIENPTk5FQ1QgY2FsbCAoJ0hUVFAvMS4wIEVzdGFibGlzaGVkJykgcmF0aGVyIHRoYW4gdGhlIFNTTAogIGhhbmRzaGFrZSAodGhlIGV4YWN0IG9wZW5zc2wgZXJyb3Igd2FzICd3cm9uZyBzc2wgdmVyc2lvbicgYnV0IHRoaXMgaXNuJ3QKICB2ZXJ5IGltcG9ydGFudCkKCi0gRGF2ZSBWYXNpbGV2c2t5IGZpbGVkIGJ1ZyByZXBvcnQgIzE3MzY4NzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczNjg3NSkgYWxtb3N0IHNpbXVsdGFub3Vlc2x5IGFzIERhbgogIEZhbmRyaWNoIG1lbnRpb25lZCBhIHJlbGF0ZWQgYnVpbGQgcHJvYmxlbSBvbiB0aGUgbGliY3VybCBtYWlsaW5nIGxpc3Q6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAxMzEuaHRtbC4gQm90aCBwcm9ibGVtcyBoYWQgdGhlIHNhbWUKICByZWFzb246IHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgUE9MTCogZGVmaW5lcyBhbmQgdGhlIHBvbGxmZCBzdHJ1Y3QgaW4gdGhlCiAgbGliY3VybCBjb2RlIHdhcyBkZXBlbmRpbmcgb24gSEFWRV9QT0xMIGluc3RlYWQgb2YgSEFWRV9TWVNfUE9MTF9ILgoKRGFuaWVsIFMgKDEzIEp1bmUgMjAwNykKLSBUb20gUmVnbmVyIHByb3ZpZGVkIGEgcGF0Y2ggYW5kIHdvcmtlZCB0b2dldGhlciB3aXRoIEphbWVzIEhvdXNsZXksIHNvIG5vdwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgd29ya3MgZm9yIFNGVFAgY29ubmVjdGlvbnMgYXMgd2VsbCBhcyBGVFAKICBvbmVzLgoKLSBSaWNoIFJhdWVuemFobiBmaWxlZCBidWcgcmVwb3J0ICMxNzMzMTE5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzMxMTkpIGFuZCB3ZSBjb2xsYWJvcmF0ZWQgb24gdGhlCiAgZml4LiAgVGhlIHByb2JsZW0gaXMgdGhhdCBmb3IgNjRiaXQgSFBVWCBidWlsZHMsIHNldmVyYWwgc29ja2V0LXJlbGF0ZWQKICBmdW5jdGlvbnMgd291bGQgc3RpbGwgYXNzdW1lIGludCAoMzIgYml0KSBhcmd1bWVudHMgYW5kIG5vdCBzb2NrbGVuX3QgKDY0CiAgYml0KSBvbmVzLgoKRGFuaWVsIFMgKDEyIEp1bmUgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgaGlzIHJldmFtcGVkIFNTSCBjb2RlIHRoYXQgaXMgc3RhdGUtbWFjaGluZSBkcml2ZW4gdG8KICByZWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5vdyB0b3RhbGx5IG5vbi1ibG9ja2luZyBsaWJzc2gyIChpbiBDVlMpLgoKRGFuIEYgKDggSnVuZSAyMDA3KQotIEluY29ycG9yYXRlZCBEYW5pZWwgQmxhY2sncyB0ZXN0NzA2IGFuZCB0ZXN0NzA3IFNPQ0tTIHRlc3QgY2FzZXMuCgotIEZpeGVkIGEgZmV3IHByb2JsZW1zIHdoZW4gc3RhcnRpbmcgdGhlIFNPQ0tTIHNlcnZlci4KCi0gUmV2ZXJ0ZWQgc29tZSByZWNlbnQgY2hhbmdlcyB0byBydW50ZXN0cy5wbCB0aGF0IHdlcmVuJ3QgY29tcGF0aWJsZSB3aXRoCiAgcGVybCA1LjAuCgotIEZpeGVkIHRoZSB0ZXN0IGhhcm5lc3Mgc28gdGhhdCBpdCBhY3R1YWxseSBraWxscyB0aGUgc3NoIGJlaW5nIHVzZWQgYXMKICB0aGUgU09DS1Mgc2VydmVyLgoKRGFuaWVsIFMgKDYgSnVuZSAyMDA3KQotIC1zLy0tc2lsZW50IGNhbiBub3cgYmUgdXNlZCB0byB0b2dnbGUgb2ZmIHRoZSBzaWxlbmNlIGFnYWluIGlmIHVzZWQgYSBzZWNvbmQKICB0aW1lLgoKRGFuaWVsIFMgKDUgSnVuZSAyMDA3KQotIEFkZGVkIERhbmllbCBCbGFjaydzIHdvcmsgdGhhdCBhZGRzIHRoZSBmaXJzdCBmZXcgU09DS1MgdGVzdCBjYXNlcy4gSSBhbHNvCiAgZml4ZWQgdHdvIG1pbm9yIFNPQ0tTIHByb2JsZW1zIHRvIG1ha2UgdGhlIHRlc3QgY2FzZXMgcnVuIGZpbmUuCgpEYW5pZWwgUyAoMzEgTWF5IDIwMDcpCi0gRmVuZyBUdSBtYWRlIChsaWIpY3VybCBzdXBwb3J0ICJ1cGxvYWQiIHJlc3VtaW5nIHdvcmsgZm9yIGZpbGU6Ly8gVVJMcy4KCkRhbmllbCBTICgzMCBNYXkgMjAwNykKLSBJIG1vZGlmaWVkIHRoZSAxMC1hdC1hLXRpbWUuYyBleGFtcGxlIHRvIHRyYW5zZmVyIDUwMCBkb3dubG9hZHMgaW4gcGFyYWxsZWwKICB3aXRoIGEgYy1hcmVzIGVuYWJsZWQgYnVpbGQgb25seSB0byBmaW5kIHRoYXQgaXQgY3Jhc2hlZCBtaXNlcmFibHksIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBzb21lIHNlbGVjdCgpaXNtcyBsZWZ0IGluIHRoZSBjb2RlLiBUaGlzIHdhcyBkdWUgdG8gQVBJCiAgcmVzdHJpY3Rpb25zIGluIGMtYXJlcyAxLjMueCwgYnV0IHdpdGggdGhlIHVwY29taW5nIGMtYXJlcyAxLjQuMCB0aGlzIGlzIG5vCiAgbG9uZ2VyIHRoZSBjYXNlIHNvIG5vdyBsaWJjdXJsIHJ1bnMgbXVjaCBiZXR0ZXIgd2l0aCBjLWFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZSB3aXRoID4gMTAyNCBmaWxlIGRlc2NyaXB0b3JzIGluIHVzZS4KCiAgRXh0cmEgbm90ZTogc3RhcnRpbmcgbm93IHdlIHJlcXVpcmUgYy1hcmVzIDEuNC4wIGZvciBhc3luY2hyb25vdXMgbmFtZQogIHJlc29sdmVzLgoKLSBBZGRlZCBDVVJMTU9QVF9NQVhDT05ORUNUUyB3aGljaCBpcyBhIGN1cmxfbXVsdGlfc2V0b3B0KCkgb3B0aW9uIGZvciBzZXR0aW5nCiAgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBjYWNoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG11bHRpIGhhbmRsZS4KCkRhbmllbCBTICgyNyBNYXkgMjAwNykKLSBXaGVuIHdvcmtpbmcgd2l0aCBhIHByb2JsZW0gU3RlZmFuIEJlY2tlciBoYWQsIEkgZm91bmQgYW4gb2ZmLWJ5LW9uZSBidWZmZXIKICBvdmVyd3JpdGUgaW4gQ3VybF9zZWxlY3QoKS4gV2hpbGUgZml4aW5nIGl0LCBJIGFsc28gaW1wcm92ZWQgaXRzIHBlcmZvcm1hbmNlCiAgc29tZXdoYXQgYnkgY2hhbmdpbmcgY2FsbG9jIHRvIG1hbGxvYyBhbmQgYnJlYWtpbmcgb3V0IG9mIGEgbG9vcCBlYXJsaWVyCiAgKHdoZW4gcG9zc2libGUpLgoKRGFuaWVsIFMgKDI1IE1heSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGZpeGVkIGJ1ZyAjMTcwNTgwMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA1ODAyKSwgd2hpY2ggd2FzIGZpbGVkIGJ5IERhbmllbAogIEJsYWNrIGlkZW50aWZ5aW5nIHNldmVyYWwgRlRQLVNTTCB0ZXN0IGNhc2VzIGZhaWwgd2hlbiB3ZSBidWlsZCBsaWJjdXJsIHdpdGgKICBOU1MgZm9yIFRMUy9TU0wuIExpc3RlZCBhcyAjNDIgaW4gS05PV05fQlVHUy4KCkRhbmllbCBTICgyNCBNYXkgMjAwNykKLSBTb25nIE1hIGZpbGVkIGJ1ZyByZXBvcnQgIzE3MjQwMTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcyNDAxNikgbm90aWNpbmcgdGhhdCBkb3dubG9hZGluZwogIGdsb2ItcmFuZ2VzIGZvciBURlRQIHdhcyBicm9rZW4gaW4gQ1ZTLiBGaXhlZCBub3cuCiAgCi0gJ215dHgnIGluIGJ1ZyByZXBvcnQgIzE3MjMxOTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MjMxOTQpCiAgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2FybmYoKSBmdW5jdGlvbiBpbiB0aGUgY3VybCB0b29sIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgd2l0aCB0aGUgY2FzZXMgd2hlbiBleGNlc3NpdmVseSBsb25nIHdvcmRzIHdlcmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNob3AKICB1cC4KCkRhbmllbCBTICgyMiBNYXkgMjAwNykKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgdGhlCiAgcGVlcidzIG5hbWUgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSB3aGVuIGJ1aWx0IGZvciBPcGVuU1NMLiBUaGUgbGVhayBoYXBwZW5zCiAgZm9yIGxpYmN1cmxzIHdpdGggQ1VSTF9ET0VTX0NPTlZFUlNJT05TIGVuYWJsZWQgdGhhdCBmYWlsIHRvIGNvbnZlcnQgdGhlIENOCiAgbmFtZSBmcm9tIFVURjguIEhlIGFsc28gZml4ZWQgYSBsZWFrIHdoZW4gUEtDUyAjMTIgcGFyc2luZyBmYWlsZWQuCgpEYW5pZWwgUyAoMTggTWF5IDIwMDcpCi0gRmVuZyBUdSByZXBvcnRlZCB0aGF0IGN1cmwgLXcgZGlkIHdyb25nIG9uIFRGVFAgdHJhbnNmZXJzIGluIGJ1ZyByZXBvcnQKICAjMTcxNTM5NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcxNTM5NCksIGFuZCB0aGUKICB0cmFuc2Zlci1yZWxhdGVkIGluZm8gInZhcmlhYmxlcyIgd2VyZSBpbmRlZWQgb3ZlcndyaXR0ZW4gd2l0aCB6ZXJvZXMKICB3cm9uZ2x5IGFuZCBoYXZlIG5vdyBiZWVuIGFkanVzdGVkLiBUaGUgdXBsb2FkIHNpemUgc3RpbGwgaXNuJ3QgYWNjdXJhdGUuCgpEYW5pZWwgUyAoMTcgTWF5IDIwMDcpCi0gRmVuZyBUdSBwb2ludGVkIG91dCBhIGRpdmlzaW9uIGJ5IHplcm8gZXJyb3IgaW4gdGhlIFRGVFAgY29ubmVjdCB0aW1lb3V0CiAgY29kZSBmb3IgdGltZW91dHMgbGVzcyB0aGFuIGZpdmUgc2Vjb25kcywgYW5kIGFsc28gcHJvdmlkZWQgYSBmaXggZm9yIGl0LgogIEJ1ZyByZXBvcnQgIzE3MTUzOTIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MTUzOTIpCgpEYW4gRiAoMTYgTWF5IDIwMDcpCi0gQWRkZWQgc3VwcG9ydCBmb3IgY29tcGlsaW5nIHVuZGVyIE1pbml4IDMuMS4zIHVzaW5nIEFDSy4KCkRhbiBGICgxNCBNYXkgMjAwNykKLSBBZGRlZCBTRlRQIGRpcmVjdG9yeSBsaXN0aW5nIHRlc3QgY2FzZSA2MTMuCgotIEFkZGVkIHN1cHBvcnQgZm9yIHF1b3RlIGNvbW1hbmRzIGJlZm9yZSBhIHRyYW5zZmVyIHVzaW5nIFNGVFAgYW5kIHRlc3QKICBjYXNlIDYxNC4KCi0gQ2hhbmdlZCB0aGUgcG9zdC1xdW90ZSBjb21tYW5kcyB0byBvY2N1ciBhZnRlciB0aGUgdHJhbnNmZXJyZWQgZmlsZSBpcwogIGNsb3NlZC4KCi0gQWxsb3cgU0ZUUCBxdW90ZSBjb21tYW5kcyBjaG1vZCwgY2hvd24sIGNoZ3JwIHRvIHNldCBhIHZhbHVlIG9mIDAuCgpEYW4gRiAoOSBNYXkgMjAwNykKLSBLcmlzdGlhbiBHdW5zdG9uZSBmaXhlZCBhIHByb2JsZW0gd2hlcmUgb3ZlcndyaXRpbmcgYW4gdXBsb2FkZWQgZmlsZSB3aXRoCiAgc2Z0cCBkaWRuJ3QgdHJ1bmNhdGUgaXQgZmlyc3QsIHdoaWNoIHdvdWxkIGNvcnJ1cHQgdGhlIGZpbGUgaWYgdGhlIG5ldwogIGZpbGUgd2FzIHNob3J0ZXIgdGhhbiB0aGUgb2xkLgoKRGFuIEYgKDggTWF5IDIwMDcpCi0gQWRkZWQgRlRQUyB0ZXN0IGNhc2VzIDQwNiBhbmQgNDA3CgpEYW5pZWwgUyAoOCBNYXkgMjAwNykKLSBDVVJMRV9GVFBfQ09VTEROVF9TVE9SX0ZJTEUgaXMgbm93IGtub3duIGFzIENVUkxFX1VQTE9BRF9GQUlMRUQuIFRoaXMgaXMKICBiZWNhdXNlIEkganVzdCBtYWRlIFNDUCB1cGxvYWRzIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZSBmaWxlIHNpemUgb2YKICB0aGUgdXBsb2FkIGZpbGUgaXNuJ3QgZ2l2ZW4gd2l0aCBDVVJMT1BUX0lORklMRVNJWkUqLiBEb2NzIHVwZGF0ZWQgdG8KICByZWZsZWN0IHRoaXMgbmV3cywgYW5kIGEgZGVmaW5lIGZvciB0aGUgb2xkIG5hbWUgd2FzIGFkZGVkIHRvIHRoZSBwdWJsaWMKICBoZWFkZXIgZmlsZS4KCkRhbmllbCBTICg3IE1heSAyMDA3KQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgYnVnIGluIHRoZSBtdWx0aSBoYW5kbGUgY29kZSB0aGF0IG1hZGUgdGhlIGNvbm5lY3Rpb24KICBjYWNoZSBncm93IGEgYml0IHRvbyBtdWNoLCBiZXlvbmQgdGhlIG5vcm1hbCA0ICogZWFzeV9oYW5kbGVzLgoKRGFuaWVsIFMgKDIgTWF5IDIwMDcpCi0gQW5kZXJzIEd1c3RhZnNzb24gcmVtYXJrZWQgdGhhdCByZXF1aXJpbmcgQ1VSTE9QVF9IVFRQX1ZFUlNJT04gc2V0IHRvIDEuMAogIHdoZW4gQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUyBpcyB1c2VkIHRvIGF2b2lkIHRoZSBwcm9ibGVtIG1lbnRpb25lZCBiZWxvdyBpcwogIG5vdCB2ZXJ5IG5pY2UgaWYgdGhlIGNsaWVudCB3YW50cyB0byBiZSBhYmxlIHRvIHVzZSBfZWl0aGVyXyBhIEhUVFAgMS4xCiAgc2VydmVyIG9yIG9uZSB3aXRoaW4gdGhlIGFsaWFzZXMgbGlzdC4uLiBzbyBzdGFydGluZyBub3csIGxpYmN1cmwgd2lsbAogIHNpbXBseSBjb25zaWRlciAyMDAtYWxpYXMgbWF0Y2hlcyB0aGUgdG8gYmUgSFRUUCAxLjAgY29tcGxpYW50LgoKLSBUb2JpYXMgUnVuZHN0cvZtIHJlcG9ydGVkIGEgcHJvYmxlbSB0aGV5IGV4cGVyaWVuY2VkIHdpdGggeG1tczIgYW5kIHJlY2VudAogIGxpYmN1cmxzLCB3aGljaCB0dXJuZWQgb3V0IHRvIGJlIHRoZSAyNS1ub3YtMjAwNiBjaGFuZ2Ugd2hpY2ggdHJlYXRzIEhUVFAKICByZXNwb25zZXMgd2l0aG91dCBDb250ZW50LUxlbmd0aCBvciBjaHVua2VkIGVuY29kaW5nIGFzIHdpdGhvdXQgYm9kaWVzLiBXZQogIG5vdyBhZGRlZCB0aGUgY29uZGl0aW9uYWwgdGhhdCB0aGUgYWJvdmUgbWVudGlvbmVkIHJlc3BvbnNlIGlzIG9ubHkgd2l0aG91dAogIGJvZHkgaWYgdGhlIHJlc3BvbnNlIGlzIEhUVFAgMS4xLgoKLSBKZWZmIFBvaGxtZXllciBpbXByb3ZlZCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSB0byB1c2UgdGhlCiAgQ1VSTE1PUFRfVElNRVJGVU5DVElPTiBjYWxsYmFjayBvcHRpb24uCgotIFNldCB0aGUgdGltZW91dCBmb3IgZWFzeSBoYW5kbGVzIHRvIGV4cGlyZSByZWFsbHkgc29vbiBhZnRlciBhZGRpdGlvbiBvcgogIHdoZW4gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGlzIHJldHVybmVkIGZyb20gY3VybF9tdWx0aV9zb2NrZXQqL3BlcmZvcm0sCiAgdG8gbWFrZSBhcHBsaWNhdGlvbnMgdXNpbmcgb25seSBjdXJsX211bHRpX3NvY2tldCgpIHRvIHByb3Blcmx5IGZ1bmN0aW9uCiAgd2hlbiBhZGRpbmcgZWFzeSBoYW5kbGVzICJvbiB0aGUgZmx5Ii4gQnVnIHJlcG9ydCBhbmQgdGVzdCBhcHAgcHJvdmlkZWQgYnkKICBNaWNoYWVsIFdhbGxuZXIuCgpEYW4gRiAoMzAgQXByaWwgMjAwNykKLSBJbXByb3ZlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFsbG93IHJ1bm5pbmcgdGVzdCBzZXJ2ZXJzIG9uIG90aGVyIHRoYW4KICB0aGUgZGVmYXVsdCBwb3J0IG51bWJlcnMsIGFsbG93aW5nIG1vcmUgdGhhbiBvbmUgdGVzdCBzdWl0ZSB0byBydW4KICBzaW11bHRhbmVvdXNseSBvbiB0aGUgc2FtZSBob3N0LgoKRGFuaWVsIFMgKDI4IEFwcmlsIDIwMDcpCi0gUGV0ZXIgTydHb3JtYW4gZml4ZWQgbGliY3VybCB0byBub3QgaW5pdCBHbnVUTFMgYXMgZWFybHkgYXMgd2UgZGlkIGJlZm9yZSwKICBzaW5jZSBpdCB0aGVuIGluaXRzIGxpYmdjcnlwdCBhbmQgbGliZ2NyeXB0IGlzIGJlaW5nIGV2aWwgYW5kIEVYSVRTIHRoZQogIGFwcGxpY2F0aW9uIGlmIGl0IGZhaWxzIHRvIGdldCBhIGZpbmUgcmFuZG9tIHNlZWQuIFRoYXQncyByZWFsbHkgbm90IGEgbmljZQogIHRoaW5nIHRvIGRvIGJ5IGEgbGlicmFyeS4KCi0gRnJhbmsgSGVtcGVsIGZpeGVkIGEgY3VybF9lYXN5X2R1cGhhbmRsZSgpIGNyYXNoIG9uIGEgaGFuZGxlIHRoYXQgaGFkCiAgYmVlbiByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUsIGFuZCB0aGVuIGZpeGVkIGFub3RoZXIgZmxhdyB0aGF0IHByZXZlbnRlZAogIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB3b3JrIGV2ZW4gYWZ0ZXIgdGhlIGZpcnN0IGZpeCAtIHRoZSBoYW5kbGUgd2FzCiAgc3RpbGwgbWFya2VkIGFzIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgpEYW5pZWwgUyAoMjYgQXByaWwgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBmb3VuZCBhIHByb2JsZW0gd2l0aCBTQ1AgZG93bmxvYWRzIHdoZW4gdGhlIGRvd25sb2FkZWQgZmlsZQogIHdhcyAxNjM4NSBieXRlcyAoMTZLKzEpIGFuZCBpdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCBwcm9wZXJseSBhbHdheXMgInN1Y2sKICBvdXQiIGFsbCBkYXRhIGZyb20gbGlic3NoMi4gVGhlIGVmZmVjdCBiZWluZyB0aGF0IGxpYmN1cmwgd291bGQgaGFuZyBvbiB0aGUKICBzb2NrZXQgd2FpdGluZyBmb3IgZGF0YSB3aGVuIGxpYnNzaDIgaGFkIGluIGZhY3QgYWxyZWFkeSByZWFkIGl0IGFsbC4uLgoKRGFuIEYgKDI1IEFwcmlsIDIwMDcpCi0gQWRkZWQgc3VwcG9ydCBpbiBydW50ZXN0cy5wbCBmb3IgIiFuIiB0ZXN0IG51bWJlcnMgdG8gZGlzYWJsZSBpbmRpdmlkdWFsCiAgdGVzdHMuICBDaGFuZ2VkIC10IHRvIG9ubHkga2VlcCBsb2cgZmlsZXMgYXJvdW5kIHdoZW4gLWsgaXMgc3BlY2lmaWVkLAogIHRvIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHdpdGhvdXQgLXQuCgpEYW5pZWwgUyAoMjUgQXByaWwgMjAwNykKLSBTb25pYSBTdWJyYW1hbmlhbiBicm91Z2h0IG91ciBhdHRlbnRpb24gdG8gYSBwcm9ibGVtIHRoYXQgaGFwcGVucyBpZiB5b3Ugc2V0CiAgdGhlIENVUkxPUFRfUkVTVU1FX0ZST00gb3IgQ1VSTE9QVF9SQU5HRSBvcHRpb25zIGFuZCBhbiBleGlzdGluZyBjb25uZWN0aW9uCiAgaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUgaXMgY2xvc2VkIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBvbmUgd2hlbiB5b3UgY2FsbAogIGN1cmxfZWFzeV9wZXJmb3JtKCkuIEl0IHdvdWxkIHRoZW4gd3JvbmdseSBmcmVlIHJhbmdlLXJlbGF0ZWQgZGF0YSBpbiB0aGUKICBjb25uZWN0aW9uIGNsb3NlIGZ1bnRpb24uCgpZYW5nIFRzZSAoMjUgQXByaWwgMjAwNykKLSBTdGV2ZSBMaXR0bGUgZml4ZWQgY29tcGlsYXRpb24gb24gVk1TIDY0LWJpdCBtb2RlCgpEYW5pZWwgUyAoMjQgQXByaWwgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIG1hZGUgdGhlICdtYXN0ZXJfYnVmZmVyJyBnZXQgYWxsb2NhdGVkIGZpcnN0IG9uY2UgaXQgaXMKICBjYW4vd2lsbCBiZSB1c2VkIGFzIGl0IHRoZW4gbWFrZXMgdGhlIGNvbW1vbiBjYXNlcyBzYXZlIDE2S0Igb2YgZGF0YSBmb3IgZWFjaAogIGVhc3kgaGFuZGxlIHRoYXQgaXNuJ3QgdXNlZCBmb3IgcGlwZWxpbmluZy4KCkRhbiBGICgyMyBBcHJpbCAyMDA3KQotIEFkZGVkIDxwb3N0Y2hlY2s+IHN1cHBvcnQgdG8gdGhlIHRlc3QgaGFybmVzcy4KCi0gQWRkZWQgdGVzdHMgNjEwLTYxMiB0byB0ZXN0IG1vcmUgU0ZUUCBwb3N0LXF1b3RlIGNvbW1hbmRzLgoKRGFuaWVsIFMgKDIyIEFwcmlsIDIwMDcpCi0gU29uZyBNYSdzIHdhcm5pbmcgaWYgLXIvLS1yYW5nZSBpcyBnaXZlbiB3aXRoIGEgImJhZCIgcmFuZ2UsIGFsc28gbm90ZWQgaW4KICB0aGUgbWFuIHBhZ2Ugbm93LgoKLSBEYW5pZWwgQmxhY2sgZmlsZWQgYnVnICMxNzA1MTc3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDUxNzcpIHdoZXJlIC0td2l0aG91dC1zc2wKICAtLXdpdGgtZ251dGwgb3V0cHV0cyBhIHdhcm5pbmcgYWJvdXQgU1NMIG5vdCBiZWluZyBlbmFibGVkIGV2ZW4gdGhvdWdoIEdudVRMUwogIHdhcyBmb3VuZCBhbmQgdXNlZC4KCkRhbmllbCBTICgyMSBBcHJpbCAyMDA3KQotIERhbmllbCBCbGFjayBmaWxlZCBidWcgIzE3MDQ2NzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwNDY3NSkgaWRlbnRpZnlpbmcgYSBkb3VibGUtZnJlZQogIHByb2JsZW0gaW4gdGhlIFNTTC1kZWFsaW5nIGxheWVyLCB0ZWxsaW5nIEdudVRMUyB0byBmcmVlIE5VTEwgY3JlZGVudGlhbHMgb24KICBjbG9zZWRvd24gYWZ0ZXIgYSBmYWlsdXJlIGFuZCBhIGJhZCAjaWZkZWYgZm9yIE5TUyB3aGVuIGNsb3NpbmcgZG93biBTU0wuCgpZYW5nIFRzZSAoMjAgQXByaWwgMjAwNykKLSBTYXZlIG9uZSBjYWxsIHRvIGN1cmx4X3R2bm93KCksIHdoaWNoIGNhbGxzIGdldHRpbWVvZmRheSgpLCBpbiBlYWNoIG9mCiAgQ3VybF9zb2NrZXRfcmVhZHkoKSwgQ3VybF9wb2xsKCkgYW5kIEN1cmxfc2VsZWN0KCkgd2hlbiB0aGVzZSBhcmUgY2FsbGVkCiAgd2l0aCBhIHplcm8gdGltZW91dCBvciBhIHRpbWVvdXQgdmFsdWUgaW5kaWNhdGluZyBhIGJsb2NraW5nIGNhbGwgc2hvdWxkCiAgYmUgcGVyZm9ybWVkLgoKRGFuaWVsIFMgKDE4IEFwcmlsIDIwMDcpCi0gSmFtZXMgSG91c2xleSBtYWRlIFNGVFAgdXBsb2FkcyB1c2UgbGlic3NoMidzIG5vbi1ibG9ja2luZyBBUEkKCi0gUHJldmVudCB0aGUgaW50ZXJuYWwgcHJvZ3Jlc3MgbWV0ZXIgZnJvbSB1cGRhdGluZyBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlCiAgcGVyIHNlY29uZC4KCkRhbiBGICgxNyBBcHJpbCAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZXMgMjk2LCAyOTcgYW5kIDI5OCB0byB0ZXN0IC0tZnRwLW1ldGhvZCBoYW5kbGluZwoKRGFuaWVsIFMgKDE2IEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsIGFkZGVkIGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbigpIHRvIGxpYmN1cmwsIHdoaWNoIGlzIGEKICBmdW5jdGlvbiB0aGF0IGRlcHJlY2F0ZXMgdGhlIGN1cmxfbXVsdGlfc29ja2V0KCkgZnVuY3Rpb24uIFVzaW5nIHRoZSBuZXcKICBmdW5jdGlvbiB0aGUgYXBwbGljYXRpb24gdGVsbCBsaWJjdXJsIHdoYXQgYWN0aW9uIHRoYXQgd2FzIGZvdW5kIGluIHRoZQogIHNvY2tldCB0aGF0IGl0IHBhc3NlcyBpbi4gVGhpcyBnaXZlcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0IGFzIGl0CiAgYWxsb3dzIGxpYmN1cmwgdG8gYXZvaWQgYSBjYWxsIHRvIHBvbGwoKS9zZWxlY3QoKSBmb3IgZXZlcnkgY2FsbCB0bwogIGN1cmxfbXVsdGlfc29ja2V0KigpLgoKICBJIGFkZGVkIGEgZGVmaW5lIGluIHRoZSBwdWJsaWMgY3VybC9tdWx0aS5oIGhlYWRlciBmaWxlIHRoYXQgd2lsbCBtYWtlIHlvdXIKICBleGlzdGluZyBhcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5IHVzZSBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSBpbnN0ZWFkIG9mCiAgY3VybF9tdWx0aV9zb2NrZXQoKSB3aGVuIHlvdSByZWNvbXBpbGUuIEJ1dCBvZiBjb3Vyc2UgeW91J2xsIGdldCBiZXR0ZXIKICBwZXJmb3JtYW5jZSBpZiB5b3UgYWRqdXN0IHlvdXIgY29kZSBtYW51YWxseSBhbmQgYWN0dWFsbHkgcGFzcyBpbiB0aGUKICBjb3JyZWN0IGFjdGlvbiBiaXRtYXNrIHRvIHRoaXMgZnVuY3Rpb24uCgpEYW5pZWwgUyAoMTQgQXByaWwgMjAwNykKLSBKYXkgQXVzdGluIGFkZGVkICJESCBQQVJBTUVURVJTIiB0byB0aGUgc3R1bm5lbC5wZW0gY2VydGlmaWNhdGUgZm9yIHRoZSB0ZXN0CiAgc3VpdGUgdG8gbWFrZSBzdHVubmVsIHJ1biBiZXR0ZXIgaW4gc29tZSAobW9zdD8pIGVudmlyb25tZW50cy4KCkRhbiBGICgxMyBBcHJpbCAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZXMgMjk0IGFuZCAyOTUgdG8gdGVzdCAtLWZ0cC1hY2NvdW50IGhhbmRsaW5nCgotIEltcHJvdmVkIGhhbmRsaW5nIG9mIG91dCBvZiBtZW1vcnkgaW4gZnRwLgoKWWFuZyBUc2UgKDEzIEFwcmlsIDIwMDcpCi0gRml4IHRlc3QgY2FzZSA1MzQgd2hpY2ggc3RhcnRlZCB0byBmYWlsIDIwMDctMDQtMTMgZHVlIHRvIHRoZSBleGlzdGFuY2UKICBvZiBhIG5ldyBob3N0IG9uIHRoZSBuZXQgd2l0aCB0aGUgc2FtZSBzaWxseSBkb21haW4gdGhlIHRlc3Qgd2FzIHVzaW5nCiAgZm9yIGEgaG9zdCB3aGljaCB3YXMgc3VwcG9zZWQgbm90IHRvIGV4aXN0LgoKRGFuaWVsIFMgKDEyIEFwcmlsIDIwMDcpCi0gU29uZyBNYSBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBpZjJpcCBjb2RlIGlmIHlvdSBwYXNzIGluIGFuIGludGVyZmFjZQogIG5hbWUgbG9uZ2VyIHRoYW4gdGhlIG5hbWUgZmllbGQgb2YgdGhlIGlmcmVxIHN0cnVjdCAodHlwaWNhbGx5IDYgYnl0ZXMpLCBhcwogIHRoZW4gaXQgd291bGRuJ3QgY2xvc2UgdGhlIHVzZWQgZHVtbXkgc29ja2V0LiBCdWcgIzE2OTg5NzQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTY5ODk3NCkKClZlcnNpb24gNy4xNi4yICgxMSBBcHJpbCAyMDA3KQoKWWFuZyBUc2UgKDEwIEFwcmlsIDIwMDcpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgc29tZSBmaXhlcyBmb3IgSFRUUCBwaXBlbGluaW5nCgotIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBpZ25vcmUgLS1lbmFibGUtc3NwaSBvcHRpb24gZm9yIG5vbi1uYXRpdmUgV2luZG93cy4KCkRhbmllbCBTICg5IEFwcmlsIDIwMDcpCi0gTmljayBaaXR6bWFubiBkaWQgc3NoLmMgY2xlYW51cHMKCkRhbmllbCBTICgzIEFwcmlsIDIwMDcpCi0gUm9iIEpvbmVzIGZpeGVkIGJldHRlciAjaWZkZWYnaW5nIGZvciBhIGJ1bmNoIG9mICNpbmNsdWRlIGxpbmVzLgoKRGFuaWVsIFMgKDIgQXByaWwgMjAwNykKLSBOaWNrIFppdHptYW5uIG1hZGUgdGhlIENVUkxPUFRfUE9TVFFVT1RFIG9wdGlvbiB3b3JrIGZvciBTRlRQIGFzIHdlbGwuIFRoZQogIGFjY2VwdGVkIGNvbW1hbmRzIGFyZSBhcyBmb2xsb3dzOgoKICBjaGdycCAoZ2lkKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIGdyb3VwIElEIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8gKGdpZCkuIChnaWQpCiAgICBtdXN0IGJlIGEgbnVtYmVyLgoKICBjaG1vZCAocGVybXMpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0bwogICAgKHBlcm1zKS4gKHBlcm1zKSBtdXN0IGJlIGEgbnVtYmVyIGluIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgY2htb2QgVW5peAogICAgY29tbWFuZC4KCiAgY2hvd24gKHVpZCkgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSB1c2VyIElEIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8gKHVpZCkuICh1aWQpCiAgICBtdXN0IGJlIGEgbnVtYmVyLgoKICBsbiAoc291cmNlKSAoZGVzdCkKICAgIENyZWF0ZXMgYSBzeW1ib2xpYyBsaW5rIGF0IChkZXN0KSB0aGF0IHBvaW50cyB0byB0aGUgZmlsZSBsb2NhdGVkIGF0CiAgICAoc291cmNlKS4KCiAgbWtkaXIgKHBhdGgpCiAgICBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBhdCAocGF0aCkuCgogIHJlbmFtZSAoc291cmNlKSAoZGVzdCkKICAgIE1vdmVzIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAoc291cmNlKSB0byAoZGVzdCkuCgogIHJtIChwYXRoKQogICAgRGVsZXRlcyB0aGUgZmlsZSBsb2NhdGVkIGF0IChwYXRoKS4KCiAgcm1kaXIgKHBhdGgpCiAgICBEZWxldGVzIHRoZSBkaXJlY3RvcnkgbG9jYXRlZCBhdCAocGF0aCkuIFRoaXMgY29tbWFuZCB3aWxsIHJhaXNlIGFuIGVycm9yCiAgICBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eS4KCiAgc3ltbGluayAoc291cmNlKSAoZGVzdCkKICAgIFNhbWUgYXMgbG4uCgpEYW5pZWwgUyAoMSBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgbWFkZSBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBhIGxvdCBmYXN0ZXIgd2hlbiBtYW55CiAgZWFzeSBoYW5kbGVzIGFyZSBhZGRlZCB0byBhIG11bHRpIGhhbmRsZSwgYnkgYXZvaWRpbmcgdGhlIGxvb3Bpbmcgb3ZlciBhbGwKICB0aGUgaGFuZGxlcyB0byBmaW5kIHdoaWNoIG9uZSB0byByZW1vdmUuCgotIE1hdHQgS3JhYWkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYgZmluZSBhZ2Fpbi4KCkRhbmllbCBTICgzMSBNYXJjaCAyMDA3KQotIEZpeGVkIHNldmVyYWwgbWlub3IgaXNzdWVzIGRldGVjdGVkIGJ5IHRoZSBjb3Zlcml0eS5jb20gc2Nhbm5lci4KCi0gIlBpeGVsIiBmaXhlZCBhIHByb2JsZW0gdGhhdCBhcHBlYXJlZCB3aGVuIHlvdSB1c2VkIC1mIHdpdGggdXNlcitwYXNzd29yZAogIGVtYmVkZGVkIGluIHRoZSBVUkwuCgpEYW4gRiAoMjkgTWFyY2ggMjAwNykKLSBEb24ndCB0ZWFyIGRvd24gdGhlIGZ0cCBjb25uZWN0aW9uIGlmIHRoZSBtYXhpbXVtIGZpbGVzaXplIHdhcyBleGNlZWRlZAogIGFuZCBhZGRlZCB0ZXN0cyAyOTAgYW5kIDI5MSB0byBjaGVjay4KCi0gQWRkZWQgZnRwcyB1cGxvYWQgYW5kIFNTTCByZXF1aXJlZCB0ZXN0cyA0MDEgYW5kIDQwMi4KCi0gU2VuZCBhbiBFT0YgbWVzc2FnZSBiZWZvcmUgY2xvc2luZyBhbiBTQ1AgY2hhbm5lbCwgYXMgcmVjb21tZW5kZWQgYnkKICBSRkM0MjU0LiBFbmFibGUgbGlic3NoMiB0cmFjaW5nIHdoZW4gc3NoIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24uCgpZYW5nIFRzZSAoMjcgTWFyY2ggMjAwNykKLSBJbnRlcm5hbCBmdW5jdGlvbiBDdXJsX3NlbGVjdCgpIHJlbmFtZWQgdG8gQ3VybF9zb2NrZXRfcmVhZHkoKQoKICBOZXcgSW50ZXJuYWwgd3JhcHBlciBmdW5jdGlvbiBDdXJsX3NlbGVjdCgpIGFyb3VuZCBzZWxlY3QgKDIpLCBpdAogIHVzZXMgcG9sbCgpIHdoZW4gYSBmaW5lIHBvbGwoKSBpcyBhdmFpbGFibGUsIHNvIG5vdyBsaWJjdXJsIGNhbiBiZQogIGJ1aWx0IHdpdGhvdXQgc2VsZWN0KCkgc3VwcG9ydCBhdCBhbGwgaWYgYSBmaW5lIHBvbGwoKSBpcyBhdmFpbGFibGUuCgpEYW5pZWwgUyAoMjUgTWFyY2ggMjAwNykKLSBEYW5pZWwgSm9obnNvbiBmaXhlZCBtdWx0aSBjb2RlIHRvIHRyYXZlcnNlIHRoZSBlYXN5IGhhbmRsZSBsaXN0IHByb3Blcmx5LgogIEEgbGVmdC1vdmVyIGJ1ZyBmcm9tIHRoZSBGZWJydWFyeSAyMSBmaXguCgpEYW4gRiAoMjMgTWFyY2ggMjAwNykKLSBBZGRlZCAtLXB1YmtleSBvcHRpb24gdG8gY3VybCBhbmQgbWFkZSAtLWtleSBhbHNvIHdvcmsgZm9yIFNDUC9TRlRQLAogIHBsdXMgbWFkZSAtLXBhc3Mgd29yayBvbiBhbiBTU0ggcHJpdmF0ZSBrZXkgYXMgd2VsbC4KCi0gQ2hhbmdlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGF0dGVtcHQgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gc2VydmVycwogIGJlZm9yZSByZXNvcnRpbmcgdG8gdGhlIGtpbGwgLTkgaGFtbWVyLgoKLSBBZGRlZCB0ZXN0IGhhcm5lc3MgaW5mcmFzdHJ1Y3R1cmUgdG8gc3VwcG9ydCBzY3Avc2Z0cCB0ZXN0cywgdXNpbmcKICBPcGVuU1NIIGFzIHRoZSBzZXJ2ZXIuCgotIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBzcGVjaWZ5aW5nIGEgcHJveHkgd2l0aCBhIGZpbGU6IFVSTC4KCllhbmcgVHNlICgyMCBNYXJjaCAyMDA3KQotIEZpeGVkOiBXaGVuIGEgc2lnbmFsIHdhcyBjYXVnaHQgYXdhaXRpbmcgZm9yIGFuIGV2ZW50IHVzaW5nIEN1cmxfc2VsZWN0KCkKICBvciBDdXJsX3BvbGwoKSB3aXRoIGEgbm9uLXplcm8gdGltZW91dCBib3RoIGZ1bmN0aW9ucyB3b3VsZCByZXN0YXJ0IHRoZQogIHNwZWNpZmllZCB0aW1lb3V0LiBUaGlzIGNvdWxkIGV2ZW4gbGVhZCB0byB0aGUgZXh0cmVtZSBjYXNlIHRoYXQgaWYgYQogIHNpZ25hbCBhcnJpdmVkIHdpdGggYSBmcmVjdWVuY3kgbG93ZXIgdG8gdGhlIHNwZWNpZmllZCB0aW1lb3V0IG5laXRoZXIKICBmdW5jdGlvbiB3b3VsZCBldmVyIGV4aXQuCgogIEFkZGVkIGV4cGVyaW1lbnRhbCBzeW1ib2wgZGVmaW5pdGlvbiBjaGVjayBDVVJMX0FDS05PV0xFREdFX0VJTlRSIGluCiAgQ3VybF9zZWxlY3QoKSBhbmQgQ3VybF9wb2xsKCkuIFdoZW4gY29tcGlsZWQgd2l0aCBDVVJMX0FDS05PV0xFREdFX0VJTlRSCiAgZGVmaW5lZCBib3RoIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhcyBzb29uIGFzIGEgc2lnbmFsIGlzIGNhdWdodC4gVXNlIGl0CiAgYXQgeW91ciBvd24gcmlzaywgYWxsIGNhbGxzIHRvIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgbGlicmFyeSBzaG91bGQgYmUKICByZXZpc2l0ZWQgYW5kIGNoZWNrZWQgYmVmb3JlIGZ1bGx5IHN1cHBvcnRpbmcgdGhpcyBmZWF0dXJlLgoKWWFuZyBUc2UgKDE5IE1hcmNoIDIwMDcpCi0gQnJ5YW4gSGVuZGVyc29uIGZpeGVkIHRoZSBwcm9ncmVzcyBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBnZXQgY2FsbGVkIG1vcmUKICBmcmVxdWVudGx5IGFsbG93aW5nIHNhbWUgY2FsbGluZyBmcmVjdWVuY3kgZm9yIHRoZSBjbGllbnQgcHJvZ3Jlc3MgY2FsbGJhY2suCiAgCkRhbiBGICgxNSBNYXJjaCAyMDA3KQotIFZhcmlvdXMgbWVtb3J5IGxlYWtzIHBsdWdnZWQgYW5kIE5VTEwgcG9pbnRlciBmaXhlcyBtYWRlIGluIHRoZSBzc2ggY29kZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNykKLSBOaWNrIG1hZGUgdGhlIGN1cmwgdG9vbCBhY2NlcHQgZ2xvYmJpbmcgcmFuZ2VzIHRoYXQgb25seSBpcyBvbmUgbnVtYmVyLCBpLmUKICB5b3UgY2FuIG5vdyB1c2UgWzEtMV0gd2l0aG91dCBjdXJsIGNvbXBsYWluaW5nLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA3KQotIEV5Z2VuZSBSeWFiaW5raW46CgogIFRoZSBwcm9ibGVtIGlzIHRoZSBmb2xsb3dpbmc6IHdoZW4gd2UncmUgY2FsbGluZyBDdXJsX2RvbmUgYW5kIGl0IGRlY2lkZXMgdG8KICBrZWVwIHRoZSBjb25uZWN0aW9uIG9wZW5lZCAoJ2xlZnQgaW50YWN0JyksIHRoZW4gdGhlIGNhbGxlciBpcyBub3Qgbm90aWZpZWQKICB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkb25lIHZpYSB0aGUgTlVMTGlmeWluZyBvZiB0aGUgcG9pbnRlciwgc28gc29tZSBlYXN5CiAgaGFuZGxlIGlzIGtlZXBpbmcgdGhlIHBvaW50ZXIgdG8gdGhpcyBjb25uZWN0aW9uLgoKICBMYXRlciBDb25uZWN0aW9uRXhpc3RzIGNhbiBzZWxlY3Qgc3VjaCBjb25uZWN0aW9uIGZvciByZXVzZSBldmVuIGlmIHdlJ3JlCiAgbm90IHBpcGVsaW5pbmc6IHBpcGVMZW4gaXMgemVybywgc28gdGhlIChwaXBlTGVuID4gMCAmJiAhY2FuUGlwZWxpbmUpIGlzCiAgZmFsc2UgYW5kIHdlIGNhbiByZXVzZSB0aGlzIGNvbm5lY3Rpb24gZm9yIGFub3RoZXIgZWFzeSBoYW5kbGUuIEJ1dCB0aHVzIHRoZQogIGNvbm5lY3Rpb24gd2lsbCBiZSBzaGFyZWQgYmV0d2VlbiB0d28gZWFzeSBoYW5kbGVzIGlmIHRoZSBoYW5kbGUgdGhhdCB3YW50cwogIHRvIHRha2UgdGhlIG93bmVyc2hpcCBpcyBub3QgdGhlIHNhbWUgYXMgd2FzIG5vdCBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbgogIHdhcyBkb25lIGluIEN1cmxfZG9uZS4gQW5kIHdoZW4gc29tZSBvZiB0aGVzZSBlYXN5IGhhbmRsZXMgd2lsbCBnZXQgdGhlaXIKICBjb25uZWN0aW9uIHJlYWxseSBmcmVlZCB0aGUgYW5vdGhlciBvbmUgd2lsbCBzdGlsbCBrZWVwIHRoZSBwb2ludGVyLgoKICBNeSBmaXggd2FzIHJhdGhlciB0cml2aWFsOiBJIGp1c3QgYWRkZWQgdGhlIE5VTExpZmljYXRpb24gdG8gdGhlICdlbHNlJwogIGJyYW5jaCBpbiB0aGUgQ3VybF9kb25lLiBNeSB0ZXN0cyB3aXRoIEdpdCBhbmQgRWxlY3RyaWNGZW5jZSBzaG93ZWQgbm8KICBwcm9ibGVtcyBib3RoIGZvciBIVFRQIHB1bGxpbmcgYW5kIGNsb25pbmcuIFJlcG9zaXRvcnkgc2l6ZSBpcyBhYm91dCAyNTAgTWIsCiAgc28gaXQgd2FzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBDdXJsJ3Mgd29yay4KCkRhbiBGICg5IE1hcmNoIDIwMDcpCi0gVXBkYXRlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFkZCBhIG5ldyAiY3J5cHRvIiBmZWF0dXJlIGNoZWNrIGFuZCB1cGRhdGVkIHRoZQogIGFwcHJvcHJpYXRlIHRlc3QgY2FzZSB0byB1c2UgaXQuICBGb3Igbm93LCB0aGlzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdGhlCiAgIlNTTCIgZmVhdHVyZSBiZWNhdXNlIGN1cmwgZG9lc24ndCBsaXN0IGl0IHNlcGFyYXRlbHkuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIGZpeGVkIENVUkxPUFRfSU5URVJGQUNFIGZvciBJUHY2LgoKLSBSb2JlcnQgQS4gTW9uYXQgaW1wcm92ZWQgdGhlIG1ha2V0Z3ogYW5kIFZDNi84IGdlbmVyYXRpbmcgdG8gc2V0IHRoZSBjb3JyZWN0CiAgbWFjaGluZSB0eXBlIHRvby4KCi0gSnVzdGluIEZsZXRjaGVyIGZpeGVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHRyeWluZyB0bwogIHVwbG9hZCBhIGZpbGUgaXQgY291bGRuJ3Qgb3Blbi4gQnVnICMxNjc2NTgxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2NzY1ODEpCgpEYW4gRiAoOSBNYXJjaCAyMDA3KQotIFVwZGF0ZWQgdGhlIHRlc3QgaGFybmVzcyB0byBjaGVjayBmb3IgcHJvdG9jb2wgc3VwcG9ydCBiZWZvcmUgcnVubmluZyBlYWNoCiAgdGVzdCwgZml4aW5nIEtOT1dOX0JVR1MgIzExLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBSZWludHJvZHVjZWQgKGFmdGVyIGEgMyB5ZWFyIGhpYXR1cykgYW4gRlRQUyB0ZXN0IGNhc2UgKDQwMCkgaW50byB0aGUgdGVzdAogIGhhcm5lc3MuICBJdCBpcyB2ZXJ5IGxpbWl0ZWQgYXMgaXQgc3VwcG9ydHMgb25seSBmdHBzOi8vIFVSTHMgd2l0aAogIC0tZnRwLXNzbC1jb250cm9sIHNwZWNpZmllZCwgd2hpY2ggaW1wbGljaXRseSBlbmNyeXB0cyB0aGUgY29udHJvbAogIGNoYW5uZWwgYnV0IG5vdCB0aGUgZGF0YSBjaGFubmVscy4gIFRoYXQgYWxsb3dzIHN0dW5uZWwgdG8gYmUgdXNlZCB3aXRoCiAgYW4gdW5tb2RpZmllZCBmdHAgc2VydmVyIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoYXQgdGhlIHRlc3QgaHR0cHMKICBzZXJ2ZXIgaXMgc2V0IHVwLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBIb25vdXIgLS1mdHAtc3NsLWNvbnRyb2wgb24gZnRwczovLyBVUkxzIHRvIGFsbG93IGVuY3J5cHRlZCBjb250cm9sIGFuZAogIHVuZW5jcnlwdGVkIGRhdGEgY29ubmVjdGlvbnMuCgpEYW4gRiAoNiBNYXJjaCAyMDA3KQotIEZpeGVkIGEgY291cGxlIG9mIGltcHJvcGVyIHBvaW50ZXIgdXNlcyBkZXRlY3RlZCBieSB2YWxncmluZCBpbiB0ZXN0CiAgY2FzZXMgMTgxICYgMjE2LgoKRGFuaWVsICgyIE1hcmNoIDIwMDcpCi0gUm9iZXJ0IEEuIE1vbmF0IGFuZCBTaG11bGlrIFJlZ2V2IGhlbHBlZCBvdXQgdG8gZml4IHRoZSBuZXcgKi9NYWtlZmlsZS52YzgKICBtYWtlZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSByZWxlYXNlIGFyY2hpdmVzLCBnZW5lcmF0ZWQgZnJvbQogIHRoZSBNYWtlZmlsZS52YzYgZmlsZXMgYnkgdGhlIG1ha2V0Z3ogc2NyaXB0LiBJIGFsc28gbW9kaWZpZWQgdGhlIHJvb3QKICBNYWtlZmlsZSB0byBoYXZlIGEgVkMgdmFyaWFibGUgdGhhdCBkZWZhdWx0cyB0byB2YzYgYnV0IGNhbiBiZSBvdmVycmlkZGVuIHRvCiAgYWxsb3cgaXQgdG8gYmUgdXNlZCBmb3IgdmM4IGFzIHdlbGwuIExpa2UgdGhpczoKCiAgICBubWFrZSBWQz12YzggdmMKCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNykKLSBIYW5nIEtpbiBMYXUgZm91bmQgYW5kIGZpeGVkOiBXaGVuIEkgdXNlIGxpYmN1cmwgdG8gY29ubmVjdCB0byBhbiBodHRwcwogIHNlcnZlciB0aHJvdWdoIGEgcHJveHkgYW5kIGhhdmUgdGhlIHJlbW90ZSBodHRwcyBzZXJ2ZXIgcG9ydCBzZXQgdXNpbmcgdGhlCiAgQ1VSTE9QVF9QT1JUIG9wdGlvbiwgcHJvdG9jb2wgZ2V0cyByZXNldCB0byBodHRwIGZyb20gaHR0cHMgYWZ0ZXIgdGhlIGZpcnN0CiAgcmVxdWVzdC4KIAogIFVzZXIgZGVmaW5lZCBVUkwgd2FzIG1vZGlmaWVkIGludGVybmFsbHkgYnkgbGliY3VybCBhbmQgc3Vic2VxdWVudCByZXVzZSBvZgogIHRoZSBlYXN5IGhhbmRsZSBtYXkgbGVhZCB0byBjb25uZWN0aW9uIHVzaW5nIGEgZGlmZmVyZW50IHByb3RvY29sIChpZiBub3QKICBvcmlnaW5hbGx5IGh0dHApLgogCiAgSSBmb3VuZCB0aGF0IGxpYmN1cmwgaGFyZGNvZGVkIHRoZSBwcm90b2NvbCB0byAiaHR0cCIgd2hlbiBpdCB0cmllcyB0bwogIHJlZ2VuZXJhdGUgdGhlIFVSTCBpZiBDVVJMT1BUX1BPUlQgaXMgc2V0LiBJIHRyaWVkIHRvIGZpeCB0aGUgcHJvYmxlbSBhcwogIGZvbGxvd3MgYW5kIGl0J3Mgd29ya2luZyBmaW5lIHNvIGZhcgoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA3KQotIEFkYW0gRC4gTW9zcyBtYWRlIHRoZSBIVFRQIENPTk5FQ1QgcHJvY2VkdXJlIGxlc3MgYmxvY2tpbmcgd2hlbiB1c2VkIGZyb20KICB0aGUgbXVsdGkgaW50ZXJmYWNlLiBOb3RlIHRoYXQgaXQgc3RpbGwgZG9lcyBhIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gaW4gYQogIGJsb2NraW5nIG1hbm5lci4KCkRhbmllbCAoMjMgRmVicnVhcnkgMjAwNykKLSBBZGRlZCB3YXJuaW5nIG91dHB1dHMgaWYgdGhlIGNvbW1hbmQgbGluZSB1c2VzIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG9wdGlvbnMKICAtdiwgLS10cmFjZSBhbmQgLS10cmFjZS1hc2NpaSwgc2luY2UgaXQgY291bGQgcmVhbGx5IGNvbmZ1c2UgdGhlIHVzZXIuCiAgQ2xhcmlmaWVkIHRoaXMgZmFjdCBpbiB0aGUgbWFuIHBhZ2UuCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDcpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgd29yayBvbiBsaWJjdXJsIG1ha2luZyBwaXBlbGluaW5nIG1vcmUgcm9idXN0IGFuZAogIGZpeGluZyBzb21lIGJ1Z3M6CiAgbyBEb24ndCBtaXggR0VUIGFuZCBQT1NUIHJlcXVlc3RzIGluIGEgcGlwZWxpbmUKICBvIEZpeCB0aGUgb3JkZXIgaW4gd2hpY2ggcmVxdWVzdHMgYXJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgcGlwZWxpbmUKICBvIEZpeGVkIHNldmVyYWwgY3VybCBidWdzIHdpdGggcGlwZWxpbmluZyB3aGVuIHRoZSBzZXJ2ZXIgaXMgcmV0dXJuaW5nCiAgICBjaHVua2VkIGVuY29kaW5nOgogICAgKiBBZGRlZCBzdGF0ZXMgdG8gY2h1bmtlZCBwYXJzaW5nIGZvciBmaW5hbCBDUkxGCiAgICAqIFJld2luZCBidWZmZXIgYWZ0ZXIgcGFyc2luZyBjaHVuayB3aXRoIGRhdGEgcmVtYWluaW5nCiAgICAqIE1vdmVkIGNodW5rZWQgaGVhZGVyIGluaXRpYWxpemluZyB0byBhIHNwb3QganVzdCBiZWZvcmUgcmVjZWl2aW5nCiAgICAgIGhlYWRlcnMKCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNykKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGNoYW5nZWQgdGhlIENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIHRvIGhhbmRsZQogIGFjdGl2ZSBhbmQgcGFzc2l2ZSBDQ0Mgc2h1dGRvd24gYW5kIGFkZGVkIHRoZSAtLWZ0cC1zc2wtY2NjLW1vZGUgY29tbWFuZAogIGxpbmUgb3B0aW9uLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA3KQotIElhbiBUdXJuZXIgZml4ZWQgdGhlIGxpYmN1cmwubTQgbWFjcm8ncyBzdXBwb3J0IGZvciAtLXdpdGgtbGliY3VybC4KCi0gU2htdWxpayBSZWdldiBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHJlLXVzZWQgSFRUUFMgY29ubmVjdGlvbnMsIGF0IGxlYXN0CiAgd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyB1c2VkLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIG1hZGUgcGFzc2l2ZSBGVFAgdHJhbnNmZXJzIHdvcmsgd2l0aCBTT0NLUyAoYm90aCA0IGFuZAogIDUpLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA3KQotIEplZmYgUG9obG1leWVyIGlkZW50aWZpZWQgdHdvIHByb2JsZW1zOiBmaXJzdCBhIHJhdGhlciBvYnNjdXJlIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Rpb24gcmUtdXNlIHRoYXQgY291bGQgbWFrZSBhCiAgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgcnVpbiBhIHBvaW50ZXIgaW4gYW5vdGhlciBoYW5kbGUuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSB3YXMgbGVzcyBvZiBhbiBhY3R1YWwgcHJvYmxlbSBidXQgbW9yZSBvZiBtaW5vciBxdWlyazoKICB0aGUgcmUtdXNpbmcgb2YgY29ubmVjdGlvbnMgd2Fzbid0IHByb3Blcmx5IGNoZWNraW5nIGlmIHRoZSBjb25uZWN0aW9uIHdhcwogIG1hcmtlZCBmb3IgY2xvc3VyZS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNykKLSBEdW5jYW4gTWFjLVZpY2FyIFByZXR0IGFuZCBNaWNoYWwgTWFyZWsgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCByZXNldHRpbmcKICBDVVJMT1BUX1JBTkdFIGJhY2sgdG8gbm8gcmFuZ2Ugb24gYW4gZWFzeSBoYW5kbGUgd2hlbiB1c2luZyBGVFAuCgpEYW4gRiAoMTQgRmVicnVhcnkgMjAwNykKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWxpYnMgc28gaXQgZG9lc24ndCBsaXN0IHVubmVjZXNzYXJ5IGxpYnJhcmllcyAoYW5kCiAgdGhlcmVmb3JlIGludHJvZHVjZSB1bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMpIHdoZW4gaXQncyBub3QgbmVlZGVkLgogIEFsc28sIGRvbid0IGJvdGhlciBhZGRpbmcgYSBsaWJyYXJ5IHBhdGggb2YgL3Vzci9saWIKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNykKLSBUaGUgZGVmYXVsdCBwYXNzd29yZCBmb3IgYW5vbnltb3VzIEZUUCBjb25uZWN0aW9ucyBpcyBub3cgY2hhbmdlZCB0byBiZQogICJmdHBAZXhhbXBsZS5jb20iLgoKLSBSb2JlcnQgQS4gTW9uYXQgbWFkZSBsaWJjdXJsIGJ1aWxkIGZpbmUgd2l0aCBWQzIwMDUgLSBpdCBkb2Vzbid0IGhhdmUKICBnbXRpbWVfcigpIGxpa2UgdGhlIG9sZGVyIFZDIHZlcnNpb25zLiBIZSBhbHNvIG1hZGUgdXNlIG9mIHNvbWUgbWFjaGluZS0KICBzcGVjaWZpYyBkZWZpbmVzIHRvIGRpZmZlcmVudGlhdGUgdGhlICJPUyIgZGVmaW5lLgoKRGFuaWVsICgxMiBGZWJydWFyeSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGFkZGVkIHN1cHBvcnQgZm9yIE5TUyAoTmV0d29yayBTZWN1cml0eSBTZXJ2aWNlKSBmb3IgdGhlCiAgU1NML1RMUyBsYXllci4gaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9zZWN1cml0eS9wa2kvbnNzLwoKICBUaGlzIGlzIHRoZSBmb3VydGggc3VwcG9ydGVkIGxpYnJhcnkgZm9yIFRMUy9TU0wgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIQoKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIHNvIHRoYXQgdGhlIGZpbmFsIENSTEYgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIGFyZSBzZW50CiAgdG8gdGhlIGRlYnVnIGNhbGxiYWNrLgoKLSBTaG11bGlrIFJlZ2V2IGFkZGVkIENVUkxPUFRfSFRUUF9DT05URU5UX0RFQ09ESU5HIGFuZAogIENVUkxPUFRfSFRUUF9UUkFOU0ZFUl9ERUNPRElORyB0aGF0IGlmIHNldCB0byB6ZXJvIHdpbGwgZGlzYWJsZSBsaWJjdXJsJ3MKICBpbnRlcm5hbCBkZWNvZGluZyBvZiBjb250ZW50IG9yIHRyYW5zZmVyIGVuY29kZWQgY29udGVudC4gVGhpcyBtYXkgYmUKICBwcmVmZXJhYmxlIGluIGNhc2VzIHdoZXJlIHlvdSB1c2UgbGliY3VybCBmb3IgcHJveHkgcHVycG9zZXMgb3Igc2ltaWxhci4gVGhlCiAgY29tbWFuZCBsaW5lIHRvb2wgZ290IGEgLS1yYXcgb3B0aW9uIHRvIGRpc2FibGUgYm90aCBhdCBvbmNlLgoKLSByZWxlYXNlIHRhcmJhbGxzIG1hZGUgd2l0aCBtYWtldGd6IHdpbGwgZnJvbSBub3cgb24gaGF2ZSBhIExJQkNVUkxfVElNRVNUQU1QCiAgZGVmaW5lIHNldCB0byBob2xkIHRoZSBleGFjdCBkYXRlIGFuZCB0aW1lIG9mIHdoZW4gdGhlIHRhcmJhbGwgd2FzIGJ1aWx0LCBhcwogIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHVzaW5nIHRoZSBVVEMgdGltZSB6b25lLgogIAotIEplZmYgUG9obG1leWVyIGZpeGVkIGEgZmxhdyBpbiBjdXJsX211bHRpX2FkZF9oYW5kbGUoKSB3aGVuIGFkZGluZyBhIGhhbmRsZQogIHRoYXQgaGFzIGFuIGVhc3kgaGFuZGxlIHByZXNlbnQgaW4gdGhlICJjbG9zdXJlIiBsaXN0IHBlbmRpbmcgY2xvc3VyZS4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDA3KQotIFJlZ3VsYXIgZmlsZSBkb3dubG9hZHMgd2lodCBTRlRQIGFuZCBTQ1AgYXJlIG5vdyBkb25lIHVzaW5nIHRoZSBub24tYmxvY2tpbmcKICBBUEkgb2YgbGlic3NoMiwgaWYgdGhlIGxpYnNzaDIgaGVhZGVycyBzZWVtIHRvIHN1cHBvcnQgdGhlbS4gVGhpcyB3aWxsIG1ha2UKICBTQ1AgYW5kIFNGVFAgbXVjaCBtb3JlIHJlc3BvbnNpdmUgYW5kIGJldHRlciBsaWJjdXJsIGNpdGl6ZW5zIHdoZW4gdXNlZCB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBldGMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNykKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9USU1FT1VUX01TIGFuZAogIENVUkxPUFRfQ09OTkVDVFRJTUVPVVRfTVMgdGhhdCwgYXMgdGhlaXIgbmFtZXMgc3VnZ2VzdCwgZG8gdGhlIHRpbWVvdXRzIHdpdGgKICBtaWxsaXNlY29uZCByZXNvbHV0aW9uLiBUaGUgb25seSByZXN0cmljdGlvbiB0byB0aGF0IGlzIHRoZSBhbGFybSgpCiAgKHNvbWV0aW1lcykgdXNlZCB0byBhYm9ydCBuYW1lIHJlc29sdmVzIGFzIHRoYXQgdXNlcyBmdWxsIHNlY29uZHMuIEkgZml4ZWQKICB0aGUgRlRQIHJlc3BvbnNlIHRpbWVvdXQgcGFydCBvZiB0aGUgcGF0Y2guCgogIEludGVybmFsbHkgd2Ugbm93IGNvdW50IGFuZCBrZWVwIHRoZSB0aW1lb3V0cyBpbiBtaWxsaXNlY29uZHMgYnV0IGl0IGFsc28KICBtZWFucyB3ZSBtdWx0aXBseSBzZXQgdGltZW91dHMgd2l0aCAxMDAwLiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCBubwogIHRpbWVvdXQgY2FuIGJlIHNldCB0byBtb3JlIHRoYW4gMl4zMSBtaWxsaXNlY29uZHMgKG9uIDMyIGJpdCBzeXN0ZW1zKSwgd2hpY2gKICBlcXVhbHMgMjQuODYgZGF5cy4gIFdlIHByb2JhYmx5IGNvdWxkbid0IGJlZm9yZSBlaXRoZXIgc2luY2UgdGhlIGNvZGUgZGlkCiAgKjEwMDAgb24gdGhlIHRpbWVvdXQgdmFsdWVzIG9uIHNldmVyYWwgcGxhY2VzIGFscmVhZHkuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwNykKLSBZYW5nIFRzZSBmaXhlZCB0aGUgY29va2llIGV4cGlyeSBkYXRlIGluIHNldmVyYWwgdGVzdCBjYXNlcyB0aGF0IHN0YXJ0ZWQgdG8KICBmYWlsIHNpbmNlIHRoZXkgdXNlZCAiMSBmZWIgMjAwNyIuLi4KCi0gTWFuZnJlZCBTY2h3YXJiIHJlcG9ydGVkIHRoYXQgc29ja3M1IHN1cHBvcnQgd2FzIGJyb2tlbiBhbmQgaGVscCB1cyBwaW5wb2ludAogIHRoZSBwcm9ibGVtLiBUaGUgY29kZSBub3cgdHJpZXMgaGFyZGVyIHRvIHVzZSBodHRwcm94eSBhbmQgcHJveHkgd2hlcmUKICBhcHBwcm9wcmlhdGUsIGFzIG5vdCBhbGwgcHJveGllcyBhcmUgSFRUUC4uLgoKVmVyc2lvbiA3LjE2LjEgKDI5IEphbnVhcnkgMjAwNykKCkRhbmllbCAoMjkgSmFudWFyeSAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBDT05ORUNUIHdpdGggYSBjdXN0b20gVXNlci1BZ2VudAogIGhlYWRlciwgeW91IGdvdCBfdHdvXyBVc2VyLUFnZW50IGhlYWRlcnMgaW4gdGhlIENPTk5FQ1QgcmVxdWVzdC4uLiEgQWRkZWQKICB0ZXN0IGNhc2UgMjg3IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDcpCi0gY3VybF9lYXN5X3Jlc2V0KCkgbm93IHJlc2V0cyB0aGUgQ0EgYnVuZGxlIHBhdGggY29ycmVjdGx5LgoKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCB0aGUgQ3VybCBjb21tYW5kIGxpbmUgdG9vbCBmb3IgSFRUUCBvbiBub24tQVNDSUkKICBwbGF0Zm9ybXMuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwNykKLSBBZGRlZCB0aGUgLS1saWJjdXJsIFtmaWxlXSBvcHRpb24gdG8gY3VybC4gQXBwZW5kIHRoaXMgb3B0aW9uIHRvIGFueQogIG9yZGluYXJ5IGN1cmwgY29tbWFuZCBsaW5lLCBhbmQgeW91IHdpbGwgZ2V0IGEgbGliY3VybC11c2luZyBzb3VyY2UgY29kZQogIHdyaXR0ZW4gdG8gdGhlIGZpbGUgdGhhdCBkb2VzIHRoZSBlcXVpdmFsZW50IG9wZXJhdGlvbiBvZiB3aGF0IHlvdXIgY29tbWFuZAogIGxpbmUgb3BlcmF0aW9uIGRvZXMhCgpEYW4gRiAoMjQgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgZGFuZ2xpbmcgcG9pbnRlciBwcm9ibGVtIHRoYXQgcHJldmVudGVkIHRoZSBodHRwX3Byb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGUgZnJvbSBiZWluZyBwcm9wZXJseSB1c2VkIGluIG1hbnkgY2FzZXMgKGFuZCBjYXVzZWQgdGVzdCBjYXNlIDYzCiAgdG8gZmFpbCkuCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBkaWQgTlRMTSBjaGFuZ2VzIG1haW5seSBmb3Igbm9uLUFTQ0lJIHBsYXRmb3JtczoKCiAgIzEKICBUaGVyZSdzIGEgY29tcGlsYXRpb24gZXJyb3IgaW4gaHR0cF9udGxtLmMgaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBOT1QKICBkZWZpbmVkLiAgSSBub3RpY2VkIHRoaXMgd2hpbGUgdGVzdGluZyB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zLiAgTGluZSA4Njcgb2YKICB0aGUgY3VycmVudCBodHRwX250bG0uYyBpcyBhIGNsb3NpbmcgYnJhY2tldCBmb3IgYW4gaWYvZWxzZSBwYWlyIHRoYXQgb25seQogIGdldHMgY29tcGlsZWQgaW4gaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBkZWZpbmVkLiAgQnV0IHRoaXMgY2xvc2luZyBicmFja2V0CiAgd2Fzbid0IGluIGFuICNpZmRlZiBzbyB0aGUgY29kZSBmYWlscyB0byBjb21waWxlIHVubGVzcyBVU0VfTlRMTTJTRVNTSU9OIHdhcwogIGRlZmluZWQuICBMaW5lcyAxOTggYW5kIDE0MCBvZiBteSBwYXRjaCB3cmFwcyB0aGF0IGNsb3NpbmcgYnJhY2tldCBpbiBhbgogICNpZmRlZiBVU0VfTlRMTTJTRVNTSU9OLgoKICAjMgogIEkgbm90aWNlZCBzZXZlcmFsIHBpY2t5IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gREVCVUdfTUUgaXMgZGVmaW5lZC4gIEkndmUKICBmaXhlZCB0aGVtIHdpdGggY2FzdGluZy4gIEJ5IHRoZSB3YXksIERFQlVHX01FIHdhcyBhIGh1Z2UgaGVscCBpbgogIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlLgoKICAjMwogIEhvcGVmdWxseSB0aGUgbGFzdCBub24tQVNDSUkgY29udmVyc2lvbiBwYXRjaCBmb3IgbGliY3VybCBpbiBhIHdoaWxlLiAgSQogIGNoYW5nZWQgdGhlICJOVExNU1NQIiBsaXRlcmFsIHRvIGhleCBzaW5jZSB0aGlzIHNpZ25hdHVyZSBtdXN0IGFsd2F5cyBiZSBpbgogIEFTQ0lJLgoKICBDb252ZXJzaW9uIGNvZGUgd2FzIHN0cmF0ZWdpY2FsbHkgYWRkZWQgd2hlcmUgbmVjZXNzYXJ5LiAgQW5kIHRoZQogIEN1cmxfYmFzZTY0X2VuY29kZSBjYWxscyB3ZXJlIGNoYW5nZWQgc28gdGhlIGJpbmFyeSAiYmxvYnMiIGh0dHBfbnRsbS5jCiAgY3JlYXRlcyBhcmUgTk9UIHRyYW5zbGF0ZWQgb24gbm9uLUFTQ0lJIHBsYXRmb3Jtcy4KCkRhbiBGICgyMiBKYW51YXJ5IDIwMDcpCi0gQ29udmVydGVkIChtb3N0IG9mKSB0aGUgdGVzdCBkYXRhIGZpbGVzIGludG8gZ2VudWluZSBYTUwuICBBIGhhbmRmdWwgc3RpbGwKICBhcmUgbm90LCBkdWUgbWFpbmx5IHRvIHRoZSBsYWNrIG9mIHN1cHBvcnQgZm9yIFhNTCBjaGFyYWN0ZXIgZW50aXRpZXMKICAoZS5nLiAmID0+ICZhbXA7ICkuICBUaGlzIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gdmFsaWRhdGUgdGVzdCBmaWxlcyB1c2luZwogIHRvb2xzIGxpa2UgeG1sbGludCwgYXMgd2VsbCBhcyB0byBlZGl0IGFuZCB2aWV3IHRoZW0gdXNpbmcgWE1MIHRvb2xzLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDcpCi0gQXJtZWwgQXNzZWxpbiBpbXByb3ZlZCBsaWJjdXJsIHRvIGJlaGF2ZSBhIGxvdCBiZXR0ZXIgd2hlbiBhbiBlYXN5IGhhbmRsZQogIGRvaW5nIGFuIEZUUCB0cmFuc2ZlciBpcyByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUgYmVmb3JlIGNvbXBsZXRpb24uIFRoZQogIGZpeCBhbHNvIGZpeGVkIHRoZSAiYWxpdmUgY291bnRlciIgdG8gYmUgY29ycmVjdCBvbiAicHJlbWF0dXJlIHJlbW92YWwiIGZvcgogIGFsbCBwcm90b2NvbHMuCgpEYW4gRiAoMTYgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsgaW4gdGZ0cCB1cGxvYWRzIGRpc2NvdmVyZWQgYnkgY3VybCdzIG1lbW9yeSBsZWFrCiAgZGV0ZWN0b3IuICBBbHNvIGNoYW5nZWQgdGZ0cCBkb3dubG9hZHMgdG8gVVJMLXVuZXNjYXBlIHRoZSBkb3dubG9hZGVkCiAgZmlsZSBuYW1lLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgcHJvdmlkZWQgbGliY3VybCBjaGFuZ2VzIGZvciBkb2luZyBIVFRQIGNvbW11bmljYXRpb24gb24KICBub24tQVNDSUkgcGxhdGZvcm1zLiBJdCBkb2VzIGFkZCBzb21lIGNvbXBsZXhpdHksIG1vc3Qgbm90YWJseSB3aXRoIG1vcmUKICAjaWZkZWZzLCBidXQgSSB3YW50IHRvIHNlZSB0aGlzIHN1cHBvcnRlZCBhZGRlZCBhbmQgSSBjYW4ndCBzZWUgaG93IHdlIGNhbgogIGFkZCBpdCB3aXRob3V0IHRoZSBleHRyYSBzdHVmZiBhZGRlZC4KCi0gU2V0dGluZyBDVVJMT1BUX0NPT0tJRUxJU1QgdG8gIkFMTCIgd2hlbiBubyBjb29raWVzIGF0IGFsbCB3YXMgcHJlc2VudCwKICBsaWJjdXJsIHdvdWxkIGNyYXNoIHdoZW4gdHJ5aW5nIHRvIHJlYWQgYSBOVUxMIHBvaW50ZXIuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNykKLSBUb2J5IFBldGVyc29uIGZvdW5kIGEgbmFzdHkgYnVnIHRoYXQgcHJldmVudGVkIChsaWIpY3VybCBmcm9tIHByb3Blcmx5CiAgZG93bmxvYWRpbmcgKG1vc3QpIHRoaW5ncyB0aGF0IHdlcmUgbGFyZ2VyIHRoYW4gNEdCIG9uIDMyIGJpdCBzeXN0ZW1zLiAgTWF0dAogIFdpdGhlcnNwb29uIGhlbHBlZCBhcyBuYXJyb3cgZG93biB0aGUgcHJvYmxlbS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDcpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBpbnRyb2R1Y2VkIHRoZSAtLWZ0cC1zc2wtY2NjIGNvbW1hbmQgbGluZSBvcHRpb24gdG8KICBjdXJsIHRoYXQgdXNlcyB0aGUgbmV3IENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIGluIGxpYmN1cmwuIElmIGVuYWJsZWQsIGl0CiAgd2lsbCBtYWtlIGxpYmN1cmwgc2h1dGRvd24gU1NML1RMUyBhZnRlciB0aGUgYXV0aGVudGljYXRpb24gaXMgZG9uZSBvbiBhCiAgRlRQLVNTTCBvcGVyYXRpb24uCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IG1hZGUgY2hhbmdlcyB0byBhbGxvdyBiYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcgdG8gd29yayBvbgogIG5vbi1BU0NJSSBwbGF0Zm9ybXMuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDA3KQotIE1hdHQgV2l0aGVyc3Bvb24gZml4ZWQgdGhlIGZsYXcgd2hpY2ggbWFkZSBsaWJjdXJsIDcuMTYuMCBhbHdheXMgc3RvcmUKICBkb3dubG9hZGVkIGRhdGEgaW4gdHdvIGJ1ZmZlcnMsIGp1c3QgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggYSBzcGVjaWFsIEhUVFAKICBwaXBlbGluaW5nIGNhc2UuIFRoYXQgaXMgbm93IG9ubHkgYWN0aXZhdGVkIGZvciBwaXBlbGluZWQgdHJhbnNmZXJzLiBJbgogIE1hdHQncyBjYXNlLCBpdCBzaG93ZWQgYXMgYSBjb25zaWRlcmFibGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSwKCkRhbmllbCAoMiBKYW51YXJ5IDIwMDcpCi0gVmljdG9yIFNuZXpoa28gaGVscGVkIHVzIGZpeCBidWcgcmVwb3J0ICMxNjAzNzEyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDM3MTIpIChrbm93biBidWcgIzM2KSAtLWxpbWl0LXJhdGUKICAoQ1VSTE9QVF9NQVhfU0VORF9TUEVFRF9MQVJHRSBhbmQgQ1VSTE9QVF9NQVhfUkVDVl9TUEVFRF9MQVJHRSkgYXJlIGJyb2tlbgogIG9uIFdpbmRvd3MgKHNpbmNlIDcuMTYuMCwgYnV0IHRoYXQncyB3aGVuIHRoZXkgd2VyZSBpbnRyb2R1Y2VkIGFzIHByZXZpb3VzCiAgdG8gdGhhdCB0aGUgbGltaXRpbmcgbG9naWMgd2FzIG1hZGUgaW4gdGhlIGFwcGxpY2F0aW9uIG9ubHkgYW5kIG5vdCBpbiB0aGUKICBsaWJyYXJ5KS4gSXQgd2FzIGFjdHVhbGx5IGFsc28gYnJva2VuIG9uIHNlbGVjdCgpLWJhc2VkIHN5c3RlbXMgKGFzIGFwcG9zZWQKICB0byBwb2xsKCkpIGJ1dCB3ZSBoYXZlbid0IGhhZCBhbnkgc3VjaCByZXBvcnRzLiBXZSBub3cgdXNlIHNlbGVjdCgpLCBTbGVlcCgpCiAgb3IgZGVsYXkoKSBwcm9wZXJseSB0byBzbGVlcCBhIHdoaWxlIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55dGhpbmcgaW5wdXQgb3IKICBvdXRwdXQgd2hlbiB0aGUgcmF0ZSBsaW1pdGluZyBpcyBhY3RpdmF0ZWQgd2l0aCB0aGUgZWFzeSBpbnRlcmZhY2UuCgotIE1vZGlmaWVkIGxpYmN1cmwucGMuaW4gdG8gdXNlIExpYnMucHJpdmF0ZSBmb3IgdGhlIGxpYnMgbGliY3VybCBpdHNlbGYgbmVlZHMKICB0byBnZXQgYnVpbHQgc3RhdGljLiBJdCBoYXMgYmVlbiBtZW50aW9uZWQgYmVmb3JlIGFuZCB3YXMgYWdhaW4gYnJvdWdodCB0bwogIG91ciBhdHRlbnRpb24gYnkgTmF0aGFuYWVsIE5lcm9kZSB3aG8gZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzQwNTIyNgogIChodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9NDA1MjI2KS4KCg==